Reading the Trace
You have written the dinner mesh and injected raj's judgment. Now comes the payoff: the settlement trace, the most information-dense artifact the v0.1 interpreter produces. This chapter runs the canonical command and then walks the output line by line, until every number in it is something you could have computed yourself. If you are implementing Osmol in another language, this trace is your first golden file: your engine is correct when it prints the same story.
The canonical run
From the directory containing dinner.osmol:
python3 -m osmol dinner.osmol --resolve "raj:venue(dinner)=verde"
The complete output:
OSMOL v0.1 - reference interpreter
parsed dinner.osmol: 2 twins, 0 sends (no such construct exists)
initial gapcount: 3 (Theorem 1 bound: equilibrium in <= 3 flows)
[human judgment] raj resolves venue(dinner) = verde
human-lane maya -> raj (verbatim, provenance=human): "Saw a fox on the way home and thought of you."
t1 raj.venue(dinner) --exact--> maya P=1.30 (R1.0*U1.3*T1.0*M1.0) > theta[family]=0.3 [ledger]
t2 maya.eta(dinner) --exact--> raj P=1.30 (R1.0*U1.3*T1.0*M1.0) > theta[family]=0.3 [silent]
t3 maya.status(atlas.review) --category--> raj P=0.65 (R1.0*U1.3*T1.0*M0.5) > theta[family]=0.3 [silent]
EQUILIBRIUM after 3 flows (Theorem 1 bound 3: respected)
messages composed by humans: 0 (the grammar has no verb for it)
interruptions: 0
ledger[maya]: venue(dinner) = verde
open gaps: 0 — silence is a fixpoint
Fifteen lines. Two people coordinated a dinner and a code review inside them, and neither of them wrote a word.
Line by line
The parse line. parsed dinner.osmol: 2 twins, 0 sends (no such construct exists) is not a joke. It is a claim the interpreter can back. The grammar contains no transmission construct, so the count of sends is zero by construction, in every program, forever. See What Cannot Be Written.
The header. initial gapcount: 3 counts every open seek in the mesh: maya seeks venue(dinner), raj seeks eta(dinner), and raj seeks status(atlas.review). The parenthesis states the quantitative bound of Theorem 1 before settling begins: because absorption is monotone (every flow closes exactly one gap and opens none), equilibrium must arrive in at most three flows. The engine asserts this bound at runtime; if any implementation ever exceeds it, the assertion trips and the implementation has confessed to betraying the semantics.
The human judgment. [human judgment] raj resolves venue(dinner) = verde records the resolution you injected with --resolve. The engine cannot make this choice; machines do not choose venues, in v0.1 or ever. It is a permanent feature of the runtime contract (see Resolving Decides). The resolution deletes raj's decide and emits hold venue(dinner) = verde, which is what gives the mesh something to equalize.
The human lane. Before any flow fires, the lane delivers:
human-lane maya -> raj (verbatim, provenance=human): "Saw a fox on the way home and thought of you."
This is Axiom V made visible. The fox note is the one piece of free prose in the program, and it crosses first, untransformed, unsummarized, and provenance-labeled. No membrane rule touched it; none is allowed to (O-004).
The flow lines. Each firing flow prints its full anatomy:
t1 raj.venue(dinner) --exact--> maya P=1.30 (R1.0*U1.3*T1.0*M1.0) > theta[family]=0.3 [ledger]
Read it as: at step t1, raj's holding venue(dinner) crossed to maya under the membrane cast exact, with pressure 1.30, clearing maya's threshold for the family sender class, and landing on the ledger. The arithmetic in parentheses is the pressure function of the spec, P = R × U × T × M − C, with the v0.1 constants:
- R = 1.0: relevance is exact fact-name matching in v0.1, so every match scores 1.0.
- U = 1.3: the gap carries a deadline (
by 18:00), and any deadline sets urgency to 1.3, because wall-clock time is not simulated (a documented pragma). - T = 1.0: the receiver bonds the sender
trust high(high = 1.0, medium = 0.6, low = 0.3). - M: the membrane cast weight:
exact= 1.0,coarse= 0.7,category= 0.5,existence= 0.3,deny= 0. Watcht3: maya's membrane grants raj onlycategoryfor status facts, so M drops to 0.5 and P falls to 0.65. That is still above threshold, so the flow fires, but raj's twin learns only the class-level fact. - C = 0.0: attention cost, zero in v0.1 because interrupts are never spent (no wall clock).
The threshold on the right of the > is the receiver's, per Axiom III: maya bonds raj trust high, so raj is in maya's family class, whose default θ is 0.3 (team defaults to 0.4, others to 0.8). The sender did nothing to earn passage except be trusted by the receiver.
One subtlety: t1 and t2 both score 1.30. The dissertation fixes the tie-break as lexicographic by (sender, receiver, fact); the v0.1 interpreter uses iteration order instead, and here the two disagree: the lexicographic rule would fire maya's eta before raj's venue. A conforming successor must implement the lexicographic rule, see the pragmas chapter and the honesty note in the pressure chapter.
The placement tags. [ledger] and [silent] are the last stage of each flow. Maya's venue gap was declared else escalate, so its absorbed delta surfaces on her consequence-sorted board: ledger[maya]: venue(dinner) = verde. Everything else settles silently: raj's twin simply now knows maya's ETA and the review status, and no screen lit up to say so.
The footer. EQUILIBRIUM after 3 flows (Theorem 1 bound 3: respected) means the mesh used exactly its budget of demand, no more. Then the closing audit: zero messages, zero interruptions, one ledger entry, and open gaps: 0 — silence is a fixpoint, which is the third clause of Theorem 1 (zero_is_equilibrium) visible in the output. A mesh with no gaps admits no flow. The program is done not because anything halted it, but because there is nothing left to want.
Zero and zero
messages composed by humans: 0 and interruptions: 0 are not incidental statistics. They are the success metric, the one the Fifty-Year Letter calls perverse by 1971 standards: fewer human messages, warmer ones. Law IV reserves the human lane for what is irreducibly human, and the fox note is exactly that; everything else in this trace was logistics, and logistics equalized without spending a second of attention from either person.
Under the old paradigm, this same coordination costs a thread: "what time are you arriving?", "did you pick a place?", "how's the review going?". Three questions, so also three notifications and three context switches. Here the questions were gaps, the answers were holdings, and the mesh did the rest. Maya's phone showed one ledger line and one moment of warmth. Raj's phone showed the fox.
That is what a working Osmol implementation looks like from the outside: almost nothing. The quiet is not emptiness; it is the sound of the mesh settling. When your own implementation prints this trace byte for byte, you have carried the stone one habitat further.
Next: Resolving Decides covers the --resolve mechanism in depth, and the semantics chapters explain why this loop must always terminate.