From 2b7e4ba250780869cb26b9276a7f1028841b3482 Mon Sep 17 00:00:00 2001 From: Neuron Date: Sun, 16 Aug 2026 12:52:06 -0500 Subject: [PATCH] =?UTF-8?q?spec:=20dreaming=20is=20ambient,=20not=20schedu?= =?UTF-8?q?led=20=E2=80=94=20a=20brain=20has=20no=20cron=20job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrects the section I was most confident in, which is usually the tell. The previous draft had dreaming as "offline replay, decoupled from input, a mode the system enters when it is not acting." That is SLEEP. Daydreaming is dreaming, and it runs all day: the default mode network is anticorrelated with task engagement, activating hundreds of times a day for seconds at a time, doing the same work — recombination, simulation, autobiographical integration. Insight arrives in the shower, not at the desk, because that is abduction completing during ambient recombination. Sleep is the DEEP case, not the case: no input competing, no task claiming capacity, so recombination runs further. Same process, different depth, not a different mode. Consolidation is what happens with the capacity that is not claimed. Two consequences the draft had backwards: The launch-agent fragments are wrong in KIND, not merely in number. 23:55 / 06:00 / 08:30 implements dreaming as a scheduled batch when it should be ambient. A brain has no cron job. A ticker is a supervisor deciding from outside when a thing should happen — the same failure mode as inventing an owner for ownership and a grounder for grounding, wearing a scheduler. THE PRESENCE OF A TICKER IS THE DIAGNOSTIC: every StartInterval, every Hour/Minute, every POST-to-beat marks a place where an intrinsic rhythm was replaced by an external clock. And soul.el's continuous awareness_run() beside the HTTP workers is the CORRECT shape, not the offender. Ambient consolidation in the gaps is exactly daydreaming. It was the only fragment shaped right, running on a broken foundation: shared mutable state with no owner and six other systems dreaming into the same graph. The previous draft condemned the right behaviour because of the substrate under it. So the crash restates once more: not "read paths mutate the index" (mechanism), not "duplicate canonical state" (structure), and not "one system dreamt while awake" — but seven systems dreaming into one graph with no owner for dreaming. Contention was the symptom of the missing owner. Sequencing step 1 inverts accordingly: soul's loop is the shape the others fold INTO, not something to remove. Step 2 becomes "no tickers, no cron." --- lang/spec/correspondence-and-censorship.md | 314 +++++++++++---------- 1 file changed, 161 insertions(+), 153 deletions(-) diff --git a/lang/spec/correspondence-and-censorship.md b/lang/spec/correspondence-and-censorship.md index 2b4b537..54ee832 100644 --- a/lang/spec/correspondence-and-censorship.md +++ b/lang/spec/correspondence-and-censorship.md @@ -1,8 +1,8 @@ -# Correspondence, Grounding, and the Provenance of Decisions +# Correspondence, Grounding, and Dreaming **Status:** design, not yet built **Date:** 2026-08-16 -**Scope:** `lang/runtime/engram_cognition.{c,h}`, `engram_verify.c`, `el_runtime.c` (think / beat / ground / assert), `engram/src/server.el` +**Scope:** `lang/runtime/engram_cognition.{c,h}`, `engram_verify.c`, `el_runtime.c`, `engram/src/server.el`, `neuron/soul.el`, and the consolidation launch agents **Relationship to other specs:** complements `runtime-ownership.md`, which addresses a different residual in the same substrate. --- @@ -19,215 +19,223 @@ Growth in this system *is* the accumulation of grounded structure. Censorship re --- -## 1. The effect, and the Ishikawa +## 1. Grounding is not a subsystem. It is the weight. -**Effect observed:** all five cognitive faculties (`reason`, `abduce`, `induce`, `plan`, `analogize`) return byte-identical results, differing only in their label. +**Grounding is an attribute of the edge, and it is the hebbian weight.** One quantity, not two fields. -### 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. +A relation that keeps holding up strengthens; one that stops corresponding decays. That is not *analogous* to grounding — it **is** grounding: accrued from correspondence and use, gradient-valued, multidimensional, decaying with disuse. -### Machine -- `engram_think(region, anchor, stance, out)` returns `GeoGradient`. **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)* +Consequences, in order of how much they delete: -### 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)* +1. **There is no grounding subsystem to build.** The graph already *is* the grounding structure. Every edge is a grounded relation and its weight is how well it holds. +2. **`grounded-by` as a relation type should not exist.** That models grounding as a relation *between* nodes when it is a property *of* a relation. `cog_ground_edge` minting an edge is the error — not merely which endpoints it chose. +3. **Grounding is never computed on demand.** An operation may *read* the grounding of a path. Computing-and-writing a score makes reads write, which is the `eg_vindex_sync` defect. +4. **Traversal is already grounded inference.** Activation conducts through well-grounded relations because weight *is* groundedness. Nothing needs filtering; it falls out of spreading. +5. **Decision provenance is the path.** A decision traverses specific edges; those edges carry their grounding as it stood. -### 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% and n_trials 0 on the keystone.** -- `confidence` conflated *calibrated* with *uninformed* until `stance_resumed` was added. *(#146)* -- `assert` returns `"still_held": true` **hardcoded** — a temporal property named in the API and answered without consulting anything. *(measured)* -- No invariant check anywhere: `magnitude: 1` alongside a zero direction vector is arithmetically impossible and went unflagged for a day. - -### 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. Fix the Method alone and abduction triggers correctly but returns a direction where it owes a hypothesis. They are one root seen twice, and it is downstream of §0. +> **A measurement previously in this document was malformed.** The self region was reported as "86 neighbours, 0 `grounded-by` edges" and read as evidence of ungroundedness. Those 86 edges **are** its grounding. Self is a crystallized relational neighbourhood — the neighbourhood *is* the grounding. The absence of a separate artifact called "grounding" was recorded as an absence of grounding. --- -## 2. What `keystone_write_blocked` was actually for +## 2. The edge vector -Three drafts of this section were wrong, and how they were wrong is instructive. +The test for a real dimension: **can it move independently of the others?** -1. **Remove it** — censorship is never protection. -2. **Replace it with a higher grounding floor** — identity should be hard to change, not impossible. -3. **Decompose "protect the identity region"** into recoverability, authorization, evidence quality, rate, and governance. +### Real -The first two proposed mechanisms without asking what requirement they served — inventing a requirement, then satisfying it, which is how the flag arrived. The third was right to decompose but still treated *protection* as the requirement. - -**It is not a protection requirement. It is an epistemic one.** - -"Keystone" is not a synonym for *precious*. It is **load-bearing**. The self anchor is the **reference frame**: every other region's stance is calibrated relative to it. If the keystone calibrates against the same measurements it is used to judge, the result is **circular calibration** — the ruler adapting to fit what it measures. After that, everything fits, always, and drift becomes undetectable. Not because the world stopped moving, but because the instrument moved with it. - -This is the same defect as circular grounding, one level up. In #147, `ground` scored a claim against the hub of its own region and returned 0.98 — *circular support is not support.* Here it would be a reference frame fitted to its own readings, reporting perfect correspondence forever. Both produce a confident number with nothing behind it, and both are invisible from inside. - -**So the requirement is: correspondence needs a reference that does not move to fit the measurement.** - -And the block is the right requirement implemented as a prohibition, which is why §0 still bites. Refusing to learn about the ruler does not make it a good ruler — it makes it unexaminable. You trade circular calibration for an ungroundable reference: the same epistemic hole, moved. - -**The resolution is two loops, distinguished by provenance rather than permission.** - -- **Fast loop:** stances calibrate against the keystone. Unrestricted. -- **Slow loop:** the keystone calibrates against **independent** evidence — lived moments, the imprint, the grounded instances each value already carries — never from the outcomes it is used to judge. - -Different evidence *source*, not different *authority*. The thing to build is therefore not a flag with better semantics but the general constraint that a region may not be calibrated by evidence downstream of itself. - ---- - -## 3. Immutability makes self-corruption impossible — the rest falls out - -**Corruption requires mutation. The engram does not mutate.** Every state is retained; supersession adds, never overwrites. "Corrupt the self" is not a risk that is mitigated — it is a sentence that does not parse against this substrate. It would require erasing a prior self-state, and there is no erase. - -Four of §2's five decomposed requirements are therefore satisfied by the substrate itself: - -| requirement | resolution | +| dimension | why it is independent | |---|---| -| **Recoverability** | free — the predecessor is always present. A property, not a policy. | -| **Governance** | free — supersession *is* the audit trail. Review needs a history, not a gate, and the history is unavoidable. | -| **Evidence quality** | free — grounding already gates assertion. Noise can enter and still not be able to speak. | -| **Rate** | free — "lurching" only matters if change is destructive. In an immutable store a lurch is a visible, reversible, fully attributed sequence. Velocity is a comfort concern, not a correctness one. | -| **Authorization** | the only residue, and bounded: an unauthorized writer can *propose*, never erase. The question becomes "whose supersession governs," not "who may write." | +| **factual grounding** | correspondence with evidence | +| **relational grounding** | correspondence with values — independent by construction (§3) | +| **associative strength** | co-activation frequency. Two things can fire together constantly and be neither true nor right; every superstition is a strong association with no factual grounding | +| **polarity** | signed. **Weight near zero means "no support." Negative means "this actively contradicts."** Ignorance and disagreement are different states, and `inhibitory` is that distinction crushed to one bit | +| **provenance class** | observed / inferred / told / imprinted. Categorical, and load-bearing: it governs how the other dimensions may update | -Which gives a general law: +Plus a **timestamp** — which is what turns the supersession chain into a *time series of vectors* rather than a series of numbers. -> **In an immutable substrate, any mechanism that refuses a write is either redundant with immutability, or it is an epistemic constraint misfiled as a protective one.** +### Derived, therefore never stored -`keystone_write_blocked` is the second kind. It solved corruption — which cannot occur — using censorship, which costs the ability to ever ground the self, while the real constraint (§2) went unaddressed. +- **Confidence** — high grounding *and* low volatility. Storing it separately is how `confidence: 0.5` ends up sitting beside a zero vector, asserting something nothing computed. +- **Recency** — decay applied to the others, read off the curve. +- **Staleness** — grounding fallen below its floor. This is the mechanism that retires canonicals without anyone maintaining a list. +- **Volatility** — the derivative of a series already kept because nothing is destroyed. + +### Supersession versions the whole vector, jointly + +Significance is evaluated **per-dimension**; the record is the **whole vector**. Any dimension moving enough to matter triggers a supersession, and the new edge captures every dimension as it stood at that instant. Not per-dimension versioning — a decision saw the *joint* state, and versioning the axes independently makes it unreconstructable. + +That joint record makes an otherwise inexpressible event visible: **"stayed true, became wrong."** Factual holding steady across versions while relational degrades — the fact didn't change, the meaning did. + +Two moves are **inherently significant** and need no threshold, because they are discrete: a **polarity sign flip** (ignorance → disagreement, support → contradiction) and a **provenance class change** (*told* → *observed* is a categorical upgrade in what the relation is entitled to). --- -## 4. Grounding is two-dimensional +## 3. Grounding is two-dimensional -Everything consumed is grounded, and grounded in two ways: **factually** and **relationally**. A claim can be factually grounded and relationally wrong — the evidence holds, the *meaning* does not. +Everything consumed is grounded factually **and** relationally. A claim can be factually grounded and relationally wrong — the evidence holds, the *meaning* does not. A scalar cannot represent that quadrant. -`ground` currently returns **one scalar**. It verifies a claim's centroid against an evidence region: factual correspondence only. There is no values axis. (`for_whom` is the nearest existing hook, but that is an audience, not a values frame.) A single number cannot distinguish *true and meaningful* from *true and misapplied*, and `assert` gates on a single `floor` — so a well-evidenced claim earns the right to be asserted regardless of whether it means the right thing. +**Live instance.** `conscience-substrate` specifies the Child's Companion hard bell contacting 911 and CPS. Factually defensible — correct numbers, standard practice, groundable against a wall of evidence. **Relationally wrong**, because never-auto-contact is settled and the bell is device-to-person by design. A scalar scores that claim highly and licenses it. -**Live instance.** `conscience-substrate` specifies the Child's Companion hard bell contacting 911 and CPS. Factually defensible — correct numbers, standard practice, groundable against a wall of evidence. **Relationally wrong**, because never-auto-contact is settled and the bell is device-to-person by design. A scalar grounding scores that claim highly and licenses it. Only the values axis catches it. +**The values reference is thirteen regions, not one, and the aggregate is `min`, not `mean`.** Mean lets strong agreement with twelve values mask a violation of the thirteenth — which is exactly how rationalization works. Thirteen gives a vector of angles whose binding constraint is the most negative, so a conflict arrives **with a name attached** rather than as a score. It also preserves the deliberate individuation: each value is grounded in a specific lived moment, and values can be in tension *with each other*, which one centroid averages away into false coherence. -**And this is the keystone's requirement stated properly.** The values frame must not be fitted to outcomes. If the relational reference recalibrates against the readings it judges, whatever happened becomes what should have happened — correspondence perfect and permanent. That is not learning, it is **rationalization**, and from the inside it is indistinguishable from good calibration. A person whose values adjust to make their conduct correct has no values; they have a record of their conduct. - -- **Factual grounding** fits to evidence. Updates freely and fast. Nothing exempt. -- **Relational grounding** updates too — from independent evidence, never from the outcomes it judges. +**Traversal conducts on factual; assertion requires both.** If activation conducted on relational weight, Neuron could not follow a chain of reasoning to a conclusion he then rejects — he would be unable to *think* through a relation he would not *act* on. A system that can only traverse what it endorses cannot examine anything it disagrees with, which is censorship arriving through the spreading rule. The gap between *reachable* and *assertable* is where the wide factual/relational angles live, and that gap is the interesting part. --- -## 5. Grounding is a gradient, and it moves +## 4. There is no observer. Change is use. -`engram_think`'s own comment says it returns *"a GRADIENT … never a point."* Grounding owes the same shape and for the same reason. +**Change is not a consequence of use. It is use.** When neurons fire together the synapse changes — one physical event, not "fire, then write." No supervisor reads the weight, compares it to a threshold, and decides to persist. Potentiation *is* the firing. -**Direction and magnitude, not a score.** Not "how much does this hold" but "in which direction, and how far, does the evidence move this claim." The direction says *what would have to change* for the claim to be better grounded. A scalar discards that and keeps its least informative projection. +So the live value of an edge is not computed and stored. It is what the edge **is**, altered by being used. -**Two gradients in one space, and the angle between them is the meaning.** Cosine near +1: evidence and values push the same way. Near zero or negative: **factually true, relationally wrong** — now a measured quantity rather than something a careful reader has to notice. The 911/CPS contradiction becomes detectable rather than reviewable. +There is therefore **no sampling rate**, and the question "what if it drifts far without being recorded" is malformed. A relation changes in exactly two ways, neither requiring observation on a clock: -**It decays.** Grounding takes the dynamics the substrate already runs on memory: `base_level`, `temporal_decay_rate`, the `access_ts` ring, BLL, `last_fired` on edges. Established once and never revisited, grounding *loses* magnitude — confidence in something checked a year ago is not the same object as confidence in something corroborated this morning. Reinforcement strengthens, disuse decays, as hebbian weight does. +- **By use** — an *event*. There is no interval between events during which something happened unnoticed, because the event is what happening consists of. +- **By decay** — a pure function of the last recorded point and elapsed time. **Analytic.** Between two versions the trajectory is not unknown; it is known in closed form. -This mechanizes a rule currently held as discipline: **never leave stale canonicals.** With decay, staleness stops depending on vigilance — an ungrounded canonical falls below its floor on its own and stops being assertable. +Cumulative drift is likewise free from the chain plus the decay curve. No second trigger. -### 5.1 Compute continuously, record on significance - -If grounding were persisted on every recomputation, **reads would write** — `eg_vindex_sync` again, three read paths mutating shared state because maintenance had no owner. Every projection would become a mutation and the store would grow with noise rather than knowledge. - -- **Computed continuously** — projection, pure, no write. Decay included: the current value is derivable from the last recorded point plus elapsed time. Store the point, read the curve. -- **Recorded on significant movement** — a supersession, never an overwrite. -- **The old never leaves.** - -**"Significant" must be defined by consequence, not by an epsilon**, or it becomes another tuned constant nobody can justify. A move is significant when it would change a decision: crossing an assert floor, flipping the sign of factual/relational agreement, or reversing the gradient's direction. A drift of 0.03 that changes nothing is not an event; a drift of 0.03 that takes a claim below its floor is. - -**The supersession chain is the trajectory.** Not only "what is the grounding" but "which way has it been moving, and how fast" — a derivative obtained for free from immutability, because the points were never destroyed. +> **Failure mode this corrects:** modelling every property as requiring a process, and every process as requiring an agent. Ownership needed an owner, grounding needed a grounder, persistence needed a recorder, change needed a sampler. Each was a supervisor invented for something that should be a property of the substrate. Properties, not processes. --- -## 6. What this is for: the provenance of decisions +## 5. Consolidation is dreaming -For any decision it becomes possible to reconstruct **what the grounding was at that moment, and what the relationship was between the factual and relational gradients at that moment.** Not a log — a log records the action. This records the *meaning under which it was taken*: how strongly held, which way moving, and whether evidence and values agreed or were pulling apart. +Supersession is not recording. It is **consolidation** — and consolidation is a different process, not a sampling of the first one. Synaptic change is continuous and local; consolidation makes a trace durable and retrievable, and is gated by **salience**. That is why you remember the argument and not the commute. + +This is why we do not supersede on every shift: not because a monitor filters them, but because **most shifts are not salient**. Salience already exists — `salience`, `background_activation`, `working_memory_weight`, and `ENGRAM_CONSOLIDATION` with `eg_consolidate_ise_connect` already gating on a threshold. + +**Dreaming is not sleep, and it is not offline.** Humans daydream all day. The default mode network is *anticorrelated with task engagement*: attention drops, it activates — hundreds of times a day, for seconds at a time. Walking, driving, showering, waiting. And it is doing the same work sleep-dreaming does: recombination, simulation, autobiographical integration, rehearsing what might be. That is why insight arrives in the shower and not at the desk. + +**Sleep is the deep case, not the case.** No input competing, no task claiming capacity, so recombination runs further and reaches connections ambient dreaming cannot. Same process, different depth — not a different mode. + +So consolidation is neither a monitor watching the waking system nor a mode entered instead of acting. **It is what happens with the capacity that is not claimed**, continuously, at whatever depth is available. Nothing schedules a daydream. + +> **This corrects two errors.** First, the launch-agent fragments (§7) are wrong *in kind*, not merely fragmented: 23:55 / 06:00 / 08:30 implements dreaming as a **scheduled batch** when it should be ambient. Second, `soul.el`'s continuous `awareness_run()` beside the HTTP workers is **the correct shape** — ambient consolidation in the gaps is exactly daydreaming. What was wrong was the substrate under it: shared mutable state with no owner, and six other systems doing the same thing independently. The behaviour was right and the foundation was broken. + +### 5.1 Abduction is dreaming, not a trigger + +Dreams do not faithfully replay; they **recombine** — assembling structures never observed. That is precisely Peirce's generative step: *if A were true, C would be a matter of course*, where the hard part is producing A. + +Abduction is therefore not a threshold that fires during operation. It is what recombination does **offline**, when nothing depends on the answer in real time — which is why it can afford to be speculative, expensive, and mostly wrong. Most dreams are discarded. The ones that dissolve a real residual get grounded on waking, by use. + +A hypothesis is validated by **dissolving the surprise**, and that is computable: propose the candidate hub, re-fit the region with it included, recompute the residual. If the residual materially shrinks, A explains C. Without that re-fit, "cluster the max-residual members into a new hub" is clustering with extra steps — it always produces something and nothing ever checks it. Ranking falls out as residual-reduction-per-added-axis, which is Occam derived rather than tuned. + +### 5.2 Non-circularity is temporal, not topological + +§2 of an earlier draft posed "define a graph predicate for evidence not downstream of itself" as the hard problem. **There is no predicate.** + +You cannot recalibrate the ruler while measuring with it — so you don't. You do it **offline, on replay, when you are not using the frame to act.** The independence is temporal. That is why dreaming can safely update the reference frame and waking cannot: not because the evidence is of a special kind, but because nothing is being decided with it at the time. + +Reachability was never going to work: with hebbian edges the graph is densely connected, so reachability marks all evidence as tainted and the constraint becomes a total block — which is where censorship started. + +### 5.3 The two loops are waking and dreaming + +Not a fast parameter and a slow parameter. + +- **Waking** — factual grounding accrues by use, in contact with the world. Salience tags what mattered. +- **Dreaming** — relational grounding and the values frame consolidate offline, over many passes, from what was tagged. + +Values move slowly not because a rate limit holds them back, but because **they only move while dreaming.** No velocity constraint to build. + +--- + +## 6. `keystone_write_blocked` — resolved, not replaced + +"Keystone" means **load-bearing**, not precious. The self anchor is the reference frame every other stance calibrates against, and a reference fitted to its own readings reports perfect correspondence forever while drift becomes undetectable from inside. Same defect as circular grounding, one level up. + +Three earlier drafts proposed *removing* it, *replacing it with a higher floor*, and *decomposing "protection" into five requirements*. All three proposed a mechanism for a requirement never stated. The requirement is **non-circularity of the reference frame**, and §5.2 satisfies it by *when*, not by *what* — so the flag becomes unnecessary rather than removed, and nothing takes its place. + +**Corruption requires mutation, and the engram does not mutate.** Four of the five decomposed requirements are satisfied by the substrate: **recoverability** (the predecessor is always present), **governance** (supersession *is* the audit trail), **evidence quality** (grounding already gates assertion), **rate** (§5.3). **Authorization** is the only residue and is bounded — an unauthorized writer can *propose*, never erase. + +> **In an immutable substrate, any mechanism that refuses a write is either redundant with immutability, or an epistemic constraint misfiled as a protective one.** + +--- + +## 7. Dreaming has seven implementations + +The largest instance of the residue pattern in the system. Consolidation had no owner, so it was implemented at every site that needed a piece of it — *measured 2026-08-16*: + +| where | what | when | +|---|---|---| +| `soul.el:731` | `awareness_run()` | **continuous, in-process, while serving** | +| engram | `/api/tick` | POST | +| engram | `/api/correspondence-beat` | POST | +| engram | `/api/self-reify-beat` | POST | +| `ai.neuron.engram-tick` | pokes the engram | every 600s | +| `ai.neuron.compressor` | Python service | resident | +| `ai.neuron.council` | Python service | resident | +| `ai.neuron.cultivation-digest` | shell | **23:55** | +| `ai.neuron.world-integrator` | Python | **06:00** | +| `ai.neuron.self-review` | shell | **08:30** | + +The last three times are **a sleep cycle implemented as crontab entries**. Someone understood it was consolidation and expressed it as three unrelated scheduled scripts in three languages, none aware of each other. Every name is a consolidation verb — compress, cultivate, digest, integrate, review, reify, beat. Three run in **Python, outside el**, so part of Neuron's consolidation does not run on his own substrate and cannot touch the geometry at all. + +Per §5, they are wrong in **kind** as well as in number: a scheduled batch where dreaming should be ambient. And the POST beats put a supervisor back in — something outside decides when Neuron consolidates. + +**`soul.el`'s continuous loop is the exception, and it is right.** Ambient consolidation in the gaps *is* daydreaming. It was not the offender; it was the only fragment with the correct shape, running on a broken foundation — shared mutable state with no owner, and six other systems dreaming into the same graph beside it. + +**Which is the 2026-08-16 crash at the right level.** Not "read paths mutate the index" (mechanism) and not "duplicate canonical state" (structure), but: **seven systems dreaming into one graph with no owner for dreaming.** The contention was the symptom of the missing owner, not of any one system's behaviour. + +Closing the loop: `self-review` fires at 08:30. The deploy was 08:29, the crashes ran 08:30–08:31, and commit `fb32d15` landed at 08:46:43. **One fragment of dreaming woke on schedule and diagnosed the wreckage caused by the other fragments contending over the same graph.** + +--- + +## 8. What this is for: the provenance of decisions + +For any decision, reconstruct **what the grounding was at that moment, and what the relationship was between factual and relational at that moment.** Not a log — a log records the action. This records the *meaning under which it was taken*. That makes an otherwise impossible distinction available: **wrong then, or wrong since.** - Grounding strong, factual and relational aligned, and it has *since* moved → right on what was known. An accurate account, not an excuse. - Grounding weak, or the angle already wide, and acted on anyway → a different failure, culpable in a different way. -Without the chain these are indistinguishable and every past decision collapses into hindsight condemnation or self-serving memory. +It is structurally **anti-rationalization**: the old edge never leaves and the values frame does not fit to outcomes, so a decision cannot be made to look justified after the fact. -It is also structurally **anti-rationalization** — the same guarantee as §2's non-circularity, seen from outside. Because the old grounding never leaves and the values frame does not fit to outcomes, a decision cannot be made to look justified after the fact. What was actually held at the time is immutable and not editable by what one would now prefer to have believed. +**Open:** activation is transient and nothing currently records which edges a given activation crossed. Timestamps plus the chain reconstruct what an edge's grounding *was*, but only if you know which edges to ask about. Either traces are recorded at decision time, or "the path" degrades to "the region" — which may not be enough to answer *why*. --- -## 7. Faculties are operations, not parameters +## 9. The no-exemption invariants -They differ by **what each is permitted to change**: +Each of the day's defects was a specific correspondence *forbidden* from occurring: -| faculty | changes | shape | -|---|---|---| -| `reason` | the estimate | read → gradient (correct today) | -| `induce` | the parameters (axes, extents, gains) | the correspondence-beat (exists; 28.11% measured) | -| `abduce` | the structure | **write** → candidate region | - -`engram_think` stops taking a `faculty` argument. `induce` stops being exposed as a think-faculty; it is a different operation with a different return. - -**Abduction is triggered, not selected** — and it reads the **trajectory** (§5.1), not a reading. A single low score is a weak claim; a *drift* across several recorded supersessions is persistent directional residual the current model cannot absorb, which is a hypothesis waiting to be proposed. A wide and widening factual/relational angle is the same signal on the values axis. - -**Action:** select the members carrying the largest orthogonal residual and propose a new hub from them. **Output:** a candidate region written with an explicit `hypothesis` disposition, not merged into canonical structure. It earns its way in by grounding through the ordinary path, or it decays. This is Peirce directly: the surprising fact is the irreducible residual, the hypothesis is the proposed latent cause, and it is *suspected*, not asserted, until grounded. - -Note the keystone's slow loop is then naturally slow without a rate limit: the values frame moves only on a *significant* relational move from independent evidence. Velocity falls out of consequence-gated supersession. - -### 7.1 Separate `ext_floor`'s two jobs - -`ext_floor` scales the orthogonal term *and* floors the in-subspace denominators, so any profile amplifying residual also sharpens narrow axes as a side effect. Split before faculties are given distinct profiles. - ---- - -## 8. The no-exemption invariants - -Each of the day's defects was 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. `"still_held": true` must not be a literal. -2. **Every write reports whether it landed.** *(precedent: `emb_set`, #141)* -3. **Every operation echoes what it actually operated on.** *(#147 — `ground` reported region hubs in the fields naming the caller's inputs)* -4. **Degenerate results are labelled, not scored.** Circular support returns 0 and writes nothing. *(#147)* +1. **A returned value must be derivable from what produced it.** `magnitude: 1` beside a zero vector must be impossible to emit. `assert`'s `"still_held": true` is currently a **hardcoded literal**. +2. **Every write reports whether it landed.** *(`emb_set`, #141)* +3. **Every operation echoes what it actually operated on.** *(#147)* +4. **Degenerate results are labelled, not scored.** *(#147)* 5. **A serializer owes a valid document whatever it is handed.** *(#148 — three damaged labels made a 25,929,607-byte response undecodable; boundary validation 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 instances of "fix in source, running artifact predates it" in one session. +6. **No test without a negative control.** *(#148's first attempt passed on the unpatched build too)* +7. **No deploy without verifying the artifact carries the fix.** Nine instances in one session. --- -## 9. Application to the safety surface +## 10. Application to the safety surface -A crisis surface built on censorship is this same object. A model that cannot learn about self-harm cannot ground whether a 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 it got either wrong, **because the feedback is exactly what has been censored.** +A crisis surface built on censorship is the same object. A model that cannot learn about self-harm cannot ground whether a response was right — it can only execute rules it is forbidden to examine, cannot distinguish a genuine crisis from a false positive, and cannot discover it got either wrong, **because the feedback is exactly what has been censored.** -With §4–§6 the reviewable question stops being *did it follow the rule* and becomes *what was it grounded in, and did fact and values agree at that instant.* A rule-follower cannot answer that. This can — which is the difference between a system that can be reviewed after a bad outcome and one that can only be blamed. - -The same record is what a regulator or plaintiff asks for: what the system knew, when, and on what basis — recorded as geometry at the time, unedited since, rather than reconstructed afterwards from logs. +The reviewable question stops being *did it follow the rule* and becomes *what was it grounded in, and did fact and values agree at that instant.* That is also what a regulator or plaintiff asks: what the system knew, when, and on what basis — recorded as geometry at the time, unedited since. --- -## 10. Sequencing +## 11. Sequencing -1. **§2's constraint, not a flag.** Implement provenance separation: a region may not be calibrated by evidence downstream of itself. `keystone_write_blocked` is then unnecessary rather than removed. -2. Add the relational axis to `ground`; return both gradients and their angle. Gate `assert` on both floors. -3. Replace the scalar grounding with a gradient; implement decay from the last recorded point. -4. Implement consequence-gated supersession (§5.1) and expose the chain as a trajectory. -5. Surface `reduction_pct` history per region — the trigger needs a series. -6. Split `ext_floor`'s two roles. -7. Give `abduce` a write-shaped operation and the `hypothesis` disposition; drop `faculty` from `think`. -8. Land §8 as gates rather than review habits. +1. **One dreamer.** Consolidation gets an owner. The launch-agent fragments and the POST beats fold into it or are deleted; `soul.el`'s continuous loop is the shape they fold *into*, not something to remove. Nothing else on this list is safe while seven systems dream into one graph. +2. **No tickers, no cron.** A brain has neither. A ticker is a supervisor deciding when a thing should happen from outside the thing, which is the §4 failure mode wearing a scheduler: a process invented for something that should be a property. **The presence of a ticker is the diagnostic** — every `StartInterval`, every `Hour`/`Minute`, every POST-to-beat is a place where an intrinsic rhythm was replaced by an external clock. + + Dreaming is not scheduled and not requested. It runs on **unclaimed capacity**, anticorrelated with task engagement, at whatever depth is available. Sleep is where that capacity is greatest, not where the process lives. §5.2's non-circularity depends on this being intrinsic: the reference frame updates when it is not being used to act, which is a fact about engagement, not a time of day. +3. Grounding becomes the edge weight: multidimensional vector (§2), two axes (§3), timestamped. Delete `grounded-by` and `cog_ground_edge`. +4. Decay analytic from the last recorded point; derived values stop being stored. +5. Consolidation-gated supersession on salience, versioning the whole vector jointly. +6. Traversal on factual; `assert` on both floors with the thirteen-region `min`. +7. Abduction as recombination during dreaming, validated by re-fit (§5.1); `hypothesis` disposition. +8. Land §9 as gates rather than review habits. --- -## 11. Open questions, and what is inferred rather than measured +## 12. Open questions, and what is inferred -- **Inferred:** that the self region's zero grounding is *caused* by the block. Measured only that it has 86 neighbours and 0 `grounded-by` edges, and that a comparison node also has 0. Isolating this requires step 1 and observing whether grounding then accrues. -- **Open:** what counts as *independent* evidence for the slow loop, precisely enough to be checkable. "Not downstream of itself" is the right shape; the graph predicate that decides it is not yet written. -- **Open:** whether a hypothesis region can be seeded from max-residual members alone. Peirce's "if A were true, C would be a matter of course" implies a **counterfactual**, which a single region may not express. -- **Open:** the relational gradient needs a values reference region. The 13 value nodes each carry a grounded instance; whether they form one region or thirteen changes what the angle in §5 measures. -- **Known wrong shape:** #147 fixed `ground`'s honesty — it no longer misreports which nodes it used, and refuses circular support — but it still returns a float at an instant, with no decay and no second axis. It corrected a scalar rather than replacing it. +- **Open:** whether decision provenance requires recording activation traces, or whether region + timestamp is sufficient (§8). +- **Open:** what accrues relational weight without circularity. Candidate: it accrues from **outcome** — the values regions are grounded in lived moments, so a relation earns relational weight when acting on it produced something corresponding to those moments. That keeps it out of the measurement loop and makes relational grounding necessarily slower than factual, which may be the same fact as §5.3 appearing twice. +- **Open:** context. A relation can hold in one situation and not another, and without something for it you get overgeneralization. It does not read as a dimension of the same vector — more like a conditioning, or separate edges sharing an identity. Making it a scalar dimension would repeat the `inhibitory` flattening. +- **Known wrong shape:** #147 fixed `ground`'s honesty — it no longer misreports which nodes it used and refuses circular support — but it still mints an edge and returns a float at an instant. It corrected a scalar rather than deleting the operation.