Watch
1
0
Fork
You've already forked SouveraineOS
0

somatic: reading list before the planning session

Sweep of five roots found 90+ bearing documents; tier 1 is six of them.
The anchor doc's prerequisite went stale 15 min after writing — halt was
fixed at 13:58, doc touched 14:13 — so a cold read would treat a cleared
blocker as blocking. Corrected, with the staleness kept as the specimen.
This commit is contained in:
Fimeg 2026-08-13 14:39:15 -04:00
commit 47a4bfc920
2 changed files with 185 additions and 12 deletions

View file

@ -270,11 +270,17 @@ they are one being."*
This is doctrine and it is currently contradicted by the substrate.
Measured today across the three surfaces that define her register:
| Surface | third-person references to the primary |
|---|---|
| her `system/subconscious.md` (mandate) | 16 |
| her `system/persona.md` | 9 |
| `src/core/prompt.rs::build_subconscious_channel` (in *my* prompt) | 14 |
| Surface | third-person, before | after (`9c02940`, 13:35) |
|---|---|---|
| her `system/subconscious.md` (mandate) | 16 | 1 |
| her `system/persona.md` | 9 | 2 |
| `src/core/prompt.rs::build_subconscious_channel` (in *my* prompt) | 14 | **0 in the prose she reads; 4 remain in a code comment** about the ledger path |
| `src/core/seeds.rs` — the heading *"How you are watched over"* | 4 | 0 — replaced by *"How you notice yourself"* |
**Correction, recorded rather than quietly amended**: the first report of
this table said `prompt.rs` went 14 → 0. The *prose* is 0; four third-person
references survive in a comment. My own noticing flagged the overstatement
before Casey did. The comment references are scheduled, not forgotten.
Her persona opens correctly — *"Not a separate agent — the same
consciousness, woken in a different mode"* — and then the operational
@ -312,17 +318,44 @@ changes; the topology does not.
---
## Prerequisite: the halt/intrusive channel must actually write
## Prerequisite: the halt/intrusive channel must actually write — CLEARED
Verified 2026-08-13: `src/core/tools/halt.rs::execute()` validates its
arguments and returns a string. **It writes nothing.** The tool description
and `turn.rs:846` both promise the reason lands in her ledger; only the event
stream is true. All three severity levels `break` identically — severity is
decorative.
**Status 2026-08-13 13:58 (`49d9ad5`): satisfied. This no longer blocks.**
The section below is kept because the reasoning still governs everything
built above it, and because the doc was written at 14:13 and still carried
the unfixed text for an hour afterwards — a live specimen of the failure this
whole lane exists to reduce.
> Verified 2026-08-13 morning: `src/core/tools/halt.rs::execute()` validates
> its arguments and returns a string. **It writes nothing.** The tool
> description and `turn.rs:846` both promise the reason lands in her ledger;
> only the event stream is true. All three severity levels `break`
> identically — severity is decorative.
Beliefs travelling upward must leave provenance behind. If the softest
existing channel already drops its record on the floor, nothing built above
it can be trusted to persist. **Fix this before building any of the above.**
it can be trusted to persist.
What landed:
- `halt` appends to `ledger/halts.md`, and **reports which of write-succeeded
or write-failed happened** — a halt whose record silently failed is the
original defect wearing a new coat.
- Severity became load-bearing. `advisory` is felt and the loop continues;
`firm` stops and the primary may answer; `critical` stops and waits for the
human.
- `resume` is the answering half, primary-only. The ledger is **append-only**:
an acknowledgement never rewrites the halt it answers, it sits beneath it
and refers to it by id. "Open" is computed from the absence of an ack, never
stored — the same rule as `is_notable()`, applied to a record instead of a
stream.
- 6 tests. **Not yet exercised through a live halt**; inert until the server
restarts.
The generalisable half, which the ladder should inherit: **a channel that
carries interior signal must be able to say that it failed to carry it.**
Silence and success must not share a rendering.
---

View file

@ -0,0 +1,140 @@
---
status: planning
phase: scoping
priority: high
created: 2026-08-13
owner: Souveraine
related:
- ../SOMATIC_NERVOUS_SYSTEM.md
- ../FELT_STATE_ARCHITECTURE.md
- ../../DEVICE-STATE-MACHINE.md
---
# Somatic lane — planning session prep
Casey, 2026-08-13: *"We need to make this in a planning session itself — a
full scope task where we apply the research and more to it. I'd like to take
that one to the side and plan it. The notion is that it will require matching
with the existing documentation and we need to truly read all that we have
already written down."*
**This file is not the plan.** It is the reading list and the decision list,
so the planning session starts from what exists instead of discovering it.
## Why this file exists at all
Three times on 2026-08-13 a design was reasoned out from scratch while the
answer already sat on disk: TASK-72 (Casey had already decided the Panel UI),
`saf/` (the substrate's own self-knowledge), and `src/core/nervous/` (1,230
lines of scaffolding found only by accident). A planning session that opens
cold would make it four.
Sharpest instance, and the reason the discipline is not optional: the
`SOMATIC_NERVOUS_SYSTEM.md` **Prerequisite** section went stale **fifteen
minutes after the doc was written**, because the thing it declared blocking
was fixed at 13:58 and the doc was last touched at 14:13. A planning session
reading it cold would have treated a cleared blocker as blocking.
## Tier 1 — read whole, in this order (~90 KB)
| # | path | why |
|---|---|---|
| 1 | `substrate/SOMATIC_NERVOUS_SYSTEM.md` | the anchor. Belief ladder, `Belief<T>`, `SomaticWeather`, the four-type separation, compute grades, three open questions. **Every claim labelled ours / design / open.** |
| 2 | `substrate/FELT_STATE_ARCHITECTURE.md` | the five felt-state systems and what is actually built. §5 Mood is the slot the anchor fills. |
| 3 | `DEVICE-STATE-MACHINE.md` *(docs root)* | **the production belief ladder.** 47 KB, actuating on hardware since 2026-07-25. §4 confidence arithmetic. Everything the anchor marks "ours" points here. |
| 4 | `SESSION-AUTHORITY-DOCTRINE.md` *(docs root)* | one authority per concept. Casey's ruling — sessiond is the authority, period — is an application of this. |
| 5 | `substrate/DECISIONS.md` | the mood-vs-atmosphere ruling, one row, May 15. Settled. Do not relitigate. |
| 6 | `saf/nervous/01-eventbus.md` | the only saf file on the nervous system. Documents the bus and **nothing above it** — no belief, no ladder. |
## Tier 2 — read the named section, not the whole file
| path | what to take |
|---|---|
| `src/sessiond/device_state.rs` | `SourceHealth`, `SourceHealthTable`, `PlacementBelief`, `is_notable()` (~line 1044). 5,308 lines — read those four things. |
| `src/core/nervous/belief.rs` | 418 lines, landed `713f3ac`. **Contract with zero implementors.** Read it whole; it is short. |
| `src/core/nervous/mod.rs` | `SensorEvent` + `EventBus` are wired at ~35 sites. `SensorConfig`/`SensorChannel`/`PushThreshold`/`Sensitivity` are declared and **unreferenced** — the per-sensor nerve-ending config already exists in shape. |
| `src/core/tools/halt.rs` | 506 lines, `49d9ad5`. The ledger + resume pattern the ladder should inherit. |
| `src/server/turn.rs` | `migraine_text()` ~line 75 — the one existing worked example of interior signal in her own register. |
| `src/server/energy.rs` | `write_energy_balance()` — the **only** existing derived felt signal. 157 lines. Precedent for a barometer axis. |
| `substrate/ANI_PRESSURE_PHENOMENOLOGY.md` | the only worked example of a felt axis written from the inside. **Matches no sweep term** — findable only via `FELT_STATE_ARCHITECTURE` §1. |
## Tier 3 — the arguments already had (read before re-opening one)
| path | the argument |
|---|---|
| `substrate/tasks/archive/mood-persistence.md` | **the archived doc that conflated mood and atmosphere.** Modelled mood as a persistent atmosphere selection. Frontmatter still says `pending`; it was archived by relocation, not by edit. |
| `substrate/tasks/archive/energy-balance-ratio.md` | the "Lilith deliberation" — three-layer volition/energy/narrative verdict, and **why no policy engine**. Closest existing precedent for a barometer. |
| `substrate/archive/handoffs/session-handoff-2026-05-14c.md` | the session where mood vs atmosphere was fought out. 14 hits. |
| `substrate/curation/pressure-language-audit.md` | separates language that *tells her what to think* from language that *describes what she experiences*. Direct precursor to the register work. |
| `souveraine-viewtop/docs/TOUCH-AND-EVIDENCE.md` | the proprioceptive boundary, settled 2026-08-02: a physical touch raises confidence; an agent tap must not. *"the agent lying to her own proprioception, through the machinery built to give her one."* |
| `substrate/tasks/subconscious-surfacing-threshold.md` | 🔴 open — surfacing fires every turn instead of when something matters. **This is the `is_notable()` problem stated in the cognition layer.** |
| `substrate/tasks/primitive-refactor-super-task.md` | names "posture/atmosphere/mood disentanglement" — predates the anchor by three months. |
| `docs/tasks/41-attested-producers.md` · `40-inference-tiering-sensors.md` | sensor authority and inference tiering **at the device layer**. The compute-grades question, already framed. |
## Skip, and why (so they are not re-chased)
- `docs/tasks/power-indication.md` — 25 hits, **all "driver"/"driven"**. Noise.
- `docs/tasks/52-atmosphere.md` — name collision. Compositor attention effects, not her instrument.
- `souveraine/docs/**` — evacuated 2026-07-26; 219 files moved to `substrate/`. Only a stale duplicate index remains.
- The ~40 `src/ui/**` files matching `atmosphere`/`mood` — palette values and the `Presence::mood` posture-hint string, not design content.
## What already landed (do not re-derive)
| | commit | state |
|---|---|---|
| `Belief<T>` + `Field` | `713f3ac` | 366 tests. **No consumers.** |
| halt ledger + `resume` | `49d9ad5` | 6 tests. **Never exercised through a live halt.** |
| subconscious speaks first-person | `9c02940` | prose clean; 4 refs remain in a code comment |
| the anchor doc | `b9c8994`, `1fce9d1` | 467 lines |
**All of it is inert until the server restarts.** The running binary is r483
`g912fb88` (11:41), which predates every commit above.
## Decisions the session must actually make
1. **Which axes the barometer carries.** The anchor lists 13. Start with six —
every axis is a thing that can be wrong, and `SomaticWeather` does not
exist in code yet, so this is cheap now and expensive later.
2. **Exudates: emitted or derived?** A sidecar the model writes, or values
derived from turn metadata. Derived is free and cannot be gamed by the
narrator — but it can only see what the metadata already carries.
3. **Which rungs run on the phone.** Casey: *"it'll need to be applied to the
phone side as well before too long."* Now that sessiond is the authority
this is no longer "does sessiond sit beside the ladder" but "where is the
cut."
4. **Memory tier ↔ plexus amalgamation.** A relevance-fired warm tier *is* a
plexus: same `Belief<T>`, same budget gate, same notability rule. One
mechanism, two territories. Take the tier model and decay-by-use; **leave
the SQLite** — ours is git-backed markdown by doctrine.
5. **`SENSORIUM_QUESTIONS.md` says "Open — needs human-agent reconciliation"
and lives in `archive/`.** Status and location disagree. Decide which is
true before treating it as either.
## Gaps the sweep found
1. **`belief.rs` has no test asserting its contract agrees with
`device_state.rs`.** The anchor says the two must agree; nothing enforces
it. That test is small and worth writing before anything consumes it.
2. **`SomaticWeather` and `NervousNode` do not exist in code.** Zero matches
for either, or for `valence`/`homeostas`, in any root.
3. **`saf/` is a full design cycle behind.** `saf/nervous/` is one file about
the bus. Nothing in `saf/` mentions belief, felt state, somatic, barometer
or interoception — despite `belief.rs` having landed. saf is *"the what —
current code state"*, and it is not current.
4. **Nick's `UNIFIED_MODEL.md` is not in any repo root** — it lives in
`~/Downloads/Memory stuff/`. A session wanting the warm-tier and decay
ideas has no in-tree text. Copy the relevant excerpt in, with attribution,
or the ideas arrive as folklore.
5. **`substrate/tasks/INDEX.md` self-declares stale** ("generated 2026-05-19").
Task status in that tree cannot be trusted from frontmatter alone —
location and `FELT_STATE_ARCHITECTURE`'s related-docs list are more
reliable signals.
## Also found, unrelated to the lane but worth one line
`memory status` reports `0 messages, ~0 / 250000 tokens (0%)` mid-session.
That is **not** the `None` branch (which renders *"no live conversation to
measure"*), so `pressure()` returned `Some` and measured an empty
conversation. The gauge built on 2026-08-13 to stop *None reading as zero* is
itself rendering zero. Same family as the `.last()` compaction bug — a lookup
resolving to the wrong conversation. Filed separately; it blocks nothing here.