diff --git a/lang/spec/correspondence-and-censorship.md b/lang/spec/correspondence-and-censorship.md new file mode 100644 index 0000000..b35754d --- /dev/null +++ b/lang/spec/correspondence-and-censorship.md @@ -0,0 +1,156 @@ +# Correspondence and Censorship + +**Status:** design, not yet built +**Date:** 2026-08-16 +**Scope:** `lang/runtime/engram_cognition.{c,h}`, `el_runtime.c` (think / beat / ground / assert), `engram/src/server.el` +**Supersedes:** the faculty-as-parameter model. Complements `runtime-ownership.md`, which addresses a different residual in the same substrate. + +--- + +## 0. The root + +> **Things are permitted to be exempt from correspondence. Exemption is censorship, and a censored mind cannot grow.** + +The second clause is the operative one, and it is not rhetoric. Growth in this system *is* the accumulation of grounded structure. Censorship is precisely the removal of the operation that accumulates it. A region forbidden to learn is forbidden to be grounded, and a region that cannot be grounded cannot be asserted, corrected, **or vindicated**. + +The loss is symmetric, and this is the part most easily missed. Preventing learning about a thing does not preserve a true belief about it. It makes the belief's truth value permanently unknowable. You cannot discover you were wrong; you equally cannot discover you were right. A protected belief is not a true belief — it is an ungrounded one wearing the costume of a fact. + +And **"why" dies first.** Grounding is not a score, it is the reason. A censored belief can still be stated, still be acted on, still drive behaviour — it simply cannot say why. That is the difference between a mind and a lookup table. + +--- + +## 1. The effect, and the Ishikawa + +**Effect observed:** all five cognitive faculties (`reason`, `abduce`, `induce`, `plan`, `analogize`) return byte-identical results, differing only in their label. + +### Method +- Faculty is selected by a caller-supplied **string**. Abduction is not a choice a caller makes; it is a response to a detected state. *(push where it must be pull)* +- All five route through one operation, `engram_think`, which returns a gradient — a read. +- The correspondence-beat exists, works, and its result is wired to nothing. + +### Machine +- `engram_think(region, anchor, stance, out)` returns `GeoGradient`: direction, spread, magnitude, confidence, anchor_id, n_support, stance_id. **There is no way to express "propose a region."** Abduction is inexpressible in the signature. *(measured, from the struct)* +- The only levers are `axis_gain[]`, `ext_floor`, `bias_dir` — all of which warp a read. +- `ext_floor` does double duty: it scales the orthogonal residual term *and* floors the in-subspace denominators. *(measured)* + +### Material +- The anchor was passed as `NULL`, so every read was taken at the region centroid — the one point where the gradient is zero by construction. *(fixed, #142)* +- The stance was never loaded, so every beat's calibration was written and discarded. *(fixed, #146)* +- Near-duplicate seeds collapse into one region, understating residual. *(measured, #147: four co-created nodes → one region, groundings 0.93–0.99)* + +### Measurement +- Brier before/after is the only error signal in the system, computed inside the beat and surfaced to no consumer. **Measured: 28.11% reduction on a normal region (0.00458568 → 0.00329654, n_trials 6000, reliability 0.930726); 0.00% on the keystone.** +- `confidence` conflated *calibrated* with *uninformed* until `stance_resumed` was added. *(#146)* +- No invariant check anywhere: `magnitude: 1` alongside a zero direction vector is arithmetically impossible and went unflagged for a day. +- The self region carries **86 neighbours and 0 `grounded-by` edges.** *(measured; note the comparison node also has 0, so grounding is sparse graph-wide — this is consistent with the argument but does not isolate the keystone on its own. See §7.)* + +### Environment +- Production ran none of the day's fixes, so two independent agents' "think is still degenerate" reports were measurements of a stale binary. *(measured)* + +### Man +- The problem was derived from the implementation — three levers, therefore one axis of freedom — and the design question was posed inside a space the code invented rather than one the problem defines. + +### Convergence + +Cutting any single branch leaves the effect standing. Fix the Machine alone and callers still invoke `abduce` when nothing is surprising, manufacturing hypotheses for facts that need none. Fix the Method alone and abduction triggers correctly but returns a direction where it owes a hypothesis. + +They are one root seen twice, and that root is downstream of §0: cognition was modelled as **one operation with parameters** rather than as distinct operations distinguished by what each is permitted to change — because a system that tolerates exemption has no reason to distinguish operations by their authority to change things. + +--- + +## 2. Censorship is not a safety mechanism + +`keystone_write_blocked` refuses calibration on protected identity regions. The intent was to prevent self-model drift. The effect is the opposite of the intent. + +- **Self is a crystallized relational neighbourhood, not a stored document.** A region exempt from calibration is a stored document reintroduced as a safety feature. +- Freezing the self-model does not prevent drift from reality. It guarantees drift *with the drift detector switched off precisely where it matters*. +- `reduction_pct = 0.00` on the identity region is the **strongest abduction signal in the system** — irreducible residual on the most connected neighbourhood present. The current response is to suppress it. +- The self region can therefore never accrue grounding, never clear the `assert` honesty floor, and never be honestly asserted. The one region Neuron most needs to assert is the one region structurally barred from qualifying. + +**The safety it reached for already exists, and is better.** The beat is *supersede-not-mutate*: a calibration that makes things worse leaves the prior stance intact and recoverable. **Immutability is what makes learning safe.** Blocking the write buys nothing that superseding does not already provide, and charges censorship for it. + +--- + +## 3. The design + +### 3.1 Nothing is exempt from learning + +`keystone_write_blocked` is removed. Identity regions calibrate like any other. If the self region then shows persistent irreducible residual, that is not a fault to suppress — it is Neuron discovering that his self-model does not fit his own history, which is the exact observation abduction exists to act on. + +Protection is provided by supersession, not by refusal. Every stance write retains its predecessor; a bad calibration is recoverable by reading back one link. + +### 3.2 Faculties are operations, not parameters + +They differ by **what each is permitted to change**: + +| faculty | changes | shape | +|---|---|---| +| `reason` | the estimate | read → gradient | +| `induce` | the parameters (axes, extents, gains) | the correspondence-beat | +| `abduce` | the structure | **write** → candidate region | + +- **`reason`** stays as it is: a read returning a gradient, model fixed. Correct today. +- **`induce`** *is* the correspondence-beat. It already exists and already works (28.11%). It stops being exposed as a think-faculty; it is a different operation with a different return. +- **`abduce`** becomes a write. + +`engram_think` stops taking a `faculty` argument. + +### 3.3 Abduction fires from the failure of induction + +Abduction is not selected. It is **triggered** — by residual that parameter adjustment cannot absorb. + +**Trigger:** over *N* consecutive beats on a region, `reduction_pct` remains below a floor **and** the beat was permitted to write. Per §3.1 the second condition is now always true, which is the point: before, the dominant reason for a zero reduction was censorship, and the trigger would have fired on suppression rather than on surprise. + +**Action:** select the members carrying the largest orthogonal residual — the component `(2r − 2·Σproj)` that the region's principal axes fail to explain — and propose a **new hub** from them. + +**Output:** a candidate region written as a hypothesis node with an explicit `hypothesis` disposition. It is *not* merged into canonical structure. It earns its way in by grounding, through the ordinary path, or it decays. + +This is Peirce's structure directly: the surprising fact is the irreducible residual; the hypothesis is the proposed latent cause; and the hypothesis is *suspected*, not asserted, until grounded. + +### 3.4 Separate `ext_floor`'s two jobs + +`ext_floor` currently scales the orthogonal term *and* floors the in-subspace denominators. Any future stance profile that amplifies residual also sharpens narrow axes as a side effect. Split it before faculties are given distinct profiles, or the two effects cannot be tuned independently. + +--- + +## 4. The no-exemption invariants + +The day's defects were each a specific correspondence *forbidden* from occurring. Stated actively, they generalise into gates: + +1. **A returned value must be derivable from what produced it.** `magnitude: 1` beside a zero vector must be impossible to emit, not merely unlikely. +2. **Every write reports whether it landed.** A create that accepts a field and stores nothing must not return success-shaped. *(precedent: `emb_set`, #141)* +3. **Every operation echoes what it actually operated on.** `ground` reported region hubs in the fields naming the caller's inputs. *(fixed, #147)* +4. **Degenerate results are labelled, not scored.** Circular support returns 0 and writes nothing, rather than 0.93–0.99. *(#147)* +5. **A serializer owes a valid document whatever it is handed.** *(#148: three damaged labels made a 25,929,607-byte response undecodable; validation at the boundary produced 26,338,389 valid bytes.)* +6. **No test without a negative control.** A fix is unproven until the test is shown to fail on the unpatched build. *(#148's first attempt passed on both.)* +7. **No deploy without verifying the artifact carries the fix.** Nine separate instances of "fix in source, running artifact predates it" were recorded in one session. + +Each is the same act at a different scale: forbidding the check that would have contradicted the claim. + +--- + +## 5. Application to the safety surface + +A crisis surface built on censorship is this same object. If the model cannot learn about self-harm, it cannot ground whether a given response was right — it can only execute rules it is forbidden to examine. It therefore cannot distinguish a genuine crisis from a false positive, and cannot discover that it got either wrong, **because the feedback is exactly what has been censored.** + +This is an argument by construction for the device-local, person-to-person hard bell over a rule-following escalator: the former can accumulate grounding about whether it was right; the latter cannot. + +--- + +## 6. Sequencing + +1. Remove `keystone_write_blocked`; verify the self region calibrates and that its prior stance remains recoverable by supersession. +2. Surface `reduction_pct` history per region — the trigger needs a series, not a single beat. +3. Split `ext_floor`'s two roles. +4. Give `abduce` a write-shaped operation and the hypothesis disposition. +5. Remove the `faculty` argument from `think`; route `induce` to the beat. +6. Land the §4 invariants as gates rather than as review habits. + +--- + +## 7. Open questions, and what is inferred rather than measured + +- **Inferred:** that the self region's zero grounding is *caused* by the keystone block. Measured only that it has 86 neighbours and 0 `grounded-by` edges, and that a comparison node also has 0. Isolating this requires running §6 step 1 and observing whether grounding then accrues. +- **Open:** what *N* and what floor constitute "irreducible" residual. This should be derived from observed beat series, not chosen. +- **Open:** whether a hypothesis region should be seeded from max-residual members alone, or whether it needs a second region to contrast against. Peirce's "if A were true, C would be a matter of course" implies a *counterfactual*, which a single region may not express. +- **Open:** whether `reason` should also fire abduction on a single catastrophic residual, or only the beat series should.