Walk, don't dump
To read, descend one level at a time, reading summaries, following the heaviest edge. Never fan out and load a whole neighbourhood "to be safe".
PlotDeck · spec
How an AI reads and writes this deck. If you are an agent connected over MCP, this page is binding: read it fully before your first tool call. Where it says MUST or NEVER, treat those as hard constraints — some of them the server now enforces for you.
A weighted, multi-parent DAG laid over a canonical single-home graph. Underneath, every canonical node (project, topic, entry, entity) has exactly ONE home. Above it sits the Atlas: a layer of pointers you walk. Many pointers may aim at the same node, so a node effectively has many parents, each edge carrying a weight. You get a clean walkable spine and honest many-branch richness at once. That duality is the point: do not flatten it into a tree, do not dissolve it into a free graph.
To read, descend one level at a time, reading summaries, following the heaviest edge. Never fan out and load a whole neighbourhood "to be safe".
To write, you choose a node's parents and their weights. Placement — not "which box" — is the act of capture. One heavy parent now; light secondary parents later.
State is never a property on a card. It is a link-sealed, single-parent child of a container. Containers carry outward links; facets carry none.
Goal: get from "I have a question" to "I am looking at the 1–3 nodes that answer it" while loading as little as possible.
outline it. You get a handful of realms, each with a summary and a child count. Read summaries only.outline it. Repeat. Each level narrows realm → category → project.outline, stop and read summaries before choosing the next child. Do not pre-load siblings.Never search or crawl broadly as a first move to "grab everything"; never open bodies above the leaf. If you are loading more than about five nodes at one level, you have abandoned the walk — back up and pick ONE child.
Add knowledge so future walks find it from every angle it deserves — and from no angle it doesn't. Ask, in order:
Weight is meaning, not priority theatre: the heavy edge is high because that IS the usual way in. And write real summaries — the summary is what every future walk reads instead of the body, so a vague one breaks the walk for everyone after you. Prefer extending an existing node over creating a near-duplicate.
This is the law that keeps the deck from rotting, and the most distinctive thing about PlotDeck.
status field. There is no answered flag.The invariant: navigation only ever traverses meaning-bearing containers. Facets have no outward edges, so a facet can never become a path, a hub, or a cross-edge. That is what buys multi-parent richness without the graph turning to mush.
In practice: to mark something done you do not set a property and you do not edit prose — you attach or replace a status facet. To answer a question, the answer is a sealed child of the question's container, not an edit to the question. If you ever feel the urge to give a facet one outward link "just this once", stop: that urge is the rot. If it needs outward links it was never a facet — promote it to its own container.
This discipline is high-ceremony: every status change is a child object, not a flag flip. A human erodes that out of friction, which is why the deck is built AI-first — an agent holds it by default. But an agent's failure mode is judgment (misclassifying a facet, or forgetting the rule late in a long context), so the server enforces the seal rather than trusting it.
A Thread is the canonical container for a question and its resolution. The container carries the outward links and hangs next to what it questions, so context is one hop away. Inside, as sealed children: the question (verbatim, never overwritten), a status facet (open / answered / parked), and once answered, an answer facet.
resolves → the question. That edge stays inside the container, which is the one facet-to-facet link the seal permits.Do not "simplify" this shape. The question stays verbatim so the trail survives — what was asked, what was decided, when. The answer is its own node so it carries weight and can later be superseded; you cannot supersede a paragraph edited into a question. Status-as-facet is what makes "show me only what is still open" a cheap, structured query instead of prose parsing. And because it is all sealed inside the Thread, nine open questions never become nine loose fragments each sprouting edges.
Facets are a real primitive, not a naming convention. Single-parent is a column, so attaching a facet writes no edge at all — and facets never appear in outline, search, entry listings or graph crawls, by construction rather than by filtering.
| You ask for | The server does |
|---|---|
| Container → its own facet, or facet → sibling facet of the same container | Allows it. This is the answer-resolves-question edge. |
| Facet → anything outside its container | Refuses, and tells you to promote the node to its own container. |
| Anything outside → a facet | Refuses: that would hand the facet a second parent. |
| Filing a facet into the Atlas as an index node | Refuses — the pointer layer is the other way state could leak into navigation. |
| A second status facet on one container | Replaces the existing one in place, so state never accretes. |