Skip to content

fix(worktree): force-disable managed git on the scoped coder dispatch (v0.25.1)#69

Merged
mabry1985 merged 1 commit into
mainfrom
fix/scoped-dispatch-disables-managed-git
Jul 6, 2026
Merged

fix(worktree): force-disable managed git on the scoped coder dispatch (v0.25.1)#69
mabry1985 merged 1 commit into
mainfrom
fix/scoped-dispatch-disables-managed-git

Conversation

@mabry1985

@mabry1985 mabry1985 commented Jul 6, 2026

Copy link
Copy Markdown
Member

The landmine (delivery-loop plan M0)

dispatch_coder builds the per-feature scoped delegate with dataclasses.replace(coder, workdir=worktree) and calls the acp adapter directly — bypassing the registry's raw=True bypass. That preserved manage_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=False on the scoped copy. Guarded on the field existing (dataclasses.fields) so hosts predating ADR 0076 keep working — no min_protoagent_version bump 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 — a manage_git: true delegate reaches the adapter with it OFF (and workdir still 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: true pool wiring (plan M4).

🤖 Generated with Claude Code

@protoquinn

protoquinn Bot commented Jul 6, 2026

Copy link
Copy Markdown

👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow.

@protoquinn protoquinn Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 plain dataclasses.replace(coder, workdir=worktree) with a conditional overrides dict that forces manage_git=False when the field exists — clean backward-compat guard via dataclasses.fields.
  • tests/test_worktree.py: Two targeted tests — one asserting the force-disable on a manage_git: true delegate, 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

@protoquinn

protoquinn Bot commented Jul 6, 2026

Copy link
Copy Markdown

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>
@mabry1985
mabry1985 force-pushed the fix/scoped-dispatch-disables-managed-git branch from a991af2 to 74034b9 Compare July 6, 2026 07:09

@protoquinn protoquinn Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 a991af274034b9)

  • Rebase onto v0.29.2 main; version bumps to 0.29.3 in manifest + pyproject.
  • Core fix unchanged: overrides dict with manage_git=False guarded by dataclasses.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

@protoquinn

protoquinn Bot commented Jul 6, 2026

Copy link
Copy Markdown

Submitted APPROVE review on protoLabsAI/projectBoard-plugin#69.

@mabry1985
mabry1985 merged commit 603a8c2 into main Jul 6, 2026
1 check passed
@mabry1985
mabry1985 deleted the fix/scoped-dispatch-disables-managed-git branch July 6, 2026 07:10

@protoquinn protoquinn Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.py and tests/test_worktree.py unchanged from prior review.

Diff Review

  • worktree.py:226-233: Conditional overrides dict forces manage_git=False on the scoped copy when the field exists, with a dataclasses.fields guard for pre-ADR-0076 hosts.
  • tests/test_worktree.py:383-427: Two tests — force-disable on a manage_git: true delegate, 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

@protoquinn

protoquinn Bot commented Jul 6, 2026

Copy link
Copy Markdown

Submitted COMMENT review on #69.

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