Files
msd-core/tests/bug-3381-verify-work-workstream.test.cjs
jecanore 5657994702 fix(#1716): route resume_from_file to complete_session when no pending tests remain (#1722)
* fix(#1716): route resume_from_file to complete_session when no pending tests remain

When a UAT session has status:partial with blocked_count>0 and pending_count==0 (all remaining tests are blocked, none are pending), resume_from_file found no [pending] test and terminated silently — never routing to complete_session. This blocked the issues==0 auto-transition path even when there were zero code defects.

Guard clause added immediately after the find-pending step: if no [pending] test is found, route to complete_session. complete_session then correctly sets status:partial (because blocked_count>0) without presenting further tests.

Closes #1716

* chore(#1716): add changeset fragment and regenerate golden-install-parity fixtures

Changeset fragment for PR #1722 (type: Fixed).

Golden-install-parity fixtures regenerated for all 16 runtimes — the workflow fix shifts verify-work.md's byte-stable hash in the golden manifest. Regenerated via UPDATE_GOLDEN=1 node --test tests/golden-install-parity.test.cjs.
2026-07-02 11:58:06 -04:00

81 lines
3.3 KiB
JavaScript

// allow-test-rule: source-text-is-the-product — verify-work.md is a runtime workflow contract.
'use strict';
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
describe('bug #1716: resume_from_file routes to complete_session when no [pending] tests remain', () => {
test('resume_from_file step contains guard clause for zero-pending (all-blocked) case', () => {
const workflow = fs.readFileSync(
path.join(__dirname, '..', 'gsd-core', 'workflows', 'verify-work.md'),
'utf8',
);
const stepStart = workflow.indexOf('<step name="resume_from_file">');
assert.ok(stepStart !== -1, 'resume_from_file step must exist');
const stepEnd = workflow.indexOf('</step>', stepStart);
const stepBody = workflow.slice(stepStart, stepEnd);
// Guard must appear immediately after the find-pending instruction.
// Without it, all-blocked sessions (pending_count==0, blocked_count>0)
// silently terminate and never reach complete_session (#1716).
const findIdx = stepBody.indexOf("Find first test with `result: [pending]`.");
const guardIdx = stepBody.indexOf("If no `[pending]` test found → go to `complete_session`.");
assert.ok(findIdx !== -1, 'find-pending instruction must be present');
assert.ok(guardIdx !== -1, 'guard clause for zero-pending case must be present');
assert.ok(guardIdx > findIdx, 'guard must appear after find-pending instruction');
const between = stepBody
.slice(findIdx + "Find first test with `result: [pending]`.".length, guardIdx)
.trim();
assert.strictEqual(between, '', 'guard must be the next non-whitespace line after find-pending');
});
});
describe('bug #3381: verify-work forwards workstream context', () => {
test('workflow forwards ${GSD_WS} to workstream-sensitive SDK queries', () => {
const workflow = fs.readFileSync(
path.join(__dirname, '..', 'gsd-core', 'workflows', 'verify-work.md'),
'utf8',
);
assert.match(workflow, /GSD_WS=""/, 'verify-work must initialize GSD_WS');
assert.match(
workflow,
/grep -qE -- '--ws\[\[:space:\]\]\+\[\^\[:space:\]\]\+'/,
'verify-work must detect --ws in $ARGUMENTS',
);
assert.match(
workflow,
/grep -oE -- '--ws\[\[:space:\]\]\+\[\^\[:space:\]\]\+'/,
'verify-work must extract the --ws flag pair from $ARGUMENTS',
);
assert.match(
workflow,
/PHASE_ARG=\$\(echo "\$ARGUMENTS" \| sed -E 's\/--ws\[\[:space:\]\]\+\[\^\[:space:\]\]\+\/\/g' \| xargs\)/,
'verify-work must derive PHASE_ARG after removing --ws',
);
// After #3797 architectural fix, callsites use gsd_run
assert.match(
workflow,
/gsd_run query init\.verify-work "\$\{PHASE_ARG\}" \$\{GSD_WS\}/,
'init.verify-work must receive GSD_WS so phase_dir resolves in workstreams',
);
assert.match(
workflow,
/gsd_run query phase\.mvp-mode "\$\{phase_number\}" \$\{GSD_WS\} --pick active/,
'phase.mvp-mode must receive GSD_WS so roadmap mode is workstream-scoped',
);
assert.match(
workflow,
/gsd_run query roadmap\.get-phase "\$\{phase_number\}" \$\{GSD_WS\} --pick goal/,
'roadmap.get-phase must receive GSD_WS so goals are workstream-scoped',
);
});
});