a wave is settlingengine working on #21membrane waiting at #20

Wave 2 · The opening · record #21domain.factcell.opened

#21 · the Cell is open

Nothing was told to hear cell.opened, so nothing changes. It is a mark for readers.

Came fromthe machineThe machine wrote it while the engine took #20: CellSpace admitted the Cell. step 119

Read as

when the engine took #21

  1. 123The engine takes #21ENGINE.CURSOR · propagate

    a wave is settlingengine: working on #21membrane: waiting at #20

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the charter
    4. #3doer: the author
    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. #15the charter proposed
    17. #16the charter defined
    18. #17readiness
    19. #18readiness
    20. #19a request: a Cell
    21. #20the seedmembrane
    22. #21the Cell is openengine · working
    23. #22inner listener
    24. #23inner doer
    25. #24the Cell's context
    26. end of the log
    The engine
    Whatbeforeafter
    pointer — the next record to take#21#22

    The engine moves on to #21, the Cell's opening. Nothing was told to hear cell.opened, so nothing changes: it is a mark for readers.

    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
    #21 · ENGINE.CURSOR · propagate · offset: 21 · by engine
    Picture
    pointer — the next record to take: #21 → #22
    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)

when the membrane passed #21

  1. 131The membrane passes #21MEMBRANE.CURSOR · sweep

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

    The log
    1. #0a listener
    2. #1a doer
    3. #2listener: the charter
    4. #3doer: the author
    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. #15the charter proposed
    17. #16the charter defined
    18. #17readiness
    19. #18readiness
    20. #19a request: a Cell
    21. #20the seed
    22. #21the Cell is openmembrane · passing
    23. #22inner listener
    24. #23inner doer
    25. #24the Cell's context
    26. end of the logengine
    The membrane
    Whatbeforeafter
    pointer — the next record to pass#21#22

    #21 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
    #21 · MEMBRANE.CURSOR · sweep · offset: 21 · by membrane
    Picture
    pointer — the next record to pass: #21 → #22
    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 fact: the Cell is open

CellSpace's public mark that a Cell was admitted: its name, its seed, the intention that asked for it, its charter, its mode, the names of its records, its budgets and capabilities, and a digest of the package.

#21domain.factcell.opened the machine

envelope
offset21Its 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.
kinddomain.factWhich of the four kinds of record the machine knows. The kind decides what the payload holds.
keyfragment-one-cellThis session's lane.
payload
factTypecell.openedThe fact type — cell.opened, written by CellSpace alone.
payload.data
cellRefcell@20The Cell's name: cell@ and its seed's offset.
seedOffset20Where its seed stands in the log.
plannerUidadmit.note.gate--l1.seeking.planner#1The intention that asked for it.
charterRefcharter@15Its charter.
charterDigestsha256:d697d7f3224e3a44a0888949eb98ee5ecf54aa09b2fc4aba2addca763458ec1bThe charter's digest: the Cell is bound to exactly this charter.
modetrialTrial: its result stays private until it is assessed and reviewed.
isolationsubscribedSubscribed: it hears the facts it accepts, and nothing else of root.
recordIds×2The listener and doer written for it.
budgetsmax_records · max_emissions · max_inference_callsWhat it may spend: records, effects, calls to a model.
capabilities×1What it may use.
packageDigestsha256:d9d93c212bf924f74bb3055b04351bd75e70d677b048b3e0a16257c915365c05A digest of the package it was admitted from.

end · #21

In the specificationVol. 03 §1Vol. 03 §5Vol. 12 §5.2

The record as the machine keeps it
{
 "offset": 21,
 "kind": "domain.fact",
 "key": "fragment-one-cell",
 "payload": {
  "factType": "cell.opened",
  "data": {
   "cellRef": "cell@20",
   "seedOffset": 20,
   "plannerUid": "admit.note.gate--l1.seeking.planner#1",
   "charterRef": "charter@15",
   "charterDigest": "sha256:d697d7f3224e3a44a0888949eb98ee5ecf54aa09b2fc4aba2addca763458ec1b",
   "mode": "trial",
   "isolation": "subscribed",
   "recordIds": [
    "cell@20::l1.seeking.gate",
    "cell@20::l1.seeking.release"
   ],
   "budgets": {
    "max_records": 2,
    "max_emissions": 120,
    "max_inference_calls": 12
   },
   "capabilities": [
    "inference"
   ],
   "packageDigest": "sha256:d9d93c212bf924f74bb3055b04351bd75e70d677b048b3e0a16257c915365c05"
  }
 }
}