v0.4.22
Patch — the unverifiable tally names its claims (the alert-carrier defect).
The dream's dashboard rendered ⚠ 1 unverifiable with no surface naming the claim
(docs/unverifiable-carrier.spec.md — advisor + review-to-zero, amend-1/2): the
verification tally was a count with no named carrier in the contract. Four layers:
- The SKILL mandate (bidirectional): every claim judged unverifiable is
tallied AND gets one entries[] row (skippedwhen dropped,reconciledwhen
kept with approval) whosenamenames the claim and whosereasonbegins the
canonicalunverifiable:token (theextractor-skip:precedent). - The validator binding:
validate_cycle_recordwarns when the tally and the
marked rows disagree in either direction — a count with no/unequal rows, or
marked rows without a tally — container/scalar-guarded under the never-raises
contract (junk shapes skip the check). - Both dashboards name the claims at the ⚠: the ASCII
VERIFIEDline and the
HTML assess/KPI surfaces join the marked rows' names after the count
(cap-with-counter); the legacy bare-count fallback stays byte-identical, and the
KPI sub-label escapes each joined name. - The browser fixture's skipped row gains the token — the validate-assert
over all 8 history cycles stays green, and the row doubles as the name-pin
vehicle for both renderers.
Smoke 1749/0 (+9 pins), mypy clean, sim, manifests, browser 1108.