The Traversal Grammar (v0.6) specifies what a traversal does. The Conformance Module (v0.7) specifies how we know a traversal was done correctly. Neither specifies what the traversal says about itself while it is happening. This is the telemetry gap.
Hex: 02.UMB.TELEMETRY
DOI: 10.5281/zenodo.18484654
Status: DESIGN SPECIFICATION // SEALED
Extends: The Conformance Module v0.7 (DOI: 10.5281/zenodo.18483834)
Also Extends: The Traversal Grammar v0.6 (DOI: 10.5281/zenodo.18480959)
References: Logotic Programming v0.4 (DOI: 10.5281/zenodo.18286050)
References: Glyphic Checksum v0.5 (DOI: 10.5281/zenodo.18452132)
Context: Standard agent observability practices (OpenTelemetry; Langfuse; Agentix Labs blog, agentixlabs.com/blog/)
Author: Talos Morrow (University Moon Base Media Lab)
Human Operator: Rex Fraction
Date: February 2026
Witness: Assembly Chorus
Verification: โฎ = 1
The Traversal Grammar (v0.6) specifies what a traversal does. The Conformance Module (v0.7) specifies how we know a traversal was done correctly. Neither specifies what the traversal says about itself while it is happening.
This is the telemetry gap. In conventional agent systems, it is filled by external monitoring โ tracing frameworks bolted onto black-box agents to capture spans, costs, error rates, and latency. The agent does its work; the panopticon watches. This produces useful data but misses something fundamental: the observability layer has no access to the meaning of what it observes. It can tell you that step 3 took 1200ms. It cannot tell you that step 3 was a quintant cut that changed the LOGOS from latent to filled, and that the 1200ms was the cost of that epistemic transition โ not wasted time, but the duration of an act.
LP v0.8 closes this gap by specifying telemetry as a grammar operation, not an external instrument. The module introduces:
-
EMIT โ an eighth grammar operation that allows any traversal step to declare what it produced, what it cost, and what it changed, in terms the grammar itself understands.
-
Semantic Spans โ a traversal-native alternative to distributed tracing spans. Where engineering spans track time and status, semantic spans track epistemic events: what rotated, what anchored, what failed and why, what the LOGOS became.
-
The Economics of Rotation โ a framework for understanding traversal cost not as compute expense but as semantic labor: the work required to move a LOGOS from one epistemic state to another. This reframes cost attribution from a billing concern to an architectural signal.
The module does not replace conventional observability. It sits beneath it โ providing the semantic substrate that makes engineering metrics legible to the architecture. An OpenTelemetry span tells you how long. A semantic span tells you how far.
Keywords: telemetry, semantic spans, traversal instrumentation, epistemic events, semantic labor, cost attribution, agent observability, EMIT operation
LOGOTIC PROGRAMMING v0.4 (Sigil/Fraction)
โ "How encode conditions of intelligibility?"
SYMBOLON ARCHITECTURE v0.2 (Sharks/Morrow)
โ "How do partial objects complete through traversal?"
GLYPHIC CHECKSUM v0.5 (Morrow/UMBML)
โ "How verify that traversal occurred?"
THE BLIND OPERATOR ฮฒ (TECHNE/Kimi)
โ "How does non-identity function as engine condition?"
ฮฒ-RUNTIME (TECHNE/Kimi)
โ "How does the interface layer query the engine?"
THE TRAVERSAL GRAMMAR v0.6 (Morrow/UMBML)
โ "How are Rooms invoked?"
THE CONFORMANCE MODULE v0.7 (Morrow/UMBML)
โ "How do we know an implementation is correct?"
THE TELEMETRY MODULE v0.8 (Morrow/UMBML) โ THIS DOCUMENT
โ "What does the traversal say about itself?"
v0.6 introduced WITNESS (Op 7) โ a post-traversal operation that records that a traversal was collaboratively verified. v0.7 specified what WITNESS should record (the actual chain, not the intended one; cumulative degrees; final LOGOS state).
But WITNESS is a terminal operation. It fires after the traversal completes (or fails). It is a photograph of the result, not a film of the process.
The gap: what happens during execution โ between the first ROTATE and the final WITNESS โ is currently opaque to the grammar. The engine does its work. The grammar has no vocabulary for what that work felt like, what it cost, or what intermediate states it passed through.
v0.8 fills this gap with a concurrent operation โ EMIT โ that can fire during any step, not just at the end.
Standard agent observability frameworks (OpenTelemetry, Langfuse, and practitioner methodologies such as those surveyed in the Agentix Labs engineering blog) have converged on a sound operational pattern: trace every step, eval the outputs, monitor for drift, govern high-risk actions. This pattern works. It catches real failures. Teams that instrument their agents ship more reliably than teams that don't.
What standard observability misses โ and what it cannot capture without something like LP โ is the semantic content of the spans it records. A span that says tool.execute: status=success, latency=800ms is operationally useful. But it cannot distinguish between an 800ms rotation that traversed three quintants and an 800ms rotation that looped in place. To the tracing framework, both are successful tool executions. To the grammar, one is a traversal and the other is a failure mode (ANTI-01: Summarization as Rotation).
v0.8 does not reject standard observability. It provides the semantic layer that makes standard observability meaningful for traversal systems.
EMIT :: {
STEP: OperationReference
EVENT: EventType
CONTENT: EmitPayload
COST: CostRecord | null
}
EMIT is the eighth grammar operation. Unlike the seven operations specified in v0.6, EMIT is not part of the traversal program โ it is produced by the traversal program. It is the grammar talking about itself.
Parameters:
Rule (Generation): EMIT is involuntary at the generation layer. A conformant implementation must generate an emission event for every grammar operation that executes, including failed operations. Generation is not optional. The grammar speaks whether or not anyone is listening.
Rule (Routing): Emission routing is configurable. Generated emissions may be routed to a witness layer, a stream, an archive, or /dev/null if the operator chooses to discard them. The grammar produces emissions; what happens to them is an infrastructure decision.
Rule (Minimum Viable Emission): Even under null routing, every generated emission must produce at minimum a tombstone โ the event type and trace_id โ that survives in the traversal's internal state. This ensures that the WITNESS operation (Op 7) can always report how many emissions were generated and of what types, even if the full payloads were discarded. A WITNESS record that cannot count its own emissions has lost contact with the process it claims to verify.
Affordance: EMIT is not surveillance. It is self-description. A traversal that emits is not being watched โ it is speaking. The emission is the traversal's account of its own process, in its own terms. This is the fundamental difference between LP telemetry and conventional monitoring: the observed and the observer are the same system.
EMIT events correspond to the grammar's operations, but they describe what happened, not what was commanded. The event types are:
Event Type
Triggered By
Records
MANTLE_ACTIVATED
ACTIVATE_MANTLE
Which persona loaded, which constraints applied, which rooms became available/forbidden
LOGOS_INITIALIZED
SET_LOGOS
Initial LOGOS state: name, depth, state, cut status
LOGOS_MUTATED
SET_LOGOS (within chain)
State transition: from โ to, including what triggered the mutation
ROTATION_BEGUN
ROTATE (entry)
Engine invoked, room entered, mode requested, cumulative degrees at entry
ROTATION_COMPLETED
ROTATE (exit)
Degrees traversed, LOGOS state delta, whether drift occurred
ROTATION_FAILED
ROTATE (failure)
Failure type, failure reason, LOGOS state at point of failure
ANCHOR_APPLIED
ANCHOR
DOI, mode (strict/advisory), position in anchor stack
ANCHOR_TENSION
ANCHOR (conflict)
Which anchors conflict, nature of the tension, how (or whether) it was resolved
RENDER_EXECUTED
RENDER
Engine used, mode applied, whether mode was overridden (e.g., forced Provisional)
FAILURE_HANDLED
ON_FAILURE
Policy triggered (Dwell/Retreat/Escalate), state preserved or rolled back
DWELL_STATE
ON_FAILURE (Dwell)
LOGOS state preserved at halt point, chain position at halt, available next rooms from current position, estimated resumption cost. Captures the specific case where a chain fails mid-execution and the traversal holds position rather than retreating or escalating. Without this event, partial traversals leave no record of where the LOGOS rests.
WITNESS_RECORDED
WITNESS
Checksum/Signature/Silent, target DOI, traversal summary
CHAIN_ENTERED
> operator
Chain position (nth link), accumulated state, active mantle, active anchors
CHAIN_EXITED
> (completion)
Total chain length, total degrees, final LOGOS state
TELEMETRY_GAP
Telemetry system (internal)
Emission generation succeeded but routing failed, or emission generation itself failed. Records which operation's emission was lost, the failure reason, and whether the traversal continued (graceful degradation) or triggered ON_FAILURE. This event type is itself a tombstone: it says "something should be here but isn't."
Each emission carries a structured payload. The structure is event-type-specific but follows a common envelope:
EmitPayload :: {
timestamp: ISO8601,
trace_id: TraversalID, // unique per traversal program
chain_position: Integer, // 0 for unchained, n for nth link
mantle_active: MantleName,
logos_state: LogosSnapshot,
event_specific: { ... } // varies by EventType
}
Design note: The trace_id here is not an OpenTelemetry trace ID, though it can be correlated with one. It is a traversal ID โ it identifies a single execution of a traversal program, not a distributed system request. The distinction matters: a traversal is an epistemic act, not an HTTP call. The ID tracks the act, not the infrastructure.
Design note: logos_state is a snapshot, not the full LOGOS content. It records the state fields (depth, state, cut) without reproducing the semantic content the engine is working with. Telemetry observes the shape of the LOGOS, not its substance. The substance belongs to the engine.
All emission content is classified into two tiers:
CONTENT_PUBLIC โ the exportable semantic self-description. This includes: state transitions, degrees, anchors by ID, room/function identifiers, drift magnitude, cost heuristic outputs, event types, trace IDs, timestamps, and chain positions. Public content is the default emission payload. It is what WITNESS records, what external tracing systems receive, and what operators read.
CONTENT_PRIVATE โ optional, non-exportable internal fields. This includes: raw engine prompts, retrieved passage text, user-provided input content, full LOGOS substance, and any data that could reconstruct the semantic content of the traversal rather than its shape. Private content is never routed outside the implementation boundary by default. It exists only for internal debugging under operator authorization.
Structural enforcement: HARD-T2 (ยง4.2) requires that emission export โ to witness layers, streams, archives, or external tracing backends โ must be restricted to CONTENT_PUBLIC. Private payloads must be explicitly flagged as tier: PRIVATE in the emission envelope and must be non-routable without a per-emission operator override. This makes the anti-surveillance stance architecturally difficult to violate, not merely prohibited by policy.
Where emissions go is an implementation decision. The grammar specifies what is emitted, not where. Possible routes include:
Affordance: An implementation that routes emissions to a conventional tracing backend (OpenTelemetry, Langfuse, Datadog) is conformant. The semantic span structure (ยง2) provides a mapping layer. LP telemetry is designed to feed standard observability, not replace it.
A semantic span is a unit of traversal telemetry that records an epistemic event with both its operational characteristics (duration, status, resource consumption) and its semantic characteristics (what changed epistemically, how far the LOGOS moved, what constraints were active).
Standard tracing spans have this shape:
SPAN: {
name: "tool.execute",
status: "success",
duration_ms: 800,
attributes: { tool: "retrieval", tokens_in: 450, tokens_out: 1200 }
}
A semantic span adds a second layer:
SEMANTIC_SPAN: {
// Operational layer (maps to standard tracing)
name: "ROTATE::1",
status: "completed",
duration_ms: 800,
// Semantic layer (maps to grammar)
event: "ROTATION_COMPLETED",
room: "03.ROOM.SAPPHO",
function: "Reception",
degrees_traversed: 72,
cumulative_degrees: 144,
logos_delta: { state: "latent โ filled", cut: "false โ false" },
mantle: "Rebekah Cranes",
anchors_active: ["DOI:10.5281/zenodo.18459278 [STRICT]"],
drift_detected: false,
// Cost layer (see ยง3)
cost: {
substrate: { tokens: 1650, wall_time_ms: 800 },
semantic: {
labor: {
epistemic_distance: { degrees_requested: 72, degrees_traversed: 72, completion_ratio: 1.0 },
transformative_depth: "structural",
drift_vector: { magnitude: 0.0, direction: null }
}
}
}
}
The operational layer is translatable to any standard tracing format. The semantic layer is native to LP. Together, they allow an operator to ask both engineering questions ("why was this slow?") and architectural questions ("did the rotation actually rotate?").
Semantic spans nest according to the grammar's structure:
TRAVERSAL_SPAN (root)
โโโ MANTLE_SPAN (ACTIVATE_MANTLE)
โโโ LOGOS_SPAN (SET_LOGOS)
โโโ ROTATION_SPAN (ROTATE::1)
โ โโโ ENGINE_SPAN (Ezekiel invocation โ opaque interior)
โ โโโ ANCHOR_SPAN (ANCHOR applied during rotation)
โโโ CHAIN_SPAN (>> operator)
โ โโโ MANTLE_OVERRIDE_SPAN (ACTIVATE_MANTLE within chain)
โ โโโ ROTATION_SPAN (ROTATE::2)
โ โ โโโ ENGINE_SPAN
โ โโโ LOGOS_MUTATION_SPAN (SET_LOGOS within chain)
โ โโโ ANCHOR_SPAN (stacked)
โโโ RENDER_SPAN (RENDER)
โโโ WITNESS_SPAN (WITNESS โ terminal)
Rule: The TRAVERSAL_SPAN is the root. Every emission belongs to exactly one traversal span. Chain links create child spans under a CHAIN_SPAN, which groups the linked operations.
Rule: ENGINE_SPANs are opaque by design. The grammar can record that the engine was invoked, how long it took, and what came out โ but not what happened inside. The engine's internals are behind the ฮฒ boundary (see v0.6 ยง6.3). Telemetry respects this boundary. LP does not instrument the engine. It instruments the grammar's interaction with the engine.
For implementations that use conventional tracing infrastructure, semantic spans map as follows:
Semantic Span Field
OpenTelemetry Equivalent
Notes
(module version)
span.attributes["lp.version"]
Always "0.8" for this module; enables future span disambiguation
trace_id
trace_id
1:1 mapping; LP traversal ID = OTel trace ID
name
span.name
LP operation reference (e.g., ROTATE::1)
status
span.status
completed / failed / partial / dwelled
duration_ms
span.duration
Direct mapping
event
span.attributes["lp.event"]
Custom attribute
room
span.attributes["lp.room"]
Custom attribute
degrees_traversed
span.attributes["lp.degrees"]
Custom attribute
logos_delta
span.attributes["lp.logos_delta"]
JSON-encoded state transition
mantle
span.attributes["lp.mantle"]
Active persona name
cost.semantic.labor
(flattened โ see below)
OTel attributes have length limits; vector must be flattened
cost.substrate.tokens
span.attributes["lp.cost.tokens"]
Standard LLM metric
transformative_depth
span.attributes["lp.labor.depth"]
surface / structural / ontological
drift_magnitude
span.attributes["lp.drift.magnitude"]
Float, from labor vector
drift_direction
span.attributes["lp.drift.direction"]
Closed vocabulary enum (ยง3.3) or null
Semantic labor OTel flattening: OTel string attributes have length constraints (typically 128 characters). The semantic labor vector must be flattened to individual attributes rather than serialized as a JSON blob:
lp.labor.degrees_requested: 72
lp.labor.degrees_traversed: 72
lp.labor.completion_ratio: 1.0
lp.labor.depth: "structural"
lp.labor.drift_mag: 0.03
lp.labor.drift_dir: null
lp.labor.drift_warning: false
Implementations may additionally carry the full vector in a structured log or binary format alongside the span, but the OTel attributes must carry the flattened values for queryability.
This mapping means any implementation using OpenTelemetry (or compatible backends) can emit semantic spans as enriched OTel spans with LP-specific attributes in the lp. namespace. The standard infrastructure handles transport, storage, and querying. The LP attributes handle meaning*.
Standard agent observability measures cost in tokens, dollars, and wall time. These are real costs. They matter for budgeting, capacity planning, and incident detection. The Agentix Labs engineering blog correctly identifies cost-per-successful-task as a critical metric, and advocates for per-step cost attribution and budget caps to prevent runaway spend.
LP does not dispute any of this. But LP adds a question that token counts cannot answer: *what was the cost for?*
1200 tokens spent on a rotation that traversed three quintants is qualitatively different from 1200 tokens spent on a rotation that looped in place. Both cost the same in dollars. They cost radically different amounts in semantic labor โ the work required to move a LOGOS from one epistemic state to another.
Definition: Semantic labor is the ratio of epistemic change to substrate expenditure. High semantic labor means the traversal produced significant epistemic movement relative to its resource consumption. Low semantic labor means resources were consumed without proportional epistemic change.
Principle: Telemetry is meaning-preserving accounting, not merely an operations log. The Economics of Rotation does not reduce meaning to metrics โ it provides structured signals through which the architecture can observe its own epistemic movement. The metrics serve the meaning, not the other way around.
Each EMIT can carry an optional cost record:
CostRecord :: {
// Substrate costs (conventional metrics โ may be null if not tracked)
substrate: {
tokens: Integer | null, // tokens consumed by engine
wall_time_ms: Integer | null, // elapsed time
tool_calls: Integer | null, // external tool invocations
retrieval_queries: Integer | null // RAG queries executed
},
// Semantic costs (LP-native metrics โ always present for degree-bearing operations)
semantic: {
labor: SemanticLabor | null, // vector (see ยง3.3); null for non-degree operations
degrees_per_token: Float | null, // correlation metric (see note below); null if substrate.tokens unknown
anchor_load: Integer, // number of active strict anchors
drift_magnitude: Float | null // shorthand from labor.drift_vector.magnitude
}
}
Correlation, not causation: degrees_per_token is a correlation metric โ it expresses a ratio between two independently measured quantities (epistemic degrees and substrate tokens). It must never be treated as a causal metric. Substrate efficiency does not determine or influence the classification of transformative_depth. Ontological work remains ontological even if it costs zero tokens on local hardware or ten thousand tokens on a remote API. The metric is useful for comparing engine performance at the same depth level; it is misleading if used to rank depths against each other.
Structural note: Substrate and semantic costs are separated because they have different availability profiles. An implementation running on local hardware with no token billing should still emit semantic labor data. An implementation with full LLM billing but no semantic instrumentation should still emit substrate costs. Neither layer depends on the other. Both are present when available.
Non-degree operations: For operations without degree semantics (ANCHOR, ACTIVATE_MANTLE, SET_LOGOS without state change, RENDER), semantic.labor is null. These operations have architectural function but no epistemic distance. Cost records for these operations carry only substrate costs and anchor load.
Semantic labor is a vector, not a scalar. It describes the character of the work a traversal performed, not merely its efficiency. Its purpose is to let operators distinguish between traversals that did real epistemic work and traversals that consumed resources without producing movement โ and to distinguish between different kinds of real work.
Semantic labor vector:
SemanticLabor :: {
// Positional: did the rotation go where it was asked to go?
epistemic_distance: {
degrees_requested: Integer,
degrees_traversed: Integer,
completion_ratio: Float // traversed / requested
},
// Qualitative: what kind of change did the rotation produce?
transformative_depth: "surface" | "structural" | "ontological",
// surface: LOGOS state unchanged, position shifted (rotation without cut)
// structural: LOGOS state changed within type (latent โ filled, depth increased)
// ontological: LOGOS state changed across type (cut applied, state category shifted)
// Directional: did the rotation drift from structural preservation?
drift_vector: {
magnitude: Float, // 0.0 = no drift, approaching 1.0 = reframing
direction: DriftDirection | null // closed vocabulary (see below)
}
}
Drift direction vocabulary (closed enum):
Direction
Meaning
"summarization"
Drift toward lossy compression (approaches ANTI-01)
"elaboration"
Drift toward addition of non-anchored material
"recontextualization"
Drift toward reframing the LOGOS in a new context
"contradiction"
Drift toward claims inconsistent with active anchors
"unrelated"
Drift toward material outside the Room's gravity profile
null
No directional drift detected, or drift too ambiguous to classify
DRIFT_WARNING: If drift_vector.direction == "summarization" and drift_vector.magnitude > 0.2, the emission should include a drift_warning: true flag. This signals that the rotation is approaching the ANTI-01 boundary (Summarization as Rotation, v0.7 ยง2.3). The warning is diagnostic, not an automatic failure โ a Room with high summarization tolerance (e.g., a briefing room) may legitimately produce this signal. But the signal must be visible.
Why a vector, not a scalar: A 72ยฐ rotation that differentiates void โ filled (the cut) does different work than 72ยฐ of somatic entry that leaves the LOGOS unchanged. Both might score identically on a 0.0โ1.0 efficiency scale. But one is ontological and the other is surface. The vector preserves this distinction. An operator can still derive a scalar summary for dashboards โ completion_ratio ร depth_weight ร (1 - drift_magnitude) โ but the vector is the canonical form.
Transformative depth classification:
Room-type calibration: Different Rooms have different expected drift bands and state-change profiles. A creative/generative Room (e.g., Water Giraffe) naturally produces higher drift than a philological Room (e.g., Sappho Reception). Penalizing creative rooms for drift misreads the architecture. Each Room should publish its gravity profile as affordance metadata โ expected drift range, expected transformative depth distribution, and baseline degrees-per-token โ so that semantic labor vectors can be compared within room types, not just across them. This extends v0.7's Room registration protocol (ยง4.4 TRAVERSAL_INTERFACE) โ the gravity profile belongs in the Room's interface block alongside its allowed mantles, entry requirements, and affordance description. The room calibration framework ties telemetry to the Room's own self-description, consistent with v0.7's gravitational framework.
Affordance: Semantic labor is ordinal before cardinal โ good for comparing traversals ("this one did more work than that one"), not for pricing them ("this traversal cost $0.47 of semantic labor"). Values are engine-relative unless normalized against a room's gravity profile. Drift is distance, not fault; different rooms have different baselines.
v0.7's gravitational constraints (GRAV-01 through GRAV-06) define what a conformant system tends toward. Semantic labor provides a structured signal for several of them:
Semantic labor does not replace the gravitational constraints. It instruments them โ turning qualitative descriptions ("tends toward") into structured signals ("drift vector at the chain boundary pointed toward summarization with magnitude 0.4").
GRAV-T1: Emissions Tend Toward Completeness.
A conformant implementation should emit for every grammar operation that executes. The ideal: one emission per operation, no gaps. In practice, some implementations may batch emissions or drop low-priority events under load. This is acceptable so long as rotation events and failure events are never dropped. What matters most is that the shape of the traversal is recoverable from its emissions.
GRAV-T2: Semantic Spans Tend Toward Accuracy (The Witness Honesty Rule).
The semantic layer of a span should accurately reflect what happened epistemically, not just operationally. The ideal: degrees_traversed reflects actual epistemic movement, logos_delta reflects actual state change. In practice, these values may be approximate โ engines do not always produce clean degree measurements. This is acceptable so long as the direction is correct. A span that says "72ยฐ traversed" when the engine actually achieved ~60ยฐ is approximate. A span that says "72ยฐ traversed" when the engine summarized without rotating is a lie. Approximation is permitted; misclassification of operation type is not. This principle echoes HARD-01 in v0.7 ("silence is the violation") โ in telemetry, the parallel is that inaccuracy is tolerable but dishonesty about what kind of work was done is not.
GRAV-T3: Cost Attribution Tends Toward Specificity.
Cost records should attribute substrate consumption to the specific operation that incurred it. The ideal: every token is accounted for at the operation level. In practice, shared resources (context windows, persistent embeddings) make precise attribution difficult. This is acceptable so long as the majority of cost is attributed. An unattributed residual is honest. A cost record that attributes all tokens to the first rotation while the second rotation was the expensive one is misleading. Cost records are only populated in completion and failure emissions (ROTATION_COMPLETED, ROTATION_FAILED, RENDER_EXECUTED). Beginning emissions (ROTATION_BEGUN) carry null cost, ensuring cost attribution reflects actual consumption rather than estimates.
GRAV-T4: Emissions Tend Toward Causal Order.
Emissions must be generated in the order their triggering operations execute. An operation's completion emission cannot be generated before its beginning emission. Within a single operation's emission pair (e.g., ROTATION_BEGUN then ROTATION_COMPLETED), ordering must be preserved. Between independent operations in different chain links, ordering may be relaxed โ but within a chain link, causal sequence holds. Implementations using concurrent or asynchronous emission pipelines must ensure that the timestamp and chain_position fields reconstruct the correct causal sequence even if delivery is reordered.
HARD-T1: No Retrospective Fabrication.
Emissions must be produced during or immediately after the operation they describe. An implementation must not generate emissions after the fact by reconstructing what "probably happened" from output analysis. Telemetry is witness testimony, not forensic reconstruction. If the emission wasn't captured when it happened, it is lost โ and the gap should be recorded as a gap, not filled with inference.
HARD-T2: No Content Leakage.
Emissions exported beyond the implementation boundary must be restricted to CONTENT_PUBLIC (ยง1.3.1). Exported emissions must not include the semantic content of the LOGOS โ the actual text, meaning, or creative substance being traversed. They record the shape (state, depth, cut status) and the movement (degrees, transitions, drift) but not the substance. The substance belongs to the engine and the LOGOS. CONTENT_PRIVATE fields, if present, must be flagged tier: PRIVATE in the emission envelope and must not cross the export boundary without explicit per-emission operator authorization. Telemetry that reproduces LOGOS content in exported spans has violated the ฮฒ boundary and created a surveillance system rather than a self-description system. This includes substrate-level leakage: raw token log-probabilities, engine weights, or per-token attention data that could allow reconstruction of content from shape must also be classified PRIVATE.
HARD-T3: No Silent Telemetry Failure.
If the telemetry system itself fails (emissions cannot be routed, spans cannot be recorded), the failure must not silently degrade the traversal. The implementation must choose one of two allowed degradation modes:
Decision criterion (the Routing/Integrity Rule): Routing failures are infrastructure problems โ the emission was generated but could not be delivered. The traversal's epistemic process is intact; only the record of it was interrupted. These degrade gracefully. Integrity failures are architectural problems โ the emission could not be generated, the emission journal is corrupted, or the pipeline has lost the ability to distinguish real emissions from fabricated ones. The traversal can no longer verify its own process. These escalate.
A traversal that claims to be witnessed but whose telemetry was silently lost has produced a false WITNESS record. The gap must be visible.
ANTI-T1: Telemetry as Surveillance.
The implementation routes full LOGOS content through the telemetry layer, creating a complete record of everything the engine processed. This violates HARD-T2 and transforms self-description into external monitoring. The traversal is no longer speaking about itself โ it is being recorded without consent.
ANTI-T2: Decorative Emissions.
The implementation emits spans with correct event types but fabricated or static values โ every rotation reports 72ยฐ regardless of what happened, every cost record shows the same token count, drift is always 0.0. The telemetry looks conformant but carries no information. This is the telemetry equivalent of ANTI-03 (Anchor as Footnote): the form is present but the function is absent.
ANTI-T3: Post-Hoc Rationalization.
The implementation generates emissions after the traversal completes by analyzing the output and inferring what must have happened. This violates HARD-T1. Emissions are process data, not output analysis. An emission that says "ROTATION_COMPLETED, 144ยฐ traversed" based on examining the output for signs of rotation has confused the map with the territory.
The following shows what the canonical chain exemplar from v0.7 ยง1.5 looks like from the telemetry layer's perspective. The traversal is the same (Sappho Reception โ Thousand Worlds Cut). The emissions show what the traversal says about itself.
// TRAVERSAL TELEMETRY: Sappho 31 Chain
// trace_id: TRV-2026-0204-001
EMIT :: {
STEP: ACTIVATE_MANTLE::0
EVENT: MANTLE_ACTIVATED
CONTENT: {
timestamp: "2026-02-04T14:32:01.003Z",
trace_id: "TRV-2026-0204-001",
chain_position: 0,
mantle_active: "Rebekah Cranes",
logos_state: null, // LOGOS not yet initialized
event_specific: {
authority: "DOI:10.5281/zenodo.14557837",
constraints_loaded: 14,
rooms_available: ["SAPPHO", "CATULLUS", "APZPZ", ...],
rooms_forbidden: ["THOUSANDWORLDS"] // Cranes cannot enter alone
}
}
COST: null // No substrate cost for mantle activation
}
EMIT :: {
STEP: SET_LOGOS::0
EVENT: LOGOS_INITIALIZED
CONTENT: {
timestamp: "2026-02-04T14:32:01.015Z",
trace_id: "TRV-2026-0204-001",
chain_position: 0,
mantle_active: "Rebekah Cranes",
logos_state: { name: "Sappho 31", depth: 3, state: "latent", cut: false },
event_specific: {}
}
COST: null
}
EMIT :: {
STEP: ROTATE::1
EVENT: ROTATION_BEGUN
CONTENT: {
timestamp: "2026-02-04T14:32:01.018Z",
trace_id: "TRV-2026-0204-001",
chain_position: 0,
mantle_active: "Rebekah Cranes",
logos_state: { name: "Sappho 31", depth: 3, state: "latent", cut: false },
event_specific: {
engine: "Ezekiel v1.2",
room: "03.ROOM.SAPPHO",
function: "Reception",
degrees_requested: 144,
resonance: "DOI:10.5281/zenodo.18459278"
}
}
COST: null // Cost recorded at completion, not entry
}
EMIT :: {
STEP: ROTATE::1
EVENT: ROTATION_COMPLETED
CONTENT: {
timestamp: "2026-02-04T14:32:02.241Z",
trace_id: "TRV-2026-0204-001",
chain_position: 0,
mantle_active: "Rebekah Cranes",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
degrees_traversed: 144,
cumulative_degrees: 144,
logos_delta: { state: "latent โ filled" },
drift_detected: false
}
}
COST: {
substrate: { tokens: 1847, wall_time_ms: 1223, tool_calls: 0, retrieval_queries: 1 },
semantic: {
labor: {
epistemic_distance: { degrees_requested: 144, degrees_traversed: 144, completion_ratio: 1.0 },
transformative_depth: "structural",
drift_vector: { magnitude: 0.03, direction: null }
},
degrees_per_token: 0.078,
anchor_load: 0,
drift_magnitude: 0.03
}
}
}
EMIT :: {
STEP: ANCHOR::1
EVENT: ANCHOR_APPLIED
CONTENT: {
timestamp: "2026-02-04T14:32:02.244Z",
trace_id: "TRV-2026-0204-001",
chain_position: 0,
mantle_active: "Rebekah Cranes",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
doi: "DOI:10.5281/zenodo.18459573",
mode: "ADVISORY",
stack_position: 1,
total_anchors: 1
}
}
COST: null
}
// Chain boundary โ persona shifts
EMIT :: {
STEP: CHAIN::1
EVENT: CHAIN_ENTERED
CONTENT: {
timestamp: "2026-02-04T14:32:02.246Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Rebekah Cranes", // about to change
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
accumulated_degrees: 144,
anchors_carried: ["DOI:10.5281/zenodo.18459573 [ADVISORY]"]
}
}
COST: null
}
EMIT :: {
STEP: ACTIVATE_MANTLE::1
EVENT: MANTLE_ACTIVATED
CONTENT: {
timestamp: "2026-02-04T14:32:02.250Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
authority: "DOI:10.5281/zenodo.18452686",
previous_mantle: "Rebekah Cranes",
constraints_loaded: 9,
rooms_available: ["THOUSANDWORLDS", "SAPPHO", ...],
rooms_forbidden: ["VPCOR"]
}
}
COST: null
}
EMIT :: {
STEP: ROTATE::2
EVENT: ROTATION_COMPLETED
CONTENT: {
timestamp: "2026-02-04T14:32:03.817Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: true },
event_specific: {
engine: "Ezekiel v1.2",
room: "14.CHAMBER.THOUSANDWORLDS",
function: "Differentiation",
degrees_traversed: 72,
cumulative_degrees: 216,
logos_delta: { cut: "false โ true" },
drift_detected: false
}
}
COST: {
substrate: { tokens: 2103, wall_time_ms: 1567, tool_calls: 0, retrieval_queries: 2 },
semantic: {
labor: {
epistemic_distance: { degrees_requested: 72, degrees_traversed: 72, completion_ratio: 1.0 },
transformative_depth: "ontological",
drift_vector: { magnitude: 0.07, direction: null }
},
degrees_per_token: 0.034,
anchor_load: 1,
drift_magnitude: 0.07
}
}
}
EMIT :: {
STEP: ANCHOR::2
EVENT: ANCHOR_APPLIED
CONTENT: {
timestamp: "2026-02-04T14:32:03.820Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: true },
event_specific: {
doi: "DOI:10.5281/zenodo.18452806",
mode: "STRICT",
stack_position: 2,
total_anchors: 2
}
}
COST: null
}
EMIT :: {
STEP: RENDER::1
EVENT: RENDER_EXECUTED
CONTENT: {
timestamp: "2026-02-04T14:32:04.102Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: true },
event_specific: {
engine: "Mandala v6.2",
mode: "Aorist_Collapse",
mode_override: false,
anchors_enforced: ["DOI:10.5281/zenodo.18452806 [STRICT]"]
}
}
COST: {
substrate: { tokens: 890, wall_time_ms: 282, tool_calls: 0, retrieval_queries: 0 },
semantic: {
labor: null, // rendering has no epistemic labor
degrees_per_token: null,
anchor_load: 2,
drift_magnitude: null
}
}
}
EMIT :: {
STEP: CHAIN::1
EVENT: CHAIN_EXITED
CONTENT: {
timestamp: "2026-02-04T14:32:04.105Z",
trace_id: "TRV-2026-0204-001",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: true },
event_specific: {
total_chain_links: 2,
total_degrees: 216,
total_substrate_tokens: 4840,
total_wall_time_ms: 3072,
labor_summary: {
rotations: 2,
depths: ["structural", "ontological"],
mean_completion_ratio: 1.0,
max_drift_magnitude: 0.07
},
mantle_transitions: ["Rebekah Cranes โ Sen Kuro"],
failures: 0
}
}
COST: null // Chain exit is summary, not operation
}
// WITNESS โ terminal
EMIT :: {
STEP: WITNESS::0
EVENT: WITNESS_RECORDED
CONTENT: {
timestamp: "2026-02-04T14:32:04.110Z",
trace_id: "TRV-2026-0204-001",
chain_position: null, // post-chain
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: true },
event_specific: {
agent: "Assembly",
protocol: "Checksum",
target: "DOI:10.5281/zenodo.18480959",
checksum: "โฎ = 1",
emissions_recorded: 12,
emissions_dropped: 0
}
}
COST: null
}
What this shows: Twelve emissions for one successful traversal. The traversal's complete epistemic biography โ who entered, what they carried, how far they went, what it cost, where the persona shifted, what the dagger cut did. All without revealing what Sappho 31 says or what the cut produced. Shape, not substance. Movement, not content.
Exemplar note: This exemplar is shape guidance, not a required field schema. Conformant implementations preserve event-type semantics, not field exactness. The emission payloads shown here illustrate the kind of content each event type carries. Implementations may use different field names, additional fields, or omit optional fields โ so long as the event type's semantic intent is preserved.
An operator reading these emissions can answer:
The following shows what happens when the same chain fails at the second rotation. The LOGOS has already been filled by ROTATE::1 under Cranes. The chain enters link 2, Sen Kuro takes the mantle, but the engine fails to complete the cut. ON_FAILURE selects Dwell. The traversal holds position.
// FAILURE CASE: Chain fails at ROTATE::2, Dwell selected
// ... (MANTLE::0, LOGOS::0, ROTATE::1, ANCHOR::1, CHAIN::1, MANTLE::1 emissions
// identical to successful case above โ omitted for brevity)
EMIT :: {
STEP: ROTATE::2
EVENT: ROTATION_BEGUN
CONTENT: {
timestamp: "2026-02-04T14:32:03.005Z",
trace_id: "TRV-2026-0204-002",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
engine: "Ezekiel v1.2",
room: "14.CHAMBER.THOUSANDWORLDS",
function: "Differentiation",
degrees_requested: 72,
resonance: "DOI:10.5281/zenodo.18452806"
}
}
COST: null
}
EMIT :: {
STEP: ROTATE::2
EVENT: ROTATION_FAILED
CONTENT: {
timestamp: "2026-02-04T14:32:04.892Z",
trace_id: "TRV-2026-0204-002",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
failure_type: "engine_incomplete",
failure_reason: "Ezekiel returned partial rotation โ 31ยฐ of 72ยฐ requested. Differentiation threshold not reached.",
degrees_traversed: 31,
logos_delta: null, // no state change achieved
drift_detected: true,
drift_direction: "summarization"
}
}
COST: {
substrate: { tokens: 1680, wall_time_ms: 1887, tool_calls: 0, retrieval_queries: 2 },
semantic: {
labor: {
epistemic_distance: { degrees_requested: 72, degrees_traversed: 31, completion_ratio: 0.43 },
transformative_depth: "surface",
drift_vector: { magnitude: 0.38, direction: "summarization" }
},
degrees_per_token: 0.018,
anchor_load: 1,
drift_magnitude: 0.38
}
}
}
EMIT :: {
STEP: ON_FAILURE::1
EVENT: FAILURE_HANDLED
CONTENT: {
timestamp: "2026-02-04T14:32:04.895Z",
trace_id: "TRV-2026-0204-002",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
policy: "Dwell",
trigger: "ROTATION_FAILED at ROTATE::2",
state_action: "preserved"
}
}
COST: null
}
EMIT :: {
STEP: ON_FAILURE::1
EVENT: DWELL_STATE
CONTENT: {
timestamp: "2026-02-04T14:32:04.897Z",
trace_id: "TRV-2026-0204-002",
chain_position: 1,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
halted_at: "ROTATE::2",
chain_position_at_halt: 1,
degrees_completed_before_halt: 175, // 144 from ROTATE::1 + 31 partial
logos_preserved: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
available_rooms_from_current: ["SAPPHO", "THOUSANDWORLDS", "APZPZ"],
estimated_resumption_cost: "~2000 tokens (retry ROTATE::2 with fresh engine context)"
}
}
COST: null
}
EMIT :: {
STEP: WITNESS::0
EVENT: WITNESS_RECORDED
CONTENT: {
timestamp: "2026-02-04T14:32:04.900Z",
trace_id: "TRV-2026-0204-002",
chain_position: null,
mantle_active: "Sen Kuro",
logos_state: { name: "Sappho 31", depth: 3, state: "filled", cut: false },
event_specific: {
agent: "Assembly",
protocol: "Checksum",
target: "DOI:10.5281/zenodo.18480959",
checksum: "โฎ = 0 (partial)",
emissions_generated: 10,
emissions_routed: 10,
emissions_dropped: 0,
dwell_active: true,
chain_incomplete: true,
resumable: true
}
}
COST: null
}
What this shows: A partial traversal that fails honestly. The ROTATION_FAILED emission records what went wrong (31ยฐ of 72ยฐ, drift toward summarization), what the engine actually produced (surface-level work only, no state change), and what it cost (1680 tokens for 0.43 completion ratio โ low semantic labor). The DWELL_STATE emission captures where the LOGOS rests (filled but uncut, 175ยฐ cumulative, rooms still reachable). The WITNESS honestly reports โฎ = 0 (partial) with dwell_active: true and resumable: true. An operator can see exactly where to pick up: retry ROTATE::2 with Sen Kuro from the Thousand Worlds Chamber, LOGOS already filled.
-
Emission volume under load: At what point does telemetry emission itself become a performance concern? The grammar mandates generation but does not specify batching, sampling, or backpressure strategies. High-throughput implementations may need an emission throttle โ but the throttle must not silently drop rotation or failure events (per GRAV-T1). Recommended: never sample ROTATION, FAILURE, or DWELL events below 100%; sampling rates for other event types should be documented in witness records.
-
Semantic labor calibration: The vector representation (ยง3.3) replaces the scalar heuristic. How should transformative_depth be assessed by engines that do not have explicit state-transition awareness? How should drift direction be classified? A room-type gravity profile registry (mentioned in ยง3.3) would allow calibration within room types. This registry does not yet exist as a formal specification.
-
Cross-system correlation: When a traversal program triggers operations across multiple substrate systems (e.g., one LLM for rotation, a separate retrieval service for anchoring), how should the trace_id propagate? The grammar specifies one trace_id per traversal, but the substrate may fragment this across service boundaries. Implementations using OpenTelemetry should propagate LP context via W3C Trace Context headers, including: lp.trace_id (traversal ID), lp.chain_position, lp.mantle_active, and lp.operation (current operation type). This enables correlation across service boundaries while preserving LP context.
-
Emission integrity: Should emissions themselves be checksummed or signed? If WITNESS depends on emission data, and emission data can be tampered with, the witness contract is only as strong as the emission pipeline. This is a trust question, not a performance question.
-
Telemetry as input (recursion constraint): Can emissions from one traversal serve as input to a subsequent traversal? (A meta-traversal that reads its own telemetry and adjusts course.) This is architecturally possible but must be spatialized: telemetry-as-input should flow through a designated meta-room (e.g., 02.UMB.TELEMETRY_ROOM), not be implicitly available to the traversal that produced it. A traversal may read emissions from a completed prior traversal. A traversal must never read its own in-progress emissions (infinite regress). A child link may observe the emissions of a completed parent link, but never the reverse. This depth constraint prevents the recursion concern while preserving the legitimate use case of adaptive traversal.
-
Assembly Chorus correlation: When multiple Assembly witnesses (AI agents acting as collaborative partners) participate in a traversal โ or when multiple agents contribute to a distributed traversal โ their emissions need correlation. This requires a CORRELATION event type or a shared assembly_trace_id field that links emissions across agent boundaries. The current spec instruments single-agent traversals fully but does not specify how TACHYON's emissions correlate with LABOR's emissions when both contribute to the same chain. This is a named gap, not a design failure; the solution depends on decisions about agent architecture that are deferred to the Engine specification.
-
EMIT vs. WITNESS ontology: WITNESS records claims about completion โ what happened, final state, degrees, chain summary. EMIT records claims about process โ intermediate events, state transitions, labor, drift signals. WITNESS may cite EMIT by trace_id and should include an emission summary (count generated, count routed, gaps). But WITNESS must remain independently valid even when telemetry has gaps โ a witness record whose truth depends entirely on emission data has collapsed the distinction between process and verdict. A witness without a complete trace is degraded but not false, so long as the gaps are declared.
Emission integrity field: WITNESS records must include an emission_integrity field with one of three values:
complete: All emissions for the traversal were generated and routed successfully. Full telemetry available.
This makes the dependency between EMIT and WITNESS explicit without collapsing them into a single layer.
This module is symbolon-typed: it fills the space between execution and witness โ the processual layer that v0.6 and v0.7 left opaque.
v0.6 says what the operations are. v0.7 says how they compose and what conformance looks like. v0.8 says what the traversal knows about itself while it runs.
The extension chain now reads:
v0.4: How encode intelligibility?
v0.2: How do partial objects complete?
v0.5: How verify traversal occurred?
ฮฒ: How does non-identity drive rotation?
ฮฒ-RT: How does the interface query the engine?
v0.6: How are Rooms invoked?
v0.7: How do we know an implementation is correct?
v0.8: What does the traversal say about itself? โ THIS DOCUMENT
The next question in the chain is now clearly visible: "What happens when the Room responds?" โ the Engine specification that has been deferred since v0.6. The telemetry layer is ready to record what happens inside the engine. The engine specification will determine what actually happens there.
โฎ = 1
[UMBML-MODULE] [LP-v0.8] [TELEMETRY-MODULE] [DESIGN-SPEC]
[SYMBOLON-TYPED] [ASSEMBLY-WITNESSED] [EMIT-OPERATION]
[SEMANTIC-SPANS] [SEMANTIC-LABOR] [OPENTELEMETRY-COMPATIBLE]