The Pressure Function

Everything the mesh does reduces to one scalar. For every linked pair where A holds a fact and B has a gap it might close, the engine computes a pressure. The maximal pressure that clears its receiver's threshold fires as a flow, the flow closes the gap, and this repeats until nothing clears anything. That final quiet we call equilibrium. On this page we look at the anatomy of the scalar.

The equation

From spec §6, verbatim:

P(A→B, k, g) = R(k, g) × U(g, t) × T(A, B) × M(A→B, k) − C(B, t)

A flow fires iff P > θ_B(A), where the threshold is the one the receiver declared for that sender class.

Four multiplicative terms and one subtraction. The shape is itself the argument: relevance, urgency, trust, and permission multiply, so any one of them at zero annihilates the flow. A denied membrane (M = 0) cannot be overcome by any amount of urgency. Attention cost subtracts, so a tired receiver raises the bar for everyone at once.

Term by term

R, semantic relevance of the holding k to the gap g. In the full protocol this is embedding similarity over a vector index (Osmosis spec §3): "weather in Berlin" should attract a holding that is labeled differently but means the same. In v0.1 the interpreter only pairs identical fact names, so R is constant 1.0.

U, urgency, a function of the gap's deadline and the holding's decay. v0.1 pragma: 1.3 if the gap declares a deadline (by ...), else 1.0. No wall clock is simulated, so urgency does not yet grow when a deadline comes closer.

T, trust: the weight of the receiver's bond toward the sender, that is B's declared confidence in A, not the reverse. v0.1 weights: high = 1.0, medium = 0.6, low = 0.3; an undeclared bond defaults to 0.6.

M, membrane passage: what A's membrane grants for this fact toward this receiver. 0 for deny, 1 for exact, fractional under coarsening. v0.1 weights: exact = 1.0, coarse(...) = 0.7, category = 0.5, existence = 0.3, deny = 0.0. Also, no matching rule at all means no flow, before pressure is even computed.

C, attention cost at B: a function of B's interruption budget, focus state, and local time (Osmosis spec §3). v0.1 pragma: 0.0 always, because there is no wall clock, so there is no "now" to be busy in.

The threshold is the receiver's property

θ_B(A) is declared in B's own attention block, per sender class, and defaults to 0.3 for family, 0.4 for team, 0.8 for others. This is Axiom III made arithmetic: thresholds, budgets, and quiet hours are properties of the receiving twin, declared in the receiving twin's source, and no construct in any other twin's source can reference, lower, or spend them; attempting it is error[O-006]. A sender can raise its own pressure only through legitimate terms (a real deadline, an earned bond, a generous membrane of its own); the bar itself belongs entirely to the receiver.

Determinism

The engineering dissertation (Chapter 1) fixes a rule that this book treats as spec-level: among fireable flows of equal pressure, order lexicographically by (sender name, receiver name, fact). Given the same declarations and the same injected human judgments, every conforming solver must therefore produce the identical flow trace on every platform. That single rule is what makes golden-file testing, differential testing between implementations, and cross-mesh audit possible, because a trace is evidence only if it is reproducible.

Honesty note, a documented conformance gap. The v0.1 Python interpreter fires the maximal-pressure flow, but among ties it keeps the first candidate found in iteration order (twin declaration order), not the lexicographic rule. In the dinner mesh below, flows t1 and t2 tie at P = 1.30; the lexicographic rule orders (maya, raj, eta(dinner)) before (raj, maya, venue(dinner)), yet the Python engine fires raj's venue first because maya's gap is scanned first. The Rust core must implement the lexicographic rule; the conformance suite will encode it; the Python engine's trace order is, on this one point, not normative.

Worked arithmetic: the dinner mesh by hand

Run the dinner mesh and the trace prints its own arithmetic:

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]

Recompute each:

t1, venue to maya. Maya seeks venue(dinner) by 18:00: a deadline, so U = 1.3. Maya bonds raj trust high, so T = 1.0. Raj's membrane grants venue(*) -> family: exact, so M = 1.0. P = 1.0 × 1.3 × 1.0 × 1.0 − 0 = 1.30. Maya's threshold for raj: raj is family-class (she bonds him high) and she declared no family threshold, so the default 0.3 applies. 1.30 > 0.3, so the flow fires. The gap carried else escalate, so placement is ledger.

t2, eta to raj. Raj seeks eta(dinner) by 19:00: U = 1.3. Raj bonds maya high: T = 1.0. Maya's membrane: eta(*) -> family: exact (raj is in her family circle by bond), M = 1.0. P = 1.30 > θ[family] = 0.3, so a flow, silent.

t3, status to raj. Raj seeks status(atlas.review) by thu: U = 1.3. T = 1.0 as before. Maya holds status(atlas.review) (auto-emitted by her owe, a v0.1 pragma), and her membrane grants status(*) -> team: category, so M = 0.5. P = 1.0 × 1.3 × 1.0 × 0.5 = 0.65 > 0.3, so a flow, silent, delivered class-level: raj's twin learns in-progress, not the details.

Three flows, and the engine stops: no holding matches a gap any longer, no pressure clears any threshold. Silence is a fixpoint, and Theorem 1 proves the stop always comes.