Skip to content

docs(releases): multisession plan for the 41 schedulable backlog items - #165

Merged
wshallwshall merged 2 commits into
mainfrom
claude/multisession-plan-schedulable
Aug 4, 2026
Merged

docs(releases): multisession plan for the 41 schedulable backlog items#165
wshallwshall merged 2 commits into
mainfrom
claude/multisession-plan-schedulable

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

One commit, one file, 316 insertions: docs/releases/SCHEDULABLE-BACKLOG-MULTISESSION-PLAN.md. git diff origin/main...HEAD shows exactly that and nothing else.

Why this branch and not the original

This content was originally pushed onto claude/backlog-open-non-gated-35712a, which had already been merged as #163 and deleted. The follow-up push recreated that branch, so it came back carrying all six already-merged commits plus this one — and a three-dot diff against main reported 6,937 insertions across 11 files, because the merge base predates the squash. That reads as "re-applies everything" and a PR from it could have reverted whatever landed on main in the meantime.

Nothing was ever wrong with main; it was a stale ref. The author cut this clean branch from origin/main instead, and the stale remote ref has been deleted.

Verified before deleting it, rather than assumed: of the 11 files those commits touched, 10 show zero difference from main (they landed via #163's squash), and the one remaining file is byte-identical on this branch (blob ebd99f778a on both). The pre-squash history is still held by local refs, so nothing is lost.

Risk

Docs-only. No gate reads this file and nothing depends on it.

37 sessions across 5 waves, 60.0 build-days, grouped so no two sessions in a wave
co-own a file. Scope is the non-DEMAND-GATE items from the 2026-08-03 re-score; the
52 demand-gated ones are excluded BY THE RULE and say so, with a pointer -- silently
dropping half the backlog is how a plan gets mistaken for a census.

Sized by coupling, not by item: items sharing a file are one session or different
waves. Every path was verified against HEAD with Glob/Grep/Read.

TWO ADVERSARIAL ROUNDS, and both earned their cost. Round 1 found six defects, two
severe; round 2 re-attacked the fixes and found seven more. All thirteen are applied
and recorded in the plan's own "Adversarial review" section rather than quietly fixed.

The two severe ones:

  1. The plan de-conflicted per-item BANNERS but never mapped the live ranked table --
     93 contiguous rows at docs/BACKLOG.md:180-272, plus a 4-line census at :169-171
     that every session would decrement. Measured: #233@191/#326@192 and
     #334@208/#347@209 are ADJACENT lines in different Wave-1 sessions. Two sessions
     each re-deriving the census from a tree the other already decremented merge CLEAN
     and publish a wrong count -- the exact silent corruption this plan exists to stop.
     Both surfaces are now owner-only; sessions move banners, the owner reconciles once
     per wave. The file already licenses this at :165: "the banner is the live record.
     This table is a view of it, and where the two disagree the banner wins."

  2. #334's widened semgrep would need nosemgrep annotations in
     scripts/security/scan_forbidden.py -- which Wave 1's leak-gate session is
     rewriting. The plan called those files "unowned"; they are not.

Round 2's HIGH finding is the instructive one: taking scan_forbidden.py away from #334
moved the annotation into a sibling W1 session, creating an UNDECLARED same-wave merge
order. A de-confliction that silently creates a dependency is only half a fix. W1 is
therefore not order-free -- leakgate merges before semgrep -- and #334 gets an explicit
escape hatch (a .semgrep paths: exclude, recorded in the PR body) because every other
owner of a newly-scanned file sits in a LATER wave, making "hand it to the owner"
temporally unsatisfiable for a W1 blocking gate.

Worth recording plainly: three of the four line-number defects across both rounds were
introduced by a VERIFICATION pass, including a false "correction" of #341's citation
from dryrun.py:112 to :110 -- presented as verified, on the highest-value item in the
backlog, and pointing at a line holding no logic (:112 is the narrowing; :110 is
`if result is None:`; :109 closes the docstring). Re-measuring is not optional because
a number came from a careful reader; it is required because it did.

The forbidden-content gate then blocked the first commit attempt of this file: a
phantom-file row for #228 reproduced a ported-feed config path carrying a site
identifier and named the maintainer-internal migration repo. Rewritten to say what the
row needs to say without reproducing either. The token was removed, not allowlisted.

Coverage appendix: 41 items, 11/11/6/6/7 by wave, none dropped or double-placed.
Wave efforts 11.0 / 17.0 / 12.0 / 7.5 / 12.5 = 60.0.
@wshallwshall
wshallwshall enabled auto-merge (squash) August 4, 2026 02:00
@wshallwshall
wshallwshall merged commit 285e7ca into main Aug 4, 2026
31 checks passed
@wshallwshall
wshallwshall deleted the claude/multisession-plan-schedulable branch August 4, 2026 02:02
wshallwshall added a commit that referenced this pull request Aug 4, 2026
…two docs named a function that does not exist (#176)

ASVS 12.1.5 (Encrypted Client Hello) is a `fail` that CANNOT be built — ECH needs OpenSSL 4.0
and the pinned runtime is 3.5.7. It is accepted as a Fail under register block 12. So the
only live harm on this cell is its documentation, and all of it was wrong.

1. THE OPERATOR RECIPE COULD NOT LOAD, two independent ways, both verified by execution:
   * the loader accepts only `[[inbound]]` / `[[outbound]]` arrays, so the documented
     `[connections.<NAME>.settings]` table fails with "unknown top-level key(s) connections";
   * and even with the right shape no factory accepts the keys —
     `Rest() got an unexpected keyword argument 'ech_egress'`. The factory IS the schema.
   Anyone following the shipped recipe got an error, not ECH.

2. `ech_route_from_settings` DOES NOT EXIST anywhere in the tree. Named by ADR 0139 and,
   independently, by the master test plan's SEC-71 row. The real function is
   `ech_sidecar_url_from_settings` (`rest.py:1077`). The test-plan row also cited
   `rest.py:1084` twice — that is inside the docstring, not the def.

3. `tools/ech-sidecar/README.md` prescribed pairing the sidecar with the ADR 0126 forward
   proxy. The engine REFUSES that pairing at construction: "ech_egress and proxy_url are
   mutually exclusive — the ECH sidecar IS this connection's egress path". The section also
   claimed engine wiring "is a follow-up", which Increment 1 made stale.

⭐ THE DRAFT'S CENTRAL CLAIM WAS FALSE AND I EXECUTED BOTH ALTERNATIVES BEFORE WRITING THEM.
It said "the ONLY authoring surface is a raw ConnectionSpec settings mapping". ADR 0139 is
reachable code-first TWO ways, both run against the shipped factories in this worktree:
  (a) `Rest(url=...)` then assign into `.settings`, and
  (b) a hand-built `ConnectionSpec`.
Only `connections.toml` genuinely cannot express it. Publishing "there is no way to do this"
next to a fix for a recipe that did not work would have been the same defect twice.

⚠️ And I corrected the correction. The reviewing pass framed form (a) as "the shipped factory
plus a settings assignment — no ConnectionSpec at all". Also false: `Rest()` RETURNS a
`ConnectionSpec` (measured — `type(Rest(url=...)).__name__` is `ConnectionSpec`). The true
distinction is whether you must IMPORT one, and the doc now says exactly that. Both
documented FAILURE modes were re-executed too, so the error strings quoted are real.

⛔ COUPLED — the vault half must land with this. This commit replaces the block ASVS cell
12.1.5 anchored on (`samples/ech-sidecar/README.md:61`); the paired re-anchor to `:80` is
committed in the vault. Proven necessary, not assumed: the PUBLISHED scorecard against this
tree gives EXIT=1 with `FAIL 12.1.5: samples/ech-sidecar/README.md:61 no longer contains ...`,
and EXIT=0 with the paired repair. Same template as the 13.2.2 pair in 1e9cc4c.

⚠️ Rebased before committing, and this is why: my branch still carried the PRE-SQUASH commit
01b11b8, whose content merged as 1e9cc4c. Diffed against main from there, this change
showed -43/-26/-53 on three files I never touched — it would have REVERTED merged work from
#165 and #167 behind a diff that looks clean. Moved onto a fresh branch from current main;
the diff is now exactly the four ECH files.

399 doc-gate tests pass (the master test plan is prose-gated and bit two commits recently, so
the edit there is a minimal rename plus two line-number corrections).
No verdict moves: 12.1.5 stays `fail`, correctly — none of this makes ECH reachable.
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