Address: internal/serve/card.go:263 — return runCard{RunID: runID, State: stateUnknown, Error: err.Error()}
The briefed claim — "serve's card builder emits the old skip prose inside its JSON payload" — does not hold. There is no skip prose anywhere in internal/serve: brokenCard sets Error: err.Error(), the reader's raw error, and the dashboard drops no run (listRunIDs returns every directory), so it has nothing to summarise. Machine-readable output gaining human prose is therefore not the defect here, and DESIGN.md now says so deliberately ("its card carries the reader's error in a JSON field a machine reads — human prose is not added there", DESIGN.md:1806).
What the card does lack is the shared classification. runs list now tells an operator whether a broken directory is damage (unreadable run files) or merely an old schema (written by an incompatible snapshot schema); the card says only state:"unknown" plus an opaque error string. The dashboard is the one surface where the operator cannot tell "261 old runs" from "261 corrupt runs".
The fix is a reason field on runCard fed by runstatus.ClassifySkip(err) — an enum a machine reads, not a sentence — leaving Error exactly as it is.
Status: substantiated for the address and for the corrected description. The briefed framing (old prose in the JSON payload) is unsubstantiated — rg -n "skipping run" internal/serve returns nothing.
Address:
internal/serve/card.go:263—return runCard{RunID: runID, State: stateUnknown, Error: err.Error()}The briefed claim — "serve's card builder emits the old skip prose inside its JSON payload" — does not hold. There is no skip prose anywhere in
internal/serve:brokenCardsetsError: err.Error(), the reader's raw error, and the dashboard drops no run (listRunIDsreturns every directory), so it has nothing to summarise. Machine-readable output gaining human prose is therefore not the defect here, and DESIGN.md now says so deliberately ("its card carries the reader's error in a JSON field a machine reads — human prose is not added there",DESIGN.md:1806).What the card does lack is the shared classification.
runs listnow tells an operator whether a broken directory is damage (unreadable run files) or merely an old schema (written by an incompatible snapshot schema); the card says onlystate:"unknown"plus an opaque error string. The dashboard is the one surface where the operator cannot tell "261 old runs" from "261 corrupt runs".The fix is a
reasonfield onrunCardfed byrunstatus.ClassifySkip(err)— an enum a machine reads, not a sentence — leavingErrorexactly as it is.Status:
substantiatedfor the address and for the corrected description. The briefed framing (old prose in the JSON payload) isunsubstantiated—rg -n "skipping run" internal/servereturns nothing.