/gsd-mempalace-capture
File a phase artifact into MemPalace; mirror decision facts into its temporal KG
$ npx -y skills add open-gsd/gsd-core --skill gsd-mempalace-capture --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/gsd-mempalace-capture
Context preview
The summary Claude sees to decide when to auto-load this skill.
File a phase artifact into MemPalace; mirror decision facts into its temporal KG
SKILL.md
gsd-mempalace-capture.SKILL.mdname: 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
**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 === false`: 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: see below.
**`mempalace mine` has no `--room` flag** — only `search` accepts `--room` ([CLI reference: https://mempalaceofficial.com/reference/cli.html](https://mempalaceofficial.com/reference/cli.html)). Room assignment is driven by `detect_room()` matching folder-path segments against the `rooms:` list in `mempalace.yaml` ([mining guide: https://mempalaceofficial.com/guide/mining.html](https://mempalaceofficial.com/guide/mining.html) — "Rooms are auto-detected from your folder structure"; [config reference: https://mempalaceofficial.com/guide/configuration.html](https://mempalaceofficial.com/guide/configuration.html)). Stage the artifact under a room-named folder so `detect_room()` assigns it correctly:
STAGE=".planning/.mempalace-stage"
# One-time: declare the GSD room taxonomy so detect_room() recognizes these folders
mkdir -p "$STAGE"
[ -f "$STAGE/mempalace.yaml" ] || cat > "$STAGE/mempalace.yaml" <<'YAML'
# Each entry MUST be a dict with a `name` key (the miner's detect_room()
# indexes room["name"] — a bare-string list crashes _mine_impl with
# TypeError: string indices must be integers, not 'str'). Optional fields:
# `description`, `keywords` (matched against folder-path segments).
rooms:
- name: decisions
- name: planning
- name: milestones
- name: problems
- name: general
YAML
# Suppress MemPalace cache artifacts written into the scanned tree
[ -f "$STAGE/.gitignore" ] || echo "mempalace_embedder.json" > "$STAGE/.gitignore"
# Stage under <room>/<phase-id>/<basename> — stable path so mine's content-hash
# idempotency (file_already_mined keys on absolute source_file + mtime) deduplicates
# instead of creating duplicate drawers on re-runs.
ROOM_DIR="$STAGE/<room>/<phase-id>"
mkdir -p "$ROOM_DIR"
cp "<artifact-path>" "$ROOM_DIR/<basename>"
# Mine with --wing only — no --room flag; detect_room() assigns from the folder path
mempalace mine "$STAGE" --wing <wing>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). Under `augment` these are an *additive* mirror of GSD's native `.planning/graphs/`. Under `kg_backend`/`replace` the palace KG is the *authoritative* fact store — GSD still produces `.planning/graphs/` through its normal graphify, so an unreachable palace never loses a fact. 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.
Read more
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
**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 === false`: 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: see below.
**`mempalace mine` has no `--room` flag** — only `search` accepts `--room` ([CLI reference: https://mempalaceofficial.com/reference/cli.html](https://mempalaceofficial.com/reference/cli.html)). Room assignment is driven by `detect_room()` matching folder-path segments against the `rooms:` list in `mempalace.yaml` ([mining guide: https://mempalaceofficial.com/guide/mining.html](https://mempalaceofficial.com/guide/mining.html) — "Rooms are auto-detected from your folder structure"; [config reference: https://mempalaceofficial.com/guide/configuration.html](https://mempalaceofficial.com/guide/configuration.html)). Stage the artifact under a room-named folder so `detect_room()` assigns it correctly:
STAGE=".planning/.mempalace-stage"
# One-time: declare the GSD room taxonomy so detect_room() recognizes these folders
mkdir -p "$STAGE"
[ -f "$STAGE/mempalace.yaml" ] || cat > "$STAGE/mempalace.yaml" <<'YAML'
# Each entry MUST be a dict with a `name` key (the miner's detect_room()
# indexes room["name"] — a bare-string list crashes _mine_impl with
# TypeError: string indices must be integers, not 'str'). Optional fields:
# `description`, `keywords` (matched against folder-path segments).
rooms:
- name: decisions
- name: planning
- name: milestones
- name: problems
- name: general
YAML
# Suppress MemPalace cache artifacts written into the scanned tree
[ -f "$STAGE/.gitignore" ] || echo "mempalace_embedder.json" > "$STAGE/.gitignore"
# Stage under <room>/<phase-id>/<basename> — stable path so mine's content-hash
# idempotency (file_already_mined keys on absolute source_file + mtime) deduplicates
# instead of creating duplicate drawers on re-runs.
ROOM_DIR="$STAGE/<room>/<phase-id>"
mkdir -p "$ROOM_DIR"
cp "<artifact-path>" "$ROOM_DIR/<basename>"
# Mine with --wing only — no --room flag; detect_room() assigns from the folder path
mempalace mine "$STAGE" --wing <wing>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). Under `augment` these are an *additive* mirror of GSD's native `.planning/graphs/`. Under `kg_backend`/`replace` the palace KG is the *authoritative* fact store — GSD still produces `.planning/graphs/` through its normal graphify, so an unreachable palace never loses a fact. 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.
Git. Ship. Done. A light-weight meta-prompting, context engineering, and spec-driven development system for Claude Code, OpenCode, Antigravity CLI, Kimi CLI, Kilo, Codex, Copilot, Cursor, Windsurf, and more.
Repo: open-gsd/gsd-core
Other skills on gsd-core.
- /gsd-add-tests
Generate tests for a completed phase based on UAT criteria and implementation
Open skill - /gsd-ai-integration-phase
Generate an AI-SPEC.md design contract for phases that involve building AI systems.
Open skill - /gsd-audit-fix
Autonomous audit-to-fix pipeline — find issues, classify, fix, test, commit
Open skill - /gsd-audit-milestone
Audit milestone completion against original intent before archiving
Open skill - /gsd-audit-uat
Cross-phase audit of all outstanding UAT and verification items
Open skill - /gsd-autonomous
Run all remaining phases autonomously — discuss→plan→execute per phase
Open skill

