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:
@@ -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');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
149
tests/fixtures/golden-install-parity/codex.json
vendored
149
tests/fixtures/golden-install-parity/codex.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
7
tests/fixtures/golden-install-parity/pi.json
vendored
7
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/antigravity.json
vendored
1
tests/fixtures/install-tree/antigravity.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/augment.json
vendored
1
tests/fixtures/install-tree/augment.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/claude.json
vendored
1
tests/fixtures/install-tree/claude.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/cline.json
vendored
1
tests/fixtures/install-tree/cline.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/codebuddy.json
vendored
1
tests/fixtures/install-tree/codebuddy.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/codex.json
vendored
1
tests/fixtures/install-tree/codex.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/copilot.json
vendored
1
tests/fixtures/install-tree/copilot.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/cursor.json
vendored
1
tests/fixtures/install-tree/cursor.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/hermes.json
vendored
1
tests/fixtures/install-tree/hermes.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/kilo.json
vendored
1
tests/fixtures/install-tree/kilo.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/kimi-code.json
vendored
1
tests/fixtures/install-tree/kimi-code.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/kimi.json
vendored
1
tests/fixtures/install-tree/kimi.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/opencode.json
vendored
1
tests/fixtures/install-tree/opencode.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/pi.json
vendored
1
tests/fixtures/install-tree/pi.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/qwen.json
vendored
1
tests/fixtures/install-tree/qwen.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/trae.json
vendored
1
tests/fixtures/install-tree/trae.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/windsurf.json
vendored
1
tests/fixtures/install-tree/windsurf.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/zcode.json
vendored
1
tests/fixtures/install-tree/zcode.json
vendored
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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',
|
||||
);
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user