Skip to content

backlog: archive #324, file #1025-#1027, and stop a PHI-route enumeration being a closed count - #204

Merged
wshallwshall merged 1 commit into
mainfrom
claude/ledger-1025-1027
Aug 5, 2026
Merged

backlog: archive #324, file #1025-#1027, and stop a PHI-route enumeration being a closed count#204
wshallwshall merged 1 commit into
mainfrom
claude/ledger-1025-1027

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Ledger pass plus the two documents it exposed. Docs-only, which makes this the first real exercise of the doc-guard steps #202 landed — if that step is broken it reds this PR, which is the fail-closed behaviour I claimed for it.

Three items filed, each re-verified before its body was written

Item V/D What it is
#1026 6/3 The ASVS 12.1.1 TLS-floor probe's gate requires four conditions while the comment above names three. The fourth is public_origin, whose refusal is itself gated on serve_ui — so with the console off, a PHI instance behind a declared terminator under enforce starts with the probe silently inert.
#1025 5/2 Three require_ui_step_up routes emit PHI with no phi=, so the allow_phi_read throttle never runs. A missing rate limit, not a missing authorization check.
#1027 5/3 testpaths = ["tests"] means the command CLAUDE.md:333 documents as the gate never collects the webconsole package. A failing test sat on main all day unseen.

#1026's sharpest detail: the same block return 2s when the probe's mechanism is unavailable, explicitly because a no-op "reports success forever afterwards." It refuses a silent no-op one level down and performs one, silently, one level up.

⚠️ #1026's originating report had the mechanism wrong, and the body says so. It claimed the console "auto-degrades" so public_origin stays unset. public_origin is an independent optional setting and serve_web_console maps to api.serve_ui — neither derives the other. The conclusion held; the mechanism did not. This is why it was held back from the previous ledger pass rather than filed on an unverified chain.

#1027 verified as NOT a CI gap rather than assumed: ci.yml:250 installs -e ".[dev,harness,fhir,dicom,x12,xml,webauthn]" plus the webconsole package and runs it as a separate required step, so PRs merged on real coverage. The gap is local only — which is precisely why nothing red ever reached anyone.

The enumeration is no longer a closed count

docs/SECURITY.md said "nine more" PHI routes and omitted POST /ui/messages/{id}/edit-resend, whose _reject arm re-renders both the pristine core.get_message detail and the operator's raw_value.

Per CLAUDE.md §11 a completeness claim is a liability, so it is reworded to "at least ten more" with the derivation rule stated — the code is the authority, a route emits PHI if it renders a message body, and the ones charging the budget are those passing phi=True — rather than corrected to "ten", which the next PHI route would falsify again.

A citation that was right until it wasn't

docs/testing/master-test-plan/11-web-console.md:67 said 243 tests / 5389 lines. Measured now 247 / 5501. That was exactly right before #203 and #203 made it false — the useful distinction being that a citation nobody has broken yet and a citation nobody has noticed is broken look identical in a grep, and only the change that breaks it can tell them apart.

Ledger verification

  • 108 open, 108 rows, ranks 1-108 contiguous, no duplicates
  • bijection empty both directions
  • all four census lines sum to 108, computed from the final table, never delta-adjusted
  • backlog_status_check.py: OK, 303 items across both files (108 + 195), each declaring exactly one status
  • frozen 2026-07-10 snapshot asserted byte-identical
  • 72 doc-guard tests pass locally

NB the --min-items floor stays at 300 against 303 — three items of slack, versus the 23 found yesterday. Raising it every pass would make every ledger commit touch ci.yml, since the floor is pinned in two places. That is an argument for deriving it, not for raising it more often; left for #1018.

…tion being a closed count

ARCHIVE #324, closed by PR #203, moved verbatim.

FILE THREE, all reported by lanes rather than fixed in them, and each
re-verified against the code at e0482ae before its body was written.

  #1026 (6/3) -- the ASVS 12.1.1 TLS-floor probe's gate requires FOUR conditions
    while the comment above it names three and says "every other posture never
    reaches here". The undocumented fourth is `public_origin`, and the refusal
    for an unset `public_origin` is itself gated on `serve_ui` -- so with the
    console OFF a PHI instance behind a declared terminator under `enforce`
    starts with the probe silently inert. The same block `return 2`s when the
    probe's MECHANISM is unavailable, explicitly because a no-op "reports success
    forever afterwards": it refuses a silent no-op one level down and performs
    one one level up.
    ⚠️ THE ORIGINATING REPORT'S MECHANISM WAS WRONG and the body says so. It
    claimed the console "auto-degrades" so `public_origin` stays unset;
    `public_origin` is an independent optional setting and `serve_web_console`
    maps to `api.serve_ui` -- neither derives the other. The conclusion held, the
    mechanism did not, and filing it as reported would have sent a fixer looking
    for a degradation path that does not exist. This is why it was held back from
    the previous ledger pass.
  #1025 (5/2) -- three `require_ui_step_up` routes emit PHI with no `phi=`, so
    `require_ui`'s `allow_phi_read` throttle never runs for them. A missing RATE
    LIMIT, not a missing authorization check; all three still gate on the right
    permission. Difficulty 2 is inherited: #324 already built the `phi=` seam.
  #1027 (5/3) -- `testpaths = ["tests"]` means the command CLAUDE.md:333
    documents as the verification gate never collects the webconsole package. A
    FAILING test sat on main all day unseen because every quartet used the
    documented single path. Verified NOT a CI gap: ci.yml:250 installs the
    webauthn extra and runs the webconsole suite as a separate required step, so
    PRs merged on real coverage -- the gap is local, which is why nothing red ever
    reached anyone. Difficulty 3 because the naive fix (widen testpaths) makes
    that same failure the default local experience.

STOP THE PHI-ROUTE LIST BEING A CLOSED COUNT. docs/SECURITY.md said "nine more"
and omitted POST /ui/messages/{id}/edit-resend, whose `_reject` arm re-renders
both the pristine core.get_message detail and the operator's raw_value. Per
CLAUDE.md section 11 a completeness claim is a liability, so it is reworded to
"at least ten more" with the derivation rule stated (the code is the authority; a
route emits PHI if it renders a message body, and the ones charging the budget
are those passing phi=True) rather than corrected to "ten" -- which the next PHI
route would falsify again.

Also corrected: docs/testing/master-test-plan/11-web-console.md:67 said 243
tests / 5389 lines. Measured now 247 / 5501. That citation was EXACTLY right
before PR #203 and that PR made it false -- which is the useful distinction: a
citation nobody has broken yet and a citation nobody has noticed is broken look
identical in a grep, and only the change that breaks it can tell them apart.

Census re-derived FROM the final table: 108 open, 108 rows, ranks contiguous,
bijection empty both directions, all four lines summing to 108, 303 items across
both files each declaring exactly one status. Frozen 2026-07-10 snapshot asserted
byte-identical.

NB the --min-items floor is left at 300 against a corpus of 303. Three items of
slack, versus the 23 found yesterday. Raising it every pass would make each
ledger commit touch ci.yml, since the floor is pinned in two places -- which is an
argument for DERIVING it, not for raising it more often. Left for #1018.
@wshallwshall
wshallwshall enabled auto-merge (squash) August 5, 2026 06:12
@wshallwshall
wshallwshall merged commit a2e55d7 into main Aug 5, 2026
31 checks passed
@wshallwshall
wshallwshall deleted the claude/ledger-1025-1027 branch August 5, 2026 06:14
wshallwshall added a commit that referenced this pull request Aug 5, 2026
… ten of its items shipped (#205)

SCHEDULABLE-BACKLOG-MULTISESSION-PLAN.md is read by sessions deciding WHAT TO
BUILD, which is what makes this worse than an ordinary stale line: it does not
misinform a reader about a fact, it misroutes work. The failure is already on
record for this exact file -- a session dispatched from it this morning and
inherited a SUPERSEDED section D RULE 1, whose ownership clause the owner had
amended on 2026-08-04.

Verified before writing, not transcribed: all ten claimed-shipped items (#233,
#322, #324, #326, #330, #334, #335, #336, #341, #347) are closed or archived;
the ledger is 108 open; 26 open items are numbered >=1000 and were filed after
the plan existed.

NO RUNNING COMPLETION COUNT, deliberately. Per CLAUDE.md section 11 a count
embedded in prose is a liability -- it would go stale the moment the next lane
lands, which is exactly how the line being fixed here got wrong. What is stated
instead is the AUTHORING BASELINE as fixed history (92 open items at authoring)
plus a dated snapshot of what has shipped, and a pointer to the ledger as the
live record. Same reasoning as the docs/SECURITY.md PHI-route rewording in #204:
stop asserting a count rather than correct one.

The planning gap is recorded, not closed: 77 open items have no wave assignment
and file contention has not been re-derived across the combined set, so
scheduling from this document alone would both miss work and under-count
collisions. Re-planning is a genuine multi-agent pass and an owner call.

⚠️ NOTE this file sits inside docs/releases/, which ADR 0160 Phase 1 proposes
removing from the public repo. Fixing it anyway: Phase 1 is unratified, and a
dispatch document that misroutes work does so TODAY. If Phase 1 lands, nothing
is lost.
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