Skip to content

[Phase 1] Make the Skill Eval Report visible — surface regression/error outcomes (no longer silent) #747

Description

@don-petry

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-blockingcontinue-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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    dev-leadFor dev-lead agent pickupenhancementFeature requestsinitiativeEpic / initiative tracking issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions