Skip to content

Readiness freshness tier: STALE separates expired evidence from bad evidence#43

Merged
Jammy2211 merged 1 commit into
mainfrom
feature/readiness-freshness-tier
Jul 9, 2026
Merged

Readiness freshness tier: STALE separates expired evidence from bad evidence#43
Jammy2211 merged 1 commit into
mainfrom
feature/readiness-freshness-tier

Conversation

@Jammy2211

Copy link
Copy Markdown
Contributor

Why

All 59 rows of the autonomy calibration log shipped on an acked Heart YELLOW — the verdict has never once read GREEN, because evidence-gap reasons (install verification never run, rehearsal aged out, unknown statuses) share the YELLOW tier with genuine warnings. Chronic YELLOW trains ack-fatigue exactly as automated releases start reading this gate. Part of the pre-handoff review program (agreed with the user 2026-07-09).

What

readiness.compute gains a STALE tier between YELLOW and GREEN: nothing known-bad, but some evidence is missing or expired. The remedy for a stale reason is to re-run a check, never to fix code.

Not a skip lever: evidence whose last known result was adverse stays yellow/red — only unknown or passed-but-expired evidence lands in the tier (test_stale_never_masks_last_known_bad). Red > yellow > stale structurally.

Consumer semantics (also in the module docstring + AGENTS.md):

  • Release gate: still requires GREEN. STALE blocks a release like YELLOW, but prescribes refreshing evidence rather than a human acknowledgement.
  • Dev-ship gate (PyAutoBrain AUTONOMY.md leg 4): STALE passes — an evidence gap is organism-scope, not branch-scope; legs 1–3 gate the branch itself. Companion doctrine PR in PyAutoBrain.

Changes

  • heart/readiness.py: stale_reasons list, reclassified evidence-gap reasons, verdict = red | yellow | stale | green, JSON gains stale_reasons (existing keys unchanged); score weights untouched.
  • heart/dashboard.py: STALE state/word/badge (blue/info) + evidence-gap rendering on all four surfaces (readiness block, oneline, md, html). Board.stale_reasons is distinct from the tick-age Board.stale bool.
  • AGENTS.md: verdict prose.
  • Tests: 16 evidence-gap tests moved to the tier, 3 new tier-semantics tests. 227 pass.

Validation checklist

  • Full suite: 227 passed
  • Today's live snapshot classifies as YELLOW (4 genuine warnings) + 2 evidence gaps — honest, unchanged blocking behaviour
  • Human review + merge (stays human per hard invariants)

🤖 Generated with Claude Code

… from bad

Every autonomy_log row to date shipped on an acked YELLOW because evidence-gap
reasons (verification never run, rehearsal aged out, unknown statuses) shared
the tier with genuine warnings — chronic YELLOW trains ack-fatigue exactly
when automated releases start reading this gate.

The verdict gains a STALE tier between YELLOW and GREEN: nothing known-bad,
but some evidence is missing/expired; the remedy is re-running a check, never
fixing code. Not a skip lever: evidence whose last known result was adverse
stays yellow/red — only unknown or passed-but-expired evidence lands here
(test_stale_never_masks_last_known_bad). Releases still require GREEN; the
dev-ship gate treats STALE as passing (evidence gaps are organism-scope, not
branch-scope).

- readiness.compute: stale_reasons list + reclassified evidence-gap reasons;
  verdict = red | yellow | stale | green; score weights unchanged.
- dashboard: STALE word/state/badge (blue, info), evidence-gap rendering on
  all four surfaces (term block, oneline, md, html).
- tests: 16 evidence-gap tests moved to the stale tier + 3 new tier-semantics
  tests; 227 pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Jammy2211 Jammy2211 merged commit 904e921 into main Jul 9, 2026
4 checks passed
@Jammy2211 Jammy2211 deleted the feature/readiness-freshness-tier branch July 9, 2026 11:21
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