* test(#1995): regression test for agent-<id> branch namespace Add failing-first tests proving that normalizeCleanupManifestEntry and planWorktreeRecordAgent reject Claude Code's current agent-<id> isolation branches (only worktree-agent-<id> is accepted). Boundary tests cover both namespaces plus rejection cases. * fix(#1995): widen worktree branch regex to accept agent-<id> namespace Claude Code's isolation="worktree" branch naming changed from worktree-agent-<id> to agent-<id>. Widen the regex in all 7 locations from ^worktree-agent-[A-Za-z0-9._/-]+$ to ^(worktree-)?agent-[A-Za-z0-9._/-]+$ so both namespaces are accepted. Introduce a shared WORKTREE_AGENT_BRANCH_RE constant in src/worktree-safety.cts to prevent future drift. Closes #1995 * fix(#1995): update workflow guards, test assertions, and baselines Widen the branch-check regex in execute-phase.md and execute-plan.md. Update all test assertions that checked for ^worktree-agent- to expect the widened ^(worktree-)?agent- pattern. Regenerate golden-install-parity fixtures, agent-size-baseline, and workflow-size-baseline. Closes #1995 * fix(#1995): update extractCwdGuardBash sanity check for widened regex The e2e test's sanity check verified the extracted bash block contained 'worktree-agent-'. After widening to '(worktree-)?agent-', update the check to match the new pattern. * fix(#1995): widen missed workflow-guard branch check + changeset + lint fixes - hooks/gsd-workflow-guard.js: widen startsWith('worktree-agent-') to /^(worktree-)?agent-/ regex — same defect class, was missed in prior commit - tests/worktree.test.cjs: fix indentation regression from prior edit - Add .changeset/1995-worktree-agent-branch-namespace.md (pr:0 placeholder) Found by orthogonal code review (Step 4). * fix(#1995): regenerate golden + size baselines for workflow-guard change * docs(#1995): backfill changeset PR number (2548)
This commit is contained in:
@@ -445,7 +445,7 @@ cwd inside an agent worktree (or a subdirectory of one). Every subsequent
|
||||
orchestrator-side git call would then target the wrong tree — this is how a wrong-base
|
||||
merge nearly shipped ~1000 files. Resolve the *worktree root* (so a subdirectory cwd
|
||||
cannot skew the check) and refuse if it is an agent worktree. The discriminator is the
|
||||
per-agent branch namespace `worktree-agent-*`, NOT the `.claude/worktrees/` path: the
|
||||
per-agent branch namespace `agent-*` / `worktree-agent-*`, NOT the `.claude/worktrees/` path: the
|
||||
orchestrator may itself be legitimately invoked from a feature worktree under
|
||||
`.claude/worktrees/`, so a path-substring refusal would break legitimate runs. Do NOT
|
||||
pin to `git worktree list`'s first entry — that is the main worktree, the wrong target
|
||||
@@ -455,7 +455,7 @@ when the orchestrator legitimately runs from a feature worktree.
|
||||
ORCHESTRATOR_WT=$(git rev-parse --show-toplevel 2>/dev/null) || {
|
||||
echo "FATAL: execute_waves entry is not inside a git worktree (#48)." >&2; exit 1; }
|
||||
ORCH_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^worktree-agent-'; then
|
||||
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^(worktree-)?agent-'; then
|
||||
echo "FATAL: orchestrator cwd is inside an agent worktree (branch '$ORCH_BRANCH', root '$ORCHESTRATOR_WT') — refusing to execute waves (#48). A prior isolation=\"worktree\" dispatch drifted the cwd; re-run from the orchestrator's own worktree." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user