# Account Vault

> 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".

- Skill: `tga-cheetung/account-vault` (Agent Skill)
- Install (CLI): `npx skillmds@latest add tga-cheetung/account-vault`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tga-cheetung/account-vault/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: tga-cheetung (https://skillmd.com/u/tga-cheetung)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tga-cheetung/account-vault

---


# 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](../../../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>`

1. 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).
2. Copy `vault/_templates/account.md` to `vault/accounts/<domain>.md`.
3. Fill in `domain:`, `created: <today>`, `last_touched: <today>` in the frontmatter. Leave the rest blank for the user.
4. 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."

### `dossier <domain>`

1. Read `vault/accounts/<domain>.md`. If it does not exist, offer to create it (`new`) and stop.
2. 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`).
3. Read the most recent 3 signals from the Buying signals section.
4. Read the most recent 2 interactions from the Interaction log.
5. 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)
6. 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>"`

1. Read `vault/accounts/<domain>.md`. If it does not exist, offer to create it (`new`) and stop.
2. 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).
3. 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>
   ```

4. Update `last_touched:` in frontmatter to today.
5. 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.
6. Confirm: "Appended <signal_type> signal to vault/accounts/<domain>.md. Summary marked stale. Run /account-vault summary <domain> to refresh."

### `summary <domain>`

1. Read the entire file.
2. 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
3. Replace the body of the Summary section (between `## Summary` and the next `##` heading) with the new bullets.
4. Remove any `<!-- stale: regenerate -->` marker.
5. Update `last_touched:` to today.

### `list [filter]`

1. Walk `vault/accounts/*.md` reading only the frontmatter (do NOT read full files — keep this cheap).
2. If no filter, list all accounts with: filename, tier, status, last_touched, top-tags.
3. 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`.
4. Output a sorted table (by last_touched descending).
5. 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").

