account-vault
This skill turns the vault folder into a queryable, agent-writable intelligence layer for the GTM operator's target accounts. Every account is one markdown file at vault/accounts/<domain>.md. The skill knows the schema, the read patterns, and the write protocol from the root CLAUDE.md.
Deploy when
- The user mentions a target account by domain or company name
- The user asks for a dossier, brief, or summary of an account
- The user has a new signal, interaction, meeting note, or research finding to file
- The user wants to find accounts matching criteria ("show me all Series B fintechs in our vault")
What this skill is NOT
- Not the CRM. Stage, owner, and ARR live in the CRM. The
crm_id frontmatter field is the bidirectional link — never re-derive CRM data here.
- Not a free-form notes app. Account-scoped intel only. Send personal notes elsewhere.
STEP 0: Parse the user's input
Expected forms:
/account-vault new <domain> — scaffold a new file
/account-vault dossier <domain> — 5-bullet brief
/account-vault append <domain> <signal_type> "<note>" — append a signal
/account-vault summary <domain> — regenerate the top-of-file summary
/account-vault list [filter] — search by frontmatter
Or natural language: "tell me about acme.com", "what do we know about Acme?", "add to acme.com: they hired a new VP Sales", "show me all tier-A accounts".
Extract:
command (one of: new, dossier, append, summary, list)
domain (root domain — strip protocol, www., trailing slashes)
args (signal_type, note, filter — depending on command)
If the domain is ambiguous (the user said the company name not the domain), search vault/accounts/ for matching frontmatter domain: or filename. If multiple match, ask which one.
STEP 1: Route by command
new <domain>
- Check if
vault/accounts/<domain>.md already exists. If yes, surface the existing file and ask if the user wants to view, append, or overwrite (destructive — never default to overwrite).
- Copy
vault/_templates/account.md to vault/accounts/<domain>.md.
- Fill in
domain:, created: <today>, last_touched: <today> in the frontmatter. Leave the rest blank for the user.
- Surface: "Created vault/accounts/.md. Fill in Firmographics + Open questions when you have them; the rest will populate as you append signals and interactions."
dossier <domain>
- Read
vault/accounts/<domain>.md. If it does not exist, offer to create it (new) and stop.
- Parse the frontmatter and the Summary section. If the Summary section has fewer than 3 bullets or is older than 14 days (compare
last_touched), regenerate it (see summary).
- Read the most recent 3 signals from the Buying signals section.
- Read the most recent 2 interactions from the Interaction log.
- Produce a 5-bullet brief:
- Bullet 1: who they are (firmographics one-liner)
- Bullet 2: most recent signal + its implication
- Bullet 3: most recent interaction + outcome
- Bullet 4: the top open question (if any)
- Bullet 5: the recommended next action (judgment — be concrete)
- Cite the file with a
vault/accounts/<domain>.md line at the bottom so the user can open it.
Total token budget: ~600 tokens out. Brief means brief.
append <domain> <signal_type> "<note>"
Read vault/accounts/<domain>.md. If it does not exist, offer to create it (new) and stop.
Validate signal_type against vault/signals/signal-catalog.md. If unknown, ask the user whether to (a) pick an existing type, or (b) add a new type to the catalog first (do not silently invent new types).
Append under the <!-- agent-appendable: signals --> marker, at the top of the section (newest-first), using the schema from the signal catalog:
### <YYYY-MM-DD> — <one-line title derived from the note>
- Signal type: <signal_type>
- Source: <source — ask if not given>
- Confidence: <low | medium | high — ask if not given>
- Implication: <one sentence — generate from the note>
Update last_touched: in frontmatter to today.
Mark the Summary section stale (add a comment <!-- stale: regenerate --> near the marker). Do NOT auto-regenerate the summary on every append — too expensive. Regenerate on demand or once per week via heartbeat.
Confirm: "Appended signal to vault/accounts/.md. Summary marked stale. Run /account-vault summary to refresh."
summary <domain>
- Read the entire file.
- Generate a 5-bullet summary that covers:
- Firmographics one-liner (industry + size + stage)
- Most recent material signal + implication
- Most recent interaction + outcome
- Tech stack and most relevant adjacent products
- The top open question or the recommended next action
- Replace the body of the Summary section (between
## Summary and the next ## heading) with the new bullets.
- Remove any
<!-- stale: regenerate --> marker.
- Update
last_touched: to today.
list [filter]
- Walk
vault/accounts/*.md reading only the frontmatter (do NOT read full files — keep this cheap).
- If no filter, list all accounts with: filename, tier, status, last_touched, top-tags.
- If filter is given, parse it as
key=value (e.g., tier=A, status=active, tags=fintech). Multi-criteria filters are AND'd. Examples the user might give: list tier=A status=active, list tags=fintech, list last_touched>=2026-05-01.
- Output a sorted table (by last_touched descending).
- Cap the list at 50; if more match, surface the count and ask whether to widen the view.
STEP 2: Maintain the write protocol
Always:
- Write under
<!-- agent-appendable: ... --> markers only. Never touch Firmographics or Open questions sections (those are human-maintained).
- Use ISO dates (
YYYY-MM-DD). Refuse relative dates ("yesterday", "last week") — ask for the date if not given.
- Wikilink contacts as
[[<slug>]] referencing files in vault/people/.
- After any write, update
last_touched: in frontmatter.
Configuration
Required environment:
ANTHROPIC_API_KEY — for summary and dossier (these use the Anthropic SDK via the in-session model, no extra config needed if the user is already running Claude Code)
Optional environment:
VAULT_ROOT — path to the vault. Defaults to the current working directory's vault/ folder if Claude Code was launched at the repo root.
Installation
Drop this file at ~/.claude/skills/account-vault/SKILL.md. Restart Claude Code if needed (or /skills reload). The skill is then available via the /account-vault slash command and via natural language ("tell me about acme.com").
1---2name: account-vault3description: Reads, writes, and summarizes per-account markdown files in a vault. Use when the user asks about a target account, wants a dossier, wants to append a signal, or wants to find accounts by frontmatter filter. Triggers on phrases like "tell me about <domain>", "dossier for <domain>", "/account-vault", "/dossier", "/account-new", "/account-append", "/account-list".4---56# account-vault78This skill turns the vault folder into a queryable, agent-writable intelligence layer for the GTM operator's target accounts. Every account is one markdown file at `vault/accounts/<domain>.md`. The skill knows the schema, the read patterns, and the write protocol from the root [CLAUDE.md](../../../CLAUDE.md).910## Deploy when1112- The user mentions a target account by domain or company name13- The user asks for a dossier, brief, or summary of an account14- The user has a new signal, interaction, meeting note, or research finding to file15- The user wants to find accounts matching criteria ("show me all Series B fintechs in our vault")1617## What this skill is NOT1819- Not the CRM. Stage, owner, and ARR live in the CRM. The `crm_id` frontmatter field is the bidirectional link — never re-derive CRM data here.20- Not a free-form notes app. Account-scoped intel only. Send personal notes elsewhere.2122## STEP 0: Parse the user's input2324Expected forms:2526- `/account-vault new <domain>` — scaffold a new file27- `/account-vault dossier <domain>` — 5-bullet brief28- `/account-vault append <domain> <signal_type> "<note>"` — append a signal29- `/account-vault summary <domain>` — regenerate the top-of-file summary30- `/account-vault list [filter]` — search by frontmatter3132Or natural language: "tell me about acme.com", "what do we know about Acme?", "add to acme.com: they hired a new VP Sales", "show me all tier-A accounts".3334Extract:35- `command` (one of: new, dossier, append, summary, list)36- `domain` (root domain — strip protocol, `www.`, trailing slashes)37- `args` (signal_type, note, filter — depending on command)3839If the domain is ambiguous (the user said the company name not the domain), search `vault/accounts/` for matching frontmatter `domain:` or filename. If multiple match, ask which one.4041## STEP 1: Route by command4243### `new <domain>`44451. Check if `vault/accounts/<domain>.md` already exists. If yes, surface the existing file and ask if the user wants to view, append, or overwrite (destructive — never default to overwrite).462. Copy `vault/_templates/account.md` to `vault/accounts/<domain>.md`.473. Fill in `domain:`, `created: <today>`, `last_touched: <today>` in the frontmatter. Leave the rest blank for the user.484. Surface: "Created vault/accounts/<domain>.md. Fill in Firmographics + Open questions when you have them; the rest will populate as you append signals and interactions."4950### `dossier <domain>`51521. Read `vault/accounts/<domain>.md`. If it does not exist, offer to create it (`new`) and stop.532. Parse the frontmatter and the Summary section. If the Summary section has fewer than 3 bullets or is older than 14 days (compare `last_touched`), regenerate it (see `summary`).543. Read the most recent 3 signals from the Buying signals section.554. Read the most recent 2 interactions from the Interaction log.565. Produce a 5-bullet brief:57 - Bullet 1: who they are (firmographics one-liner)58 - Bullet 2: most recent signal + its implication59 - Bullet 3: most recent interaction + outcome60 - Bullet 4: the top open question (if any)61 - Bullet 5: the recommended next action (judgment — be concrete)626. Cite the file with a `vault/accounts/<domain>.md` line at the bottom so the user can open it.6364Total token budget: ~600 tokens out. Brief means brief.6566### `append <domain> <signal_type> "<note>"`67681. Read `vault/accounts/<domain>.md`. If it does not exist, offer to create it (`new`) and stop.692. Validate `signal_type` against `vault/signals/signal-catalog.md`. If unknown, ask the user whether to (a) pick an existing type, or (b) add a new type to the catalog first (do not silently invent new types).703. Append under the `<!-- agent-appendable: signals -->` marker, at the top of the section (newest-first), using the schema from the signal catalog:7172 ```73 ### <YYYY-MM-DD> — <one-line title derived from the note>74 - Signal type: <signal_type>75 - Source: <source — ask if not given>76 - Confidence: <low | medium | high — ask if not given>77 - Implication: <one sentence — generate from the note>78 ```79804. Update `last_touched:` in frontmatter to today.815. Mark the Summary section stale (add a comment `<!-- stale: regenerate -->` near the marker). Do NOT auto-regenerate the summary on every append — too expensive. Regenerate on demand or once per week via heartbeat.826. Confirm: "Appended <signal_type> signal to vault/accounts/<domain>.md. Summary marked stale. Run /account-vault summary <domain> to refresh."8384### `summary <domain>`85861. Read the entire file.872. Generate a 5-bullet summary that covers:88 - Firmographics one-liner (industry + size + stage)89 - Most recent material signal + implication90 - Most recent interaction + outcome91 - Tech stack and most relevant adjacent products92 - The top open question or the recommended next action933. Replace the body of the Summary section (between `## Summary` and the next `##` heading) with the new bullets.944. Remove any `<!-- stale: regenerate -->` marker.955. Update `last_touched:` to today.9697### `list [filter]`98991. Walk `vault/accounts/*.md` reading only the frontmatter (do NOT read full files — keep this cheap).1002. If no filter, list all accounts with: filename, tier, status, last_touched, top-tags.1013. If filter is given, parse it as `key=value` (e.g., `tier=A`, `status=active`, `tags=fintech`). Multi-criteria filters are AND'd. Examples the user might give: `list tier=A status=active`, `list tags=fintech`, `list last_touched>=2026-05-01`.1024. Output a sorted table (by last_touched descending).1035. Cap the list at 50; if more match, surface the count and ask whether to widen the view.104105## STEP 2: Maintain the write protocol106107Always:108109- Write under `<!-- agent-appendable: ... -->` markers only. Never touch Firmographics or Open questions sections (those are human-maintained).110- Use ISO dates (`YYYY-MM-DD`). Refuse relative dates ("yesterday", "last week") — ask for the date if not given.111- Wikilink contacts as `[[<slug>]]` referencing files in `vault/people/`.112- After any write, update `last_touched:` in frontmatter.113114## Configuration115116Required environment:117118- `ANTHROPIC_API_KEY` — for `summary` and `dossier` (these use the Anthropic SDK via the in-session model, no extra config needed if the user is already running Claude Code)119120Optional environment:121122- `VAULT_ROOT` — path to the vault. Defaults to the current working directory's `vault/` folder if Claude Code was launched at the repo root.123124## Installation125126Drop this file at `~/.claude/skills/account-vault/SKILL.md`. Restart Claude Code if needed (or `/skills reload`). The skill is then available via the `/account-vault` slash command and via natural language ("tell me about acme.com").