curate · git:20260702.1d869cd · 2026-07-02 · sha256 7a82c4ff961b15cb

curate git:20260702.1d869cdA

Immutable. This exact content is served forever at /api/v1/blob/7a82c4ff961b15cb.

---
name: curate
description: >
  Review pending Wenlan captures or revisions from Codex. Use for explicit
  audit walks after /brief or /handoff surfaces pending work. Invoked as
  /curate captures or /curate revisions.
argument-hint: "captures | revisions"
allowed-tools: ["Bash", "mcp__wenlan__list_pending", "mcp__wenlan__confirm_memory", "mcp__wenlan__forget", "mcp__wenlan__capture", "mcp__wenlan__recall"]
user-invocable: true
---

# /curate

Power-user audit of Wenlan pending surfaces. Daily flow should stay light:
`/brief` shows the top pending revisions and `/handoff` previews recent pending
captures. Use `/curate` only when the user asks to walk the queue.

## Safety protocol

Perform no mutation until the user replies. Ambiguous replies do not mutate.
Cancellation, no reply, or unclear syntax is a no-op.

Render at most four items at a time. Number every item. Ask for explicit action
syntax:

```text
1 accept
2 dismiss
3 skip
4 edit: <replacement text>
```

Do not rely on hidden pagination state across turns. After applying a batch,
re-list before showing another batch.

## `/curate revisions`

Use the local CLI, not MCP, because revision actions must key on the exact
`revision_source_id`.

Resolve `wenlan`:

```bash
if command -v wenlan >/dev/null 2>&1; then
  W="$(command -v wenlan)"
elif [ -x "$HOME/.wenlan/bin/wenlan" ]; then
  W="$HOME/.wenlan/bin/wenlan"
else
  echo "wenlan not found"
  exit 127
fi
"$W" --format json curate
```

If `wenlan` is missing, tell the user to run `/init`.

The JSON array contains:

- `revision_source_id`: staged revision id; action key for accept/dismiss.
- `target_source_id`: original memory id; context only.
- `content`: revised text.
- `source_agent`: proposer.
- `original`: current text when available.
- `diff`: ready-made OLD/NEW preview when available.

Render up to four revisions:

```text
Pending revisions:

1. revision_source_id: <rev_id>
   target: <target_source_id>
   proposed: "<content>"
   diff:
   <diff or "(original unavailable)">

Reply with: 1 accept, 1 dismiss, 1 skip
```

Apply only explicit actions:

```bash
"$W" curate accept <revision_source_id>
"$W" curate dismiss <revision_source_id>
```

`accept` replaces the original memory with that named revision. `dismiss`
unstages the false revision link and keeps both memories as independent rows.
`skip` does nothing.

## `/curate captures`

If the user names a space, parse `space:<name>` and pass it to
`mcp__wenlan__list_pending`. Otherwise leave `space` off so the audit covers
all pending captures.

Call:

```text
mcp__wenlan__list_pending(limit=50, space="<only when user named one>")
```

Render up to four:

```text
Pending captures:

1. <source_id>  <memory_type>  <source_agent>
   "<content>"

Reply with: 1 accept, 1 reject, 1 skip, 1 edit: <replacement text>
```

Apply only explicit actions:

- `accept`: `mcp__wenlan__confirm_memory(memory_id="<source_id>")`
- `reject`: `mcp__wenlan__forget(memory_id="<source_id>")`
- `skip`: no call
- `edit: <replacement>`:
  1. `mcp__wenlan__capture(content="<replacement>", supersedes="<source_id>")`
  2. `mcp__wenlan__forget(memory_id="<source_id>")`

Reject and edit delete the original pending capture, so require the numbered
item and action verb in the same reply.

## Bare `/curate`

Default to `/curate revisions`. Revisions are the conflict surface that most
often needs human judgment. Mention `/curate captures` only as an opt-in audit.

## When not to use

- Specific lookup: use `/recall`.
- One-off correction: use `/capture` with the corrected fact.