Part of epic #581 (self-improving skills). Follow-up to #584 / #741.
Why
skill-eval-report.yml (#584) runs the deterministic holdout scorer daily (07:00 UTC) and on dispatch, but its result is effectively invisible:
- It is intentionally non-blocking (
continue-on-error: true) — a held-out regression or a scorer hard-error never fails the workflow.
- It has
permissions: contents: read only, so it writes no issue and no PR comment. Output lives solely in the workflow run's step summary, an artifact (eval-report.json), and a ::notice::/::warning:: annotation.
Net effect: a real skill regression (outcome=regression) — or, worse, a blind scorer failure (outcome=error, hidden because the workflow still goes green) — is only discoverable by manually opening the Actions run. Continuous skill-quality "visibility" that nobody sees defeats the purpose of Phase 1.
What
Surface the daily eval outcome where a human will actually see it, without making it blocking:
- On
outcome=regression or outcome=error: open or update a single tracking issue (idempotent — update the same issue in place, never spam a new one per day), labelled e.g. eval-health, containing the score table + regressed-case detail and a link to the run.
- On recovery (
outcome=pass after a prior open tracking issue): comment + close the tracking issue.
- Alternative/complementary: fold the latest score + outcome into the existing
daily-pr-review-health digest so the org has one daily health surface instead of two silent crons.
Acceptance criteria
- A
regression or error in the scheduled run produces a visible, de-duplicated notification (tracking issue or digest line) — not just an Actions annotation.
- Healthy (
pass) runs create no noise (no new issue/comment when nothing is wrong).
- The workflow stays non-blocking —
continue-on-error preserved; this story adds visibility only, no gating.
- Least-privilege: add only the
issues: write scope required for the notify step; keep contents: read for checkout.
- An offline test (stub, no network) covers the open/update/close + de-dupe logic, wired into
lint.yml (mirrors the #583/#584 offline-test pattern).
Out of scope
- Making the eval blocking / gating merges (a later phase decision).
- Growing the holdout case set or fixing per-trigger coverage (separate follow-up — note
workflow-secrets and unresolved-threads currently live only in dev/, so they are not scored).
- Reducing scorer/model nondeterminism (noise-floor) — separate.
Filed from a monitoring review after #719/#721/#741 landed.
Part of epic #581 (self-improving skills). Follow-up to #584 / #741.
Why
skill-eval-report.yml(#584) runs the deterministic holdout scorer daily (07:00 UTC) and on dispatch, but its result is effectively invisible:continue-on-error: true) — a held-out regression or a scorer hard-error never fails the workflow.permissions: contents: readonly, so it writes no issue and no PR comment. Output lives solely in the workflow run's step summary, an artifact (eval-report.json), and a::notice::/::warning::annotation.Net effect: a real skill regression (
outcome=regression) — or, worse, a blind scorer failure (outcome=error, hidden because the workflow still goes green) — is only discoverable by manually opening the Actions run. Continuous skill-quality "visibility" that nobody sees defeats the purpose of Phase 1.What
Surface the daily eval outcome where a human will actually see it, without making it blocking:
outcome=regressionoroutcome=error: open or update a single tracking issue (idempotent — update the same issue in place, never spam a new one per day), labelled e.g.eval-health, containing the score table + regressed-case detail and a link to the run.outcome=passafter a prior open tracking issue): comment + close the tracking issue.daily-pr-review-healthdigest so the org has one daily health surface instead of two silent crons.Acceptance criteria
regressionorerrorin the scheduled run produces a visible, de-duplicated notification (tracking issue or digest line) — not just an Actions annotation.pass) runs create no noise (no new issue/comment when nothing is wrong).continue-on-errorpreserved; this story adds visibility only, no gating.issues: writescope required for the notify step; keepcontents: readfor checkout.lint.yml(mirrors the#583/#584offline-test pattern).Out of scope
workflow-secretsandunresolved-threadscurrently live only indev/, so they are not scored).Filed from a monitoring review after #719/#721/#741 landed.