feat(#2584): Phase 3 — scheduler consumer + isolation adapters (#2635)

Final phase of #2584 (ADR-1239 Codex-binding amendment). execute-phase now negotiates dispatch.isolation and dispatches through the matching adapter, so a wave's independent plans run concurrently on six runtimes instead of one — with no runtime=== branch in the scheduler.

harness-worktree passes the host's declared isolation flag (claude, cursor); orchestrator-worktree creates the worktree via the Phase-2 verb and spawns the executor into it with the resolved argv/cwd (codex, opencode, kimi, kimi-code); none stays sequential. Undeclared/unknown/unresolvable isolation degrades to none — never an unisolated parallel run.

Fixes two shipped Phase-2 descriptors that per-host research found would fail at spawn: kimi lacked its headless flag (would launch the interactive TUI and hang the orchestrator), and kimi-code named a non-existent binary (Kimi Code installs as 'kimi'). Adds the worktree-path root confinement Phase 2 deferred here, and leading-dash guards on the resolver's prompt/cwd matching the existing git-argument guard.

Closes #2627

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-07-25 01:50:20 -04:00
committed by GitHub
parent 461c744c31
commit 6ad30f74b6
62 changed files with 1105 additions and 205 deletions

View File

@@ -5747,9 +5747,17 @@ function parseWorkflowSteps(content) {
name: match[1],
// After #3797 architectural fix, callsites use gsd_run
readsRuntimeConfig: body.includes('RUNTIME=$(gsd_run query config-get runtime --default claude'),
// #1521: guard generalized from Codex-specific to all non-Claude runtimes
codexWorktreeGuard: body.includes('git worktree isolation') && body.includes('unsupported on runtime'),
worktreeDispatchGuidance: body.includes('isolation="worktree"'),
// #1521 generalized the guard from Codex-specific to all non-Claude
// runtimes; #2584 Phase 3 (#2627) generalized it again — off runtime
// identity entirely and onto the negotiated `dispatch.isolation`
// capability. The step now resolves ISOLATION (delegating the block to
// the isolation-dispatch fragment) and fails closed when a host
// declares no primitive, which is what #3360 actually protects.
resolvesIsolationCapability: body.includes('Resolve ISOLATION'),
// Worktree dispatch guidance is no longer a hardcoded Claude flag —
// step 3 emits the host's DECLARED harness flag.
worktreeDispatchGuidance: body.includes('{harnessFlag}')
|| body.includes('executor-isolation-dispatch.md'),
};
});
}
@@ -5764,27 +5772,58 @@ function executePhaseWorktreeContract(content) {
const initialize = steps[initializeIndex];
return {
initializeReadsRuntimeConfig: initialize.readsRuntimeConfig,
initializeHasCodexWorktreeGuard: initialize.codexWorktreeGuard,
initializeResolvesIsolationCapability: initialize.resolvesIsolationCapability,
guardStepPrecedesWorktreeDispatch: initializeIndex <= firstWorktreeDispatchIndex,
};
}
describe('#3360 — Codex execute-phase fails closed for unsupported worktree isolation', () => {
test('execute-phase reads runtime before worktree dispatch and blocks Codex worktree mode', () => {
describe('#3360 — execute-phase fails closed for unsupported worktree isolation', () => {
// #2584 Phase 3 (#2627) moved this from "Codex is blocked by name" to "a host
// with no declared isolation primitive is blocked". Codex now DECLARES
// orchestrator-worktree and gets a real isolated path, so the guard can no
// longer key on its name — but #3360's actual protection (never run executors
// unisolated against the main checkout) is unchanged and asserted below.
const ISOLATION_FRAGMENT = path.join(
ROOT, 'gsd-core', 'workflows', 'execute-phase', 'steps', 'executor-isolation-dispatch.md',
);
test('execute-phase resolves the isolation capability before any worktree dispatch', () => {
const workflow = fs.readFileSync(EXECUTE_PHASE, 'utf8');
const contract = executePhaseWorktreeContract(workflow);
assert.deepEqual(contract, {
initializeReadsRuntimeConfig: true,
initializeHasCodexWorktreeGuard: true,
initializeResolvesIsolationCapability: true,
guardStepPrecedesWorktreeDispatch: true,
});
});
test('Codex adapter documents that worktree isolation has no direct spawn_agent mapping', () => {
test('a host declaring no isolation primitive still fails closed', () => {
const fragment = fs.readFileSync(ISOLATION_FRAGMENT, 'utf8');
assert.match(fragment, /ISOLATION="?none"?/,
'fragment must resolve the none case');
assert.match(fragment, /FATAL[^\n]*no executor-isolation primitive/,
'a host with dispatch.isolation=none must fail closed before dispatch (#3360)');
assert.match(fragment, /use_worktrees=false/,
'the fail-closed message must tell the user how to proceed');
});
test('the scheduler never gates worktree dispatch on a runtime name', () => {
const workflow = fs.readFileSync(EXECUTE_PHASE, 'utf8');
const fragment = fs.readFileSync(ISOLATION_FRAGMENT, 'utf8');
for (const [label, src] of [['execute-phase.md', workflow], ['isolation fragment', fragment]]) {
assert.ok(
!/\[\s*"\$RUNTIME"\s*(?:!=|=)\s*"(?:codex|claude)"\s*\]\s*&&\s*\[\s*"\$USE_WORKTREES"/.test(src),
`${label}: worktree dispatch must branch on dispatch.isolation, not a runtime name (ADR-1239)`,
);
}
});
test('Codex adapter documents the orchestrator-managed worktree mapping', () => {
const header = getCodexSkillAdapterHeader('gsd-execute-phase');
assert.match(header, /isolation="worktree"/);
assert.match(header, /no direct Codex mapping/i);
assert.match(header, /orchestrator-worktree/i,
'the adapter header must no longer claim Codex has no worktree mapping — #2584 Phase 3 gave it one');
});
});
});

View File

@@ -39,7 +39,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
"gsd-core/bin/gsd-tools.cjs": "6578e0a1bc8adb0a",
"gsd-core/bin/gsd-tools.cjs": "3bc9c80de40245e9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -122,7 +122,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "2e2f418328e52f6a",
"gsd-core/references/planning-config.md": "3294f01933ac111e",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -247,8 +247,9 @@
"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": "910f445e1af26714",
"gsd-core/workflows/execute-phase.md": "e66b575d3c518cda",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1832b97d0923fa67",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "0404bcd32f47715e",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "4b05739b7c8715ea",
"gsd-core/workflows/execute-phase.md": "30121657c6f64883",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -109,7 +109,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -192,7 +192,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "b025429fc72f9285",
"gsd-core/references/planning-config.md": "9bf731bae8d712a6",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -317,8 +317,9 @@
"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": "d45261ba907a1436",
"gsd-core/workflows/execute-phase.md": "54aaa0d54b341308",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9a1f3deffb4dab14",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ea0ebff5ac00fee6",
"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",

View File

@@ -38,7 +38,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -121,7 +121,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "b025429fc72f9285",
"gsd-core/references/planning-config.md": "9bf731bae8d712a6",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -246,8 +246,9 @@
"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": "8722fff6ecdc9444",
"gsd-core/workflows/execute-phase.md": "a3ccfb42c90834b7",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -42,7 +42,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf",
"gsd-core/bin/gsd-tools.cjs": "b9c55c2bbeec85fe",
"gsd-core/bin/gsd-tools.cjs": "ab7a26552bae55dc",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -125,7 +125,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "5a40b2934db6a321",
"gsd-core/references/planning-config.md": "35550d812bdcd6ec",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -250,8 +250,9 @@
"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": "6583d13e35054091",
"gsd-core/workflows/execute-phase.md": "bb3a5f28fc4543f2",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1b3558cb8f41b65a",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "e01459552d587863",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "aa39a0f01567166c",
"gsd-core/workflows/execute-phase.md": "9d513e6bb52e340c",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -1,75 +1,75 @@
{
".agents/skills/gsd-add-tests/SKILL.md": "f3c1594a059de3ee",
".agents/skills/gsd-ai-integration-phase/SKILL.md": "279cc57f38c78756",
".agents/skills/gsd-audit-fix/SKILL.md": "9cea2764b92aa352",
".agents/skills/gsd-audit-milestone/SKILL.md": "0528ef8a5834b5df",
".agents/skills/gsd-audit-uat/SKILL.md": "6c2aa0c2b62c5233",
".agents/skills/gsd-autonomous/SKILL.md": "d56dc692750f4926",
".agents/skills/gsd-capture/SKILL.md": "211d601d122b5dd6",
".agents/skills/gsd-cleanup/SKILL.md": "18cba17463c6ef97",
".agents/skills/gsd-code-review/SKILL.md": "74749a1aff4224d7",
".agents/skills/gsd-complete-milestone/SKILL.md": "77bee8741f8cb381",
".agents/skills/gsd-config/SKILL.md": "5fde92e30619edcb",
".agents/skills/gsd-debug/SKILL.md": "7e56964e14fd0a10",
".agents/skills/gsd-discuss-phase/SKILL.md": "837d46c55cc2424e",
".agents/skills/gsd-docs-update/SKILL.md": "5028dc5dd44bee7d",
".agents/skills/gsd-eval-review/SKILL.md": "a300e78a27ba74d6",
".agents/skills/gsd-execute-phase/SKILL.md": "e77bee13068600d3",
".agents/skills/gsd-explore/SKILL.md": "d660cde0e6f31ebf",
".agents/skills/gsd-extract-learnings/SKILL.md": "e32388999da384e4",
".agents/skills/gsd-fast/SKILL.md": "14c407a76a40e115",
".agents/skills/gsd-forensics/SKILL.md": "6d496a16f5ca74b3",
".agents/skills/gsd-graphify/SKILL.md": "1bbd96129fbacc5c",
".agents/skills/gsd-health/SKILL.md": "656c9c63852e3787",
".agents/skills/gsd-help/SKILL.md": "28eb8d0b487239f8",
".agents/skills/gsd-import/SKILL.md": "4d15ee09e531342f",
".agents/skills/gsd-inbox/SKILL.md": "1315033595643485",
".agents/skills/gsd-ingest-docs/SKILL.md": "5bd2838bf0b6dc1b",
".agents/skills/gsd-manager/SKILL.md": "cb1cf56f5d3f66d6",
".agents/skills/gsd-map-codebase/SKILL.md": "cd27dc028718426b",
".agents/skills/gsd-mempalace-capture/SKILL.md": "fb426a6700b98eed",
".agents/skills/gsd-mempalace-recall/SKILL.md": "7205b02250e89f25",
".agents/skills/gsd-milestone-summary/SKILL.md": "af84ecb400f23556",
".agents/skills/gsd-mvp-phase/SKILL.md": "72b65ae927b280fe",
".agents/skills/gsd-new-milestone/SKILL.md": "587574d2d475bb10",
".agents/skills/gsd-new-project/SKILL.md": "129ac16e6a1f04ba",
".agents/skills/gsd-next/SKILL.md": "7855fd70e387087e",
".agents/skills/gsd-ns-context/SKILL.md": "9b496da79789b3f9",
".agents/skills/gsd-ns-ideate/SKILL.md": "84ca1cde06110981",
".agents/skills/gsd-ns-manage/SKILL.md": "909dafa0cd19ba5a",
".agents/skills/gsd-ns-project/SKILL.md": "936b6998d42520ac",
".agents/skills/gsd-ns-review/SKILL.md": "022253010db0e072",
".agents/skills/gsd-ns-workflow/SKILL.md": "cba075bc819b539e",
".agents/skills/gsd-onboard/SKILL.md": "f42fc2edebeda671",
".agents/skills/gsd-pause-work/SKILL.md": "b379469eed78a196",
".agents/skills/gsd-phase/SKILL.md": "25477edc97a90c91",
".agents/skills/gsd-plan-phase/SKILL.md": "14b7a4f76825a5c2",
".agents/skills/gsd-plan-review-convergence/SKILL.md": "c7d8a4db99e4f4b9",
".agents/skills/gsd-pr-branch/SKILL.md": "6901da15e321913e",
".agents/skills/gsd-profile-user/SKILL.md": "6259fabfb6afe7be",
".agents/skills/gsd-progress/SKILL.md": "85d76286162b9189",
".agents/skills/gsd-quick/SKILL.md": "b4f4e711ba664aa0",
".agents/skills/gsd-resume-work/SKILL.md": "04f6c2e5b579e8c4",
".agents/skills/gsd-review-backlog/SKILL.md": "469696b944c4e7b5",
".agents/skills/gsd-review/SKILL.md": "a45ab2fdca06793b",
".agents/skills/gsd-secure-phase/SKILL.md": "e64ad269c1e6e319",
".agents/skills/gsd-settings/SKILL.md": "fcdda8dd545622ae",
".agents/skills/gsd-ship/SKILL.md": "9615cc4c8f6de060",
".agents/skills/gsd-sketch/SKILL.md": "90c219b843db7ec7",
".agents/skills/gsd-spec-phase/SKILL.md": "56a5cbd606db9cba",
".agents/skills/gsd-spike/SKILL.md": "77209fef7a04c11a",
".agents/skills/gsd-stats/SKILL.md": "566024444ef71f44",
".agents/skills/gsd-surface/SKILL.md": "e8b9d3c291a5c18c",
".agents/skills/gsd-thread/SKILL.md": "85326c97c83a02d1",
".agents/skills/gsd-ui-phase/SKILL.md": "a0c8fbcbe5e3c2b9",
".agents/skills/gsd-ui-review/SKILL.md": "081a3292a2d357f5",
".agents/skills/gsd-ultraplan-phase/SKILL.md": "06fb3d76eb785f94",
".agents/skills/gsd-undo/SKILL.md": "007d3b307e027af9",
".agents/skills/gsd-update/SKILL.md": "e6e49e117c7c8f35",
".agents/skills/gsd-validate-phase/SKILL.md": "373059517a94a194",
".agents/skills/gsd-verify-work/SKILL.md": "4272275698e9a3fe",
".agents/skills/gsd-workspace/SKILL.md": "06d6400d68318361",
".agents/skills/gsd-workstreams/SKILL.md": "2f77bb94db1be1a4",
".agents/skills/gsd-add-tests/SKILL.md": "77b8cc2260347f34",
".agents/skills/gsd-ai-integration-phase/SKILL.md": "a7d2527fdacdfca8",
".agents/skills/gsd-audit-fix/SKILL.md": "dcf56fbc7dddfa05",
".agents/skills/gsd-audit-milestone/SKILL.md": "5f0c7c1212a1aab9",
".agents/skills/gsd-audit-uat/SKILL.md": "60e3113cd4f79d30",
".agents/skills/gsd-autonomous/SKILL.md": "814575ceee96bf7f",
".agents/skills/gsd-capture/SKILL.md": "24c497365eb1dc88",
".agents/skills/gsd-cleanup/SKILL.md": "a98cf0c1a9cd043f",
".agents/skills/gsd-code-review/SKILL.md": "8d437487fdf22dd8",
".agents/skills/gsd-complete-milestone/SKILL.md": "4db2dfdb992f1ddc",
".agents/skills/gsd-config/SKILL.md": "d461419ef4715e8a",
".agents/skills/gsd-debug/SKILL.md": "0b6f9657b8d951b3",
".agents/skills/gsd-discuss-phase/SKILL.md": "9576325fe81d2fa3",
".agents/skills/gsd-docs-update/SKILL.md": "cb3b313895cb02c2",
".agents/skills/gsd-eval-review/SKILL.md": "0047cb3cf40d1e56",
".agents/skills/gsd-execute-phase/SKILL.md": "2f74b8bf59526a07",
".agents/skills/gsd-explore/SKILL.md": "0114f763a0b23e1b",
".agents/skills/gsd-extract-learnings/SKILL.md": "386a4dc07b1531bb",
".agents/skills/gsd-fast/SKILL.md": "f56a7f5dcd552e1d",
".agents/skills/gsd-forensics/SKILL.md": "8e316475309e0244",
".agents/skills/gsd-graphify/SKILL.md": "89b024ca307dbef2",
".agents/skills/gsd-health/SKILL.md": "6236cb12b1ad87a0",
".agents/skills/gsd-help/SKILL.md": "dcec9a38b65a3fe7",
".agents/skills/gsd-import/SKILL.md": "2bfbdb1d8e968e92",
".agents/skills/gsd-inbox/SKILL.md": "6cb4b0a7d204a57f",
".agents/skills/gsd-ingest-docs/SKILL.md": "89d7a1600280cea0",
".agents/skills/gsd-manager/SKILL.md": "30871970a7f114fd",
".agents/skills/gsd-map-codebase/SKILL.md": "9e8075f7e40f71b0",
".agents/skills/gsd-mempalace-capture/SKILL.md": "90e246d2fcb69742",
".agents/skills/gsd-mempalace-recall/SKILL.md": "af823f0ba710ae9f",
".agents/skills/gsd-milestone-summary/SKILL.md": "bc764a054f502fb9",
".agents/skills/gsd-mvp-phase/SKILL.md": "0510a25c1812c14e",
".agents/skills/gsd-new-milestone/SKILL.md": "6a0f49871aa109ce",
".agents/skills/gsd-new-project/SKILL.md": "2b0ed171caff620f",
".agents/skills/gsd-next/SKILL.md": "e5bbd32e2ddf7898",
".agents/skills/gsd-ns-context/SKILL.md": "701f9c8b888da86d",
".agents/skills/gsd-ns-ideate/SKILL.md": "9d7fadf4e720d0f7",
".agents/skills/gsd-ns-manage/SKILL.md": "7796f26fef6f37ed",
".agents/skills/gsd-ns-project/SKILL.md": "334d912c373dd510",
".agents/skills/gsd-ns-review/SKILL.md": "b8c0e8c006750d9e",
".agents/skills/gsd-ns-workflow/SKILL.md": "74cfe054960e3d3a",
".agents/skills/gsd-onboard/SKILL.md": "405f1bafd7923f63",
".agents/skills/gsd-pause-work/SKILL.md": "035ba2eb44694897",
".agents/skills/gsd-phase/SKILL.md": "fcaf25f68fb69aa9",
".agents/skills/gsd-plan-phase/SKILL.md": "2e32fc011f5a967a",
".agents/skills/gsd-plan-review-convergence/SKILL.md": "d2a06c49143781a7",
".agents/skills/gsd-pr-branch/SKILL.md": "ec4b400d07d513ae",
".agents/skills/gsd-profile-user/SKILL.md": "2121b67e7a15bab5",
".agents/skills/gsd-progress/SKILL.md": "c437575d9db40ec5",
".agents/skills/gsd-quick/SKILL.md": "2903daf3d7a7721d",
".agents/skills/gsd-resume-work/SKILL.md": "ae8d0d364e4253e7",
".agents/skills/gsd-review-backlog/SKILL.md": "e7f1864923ac2364",
".agents/skills/gsd-review/SKILL.md": "7da0004c99fa4bb0",
".agents/skills/gsd-secure-phase/SKILL.md": "c9e188e7245d1737",
".agents/skills/gsd-settings/SKILL.md": "300cd125bcf6ed36",
".agents/skills/gsd-ship/SKILL.md": "a4e4754b1ec4acc1",
".agents/skills/gsd-sketch/SKILL.md": "aeb24dbbb9fdf53b",
".agents/skills/gsd-spec-phase/SKILL.md": "8f83fab7e9bf7cf2",
".agents/skills/gsd-spike/SKILL.md": "c1cf5ac37ab91f5a",
".agents/skills/gsd-stats/SKILL.md": "baf175aeb2ab443d",
".agents/skills/gsd-surface/SKILL.md": "aa799cd1fcd19314",
".agents/skills/gsd-thread/SKILL.md": "dcf2f37027521f34",
".agents/skills/gsd-ui-phase/SKILL.md": "f5566a58fb643a93",
".agents/skills/gsd-ui-review/SKILL.md": "cc4621cf9f34c203",
".agents/skills/gsd-ultraplan-phase/SKILL.md": "a3102b7aa3358374",
".agents/skills/gsd-undo/SKILL.md": "eda2192b937bc7bf",
".agents/skills/gsd-update/SKILL.md": "c6cef6debd103e68",
".agents/skills/gsd-validate-phase/SKILL.md": "0e628cd8455f5127",
".agents/skills/gsd-verify-work/SKILL.md": "7025ea9c3bb18bc4",
".agents/skills/gsd-workspace/SKILL.md": "d7e1436cd4b79c54",
".agents/skills/gsd-workstreams/SKILL.md": "88c2e54d79078ba3",
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "5ca58f5ff7ef0b92",
"agents/gsd-advisor-researcher.md": "eea6d1604aaf305c",
@@ -145,7 +145,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -228,7 +228,7 @@
"gsd-core/references/planner-reviews.md": "7889bfa28e82156b",
"gsd-core/references/planner-revision.md": "2ebf1a714d1ec4bf",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "b01856d7a63e73a2",
"gsd-core/references/planning-config.md": "eedc6daa26054994",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -353,8 +353,9 @@
"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": "a805ba08992a6b78",
"gsd-core/workflows/execute-phase.md": "a4040b3faa7fcd55",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "cd8678d082d6e191",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -40,7 +40,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
"gsd-core/bin/gsd-tools.cjs": "6578e0a1bc8adb0a",
"gsd-core/bin/gsd-tools.cjs": "3bc9c80de40245e9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -123,7 +123,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "309a566a0e13e43e",
"gsd-core/references/planning-config.md": "788802092a535772",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -248,8 +248,9 @@
"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": "9c765cec7679b24c",
"gsd-core/workflows/execute-phase.md": "8febab8a96bcd729",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ca37f91f7bd6f05c",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "e0ec3d9748a0fed9",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828",
"gsd-core/bin/gsd-tools.cjs": "3ac4c0a9f3a509f9",
"gsd-core/bin/gsd-tools.cjs": "2ad128ce1ccf606e",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "a3f1b4aca291db59",
"gsd-core/references/planning-config.md": "0cda9fb6e0dea14f",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "f55929bb18a78cac",
"gsd-core/workflows/execute-phase.md": "5038eb8c1e264b90",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "06b54ecd4015c64c",
"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",

View File

@@ -39,7 +39,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f",
"gsd-core/bin/gsd-tools.cjs": "551974377e74c2bd",
"gsd-core/bin/gsd-tools.cjs": "c5ee45330e4b4e59",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -122,7 +122,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "831d626c214d92e4",
"gsd-core/references/planning-config.md": "b2c11e48f913d3e5",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -247,8 +247,9 @@
"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": "b76c1701cee71add",
"gsd-core/workflows/execute-phase.md": "2c22f9d143c79deb",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9b2193de25506b3b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "4dfefdd56d814d06",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "37ab69107a2f7dc6",
"gsd-core/references/planning-config.md": "f51934f2fcfa9943",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "c9ba41385808e527",
"gsd-core/workflows/execute-phase.md": "9d2e270c04edc134",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b1e6588cd32a6f08",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -67,7 +67,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -150,7 +150,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -275,8 +275,9 @@
"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": "68d41c524ab90953",
"gsd-core/workflows/execute-phase.md": "6eddb1de70dabecd",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -103,7 +103,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -186,7 +186,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -311,8 +311,9 @@
"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": "4098733ed70e3898",
"gsd-core/workflows/execute-phase.md": "1eaaf339d670c496",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "37ab69107a2f7dc6",
"gsd-core/references/planning-config.md": "f51934f2fcfa9943",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "acdb85a38ea89628",
"gsd-core/workflows/execute-phase.md": "b5b307cf98e1ff22",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a15993affd62f4bf",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "f74ce2de21b2d252",
"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",

View File

@@ -6,7 +6,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -89,7 +89,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -214,8 +214,9 @@
"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": "0e0359655e2913fd",
"gsd-core/workflows/execute-phase.md": "6bcbae12578d3cb8",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -39,7 +39,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2",
"gsd-core/bin/gsd-tools.cjs": "509319fab53d5022",
"gsd-core/bin/gsd-tools.cjs": "658a035b209dd82d",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -122,7 +122,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "4c6de9b6d66aca73",
"gsd-core/references/planning-config.md": "8491550a179906fd",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -247,8 +247,9 @@
"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": "19d01bc7f7b45279",
"gsd-core/workflows/execute-phase.md": "febed65d77f311af",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "0e0949db56deebeb",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "2ca3c7397d44613f",
"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",

View File

@@ -39,7 +39,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527",
"gsd-core/bin/gsd-tools.cjs": "70126458e4c1216f",
"gsd-core/bin/gsd-tools.cjs": "4ad9a090f406f549",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -122,7 +122,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "a686c1363ae626c5",
"gsd-core/references/planning-config.md": "c14f59545fbfb981",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -247,8 +247,9 @@
"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": "729bf037d4bdec10",
"gsd-core/workflows/execute-phase.md": "6414076b8a380b33",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "296b812e8d0e9ce8",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "c1d6db937a51d433",
"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",

View File

@@ -39,7 +39,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2",
"gsd-core/bin/gsd-tools.cjs": "5e8b0e86049ca8ef",
"gsd-core/bin/gsd-tools.cjs": "2afce7fb45247a8b",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -122,7 +122,7 @@
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "1fc70920778d7c8e",
"gsd-core/references/planning-config.md": "3c961d736c3d9f4f",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -247,8 +247,9 @@
"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": "24db4d3799ad23bc",
"gsd-core/workflows/execute-phase.md": "706eef1de2da75a7",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "3194ecd382690755",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "becb931701890353",
"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",

View File

@@ -110,7 +110,7 @@
"gsd-core/VERSION": "ef0deccd81a6723c",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
"gsd-core/bin/gsd-tools.cjs": "407f4e44045c6e24",
"gsd-core/bin/gsd-tools.cjs": "77acbef416b9e5f9",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
@@ -193,7 +193,7 @@
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
"gsd-core/references/planning-config.md": "b867e826fab06880",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
@@ -318,8 +318,9 @@
"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": "b5e7fced436a73fd",
"gsd-core/workflows/execute-phase.md": "8d16d4af7115e12b",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md": "ab70374e44eb85cd",
"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",

View File

@@ -249,6 +249,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -319,6 +319,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -248,6 +248,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -252,6 +252,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -355,6 +355,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -250,6 +250,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -249,6 +249,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -277,6 +277,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -313,6 +313,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -216,6 +216,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -249,6 +249,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -249,6 +249,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -249,6 +249,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -320,6 +320,7 @@
"gsd-core/workflows/eval-review.md",
"gsd-core/workflows/execute-phase.md",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
"gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
"gsd-core/workflows/execute-phase/steps/regression-gate.md",

View File

@@ -1344,23 +1344,129 @@ describe('resolveOrchestratorExec — the 4 shipped orchestrator-worktree descri
assert.equal(result.cwd, CWD);
});
test('kimi: --work-dir <cwd> (no leading verb)', () => {
const result = resolveOrchestratorExec({ command: 'kimi', args: [], cwdFlag: '--work-dir' }, CWD);
// #2627: `args` carries --print because kimi's working mode is otherwise the
// interactive TUI — an orchestrator spawning a TUI hangs forever rather than
// returning a completed plan.
test('kimi: --print --work-dir <cwd> (headless flag leads)', () => {
const result = resolveOrchestratorExec({ command: 'kimi', args: ['--print'], cwdFlag: '--work-dir' }, CWD);
assert.equal(result.ok, true);
assert.equal(result.command, 'kimi');
assert.deepEqual(result.args, ['--work-dir', CWD]);
assert.deepEqual(result.args, ['--print', '--work-dir', CWD]);
assert.equal(result.cwd, CWD);
});
test('kimi-code: cwdFlag:null — NO flag appended, cwd still returned (process-cwd case)', () => {
const result = resolveOrchestratorExec({ command: 'kimi-code', args: [], cwdFlag: null }, CWD);
// #2627: the binary is `kimi`, NOT `kimi-code` — Moonshot's TypeScript Kimi
// Code installs its binary as `kimi`; `kimi-code` is only the npm package and
// config-home name, so spawning it is an immediate ENOENT.
test('kimi-code: command is "kimi"; cwdFlag:null appends NO flag, cwd still returned (process-cwd case)', () => {
const result = resolveOrchestratorExec({ command: 'kimi', args: [], cwdFlag: null }, CWD);
assert.equal(result.ok, true);
assert.equal(result.command, 'kimi-code');
assert.equal(result.command, 'kimi');
assert.deepEqual(result.args, []);
assert.equal(result.cwd, CWD);
});
});
describe('resolveOrchestratorExec — prompt passing (#2627, Phase 3)', () => {
const CWD = '/repo/.claude/worktrees/agent-a1';
const PROMPT = 'Execute plan 2 of phase 3.';
test('promptFlag:null → prompt appended POSITIONALLY, last (codex shape)', () => {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], cwdFlag: '--cd', promptFlag: null }, CWD, PROMPT,
);
assert.equal(result.ok, true);
assert.deepEqual(result.args, ['exec', '--cd', CWD, PROMPT]);
});
test('promptFlag absent → prompt appended POSITIONALLY (opencode shape)', () => {
const result = resolveOrchestratorExec(
{ command: 'opencode', args: ['run'], cwdFlag: '--dir' }, CWD, PROMPT,
);
assert.equal(result.ok, true);
assert.deepEqual(result.args, ['run', '--dir', CWD, PROMPT]);
});
test('promptFlag string → [flag, prompt] appended (kimi shape)', () => {
const result = resolveOrchestratorExec(
{ command: 'kimi', args: ['--print'], cwdFlag: '--work-dir', promptFlag: '--prompt' }, CWD, PROMPT,
);
assert.equal(result.ok, true);
assert.deepEqual(result.args, ['--print', '--work-dir', CWD, '--prompt', PROMPT]);
});
test('promptFlag string + cwdFlag null → prompt flag only, cwd via process cwd (kimi-code shape)', () => {
const result = resolveOrchestratorExec(
{ command: 'kimi', args: [], cwdFlag: null, promptFlag: '--prompt' }, CWD, PROMPT,
);
assert.equal(result.ok, true);
assert.deepEqual(result.args, ['--prompt', PROMPT]);
assert.equal(result.cwd, CWD, 'cwd is returned even with no cwd flag — caller binds it on the subprocess');
});
test('omitting prompt is byte-identical to the Phase-2 two-arg resolution', () => {
const descriptor = { command: 'codex', args: ['exec'], cwdFlag: '--cd', promptFlag: null };
assert.deepEqual(
resolveOrchestratorExec(descriptor, CWD),
resolveOrchestratorExec(descriptor, CWD, undefined),
);
assert.deepEqual(resolveOrchestratorExec(descriptor, CWD).args, ['exec', '--cd', CWD]);
});
test('empty prompt → invalid_prompt (a prompt-less executor hangs, not degrades)', () => {
const result = resolveOrchestratorExec({ command: 'codex', args: ['exec'] }, CWD, '');
assert.equal(result.ok, false);
assert.equal(result.reason, 'invalid_prompt');
});
test('non-string promptFlag → invalid_prompt_flag', () => {
for (const bogus of [42, {}, []]) {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], promptFlag: bogus }, CWD, PROMPT,
);
assert.equal(result.ok, false, `promptFlag=${JSON.stringify(bogus)} must fail`);
assert.equal(result.reason, 'invalid_prompt_flag');
}
});
// Parity with worktree-safety.cts's `unsafe_leading_dash` guard on git args:
// a dash-leading positional is parsed by the spawned CLI as a flag, not a
// value. Same hazard, same rejection — these two surfaces must not diverge.
test('a dash-leading prompt is rejected (would be parsed as a flag, not a prompt)', () => {
for (const hostile of ['--dangerously-skip-permissions', '-p', '--help']) {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], cwdFlag: '--cd' }, CWD, hostile,
);
assert.equal(result.ok, false, `prompt=${hostile} must be rejected`);
assert.equal(result.reason, 'unsafe_leading_dash_prompt');
}
});
test('a dash-leading cwd is rejected', () => {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], cwdFlag: '--cd' }, '-oProxyCommand=x', 'ok prompt',
);
assert.equal(result.ok, false);
assert.equal(result.reason, 'unsafe_leading_dash_cwd');
});
test('a prompt merely CONTAINING a dash is fine — only a leading dash is a flag', () => {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], cwdFlag: '--cd' }, CWD, 'Execute plan 2 --verbose style',
);
assert.equal(result.ok, true);
assert.ok(result.args.includes('Execute plan 2 --verbose style'));
});
test('empty-string promptFlag falls back to positional rather than emitting a bare ""', () => {
const result = resolveOrchestratorExec(
{ command: 'codex', args: ['exec'], promptFlag: '' }, CWD, PROMPT,
);
assert.equal(result.ok, true);
assert.deepEqual(result.args, ['exec', PROMPT]);
});
});
describe('resolveOrchestratorExec — fail-closed', () => {
test('undefined descriptor → missing_command', () => {
const result = resolveOrchestratorExec(undefined, '/repo/wt');
@@ -1447,7 +1553,13 @@ describe('resolveOrchestratorExec — fast-check property test', () => {
fc.constant(undefined),
fc.string({ minLength: 1 }).filter((s) => s.length > 0),
);
const cwdArb = fc.string({ minLength: 1 }).filter((s) => s.length > 0);
// #2627: a dash-leading cwd is now REJECTED (unsafe_leading_dash_cwd) —
// the spawned CLI would parse it as a flag, the same hazard worktree-safety's
// git-argument guard rejects. That is intentional new fail-closed behavior,
// so the ok:true property below is stated over the domain it actually holds
// on: real working directories. The rejected half is asserted explicitly in
// its own property immediately after, so narrowing here loses no coverage.
const cwdArb = fc.string({ minLength: 1 }).filter((s) => s.length > 0 && !s.startsWith('-'));
test('property: ok:true, command preserved, cwdFlag appended exactly once (or never for null/absent)', () => {
fc.assert(
@@ -1475,6 +1587,43 @@ describe('resolveOrchestratorExec — fast-check property test', () => {
{ numRuns: 200, seed: 2584 },
);
});
// The complementary half of the narrowed domain above (#2627): every
// dash-leading cwd fails closed, for ANY descriptor shape.
test('property: a dash-leading cwd is always rejected, never silently passed through', () => {
fc.assert(
fc.property(
commandArb,
argsArb,
cwdFlagArb,
fc.string().map((s) => `-${s}`),
(command, args, cwdFlag, cwd) => {
const descriptor = cwdFlag === undefined ? { command, args } : { command, args, cwdFlag };
const result = resolveOrchestratorExec(descriptor, cwd);
assert.equal(result.ok, false);
assert.equal(result.reason, 'unsafe_leading_dash_cwd');
},
),
{ numRuns: 200, seed: 2627 },
);
});
// Same shape for the prompt argument, which the resolver appends to argv.
test('property: a dash-leading prompt is always rejected', () => {
fc.assert(
fc.property(
commandArb,
argsArb,
fc.string().map((s) => `-${s}`),
(command, args, prompt) => {
const result = resolveOrchestratorExec({ command, args }, '/repo/wt', prompt);
assert.equal(result.ok, false);
assert.equal(result.reason, 'unsafe_leading_dash_prompt');
},
),
{ numRuns: 200, seed: 2627 },
);
});
});
describe('#2584 orchestratorExec — parity / divergence guard', () => {
@@ -1511,6 +1660,78 @@ describe('#2584 orchestratorExec — parity / divergence guard', () => {
// silently matching zero capabilities and passing vacuously).
assert.deepEqual(orchestratorWorktreeHosts.sort(), ['codex', 'kimi', 'kimi-code', 'opencode']);
});
// #2627: the two guards below encode the per-host research that found two
// shipped descriptors which would have failed at spawn time — kimi resolving
// to an interactive TUI (orchestrator hangs) and kimi-code naming a binary
// that does not exist (ENOENT).
test('every orchestrator-worktree descriptor resolves to a HEADLESS invocation, never an interactive TUI', () => {
// A host that binds cwd by flag alone, with no leading subcommand or
// headless flag, launches its interactive UI. Each host must contribute at
// least one non-cwd token (a subcommand like `exec`/`run`, or an explicit
// headless flag like `--print`) BEFORE the cwd flag — or bind by process
// cwd only, which implies a prompt flag carries the instruction.
const expected = {
codex: ['exec'],
opencode: ['run'],
kimi: ['--print'],
'kimi-code': [],
};
for (const [id, leadingArgs] of Object.entries(expected)) {
const cap = loadCapability(id);
const oe = cap.runtime.orchestratorExec;
assert.deepEqual(oe.args, leadingArgs,
`${id}: orchestratorExec.args must be ${JSON.stringify(leadingArgs)} — an empty/verb-less argv for a ` +
`flag-bound host launches the interactive TUI and the orchestrator waits on it forever`);
const resolved = resolveOrchestratorExec(oe, '/tmp/wt', 'do the thing');
assert.equal(resolved.ok, true, `${id}: must resolve with a prompt`);
assert.ok(resolved.args.includes('do the thing'),
`${id}: the executor prompt must reach the argv, else the spawned process has no instruction`);
}
});
test('kimi and kimi-code both spawn the "kimi" binary — kimi-code is a package name, not a binary', () => {
// Moonshot ships both agents as a binary named `kimi`; `kimi-code` is the
// npm package / config-home name only. Declaring command:"kimi-code" is an
// immediate ENOENT at spawn.
for (const id of ['kimi', 'kimi-code']) {
assert.equal(loadCapability(id).runtime.orchestratorExec.command, 'kimi',
`${id}: orchestratorExec.command must be the real binary name "kimi"`);
}
});
test('every capability whose dispatch.isolation is "harness-worktree" declares a non-empty harnessIsolationFlag', () => {
const capIds = fs.readdirSync(CAPABILITIES_DIR).filter((entry) => (
fs.existsSync(path.join(CAPABILITIES_DIR, entry, 'capability.json'))
));
const harnessHosts = [];
for (const id of capIds) {
const cap = loadCapability(id);
const iso = cap?.runtime?.hostIntegration?.dispatch?.isolation;
if (iso !== 'harness-worktree') continue;
harnessHosts.push(id);
const flag = cap.runtime.harnessIsolationFlag;
assert.ok(
typeof flag === 'string' && flag.length > 0,
`${id}: dispatch.isolation:"harness-worktree" but no runtime.harnessIsolationFlag — the scheduler ` +
`would have nothing to pass and would dispatch UNISOLATED executors believing they are isolated`,
);
}
assert.deepEqual(harnessHosts.sort(), ['claude', 'cursor']);
});
test('no capability declares BOTH isolation mechanisms (they are mutually exclusive models)', () => {
const capIds = fs.readdirSync(CAPABILITIES_DIR).filter((entry) => (
fs.existsSync(path.join(CAPABILITIES_DIR, entry, 'capability.json'))
));
for (const id of capIds) {
const cap = loadCapability(id);
const hasHarness = typeof cap?.runtime?.harnessIsolationFlag === 'string';
const hasOrchestrator = cap?.runtime?.orchestratorExec !== undefined;
assert.ok(!(hasHarness && hasOrchestrator),
`${id}: declares both harnessIsolationFlag and orchestratorExec — a host has exactly one fan-out model`);
}
});
});
describe('#2584 orchestratorExec — validator', () => {
@@ -1615,3 +1836,101 @@ describe('#2584 orchestratorExec — validator', () => {
}
});
});
// ---------------------------------------------------------------------------
// #2627 Phase 3 — the `dispatch-isolation` CLI route.
//
// Behavioral: each case SPAWNS the real gsd-tools CLI and asserts on its actual
// stdout, rather than inspecting the route's source. This is the scheduler
// consumer's only entry point — execute-phase branches on exactly this output.
// ---------------------------------------------------------------------------
describe('#2627 dispatch-isolation CLI route', () => {
const { execFileSync } = require('node:child_process');
const GSD_TOOLS = path.join(REPO_ROOT, 'gsd-core', 'bin', 'gsd-tools.cjs');
function query(runtimeId, extraArgs = []) {
return execFileSync(
process.execPath,
[GSD_TOOLS, 'query', 'dispatch-isolation', ...extraArgs],
{ cwd: REPO_ROOT, encoding: 'utf8', env: { ...process.env, GSD_RUNTIME: runtimeId } },
);
}
const queryJson = (runtimeId, extraArgs = []) => JSON.parse(query(runtimeId, ['--json', ...extraArgs]));
test('raw output is the bare negotiated value for each isolation model', () => {
assert.equal(query('claude').trim(), 'harness-worktree');
assert.equal(query('codex').trim(), 'orchestrator-worktree');
assert.equal(query('pi').trim(), 'none');
});
test('an undocumented isolation declaration degrades to none (fail-closed)', () => {
// cline declares isolation:"undocumented" — the corpus-wide sentinel.
assert.equal(query('cline').trim(), 'none');
});
test('an unknown runtime degrades to none rather than erroring', () => {
assert.equal(query('no-such-runtime-xyz').trim(), 'none');
});
test('harness-worktree surfaces the host\'s declared flag, and no exec', () => {
const claude = queryJson('claude');
assert.equal(claude.isolation, 'harness-worktree');
assert.equal(claude.harnessFlag, 'isolation="worktree"');
assert.equal(claude.exec, null, 'GSD runs no git on the harness path — there is nothing to spawn');
assert.equal(queryJson('cursor').harnessFlag, '--worktree');
});
test('orchestrator-worktree yields exec only when a cwd target is supplied', () => {
assert.equal(queryJson('codex').exec, null, 'no --cwd-target → nothing to bind');
const withTarget = queryJson('codex', ['--cwd-target', '/tmp/wt', '--prompt', 'do the thing']);
assert.equal(withTarget.isolation, 'orchestrator-worktree');
assert.equal(withTarget.exec.command, 'codex');
assert.deepEqual(withTarget.exec.args, ['exec', '--cd', '/tmp/wt', 'do the thing']);
assert.equal(withTarget.exec.cwd, '/tmp/wt');
assert.equal(withTarget.harnessFlag, null);
});
test('each orchestrator-worktree host resolves to its own documented argv shape', () => {
const args = (id) => queryJson(id, ['--cwd-target', '/tmp/wt', '--prompt', 'P']).exec.args;
assert.deepEqual(args('opencode'), ['run', '--dir', '/tmp/wt', 'P']);
// kimi carries the prompt behind --prompt (its --print mode requires it),
// unlike codex/opencode which take it positionally.
assert.deepEqual(args('kimi'), ['--print', '--work-dir', '/tmp/wt', '--prompt', 'P']);
// kimi-code binds by process cwd — no flag in argv, but cwd still returned.
assert.deepEqual(args('kimi-code'), ['--prompt', 'P']);
assert.equal(queryJson('kimi-code', ['--cwd-target', '/tmp/wt', '--prompt', 'P']).exec.cwd, '/tmp/wt');
});
test('a cwd target with no prompt still resolves (prompt is optional at this seam)', () => {
const noPrompt = queryJson('codex', ['--cwd-target', '/tmp/wt']);
assert.equal(noPrompt.isolation, 'orchestrator-worktree');
assert.deepEqual(noPrompt.exec.args, ['exec', '--cd', '/tmp/wt']);
});
test('the route never reports an isolation model it cannot actually service', () => {
// The invariant the scheduler depends on: if isolation is non-none, the
// corresponding mechanism is present. Anything else would have the wave
// create a worktree and then discover it has nothing to spawn into it.
for (const id of ['claude', 'cursor', 'codex', 'opencode', 'kimi', 'kimi-code', 'pi', 'cline', 'zcode']) {
const r = queryJson(id, ['--cwd-target', '/tmp/wt', '--prompt', 'P']);
if (r.isolation === 'harness-worktree') {
assert.ok(r.harnessFlag && r.harnessFlag.length > 0, `${id}: harness-worktree without a flag`);
} else if (r.isolation === 'orchestrator-worktree') {
assert.ok(r.exec && r.exec.command, `${id}: orchestrator-worktree without a spawnable exec`);
} else {
assert.equal(r.isolation, 'none', `${id}: unexpected isolation value ${r.isolation}`);
assert.equal(r.exec, null);
assert.equal(r.harnessFlag, null);
}
}
});
test('a none-isolation host never yields an exec even when a target is supplied', () => {
const pi = queryJson('pi', ['--cwd-target', '/tmp/wt', '--prompt', 'P']);
assert.equal(pi.isolation, 'none');
assert.equal(pi.exec, null);
assert.equal(pi.harnessFlag, null);
});
});

View File

@@ -1182,7 +1182,12 @@ test('property: _stampNonClaudeRuntimeDefaults is idempotent (#1521)', () => {
test('execute-phase.md, quick.md, and diagnose-issues.md guards are generalized to != "claude" (not Codex-specific) (#1521)', () => {
// allow-test-rule: emitted workflow runtime-resolution shell block is the runtime contract surface (#1521)
const GUARD_WORKFLOWS = ['execute-phase.md', 'quick.md', 'diagnose-issues.md'];
// #2584 Phase 3 (#2627): execute-phase.md graduated PAST the `!= "claude"`
// guard — worktree isolation there is now keyed on the negotiated
// `dispatch.isolation` capability, so no runtime name appears in its guard at
// all. quick.md and diagnose-issues.md still use the #1521 generalized form
// (they do not negotiate isolation), so they keep asserting it.
const GUARD_WORKFLOWS = ['quick.md', 'diagnose-issues.md'];
for (const wf of GUARD_WORKFLOWS) {
const src = fs.readFileSync(
path.join(__dirname, '..', 'gsd-core', 'workflows', wf),
@@ -1197,6 +1202,20 @@ test('execute-phase.md, quick.md, and diagnose-issues.md guards are generalized
`${wf}: found Codex-specific guard — should have been generalized to != "claude"`,
);
}
// execute-phase.md: the guard must be capability-keyed, with NO runtime name.
const executePhase = fs.readFileSync(
path.join(__dirname, '..', 'gsd-core', 'workflows', 'execute-phase.md'),
'utf8',
);
assert.ok(
!/\[\s*"\$RUNTIME"\s*(?:!=|=)\s*"[a-z-]+"\s*\]\s*&&\s*\[\s*"\$USE_WORKTREES"/.test(executePhase),
'execute-phase.md: worktree isolation must branch on dispatch.isolation, not on a runtime name (#2584)',
);
assert.ok(
executePhase.includes('Resolve ISOLATION'),
'execute-phase.md: must resolve the negotiated ISOLATION capability',
);
});
// ---------------------------------------------------------------------------

View File

@@ -24,7 +24,7 @@
"docs-update.md": 56494,
"edit-phase.md": 12927,
"eval-review.md": 10332,
"execute-phase.md": 93277,
"execute-phase.md": 93263,
"execute-plan.md": 35143,
"explore.md": 11127,
"extract-learnings.md": 12893,

View File

@@ -1330,6 +1330,77 @@ describe('cmdWorktreeCreate', () => {
assert.match(out.join(''), /"ok": true/);
});
// #2627 Phase 3: --root confines the created worktree. Absent the flag the
// behavior is exactly Phase 2's (every test above passes unchanged); the
// orchestrator-worktree scheduler path always passes it, because Phase 3 is
// what starts SPAWNING processes into these directories.
describe('--root confinement', () => {
const rootedArgs = (wtPath, root) => [
'--manifest', 'manifest.json',
'--agent-id', 'a1',
'--path', wtPath,
'--branch', 'worktree-agent-a1',
'--base', 'abc123',
'--root', root,
];
function run(args) {
const out = [];
let gitCalled = false;
const result = withExitCode(() => cmdWorktreeCreate('/repo/main', args, {
readFile: () => '{"orchestrator_root":"/repo/main","worktrees":[]}',
writeFile: () => {},
write: (s) => out.push(s),
writeErr: () => {},
execGit: () => { gitCalled = true; return { exitCode: 0, stdout: '', stderr: '', timedOut: false }; },
}));
return { result, out: out.join(''), gitCalled };
}
test('a path inside --root is accepted', () => {
const { result } = run(rootedArgs('/repo/main/.claude/worktrees/agent-a1', '/repo/main'));
assert.equal(result.ok, true);
assert.equal(result.reason, 'created');
});
test('a sibling path OUTSIDE --root is rejected before any git runs', () => {
const { result, gitCalled } = run(rootedArgs('/repo/.claude/worktrees/agent-a1', '/repo/main'));
assert.equal(result.ok, false);
assert.equal(result.reason, 'path_outside_root');
assert.equal(gitCalled, false, 'confinement must reject BEFORE the git side effect');
});
test('an arbitrary absolute path is rejected (the hole a ".."-segment check cannot see)', () => {
const { result } = run(rootedArgs('/etc/gsd-evil', '/repo/main'));
assert.equal(result.ok, false);
assert.equal(result.reason, 'path_outside_root');
});
test('a path EQUAL to --root is rejected (would clobber the checkout)', () => {
const { result } = run(rootedArgs('/repo/main', '/repo/main'));
assert.equal(result.ok, false);
assert.equal(result.reason, 'path_outside_root');
});
test('a sibling whose name merely PREFIXES the root is rejected (not a substring check)', () => {
// '/repo/main-evil' starts with '/repo/main' textually but is not inside it.
const { result } = run(rootedArgs('/repo/main-evil/wt', '/repo/main'));
assert.equal(result.ok, false);
assert.equal(result.reason, 'path_outside_root');
});
test('omitting --root preserves Phase-2 behavior (no confinement)', () => {
const { result } = run([
'--manifest', 'manifest.json',
'--agent-id', 'a1',
'--path', '/repo/.claude/worktrees/agent-a1',
'--branch', 'worktree-agent-a1',
'--base', 'abc123',
]);
assert.equal(result.ok, true, 'no --root → unchanged Phase-2 acceptance');
});
});
test('boundary: appending to a manifest with 1 existing entry yields 2', () => {
let writtenContent = null;
const result = cmdWorktreeCreate('/repo/main', okArgs, {
@@ -2841,16 +2912,27 @@ describe('bug-3707: startup orphan sweep is wired into workflow entry points', (
);
});
test('execute-phase.md calls worktree.reap-orphans at startup when USE_WORKTREES is not false', () => {
const content = fs.readFileSync(EXECUTE_PHASE_PATH, 'utf8');
test('execute-phase.md calls worktree.reap-orphans at startup, guarded by the isolation decision', () => {
// #2584 Phase 3 (#2627): the startup sweep moved into the isolation-dispatch
// fragment alongside the ISOLATION resolution it is guarded by (the host
// workflow keeps only a pointer, per the ADR-857 byte budget). The guard is
// now `ISOLATION != none`, which USE_WORKTREES=false forces — so the #3707
// protection is unchanged, just keyed one level up.
const ISOLATION_FRAGMENT_PATH = path.join(
__dirname, '..', 'gsd-core', 'workflows', 'execute-phase', 'steps', 'executor-isolation-dispatch.md',
);
const content = fs.readFileSync(EXECUTE_PHASE_PATH, 'utf8')
+ fs.readFileSync(ISOLATION_FRAGMENT_PATH, 'utf8');
assert.ok(
content.includes('worktree.reap-orphans'),
'execute-phase.md must call gsd-sdk query worktree.reap-orphans at startup'
'execute-phase must call gsd-sdk query worktree.reap-orphans at startup'
);
assert.ok(
/USE_WORKTREES.*!=.*false[\s\S]{0,200}worktree\.reap-orphans/m.test(content) ||
/worktree\.reap-orphans[\s\S]{0,200}USE_WORKTREES.*!=.*false/m.test(content),
'execute-phase.md startup sweep must be guarded by USE_WORKTREES != false'
/worktree\.reap-orphans[\s\S]{0,200}USE_WORKTREES.*!=.*false/m.test(content) ||
/ISOLATION.*!=.*none[\s\S]{0,200}worktree\.reap-orphans/m.test(content) ||
/worktree\.reap-orphans[\s\S]{0,200}ISOLATION.*!=.*none/m.test(content),
'execute-phase startup sweep must be guarded by USE_WORKTREES != false or ISOLATION != none'
);
});