* 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>
72 lines
3.7 KiB
Markdown
72 lines
3.7 KiB
Markdown
---
|
|
name: gsd:mempalace-capture
|
|
description: "File a phase artifact into MemPalace; mirror decision facts into its temporal KG"
|
|
argument-hint: "[CONTEXT.md|PLAN.md|SUMMARY.md]"
|
|
allowed-tools:
|
|
- Read
|
|
- Bash
|
|
requires: [config]
|
|
---
|
|
|
|
**STOP -- DO NOT READ THIS FILE. You are already reading it. This prompt was injected into your context by the command system. Using the Read tool on this file wastes tokens. Begin executing Step 0 immediately.**
|
|
|
|
## Step 0 -- Banner
|
|
|
|
**Before ANY tool calls**, display this banner:
|
|
|
|
```
|
|
GSD > MEMPALACE CAPTURE
|
|
```
|
|
|
|
Then proceed to Step 1.
|
|
|
|
## Step 1 -- Config Gate
|
|
|
|
Check whether the MemPalace capability is enabled by reading `.planning/config.json` directly with the Read tool.
|
|
|
|
1. Read `.planning/config.json` with the Read tool.
|
|
2. If the file does not exist, or `config.mempalace` is absent, or `config.mempalace.enabled !== true`, or `config.mempalace.capture_artifacts !== true`: display the disabled message and **STOP**.
|
|
3. Otherwise proceed to Step 2.
|
|
|
|
**Disabled message:**
|
|
|
|
```
|
|
GSD > MEMPALACE CAPTURE
|
|
|
|
MemPalace capture is disabled (mempalace.enabled / mempalace.capture_artifacts).
|
|
Nothing was filed; the loop proceeds normally.
|
|
```
|
|
|
|
This step is `onError: skip` at `discuss:post` / `plan:post` / `verify:post` -- capture never fails a phase.
|
|
|
|
## Step 2 -- Resolve target
|
|
|
|
1. **Artifact.** Take the artifact from `$ARGUMENTS`. If absent, infer from the loop point: `discuss:post` → `CONTEXT.md`, `plan:post` → `PLAN.md`, `verify:post` → `SUMMARY.md`.
|
|
2. **Room.** Map artifact → room:
|
|
- `CONTEXT.md` → `decisions`
|
|
- `PLAN.md` → `planning`
|
|
- `SUMMARY.md` → `milestones`
|
|
(Confirmed problem→fix pairs go to `problems` — see the `capture-problems` fragment used at `execute:wave:post`.)
|
|
3. **Wing.** `config.mempalace.wing` if non-empty, else `config.project_code`, else the repo directory name.
|
|
4. **Mode / transport.** Read `config.mempalace.memory_mode`. Prefer MCP (`mempalace_*`) when your MemPalace MCP server is registered and your runtime permits those tools; otherwise use the `mempalace` CLI (covered by this skill's `Bash` allow-tool), as in `mempalace-recall`.
|
|
|
|
## Step 3 -- File verbatim (idempotent)
|
|
|
|
On any error or timeout, stop and let the phase continue -- capture is best-effort.
|
|
|
|
1. **Dedup first.** Interactive: `mempalace_check_duplicate` on the artifact's deterministic drawer id. Headless: rely on `mempalace mine`'s content-hash idempotency.
|
|
2. **Add the drawer (verbatim).** File the exact artifact text into `room: <room>` of `wing: <wing>` with provenance (`source_file`, phase id). Interactive: `mempalace_add_drawer`. Headless: `mempalace mine <path> --wing <wing> --room <room>`.
|
|
3. **Mirror KG facts** when `config.mempalace.mirror_kg` is true: extract decision/delivery facts and `mempalace_kg_add` them with `valid_from` = the phase date (e.g. `(<project>, decided, <decision>)` from CONTEXT; `(<phase>, delivered, <capability>)` from SUMMARY). Only `augment` is currently wired, so these are an *additive* mirror of `.planning/graphs/`. (`kg_backend`/`replace` are forward-declared and behave as `augment` today.)
|
|
4. Re-running a phase MUST NOT create duplicate drawers (deterministic ids + `check_duplicate`).
|
|
|
|
## Step 4 -- Report
|
|
|
|
Print a one-line summary: `Filed <artifact> → <wing>/<room> (<n> KG facts)` or `MemPalace unavailable — capture skipped`.
|
|
|
|
## Anti-Patterns
|
|
|
|
1. DO NOT let any MemPalace error fail the step -- capture is `onError: skip`.
|
|
2. DO NOT write lossy summaries -- store the verbatim artifact text (AAAK compression is a separate, optional index).
|
|
3. DO NOT prune or delete drawers here -- pruning (`sync --apply`) is the curator agent's job at `ship:post`, wing-scoped only.
|
|
4. DO NOT skip the config gate or the dedup check.
|