main · last commit
13 days ago ·
7g0stsfu
ah-4el Review-verdict-driven transition: changes-requested back to Ready for coder
Past Stand
bd reopen ah-4el
| Created by | Eugene Blikh |
| Owner | bigbes@gmail.com |
| Created | 2026-07-18T06:30:21Z |
| Started | 2026-07-18T13:21:51Z |
| Updated | 2026-07-18T14:17:36Z |
| Closed | 2026-07-18T14:17:36Z |
Every successful run lands In Review; no verdict-aware transition, so a validator changes-requested just sits for a human to drag back. Intentional for now (ah-gs7 human-driven handoff) but user asked for it. Build opt-in loop: parse validator verdict (needs machine-readable verdict), on changes-requested move card back to Ready under coder/fix role with the review as context. Ties into Stage 4 (ah-0ge).
DECIDED 2026-07-18 (user): dedicated FIXER role. Generalized routing design: - task_types.<t> gains on_success: <type> and on_changes_requested: <type> (target is a TASK TYPE name; validated at config load). - Routing = swap board label type:<old> -> type:<target> (Vikunja label API, lookup by title), move card to Ready, comment 'routed to <type> (round n/cap)'. Label-swap failure -> fall back In Review + warn comment. - Verdict channel: first line of .task/summary.md must be 'Verdict: pass' or 'Verdict: changes-requested' (case-insensitive). Parsed into RunSummary.Verdict. Missing/absent verdict = pass-equivalent (lands In Review as today). - changes-requested + on_changes_requested set -> route; pass/none + on_success set -> route; otherwise In Review (current behavior). Failure paths unchanged. - Loop guard: per-task auto_routes counter persisted in store, incremented on EVERY automated route (both edges); config routing.max_auto_routes default 4 (design->review->fix->review = 3). At cap -> In Review + 'routing cap reached' comment. Human manual relabel+Ready still works past cap. - New prompts/fixer.md (address ## Review findings on same branch); validator.md updated to mandate the Verdict first line. - Intended live pipeline: design --on_success--> review --changes-requested--> fix --on_success--> review --pass--> In Review (human).
DESIGN PROPOSAL (held for user sign-off — changes the core reconcile state machine; not live-verifiable while pushes/deploy are blocked). Now unblocked by ah-tz0 (.task/summary.md exists). Proposed: 1. MACHINE-READABLE VERDICT: don't parse free-text. Have the validator write a structured line the daemon can key on — e.g. a first line 'Verdict: pass' | 'Verdict: changes-requested' in .task/summary.md (update prompts/validator.md + validate skill), and add a domain field Verdict (parsed in runner.Summary, empty for non-validator roles). 2. OPT-IN CONFIG: task_types.review gains 'on_changes_requested: <bucket|role>' (default: none = current behavior, lands In Review for a human). When set e.g. to role 'coder', a changes-requested validator run moves the card to Ready under that role instead of In Review, carrying the review as context (the ## Review is already on the branch). 3. LOOP GUARD: reuse the delegation generation cap (max_generation) or add a review_rounds cap so design->review->coder->review can't cycle forever. A 'pass' verdict always lands In Review (human ships it). 4. STATE MACHINE: this is a new transition in internal/reconcile (finalize path) + internal/domain/transitions.go. Cover with reconcile_test.go (injected clock/fakes) AND an e2e flow before shipping. Open questions for user: (a) auto-loop to 'coder' or a dedicated 'fixer' role? (b) opt-in per task_type (proposed) vs global? (c) cap value / mechanism. HOLDING until answered.
No outgoing dependencies.
ah-0ge.5
— AgentsView: pg push from agent-1 + per-run session deep links in comments
blocks
| id | ah-4el |
| content_hash | a7f08ae44a7b072a88ceeb4cbb9b41c058403281fc3018ecd03f004f08069332 |
| title | Review-verdict-driven transition: changes-requested back to Ready for coder |
| description | Every successful run lands In Review; no verdict-aware transition, so a validator changes-requested just sits for a human to drag back. Intentional for now (ah-gs7 human-driven handoff) but user asked for it. Build opt-in loop: parse validator verdict (needs machine-readable verdict), on changes-requested move card back to Ready under coder/fix role with the review as context. Ties into Stage 4 (ah-0ge). |
| design | DECIDED 2026-07-18 (user): dedicated FIXER role. Generalized routing design: - task_types.<t> gains on_success: <type> and on_changes_requested: <type> (target is a TASK TYPE name; validated at config load). - Routing = swap board label type:<old> -> type:<target> (Vikunja label API, lookup by title), move card to Ready, comment 'routed to <type> (round n/cap)'. Label-swap failure -> fall back In Review + warn comment. - Verdict channel: first line of .task/summary.md must be 'Verdict: pass' or 'Verdict: changes-requested' (case-insensitive). Parsed into RunSummary.Verdict. Missing/absent verdict = pass-equivalent (lands In Review as today). - changes-requested + on_changes_requested set -> route; pass/none + on_success set -> route; otherwise In Review (current behavior). Failure paths unchanged. - Loop guard: per-task auto_routes counter persisted in store, incremented on EVERY automated route (both edges); config routing.max_auto_routes default 4 (design->review->fix->review = 3). At cap -> In Review + 'routing cap reached' comment. Human manual relabel+Ready still works past cap. - New prompts/fixer.md (address ## Review findings on same branch); validator.md updated to mandate the Verdict first line. - Intended live pipeline: design --on_success--> review --changes-requested--> fix --on_success--> review --pass--> In Review (human). |
| acceptance_criteria | |
| notes | DESIGN PROPOSAL (held for user sign-off — changes the core reconcile state machine; not live-verifiable while pushes/deploy are blocked). Now unblocked by ah-tz0 (.task/summary.md exists). Proposed: 1. MACHINE-READABLE VERDICT: don't parse free-text. Have the validator write a structured line the daemon can key on — e.g. a first line 'Verdict: pass' | 'Verdict: changes-requested' in .task/summary.md (update prompts/validator.md + validate skill), and add a domain field Verdict (parsed in runner.Summary, empty for non-validator roles). 2. OPT-IN CONFIG: task_types.review gains 'on_changes_requested: <bucket|role>' (default: none = current behavior, lands In Review for a human). When set e.g. to role 'coder', a changes-requested validator run moves the card to Ready under that role instead of In Review, carrying the review as context (the ## Review is already on the branch). 3. LOOP GUARD: reuse the delegation generation cap (max_generation) or add a review_rounds cap so design->review->coder->review can't cycle forever. A 'pass' verdict always lands In Review (human ships it). 4. STATE MACHINE: this is a new transition in internal/reconcile (finalize path) + internal/domain/transitions.go. Cover with reconcile_test.go (injected clock/fakes) AND an e2e flow before shipping. Open questions for user: (a) auto-loop to 'coder' or a dedicated 'fixer' role? (b) opt-in per task_type (proposed) vs global? (c) cap value / mechanism. HOLDING until answered. |
| status | closed |
| priority | 3 |
| issue_type | feature |
| assignee | Eugene Blikh |
| estimated_minutes | NULL |
| created_at | 2026-07-18T06:30:21Z |
| created_by | Eugene Blikh |
| owner | bigbes@gmail.com |
| updated_at | 2026-07-18T14:17:36Z |
| closed_at | 2026-07-18T14:17:36Z |
| closed_by_session | |
| external_ref | NULL |
| spec_id | |
| compaction_level | 0 |
| compacted_at | NULL |
| compacted_at_commit | NULL |
| original_size | NULL |
| sender | |
| ephemeral | 0 |
| wisp_type | |
| pinned | 0 |
| is_template | 0 |
| mol_type | |
| work_type | |
| source_system | |
| metadata | �{} |
| source_repo | |
| close_reason | Merged to master 658f128: verdict-driven auto-routing (on_success/on_changes_requested per task_type, label swap + Ready, AutoRoutes cap 4, fixer role, e2e pipeline test design->review->fix->review->In Review). Live rollout (agent-1 config + type:fix board label) pending next CI deploy — noted in ah-0ge.5/ah-07g wave. |
| event_kind | |
| actor | |
| target | |
| payload | |
| await_type | |
| await_id | |
| timeout_ns | 0 |
| waiters | |
| hook_bead | |
| role_bead | |
| agent_state | |
| last_activity | NULL |
| role_type | |
| rig | |
| due_at | NULL |
| defer_until | NULL |
| no_history | 0 |
| started_at | 2026-07-18T13:21:51Z |
| is_blocked | 0 |
| id | 64a16404-84df-512b-afa4-a4793e4665b0 |
| issue_id | ah-0ge.5 |
| type | blocks |
| created_at | 2026-07-18T16:25:06Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | ah-4el |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | 019f73eb-3109-774b-b077-31774b346f29 |
| issue_id | ah-4el |
| event_type | created |
| actor | Eugene Blikh |
| old_value | |
| new_value | |
| comment | NULL |
| created_at | 2026-07-18T09:30:21Z |
| id | 019f7402-35c5-7995-865f-81dc2d724d25 |
| issue_id | ah-4el |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"id":"ah-4el","title":"Review-verdict-driven transition: changes-requested back to Ready for coder","description":"Every successful run lands In Review; no verdict-aware transition, so a validator changes-requested just sits for a human to drag back. Intentional for now (ah-gs7 human-driven handoff) but user asked for it. Build opt-in loop: parse validator verdict (needs machine-readable verdict), on changes-requested move card back to Ready under coder/fix role with the review as context. Ties into Stage 4 (ah-0ge).","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-18T06:30:21Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T06:30:21Z"} |
| new_value | {"notes":"DESIGN PROPOSAL (held for user sign-off — changes the core reconcile state machine; not live-verifiable while pushes/deploy are blocked).\n\nNow unblocked by ah-tz0 (.task/summary.md exists). Proposed:\n1. MACHINE-READABLE VERDICT: don't parse free-text. Have the validator write a structured line the daemon can key on — e.g. a first line 'Verdict: pass' | 'Verdict: changes-requested' in .task/summary.md (update prompts/validator.md + validate skill), and add a domain field Verdict (parsed in runner.Summary, empty for non-validator roles).\n2. OPT-IN CONFIG: task_types.review gains 'on_changes_requested: \u003cbucket|role\u003e' (default: none = current behavior, lands In Review for a human). When set e.g. to role 'coder', a changes-requested validator run moves the card to Ready under that role instead of In Review, carrying the review as context (the ## Review is already on the branch).\n3. LOOP GUARD: reuse the delegation generation cap (max_generation) or add a review_rounds cap so design-\u003ereview-\u003ecoder-\u003ereview can't cycle forever. A 'pass' verdict always lands In Review (human ships it).\n4. STATE MACHINE: this is a new transition in internal/reconcile (finalize path) + internal/domain/transitions.go. Cover with reconcile_test.go (injected clock/fakes) AND an e2e flow before shipping.\n\nOpen questions for user: (a) auto-loop to 'coder' or a dedicated 'fixer' role? (b) opt-in per task_type (proposed) vs global? (c) cap value / mechanism. HOLDING until answered."} |
| comment | NULL |
| created_at | 2026-07-18T09:55:29Z |
| id | 019f7563-ebe5-7991-97e3-417042380f48 |
| issue_id | ah-4el |
| event_type | claimed |
| actor | Eugene Blikh |
| old_value | {"id":"ah-4el","title":"Review-verdict-driven transition: changes-requested back to Ready for coder","description":"Every successful run lands In Review; no verdict-aware transition, so a validator changes-requested just sits for a human to drag back. Intentional for now (ah-gs7 human-driven handoff) but user asked for it. Build opt-in loop: parse validator verdict (needs machine-readable verdict), on changes-requested move card back to Ready under coder/fix role with the review as context. Ties into Stage 4 (ah-0ge).","notes":"DESIGN PROPOSAL (held for user sign-off — changes the core reconcile state machine; not live-verifiable while pushes/deploy are blocked).\n\nNow unblocked by ah-tz0 (.task/summary.md exists). Proposed:\n1. MACHINE-READABLE VERDICT: don't parse free-text. Have the validator write a structured line the daemon can key on — e.g. a first line 'Verdict: pass' | 'Verdict: changes-requested' in .task/summary.md (update prompts/validator.md + validate skill), and add a domain field Verdict (parsed in runner.Summary, empty for non-validator roles).\n2. OPT-IN CONFIG: task_types.review gains 'on_changes_requested: \u003cbucket|role\u003e' (default: none = current behavior, lands In Review for a human). When set e.g. to role 'coder', a changes-requested validator run moves the card to Ready under that role instead of In Review, carrying the review as context (the ## Review is already on the branch).\n3. LOOP GUARD: reuse the delegation generation cap (max_generation) or add a review_rounds cap so design-\u003ereview-\u003ecoder-\u003ereview can't cycle forever. A 'pass' verdict always lands In Review (human ships it).\n4. STATE MACHINE: this is a new transition in internal/reconcile (finalize path) + internal/domain/transitions.go. Cover with reconcile_test.go (injected clock/fakes) AND an e2e flow before shipping.\n\nOpen questions for user: (a) auto-loop to 'coder' or a dedicated 'fixer' role? (b) opt-in per task_type (proposed) vs global? (c) cap value / mechanism. HOLDING until answered.","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-18T06:30:21Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T06:55:30Z"} |
| new_value | {"assignee":"Eugene Blikh","status":"in_progress"} |
| comment | NULL |
| created_at | 2026-07-18T16:21:50Z |
| id | 019f7563-ed27-79df-a64a-603a85e435d3 |
| issue_id | ah-4el |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"id":"ah-4el","title":"Review-verdict-driven transition: changes-requested back to Ready for coder","description":"Every successful run lands In Review; no verdict-aware transition, so a validator changes-requested just sits for a human to drag back. Intentional for now (ah-gs7 human-driven handoff) but user asked for it. Build opt-in loop: parse validator verdict (needs machine-readable verdict), on changes-requested move card back to Ready under coder/fix role with the review as context. Ties into Stage 4 (ah-0ge).","notes":"DESIGN PROPOSAL (held for user sign-off — changes the core reconcile state machine; not live-verifiable while pushes/deploy are blocked).\n\nNow unblocked by ah-tz0 (.task/summary.md exists). Proposed:\n1. MACHINE-READABLE VERDICT: don't parse free-text. Have the validator write a structured line the daemon can key on — e.g. a first line 'Verdict: pass' | 'Verdict: changes-requested' in .task/summary.md (update prompts/validator.md + validate skill), and add a domain field Verdict (parsed in runner.Summary, empty for non-validator roles).\n2. OPT-IN CONFIG: task_types.review gains 'on_changes_requested: \u003cbucket|role\u003e' (default: none = current behavior, lands In Review for a human). When set e.g. to role 'coder', a changes-requested validator run moves the card to Ready under that role instead of In Review, carrying the review as context (the ## Review is already on the branch).\n3. LOOP GUARD: reuse the delegation generation cap (max_generation) or add a review_rounds cap so design-\u003ereview-\u003ecoder-\u003ereview can't cycle forever. A 'pass' verdict always lands In Review (human ships it).\n4. STATE MACHINE: this is a new transition in internal/reconcile (finalize path) + internal/domain/transitions.go. Cover with reconcile_test.go (injected clock/fakes) AND an e2e flow before shipping.\n\nOpen questions for user: (a) auto-loop to 'coder' or a dedicated 'fixer' role? (b) opt-in per task_type (proposed) vs global? (c) cap value / mechanism. HOLDING until answered.","status":"in_progress","priority":3,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-18T06:30:21Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T13:21:51Z","started_at":"2026-07-18T13:21:51Z"} |
| new_value | {"design":"DECIDED 2026-07-18 (user): dedicated FIXER role. Generalized routing design:\n- task_types.\u003ct\u003e gains on_success: \u003ctype\u003e and on_changes_requested: \u003ctype\u003e (target is a TASK TYPE name; validated at config load).\n- Routing = swap board label type:\u003cold\u003e -\u003e type:\u003ctarget\u003e (Vikunja label API, lookup by title), move card to Ready, comment 'routed to \u003ctype\u003e (round n/cap)'. Label-swap failure -\u003e fall back In Review + warn comment.\n- Verdict channel: first line of .task/summary.md must be 'Verdict: pass' or 'Verdict: changes-requested' (case-insensitive). Parsed into RunSummary.Verdict. Missing/absent verdict = pass-equivalent (lands In Review as today).\n- changes-requested + on_changes_requested set -\u003e route; pass/none + on_success set -\u003e route; otherwise In Review (current behavior). Failure paths unchanged.\n- Loop guard: per-task auto_routes counter persisted in store, incremented on EVERY automated route (both edges); config routing.max_auto_routes default 4 (design-\u003ereview-\u003efix-\u003ereview = 3). At cap -\u003e In Review + 'routing cap reached' comment. Human manual relabel+Ready still works past cap.\n- New prompts/fixer.md (address ## Review findings on same branch); validator.md updated to mandate the Verdict first line.\n- Intended live pipeline: design --on_success--\u003e review --changes-requested--\u003e fix --on_success--\u003e review --pass--\u003e In Review (human)."} |
| comment | NULL |
| created_at | 2026-07-18T16:21:50Z |
| id | 019f7596-f7c4-760a-a938-7b6f30d05040 |
| issue_id | ah-4el |
| event_type | closed |
| actor | Eugene Blikh |
| old_value | |
| new_value | Merged to master 658f128: verdict-driven auto-routing (on_success/on_changes_requested per task_type, label swap + Ready, AutoRoutes cap 4, fixer role, e2e pipeline test design->review->fix->review->In Review). Live rollout (agent-1 config + type:fix board label) pending next CI deploy — noted in ah-0ge.5/ah-07g wave. |
| comment | NULL |
| created_at | 2026-07-18T17:17:35Z |
No comments.
Close reason