Skip to content

Put the CHANGELOG.md rules in one synced home: the seed becomes a pointer, and the rules stop contradicting each other - #84

Open
rmsharp wants to merge 29 commits into
KJ5HST:mainfrom
rmsharp:bl57/changelog-rules
Open

rmsharp wants to merge 29 commits into
KJ5HST:mainfrom
rmsharp:bl57/changelog-rules

Conversation

@rmsharp

@rmsharp rmsharp commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator

Base main (6b29d3d), head rmsharp:bl57/changelog-rules (77afc12). 26 commits, plus three merges
of main into the branch (the last at f572068, after your first tightening), so git merge-tree against
main reports no conflicts. 20 files, +770 / −296, and CHANGELOG.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.md live inside the seed: 11,804 of starter-kit/CHANGELOG.md's
12,893 bytes are rules — how to add an entry, the source tags, when to archive. bin/sync writes a seed
once 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 56997af has no size section at all, and
one 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

  • One home, kept current by sync. A new section, §The Action Ledger in FRAMEWORK_APPARATUS.md
    (distributed, so it lands in adopters at docs/methodology/FRAMEWORK_APPARATUS.md), holds the rules. The
    seed's three rule sections moved there verbatim first, one heading level down, and every later change
    was made in the home.
  • The seed becomes a pointer — 12,893 → 1,335 B: title, purpose line, a link to the home, and a format
    marker, ledger-format: 2, on a line the seed tells adopters to keep.
  • The stale-seed check can see the formats it has to catch. On main, bin/_manifest.py keys
    CHANGELOG.md on its title, which every seed since v3.1 carries, and HANDOFFS.md on its title, which every
    HANDOFFS.md seed has carried — so the CHANGELOG.md check fires only on a seed older than v3.1, and the
    HANDOFFS.md check never fires. CHANGELOG.md now keys on ledger-format: 2, and HANDOFFS.md on handoffs-format: 2, the
    first 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/status gives each stale seed its own migration route, and neither route rewrites history. For
    CHANGELOG.md: replace the rules text or old header, keeping any archive-pointer block and month heading the
    trimmer wrote above the first entry. For HANDOFFS.md: bring the seed's size section across, replacing any
    older copy, and keep the rest of the front matter. main's note says "reconcile against the current
    starter-kit seed by hand"
    , and BOOTSTRAP.md:85 says to "reconcile its header and per-entry format"
    which meant editing committed entries.
  • The rules themselves, decided as below: the ledger is never read whole, so archiving is optional;
    [BL-<id>] takes whatever id a backlog uses; one entry per commit, never edited; month headings start at
    a ledger's next new month or its first trim; a merged branch's entries keep their branch order.
  • Wording everywhere else followsprepend, not append, for a newest-on-top file; action ledger,
    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.
  • Your root CHANGELOG.md front matter points to the home for its rules, audit and month headings — its
    own commit, 83a12f0, because it is your file (see What can be dropped).
  • bin/check-handoff no longer skips the newest receipt behind the seed's fenced example (77afc12, added
    since this PR opened). The HANDOFFS.md seed's Size, and when to archive section, which this PR's migration
    route brings into adopters above their receipts, holds a fenced sh block. 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 next
    bare fence: the newest receipt's closing one. It then checked the receipt below and exited 0, and --all
    counted one fewer. main has the same checker, and its seed has carried the block since 56997af. A fence with
    any 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.sh Test 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.
  • Three smaller fixes ride along.
    • Your review's F5 on Merge the read-set budgets series (#76–#79): the Phase 0 mandatory read fits in one read again #80. methodology_trim.py stops citing a --no-renames flag no hook has. For the
      design 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 can
      add a redacted copy.
    • The read-cap partition test sums only the two files read together, not every whole-read class; a
      config declaring two ledgers at 25,000 tokens each, read separately, used to fail it.
    • BOOTSTRAP.md says how to commit a bin/sync run — 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.

Question Chosen Not chosen
Where the rules live One synced home; the seed keeps a pointer and a format marker Keep them in the seed and flag stale copies; move only the size rules
Archiving Optional. Nothing reads the ledger whole (Phase 0 takes a frontier from git log; close-out reads the top; a lookup is a grep), so no size is stated. methodology_trim.py --check is the only statement of when. HANDOFFS.md keeps its own rule, archive when the trigger fires Mandatory at the trimmer's trigger; each project records its own choice
Source tags [BL-<id>] takes any backlog id; the audit is anchored to the entry heading and reads the archived shards Numeric ids only; an open vocabulary
Entries One per commit, never edited. A claim commit carries an (in progress) entry and close-out adds its own. A correction is a new entry; the one exception is removing content that must not be published One entry per session, edited until close-out

On 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 other
entries (40 → 30 headings; restored in ed98444). Never editing a committed entry removes that class of
accident. 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).

# The disagreement On main With this PR
1 Whether a session reads the ledger at all The seed prices it as a context tax"every session pays for the whole file" (starter-kit/CHANGELOG.md:104), "split into shards once it outgrows a session's read" (:180); the HANDOFFS.md seed 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 from git log Reading and archiving names the three partial reads and says the file is never read whole. The five sites are gone
2 Which size triggers an archive The seed: a ~2,000-line proxy and a 65,536 B default (:103104); the trimmer fires at 196,608 B No size in the rules; the trimmer's --check is the only trigger
3 Append or prepend "Append … newest on top": runner :281, :332 and :360, ITERATIVE_METHODOLOGY.md:294, HOW_TO_USE.md:767, :804, the hook's message :70; the seed says prepend Prepend at every site
4 Whether a trim may run in Phase 0 Only the seed says never (:168), and adopters stop receiving the seed Stated once in the home: a trim is its own action with its own entry, never in Phase 0
5 Detecting an old seed bin/_manifest.py:9799 keys both seeds on their titles, which every seed since v3.1 carries Two versioned markers, absent from every earlier seed
6 A closed tag vocabulary against an open practice [BL-<N>] in the hook :71, the runner and the flight manual; but hundreds of adopter entries use ids like BL-OPS-ADMIN-PW-RECOVERY-001, and your own tutorial writes [BL-F1] (docs/tutorials/T2_worked_transcript.md:257) [BL-<id>]; the audit pattern is BL-[^]]+. The tutorial now conforms unchanged
7 Where the Phase 1B marker lives, and whether a claim commit has an entry Runner :88 and ITERATIVE_METHODOLOGY.md:169 put CHANGELOG: pending in SESSION_NOTES.md and record actions only at Phase 3F; this repository keeps no SESSION_NOTES.md, and its claims write an entry A claim commit carries an (in progress) entry; a project with no SESSION_NOTES.md relies on its status: pending receipt
8 One entry per action, or per session The runner says per commit and per non-commit action; practice here is one per session, rewritten at close-out One per commit, never edited (decision four)
9 A proposed guard that would refuse every trim Your S16 receipt's next step (e): refuse a commit whose staged ledger has fewer ### headings than HEAD's. Every trim lowers that count by design Conservation, below. The guard itself is not built here; it stays yours
10 An audit that miscounts, or fails The published audit, grep -E '\[(issue #|BL-|ad hoc)' CHANGELOG.md (root :14, seed :24, runner :39), is unanchored and reads one file: on main today 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 all One audit, in the home: anchored, reading the shards through git ls-files. It counts 55 on main's ledger and 80 on this branch's, the same in bash and zsh
11 What the file is "Completed work history": CLAUDE.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 declines Action ledger at every site. README.md's release history is left as written
12 Distributed seeds citing material that is not in this repository Both seeds' size tables (CHANGELOG.md:103, HANDOFFS.md:97) cite a backlog item and a planning document in the contributor's fork Gone from both seeds
13 Where a month section starts Seed :92: "promote … as the list grows"; your root ledger :34 promises sections and has none Placement: prepend under the topmost ## YYYY-MM; a ledger without month headings starts them at its next new month or its first trim, and nothing is retrofitted
14 The HANDOFFS.md seed repeats 1 and 2 starter-kit/HANDOFFS.md:89125: the same premise, the same 65,536 B, and a cross-reference (:123) to the seed section this PR moves Premise and byte row gone; the cross-reference points at the home and says which archive rule is this file's own
15 Stale-seed advice that rewrites history BOOTSTRAP.md:85 tells an adopter to "reconcile its header and per-entry format" by hand Each seed's own route; every entry and receipt stays as written

Conservation, 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 or
without 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 at
each 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
(2a3e410d 37,731, 1244e95b 46,965, 933816b4 42,208 over seven copies):

File main this branch ceiling
starter-kit/SESSION_RUNNER.md 53,252 B · 18,865.5 tok 53,229 B · 18,858.5 tok 18,900
starter-kit/SAFEGUARDS.md 17,024 B · 6,029.7 tok 17,129 B · 6,083.7 tok 6,100
the pair 24,895.2 tok 24,942.2 tok (99.77% of 25,000) 25,000
CLAUDE.md 59,153 B · 23,482.5 tok 59,119 B · 23,476.5 tok 23,483

No ceiling changed. The runner and CLAUDE.md shrink. SAFEGUARDS.md grows by one sentence (+105 B), the
bin/sync commit rule, and that commit can be dropped on its own. The root .context-budget.json records
the new densities with the blobs they were measured on (adaa4a3), as its own rule asks when a blob changes.
FRAMEWORK_APPARATUS.md grows 15,493 → 28,396 B; it is read on demand and has no budget entry.

Verified

On the branch tip, in a fresh --no-local clone with HEAD asserted:

  • python3 starter-kit/quality_ratchet.py --run10/10 pass: bin/tests.sh 163 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 --selftest all at 0.
  • python3 starter-kit/context_budget.py --status — nothing over budget.
  • bin/check-links — 111 links across 23 distributed files (107 on main).
  • methodology_trim.py's syntax tree is identical to main's once docstrings are blanked: its change is
    comments and docstrings only.
  • The two new markers were driven red first: a HANDOFFS.md with the size heading, the old premise and no
    marker read present under a heading key and reads present (stale format) now (bin/tests.sh Test 20 (g)).

Three floors in .quality-gates.json now sit below what the branch measures (tests-sh-passed 139 against
163, context-budget-unit-tests 118 against 122, trimmer-unit-tests 123 against 124). The manifest is
yours, so this PR does not raise them.

Adopters: bin/sync dry runs

Six real adopter projects, copied into a scratch directory as exactly what bin/sync reads (.gitignore
plus whichever distributed paths exist), dry-run from main and from this branch. Every refusal was checked
against the source's full history:

Project From main From this branch
A refuses 7 refuses 4
B refuses 2 refuses 2
C refuses 5 refuses 5
D refuses 5 refuses 5
E refuses 6 refuses 6
F refuses 7 refuses 4

This 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 genuine
local edit (three files across two projects) — the same from main today.

After merge, bin/status flags the CHANGELOG.md seed as present (stale format) in four of the six, and the
HANDOFFS.md seed in all five that have one, each with its migration route. From main it flags two
CHANGELOG.md seeds and no HANDOFFS.md seed, since every HANDOFFS.md carries the title main keys on. Two projects
have already migrated their CHANGELOG.md seed by hand; theirs read present. Sync never rewrites a seed, so
each 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 revert of either conflicts in CHANGELOG.md, because later entries sit
above its own; say which you would drop and I will drop it on the branch.

  • 83a12f0 — your root CHANGELOG.md front matter. Dropping it leaves :12 saying the rules "live in
    starter-kit/CHANGELOG.md"
    , which no longer holds them, and :14's unanchored audit in place.
  • 0d63410 — how to commit a bin/sync run. BOOTSTRAP.md gains the paragraph and SAFEGUARDS.md the
    one sentence that keeps its five-file cap from contradicting it. Dropping it also means restoring
    SAFEGUARDS.md's density entry in .context-budget.json to main's (2.8234 at 17,024 B, blob 933816b4).

Not in this PR

Commit subjects and the branch's ledger entries carry identifiers from the contributor's backlog and plan
(BL-57, P1P4, 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

rmsharp and others added 28 commits September 15, 2026 14:48
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 18, 2026
… 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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 18, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…) and the close-out gate on f6d1c0b -- 10/10 pass

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 19, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 20, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 20, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 20, 2026
… 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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 20, 2026
…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>
@rmsharp

rmsharp commented Sep 20, 2026

Copy link
Copy Markdown
Collaborator Author

Checking in on this one. It has been open since 18 September and is still mergeable against main at 6b29d3d — the branch already carries that commit, so this is a fast-forward rather than a merge that can go stale underneath you.

Re-verified today on the merge result itself, in a clean clone with the head commit asserted by SHA (77afc12): the full test suite reads 163 passed / 0 failed against the declared floor of 139, and every quality gate passes, 10 of 10 (results 93ea168d093e · manifest 97a7aab85b9a).

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 bin/sync half are separable and could go as three smaller pull requests. Say which shape is easiest and I will redo it that way.

No urgency from my side; flagging it mainly so it does not get lost.

rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
… 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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
…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>
rmsharp added a commit to rmsharp/methodology that referenced this pull request Sep 21, 2026
… 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant