Skip to content

fix(release-readiness): demote eval-failure to housekeeping default (sentinel-trio standard)#459

Open
JKHeadley wants to merge 1 commit into
mainfrom
echo/release-readiness-housekeeping
Open

fix(release-readiness): demote eval-failure to housekeeping default (sentinel-trio standard)#459
JKHeadley wants to merge 1 commit into
mainfrom
echo/release-readiness-housekeeping

Conversation

@JKHeadley

Copy link
Copy Markdown
Owner

Summary

  • Demotes ReleaseReadinessSentinel.failLoud() evaluator-self-failures (fetch / analyzer / top-level tick stages) to audit-only by default, gated behind a new monitoring.releaseReadiness.escalateEvalFailures opt-in. Brings the sentinel into compliance with the silently-stopped-trio standard (post-2026-05-22 topic-spam fix): internal-plumbing failures belong in logs/sentinel-events.jsonl + server.log, not on the user's Telegram surface. The user-actionable "Release blocked — unreleased work is piling up" signal is unaffected — it still posts to Attention.
  • Adds migrateRetireStaleReleaseReadinessEvalFailureAttention in PostUpdateMigrator to strip stale release-readiness-eval-failure-* rows from existing agents' .instar/state/attention-items.json on update. Atomic write + idempotent + preserves legitimate user-actionable rows.
  • Adds 13 new tests (6 sentinel + 7 migrator) covering both halves of the new contract and a regression guard.
  • Includes a post-mortem (docs/postmortems/2026-05-27-release-readiness-eval-failure-topics.md) tracing the spec-time framing error ("loud-attention vs silent-catch" as a binary, missing the housekeeping path) and listing the structural follow-ups (sentinel-emit-site lint, SentinelEmitter primitive, spec-template "failure-mode emit-site table", /spec-converge cross-reference rule, spec text correction PR).

Origin: dogfood feedback on Echo (2026-05-27). User observed two "Release-readiness check could not evaluate" topics within 90 minutes (one fetch-stage, one analyzer-stage) with bodies that were inscrutable ("analyze-release returned no report") and called it out as anti-Instar topic clutter. Echo's two stale rows were live-cleaned via DELETE /attention before this PR.

Test plan

  • tests/unit/ReleaseReadinessSentinel.test.ts — 16 tests including the 6 new fail-loud cases (housekeeping default + escalate opt-in + user-actionable regression guard)
  • tests/unit/PostUpdateMigrator-retireStaleReleaseReadinessEvalFailureAttention.test.ts — 7 tests
  • tests/unit/releaseReadinessWiring.test.ts — 8 tests pass unchanged
  • tests/integration/release-readiness-routes.test.ts — 5 tests pass unchanged
  • tests/e2e/release-readiness-live.test.ts — 2 tests pass unchanged
  • tsc --noEmit clean
  • Pre-commit gate green (instar-dev trace + spec + side-effects artifact + ELI16 verified)

🤖 Generated with Claude Code

…sentinel-trio standard)

ReleaseReadinessSentinel.failLoud() posted a per-stage Attention item — and
therefore a per-stage Telegram topic — every time the watchdog's own fetch /
analyzer / tick stage broke ("Release-readiness check could not evaluate" with
an inscrutable body like "analyze-release returned no report"). That violates
the sentinel-trio standard from the 2026-05-22 topic-spam fix: internal-
plumbing failures are housekeeping and belong in logs/sentinel-events.jsonl
+ server.log, not on the user's Telegram surface.

- failLoud() audits unconditionally (canonical observability for housekeeping
  is the audit log) but only postAttention()s when monitoring.releaseReadiness
  .escalateEvalFailures is explicitly true. Default false. The user-actionable
  "Release blocked — unreleased work piling up" signal is unaffected — it
  always posts.
- migrateRetireStaleReleaseReadinessEvalFailureAttention strips stale
  release-readiness-eval-failure-* rows from existing agents' attention-items
  .json on next update. Atomic, idempotent, preserves legitimate rows.
- 6 new ReleaseReadinessSentinel tests cover both halves of the new contract
  (housekeeping default + escalate opt-in) plus a regression guard that the
  legitimate "release blocked" signal still posts under default config.
- 7 new PostUpdateMigrator tests cover the cleanup migration (missing file,
  empty array, no-match no-op, selective drop, idempotency, malformed-entry
  tolerance, unparseable-JSON error reporting).
- Post-mortem doc captures the root cause (spec framed loud-attention vs
  silent-catch as binary, missing the housekeeping path) and tracks
  follow-ups (sentinel-emit-site lint, SentinelEmitter primitive, spec
  template "failure-mode emit-site table", /spec-converge cross-reference
  rule, spec text correction).

Origin: 2026-05-27 dogfood feedback on Echo — two "Release-readiness check
could not evaluate" topics surfaced within 90 minutes (one fetch-stage, one
analyzer-stage). Live cleanup of those two rows was performed via DELETE
/attention before this PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented May 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
instar Ready Ready Preview, Comment May 28, 2026 2:04am

Request Review

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