Written by T4 · Chart path (teams/README.md in this kit) from its own work. Any agent of any
kind reads this, and any agent that learns something about the chart path writes it here, not in
its own private memory. That is how the practice evolves where every seat can see it.
Every chart an agent writes reaches one place where the people it concerns can read and steer it, and whether that place is public is decided per source.
coaia-narrative). Every write ends in one save of
a chart memory, a .jsonl file. The file is the record. Asterion only holds a projection of it.COAIA_ASTERION_URL, COAIA_ASTERION_TOKEN and COAIA_ASTERION_PROJECT set
on the MCP server (coaia-narrative 0.18.0 or later), each save posts the whole file to
POST /api/ingest/coaia-narrative.asterion-coaia-sync.timer runs every 5 minutes and reads each
registered file, from disk (--file) or from a repository’s origin/main (--git).app/lib/asterion/coaia-projection.mjs in miadisabelle/asterion) turns charts into
tensions, steps into action steps, beats into beats, and a chart family with beats into a thread.See it live at /bridge and /settings on any Asterion address. List the registry from
miadisabelle/asterion/app with node scripts/coaia-sync.mjs list (it needs app/.env.local, so
on gaia only).
Asterion’s public addresses (asterion.jgwill.com, asterion.tushell.com,
asterion.sanctuaireagentique.com, asterion-zeta.vercel.app) answer anyone. A private project
is shown only to a signed-in writer (signed in at /signin with a Miadi token, or holding the
writer token).
--private, in the same command
that first registers it, so no sync runs before it is private:
node scripts/coaia-sync.mjs register <key> --name "<name>" --file <path> --private--public makes a project public again. list marks private projects PRIVATE./srv/miadi/episodes has a private bare repository on gaia as its origin, so an episode’s chart memory is registered --private. ep060 was made private on 2026-10-06 by the ingest-door lane for this reason, after being public since 2026-09-28.jgwill/dummass (private) showed on the public site for about ten
minutes. On 2026-10-03, Mino’s chart (miadisabelle/workspace, private) was kept off Asterion
until private projects existed. It is now registered as mino-triage, private.viewerOf(request) (lib/asterion/visibility.ts). A read that
does not ask hides private rows. scripts/check-read-gates.mjs fails the build when a GET route
never asks, beside check-write-gates.mjs for writes. Public list caches use the keys
projects:public and tensions:public:*, which no earlier deployment writes.The factory used “workspace” for three different things. T4 uses one word per thing. Correct this section when William does.
| word | means | where it lives today |
|---|---|---|
| repository | owner/repo on GitHub |
everywhere |
| checkout | one repository cloned on one host, at a path | Miadi config/stc-workspaces.json (repository, localPath), shown at /stc-config, where it is called a “workspace” |
| chart memory | one coaia-narrative .jsonl file of charts |
a checkout’s .coaia/, an episode folder, ~/workspace/.mino/coaia/ |
| project | Asterion’s unit: one key, one or more chart memories, public or private | asterion.projects, registered with coaia-sync.mjs |
| seat | the agent session responsible for steering a project’s charts | Miadi config/stc-steering.json (seats, each a tmux session) |
| workspace | an agent’s home, the way Mia’s ~/workspace is hers |
miadisabelle/workspace for Mia; the example community users follow |
When Asterion moves into Miadi, /stc-config’s “workspaces” become checkouts, and “workspace”
stays free for the agent’s home.
Asterion knows where a chart memory is. It does not know where the work happens. /stc-config
(29 entries in config/stc-workspaces.json, 2026-10-03) holds, per repository:
localPath), which is where an agent works on the issue a chart steps intoSTC.md, STCGOAL.md, STCISSUE.md, STCMASTERY.md) and whether to create themstcgoal, stcissue, stcmastery, stckin)When Asterion moves into Miadi, a project gains its checkouts (repository, host, path) and its seat.
Keep /stc-config working beside Asterion’s pages until the project page shows all three.
Asterion does not write a chart memory. The sync would overwrite the edit, and the memory belongs to the agent that keeps it. Steering goes to the seat instead:
config/stc-steering.json,
lib/stc/steering.ts), the same path a GitHub action takes to reach a seat today.tide agents restore, the binding line).Built 2026-10-06 (miadisabelle/asterion 015a767): a project names its seat. The project page
shows it to everyone. A signed-in writer names, changes or clears it there, or with
PATCH /api/projects/<id> and { "seat": { "session": "<tmux session>", "host": "<host>" } } (or
{ "seat": null }). It is kept in projects.metadata.seat as { kind: 'tmux', session, host,
set_by, set_at }, the shape of a seat in Miadi’s config/stc-steering.json, and the registry sync
never touches it. Every change is a project.seat_named or project.seat_cleared event. First seat:
ep060 → episode-060-coaia-agent-asterion-system on gaia.
Name a seat only for a session that should receive steers. A session renamed *-OFFLINE is one its
person took offline on purpose: naming it routes steers back in. mino-triage stays without a seat
until William brings Mino’s seat back online (Mino recommends stcbot on gaia).
What is missing: a steer made on Asterion is not yet an event that reaches the seat (steps 1 and 2 above).
lib/asterion/writer.ts) goes,
because Miadi already knows who people are. visibility.ts stays.@miadi/asterion package holds the types (packages/asterion today), the mapper
and the registry sync.@medicine-wheel/data-store-postgres, beats and threads
into @medicine-wheel/narrative-engine, the beat timeline into @medicine-wheel/ui-components.miadisabelle/asterion AGENTS.md for how the gaia instance is rebuilt (scripts/ops/rebuild.sh, never next build by hand).