From 77bf21b3a675274eff2d3b6d0df80f260f2d2aff Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Thu, 23 Jul 2026 07:36:53 -0400 Subject: [PATCH] fix(#1995): widen worktree branch regex to accept agent- namespace (#2548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(#1995): regression test for agent- branch namespace Add failing-first tests proving that normalizeCleanupManifestEntry and planWorktreeRecordAgent reject Claude Code's current agent- isolation branches (only worktree-agent- is accepted). Boundary tests cover both namespaces plus rejection cases. * fix(#1995): widen worktree branch regex to accept agent- namespace Claude Code's isolation="worktree" branch naming changed from worktree-agent- to agent-. 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) --- .../1995-worktree-agent-branch-namespace.md | 5 + agents/gsd-executor.md | 10 +- docs/CLI-TOOLS.md | 2 +- gsd-core/references/worktree-branch-check.md | 8 +- gsd-core/workflows/execute-phase.md | 4 +- gsd-core/workflows/execute-plan.md | 2 +- hooks/gsd-workflow-guard.js | 4 +- hooks/gsd-worktree-path-guard.js | 11 +- src/worktree-safety.cts | 7 +- tests/agent-size-baseline.json | 2 +- .../golden-install-parity/antigravity.json | 12 +- .../golden-install-parity/augment.json | 12 +- .../golden-install-parity/claude-local.json | 12 +- .../golden-install-parity/claude.json | 12 +- .../fixtures/golden-install-parity/cline.json | 8 +- .../golden-install-parity/codebuddy.json | 12 +- .../fixtures/golden-install-parity/codex.json | 10 +- .../golden-install-parity/copilot.json | 8 +- .../golden-install-parity/cursor.json | 8 +- .../golden-install-parity/hermes.json | 12 +- .../fixtures/golden-install-parity/kilo.json | 12 +- .../golden-install-parity/kimi-code.json | 12 +- .../fixtures/golden-install-parity/kimi.json | 12 +- .../golden-install-parity/opencode.json | 12 +- tests/fixtures/golden-install-parity/pi.json | 10 +- .../fixtures/golden-install-parity/qwen.json | 12 +- .../fixtures/golden-install-parity/trae.json | 8 +- .../golden-install-parity/windsurf.json | 8 +- .../fixtures/golden-install-parity/zcode.json | 8 +- tests/workflow-size-baseline.json | 4 +- tests/worktree-cleanup.test.cjs | 16 +-- tests/worktree-safety.test.cjs | 113 +++++++++++++++++- tests/worktree.test.cjs | 6 +- 33 files changed, 254 insertions(+), 140 deletions(-) create mode 100644 .changeset/1995-worktree-agent-branch-namespace.md diff --git a/.changeset/1995-worktree-agent-branch-namespace.md b/.changeset/1995-worktree-agent-branch-namespace.md new file mode 100644 index 000000000..2bb2d0656 --- /dev/null +++ b/.changeset/1995-worktree-agent-branch-namespace.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2548 +--- +**Worktree branch guards now accept Claude Code's `agent-` namespace** — the `worktree record-agent` command, the spawn-time branch check, the cleanup-wave manifest reader, and the force-add/path/workflow guards all accept both the current `agent-` and the legacy `worktree-agent-` branch naming. Previously, Claude Code's rename from `worktree-agent-` to `agent-` caused every executor sub-agent to fail its branch check (false-positive FATAL / exit 42) and silently dropped valid cleanup-manifest entries (`empty_manifest`), blocking merge-back. (#1995) diff --git a/agents/gsd-executor.md b/agents/gsd-executor.md index 4ccb8bb2a..1ab8d43d7 100644 --- a/agents/gsd-executor.md +++ b/agents/gsd-executor.md @@ -495,11 +495,11 @@ if [ -f .git ]; then # worktree echo "DO NOT use 'git update-ref' to rewind the protected branch — surface as blocker (#2924)." >&2 exit 1 fi - # Positive allow-list: HEAD must be on the canonical Claude Code worktree-agent - # branch namespace (`worktree-agent-`). This catches feature/* and any other - # arbitrary branch that the deny-list would silently allow (#2924). - if ! echo "$ACTUAL_BRANCH" | grep -Eq '^worktree-agent-[A-Za-z0-9._/-]+$'; then - echo "FATAL: refusing to commit — worktree HEAD '$ACTUAL_BRANCH' is not in the worktree-agent-* namespace." >&2 + # Positive allow-list: HEAD must be on a per-agent branch (`agent-` or + # legacy `worktree-agent-`). This catches feature/* and any other + # arbitrary branch that the deny-list would silently allow (#2924, #1995). + if ! echo "$ACTUAL_BRANCH" | grep -Eq '^(worktree-)?agent-[A-Za-z0-9._/-]+$'; then + echo "FATAL: refusing to commit — worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* namespace." >&2 echo "Agent commits must live on per-agent branches; surface as blocker (#2924)." >&2 exit 1 fi diff --git a/docs/CLI-TOOLS.md b/docs/CLI-TOOLS.md index 749c64350..7aa441058 100644 --- a/docs/CLI-TOOLS.md +++ b/docs/CLI-TOOLS.md @@ -612,7 +612,7 @@ node gsd-tools.cjs worktree record-agent \ --manifest --agent-id --path --branch --base ``` -**`worktree record-agent`** appends one `{agent_id, worktree_path, branch, expected_base}` entry to an already-initialized manifest, validating every field **at write time using the same rules the `cleanup-wave` reader enforces** — `--branch` must match the disposable `^worktree-agent-[A-Za-z0-9._/-]+$` namespace, and `--path`/`--branch`/`--base` must be non-empty. `--agent-id` is required (write-strict), even though the reader treats it as optional. A missing or garbled field — or a duplicate `(worktree_path, branch)` the reader would dedup away — fails loudly with a recovery hint and a non-zero exit **without** writing, instead of appending an under-populated or silently-dropped entry. Whitespace-only `--path`/`--base` are rejected (values are trimmed). The on-disk manifest shape is unchanged (the reader re-derives `allowed_bases`); the orchestrator still initializes the empty `{orchestrator_root, worktrees: []}` shell inline before any agent is recorded. +**`worktree record-agent`** appends one `{agent_id, worktree_path, branch, expected_base}` entry to an already-initialized manifest, validating every field **at write time using the same rules the `cleanup-wave` reader enforces** — `--branch` must match the disposable `^(worktree-)?agent-[A-Za-z0-9._/-]+$` namespace (accepts both `agent-` and legacy `worktree-agent-`), and `--path`/`--branch`/`--base` must be non-empty. `--agent-id` is required (write-strict), even though the reader treats it as optional. A missing or garbled field — or a duplicate `(worktree_path, branch)` the reader would dedup away — fails loudly with a recovery hint and a non-zero exit **without** writing, instead of appending an under-populated or silently-dropped entry. Whitespace-only `--path`/`--base` are rejected (values are trimmed). The on-disk manifest shape is unchanged (the reader re-derives `allowed_bases`); the orchestrator still initializes the empty `{orchestrator_root, worktrees: []}` shell inline before any agent is recorded. --- diff --git a/gsd-core/references/worktree-branch-check.md b/gsd-core/references/worktree-branch-check.md index e44f4e2ea..aa8ebb1cc 100644 --- a/gsd-core/references/worktree-branch-check.md +++ b/gsd-core/references/worktree-branch-check.md @@ -17,7 +17,7 @@ did not create (#48). FIRST ACTION: HEAD assertion MUST run before anything else, and this block is VERIFY-ONLY. Worktrees spawned by Claude Code's `isolation="worktree"` use the -`worktree-agent-` namespace. The orchestrator owns this worktree's lifecycle; +`agent-` namespace (previously `worktree-agent-`; both are accepted). The orchestrator owns this worktree's lifecycle; a sub-agent MUST NOT hold state-correction primitives (hard-reset, update-ref, force-move, index-discard) on a worktree it did not create (#48, #2924). If ANY assertion below fails, HALT immediately — print the FATAL line, `exit 42`, and let @@ -27,11 +27,11 @@ commit. HEAD_REF=$(git symbolic-ref --quiet HEAD || echo "DETACHED") ACTUAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) if [ "$HEAD_REF" = "DETACHED" ] || echo "$ACTUAL_BRANCH" | grep -Eq '^(main|master|develop|trunk|release/.*)$'; then - echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected worktree-agent-*); refusing to commit or self-recover via 'git update-ref' (#2924)." >&2 + echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected agent-* or worktree-agent-*); refusing to commit or self-recover via 'git update-ref' (#2924)." >&2 exit 42 fi -if ! echo "$ACTUAL_BRANCH" | grep -Eq '^worktree-agent-[A-Za-z0-9._/-]+$'; then - echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the worktree-agent-* namespace; refusing to commit (#2924)." >&2 +if ! echo "$ACTUAL_BRANCH" | grep -Eq '^(worktree-)?agent-[A-Za-z0-9._/-]+$'; then + echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* namespace; refusing to commit (#2924)." >&2 exit 42 fi ACTUAL_BASE=$(git rev-parse HEAD) diff --git a/gsd-core/workflows/execute-phase.md b/gsd-core/workflows/execute-phase.md index 0a6371db2..18cb7699f 100644 --- a/gsd-core/workflows/execute-phase.md +++ b/gsd-core/workflows/execute-phase.md @@ -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 diff --git a/gsd-core/workflows/execute-plan.md b/gsd-core/workflows/execute-plan.md index 8a858143f..d20d86b3c 100644 --- a/gsd-core/workflows/execute-plan.md +++ b/gsd-core/workflows/execute-plan.md @@ -113,7 +113,7 @@ Otherwise: Apply checkpoint-based routing below. > **Runtime-aware dispatch (#2508 Phase 4).** GSD workflows dispatch specialized subagents by role. Before dispatching on a built-in-only runtime (kimi-code — three built-ins only), resolve the role to a built-in via `gsd_run query resolve-dispatch-type --requested --raw`. On named-dispatch runtimes (Claude/OpenCode/…) the role is returned unchanged; on kimi-code it maps to `coder`/`explore`/`plan` by role-suffix. The persona rides `${AGENT_SKILLS_}` (Phase 3) regardless. See @gsd-core/references/runtime-aware-dispatch.md. -**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `isolation="worktree"` only if `workflow.use_worktrees` is not `false`** (read via `config-get workflow.use_worktrees`). **When using `isolation="worktree"`, embed the `` block from `gsd-core/references/worktree-branch-check.md` into the prompt, substituting `{EXPECTED_BASE}` with the captured base SHA.** That guard is **verify-only and fail-closed** (#48): it asserts a per-agent `worktree-agent-*` branch and the exact base, forbids `git update-ref` self-recovery (#2924), and on any mismatch prints `FATAL:` and `exit 42` so the orchestrator can recover — the sub-agent never rewrites a worktree it did not create. This supersedes the former self-recovery (#2015), whose destructive base rewrite could fail silently under a deny rule; the base-drift it addressed affects all platforms, and base correction is now the orchestrator's responsibility. +**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `isolation="worktree"` only if `workflow.use_worktrees` is not `false`** (read via `config-get workflow.use_worktrees`). **When using `isolation="worktree"`, embed the `` block from `gsd-core/references/worktree-branch-check.md` into the prompt, substituting `{EXPECTED_BASE}` with the captured base SHA.** That guard is **verify-only and fail-closed** (#48): it asserts a per-agent `agent-*` / `worktree-agent-*` branch and the exact base, forbids `git update-ref` self-recovery (#2924), and on any mismatch prints `FATAL:` and `exit 42` so the orchestrator can recover — the sub-agent never rewrites a worktree it did not create. This supersedes the former self-recovery (#2015), whose destructive base rewrite could fail silently under a deny rule; the base-drift it addressed affects all platforms, and base correction is now the orchestrator's responsibility. **Pattern B:** Execute segment-by-segment. Autonomous segments: spawn subagent for assigned tasks only (no SUMMARY/commit). Checkpoints: main context. After all segments: aggregate, create SUMMARY, commit. See segment_execution. diff --git a/hooks/gsd-workflow-guard.js b/hooks/gsd-workflow-guard.js index c66e482df..62816aef8 100644 --- a/hooks/gsd-workflow-guard.js +++ b/hooks/gsd-workflow-guard.js @@ -143,11 +143,11 @@ process.stdin.on('end', () => { const command = data.tool_input?.command || ''; for (const gitCwd of forceGitAddCwds(command, cwd)) { const branch = currentBranch(gitCwd); - if (branch.startsWith('worktree-agent-')) { + if (/^(worktree-)?agent-/.test(branch)) { const output = { decision: 'block', code: 'WORKTREE_AGENT_FORCE_ADD_FORBIDDEN', - reason: 'worktree-agent branches must not run git add -f or git add --force. Respect the SDK skipped_gitignored/skipped_commit_docs_false contract and leave gitignored files untracked.', + reason: 'agent/worktree-agent branches must not run git add -f or git add --force. Respect the SDK skipped_gitignored/skipped_commit_docs_false contract and leave gitignored files untracked.', }; process.stdout.write(JSON.stringify(output)); // Kimi CLI's exit-2 protocol feeds stderr back to the model (#2304) diff --git a/hooks/gsd-worktree-path-guard.js b/hooks/gsd-worktree-path-guard.js index b001df942..cfe5dae92 100644 --- a/hooks/gsd-worktree-path-guard.js +++ b/hooks/gsd-worktree-path-guard.js @@ -118,13 +118,14 @@ process.stdin.on('end', () => { } // #1342: Only enforce inside a GSD-managed isolated executor worktree. Those - // are always on a `worktree-agent-*` branch (the positive allow-list enforced - // by worktree-branch-check.md, #2924). A manually-created linked worktree (plain - // non-GSD work, e.g. Claude Code plan-mode) is on the user's own branch, so the - // guard must be a no-op there. Detached HEAD / error → not GSD-managed → no-op. + // are always on an `agent-*` or legacy `worktree-agent-*` branch (the positive + // allow-list enforced by worktree-branch-check.md, #2924, #1995). A manually- + // created linked worktree (plain non-GSD work, e.g. Claude Code plan-mode) is + // on the user's own branch, so the guard must be a no-op there. Detached HEAD + // / error → not GSD-managed → no-op. const branchResult = git(['symbolic-ref', '--short', 'HEAD'], cwd); const branch = branchResult.status === 0 && branchResult.stdout ? branchResult.stdout.trim() : ''; - if (!/^worktree-agent-[A-Za-z0-9._/-]+$/.test(branch)) { + if (!/^(worktree-)?agent-[A-Za-z0-9._/-]+$/.test(branch)) { process.exit(0); // not a GSD-managed executor worktree — no-op } diff --git a/src/worktree-safety.cts b/src/worktree-safety.cts index 47a37aafd..f6e85401d 100644 --- a/src/worktree-safety.cts +++ b/src/worktree-safety.cts @@ -18,6 +18,9 @@ import { execGit as execGitSeam, posixNormalize } from './shell-command-projecti // remote, stalled NFS mount, etc.). Callers can override via deps.timeout. const DEFAULT_GIT_TIMEOUT_MS = 10000; +const WORKTREE_AGENT_BRANCH_RE = /^(worktree-)?agent-[A-Za-z0-9._/-]+$/; +const WORKTREE_AGENT_BRANCH_PATTERN = WORKTREE_AGENT_BRANCH_RE.source; + interface GitResult { exitCode: number; stdout: string; @@ -428,7 +431,7 @@ function normalizeCleanupManifestEntry(entry: unknown): CleanupManifestEntry | n const branch = typeof e.branch === 'string' ? e.branch : ''; const expectedBase = typeof e.expected_base === 'string' ? e.expected_base : ''; if (!worktreePath || !branch || !expectedBase) return null; - if (!/^worktree-agent-[A-Za-z0-9._/-]+$/.test(branch)) return null; + if (!WORKTREE_AGENT_BRANCH_RE.test(branch)) return null; const rawAllowedBases = Array.isArray(e.allowed_bases) ? e.allowed_bases : []; const allowedBases = Array.from(new Set( [expectedBase, ...rawAllowedBases.filter((base): base is string => typeof base === 'string' && base.length > 0)] @@ -939,7 +942,7 @@ function planWorktreeRecordAgent(manifestRaw: string, fields: RecordAgentFields) return { ok: false, reason: 'invalid_entry', - hint: `Entry failed cleanup-manifest validation: --path/--branch/--base must be non-empty and --branch must match ^worktree-agent-[A-Za-z0-9._/-]+$ (got branch="${branch}"). Fix the field and re-run.`, + hint: `Entry failed cleanup-manifest validation: --path/--branch/--base must be non-empty and --branch must match ${WORKTREE_AGENT_BRANCH_PATTERN} (accepts both agent- and worktree-agent- namespaces; got branch="${branch}"). Fix the field and re-run.`, entry: null, manifest: null, }; diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index 064d779fc..50bacea3c 100644 --- a/tests/agent-size-baseline.json +++ b/tests/agent-size-baseline.json @@ -14,7 +14,7 @@ "gsd-domain-researcher.md": 7032, "gsd-eval-auditor.md": 12496, "gsd-eval-planner.md": 7008, - "gsd-executor.md": 47951, + "gsd-executor.md": 47955, "gsd-framework-selector.md": 6778, "gsd-integration-checker.md": 15238, "gsd-intel-updater.md": 18166, diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 30ad3a0d8..839a21c82 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "1db46cac3f4d9889", "agents/gsd-eval-auditor.md": "1b8391f1aafb067f", "agents/gsd-eval-planner.md": "3d10fd11147f6857", - "agents/gsd-executor.md": "707f7f26bc2c1c59", + "agents/gsd-executor.md": "041c6d658e8e1002", "agents/gsd-framework-selector.md": "daa62c79619c76bf", "agents/gsd-integration-checker.md": "0643cd2d779b131c", "agents/gsd-intel-updater.md": "26c1f1e028c6346a", @@ -161,7 +161,7 @@ "gsd-core/references/verification-patterns.md": "de7ebb43dea1d20f", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "225910640adbb76d", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "72e93b7f650d9bae", @@ -247,13 +247,13 @@ "gsd-core/workflows/docs-update.md": "0b3023a3caa2123f", "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", "gsd-core/workflows/eval-review.md": "9e8b169c05098b57", - "gsd-core/workflows/execute-phase.md": "87fd9a5228df564c", + "gsd-core/workflows/execute-phase.md": "881c9be0dec7dbb8", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1832b97d0923fa67", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "13aa54f8279960ae", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "476f88892510a09e", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "d096e946db209caa", + "gsd-core/workflows/execute-plan.md": "5c6fcb36e16f5bf7", "gsd-core/workflows/explore.md": "965e1c0ede05f40c", "gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496", "gsd-core/workflows/fast.md": "568e6c3ec00b6e00", @@ -347,8 +347,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "4a3e534f4c6589e8", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "5f64275e48fb8284", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "82a4121cbcb82756", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index dcaa2f919..521b906a3 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "671c9ea949889c4a", "agents/gsd-eval-auditor.md": "fcaec7b00f94c435", "agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3", - "agents/gsd-executor.md": "28fbb5fa6eb49c65", + "agents/gsd-executor.md": "00d887a16c249765", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "fa53e2d78be1de74", "agents/gsd-intel-updater.md": "fa40e685d7441ace", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "3f76c286e9cccb0b", + "gsd-core/workflows/execute-phase.md": "f3a37602243681f9", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "1d378cb25720667a", + "gsd-core/workflows/execute-plan.md": "334bb2053908a049", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", @@ -418,8 +418,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "48e04fd7cb10834b", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "97c2f736d085fe8e", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "29a8d4fa81378d7d", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 27a78a593..8b23c2aaa 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -15,7 +15,7 @@ "agents/gsd-domain-researcher.md": "f1e03df842ddfb95", "agents/gsd-eval-auditor.md": "d0f45fff7370bb0b", "agents/gsd-eval-planner.md": "9cc049b82897daa4", - "agents/gsd-executor.md": "a140ad7b13e4af95", + "agents/gsd-executor.md": "406dfda62f0f8428", "agents/gsd-framework-selector.md": "85005d716f9d98f7", "agents/gsd-integration-checker.md": "17a8ee731986564d", "agents/gsd-intel-updater.md": "4953a465db9dadc1", @@ -231,7 +231,7 @@ "gsd-core/references/verification-patterns.md": "cfaf338f42b1111e", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -317,13 +317,13 @@ "gsd-core/workflows/docs-update.md": "7aef1019ce141558", "gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e", "gsd-core/workflows/eval-review.md": "11620e0dc4a003dd", - "gsd-core/workflows/execute-phase.md": "cf74d39bfaa359a7", + "gsd-core/workflows/execute-phase.md": "2604b9cb7dc66920", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9a1f3deffb4dab14", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a7f9b9a45303382f", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "b14d7fa2c4ec2406", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "4a7e699e43c71691", + "gsd-core/workflows/execute-plan.md": "724d726833e222ed", "gsd-core/workflows/explore.md": "fabe8e5553de16c0", "gsd-core/workflows/extract-learnings.md": "fd75072c339b58bd", "gsd-core/workflows/fast.md": "7f7687b920d79b29", @@ -417,8 +417,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "46b287c75153458a", - "hooks/gsd-worktree-path-guard.js": "0e236bf8ac797ee3", + "hooks/gsd-workflow-guard.js": "41c59d9765ac36ae", + "hooks/gsd-worktree-path-guard.js": "f65356c80c9805b2", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "1d955ec5d64e8a5f", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 9a627f007..cca3f9da6 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -15,7 +15,7 @@ "agents/gsd-domain-researcher.md": "5f7d366251b957fe", "agents/gsd-eval-auditor.md": "fea2759beff0a642", "agents/gsd-eval-planner.md": "112f6730f23854e3", - "agents/gsd-executor.md": "a3c5bd2940dcf7c6", + "agents/gsd-executor.md": "16391af53f8922bb", "agents/gsd-framework-selector.md": "c350ee693cb1aa4e", "agents/gsd-integration-checker.md": "c8b4e65dee89c8ea", "agents/gsd-intel-updater.md": "5b41e05f90ce89d9", @@ -160,7 +160,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -246,13 +246,13 @@ "gsd-core/workflows/docs-update.md": "ea47bd2d5a0d1d85", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "7c2f5ff8cc4d06e5", - "gsd-core/workflows/execute-phase.md": "78c6f46e37db9a0b", + "gsd-core/workflows/execute-phase.md": "100b55c147922978", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "d0f2cba6b8356cac", + "gsd-core/workflows/execute-plan.md": "da0c2286b1aed11d", "gsd-core/workflows/explore.md": "9348b54b526b8938", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "41a6568b873aef99", @@ -346,8 +346,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "46b287c75153458a", - "hooks/gsd-worktree-path-guard.js": "0e236bf8ac797ee3", + "hooks/gsd-workflow-guard.js": "41c59d9765ac36ae", + "hooks/gsd-worktree-path-guard.js": "f65356c80c9805b2", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "1d955ec5d64e8a5f", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index 4e1e0e6c6..ab3f8ae7f 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -19,7 +19,7 @@ "agents/gsd-domain-researcher.md": "0fecdaea86466a56", "agents/gsd-eval-auditor.md": "36c44303085df2f8", "agents/gsd-eval-planner.md": "3ddea88a69b4da3f", - "agents/gsd-executor.md": "8443c52fc864d84e", + "agents/gsd-executor.md": "a20e280c9e648f5b", "agents/gsd-framework-selector.md": "564669d479433f15", "agents/gsd-integration-checker.md": "1bbbdd3d420b994e", "agents/gsd-intel-updater.md": "42c40fffbc720d0b", @@ -164,7 +164,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "19340c1a3be74ad2", - "gsd-core/references/worktree-branch-check.md": "46882ad61f3f9075", + "gsd-core/references/worktree-branch-check.md": "f99ec1acb76014f5", "gsd-core/references/worktree-path-safety.md": "8e5b4d542d2d9853", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -250,13 +250,13 @@ "gsd-core/workflows/docs-update.md": "7eb7095ca86d506f", "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", "gsd-core/workflows/eval-review.md": "17fc9b4c4f7e1c74", - "gsd-core/workflows/execute-phase.md": "91a820d8ba3531fe", + "gsd-core/workflows/execute-phase.md": "a5af949ed1092448", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1b3558cb8f41b65a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "35612890c1173577", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "26825e1aacf224d0", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "1d9f62898cb0e848", + "gsd-core/workflows/execute-plan.md": "204a0ac94a4bb545", "gsd-core/workflows/explore.md": "db9e1a79dbe88090", "gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9", "gsd-core/workflows/fast.md": "e4f74a454b6ca5e8", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index ffaad431e..d4897073f 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "1c1a800108a2b225", "agents/gsd-eval-auditor.md": "99012004b14ea602", "agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe", - "agents/gsd-executor.md": "87ae9188c389bde8", + "agents/gsd-executor.md": "d9dca78de04bdc1c", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "2d8339790bbb2dc3", "agents/gsd-intel-updater.md": "c51339956197cbd3", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "5c048b5144519998", + "gsd-core/workflows/execute-phase.md": "9bc9511ebd40b7cc", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "fb4e3f846505b6a5", + "gsd-core/workflows/execute-plan.md": "874689d8678e6186", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", @@ -418,8 +418,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "f198bb60674e9972", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "a1a3d4618b41a804", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "9c0d837594c7b772", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 923407bf5..2edf5e83f 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -102,8 +102,8 @@ "agents/gsd-eval-auditor.toml": "9b81d61b3c5f722d", "agents/gsd-eval-planner.md": "73f2ad2ff2797a51", "agents/gsd-eval-planner.toml": "09468ad1a34ac468", - "agents/gsd-executor.md": "45442cc002be7052", - "agents/gsd-executor.toml": "bfb08e9397bcc358", + "agents/gsd-executor.md": "697b7ed099fff17d", + "agents/gsd-executor.toml": "9a8aa31bbde42448", "agents/gsd-framework-selector.md": "ebae32430887d2e0", "agents/gsd-framework-selector.toml": "637e4e021b7ec380", "agents/gsd-integration-checker.md": "9cc875676cf7d741", @@ -267,7 +267,7 @@ "gsd-core/references/verification-patterns.md": "ac45d99076067f17", "gsd-core/references/verify-mvp-mode.md": "78faa99df1668aab", "gsd-core/references/workstream-flag.md": "c764d9cbdf6faff4", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "6411a4789f481c15", "gsd-core/templates/DEBUG.md": "0be1256352e79375", @@ -353,13 +353,13 @@ "gsd-core/workflows/docs-update.md": "bf32efe90219d3dd", "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", "gsd-core/workflows/eval-review.md": "c89a63285ead961e", - "gsd-core/workflows/execute-phase.md": "4528ce2e8ac92566", + "gsd-core/workflows/execute-phase.md": "e5b9fb391a90d7fb", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "cd8678d082d6e191", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "13bc99f22bc5ec10", + "gsd-core/workflows/execute-plan.md": "e4723e1669f7c508", "gsd-core/workflows/explore.md": "d12f68770c65093a", "gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da", "gsd-core/workflows/fast.md": "e4ed60f96a7b3ac8", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 4cb254101..a07486518 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.agent.md": "d603239b3e9fe428", "agents/gsd-eval-auditor.agent.md": "3c03009564de55c8", "agents/gsd-eval-planner.agent.md": "14751876fc2b5f16", - "agents/gsd-executor.agent.md": "bca7d1ab12392956", + "agents/gsd-executor.agent.md": "6bf98b78fd75c347", "agents/gsd-framework-selector.agent.md": "cafeec0b3489be45", "agents/gsd-integration-checker.agent.md": "30439b804927acc7", "agents/gsd-intel-updater.agent.md": "238c1a886f35a25c", @@ -162,7 +162,7 @@ "gsd-core/references/verification-patterns.md": "a8e13ea38218638b", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "225910640adbb76d", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "72e93b7f650d9bae", @@ -248,13 +248,13 @@ "gsd-core/workflows/docs-update.md": "f64b067d0d729f04", "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", "gsd-core/workflows/eval-review.md": "1ae2d3d3fbf72893", - "gsd-core/workflows/execute-phase.md": "474608ed923207f1", + "gsd-core/workflows/execute-phase.md": "ac3229160d3a3fda", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ca37f91f7bd6f05c", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "25bebed74e645109", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "dc0b96d285327b18", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "1750549f91a86340", + "gsd-core/workflows/execute-plan.md": "c82c959f78a1917d", "gsd-core/workflows/explore.md": "35431c40bb1b245a", "gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18", "gsd-core/workflows/fast.md": "66821090b6b8ed3b", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 49f19fe1b..672b2783e 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "56395dbdabf076f6", "agents/gsd-eval-auditor.md": "ad2840fd5cd76172", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "e568f8171c7d12f1", + "agents/gsd-executor.md": "026606d319f6c338", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "5da30584d06b878c", "agents/gsd-intel-updater.md": "b8971c5d96e63b38", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "19c02b83bd1692bf", - "gsd-core/references/worktree-branch-check.md": "ab004404d028cc0d", + "gsd-core/references/worktree-branch-check.md": "46f222a2e2c2edd7", "gsd-core/references/worktree-path-safety.md": "66de0b35266c807d", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "215b0122c4d2b1e5", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "9389c58f7384972d", - "gsd-core/workflows/execute-phase.md": "24b8e6ea6456e8f3", + "gsd-core/workflows/execute-phase.md": "80a4fb2d23642cd8", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "46de8e5e07946509", + "gsd-core/workflows/execute-plan.md": "09ea0688882eb30e", "gsd-core/workflows/explore.md": "9348b54b526b8938", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "77b49793e26b3323", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 06157ccc4..14bf4486b 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "412cdbb05ba252ea", "agents/gsd-eval-auditor.md": "4ffb265063c318e5", "agents/gsd-eval-planner.md": "03448fc9c5774b56", - "agents/gsd-executor.md": "e39b2cd4ec6b3afd", + "agents/gsd-executor.md": "3ec54684a756e830", "agents/gsd-framework-selector.md": "ea9981d65d6b3429", "agents/gsd-integration-checker.md": "35b4f2969d279871", "agents/gsd-intel-updater.md": "5fe5edfae2719cb8", @@ -161,7 +161,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "50ddf79d58950730", - "gsd-core/references/worktree-branch-check.md": "5d79e26e3b51d9ae", + "gsd-core/references/worktree-branch-check.md": "ecfbf0e65dd8ccac", "gsd-core/references/worktree-path-safety.md": "fa79fcdff2aaa5f0", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -247,13 +247,13 @@ "gsd-core/workflows/docs-update.md": "02811dd7aa32d5ba", "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", "gsd-core/workflows/eval-review.md": "e7cd5dfcf18e2458", - "gsd-core/workflows/execute-phase.md": "b3d289801e4fff03", + "gsd-core/workflows/execute-phase.md": "5adf286f7ec99a59", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9b2193de25506b3b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "362123fdf99e9980", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "a691e3afe88031b8", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "212856ac5c291c3c", + "gsd-core/workflows/execute-plan.md": "0c5e0455252b5a46", "gsd-core/workflows/explore.md": "843e66f101a56dfa", "gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b", "gsd-core/workflows/fast.md": "c801145115755524", @@ -347,8 +347,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "46b287c75153458a", - "hooks/gsd-worktree-path-guard.js": "7797e5fe2474ee88", + "hooks/gsd-workflow-guard.js": "41c59d9765ac36ae", + "hooks/gsd-worktree-path-guard.js": "37dd85a1591a4d8c", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "bc58c3a7609d7eae", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index d87ba249e..0cf6c169a 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "a3874d80bcbc7380", "agents/gsd-eval-auditor.md": "630d4cd3bd6ea195", "agents/gsd-eval-planner.md": "3db12cde12aeb2c1", - "agents/gsd-executor.md": "14c1681bb5f7214f", + "agents/gsd-executor.md": "bea8102bf46ddb7a", "agents/gsd-framework-selector.md": "ad5f2c6b9bec6270", "agents/gsd-integration-checker.md": "c503e2f4a3d8ec05", "agents/gsd-intel-updater.md": "231393da62a45b2e", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "ac45d99076067f17", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "225910640adbb76d", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "72e93b7f650d9bae", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "3c0d5ef72202d246", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "35be91cd22a9bc11", - "gsd-core/workflows/execute-phase.md": "7daf5ebd7eabcda8", + "gsd-core/workflows/execute-phase.md": "3ddae43ba8ad5081", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b1e6588cd32a6f08", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "48782aa1a714de9a", + "gsd-core/workflows/execute-plan.md": "731d2947b623be4f", "gsd-core/workflows/explore.md": "e6c94f8b6f083109", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "41a6568b873aef99", @@ -418,8 +418,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "4998235bdf3f64a2", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "9734e43bee1d7d2e", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "b63a879b8b3436bf", diff --git a/tests/fixtures/golden-install-parity/kimi-code.json b/tests/fixtures/golden-install-parity/kimi-code.json index 63f52d5e0..da2fc3f31 100644 --- a/tests/fixtures/golden-install-parity/kimi-code.json +++ b/tests/fixtures/golden-install-parity/kimi-code.json @@ -23,8 +23,8 @@ ".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", ".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", ".kimi/hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - ".kimi/hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - ".kimi/hooks/gsd-worktree-path-guard.js": "b49b03fa9de7df3b", + ".kimi/hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + ".kimi/hooks/gsd-worktree-path-guard.js": "d00a75505429355c", ".kimi/hooks/lib/git-cmd.js": "268ba15992ca0b23", ".kimi/hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", ".kimi/hooks/managed-hooks-registry.cjs": "08ec2585a3f8f132", @@ -44,7 +44,7 @@ "agents/gsd-domain-researcher.md": "049f588663814fa2", "agents/gsd-eval-auditor.md": "54870d3b07433525", "agents/gsd-eval-planner.md": "552e9fa164c51ce8", - "agents/gsd-executor.md": "1154cdd7b22f9754", + "agents/gsd-executor.md": "98424ccf4346c9d1", "agents/gsd-framework-selector.md": "8a795f230436ad2e", "agents/gsd-integration-checker.md": "c1760a0bbd4f7bf5", "agents/gsd-intel-updater.md": "944f1d903e2e9e09", @@ -189,7 +189,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -275,13 +275,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "f6eae507bb465c5f", + "gsd-core/workflows/execute-phase.md": "73ffb4f5d915e410", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "ca13ab9c31682a09", + "gsd-core/workflows/execute-plan.md": "74de71f01739f7ac", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index d00d7dec6..3c9d06a11 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -23,8 +23,8 @@ ".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", ".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", ".kimi/hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - ".kimi/hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - ".kimi/hooks/gsd-worktree-path-guard.js": "b49b03fa9de7df3b", + ".kimi/hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + ".kimi/hooks/gsd-worktree-path-guard.js": "d00a75505429355c", ".kimi/hooks/lib/git-cmd.js": "268ba15992ca0b23", ".kimi/hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", ".kimi/hooks/managed-hooks-registry.cjs": "08ec2585a3f8f132", @@ -61,7 +61,7 @@ "agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938", "agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876", "agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2", - "agents/subagents/gsd-executor.md": "e37a910127d9ca5c", + "agents/subagents/gsd-executor.md": "8fdf9332233a66bd", "agents/subagents/gsd-executor.yaml": "e29422986636fd64", "agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16", "agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3", @@ -225,7 +225,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -311,13 +311,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "5166a4c16dce3465", + "gsd-core/workflows/execute-phase.md": "157a97e0978bd5df", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "ca13ab9c31682a09", + "gsd-core/workflows/execute-plan.md": "74de71f01739f7ac", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index c1c34ccb1..4b356bc4b 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "71250e759ca9e723", "agents/gsd-eval-auditor.md": "c88890105f32ace6", "agents/gsd-eval-planner.md": "60bddb70a937f796", - "agents/gsd-executor.md": "4946be74860ea68e", + "agents/gsd-executor.md": "14423bfb4dee14b8", "agents/gsd-framework-selector.md": "1c0a10355e787675", "agents/gsd-integration-checker.md": "a9de5928e5a5c649", "agents/gsd-intel-updater.md": "493e07482fa6198a", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "3bd98d30eee6c5a1", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "225910640adbb76d", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "72e93b7f650d9bae", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "f6210dc8ff7776d5", "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", "gsd-core/workflows/eval-review.md": "1973f08d0eb34159", - "gsd-core/workflows/execute-phase.md": "4e19bf9ead5fbafc", + "gsd-core/workflows/execute-phase.md": "b59b9993b1da7bb8", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a15993affd62f4bf", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "c4cba01539f0368a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "21f4d9b3abc334ce", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "a2e611fff6af9c29", + "gsd-core/workflows/execute-plan.md": "bb0ce725dcf12aa2", "gsd-core/workflows/explore.md": "a514b88e98609441", "gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0", "gsd-core/workflows/fast.md": "12187b242e6af970", @@ -418,8 +418,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "c8f6c980305ae6fd", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "bfef1802d491bdab", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "bd57cc72f482a14f", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index 39aa2c771..03305acb5 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -128,7 +128,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -214,13 +214,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "042978dd27ab0637", + "gsd-core/workflows/execute-phase.md": "6779316ccf03982c", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "5063fc252c479892", + "gsd-core/workflows/execute-plan.md": "3168b13c3758ed84", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", @@ -314,8 +314,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "d0cea21bc596fd27", - "hooks/gsd-worktree-path-guard.js": "933eefc31e3b0407", + "hooks/gsd-workflow-guard.js": "56414206bc13b3dc", + "hooks/gsd-worktree-path-guard.js": "ea37324fe8dfaf12", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "ac720a2b548ba200", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index dfba77aec..4b0d98709 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "bd054bb27beed2a7", "agents/gsd-eval-auditor.md": "57cc7458ab5de6b7", "agents/gsd-eval-planner.md": "01b665728dde4ccf", - "agents/gsd-executor.md": "a6dd5b7da329d8f2", + "agents/gsd-executor.md": "b6baf92a0d0ab516", "agents/gsd-framework-selector.md": "82ba6abea84226b7", "agents/gsd-integration-checker.md": "90835dbc7dfa1691", "agents/gsd-intel-updater.md": "3cc4f6ddd04676ec", @@ -161,7 +161,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "59804937da1ddaa9", - "gsd-core/references/worktree-branch-check.md": "3fc21ae9462c35c8", + "gsd-core/references/worktree-branch-check.md": "ea7fc76177f3e50d", "gsd-core/references/worktree-path-safety.md": "b4111595eabec186", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -247,13 +247,13 @@ "gsd-core/workflows/docs-update.md": "226550a6d556b09f", "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", "gsd-core/workflows/eval-review.md": "88431952699d9fa6", - "gsd-core/workflows/execute-phase.md": "8e8fc94fd3071a79", + "gsd-core/workflows/execute-phase.md": "69c5e8a42ea9c331", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "0e0949db56deebeb", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0b04cc2dcab61107", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "9cbf100b17f4bcb1", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "ec9026ede61e5cb9", + "gsd-core/workflows/execute-plan.md": "ea93d7a5c3d483e8", "gsd-core/workflows/explore.md": "c412905fb86f3f12", "gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a", "gsd-core/workflows/fast.md": "93ed453edddd8c0c", @@ -347,8 +347,8 @@ "hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38", "hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd", "hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf", - "hooks/gsd-workflow-guard.js": "46b287c75153458a", - "hooks/gsd-worktree-path-guard.js": "112c3293a5baabeb", + "hooks/gsd-workflow-guard.js": "41c59d9765ac36ae", + "hooks/gsd-worktree-path-guard.js": "d55016621969e923", "hooks/lib/git-cmd.js": "268ba15992ca0b23", "hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9", "hooks/managed-hooks-registry.cjs": "08741ed76f1d8970", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index b291234c8..b3f0fea41 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "b80f76874c04e515", "agents/gsd-eval-auditor.md": "470bf16303ec4d2e", "agents/gsd-eval-planner.md": "22334fde85723c9d", - "agents/gsd-executor.md": "a611d34bf51e6aec", + "agents/gsd-executor.md": "00768988ee91ad9f", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "7cd2072984411c7f", "agents/gsd-intel-updater.md": "83de6ba9172891c3", @@ -161,7 +161,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "77d0e004039fb480", - "gsd-core/references/worktree-branch-check.md": "8de8075d76ff71cd", + "gsd-core/references/worktree-branch-check.md": "d20c16a7b42cceee", "gsd-core/references/worktree-path-safety.md": "34689482908229bc", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -247,13 +247,13 @@ "gsd-core/workflows/docs-update.md": "89e760e665ff99f8", "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", "gsd-core/workflows/eval-review.md": "90a29a4fa0cdd947", - "gsd-core/workflows/execute-phase.md": "8f095f3cf2fb8f35", + "gsd-core/workflows/execute-phase.md": "7d9ad2344ede3966", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "296b812e8d0e9ce8", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7d30384e9bf82664", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "90efedae3decaffe", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "f42ffe9e77df0bce", + "gsd-core/workflows/execute-plan.md": "3abba98d19b31036", "gsd-core/workflows/explore.md": "f4d0db08c11545a8", "gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6", "gsd-core/workflows/fast.md": "0f05b1e008ac2fc2", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index e8b456a56..8c3029f75 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "56395dbdabf076f6", "agents/gsd-eval-auditor.md": "fb64fc5acf359747", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "067a4f846f4e020c", + "agents/gsd-executor.md": "10341df8e1f390bb", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "4ffb37fb230c2b90", "agents/gsd-intel-updater.md": "a81d77c143c02108", @@ -161,7 +161,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "481ec11fe3e22236", - "gsd-core/references/worktree-branch-check.md": "f6018dddf15bc1cb", + "gsd-core/references/worktree-branch-check.md": "6a28b79d092173dd", "gsd-core/references/worktree-path-safety.md": "0e8a26b9b3424974", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", "gsd-core/templates/DEBUG.md": "0944156249103c16", @@ -247,13 +247,13 @@ "gsd-core/workflows/docs-update.md": "6bd25d0123ee6c73", "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", "gsd-core/workflows/eval-review.md": "713de00ea5326988", - "gsd-core/workflows/execute-phase.md": "bbeb787a4e0969f0", + "gsd-core/workflows/execute-phase.md": "b28e4d8cffeb2944", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "3194ecd382690755", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fb4497767cdf73a3", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "c54d55fad3ab5263", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "d7bc64b2d3fcff84", + "gsd-core/workflows/execute-plan.md": "2ff04f06b000fe26", "gsd-core/workflows/explore.md": "e5ff3269f8ee77b6", "gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a", "gsd-core/workflows/fast.md": "b03b9f595892479a", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 5f4ea9dc6..b8ba49aba 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -16,7 +16,7 @@ "agents/gsd-domain-researcher.md": "049f588663814fa2", "agents/gsd-eval-auditor.md": "54870d3b07433525", "agents/gsd-eval-planner.md": "552e9fa164c51ce8", - "agents/gsd-executor.md": "1154cdd7b22f9754", + "agents/gsd-executor.md": "98424ccf4346c9d1", "agents/gsd-framework-selector.md": "8a795f230436ad2e", "agents/gsd-integration-checker.md": "c1760a0bbd4f7bf5", "agents/gsd-intel-updater.md": "944f1d903e2e9e09", @@ -232,7 +232,7 @@ "gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8", "gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a", "gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5", - "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", + "gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", "gsd-core/templates/DEBUG.md": "c8768312f4c1e438", @@ -318,13 +318,13 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "479ea9fcfe74e8f8", + "gsd-core/workflows/execute-phase.md": "0e1e8e5e3fa63587", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "beedb5ddff997b5a", + "gsd-core/workflows/execute-plan.md": "4f43b65cf80d8f2e", "gsd-core/workflows/explore.md": "3f3b4f83e23349bc", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index 3bf8340ea..5664c3630 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -24,8 +24,8 @@ "docs-update.md": 56494, "edit-phase.md": 12927, "eval-review.md": 10332, - "execute-phase.md": 93368, - "execute-plan.md": 35131, + "execute-phase.md": 93383, + "execute-plan.md": 35143, "explore.md": 11127, "extract-learnings.md": 12893, "fast.md": 7613, diff --git a/tests/worktree-cleanup.test.cjs b/tests/worktree-cleanup.test.cjs index 468bd1c2e..400445a9e 100644 --- a/tests/worktree-cleanup.test.cjs +++ b/tests/worktree-cleanup.test.cjs @@ -187,10 +187,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => { const scripts = codeBlocks.map(({ body }) => body).join('\n'); // Allow-list must reference the canonical Claude Code worktree-agent- // namespace via a regex assertion (grep -Eq '^worktree-agent-...'). - const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/; + const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/; assert.ok( allowListRe.test(scripts), - 'worktree_branch_check must enforce a positive allow-list matching ^worktree-agent-* (#2924 hardening)' + 'worktree_branch_check must enforce a positive allow-list matching ^(worktree-)?agent-* (#2924 hardening)' ); }); @@ -322,10 +322,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => { }); test('block enforces positive worktree-agent-* allow-list (#2924 hardening)', () => { - const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/; + const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/; assert.ok( allowListRe.test(block), - 'quick.md worktree_branch_check must enforce a positive allow-list matching ^worktree-agent-* (#2924 hardening)' + 'quick.md worktree_branch_check must enforce a positive allow-list matching ^(worktree-)?agent-* (#2924 hardening)' ); }); }); @@ -404,10 +404,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => { test('step 0 enforces positive worktree-agent-* allow-list (#2924 hardening)', () => { const codeBlocks = extractFencedCodeBlocks(block); const scripts = codeBlocks.map(({ body }) => body).join('\n'); - const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/; + const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/; assert.ok( allowListRe.test(scripts), - 'task_commit_protocol step 0 must enforce a positive allow-list matching ^worktree-agent-* in addition to the protected-ref deny-list (#2924 hardening)' + 'task_commit_protocol step 0 must enforce a positive allow-list matching ^(worktree-)?agent-* in addition to the protected-ref deny-list (#2924 hardening)' ); }); }); @@ -1531,8 +1531,8 @@ function extractCwdGuardBash() { if (!guardBash.includes('git rev-parse --show-toplevel')) { throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "git rev-parse --show-toplevel"'); } - if (!guardBash.includes('worktree-agent-')) { - throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "worktree-agent-"'); + if (!guardBash.includes('(worktree-)?agent-')) { + throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "(worktree-)?agent-"'); } return guardBash; diff --git a/tests/worktree-safety.test.cjs b/tests/worktree-safety.test.cjs index 70fc42390..db4872303 100644 --- a/tests/worktree-safety.test.cjs +++ b/tests/worktree-safety.test.cjs @@ -662,6 +662,16 @@ describe('planWorktreeRecordAgent', () => { assert.equal(readBack.reason, 'empty_manifest'); }); + test('accepts the current agent- namespace (#1995)', () => { + const plan = planWorktreeRecordAgent('{"worktrees":[]}', { ...VALID, branch: 'agent-a1' }); + assert.equal(plan.ok, true); + assert.equal(plan.entry.branch, 'agent-a1'); + const readBack = planWorktreeWaveCleanup('/repo/main', JSON.parse(plan.manifest)); + assert.equal(readBack.ok, true); + assert.equal(readBack.entries.length, 1); + assert.equal(readBack.entries[0].branch, 'agent-a1'); + }); + test('fails loudly on malformed manifest JSON instead of clobbering it', () => { const plan = planWorktreeRecordAgent('{not valid json', VALID); assert.equal(plan.ok, false); @@ -749,7 +759,9 @@ describe('planWorktreeRecordAgent', () => { describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () => { const seg = fc.stringMatching(/^[A-Za-z0-9._/-]+$/); // include '/' — the namespace allows it - const agentBranch = seg.map((s) => `worktree-agent-${s}`); + const legacyAgentBranch = seg.map((s) => `worktree-agent-${s}`); + const currentAgentBranch = seg.map((s) => `agent-${s}`); + const agentBranch = fc.oneof(legacyAgentBranch, currentAgentBranch); const nonEmpty = fc.stringMatching(/^\S[\S ]*$/); // no leading whitespace, not blank test('any writer-accepted entry round-trips through the cleanup reader unchanged', () => { @@ -776,7 +788,7 @@ describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () = agentId: nonEmpty, worktreePath: nonEmpty, // Any branch that does NOT match the disposable namespace. - branch: fc.string({ minLength: 1 }).filter((b) => !/^worktree-agent-[A-Za-z0-9._/-]+$/.test(b.trim())), + branch: fc.string({ minLength: 1 }).filter((b) => !/^(worktree-)?agent-[A-Za-z0-9._/-]+$/.test(b.trim())), base: nonEmpty, }), (fields) => { @@ -788,6 +800,79 @@ describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () = }); }); +// ─── branch namespace boundary tests (#1995) ───────────────────────────────── +// Claude Code's isolation="worktree" branch naming changed from worktree-agent- +// to agent-. Both namespaces must be accepted; non-agent branches rejected. + +describe('worktree branch namespace boundaries (#1995)', () => { + const ACCEPTED_BRANCHES = [ + 'agent-a1', + 'agent-abc123', + 'agent-session.42', + 'worktree-agent-a1', + 'worktree-agent-abc123', + 'worktree-agent-session.42', + ]; + const REJECTED_BRANCHES = [ + 'feature-x', + 'main', + 'agent', + 'worktree-agent', + 'xagent-y', + 'worktree-foo', + 'worktree-agent-', + 'agent-', + '', + ]; + + for (const branch of ACCEPTED_BRANCHES) { + test(`planWorktreeRecordAgent accepts branch "${branch}"`, () => { + const plan = planWorktreeRecordAgent('{"worktrees":[]}', { + agentId: 'a1', worktreePath: '/repo/wt', branch, base: 'abc123', + }); + assert.equal(plan.ok, true, `expected branch "${branch}" to be accepted`); + assert.equal(plan.entry.branch, branch); + }); + } + + for (const branch of REJECTED_BRANCHES) { + test(`planWorktreeRecordAgent rejects branch "${branch}"`, () => { + const plan = planWorktreeRecordAgent('{"worktrees":[]}', { + agentId: 'a1', worktreePath: '/repo/wt', branch, base: 'abc123', + }); + if (branch === '') { + assert.equal(plan.reason, 'missing_field'); + } else { + assert.equal(plan.ok, false, `expected branch "${branch}" to be rejected`); + assert.equal(plan.reason, 'invalid_entry'); + assert.match(plan.hint, /\(worktree-\)\?agent-/); + } + }); + } + + test('cleanup-wave retains agent- entries alongside worktree-agent- entries', () => { + const manifest = { + orchestrator_root: '/repo/main', + worktrees: [ + { agent_id: 'a1', worktree_path: '/repo/wt-a1', branch: 'agent-a1', expected_base: 'abc' }, + { agent_id: 'a2', worktree_path: '/repo/wt-a2', branch: 'worktree-agent-a2', expected_base: 'def' }, + ], + }; + const result = planWorktreeWaveCleanup('/repo/main', manifest); + assert.equal(result.ok, true); + assert.equal(result.entries.length, 2); + assert.deepEqual(result.entries.map((e) => e.branch), ['agent-a1', 'worktree-agent-a2']); + }); + + test('hint string names the widened accepted pattern', () => { + const plan = planWorktreeRecordAgent('{"worktrees":[]}', { + agentId: 'a1', worktreePath: '/repo/wt', branch: 'feature-x', base: 'abc123', + }); + assert.equal(plan.ok, false); + assert.match(plan.hint, /\(worktree-\)\?agent-\[A-Za-z0-9\._\/-\]\+/); + }); +}); + // ─── cmdWorktreeRecordAgent (#1298 CLI wrapper) ─────────────────────────────── describe('cmdWorktreeRecordAgent', () => { @@ -824,6 +909,26 @@ describe('cmdWorktreeRecordAgent', () => { assert.match(out.join(''), /"ok": true/); }); + test('accepts the current agent- namespace via CLI (#1995)', () => { + let writtenContent = null; + const agentArgs = [ + '--manifest', 'manifest.json', + '--agent-id', 'a1', + '--path', '/repo/.claude/worktrees/agent-a1', + '--branch', 'agent-a1', + '--base', 'abc123', + ]; + const result = cmdWorktreeRecordAgent('/repo/main', agentArgs, { + readFile: () => '{"orchestrator_root":"/repo/main","worktrees":[]}', + writeFile: (_p, c) => { writtenContent = c; }, + write: () => {}, + writeErr: () => {}, + }); + assert.equal(result.ok, true); + const written = JSON.parse(writtenContent); + assert.equal(written.worktrees[0].branch, 'agent-a1'); + }); + test('exits 2 with usage when --manifest is missing', () => { withExitCode(() => { const errs = []; @@ -2620,10 +2725,10 @@ describe('bug #3384: adjacent worktree data-loss guards', () => { const fragmentSource = fs.readFileSync(WORKTREE_BRANCH_CHECK_FRAGMENT, 'utf8'); const branchCheck = fragmentSource.indexOf('HEAD_REF=$(git symbolic-ref --quiet HEAD || echo'); - const namespaceCheck = fragmentSource.indexOf('^worktree-agent-'); + const namespaceCheck = fragmentSource.indexOf('(worktree-)?agent-'); assert.ok(branchCheck > 0, 'canonical fragment must assert HEAD before any work'); - assert.ok(namespaceCheck > branchCheck, 'canonical fragment must require disposable worktree-agent branch'); + assert.ok(namespaceCheck > branchCheck, 'canonical fragment must require disposable agent/worktree-agent branch'); // #48: verify-only — the destructive self-recovery is gone; the fragment fails closed instead. assert.ok(!fragmentSource.includes('git reset --hard {EXPECTED_BASE}'), 'canonical fragment must not self-recover via reset --hard — orchestrator owns recovery (#48)'); assert.ok(fragmentSource.includes('exit 42'), 'canonical fragment must fail closed with exit 42 on base mismatch (#48)'); diff --git a/tests/worktree.test.cjs b/tests/worktree.test.cjs index 25f73fd83..cb0e72747 100644 --- a/tests/worktree.test.cjs +++ b/tests/worktree.test.cjs @@ -167,9 +167,9 @@ describe('canonical worktree-branch-check fragment is the single source of truth assert.ok(/\brelease\b/.test(block), 'fragment protected-ref alternation must include release'); }); - test('fragment block positive allow-list matches ^worktree-agent- pattern', () => { - const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/; - assert.ok(allowListRe.test(block), 'fragment block must enforce a positive allow-list matching ^worktree-agent-'); + test('fragment block positive allow-list matches ^(worktree-)?agent- pattern', () => { + const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/; + assert.ok(allowListRe.test(block), 'fragment block must enforce a positive allow-list matching ^(worktree-)?agent-'); }); test('fragment block contains update-ref prohibition text', () => {