feat(triage): effort-estimation skill and auto-promotion gate - #646
feat(triage): effort-estimation skill and auto-promotion gate#646rh-hemartin wants to merge 1 commit into
Conversation
|
🤖 Finished Review · ✅ Success · Started 1:05 PM UTC · Completed 1:23 PM UTC |
PR Summary by QodoAdd effort-estimation gating and block_auto_promotion to triage auto-promotion
AI Description
Diagram
High-Level Assessment
Files changed (30)
|
Code Review by Qodo
1.
|
ReviewFindingsMedium
Low
Previous runReviewFindingsMedium
Low
Previous run (2)ReviewFindingsMedium
Low
Previous run (3)ReviewFindingsMedium
Low
Previous run (4)ReviewFindingsMedium
Low
Previous run (5)ReviewFindingsHigh
Medium
Low
Labels: PR modifies triage agent instructions, post-script, skill, and eval cases. Next steps:
|
b672253 to
3d72bb1
Compare
|
🤖 Review · |
3d72bb1 to
2686001
Compare
|
🤖 Review · |
2686001 to
743fabd
Compare
|
🤖 Review · |
743fabd to
f8405d6
Compare
|
🤖 Finished Review · ✅ Success · Started 3:00 PM UTC · Completed 3:16 PM UTC |
Superseded by updated review
waynesun09
left a comment
There was a problem hiding this comment.
[MEDIUM] Effort-estimation threshold and traceability are unverified before merge (PR description / skills/effort-estimation/SKILL.md)
Three compounding gaps:
-
The PR body says "Closes #2207", but
repos/fullsend-ai/agents/issues/2207returns 404 — issue #2207 does not exist in this repo. The actual issue isfullsend-ai/fullsend#2207("dispatch: no effort-based gating before auto-promoting issues to coder"), which is open. GitHub's auto-close syntax only closes same-repo issues unless theowner/repo#numberform is used, so merging as-is will not close the tracked issue, and the entire feature (the four scoring dimensions, 1-5 scale, and the specific ">=4 blocks" threshold) is only traceable to a cross-repo issue that the PR text doesn't correctly reference. -
There is no cited derivation (historical data, prior incidents) for the ">=4 average blocks" threshold in
skills/effort-estimation/SKILL.md; it reads as a picked-because-it-feels-right number, and no eval case near the boundary (e.g. ~3.5-4.5) exists to confirm the cutoff behaves as intended — the two added fixtures (eval/triage/cases/008, 009) are deliberately constructed extremes. -
The PR's own test plan leaves unchecked: "Eval run confirms case 008 gets
triagedand 009 getsready-to-code" — meaning the one piece of evidence that would validate the threshold against a real triage agent run has not been collected, and this is shipped as final production gating logic rather than as an explicitly-flagged, tunable heuristic pending that verification.
Suggestion: update the PR description to "Closes fullsend-ai/fullsend#2207" so the cross-repo issue actually closes on merge. Before merging the gating logic as final, run the eval harness on cases 008/009 (and ideally a boundary case around effort ~4.0) and record actual pass/fail, or explicitly mark the threshold as a tunable default subject to recalibration pending that evidence.
|
About the compounding gaps: Fixed the PR body, the decision of using 1 to 5 has been raised in internal communications, not sure there is a reference and I don't think we need a middle case, it will bring flakyness, let's see how this goes; and the test plan has been checked. |
f8405d6 to
6423d80
Compare
|
🤖 Finished Review · ✅ Success · Started 6:32 AM UTC · Completed 6:51 AM UTC |
waynesun09
left a comment
There was a problem hiding this comment.
Review-only pass (inline comments added below). One additional finding on unchanged code that isn't part of this PR's diff, so noting it here instead of inline:
[HIGH] Auto-promotion gate is undermined by the unconditional /fs-code footer appended to the same comment (scripts/post-triage.sh, the "Append action-hints footer (sufficient only)" block, ~line 558)
When block_auto_promotion.blocked is true and category is bug/documentation/performance, the script appends "Auto-promotion blocked: <reason>". But the unconditional "Next steps" footer, gated only on ACTION == "sufficient" with no check of AUTO_PROMOTION_BLOCKED, still appends "/fs-code — agent creates a PR to implement this issue". docs/code.md confirms /fs-code triggers the code agent independent of label state ("triggered when the ready-to-code label is applied... or via the /fs-code command"). The result is a single comment that both explains why the issue was held for review and hands the reader a working one-click bypass of that exact hold.
Suggested fix: Suppress or reword the Next-steps footer when AUTO_PROMOTION_BLOCKED is true, e.g. "This issue was held for review — run /fs-code only after confirming the concerns above."
6423d80 to
8a42a64
Compare
|
🤖 Finished Review · ✅ Success · Started 10:32 AM UTC · Completed 10:49 AM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
Additional review findings (deduplicated against existing comments/reviews on this PR).
8a42a64 to
3d049e8
Compare
|
🤖 Review · Commit: |
3d049e8 to
b6634b3
Compare
|
🤖 Review · Commit: |
b6634b3 to
dbe7f48
Compare
|
🤖 Finished Review · ✅ Success · Started 7:38 AM UTC · Completed 8:00 AM UTC Commit: |
Add an effort-estimation skill that scores issues on scope, testing, domain knowledge, and risk (1-5 each). When overall effort >= 4, or any single dimension scores 5, auto-promotion to the code agent is blocked and the issue receives 'triaged' instead of 'ready-to-code'. Replace the single-purpose requires_workflow_changes boolean with a general-purpose block_auto_promotion object (blocked + reason) that OR-combines effort gating, workflow-file detection, and any future blocking conditions. Keep requires_workflow_changes as a deprecated optional property for one release so lockstep-skewed agent output still validates. Key changes: - skills/effort-estimation/SKILL.md: new skill with 4-dimension rubric, OR-combination cross-reference, and RICE Effort design note - agents/triage.md: block_auto_promotion instructions with category qualification (bug/documentation/performance only) - schemas/triage-result.schema.json: block_auto_promotion schema with conditional requirement for auto-promotable categories, maxLength on reason, deprecated requires_workflow_changes - scripts/post-triage.src.sh: block gate with reason fallback, paired line-start fence stripping (unmatched openers preserved), :: sanitization, conditional /fs-code footer - eval/triage/cases/009: high-effort fixture requiring bug category and block_auto_promotion.blocked - eval/triage/cases/010: low-effort fixture confirming auto-promotion - eval/triage/cases/011: mixed-profile fixture (Risk=5, other dimensions low) for the any-dimension-5 rule Closes fullsend-ai/fullsend#2207 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
dbe7f48 to
898ec66
Compare
|
🤖 Finished Review · ✅ Success · Started 9:21 AM UTC · Completed 9:42 AM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $12.37 |
|
Risk Assessment: elevated (3/5) DetailsElevated risk driven by large change size (35 files, 1890 lines, large blast radius), high protected-path and security-sensitive file counts, and significant churn/fix history in core triage scripts. Mitigated by non-bot experienced author, no CI/dependency changes, and well-scoped issue with active discussion and meeting approval. |
There was a problem hiding this comment.
Note: The following review comments could not be posted on the diff (GitHub returned 422) and are included here instead:
scripts/post-triage.src.sh(file-level): Line 395 · [medium] backward-compatibility
The schema retains requires_workflow_changes as a deprecated optional field but the post-script no longer reads it. During a lockstep-skew window, old agent output emitting requires_workflow_changes: true without block_auto_promotion would silently lose block intent. Risk is mitigated: for auto-promoting categories, the allOf conditional requires block_auto_promotion (fail-closed); for non-auto-promoting categories, block intent has no behavioral effect.
Suggested fix: OR both fields during the deprecation window: read requires_workflow_changes and set BLOCKED=true if either field indicates blocking.
|
🤖 Finished Retro · ✅ Success · Started 9:06 AM UTC · Completed 9:25 AM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $5.86 |
Retro: PR #646 — effort-estimation skill and auto-promotion gateOutcome: Closed without merging after ~28 days and 10 force-push iterations. Timeline
What went well
Review quality gapsThe human reviewer caught several high-impact issues the review agent missed:
Evidence for existing issues
Proposals filed
|
Summary
effort-estimationskill that scores implementation effort on a 1-5 scale across scope, testing, domain knowledge, and risk. Issues scoring >= 4, or with any single dimension at 5, block auto-promotion.requires_workflow_changesboolean withblock_auto_promotionobject ({blocked, reason}) intriage_summary. The schema conditionally requires this field for auto-promotable categories (bug, documentation, performance). The post-script gatesready-to-codevstriagedaccordingly.requires_workflow_changesas a deprecated optional property for one release so lockstep-skewed agent output still validates.::warning::uses a fixed message (no interpolation of untrusted content), andBLOCK_REASONis sanitized (::collapsed to:) and fence-stripped before any use.BLOCK_REASONonly drops paired line-start fences; unmatched openers and inline triple backticks are left in place./fs-codeaction-hints footer is conditional: when auto-promotion is blocked, it warns the user to confirm concerns first instead of offering one-click dispatch.commentfield to prose-only (no fenced code blocks) to avoid model abbreviation of identifiers inside JSON strings.bugcategory and assertsblock_auto_promotion.blocked = true. Numbering starts at 009 because008-split-bundled-issuesalready exists on main.Migration: the schema prefers
block_auto_promotionoverrequires_workflow_changes. All components (schema, prompt, post-script) should still be deployed and rolled back together per the lockstep release model. The deprecated boolean is accepted for one release to cover version skew.Closes fullsend-ai/fullsend#2207
Test plan
requires_workflow_changes)pytest+ server endpoints)triagedand 010 getsready-to-code