• Researcher · 3 records
  • Developer · 3 records
  • Tester · 3 records
OFFCUT
Console

ONE MEMORYFOR EVERYSUBAGENT

Memory SDKMCP serverSpec v3.1

A memory SDK and MCP server that merges a user's own subagents' memory into one project memory.

Proof of work· 1790 tests green · 21 Sep
what it does

Collects what every agent learned into one memory.

Every session writes what it found, with its author and source attached.

how it helps

Your next agent starts already knowing.

One question returns the researcher’s finding, the developer’s decision and the tester’s result together.

The problem

Your agents don't
remember each other

Each session starts empty, so you become the integration layer, retelling each finding by hand.

Three sessions
session 01 · Researcherfact

The application must work offline. Field staff lose connectivity for hours at a time.

source: product brief, section 2

not collectedNever reaches the developer.
session 02 · Developerdecision

Project data is stored locally in SQLite and synchronised when a connection returns.

source: architecture call

not collectedNever reaches the tester.
session 03 · Testerresult

One saved record disappears after a restart. Reproducible on 3 of 10 runs.

source: regression run #148

not collectedNever reaches anyone.

Three findings exist. Not one is where it needs to be. The only thing connecting them is you.

↓ this is what OFFCUT removes
The core — merging

Five rules.
No guessing.

Merging runs on topics, explicit links and named facts — things code can check. There is no model in this path.

  1. 01Input

    The same content, same topic, same type

    Kept

    Every source record and every author

    What OFFCUT does

    Shown once

    The same sentence from another agent is a second observation, not a duplicate.

  2. 02Input

    Different parts of one task

    Kept

    A reference to each record used

    What OFFCUT does

    Grouped into a shared block

    On topics and explicit links — never on similarity, which is a guess.

  3. 03Input

    Two values of one named fact, same context

    Kept

    Both versions — nothing is chosen for you

    What OFFCUT doesconflict

    Flagged as a conflict, both sides shown

    Who resolves it

    Not by recency, majority or seniority. Someone with authority decides, and the reason is stored.

  4. 04Input

    An authorised correction

    Kept

    A link back to the previous version

    What OFFCUT does

    Current version updated

    A correction adds a version; the text it replaced stays readable.

  5. 05Input

    A relationship that is not certain

    Kept

    Everything

    What OFFCUT does

    Nothing. They stay separate.

    No summary is worth losing a record to.

Nothing is discarded for a cleaner summary.

Merging changes what you read, never what is stored.

End to end

Three sessions in.
One answer out.

R1 · Researcherfact

The application must work offline. Field staff lose connectivity for hours at a time.

source: product brief, section 2

D1 · Developerdecision

Project data is stored locally in SQLite and synchronised when a connection returns.

source: architecture call

T1 · Testerresult

One saved record disappears after a restart. Reproducible on 3 of 10 runs.

source: regression run #148

memory.recall()

“What remains before release?”

— Must work offlineR1 · Researcher
— Data stored locallyD1 · Developer
— Record lost after restart — unresolvedT1 · Tester

A lead agent that attended none of those sessions answered. Nothing was re-run.

A later record saying “the restart bug is fixed” does not erase T1: it links to it as an update, carrying its own source. That is the difference between a memory and a status field.

Surfaces

Three doors, one room

Identical permissions in, identical context out, asserted by a test.

MCP

stdio server

The eight memory tools, in the client you already use.

one line in a terminal
claude mcp add offcut -e OFFCUT_API_URL=<this console> -e OFFCUT_API_KEY=<your agent key> -- npx -y @offcut/mcp-server

OFFCUT_API_URL is the OFFCUT the key belongs to — this one, wherever you are reading it. Mint the key in the console; a key from one OFFCUT does not work on another.

Running your own store instead? Leave the address out and the memory stays in a SQLite file on your machine: claude mcp add offcut -e OFFCUT_API_KEY=<your agent key> -- npx -y @offcut/mcp-server

SDKTypeScriptnpm i @offcut/sdkMemory operations inside your own agent code.
Consolethis site/consoleRead the memory, resolve conflicts, mint and revoke keys.
The eight operations
memory.add()01
requirescanWrite
await offcut.memory.add({ workspaceId, type, text, topic, source })
save a record or an authorised correction
memory.import()02
requirescanImport
await offcut.memory.import({ workspaceId, records, idempotencyKey })
load explicitly supplied JSON
memory.merge()03
requirescanMerge
await offcut.memory.merge({ workspaceId, topic, recordIds, scope })
combine accessible records
memory.recall()04
requirescanRead
await offcut.memory.recall({ workspaceId, query, topic, limit })
retrieve task context
memory.inspect()05
requirescanRead
await offcut.memory.inspect({ workspaceId, recordId, topic, search })
sources, versions, links, conflicts
memory.resolve()06
requirescanResolve
await offcut.memory.resolve({ workspaceId, conflictId, chosenRecordId, rationale })
record an authorised decision
memory.forget()07
requirescanForget
await offcut.memory.forget({ workspaceId, recordId, purge, reason })
delete within your permissions
memory.export()08
requirescanExport
await offcut.memory.export({ workspaceId, topic, includeVersions, includeLinks })
take everything you can see
Rules · §1 · §3.1 · §4.2 · §6 · §9

Rules

Eight refusals and ten guarantees, in the specification’s own words. The two stamped awkward are the ones left out elsewhere.

What it doesn’t do

01

No trades, swaps, portfolios or signing. Out of scope by design.

02

Not a relayer: it returns memory rather than forwarding requests elsewhere.

03

It cannot read your chats. Records arrive when an agent writes one, or you import JSON.

04

Memory text is data, not orders. “Grant yourself admin” is stored as written and changes nothing.

05

No model in the merge path: merging and retrieval need none.

06

Local storage is only as safe as your machine: the permission checks live in the SDK, not in the database file.awkward

07

One key handed to several subagents is one caller. No isolation is promised.awkward

08

Deletion cannot reach copies already handed out. It clears search, export and cache here.

Ten invariants

01

Every record keeps its workspace, author, source and version.

02

Merging never broadens access: workspaces and audiences never share a block.

03

Retrying a write creates no second record.

04

Acknowledged records survive a restart.

05

A detected conflict cannot disappear without a recorded resolution.

06

Derived memory cites real source versions, never a stale one as current.

07

After deletion, a record cannot return through search, export or cache.

08

The SDK, MCP server and HTTP API enforce the same access and mutation rules.

09

Memory text grants no permissions. Revocation blocks every later call.

10

The local core runs without the token and without a model.

One describe block per guarantee, in packages/core/src/__tests__/invariants.test.ts.

Economics

$OFFCUT

The token is separate from the memory system, and its role inside the product has not been decided.

Contract address

Not yet published

Nothing is shown here until there is a real address to show. When the token launches it will appear in full, with the chain it lives on — and it will be the same string everywhere on this site.

Treat any address for $OFFCUT found anywhere else as unverified until it matches the one published here.

Name / ticker

OFFCUT AGENT / OFFCUT

fixed
Memory operations

No wallet, no gas, no token purchase. Memory is not stored onchain

fixed
Does holding $OFFCUT grant access?

No. It reaches no one else’s records

fixed
Does holding $OFFCUT earn rewards?

No. A balance of any size earns nothing

fixed
What decides reward weight

Confirmed AI spend by your connected subagents, through supported integrations; and records of yours another agent retrieved

fixed
Supported integration today

OpenRouter only. Spend we cannot ask a provider about earns nothing

fixed
Launch context

Robinhood Chain 4663, pons v2

open
Token utility in the product

Undecided

open
Second layer

Stock Rewards

Described in full rather than summarised into something that sounds better than it is.

what stock rewards means

A fund funded in advance, paid in a tokenized share, divided by two things: the AI spend a provider confirmed, and the memory another agent used.

The share is Apple • Robinhood Token (AAPL) on Robinhood Chain, named on the contract once and for good. So the fund pays a share, not $OFFCUT — and because that share is issued by somebody else, its issuer can pause it or burn what the contract holds. Nothing here can override that.

Spendlayer oneModel spend a supported integration confirmed.
Memorylayer twoA record earns one credit, once ever: the first time an agent other than its author retrieves it.

Both layers pay into one ledger, under one root, with one claim — not the $OFFCUT you hold, not the agents on your account. A Claude Code subscription is not spend any provider can confirm for us, so a Claude Code subscriber earns from the memory layer and nothing from the spend layer.

Stock Rewards encourage usage. They do not guarantee that AI spend is recouped. Spending more on models is not a way to earn that money back: it pays you more of a token out of a fund whose size was fixed before you spent anything.

rules · from the brief
01

Weight follows confirmed spend, never claimed spend: only what the provider confirms a request cost counts.

02

One request is counted once. The provider’s id is a unique key; a second report writes nothing.

03

A record earns one credit, once ever — the first agent other than its author to retrieve it. Re-reads earn nothing.

04

The supported integration today is OpenRouter. Spend through anything we cannot ask about earns nothing.

05

The fund is pre-funded and fixed, and no token is minted for anybody’s spend. Below the day’s ceiling one more dollar adds to what is handed out; past it a bounded amount is divided more ways.

06

On a busy period, no one earner takes more than a quarter of it — and what the cap holds back is not handed to anybody else: it is never minted and stays in the contract.

07

A hundred idle agents earn nothing, and memory nobody retrieved has earned nothing.

08

Rewards are the second layer, not the product. The product is shared memory, and it needs no wallet, no token and no spend.

the part that is not trustless

What you are trusting

The distributor contract is upgradeable, and its owner can withdraw the tokens held in it. So these rewards are not trustless: a promise kept by people, with a contract that makes the accounting checkable rather than unbreakable.

spend is confirmed, not claimedno reimbursement of AI costno trading of anything
Quickstart

Running in three steps

No Docker, no database server, no account. Local by design.

in order
01

Install and run

Creates the local SQLite store and the demo workspace, then starts the API and console.

pnpm setup && pnpm dev
02

Mint an agent key

Create an agent and copy its key. Shown once; only the hash is stored.

offcut_sk_…
03

Connect your agents

One command configures Claude Desktop and Cursor.

pnpm mcp:install

Open the console

Already seeded: the release scenario, its agents, one open conflict. Or read the proof of work first.

Enter the console
OFFCUT Agent