~bigbes/agents-dev · parade

main · last commit 13 days ago · 7g0stsfu

← Back to the parade

ah-4el Review-verdict-driven transition: changes-requested back to Ready for coder Past Stand

status: closed P3 feature @Eugene Blikh
bd reopen ah-4el
Created byEugene Blikh
Ownerbigbes@gmail.com
Created2026-07-18T06:30:21Z
Started2026-07-18T13:21:51Z
Updated2026-07-18T14:17:36Z
Closed2026-07-18T14:17:36Z
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).
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.

Depends on

No outgoing dependencies.

Depended on by

  • ah-0ge.5 — AgentsView: pg push from agent-1 + per-run session deep links in comments blocks

No comments.

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.
  • Eugene Blikh created the issue · 2026-07-18T09:30:21Z
  • Eugene Blikh updated notes to 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. · 2026-07-18T09:55:29Z
  • Eugene Blikh claimed · 2026-07-18T16:21:50Z
  • Eugene Blikh updated design to 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). · 2026-07-18T16:21:50Z
  • Eugene Blikh ah-0ge.5 now depends on this · 2026-07-18T16:25:06Z
  • Eugene Blikh closed the issue · 2026-07-18T17:17:35Z
    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.
Stored rows — what this pane was built from, as read
issues 1 row
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
dependencies 1 row
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
events 5 rows
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