Anchor the witnessed journal in Bitcoin from main: OTS proofs, tool, and daily job (supersedes #182, #183) - #229
Open
MaxGhenis wants to merge 11 commits into
Open
Anchor the witnessed journal in Bitcoin from main: OTS proofs, tool, and daily job (supersedes #182, #183)#229MaxGhenis wants to merge 11 commits into
MaxGhenis wants to merge 11 commits into
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The fifteen proofs from #182 were upgraded in place from a networked session (each now carries BitcoinBlockHeaderAttestation entries; ots info confirms) and the five manifests appended to the journal since 2026-08-19 are stamped (pending calendar attestations). All twenty bind to their manifest bytes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Sep 2, 2026
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.
Summary
Anchors the witnessed observation journal in Bitcoin from the trusted branch. Supersedes #182 and #183 after their Fable+Sol gate rounds (findings recorded on both PRs): the bot cannot publish to the journal branch (its required checks never run for token pushes), the old job executed mutable-branch code with a write credential, verified after pushing, and could publish a stale tree after a rebase; the tool trusted substrings of CLI output, deleted
.bakfiles before checking results, and did not guard symlinks.Design. Everything trusted lives on
main:scripts/ots_anchor.py, its tests,.github/workflows/ots-anchor.yml,ots/README.md, and the proofsots/<stem>.json.ots. The job checks out the journal branch credential-free into a separate path purely as manifest input (--manifests), runsmain's pinned script, verifies the whole tree, runs a scope guard (onlyots/may change), and publishes proof-only commits. It never pushes the journal branch.Proofs. The fifteen proofs from #182 are carried over upgraded in place from a networked session: each now carries
BitcoinBlockHeaderAttestationentries on disk (the #182 files only held pending calendar attestations;ots verifyhad been resolving the upgrade in memory). The five manifests appended since 19 August (0015–0019) are stamped and pending. All twenty bind to their manifest bytes;statusreports 15 stored Bitcoin attestations.Tool hardening (Sol's #182 findings). Local proof state is read from
ots infowith full-line patterns rather than substrings; Bitcoin-complete proofs are re-verified for binding on every run; failed or timed-out upgrades restore the original from.bak; symlinked proof directories or paths are refused;guardrefuses any changed path outsideots/;--manifestsreads an external checkout.Open items before merge (a follow-up lane is on them):
main's rules and built a bot-branch + auto-merge path;mainin fact has no required checks, no rulesets, anddefault_workflow_permissions: write, whileallow_auto_mergeis off. The job will push proof-only commits tomaindirectly (bounded fetch, rebase, re-run, re-verify loop) and drop the pull-request machinery.status/verifyreportunrecognized; the verbatim output contract is captured and the patterns will be fixed with fixtures taken from it.Chronicle Governance
No source-data boundary change: no source packages, facts, or schemas. Proof files and a workflow on
main; nothing underreleases/orledger/on any branch.Tests
tests/test_ots_anchor.py(15): stamping, idempotence and upgrades, filename/digest contradiction, missing and mismatched proofs,--manifests, guard scope, re-verification of complete proofs, resistance to calendar-output spoofing, backup restoration on failed/timed-out upgrades, symlinked directory refusal. Lane-verified against the real journal checkout; carried proofs match #182 byte-for-byte before the upgrade commit.Authored by a Sol lane (no network); proofs upgraded and stamped, branch pushed and PR opened from the dispatching session.
🤖 Generated with Claude Code