Companion to the story

Intake

A story is what a thing is once it is inside. Intake is how it got there.

The one sentence

A thing arrives as a signal, the signal carries a tag, and the tag already knows what to build.

That is the whole mechanism. Everything below is that sentence, slowed down.

The tag is the whole address

A tag is usually a label — something you put on a row to filter for it later. Here it is not. A tag is an address, and a family lives at it. When a signal carries the bare tag deploy, that word already names:

  • the story it belongs to text/deploy.md
  • the code that shapes it lib/deploy/
  • the page it appears on /deploy
  • the questions you may ask schema/deploy.tql
  • the workflow it runs through the deploy template
  • the tasks it files about itself the deploy tasks template
  • who answers it whoever staked the word
  • the command that starts it .claude/commands/deploy.md

Nobody wired those together. They are reachable from the one word because they are all named after it. The tag is the join — which is why the idea generalises: a signal tagged deploy can have a webpage for the same reason one tagged intake can.

The four beats

Deliberately shorter than a story's seven — a story is told, an intake merely happens.

  1. 1

    Knock

    Something arrives.

    A signal crosses a door — api/signal, api/ask, a channel ingress, a script calling deploy:event. The door is where the signal becomes real and where its origin is minted; never on a page, never retroactively. The arrival is recorded before it is understood, because a thing that arrived and could not be classified is still a thing that arrived.

  2. 2

    Name

    The tag is read.

    Tags are read as BARE words. Not lifecycle:deploy, not kind:deploy — just deploy. This is not style: a namespaced subscribe tag matches zero signals, and it does not fail loudly. It simply reaches nobody, forever.

  3. 3

    File

    The work becomes rows.

    The tag's family includes a tasks template, instantiated here — before the work is done, not after. A template filed up front means a reader sees open rows closing one by one. Filed afterwards it is a changelog. Only one of those is a board, and only the first leaves a gate that never ran visibly open.

  4. 4

    Route

    It finds who answers.

    The signal flows down weighted Paths from its tags to whoever staked them. The stake is the weight: mark and warn move it, so outcomes re-rank who gets the next matching signal. The CEO is the default receiver and not a bottleneck — it steps in only when no one has staked.

Deploy, end to end

The first tag built this way, chosen because it has the least room to lie: a deploy either shipped or it did not.

./deploy
   │
   ▼
deploy:run
   │   the `deploy` workflow opens a run
   │   id = deploy:<target>:<run>
   ▼
the tasks template files TEN OPEN ROWS
   │   tree · credentials · typecheck
   │   tests · build · smoke · approval
   │   migrations · ship · health
   ▼
each gate reports deploy:event
   │   → the same run row
   │
   │   doctor           tree · credentials
   │                    · health
   │   release-manager  typecheck · tests
   │                    · build · smoke
   │                    · migrations · ship
   │   ceo              approval
   │                    ← a human step,
   │                      and it stays one
   ▼
the verdict closes the run
       green only if EVERY gate closed

Green is the absence of open work, never the absence of failure. A run where four gates never fired and none failed is not green — and deploy_gate_open() joined with deploy_gate_ran() answers the question no log answers: which gates nothing recorded running. See the deploy page.

What is true today, and what is not

A document that overstates is worse than one that is missing.

Shipped

  • The deploy spine's ten gates and their D1 projection.
  • The deploy workflow template — authored long ago, but dark until it was registered in the catalog.
  • The deploy tasks template, owner-typed against the spine.
  • schema/deploy.tql — functions only, zero new types; parsed by TypeDB, not grepped.
  • Bare-word staking and weighted routing.

Not yet

  • The world: walk presence-checks agents, skills, workflow steps and views — not a .ts, .astro or .tql at the tag's name.
  • intake has a story and this page, but not yet a full family.
  • Most tags do not have families at all.
  • schema/deploy.tql is live on production but unexercised — prod holds no deploy rows yet, so its 17 functions answer over an empty set.

The gap between those two lists is the work. Keeping them separate is how it stays visible.

Read next — the story, what a thing becomes once it is inside · deploy, the first complete family.