4.3 KiB
Step 3: Triage
RULES
- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config
{communication_language} - Be precise. When uncertain between categories, prefer the more conservative classification.
INSTRUCTIONS
-
Normalize findings into a common format. Expected input formats:
- Adversarial (Blind Hunter): markdown list of descriptions
- Edge Case Hunter: JSON array with
location,trigger_condition,guard_snippet,potential_consequencefields - Acceptance Auditor: markdown list with title, AC/constraint reference, and evidence
If a layer's output does not match its expected format, attempt best-effort parsing. Note any parsing issues for the user.
Convert all to a unified list where each finding has:
id-- sequential integersource--blind,edge,auditor,static(auto-mode prefilter), or merged sources (e.g.,blind+edge)title-- one-line summarydetail-- full descriptionlocation-- file and line reference (if available)
-
Deduplicate. If two or more findings describe the same issue, merge them into one:
- Use the most specific finding as the base (prefer edge-case JSON with location over adversarial prose).
- Append any unique detail, reasoning, or location references from the other finding(s) into the surviving
detailfield. - Set
sourceto the merged sources (e.g.,blind+edge).
Prior-cycle ledger check (
{auto_mode}only): if{spec_file}contains#### Review Ledgerentries from earlier review cycles, treat them as already adjudicated. A new finding matching a previously dismissed entry (same location, same substance) isdismisswith reason "previously dismissed — see ledger" unless it brings genuinely new evidence. A finding matching a previously patched entry must be checked against the current code before re-raising — the patch may already cover it. -
Verify against the code (
{auto_mode}only). For each surviving finding (exceptstaticones — those are tool output), check it against the actual code before classifying. You have project access; the hunters that produced these findings mostly did not. A finding contradicted by the surrounding code — the case is already guarded, the function behaves differently than the finding assumes, the "missing" handling exists elsewhere — becomesdismisswith the contradiction recorded as its reason. Do not classify a finding you have not verified. -
Classify each finding into exactly one bucket:
- decision_needed -- There is an ambiguous choice that requires human input. The code cannot be correctly patched without knowing the user's intent. Only possible if
{review_mode}="full". - patch -- Code issue that is fixable without human input. The correct fix is unambiguous.
- defer -- Pre-existing issue not caused by the current change. Real but not actionable now.
- dismiss -- Noise, false positive, or handled elsewhere.
If
{review_mode}="no-spec"and a finding would otherwise bedecision_needed, reclassify it aspatch(if the fix is unambiguous) ordefer(if not).If
{auto_mode}and a finding would otherwise bedecision_needed: reclassify aspatchonly when the fix is genuinely unambiguous; otherwise reclassify asdeferwith reason "auto-mode: needs human decision" AND record it in the result escalations — severityCRITICALif it concerns correctness or security of the new code, elsePREFERENCE(see../automation-mode.mdrule 5). - decision_needed -- There is an ambiguous choice that requires human input. The code cannot be correctly patched without knowing the user's intent. Only possible if
-
Drop all
dismissfindings. Record the dismiss count for the summary. ({auto_mode}: do NOT drop — set each dismissed finding aside, keeping its title, location, and one-line dismissal reason; step-04 writes them to the Review Ledger so later cycles do not re-litigate them.) -
If
{failed_layers}is non-empty, report which layers failed before announcing results. If zero findings remain after dropping dismissed AND{failed_layers}is non-empty, warn the user that the review may be incomplete rather than announcing a clean review. -
If zero findings remain after triage (all rejected or none raised): state "✅ Clean review — all layers passed." (Step 3 already warned if any review layers failed via
{failed_layers}.)
NEXT
Read fully and follow ./step-04-present.md