Every layer of what your team knows —
one effective view.

Your notes, your team's runbooks, and company policy rarely line up, and your agent only ever reads one of them. ContextCake stitches all three into one graph: the closest layer wins each section, the rest carries through untouched, and wherever they disagree the agent sees both — with dates.

git clone https://github.com/siracusa5/context-cake.git
decisions/primary-db — resolved
Choicepersonal · 2026-06-28company disagrees
My notespersonal · 2026-06-28
Rationaleteam · 2026-06-20company disagrees
Analytics storeteam · 2026-06-20
Ownershipcompany · 2026-05-01
Relatedcompany · 2026-05-01

Team knowledge doesn't agree with itself.

Scattered
It lives in repo READMEs, a wiki nobody has opened in months, and three people's heads. Ask two of those sources what's current and you'll get two answers.
Agents read stale
Point an agent at one document and it answers from that document alone. It has no idea a newer decision, one layer up, already overruled it.
Overwriting loses the dissent
The usual fix is to flatten everything into a single doc. That quietly erases the objection you'll go looking for the next time something breaks.

Stack the layers. Resolve at read time. Serve one view.

  1. Stack

    Each scope is its own repo: your drafts, the team's runbooks, company policy. If you can read the repo, you can read the layer. There is no second permission system to keep in sync.

  2. Resolve

    Read a concept and the resolver assembles it a section at a time. The closest layer wins each section; whatever it doesn't mention falls through to the layer below.

  3. Serve

    Agents pull the finished concept over MCP, every section tagged with the layer it came from and the day it was written.

Watch a concept resolve, section by section →

A resolver, not another wiki.

Section-level merge

Layers merge a section at a time, not a file at a time. An override touches only the section it speaks to; everything else falls through from below.

Conflicts carry dates

When two layers disagree, the losing value doesn't disappear. It travels with its layer and its date, so nobody reopens a call that was already made.

Provenance on every section

Every section knows the layer it came from, and every field its origin. An agent can tell company policy from your Tuesday-night override before it acts on either.

Foreign graphs stitch in

A layer doesn't have to be markdown. Point one at a foreign MCP graph and ContextCake translates it to OKF as it reads, then merges it with everything else.

Captured from real work

It watches the work you're already doing, sorts the signal from the noise, and drafts concepts back. Safe ones land in the layer; anything sensitive waits for a human.

Zero dependencies

Plain Node 18 and nothing else. No npm install, no lockfile, no postinstall scripts — a supply chain you can read start to finish in an afternoon.

Playground

The same engine with a face on it: wire up sources, watch them merge in real time, and settle an N-way conflict by hand.

Speaks MCP. Answers with provenance.

Any agent that speaks MCP can query the resolved graph. Every read_file answer comes back with who said what, when, and where the layers disagree.

ToolWhat it does
searchFull-text search across all layers; one entry per concept with its contributing layers.
read_fileThe resolved effective concept — section merge, provenance, per-section conflicts. Pass a layer for a raw single-layer read.
list_conceptsAll effective concept IDs with their contributing layers.
get_linksOutgoing and incoming links, resolved against the effective graph.
read_file · decisions/primary-db (real resolver output, content truncated)
{
  "id": "decisions/primary-db",
  "contributors": [
    {
      "layer": "personal",
      "level": 3,
      "updated": "2026-06-28"
    },
    {
      "layer": "team",
      "level": 2,
      "updated": "2026-06-20"
    },
    {
      "layer": "company",
      "level": 0,
      "updated": "2026-05-01"
    }
  ],
  "frontmatter": {
    "type": "decision",
    "title": "Primary database",
    "updated": "2026-06-28",
    "owner": "me",
    "tags": [
      "database",
      "local-dev"
    ]
  },
  "frontmatterProvenance": {
    "type": "personal",
    "title": "personal",
    "updated": "personal",
    "owner": "personal",
    "tags": "personal"
  },
  "sections": [
    {
      "key": "choice",
      "heading": "## Choice {#choice}",
      "content": "Postgres in every shared environment. Locally I run SQLite for the test suite so I c …",
      "sourceLayer": "personal",
      "sourceUpdated": "2026-06-28",
      "conflicts": [
        {
          "layer": "company",
          "updated": "2026-05-01",
          "content": "Postgres (org standard). All services provision managed RDS through the platform cat …"
        }
      ]
    },
    {
      "key": "notes",
      "heading": "## My notes {#notes}",
      "content": "The ClickHouse ETL job is flaky on my branch — see the deploy runbook rollback step …",
      "sourceLayer": "personal",
      "sourceUpdated": "2026-06-28"
    }
  ]
}

Quickstart

Plain Node.js ≥ 18. No dependencies.

git clone https://github.com/siracusa5/context-cake.git && cd context-cake
node classify-context.mjs --demo
node ingest.mjs --demo
node write.mjs --signals control-surface/signals.json --manifest layers.json --target-layer team
node mcp-server.mjs --manifest layers.json
npm run playground

Read the docsInstall guide