Conversation
…s seed (BL-57 P1, step 1) Three controls in tools/test_methodology_trim.py asserted that the live starter-kit/CHANGELOG.md holds record-shaped example lines inside fences. BL-57's P1 moves that rules text to FRAMEWORK_APPARATUS.md, so they now read tools/fixtures/seed-CHANGELOG-ledger-format-1.md -- the seed exactly as it ships today (git blob 47bc848, asserted by a new test) -- and the live seed must still hold no records. The dated-prose test's .replace() anchor becomes the '---' line, asserted to occur once first; a docstring cites the sentinel by token, not line. Green with either seed. Canonical-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ed becomes a pointer with a format marker (BL-57 P1, step 2) The seed's three rule sections (How to add an entry; Size, and when to archive; CHANGELOG.md vs SESSION_NOTES.md) move verbatim, one heading level down, into a seventh section of FRAMEWORK_APPARATUS.md, §The Action Ledger. starter-kit/CHANGELOG.md keeps its title, purpose paragraph, sentinel and footer and gains a linked pointer carrying "ledger-format: 2" (12,893 -> 1,335 B). starter-kit/HANDOFFS.md's cross-reference points at the new home; methodology_trim.py's fence-tracking comment says where the fenced examples live now (comment only -- AST unchanged). No rule changes. bin/sync writes a seed once and never again, so rules kept in a seed froze at each project's seeding; in a synced file a correction reaches every project. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ration advice stops rewriting entries (BL-57 P1, step 3)
bin/_manifest.py's SEED_FORMAT_MARKERS key CHANGELOG.md on the seed's pointer
line ("ledger-format: 2") instead of its title, and HANDOFFS.md on its
"Size, and when to archive" heading instead of its title; the comment states
why a title can never fire. bin/status's migration note and BOOTSTRAP.md's
"Updating an existing project" paragraph now say: replace the text above the
first entry with the current seed's, leave every entry as written, reseed only
a file with no history -- the old advice told adopters to rewrite committed
entries ("reconcile its header and per-entry format").
bin/tests.sh Test 20: the in-use fixture carries the marker line; new case
(b2) holds the frozen pre-ledger-format-2 seed and must read stale. RED
against the title-keyed marker (116/2), green here (117/1, Test 9 as before).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…enth section (BL-57 P1, step 4)
HOW_TO_USE.md's layer table (the apparatus row gains "write a ledger entry";
~330 -> ~515 lines), CLAUDE.md's Document Hierarchy row, and
ITERATIVE_METHODOLOGY.md §Reference Apparatus, whose table listed the six
sections that moved there and now lists §The Action Ledger as well. Wording
only. The plan named the first two; the third is the same kind of index,
found by grepping for the set-size claim ("Six sections moved there").
The CLAUDE.md row is 9 B shorter than before: .context-budget.json pins that
file's ceiling at its size (59,168 B), so the row names the rules and drops
"Extracted so the manual fits one read", which the apparatus's intro says.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… merged at 4d9e271 BL-57 P2 starts here (docs/planning/changelog-rules-contradictions-plan.md on fork main, P2 and hazard 1). aa36fd8, this branch's base, is an ancestor of upstream/main since KJ5HST#80's merge; this brings the maintainer's S19 records and upstream's .githooks/commit-msg onto the branch. git merge-tree was clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l -- the two-cap size rule goes (BL-57 P2, step 1) FRAMEWORK_APPARATUS.md's "Size, and when to archive" becomes "Reading and archiving", on the operator's Q2 A: the protocol's three reads are each partial (Phase 0 reconcile from git log, close-out at the top, a lookup by grep); past the trimmer's READ_REFUSE_BYTES, read the top with an offset and a limit; archiving is optional, and the tool's --check is the only statement of a trigger -- the rules name no size. Conservation (C9): the live file and its shards together never lose an entry, so a count spans both; the enumeration form now runs the same in bash and zsh. The two-cap table goes -- its 65,536 B default (C2), its "every session pays" premise (C1), its citations of fork-only material (C12) -- with the rate-versus-level argument for a line cap the trimmer no longer has. The intro and the section's opening stop calling the moved text verbatim. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s trigger fires; the trimmer's budget comment drops "context-tax" (BL-57 P2, steps 2-3) starter-kit/HANDOFFS.md keeps its "Size, and when to archive" heading, which bin/status keys on (D9). The premise that Phase 0 reads the file every session, and the two-cap table with its 65,536 B default and its citations of fork-only material, give way to the reads the protocol makes and one rule: archive when the trimmer's trigger fires; the tool states the trigger, and the seed names no size of its own. The file's own archive rule otherwise stands (D7). The pointer names the Action Ledger's "Reading and archiving" subsection. starter-kit/methodology_trim.py:186 -- a comment only; the module's AST is identical to b82dcff's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…udit reads the shards The vocabulary becomes [issue #<N>] / [BL-<id>] / [ad hoc] -- <id> is whatever id the project's backlog gives the item, not a number. The audit beside it is anchored to the entry heading, counts the archived shards as well as the live file, and enumerates those shards with git ls-files rather than a bare glob. Each of those three properties fixes a way the previous one-line form returned a wrong number instead of an error. Measured: with no shard present the bare glob makes the two shells disagree (zsh 0, bash 1); unanchored, the pattern also matches the vocabulary's own definitions and every mention of a tag in prose, 78 against 64 actions here; and across six adopter repositories the widened id pattern recovers 362 logged actions that BL-[0-9]+ could not see. BL-57 P3, scope item 1 (C6, C10). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…dit; three files take [BL-<id>] SESSION_RUNNER.md:39 drops its inline audit grep for a link to the Action Ledger section, so that command is published in one place. :278 and :329, plus ITERATIVE_METHODOLOGY.md:294 and .githooks/pre-commit:57, change [BL-<N>] to [BL-<id>]. Nothing outside frozen history still carries the old form. Two duplicate clauses on the same step paid for the link: the step showed [ad hoc] in its own template, and the note's closing paragraph already forbids the backfill becoming the session's deliverable. The runner ends smaller than it started -- 52,195 -> 52,163 B, 18,477.5 -> 18,463.5 tokens. The two units disagreed about the link itself: the cross-reference and the id changes alone measured +36 B but only +9 tokens, a path running near 4 B/token against the file's 2.8248 average. That is why the phase's size rule is restated in tokens, the unit the read cap and the file's own ceiling already use. BL-57 P3, scope items 2 and 3 (C6, C10). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ot a bare glob The rule that anything counting receipts must span the live file and its shards published that span as a bare glob. Reproduced in a throwaway repository with one entry and no shard, the bare form prints 0 under zsh and 1 under bash -- two shells, two different counts, neither raised to the caller as a failure. The git ls-files form prints 1 and exits 0 under both, matching the ledger audit. BL-57 P3, the bullet carried over from P2 (C10). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…red on this ledger The Action Ledger section said the unanchored audit "returned 78 against 64 actions" on this framework's own ledger. The measurement is real but was taken on the project whose ledger was split at v3.6; this repository's root CHANGELOG records no such comparison, so a reader here cannot check it. The sentence now leads with the failure -- an unanchored pattern can report more actions than the ledger holds -- and gives the figure as a measurement on the project it came from. The mechanism is checkable anywhere. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… merged BL-57 P4 starts here (docs/planning/changelog-rules-contradictions-plan.md on fork main, P4 and hazard 1; S169's merge-first amendment). This brings the maintainer's quality ratchet (starter-kit/quality_ratchet.py, .quality-gates.json, the ratchet chained into .githooks/pre-commit), his S20-S22 records, and the token re-split of the read set onto the branch. Two conflicts, both one line, both predicted by git merge-tree at Phase 0: - ITERATIVE_METHODOLOGY.md Phase 6 step 8: upstream's line, which adds step (c) (run the declared quality gates and cite the summary), with P3's [BL-<id>]. - CLAUDE.md, the Reference apparatus row: upstream's shortened wording, with P1's change applied -- "and the CHANGELOG.md rules" in place of "extracted so the manual fits one read", which stopped being true of the file when P1 moved the ledger rules into it. Checked on the merge before committing: P3's DONE grep for [BL-<N>] over the runner, the flight manual, HOW_TO_USE.md, the hook, the home and both seeds prints nothing; no conflict markers remain; the seed keeps "ledger-format: 2". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…goes -- one per commit, never edited, under the topmost month (BL-57 P4, step 1) FRAMEWORK_APPARATUS.md, the Action Ledger section: the closing paragraph of "How to add an entry" becomes two rules, per the plan's target state (3.1 items 4 and 5) and the operator's Q4 A. Lifecycle: one entry per commit and per non-commit action; a claim commit carries an (in progress) entry and close-out adds its own; a committed entry is never edited, a correction is a new entry, and removing unpublishable content is the one exception, recorded by its own entry; a Phase 0 backfill is the one entry that may span commits; the Phase 1B marker lives in SESSION_NOTES.md, or a project without one relies on its pending HANDOFFS.md receipt. Placement: prepend under the topmost ## YYYY-MM, open a new month above it when the month changes, start month headings at the next new month in a ledger that has none, retrofit nothing, keep entries at ###. The opening sentence drops "At close-out", which a claim commit's entry contradicts. HOW_TO_USE.md gives the apparatus as ~535 lines (534). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…aim commit's entry says (in progress) (BL-57 P4, steps 2-3) Seven instructions said "append ... newest on top": the runner's Phase 3F, failure mode KJ5HST#27's countermeasure and its Degradation row, the flight manual's Phase 6 step 8, HOW_TO_USE.md's 3F line and FM KJ5HST#27 row, and the ledger hook's refusal text. They now say prepend, as the Action Ledger section already did. The runner's Phase 1B stub and the flight manual's Phase 1B step 1 said the session's actions are recorded at Phase 3F; a claim commit carries its own entry, so they now say that entry reads (in progress) and close-out records the rest. Runner, measured before committing: doubled read 37,717 (18,858.5 tokens) against the restated <= 37,731; control 36,955 reproduced in the same run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ork history; CLAUDE.md back under its token ceiling (BL-57 P4, step 4) "Completed work history" becomes the action ledger in BOOTSTRAP.md (:23, :107, :131), README.md (:96, :114, :200) and CLAUDE.md (:51). The two instructions keyed to completing work (BOOTSTRAP.md:139, README.md:96) now say to record each action and remove a finished backlog item; the BACKLOG migration step (BOOTSTRAP.md:145) moves completed items in as entries, newest on top. CLAUDE.md:21's Reference apparatus row becomes "its tables, tests, scoring scales and ledger rules; distributed", paying back the 4 tokens the merge carried over max_tokens 23,483. Measured before committing: doubled read 46,953 (23,476.5 tokens) against the restated <= 46,965; upstream's recorded 46,965 reproduced in the same run. What still says "completed work", and why: README.md:530 (v2.1 What's New), CLAUDE.md:128 (v3.6 release narrative), BOOTSTRAP.md:134 (the backlog split). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…for its rules, audit and month headings (BL-57 P4, step 5) Upstream's root CHANGELOG.md front matter only (plan D8 (i), one commit): - the rules live in FRAMEWORK_APPARATUS.md's Action Ledger section, and the seed points there -- it said both lived in starter-kit/CHANGELOG.md, which P1 made false; - the source-tag paragraph cites that section's anchored, shard-reading audit instead of publishing the unanchored one-file grep; - [BL-<N>] becomes [BL-<id>] in the tag definitions (P3's finding 4); - month headings start at this ledger's next new month, nothing retrofitted, in place of "promote as it grows". The audit gives 68 in zsh and bash, equal to the heading count; the old form matches 94. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ute (BL-57 item (22)) bin/status's note told an adopter holding either stale seed to replace the text above the first entry (or receipt) with the current seed's. That is right for CHANGELOG.md, whose seed header replaces the rules an older copy carries, and wrong for HANDOFFS.md: the seed differs from an older copy by one section, the "Size, and when to archive" heading the manifest marker keys on, and replacing the front matter deletes whatever a trimmer wrote there -- an archive pointer, a regenerated count sentence. The note now gives each flagged file its route (MIGRATION_ROUTES, beside STALE_SEED), and the BOOTSTRAP.md paragraph it cites names the stale HANDOFFS.md and its route too. bin/tests.sh Test 20 (g), eight assertions, run alone first: 5 failures on the old note and paragraph, 24/0 after; two mutants fail it (routes printed for unflagged files; no HANDOFFS.md route). Full gate on this tree: quality_ratchet 10/10 pass, results dd16434fe5f5, tests-sh-passed 149. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nd stops citing a hook flag no hook has (PR KJ5HST#80 review F5) The module docstring said the design doc had no public copy and so gave no URL; the doc is public in the rmsharp/methodology fork, so the docstring now links it at the commit that last changed it (979dc73). The defaults paragraph said the tool never runs git mv because of --no-renames in the pre-commit hook; this repository's hook has never had that flag (git log -S finds it on neither this branch nor upstream/main). The rule stays, with what the tool does instead. Comments only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… read together, not every whole-read class (BL-62) TestThisRepoReadSetPartition summed the max_tokens of every whole-read class against the one 25,000-token Read, but only the read-set pair is read in one Read; a read-mandated or resident file is read on its own. A config with two read-mandated ledgers at 25,000 each failed it as 50,000 > 25,000. The check moves into token_partition(cfg), which sums only READ_TOGETHER_CLASSES; TestTokenPartitionRule adds four fixture tests. Test-first: two of them failed under the old rule. 118 -> 122 tests, 0 failures; five mutants each fail it. The .context-budget.json note that describes the test now says "the read-set class". Canonical-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…S.md's five-file cap name it (BL-63) bin/sync copies the whole distributed corpus and does not commit, and no distributed document said how its result is committed, so a committed-mode sync that updates more than five files broke the cap or left the adopter to invent a split. BOOTSTRAP.md's Setup with bin/sync section gains a Committing a sync paragraph: one run, one commit, exactly the files the dry run listed plus the ledger entry; hand edits afterwards stay under the cap. SAFEGUARDS.md's cap row gains one sentence naming the case, so the two files agree (SAFEGUARDS.md wins any conflict). SAFEGUARDS.md 17,024 -> 17,129 B, about 6,067 of its 6,100 max_tokens. Separable: this commit touches nothing else. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… upstream PR BL-57 P12 step 2 (docs/planning/changelog-rules-contradictions-plan.md on fork main; a merge, not a rebase, so the commits already on origin keep their hashes). This brings the maintainer's S23 records and the first tightening after the PR KJ5HST#82 merge (tests-sh-failed max 0, tests-sh-passed min 139) onto the branch. git merge-tree listed no conflicting paths; the three files merged automatically, upstream's new ledger entry on top. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…his branch ships The config's rule is to re-measure a file's bytes_per_token when its blob changes; this branch changed CLAUDE.md, SESSION_RUNNER.md and SAFEGUARDS.md, and the densities still named 1244e95, 2a3e410 and 933816b. Measured by the doubled-file method, each run reproducing the previous measurement as a control: CLAUDE.md dd416ea 23,476.5 tokens (2.5182), runner 4811f02 18,858.5 (2.8225), SAFEGUARDS.md ed49b97 6,083.7 (2.8155). Every ceiling holds; the pair is 24,942.2 of the 25,000-token read cap. No ceiling changed. Corrects the BL-63 entry's estimate for SAFEGUARDS.md (about 6,067 tokens): it measures 6,083.7. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…he contributor's fork bin/status:112 and bin/tests.sh:323 cited "(BL-57 item (22))", a planning document on rmsharp/methodology that this repository does not have. Both sentences already give the reason in full; the citation is dropped. Comments only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…section heading The seed that shipped with the trimmer (56997af) already had the "Size, and when to archive" heading, over the size premise this branch removes, so a heading key read it as current -- it could never fire on that format. The seed's size section now opens with "handoffs-format: 2", which bin/_manifest.py keys on (as CHANGELOG.md keys on "ledger-format: 2"), and bin/status's route says to bring that section across, replacing any older copy. Test 20 (g): a fixture with the heading and the old premise but no marker read present before, and reads stale now. Found by an independent review of the branch before the pull request. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ote above the first entry bin/status and BOOTSTRAP.md told an adopter with a stale CHANGELOG.md to replace everything above the first entry with the seed's header, which is where methodology_trim.py writes its shard pointer block and month heading. Both now say to replace the rules text or old header and keep those lines; the HANDOFFS.md route says to replace any older copy of its size section. Test 20 (g) pins the keep clause in the note and in the paragraph it cites. Found by an independent review of the branch before the pull request. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…dger's optional one The HANDOFFS.md seed says to archive when the trimmer's trigger fires, then points at the Action Ledger's "Reading and archiving", which concludes that archiving is optional. One sentence now says that the optional rule is CHANGELOG.md's and this file keeps its own. Found by an independent review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nd a merged branch's entries A ledger with no month headings starts them at its next new month or at its first trim, whose entry methodology_trim.py files under the current month's heading -- the rule contradicted the tool. And a merged branch's entries keep their branch order as one block, as they already do on main. Found by an independent review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…row, a moved note, two test references The seed says entries "may be" archived and names "reading and archiving", not a size; ITERATIVE_METHODOLOGY.md's apparatus row matches. The entry-format note in the Action Ledger drops a clause about the seed's freshness check that no longer applies where it now lives. Test 20 (b2) cites BOOTSTRAP.md's update paragraph by name instead of a line number this branch moved. No rule or marker changes. Found by an independent review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… records the review's fixes and the merge fork main now owes PR KJ5HST#84 is OPEN and MERGEABLE at head 20db3f0 (operator go-ahead; read back). Item (24): the independent review's five fixes, D9 revised (HANDOFFS.md keys on handoffs-format: 2), and what that means for P8-P11 -- fork main lacks f572068..20db3f0, so the branch merges into main before P8 syncs from it. Two ledger entries: the PR open (a non-commit action) and this record. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…he merge into fork main is owed before P8 Receipt: self-score 7, S188 scored 8. The branch merged upstream/main, re- measured its densities, and took five fixes from an independent review of the frozen PR; PR KJ5HST#84 is OPEN and MERGEABLE at 20db3f0. No learnings row: docs/FORK_LEARNINGS.md is at its ceiling and BL-53 comes first; the three candidates are written under the receipt. Gate on c64cbd8: 10/10, results 949e9e0b4269. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…changelog-rules, riding PR KJ5HST#84, then merge into fork main Chosen by the operator after Phase 0 (picker), as S191's handoff ordered (BL-72 before P9). The same picker chose the route: build on bl57/changelog-rules so the fix rides PR KJ5HST#84, then merge into fork main. It also approved two close-out pushes, each after the gate passes and read back: fork main to origin, and the branch to PR KJ5HST#84. Phase 0: CHANGELOG.md frontier fa0e36e = HEAD, no gap; HANDOFFS.md frontier 6cdec69, two post-close-out records behind, no receipt by design. Nothing backfilled. Gate in a --no-local clone of fa0e36e: 10/10 pass, results 511119b3196e, S191's citation. Dashboard 76/100. 3 receipts: the HANDOFFS.md trim follows this claim. Phase 0's two tracked rows ride here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ence fix (BL-72), riding PR KJ5HST#84 Brings 77afc12 into fork main: scan() skips a fenced block with an info string (the seed's sh block) to its bare closer instead of skipping the newest receipt behind it, with ten assertions in bin/tests.sh Test 22. CHANGELOG.md and bin/tests.sh conflicted, as git merge-tree predicted. CHANGELOG.md resolves ours: this ledger is the fork's own, and the record commit that follows carries the entry. bin/tests.sh resolves ours plus the branch's 69-line block, inserted after main's block-isolation case; its changed lines equal the branch patch 20db3f0..77afc12 exactly. bin/check-handoff auto-merged, and its changed lines equal the branch patch too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ession records it on the relay Chosen by the operator after Phase 0 (picker), as S192's handoff ranked it, over BL-73, BL-53 and BL-54's PR. The same picker approved three separate actions: push 037335d to origin (done before this claim, read back; its entry rides here), draft a paragraph for PR KJ5HST#84's description naming the check-handoff fence fix, and raise the tests-sh-passed floor 305 -> 331. The claim exists because two of those commit. Phase 0: CHANGELOG.md frontier 037335d = HEAD, no gap; HANDOFFS.md frontier f6d1c0b, three post-close-out records behind, no receipt by design. Nothing backfilled. Gate in a --no-local clone of 037335d: 10/10 pass, results d56e26f10caf, S192's citation. Dashboard 76/100. Two receipts, no trim owed. Phase 0's two tracked rows ride here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…db82c2's draft, read back) Operator go-ahead in a second picker after reading the draft. Guarded by re-fetching the live body first (unchanged since the diff); read back identical apart from jq's trailing newline. PR KJ5HST#84 OPEN at 77afc12, no reviews. The draft file's front matter now says it is posted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ed here (676ca33); P10 next The receipt, self 8, predecessor S192 9. P9 was re-verified read-only from --no-local clones; one remainder stays in mts-system (a superseded rules block, plan item (28)). Side actions: 037335d pushed, the floor 305 -> 331 (e9b7962), PR KJ5HST#84's description drafted (8db82c2) and posted (99fb6bf). Close-out gate on 676ca33: 10/10 pass, results 6d2ca2197aa7, 337 passed at 3 receipts. Learnings withheld pending BL-53. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…d read refusal Chosen by the operator after Phase 0 (picker), over BL-53, BL-75 and BL-74. CHANGELOG.md is 255,860 B and S195 alone added about 9,500 B, so the operator's 2026-09-14 no-trim decision (3745748, reaffirmed S177) reaches its stated end this session. The cut is chosen and written in a --no-local scratch clone first, the shard's .verify.sh proves the reconstruction lossless, and bin/tests.sh re-runs after. Two side actions approved in the same picker, each its own commit: the HANDOFFS.md retention trim owed at this Phase 0 (3 receipts, 4 with this claim, against a retention of 1 and a trigger above 2), its pointer block folded into docs/HANDOFFS_ARCHIVE_INDEX.md in its own commit; and the push of a69ef73, a127ba1 and 431279b to origin. Phase 0: both frontiers = HEAD 431279b, no gap, nothing backfilled, no pending stub. Gate re-run in the clean working tree at HEAD: 10/10 pass, results 6d2ca2197aa7, manifest 61cd292c36bd -- S195's citation exactly; tests-sh-passed 337 at three receipts. Dashboard 76/100. PR KJ5HST#84 still open at 77afc12 with no reviews. Phase 0's one tracked row rides here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…tests.sh Chosen by the operator after Phase 0 (picker), over BL-60's planning session, BL-53 and BL-61. Two halves: (a) re-derive the flake population by PATTERN -- the item's six enumerated line numbers no longer point at assertions and Test 40 postdates the enumeration, which is how S196 met a seventh site by accident; (b) fix each remaining site RED-first with S196's shape (a here-string, not a pipe), starting from bin/tests.sh:3203, measured not firing today only because its probe matches at line 1,082 of 1,095. Each site gets its own proof that it still fails when it should. Side action approved in the same picker: push 08c5327..HEAD to fork origin (a range, not a count -- this commit changes any count). Fork only; nothing reaches KJ5HST. Phase 0: both frontiers = HEAD 5ffd6f9, no gap, nothing backfilled, no pending stub. Gate in a --no-local clone with HEAD asserted by sha: 10/10 pass, results a5197f8a439f, manifest 61cd292c36bd -- S196's citation exactly; tests-sh-passed 331 at two receipts. Dashboard 76/100. PR KJ5HST#84 open at 77afc12, no reviews. Receipts 2 at the report, 3 with this claim, so the --cut 2 retention trim falls due and is raised with the operator. Phase 0's one tracked row rides here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… and sent Non-commit action, operator go-ahead given in the Phase 0 picker over this session's recommendation to hold it until PR KJ5HST#84 moves; the recommendation is recorded with the decision. Re-derived rather than cherry-picked: upstream has no Test 43 and no suite coverage of a hook selftest, so its precedent is the gate, and the PR adds pre-commit-selftest beside commit-msg-selftest with bin/tests.sh untouched. Measured on upstream's tree in a --no-local clone with HEAD asserted by sha: 139/0 before and after, gates 10/10 -> 11/11. The before-run reproduces the results hash upstream's own newest receipt cites. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…irreducible by the rule meant to shrink it Phase 3C. The row records what BL-53 P3 measured: a criterion of mechanized / superseded / spent retired 0 of 69 rows because each limb is defeated by a curation habit that is a virtue -- cross-referencing that differentiates rather than restates, dogfooding that keeps every named artifact alive, and gates that pin the instance a lesson came from rather than the next one. And a ten-row sample scored "partly" reported a bound of 2, not a yield; the census was 0. 1,498 B against the 1,500 B row budget; the guard refused two longer drafts first. check-learnings: 70 rows, contiguous 15..84, 0 over budget. D3 -- in force since this session's Phase 0 -- requires a session that appends a row to retire one or state that none qualifies, naming the rows considered. This session considered all 69 and recorded a verdict for each. The file goes to 86,727 B, so the overage widens to 4,807 B; that is stated, and the remedy is now an operator choice between options C and B rather than another adjudication. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Checking in on this one. It has been open since 18 September and is still mergeable against Re-verified today on the merge result itself, in a clean clone with the head commit asserted by SHA ( Since opening it I have applied the same rules change across all six downstream projects that use this framework, so that half of the work is finished and this pull request is the only part still outstanding. If the size is what makes it hard to review, I am happy to split it — the seed-to-pointer change, the rules section itself, and the No urgency from my side; flagging it mainly so it does not get lost. |
…what that key is Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the two Phase 0 history rows this session's own runs appended (dashboard_history.jsonl, .context-budget-history.jsonl). Phase 0: CHANGELOG frontier = HEAD d402f26, gap empty; HANDOFFS frontier the same commit, gap empty. No pending stub, 2 receipts before this one. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S203's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#85, KJ5HST#84, KJ5HST#83 open with 0 reviews each. origin/main 8 commits behind local main. Operator picker: deliverable BL-78 P1; P2 settled as option beta (reported series), not executed here; CHANGELOG trim, HANDOFFS trim and the fork push approved; nothing upstream-facing approved pending review of draft comments. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…fs against itself An instrument that records every run changes its own output, so a before/after diff of it carries the instrument's delta as well as yours. P1's central A/B came back non-empty on a growth-run counter (166 vs 167), which read once says "the edit changed the output" -- the opposite of the claim P1 existed to make. The control is one more run of the unchanged side. 1,497 B after two trims; drafts at 1,636 B and 1,509 B were both refused by the per-row budget and shortened, not waived. 74 rows, contiguous 15..88. D3 discharged by explicit refusal: no row qualifies for retirement. Considered KJ5HST#82 (mechanized by pre-commit-selftest and Test 43, but retained on S200's reasoning that a gate pins the instance, not the next case -- and BL-77 is its unmechanized residual), KJ5HST#85 (re-examined because P1 rewrote the note it is about; P1 wrote prose, not a gate, and the indicted clause still stands), KJ5HST#86, #87, KJ5HST#83 and KJ5HST#84. Age and file size are not grounds and were not used. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…series Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG frontier = HEAD 2a8a76a, gap empty; HANDOFFS frontier 7ca7b94 with 2a8a76a above it, which IS that push's ledger entry, so no unrecorded action and nothing backfilled. No pending stub, 2 receipts before this one. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S204's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#85, KJ5HST#84, KJ5HST#83 open with 0 reviews each, nothing moved since S204. origin/main level with local main. Operator picker: deliverable BL-78 P2 (option beta), over BL-81, BL-80, BL-79. Nothing upstream-facing approved. The requested PR KJ5HST#83 twelve-decisions write-up is a second deliverable and is being opened as a backlog item instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rator decisions Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG and HANDOFFS frontiers both = HEAD c77aa65, gaps empty, no pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S205's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#85, KJ5HST#84, KJ5HST#83 open with 0 reviews each, nothing moved since S205. Local main 7 ahead of origin/main. Operator picker: deliverable BL-82 (internal draft, nothing posted), over a CHANGELOG.md trim, BL-80 and BL-79. BL-78 P3 answered "no enforcement", so BL-78 closes -- recorded here and in its detail block; the closing edits are their own session. Fork push approved for close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ew for readability Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG and HANDOFFS frontiers both = HEAD 8f5bbb7, gaps empty, no pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S206's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#83 head 219fb9d with 0 comments and 0 reviews; KJ5HST#84's one comment is the fork's own check-in; KJ5HST#85 unchanged. Local main 1 ahead of origin/main. Operator picker: deliverable = recompose section 6 (too dense, undefined terms, poor structure), presented for review. Nothing is posted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…t_budget.py Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG frontier = HEAD 73b9536, gap empty; HANDOFFS frontier 1c56948, the one commit after it is S208's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S208's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, no maintainer comment. main = origin/main; upstream/main 6b29d3d. Operator picker: deliverable = a plan for one upstream-bound PR fixing BL-75 (no --status, unknown arguments ignored) and BL-80 (a false "Nothing is over a ceiling yet"). Side actions: HANDOFFS.md retention trim, the section 4.2 sentence fix in the PR KJ5HST#83 review, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…g context_budget.py docs/planning/context-budget-status-plan.md, frozen before its five decisions go to the operator. Recommends a write-free --status (the default run minus the history append), refusing unknown arguments with the tool's documented usage exit 3, and choosing the growth-run advisory's second sentence by the headline's own worst state. Grep inventory of every context_budget.py --status citation (122 fork, 12 upstream, PR KJ5HST#84's body, the maintainer's PR KJ5HST#82 reply), every caller, every guard the change must keep green, and the open PRs' overlapping hunks. Five phases, one session each; opening the PR is its own go-ahead. The premise was tested on a throwaway patch in a scratch clone (not committed): existing guards green, --status write-free and output-identical, unknown arguments exit 3. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ee --status, unknown arguments refused) Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG frontier = HEAD cadd8a0, gap empty; HANDOFFS frontier e1795a0, the one commit after it is S209's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S209's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, no maintainer comment. main = origin/main = cadd8a0; upstream/main 6b29d3d. Operator picker: deliverable = P1 of docs/planning/context-budget-status-plan.md (D1 + D2 + D4), built on a local fix/context-budget-status branch from upstream/main; nothing pushed. Side actions: HANDOFFS.md retention trim + fold, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…th-run advisory agrees with its table) Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG frontier = HEAD 36044bb, gap empty; HANDOFFS frontier 1e1cd18, the one commit after it is S210's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S210's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, no maintainer comment. main = origin/main = 36044bb; upstream/main 6b29d3d; fix/context-budget-status = e859196. Operator picker: deliverable = P2 of docs/planning/context-budget-status-plan.md (D3), one commit on the local fix/context-budget-status branch; nothing pushed. Side actions: HANDOFFS.md retention trim + fold, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…package) Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt, plus the Phase 0 dashboard history row this session's own run appended. Phase 0: CHANGELOG frontier = HEAD 304084d, gap empty; HANDOFFS frontier 68fd86d, the one commit after it is S211's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone with HEAD asserted by sha: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S211's citation exactly. Dashboard 76/100, medium, 0 high+. Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, only our comments. main = origin/main = 304084d; upstream/main 6b29d3d; fix/context-budget-status = c299c30. Operator picker: deliverable = P3 of docs/planning/context-budget-status-plan.md (vet and package); nothing pushed or opened. Side actions: HANDOFFS.md retention trim + fold, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…and the trial merges recorded docs/planning/context-budget-status-pr-body.md: the title and body for the context_budget.py PR, fork-only header marking it NOT POSTED. Every figure was measured this session; outward-text jargon scan 0 hits. Frozen here before the operator's review. CHANGELOG.md: two entries. d4dbc26 on the local branch fix/context-budget-status (upstream's tests-sh-passed 139 -> 141, context-budget-unit-tests 118 -> 129; fetched back as a fast-forward, not pushed), and the trial merges against KJ5HST#84, KJ5HST#85 and KJ5HST#83, each run through upstream's ratchet on the merge result: all green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…c26 and amended by the operator's review HANDOFFS.md: the S212 receipt completed (status: complete, self 7, predecessor 9); bin/check-handoff OK. CHANGELOG.md: the close-out entry with the Phase 3A evaluation of S211's handoff, the 3B self-assessment and the 3C note (no fork-learnings row; D3's retirement obligation does not arise). docs/planning/BACKLOG.md: an unbalanced ** in BL-80's index row, introduced in b6814a2, fixed. P3 = d4dbc26 on the local branch fix/context-budget-status (not pushed): upstream floors 141/129; trial merges vs KJ5HST#84/KJ5HST#85/KJ5HST#83 green on the merge results. The PR body (e4ad63d) was not approved; the operator added D6 (refused-argument messages answer the intent; --check = --status) and D7 (status precedence) to the same PR. Next: the plan's P2b. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ument messages and --check) Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt. Phase 0: CHANGELOG frontier = HEAD 00b8685, gap empty; HANDOFFS frontier b3b1f3a, the one commit after it is S212's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone at 00b8685: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S212's citation exactly. Dashboard 76/100, medium, 0 high+ (run in the clone, so no history row). Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, only our comments. main = origin/main = 00b8685; upstream/main 6b29d3d; fix/context-budget-status = d4dbc26. Operator picker: deliverable = P2b of docs/planning/context-budget-status-plan.md (D6); nothing pushed or opened. Side actions: HANDOFFS.md retention trim + fold, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…in one session (D7, then re-vet and re-package) Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt. Phase 0: CHANGELOG and HANDOFFS frontiers both = HEAD 2c711ab, gap empty. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone at 2c711ab: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S213's citation exactly. Dashboard 76/100, medium, 0 high+ (run in the clone, so no history row). Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open, 0 reviews, only our comments. main 1 ahead of origin/main (8089df7); upstream/main 6b29d3d; fix/context-budget-status = 612570b. Operator picker: deliverable = P2c then P3' of docs/planning/context-budget-status-plan.md, one session (rules at :600); nothing pushed upstream or opened. Side actions: HANDOFFS.md retention trim + fold, the plan's stale :668 sentence fixed in P3''s records, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… on it, P5's stale --check line corrected P3' of docs/planning/context-budget-status-plan.md, in the same session as P2c (the operator's decision, 2c711ab). New floors on the LOCAL branch fix/context-budget-status: c1167ae (tests-sh-passed 141 -> 142, context-budget-unit-tests 129 -> 140), fast-forward 2f73733..c1167ae, not pushed; fresh clone 10/10 - results 8a465ec9a35d. Trial merges from c1167ae, merged for real, the ratchet on each result: KJ5HST#84 clean, 10/10 - e1b3029504e8, bin/tests.sh 166/0; KJ5HST#85 CHANGELOG only, 11/11 - 91e29f97f572; KJ5HST#83 CHANGELOG only, 10/10 - 8a465ec9a35d. docs/planning/context-budget-status-pr-body.md is rewritten from the draft reviewed at S212 (git show e4ad63d:...), every figure re-measured this session; jargon scan 0 hits, bin/check-links OK. Not posted. The plan gains a P3' outcome block and its status line; P5's "--check now exits 3" (false since D6) is corrected, as approved at the Phase 0 picker. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…one session (2f73733, c1167ae); the PR body approved as written HANDOFFS.md receipt completed (self 9, predecessor 9) and the close-out ledger entry with the Phase 3A evaluation of S213's handoff and the 3B self-assessment. P2c is 2f73733 and P3''s floors c1167ae on the LOCAL branch fix/context-budget-status (not pushed); trial merges with KJ5HST#84, KJ5HST#85, KJ5HST#83 green under the ratchet; the rewritten body (fb324d6) approved as written, recorded e12cf47. Branch tip 10/10 - results 8a465ec9a35d; fork gates unchanged, 11/11 - results 10575dac7361. Phase 3C: no fork-learnings row. Next: the plan's P4 (push the branch, open the PR), its own go-ahead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… branch and open the upstream PR with the approved text Phase 1B claim. CHANGELOG entry (in progress) + HANDOFFS.md status: pending receipt. Phase 0: CHANGELOG frontier = HEAD 58f5d34, gap empty; HANDOFFS frontier 1b5365e, the one commit after it S214's announced push record. No pending stub, 2 receipts before this one; nothing backfilled. Gate citation re-run in a --no-local clone at 58f5d34: 11/11 - results 10575dac7361 - manifest 01a4ae7aa511, S214's citation exactly. Dashboard 76/100, medium, 0 high+ (run in the clone). Upstream 0 open issues; KJ5HST#83, KJ5HST#84, KJ5HST#85 open at unchanged heads, 0 reviews, only our comments. main = origin/main = 58f5d34; upstream/main 6b29d3d; fix/context-budget-status = c1167ae, not on origin. Operator picker: deliverable = P4 of docs/planning/context-budget-status-plan.md (push the branch to fork origin, open the PR with the approved text). Side actions: HANDOFFS.md retention trim + fold, push fork main at close-out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Base
main(6b29d3d), headrmsharp:bl57/changelog-rules(77afc12). 26 commits, plus three mergesof
maininto the branch (the last atf572068, after your first tightening), sogit merge-treeagainstmainreports no conflicts. 20 files, +770 / −296, andCHANGELOG.md+494 / −7: one entry per commit, as#76–#79 did, plus your root ledger's front matter (+34 / −7, its own commit). No Learning row, no
failure-mode change, no hook behaviour change.
The problem
The rules for a project's
CHANGELOG.mdlive inside the seed: 11,804 ofstarter-kit/CHANGELOG.md's12,893 bytes are rules — how to add an entry, the source tags, when to archive.
bin/syncwrites a seedonce and never again, because after that it holds the project's history. So every correction to those rules
strands the copies already in adopters: a project seeded before
56997afhas no size section at all, andone seeded after it carries the two-cap size table this PR removes. Neither copy will ever change on its own.
Spread across fourteen files, the rules have also come to disagree with each other, in the fifteen ways
listed below. Most of the disagreement has the same cause: the rules were stated in the seed and then
restated, differently, wherever a session needed them.
What this changes
FRAMEWORK_APPARATUS.md(distributed, so it lands in adopters at
docs/methodology/FRAMEWORK_APPARATUS.md), holds the rules. Theseed's three rule sections moved there verbatim first, one heading level down, and every later change
was made in the home.
marker,
ledger-format: 2, on a line the seed tells adopters to keep.main,bin/_manifest.pykeysCHANGELOG.mdon its title, which every seed since v3.1 carries, andHANDOFFS.mdon its title, which everyHANDOFFS.mdseed has carried — so theCHANGELOG.mdcheck fires only on a seed older than v3.1, and theHANDOFFS.mdcheck never fires.CHANGELOG.mdnow keys onledger-format: 2, andHANDOFFS.mdonhandoffs-format: 2, thefirst line of its seed's Size, and when to archive section. (A key on that heading alone would not do: the
heading has been in the seed since
56997af, over the size premise this PR removes.)bin/statusgives each stale seed its own migration route, and neither route rewrites history. ForCHANGELOG.md: replace the rules text or old header, keeping any archive-pointer block and month heading thetrimmer wrote above the first entry. For
HANDOFFS.md: bring the seed's size section across, replacing anyolder copy, and keep the rest of the front matter.
main's note says "reconcile against the currentstarter-kit seed by hand", and
BOOTSTRAP.md:85says to "reconcile its header and per-entry format" —which meant editing committed entries.
[BL-<id>]takes whatever id a backlog uses; one entry per commit, never edited; month headings start ata ledger's next new month or its first trim; a merged branch's entries keep their branch order.
not completed work history; the runner cites the audit instead of restating an older form of it. The
hook's refusal text changes the same two words; its behaviour does not.
CHANGELOG.mdfront matter points to the home for its rules, audit and month headings — itsown commit,
83a12f0, because it is your file (see What can be dropped).bin/check-handoffno longer skips the newest receipt behind the seed's fenced example (77afc12, addedsince this PR opened). The
HANDOFFS.mdseed's Size, and when to archive section, which this PR's migrationroute brings into adopters above their receipts, holds a fenced
shblock. The checker knew two fence openers,a bare backtick run and
handoff, so it read that block's closing fence as an opener and skipped to the nextbare fence: the newest receipt's closing one. It then checked the receipt below and exited 0, and
--allcounted one fewer.
mainhas the same checker, and its seed has carried the block since56997af. A fence withany other info string is now skipped to its closing fence, as CommonMark reads it; its lines stay visible to the
check that reports a receipt under a misspelled tag, and an unclosed one is reported. Ten assertions in
bin/tests.shTest 22: six fail on the previous checker, and each of six mutants of the fix fails at least one.It was found by running the checker on three adopter ledgers that carry a copy of the section; in each, the
newest receipt was the one skipped.
methodology_trim.pystops citing a--no-renamesflag no hook has. For thedesign document, you asked for it to be published with the PR; this PR instead links the contributor's
copy at a pinned public commit, because the document is 74 KB of the fork's planning history and would
need a redaction pass before it could live in
docs/planning/. If you would rather have it here, I canadd a redacted copy.
config declaring two ledgers at 25,000 tokens each, read separately, used to fail it.
BOOTSTRAP.mdsays how to commit abin/syncrun — one run, one commit.The four decisions
These were decided before any edit, each against named alternatives. The fourth changes your current
practice, so the evidence is given with it.
git log; close-out reads the top; a lookup is agrep), so no size is stated.methodology_trim.py --checkis the only statement of when.HANDOFFS.mdkeeps its own rule, archive when the trigger fires[BL-<id>]takes any backlog id; the audit is anchored to the entry heading and reads the archived shardsOn the fourth: the co-staging hook's unit is the commit, so an entry per commit is the one rule the hook
already enforces. Of the contributor fork's last 60 commits that touched its ledger when the decision was
taken, 56 only inserted. Your sessions S13–S17 each rewrote their claim entry at close-out, and S16's
amended claim (
356556f), written by a script that searched for the wrong boundary, deleted ten otherentries (40 → 30 headings; restored in
ed98444). Never editing a committed entry removes that class ofaccident. It is your call; if you prefer the per-session form, Lifecycle in §The Action Ledger is the one
place to change.
The fifteen disagreements, before and after
Line numbers are
main's (6b29d3d).mainstarter-kit/CHANGELOG.md:104), "split into shards once it outgrows a session's read" (:180); theHANDOFFS.mdseed repeats it (:98,:150); the trimmer calls its budget "the per-file context-tax budget" (methodology_trim.py:186). The runner's Phase 0 never reads it: it takes a frontier fromgit log:103–104); the trimmer fires at 196,608 B--checkis the only trigger:281,:332and:360,ITERATIVE_METHODOLOGY.md:294,HOW_TO_USE.md:767,:804, the hook's message:70; the seed says prepend:168), and adopters stop receiving the seedbin/_manifest.py:97–99keys both seeds on their titles, which every seed since v3.1 carries[BL-<N>]in the hook:71, the runner and the flight manual; but hundreds of adopter entries use ids likeBL-OPS-ADMIN-PW-RECOVERY-001, and your own tutorial writes[BL-F1](docs/tutorials/T2_worked_transcript.md:257)[BL-<id>]; the audit pattern isBL-[^]]+. The tutorial now conforms unchanged:88andITERATIVE_METHODOLOGY.md:169putCHANGELOG: pendinginSESSION_NOTES.mdand record actions only at Phase 3F; this repository keeps noSESSION_NOTES.md, and its claims write an entrySESSION_NOTES.mdrelies on itsstatus: pendingreceipt###headings thanHEAD's. Every trim lowers that count by designgrep -E '\[(issue #|BL-|ad hoc)' CHANGELOG.md(root:14, seed:24, runner:39), is unanchored and reads one file: onmaintoday it counts 69 actions in a ledger of 55 entries. The shard-spanning glob form aborts in zsh wherever no shard exists ("no matches found"), so it gives no count at allgit ls-files. It counts 55 onmain's ledger and 80 on this branch's, the same in bash and zshCLAUDE.md:51,README.md:96,:114,:200,BOOTSTRAP.md:23,:107,:131,:139,:145— against an action ledger that also records releases, PR opens and declinesREADME.md's release history is left as writtenCHANGELOG.md:103,HANDOFFS.md:97) cite a backlog item and a planning document in the contributor's fork:92: "promote … as the list grows"; your root ledger:34promises sections and has none## YYYY-MM; a ledger without month headings starts them at its next new month or its first trim, and nothing is retrofittedHANDOFFS.mdseed repeats 1 and 2starter-kit/HANDOFFS.md:89–125: the same premise, the same 65,536 B, and a cross-reference (:123) to the seed section this PR movesBOOTSTRAP.md:85tells an adopter to "reconcile its header and per-entry format" by handConservation, for the heading-count guard
The home states it (The shard convention): the live file and its shards together never lose an entry.
A trim moves entries and deletes none, so anything that counts the ledger reads both —
cat CHANGELOG.md $(git ls-files 'docs/archive/CHANGELOG-*.md'), which runs the same in bash and zsh with orwithout a shard. A guard built that way lets every trim through and still catches an accident like S16's. One
that compares the live file's
###count across commits refuses every trim, because the live count falls ateach one by design.
Size: the Phase 0 pair still fits
Measured by the doubled-file method, each run reproducing the previous recorded figure as a control
(
2a3e410d37,731,1244e95b46,965,933816b442,208 over seven copies):mainstarter-kit/SESSION_RUNNER.mdstarter-kit/SAFEGUARDS.mdCLAUDE.mdNo ceiling changed. The runner and
CLAUDE.mdshrink.SAFEGUARDS.mdgrows by one sentence (+105 B), thebin/synccommit rule, and that commit can be dropped on its own. The root.context-budget.jsonrecordsthe new densities with the blobs they were measured on (
adaa4a3), as its own rule asks when a blob changes.FRAMEWORK_APPARATUS.mdgrows 15,493 → 28,396 B; it is read on demand and has no budget entry.Verified
On the branch tip, in a fresh
--no-localclone withHEADasserted:python3 starter-kit/quality_ratchet.py --run— 10/10 pass:bin/tests.sh163 passed / 0 failed,dashboard units 226, budget units 122, trimmer units 124, ratchet units 45, and
check-links,check-learnings,check-handoff --all,commit-msg --selftestall at 0.python3 starter-kit/context_budget.py --status— nothing over budget.bin/check-links— 111 links across 23 distributed files (107 onmain).methodology_trim.py's syntax tree is identical tomain's once docstrings are blanked: its change iscomments and docstrings only.
HANDOFFS.mdwith the size heading, the old premise and nomarker read present under a heading key and reads present (stale format) now (
bin/tests.shTest 20 (g)).Three floors in
.quality-gates.jsonnow sit below what the branch measures (tests-sh-passed139 against163,
context-budget-unit-tests118 against 122,trimmer-unit-tests123 against 124). The manifest isyours, so this PR does not raise them.
Adopters:
bin/syncdry runsSix real adopter projects, copied into a scratch directory as exactly what
bin/syncreads (.gitignoreplus whichever distributed paths exist), dry-run from
mainand from this branch. Every refusal was checkedagainst the source's full history:
mainThis PR adds no refusal; it removes three in each of two projects. Every remaining refusal is either a
version these projects took from the contributor's fork, which
main's history has never held, or a genuinelocal edit (three files across two projects) — the same from
maintoday.After merge,
bin/statusflags theCHANGELOG.mdseed as present (stale format) in four of the six, and theHANDOFFS.mdseed in all five that have one, each with its migration route. Frommainit flags twoCHANGELOG.mdseeds and noHANDOFFS.mdseed, since everyHANDOFFS.mdcarries the titlemainkeys on. Two projectshave already migrated their
CHANGELOG.mdseed by hand; theirs read present. Sync never rewrites a seed, soeach migration is a hand edit in that project, with every existing entry left byte-identical.
What can be dropped
Each is its own commit. A plain
git revertof either conflicts inCHANGELOG.md, because later entries sitabove its own; say which you would drop and I will drop it on the branch.
83a12f0— your rootCHANGELOG.mdfront matter. Dropping it leaves:12saying the rules "live instarter-kit/CHANGELOG.md", which no longer holds them, and:14's unanchored audit in place.0d63410— how to commit abin/syncrun.BOOTSTRAP.mdgains the paragraph andSAFEGUARDS.mdtheone sentence that keeps its five-file cap from contradicting it. Dropping it also means restoring
SAFEGUARDS.md's density entry in.context-budget.jsontomain's (2.8234 at 17,024 B, blob933816b4).Not in this PR
HANDOFFS.md's own archive rule, apart from its seed's copy of the size premise.bin/syncandbin/status(git's default walk can hide a published version behinda merge, so an unmodified file reads locally modified) — a separate, small PR to follow.
fork (
methodology_trim.py:201,:818,:821;context_budget.py:683;methodology_dashboard.py:350), andmethodology_trim.py:831still frames the byte budget as a context tax. They arrived with Ship the ledger trimmer, with tests that run outside this fork (read-set budgets, 2 of 4) #77 and Ship the context-budget gate: token ceilings, class totals, and a root config for this repository (read-set budgets, 4 of 4) #79.Commit subjects and the branch's ledger entries carry identifiers from the contributor's backlog and plan
(
BL-57,P1–P4, numbered items). They name records in the fork; nothing here depends on them. The[BL-<id>]tags themselves are the vocabulary your ledger already accepts for work that originates there.🤖 Generated with Claude Code