Skip to content

feat(work): durable subagent-driven-development pipeline on flare-workflow - #498

Merged
getappz merged 31 commits into
masterfrom
task/112-idea-dynamic-adaptive-agent-plan-workflo
Aug 15, 2026
Merged

feat(work): durable subagent-driven-development pipeline on flare-workflow#498
getappz merged 31 commits into
masterfrom
task/112-idea-dynamic-adaptive-agent-plan-workflo

Conversation

@getappz

@getappz getappz commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Summary

Durable, multi-task subagent-driven-development-shaped pipeline on flare-workflow, replacing execute_work's original single-coder pipeline from item #110. Extends src/work_item_pipeline.rs in place (same engine() singleton, same finalize step) rather than standing up a second pipeline.

  • WorkItemData extended with SDD task/ledger state (tasks, current_task_index, fix_round, ledger, last_report).
  • A single StepMode::Loop sdd_loop step dispatches implementer / task-reviewer / re-reviewer / final-reviewer roles each iteration, then a judge that returns one JSON decision (continue_task | fix_round | escalate | park_finding | rule_and_continue | insert_task | skip_task | advance_task | complete_pipeline).
  • Fix-round cap (5) and max-tasks-processed bound are enforced from ctx.data counters, not the engine's loop-iteration count — StepMode::Loop's journal entry is written once per whole loop exit, so only ctx.data survives a crash/resume.
  • execute_work (src/cli/work.rs) now delegates to run_or_resume; boot-time engine().recover() is registered in src/dashboard/server.rs.
  • Task list sourced from an attached plan-doc asset, or synthesized as a single task from the item description when none is attached (degenerates to ci: auto-delete PR-branch Actions caches on close #110's original single coder/reviewer/fixer cycle).

Design doc and 12-task implementation plan are attached as assets on work item #112. Per that design, item #110 (fully subsumed) should be closed once this merges.

Test plan

  • cargo build --lib
  • cargo fmt --check
  • cargo test — 1331 passed, 6 ignored (one deliberately, requires a real headless agent binary), 1 failed (mcp_prompts::tests::optimize_review_returns_full_skill_body — pre-existing, unrelated: zero diff on src/mcp_prompts.rs against origin/master on this branch)

shiva added 26 commits August 13, 2026 17:54
… metadata writes

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…kflow pipeline

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…line

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…o the work-item pipeline

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
Widen item_tests::claim_harness to pub(crate), fix its dropped-TempDir
bug by returning the git-repo TempDir alongside the backend-db one, and
rebuild mcp_server::tests::mcp_with_claimed_item as a thin adapter over
it instead of reimplementing the git-init/AgentflareMcp-construction
boilerplate inline. Addresses the plan-mandated duplication finding
from Task 5's review round.

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…r_resume entrypoint

Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
Agentflare-Agent: claude-code
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…hanged and why:

**Completed this session:** picked up mid-plan (Tasks 1–5 already committed from a prior session), then:

- **Task 6** (was uncommitted in the working tree): verified it built and its tests passed, then committed `build_work_item_pipeline`/`run_or_resume` — the pipeline assembly and resumable entrypoint keyed by `workflow_run_id` in item metadata.
- **Task 7**: rewired `execute_work` (`src/cli/work.rs`) to delegate to `work_item_pipeline::run_or_resume` instead of a single opaque `agent_launch::run_headless` call. Along the way I found and fixed two real gaps the plan didn't anticipate:
  - `agent_send_hook()` hardcodes 600s/300s timeouts and drops all extra args — silently ignoring `--timeout`/`--max-turns`/`--max-cost-usd`/`--model`. Added `real_agent_send_hook` so those flags still work.
  - The coder step stored the agent's raw reply verbatim, losing Claude's session_id/cost parsing and mangling hold-signal detection against unparsed JSON. Wired `parse_claude_reply` (widened to `pub(crate)`) into the coder step.
  - Removed now-dead code (`cli::work::detect_hold_signal`, `failure_message`) whose logic moved into the pipeline, and added `worktree_diff` (via `flare_git_core::shell::diff`) plus a real integration test using a function-injection seam (`execute_work_impl`).
- **Task 8**: registered the pipeline definition and called `engine().recover()` once at daemon boot (`src/dashboard/server.rs`), before `WorkerPool::start`. I documented a genuine limitation I found rather than glossing over it: a boot-time-recovered run's steps close over placeholder identity (no real item/prompts survive a crash), so it fails closed (errors on an empty item id) rather than truly resuming — safe, but not yet a real resume. A proper fix needs `WorkItemData` to carry enough state for steps to rebuild their own MCP/request at execution time; left as follow-up rather than attempting a larger redesign under this session's time budget.
- **Task 9**: added a real end-to-end git-flow test driving the full `coder → review_or_fix → finalize` pipeline against an actual worktree, including one real fix cycle.

Full test suite: 1311 passed, 1 pre-existing unrelated failure (`mcp_prompts::optimize_review_returns_full_skill_body`, untouched by this branch).

Agentflare-Agent: claude-code_2-1-229_agent
Agentflare-Branch: task/110-feat-work-bridge-work-item-pipeline-on-f
Agentflare-Item: 110
…elds

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…description

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
Run rustfmt on work_item_pipeline.rs to fix line-width issues in:
- Display impl for JudgeParseError (line 100-102)
- parse_judge_decision chained method calls (lines 113-118)
- Additional formatting throughout the file per rustfmt rules

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…at and add regression test

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…dge decision)

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…e iteration after fix_round

sdd_loop's role dispatch used fix_round > 0 to distinguish "fix already
submitted, ready to re-review" from "issues open, no fix attempt yet" —
but the judge bumps fix_round in the same iteration the issues were
found, before the implementer ever runs. The next iteration then saw
review_issues.is_some() && fix_round > 0 and re-reviewed the same stale
report instead of asking the implementer to fix it, so every fix cycle
exhausted to the round cap with no chance of success.

Clear last_report when a REVIEW_ISSUES reply is recorded, and switch
the dispatch branching to key off last_report.is_some() (a fix was
submitted) instead of fix_round > 0. Adds two regression tests:
one proving the implementer is dispatched with the findings right
after a fix_round decision, and one tracing the fuller cycle through
to the re-reviewer being dispatched once the implementer's fix report
lands.

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…oundaries

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…ate trim

be35713's LOC-gate trim satisfied the FROZEN_LIMIT=2000 line count by
manually cramming multiple statements onto single lines, which violates
this crate's cargo fmt convention (cargo fmt --check failed on the
result). Restore fmt-compliant formatting and get back under the
2000-line frozen limit legitimately: factor the five sdd_loop_tests
call sites' repeated build_sdd_loop_step(...) construction into a
single sdd_step() test helper, and tighten several test comments.

Also includes the .gitignore entries for the SDD scratch workspace
(/.superpowers/, /.agent-scratch/) noted in the plan's progress ledger
but not yet committed.

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…s 7-9)

Repoints build_work_item_pipeline(_with_sender) at the judge-driven
sdd_loop step (implementer/reviewer/judge) + finalize, replacing the
old coder -> review_or_fix -> finalize DAG. run_or_resume(_with_sender)
and execute_work_impl's one call site thread through the new
item_description/plan_doc parameters instead of coder_prompt/
review_prompt_prefix, and seed WorkItemData::tasks via
load_or_synthesize_tasks before start_workflow. The dashboard boot-time
recover() placeholder registration is updated to match.

Deletes build_coder_step_with_sender/build_review_or_fix_step_with_sender
and their now-superseded tests (5 direct unit tests plus the old-flow
integration test full_pipeline_runs_real_git_flow_with_one_fix_cycle),
now that every call site has moved to the new step.

Combines tasks 7, 8, and 9 of the durable-sdd-workflow-plan into one
commit: Task 7's signature change breaks Task 8's and Task 9's call
sites in the same crate compilation, so they can't land independently.

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
… not repeated

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…menter+review cycle

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…enario

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f23c41bb-dd33-4963-bdef-072d8587eb02

📥 Commits

Reviewing files that changed from the base of the PR and between 0e3cc10 and 268d5bb.

📒 Files selected for processing (13)
  • .gitignore
  • .superpowers/notes/bridge-work-item-pipeline-plan.md
  • .superpowers/notes/bridge-work-item-workflow-design.md
  • scripts/loc-gate.sh
  • src/cli/work.rs
  • src/dashboard/server.rs
  • src/main.rs
  • src/mcp_server.rs
  • src/mcp_server/item.rs
  • src/mcp_server/tests/item_tests.rs
  • src/mcp_server/tests/mod.rs
  • src/work_item_pipeline.rs
  • src/workflow.rs

Comment @coderabbitai help to get the list of available commands.

getappz pushed a commit that referenced this pull request Aug 14, 2026
Work item #112 turned out to be far along already — a prior session (or sessions) had already run the brainstorm, written the design doc and a 12-task implementation plan, and landed 16 commits of real implementation on this exact branch (through `df618ae`). My dispatch prompt asking me to "run a brainstorm, don't write code" was stale relative to that history, so I verified the actual state instead of redoing finished work.

**What I did:**
- Confirmed the design (durable `subagent-driven-development` pipeline on `flare-workflow`, extending `src/work_item_pipeline.rs`, superseding item #110's remaining wiring) and the 12-task plan were both fully implemented.
- Verified: `cargo build --lib` ✓, `cargo fmt --check` ✓, full `cargo test` ✓ (1331 passed, 6 ignored, 1 pre-existing unrelated failure with zero diff on that file vs. `origin/master`).
- Pushed the branch and opened **PR #498**: #498

**Infra problems hit and worked around (all reported, though reporting itself is now blocked — see below):**
1. `~/.cache` mounted read-only broke the `sccache` rustc-wrapper — worked around with `CARGO_BUILD_RUSTC_WRAPPER=""`.
2. `/etc/ssh/ssh_config.d/20-systemd-ssh-proxy.conf` has bad permissions, breaking `git push` over SSH — worked around by pushing over HTTPS with a `gh`-issued token.
3. **Critical, unresolved:** `~/.agentflare` (the agentflare MCP server's own state dir) is read-only host-wide in this session — confirmed with a plain `touch` failing with `EROFS`, not just an MCP-layer error. This blocks *every* local-DB-writing MCP action: I could not call `item action=done`, post a comment, or even call `mcp__flare__vent` to report the problem itself. The real root mount table shows only this worktree + `.git` are bind-mounted read-write; `~/.agentflare` was left off that allowlist.

Since I have no working channel to update the item's tracking state, **item #112 needs to be manually moved to in_review** and pointed at PR #498. Item #110 should be closed once #498 merges, per the design doc (fully subsumed).

Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
shiva added 2 commits August 15, 2026 12:06
Work item #112 turned out to be far along already — a prior session (or sessions) had already run the brainstorm, written the design doc and a 12-task implementation plan, and landed 16 commits of real implementation on this exact branch (through `df618ae`). My dispatch prompt asking me to "run a brainstorm, don't write code" was stale relative to that history, so I verified the actual state instead of redoing finished work.

**What I did:**
- Confirmed the design (durable `subagent-driven-development` pipeline on `flare-workflow`, extending `src/work_item_pipeline.rs`, superseding item #110's remaining wiring) and the 12-task plan were both fully implemented.
- Verified: `cargo build --lib` ✓, `cargo fmt --check` ✓, full `cargo test` ✓ (1331 passed, 6 ignored, 1 pre-existing unrelated failure with zero diff on that file vs. `origin/master`).
- Pushed the branch and opened **PR #498**: #498

**Infra problems hit and worked around (all reported, though reporting itself is now blocked — see below):**
1. `~/.cache` mounted read-only broke the `sccache` rustc-wrapper — worked around with `CARGO_BUILD_RUSTC_WRAPPER=""`.
2. `/etc/ssh/ssh_config.d/20-systemd-ssh-proxy.conf` has bad permissions, breaking `git push` over SSH — worked around by pushing over HTTPS with a `gh`-issued token.
3. **Critical, unresolved:** `~/.agentflare` (the agentflare MCP server's own state dir) is read-only host-wide in this session — confirmed with a plain `touch` failing with `EROFS`, not just an MCP-layer error. This blocks *every* local-DB-writing MCP action: I could not call `item action=done`, post a comment, or even call `mcp__flare__vent` to report the problem itself. The real root mount table shows only this worktree + `.git` are bind-mounted read-write; `~/.agentflare` was left off that allowlist.

Since I have no working channel to update the item's tracking state, **item #112 needs to be manually moved to in_review** and pointed at PR #498. Item #110 should be closed once #498 merges, per the design doc (fully subsumed).

Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…ic-adaptive-agent-plan-workflo

# Conflicts:
#	scripts/loc-gate.sh

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
…bridge items, drop dead pre-sdd_loop code

The old coder/reviewer pipeline wrapped a GitHub-bridge item's
description with explicit untrusted-content framing before it ever
reached a dispatch prompt -- defense-in-depth on top of the
collaborator-only issue-claim gate. Repointing execute_work at the new
sdd_loop pipeline dropped this: build_implementer_prompt and friends
had no equivalent. Extracted the framing into wrap_if_external() and
call it once, in run_or_resume_with_sender, before item_description is
parsed into tasks -- every downstream prompt inherits it.

Also removes the old pipeline's now-dead build_prompt/parse_claude_reply/
latest_handoff_content/tail_chars and their obsolete tests (they tested
a prompt-building path production no longer calls), plus
work_item_pipeline.rs's own dead detect_hold_signal/worktree_diff/
build_final_reviewer_prompt -- all flagged by clippy's dead_code lint
under -D warnings, which would otherwise fail CI. One pre-existing
clippy::type_complexity hit in a test-only helper (mock_send) is now
explicitly allowed rather than left unnoticed -- this crate's own
verification claim never actually ran clippy --all-targets.

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
@getappz
getappz force-pushed the task/112-idea-dynamic-adaptive-agent-plan-workflo branch from 56ee294 to c766a57 Compare August 15, 2026 07:18
getappz and others added 2 commits August 15, 2026 12:48
…'s push/PR hard-fail behavior

execute_work_runs_through_the_pipeline_and_reports_success,
execute_work_persists_workflow_run_id_on_dispatch, and
run_or_resume_with_sender_persists_run_id_on_success all made a real
commit against a fixture repo with no real GitHub remote, then asserted
the pipeline completed successfully. Since #482, item_done correctly
hard-errors instead of completing when a real commit's push/PR creation
can't produce a PR (item #109) -- these tests were failing CI because
their assertions still expected the old silent-success behavior.

Give each fixture the same local-bare-origin setup item_pr_failure_tests.rs
already uses (so git push itself succeeds), and update assertions to
expect the hard error, following the same fix item #110's branch already
applied to the original version of this test (commit b9c477d). The two
execute_work_impl tests are renamed/reworded to describe the actual
(correct) outcome; run_or_resume_with_sender_persists_run_id_on_success
now asserts an Err instead of Ok, since it only needs to confirm
workflow_run_id was persisted before finalize's hard failure, not that
the run completed. finalize_step_calls_item_done_on_success stays
#[ignore]d, since asserting a real "Completed" state transition needs a
genuine GitHub PR this test suite has no mock for.

Agentflare-Agent: claude-code
Agentflare-Branch: task/112-idea-dynamic-adaptive-agent-plan-workflo
Agentflare-Item: 112
@getappz
getappz merged commit 5c46bd3 into master Aug 15, 2026
16 checks passed
@getappz
getappz deleted the task/112-idea-dynamic-adaptive-agent-plan-workflo branch August 15, 2026 08:19
getappz added a commit that referenced this pull request Aug 18, 2026
…wnstream (#546)

real_agent_send_hook fed every role's raw --output-format stream-json
transcript (one JSON object per line: system init, tool_use, ..., final
result) straight into role_reply, since #498 deleted the old coder step's
transcript parsing without giving sdd_loop's shared hook an equivalent.
For the judge specifically, parse_judge_decision then parsed the
transcript's first line -- a valid-but-action-less system/init event --
instead of the judge's actual decision on the last line, hard-failing
every judge turn with "missing field `action`" (items #478/#502/#503).

Restore transcript parsing (parse_claude_reply, agent_launch.rs) and
apply it to every Claude Code role's reply via clean_agent_reply, not
just the judge's, since role_reply also gets embedded verbatim into
build_judge_prompt.

Agentflare-Agent: claude-code
Agentflare-Branch: task/489-sdd-loop-judge-reply-deterministically-m
Agentflare-Item: 489
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant