External agents — Claude Cowork, Claude Code, anything connected to [Kit's MCP server](/docs/connecting-ai-assistants) — forget everything between runs. Prospect memory is where they put research so the next run reads it instead of paying for it again.

## What It Stores

One memory per company domain, per account. `founder@acme.dev`, `https://www.acme.dev/careers` and `acme.dev` all resolve to `acme.dev`.

Each note holds:

- A markdown body, encrypted at rest
- One or more source URLs
- `observed_at` — the date the fact was true
- An optional short title, also encrypted, e.g. `Funding` or `Hiring signals`
- Attribution: the member, and the OAuth client if the note arrived over MCP

Kit sends each note's title and body — up to the first 6 KB — to Google's `gemini-embedding-001`, which returns the vector used for overlap detection and ranked recall. That happens for every account, whatever AI provider you have configured.

The memory is account-wide, not campaign-scoped. Approach the same company in three campaigns and it has one dossier, not three. A note saved during a recruiting campaign is there when a sales campaign hits the same domain six weeks later.

Notes observed more than 30 days ago are flagged `stale`. Recall also reports one dossier-level `stale`, true when the newest stored note has passed 30 days and true when nothing is stored at all. Stale means re-verify the fact before you use it in a draft, not discard the dossier.

## The Loop

Four tools. Full parameters and return shapes are in the [MCP Tools Reference](/docs/mcp-tools-reference).

1. **`outreach_recall_prospect_context`** — first call of every run, before any web search. Returns stored notes plus what your account already did to this company: the campaigns the prospect is in, how many messages were sent, the last reply and its sentiment, and whether the address or domain is suppressed.
2. **`outreach_save_prospect_research`** — one call per distinct finding, not one per run. At least one source URL is required and the tool rejects a note without one.
3. **Read `data.overlap` on the save response.** It is computed against everything already stored for that domain and it is the only signal that the memory is going redundant.
4. **`outreach_compact_prospect_context`** — merges notes into one dossier. Only when you ask for it.

`outreach_get_writing_guide` returns Kit's de-slop writing guide for `en`, `de`, `fr`, `es` or `pl` — the patterns that make drafted outreach read as machine-written. Agents should read it before drafting, not after.

Two stop conditions come back on every recall: `relationship.suppressed` is true, or `relationship.last_reply.sentiment` is `negative`. Either one means do not add the prospect and do not draft.

## Scheduled-Task Prompt

Paste this into a Claude Cowork scheduled task, replacing `<CAMPAIGN NAME>` with your campaign. It lands in the agent's context on every run, which is why it works better than hoping the agent remembers the loop.

```
Run today's outreach research pass for the <CAMPAIGN NAME> campaign.

For every company on the list, in this order:

1. Call outreach_recall_prospect_context with the company domain FIRST, before any
   web search. Read data.known, data.stale, and data.relationship.
2. If data.relationship.suppressed is true, or data.relationship.last_reply.sentiment
   is "negative" or "bounce": skip the company entirely. Do not add a prospect, do not
   draft. Add it to a "skipped" list in your summary with the reason.
3. If data.known is true and data.stale is false, do NOT re-research. Use the stored
   notes.
4. Otherwise research the company, then call outreach_save_prospect_research once per
   distinct finding, each with at least one source URL and the observed_at date the
   fact was true.
5. Read data.overlap on every save response. Report any near_duplicates you created
   and any shared_sources that show you re-read a page already cited.
6. Before drafting anything, call outreach_get_writing_guide for the campaign's
   language and follow it.
7. Do NOT call outreach_compact_prospect_context. If data.compaction_suggested is true
   for a company, list that company under "compaction suggested" in your summary and
   stop there.

Finish with a summary containing four lists: researched, reused-from-memory, skipped
(with reasons), and compaction suggested.
```

The number to watch in that summary is reused-from-memory. A run that researched everything is a run where recall was skipped.

## What the Agent Is Told About Overlap

Every save response carries three buckets. Notes are compared by cosine distance between their embeddings.

| Bucket | Trigger | What the agent should do |
|--------|---------|--------------------------|
| `near_duplicates` | distance ≤ 0.10 — this note nearly restates an existing one. The existing note's **full body** comes back. | Compare both. If the new note adds nothing, delete it and keep the older one. If it updates the fact, flag it for compaction. |
| `overlaps` | distance ≤ 0.30 — same territory, different detail. A 300-character excerpt comes back. | Keep both. Note it for the next compaction. |
| `shared_sources` | A stored note already cites one of the new note's source URLs. | The agent re-read a page it had already read. Worth fixing in the next run's plan. |

All three empty means the note is clean and new.

Separately, `data.compaction_suggested` turns true once a domain holds more than 8 notes. It appears on both recall and save. It is a report, not an instruction: agents are told to surface it and leave the merge to you.

Recall adds `overlap_pairs`: the pairs of stored notes already within 0.30 cosine distance of each other, computed over the 20 newest notes. That is the list a compaction request should be built from.

## Compaction

`outreach_compact_prospect_context` writes one merged dossier and supersedes the notes it replaces. The survivor inherits the union of every source URL and the earliest `observed_at` of its sources.

Superseded notes are archived, not deleted. They keep a pointer to the note that replaced them, so a bad merge is recoverable.

The tool takes `expected_note_count` — the `note_count` from the recall the merge was based on. If someone saved a note in between, the count no longer matches and the merge aborts instead of swallowing that note.

## Limits

| Limit | Value |
|-------|-------|
| Note body | 10 KB. Larger is rejected. |
| Note title | Collapsed to one line and trimmed to 120 characters. |
| Source URLs | At least one, at most 20. Each must be an `http` or `https` URL string under 2 KB. |
| `observed_at` | Required by the save tool and never defaulted. Set it to when the fact was true, since that is what staleness measures. |
| Notes saved per day | 200 per account. Past that the save tool returns an error until the next day. |
| Notes per domain | 50. Past that saving is rejected; compaction still works and is the way back under it. |
| Stale after | 30 days |
| Compaction suggested after | More than 8 notes on one domain |
| Recall payload | 100 KB. Above it, notes are ranked semantically instead of returned whole and `truncated` comes back true. |

Recall needs the `outreach_read` scope. Saving and compacting need `outreach_write` **and** Outreach module admin. All of it needs the Outreach add-on and an active subscription.

## Where Notes Appear in Kit

The prospect page shows the three newest notes for that company by observation date, with a **View all** link to the full list.

The list is read plus delete. Deleting removes the note from the dossier and from every future recall. There is no way to write or edit a note from the browser — the tools are the only write path.

## What This Is Not

- **Not a CRM.** It stores research about a company, not contacts, deals, or a pipeline.
- **Not general agent memory.** It is keyed by company domain and reachable only through the four outreach tools. It will not hold arbitrary notes, task state, or conversation history.
- **Not shared between accounts.** Every query is fenced to the connected account. No note ever crosses a tenant boundary, and nothing is pooled or aggregated across customers.
- **Not a send path.** Nothing on this page emails anyone. Sending stays human-in-the-loop through the normal [message review](/docs/outreach-messages) flow.

## Next Steps

- [AI Research and Knowledge Base](/docs/outreach-ai-research) — how Kit's own agent researches and drafts
- [MCP Tools Reference](/docs/mcp-tools-reference) — parameters and return data for all four memory tools
- [Remote MCP Servers in Campaigns](/docs/remote-mcp-servers-in-campaigns) — connecting external agents to Kit