* feat(#956): add MemPalace memory capability (ADR-857 feature plug-in) Adds an opt-in, default-resilient ADR-857 feature capability that wires MemPalace (local-first memory: MCP server + CLI) into the GSD loop: deliberate recall before discuss/plan and verbatim + temporal-KG capture at phase boundaries. Three memory modes (augment default; kg_backend and replace forward-declared). Master gate mempalace.enabled (default off); every hook onError:skip, zero gates; absent/disabled MemPalace => loop unchanged. Transport is rendered-markdown only — MemPalace runs out-of-process, no third-party code in gsd-core (ADR-857 §7). Capability: capabilities/mempalace/ (manifest + 2 fragments), skills commands/gsd/mempalace-{recall,capture}.md, agent agents/gsd-mempalace-curator.md. Registration: ns-context router, utility cluster, KNOWN_SKILLS, help full.md, model-catalog, copilot install list, size baselines; regenerated capability-registry + inventory manifest. ship:post wired into ship.md (wire-on-demand). HELD on #1196: this capability also declares hooks at discuss:pre and discuss:post, which are structurally un-wireable until the host-loop conformance model covers the discuss phase (discuss-phase.md is not in HOST_LOOP_FILES). The phase6-capstone-conformance gate therefore fails on exactly those two orphaned points by design — see #1196. Once #1196 lands, rebase onto next and the gate goes green with no further change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(#956): backfill changeset PR number (#1201) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -522,22 +522,22 @@ describe('verify:post — envelope shape pins Hyrum\'s Law contract', () => {
|
||||
|
||||
// ─── 10. Real registry byLoopPoint shape check (no drift guard) ───────────────
|
||||
|
||||
describe('verify:post — real registry has exactly 3 steps and 0 contributions+gates', () => {
|
||||
test('[happy] realRegistry.byLoopPoint[verify:post] has 3 steps, 0 contributions, 0 gates', () => {
|
||||
describe('verify:post — real registry has exactly 4 steps and 0 contributions+gates', () => {
|
||||
test('[happy] realRegistry.byLoopPoint[verify:post] has 4 steps, 0 contributions, 0 gates', () => {
|
||||
const entry = realRegistry.byLoopPoint['verify:post'];
|
||||
assert.ok(entry, 'verify:post must exist in registry');
|
||||
assert.strictEqual(entry.steps.length, 3,
|
||||
`Expected 3 steps at verify:post, got ${entry.steps.length}`);
|
||||
assert.strictEqual(entry.steps.length, 4,
|
||||
`Expected 4 steps at verify:post, got ${entry.steps.length}`);
|
||||
assert.strictEqual(entry.contributions.length, 0,
|
||||
`Expected 0 contributions at verify:post, got ${entry.contributions.length}`);
|
||||
assert.strictEqual(entry.gates.length, 0,
|
||||
`Expected 0 gates at verify:post, got ${entry.gates.length}`);
|
||||
});
|
||||
|
||||
test('[happy] registry steps at verify:post have correct capIds in order', () => {
|
||||
test('[happy] registry steps at verify:post have correct capIds in order (mempalace→nyquist→security→ui)', () => {
|
||||
const entry = realRegistry.byLoopPoint['verify:post'];
|
||||
const capIds = entry.steps.map(s => s.capId);
|
||||
assert.deepEqual(capIds, ['nyquist', 'security', 'ui'],
|
||||
`Registry must have steps in nyquist→security→ui order, got ${JSON.stringify(capIds)}`);
|
||||
assert.deepEqual(capIds, ['mempalace', 'nyquist', 'security', 'ui'],
|
||||
`Registry must have steps in mempalace→nyquist→security→ui order, got ${JSON.stringify(capIds)}`);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user