a wave is settlingengine working on #3membrane waiting at #2

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

Read as

when it came in at the door

  1. 14Record #3 enters the logLOG · append

    a wave is settlingengine: next: #2membrane: waiting at #2

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the charterenginemembrane
    4. #3doer: the authornew
    5. end of the log
    The log
    Whatbeforeafter
    records in the log34
    #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()Vol. 02 §4.1 · Vol. 03 §1

    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() in core/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
    1. // The one LOG writer (Vol. 02 §4.1, Vol. 03 §1): emissions become tuples by
    2. // receiving the next dense absolute offset — `base + window.length` — and
    3. // nothing else ever grows the log. Each append is journalled under the
    4. // ambient context, so a batch born of a propagated tuple carries that
    5. // tuple's offset as its cause — the cube's provenance line (ADR-002).
    6. import type { WaveEmission, WaveTuple } from "../wave/gate";
    7. import type { RegisterFile } from "./register-file";
    8. import { recordTransition } from "./record-transition";
    9. export function appendEmissions(file: RegisterFile, emissions: readonly WaveEmission[]): void {
    10. const engine = file.registers.engine;
    11. for (const emission of emissions) {
    12. const tuple: WaveTuple = { ...emission, offset: engine.base + engine.window.length };↑ the new record gets the next free number
    13. engine.window.push(tuple);↑ it is added at the end of the log
    14. recordTransition(file, "engine", "LOG", "append", {↑ the change is written into the journal
    15. offset: tuple.offset,
    16. kind: tuple.kind
    17. });
    18. }
    19. }

    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

  1. 26The engine takes #3ENGINE.CURSOR · propagate

    a wave is settlingengine: working on #3membrane: waiting at #2

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the chartermembrane
    4. #3doer: the authorengine · working
    5. #4listener: charter seen
    6. #5listener: blueprint seen
    7. #6doer: the planner
    8. #7listener: assess · charter
    9. #8listener: assess · result
    10. #9doer: the evaluator
    11. #10the charter wanted
    12. #11the blueprint
    13. end of the log
    The engine
    Whatbeforeafter
    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.1

    The 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() in core/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
    1. // ENGINE.CURSOR advance (Vol. 02 §4.1) — the machine's instruction pointer:
    2. // returns the tuple at the cursor and moves it forward exactly once, or null
    3. // at quiescence. Advancing IS the context switch: the ambient wave context
    4. // moves to the propagated tuple in the same movement, so every transition
    5. // journalled during its propagation is attributed to it — the cube's spine.
    6. // The cursor never rewinds.
    7. import type { WaveTuple } from "../wave/gate";
    8. import type { RegisterFile } from "./register-file";
    9. import { recordTransition } from "./record-transition";
    10. import { setDriver, setWaveContext } from "./set-wave-context";
    11. export function takeNextTuple(file: RegisterFile): WaveTuple | null {
    12. const engine = file.registers.engine;
    13. if (engine.cursor >= engine.base + engine.window.length) return null;↑ at the end of the log, the engine stops
    14. const tuple = engine.window[engine.cursor - engine.base];
    15. engine.cursor += 1;↑ the engine's pointer moves on by one
    16. setWaveContext(file, { offset: tuple.offset, phase: "propagate" });
    17. setDriver(file, "engine");
    18. recordTransition(file, "engine", "ENGINE.CURSOR", "propagate", { offset: tuple.offset });↑ the change is written into the journal
    19. return tuple;
    20. }

    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)

  2. 27The charter's author is added to the figureBIND.DEFS · register-descriptor

    a wave is settlingengine: working on #3membrane: waiting at #2

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the chartermembrane
    4. #3doer: the authorengine · working
    5. #4listener: charter seen
    6. #5listener: blueprint seen
    7. #6doer: the planner
    8. #7listener: assess · charter
    9. #8listener: assess · result
    10. #9doer: the evaluator
    11. #10the charter wanted
    12. #11the blueprint
    13. end of the log
    The figure
    Whatbeforeafter
    doer admit.note.gate--l1.seeking.charter.author—acts on admit.note.gate--l1.seeking.charter.gate; asks the world → charter.proposed
    when admit.note.gate--l1.seeking.charter.gate is ready, it wakes—admit.note.gate--l1.seeking.charter.author

    The machine writes the doer …charter.author into 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.2

    Stores a doer's description under its name, and lists it under every listener it waits for.

    Specification
    Vol. 02 §4.2
    Code
    registerDescriptorDefinition() in core/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 on admit.note.gate--l1.seeking.charter.gate; asks the world → charter.proposed
    core/registers/register-descriptor-definition.ts · build 043cc8b
    1. // BIND.DEFS and DISPATCH write (Vol. 02 §4.2): the registration payload
    2. // lands as data; the dispatch table indexes the descriptor id under every
    3. // declared interest (the activation knot plus every demand for an operator
    4. // bind, the one subscription for an emit descriptor). Duplicate-id rejection
    5. // is the station's verdict (ADR-011 finding 3) — this op only records an
    6. // accepted registration.
    7. import type { DescriptorDefinedPayload } from "../topology/gate";
    8. import type { TopologyRegisters } from "./topology-registers";
    9. import type { RegisterFile } from "./register-file";
    10. import { recordTransition } from "./record-transition";
    11. export function registerDescriptorDefinition(
    12. file: RegisterFile,
    13. region: TopologyRegisters,
    14. payload: DescriptorDefinedPayload,
    15. interests: readonly string[]
    16. ): void {
    17. region.bindDefs.set(payload.id, payload);↑ the description is stored under its name
    18. for (const interest of interests) {
    19. const list = region.dispatch.get(interest);
    20. if (list) list.push(payload.id);
    21. else region.dispatch.set(interest, [payload.id]);↑ listed under the listener it waits for
    22. }
    23. recordTransition(file, `topology:${region.regionId}`, "BIND.DEFS", "register-descriptor", {↑ the change is written into the journal
    24. id: payload.id,
    25. interests
    26. });
    27. }

    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

  1. 69The membrane passes #3MEMBRANE.CURSOR · sweep

    a wave is settlingengine: at the endmembrane: passing #3

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the charter
    4. #3doer: the authormembrane · passing
    5. #4listener: charter seen
    6. #5listener: blueprint seen
    7. #6doer: the planner
    8. #7listener: assess · charter
    9. #8listener: assess · result
    10. #9doer: the evaluator
    11. #10the charter wanted
    12. #11the blueprint
    13. #12readiness
    14. #13readiness
    15. #14a request: a charter
    16. end of the logengine
    The membrane
    Whatbeforeafter
    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 §3

    The 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() in core/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
    1. // MEMBRANE.CURSOR advance (Vol. 02 §4.6, Vol. 07 §3): the membrane's own
    2. // reading of the one log — the second reception of one publication, never a
    3. // second truth. The cursor advances exactly once per offset per machine:
    4. // the exactly-once discharge guarantee lives in this movement.
    5. import type { WaveTuple } from "../wave/gate";
    6. import type { RegisterFile } from "./register-file";
    7. import { recordTransition } from "./record-transition";
    8. import { setDriver, setWaveContext } from "./set-wave-context";
    9. export function sweepNextTuple(file: RegisterFile): WaveTuple | null {
    10. const engine = file.registers.engine;
    11. const membrane = file.registers.membrane;
    12. if (membrane.cursor >= engine.base + engine.window.length) return null;
    13. const tuple = engine.window[membrane.cursor - engine.base];
    14. membrane.cursor += 1;↑ the membrane's pointer moves on by one
    15. setWaveContext(file, { offset: tuple.offset, phase: "sweep" });
    16. setDriver(file, "membrane");
    17. recordTransition(file, "membrane", "MEMBRANE.CURSOR", "sweep", { offset: tuple.offset });↑ the change is written into the journal
    18. return tuple;
    19. }

    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)

Choose a step in the stack — or press →.

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
offset3Its 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.
kindsys.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
idadmit.note.gate--l1.seeking.charter.authorThe doer's name, unique in the machine.
payload.operator
onadmit.note.gate--l1.seeking.charter.gateThe listener it acts on: when that listener is ready, the doer's lane becomes active.
on_aswantedThe 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.
schematypeThe shape the world's answer must have.
payload.operator.service.emit
writescharter.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

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"
    }
   }
  }
 }
}