fix(#1863): use named flags for state.* calls in executor + workflows (#1873)

* fix(#1863): use named flags for state.* calls in executor + workflows

The named-only state-command router (parseNamedArgs) silently drops
positional args, so state.cjs threw its required-arg error and
metrics/decisions/blockers/session continuity were never recorded.

Convert record-metric / add-decision / add-blocker / record-session in
agents/gsd-executor.md to the named-flag form (mirroring execute-plan.md),
and fix the two remaining positional record-session calls in
gsd-core/workflows/milestone-summary.md and forensics.md. Recapture the
golden-install-parity fixtures and size baselines for the edited files.

Also fix a pre-existing detached-rebuild handle leak in
tests/graphify-auto-update.slow.test.cjs: three dispatch tests returned
after observing only the synchronous "running" status without awaiting the
detached rebuild's terminal state. That leak was latent until the new
#1863 regression block's added runtime shifted --test-force-exit timing
and surfaced it as a non-zero chunk exit. The three tests now await
terminal status via the file's existing waitForBuildStatus helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(#1863): add changeset

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
This commit is contained in:
Behruz Nassre Esfahani
2026-07-02 10:01:10 -07:00
committed by GitHub
parent 8751379cfc
commit 7bef6a6496
24 changed files with 154 additions and 68 deletions

View File

@@ -0,0 +1,5 @@
---
type: Fixed
pr: 1873
---
Executor and milestone-summary/forensics workflows now call state.* commands with named flags so the named-only router records metrics, decisions, blockers, and session continuity instead of silently dropping positional args.

View File

@@ -691,7 +691,7 @@ Do NOT skip. Do NOT proceed to state updates if self-check fails.
</self_check>
<state_updates>
After SUMMARY.md, update STATE.md using `gsd-tools query` state handlers (positional args; see `sdk/src/query/QUERY-HANDLERS.md`):
After SUMMARY.md, update STATE.md using `gsd-tools query` state handlers (named flags; see `sdk/src/query/QUERY-HANDLERS.md`):
```bash
# Advance plan counter (handles edge cases automatically)
@@ -702,16 +702,17 @@ gsd_run query state.update-progress
# Record execution metrics (phase, plan, duration, tasks, files)
gsd_run query state.record-metric \
"${PHASE}" "${PLAN}" "${DURATION}" "${TASK_COUNT}" "${FILE_COUNT}"
--phase "${PHASE}" --plan "${PLAN}" --duration "${DURATION}" \
--tasks "${TASK_COUNT}" --files "${FILE_COUNT}"
# Add decisions (extract from SUMMARY.md key-decisions)
for decision in "${DECISIONS[@]}"; do
gsd_run query state.add-decision "${decision}"
gsd_run query state.add-decision --summary "${decision}"
done
# Update session info (timestamp, stopped-at, resume-file)
# Update session info (stopped-at, resume-file; timestamp set automatically)
gsd_run query state.record-session \
"" "Completed ${PHASE}-${PLAN}-PLAN.md" "None"
--stopped-at "Completed ${PHASE}-${PLAN}-PLAN.md" --resume-file "None"
```
```bash
@@ -738,7 +739,7 @@ gsd_run query requirements.mark-complete ${REQ_IDS}
**For blockers found during execution:**
```bash
gsd_run query state.add-blocker "Blocker description"
gsd_run query state.add-blocker --text "Blocker description"
```
</state_updates>

View File

@@ -273,7 +273,7 @@ gh issue create \
```bash
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
gsd_run query state.record-session "" \
"Forensic investigation complete" \
".planning/forensics/report-{timestamp}.md"
gsd_run query state.record-session \
--stopped-at "Forensic investigation complete" \
--resume-file ".planning/forensics/report-{timestamp}.md"
```

View File

@@ -218,7 +218,7 @@ If the user is done:
## Step 9: Update STATE.md
```bash
gsd_run query state.record-session "" \
"Milestone v${VERSION} summary generated" \
".planning/reports/MILESTONE_SUMMARY-v${VERSION}.md"
gsd_run query state.record-session \
--stopped-at "Milestone v${VERSION} summary generated" \
--resume-file ".planning/reports/MILESTONE_SUMMARY-v${VERSION}.md"
```

View File

@@ -14,7 +14,7 @@
"gsd-domain-researcher.md": 6998,
"gsd-eval-auditor.md": 12452,
"gsd-eval-planner.md": 7008,
"gsd-executor.md": 43433,
"gsd-executor.md": 43534,
"gsd-framework-selector.md": 6778,
"gsd-integration-checker.md": 15238,
"gsd-intel-updater.md": 18122,

View File

@@ -31,3 +31,68 @@ describe('gsd-executor — MVP+TDD gate section', () => {
assert.ok(fs.existsSync(REF), `${REF} must exist`);
});
});
describe('gsd-executor — state.* calls use the named-only router form (#1863 regression)', () => {
// The runtime state-command router (gsd-core/bin/lib/state-command-router.cjs)
// parses record-metric / add-decision / add-blocker / record-session named-only
// via parseNamedArgs. Positional values are silently dropped, so state.cjs then
// throws its required-arg error and metrics/decisions/blockers/session continuity
// are never recorded. Each invocation in the executor agent must therefore pass
// the named flags the router expects (mirrors gsd-core/workflows/execute-plan.md).
const content = fs.readFileSync(AGENT, 'utf-8');
// Capture a `gsd_run query state.<cmd> ...` invocation, including backslash-continued lines.
function invocation(cmd) {
const re = new RegExp(String.raw`gsd_run query state\.${cmd}\b(?:[^\r\n]*\\\r?\n)*[^\r\n]*`);
const m = content.match(re);
assert.ok(m, `executor must invoke state.${cmd}`);
return m[0];
}
test('record-metric passes --phase/--plan/--duration/--tasks/--files', () => {
const call = invocation('record-metric');
for (const flag of ['--phase', '--plan', '--duration', '--tasks', '--files']) {
assert.ok(call.includes(flag), `record-metric must pass ${flag}, got:\n${call}`);
}
});
test('add-decision passes --summary (or --summary-file)', () => {
assert.match(invocation('add-decision'), /--summary(?:-file)?\b/);
});
test('add-blocker passes --text (or --text-file)', () => {
assert.match(invocation('add-blocker'), /--text(?:-file)?\b/);
});
test('record-session passes --stopped-at and --resume-file', () => {
const call = invocation('record-session');
assert.ok(call.includes('--stopped-at'), 'record-session must pass --stopped-at');
assert.ok(call.includes('--resume-file'), 'record-session must pass --resume-file');
});
test('no state.* call leads with a bare positional (quoted) value — the #1863 bug', () => {
// Buggy multi-line form: `state.<cmd> \` then a line whose first token is a quote.
const continued = /state\.(?:record-metric|add-decision|add-blocker|record-session)\b[^\r\n]*\\\r?\n\s*"/;
assert.ok(!continued.test(content),
'state.* calls must lead with --flags, not a positional quoted value on the next line');
// Buggy same-line form: `state.<cmd> "..."`
const inline = /state\.(?:record-metric|add-decision|add-blocker|record-session)\s+"/;
assert.ok(!inline.test(content),
'state.* calls must not pass a positional value immediately after the command');
});
test('sibling workflow record-session calls also use named flags (#1863 completeness)', () => {
// The same named-only router backs milestone-summary.md and forensics.md; both
// previously passed record-session positionally (`"" "stopped-at" "resume-file"`),
// silently dropping the values. Guard them alongside the executor.
for (const rel of ['gsd-core/workflows/milestone-summary.md', 'gsd-core/workflows/forensics.md']) {
const wf = fs.readFileSync(path.join(__dirname, '..', rel), 'utf-8');
const m = wf.match(/gsd_run query state\.record-session\b(?:[^\r\n]*\\\r?\n)*[^\r\n]*/);
assert.ok(m, `${rel} must invoke state.record-session`);
assert.ok(m[0].includes('--stopped-at') && m[0].includes('--resume-file'),
`${rel} record-session must use --stopped-at/--resume-file, got:\n${m[0]}`);
assert.ok(!/state\.record-session\s+"/.test(wf),
`${rel} record-session must not lead with a positional value`);
}
});
});

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "1db46cac3f4d9889",
"agents/gsd-eval-auditor.md": "62560f29308426d9",
"agents/gsd-eval-planner.md": "3d10fd11147f6857",
"agents/gsd-executor.md": "fc8279d68ee0acd8",
"agents/gsd-executor.md": "d7dedecb2206d678",
"agents/gsd-framework-selector.md": "daa62c79619c76bf",
"agents/gsd-integration-checker.md": "0643cd2d779b131c",
"agents/gsd-intel-updater.md": "c2a053ffbe79cc74",
@@ -237,7 +237,7 @@
"gsd-core/workflows/explore.md": "d9593c9f00250e53",
"gsd-core/workflows/extract-learnings.md": "caa2ff0160b6ed9c",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "c32971f6b9d61ed8",
"gsd-core/workflows/forensics.md": "3ebc3a7f48132e04",
"gsd-core/workflows/graduation.md": "b401418dfea2b0f5",
"gsd-core/workflows/health.md": "3ab04acb14942ddd",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -254,7 +254,7 @@
"gsd-core/workflows/list-workspaces.md": "69aa6dcd8f63bb8a",
"gsd-core/workflows/manager.md": "187e2df237bcf418",
"gsd-core/workflows/map-codebase.md": "ea0ad99dd10c3d1c",
"gsd-core/workflows/milestone-summary.md": "6af78ebf0ba7546b",
"gsd-core/workflows/milestone-summary.md": "d442c6719944f276",
"gsd-core/workflows/mvp-phase.md": "cd39027462579233",
"gsd-core/workflows/new-milestone.md": "f13199a8e199298f",
"gsd-core/workflows/new-project.md": "b8dc0226e885ea9c",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "671c9ea949889c4a",
"agents/gsd-eval-auditor.md": "cd2a5727472ad0ab",
"agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3",
"agents/gsd-executor.md": "89962f48c322e4b1",
"agents/gsd-executor.md": "87c499f939e30049",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "fa53e2d78be1de74",
"agents/gsd-intel-updater.md": "f8ac501c61557a17",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/forensics.md": "b4bde768fd27a982",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "23d2135a555e95df",
"gsd-core/workflows/new-project.md": "e6855b300fcac71e",

View File

@@ -15,7 +15,7 @@
"agents/gsd-domain-researcher.md": "f8be56555689a970",
"agents/gsd-eval-auditor.md": "88be0494a906eda5",
"agents/gsd-eval-planner.md": "112f6730f23854e3",
"agents/gsd-executor.md": "426f3d410f619c23",
"agents/gsd-executor.md": "50b737a811d0a334",
"agents/gsd-framework-selector.md": "c350ee693cb1aa4e",
"agents/gsd-integration-checker.md": "c8b4e65dee89c8ea",
"agents/gsd-intel-updater.md": "9fadfebd08f15244",
@@ -236,7 +236,7 @@
"gsd-core/workflows/explore.md": "aee57d95497ca50a",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "d0f079d1bcf924c3",
"gsd-core/workflows/forensics.md": "ec9dc257272a6980",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "9fd7fe8c7c99b0db",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -253,7 +253,7 @@
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "c0b571445b452f2b",
"gsd-core/workflows/map-codebase.md": "27c356aa00fb022a",
"gsd-core/workflows/milestone-summary.md": "5bf68a980d8b5590",
"gsd-core/workflows/milestone-summary.md": "e7692ea6a9ca3653",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "7c957068b523ff47",
"gsd-core/workflows/new-project.md": "4184d47a8797dd4e",

View File

@@ -19,7 +19,7 @@
"agents/gsd-domain-researcher.md": "0fecdaea86466a56",
"agents/gsd-eval-auditor.md": "90b5d1909977df61",
"agents/gsd-eval-planner.md": "3ddea88a69b4da3f",
"agents/gsd-executor.md": "765e9764af71bcda",
"agents/gsd-executor.md": "806bdb1313ead84d",
"agents/gsd-framework-selector.md": "564669d479433f15",
"agents/gsd-integration-checker.md": "1bbbdd3d420b994e",
"agents/gsd-intel-updater.md": "b084fd8df5f13f2a",
@@ -240,7 +240,7 @@
"gsd-core/workflows/explore.md": "28856a6b0198064b",
"gsd-core/workflows/extract-learnings.md": "b649ff8ecff388c1",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "2478dc912608126f",
"gsd-core/workflows/forensics.md": "9de19e3792169aa3",
"gsd-core/workflows/graduation.md": "ca7fa951a963d84b",
"gsd-core/workflows/health.md": "295e170806820a94",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -257,7 +257,7 @@
"gsd-core/workflows/list-workspaces.md": "e2d7ee5e70395c1d",
"gsd-core/workflows/manager.md": "3ae982361d3cbb06",
"gsd-core/workflows/map-codebase.md": "893f13a40162ce23",
"gsd-core/workflows/milestone-summary.md": "dd87dcdecb0b069d",
"gsd-core/workflows/milestone-summary.md": "04427b0abe11968d",
"gsd-core/workflows/mvp-phase.md": "e6a902c3308345f2",
"gsd-core/workflows/new-milestone.md": "2804d6f976923412",
"gsd-core/workflows/new-project.md": "f5799451fb7c1983",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "1c1a800108a2b225",
"agents/gsd-eval-auditor.md": "3d3e9336c01e90fe",
"agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe",
"agents/gsd-executor.md": "0ccab15e5ef8f0be",
"agents/gsd-executor.md": "a5041170a536bebd",
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
"agents/gsd-integration-checker.md": "2d8339790bbb2dc3",
"agents/gsd-intel-updater.md": "ec317a56d4abc4d3",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/forensics.md": "b4bde768fd27a982",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "23d2135a555e95df",
"gsd-core/workflows/new-project.md": "2fa5ddc0fe749b28",

View File

@@ -31,8 +31,8 @@
"agents/gsd-eval-auditor.toml": "531377421cf4f8f8",
"agents/gsd-eval-planner.md": "73f2ad2ff2797a51",
"agents/gsd-eval-planner.toml": "09468ad1a34ac468",
"agents/gsd-executor.md": "02615587b68428f2",
"agents/gsd-executor.toml": "ff4c05dd572de82b",
"agents/gsd-executor.md": "79d169658b54851c",
"agents/gsd-executor.toml": "410f786fed366ab8",
"agents/gsd-framework-selector.md": "ebae32430887d2e0",
"agents/gsd-framework-selector.toml": "637e4e021b7ec380",
"agents/gsd-integration-checker.md": "9cc875676cf7d741",
@@ -272,7 +272,7 @@
"gsd-core/workflows/explore.md": "a75d42453e639a5d",
"gsd-core/workflows/extract-learnings.md": "89145eb423bbbef2",
"gsd-core/workflows/fast.md": "13252d545947354d",
"gsd-core/workflows/forensics.md": "3db077a229e1ca88",
"gsd-core/workflows/forensics.md": "bf6a31b2a3ec2268",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e9fe7c29fc41a887",
"gsd-core/workflows/help.md": "08e1349950c5602a",
@@ -289,7 +289,7 @@
"gsd-core/workflows/list-workspaces.md": "7fbeaf65ce9890f5",
"gsd-core/workflows/manager.md": "4def33941b0e7d57",
"gsd-core/workflows/map-codebase.md": "320d5bfc9df29013",
"gsd-core/workflows/milestone-summary.md": "121ecb40504caf10",
"gsd-core/workflows/milestone-summary.md": "77d76610d1c98014",
"gsd-core/workflows/mvp-phase.md": "9a9b8b58d59a893f",
"gsd-core/workflows/new-milestone.md": "e7329ba10b6d8182",
"gsd-core/workflows/new-project.md": "f69c90cee1d7952d",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.agent.md": "b06738b093df1cb9",
"agents/gsd-eval-auditor.agent.md": "b30590bbf86d755d",
"agents/gsd-eval-planner.agent.md": "14751876fc2b5f16",
"agents/gsd-executor.agent.md": "e7a796fd01443ad6",
"agents/gsd-executor.agent.md": "a6ddc10ef4ebb245",
"agents/gsd-framework-selector.agent.md": "cafeec0b3489be45",
"agents/gsd-integration-checker.agent.md": "30439b804927acc7",
"agents/gsd-intel-updater.agent.md": "21ea4bd0bb45cc2f",
@@ -238,7 +238,7 @@
"gsd-core/workflows/explore.md": "072bcf510734657b",
"gsd-core/workflows/extract-learnings.md": "83d19c1c9f87f797",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "54e9996cd7bcc05d",
"gsd-core/workflows/forensics.md": "6b0e23f4dc04dbf9",
"gsd-core/workflows/graduation.md": "e64a735e71c39307",
"gsd-core/workflows/health.md": "56d1a87cf530c9a8",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -255,7 +255,7 @@
"gsd-core/workflows/list-workspaces.md": "e8e224465d78e733",
"gsd-core/workflows/manager.md": "c4eac43acf69d7fd",
"gsd-core/workflows/map-codebase.md": "576d06b03edff8db",
"gsd-core/workflows/milestone-summary.md": "20d93b795568d970",
"gsd-core/workflows/milestone-summary.md": "a77da1477b8df866",
"gsd-core/workflows/mvp-phase.md": "803ddbd575f86311",
"gsd-core/workflows/new-milestone.md": "4e252aa59b46d88f",
"gsd-core/workflows/new-project.md": "d0af61f0e5f99485",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
"agents/gsd-eval-auditor.md": "4910c64c0c2d14d5",
"agents/gsd-eval-planner.md": "2049dac060d00eda",
"agents/gsd-executor.md": "b9c28781b6ed98ac",
"agents/gsd-executor.md": "6f810a5779d41661",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "5da30584d06b878c",
"agents/gsd-intel-updater.md": "7f509a2fb5acb0fe",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "aee57d95497ca50a",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "063dd4fe9eb8de15",
"gsd-core/workflows/forensics.md": "7ab53bb7de12d655",
"gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43",
"gsd-core/workflows/health.md": "b53e17edbf70ff96",
"gsd-core/workflows/help.md": "08e1349950c5602a",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "cf0f01254eabfec7",
"gsd-core/workflows/map-codebase.md": "d43dffe5098a8684",
"gsd-core/workflows/milestone-summary.md": "40e3049e42ecde63",
"gsd-core/workflows/milestone-summary.md": "2cc908a8e87df942",
"gsd-core/workflows/mvp-phase.md": "542d898e0e9b928f",
"gsd-core/workflows/new-milestone.md": "514a66fe7d07c0f3",
"gsd-core/workflows/new-project.md": "559e93f61313311b",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "ba1b6b24e2f8a952",
"agents/gsd-eval-auditor.md": "115214236cd73d96",
"agents/gsd-eval-planner.md": "ad757b253472269e",
"agents/gsd-executor.md": "da7adfe75afc5d1c",
"agents/gsd-executor.md": "5d9338bcfe37fc6a",
"agents/gsd-framework-selector.md": "1254f9adc2e95e4b",
"agents/gsd-integration-checker.md": "e337990c0a4117b1",
"agents/gsd-intel-updater.md": "3111fd1028d155b5",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/forensics.md": "b4bde768fd27a982",
"gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43",
"gsd-core/workflows/health.md": "ae213b0d090641a2",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "0409cb5e3859964f",
"gsd-core/workflows/manager.md": "fd5816b3fc7a68de",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a",
"gsd-core/workflows/mvp-phase.md": "6cb2d9d97bd239b3",
"gsd-core/workflows/new-milestone.md": "86959fbb6f5e8893",
"gsd-core/workflows/new-project.md": "72b2c17e9f9cb79d",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "d4c07520f650ffd5",
"agents/gsd-eval-auditor.md": "254220230f69ac46",
"agents/gsd-eval-planner.md": "03448fc9c5774b56",
"agents/gsd-executor.md": "d9191c634ec67129",
"agents/gsd-executor.md": "ddc4b274f05f59d0",
"agents/gsd-framework-selector.md": "ea9981d65d6b3429",
"agents/gsd-integration-checker.md": "35b4f2969d279871",
"agents/gsd-intel-updater.md": "03e143f85ab105ed",
@@ -237,7 +237,7 @@
"gsd-core/workflows/explore.md": "1c0f3ced293df114",
"gsd-core/workflows/extract-learnings.md": "c6cfb696d3bb51c7",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "b381b789a871507d",
"gsd-core/workflows/forensics.md": "1362bc42a2928d79",
"gsd-core/workflows/graduation.md": "1fb19f28634dd55a",
"gsd-core/workflows/health.md": "32c1276656602ccb",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -254,7 +254,7 @@
"gsd-core/workflows/list-workspaces.md": "d3726de6b2eb40b4",
"gsd-core/workflows/manager.md": "c8690740c613f1a5",
"gsd-core/workflows/map-codebase.md": "23fae66ceef58e1c",
"gsd-core/workflows/milestone-summary.md": "5cc04210fea41834",
"gsd-core/workflows/milestone-summary.md": "d7ac63499e3e5c1a",
"gsd-core/workflows/mvp-phase.md": "5ce3c326ef0f6e27",
"gsd-core/workflows/new-milestone.md": "97750332c52a9ef7",
"gsd-core/workflows/new-project.md": "40c94cfb81bde99b",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "a3874d80bcbc7380",
"agents/gsd-eval-auditor.md": "d8c45cef7ddf4360",
"agents/gsd-eval-planner.md": "3db12cde12aeb2c1",
"agents/gsd-executor.md": "a0433cb715722dd5",
"agents/gsd-executor.md": "7f18fa638ef50584",
"agents/gsd-framework-selector.md": "ad5f2c6b9bec6270",
"agents/gsd-integration-checker.md": "c503e2f4a3d8ec05",
"agents/gsd-intel-updater.md": "b8eb72873ded3c14",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "a1aa05e598caf7e3",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "d0f079d1bcf924c3",
"gsd-core/workflows/forensics.md": "ec9dc257272a6980",
"gsd-core/workflows/graduation.md": "fc01dc810d4845f8",
"gsd-core/workflows/health.md": "955d5ebacd5740e6",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "bedfe8a2a48a9605",
"gsd-core/workflows/map-codebase.md": "fcc2796ebf8ea2c7",
"gsd-core/workflows/milestone-summary.md": "423287cd509b7774",
"gsd-core/workflows/milestone-summary.md": "93ba0d0005f73c35",
"gsd-core/workflows/mvp-phase.md": "3935c0d9969e3e84",
"gsd-core/workflows/new-milestone.md": "9abdd85c65989620",
"gsd-core/workflows/new-project.md": "0dce9298c090bdb4",

View File

@@ -33,7 +33,7 @@
"agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938",
"agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876",
"agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2",
"agents/subagents/gsd-executor.md": "a1fdc7f4ac29888a",
"agents/subagents/gsd-executor.md": "2cf56de9a48e60f9",
"agents/subagents/gsd-executor.yaml": "e29422986636fd64",
"agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16",
"agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3",
@@ -273,7 +273,7 @@
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/forensics.md": "b4bde768fd27a982",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -290,7 +290,7 @@
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "23d2135a555e95df",
"gsd-core/workflows/new-project.md": "69d356f41ea36aa2",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "71250e759ca9e723",
"agents/gsd-eval-auditor.md": "d9c7034244882d86",
"agents/gsd-eval-planner.md": "60bddb70a937f796",
"agents/gsd-executor.md": "e185b21a5df49e0d",
"agents/gsd-executor.md": "9726bd59fcc09611",
"agents/gsd-framework-selector.md": "1c0a10355e787675",
"agents/gsd-integration-checker.md": "a9de5928e5a5c649",
"agents/gsd-intel-updater.md": "f9ef2797738b7f09",
@@ -306,7 +306,7 @@
"gsd-core/workflows/explore.md": "96ba55f53899a261",
"gsd-core/workflows/extract-learnings.md": "b8851263c2d28702",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "706b3983dd315789",
"gsd-core/workflows/forensics.md": "6ce026e4bc6c875e",
"gsd-core/workflows/graduation.md": "7d03b353a0323cce",
"gsd-core/workflows/health.md": "1fad392ce1aec410",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -323,7 +323,7 @@
"gsd-core/workflows/list-workspaces.md": "74aa5ac3cb9b00bf",
"gsd-core/workflows/manager.md": "e77230eb5a8a1c78",
"gsd-core/workflows/map-codebase.md": "40624186d001658f",
"gsd-core/workflows/milestone-summary.md": "0acae8647e544018",
"gsd-core/workflows/milestone-summary.md": "19cced11010ad8eb",
"gsd-core/workflows/mvp-phase.md": "efeb5d11f5b10e73",
"gsd-core/workflows/new-milestone.md": "08d97dcb66df7776",
"gsd-core/workflows/new-project.md": "d3c0ce0e163d5048",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "d4c07520f650ffd5",
"agents/gsd-eval-auditor.md": "0d3c7822c91197fc",
"agents/gsd-eval-planner.md": "03448fc9c5774b56",
"agents/gsd-executor.md": "068085ceca836fbd",
"agents/gsd-executor.md": "9bda03decabbaa16",
"agents/gsd-framework-selector.md": "ea9981d65d6b3429",
"agents/gsd-integration-checker.md": "33fd537b862eb944",
"agents/gsd-intel-updater.md": "22cc46f64ad4c336",
@@ -237,7 +237,7 @@
"gsd-core/workflows/explore.md": "42f73d9fc38429da",
"gsd-core/workflows/extract-learnings.md": "1d0a3cbf17159316",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "ac80bcbe9bef175f",
"gsd-core/workflows/forensics.md": "0b20c736f1220ee7",
"gsd-core/workflows/graduation.md": "7398492ff69af5e7",
"gsd-core/workflows/health.md": "de79abe3b83a0252",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
@@ -254,7 +254,7 @@
"gsd-core/workflows/list-workspaces.md": "0bda9b42bb5c509b",
"gsd-core/workflows/manager.md": "f2ae9c83a80cc690",
"gsd-core/workflows/map-codebase.md": "8ce1e33f45827202",
"gsd-core/workflows/milestone-summary.md": "886ec00825fb1442",
"gsd-core/workflows/milestone-summary.md": "4135889e51e1e4b5",
"gsd-core/workflows/mvp-phase.md": "b3561a8ab1b26a4c",
"gsd-core/workflows/new-milestone.md": "3f2875618897718b",
"gsd-core/workflows/new-project.md": "6c1440959e637d2d",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "b80f76874c04e515",
"agents/gsd-eval-auditor.md": "96df1d4a9cd553a0",
"agents/gsd-eval-planner.md": "22334fde85723c9d",
"agents/gsd-executor.md": "1c51c3b9547eadd4",
"agents/gsd-executor.md": "546ea45461739438",
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
"agents/gsd-integration-checker.md": "7cd2072984411c7f",
"agents/gsd-intel-updater.md": "2751bbd33912aa1b",
@@ -237,7 +237,7 @@
"gsd-core/workflows/explore.md": "9f24bf678b1ef341",
"gsd-core/workflows/extract-learnings.md": "0e0eead67cec3d28",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "4b38a662876628a2",
"gsd-core/workflows/forensics.md": "96103895b70d652c",
"gsd-core/workflows/graduation.md": "63b74175d5e9cc1e",
"gsd-core/workflows/health.md": "9ddf28b84e1ce089",
"gsd-core/workflows/help.md": "08e1349950c5602a",
@@ -254,7 +254,7 @@
"gsd-core/workflows/list-workspaces.md": "4668ebdc3380a7a6",
"gsd-core/workflows/manager.md": "79a6e4de6654f4e7",
"gsd-core/workflows/map-codebase.md": "f90d0577d254c38e",
"gsd-core/workflows/milestone-summary.md": "b50a5d4369d29978",
"gsd-core/workflows/milestone-summary.md": "feb8305a862a79de",
"gsd-core/workflows/mvp-phase.md": "1d2292f3c444c13d",
"gsd-core/workflows/new-milestone.md": "f69e9ccc51ab956b",
"gsd-core/workflows/new-project.md": "d1a0070ed292c25a",

View File

@@ -16,7 +16,7 @@
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
"agents/gsd-eval-auditor.md": "8a2cab3ae8b4674b",
"agents/gsd-eval-planner.md": "2049dac060d00eda",
"agents/gsd-executor.md": "93ad20ee189e0669",
"agents/gsd-executor.md": "9ab8c4acb4206e09",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "4ffb37fb230c2b90",
"agents/gsd-intel-updater.md": "16ee6795da80a7c0",
@@ -237,7 +237,7 @@
"gsd-core/workflows/explore.md": "7a9bb001b196409f",
"gsd-core/workflows/extract-learnings.md": "58ce8fbc17388788",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "3ec427afe7ab8bb8",
"gsd-core/workflows/forensics.md": "0e933018fd06e629",
"gsd-core/workflows/graduation.md": "5734685667d8f512",
"gsd-core/workflows/health.md": "644b42c215b1b00e",
"gsd-core/workflows/help.md": "08e1349950c5602a",
@@ -254,7 +254,7 @@
"gsd-core/workflows/list-workspaces.md": "ff4ad30adc55d5b8",
"gsd-core/workflows/manager.md": "072a9f2ba6084641",
"gsd-core/workflows/map-codebase.md": "6c89a16e0d9fddfe",
"gsd-core/workflows/milestone-summary.md": "1ced13b54a1fab0b",
"gsd-core/workflows/milestone-summary.md": "957f9620aa472f87",
"gsd-core/workflows/mvp-phase.md": "bcc8037866fa1d4d",
"gsd-core/workflows/new-milestone.md": "b43ff95a594bd688",
"gsd-core/workflows/new-project.md": "d6709238a3ada30c",

View File

@@ -415,7 +415,7 @@ describe('auto-update', () => {
describe('hook — dispatch path (all gates pass)',
{ skip: isWindows ? 'POSIX-only: harness spawns bash + kill -0 + sleep; the hook itself is a bash script under test' : false },
() => {
test('writes status file with status=running synchronously before returning', (t) => {
test('writes status file with status=running synchronously before returning', async (t) => {
const tmpDir = createTempGitRepo({
config: { graphify: { enabled: true, auto_update: true } },
});
@@ -435,6 +435,12 @@ describe('auto-update', () => {
const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));
assert.strictEqual(status.status, 'running', 'initial status must be "running"');
assert.ok(/^[0-9a-f]{7,40}$/.test(status.head_at_build), 'head_at_build must be a commit sha');
// Await the detached rebuild's terminal status so the subprocess has exited
// before the test returns. A dangling detached rebuild can outlive the chunk
// under `node --test --test-force-exit` and surface as a non-zero chunk exit.
const done = await waitForBuildStatus(statusPath, new Set(['ok', 'failed']));
assert.ok(done && (done.status === 'ok' || done.status === 'failed'),
'detached rebuild must reach a terminal status before the test returns');
});
test('completes to status=ok after detached graphify run succeeds', async (t) => {
@@ -509,7 +515,7 @@ describe('auto-update', () => {
);
});
test('stale lock file (dead PID) is treated as absent', (t) => {
test('stale lock file (dead PID) is treated as absent', async (t) => {
const tmpDir = createTempGitRepo({
config: { graphify: { enabled: true, auto_update: true } },
});
@@ -528,9 +534,13 @@ describe('auto-update', () => {
assert.strictEqual(r.status, 0);
const statusPath = path.join(tmpDir, '.planning/graphs/.last-build-status.json');
assert.ok(fs.existsSync(statusPath), 'stale lock must not block dispatch');
// Await terminal status so the detached rebuild is gone before returning (see above).
const done = await waitForBuildStatus(statusPath, new Set(['ok', 'failed']));
assert.ok(done && (done.status === 'ok' || done.status === 'failed'),
'detached rebuild must reach a terminal status before the test returns');
});
test('respects git.base_branch config override (default branch != main)', (t) => {
test('respects git.base_branch config override (default branch != main)', async (t) => {
const tmpDir = createTempGitRepo({
defaultBranch: 'trunk',
config: {
@@ -546,10 +556,15 @@ describe('auto-update', () => {
{ pathPrepend: mockBin },
);
assert.strictEqual(r.status, 0);
const statusPath = path.join(tmpDir, '.planning/graphs/.last-build-status.json');
assert.ok(
fs.existsSync(path.join(tmpDir, '.planning/graphs/.last-build-status.json')),
fs.existsSync(statusPath),
'hook must honor git.base_branch when default branch is not main',
);
// Await terminal status so the detached rebuild is gone before returning (see above).
const done = await waitForBuildStatus(statusPath, new Set(['ok', 'failed']));
assert.ok(done && (done.status === 'ok' || done.status === 'failed'),
'detached rebuild must reach a terminal status before the test returns');
});
});

View File

@@ -29,7 +29,7 @@
"explore.md": 10497,
"extract-learnings.md": 12849,
"fast.md": 4149,
"forensics.md": 12463,
"forensics.md": 12487,
"graduation.md": 11578,
"health.md": 11824,
"help.md": 1722,
@@ -42,7 +42,7 @@
"list-workspaces.md": 5655,
"manager.md": 27258,
"map-codebase.md": 20789,
"milestone-summary.md": 11774,
"milestone-summary.md": 11798,
"mvp-phase.md": 13582,
"new-milestone.md": 32844,
"new-project.md": 66138,