Readiness freshness tier: STALE separates expired evidence from bad evidence#43
Merged
Merged
Conversation
… 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.computegains 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):
Changes
heart/readiness.py:stale_reasonslist, reclassified evidence-gap reasons,verdict = red | yellow | stale | green, JSON gainsstale_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_reasonsis distinct from the tick-ageBoard.stalebool.AGENTS.md: verdict prose.Validation checklist
🤖 Generated with Claude Code