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

Wave 2 · The opening · record #20domain.factcell.seed

#20 · the seed: the Cell opens

CellSpace closes the request, checks the package and opens cell@20 — then writes its opening, its inner listener and doer, and its context (#21–#24).

Came fromthe worldThe world answered — controller.ceremony.local — with the whole package of a Cell. step 115

Read as

when the engine took #20

  1. 116The engine takes #20ENGINE.CURSOR · propagate

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. end of the log
    The engine
    Whatbeforeafter
    pointer — the next record to take#20#21

    The engine moves on to #20 — the seed, the whole package of a Cell.

    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
    #20 · ENGINE.CURSOR · propagate · offset: 20 · by engine
    Picture
    pointer — the next record to take: #20 → #21
    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. 117The planner's request is closedREQUESTS · consume-request

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. end of the log
    CellSpace

    No register changed its value.

    CellSpace closes the planner's request: the intention that asked for a Cell is answered by the seed.

    Where it happens consumeCausalRequest()Vol. 12 §5.1

    Closes a request once its answer has come: the index entry is spent, and a second answer under the same name finds nothing to close.

    Specification
    Vol. 12 §5.1
    Code
    consumeCausalRequest() in core/registers/consume-causal-request.ts, line 10: the request is marked as answered
    Journal
    #20 · REQUESTS · consume-request · uid: admit.note.gate--l1.seeking.planner#1 · by cellspace
    Picture
    no register changed its value
    core/registers/consume-causal-request.ts · build 043cc8b
    1. // REQUESTS consumption (Vol. 12 §5.1): the first proposal or failure over a
    2. // causal request is terminal for it — a correlation spends exactly once,
    3. // even when what it bought was a rejection.
    4. import type { CausalRequest } from "../cells/gate";
    5. import type { RegisterFile } from "./register-file";
    6. import { recordTransition } from "./record-transition";
    7. export function consumeCausalRequest(file: RegisterFile, request: CausalRequest): void {
    8. request.consumed = true;↑ the request is marked as answered
    9. recordTransition(file, "cellspace", "REQUESTS", "consume-request", { uid: request.uid });↑ the change is written into the journal
    10. }

    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)

  3. 118The Cell is admitted: cell@20CELLS · open-cell

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. end of the log
    CellSpace
    Whatbeforeafter
    Cellsemptycell@20

    CellSpace checks the package — the charter's digest, the blueprint's shape, the policy — and, all of it holding, opens cell@20 under charter@15, in trial mode. Admission is all or nothing.

    Where it happens openCell()Vol. 12 §5.2 · Vol. 12 §4

    Admits a Cell: once its package has passed every check, the Cell is kept under its name, with its charter and its policy.

    Specification
    Vol. 12 §5.2 · Vol. 12 §4
    Code
    openCell() in core/registers/open-cell.ts, line 12: the Cell is kept under its name
    Journal
    #20 · CELLS · open-cell · cellRef: cell@20, charterRef: charter@15, mode: trial · by cellspace
    Picture
    Cells: empty → cell@20
    core/registers/open-cell.ts · build 043cc8b
    1. // CELLS write (Vol. 12 §5.2): an admitted Cell's registers land whole —
    2. // lifecycle at `running`, budgets at zero, its own nested topology region
    3. // materialised under the cellRef. Creation order is preserved by the map
    4. // (Vol. 12 §4 routing iterates it).
    5. import type { CellRegisters } from "./cell-registers";
    6. import type { RegisterFile } from "./register-file";
    7. import { cellsRegion } from "./cells-region";
    8. import { recordTransition } from "./record-transition";
    9. export function openCell(file: RegisterFile, cell: CellRegisters): void {
    10. cellsRegion(file).cells.set(cell.cellRef, cell);↑ the Cell is kept under its name
    11. recordTransition(file, "cellspace", "CELLS", "open-cell", {↑ the change is written into the journal
    12. cellRef: cell.cellRef,
    13. charterRef: cell.charterRef,
    14. mode: cell.policy.mode
    15. });
    16. }

    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)

  4. 119The opening enters the log as #21LOG · append

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. #21the Cell is opennew
    23. end of the log
    The log
    Whatbeforeafter
    records in the log2122
    #21—the Cell is open · cell.opened

    The public mark that the Cell is open — cell.opened, with its references, its budgets and the names of its records — is written as #21.

    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
    #20 · LOG · append · offset: 21, kind: domain.fact · by engine
    Picture
    records in the log: 21 → 22
    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)

  5. 120The inner listener enters as #22LOG · append

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. #21the Cell is open
    23. #22inner listenernew
    24. end of the log
    The log
    Whatbeforeafter
    records in the log2223
    #22—inner listener · sys.knot.defined

    The blueprint becomes a figure: the Cell's inner listener is written as #22, its name prefixed by the Cell's — cell@20::l1.seeking.gate.

    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
    #20 · LOG · append · offset: 22, kind: sys.knot.defined · by engine
    Picture
    records in the log: 22 → 23
    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)

  6. 121The inner doer enters as #23LOG · append

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. #21the Cell is open
    23. #22inner listener
    24. #23inner doernew
    25. end of the log
    The log
    Whatbeforeafter
    records in the log2324
    #23—inner doer · sys.descriptor.defined

    Then the inner doer, cell@20::l1.seeking.release, as #23. The Cell's figure is complete — exactly what the blueprint declared.

    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
    #20 · LOG · append · offset: 23, kind: sys.descriptor.defined · by engine
    Picture
    records in the log: 23 → 24
    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)

  7. 122The Cell's context enters as #24LOG · append

    a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
    22. #21the Cell is open
    23. #22inner listener
    24. #23inner doer
    25. #24the Cell's contextnew
    26. end of the log
    The log
    Whatbeforeafter
    records in the log2425
    #24—the Cell's context · cell.context

    Last, what the Cell is given at birth is written as #24 — after its records, so that they are registered before anything can reach them.

    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
    #20 · LOG · append · offset: 24, kind: domain.fact · by engine
    Picture
    records in the log: 24 → 25
    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 membrane passed #20

  1. 130The membrane passes #20MEMBRANE.CURSOR · sweep

    a wave is settlingengine: at the endmembrane: passing #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 · passing
    22. #21the Cell is open
    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#20#21

    #20 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
    #20 · MEMBRANE.CURSOR · sweep · offset: 20 · by membrane
    Picture
    pointer — the next record to pass: #20 → #21
    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 121: The inner doer enters as #23

121 The inner doer enters as #23

a wave is settlingengine: working on #20membrane: 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 seedengine · workingmembrane
  22. #21the Cell is open
  23. #22inner listener
  24. #23inner doernew
  25. end of the log
The log
Whatbeforeafter
records in the log2324
#23—inner doer · sys.descriptor.defined

Then the inner doer, cell@20::l1.seeking.release, as #23. The Cell's figure is complete — exactly what the blueprint declared.

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
#20 · LOG · append · offset: 23, kind: sys.descriptor.defined · by engine
Picture
records in the log: 23 → 24
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 fact: the seed — a Cell's package

The world's answer to the planner: everything a Cell consists of, in one package — the charter by reference and digest, the blueprint, the policy, the context it will be given, and the request it answers. Its place in the log becomes the Cell's name.

#20domain.factcell.seed the world

envelope
offset20Its 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.seedThe fact type — cell.seed.
payload.data.package
version1The package's format.
charterref · digest · valueThe charter, by reference, digest and value.
blueprintversion · topology · result · schemasThe inner figure.
policymode · isolation · raw_input · accepts ×1 · capabilities ×1 · budget · publishThe rules the Cell runs under: trial mode, subscribed isolation, no raw input, what it accepts, its capabilities, its budget, what it publishes.
contextcharter · blueprintWhat the Cell will be given at birth: its charter and its blueprint.
provenancebindId · uid · serviceRequestOffsetThe planner's intention, and the request this package answers.

end · #20

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

The record as the machine keeps it
{
 "offset": 20,
 "kind": "domain.fact",
 "key": "fragment-one-cell",
 "payload": {
  "factType": "cell.seed",
  "data": {
   "package": {
    "version": 1,
    "charter": {
     "ref": "charter@15",
     "digest": "sha256:d697d7f3224e3a44a0888949eb98ee5ecf54aa09b2fc4aba2addca763458ec1b",
     "value": {
      "title": "Seeking",
      "purpose": "What are we seeking to understand, and for whom does it matter?",
      "question": "What is a Cell, and why does the machine open one instead of answering in place?",
      "criteria": [
       {
        "id": "q1",
        "question": "What is this material about, and what exactly are we seeking to understand in it?",
        "weight": 1,
        "minimum": 0.6
       },
       {
        "id": "q2",
        "question": "Whose problem does it address, and why does it exist?",
        "weight": 1,
        "minimum": 0.6
       }
      ]
     }
    },
    "blueprint": {
     "version": 1,
     "topology": {
      "knots": [
       {
        "id": "l1.seeking.gate",
        "strategy": "deterministic",
        "config": {
         "meta": {
          "title": "Seeking",
          "gloss": "What are we seeking to understand, and for whom does it matter?",
          "fields": [
           {
            "name": "text",
            "label": "What is this material about, and what exactly are we seeking to understand in it?",
            "kind": "text"
           }
          ]
         },
         "wind": {
          "collect": [
           {
            "as": "text",
            "match_type": "context.given",
            "reduce": "latest",
            "field": "text",
            "where": [
             {
              "field": "level",
              "equals": "l1.seeking"
             }
            ]
           }
          ]
         },
         "condition": "text != null"
        }
       }
      ],
      "descriptors": [
       {
        "id": "l1.seeking.release",
        "operator": {
         "on": "l1.seeking.gate",
         "demands": [],
         "service": {
          "instruction": "Release the seat's answer as knowledge.l1.",
          "schema": {
           "type": "object"
          },
          "emit": {
           "writes": "knowledge.l1"
          },
          "action": "release@1"
         }
        }
       }
      ]
     },
     "result": {
      "local_fact_type": "knowledge.l1",
      "producer_bind": "l1.seeking.release",
      "data_field": "result"
     },
     "schemas": {}
    },
    "policy": {
     "mode": "trial",
     "isolation": "subscribed",
     "raw_input": "deny",
     "accepts": [
      {
       "match_type": "context.given"
      }
     ],
     "capabilities": [
      "inference"
     ],
     "budget": {
      "max_records": 2,
      "max_emissions": 120,
      "max_inference_calls": 12
     },
     "publish": {
      "candidate": "knowledge.l1",
      "accepted": "knowledge.l1.accepted"
     }
    },
    "context": {
     "charter": {
      "ref": "charter@15",
      "digest": "sha256:d697d7f3224e3a44a0888949eb98ee5ecf54aa09b2fc4aba2addca763458ec1b",
      "value": {
       "title": "Seeking",
       "purpose": "What are we seeking to understand, and for whom does it matter?",
       "question": "What is a Cell, and why does the machine open one instead of answering in place?",
       "criteria": [
        {
         "id": "q1",
         "question": "What is this material about, and what exactly are we seeking to understand in it?",
         "weight": 1,
         "minimum": 0.6
        },
        {
         "id": "q2",
         "question": "Whose problem does it address, and why does it exist?",
         "weight": 1,
         "minimum": 0.6
        }
       ]
      }
     },
     "blueprint": {
      "version": 1,
      "topology": {
       "knots": [
        {
         "id": "l1.seeking.gate",
         "strategy": "deterministic",
         "config": {
          "meta": {
           "title": "Seeking",
           "gloss": "What are we seeking to understand, and for whom does it matter?",
           "fields": [
            {
             "name": "text",
             "label": "What is this material about, and what exactly are we seeking to understand in it?",
             "kind": "text"
            }
           ]
          },
          "wind": {
           "collect": [
            {
             "as": "text",
             "match_type": "context.given",
             "reduce": "latest",
             "field": "text",
             "where": [
              {
               "field": "level",
               "equals": "l1.seeking"
              }
             ]
            }
           ]
          },
          "condition": "text != null"
         }
        }
       ],
       "descriptors": [
        {
         "id": "l1.seeking.release",
         "operator": {
          "on": "l1.seeking.gate",
          "demands": [],
          "service": {
           "instruction": "Release the seat's answer as knowledge.l1.",
           "schema": {
            "type": "object"
           },
           "emit": {
            "writes": "knowledge.l1"
           },
           "action": "release@1"
          }
         }
        }
       ]
      },
      "result": {
       "local_fact_type": "knowledge.l1",
       "producer_bind": "l1.seeking.release",
       "data_field": "result"
      },
      "schemas": {}
     }
    },
    "provenance": {
     "bindId": "admit.note.gate--l1.seeking.planner",
     "uid": "admit.note.gate--l1.seeking.planner#1",
     "serviceRequestOffset": 19
    }
   }
  }
 }
}