Skip to content

triage skill: add a risk-severity rubric to prompts/triage.md (model systematically under-rates risk) #896

Description

@don-petry

Summary

The triage skill's held-out eval has regressed to 2/5 (score 0.4) as of the 2026-06-21 scheduled run (run 27901478735, tracked live in #814). All three failures share one root cause: the model under-rates risk by exactly one level, while the escalate boolean is always correct.

case expected got
triage-auth-token escalate:true, HIGH escalate:true, MEDIUM
triage-db-migration escalate:true, HIGH escalate:true, MEDIUM
triage-clean-logic-fix escalate:false, MEDIUM escalate:false, LOW

Root cause (verified)

prompts/triage.md rigorously defines when to escalate (criteria 1-7), which is why the escalate boolean is always right. But the risk field appears only in the output schema ("risk": "LOW|MEDIUM|HIGH") — there is no rubric defining what separates the three bands. The model is left to guess, and it guesses low.

scripts/evals/run-eval.sh (lines 161-162) requires both escalate and risk to match exactly, so a correct escalation with a one-level-low risk still fails the case.

This is not a label bug

The expected values are internally consistent across all 8 cases (5 holdout + 3 dev) under a single implicit rubric. Note triage-unresolved-thread (dev): it escalates but is MEDIUM, proving HIGH is reserved for dangerous content, not merely "escalated":

band meaning (derived from the case data) cases
HIGH a criterion-1 high-risk area OR a criterion-3 security anti-pattern is present auth-token, db-migration, sql-concat, workflow-pr-target
MEDIUM clean non-trivial logic change, or escalation for process reasons (e.g. unresolved review thread) clean-logic-fix, unresolved-thread
LOW trivial change, no logic impact (docs, test-only) docs-typo, test-only

This rubric predicts 8/8 expected labels. No holdout/dev case edits are warranted.

Proposed fix

Add a ## Risk rating section to prompts/triage.md that encodes the table above, anchored to the existing escalate criteria:

  • HIGH — any criterion-1 high-risk area is touched, or a criterion-3 security anti-pattern is present.
  • MEDIUM — escalation driven by process signals (unresolved threads, unaddressed advisory-bot findings, incomplete context), or a clean non-trivial logic/code change that does not escalate.
  • LOW — trivial change with no logic impact (docs, comments, formatting, test-only additions).

Keep the change additive — one new section. Do not modify criteria 1-7 or the output schema; the escalate behavior is already correct and must stay untouched.

Acceptance criteria

  • prompts/triage.md gains a ## Risk rating section defining HIGH/MEDIUM/LOW as above; no changes to the escalate criteria.
  • Skill Eval Report re-run (via workflow_dispatch, skill=triage) scores 5/5 on the held-out set.
  • Tracking issue Skill eval health — triage (holdout) #814 auto-closes on the recovered run.
  • No changes to evals/triage/** case data.

References

  • Live tracker: Skill eval health — triage (holdout) #814
  • Skill prompt: prompts/triage.md
  • Scorer: scripts/evals/run-eval.sh
  • Held-out cases: evals/triage/holdout/cases.jsonl; dev cases: evals/triage/dev/cases.jsonl
  • Workflow: .github/workflows/skill-eval-report.yml (daily 07:00 UTC, report-only / non-blocking)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions