Where the machine grows · Volume 12
Volume 12 — Extension Specification: Semantic Charters, Cells, CellSpace
PROPOSEDsnapshot of 14 July 202619 min read← Volume 11 — Extension Points and the Widening DisciplineVolume 13 — Extension Specification →
Reading aids · CoAgnes LabNot part of the specification; where they differ, the volume governs.
At a glance
- The Cell extension, PROPOSED — agreed direction, not implemented behaviour — as one inspectable line: a Semantic Charter; a planner-authored CellBlueprint wrapped into a CellPackage; a Trial Cell admitted by CellSpace and run on ordinary rails; a staged result; independent weighted assessment; human review, where only accept publishes a sealed integration. §1
- Its vocabulary — Semantic Charter, Cell, CellSpace, CellBlueprint, CellPackage, Trial Cell, template and precedent — its type shapes, whose responsibilities MUST NOT collapse into one open record, and
emit.cell: a third, mutually exclusive emit declaration and a policy trust anchor, which the model may fill but cannot widen. §2§2.1§3 - CellSpace, the
WaveProcessorowning the root Cell and every child: with nocell.seedon the log the assembly MUST produce byte-identical logs to the flat machine; ordinary tuples gain nocell_id— identity derives from committed offsets; runtime names are qualified, routing follows one deterministic order, and three isolation modes set what a Cell sees. §2§4 - The protocol family — Charter, seeding, result, assessment, review and terminals — as ordinary
domain.facttuples on the seed's wave key: canonical emissions come only from CellSpace, one request yields at most one canonical outcome, and a required partial order and a transition table fix the lifecycle. §5§5.6§5.7 - What bounds a trial: admission, a pure all-or-nothing function of seventeen checks; budgets that each action increments for its owner and every ancestor; a producer matrix fixing who may publish what; artefact tiers, in which only data interpreted by policy-controlled code is auto-trialled — and the blind spots that must not be pretended solved. §6§8§9§10§11
Where it sits
- Read after
- Volume 04 — Tuple ReferenceVolume 06 — Bind DescriptorsVolume 07 — The Membrane and Output ControllersVolume 08 — The Nest Virtual MachineVolume 09 — Authoring FormatsVolume 11 — Extension Points and the Widening Discipline
- Read next
- Volume 13 — Extension Specification
- Requirements
- 5 sentences with MUST, SHOULD or MAY — the list
- At work
- 11 of its sections seen in a real run of the machine, each linked under its heading
- Across the set
- every volume's questionsthe machine in figures
Questions this volume answers
- Is a Cell a security sandbox? §1
- Can the model that authors a blueprint widen the policy it runs under? §3
- Does every tuple on the log say which Cell it belongs to? §4
- Who assesses a Cell's result, and who computes the aggregate? §5.4
- When does a Cell's result become public? §5.5
- What happens when a package fails a single admission check? §6
- Which problems does the extension leave unsolved? §11
- What must an implementation demonstrate to claim the Cell extension? §13
This volume is the normative specification, within this set, of the Cell extension: the extension by which achieved semantic understanding may author a new algorithmic form, execute it on the existing wave rails in a bounded trial, preserve its lineage, and publish only after assessment and review. It changes no current contract by itself: PROPOSED means agreed direction, not implemented behaviour, and implementation must land together with tests and the promotion of this volume's affected sections to CURRENT. It is written to the extension checklist of Vol. 11 §7. (Lineage: the volume descends from the reference project's design proposal; it is self-contained and supersedes the need to read that document.)
§1. Outcome and boundaries
Target path, one continuous and inspectable line:
user intent → semantic charter → planner bind authors a CellBlueprint
→ controller wraps it into a CellPackage (parent-owned policy + Charter snapshot)
→ CellSpace admits it as a Trial Cell → the Cell runs on ordinary rails
→ cell.result (staged) → independent weighted assessment → human review
→ accept: sealed integration published │ revise: new sibling Cell │ archiveBoundaries fixed for the first slice: no arbitrary generated-code execution; no dynamic controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology installation; no physical per-Cell log; no automatic promotion; no replacement of the YAML authoring path; Cell isolation is semantic scoping, not a security sandbox (§10).
§2. Terminology
Seen at work Fragment 1 · CellSpace sets up its registers
- Semantic Charter — the meaning contract for a bounded piece of work: title, purpose, question, weighted criteria (with optional minima). Committed before any algorithm is authored against it; the later planner cannot rewrite its criteria.
- Cell — a bounded runtime compartment: one local topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology, local state, a Charter, an immutable starting context, ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology visibility conditions, an egress publication contract, budgets and capabilities, lifecycle and provenance. All Cells are projections over the one wave logWave logThe ordered, append-only history of committed wave tuples. The single source of truth; entries are never rewritten, only appended. aka append-log. (Vol. 03)Volume 15 — Terminology.
- CellSpace — the
WaveProcessorowning the root Cell and every child: routing, admission, materialisation, policy enforcement, lifecycle derivation. Replaces the standalone top-level topology in the assemblyAssemblyThe construction of one machine instance: engine with processors, membrane with controllers — one assembly shared by every shell of a product. (Vol. 08 §1)Volume 15 — Terminology. - CellBlueprint — untrusted model-authored content: declarative topology (same document shapes as external authoring), result contract, semantic links, schemas map, optional safe view, inert artefacts, optional revision binds.
- CellPackage — the immutable admission envelope around a blueprint: Charter snapshot + digest, parent-owned policy, selected context, authoring provenance. Assembled by the controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology from the bind's bound scopeBound scopeThe record of names — from the activation tuple and the demands — over which gates and the service are evaluated. (Vol. 06 §4)Volume 15 — Terminology and declared
emit.cell; never from model output. - Trial Cell — a Cell whose outputs are staged: private facts cannot become public integrationsIntegrationThe understanding a bind descriptor forms and publishes as a wave tuple; received by others through binding — as an activation or as a demand — so integrations compose into higher-order understanding. (Vol. 06 §1)Volume 15 — Terminology until sealing.
- Template / precedent — an immutable reusable blueprint/pipeline with applicability and proof runs (exact reuse after fresh checks) / a prior package-with-outcome retrieved as planner material (never registered directly).
§2.1 Normative type shapes
Seen at work Fragment 3 · #11 · the blueprint
Design-level shapes; names may adapt to the host language, but the responsibilities MUST NOT collapse into one open record.
type CellRef = string; // v1 value: `cell@<cell.seed offset>`
type CharterRef = string; // v1 value: `charter@<charter.proposed offset>`
type CharterCriterion = { id: string; question: string; weight: number; minimum?: number };
type SemanticCharter = { title: string; purpose: string; question: string;
criteria: readonly CharterCriterion[] };
type CellIngressRule = { match_type: string; where?: readonly CollectWhereClause[] };
type BoundScopeSelector = { scope: string; field?: string }; // one-level only
type BoundScopeProjection = BoundScopeSelector & { as: string };
type CellBudget = { max_depth: number; max_cells: number; max_revisions: number;
max_records: number; max_blueprint_bytes: number;
max_emissions: number; max_inference_calls: number };
type CellPolicy = { mode: 'trial';
isolation: 'snapshot' | 'subscribed' | 'meta';
raw_input: 'deny' | 'allow';
accepts: readonly CellIngressRule[];
capabilities: readonly string[];
budget: CellBudget;
publish: { candidate: string; accepted: string } };
type CellEmitDeclaration = CellPolicy & {
charter_from: BoundScopeSelector;
seed_from: readonly BoundScopeProjection[];
revises_from?: BoundScopeSelector };
type SemanticLink = {
source: { kind: 'purpose' } | { kind: 'question' }
| { kind: 'criterion'; criterion_id: string };
target: { kind: 'knot' | 'descriptor' | 'result_field' | 'view_element'
| 'schema' | 'artefact'; local_id?: string; path?: string };
role: 'collects' | 'tests' | 'transforms' | 'publishes' | 'presents';
rationale: string };
type GeneratedArtefact = { id: string;
kind: 'function_source' | 'controller_source' | 'query_source'
| 'migration_source' | 'prompt';
media_type: string; language?: string; content: string; entrypoint?: string;
requested_capabilities: readonly string[]; // review metadata, never grants
fixtures: readonly Record<string, unknown>[] };
type CellBlueprint = { version: 1;
topology: { knots: readonly unknown[]; descriptors: readonly unknown[] }; // Vol. 09 shapes
semantic_links: readonly SemanticLink[];
result: { local_fact_type: string; producer_bind: string; data_field: 'result';
schema_ref: string; view?: Record<string, unknown> };
schemas: Record<string, JsonSchema>; // keys are local fact types
artefacts: readonly GeneratedArtefact[];
revision?: { planner_bind: string;
reframe?: { charter_bind: string; planner_bind: string } } };
type CellPackage = { version: 1;
charter: { ref: CharterRef; digest: string; value: SemanticCharter };
blueprint: CellBlueprint;
policy: CellPolicy; // normalised declaration
context: Record<string, unknown>; // the seed_from projections
provenance: { bindId: string; uid: string; serviceRequestOffset: number } };
type AssessmentCriterion = { id: string; grade: number; rationale: string;
evidenceRefs: readonly number[] };
type AssessmentProposal = { cellRef: CellRef;
criteria: readonly AssessmentCriterion[];
risks: readonly string[]; openQuestions: readonly string[];
recommendation: 'accept' | 'revise' | 'archive' };
type WeightedAssessment = AssessmentProposal & {
charterRef: CharterRef; resultOffset: number; proposalOffset: number;
aggregate: number; // computed by CellSpace only
provenance: { bindId: string; uid: string; serviceRequestOffset: number } };CellPolicy is the declaration after its selection fields are resolved; blueprint.result.schema_ref must resolve to the entry named by the local fact type and to the same schema its producer bind uses; a Charter or policy inside model-returned blueprint JSON is an unknown field and is rejected.
§3. Authoring surface: emit.cell
Seen at work Fragment 3 · #1 · the first fragment's doer
A third, mutually exclusive service.emit variant (rail Vol. 11 §3.5). The declaration is a policy trust anchor: the model may fill content within it but cannot widen it; a nested emit.cell inside a generated blueprint is untrusted until admission proves it a subset of the current Cell's ceiling.
service:
instruction: "Author one bounded CellBlueprint …"
schema: schemas/cell-blueprint.schema.json
emit:
cell:
mode: trial
charter_from: { scope: charter, field: definition } # one-level selectors only
seed_from: # → immutable cell.context
- { as: frame, scope: frame }
- { as: charter, scope: charter, field: definition }
revises_from: { scope: revision } # optional; also in seed_from
isolation: snapshot # snapshot | subscribed | meta
raw_input: deny # deny | allow; nested may not widen deny→allow
accepts: [ { match: evidence.granted } ] # ingress rules (shared matcher)
capabilities: [inference] # closed registry; v1: inference only
budget: # closed keys; §8
max_depth: 1
max_cells: 1
max_revisions: 2
max_records: 16
max_blueprint_bytes: 131072
max_emissions: 120
max_inference_calls: 8
publish: { candidate: answer.candidate, accepted: chat.message.answer }Compiler rules (loaderLoaderThe component that splits an authoring pipeline into individual records and commits them as seeds. aka splitter. (Vol. 09 §6)Volume 15 — Terminology work item): mutual exclusivity with writes/unfold; serviceServiceThe function evaluated over the bound scope to produce the integration. Its kind (model instruction, deterministic function, other) is an assembly property. aka service function. (Vol. 06 §3, Vol. 08 §5)Volume 15 — Terminology schema required; selectors name existing scope aliases with at most one non-empty top-level field; unique non-empty as names in seed_from; closed keys and value sets throughout; max_depth/max_revisions non-negative integers, other budgets positive integers; unknown fields rejected.
ControllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology rules: resolve charter_from / seed_from / revises_from from the bound scopeBound scopeThe record of names — from the activation tuple and the demands — over which gates and the service are evaluated. (Vol. 06 §4)Volume 15 — Terminology at dischargeDischargeThe asynchronous execution of an external effect for one claimed tuple, resolving with the world's answers as emissions. (Vol. 07 §2)Volume 15 — Terminology; assemble one CellPackage with the validated result as blueprint only; a missing scope entry is service.failed, never a partial package; the controller neither compiles nor judges the package.
§4. CellSpace: placement, identity, materialisation
Seen at work Fragment 3 · #0 · the first fragment's listener
Placement. Engine([CellSpace(root: TopologyGraph), …observers]). With no cell.seed on the log, the assemblyAssemblyThe construction of one machine instance: engine with processors, membrane with controllers — one assembly shared by every shell of a product. (Vol. 08 §1)Volume 15 — Terminology MUST produce byte-identical logs to the flat machine (root compatibility — the extension's primary regression gateGateA predicate over the bound scope. Gates decide between emit and reject; the current form is min_grade over a named entry. (Vol. 06 §5)Volume 15 — Terminology).
cell@42, named by its seed's offset, whose runtime names are qualified. The child's records reach it by their home, its cell.context is targeted to its CellRef, and its private facts reach their owner only; one public fact may reach several Cells — root first — and reaches this subscribed Cell because its accepts matches. A reading aid by CoAgnes Lab; §4 governs.Identity without a universal scope field. Ordinary domain tuplesWave tupleAn immutable record in the wave log: offset, kind, key, payload. The unit of fact. aka tuple. (Vol. 03 §1)Volume 15 — Terminology gain no cell_id. Identity derives from committed offsets: CellRef = cell@<cell.seed offset>; CharterRef = charter@<charter.proposed offset> (assigned in the later charter.defined, since only an observerObserverA passive wave processor that mirrors tuples and emits nothing behavioural. (Vol. 02 §3.4)Volume 15 — Terminology of the committed proposal knows its offset). Cell depth is derived (parent depth + 1), never authored.
Materialisation. Authored local names stay semantic; runtime names are qualified: knotsActivation knotAn accumulating unit that matches wave tuples, winds them, and tests readiness; it accumulates understanding. When ready, it activates bind descriptors. Its minimal form is a single condition matcher — a degenerate configuration of the same accumulator, not a different kind. aka knot, clew (for the per-key instance see clew). (Vol. 05)Volume 15 — Terminology/binds cell@42::evidence.ready, private fact types cell@42::analysis.partial. Every private-type reference in records — match_type, writes, unfoldUnfoldThe constrained in-wave authoring form: a service result instantiates declared knot/close/head templates. (Vol. 06 §7)Volume 15 — Terminology templates, the result target — is rewritten before commitment; reserved protocols and admitted imports keep their names. TopologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology records gain optional home: {cellRef, localId} (absent on root records — byte-compatibility preserved); unfold templates inside a Cell get home added at materialisation so instantiated records commit with concrete ownership. Local ids and private types MUST NOT contain :: or start with cell@.
Fact classes at materialisation: import (allowed by accepts, name preserved) · private (qualified) · protocol (reserved namespaces; routed by contract) · result (private during trial; wrapped into cell.result) · accepted export (emitted only after sealing).
Routing order (deterministic). Key equality with the seed key is required before any predicate (predicates narrow, never widen). Then: Charter proposals/definitions (§5.1 rules) → lifecycle facts (CellSpace-handled) → topology records to their home (a Cell-owned record with missing/mismatched home is audit-only: registered nowhere, fails the Cell) → sys.knot.ready to the owner of the qualified knot → windingWindThe act of integrating a matched tuple into the knot's wound state. Deterministic winding completes locally; semantic winding unfolds through the world — the knot projects a winding intention and later winds the returned integration. (Vol. 05 §1, §5)Volume 15 — Terminology answers to the owner of knotId → serviceServiceThe function evaluated over the bound scope to produce the integration. Its kind (model instruction, deterministic function, other) is an assembly property. aka service function. (Vol. 06 §3, Vol. 08 §5)Volume 15 — Terminology answers/delegated records to the owner of bindId/uid → private qualified facts to their owner → targeted cell.context to its CellRef → remaining public facts against each open Cell's ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology predicates (one tuple may reach several Cells). Root first, then Cells in creation-offset order.
Isolation modes. snapshot (default): context + own private facts + correlated answers; no ambient future public facts. subscribed: + future public facts matching accepts. meta: + lifecycle/assessment publications on the same key; no outward capability unless declared. Visibility modes, not transactions: abort is an appended event, never rollback.
§5. Protocol family
All lifecycle records are ordinary domain.fact tuplesWave tupleAn immutable record in the wave log: offset, kind, key, payload. The unit of fact. aka tuple. (Vol. 03 §1)Volume 15 — Terminology (rail Vol. 04 §6). Key rules throughout: same wave key as the seed; canonical emissionsEmissionA wave tuple without its offset — the form in which content is handed to the engine; the engine assigns the offset at append. (Vol. 03 §1)Volume 15 — Terminology come only from CellSpace; one request → at most one canonical outcome (consumed correlations).
charter.proposed, a cell.seed with the package wrapped around the planner's blueprint, the Cell's local result, an evaluator's proposal — is checked by CellSpace, which alone emits the canonical record, or a rejection or failure. A human's cell.reviewed then chooses the terminal: only accept seals the Cell and publishes the accepted export. Unrelated tuples may appear between any two. A reading aid by CoAgnes Lab; §5 governs.§5.1 Charter: charter.proposed → charter.defined | charter.rejected
Seen at work Fragment 2 · The request is indexed under its name
A bind publishes untrusted charter.proposed via ordinary writes (its {bindId, uid, result} wrapper is the provenance). CellSpace verifies the causal same-key service.request (whose writes target is charter.proposed and which MUST declare a schema), revalidates the closed shape, then emits charter.defined {definition: {ref, digest, value}, home, parentRef, proposalOffset, provenance} — or charter.rejected with path-anchored errors. home derives from the proposing request's ownership (null for root). A local definition routes to its owner and meta subscribers, not to root or siblings. The first proposal or correlated failure consumes the request.
Reference payloads (data of the domain.fact):
// charter.proposed — the ordinary writes wrapper is the provenance
{ "bindId": "request.charter.bind", "uid": "request.charter.bind#1",
"result": { "charter": { "title": "…", "purpose": "…", "question": "…",
"criteria": [ { "id": "relevance", "question": "…",
"weight": 1, "minimum": 0.75 } ] },
"parentRef": null } }
// charter.defined — canonical, emitted by CellSpace
{ "definition": { "ref": "charter@17", "digest": "sha256:…", "value": { } },
"home": null, "parentRef": null, "proposalOffset": 17,
"provenance": { "bindId": "request.charter.bind",
"uid": "request.charter.bind#1", "serviceRequestOffset": 15 } }parentRef, when present, must resolve to an earlier Charter and denotes a refined next-level contract whose canonical definition is present in the proposing request's scope. A domain requiring human Charter approval inserts a review fact and gateGateA predicate over the bound scope. Gates decide between emit and reject; the current form is min_grade over a named entry. (Vol. 06 §5)Volume 15 — Terminology between proposal and definition; it never mutates the proposal.
§5.2 Seeding: cell.seed → cell.rejected | cell.opened + records + cell.context
Seen at work Fragment 3 · The Cell is admitted: cell@20
cell.seed carries the complete package. CellSpace does not trust the envelope: it indexes the earlier service.request at the stamped offset and verifies key, bindId, uid, schema, declaration, Charter alias, selected scope entries, and effective policy; the blueprint is re-validated at admission (§6). A seed without its causal request is rejected before any registration. On admission: cell.opened (refs, parent, Charter digest and summary, mode/isolation, materialised record ids, effective budgets/capabilities, package digest) → the materialised topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology records (each with home and planner emittedBy) → cell.context {cellRef, context} after every record, so registration precedes the first fact that may reach it. The seed offset becomes the CellRef; first valid seed or correlated failure consumes the serviceServiceThe function evaluated over the bound scope to produce the integration. Its kind (model instruction, deterministic function, other) is an assembly property. aka service function. (Vol. 06 §3, Vol. 08 §5)Volume 15 — Terminology correlation — even a malformed seed is terminal for it.
Reference payloads:
// cell.seed — the whole package, no duplicate top-level provenance fields
{ "package": { "version": 1,
"charter": { "ref": "charter@17", "digest": "sha256:…", "value": { } },
"blueprint": { }, "policy": { }, "context": { },
"provenance": { "bindId": "answer.planner", "uid": "answer.planner#1",
"serviceRequestOffset": 39 } } }
// cell.context — only the named seed_from projections, immutable
{ "cellRef": "cell@42", "context": { "frame": { }, "charter": { } } }cell.opened carries: cellRef and seed offset; parent planner uid, owning parent CellRef, optional revised CellRef; CharterRef, Charter digest and summary; mode and isolation; materialised record ids; effective budgets and capabilities; package digest. cell.rejected carries cellRef, seed offset, and path-anchored errors — and registers nothing.
§5.3 Result: cell.result
Seen at work Fragment 3 · CellSpace records the Cell's result
The declared result producer MUST be a local operator bindOperator bindThe full bind form: activation + demands + gates + a service crossing the membrane. (Vol. 06 §3)Volume 15 — Terminology whose writes target is the candidate type (deterministic emit output lacks publication provenance and is not accepted in v1). CellSpace observes the qualified private result fact, verifies bindId/uid, extracts data.result, validates it against the embedded schema, then emits cell.result — review material, not yet public:
{ "cellRef": "cell@42", "result": { }, "schemaDigest": "sha256:…",
"evidenceRefs": [], "localResultOffset": 73,
"producedBy": { "bindId": "cell@42::answer.fold", "uid": "cell@42::answer.fold#1" } }§5.4 Assessment: cell.assessment.proposed → cell.assessed | cell.assessment.rejected
Seen at work Fragment 3 · CellSpace records the assessment
An evaluator bind outside the trial (its intention distinct from planner and producer) binds the canonical Charter and cell.result, and writes a proposal: per-criterion grades with rationale and evidence refs, risks, open questions, recommendation. CellSpace verifies the causal request, requires every Charter criterion exactly once, validates grades/evidence, and computes the aggregate itself — sum(grade·weight)/sum(weight), weights from the Charter only (grades and minima finite in [0,1]; weights non-negative, positive sum). Only then cell.assessed. A model-supplied aggregate is ignored data. Four verdicts never collapse: admission ≠ runtime success ≠ assessment ≠ human usefulness.
§5.5 Review and terminals
Seen at work Fragment 3 · #27 · the return is declared
cell.reviewed {cellRef, decision: accept|revise|archive, assessmentOffset, aspects[], actor} — committed from human ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology (actor stamped server-side; never self-declared by browser or model). Aspects have the closed shape {kind: clarify|correct|preserve|override|risk|reframe, note, criterion_id?, semantic_target?}; revise requires ≥ 1 aspect; accepting below a criterion minimum requires an override aspect; accept requires the canonical assessment of the current result.
Terminals: accept → cell.sealed + the accepted export — always the system-owned envelope, whatever the declared fact type:
{ "factType": "chat.message.answer",
"data": { "cellRef": "cell@42", "charterRef": "charter@17",
"assessmentOffset": 88, "reviewOffset": 91, "result": { } } }(result still validates against the blueprint result schema; the surrounding fields are never model-authored; the envelope is used only for a Cell's accepted export, not stamped on ordinary facts.) Provable violation → cell.failed with closed reason (budget_exceeded, capability_violation, invalid_generated_fact, invalid_result, runtime_invariant); expected *.failed facts do NOT auto-fail a Cell. revise → owner-targeted cell.revision.requested (self-contained: Charter, prior context, aspects, prior result/assessment/failure); the declared revision planner authors a replacement whose revises_from names that fact; the replacement derives the old Cell's parent and depth; the old Cell archives only after the replacement opens. archive → cell.archived, no public integrationIntegrationThe understanding a bind descriptor forms and publishes as a wave tuple; received by others through binding — as an activation or as a demand — so integrations compose into higher-order understanding. (Vol. 06 §1)Volume 15 — Terminology. Reviews are idempotent; conflicting/premature reviews emit cell.review.rejected; only the first valid terminal path publishes.
§5.6 Required partial order (happens-before, never adjacency)
charter service.request < charter.proposed < charter.defined
< planner service.request < cell.seed < cell.opened
< every local topology record < cell.context
< valid local result < cell.result
< evaluator service.request < cell.assessment.proposed < cell.assessed
< cell.reviewed < cell.sealed | cell.revision.requested | cell.archived
< accepted public export (accept only)Unrelated committed tuplesWave tupleAn immutable record in the wave log: offset, kind, key, payload. The unit of fact. aka tuple. (Vol. 03 §1)Volume 15 — Terminology may appear between any two nodes.
§5.7 Transition table and idempotency
| Current state | Committed input | Required emission | Next state |
|---|---|---|---|
| absent | valid cell.seed | cell.opened, records, context | running |
| absent | invalid cell.seed | cell.rejected only | rejected |
| running | declared local result | cell.result once | awaiting_assessment |
| running | provable policy/schema/budget violation | cell.failed | failed |
| awaiting_assessment | valid assessment proposal | cell.assessed | ready_for_review |
| ready_for_review | review accept | cell.sealed, accepted export | sealed |
| ready_for_review | review revise | cell.revision.requested | revision_requested |
| awaiting_assessment | review revise | cell.revision.requested | revision_requested |
| failed | review revise | cell.revision.requested | revision_requested |
| revision_requested | replacement seed admitted | cell.archived with supersededBy | archived |
| awaiting_assessment · ready_for_review · failed · revision_requested | review archive | cell.archived | archived |
Derived, not evented: running, awaiting_world, awaiting_assessment, ready_for_review, failed, sealed, archived read from explicit lifecycle events; stalled / settled_unfinished derive from a quiescentQuiescentThe engine cursor has consumed the whole log and produced nothing further. (Vol. 03 §7)Volume 15 — Terminology log with an open result path (no cell.stalled fact until a reliable quiescence hook exists, Vol. 11 §6.2). Only the first valid terminal path may publish; repeating an identical review is a no-op; a conflicting or premature review (before cell.result; accept before canonical assessment; accept from a failed Cell) emits cell.review.rejected with the current state. The owning parent CellRef derives from the service-request ownership index, never parsed from a model-supplied id string.
§6. Admission (admitCellPackage)
A pure function: package + seed + matched causal request + matched Charter + parent policy + immutable id indexes → fully materialised plan or structured errors. No record is emitted until every check passes (all-or-nothing; rejection registers nothing). The seventeen checks, in order: (1) outer closed shape + canonical byte ceiling; (2) Charter authority (earlier same-key definition; value + digest match; no replacement Charter/policy in blueprint); (3) causal request (offsets, bindId/uid, emit form, schema; unconsumed; revision source rules); (4) Charter content (non-empty purpose/question, unique criteria, weight rules); (5) schema support and coverage (subset only; every writable private type covered; exact-key refs; no paths/URLs); (6) topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology compilation via the shared compiler; (7) semantic links (every criterion served; every generated element justified; no dangling targets); (8) identity (unique local ids; reserved separators); (9) imports (every unqualified collect is import or protocol; raw-input policy); (10) exports (exactly one result path; candidate/accepted types per policy); (11) reachabilityAttribution, reachability, terminationThe three load-bearing obligations of the decoupled model. (Vol. 01 §7)Volume 15 — Terminology (static bipartite graph fact → knot → readiness → bind → fact; conservative: unprovable = reject); (12) closure (activations/demandsDemandA named binding (as:) to an activation knot whose integrated understanding the bind descriptor gathers back. The gathering face of affinity, and the second method through which understanding enters the bind. aka tendril. (Vol. 06 §3–4)Volume 15 — Terminology resolve; revision/reframe paths verified); (13) termination (records, depth, children, unfoldUnfoldThe constrained in-wave authoring form: a service result instantiates declared knot/close/head templates. (Vol. 06 §7)Volume 15 — Terminology worst-case from schema maxItems, emissionsEmissionA wave tuple without its offset — the form in which content is handed to the engine; the engine assigns the offset at append. (Vol. 03 §1)Volume 15 — Terminology, calls — within parent ceiling and remaining ancestor budgets); (14) capabilities (subset of parent; v1 inference only; artefact requested_capabilities are review metadata, never grants); (15) protocol authority (no generated writes to lifecycle/review/accepted types); (16) view safety (fields of the result schema only; no script/URL/ expressions); (17) attribution (lineage reconstructable from uid, offsets, parent, ids, digest).
Semantic links are the meaning-to-form bridge: {source: purpose|question|criterion, target: knot|descriptor|result_field|view_element| schema|artefact, role: collects|tests|transforms|publishes|presents, rationale}. Records instantiated later by admitted unfold inherit the producing descriptor's links; runtime-generated items never invent new justification.
§7. Canonical JSON and digests
Seen at work Fragment 3 · #16 · the charter is defined
One shared canonicalJson(value) for every digest (Charter, blueprint, package, schema, artefact) and for max_blueprint_bytes: JSON values only (reject undefined, non-finite numbers, functions, cycles); array order preserved; object keys sorted recursively by code point; no insignificant whitespace; SHA-256 over UTF-8; sha256:<64 hex>. Digests prove content identity, not trust. Model-supplied digests are unknown fields.
Derived read models (pure functions of the log, rail Vol. 08 §8): digestCharters, digestCells, digestDecisions, digestArtefacts; Charter status ∈ running | waiting | review | failed | accepted | archived | stalled. stalled/settled_unfinished remain quiescenceQuiescentThe engine cursor has consumed the whole log and produced nothing further. (Vol. 03 §7)Volume 15 — Terminology digests, not in-wave facts (open hook, Vol. 11 §6.2).
§8. Budgets and the session layer
Seen at work Fragment 3 · The Cell counts an effect: 1
Accounting semantics: max_depth — greatest admitted descendant distance; max_cells — the Cell plus all descendants (replacements consume max_revisions, not subtree slots; initial attempt uncounted); max_records — owned records including later unfoldUnfoldThe constrained in-wave authoring form: a service result instantiates declared knot/close/head templates. (Vol. 06 §7)Volume 15 — Terminology; max_blueprint_bytes — canonical bytes including schemas/views/artefacts/fixtures; max_emissions — every locally returned emissionEmissionA wave tuple without its offset — the form in which content is handed to the engine; the engine assigns the offset at append. (Vol. 03 §1)Volume 15 — Terminology pre-interception (a rejected attempt still counts); max_inference_calls — every intention pre-discharge (failures count). An action increments the owner and every ancestor; child declarations must fit the parent ceiling and remaining ancestor budgets (monotone narrowing; no multiplication by fan-out). In-flight child/unfold requests reserve worst-case budget at request commitment; completion converts, failure releases. The first pre-commit action over a ceiling is withheld → one cell.failed; already-committed controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology completions over a ceiling stay as audit, unregistered, and fail the Cell. CellSpace's own lifecycle emissions consume no Cell budget (failure reporting must not recursively fail).
WaveSession (prerequisite for chat/review ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology): owns one runtime and key; serialises messages and reviews; re-settles only after the previous settleSettleThe runtime algorithm alternating propagation with membrane discharges until the machine settles. (Vol. 08 §3)Volume 15 — Terminology completes; one JSONL/SSE history; digests exposed; message endpoint accepts only declared input fields, review endpoint stamps actor server-side.
§9. Effect policy (producer matrix)
| Producer | May publish |
|---|---|
| CellSpace | canonical Charter/Cell lifecycle, review normalisation, accepted export |
| WaveSession ingress | declared user inputs; cell.reviewed |
| admitted local topology | private facts; inference.request/service.request via built-in executors |
| installed service controller | correlated completions; the request's declared emit |
| artefact/delivery controllers | their statically declared receipt protocols only |
Generated topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology may not write lifecycle/review/seal/failure/archive/accepted types (admission rejects; runtime interception remains as defence). Before returning an emissionEmissionA wave tuple without its offset — the form in which content is handed to the engine; the engine assigns the offset at append. (Vol. 03 §1)Volume 15 — Terminology a controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology could claim, CellSpace checks capabilities: an unauthorised intention never enters the log — instead cell.effect.rejected + cell.failed(capability_violation); nothing crosses the membraneMembraneThe boundary where the wave meets the world: output controllers face outward, ingress faces inward. (Vol. 07)Volume 15 — Terminology that was not first committed. The controller list stays the readonly assemblyAssemblyThe construction of one machine instance: engine with processors, membrane with controllers — one assembly shared by every shell of a product. (Vol. 08 §1)Volume 15 — Terminology array; no fact modifies it; controller activation requires human approval, review/tests, deployment installation, explicit credentials, and an auditable control-plane operation.
§10. Artefacts, storage, promotion
Risk-ordered tiers: Tier 1 (auto-trialled): declarative blueprints, JSON Schemas, safe views, prompts, criteria — data interpreted by policy-controlled code. Tier 2 (generated, never auto-executed): TS/JS, SQL, connector/ controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology source, migrations — stored, diffed, linted, fixture-tested, reviewed. Tier 3 (sandboxed execution): a separate capability host with OS-level isolation, invoked itself as a membraneMembraneThe boundary where the wave meets the world: output controllers face outward, ingress faces inward. (Vol. 07)Volume 15 — Terminology intention — explicitly not designed here. Every artefact: unique local id, ≥ 1 semantic link, digests computed by CellSpace, fixtures inert and inside the byte ceiling.
Packages are immutable by content: the trial never executes a mutable path; cell.opened records the digest; an optional static ArtefactStoreController persists by digest; sealing is proof of usefulness in context, not universal correctness; promotion (precedent: exact package; template: blueprint digest + applicability contract) is a separate explicit action; reuse always re-enters fresh admission. One accepted run suffices for a precedent; template thresholds are domain policy, not CellSpace code.
§11. Blind spots (must not be pretended solved)
Persistent replay/restart; ownership-encoding proof across every protocol (else a narrow protocol-level origin field; envelope-wide cell_id stays rejected); quiescenceQuiescentThe engine cursor has consumed the whole log and produced nothing further. (Vol. 03 §7)Volume 15 — Terminology hook; operator one-shot lifecycle; schema subset expressiveness; conservative reachabilityAttribution, reachability, terminationThe three load-bearing obligations of the decoupled model. (Vol. 01 §7)Volume 15 — Terminology limits; evaluator independence (shared model bias); complete cost budgets (tokens/money); logical-vs-security isolation; reasoning-data privacy/retention; concurrent ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology; human review load; template generalisation; generated-view renderer; log growth; control-plane UI; the cell terminology collision (resolved by the canonical table: knotActivation knotAn accumulating unit that matches wave tuples, winds them, and tests readiness; it accumulates understanding. When ready, it activates bind descriptors. Its minimal form is a single condition matcher — a degenerate configuration of the same accumulator, not a different kind. aka knot, clew (for the per-key instance see clew). (Vol. 05)Volume 15 — Terminology = accumulator; bind = gather/judge/publish; bound scopeBound scopeThe record of names — from the activation tuple and the demands — over which gates and the service are evaluated. (Vol. 06 §4)Volume 15 — Terminology = one bind's record; Cell = bounded local topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology and lifecycle; Charter = semantic obligation; MembraneMembraneThe boundary where the wave meets the world: output controllers face outward, ingress faces inward. (Vol. 07)Volume 15 — Terminology = external boundary); Charter authorship quality; deterministic publication attribution.
§12. Implementation phases and acceptance
Phase 0 maturity prerequisites (Vol. 11 §6.3) → Phase 1 flat-compatible CellSpace (identical logs) → Phase 2 static Trial slice (hand-authored blueprint fixture; child cannot see raw input, cannot pollute root, cannot replace Charter/policy, publishes only after accept) → Phase 3 planner-authored blueprint (real emit.cell; independent evaluator; revision planner; full budgets) → Phase 4 chat + Charter rail over WaveSession → Phase 5 library (digest store, precedents, promotion) → Phase 6 advanced artefacts/sandbox/ control plane. §13 is the normative regression catalogue.
§13. Regression catalogue
An E(cells) claim (Vol. 14 §1) requires demonstrable tests for each line.
Compatibility. Root-only CellSpace reproduces the golden log exactly; every flat pipeline/loaderLoaderThe component that splits an authoring pipeline into individual records and commits them as seeds. aka splitter. (Vol. 09 §6)Volume 15 — Terminology/runtime test stays green; writes and unfold emissionsEmissionA wave tuple without its offset — the form in which content is handed to the engine; the engine assigns the offset at append. (Vol. 03 §1)Volume 15 — Terminology unchanged; one assemblyAssemblyThe construction of one machine instance: engine with processors, membrane with controllers — one assembly shared by every shell of a product. (Vol. 08 §1)Volume 15 — Terminology across shells.
Admission. Reject: unknown package keys; malformed schemas/views; a missing, later, mismatched, or model-replaced Charter; a seed with no matching earlier same-key request; mismatched offset/bindId/uid/scope/schema/emit/ policy; a second seed or conflicting terminal completion per serviceServiceThe function evaluated over the bound scope to produce the integration. Its kind (model instruction, deterministic function, other) is an assembly property. aka service function. (Vol. 06 §3, Vol. 08 §5)Volume 15 — Terminology uid; missing/duplicate assessment criteria, out-of-range grades, invalid evidence offsets, self-evaluation correlation, model-supplied aggregate; dangling semantic links, unserved criteria, unjustified generated records; missing knotsActivation knotAn accumulating unit that matches wave tuples, winds them, and tests readiness; it accumulates understanding. When ready, it activates bind descriptors. Its minimal form is a single condition matcher — a degenerate configuration of the same accumulator, not a different kind. aka knot, clew (for the per-key instance see clew). (Vol. 05)Volume 15 — Terminology/demandsDemandA named binding (as:) to an activation knot whose integrated understanding the bind descriptor gathers back. The gathering face of affinity, and the second method through which understanding enters the bind. aka tendril. (Vol. 06 §3–4)Volume 15 — Terminology, unreachable results; duplicate local ids, reserved prefixes/separators; raw-input collection absent from imports; undeclared public writes; direct writes to lifecycle/review/accepted protocols; oversized canonical blueprints, malformed/duplicate artefact ids; unbounded unfoldUnfoldThe constrained in-wave authoring form: a service result instantiates declared knot/close/head templates. (Vol. 06 §7)Volume 15 — Terminology arrays, worst-case fan-out over budget; record/depth/fan-out/call budgets or capabilities above the parent ceiling. Prove rejection registers no partial topologyTopologyThe live set of registered activation knots and bind descriptors that the wave flows through. (Vol. 02 §5)Volume 15 — Terminology.
Isolation and routing. A child receives structured cell.context, never the raw message; raw_input: deny blocks direct raw selection while allowing derived structured publications; sibling Cells reuse local ids without collision; private facts do not windWindThe act of integrating a matched tuple into the knot's wound state. Deterministic winding completes locally; semantic winding unfolds through the world — the knot projects a winding intention and later winds the returned integration. (Vol. 05 §1, §5)Volume 15 — Terminology siblings or root; a local Charter reaches owner/selected-child context only; no mode routes across wave keys; one public fact may wind two subscribed Cells; correlated answers return to the owning Cell; unfold records inherit the Cell home — a missing/contradicting home is audit-only, fails the Cell, registers nowhere; Cell ordering is deterministic.
Lifecycle. Proposal offset defines CharterRef and canonical content its digest; a valid proposal yields exactly one definition, a forged one only rejection; a planner cannot bind a Charter committed after its request; seed offset defines CellRef; records precede context; result stays staged before review; assessment normalised once with the aggregate recomputed from Charter weights; accept requires the canonical assessment of the current result and emits sealed + one enveloped export; revise creates a new attempt, never mutates the old, and is rejected without a reachable revision planner/budget; a replacement derives the old parent/depth and records revisesCellRef; reframe requires its two-bind path and a new canonical Charter first; a revision-requested Cell archives only after its replacement opens; archive publishes nothing; repeated review is idempotent, conflicting review emits cell.review.rejected; settled-unfinished is never labelled success.
Capabilities. An unauthorised effect becomes cell.effect.rejected + cell.failed and is never claimed by a controllerOutput controllerA receiver of committed tuples facing outward: it claims tuples by kind/fact type and discharges them to the external world exactly once per runtime. It neither judges nor integrates — a third station beside the activation knot and the bind descriptor, standing outside the propagation cycle on its own cursor. aka effector, egress handler. (Vol. 07 §2–3)Volume 15 — Terminology; allowed inference works and is budget-counted; schema-invalid local emissions are withheld; an invalid committed controller completion stays audit-only and fails the Cell; crossing any hard budget emits one terminal failure and no over-budget emission; sibling/nested activity consumes ancestor aggregates rather than multiplying ceilings; a model-authored controller artefact cannot modify the membraneMembraneThe boundary where the wave meets the world: output controllers face outward, ingress faces inward. (Vol. 07)Volume 15 — Terminology; no generated native source is evaluated in-process.
UI. Digests are pure functions of the persisted log; SSE replay reconstructs the surface; chat shows only committed messages/statuses; generated view paths check against the result schema; Charter criteria navigate to their linked targets; the raw trace stays reachable from every result; review ingressIngressThe inward half of the membrane: the edge through which external events — the world's answers among them — are committed to the wave log as fact tuples. (Vol. 07 §6)Volume 15 — Terminology commits before lifecycle changes appear.
Reading aids · CoAgnes LabNot part of the specification; where they differ, the volume governs.
Requirements in this volume
Every sentence of the volume with MUST, SHOULD or MAY, as it stands, with the section it stands in. These key words mark its conformance requirements; the rest of its text is descriptive (Vol. 00 §4).
- MUST NOTDesign-level shapes; names may adapt to the host language, but the responsibilities MUST NOT collapse into one open record.§2.1
- MUSTWith no
cell.seedon the log, the assembly MUST produce byte-identical logs to the flat machine (root compatibility — the extension's primary regression gate).§4 - MUST NOTLocal ids and private types MUST NOT contain
::or start withcell@.§4 - MUSTCellSpace verifies the causal same-key
service.request(whose writes target ischarter.proposedand which MUST declare a schema), revalidates the closed shape, then emitscharter.defined{definition: {ref, digest, value}, home, parentRef, proposalOffset, provenance}— orcharter.rejectedwith path-anchored errors.§5.1 - MUSTThe declared result producer MUST be a local operator bind whose
writestarget is the candidate type (deterministic emit output lacks publication provenance and is not accepted in v1).§5.3