bond, Trust

Syntax

bond    = "bond" party "{" "trust" level "}" ;
level   = "low" | "medium" | "high" | number ;

From spec §4.9:

bond raj { trust high }

The grammar admits a numeric trust level; v0.1 parses the word levels only (low, medium, high). Numeric levels await a future edition.

Semantics

A bond declares this twin's trust toward a party. It is a posture, not a state: like attention, role, and stake, it parameterizes the pressure function rather than adding facts to the mesh. Specifically, it feeds T in the pressure product:

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

Trust is the term that makes the same fact, under the same membrane, flow easily between friends and hardly at all between strangers.

In v0.1: which bond, whose bond

The reference interpreter is precise about direction, and this precision matters. A bond does double duty, once on each side of a flow, and in both uses it is read from a specific twin's declarations:

On the receiving side, T is the receiver's bond toward the sender. In osmol.py's pressure(), the trust term is receiver.bonds.get(sender), defaulting to medium when no bond is declared. The weights are:

declared trustT
high1.0
medium (and undeclared)0.6
low0.3

Your trust in someone amplifies what can reach you from them. Nothing the sender declares can raise it: writing bond ceo { trust high } in your own twin says you trust the CEO; it does not make the CEO trust you.

Also on the receiving side, bonds pick the threshold class. theta_for() classifies the sender as family if the receiver bonds them trust high, and others otherwise; the flow must then clear the receiver's declared threshold for that class (defaults: family 0.3, others 0.8; a team class exists in the defaults table but v0.1's classifier only produces family or others).

On the sending side, bonds define the membrane's circles. This is the circles pragma from the interpreter header: when a sender's membrane rule addresses the audience family or team, it matches any party the sender bonds with trust high; others matches the rest (audience_match() in osmol.py). So the same declaration that opens your threshold to a person also places them inside your intimate membrane audiences.

The practical consequence, in the dinner mesh

In dinner.osmol, maya declares bond raj { trust high } and raj declares bond maya { trust high }. Because the bond is mutual, each is "family" to the other twice over:

  • When maya's eta(dinner) flows to raj, maya's membrane rule eta(*) -> family: exact matches raj (sender-side circle: maya bonds raj high), so raj gets the exact value rather than coarse(30m). On raj's side, T = 1.0 (raj bonds maya high) and the threshold class is family (0.3). The trace line shows all of it: P=1.30 (R1.0*U1.3*T1.0*M1.0) > theta[family]=0.3.
  • Symmetrically, raj's venue(*) -> family: exact matches maya, and maya's threshold for raj is the family 0.3.

Delete one of the two bonds and the mesh degrades in a directionally honest way. If raj dropped his bond maya, every consequence would land in raj's own declarations. Incoming: maya's ETA would face T = 0.6 and raj's others threshold of 0.8, so P = 1.0 × 1.3 × 0.6 × 1.0 = 0.78, short of the bar, and the flow would not fire. Outgoing: raj's venue(*) -> family: exact rule would no longer match maya (his circles derive from his bonds), so the venue could not cross at all. Maya's membrane, meanwhile, would still cast raj exact; her circles derive from her bond, which stands. Trust is declared per party, per direction, and every consequence of it lives in the twin that declared it. That is Axiom III wearing arithmetic.