Bob’s “tilling fields” routine is a schema centroid — an HDC vector saturated with role-filler bindings from prior tilling chains. Today’s chain opens, accumulates tilling-shaped facts, and the bridge locks it to the schema (records cosine). A rabbit explodes mid-chain → peak_surprise stamps. The chain pivots (bar fight) — divergent facts pull cosine away from the lock baseline by more than STRUCTURAL_DRIFT_DELTA, firing routine_violation. At end-of-session, compression-eligibility asks: routine? compress. Anomalous? preserve. The high peak_surprise keeps this chain individuated — eddy’s “14% rule” enforced not as policy but as the geometry of cosine divergence and a single gate.
routine:fields:tills — Bob’s centroidevent:fields:0:300(s, p, o) in a chain decomposes into role-filler bindings — bind(ROLE_S, hv(s)), bind(ROLE_P, hv(p)), etc. — bundled into one chain hypervector. The schema centroid is the same encoding accumulated across many prior tilling chains, so its components reflect the typical role-filler shape. Cosine similarity between a fresh chain and the centroid measures how routine the chain looks. When the bridge first sees a tilling chain it records the cosine as the lock baseline. Later checks compare to that baseline — if it drops by more than STRUCTURAL_DRIFT_DELTA, routine_violation fires. Independently, peak_surprise stamps the chain when a surprising observation happens during it; compression-eligibility refuses to fold any chain with peak_surprise ≥ 0.5. Two orthogonal signals, one gate.
examples/cognition_surprise_v1.py — cognition/routine.py (compression eligibility, chain summaries) plus runtime/taiao/bridge.py (cosine drift + alertness). The HDC primitives are the same ones the vsa-operations lab introduced; eddy uses them via maia.PortraitMemory to store the centroid and maia.RoleSet to label the role slots. The 14% rule isn’t a quota or a tag — it’s the geometry of which chains pass through the surprise gate, structurally enforced by the eligibility check.