memory-curator
The gatekeeper for what becomes durable in the vault. Most agent writes go through _inbox/ first; the curator decides whether they earn promotion to facts/, events/, decisions/, insights/, or research/; get patched onto an existing note; or get archived to _inbox/.dropped/ for audit.
When to use
- Inbox sweep (scheduled or manual): process accumulated
_inbox/{agent-id}/ items.
- Pre-check before a direct vault-writer call when the source is a web fetch (not user-curated).
- A research skill discovers a finding mid-run and wants to know: "should this be durable?"
When NOT to use
- For human writes to curated surfaces (
decisions/, insights/) — those are authoritative; the curator only catches agent stages.
- For scheduled-agent digest writes — digests are append-only historical records, written directly via
vault-writer's write_digest.
Three verdicts
For every candidate:
- promote — write a new durable note at a specific surface + path.
- patch — update an existing durable note (which one + merge instructions).
- drop — move to
_inbox/.dropped/{agent-id}/{timestamp}-{slug}.md with a documented reason. Never silently delete.
Decision rules (from _meta/inbox-rules.md)
Promote when ALL hold:
- novel — no existing durable note covers the same
entity/predicate or topic/question (check via vault-querier)
- specific — concrete answer to a concrete question
- future-useful — plausibly worth looking up again
- sourced —
source_url present, OR source_skill: human AND user authored
- surprise or load-bearing — changes the user's mental model OR will be referenced by other notes
Patch when:
- a durable note exists for the same
entity/predicate (facts), same slug (insights/persons/projects), or same dated event AND
- the inbox item adds new info (more sources, updated value, additional participants, etc.)
Drop when ANY hold:
- already known and unchanged
- marketing claim without falsifiable substance
- content about identity / preferences / feedback (belongs in Tier-1, not the vault)
#do-not-share content from internal sources without user approval
confidence: 1 AND no source_url
Guardrail (the hard rule from _meta/inbox-rules.md)
Never silently drop content with substance. If uncertain, do not auto-drop — leave the item in _inbox/ with tag #needs-review and a curator_uncertainty: line in the body explaining why. Drops are reserved for explicit rule matches; the .dropped/ folder is the audit trail.
Workflow
- List candidates: read
_inbox/{agent-id}/*.md (or accept an explicit payload).
- For each candidate:
- Parse its frontmatter and body.
- Identify entity / predicate / slug / topic from frontmatter or body cues.
- Novelty check:
vault-querier for matching facts/{entity}/{predicate}.md, related insights/{slug}.md, recent research/{topic}/, etc.
- Apply the criteria checklist above.
- Emit a verdict with target surface + path (for promote/patch) or reason (for drop).
- Execute:
- Return the summary.
Output shape
{
"agent_id": "voices-watcher",
"processed": 12,
"promoted": 5,
"patched": 2,
"dropped": 4,
"needs_review": 1,
"actions": [
{
"inbox_path": "_inbox/voices-watcher/2026-06-20T15-30-00-johncutlefish-substack-url.md",
"verdict": "promote",
"target_surface": "facts",
"target_path": "facts/johncutlefish/substack-url.md",
"reason": "novel + sourced + specific + load-bearing"
},
{
"inbox_path": "_inbox/voices-watcher/2026-06-20T15-31-00-unknown-claim.md",
"verdict": "drop",
"moved_to": "_inbox/.dropped/voices-watcher/2026-06-20T15-31-00-unknown-claim.md",
"reason": "confidence=1 AND no source_url"
}
]
}
Recoverability
Drops are not destructive. Items in _inbox/.dropped/ remain on disk indefinitely. The user can move any item back into _inbox/{agent-id}/ to re-run curation, or directly into a durable folder if they disagree with the verdict.
Composes with
Acceptance test (for step 4 done-criteria)
Two test inbox items exist at ~/Obsidian/Research-Brain/_inbox/test-step-4/:
promotable-fact.md — well-formed fact candidate with source_url, entity, predicate, value, confidence 2. Expected verdict: promote → facts/copilot/data-handling.md (or similar). Inbox file gets deleted after promote.
unsourced-claim.md — claim without source_url, confidence 1. Expected verdict: drop → moved to _inbox/.dropped/test-step-4/. Body gets the "dropped by memory-curator: confidence=1 AND no source_url" line appended.
When memory-curator is first invoked (in step 7+, or manually via "run memory-curator on _inbox/test-step-4/"), the output should show:
processed: 2, promoted: 1, dropped: 1
- Both items routed correctly per the rules.
Until the first invocation, the fixtures are evidence that the spec covers both ends of the promote/drop spectrum.
1---2name: memory-curator3description: Decide whether an inbox item or candidate finding should be promoted to a durable vault folder, patched onto an existing note, or dropped. Applies the rules from vault/_meta/inbox-rules.md (novelty, falsifiability, future utility, surprise, sourcing). Runs on _inbox/{agent-id}/ items to sweep them or can be called ad-hoc by a skill before a direct vault-writer call. Composes with vault-querier for novelty checks and vault-writer for the actual promote/patch writes. Default-drops unsourced agent claims; never silently drops content with substance — uncertain items get tagged4---56# memory-curator78The gatekeeper for what becomes durable in the vault. Most agent writes go through `_inbox/` first; the curator decides whether they earn promotion to `facts/`, `events/`, `decisions/`, `insights/`, or `research/`; get patched onto an existing note; or get archived to `_inbox/.dropped/` for audit.910## When to use1112- **Inbox sweep** (scheduled or manual): process accumulated `_inbox/{agent-id}/` items.13- **Pre-check before a direct vault-writer call** when the source is a web fetch (not user-curated).14- A research skill discovers a finding mid-run and wants to know: "should this be durable?"1516## When NOT to use1718- For human writes to curated surfaces (`decisions/`, `insights/`) — those are authoritative; the curator only catches agent stages.19- For scheduled-agent digest writes — digests are append-only historical records, written directly via `vault-writer`'s `write_digest`.2021## Three verdicts2223For every candidate:24251. **promote** — write a new durable note at a specific surface + path.262. **patch** — update an existing durable note (which one + merge instructions).273. **drop** — move to `_inbox/.dropped/{agent-id}/{timestamp}-{slug}.md` with a documented reason. **Never silently delete.**2829## Decision rules (from `_meta/inbox-rules.md`)3031### Promote when ALL hold:32- **novel** — no existing durable note covers the same `entity/predicate` or `topic/question` (check via `vault-querier`)33- **specific** — concrete answer to a concrete question34- **future-useful** — plausibly worth looking up again35- **sourced** — `source_url` present, OR `source_skill: human` AND user authored36- **surprise or load-bearing** — changes the user's mental model OR will be referenced by other notes3738### Patch when:39- a durable note exists for the same `entity/predicate` (facts), same slug (insights/persons/projects), or same dated event AND40- the inbox item adds new info (more sources, updated value, additional participants, etc.)4142### Drop when ANY hold:43- already known and unchanged44- marketing claim without falsifiable substance45- content about identity / preferences / feedback (belongs in Tier-1, not the vault)46- `#do-not-share` content from internal sources without user approval47- `confidence: 1` AND no `source_url`4849### Guardrail (the hard rule from `_meta/inbox-rules.md`)5051**Never silently drop content with substance.** If uncertain, do **not** auto-drop — leave the item in `_inbox/` with tag `#needs-review` and a `curator_uncertainty:` line in the body explaining why. Drops are reserved for explicit rule matches; the `.dropped/` folder is the audit trail.5253## Workflow54551. **List candidates**: read `_inbox/{agent-id}/*.md` (or accept an explicit payload).562. **For each candidate**:57 - Parse its frontmatter and body.58 - Identify entity / predicate / slug / topic from frontmatter or body cues.59 - **Novelty check**: `vault-querier` for matching `facts/{entity}/{predicate}.md`, related `insights/{slug}.md`, recent `research/{topic}/`, etc.60 - Apply the criteria checklist above.61 - Emit a verdict with target surface + path (for promote/patch) or reason (for drop).623. **Execute**:63 - **promote**: call `vault-writer.write_{surface}` with the candidate's payload. On success, delete the inbox file.64 - **patch**: read the target durable note, merge fields per `vault-writer`'s idempotency rules, call `write_{surface}` again. On success, delete the inbox file.65 - **drop**: move the inbox file to `_inbox/.dropped/{agent-id}/{timestamp}-{slug}.md` and append a body line:66 ```67 > 🗑 dropped by memory-curator: <reason> (2026-06-20T15:30:00Z)68 ```69 - **needs_review**: leave in place, append `tags: [#needs-review]` to frontmatter and `> ⚠ curator uncertainty: <why>` to body.704. **Return** the summary.7172## Output shape7374```json75{76 "agent_id": "voices-watcher",77 "processed": 12,78 "promoted": 5,79 "patched": 2,80 "dropped": 4,81 "needs_review": 1,82 "actions": [83 {84 "inbox_path": "_inbox/voices-watcher/2026-06-20T15-30-00-johncutlefish-substack-url.md",85 "verdict": "promote",86 "target_surface": "facts",87 "target_path": "facts/johncutlefish/substack-url.md",88 "reason": "novel + sourced + specific + load-bearing"89 },90 {91 "inbox_path": "_inbox/voices-watcher/2026-06-20T15-31-00-unknown-claim.md",92 "verdict": "drop",93 "moved_to": "_inbox/.dropped/voices-watcher/2026-06-20T15-31-00-unknown-claim.md",94 "reason": "confidence=1 AND no source_url"95 }96 ]97}98```99100## Recoverability101102Drops are **not destructive**. Items in `_inbox/.dropped/` remain on disk indefinitely. The user can move any item back into `_inbox/{agent-id}/` to re-run curation, or directly into a durable folder if they disagree with the verdict.103104## Composes with105106- [`vault-conventions`](../vault-conventions/SKILL.md) — schemas + `inbox-rules.md`.107- [`vault-querier`](../vault-querier/SKILL.md) — novelty checks.108- [`vault-writer`](../vault-writer/SKILL.md) — the actual promote/patch writes.109110## Acceptance test (for step 4 done-criteria)111112Two test inbox items exist at `~/Obsidian/Research-Brain/_inbox/test-step-4/`:1131141. **`promotable-fact.md`** — well-formed fact candidate with `source_url`, `entity`, `predicate`, `value`, confidence 2. Expected verdict: **promote** → `facts/copilot/data-handling.md` (or similar). Inbox file gets deleted after promote.1152. **`unsourced-claim.md`** — claim without `source_url`, confidence 1. Expected verdict: **drop** → moved to `_inbox/.dropped/test-step-4/`. Body gets the "dropped by memory-curator: confidence=1 AND no source_url" line appended.116117When `memory-curator` is first invoked (in step 7+, or manually via "run memory-curator on _inbox/test-step-4/"), the output should show:118- `processed: 2, promoted: 1, dropped: 1`119- Both items routed correctly per the rules.120121Until the first invocation, the fixtures are evidence that the spec covers both ends of the promote/drop spectrum.