refactor: hard-fork GSD -> MSD (Make Software Done)
Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD across contents and paths, upstream package/repo coordinates -> @golem15/msd-core and golem15com/msd-core. Deep links into upstream history, sibling upstream packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is. Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line, package/plugin identity, regenerated lockfile, install-tree fixtures, derived registries and benchmark baseline; migration checksum baseline re-locked (MSD keeps its own install state, so no install had applied the old sums); sort-order and regex-escaped expectations in tests adjusted.
This commit is contained in:
@@ -9,12 +9,12 @@ const { describe, test } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const { scanFencedBlocks } = require('../gsd-core/bin/lib/markdown-sectionizer.cjs');
|
||||
const { scanFencedBlocks } = require('../msd-core/bin/lib/markdown-sectionizer.cjs');
|
||||
|
||||
describe('debug session management implementation', () => {
|
||||
test('DEBUG.md template contains reasoning_checkpoint field', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/templates/DEBUG.md'),
|
||||
path.join(process.cwd(), 'msd-core/templates/DEBUG.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('reasoning_checkpoint'), 'DEBUG.md must contain reasoning_checkpoint field');
|
||||
@@ -22,7 +22,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('DEBUG.md template contains tdd_checkpoint field', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/templates/DEBUG.md'),
|
||||
path.join(process.cwd(), 'msd-core/templates/DEBUG.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('tdd_checkpoint'), 'DEBUG.md must contain tdd_checkpoint field');
|
||||
@@ -30,7 +30,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command contains list subcommand logic', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(
|
||||
@@ -41,7 +41,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command contains continue subcommand logic', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(
|
||||
@@ -52,7 +52,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command contains status subcommand logic', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(
|
||||
@@ -63,7 +63,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command contains TDD gate logic', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(
|
||||
@@ -74,7 +74,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug.md reads tdd_mode via workflow.tdd_mode key (not bare tdd_mode)', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
// #3149: tdd_mode now arrives on the `init.debug` bundle rather than a
|
||||
@@ -97,7 +97,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command contains security hardening', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('DATA_START'), 'debug.md must contain DATA_START injection boundary marker');
|
||||
@@ -105,7 +105,7 @@ describe('debug session management implementation', () => {
|
||||
|
||||
test('debug command surfaces next_action before spawn', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'gsd-core/workflows/debug.md'),
|
||||
path.join(process.cwd(), 'msd-core/workflows/debug.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(
|
||||
@@ -114,102 +114,102 @@ describe('debug session management implementation', () => {
|
||||
);
|
||||
});
|
||||
|
||||
test('gsd-debugger contains structured reasoning checkpoint', () => {
|
||||
test('msd-debugger contains structured reasoning checkpoint', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'agents/gsd-debugger.md'),
|
||||
path.join(process.cwd(), 'agents/msd-debugger.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('reasoning_checkpoint'), 'gsd-debugger.md must contain reasoning_checkpoint');
|
||||
assert.ok(content.includes('reasoning_checkpoint'), 'msd-debugger.md must contain reasoning_checkpoint');
|
||||
});
|
||||
|
||||
test('gsd-debugger contains TDD checkpoint mode', () => {
|
||||
test('msd-debugger contains TDD checkpoint mode', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'agents/gsd-debugger.md'),
|
||||
path.join(process.cwd(), 'agents/msd-debugger.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('tdd_mode'), 'gsd-debugger.md must contain tdd_mode');
|
||||
assert.ok(content.includes('TDD CHECKPOINT'), 'gsd-debugger.md must contain TDD CHECKPOINT return format');
|
||||
assert.ok(content.includes('tdd_mode'), 'msd-debugger.md must contain tdd_mode');
|
||||
assert.ok(content.includes('TDD CHECKPOINT'), 'msd-debugger.md must contain TDD CHECKPOINT return format');
|
||||
});
|
||||
|
||||
test('gsd-debugger contains delta debugging technique', () => {
|
||||
test('msd-debugger contains delta debugging technique', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'agents/gsd-debugger.md'),
|
||||
path.join(process.cwd(), 'agents/msd-debugger.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('Delta Debugging'), 'gsd-debugger.md must contain Delta Debugging technique');
|
||||
assert.ok(content.includes('Delta Debugging'), 'msd-debugger.md must contain Delta Debugging technique');
|
||||
});
|
||||
|
||||
test('gsd-debugger contains security note about DATA_START', () => {
|
||||
test('msd-debugger contains security note about DATA_START', () => {
|
||||
const content = fs.readFileSync(
|
||||
path.join(process.cwd(), 'agents/gsd-debugger.md'),
|
||||
path.join(process.cwd(), 'agents/msd-debugger.md'),
|
||||
'utf8'
|
||||
);
|
||||
assert.ok(content.includes('DATA_START'), 'gsd-debugger.md must contain DATA_START security reference');
|
||||
assert.ok(content.includes('DATA_START'), 'msd-debugger.md must contain DATA_START security reference');
|
||||
});
|
||||
});
|
||||
|
||||
// Tests for #2148 and #2151
|
||||
describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => {
|
||||
test('gsd-debugger ROOT CAUSE FOUND format includes specialist_hint field', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debugger.md'), 'utf8');
|
||||
assert.ok(content.includes('specialist_hint'), 'gsd-debugger missing specialist_hint in ROOT CAUSE FOUND');
|
||||
assert.ok(content.includes('swift_concurrency'), 'gsd-debugger missing specialist_hint derivation guidance');
|
||||
test('msd-debugger ROOT CAUSE FOUND format includes specialist_hint field', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debugger.md'), 'utf8');
|
||||
assert.ok(content.includes('specialist_hint'), 'msd-debugger missing specialist_hint in ROOT CAUSE FOUND');
|
||||
assert.ok(content.includes('swift_concurrency'), 'msd-debugger missing specialist_hint derivation guidance');
|
||||
});
|
||||
|
||||
test('debug.md orchestrator has specialist skill dispatch step', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core/workflows/debug.md'), 'utf8');
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'msd-core/workflows/debug.md'), 'utf8');
|
||||
assert.ok(content.includes('specialist_hint'), 'debug.md missing specialist dispatch logic');
|
||||
assert.ok(content.includes('typescript-expert'), 'debug.md missing skill dispatch mapping');
|
||||
});
|
||||
|
||||
test('debug.md specialist dispatch prompt uses DATA_START/DATA_END boundaries', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core/workflows/debug.md'), 'utf8');
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'msd-core/workflows/debug.md'), 'utf8');
|
||||
assert.ok(content.includes('DATA_START') && content.includes('DATA_END'),
|
||||
'debug.md specialist dispatch prompt missing security boundaries');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager agent exists with correct tools', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('Agent'), 'gsd-debug-session-manager missing Agent tool');
|
||||
assert.ok(content.includes('AskUserQuestion'), 'gsd-debug-session-manager missing AskUserQuestion tool');
|
||||
test('msd-debug-session-manager agent exists with correct tools', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('Agent'), 'msd-debug-session-manager missing Agent tool');
|
||||
assert.ok(content.includes('AskUserQuestion'), 'msd-debug-session-manager missing AskUserQuestion tool');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager spawns debugger with Agent() dispatcher', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debug-session-manager.md'), 'utf8');
|
||||
test('msd-debug-session-manager spawns debugger with Agent() dispatcher', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('\nAgent('), 'session manager must dispatch debugger with Agent(');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager uses DATA_START/DATA_END for checkpoint responses', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debug-session-manager.md'), 'utf8');
|
||||
test('msd-debug-session-manager uses DATA_START/DATA_END for checkpoint responses', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('DATA_START') && content.includes('DATA_END'),
|
||||
'gsd-debug-session-manager missing security boundaries on checkpoint responses');
|
||||
'msd-debug-session-manager missing security boundaries on checkpoint responses');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager has compact summary output format', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debug-session-manager.md'), 'utf8');
|
||||
test('msd-debug-session-manager has compact summary output format', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('DEBUG SESSION COMPLETE'), 'session manager missing compact summary format');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager includes anti-heredoc rule', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debug-session-manager.md'), 'utf8');
|
||||
test('msd-debug-session-manager includes anti-heredoc rule', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debug-session-manager.md'), 'utf8');
|
||||
assert.ok(content.includes('heredoc'), 'session manager missing anti-heredoc rule');
|
||||
});
|
||||
|
||||
test('debug.md delegates to gsd-debug-session-manager', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core', 'workflows', 'debug.md'), 'utf8');
|
||||
assert.ok(content.includes('gsd-debug-session-manager'),
|
||||
test('debug.md delegates to msd-debug-session-manager', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'msd-core', 'workflows', 'debug.md'), 'utf8');
|
||||
assert.ok(content.includes('msd-debug-session-manager'),
|
||||
'debug.md does not delegate to session manager');
|
||||
});
|
||||
|
||||
test('DEBUG.md reasoning_checkpoint field-count claim matches gsd-debugger.md YAML keys (parity)', () => {
|
||||
test('DEBUG.md reasoning_checkpoint field-count claim matches msd-debugger.md YAML keys (parity)', () => {
|
||||
// Parallel-surface drift guard (DEFECT.GENERATIVE-FIX): the field-count
|
||||
// claim in the DEBUG.md section_rules prose must equal the number of keys
|
||||
// enumerated in the gsd-debugger.md reasoning_checkpoint YAML block.
|
||||
// enumerated in the msd-debugger.md reasoning_checkpoint YAML block.
|
||||
// CRLF-safe regex/split per DEFECT.WINDOWS-TEST-PORTABILITY. Accepts either
|
||||
// digit ("7-field") or word ("seven-field") count form.
|
||||
const NUMWORDS = { one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10 };
|
||||
const debugContent = fs.readFileSync(path.join(process.cwd(), 'gsd-core', 'templates', 'DEBUG.md'), 'utf8');
|
||||
const agentContent = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debugger.md'), 'utf8');
|
||||
const debugContent = fs.readFileSync(path.join(process.cwd(), 'msd-core', 'templates', 'DEBUG.md'), 'utf8');
|
||||
const agentContent = fs.readFileSync(path.join(process.cwd(), 'agents', 'msd-debugger.md'), 'utf8');
|
||||
const debugMatch = debugContent.match(/reasoning_checkpoint[^.\r\n]*?(\d+|one|two|three|four|five|six|seven|eight|nine|ten)-field structured reasoning record/i);
|
||||
assert.ok(debugMatch, 'DEBUG.md must state a "N-field structured reasoning record" claim for reasoning_checkpoint');
|
||||
const claimedCount = /^\d+$/.test(debugMatch[1]) ? parseInt(debugMatch[1], 10) : NUMWORDS[debugMatch[1].toLowerCase()];
|
||||
@@ -225,7 +225,7 @@ describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => {
|
||||
break;
|
||||
}
|
||||
}
|
||||
assert.ok(yamlBody, 'gsd-debugger.md must define a fenced reasoning_checkpoint YAML block');
|
||||
assert.ok(yamlBody, 'msd-debugger.md must define a fenced reasoning_checkpoint YAML block');
|
||||
const keys = new Set();
|
||||
for (const line of yamlBody.split(/\r?\n/)) {
|
||||
// Match 2-space-indented YAML keys (with OR without an inline value —
|
||||
@@ -236,17 +236,17 @@ describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => {
|
||||
assert.strictEqual(
|
||||
keys.size,
|
||||
claimedCount,
|
||||
`parity drift: DEBUG.md claims ${claimedCount}-field but gsd-debugger.md enumerates ${keys.size} keys (${[...keys].join(', ')}). Update BOTH surfaces together.`
|
||||
`parity drift: DEBUG.md claims ${claimedCount}-field but msd-debugger.md enumerates ${keys.size} keys (${[...keys].join(', ')}). Update BOTH surfaces together.`
|
||||
);
|
||||
});
|
||||
|
||||
// #2376: debug_file_path handed to the spawned gsd-debug-session-manager
|
||||
// #2376: debug_file_path handed to the spawned msd-debug-session-manager
|
||||
// must resolve regardless of that subagent's own cwd, which may differ
|
||||
// from the orchestrator's — debug.md must reference the absolute
|
||||
// {debug_dir} field from `state load`, not a bare .planning/debug/...
|
||||
// literal, in both the `continue` and new-session Agent() spawns.
|
||||
test('debug.md session_params reference {debug_dir}/{slug}.md, not bare .planning/debug/... literals (#2376)', () => {
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core/workflows/debug.md'), 'utf8');
|
||||
const content = fs.readFileSync(path.join(process.cwd(), 'msd-core/workflows/debug.md'), 'utf8');
|
||||
assert.ok(content.includes('debug_file_path: {debug_dir}/{SLUG}.md'),
|
||||
'debug.md continue-subcommand spawn must reference {debug_dir}/{SLUG}.md, not a bare .planning/debug/{SLUG}.md literal');
|
||||
assert.ok(content.includes('debug_file_path: {debug_dir}/{slug}.md'),
|
||||
@@ -257,7 +257,7 @@ describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => {
|
||||
});
|
||||
|
||||
// Tests for #2196 (folded from tests/fix-2196-debug-agent-handoff.test.cjs):
|
||||
// the /gsd-debug orchestrator misused the foreground session-manager Agent()
|
||||
// the /msd-debug orchestrator misused the foreground session-manager Agent()
|
||||
// spawn as a background task, then queried the returned agent ID via
|
||||
// TaskOutput (which expects a task ID) — yielding "No task found with ID"
|
||||
// and leaving the workflow waiting on a handoff that was never queryable,
|
||||
@@ -267,7 +267,7 @@ describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => {
|
||||
// checkpoint + resume).
|
||||
describe('#2196 debug.md session-manager spawn contract', () => {
|
||||
// allow-test-rule: source-text-is-the-product (#2196)
|
||||
const DEBUG_MD_2196 = path.join(__dirname, '..', 'gsd-core', 'workflows', 'debug.md');
|
||||
const DEBUG_MD_2196 = path.join(__dirname, '..', 'msd-core', 'workflows', 'debug.md');
|
||||
const content = fs.readFileSync(DEBUG_MD_2196, 'utf-8');
|
||||
const sectionStart = content.indexOf('Session Management');
|
||||
const section = sectionStart !== -1 ? content.slice(sectionStart) : '';
|
||||
@@ -289,18 +289,18 @@ describe('#2196 debug.md session-manager spawn contract', () => {
|
||||
});
|
||||
|
||||
test('a lost handoff has a recovery path (preserve checkpoint + resume)', () => {
|
||||
// Pin the CANONICAL colon form — the retired /gsd-debug hyphen syntax is
|
||||
// rejected by the slash-command-namespace guard, so this must be /gsd:debug.
|
||||
assert.ok(/\/gsd:debug continue \{slug\}/.test(section),
|
||||
'the contract must point to /gsd:debug continue {slug} (canonical colon form) as the resume path');
|
||||
// Pin the CANONICAL colon form — the retired /msd-debug hyphen syntax is
|
||||
// rejected by the slash-command-namespace guard, so this must be /msd:debug.
|
||||
assert.ok(/\/msd:debug continue \{slug\}/.test(section),
|
||||
'the contract must point to /msd:debug continue {slug} (canonical colon form) as the resume path');
|
||||
assert.ok(/do not claim|do NOT claim/i.test(section),
|
||||
'the contract must forbid claiming a lost-handoff session is still running');
|
||||
});
|
||||
});
|
||||
|
||||
// Tests for #2257 (folded from tests/fix-2257-debug-nonterminal-resume.test.cjs):
|
||||
// the /gsd-debug orchestrator had no contract for a foreground
|
||||
// gsd-debug-session-manager return that is usable but non-terminal. Section 4
|
||||
// the /msd-debug orchestrator had no contract for a foreground
|
||||
// msd-debug-session-manager return that is usable but non-terminal. Section 4
|
||||
// "Session Management" (and the `continue` subcommand's return handling in
|
||||
// Section 1c) recognized only two literal-string returns — `DEBUG SESSION
|
||||
// COMPLETE` and `ABANDONED` — with no else branch. Any other return (e.g. a
|
||||
@@ -320,17 +320,17 @@ describe('#2196 debug.md session-manager spawn contract', () => {
|
||||
//
|
||||
// Correction (orthogonal review): the first cut of the anti-loop guard
|
||||
// required BOTH `next_action` AND `updated` to be unchanged across two
|
||||
// resumes to detect no-progress — but `agents/gsd-debugger.md` overwrites
|
||||
// resumes to detect no-progress — but `agents/msd-debugger.md` overwrites
|
||||
// `updated` on every checkpoint write ("Update the file BEFORE taking
|
||||
// action"), so `updated` changes every cycle and the AND-condition could
|
||||
// never be true, making the guard dead (unbounded auto-resume / DoS
|
||||
// regression). The corrected guard keys no-progress detection off
|
||||
// `next_action` ALONE and adds an absolute, content-independent hard cap of
|
||||
// 3 total auto-resumes per slug per `/gsd:debug` invocation as the real
|
||||
// 3 total auto-resumes per slug per `/msd:debug` invocation as the real
|
||||
// termination bound.
|
||||
describe('#2257 debug non-terminal session-manager return contract', () => {
|
||||
const DEBUG_MD_2257 = path.join(__dirname, '..', 'gsd-core', 'workflows', 'debug.md');
|
||||
const SESSION_MANAGER_MD = path.join(__dirname, '..', 'agents', 'gsd-debug-session-manager.md');
|
||||
const DEBUG_MD_2257 = path.join(__dirname, '..', 'msd-core', 'workflows', 'debug.md');
|
||||
const SESSION_MANAGER_MD = path.join(__dirname, '..', 'agents', 'msd-debug-session-manager.md');
|
||||
|
||||
// allow-test-rule: source-text-is-the-product (#2257)
|
||||
// workflow/agent prose IS the runtime contract under test
|
||||
@@ -376,7 +376,7 @@ describe('#2257 debug non-terminal session-manager return contract', () => {
|
||||
'Section 1c auto-resume must use the SAME slug/checkpoint as the original spawn (symmetric with Section 4)');
|
||||
});
|
||||
|
||||
test('gsd-debug-session-manager.md defines CONTINUE_REQUIRED distinct from the two terminal formats', () => {
|
||||
test('msd-debug-session-manager.md defines CONTINUE_REQUIRED distinct from the two terminal formats', () => {
|
||||
assert.ok(/## CONTINUE_REQUIRED/.test(managerContent),
|
||||
'the agent must define an explicit ## CONTINUE_REQUIRED return heading');
|
||||
assert.ok(/## DEBUG SESSION COMPLETE/.test(managerContent),
|
||||
@@ -430,7 +430,7 @@ describe('#2257 debug non-terminal session-manager return contract', () => {
|
||||
// answered (e.g. a native permission prompt for the first focused RED command) and the
|
||||
// session-manager instance returns non-terminal (## CONTINUE_REQUIRED — its own
|
||||
// turn/context budget ran out), the orchestrator's auto-resume re-spawned
|
||||
// gsd-debug-session-manager with IDENTICAL session_params. The respawn was therefore
|
||||
// msd-debug-session-manager with IDENTICAL session_params. The respawn was therefore
|
||||
// prompt-indistinguishable from a cold start: the durable checkpoint's recorded
|
||||
// next_action — read only for terminal classification and the blocker message — never
|
||||
// reached the respawned agent, and neither did the fact that the earlier checkpoint had
|
||||
@@ -440,17 +440,17 @@ describe('#2257 debug non-terminal session-manager return contract', () => {
|
||||
//
|
||||
// The fix threads resume state through BOTH orchestrator call sites (Section 1c
|
||||
// `continue` return handling and Section 4's non-terminal branch — textual duplicates,
|
||||
// so fixing one leaves the other broken) and makes the manager's Step 2 gsd-debugger
|
||||
// so fixing one leaves the other broken) and makes the manager's Step 2 msd-debugger
|
||||
// template consume it, using Step 3d's DATA_START/DATA_END checkpoint-response shape.
|
||||
// The anti-loop guard itself (next_action-only heuristic + absolute 3-resume hard cap)
|
||||
// is deliberately NOT weakened — out of scope, confirmed correct.
|
||||
describe('#3448 debug auto-resume must thread the recorded next_action', () => {
|
||||
const debugContent3448 = fs.readFileSync(
|
||||
path.join(__dirname, '..', 'gsd-core', 'workflows', 'debug.md'),
|
||||
path.join(__dirname, '..', 'msd-core', 'workflows', 'debug.md'),
|
||||
'utf-8'
|
||||
);
|
||||
const managerContent3448 = fs.readFileSync(
|
||||
path.join(__dirname, '..', 'agents', 'gsd-debug-session-manager.md'),
|
||||
path.join(__dirname, '..', 'agents', 'msd-debug-session-manager.md'),
|
||||
'utf-8'
|
||||
);
|
||||
|
||||
@@ -509,7 +509,7 @@ describe('#3448 debug auto-resume must thread the recorded next_action', () => {
|
||||
}
|
||||
|
||||
// AC1 + AC4: the manager must consume what the orchestrator now sends.
|
||||
describe('gsd-debug-session-manager.md consumes resume state (#3448)', () => {
|
||||
describe('msd-debug-session-manager.md consumes resume state (#3448)', () => {
|
||||
test('session_parameters documents the resume parameters', () => {
|
||||
assert.ok(/resume_next_action/i.test(managerContent3448),
|
||||
'the session_parameters list must document resume_next_action');
|
||||
@@ -517,8 +517,8 @@ describe('#3448 debug auto-resume must thread the recorded next_action', () => {
|
||||
'the session_parameters list must document resume_status');
|
||||
});
|
||||
|
||||
test("Step 2's gsd-debugger prompt conditionally carries the recorded next_action, DATA-bounded", () => {
|
||||
const step2Start = managerContent3448.indexOf('## Step 2: Spawn gsd-debugger Agent');
|
||||
test("Step 2's msd-debugger prompt conditionally carries the recorded next_action, DATA-bounded", () => {
|
||||
const step2Start = managerContent3448.indexOf('## Step 2: Spawn msd-debugger Agent');
|
||||
const step3Start = managerContent3448.indexOf('## Step 3: Handle Agent Return');
|
||||
assert.ok(step2Start !== -1 && step3Start !== -1, 'Step 2 must exist');
|
||||
const step2 = managerContent3448.slice(step2Start, step3Start);
|
||||
@@ -533,7 +533,7 @@ describe('#3448 debug auto-resume must thread the recorded next_action', () => {
|
||||
});
|
||||
|
||||
test("Step 2 instructs the debugger to proceed directly on the recorded next action without re-raising answered checkpoints", () => {
|
||||
const step2Start = managerContent3448.indexOf('## Step 2: Spawn gsd-debugger Agent');
|
||||
const step2Start = managerContent3448.indexOf('## Step 2: Spawn msd-debugger Agent');
|
||||
const step3Start = managerContent3448.indexOf('## Step 3: Handle Agent Return');
|
||||
const step2 = managerContent3448.slice(step2Start, step3Start);
|
||||
assert.ok(
|
||||
|
||||
Reference in New Issue
Block a user