fix(worktree): force-disable managed git on the scoped coder dispatch (v0.25.1)#69
Conversation
|
👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow. |
There was a problem hiding this comment.
QA Audit — PR #69 | fix(worktree): force-disable managed git on the scoped coder dispatch (v0.25.1)
VERDICT: PASS
CI Status
- No CI checks surfaced for this PR — treated as a Gap, not a blocker.
Diff Review
worktree.py: Replaces the plaindataclasses.replace(coder, workdir=worktree)with a conditionaloverridesdict that forcesmanage_git=Falsewhen the field exists — clean backward-compat guard viadataclasses.fields.tests/test_worktree.py: Two targeted tests — one asserting the force-disable on amanage_git: truedelegate, one asserting the compat path on a delegate without the field.- Version bumps: lockstep 0.25.0 → 0.25.1 in manifest + pyproject.
Observations
- GAP: CI not accessible to reviewer (no checks surfaced).
- CLAWPATCH: 1 low-severity finding surfaced; no correctness or security issues.
- The fix is correct, the compat guard is proper, and the tests cover both paths. The board retains ownership of the git lifecycle as intended.
— Quinn, QA Engineer
|
Submitted APPROVE review on #69. |
… (v0.29.3) The board owns the git lifecycle for loop dispatches — worktree, branch, commit, push, PR. A delegate configured `manage_git: true` (ADR 0076's harness-owned lifecycle for direct delegate_to dispatches) kept the flag through dispatch_coder's dataclasses.replace, so the acp adapter ran a SECOND full branch/commit/push/PR on top of the board's — duplicate PRs per feature. Force-disable it on the scoped copy, guarded on the field existing so hosts predating ADR 0076 still work. Decision (delivery-loop plan M0): the board keeps owning git — it already implements the queue-level gates 0076 deferred; revisit handing the lifecycle to the harness only if the board's git code becomes a burden. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
a991af2 to
74034b9
Compare
There was a problem hiding this comment.
QA Audit — PR #69 | fix(worktree): force-disable managed git on the scoped coder dispatch (v0.29.3)
VERDICT: PASS
CI Status
- test: success ✅
Diff Review (incremental since a991af2 → 74034b9)
- Rebase onto v0.29.2 main; version bumps to 0.29.3 in manifest + pyproject.
- Core fix unchanged:
overridesdict withmanage_git=Falseguarded bydataclasses.fields. - Same two targeted tests — force-disable path + pre-ADR-0076 compat path.
Observations
- Prior GAP (CI inaccessible) resolved — CI is terminal-green.
- CLAWPATCH: 0 findings across 18 features.
- No unresolved CodeRabbit threads.
- Fix is correct, compat guard is proper, tests cover both paths. The board retains git ownership as intended.
— Quinn, QA Engineer
|
Submitted APPROVE review on |
There was a problem hiding this comment.
QA Audit — PR #69 | fix(worktree): force-disable managed git on the scoped coder dispatch (v0.25.1)
VERDICT: PASS (reaffirmed from prior review at a991af2; head rebased to 74034b9)
CI Status
- test: ⏳ queued — approve-on-green policy promotes this to APPROVED automatically once terminal-green
Delta since a991af2
- Version bumps (0.29.2→0.29.3 in manifest + pyproject) — rebase artifact onto newer main; no logic change.
worktree.pyandtests/test_worktree.pyunchanged from prior review.
Diff Review
worktree.py:226-233: Conditionaloverridesdict forcesmanage_git=Falseon the scoped copy when the field exists, with adataclasses.fieldsguard for pre-ADR-0076 hosts.tests/test_worktree.py:383-427: Two tests — force-disable on amanage_git: truedelegate, and compat path for delegates without the field.- The fix is correct and the compat guard is proper. The board retains ownership of the git lifecycle as intended.
Observations
- LOW: clawpatch_review timed out — no structural findings to report.
- GAP: CI not yet terminal (
test: queued). Approve-on-green policy promotes this review to APPROVED automatically once all checks pass.
— Quinn, QA Engineer
|
Submitted COMMENT review on #69. |
The landmine (delivery-loop plan M0)
dispatch_coderbuilds the per-feature scoped delegate withdataclasses.replace(coder, workdir=worktree)and calls the acp adapter directly — bypassing the registry'sraw=Truebypass. That preservedmanage_git, so flipping ADR 0076's harness-owned git lifecycle on a board's coder would double-run the entire lifecycle: the adapter branches/commits/pushes/PRs on top of the board's own worktree→PR machinery. Duplicate branches and PRs per feature.The fix
Force
manage_git=Falseon the scoped copy. Guarded on the field existing (dataclasses.fields) so hosts predating ADR 0076 keep working — nomin_protoagent_versionbump needed.Decision: the board keeps owning git — it already implements the queue-level gates 0076 deferred (foundation gating, hot-file defer at the board tier). Revisit handing the lifecycle to the harness only if the board's git code becomes a burden.
Tests
test_dispatch_coder_force_disables_managed_git— amanage_git: truedelegate reaches the adapter with it OFF (andworkdirstill scoped).test_dispatch_coder_tolerates_delegates_without_manage_git— the pre-0076-host compat path.Full suite: 283 passed. Rebased onto v0.29.2 main; version 0.29.3 (lockstep manifest + pyproject); release cut to follow on main.
Unblocks roxy's
manage_git: truepool wiring (plan M4).🤖 Generated with Claude Code