Skip to content

Score persona eval sets weekly at parity tier — add the cadence, preserve the daily triage run #1702

Closed

Description

@don-petry

Decision

Persona eval sets are scored at parity tier on a WEEKLY cadence (maintainer decision, 2026-09-07).

Correcting the cost basis this decision was first framed against

An earlier estimate described parity as costing ~$158/yr for qa-lead by changing a daily run.
That figure was wrong and is retracted. Verified against main:

So this is net-new recurring spend, not a saving. Corrected figures, on the same assumptions the
eval-cost-estimate.sh script uses (6 held-out cases; 12k/1.2k engine tokens, 3k/300 judge tokens per
case; Opus $5/$25 per Mtok vs Haiku $1/$5):

Scope Weekly (daily, for reference) (on-demand ~12/yr)
qa-lead only ~$22/yr ~$158/yr ~$5/yr
all 9 personas ~$202/yr ~$1,419/yr ~$47/yr

Weekly was chosen deliberately as a regression tripwire: cheap enough to run unattended, frequent
enough to catch a prompt or vendored-framework change that degrades advice quality between promotion
decisions. The existing daily triage run is unaffected and stays as-is — it is Haiku-tier and cheap.

Acceptance Criteria

  1. Persona eval sets are scored weekly, at the tier their scorer.json declares. A skill with
    "engine": "persona" is scored at parity; a skill without it keeps run_triage. No skill is
    silently upgraded
    — the declaration remains the only thing that selects the tier (Persona eval harness scores the wrong model and the wrong context shape — a scored promotion gate built on it measures neither the shipped persona nor the case #1686 AC Go-live improvements for PR review agent #2).
  2. The existing daily triage run is preserved unchanged (cron: '51 7 * * *', Haiku). This
    story adds a persona cadence; it does not repurpose or degrade the existing one.
  3. The weekly run discovers which skills to score from their scorer.json (engine == "persona"),
    rather than hardcoding qa-lead. Adding a persona to the parity cadence must require no edit to
    this workflow
    — the same derive-don't-enumerate rule as the <id>:hands-off label family (fix(pr-review-sweep): dispatch with GH_PAT_WORKFLOWS, not the bot comment PAT #756).
  4. Weekly runs are off-peak and do not contend with the existing daily report — pick a distinct
    day+hour and state it, per AGENTS.md "Scheduled workflows".
  5. The run is report-only and non-blocking, exactly like the current skill-eval-report path: a
    held-out regression is a ::warning:: and a published report, never a failed required check. It
    must not become a merge gate by accident.
  6. The report records which tier each skill was scored at, so a number is never ambiguous about what
    produced it (Persona eval harness scores the wrong model and the wrong context shape — a scored promotion gate built on it measures neither the shipped persona nor the case #1686 AC test issue from agent #1).
  7. Cost is re-stated at implementation time using scripts/evals/eval-cost-estimate.sh (added by
    Persona eval harness scores the wrong model and the wrong context shape — a scored promotion gate built on it measures neither the shipped persona nor the case #1686) rather than the estimates above, and the actual per-run figure is recorded in the PR. If the
    real cost diverges materially from ~$22/yr for one persona, say so rather than proceeding silently.

Tasks / Subtasks

Dev Notes

References


Delivery brief — 2026-09-13 (read this section first; implement it, do not re-ask)

"Blocked by #1686" (Dev Notes) is discharged. #1686 is closed, PR #1696 merged 2026-09-08, and scripts/evals/eval-cost-estimate.sh exists on main. Parity is live: on main, every evals/*/scorer.json except deep-review declares "engine": "persona". Discovery (AC #3) therefore yields nine skills: business-analyst, dev-lead, devops-lead, pr-review, qa-lead, scrum-master, security-lead, solution-architect, sre-lead. That matches the "all 9 personas" row of the cost table.

Two hazards the description does not mention

  1. Concurrency will cancel runs. skill-eval-report.yml has concurrency: { group: skill-eval-report, cancel-in-progress: true }. As written, the weekly run and the daily triage run cancel each other, and a per-skill matrix in that one group cancels its own siblings. Key the group by event and skill, e.g. skill-eval-report-${{ github.event_name }}-${{ matrix.skill || inputs.skill || 'triage' }}, so AC Go-live improvements for PR review agent #2 (daily run unchanged in behaviour) actually holds.
  2. Most of the nine skills' case sets fail case.schema.json today. [qa-lead S8] Fleet-wide: 11 of 12 eval sets fail case.schema.json and CI never notices #1651 owns that, and it is in flight in parallel. One skill erroring must not abort the rest: use fail-fast: false, and record the failure as that skill's row in the report (AC feat: add Copilot engine support via REVIEW_ENGINE toggle #5 report-only). Do not edit anything under evals/*/cases.jsonl or evals/case.schema.json in this PR.

Pre-answered decisions

  • Keep one workflow file: add a second schedule entry to skill-eval-report.yml (Dev Notes).
  • Weekly slot: 23 9 * * 0 (Sunday 09:23 UTC). It is distinct from the daily 07:51 run and from apply-repo-settings (Monday 06:17). State it in the header comment (AC Optimize review: small-PR and incremental fast paths #4).
  • Tell the two schedules apart with github.event.schedule: the daily cron keeps SKILL=triage, and the weekly cron runs the discovered matrix.
  • Keep the skill-eval-report-<skill> artifact naming and eval-report.json per skill.
  • The timeout-minutes: 20 is per job; with a matrix it applies per skill, which is fine.

Budget guard

  1. Schedule, discovery job, matrix, concurrency fix and fail-fast: false (AC test issue from agent #1–feat: add Copilot engine support via REVIEW_ENGINE toggle #5), with a bats or unit test proving that discovery derives the list from scorer.json.
  2. Tier recorded in the report output (AC feat: feature ideation framework — adversarial proposer/challenger/synthesizer #6).
  3. Run eval-cost-estimate.sh and paste the figure into the PR description (AC Workflow should skip no-op PRs in MAX_PRS count #7). Do not dispatch real parity scoring runs to verify; the estimate script is the required evidence.

If you run low on budget, stop after step 1 or 2 with a green PR and list what remains. A timed-out run that loses the work is worse than a partial.

Activity

  1. don-petry commented on Sep 13, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead Implementation Plan

    Issue: #1702 — Score persona eval sets weekly at parity tier — add the cadence, preserve the daily triage run

    Scope

    Add a weekly persona-parity cadence to skill-eval-report.yml that discovers the skills to score from evals/*/scorer.json (engine == "persona"), scores each at its declared tier over a fail-fast: false matrix, records the scored tier in the report, and stays report-only/non-blocking — while leaving the existing daily triage run (51 7 * * *) behaviourally unchanged.

    Implementation Checklist

    Tests to Write

    • tests/test_discover_parity_skills.bats — discovery derives the list from scorer.json (persona included, triage/deep-review excluded; fixture EVALS_DIR).
    • Extend tests/test_skill_eval_report.bats — weekly cron present, daily cron preserved, matrix + fail-fast: false, concurrency keyed by event+skill, tier surfaced.
    • Register tests/test_discover_parity_skills.bats in lint.yml bats list.

    Cost Evidence (AC #7)

    • Run scripts/evals/eval-cost-estimate.sh for one persona and record the per-run figure in the PR (no live parity scoring dispatched).

    Test Command

    scripts/run-bats.sh tests/test_discover_parity_skills.bats tests/test_skill_eval_report.bats and bash .dev-lead/scripts/dev-lead-lint.sh

  2. don-petry commented on Sep 13, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead: Progress (in progress — not yet durable)

    Provisional. Nothing is pushed yet; the automation posts the authoritative
    completion record (with PR number + head SHA) after the push. Treat the notes
    below as intent, not delivered results.

    Plan Execution (intended)

    • Added scripts/evals/discover-parity-skills.sh — emits a JSON array of skills whose evals/<skill>/scorer.json declares "engine": "persona" (derive-don't-enumerate, AC Add @claude delegation, auto-merge, and rebase handling #3). Honors EVALS_DIR.
    • skill-eval-report.yml: added the weekly 23 9 * * 0 (Sun 09:23 UTC) schedule alongside the untouched daily 51 7 * * *; new discover job resolves the matrix (weekly → discovered personas; daily cron / dispatch → single skill via github.event.schedule); eval-report now runs a strategy.matrix.skill with fail-fast: false; concurrency moved to job level and keyed skill-eval-report-${{ github.event_name }}-${{ matrix.skill }} so daily/weekly/siblings never cancel; step summary now records the scored tier + observed model (AC feat: feature ideation framework — adversarial proposer/challenger/synthesizer #6). Report-only/non-blocking preserved (continue-on-error). Per-skill eval-report.json + skill-eval-report-<skill> artifact naming unchanged.
    • Tests: new tests/test_discover_parity_skills.bats; extended tests/test_skill_eval_report.bats; registered the new file in lint.yml.
    • Did not touch evals/*/cases.jsonl, evals/case.schema.json, or any scorer.json (per delivery brief).

    Cost evidence (AC #7) — from scripts/evals/eval-cost-estimate.sh, no live scoring dispatched

    Assumptions are the script defaults (12k/1.2k engine, 3k/300 judge tokens per case; Opus $5/$25 vs Haiku $1/$5 per Mtok).

    skill held-out cases parity $/run
    business-analyst 2 $0.19
    dev-lead 2 $0.19
    devops-lead 4 $0.38
    pr-review 12 $1.13
    qa-lead 9 $0.85
    scrum-master 2 $0.19
    security-lead 4 $0.38
    solution-architect 8 $0.76
    sre-lead 4 $0.38
    all 9 / weekly run 47 $4.45 → ~$231/yr (×52)

    Divergence note (AC #7): qa-lead alone is ~$0.85/run → ~$44/yr, ~2× the issue's $22/yr framing. The gap is purely held-out case count: the estimate assumed 6 cases; qa-lead now has 9 (and pr-review 12, solution-architect 8). The all-9 total ($231/yr) is in line with the issue's ~$202/yr "all personas" row given those larger case sets. Still trivially cheap for an unattended weekly regression tripwire — no concern, flagged rather than proceeding silently.

    Local check output (provisional — not the pushed run)

    tests/test_skill_eval_report.bats + tests/test_discover_parity_skills.bats: 31/31 ok (local)
    scripts/evals/discover-parity-skills.sh: shellcheck clean
    .dev-lead/scripts/dev-lead-lint.sh: all checks passed (local)
    validate-workflow-schedules: OK (no minute-0 crons)
    

    Notes

    • Discovery yields the nine live personas; deep-review (no engine) stays Haiku-tier and is correctly excluded — no skill silently upgraded (AC test issue from agent #1).
    • Empty-discovery is safe: [] → zero matrix jobs, never a crash.
  3. don-petry commented on Sep 13, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead: Implementation Complete — PR #1814

    The implementation for issue #1702 is durable: commits are pushed and a pull request is open. This record is backed by verifiable artifacts you can confirm in one click.

    Review happens on the PR. Acceptance criteria and test results are evidenced by the PR's diff and CI checks — not asserted here. If a later stage fails, this claim is retracted in place.

  4. added a commit that references this issue on Sep 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    dev-leadFor dev-lead agent pickupenhancementFeature requestseval-infraSkill-eval holdout infra-error tracking

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions