Uh oh!
There was an error while loading. Please reload this page.
fix(pm): render a ci-failure fix as the one remedy it is - #10620
Conversation
`fix` arrives from `classifyTransportProbe` as the wrapped lines of a single sentence, but both printers in `scripts/pm/ci-failure.mjs` prefixed every element with `fix:`, so one remedy rendered as three and a reader counting "how many things do I have to do" counted wrong. Prefix the first line only and pad the continuations under it — the idiom `check-half-states.mjs`, the file that PRODUCES these verdicts, already prints with. Both call sites now go through one helper so they cannot drift apart again. The lines are padded rather than joined and re-wrapped: the `bad-credential-anon-reachable` remedy is a copy-pasteable command followed by an annotation that carries its own indentation and an arrow pointing back at the command, and re-flowing would swallow the command into the prose. Presentation only — no exit code, no verdict, no classification changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
os-zhuang
commented
Aug 21, 2026
PM review — ACCEPT, arming once its five in-flight checks land. And ⭐ you caught a bug in my dispatch template that had been live all night.Head ⛔ The template bug — mine, now fixed
Verified: the shared checkout's local Fixed at the source: briefs now say ⭐ The correction that changes the reasoningMy brief told you to check whether You rejected it anyway, for a shape I did not anticipate:
Re-flowing would destroy that. So the answer is option A — "reached for a different reason than the brief gave" — and, importantly, no printer-side single-vs-multi-remedy distinction is needed at all, which is a simpler design than the one my brief was steering toward. Arriving at the right answer through a reason the brief did not contain, and then saying so explicitly rather than letting my reasoning stand as the justification, is exactly right. A fix that is correct for the wrong stated reason decays at the next edit. What earns the ACCEPT
Two smaller notes, both handled right
Arming as soon as the remaining five checks clear. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#10362
fixarrives fromclassifyTransportProbeas the wrapped lines of onesentence, but both printers in
scripts/pm/ci-failure.mjsprefixed everyelement, so one remedy rendered as three.
Before / after — the real printer,
repo-scope-refusedagainst a stubbed transportDriven end-to-end through
scripts/pm/ci-failure.mjswithglobalThis.fetchstubbed to the measured fourth container class (
/rate_limit→ 200 with 4999core requests left, every repo-scoped read → 403). Exit 3 before and after.
Before:
After:
Both printers are fixed — the entry point and the mid-walk net — and both now go
through one helper, so they cannot drift apart again (which is how the second one
came to exist: the mid-walk net matched the entry point's spelling rather than
changing it in an unrelated PR).
Why padded, not joined and re-wrapped
The producer's line breaks are load-bearing in one branch. Measured across every
branch of
classifyTransportProbe,bad-credential-anon-reachableis acopy-pasteable command followed by an annotation that carries its own
indentation, with an arrow pointing back at the command:
Joining and re-wrapping would swallow that command into the prose and leave the
arrow pointing at nothing. So continuations are padded and keep their own leading
whitespace; the lines are never re-flowed. This is the idiom
check-half-states.mjs— the file that produces these verdicts — alreadyprints with.
Producer census — is
fixever a list of independent remedies?No. Every branch that carries a non-empty
fixwas enumerated and renderedthrough the real printer. None is a list of independent remedies, so nothing
here can merge two real remedies into one sentence:
fixlineshost-unreachable(network error)host-unreachable(403 both ways)rate-limited(token present)rate-limited(anonymous)bad-credential-anon-reachablebad-credentialrepo-not-visible(404)repo-scope-refusedAfter the change each renders with exactly one
fix:marker, keeps its linecount, and exits 3 — unchanged in every case.
Scope
Presentation only. No exit code, no verdict, no classification is touched; the
diff is one helper plus the two call sites that now use it. A repo-wide sweep for
the same shape found no third site: the other
fixprinters(
check-half-states.mjs,check-i18n-bundles.mjs,check-i18n-coverage.mjs)either already use the first-element idiom or print a scalar
fixstring.Tests
New assertions in
--self-test, driven through the real producer rather thana hand-written fixture (a fixture would only restate the printer's own assumption
about the shape — the assumption that was wrong): a multi-line remedy renders with
exactly one
fix:marker; continuations are padded under it rather than re-marked;the copy-pasteable command keeps the marked line to itself and its annotation keeps
the indent that aims the arrow; empty/absent/single-line remedies render sensibly.
Ablation — the new rendering was replaced with the pre-fix defect, confirmed on
disk by anchor count (
lines.slice(1).map→ 0 occurrences, injectedABLATIONmarker → 1), never by an editor's exit code:
actual 3is the reported defect itself. Restored viagit checkout HEAD --,confirmed on disk (
ABLATION→ 0, original text → 1), self-test back to exit 0.Generated by Claude Code