Wave 2 · The admission figure · record #3sys.descriptor.defined
#3 · the charter's author
When the engine takes it, the machine stores the doer and notes that it waits for the charter gate.
Came froma personThe person's act of opening a Cell sowed it at the door: a doer of the admission figure. step 14
when it came in at the door
14Record #3 enters the logLOG · append
a wave is settlingengine: next: #2membrane: waiting at #2
The log - #0a listener
- #1a doer
- #2listener: the charter
- #3doer: the authornew
- end of the log
The log What before after records in the log 3 4 #3 — doer: the author · sys.descriptor.definedThe door adds #3: a doer — the charter's author, which will ask the world to write the charter.
Where it happens
appendEmissions()Vol. 02 §4.1 · Vol. 03 §1The only function that adds records to the log. Each new record gets the next free number, at the end.
- Specification
- Vol. 02 §4.1 · Vol. 03 §1
- Code
appendEmissions()incore/registers/append-emissions.ts, line 14: the new record gets the next free number- Journal
LOG · append· offset: 3, kind: sys.descriptor.defined · by engine- Picture
- records in the log: 3 → 4
core/registers/append-emissions.ts· build 043cc8b// The one LOG writer (Vol. 02 §4.1, Vol. 03 §1): emissions become tuples by// receiving the next dense absolute offset — `base + window.length` — and// nothing else ever grows the log. Each append is journalled under the// ambient context, so a batch born of a propagated tuple carries that// tuple's offset as its cause — the cube's provenance line (ADR-002).import type { WaveEmission, WaveTuple } from "../wave/gate";import type { RegisterFile } from "./register-file";import { recordTransition } from "./record-transition";export function appendEmissions(file: RegisterFile, emissions: readonly WaveEmission[]): void {const engine = file.registers.engine;for (const emission of emissions) {const tuple: WaveTuple = { ...emission, offset: engine.base + engine.window.length };↑ the new record gets the next free numberengine.window.push(tuple);↑ it is added at the end of the logrecordTransition(file, "engine", "LOG", "append", {↑ the change is written into the journaloffset: tuple.offset,kind: tuple.kind});}}
AGPL-3.0-onlyThe Lab's demonstration environment, as this fragment ran it (build 043cc8b). The code may change, and may differ from the code of a working machine.
Nest VM core, incubated in the CoAgnes garden · build 043cc8b (2026-09-21) · this file last changed in f36e70d (2026-08-18)
when the engine took #3
26The engine takes #3ENGINE.CURSOR · propagate
a wave is settlingengine: working on #3membrane: waiting at #2
The log - #0a listener
- #1a doer
- #2listener: the charter
- #3doer: the author
- #4listener: charter seen
- #5listener: blueprint seen
- #6doer: the planner
- #7listener: assess · charter
- #8listener: assess · result
- #9doer: the evaluator
- #10the charter wanted
- #11the blueprint
- end of the log
The engine What before after pointer — the next record to take #3 #4 The engine's pointer moves past #3, and the machine reacts to it.
Where it happens
takeNextTuple()Vol. 02 §4.1The engine's step: take the record under its pointer and move the pointer on — or stop, if the pointer has reached the end.
- Specification
- Vol. 02 §4.1
- Code
takeNextTuple()incore/registers/take-next-tuple.ts, line 15: at the end of the log, the engine stops- Journal
- #3 ·
ENGINE.CURSOR · propagate· offset: 3 · by engine - Picture
- pointer — the next record to take: #3 → #4
core/registers/take-next-tuple.ts· build 043cc8b// ENGINE.CURSOR advance (Vol. 02 §4.1) — the machine's instruction pointer:// returns the tuple at the cursor and moves it forward exactly once, or null// at quiescence. Advancing IS the context switch: the ambient wave context// moves to the propagated tuple in the same movement, so every transition// journalled during its propagation is attributed to it — the cube's spine.// The cursor never rewinds.import type { WaveTuple } from "../wave/gate";import type { RegisterFile } from "./register-file";import { recordTransition } from "./record-transition";import { setDriver, setWaveContext } from "./set-wave-context";export function takeNextTuple(file: RegisterFile): WaveTuple | null {const engine = file.registers.engine;if (engine.cursor >= engine.base + engine.window.length) return null;↑ at the end of the log, the engine stopsconst tuple = engine.window[engine.cursor - engine.base];engine.cursor += 1;↑ the engine's pointer moves on by onesetWaveContext(file, { offset: tuple.offset, phase: "propagate" });setDriver(file, "engine");recordTransition(file, "engine", "ENGINE.CURSOR", "propagate", { offset: tuple.offset });↑ the change is written into the journalreturn tuple;}
AGPL-3.0-onlyThe Lab's demonstration environment, as this fragment ran it (build 043cc8b). The code may change, and may differ from the code of a working machine.
Nest VM core, incubated in the CoAgnes garden · build 043cc8b (2026-09-21) · this file last changed in 6730f58 (2026-09-13)
27The charter's author is added to the figureBIND.DEFS · register-descriptor
a wave is settlingengine: working on #3membrane: waiting at #2
The log - #0a listener
- #1a doer
- #2listener: the charter
- #3doer: the author
- #4listener: charter seen
- #5listener: blueprint seen
- #6doer: the planner
- #7listener: assess · charter
- #8listener: assess · result
- #9doer: the evaluator
- #10the charter wanted
- #11the blueprint
- end of the log
The figure What before after doer admit.note.gate--l1.seeking.charter.author— acts on admit.note.gate--l1.seeking.charter.gate; asks the world →charter.proposedwhen admit.note.gate--l1.seeking.charter.gateis ready, it wakes— admit.note.gate--l1.seeking.charter.authorThe machine writes the doer …
charter.authorinto its list of doers: it waits for the charter gate. It has no local action — when it acts, it will ask the world to write the charter.Where it happens
registerDescriptorDefinition()Vol. 02 §4.2Stores a doer's description under its name, and lists it under every listener it waits for.
- Specification
- Vol. 02 §4.2
- Code
registerDescriptorDefinition()incore/registers/register-descriptor-definition.ts, line 19: the description is stored under its name- Journal
- #3 ·
BIND.DEFS · register-descriptor· id: admit.note.gate--l1.seeking.charter.author, interests: ["admit.note.gate--l1.seeking.charter.gate"] · by region:root - Picture
- doer
admit.note.gate--l1.seeking.charter.author: — → acts onadmit.note.gate--l1.seeking.charter.gate; asks the world →charter.proposed
core/registers/register-descriptor-definition.ts· build 043cc8b// BIND.DEFS and DISPATCH write (Vol. 02 §4.2): the registration payload// lands as data; the dispatch table indexes the descriptor id under every// declared interest (the activation knot plus every demand for an operator// bind, the one subscription for an emit descriptor). Duplicate-id rejection// is the station's verdict (ADR-011 finding 3) — this op only records an// accepted registration.import type { DescriptorDefinedPayload } from "../topology/gate";import type { TopologyRegisters } from "./topology-registers";import type { RegisterFile } from "./register-file";import { recordTransition } from "./record-transition";export function registerDescriptorDefinition(file: RegisterFile,region: TopologyRegisters,payload: DescriptorDefinedPayload,interests: readonly string[]): void {region.bindDefs.set(payload.id, payload);↑ the description is stored under its namefor (const interest of interests) {const list = region.dispatch.get(interest);if (list) list.push(payload.id);else region.dispatch.set(interest, [payload.id]);↑ listed under the listener it waits for}recordTransition(file, `topology:${region.regionId}`, "BIND.DEFS", "register-descriptor", {↑ the change is written into the journalid: payload.id,interests});}
AGPL-3.0-onlyThe Lab's demonstration environment, as this fragment ran it (build 043cc8b). The code may change, and may differ from the code of a working machine.
Nest VM core, incubated in the CoAgnes garden · build 043cc8b (2026-09-21) · this file last changed in f36e70d (2026-08-18)
when the membrane passed #3
69The membrane passes #3MEMBRANE.CURSOR · sweep
a wave is settlingengine: at the endmembrane: passing #3
The log - #0a listener
- #1a doer
- #2listener: the charter
- #3doer: the author
- #4listener: charter seen
- #5listener: blueprint seen
- #6doer: the planner
- #7listener: assess · charter
- #8listener: assess · result
- #9doer: the evaluator
- #10the charter wanted
- #11the blueprint
- #12readiness
- #13readiness
- #14a request: a charter
- end of the log
The membrane What before after pointer — the next record to pass #3 #4 #3 asks nothing of the world, so the membrane's pointer simply moves on.
Where it happens
sweepNextTuple()Vol. 02 §4.6 · Vol. 07 §3The membrane's step: pass over the record under its pointer and move the pointer on — exactly once per record.
- Specification
- Vol. 02 §4.6 · Vol. 07 §3
- Code
sweepNextTuple()incore/registers/sweep-next-tuple.ts, line 16: the membrane's pointer moves on by one- Journal
- #3 ·
MEMBRANE.CURSOR · sweep· offset: 3 · by membrane - Picture
- pointer — the next record to pass: #3 → #4
core/registers/sweep-next-tuple.ts· build 043cc8b// MEMBRANE.CURSOR advance (Vol. 02 §4.6, Vol. 07 §3): the membrane's own// reading of the one log — the second reception of one publication, never a// second truth. The cursor advances exactly once per offset per machine:// the exactly-once discharge guarantee lives in this movement.import type { WaveTuple } from "../wave/gate";import type { RegisterFile } from "./register-file";import { recordTransition } from "./record-transition";import { setDriver, setWaveContext } from "./set-wave-context";export function sweepNextTuple(file: RegisterFile): WaveTuple | null {const engine = file.registers.engine;const membrane = file.registers.membrane;if (membrane.cursor >= engine.base + engine.window.length) return null;const tuple = engine.window[membrane.cursor - engine.base];membrane.cursor += 1;↑ the membrane's pointer moves on by onesetWaveContext(file, { offset: tuple.offset, phase: "sweep" });setDriver(file, "membrane");recordTransition(file, "membrane", "MEMBRANE.CURSOR", "sweep", { offset: tuple.offset });↑ the change is written into the journalreturn tuple;}
AGPL-3.0-onlyThe Lab's demonstration environment, as this fragment ran it (build 043cc8b). The code may change, and may differ from the code of a working machine.
Nest VM core, incubated in the CoAgnes garden · build 043cc8b (2026-09-21) · this file last changed in 6730f58 (2026-09-13)
Step 14: Record #3 enters the log
14 Record #3 enters the log
a wave is settlingengine: next: #2membrane: waiting at #2
- #0a listener
- #1a doer
- #2listener: the charter
- #3doer: the authornew
- end of the log
| What | before | after |
|---|---|---|
| records in the log | 3 | 4 |
| #3 | — | doer: the author · sys.descriptor.defined |
The door adds #3: a doer — the charter's author, which will ask the world to write the charter.
Where it happens · appendEmissions()
The only function that adds records to the log. Each new record gets the next free number, at the end.
- Specification
- Vol. 02 §4.1 · Vol. 03 §1
- Code
appendEmissions()incore/registers/append-emissions.ts, line 14: the new record gets the next free number- Journal
LOG · append· offset: 3, kind: sys.descriptor.defined · by engine- Picture
- records in the log: 3 → 4
core/registers/append-emissions.ts · build 043cc8b// The one LOG writer (Vol. 02 §4.1, Vol. 03 §1): emissions become tuples by// receiving the next dense absolute offset — `base + window.length` — and// nothing else ever grows the log. Each append is journalled under the// ambient context, so a batch born of a propagated tuple carries that// tuple's offset as its cause — the cube's provenance line (ADR-002).import type { WaveEmission, WaveTuple } from "../wave/gate";import type { RegisterFile } from "./register-file";import { recordTransition } from "./record-transition";export function appendEmissions(file: RegisterFile, emissions: readonly WaveEmission[]): void {const engine = file.registers.engine;for (const emission of emissions) {const tuple: WaveTuple = { ...emission, offset: engine.base + engine.window.length };↑ the new record gets the next free numberengine.window.push(tuple);↑ it is added at the end of the logrecordTransition(file, "engine", "LOG", "append", {↑ the change is written into the journaloffset: tuple.offset,kind: tuple.kind});}}
AGPL-3.0-onlyThe Lab's demonstration environment, as this fragment ran it (build 043cc8b). The code may change, and may differ from the code of a working machine.
Nest VM core, incubated in the CoAgnes garden · build 043cc8b (2026-09-21) · this file last changed in f36e70d (2026-08-18)
A doer's definition
Brings a doer into the machine: its name, the listener it acts on, what else it needs, and what it does once it may act — release a fact itself, ask the world for a fact, or ask the world for a whole Cell. The return doer is the simplest sort: it writes one fact when its listener is ready.
#3sys.descriptor.defined a person
| envelope | |
|---|---|
offset | 3Its place in the log — the only address a record has. The engine gives it when the record is added, the next free number, and it never changes. |
kind | sys.descriptor.definedWhich of the four kinds of record the machine knows. The kind decides what the payload holds. |
key | ∅No lane (∅): a definition belongs to the whole machine, not to one lane. |
| payload | |
id | admit.note.gate--l1.seeking.charter.authorThe doer's name, unique in the machine. |
| payload.operator | |
on | admit.note.gate--l1.seeking.charter.gateThe listener it acts on: when that listener is ready, the doer's lane becomes active. |
on_as | wantedThe name under which that listener's understanding enters the doer's scope. |
demands | ×0What else it needs before it may act — other listeners, and the name each one's understanding takes in its scope. It waits for all of them: a barrier. |
| payload.operator.service | |
instruction | «Author the charter of the figure to admit.»What it does, or asks the world to do, in words. |
schema | typeThe shape the world's answer must have. |
| payload.operator.service.emit | |
writes | charter.proposedThe type its result is written as. |
end · #3
In the specificationVol. 03 §1Vol. 03 §2Vol. 03 §5Vol. 04 §2.2Vol. 06 §2Vol. 06 §3Vol. 12 §3
Names it shares with other records
admit.note.gate--l1.seeking.charter.author— also on #14 a request: a charter, #15 the charter proposed
The record as the machine keeps it
{
"offset": 3,
"kind": "sys.descriptor.defined",
"key": null,
"payload": {
"id": "admit.note.gate--l1.seeking.charter.author",
"operator": {
"on": "admit.note.gate--l1.seeking.charter.gate",
"on_as": "wanted",
"demands": [],
"service": {
"instruction": "Author the charter of the figure to admit.",
"schema": {
"type": "object"
},
"emit": {
"writes": "charter.proposed"
}
}
}
}
}