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
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
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
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
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
deployworkflow 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,.astroor.tqlat the tag's name. intakehas a story and this page, but not yet a full family.- Most tags do not have families at all.
schema/deploy.tqlis 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.