diff --git a/.changeset/2351-portable-timeout.md b/.changeset/2351-portable-timeout.md new file mode 100644 index 000000000..5768aa17a --- /dev/null +++ b/.changeset/2351-portable-timeout.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2426 +--- +**Post-merge, regression, and other GSD test/build gates no longer fail with a spurious "command not found" on stock macOS.** These gates hardcoded GNU coreutils' `timeout`, which stock macOS ships neither as `timeout` nor `gtimeout`; a passing build or test run now completes under a portable, coreutils-independent `run-with-timeout` wrapper instead of exiting 127 and being misreported as a failure. (#2351) diff --git a/agents/gsd-verifier.md b/agents/gsd-verifier.md index ab13a3fed..d21832b5d 100644 --- a/agents/gsd-verifier.md +++ b/agents/gsd-verifier.md @@ -537,11 +537,11 @@ grep -R -n -E 'probe-[^[:space:]]+\.sh|scripts/.*/tests/probe-.*\.sh' "$PHASE_DI 1. Build the `PROBES` list from explicit PLAN declarations first; include conventional `scripts/*/tests/probe-*.sh` when the phase is a migration/tooling phase or the success criteria mention probes. 2. For every documented probe path, if the file is missing or unreadable, mark `MISSING_PROBE` and set `status: gaps_found`. Do not require the executable bit because probes run through `bash "$probe"`. -3. Run each probe from the built `PROBES` list (declared + conventional) from the repository root: +3. Run each probe from the built `PROBES` list from the repository root: ```bash for probe in "${PROBES[@]}"; do - timeout 30s bash "$probe" + gsd_run run-with-timeout 30 -- bash "$probe" done ``` diff --git a/docs/zh-CN/references/checkpoints.md b/docs/zh-CN/references/checkpoints.md index a41a22edb..9be3db209 100644 --- a/docs/zh-CN/references/checkpoints.md +++ b/docs/zh-CN/references/checkpoints.md @@ -323,7 +323,7 @@ npm run dev & DEV_SERVER_PID=$! # 等待就绪(最多 30s) -timeout 30 bash -c 'until curl -s localhost:3000 > /dev/null 2>&1; do sleep 1; done' +gsd_run run-with-timeout 30 -- bash -c 'until curl -s localhost:3000 > /dev/null 2>&1; do sleep 1; done' ``` **端口冲突:** 终止陈旧进程(`lsof -ti:3000 | xargs kill`)或使用备用端口(`--port 3001`)。 diff --git a/gsd-core/bin/gsd-tools.cjs b/gsd-core/bin/gsd-tools.cjs index 677be87c2..84933a576 100755 --- a/gsd-core/bin/gsd-tools.cjs +++ b/gsd-core/bin/gsd-tools.cjs @@ -2071,11 +2071,163 @@ async function dispatchHostCommand({ command, args, cwd, raw, error, defaultValu // ─── Arg parsing helpers ────────────────────────────────────────────────────── +// ─── run-with-timeout (#2351) ───────────────────────────────────────────────── +// Portable, coreutils-independent wall-clock cap for a spawned command. Replaces +// the GNU-only `timeout …` calls that were hardcoded across gsd +// workflow/agent files: stock macOS ships neither `timeout` nor `gtimeout`, so +// those calls exited 127 ("command not found") and a passing build/test was +// misreported as a FAILURE. The resolution lives here ONCE — every call site +// invokes `gsd_run run-with-timeout [--] [args…]` instead of +// hand-rolling a `command -v timeout` probe per file. +// +// Exit-code contract (kept identical to GNU `timeout` so the existing per-site +// dispatch — `-eq 124` for timeout, `-eq 0` for pass, non-zero for fail — is +// unchanged): +// • command exits normally → exit with the command's own code +// • wall-clock budget exceeded → exit 124 +// • command killed by a signal → exit 128+signum +// • command not found / not exec → exit 127 / 126 (spawn ENOENT / EACCES) +// • bad wrapper args → exit 2 (usage — a workflow-authoring bug) +// • == 0 → run with NO timer (matches `timeout 0`) +// • blank / negative / NaN → exit 2 (usage — fails SAFE, never unbounded) +// +// The wrapped command's argv is OPAQUE: this executes BEFORE gsd-tools' own +// global-flag parsing (see main()), so a wrapped `--raw`/`--cwd`/`--pick` passes +// through verbatim rather than being consumed by this dispatcher. stdio is +// inherited so shell pipes (`echo x | gsd_run run-with-timeout …`) and redirects +// keep working. No shell is spawned (argv array) — no injection surface beyond +// the old `timeout … bash -c "$CMD"`. +function runWithTimeout(argv) { + const { spawn } = require('node:child_process'); + const os = require('node:os'); + + const USAGE = 'Usage: gsd_run run-with-timeout [--] [args...]'; + const usageError = (msg) => new ExitError(2, `run-with-timeout: ${msg}\n${USAGE}`); + + const rawSecs = argv[0]; + if (rawSecs === undefined) throw usageError('missing '); + // Accept a bare number or a GNU-style trailing `s` unit (the only unit callers + // use). A blank/whitespace value is a USAGE ERROR — never a silent "no timer", + // which would drop the wall-clock bound if a config value ever resolved to "". + const secsText = String(rawSecs).trim().replace(/s$/, ''); + const secs = Number(secsText); + if (secsText === '' || !Number.isFinite(secs) || secs < 0) { + throw usageError(`invalid : ${rawSecs}`); + } + + let i = 1; + if (argv[i] === '--') i += 1; // optional POSIX end-of-options separator + const cmd = argv[i]; + if (cmd === undefined) throw usageError('missing '); + const cmdArgs = argv.slice(i + 1); + + const isWin = process.platform === 'win32'; + // Detached (own process group) on POSIX so a timeout can reap the WHOLE tree — + // a bare child.kill() misses grandchildren (e.g. a test runner's workers) and + // would not actually bound the wall clock. Windows has no POSIX process + // groups; a direct kill is the best portable option there. + const detached = !isWin && secs > 0; + const spawnFailureCode = (err) => + (err && err.code === 'ENOENT' ? 127 : err && err.code === 'EACCES' ? 126 : 125); + // Node's setTimeout delay is a 32-bit signed ms int; a larger value silently + // clamps to 1ms → a spurious immediate timeout. Cap the budget (~24.8 days). + const timerMs = Math.min(Math.round(secs * 1000), 2 ** 31 - 1); + + // Resolve with the numeric exit code — never process.exit() (banned by + // n/no-process-exit). main() returns this code and runMain() maps it to + // process.exitCode, so stdout/stderr flush and cleanup hooks still fire. + return new Promise((resolve) => { + let child; + try { + child = spawn(cmd, cmdArgs, { stdio: 'inherit', detached }); + } catch (err) { + process.stderr.write(`run-with-timeout: ${cmd}: ${err && err.message ? err.message : 'failed to start'}\n`); + resolve(spawnFailureCode(err)); + return; + } + + const killTree = (signal) => { + try { + if (detached && child.pid) { + try { process.kill(-child.pid, signal); return; } catch { /* group already gone */ } + } + child.kill(signal); + } catch { /* already exited */ } + }; + + let timedOut = false; + let killTimer = null; + // Backstop SIGKILL for a descendant that traps SIGTERM. The child keeps the + // event loop alive until this fires, so it stays ref'd (not unref'd). + const armEscalation = () => { + if (!killTimer) killTimer = setTimeout(() => killTree('SIGKILL'), 3000); + }; + + const timer = secs > 0 + ? setTimeout(() => { timedOut = true; killTree('SIGTERM'); armEscalation(); }, timerMs) + : null; + + // Forward an interrupt to the child tree rather than dying and orphaning it + // (GNU `timeout` forwards received signals). Without this, SIGINT/SIGTERM to + // the wrapper — Ctrl-C, CI cancellation — would leave the detached child + // running unbounded with no supervisor left to enforce the cap. + const onSignal = (sig) => { killTree(sig); armEscalation(); }; + const onSigint = () => onSignal('SIGINT'); + const onSigterm = () => onSignal('SIGTERM'); + process.on('SIGINT', onSigint); + process.on('SIGTERM', onSigterm); + + const finish = (exitCode) => { + if (timer) clearTimeout(timer); + if (killTimer) clearTimeout(killTimer); + process.removeListener('SIGINT', onSigint); + process.removeListener('SIGTERM', onSigterm); + resolve(exitCode); + }; + + child.on('error', (err) => { + process.stderr.write(`run-with-timeout: ${cmd}: ${err && err.message ? err.message : 'failed to start'}\n`); + finish(spawnFailureCode(err)); + }); + + child.on('exit', (code, signal) => { + if (timedOut) { + // The direct child exited on our SIGTERM, but a SIGTERM-trapping descendant + // may still hold the inherited stdio — orphaning it would hang a captured + // or piped gate. Reap the whole group SYNCHRONOUSLY here; the escalation + // timer can't fire once we resolve and the loop drains. + killTree('SIGKILL'); + finish(124); // matches GNU `timeout` + return; + } + if (signal) { + const num = os.constants.signals[signal] || 0; + finish(num ? 128 + num : 1); // bash's 128+signum convention + return; + } + finish(code == null ? 1 : code); + }); + }); +} + // ─── CLI Router ─────────────────────────────────────────────────────────────── async function main() { let args = process.argv.slice(2); + // #2351: run-with-timeout bounds a spawned command's wall clock portably + // (coreutils-independent). It MUST intercept HERE, before the global-flag + // parsing below — the wrapped command's argv is opaque and may itself contain + // --raw / --cwd / --pick that this dispatcher would otherwise consume. + { + let rwt = args; + if (rwt[0] === 'query') rwt = rwt.slice(1); + if (rwt[0] === 'run-with-timeout') { + // Return the child's exit code; runMain() maps it to process.exitCode. + return runWithTimeout(rwt.slice(1)); + } + } + // --json-errors / GSD_JSON_ERRORS=1: when active, error() emits structured // JSON ({ ok: false, reason: , message }) to stderr // instead of "Error: ". Lets test suites assert on typed reason codes diff --git a/gsd-core/references/checkpoints.md b/gsd-core/references/checkpoints.md index 2fd6bbb69..a40f85dfc 100644 --- a/gsd-core/references/checkpoints.md +++ b/gsd-core/references/checkpoints.md @@ -474,7 +474,7 @@ npm run dev & DEV_SERVER_PID=$! # Wait for ready (max 30s) — uses fetch() for cross-platform compatibility -timeout 30 bash -c 'until node -e "fetch(\"http://localhost:3000\").then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))" 2>/dev/null; do sleep 1; done' +gsd_run run-with-timeout 30 -- bash -c 'until node -e "fetch(\"http://localhost:3000\").then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))" 2>/dev/null; do sleep 1; done' ``` **Port conflicts:** Kill stale process (`lsof -ti:3000 | xargs kill`) or use alternate port (`--port 3001`). diff --git a/gsd-core/workflows/audit-fix.md b/gsd-core/workflows/audit-fix.md index 0694b8a5a..9fc6a8ce1 100644 --- a/gsd-core/workflows/audit-fix.md +++ b/gsd-core/workflows/audit-fix.md @@ -128,7 +128,7 @@ fi # timeout so a watch-mode runner cannot hang the audit gate indefinitely. AUDIT_TEST_CMD=$(gsd_run query normalize-test-command "$AUDIT_TEST_CMD" --cwd . 2>/dev/null || echo "$AUDIT_TEST_CMD") TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600") -timeout "$TEST_GATE_TIMEOUT" bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20 +gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20 AUDIT_TEST_EXIT=${PIPESTATUS[0]} if [ "$AUDIT_TEST_EXIT" -eq 124 ]; then echo "✗ Audit test gate timed out after ${TEST_GATE_TIMEOUT}s — likely stuck in watch/dev mode (e.g. vitest without 'run'). Run tests one-shot (e.g. 'vitest run') or raise workflow.test_gate_timeout." diff --git a/gsd-core/workflows/code-review.md b/gsd-core/workflows/code-review.md index f64157439..ed226143e 100644 --- a/gsd-core/workflows/code-review.md +++ b/gsd-core/workflows/code-review.md @@ -398,7 +398,7 @@ if [ \"$FALLOW_SCOPE\" = \"phase\" ]; then fi fi -timeout 120 \"$FALLOW_BIN\" audit --format json --quiet --max-crap \"$FALLOW_MAX_CRAP\" \"${FALLOW_SCOPE_ARGS[@]+\"${FALLOW_SCOPE_ARGS[@]}\"}\" > \"${FALLOW_JSON_PATH}.tmp\" 2>\"$FALLOW_STDERR_TMP\" +gsd_run run-with-timeout 120 -- \"$FALLOW_BIN\" audit --format json --quiet --max-crap \"$FALLOW_MAX_CRAP\" \"${FALLOW_SCOPE_ARGS[@]+\"${FALLOW_SCOPE_ARGS[@]}\"}\" > \"${FALLOW_JSON_PATH}.tmp\" 2>\"$FALLOW_STDERR_TMP\" FALLOW_EXIT=$? # fallow exits 0 (clean) or 1 (issues found) — BOTH are successful runs that produce a diff --git a/gsd-core/workflows/execute-phase.md b/gsd-core/workflows/execute-phase.md index 6cdd28175..41f42d02a 100644 --- a/gsd-core/workflows/execute-phase.md +++ b/gsd-core/workflows/execute-phase.md @@ -403,7 +403,7 @@ CROSS_AI_TIMEOUT=$(gsd_run query config-get workflow.cross_ai_timeout 2>/dev/nul 3. **Run the external command** from the project root, writing the prompt to stdin. Never shell-interpolate the prompt — always pipe via stdin to prevent injection: ```bash - echo "$TASK_PROMPT" | timeout "${CROSS_AI_TIMEOUT}s" ${CROSS_AI_CMD} > "$CANDIDATE_SUMMARY" 2>"$ERROR_LOG" + echo "$TASK_PROMPT" | gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}" -- ${CROSS_AI_CMD} > "$CANDIDATE_SUMMARY" 2>"$ERROR_LOG" EXIT_CODE=$? ``` diff --git a/gsd-core/workflows/execute-phase/steps/post-merge-gate.md b/gsd-core/workflows/execute-phase/steps/post-merge-gate.md index 5b3772f18..165160379 100644 --- a/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +++ b/gsd-core/workflows/execute-phase/steps/post-merge-gate.md @@ -41,7 +41,7 @@ fi # Run build with 5-minute timeout BUILD_EXIT=0 if [ -n "$BUILD_CMD" ]; then - timeout 300 bash -c "$BUILD_CMD" 2>&1 + gsd_run run-with-timeout 300 -- bash -c "$BUILD_CMD" 2>&1 BUILD_EXIT=$? if [ "${BUILD_EXIT}" -eq 0 ]; then echo "✓ Post-merge build gate passed" @@ -100,7 +100,7 @@ fi TEST_CMD=$(gsd_run query normalize-test-command "$TEST_CMD" --cwd . 2>/dev/null || echo "$TEST_CMD") TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600") TEST_EXIT=0 -timeout "$TEST_GATE_TIMEOUT" bash -c "$TEST_CMD" 2>&1 +gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$TEST_CMD" 2>&1 TEST_EXIT=$? if [ "${TEST_EXIT}" -eq 0 ]; then echo "✓ Post-merge test gate passed — no cross-plan conflicts" diff --git a/gsd-core/workflows/execute-phase/steps/regression-gate.md b/gsd-core/workflows/execute-phase/steps/regression-gate.md index f31028936..08f71544e 100644 --- a/gsd-core/workflows/execute-phase/steps/regression-gate.md +++ b/gsd-core/workflows/execute-phase/steps/regression-gate.md @@ -32,7 +32,7 @@ fi # with a timeout so a watch-mode runner cannot hang the gate indefinitely. REG_TEST_CMD=$(gsd_run query normalize-test-command "$REG_TEST_CMD" --cwd . 2>/dev/null || echo "$REG_TEST_CMD") TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600") -timeout "$TEST_GATE_TIMEOUT" bash -c "$REG_TEST_CMD" 2>&1 +gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$REG_TEST_CMD" 2>&1 REG_TEST_EXIT=$? if [ "$REG_TEST_EXIT" -eq 124 ]; then echo "✗ REGRESSION GATE ABORTED — test runner did not exit within ${TEST_GATE_TIMEOUT}s, likely stuck in watch/dev mode (e.g. vitest without 'run'). Run tests one-shot (e.g. 'vitest run'), set workflow.test_command, or raise workflow.test_gate_timeout." diff --git a/gsd-core/workflows/ship.md b/gsd-core/workflows/ship.md index 6a2a723cd..786db6050 100644 --- a/gsd-core/workflows/ship.md +++ b/gsd-core/workflows/ship.md @@ -328,7 +328,7 @@ If `REVIEW_CMD` is non-empty and not `"null"`, run the external review: # ship runs — same or different phase, same or different project — never # clobber or read each other's stderr. Portable via ${TMPDIR:-/tmp}. REVIEW_STDERR_FILE=$(mktemp "${TMPDIR:-/tmp}/gsd-review-stderr-XXXXXX") - REVIEW_OUTPUT=$(echo "${REVIEW_PROMPT}" | timeout 120 ${REVIEW_CMD} 2>"${REVIEW_STDERR_FILE}") + REVIEW_OUTPUT=$(echo "${REVIEW_PROMPT}" | gsd_run run-with-timeout 120 -- ${REVIEW_CMD} 2>"${REVIEW_STDERR_FILE}") REVIEW_EXIT=$? ``` diff --git a/gsd-core/workflows/verify-phase.md b/gsd-core/workflows/verify-phase.md index a4729cf55..c93e1034f 100644 --- a/gsd-core/workflows/verify-phase.md +++ b/gsd-core/workflows/verify-phase.md @@ -291,7 +291,7 @@ fi # Run all tests (timeout: 5 min). #1857: normalize to one-shot so watch mode exits. TEST_CMD=$(gsd_run query normalize-test-command "$TEST_CMD" --cwd . 2>/dev/null || echo "$TEST_CMD") TEST_EXIT=0 -timeout 300 bash -c "$TEST_CMD" 2>&1 +gsd_run run-with-timeout 300 -- bash -c "$TEST_CMD" 2>&1 TEST_EXIT=$? if [ "${TEST_EXIT}" -eq 0 ]; then echo "✓ Test suite passed" diff --git a/package.json b/package.json index d99ab53ba..4aa9f1425 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "lint": "eslint . --cache --cache-location node_modules/.cache/eslint/", "lint:fix": "eslint . --fix", "lint:table-schema-drift": "node scripts/lint-table-schema-drift.cjs", - "lint:ci": "npm run lint && npm run lint:skill-deps && npm run lint:generated-sync && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs && node scripts/validate-registry.cjs && node scripts/lint-table-schema-drift.cjs", + "lint:ci": "npm run lint && npm run lint:skill-deps && npm run lint:generated-sync && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs && node scripts/lint-portable-timeout.cjs && node scripts/validate-registry.cjs && node scripts/lint-table-schema-drift.cjs", "lint:allow-test-rule-refs": "node scripts/lint-allow-test-rule-refs.cjs", "lint:regression-names": "node scripts/lint-regression-test-names.cjs", "lint:descriptions": "node scripts/lint-descriptions.cjs", diff --git a/scripts/lint-portable-timeout.cjs b/scripts/lint-portable-timeout.cjs new file mode 100644 index 000000000..eeaed47f5 --- /dev/null +++ b/scripts/lint-portable-timeout.cjs @@ -0,0 +1,140 @@ +#!/usr/bin/env node +'use strict'; + +/** + * lint-portable-timeout.cjs — ban hardcoded GNU-`timeout` in gsd + * workflow / agent / reference / command markdown (#2351). + * + * ## Why + * + * `timeout` and `gtimeout` are GNU coreutils. Stock macOS ships NEITHER + * (`brew install coreutils` only provides `gtimeout`, and only if installed). + * A hardcoded `timeout ` inside an executable workflow snippet exits + * 127 ("command not found") on such a host, and the gate that runs it — which + * only distinguishes 0 (pass) / 124 (timeout) / other (fail) — misreports a + * perfectly good build or test command as a FAILURE (#2351). + * + * The portable, coreutils-independent replacement is the + * `gsd_run run-with-timeout [--] ` verb (gsd-core/bin/gsd-tools.cjs): + * a Node-based wall-clock cap that keeps GNU `timeout`'s exit-code contract + * (124 on timeout) on every platform. The resolution lives there ONCE and is + * reused by every call site instead of a per-file `command -v timeout` probe. + * + * This ratchet fails the build if a NEW bare `timeout`/`gtimeout` execution + * slips into any of these surfaces. + * + * ## What PASSES + * + * - `gsd_run run-with-timeout 300 -- bash -c "$CMD"` — the approved verb. + * - `command -v timeout` / `command -v gtimeout` / `which timeout` capability + * PROBES — portable: they detect the binary, they do not unconditionally + * execute it (see gsd-core/workflows/review.md's `_AGY_KILLER` fallback). + * - Prose ("timed out after 5 minutes"), config keys + * (`workflow.test_gate_timeout`), CI `timeout-minutes:`, the agy + * `--print-timeout` flag, `$TIMEOUT`-style variable names — none of which is + * a bare timeout command invocation. + * + * ## What FAILS + * + * A bare `timeout …` / `gtimeout …` command invocation, + * where `` is a number, a `"$VAR"`, or a `${VAR}` (optionally with a + * leading `-k`/`-s` option). + */ + +const fs = require('fs'); +const path = require('path'); +const { ExitError, runMain } = require('./lib/cli-exit.cjs'); + +const ROOT = path.join(__dirname, '..'); + +// Surfaces whose markdown carries agent-executed bash. Kept broad so the guard +// catches a regression anywhere a workflow snippet could bound a command. +const DEFAULT_ROOTS = ['gsd-core/workflows', 'gsd-core/references', 'agents', 'commands']; + +// Capability probes to strip BEFORE testing for an invocation, so a portable +// `command -v timeout` on the same line is never mistaken for a bare execution. +const PROBE_RE = /command\s+-v\s+g?timeout|which\s+g?timeout/g; + +// A `timeout`/`gtimeout` token INVOKED AS A COMMAND with a duration argument. +// Anchored to a command position — line start or right after `| & ; ( ` {` — so +// prose ("increase the timeout 30 seconds") and the `--print-timeout` flag / the +// approved `run-with-timeout` verb (no separator before "timeout") never match. +// Between the token and the duration, allow any number of leading options in +// short OR long form (`-k5`, `-k 5`, `--kill-after=5`, `--foreground`, +// `--signal=KILL`). The duration is a digit, `$((arith))`, a `$VAR`, or `${VAR}`. +const EXEC_RE = /(?:^|[|&;(`{])[ \t]*g?timeout[ \t]+(?:-{1,2}[\w-]+(?:=\S+)?[ \t]+)*["']?(?:\$\{?[A-Za-z_]|\$\(\(|\d)/; + +/** + * Locate bare `timeout`/`gtimeout` invocations in a block of text. + * + * Pure (no I/O): callers pass the file contents; the caller reads files. Returns + * structured findings so tests assert on typed values, never on grepped text. + * + * @param {string} text file contents + * @returns {{ line: number, snippet: string }[]} findings (empty array = clean) + */ +function findRawTimeoutInvocations(text) { + const findings = []; + const lines = String(text).split(/\r?\n/); + for (let i = 0; i < lines.length; i += 1) { + const stripped = lines[i].replace(PROBE_RE, ''); + if (EXEC_RE.test(stripped)) findings.push({ line: i + 1, snippet: lines[i].trim() }); + } + return findings; +} + +function walkMarkdown(dir) { + const out = []; + let entries; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return out; // a missing root is not an error — some surfaces are optional + } + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) out.push(...walkMarkdown(full)); + else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full); + } + return out; +} + +/** + * Scan the given roots (repo-relative) for bare timeout invocations. + * @param {string[]} roots + * @returns {{ file: string, line: number, snippet: string }[]} + */ +function scan(roots = DEFAULT_ROOTS) { + const offenders = []; + for (const rel of roots) { + const abs = path.isAbsolute(rel) ? rel : path.join(ROOT, rel); + for (const file of walkMarkdown(abs)) { + const findings = findRawTimeoutInvocations(fs.readFileSync(file, 'utf8')); + for (const f of findings) { + offenders.push({ file: path.relative(ROOT, file), line: f.line, snippet: f.snippet }); + } + } + } + return offenders; +} + +function main() { + const rootsEnv = process.env.GSD_LINT_PORTABLE_TIMEOUT_ROOTS; + const roots = rootsEnv ? rootsEnv.split(path.delimiter).filter(Boolean) : DEFAULT_ROOTS; + const offenders = scan(roots); + if (offenders.length > 0) { + const detail = offenders.map((o) => ` ${o.file}:${o.line} ${o.snippet}`).join('\n'); + throw new ExitError( + 1, + 'lint-portable-timeout: hardcoded `timeout`/`gtimeout` is not portable — stock\n' + + 'macOS ships no coreutils, so these exit 127 and misreport a passing command as a\n' + + 'failure. Use `gsd_run run-with-timeout [--] ` instead (#2351):\n' + + detail, + ); + } + console.log(`ok lint-portable-timeout: no hardcoded timeout invocations in ${roots.length} root(s)`); +} + +module.exports = { findRawTimeoutInvocations, scan, DEFAULT_ROOTS }; + +if (require.main === module) runMain(main); diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index b0b2e09e7..885224c7d 100644 --- a/tests/agent-size-baseline.json +++ b/tests/agent-size-baseline.json @@ -32,5 +32,5 @@ "gsd-ui-checker.md": 14118, "gsd-ui-researcher.md": 19557, "gsd-user-profiler.md": 8516, - "gsd-verifier.md": 49147 + "gsd-verifier.md": 49140 } diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 74e3885e8..c9478f6f6 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -34,12 +34,12 @@ "agents/gsd-ui-checker.md": "216af34b01e277aa", "agents/gsd-ui-researcher.md": "5f86de1decbd16d2", "agents/gsd-user-profiler.md": "25d65f6458454764", - "agents/gsd-verifier.md": "224e8df2d8fd1d95", + "agents/gsd-verifier.md": "134de2aa70d323b4", "gsd-core/.gsd-runtime": "54e851f5dd76ba94", "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": "0a2fc4e226f009c5", + "gsd-core/bin/gsd-tools.cjs": "2fcf88250beb9214", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -56,7 +56,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "e176817364a7cbf4", "gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad", - "gsd-core/references/checkpoints.md": "509700508de43306", + "gsd-core/references/checkpoints.md": "130bb6ef705fc065", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "177520ead2ae3a23", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -212,14 +212,14 @@ "gsd-core/workflows/add-todo.md": "e410a72c168e43c0", "gsd-core/workflows/ai-integration-phase.md": "ea5a229a9cad3b4d", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "582e9a31df15dd8b", + "gsd-core/workflows/audit-fix.md": "68d2133e0d483905", "gsd-core/workflows/audit-milestone.md": "280cd85908dd45cb", "gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4", "gsd-core/workflows/autonomous.md": "603ce2019835f00e", "gsd-core/workflows/check-todos.md": "5a62092df800ad7c", "gsd-core/workflows/cleanup.md": "12c8fd85d3010fe6", "gsd-core/workflows/code-review-fix.md": "60640e633b0a124b", - "gsd-core/workflows/code-review.md": "2d9943e121908327", + "gsd-core/workflows/code-review.md": "1a72ce22df16b3fa", "gsd-core/workflows/complete-milestone.md": "aaf272074acec69d", "gsd-core/workflows/debug.md": "0b802b267d0ca2d1", "gsd-core/workflows/diagnose-issues.md": "c8c41993c277363c", @@ -243,11 +243,11 @@ "gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0", "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", "gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f", - "gsd-core/workflows/execute-phase.md": "e35fc8cb7e4b2097", + "gsd-core/workflows/execute-phase.md": "8c06d5d57f2adaa7", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "55d0706e80a2554a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5e9635a80ca6c3a5", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "3c66870732e77709", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "13aa54f8279960ae", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "476f88892510a09e", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "b5eec9e33626aefa", "gsd-core/workflows/explore.md": "934c00f9f216dbdb", @@ -302,7 +302,7 @@ "gsd-core/workflows/settings-advanced.md": "6d25100a9de15b31", "gsd-core/workflows/settings-integrations.md": "4d3001ad2b5dad8f", "gsd-core/workflows/settings.md": "8258f7bd3700d608", - "gsd-core/workflows/ship.md": "782e5998a4257acf", + "gsd-core/workflows/ship.md": "8575dcc6d75a17c5", "gsd-core/workflows/sketch-wrap-up.md": "0f842a609851a401", "gsd-core/workflows/sketch.md": "314b7d323c6b57eb", "gsd-core/workflows/smart-entry.md": "3ce5b6228238fdb6", @@ -319,7 +319,7 @@ "gsd-core/workflows/undo.md": "6ab639d1fc7e0721", "gsd-core/workflows/update.md": "2c58df5e21c41c31", "gsd-core/workflows/validate-phase.md": "ae3f0180a2316fcd", - "gsd-core/workflows/verify-phase.md": "20503ec39197757b", + "gsd-core/workflows/verify-phase.md": "913acaef091797d7", "gsd-core/workflows/verify-work.md": "59276d94999ee022", "hooks/gsd-check-update-worker.js": "fa301e6366270d5f", "hooks/gsd-check-update.js": "4617a98bf529e4c3", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index 1c0027369..142fcd784 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "5c27ec0d88ef87c2", "agents/gsd-ui-researcher.md": "bcc591f2dfebdb60", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "f5c00a9b08fc1a7e", + "agents/gsd-verifier.md": "b310112ee195819b", "commands/gsd-add-tests.md": "3608d0cf4b515103", "commands/gsd-ai-integration-phase.md": "cbc59ad7a5064b26", "commands/gsd-audit-fix.md": "1b805946362c4f19", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "953314cdfef56bc4", "gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", - "gsd-core/workflows/code-review.md": "2aa1957579f50a87", + "gsd-core/workflows/code-review.md": "c877ad812b4a511e", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "6cc3900891dfb927", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "c18baf04228abf68", + "gsd-core/workflows/execute-phase.md": "4b21d07643d1647a", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "83cb02952b514bd8", "gsd-core/workflows/explore.md": "6c04f2e658d93261", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44", "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", "gsd-core/workflows/settings.md": "d96ddf01fb85e61e", - "gsd-core/workflows/ship.md": "f486f2731ca8b72a", + "gsd-core/workflows/ship.md": "369f1461685d1897", "gsd-core/workflows/sketch-wrap-up.md": "5f5ebb6a80d610c6", "gsd-core/workflows/sketch.md": "8319cedf3f93fc35", "gsd-core/workflows/smart-entry.md": "449238eb94abe187", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "fd160e13f8b7e83c", "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", - "gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f", + "gsd-core/workflows/verify-phase.md": "d26a2c3269340caf", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9", "hooks/gsd-check-update.js": "7b3a7983d5f1f5d3", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index b2364caee..75110a3c2 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -33,7 +33,7 @@ "agents/gsd-ui-checker.md": "33ffdc73d2105a24", "agents/gsd-ui-researcher.md": "4b36852c839f1134", "agents/gsd-user-profiler.md": "d40584599906f3b7", - "agents/gsd-verifier.md": "628ef3a944a7a6eb", + "agents/gsd-verifier.md": "5280f380566a4eb6", "commands/gsd-add-tests.md": "057e3e440989e681", "commands/gsd-ai-integration-phase.md": "e1f1e0bd6c50506d", "commands/gsd-audit-fix.md": "ebdcc267a2bebaab", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -126,7 +126,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "251040866a3a1818", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "6bfac08025ea3106", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -282,14 +282,14 @@ "gsd-core/workflows/add-todo.md": "0a0f4d718ea50bea", "gsd-core/workflows/ai-integration-phase.md": "462b75ae916e2793", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "b441993d57cf83bc", + "gsd-core/workflows/audit-fix.md": "f03266102d4ee978", "gsd-core/workflows/audit-milestone.md": "ae8605b4ecc37c0b", "gsd-core/workflows/audit-uat.md": "1c4a02a8c1ab930f", "gsd-core/workflows/autonomous.md": "6adf957e64518d15", "gsd-core/workflows/check-todos.md": "8f2c6b27f18cc5e2", "gsd-core/workflows/cleanup.md": "bfbab4b981d39544", "gsd-core/workflows/code-review-fix.md": "78c716068ccdf820", - "gsd-core/workflows/code-review.md": "595f0d9c7f475809", + "gsd-core/workflows/code-review.md": "7db21e884906595e", "gsd-core/workflows/complete-milestone.md": "9962377cddee50d7", "gsd-core/workflows/debug.md": "80c413b3a9877433", "gsd-core/workflows/diagnose-issues.md": "db6a599674efbc4d", @@ -313,11 +313,11 @@ "gsd-core/workflows/docs-update.md": "cd753783ab95da00", "gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e", "gsd-core/workflows/eval-review.md": "086a1f2b3c11462c", - "gsd-core/workflows/execute-phase.md": "e4babdc61b00b387", + "gsd-core/workflows/execute-phase.md": "fcd7aaeb14e5880d", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "6d38bfd540030da4", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e5d65c3a0ae0ed2a", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "ccd95645902f57af", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a7f9b9a45303382f", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "b14d7fa2c4ec2406", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "587757b937368212", "gsd-core/workflows/explore.md": "95e463d4bdd6dadd", @@ -372,7 +372,7 @@ "gsd-core/workflows/settings-advanced.md": "94d61da368e9f85b", "gsd-core/workflows/settings-integrations.md": "dfe3672c4fabf139", "gsd-core/workflows/settings.md": "acdd79110699a608", - "gsd-core/workflows/ship.md": "3a0262c1197cf2f8", + "gsd-core/workflows/ship.md": "cae3fbefba655818", "gsd-core/workflows/sketch-wrap-up.md": "d52a5462bafda830", "gsd-core/workflows/sketch.md": "dbe6acc4d976060c", "gsd-core/workflows/smart-entry.md": "1850447c045f36d8", @@ -389,7 +389,7 @@ "gsd-core/workflows/undo.md": "d759702f84e308fa", "gsd-core/workflows/update.md": "2a59b4edf4a3c8c7", "gsd-core/workflows/validate-phase.md": "3150904744b4a1bd", - "gsd-core/workflows/verify-phase.md": "05f5370a02941f39", + "gsd-core/workflows/verify-phase.md": "90773de32a966c85", "gsd-core/workflows/verify-work.md": "de14acdc8e925338", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", "hooks/gsd-check-update.js": "25cde66a12d6b886", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index fe9d38aec..a86024fb9 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -33,12 +33,12 @@ "agents/gsd-ui-checker.md": "8126405043f99cb6", "agents/gsd-ui-researcher.md": "9e3ac030767167e0", "agents/gsd-user-profiler.md": "003276f85792cfda", - "agents/gsd-verifier.md": "2271174b5aa20e31", + "agents/gsd-verifier.md": "d1fe290d4673e379", "gsd-core/.gsd-runtime": "98038b25280788a4", "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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -55,7 +55,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "533eae480bfc4bb8", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -211,14 +211,14 @@ "gsd-core/workflows/add-todo.md": "2c5176263ad4ae8f", "gsd-core/workflows/ai-integration-phase.md": "a280593ad22fc9a3", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "722397c04272dfaa", "gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc", - "gsd-core/workflows/code-review.md": "14682c0ba32d5dc6", + "gsd-core/workflows/code-review.md": "3fd49c93357fe4f7", "gsd-core/workflows/complete-milestone.md": "dcf1182398efb1ca", "gsd-core/workflows/debug.md": "b4c658c9608d08e2", "gsd-core/workflows/diagnose-issues.md": "75ffc381ac3059ff", @@ -242,11 +242,11 @@ "gsd-core/workflows/docs-update.md": "63082608d3ae92be", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "f59e8329dae1e528", - "gsd-core/workflows/execute-phase.md": "7f2b133debb7b88f", + "gsd-core/workflows/execute-phase.md": "132c985f8dbd766b", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "bc1c2a159117642c", "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", @@ -301,7 +301,7 @@ "gsd-core/workflows/settings-advanced.md": "339def28c34b0797", "gsd-core/workflows/settings-integrations.md": "53649313d20694ae", "gsd-core/workflows/settings.md": "7e7458cdb2b68ec5", - "gsd-core/workflows/ship.md": "cc8428f393c44f67", + "gsd-core/workflows/ship.md": "f777449b79ee3357", "gsd-core/workflows/sketch-wrap-up.md": "121ed4b8127abf04", "gsd-core/workflows/sketch.md": "737c0492686fea2d", "gsd-core/workflows/smart-entry.md": "ad20cf74ae2e8291", @@ -318,7 +318,7 @@ "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "f9e7d8a760d0d3c8", "gsd-core/workflows/validate-phase.md": "7a3db6ab8ce9f380", - "gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f", + "gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9", "gsd-core/workflows/verify-work.md": "c8ffee621e7319de", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", "hooks/gsd-check-update.js": "25cde66a12d6b886", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index d8beb2c42..f5a9cf9c2 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -37,12 +37,12 @@ "agents/gsd-ui-checker.md": "151d12b4e007cbbf", "agents/gsd-ui-researcher.md": "1bb303f3a3c4dfc9", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "75912e9cadd83eb3", + "agents/gsd-verifier.md": "403502d1071ef8df", "gsd-core/.gsd-runtime": "98d4891544955482", "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": "0f718645418266a8", + "gsd-core/bin/gsd-tools.cjs": "81330ef8b3bb63c1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -59,7 +59,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "4919e8aa1130fb04", + "gsd-core/references/checkpoints.md": "f66fb7d5b435682d", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "c154ba00dbbf4477", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -215,14 +215,14 @@ "gsd-core/workflows/add-todo.md": "aa89018230c87f13", "gsd-core/workflows/ai-integration-phase.md": "878d0a2c6eb08c88", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "d6a41fc6879424f8", + "gsd-core/workflows/audit-fix.md": "635168ce87774bd4", "gsd-core/workflows/audit-milestone.md": "202b726748604c93", "gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f", "gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c", "gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde", "gsd-core/workflows/cleanup.md": "b0ebfc48792b407b", "gsd-core/workflows/code-review-fix.md": "e4549af672e74e6f", - "gsd-core/workflows/code-review.md": "2f9cacacbc862af3", + "gsd-core/workflows/code-review.md": "e2bfb4267041812a", "gsd-core/workflows/complete-milestone.md": "c0808127038a8f86", "gsd-core/workflows/debug.md": "870682af53182a6c", "gsd-core/workflows/diagnose-issues.md": "e616d0d730328d68", @@ -246,11 +246,11 @@ "gsd-core/workflows/docs-update.md": "39f288623a8f6f32", "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", "gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494", - "gsd-core/workflows/execute-phase.md": "2b087f64c9fa112c", + "gsd-core/workflows/execute-phase.md": "678e84b47fe9024f", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "67ebc93f51968cb6", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "27505ecd7d5b4e57", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "91eac50d2e1f5a2f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "35612890c1173577", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "26825e1aacf224d0", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "0db7b9db6454f380", "gsd-core/workflows/explore.md": "e83af8ceae314cf9", @@ -305,7 +305,7 @@ "gsd-core/workflows/settings-advanced.md": "69f3a19bf2c61160", "gsd-core/workflows/settings-integrations.md": "76eee76d6eb57657", "gsd-core/workflows/settings.md": "3701faed09d55247", - "gsd-core/workflows/ship.md": "416cfe6c07694753", + "gsd-core/workflows/ship.md": "a58d05ab03124d0b", "gsd-core/workflows/sketch-wrap-up.md": "1f44789553180d84", "gsd-core/workflows/sketch.md": "2226779b6003a71c", "gsd-core/workflows/smart-entry.md": "9a64f43927641ca4", @@ -322,7 +322,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "165beec33490bd28", "gsd-core/workflows/validate-phase.md": "706627c190ae11aa", - "gsd-core/workflows/verify-phase.md": "377fa009ccf04cbe", + "gsd-core/workflows/verify-phase.md": "a8b3c15e7ef9c394", "gsd-core/workflows/verify-work.md": "3fb282f2bce34a79", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index fbcf7d548..7fc54c9ee 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "25822359044cd708", "agents/gsd-ui-researcher.md": "e37d9f53ade25d1f", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "c8a8c73a277a512f", + "agents/gsd-verifier.md": "107ad9d3193bcafc", "commands/gsd-add-tests.md": "aa65032141557fb7", "commands/gsd-ai-integration-phase.md": "6199b7198f928adc", "commands/gsd-audit-fix.md": "c21ef925131fade7", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "953314cdfef56bc4", "gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", - "gsd-core/workflows/code-review.md": "2aa1957579f50a87", + "gsd-core/workflows/code-review.md": "c877ad812b4a511e", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "77d98ac07c4a26ff", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "64b6a432d49e3136", + "gsd-core/workflows/execute-phase.md": "bae1b74bd250c6e6", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "1c26c1cf464fa6b7", "gsd-core/workflows/explore.md": "6c04f2e658d93261", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44", "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", "gsd-core/workflows/settings.md": "d96ddf01fb85e61e", - "gsd-core/workflows/ship.md": "f486f2731ca8b72a", + "gsd-core/workflows/ship.md": "369f1461685d1897", "gsd-core/workflows/sketch-wrap-up.md": "2aba89ecd8f41a0d", "gsd-core/workflows/sketch.md": "5eedd93f9a5b49d5", "gsd-core/workflows/smart-entry.md": "449238eb94abe187", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "5ff1f77222977648", "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", - "gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f", + "gsd-core/workflows/verify-phase.md": "d26a2c3269340caf", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd", "hooks/gsd-check-update.js": "b7669f605631e506", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 2d6c68c24..f783aeece 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -138,14 +138,14 @@ "agents/gsd-ui-researcher.toml": "7a38aff7b13d9e37", "agents/gsd-user-profiler.md": "1bf5033c929181c1", "agents/gsd-user-profiler.toml": "b9c244bb8fbf8140", - "agents/gsd-verifier.md": "4ac4b860e2504374", - "agents/gsd-verifier.toml": "8ed9fb961409e894", + "agents/gsd-verifier.md": "c924485d9feb6a8d", + "agents/gsd-verifier.toml": "e37a57b02a7647a9", "config.toml": "aa0b484a070f603c", "gsd-core/.gsd-runtime": "243b0dc9b847e66c", "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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -162,7 +162,7 @@ "gsd-core/references/api-coverage.md": "524382216a8e713f", "gsd-core/references/artifact-types.md": "3218cafb0c92dc32", "gsd-core/references/autonomous-smart-discuss.md": "4156025334411073", - "gsd-core/references/checkpoints.md": "afc6933d99f73358", + "gsd-core/references/checkpoints.md": "d52116f59e92ca43", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "0b67ea1d5db4bc08", "gsd-core/references/continuation-format.md": "e64c0da2b3d0f2f0", @@ -318,14 +318,14 @@ "gsd-core/workflows/add-todo.md": "776e554602e3d1b7", "gsd-core/workflows/ai-integration-phase.md": "d46f7e1a0b24345a", "gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "5f362cead97ceaca", "gsd-core/workflows/audit-uat.md": "2564078edb15b5e9", "gsd-core/workflows/autonomous.md": "92f08626d4aea668", "gsd-core/workflows/check-todos.md": "b2b103e8638e760a", "gsd-core/workflows/cleanup.md": "5d48d64664222a3e", "gsd-core/workflows/code-review-fix.md": "ae7f9c6b39a23c12", - "gsd-core/workflows/code-review.md": "8ac44419de9d2ab5", + "gsd-core/workflows/code-review.md": "9b02ebf8fc9b87fa", "gsd-core/workflows/complete-milestone.md": "017df7443bd08da5", "gsd-core/workflows/debug.md": "63691293c0bc0294", "gsd-core/workflows/diagnose-issues.md": "e38bb21d06dff077", @@ -349,11 +349,11 @@ "gsd-core/workflows/docs-update.md": "e255317df939e302", "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", "gsd-core/workflows/eval-review.md": "63d0d0670b54c244", - "gsd-core/workflows/execute-phase.md": "916e24c2bd0da0f7", + "gsd-core/workflows/execute-phase.md": "2f0e853490af3972", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f4cacd27d37bac65", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "4492431f93e1df8c", "gsd-core/workflows/explore.md": "2ef10d17c8864a04", @@ -408,7 +408,7 @@ "gsd-core/workflows/settings-advanced.md": "2431433811616f76", "gsd-core/workflows/settings-integrations.md": "77730321d3d6d317", "gsd-core/workflows/settings.md": "054c8c31b3905ced", - "gsd-core/workflows/ship.md": "779e345e22f3f974", + "gsd-core/workflows/ship.md": "2c2ab4e0243a2b27", "gsd-core/workflows/sketch-wrap-up.md": "07724a390fbb43f6", "gsd-core/workflows/sketch.md": "576f300dfdde1b7d", "gsd-core/workflows/smart-entry.md": "6f686195ae531b03", @@ -425,7 +425,7 @@ "gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5", "gsd-core/workflows/update.md": "5c35c0ec0f462ea6", "gsd-core/workflows/validate-phase.md": "6d6d10fe53f6b1d0", - "gsd-core/workflows/verify-phase.md": "9ceb46a60cb6608b", + "gsd-core/workflows/verify-phase.md": "ce508f9c2242b91f", "gsd-core/workflows/verify-work.md": "5b348e73fc0d0829", "hooks/gsd-check-update.js": "ef48957eb6ac6a10", "hooks/gsd-context-monitor.js": "ec76b23f45d29b02", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index e67ec54ea..18eb0aec9 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -34,13 +34,13 @@ "agents/gsd-ui-checker.agent.md": "47d8cf3486009e11", "agents/gsd-ui-researcher.agent.md": "0746daeb54f83008", "agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b", - "agents/gsd-verifier.agent.md": "87a8e3238e838a39", + "agents/gsd-verifier.agent.md": "b8fd5f43eac96078", "copilot-instructions.md": "1fb04111759f1645", "gsd-core/.gsd-runtime": "d0bcfb0a7f01f8c9", "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": "0a2fc4e226f009c5", + "gsd-core/bin/gsd-tools.cjs": "2fcf88250beb9214", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -57,7 +57,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "f992de8b2b1a4420", "gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad", - "gsd-core/references/checkpoints.md": "53ca1c205dda8b65", + "gsd-core/references/checkpoints.md": "d26b11ab5ece9e61", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "435474d5e10be65a", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -213,14 +213,14 @@ "gsd-core/workflows/add-todo.md": "f86f4efa25a5d0d6", "gsd-core/workflows/ai-integration-phase.md": "9dd7f80180f9c8e9", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "646fc39302300887", + "gsd-core/workflows/audit-fix.md": "1baff2494a1c093e", "gsd-core/workflows/audit-milestone.md": "258e4dfd259ab13f", "gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933", "gsd-core/workflows/autonomous.md": "dd972ddde9663295", "gsd-core/workflows/check-todos.md": "be9b50b5f28d7504", "gsd-core/workflows/cleanup.md": "8233b05ebf011bec", "gsd-core/workflows/code-review-fix.md": "fda53892ae4b17fc", - "gsd-core/workflows/code-review.md": "d58b02fb3a6160a8", + "gsd-core/workflows/code-review.md": "e36479e4d924c9a6", "gsd-core/workflows/complete-milestone.md": "470cf39261400ee2", "gsd-core/workflows/debug.md": "37c900b9f6c11663", "gsd-core/workflows/diagnose-issues.md": "42acbe2a43fc886e", @@ -244,11 +244,11 @@ "gsd-core/workflows/docs-update.md": "9292cfa3c52c434e", "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", "gsd-core/workflows/eval-review.md": "81c8e72ba3862856", - "gsd-core/workflows/execute-phase.md": "95afff0cf3e75bf6", + "gsd-core/workflows/execute-phase.md": "b402721e78b44197", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "63b712920f21a40f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "1963079fe27412c6", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "bce45e41bc6802e8", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "25bebed74e645109", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "dc0b96d285327b18", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "388f3cd58a3adac5", "gsd-core/workflows/explore.md": "5fd91a8510e1114b", @@ -303,7 +303,7 @@ "gsd-core/workflows/settings-advanced.md": "230a658de9c017a6", "gsd-core/workflows/settings-integrations.md": "a1d146d6bfd14db5", "gsd-core/workflows/settings.md": "f611f14f2f447f1e", - "gsd-core/workflows/ship.md": "3d0022d2d3ed8f78", + "gsd-core/workflows/ship.md": "7e52f4b11bd15b58", "gsd-core/workflows/sketch-wrap-up.md": "f2590cb6ddbfad94", "gsd-core/workflows/sketch.md": "e2063966439af8c1", "gsd-core/workflows/smart-entry.md": "6c707b959a41900b", @@ -320,7 +320,7 @@ "gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd", "gsd-core/workflows/update.md": "f444a7cfcd246cfb", "gsd-core/workflows/validate-phase.md": "e7aa423ebdd6a230", - "gsd-core/workflows/verify-phase.md": "dd76fff851c66df5", + "gsd-core/workflows/verify-phase.md": "3fcc54a0c46e5e2f", "gsd-core/workflows/verify-work.md": "c966971a3cbd1d71", "hooks/gsd-session.json": "3382597f61e3a559", "scripts/changeset/README.md": "86ff89331dfd94b2", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index e2121f3cc..fa075d617 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "c6c24e8066470830", "agents/gsd-ui-researcher.md": "0f5be5e55501f7e8", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "dea8e61123848fb4", + "agents/gsd-verifier.md": "f618c5051fa5c317", "commands/gsd-add-tests.md": "1f89b16ab2cca426", "commands/gsd-ai-integration-phase.md": "99f66291ded1899d", "commands/gsd-audit-fix.md": "d88502ffa2151cec", @@ -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": "35ec4c40e46036eb", + "gsd-core/bin/gsd-tools.cjs": "31f45cfd36e5dfdb", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a", - "gsd-core/references/checkpoints.md": "f852c96c5fe25015", + "gsd-core/references/checkpoints.md": "a44e66095240c46e", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "304dcdab82a27623", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "1ee0525664fb062f", "gsd-core/workflows/ai-integration-phase.md": "a349e94b18839873", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce", "gsd-core/workflows/check-todos.md": "1a67337d1630848f", "gsd-core/workflows/cleanup.md": "db47963f103c2748", "gsd-core/workflows/code-review-fix.md": "c57af378033b1b58", - "gsd-core/workflows/code-review.md": "8d7d2de8781fb3f9", + "gsd-core/workflows/code-review.md": "9860df7228426ae5", "gsd-core/workflows/complete-milestone.md": "1400a4856f592f3e", "gsd-core/workflows/debug.md": "fb9e5ecb5027b98e", "gsd-core/workflows/diagnose-issues.md": "cd582747131726e3", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "a86279dd98dd5c03", - "gsd-core/workflows/execute-phase.md": "875819cbb102d6bc", + "gsd-core/workflows/execute-phase.md": "a09f05b2295ae2d2", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "13e9664263d3844d", "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "bf8ea69c8f7ae019", "gsd-core/workflows/settings-integrations.md": "166ca51b1f33c2a3", "gsd-core/workflows/settings.md": "0623c673eaf04799", - "gsd-core/workflows/ship.md": "36603e9c574e8374", + "gsd-core/workflows/ship.md": "6e3ac35dc933a39a", "gsd-core/workflows/sketch-wrap-up.md": "5be73b7bdf96b539", "gsd-core/workflows/sketch.md": "373bc0d83368a411", "gsd-core/workflows/smart-entry.md": "c8fc316358cdcd7b", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "18dec684fb1076f9", "gsd-core/workflows/update.md": "23e294ba707c3580", "gsd-core/workflows/validate-phase.md": "d03a94b7b807be12", - "gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f", + "gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9", "gsd-core/workflows/verify-work.md": "e7e7e900c4874490", "hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f", "hooks/gsd-cursor-pre-tool.js": "fe274720781fcbb5", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index acb175481..3ab603323 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -34,12 +34,12 @@ "agents/gsd-ui-checker.md": "cfc8a3bac0a0ef5b", "agents/gsd-ui-researcher.md": "8799b6013e06ae49", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "82d3e9015ed04017", + "agents/gsd-verifier.md": "de64454ee98634cd", "gsd-core/.gsd-runtime": "d53ba9ce30ffd743", "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": "693bd27cb9b76b76", + "gsd-core/bin/gsd-tools.cjs": "6df1804284c68471", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -56,7 +56,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "36b2de4768b228af", + "gsd-core/references/checkpoints.md": "6e4b08a89c485c71", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "b93e9f47aa1b1753", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -212,14 +212,14 @@ "gsd-core/workflows/add-todo.md": "8ba173153be63a40", "gsd-core/workflows/ai-integration-phase.md": "753a41301e4d2a4c", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "bf84c94d2ccdacbf", + "gsd-core/workflows/audit-fix.md": "a7f94d5c43583aeb", "gsd-core/workflows/audit-milestone.md": "b96a78c6bd2e7690", "gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad", "gsd-core/workflows/autonomous.md": "853dd93846332743", "gsd-core/workflows/check-todos.md": "ea9a303c48a5d752", "gsd-core/workflows/cleanup.md": "6c488059fc152a49", "gsd-core/workflows/code-review-fix.md": "5e396494a79c3f19", - "gsd-core/workflows/code-review.md": "cf7735c3643d9190", + "gsd-core/workflows/code-review.md": "b73d0784b9abd2f4", "gsd-core/workflows/complete-milestone.md": "f1866541148dc291", "gsd-core/workflows/debug.md": "a8132ea4480a4730", "gsd-core/workflows/diagnose-issues.md": "385096674965c043", @@ -243,11 +243,11 @@ "gsd-core/workflows/docs-update.md": "ba4cf926fc463cbe", "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", "gsd-core/workflows/eval-review.md": "f510e5762212dc6f", - "gsd-core/workflows/execute-phase.md": "e69d330bed0d9468", + "gsd-core/workflows/execute-phase.md": "4181b4370acee4ec", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "14a27cc0828f59d3", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5d3a54df40320dbf", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "1ec347a324814b1d", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "362123fdf99e9980", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "a691e3afe88031b8", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "ed1528fcbfb792a8", "gsd-core/workflows/explore.md": "d931b4d85a74c795", @@ -302,7 +302,7 @@ "gsd-core/workflows/settings-advanced.md": "49be159144d7f426", "gsd-core/workflows/settings-integrations.md": "1dce76db0aca08a5", "gsd-core/workflows/settings.md": "9ced580679ed0255", - "gsd-core/workflows/ship.md": "36029cf37057f466", + "gsd-core/workflows/ship.md": "8e8c1d3c8204769d", "gsd-core/workflows/sketch-wrap-up.md": "f1ece50ac65ea281", "gsd-core/workflows/sketch.md": "d5887983e62b574a", "gsd-core/workflows/smart-entry.md": "47f5c5e8608e5f7a", @@ -319,7 +319,7 @@ "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "7499bb4cb2a3ce6f", "gsd-core/workflows/validate-phase.md": "24be83176c7db9f9", - "gsd-core/workflows/verify-phase.md": "d2a254cc06eb2e84", + "gsd-core/workflows/verify-phase.md": "42f0fba74d069537", "gsd-core/workflows/verify-work.md": "3847a7ccd4bd88a8", "hooks/gsd-check-update-worker.js": "7989cc2bedd1138d", "hooks/gsd-check-update.js": "25f5ad726f76fc11", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index b7c0cfdf3..86a761430 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "e078ea5a07313976", "agents/gsd-ui-researcher.md": "cc9578c4f686d926", "agents/gsd-user-profiler.md": "b8cb09319c517701", - "agents/gsd-verifier.md": "af609b1959cde3f3", + "agents/gsd-verifier.md": "49a733b54fa955c2", "command/gsd-add-tests.md": "c314f9a6be312bfa", "command/gsd-ai-integration-phase.md": "9c47e446af993c53", "command/gsd-audit-fix.md": "4106e9dce9b71585", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006", - "gsd-core/references/checkpoints.md": "afc6933d99f73358", + "gsd-core/references/checkpoints.md": "d52116f59e92ca43", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "533eae480bfc4bb8", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "31bc520d77b14139", "gsd-core/workflows/ai-integration-phase.md": "d4400169618e6925", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "73f429f7472c9949", "gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7", "gsd-core/workflows/cleanup.md": "c5f1bf186395d67d", "gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc", - "gsd-core/workflows/code-review.md": "14682c0ba32d5dc6", + "gsd-core/workflows/code-review.md": "3fd49c93357fe4f7", "gsd-core/workflows/complete-milestone.md": "59753bf44d4300da", "gsd-core/workflows/debug.md": "e88c2d430c3625b6", "gsd-core/workflows/diagnose-issues.md": "210b5b313e8a559a", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "79afaaf19fd527cc", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "926eda8bbee28b23", - "gsd-core/workflows/execute-phase.md": "a470b8e99e963c83", + "gsd-core/workflows/execute-phase.md": "17fe49293d779e2f", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "0e40eda4ae70fcab", "gsd-core/workflows/explore.md": "14242d36d4822df6", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "edd858cd6cfddaf1", "gsd-core/workflows/settings-integrations.md": "3ea8095d5fad891b", "gsd-core/workflows/settings.md": "1925ecc2225c2216", - "gsd-core/workflows/ship.md": "e8ea6299b57fef04", + "gsd-core/workflows/ship.md": "7afe19fa2d472013", "gsd-core/workflows/sketch-wrap-up.md": "888c0548e63197b3", "gsd-core/workflows/sketch.md": "34a0c10fa56af7ea", "gsd-core/workflows/smart-entry.md": "7ffe4fdb93935400", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "7cd2153f8b15e30d", "gsd-core/workflows/update.md": "07dc2fba78ad1865", "gsd-core/workflows/validate-phase.md": "52b9fa8a9533b444", - "gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f", + "gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9", "gsd-core/workflows/verify-work.md": "9fc717845828c6e3", "hooks/gsd-check-update-worker.js": "c992bbad91d0e994", "hooks/gsd-check-update.js": "fdd77abe7ef26a2d", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index fbee78f21..a28874155 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -97,13 +97,13 @@ "agents/subagents/gsd-ui-researcher.yaml": "15e215874bc2c37d", "agents/subagents/gsd-user-profiler.md": "c16f94e09e433394", "agents/subagents/gsd-user-profiler.yaml": "645826a29d079159", - "agents/subagents/gsd-verifier.md": "699f62763424ac68", + "agents/subagents/gsd-verifier.md": "862e8f8dcb059014", "agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382", "gsd-core/.gsd-runtime": "cb556f5d5cee2779", "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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -120,7 +120,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -276,14 +276,14 @@ "gsd-core/workflows/add-todo.md": "953314cdfef56bc4", "gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", - "gsd-core/workflows/code-review.md": "2aa1957579f50a87", + "gsd-core/workflows/code-review.md": "c877ad812b4a511e", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "67c058fc7ae6026b", @@ -307,11 +307,11 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "d06e2f3aa15eba2b", + "gsd-core/workflows/execute-phase.md": "81e1f72a08f74e44", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "045ad8cb48444e57", "gsd-core/workflows/explore.md": "6c04f2e658d93261", @@ -366,7 +366,7 @@ "gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44", "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", "gsd-core/workflows/settings.md": "d96ddf01fb85e61e", - "gsd-core/workflows/ship.md": "f486f2731ca8b72a", + "gsd-core/workflows/ship.md": "369f1461685d1897", "gsd-core/workflows/sketch-wrap-up.md": "b767a1d3db129a8a", "gsd-core/workflows/sketch.md": "88cfdf4edcf222ab", "gsd-core/workflows/smart-entry.md": "449238eb94abe187", @@ -383,7 +383,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "6718e0632bba26ca", "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", - "gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f", + "gsd-core/workflows/verify-phase.md": "d26a2c3269340caf", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 5dac884cb..cc8edad76 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "4f88fd4c9d4c56a3", "agents/gsd-ui-researcher.md": "ecb617901cb7ad06", "agents/gsd-user-profiler.md": "d825b4c0a6431f8b", - "agents/gsd-verifier.md": "b9f2e801f9395a35", + "agents/gsd-verifier.md": "2460e48bbb991adc", "commands/gsd-add-tests.md": "b9cd93ed01945f75", "commands/gsd-ai-integration-phase.md": "038709fe91d897e4", "commands/gsd-audit-fix.md": "5615403843d5e491", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "218c55caf8aff6df", "gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006", - "gsd-core/references/checkpoints.md": "afc6933d99f73358", + "gsd-core/references/checkpoints.md": "d52116f59e92ca43", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "355826e667f9ccd1", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "36b6d7fec9631ec7", "gsd-core/workflows/ai-integration-phase.md": "f8288f0434d17c84", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "20d2c2a6c49e750b", + "gsd-core/workflows/audit-fix.md": "3aaafee8857dcfab", "gsd-core/workflows/audit-milestone.md": "8bd0b730de08d1a8", "gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b", "gsd-core/workflows/autonomous.md": "6cb0c014f5f56965", "gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e", "gsd-core/workflows/cleanup.md": "94d771d26f62dc86", "gsd-core/workflows/code-review-fix.md": "adb9388bb157610c", - "gsd-core/workflows/code-review.md": "8ff9884096ae8341", + "gsd-core/workflows/code-review.md": "016d1c9cbabf04f2", "gsd-core/workflows/complete-milestone.md": "614299b2c08e66c3", "gsd-core/workflows/debug.md": "161be2a77ffce47a", "gsd-core/workflows/diagnose-issues.md": "2971c699d52f1b85", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "850366c2ef8fb780", "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", "gsd-core/workflows/eval-review.md": "5394694d29ad7543", - "gsd-core/workflows/execute-phase.md": "e5a4f684bd87245c", + "gsd-core/workflows/execute-phase.md": "14319ad35214eda9", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1804215577f1ad35", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "01c2fe9e5bcb57be", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "86b8a7f50115162f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "c4cba01539f0368a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "21f4d9b3abc334ce", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "ac4a07ff7e42190d", "gsd-core/workflows/explore.md": "7f5f9231cfd3089b", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "252b0d3edc315339", "gsd-core/workflows/settings-integrations.md": "d1711a95f44fdbde", "gsd-core/workflows/settings.md": "2e42ee34c791378a", - "gsd-core/workflows/ship.md": "1875ec8f59fcf0b4", + "gsd-core/workflows/ship.md": "fb70add4f61cf3e8", "gsd-core/workflows/sketch-wrap-up.md": "681800323681c5c6", "gsd-core/workflows/sketch.md": "fcb7af914159ef7b", "gsd-core/workflows/smart-entry.md": "2a253fe437496eea", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "0bba5e7f6196c894", "gsd-core/workflows/update.md": "71b6cd852f38b4bc", "gsd-core/workflows/validate-phase.md": "434d9927c65f2bba", - "gsd-core/workflows/verify-phase.md": "763485e1b7547cdb", + "gsd-core/workflows/verify-phase.md": "73025aa5d8bf7bd5", "gsd-core/workflows/verify-work.md": "ae07b3fa8b6f864e", "hooks/gsd-check-update-worker.js": "385fb7c67810baf6", "hooks/gsd-check-update.js": "4549451414ffa7d7", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index d3e9d798a..364ff4da0 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -23,7 +23,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -179,14 +179,14 @@ "gsd-core/workflows/add-todo.md": "953314cdfef56bc4", "gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", - "gsd-core/workflows/code-review.md": "2aa1957579f50a87", + "gsd-core/workflows/code-review.md": "c877ad812b4a511e", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "d6d978fddfd5da8d", @@ -210,11 +210,11 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "01ccacd935b7c620", + "gsd-core/workflows/execute-phase.md": "7c0a1f21258543e0", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "6412aa2edd5a4452", "gsd-core/workflows/explore.md": "6c04f2e658d93261", @@ -269,7 +269,7 @@ "gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44", "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", "gsd-core/workflows/settings.md": "d96ddf01fb85e61e", - "gsd-core/workflows/ship.md": "f486f2731ca8b72a", + "gsd-core/workflows/ship.md": "369f1461685d1897", "gsd-core/workflows/sketch-wrap-up.md": "838c701bd072ae73", "gsd-core/workflows/sketch.md": "c7725562b3efd311", "gsd-core/workflows/smart-entry.md": "449238eb94abe187", @@ -286,7 +286,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "7e69d278375a2493", "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", - "gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f", + "gsd-core/workflows/verify-phase.md": "d26a2c3269340caf", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "55376b5b9335a580", "hooks/gsd-check-update.js": "a89562537a41f83d", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index ff0a1b6b7..32a4628f0 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -34,12 +34,12 @@ "agents/gsd-ui-checker.md": "7d708c53a106f748", "agents/gsd-ui-researcher.md": "e3768304c1c77753", "agents/gsd-user-profiler.md": "13388a80dc302a66", - "agents/gsd-verifier.md": "113d8dcff860b595", + "agents/gsd-verifier.md": "76c590718eac86e5", "gsd-core/.gsd-runtime": "2b626670f713516a", "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": "3f367ea99374b291", + "gsd-core/bin/gsd-tools.cjs": "ebbae1afe8c7fcd5", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -56,7 +56,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "83c7ac100419e9e0", + "gsd-core/references/checkpoints.md": "5e2d923303f16667", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "a1351dd40ef8691f", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -212,14 +212,14 @@ "gsd-core/workflows/add-todo.md": "83426131a56b8e77", "gsd-core/workflows/ai-integration-phase.md": "dd58ee9044bdf3c2", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "fe2e5a89d158f9eb", + "gsd-core/workflows/audit-fix.md": "83896ff28c48b182", "gsd-core/workflows/audit-milestone.md": "78dbc1e8c4499d7d", "gsd-core/workflows/audit-uat.md": "97d441d07e7972b3", "gsd-core/workflows/autonomous.md": "3014ff90115f0daf", "gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1", "gsd-core/workflows/cleanup.md": "6a18b165752e3087", "gsd-core/workflows/code-review-fix.md": "f3725ae9d685bed2", - "gsd-core/workflows/code-review.md": "6076e252b0d315f4", + "gsd-core/workflows/code-review.md": "657f309742b1a4c9", "gsd-core/workflows/complete-milestone.md": "40085d32b15805c8", "gsd-core/workflows/debug.md": "09b6bad63939bb82", "gsd-core/workflows/diagnose-issues.md": "652ae26975f82242", @@ -243,11 +243,11 @@ "gsd-core/workflows/docs-update.md": "45d2f0d173c84e07", "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", "gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4", - "gsd-core/workflows/execute-phase.md": "e51bcc011f22d197", + "gsd-core/workflows/execute-phase.md": "e98c1a00c1cdd6a3", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "36af8d91e4ae8b9c", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "94765e9fc206efbf", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "463e4e1b57b22b24", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0b04cc2dcab61107", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "9cbf100b17f4bcb1", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "25ef51fc9900f4b4", "gsd-core/workflows/explore.md": "e1a83a8982532e5b", @@ -302,7 +302,7 @@ "gsd-core/workflows/settings-advanced.md": "5e05212fb5cba531", "gsd-core/workflows/settings-integrations.md": "29c5de27fbbb18e9", "gsd-core/workflows/settings.md": "26b9b7979d3a5747", - "gsd-core/workflows/ship.md": "a07a8ab18935985a", + "gsd-core/workflows/ship.md": "55cc3a0b0d188021", "gsd-core/workflows/sketch-wrap-up.md": "89e0eab2af946b04", "gsd-core/workflows/sketch.md": "483387542d6fc3af", "gsd-core/workflows/smart-entry.md": "d309710bcabd4675", @@ -319,7 +319,7 @@ "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "b34cb866152d4de3", "gsd-core/workflows/validate-phase.md": "dfb9bd178ee1b67b", - "gsd-core/workflows/verify-phase.md": "683719ec1ee82e38", + "gsd-core/workflows/verify-phase.md": "7d8e241350136ca0", "gsd-core/workflows/verify-work.md": "3355ddc14f052fff", "hooks/gsd-check-update-worker.js": "4bb354044e0dff91", "hooks/gsd-check-update.js": "d2065cb3e725a42a", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 7a14f8ff9..45448f719 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -34,12 +34,12 @@ "agents/gsd-ui-checker.md": "7ecd910efa6eb00e", "agents/gsd-ui-researcher.md": "9e1a84a55a4cac99", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "99e95e235aacffbf", + "agents/gsd-verifier.md": "6c7e68a4a64cac57", "gsd-core/.gsd-runtime": "c96852d55ce78a68", "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": "84762454c60a6c9a", + "gsd-core/bin/gsd-tools.cjs": "1673458b3332be8a", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -56,7 +56,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "610690dba4d600c1", + "gsd-core/references/checkpoints.md": "4d24ce110ed6c746", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "b7e9640063775c98", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -212,14 +212,14 @@ "gsd-core/workflows/add-todo.md": "fefa923ed596225f", "gsd-core/workflows/ai-integration-phase.md": "197ebcc6abb0b873", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "2d4d783caf51f781", + "gsd-core/workflows/audit-fix.md": "eb92f0de6ccc23a5", "gsd-core/workflows/audit-milestone.md": "ebec95af8f68f2ed", "gsd-core/workflows/audit-uat.md": "6e768b1c208a787a", "gsd-core/workflows/autonomous.md": "c482645c5d1ead46", "gsd-core/workflows/check-todos.md": "0dda8236355e8c9c", "gsd-core/workflows/cleanup.md": "82f65f5214ecd748", "gsd-core/workflows/code-review-fix.md": "f2761f7f8c4a5674", - "gsd-core/workflows/code-review.md": "c5311718997f7681", + "gsd-core/workflows/code-review.md": "41f0c51d8c4e7732", "gsd-core/workflows/complete-milestone.md": "6e918b72bd885426", "gsd-core/workflows/debug.md": "04b29e0ba18603b6", "gsd-core/workflows/diagnose-issues.md": "9274b11a3db98c65", @@ -243,11 +243,11 @@ "gsd-core/workflows/docs-update.md": "f13571f08e083356", "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", "gsd-core/workflows/eval-review.md": "37d545d4f0db4927", - "gsd-core/workflows/execute-phase.md": "13789ed1d5ffc4e4", + "gsd-core/workflows/execute-phase.md": "73649315fea5bd61", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c985a30317a1aa6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "06f115a379580094", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "9d58274a5a1b14f5", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7d30384e9bf82664", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "90efedae3decaffe", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "1a409bc80100b6ee", "gsd-core/workflows/explore.md": "8a5437aa0c239c38", @@ -302,7 +302,7 @@ "gsd-core/workflows/settings-advanced.md": "39e66386f6c48025", "gsd-core/workflows/settings-integrations.md": "f8f756709ec02363", "gsd-core/workflows/settings.md": "44b10c59215633b8", - "gsd-core/workflows/ship.md": "1d471a767b11e961", + "gsd-core/workflows/ship.md": "7d6e81541d393db2", "gsd-core/workflows/sketch-wrap-up.md": "dbec602d104cb951", "gsd-core/workflows/sketch.md": "44ff275150b6d045", "gsd-core/workflows/smart-entry.md": "d8018578571f08d5", @@ -319,7 +319,7 @@ "gsd-core/workflows/undo.md": "59b8baa54efc4110", "gsd-core/workflows/update.md": "1f935251fca1f276", "gsd-core/workflows/validate-phase.md": "58fd1a0a679d7115", - "gsd-core/workflows/verify-phase.md": "40047a62ab2da6b2", + "gsd-core/workflows/verify-phase.md": "101bf5a6e15f0b04", "gsd-core/workflows/verify-work.md": "dde2a42a56c27c4e", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 99d66fa88..b6a31316d 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -34,12 +34,12 @@ "agents/gsd-ui-checker.md": "56698909c270b130", "agents/gsd-ui-researcher.md": "c348aa3ff8412ecb", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "a07b00b9c5b7b338", + "agents/gsd-verifier.md": "4c43a4929c6f8013", "gsd-core/.gsd-runtime": "fe100af8906532d6", "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": "3a0f24b2def05244", + "gsd-core/bin/gsd-tools.cjs": "ecc544c0f939432b", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -56,7 +56,7 @@ "gsd-core/references/api-coverage.md": "205a43c5fa7c221c", "gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e", "gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a", - "gsd-core/references/checkpoints.md": "de9f3b7bd86a44ac", + "gsd-core/references/checkpoints.md": "900530adaf675e38", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "ff843cd6139c8564", "gsd-core/references/continuation-format.md": "580287399ad3ba68", @@ -212,14 +212,14 @@ "gsd-core/workflows/add-todo.md": "50d17053c6cfbc31", "gsd-core/workflows/ai-integration-phase.md": "e556fe979752c52b", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "fe4d636f2dca6d74", + "gsd-core/workflows/audit-fix.md": "f12182fa57f92cb5", "gsd-core/workflows/audit-milestone.md": "868db5a8f5d55040", "gsd-core/workflows/audit-uat.md": "d496e39402e160de", "gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2", "gsd-core/workflows/check-todos.md": "afc840fceb07bf99", "gsd-core/workflows/cleanup.md": "93c14107979a4428", "gsd-core/workflows/code-review-fix.md": "b99b1f20bb27c291", - "gsd-core/workflows/code-review.md": "ac70888b14a21aaf", + "gsd-core/workflows/code-review.md": "a89512ce6c30693c", "gsd-core/workflows/complete-milestone.md": "f463bf4e86ac26f6", "gsd-core/workflows/debug.md": "830c309b48c35c8c", "gsd-core/workflows/diagnose-issues.md": "447072aa72385271", @@ -243,11 +243,11 @@ "gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0", "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", "gsd-core/workflows/eval-review.md": "b28be79ef29f16fd", - "gsd-core/workflows/execute-phase.md": "0fc874e8103061d5", + "gsd-core/workflows/execute-phase.md": "1b27831de2d19613", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "47ae5482f8e64100", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "003c6a0f21a4aa61", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "e469e777fb8e7fbb", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fb4497767cdf73a3", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "c54d55fad3ab5263", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "864931070aedf894", "gsd-core/workflows/explore.md": "04e461ff8159a24e", @@ -302,7 +302,7 @@ "gsd-core/workflows/settings-advanced.md": "2f86ec7b998f9485", "gsd-core/workflows/settings-integrations.md": "b082fc518b484c07", "gsd-core/workflows/settings.md": "002eb0ce3c10c741", - "gsd-core/workflows/ship.md": "4ff6590f1e04f124", + "gsd-core/workflows/ship.md": "6f611c07a1d34ff2", "gsd-core/workflows/sketch-wrap-up.md": "10063f56c2c7f141", "gsd-core/workflows/sketch.md": "25c1f8f7acfb1da9", "gsd-core/workflows/smart-entry.md": "bd81482cb6a7ac53", @@ -319,7 +319,7 @@ "gsd-core/workflows/undo.md": "18dec684fb1076f9", "gsd-core/workflows/update.md": "79aaf4b8f1f83045", "gsd-core/workflows/validate-phase.md": "bf16fd7ff71286b2", - "gsd-core/workflows/verify-phase.md": "8b7122e986853576", + "gsd-core/workflows/verify-phase.md": "382490481d794ed5", "gsd-core/workflows/verify-work.md": "cce8ae44b30957f1", "hooks/gsd-windsurf-pre-command.js": "7467a8a63e354aad", "hooks/gsd-windsurf-pre-write.js": "1c8a776d7ae2dcce", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 5d84e3369..80ec55f9c 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -34,7 +34,7 @@ "agents/gsd-ui-checker.md": "15949ccab982b71c", "agents/gsd-ui-researcher.md": "0e8ec8509d476904", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "8282761ba471c022", + "agents/gsd-verifier.md": "cd5bea62bf704829", "commands/gsd-add-tests.md": "51542808862d4aa7", "commands/gsd-ai-integration-phase.md": "a693c0ade172bc3d", "commands/gsd-audit-fix.md": "24d7e5478c271584", @@ -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": "bcecc5e92220b2b3", + "gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -127,7 +127,7 @@ "gsd-core/references/api-coverage.md": "66264d41dfd9154a", "gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5", "gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785", - "gsd-core/references/checkpoints.md": "b1530628d693fc85", + "gsd-core/references/checkpoints.md": "c2fe89c42ca88349", "gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29", "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", @@ -283,14 +283,14 @@ "gsd-core/workflows/add-todo.md": "953314cdfef56bc4", "gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "ca751f6538c8f496", + "gsd-core/workflows/audit-fix.md": "d511f4094ce351aa", "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", - "gsd-core/workflows/code-review.md": "2aa1957579f50a87", + "gsd-core/workflows/code-review.md": "c877ad812b4a511e", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "aa8d787db8f3c46c", @@ -314,11 +314,11 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "2f43fae80c4c4fab", + "gsd-core/workflows/execute-phase.md": "19fffcd1a2d76d4e", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", - "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", + "gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", "gsd-core/workflows/execute-plan.md": "ee300f9c6f7626c8", "gsd-core/workflows/explore.md": "6c04f2e658d93261", @@ -373,7 +373,7 @@ "gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44", "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", "gsd-core/workflows/settings.md": "d96ddf01fb85e61e", - "gsd-core/workflows/ship.md": "f486f2731ca8b72a", + "gsd-core/workflows/ship.md": "369f1461685d1897", "gsd-core/workflows/sketch-wrap-up.md": "86db87b16548117e", "gsd-core/workflows/sketch.md": "e96f1866d3e60cab", "gsd-core/workflows/smart-entry.md": "449238eb94abe187", @@ -390,7 +390,7 @@ "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "dc580dee13f881a6", "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", - "gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f", + "gsd-core/workflows/verify-phase.md": "d26a2c3269340caf", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", diff --git a/tests/run-with-timeout.test.cjs b/tests/run-with-timeout.test.cjs new file mode 100644 index 000000000..00994d609 --- /dev/null +++ b/tests/run-with-timeout.test.cjs @@ -0,0 +1,281 @@ +'use strict'; + +/** + * #2351 — `gsd_run run-with-timeout`: a portable, coreutils-independent + * wall-clock cap for a spawned command, plus the parity guard that keeps + * hardcoded GNU `timeout` from reappearing in workflow/agent/reference markdown. + * + * Root cause it fixes: workflow gates hardcoded `timeout `. `timeout` + * is GNU coreutils; stock macOS ships neither it nor `gtimeout`, so the call + * exited 127 ("command not found") and a passing build/test was misreported as + * a FAILURE. The verb replaces every such call with a Node-based cap that keeps + * GNU `timeout`'s exit-code contract (124 on timeout) on every platform. + * + * These are behavioral tests driven through the real CLI entrypoint + * (spawnSync of gsd-tools.cjs), never source-text assertions. The parity block + * consumes the lint module's typed findings, not grepped text. + */ + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const { spawnSync } = require('node:child_process'); +const os = require('node:os'); +const path = require('node:path'); +const fs = require('node:fs'); +const { setTimeout: sleep } = require('node:timers/promises'); +const { createTempDir, cleanup } = require('./helpers.cjs'); + +const ROOT = path.join(__dirname, '..'); +const GSD_TOOLS = path.join(ROOT, 'gsd-core', 'bin', 'gsd-tools.cjs'); +const NODE = process.execPath; + +// run-with-timeout intercepts before gsd-tools' cwd/workstream resolution, so it +// needs no project fixture — run from a neutral temp dir to prove independence. +function runVerb(args, opts = {}) { + return spawnSync(NODE, [GSD_TOOLS, 'run-with-timeout', ...args], { + cwd: os.tmpdir(), + encoding: 'utf8', + timeout: 30000, // test-harness backstop; the verb's own cap is what we assert + ...opts, + }); +} + +// A guaranteed-hanging child, cross-platform (no reliance on `sleep`). +const HANG = [NODE, '-e', 'setTimeout(() => {}, 60000)']; +// A guaranteed-fast child. +const OK = [NODE, '-e', 'process.exit(0)']; + +describe('#2351 run-with-timeout — exit-code contract', () => { + test('passes a fast zero-exit command through as exit 0', () => { + const r = runVerb(['5', '--', ...OK]); + assert.equal(r.status, 0); + }); + + test('passes a non-zero exit code through unchanged', () => { + const r = runVerb(['5', '--', NODE, '-e', 'process.exit(7)']); + assert.equal(r.status, 7); + }); + + test('exits 124 when the wall-clock budget is exceeded (matches GNU timeout)', () => { + const start = Date.now(); + const r = runVerb(['1', '--', ...HANG]); + assert.equal(r.status, 124, 'a timed-out command must exit 124'); + // Sanity: the cap actually fired promptly, not the 30s harness backstop. + assert.ok(Date.now() - start < 15000, 'timeout should fire near the 1s budget'); + }); + + test('exits 127 when the command is not found (matches GNU timeout)', () => { + const r = runVerb(['5', '--', 'this-command-does-not-exist-2351']); + assert.equal(r.status, 127); + }); + + test('runs without a timer when is 0 — a slow child is NOT killed', () => { + // Proves 0 = no timer (not "timer fired at 0ms"): a child that outlives any + // mis-armed timer must still exit 0. A wrongly-armed 0ms timer would give 124. + const r = runVerb(['0', '--', NODE, '-e', 'setTimeout(() => process.exit(0), 1500)']); + assert.equal(r.status, 0, ' 0 must run untimed'); + }); + + test('a budget past the 32-bit setTimeout ceiling does not spuriously time out', () => { + // secs*1000 > 2**31-1 → Node clamps setTimeout to 1ms → an immediate false 124 + // unless the delay is capped. The fast child must still exit 0, with no warning. + const r = runVerb(['3000000', '--', ...OK]); + assert.equal(r.status, 0, 'oversized budget must not fire an immediate timeout'); + assert.doesNotMatch(r.stderr || '', /TimeoutOverflowWarning/, 'delay must be clamped'); + }); +}); + +describe('#2351 run-with-timeout — argument handling (negative matrix)', () => { + test('missing is a usage error (exit 2), not a crash', () => { + const r = runVerb([]); + assert.equal(r.status, 2); + assert.match(r.stderr, /missing /); + assert.doesNotMatch(r.stderr, /at Object|at Module|\.cjs:\d+/, 'no stack trace in usage error'); + }); + + test('non-numeric is a usage error (exit 2)', () => { + const r = runVerb(['not-a-number', '--', ...OK]); + assert.equal(r.status, 2); + assert.match(r.stderr, /invalid /); + }); + + test('blank / whitespace is a usage error — never a silent unbounded run', () => { + for (const blank of ['', ' ']) { + const r = runVerb([blank, '--', ...OK]); + assert.equal(r.status, 2, `blank seconds ${JSON.stringify(blank)} must error, not disable the timer`); + assert.match(r.stderr, /invalid /); + } + }); + + test('missing is a usage error (exit 2)', () => { + const r = runVerb(['5']); + assert.equal(r.status, 2); + assert.match(r.stderr, /missing /); + }); + + test('a trailing `s` on the duration is accepted (GNU-style unit)', () => { + const r = runVerb(['5s', '--', ...OK]); + assert.equal(r.status, 0); + }); + + test('the `--` separator is optional', () => { + const r = runVerb(['5', ...OK]); + assert.equal(r.status, 0); + }); + + test("the wrapped command's argv is opaque — gsd-tools flags are NOT consumed", (t) => { + // --raw / --cwd / --pick are gsd-tools' own global flags. They must reach the + // wrapped command verbatim, not be stripped by the dispatcher. Use a script + // FILE, not `node -e` — node parses leading --flags after -e as its OWN options + // ("bad option", exit 9); after a script path it treats them as argv. + const dir = createTempDir('rwt-argv'); + t.after(() => cleanup(dir)); + const script = path.join(dir, 'argcheck.js'); + fs.writeFileSync(script, + 'process.exit(process.argv.slice(2).join(",") === "--raw,--cwd,x,--pick,y" ? 0 : 3);'); + const r = runVerb(['5', '--', NODE, script, '--raw', '--cwd', 'x', '--pick', 'y']); + assert.equal(r.status, 0, 'wrapped --raw/--cwd/--pick must be passed through untouched'); + }); + + test('the `query` meta-prefix form is accepted', () => { + const r = spawnSync(NODE, [GSD_TOOLS, 'query', 'run-with-timeout', '5', '--', ...OK], { + cwd: os.tmpdir(), encoding: 'utf8', timeout: 30000, + }); + assert.equal(r.status, 0); + }); +}); + +describe('#2351 run-with-timeout — kill semantics (POSIX process groups)', () => { + const posix = process.platform !== 'win32'; + + test('a timed-out command whose descendant traps SIGTERM is still reaped — no orphan/hang (C1)', { skip: !posix }, async (t) => { + // The HIGH-severity regression: the direct child exits on SIGTERM fast, but a + // descendant that IGNORES SIGTERM survives holding the inherited stdio. The + // whole process group must be SIGKILL-reaped, or a captured/piped gate hangs + // on the orphan. A node parent spawns the trapping child in the SAME process + // group (spawn WITHOUT `detached` → the child inherits the parent's pgid, + // deterministically, on every platform). We deliberately avoid `bash … &`: + // bash job-control can move a backgrounded job into its own process group, + // which no group-kill (nor GNU `timeout`) can reach. The parent exits fast on + // SIGTERM; the child ignores it and must still be reaped. + // + // Liveness is detected by a HEARTBEAT the child rewrites every 100ms — NOT + // `kill(pid, 0)`: a SIGKILL'd orphan lingers as a zombie until reaped, and a + // container's PID 1 reaps slowly, so `kill(pid,0)` reads a dead child as + // "alive". A reaped child stops ticking; a genuine orphan keeps ticking. + const dir = createTempDir('rwt-c1'); + t.after(() => cleanup(dir)); + const parentFile = path.join(dir, 'parent.js'); + const hbFile = path.join(dir, 'heartbeat'); + fs.writeFileSync(parentFile, [ + 'const cp = require("child_process");', + "const childCode = 'const fs=require(\"fs\");const hb=process.argv[1];process.on(\"SIGTERM\",()=>{});setInterval(()=>fs.writeFileSync(hb,String(Date.now())),100);';", + 'cp.spawn(process.execPath, ["-e", childCode, process.argv[2]], { stdio: "ignore" });', + 'process.on("SIGTERM", () => process.exit(0));', + 'setInterval(() => {}, 1000);', + ].join('\n')); + const r = runVerb(['1', '--', NODE, parentFile, hbFile], { timeout: 20000 }); + assert.equal(r.status, 124, 'must report a timeout (124), not hang'); + assert.ok(fs.existsSync(hbFile), 'child heartbeat should exist'); + await sleep(300); // let any in-flight write settle after the SIGKILL + const first = fs.readFileSync(hbFile, 'utf8'); + await sleep(600); // >> the 100ms heartbeat interval + const second = fs.readFileSync(hbFile, 'utf8'); + assert.equal(second, first, 'descendant must be reaped (heartbeat frozen), not orphaned and still ticking'); + }); + + test('a command killed by a signal exits 128+signum (bash convention)', { skip: !posix }, () => { + const r = runVerb(['10', '--', 'bash', '-c', 'kill -TERM $$']); + assert.equal(r.status, 143, 'self-SIGTERM (15) → 128+15 = 143'); + }); +}); + +describe('#2351 run-with-timeout — coreutils independence (the regression)', () => { + // The whole point: no dependency on GNU `timeout`/`gtimeout`. Prove it by + // scrubbing PATH so neither could be found, and driving the child by absolute + // path. Before #2351 the gates called `timeout …` directly and exited 127 here. + const scrubbedEnv = { ...process.env, PATH: '' }; + + test('a real zero-exit command passes even with an empty PATH (no coreutils)', () => { + const r = runVerb(['5', '--', ...OK], { env: scrubbedEnv }); + assert.equal(r.status, 0, 'must pass (exit 0), not 127, when coreutils is absent'); + }); + + test('a genuine timeout is still detected (exit 124) with an empty PATH', () => { + const r = runVerb(['1', '--', ...HANG], { env: scrubbedEnv }); + assert.equal(r.status, 124); + }); +}); + +describe('#2351 parity guard — no hardcoded timeout in workflow/agent/reference/command md', () => { + const { findRawTimeoutInvocations, scan, DEFAULT_ROOTS } = require('../scripts/lint-portable-timeout.cjs'); + + // Decoy fixtures sourced from the issue report (an author independent of the + // detector), per the fixture-provenance rule (#2371): the exact bug forms the + // guard must catch. + const BUG_FORMS = [ + 'timeout 300 bash -c "$BUILD_CMD" 2>&1', + 'timeout "$TEST_GATE_TIMEOUT" bash -c "$TEST_CMD" 2>&1', + 'timeout "$TEST_GATE_TIMEOUT" bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20', + 'echo "$TASK_PROMPT" | timeout "${CROSS_AI_TIMEOUT}s" ${CROSS_AI_CMD} > out 2>err', + 'timeout 120 "$FALLOW_BIN" audit --format json --quiet', + 'REVIEW_OUTPUT=$(echo "$X" | timeout 120 ${REVIEW_CMD} 2>/tmp/e.log)', + 'timeout 30s bash "$probe"', + 'gtimeout 60 bash -c "x"', + // GNU long options / no-space short opt / arithmetic budget (review #2351 C3) + 'timeout --kill-after=5 30 bash -c x', + 'timeout --foreground 30 bash -c x', + 'timeout --signal=KILL 30 bash -c x', + 'timeout -k5 30 bash -c x', + 'timeout $((60*5)) bash -c x', + 'cmd && timeout 30 bash x', + ]; + + // Forms that must NEVER be flagged: the approved verb, portable capability + // probes, config keys, the agy flag, prose, and variable names. + const CLEAN_FORMS = [ + 'gsd_run run-with-timeout 300 -- bash -c "$BUILD_CMD"', + 'echo "$X" | gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}" -- ${CROSS_AI_CMD}', + '_AGY_KILLER="$(command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null || true)"', + '"$_AGY_KILLER" 600 agy --print-timeout 540s "$@" -p "$PROMPT"', + 'TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout || echo "600")', + 'echo "⚠ test gate timed out after ${TEST_GATE_TIMEOUT}s"', + '# bound the build with a 5-minute timeout', + 'const TIMEOUT = 300;', + // prose mentions of "timeout " mid-sentence must not be flagged (review #2351 C4) + 'increase the timeout 30 seconds if the runner is slow', + '# we replaced timeout 300 with the run-with-timeout verb', + 'sometimeout 30 is not the timeout command', + ]; + + for (const form of BUG_FORMS) { + test(`flags a bare timeout invocation: ${form.slice(0, 42)}…`, () => { + const findings = findRawTimeoutInvocations(form); + assert.equal(findings.length, 1, `should flag: ${form}`); + assert.equal(findings[0].line, 1); + }); + } + + for (const form of CLEAN_FORMS) { + test(`does not flag a portable/unrelated form: ${form.slice(0, 42)}…`, () => { + assert.deepEqual(findRawTimeoutInvocations(form), [], `should NOT flag: ${form}`); + }); + } + + test('multi-line input reports the correct line numbers', () => { + const text = ['clean line', 'gsd_run run-with-timeout 5 -- true', 'timeout 30 bash x'].join('\n'); + const findings = findRawTimeoutInvocations(text); + assert.equal(findings.length, 1); + assert.equal(findings[0].line, 3); + }); + + test('every shipped workflow/agent/reference/command surface is clean (regression)', () => { + // Would have returned 10 offenders before the #2351 conversions landed. + const offenders = scan(DEFAULT_ROOTS); + assert.deepEqual( + offenders, + [], + `hardcoded timeout still present:\n${offenders.map((o) => `${o.file}:${o.line} ${o.snippet}`).join('\n')}`, + ); + }); +}); diff --git a/tests/test-gate-watch-mode.test.cjs b/tests/test-gate-watch-mode.test.cjs index 11f1683b6..e24530568 100644 --- a/tests/test-gate-watch-mode.test.cjs +++ b/tests/test-gate-watch-mode.test.cjs @@ -7,12 +7,12 @@ * Three gates were UNBOUNDED or silently-continued and are the core fix. They must: * - route the resolved command through the shared `normalize-test-command` * helper (defeats vitest/jest watch mode), so the paths cannot drift, - * - bound execution with `timeout` using the `workflow.test_gate_timeout` - * budget, and + * - bound execution with `gsd_run run-with-timeout` using the + * `workflow.test_gate_timeout` budget, and * - surface a timeout (exit 124) with a watch-mode hint — the regression gate * ABORTS, the others surface clearly (never silently ignored). * - * verify-phase's gate was ALREADY bounded (a fixed `timeout 300`, not a hang), so + * verify-phase's gate was ALREADY bounded (a fixed `run-with-timeout 300`, not a hang), so * it only needs the normalizer (so a watch runner exits fast) and keeps its own * fixed 5-minute bound — asserted separately below. */ @@ -50,7 +50,7 @@ describe('#1857: test gates normalize to one-shot and bound with a timeout', () test('bounds execution with a timeout using the workflow.test_gate_timeout budget', () => { const c = read(file); assert.match(c, /workflow\.test_gate_timeout/, `${label} must read workflow.test_gate_timeout`); - assert.match(c, /timeout "\$TEST_GATE_TIMEOUT"/, `${label} must wrap the test command in a timeout with the configured budget`); + assert.match(c, /run-with-timeout "\$TEST_GATE_TIMEOUT"/, `${label} must wrap the test command in run-with-timeout with the configured budget`); }); test('surfaces a timeout (exit 124) with a watch-mode hint — never a silent hang', () => { const c = read(file); @@ -60,7 +60,7 @@ describe('#1857: test gates normalize to one-shot and bound with a timeout', () }); } - // verify-phase is already bounded (fixed `timeout 300`, not a hang); it only + // verify-phase is already bounded (fixed `run-with-timeout 300`, not a hang); it only // needs the normalizer so a watch runner exits fast, and names watch mode on 124. describe('verify-phase gate (already bounded — normalize-only)', () => { test('routes the resolved command through the shared normalize-test-command helper', () => { diff --git a/tests/verifier-behavior-unverified.test.cjs b/tests/verifier-behavior-unverified.test.cjs index 52ed4cd3a..76b1c9046 100644 --- a/tests/verifier-behavior-unverified.test.cjs +++ b/tests/verifier-behavior-unverified.test.cjs @@ -180,11 +180,11 @@ describe('bug #3321: gsd-verifier runs probes instead of trusting SUMMARY claims assert.deepEqual(contract.executionSteps, [ 'Build the `PROBES` list from explicit PLAN declarations first; include conventional `scripts/*/tests/probe-*.sh` when the phase is a migration/tooling phase or the success criteria mention probes.', 'For every documented probe path, if the file is missing or unreadable, mark `MISSING_PROBE` and set `status: gaps_found`. Do not require the executable bit because probes run through `bash "$probe"`.', - 'Run each probe from the built `PROBES` list (declared + conventional) from the repository root:', + 'Run each probe from the built `PROBES` list from the repository root:', 'Exit code 0 is PASS. Any non-zero exit is FAILED and must include stdout/stderr evidence in VERIFICATION.md.', 'Do not substitute executor narration, SUMMARY.md PASS-marker counts, or a different dry-run driver command for the probe result.', ]); - assert.equal(contract.executionCommand, 'for probe in "${PROBES[@]}"; do\n timeout 30s bash "$probe"\ndone'); + assert.equal(contract.executionCommand, 'for probe in "${PROBES[@]}"; do\n gsd_run run-with-timeout 30 -- bash "$probe"\ndone'); assert.deepEqual(contract.statusRows, [{ probe: 'scripts/.../probe-name.sh', command: 'bash "$probe"', diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index 17953e08d..c725d838c 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -5,14 +5,14 @@ "add-todo.md": 10734, "ai-integration-phase.md": 15134, "analyze-dependencies.md": 3887, - "audit-fix.md": 11723, + "audit-fix.md": 11743, "audit-milestone.md": 18448, "audit-uat.md": 7469, "autonomous.md": 42474, "check-todos.md": 9475, "cleanup.md": 9941, "code-review-fix.md": 24320, - "code-review.md": 32504, + "code-review.md": 32524, "complete-milestone.md": 31071, "debug.md": 19031, "diagnose-issues.md": 12864, @@ -24,7 +24,7 @@ "docs-update.md": 55706, "edit-phase.md": 12927, "eval-review.md": 9967, - "execute-phase.md": 93376, + "execute-phase.md": 93395, "execute-plan.md": 34262, "explore.md": 10541, "extract-learnings.md": 12893, @@ -71,7 +71,7 @@ "settings-advanced.md": 40019, "settings-integrations.md": 15892, "settings.md": 33467, - "ship.md": 25555, + "ship.md": 25575, "sketch-wrap-up.md": 14267, "sketch.md": 20004, "smart-entry.md": 11124, @@ -88,6 +88,6 @@ "undo.md": 10431, "update.md": 20914, "validate-phase.md": 10849, - "verify-phase.md": 40929, + "verify-phase.md": 40949, "verify-work.md": 40247 }