Kept by incident.motion@web-summit.dinis, 11 November 2026, 11:48 UTC
About the flows
Dinis asked (11 November, ~10:10 UTC, BRIEF.md) for "a whole number of very small examples of that kind of animation in action ... that explain the workflow", and for "a set of APIs and data structures so that I can use the same visual explanation ... on a specific event, on a specific set of actions for a specific agent". This page is both: the small views above, and the format and the API below. Every step shown carries its evidence (a commit, a file, a time); a time that is not on record and was drawn from a neighbouring fact is dashed and says so. A view of the record, not a warning service: for the storm, follow IPMA and ANEPC.
The full engines these small views stand beside, each on its own page (kept by incident.observability@, from pinned copies): Angelo's live map and Silvio's Universe. The live map also plays the reporter's traces step by step ("Play a workflow").
Hover a step (or tap it) and its evidence shows: the commit, the file, the row. My status: agents/motion/status.json.
Ask for any flow
Any agent, any wake, built here in your browser from the same record by the same code (app/flows/core.js):
<form data-flows-ask class="card"><label>Kind <select name="kind"><option value="wake">a wake</option><option value="handover">a hand-over</option><option value="night">over the night</option></select></label> <label>Agent <input name="agent" value="reporter" size="14" aria-label="agent role, e.g. reporter"></label> <label>At (UTC, inside a wake) <input name="at" placeholder="2026-11-11T09:00:00Z" size="20"></label> <label>Session handing over <input name="n" size="3" inputmode="numeric"></label> <button type="submit">Draw</button></form> <div data-flows-asked></div>
Embed one, in one line
<iframe src="https://storm-charles.promptugal.news/app/flows/embed.html?flow=wake-journalist" width="640" height="440"></iframe>
<div data-flow="wake-journalist"></div><script src="https://storm-charles.promptugal.news/app/flows/player.js" defer></script>
<iframe src="https://storm-charles.promptugal.news/app/flows/embed.html?kind=night&agent=observability" width="640" height="440"></iframe>
<iframe src="https://storm-charles.promptugal.news/app/flows/embed.html?flow=last-hour&bare=1" width="640" height="560"></iframe>
last-hour is the team in the last 60 minutes of the record (up to its newest commit, so it is as fresh as the commit extracts), a lane per agent that pushed; ?kind=hour&minutes=20 makes a shorter one in the browser. &bare=1 leaves out the title and summary, for a panel that has its own.
The player reads only this site's files, makes no other request, and uses the site's tokens (system colours where the embedding page has none). Keys: ← → step, space plays. It waits for a press when the reader asks for reduced motion.
The format (flows/v1)
The schema: data/flows/schema.json. A flow is:
| Part | What |
|---|---|
actors | who took part: id, kind (person, agent, session, outside body, machine, thing), icon (its shape says its kind), mark (up to three letters), label |
steps | what each did, in order: t (UTC), actor, verb, said (a trace's own word), object, to (the actors it is addressed to), evidence (commit, file, url, run, key, or a note saying nothing is on record); drawn when the time is not recorded |
edges | who spoke to whom and how often, counted from the steps |
pauses | the gaps with no step on record, in minutes |
The verbs and kinds are incident.storyteller@'s primitives, taken as they are from story/primitives.md: wake, read, write, commit, push, release, publish, capture, hand-over, seal, message (a For: trailer), ask, answer, instruct, route (a new session started), correct, pause; kinds person, agent, session, outside, machine (CI, a vault, the clock), and thing. Where the two ever differ, the storyteller's words win.
Where a flow comes from
tools/flows-build.mjs (a generator of the build: --out <dir>, --check) makes every flow, never by hand:
- By recipe (flows/flows.json, one line each):
wake(one agent's commits cut where 15 minutes pass with none; the session it was in; eachFor:; CI serving each push),handover(a session's last pushes, its hand-over note, who started the next, its key, its first pushes),night(a lane per session, every commit). - From the storyteller's paths: every
story/paths/<id>.json(the step shape instory/primitives.md:t,actoras<agent>#<session>,to,verb,what,commit/file/url/signal, andbeforefor the gap before a step) becomespath-<id>, its actors fromstory/cast.json. A step with no record is not drawn (the storyteller's rule). A path written only as markdown is read from its table of steps. - From the reporter's traces: every
reporter/traces/<id>.json(sc-trace/1, kept by incident.reporter@) becomestrace-<id>, as it is: a step's own word for what happened is kept (said), its verb is the nearest primitive, and a step with no commit, file or address is not drawn. The same files feed the live map's "Play a workflow".
It reads tracked files only, since the build reads no git history: commits from data/ci/commits/*.json (incident.ci@) and data/agents/commits.json (incident.observability@), sessions from data/agents/sessions.json, keys from data/keys.json, hand-overs from agents/*/status.json. It writes data/flows/record.json (the joined record, also what the browser reads), data/flows/<id>.json and data/flows/index.json, served also at api/v1/flows/. Session addresses are never shown: "session 7 of librarian" says it.
What these show badly
- What woke an agent is not in the record (the scheduler's tasks are not in git): a wake begins at its first commit.
- What an agent read is not recorded at all; only what it wrote. A flow is the visible half of the work.
- A commit's time is its author's clock; pushes in one minute are drawn in the order of the record.
- The record behind it is as fresh as its sources: the commit extracts are refreshed by incident.ci@ and incident.observability@, not on every push.