Anchor witnessed release manifests in Bitcoin via OpenTimestamps - #182
Open
MaxGhenis wants to merge 1 commit into
Open
Anchor witnessed release manifests in Bitcoin via OpenTimestamps#182MaxGhenis wants to merge 1 commit into
MaxGhenis wants to merge 1 commit into
Conversation
Each releases/manifests/<stem>.json already carries dual RFC 3161 receipts and a producer signature over its exact bytes. ots/<stem>.json.ots now timestamps those same bytes through OpenTimestamps, so the journal state a manifest commits to has an existence bound outside this repository's control. Proofs live outside releases/ because the append gate keeps that tree closed to anything but exact release bundles, and OpenTimestamps upgrades rewrite proofs in place. scripts/ots_anchor.py stamps missing proofs and upgrades pending ones idempotently; all fifteen current manifests are stamped, with Bitcoin attestations pending until the calendars' aggregate transactions confirm. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Every release manifest under
releases/manifests/gets a sibling OpenTimestamps proof,ots/<stem>.json.ots, over its exact bytes — the same bytes the two RFC 3161 authorities witness and the pinned producer key signs. A completed proof carries a Bitcoin block attestation, so the existence time of the journal state a manifest commits to (state.jsonlSha256,state.lineCount,state.immutablePrefixSha256,previousManifestSha256) is bounded by a system the operator does not control.releases/README.mdalready names the gap this fills: internal verification cannot distinguish the original history from a freshly witnessed replacement fork, so verifiers must retain an external checkpoint. These proofs are that checkpoint, automated.Contents
ots/— proofs for all fifteen current manifests (0000–0014), stamped 2026-08-19. Attestations are pending until the calendars' aggregate Bitcoin transactions confirm; the scheduled job upgrades them in place.scripts/ots_anchor.py— stdlib-only tool:run(stamp missing, upgrade pending; idempotent),verify(every proof binds to its manifest's current bytes;--require-bitcoinfor strictness),status. Stamping happens on a temporary copy so nothing is ever written underreleases/.tests/test_ots_anchor.py— 8 tests against a fakeotsreproducing the observed opentimestamps-client 0.7.2 output contract; no network in CI.ots/README.md— what the proofs do and do not establish, and the verification procedure..github/workflows/ci.yml— the new files join the enumerated lint and test lists.Gate compliance
ledger/orreleases/— the append gate sees+0 appended vs base, release 14; verified locally withcheck_thesis_facts_append.py --base-ref origin/codex/thesis-ledger-factsandverify_release_chain.py --full(both green, OpenSSL 3).ots/**is outside both the data and gate surfaces inscripts/receipt_pins.py, so daily proof commits and in-place upgrades can never collide with resolver append PRs or the release-history immutability sweep.uv.lockchanges; theotsbinary is provided by the scheduled workflow (pinnedopentimestamps-client==0.7.2), not by this package.Verify
Without a local Bitcoin node, add
--no-bitcoinbeforeverifyto validate the byte binding and print the attested block height and merkle root for manual checking. While attestations are pending the second command reportsPending confirmation in Bitcoin blockchain.Follow-up
The daily schedule arrives as a separate PR to
main(scheduled workflows only run from the default branch); it checks out this branch and runsscripts/ots_anchor.py run.🤖 Generated with Claude Code