Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,35 @@ Reverse-chronological, newest on top; prepend-only. Promote to `## YYYY-MM` sect

---

### 2026-09-16 · [ad hoc] Parallel-sessions plan — making fan-out to concurrent writing sessions clean, not just safe

- **Action:** planning session S24 on branch `docs/parallel-sessions-plan`. The operator asked whether the
quality-ratchet work (PR #82) made multi-agent fan-out workable; the Phase 0 answer was *safe but not
clean* — `ITERATIVE_METHODOLOGY.md` §Mechanical Gates binds every actor's output, but two writing
sessions still collide on `CHANGELOG.md`/`HANDOFFS.md` (prepend-only, one anchor, co-staging hook forces
every commit onto them — S21 hit it with two sequences), on serial `S<N>` identity, on the absent
merge-session receipt (the open "11 reconciled receipts" ruling), and on Test 9's `--source=github`
coupling to `main`. Deliverable: `docs/planning/parallel-sessions-plan.md` + a PR for review, nothing
implemented (S13's shape). Results appended at close-out.
- **The plan, committed:** `docs/planning/parallel-sessions-plan.md` — 468 lines; §1 decomposes the operator's
own records into six mechanisms (two-writers-in-one-tree, the return-content fan-out that worked, the S21
double-ledger conflict, the undischargeable "11 receipts", Test 9's `main` coupling, the worktree-blind
calibrate); §3 the finding (*one closer per tree*; two shapes by who closes out); §4 fifteen decisions D1–D15
plus an alternatives table (changelog fragments considered and deferred); §6 six phases, one per session;
§7 six honest ceilings; §8 twelve operator decisions; §9 the evidence commands, all re-run before commit.
- **PR opened (non-commit action):** [PR #83](https://github.com/KJ5HST/methodology/pull/83) from
`docs/parallel-sessions-plan` at `903d724`, read back from the API (OPEN, +492/−0, 3 files); its body carries
the summary and asks the operator to answer §8 there — that answer is the plan's Phase 0. **Not merged.**
- **Gate run at `903d724`:** `quality_ratchet: 8/10 pass · 2 fail · 0 unmeasured · results bcbd7f39383a ·
manifest 97a7aab85b9a`. The two fails are one **environmental** failure — `tests-sh-passed` 138 /
`tests-sh-failed` 1 from `tools/test_context_budget.py` `TestFitGateEndToEnd::test_an_admitting_floor_prints_the_constant`:
this machine now holds exactly 4 transcripts for this path (calibrate()'s fit minimum; this session's is the
4th), so the fit runs on 4 points and is refused for a negative slope (R² 0.049), a refusal the test's `setUp`
does not skip on (it skips only on "not enough" — S16's fix for the sibling case S19 reported). Tool and test
are byte-identical to `main @ 6b29d3d`; not loosened; the one-file fix is the next session's first small task.
- Session S24: claim `3c244aa` + plan `903d724` + the close-out commit (receipt complete, cites the run). Every
commit ran the ledger co-staging hook clean — no `--no-verify`.

### 2026-09-16 · [ad hoc] PR #82 merged — post-merge verification on main and the first tightening

- **Action:** the operator merged [PR #82](https://github.com/KJ5HST/methodology/pull/82) (quality ratchet,
Expand Down
16 changes: 16 additions & 0 deletions HANDOFFS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,22 @@ This repository dogfoods its own methodology: every session records a durable, m

---

```handoff
session: S24
date: 2026-09-16
status: complete
self_score: 8
predecessor_score: 8
active_task: Planning session — write docs/planning/parallel-sessions-plan.md: how the methodology supports fan-out to multiple concurrent WRITING sessions (the two prepend-only ledgers + the co-staging hook conflict at one anchor; serial S<N> identity; no receipt for a merge; Test 9 couples branches to GitHub main). Evidence-based inventory, per-phase DONE/verify/STOP, open decisions for the operator. ONE DELIVERABLE (the plan document + a PR for review, S13's shape). Nothing implemented. Operator trigger: "I want that plan." COMPLETE — plan committed, PR #83 open; NOT merged.
what_was_done: Orient (read-only 2.11.1 scan via collect_all, not the 2.6.1 oversight copy; both ledger frontiers = HEAD; S23's gate citation matched --status exactly) → answered the operator's fan-out question from the corpus with file:line (safe, not clean) → routed "I want that plan" as a planning session, asked for /effort max, claim 3c244aa on docs/parallel-sessions-plan → inventory: ARCHITECTURE_WORKSTREAM + the quality-ratchet plan as shape precedent; greps over the runner, both ledger seeds, check-handoff, the hooks, the ratchet, context_budget, the dashboard's ledger-lag, bin/sync + Test 9, HOW_TO_USE, the campaigns; the operator's real fan-out records found in an adopter project (S163: six mutating verify-agents in one tree; S13: return-content agents + serial integrator) — cited by session number, project unnamed → plan 903d724 (468 lines: §1 six mechanisms, §3 one closer per tree / two shapes, §4 D1–D15 + alternatives table incl. changelog fragments deferred, §6 six phases, §7 six ceilings, §8 twelve decisions, §9 evidence commands) → every §9 command re-run before commit; the verify pass found and fixed 9 shifted citations (find_root 61→72; CHANGELOG/HANDOFFS anchors moved by the claim commit, now cited at 6b29d3d; HOW_TO_USE range; README live count claim vs a historical one; dashboard _fold_history 2040→2074) and 2 overstated "mechanical" sentences → pushed → PR #83 opened and read back (OPEN, head 903d724, +492/−0, 3 files) → this close-out. Learnings: none appended — the candidate row ("a tree has one writer; many hands, one closer") is the plan's D1/D2 and becomes Learning #17 in Phase 2 only if ratified; writing it now would implement a decision the plan puts to the operator (FM #18). Stated rather than left unsaid.
next_steps: (a0) FIRST, small, one file: tools/test_context_budget.py TestFitGateEndToEnd.setUp (:339–357) skips only on "not enough"; calibrate() has a SECOND data-shape refusal — a negative slope prints "no constant recommended" and returns WARN even at floor 0.0 — so on a machine with exactly 4 transcripts (the fit minimum) test_an_admitting_floor_prints_the_constant (:372) FAILS instead of skipping. Fix: probe at the admitting floor too and skipTest when the tool refuses for slope sign; RED first on this machine, then green. It is the sibling of S16's "not enough" fix (S19 gotcha 1). Until then bin/tests.sh reads 138/1 and `--run` 8/10 HERE — environmental (tool + test byte-identical to main; only ~/.claude/projects transcripts differ), and NOT a reason to loosen tests-sh-failed (SAFEGUARDS ratchet row). (a) OPERATOR: answer the twelve §8 decisions on PR #83 (a comment suffices — that is the plan's Phase 0); each carries a recommendation. (b) Per D12, the v3.8 RELEASE PR comes before any phase of this plan (S23's next_steps (a): README What's New in v3.8 — a FRESH entry, the "Since v3.6 (unreleased)" section no longer exists; CLAUDE.md §Versioning paid by reduction against its 23,483-token pin; tag + release). (c) Then Phase 1 of the plan, one session: .gitattributes (four merge=union lines) + starter-kit/gitattributes seed + bin/_manifest.py row (29→30) + a two-branch merge test in bin/tests.sh, RED-first; then bin/check-ledger + an 11th gate — file list and DONE/verify at docs/planning/parallel-sessions-plan.md:300–321. Phase 1 is independent of the release and of the prose decisions; it may land first if the operator prefers. (d) Still open from S23: refresh /Users/terrell/code/methodology_dashboard.py (2.6.1) by ONE-FILE copy; the .context-budget-history.jsonl tracked-or-ignored ruling. The "11 reconciled receipts" and "S19 ledger reorder" items are now DECISIONS 5 and 3 of the plan's §8, not floating rulings. DERIVED: `git merge-tree --write-tree --name-only origin/main origin/docs/parallel-sessions-plan` at this close-out exits 0 — origin/main is 6b29d3d, the branch's base — and stays clean until main moves; any main-side prepend to either ledger before merge recreates the S21 conflict this plan exists to fix (resolve as a union, S24 above S23).
key_files: docs/planning/parallel-sessions-plan.md:21 (§0 the answer), :42 (§1 six mechanisms), :72 (§3 the finding), :110 (§4 D1–D15), :254 (alternatives table), :289 (§6 phases; Phase 1 at :300), :391 (§7 ceilings), :414 (§8 the twelve decisions), :439 (§9 commands); PR #83 https://github.com/KJ5HST/methodology/pull/83 (body = the summary + the decisions ask); HANDOFFS.md:10 (this receipt); CHANGELOG.md:38 (the S24 entry); starter-kit/SESSION_RUNNER.md:175,177 (the reduction candidates D10 sizes: 199 B, 1,701 B); starter-kit/HANDOFFS.md:82–87 (identity paragraph D5 amends); bin/tests.sh:118 + bin/sync:78 (Test 9 / read_github, D8's target); starter-kit/context_budget.py:867 (D9's target); adopter evidence paths: agent memory `adopter-fanout-evidence` (deliberately not in this public repo)
gotchas: (1) CITE AT THE BASE SHA: the 1B claim commit prepends to CHANGELOG.md and HANDOFFS.md, so every line number in those two files shifts (+11/+7 here) between Orient and the deliverable — the plan cites them at 6b29d3d and says so; a citation made after the claim at the branch tip is wrong for anyone reading main. (2) `context_budget.py` bare and `--json` runs WRITE .context-budget-history.jsonl (untracked, not ignored) — remove before commit; `--precommit` does not. (3) The plan is NOT distributed (canonical-only, like the ratchet plan) — no bin/_manifest.py row, no sync; check-links does not cover it (its citations were verified by hand and by §9). (4) GitHub's honoring of merge=union is an ASSUMPTION the plan defers to Phase 1 (§7 item 3) — do not state it as fact when answering §8. (5) The adopter project the plan cites is unnamed on purpose; keep it that way in PR comments and in Phase 2's prose (memory: adopter-fanout-evidence). (6) The ratchet is live on this branch: Test 9 stays green here (no manifest row added), `--run` ~3 min. (7) Two-table trap (S12 gotcha 2) unchanged.
runtime_smoke: n/a as an application launch — the deliverable is a document. Build-equivalent: quality_ratchet: 8/10 pass · 2 fail · 0 unmeasured · results bcbd7f39383a · manifest 97a7aab85b9a — run at 903d724 (the plan commit; ~3 min). The two fails are ONE environmental failure: tests-sh-passed 138 / tests-sh-failed 1, from tools/test_context_budget.py TestFitGateEndToEnd::test_an_admitting_floor_prints_the_constant — this machine holds exactly 4 transcripts for this path (this session's is the 4th), calibrate()'s fit minimum, so the fit RUNS on 4 points (n=4, R² 0.0493, slope −3.57) and is refused for a negative slope, a path the test's setUp does not skip on. Reproduced directly (rc 1, "no constant recommended"). Same tool + test at 6b29d3d (git diff --quiet: identical); the other 8 gates pass at their measured values; check-handoff-all 0; check-links 0; check-learnings 0. Not loosened; fix is next_steps (a0); bin/check-handoff --all --allow-pending OK at claim; the plan's §9 evidence block re-run in full before the plan commit (every output matched the plan's claim; 9 citations corrected as a result). The PR read back through the API (state, head sha, additions), not inferred from the CLI.
changelog_ref: CHANGELOG.md "2026-09-16 · [ad hoc] Parallel-sessions plan — making fan-out to concurrent writing sessions clean, not just safe" — written at claim, one bullet per checkpoint, completed here with the PR
commit: 3c244aa (claim) + 903d724 (the plan) + this commit (close-out); PR #83 opened at 903d724 (non-commit action, in the ledger)
```

```handoff
session: S23
date: 2026-09-16
Expand Down
Loading