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

Wave 2 · The admission figure · record #4sys.knot.defined

#4 · charter seen

When the engine takes it, the machine stores the listener and gives it a trial lane. It will hear #16.

Came froma personThe person's act of opening a Cell sowed it at the door: a listener of the admission figure. step 15

Read as

when it came in at the door

  1. 15Record #4 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 author
    5. #4listener: charter seennew
    6. end of the log
    The log
    Whatbeforeafter
    records in the log45
    #4—listener: charter seen · sys.knot.defined

    The door adds #4: a listener — charter seen, which will hear the charter once it is defined.

    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: 4, kind: sys.knot.defined · by engine
    Picture
    records in the log: 4 → 5
    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 #4

  1. 28The engine takes #4ENGINE.CURSOR · propagate

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

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the chartermembrane
    4. #3doer: the author
    5. #4listener: charter seenengine · working
    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#4#5

    The engine's pointer moves past #4, 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
    #4 · ENGINE.CURSOR · propagate · offset: 4 · by engine
    Picture
    pointer — the next record to take: #4 → #5
    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. 29Charter seen is added to the figureKNOT.DEFS · register-knot

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

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the chartermembrane
    4. #3doer: the author
    5. #4listener: charter seenengine · working
    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
    listener admit.note.gate--l1.seeking.charter.seen—hears charter.defined → slot definition; ready when definition != null

    The machine writes the listener …charter.seen into its list: it will hear charter.defined — a charter with a reference, never a mere proposal — and keep it as definition.

    Where it happens registerKnotDefinition()Vol. 02 §4.2 · Vol. 04 §2.1

    Stores a listener's description under its name and gives it a bank of lanes with one trial lane.

    Specification
    Vol. 02 §4.2 · Vol. 04 §2.1
    Code
    registerKnotDefinition() in core/registers/register-knot-definition.ts, line 21: the description is stored under its name
    Journal
    #4 · KNOT.DEFS · register-knot · id: admit.note.gate--l1.seeking.charter.seen, strategy: deterministic, replaced: false · by region:root
    Picture
    listener admit.note.gate--l1.seeking.charter.seen: — → hears charter.defined → slot definition; ready when definition != null
    core/registers/register-knot-definition.ts · build 043cc8b
    1. // KNOT.DEFS write (Vol. 02 §4.2): the definition payload lands as data, and
    2. // re-registration of an id replaces the definition AND resets its clew bank
    3. // to a fresh null-key probe — accumulated clews of the old definition are
    4. // discarded (the machine's only 'edit'). The probe clew is supplied by the
    5. // resolved executor so invalid configuration has already failed at the
    6. // factory (Vol. 04 §2.1); the stale executor cache entry is dropped here so
    7. // the replacement takes effect for the next tuple.
    8. import type { KnotDefinedPayload } from "../topology/gate";
    9. import type { ClewRegisters, TopologyRegisters } from "./topology-registers";
    10. import type { RegisterFile } from "./register-file";
    11. import { recordTransition } from "./record-transition";
    12. export function registerKnotDefinition(
    13. file: RegisterFile,
    14. region: TopologyRegisters,
    15. payload: KnotDefinedPayload,
    16. probeClew: ClewRegisters
    17. ): void {
    18. const replaced = region.knotDefs.has(payload.id);
    19. region.knotDefs.set(payload.id, payload);↑ the description is stored under its name
    20. region.clews.set(payload.id, new Map([[null, probeClew]]));↑ its bank of lanes, with a trial lane
    21. file.ephemeral.knotExecutors.delete(`${region.regionId}/${payload.id}`);
    22. recordTransition(file, `topology:${region.regionId}`, "KNOT.DEFS", "register-knot", {↑ the change is written into the journal
    23. id: payload.id,
    24. strategy: payload.strategy,
    25. replaced
    26. });
    27. // The clew station is born here, with its null-key probe lane — journaled
    28. // on the station itself so fold(journal) holds it before any lane opens
    29. // (the document model's oracle, ADR-004 d10; Vol. 02 §4.5).
    30. recordTransition(file, `topology:${region.regionId}/clew:${payload.id}`, "CLEWS", "open-clew", { key: null, probe: true, replaced }, "registerKnotDefinition");↑ the change is written into the journal
    31. }

    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)

    A finding for the machine's authors, recorded and left as it is: the journal stamps CLEWS·open-clew → core/registers/ensure-clew.ts for registerKnotDefinition(), which lives in core/registers/register-knot-definition.ts (the op map's file for that register · action).

  3. 30It gets a trial laneCLEWS · open-clew

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

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the chartermembrane
    4. #3doer: the author
    5. #4listener: charter seenengine · working
    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 listener admit.note.gate--l1.seeking.charter.seen · appears
    Whatbeforeafter
    lane · trial lane (no key)—open

    Before any fact arrives, the listener gets one trial lane with no key — proof that its description works.

    Where it happens registerKnotDefinition()Vol. 02 §4.2 · Vol. 04 §2.1

    Stores a listener's description under its name and gives it a bank of lanes with one trial lane.

    Specification
    Vol. 02 §4.2 · Vol. 04 §2.1
    Code
    registerKnotDefinition() in core/registers/register-knot-definition.ts, line 21: the description is stored under its name
    Journal
    #4 · CLEWS · open-clew · key: null, probe: true, replaced: false · by region:root
    Picture
    lane · trial lane (no key): — → open
    core/registers/register-knot-definition.ts · build 043cc8b
    1. // KNOT.DEFS write (Vol. 02 §4.2): the definition payload lands as data, and
    2. // re-registration of an id replaces the definition AND resets its clew bank
    3. // to a fresh null-key probe — accumulated clews of the old definition are
    4. // discarded (the machine's only 'edit'). The probe clew is supplied by the
    5. // resolved executor so invalid configuration has already failed at the
    6. // factory (Vol. 04 §2.1); the stale executor cache entry is dropped here so
    7. // the replacement takes effect for the next tuple.
    8. import type { KnotDefinedPayload } from "../topology/gate";
    9. import type { ClewRegisters, TopologyRegisters } from "./topology-registers";
    10. import type { RegisterFile } from "./register-file";
    11. import { recordTransition } from "./record-transition";
    12. export function registerKnotDefinition(
    13. file: RegisterFile,
    14. region: TopologyRegisters,
    15. payload: KnotDefinedPayload,
    16. probeClew: ClewRegisters
    17. ): void {
    18. const replaced = region.knotDefs.has(payload.id);
    19. region.knotDefs.set(payload.id, payload);↑ the description is stored under its name
    20. region.clews.set(payload.id, new Map([[null, probeClew]]));↑ its bank of lanes, with a trial lane
    21. file.ephemeral.knotExecutors.delete(`${region.regionId}/${payload.id}`);
    22. recordTransition(file, `topology:${region.regionId}`, "KNOT.DEFS", "register-knot", {↑ the change is written into the journal
    23. id: payload.id,
    24. strategy: payload.strategy,
    25. replaced
    26. });
    27. // The clew station is born here, with its null-key probe lane — journaled
    28. // on the station itself so fold(journal) holds it before any lane opens
    29. // (the document model's oracle, ADR-004 d10; Vol. 02 §4.5).
    30. recordTransition(file, `topology:${region.regionId}/clew:${payload.id}`, "CLEWS", "open-clew", { key: null, probe: true, replaced }, "registerKnotDefinition");↑ the change is written into the journal
    31. }

    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)

    A finding for the machine's authors, recorded and left as it is: the journal stamps CLEWS·open-clew → core/registers/ensure-clew.ts for registerKnotDefinition(), which lives in core/registers/register-knot-definition.ts (the op map's file for that register · action).

when the membrane passed #4

  1. 70The membrane passes #4MEMBRANE.CURSOR · sweep

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

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the charter
    4. #3doer: the author
    5. #4listener: charter seenmembrane · passing
    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#4#5

    #4 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
    #4 · MEMBRANE.CURSOR · sweep · offset: 4 · by membrane
    Picture
    pointer — the next record to pass: #4 → #5
    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)

Step 15: Record #4 enters the log

15 Record #4 enters the log

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

The log
  1. #0a listener
  2. #1a doer
  3. #2listener: the charterenginemembrane
  4. #3doer: the author
  5. #4listener: charter seennew
  6. end of the log
The log
Whatbeforeafter
records in the log45
#4—listener: charter seen · sys.knot.defined

The door adds #4: a listener — charter seen, which will hear the charter once it is defined.

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() in core/registers/append-emissions.ts, line 14: the new record gets the next free number
Journal
LOG · append · offset: 4, kind: sys.knot.defined · by engine
Picture
records in the log: 4 → 5
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)

A listener's definition

Brings a listener into the machine: its name, how it decides it is ready, what it collects into which slot, and the condition that makes it ready. Four sorts are written here: the first fragment's listener, the admission figure's, the Cell's inner one — written by the machine when the Cell opened — and the return listener.

#4sys.knot.defined a person

envelope
offset4Its 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.knot.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.seenThe listener's name, unique in the machine. A listener inside a Cell carries the Cell's name before its own: cell@20::…
strategydeterministicHow it decides it is ready. Deterministic: by a plain condition over its slots — nothing is asked of the world.
payload.config
condition«definition != null»When it is ready — a condition over its slots, such as: the slot note holds something.
payload.config.wind.collect[0]
asdefinitionThe name of the slot the heard value goes into.
match_typecharter.definedThe type of fact it hears.
reducelatestWhich value the slot keeps. Latest: the newest replaces the one before.
fielddefinitionWhich field of the heard fact goes into the slot.

end · #4

In the specificationVol. 03 §1Vol. 03 §2Vol. 03 §5Vol. 04 §2.1Vol. 05 §3Vol. 05 §4Vol. 12 §4

Names it shares with other records

  • admit.note.gate--l1.seeking.charter.seen — also on #17 readiness
The record as the machine keeps it
{
 "offset": 4,
 "kind": "sys.knot.defined",
 "key": null,
 "payload": {
  "id": "admit.note.gate--l1.seeking.charter.seen",
  "strategy": "deterministic",
  "config": {
   "wind": {
    "collect": [
     {
      "as": "definition",
      "match_type": "charter.defined",
      "reduce": "latest",
      "field": "definition"
     }
    ]
   },
   "condition": "definition != null"
  }
 }
}