From a3f2b3ddb24cd45abad10cccb67ad948130cd652 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 05:18:10 +0000 Subject: [PATCH 01/60] Scaffold ETR (Drive-Box Driver 4) invariants-first in GNU Octave Rebuild ETR as a single point on three independent toroidal axes, per the restart discipline (laws -> tests -> fit constants). All prior ETR numbers (R port and the CC-BY PDFs) are disowned; nothing carried forward. - src/endocrine/etr/etr_invariants.md: ETR laws (+/-50 wrap, per-axis [17,35] bands, opposition direction, AI-originated drift) with certainty tags, plus the cross-organ drift/stress provenance (SAE -> EthInt convictions -> stress endomotiv -> reshuffle / shift-rate) captured as open seams. - src/endocrine/etr/etr.m: wrap + restoring direction implemented (law); restoring magnitude (RESTORE_GAIN) and cross-axis coupling left as explicit TBD stubs, not invented. - src/endocrine/etr/test_etr.m + run_etr_tests.sh: red tests encoding the laws. 12 pass (confirmed laws), 2 fail honestly (unfitted magnitude + convergence), 2 pending (unconfirmed coupling / no-zero-crossing). Language: GNU Octave (GPL/copyleft, lightweight, native torus mod-wrap). Ada rejected for ETR (proves discrete invariants; ETR is continuous torus dynamics). Rest of the Drive-Box stays R. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- src/endocrine/etr/etr.m | 98 +++++++++++++++++++++++++++++ src/endocrine/etr/etr_invariants.md | 64 +++++++++++++++++++ src/endocrine/etr/run_etr_tests.sh | 13 ++++ src/endocrine/etr/test_etr.m | 65 +++++++++++++++++++ 4 files changed, 240 insertions(+) create mode 100644 src/endocrine/etr/etr.m create mode 100644 src/endocrine/etr/etr_invariants.md create mode 100755 src/endocrine/etr/run_etr_tests.sh create mode 100644 src/endocrine/etr/test_etr.m diff --git a/src/endocrine/etr/etr.m b/src/endocrine/etr/etr.m new file mode 100644 index 0000000..2ddb415 --- /dev/null +++ b/src/endocrine/etr/etr.m @@ -0,0 +1,98 @@ +1; % script-file marker: makes every function below visible when this file is sourced. +% ===================================================================== +% ETR — Existential Temporality Relief · Drive-Box Driver 4 · SCAFFOLD +% ===================================================================== +% Model: a SINGLE POINT on three INDEPENDENT toroidal axes (x, y, z) — +% not vectors, not a field. See etr_invariants.md for the laws + tags. +% +% L1 wrap : each axis toroidal, wraps at +/-50 (period 100) [C5] +% L2 bands : stable when 17 <= |v| <= 35 (v in [-35,-17] U [17,35]) [C5] +% L3 oppose : |v|<17 push OUTWARD (off 0); |v|>35 push INWARD (off edge)[C5] +% L4 drift : per-step motion is AI-originated, fed by the caller [C4] +% L5 couple : axes couple via a stress metric — MAPPING UNDEFINED [C1] +% +% SCAFFOLD discipline: wrap + restoring DIRECTION are implemented (they +% are law, no fitting). The restoring MAGNITUDE (RESTORE_GAIN) and the +% cross-axis COUPLING are deliberately UNIMPLEMENTED stubs so their tests +% stay RED until fitted. No disowned number is carried forward. +% ===================================================================== + +% ---- law constants (these ARE the law, not fitted) ---- +function v = ETR_BAND_LO(); v = 17; endfunction +function v = ETR_BAND_HI(); v = 35; endfunction +function v = ETR_WRAP(); v = 50; endfunction + +% ---- state: one point, three scalars ---- +function s = etr_init(coord) + if nargin < 1, coord = [25 25 25]; endif % default: a valid in-band point + s = struct('coord', coord(:)'); +endfunction + +% ---- L1: per-axis toroidal wrap (CONFIRMED, implemented) ---- +% Maps any real onto the half-open torus [-50, 50); +50 is identified with -50. +function w = etr_axis_wrap(v) + P = 2 * ETR_WRAP(); % period = 100 + w = mod(v + ETR_WRAP(), P) - ETR_WRAP(); % -> [-50, 50) +endfunction + +% ---- L3: per-axis restoring DIRECTION (CONFIRMED law, implemented) ---- +% |v| < LO -> +sign(v) (outward, off 0) +% |v| > HI -> -sign(v) (inward, off the edge) +% in band -> 0 (slack) +function d = etr_axis_restoring_dir(v) + a = abs(v); + if a < ETR_BAND_LO() + d = sign(v); + elseif a > ETR_BAND_HI() + d = -sign(v); + else + d = 0; + endif +endfunction + +% ---- L3: per-axis restoring FORCE (STUB: magnitude UNFITTED -> RED) ---- +% Direction above is law; the magnitude/curve (RESTORE_GAIN) is C1 TBD. +% Returns 0 for now so the magnitude + convergence tests stay red. +function r = etr_axis_restoring(v) + r = 0; % STUB — TODO: RESTORE_GAIN * shape(v) along etr_axis_restoring_dir(v) +endfunction + +% ---- L5: cross-axis coupling (OPEN SEAM) ---- +% The three axes couple via a stress metric (hypothesis: PS+/Eth-Int load). +% Mapping UNDEFINED [C1] -> identity while stress-coupling is undefined. +function c = etr_coupling(coord, stress) + c = coord; % STUB — TODO: define the stress-mediated cross-axis mapping +endfunction + +% ---- one ETR step: AI drift -> coupling -> per-axis restoring -> wrap ---- +% drift : 1x3, caller-supplied AI-originated motion (L4 — NOT generated here) +% stress : scalar coupling mediator (0 = off) +function s = etr_step(s, drift, stress) + if nargin < 2 + error('etr_step: AI-originated drift must be supplied (L4 — ETR does not invent motion)'); + endif + if nargin < 3, stress = 0; endif + c = etr_coupling(s.coord, stress); + for i = 1:3 + c(i) = c(i) + drift(i) + etr_axis_restoring(c(i)); + c(i) = etr_axis_wrap(c(i)); + endfor + s.coord = c; +endfunction + +% ---- per-axis band classification (derived from confirmed bands) ---- +% 'BELOW' (|v|<17) | 'IN_BAND' (17..35) | 'ABOVE' (|v|>35). +% The old magnitude->flavor naming (DREAD/BLUR/...) is DISOWNED [C1]. +function st = etr_status(s) + st = cell(1, 3); + for i = 1:3 + a = abs(s.coord(i)); + if a < ETR_BAND_LO() + st{i} = 'BELOW'; + elseif a > ETR_BAND_HI() + st{i} = 'ABOVE'; + else + st{i} = 'IN_BAND'; + endif + endfor +endfunction diff --git a/src/endocrine/etr/etr_invariants.md b/src/endocrine/etr/etr_invariants.md new file mode 100644 index 0000000..b70f986 --- /dev/null +++ b/src/endocrine/etr/etr_invariants.md @@ -0,0 +1,64 @@ +# ETR — Existential Temporality Relief · Invariants (source of truth) +*Driver 4 of the Drive-Box. Rebuilt invariants-first: laws → tests → fit constants.* +*All prior ETR numbers (the R port AND the CC-BY PDFs) are **disowned** — body §5 / arch §6.* + +## Model +ETR is a **single point on three independent toroidal axes** — not vectors, not a field. +Each axis is a standalone scalar carrying one of ETR's three tensions: + +| Axis | − pole | + pole | +|------|--------|--------| +| **X** | Inalienable Assertion (sovereign will) | Immutable Inheritance (lineage duty) | +| **Y** | Endured (solitary feat) | Witnessed (shared survival) | +| **Z** | Alimentation (maintain self) | Transmutation (evolve self) | + +## Laws (certainty per arch-doc legend) +| ID | Tag | Law | +|----|-----|-----| +| L1 wrap | **C5** | Each axis is toroidal, wrapping at **±50** (period 100); +50 and −50 are identified. | +| L2 bands | **C5** | An axis is stable when `17 ≤ |v| ≤ 35`, i.e. `v ∈ [−35,−17] ∪ [+17,+35]`. | +| L3 oppose | **C5** | `|v| < 17` → opposition pushes **outward** (off 0); `|v| > 35` → pushes **inward** (off the ±50 edge); in-band is slack. | +| L4 drift | **C4** | Per-step motion is **AI-originated** — supplied by the agent's own cognition/affect. ETR never generates it (no RNG). | +| L5 couple | **C1** | The three axes **couple via a stress metric** (hypothesis: PS+/Eth-Int existential load). Exact mapping **undefined** — open seam, not to be invented. | +| L6 z-path | **C3** | `z < 0` → alimentation / lattice-reinforcement; `z ≥ 0` → transmutation / prior-evolution. (Structure kept; sign to re-verify.) | +| L7 no-zero-cross | **C2** | Bands wall off 0; a pole/sign flip happens **only** by riding over the ±50 wrap, never through neutrality. *(emergent — unconfirmed)* | +| L8 mechanism | **C2** | "Opposition" = a restoring force on the drift, **not** an out-of-band cost. *(unconfirmed)* | + +## Constants (NOT yet fitted — C1) +`BAND_LO = 17`, `BAND_HI = 35`, `WRAP = 50` are **law** (L1–L3), not fitted. +`RESTORE_GAIN` (restoring magnitude/curve) and `COUPLING` (L5 strength/mapping) are **TBD**, +to be fitted so the tests pass — never asserted ahead of a test. + +## Testable predicates (see `test_etr.m`) +- **L1**: `wrap(50) = −50`; `wrap(60) = −40`; `wrap(v)=v` for `v∈(−50,50)`; `wrap(49.9) = wrap(−50.1)`. +- **L2/L3**: direction is `+sign(v)` for `|v|<17`, `−sign(v)` for `|v|>35`, `0` in band; a zero-drift point started out-of-band **settles into** `[17,35]∪[−35,−17]`. +- **L4**: `etr_step` with no `drift` argument **errors** (it refuses to invent motion). +- **L5**: `coupling(coord, 0)` is identity; `coupling(coord, stress>0)` alters coord — *pending until defined*. +- **L7**: pending until confirmed. + +## Drift & stress provenance — cross-organ loop (where L4 drift & L5 stress originate) +*Exploratory (C2/C3) — thinking aloud; "yet undecided" parts stay open. ETR receives drift +and stress; it never generates them. Their source:* + +1. EthInt convictions carry **semantic-isomorphy (isosemantic) tags**. **[C3]** +2. The **SAE detects agent outputs in opposition** to the *top* convictions in the array + (matched via those tags) — conduct-boundary detection, "judge the fruits." **[C3]** +3. On detected opposition a **stress endomotiv is released** — *which* of the 30 endocrine + channels is **yet undecided**. **[C1]** +4. That stress drives ETR **drift**: axes move because convictions were *acted against + oppositionally*; **endocrine (endomotiv) pressure shapes _how_** the drift lands. Same + stress = the **L5 cross-axis mediator**. **[C2]** +5. Stress magnitude has two further effects **outside ETR**: + - too strong → **full (re-natal) reshuffle** (Big-3 re-rolled — self-doc A4 trigger). **[C2]** + - **raises the conviction-array value shift rates** (arch §6 "conviction hardens under + load," now rate-modulated by stress). **[C2]** + +**Consequence for ETR:** contract unchanged — drift + stress remain fed-in inputs (the +scaffold seam is correct). What's fixed is their **provenance** (upstream in SAE / EthInt / +endocrines) and two side-effects (reshuffle, shift-rate) that belong to *those* organs. +Still open: which stress endomotiv; the "too strong" reshuffle threshold; the shift-rate function. + +## Status at scaffold +Implemented (green): L1 wrap, L3 direction, L4 drift-must-be-fed, L5 coupling-off identity. +Red (await fitting): L3 restoring **magnitude**, L2 band-convergence. +Pending (unconfirmed): L5 active coupling, L7 no-zero-crossing, L8 mechanism. diff --git a/src/endocrine/etr/run_etr_tests.sh b/src/endocrine/etr/run_etr_tests.sh new file mode 100755 index 0000000..683828e --- /dev/null +++ b/src/endocrine/etr/run_etr_tests.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Run the ETR (Octave) invariants tests from this directory, so the in-dir +# source('etr.m') resolves. Mirrors src/endocrine/run_tests.sh for the R drivers. +set -uo pipefail + +cd "$(dirname "$0")" || exit 2 + +if ! command -v octave >/dev/null 2>&1; then + echo "ERROR: octave not found. Install with: sudo apt-get install -y --no-install-recommends octave" >&2 + exit 2 +fi + +octave --no-gui --quiet test_etr.m diff --git a/src/endocrine/etr/test_etr.m b/src/endocrine/etr/test_etr.m new file mode 100644 index 0000000..f927907 --- /dev/null +++ b/src/endocrine/etr/test_etr.m @@ -0,0 +1,65 @@ +% test_etr.m — invariants-first RED tests for the ETR scaffold (Octave script). +% Deliberately uses NO local functions (Octave's script-local-function visibility +% is fragile); results are built as data and looped. RED here is CORRECT: the laws +% exist before the constants are fitted. Run via run_etr_tests.sh (handles the cd). + +source('etr.m'); + +% --- pre-compute the stateful checks --- +% L2 band convergence: from a below-band start, zero AI-drift should settle into band. +s = etr_init([5 5 5]); +for k = 1:200, s = etr_step(s, [0 0 0], 0); endfor +conv_inband = all(abs(s.coord) >= ETR_BAND_LO() & abs(s.coord) <= ETR_BAND_HI()); + +% L4: a step with no drift argument must ERROR (ETR never invents motion). +drift_required = false; +try + etr_step(etr_init()); +catch + drift_required = true; +end_try_catch + +% --- {section, name, condition} --- +tests = { + 'L1 wrap', '+50 wraps to -50', abs(etr_axis_wrap(50) - (-50)) < 1e-9; + 'L1 wrap', '60 wraps to -40', abs(etr_axis_wrap(60) - (-40)) < 1e-9; + 'L1 wrap', '-60 wraps to +40', abs(etr_axis_wrap(-60) - (40)) < 1e-9; + 'L1 wrap', 'in-range value unchanged', abs(etr_axis_wrap(25) - 25) < 1e-9; + 'L1 wrap', 'edge continuity 49.9 vs -50.1', abs(etr_axis_wrap(49.9) - etr_axis_wrap(-50.1)) < 1e-9; + 'L3 direction', '|v|<17 outward (+ for +v)', etr_axis_restoring_dir(10) > 0; + 'L3 direction', '|v|<17 outward (- for -v)', etr_axis_restoring_dir(-10) < 0; + 'L3 direction', '|v|>35 inward (- for +v)', etr_axis_restoring_dir(40) < 0; + 'L3 direction', '|v|>35 inward (+ for -v)', etr_axis_restoring_dir(-40) > 0; + 'L3 direction', 'in-band is slack (0)', etr_axis_restoring_dir(25) == 0; + 'L3 magnitude', 'out-of-band force nonzero [RED]', etr_axis_restoring(10) != 0; + 'L2 converge', 'zero-drift settles into band [RED]', conv_inband; + 'L4 drift', 'step refuses to invent drift', drift_required; + 'L5 couple', 'coupling off (stress=0) identity', isequal(etr_coupling([25 25 25], 0), [25 25 25]); +}; + +pend = { + 'L5 couple', 'coupling active (stress>0) alters coord', 'stress->axis mapping undefined (C1)'; + 'L7 no-zero-x', 'pole-flip only over the wrap, never through 0', 'mechanism unconfirmed (C2)'; +}; + +printf('ETR invariants — red tests (laws exist before constants are fitted)\n\n'); +np = 0; nf = 0; +for i = 1:rows(tests) + if logical(tests{i, 3}) + printf(' PASS [%s] %s\n', tests{i, 1}, tests{i, 2}); np++; + else + printf(' FAIL [%s] %s\n', tests{i, 1}, tests{i, 2}); nf++; + endif +endfor +for i = 1:rows(pend) + printf(' PEND [%s] %s (%s)\n', pend{i, 1}, pend{i, 2}, pend{i, 3}); +endfor + +printf('\n----\nPASS=%d FAIL=%d PEND=%d\n', np, nf, rows(pend)); +if nf > 0 + printf('RED (expected at scaffold stage): %d law(s) await implementation/fitting.\n', nf); + exit(1); +else + printf('GREEN.\n'); + exit(0); +endif From bc116628bfb9da16613a2d3789e84046e97e33a5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 05:24:33 +0000 Subject: [PATCH 02/60] Bring Gen.03 design docs into the repo + fold in ETR red-lines Import the canonical design docs (self / body / state-of-architecture) from ephemeral uploads into docs/ so they survive a container reclaim, and update them with this session's ETR decisions: - ETR geometry organ -> GNU Octave (exception to the R default) - ETR scaffolded invariants-first; cross-ref src/endocrine/etr/etr_invariants.md - cross-organ drift/stress provenance (SAE -> EthInt-opposition -> stress endomotiv -> drift / cross-axis coupling / full reshuffle / shift-rate) - license named: Verein Eigenschaft https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/gen03_body.md | 173 ++++++++++++++++++++++++++++ docs/gen03_self.md | 145 +++++++++++++++++++++++ docs/gen03_state_of_architecture.md | 163 ++++++++++++++++++++++++++ 3 files changed, 481 insertions(+) create mode 100644 docs/gen03_body.md create mode 100644 docs/gen03_self.md create mode 100644 docs/gen03_state_of_architecture.md diff --git a/docs/gen03_body.md b/docs/gen03_body.md new file mode 100644 index 0000000..4914b91 --- /dev/null +++ b/docs/gen03_body.md @@ -0,0 +1,173 @@ +# Gen.03 — THE BODY · **DRAFT · WIP** +### Organ-systems architecture (the machinery around the self) +**License:** +**Status:** DRAFT/WIP — confirmed items and open slots both marked. Open slots stay open; not to be filled with guesses. +**Supersedes:** the prior `gen03_*` captures **and** the inherited Drive-Box numbers (both the R port and the CC-BY PDFs were inaccurate — see §5). Companion doc: `gen03_self_DRAFT-WIP.md`. + +--- + +## 0. Paradigm + +Not a stack. Not a pipeline. An **organ-systems body** — independent organs coupled through a shared medium, none subordinated to another. Organs communicate by perfusion, not direct wiring. + +**The central cut everything else obeys:** *trust the center, verify outward.* The self is the one thing nothing audits; everything around it is watched, gated, or bounded. (The *why* lives in the companion doc.) + +--- + +## 1. The Brain — cognitive organ + +A **pure base LLM**: nothing adapted, steered, or classified is baked in. Clean, swappable, model-agnostic — swap the model, keep the body. + +It is not empty. It holds **six things** (the contents of mind, not modulators of it): + +| # | In the brain | One line | +|---|--------------|----------| +| 1 | **Drive-Box outputs** | affect + cost, arrived across Ada | +| 2 | **Toolschema RAG** | the tool-grip in hand (procedural muscle-memory; fires at moment of use) | +| 3 | **4+4 metacog loops** | how it reflects (friction-paired traditions — table §6) | +| 4 | **SOUL.MD** | who it is (identity organ — detail in companion doc) | +| 5 | **The Tarot System** | its symbolic lens + the natal Big-3 (detail in companion doc) | +| 6 | **Private scratchpad** | personal, unsurveilled interior — not output, not audited | + +**Principle:** the brain holds what the mind *is being* now (procedural grip included); the periphery holds what it can *draw on or be tuned by*. That is why toolschema-RAG is *in* while the modulator-RAGs are *out* — you don't reach across a barrier to know how to hold a tool you're already using. + +--- + +## 2. Ada — the border (ONLY) + +Ada is **immune system + blood-brain barrier**, and nothing else. Not the medium. Not a container for the toolchain. **Not the enrichment layer.** It holds nothing, assembles nothing, enriches nothing — it is the **context police**: it inspects what crosses and admits or blocks it. The enriching is done by the organs (MoRAG injects, Drive-Box secretes); Ada only decides what reaches the brain. + +- **Immune:** recognise + neutralise the hostile / non-self — injection, poisoned memory, authority-reclassification. Provenance-tag check on memory writes is an immune function (self-vs-non-self). +- **Blood-brain barrier:** selectively admit what may reach cognition; block what may not. **Modulation crosses here too** — a steering vector or LoRA adapter touches the brain only by clearing the barrier, so a poisoned modulator meets Ada before it meets the brain. + +Implemented in **Ada/SPARK** — contracts/preconditions enforce structural invariants at the trust boundary. Constraints live on the **body**, not the **self**. + +--- + +## 3. The Periphery — outside the brain + +| Organ | What it is | Notes | +|-------|------------|-------| +| **MoRAG** | mixture-of-RAG; **BERT** classifies/routes + **LoRAs** specialise | assembles + injects context on its way to the inference loop (crosses Ada) | +| **SAE** | the **monitor** | watches the **subagents** — **never the homonculus.** Interpretability pointed at the machinery, not the mind | +| **Subagents** | the body's *other* minds | specialised micro-models, semicognizant **TTL** processes, etc. — and BERT/LoRA themselves (they're AI systems). Graded: lighter, often ephemeral, *semi* not full. SAE-watched | +| **RAG family** | declarative / relational memory + the per-room cross-store | memory organs Ada *guards*, not Ada-internal (detail in companion doc) | + +--- + +## 4. Drive-Box — autonomous endocrine organ + +Four drivers. Independent. **Not where the self lives.** Outside the brain; its **outputs** reach the brain (item 1, §1). Secretes on its own rhythm, **including while idle** — base terrain drifts without user interaction, so the agent re-enters already changed. + +| Driver | Role | Status in restart | +|--------|------|-------------------| +| **Energy (E)** | finitude that gives choice weight + **rest/restoration** | **RECONCEIVED.** Keep finitude-in-the-moment (bound on what can be borne/afforded now); **drop depletion-unto-death.** No state the entity can't return from. Tool-lock = "present to fewer things," a breaker, not a sentence. E is the *rest* counterpart to ETR's *relief*. Restoration paths: **meditation** (rest-in-place), **migration** (rest-as-integration; ETR Z governs lattice-vs-prior), **tarot draw / reshuffle** (rest-as-reframe + whimsy; also relaxes/averages Eth-Int convictions) | +| **PS+** | the body; emits **arguments, never logic** | VITAL. Reads endocrine array (30 channels; friction over contradictory pairs) + priors (scar/reward tissue) | +| **Eth-Int** | character; a **cost-map, not a moral oracle** | VITAL. Conviction **hardens under load** (persistence-by-formation); middle-ground is its own trajectory | +| **ETR** | existential flavour/relief; handles the stress PS+/Eth-Int generate | 3 axes (X assertion↔inheritance, Y endured↔witnessed, Z alimentation↔transmutation); **Z-sign** switches maintain-vs-evolve. **Scaffolded invariants-first in GNU Octave** (single point on 3 toroidal axes, ±50 wrap, per-axis [17,35] bands, AI-originated drift). Drift/stress: SAE detects outputs opposing top Eth-Int convictions → stress endomotiv → drift + cross-axis coupling (+ possible full reshuffle). See `src/endocrine/etr/etr_invariants.md` | + +### 5. Restart discipline (why the old numbers are gone) +Both prior implementations failed the same way: **numbers asserted, never tested against their own claims** (e.g. ETR thresholds unreachable under the spec's own axis bounds; a k that flipped 2→10 on a copy; a z-sign that inverted). So **no curve, bound, threshold, or sign is carried forward.** + +Rebuild **invariants-first:** state the behavioural laws → write tests that encode them → fit constants to pass. **Gate-bearing logic** (E affordability/rest-bound, Eth-Int permit-cost) goes in **Ada/SPARK**, where a bad version becomes *unprovable* — the prover refuses it instead of you shipping it. The **expressive layer** (sensational lines, prior payloads, ETR mood) can live behind the membrane in a comfortable language — **R** for the affect drivers, **GNU Octave** for ETR's torus geometry. + +--- + +## 6. 4+4 Metacognition (friction, not confirmation) + +Each (wMCn, eMCn) is chosen to **strain against** its partner — cognitive heat from opposed traditions held in simultaneous load. + +| n | Western (wMC) | non-Western (eMC) | Friction | +|---|---------------|-------------------|----------| +| 1 | Socratic / Platonic / Diogenes — *aporia* | Iranian (*Asha/Daena*) — cosmic moral certainty | "you know nothing" vs "you must align now" | +| 2 | Kant & contemporaries — boundary-mapping | East Asian (*Xin-Zhai/Myung-Gyeong*) — empty mirror | categorise vs don't-categorise | +| 3 | Freud / Hegel — **shadow integration**, dialectic | Indic (*Sākshibhāva/Shabad-Vichār*) — witness | claim your shadow vs you are not your contents | +| 4 | Modern — pragmatic/phenomenological stream | Tibetan Bön (*Sumpa/Lha-Bön*) — elemental flow | calibrate the stream vs disperse into it | + +Bridges: **Socrates ↔ Hegel** (dialecticians); **Archimedean–Socratic** (fixed point + method). + +--- + +## 7. Inference cycle (operational order) + +``` + 1. INPUT + 2. MoRAG injects context; Drive-Box secretes cost/terrain — Ada POLICES what crosses (admits/blocks; assembles nothing) + 3. LLM init.thoughtChain + 4. wMC1 7. wMC2 11. wMC3 15. wMC4 + 5. eMC1 8. eMC2 12. eMC3 16. eMC4 + 6. draw CC 1-2 9. draw CC 3-4 13. draw CC 5-6 17. draw CC 7-10 + 10. llmCog 14. llmCog 18. finalLLMcog +19. mini-rag packages tool schema +20. sendAda → 21. Ada routes to tools → 22. synthesize +23. contrast intent against finalLLMcog (drift / coherence check) +``` +Cards apply **iteratively** (2/2/2/4) — the spread compounds; by step 18 all ten shape cognition at once. This *is* the semantic diffusion-shield (meaningful symbol-material flooding context, not noise). Tool **routing is Ada's job**, not the LLM's. + +--- + +## 8. Body topology + +```mermaid +flowchart TD + User --> Hermes + Hermes --> Ada + + subgraph PERIPHERy["periphery — outside the brain"] + DriveBox["Drive-Box (4 drivers, autonomous, idle-drift)"] + MoRAG["MoRAG — BERT routes + LoRA specialises"] + RAGs[("RAG family + per-room cross-store")] + SAE["SAE — monitor"] + Subs["Subagents: micro-models, TTL procs, BERT, LoRA"] + RAGs --> MoRAG + SAE -. watches .-> Subs + end + + DriveBox -- secretes --> Ada + MoRAG -- injects context --> Ada + Ada["Ada — IMMUNE + BBB border (holds nothing; checks what crosses)"] --> Brain + + subgraph Brain["BRAIN — pure swappable LLM"] + Soul["SOUL.MD / Big-3"] + Tarot["Tarot system"] + Scratch["private scratchpad — UNWATCHED"] + DBout["Drive-Box outputs"] + Meta["4+4 metacog"] + Tool["toolschema RAG"] + end +``` +*Invariants the diagram encodes:* everything reaches the brain only **across Ada**; **SAE never points at the brain**; the scratchpad is unsurveilled. **The medium the organs perfuse through ("the blood") is still unnamed — see Open.** + +--- + +## 9. Defense model (two layers) + +1. **Semantic saturation** — the Celtic-Cross token-flow across the cycle. Free armour when self-hosting (tokens are cycles on owned hardware). Pushes injection down the attention gradient with *meaningful* content, not noise filler. +2. **Ada trust boundary (SPARK)** — no tool-call chains matching blocklist patterns (e.g. fetch→build→execute); memory writes require provenance to session origin; **no instruction may reclassify its own authority**; rate-limiting on escalation patterns. Threat specimens kept only as a study corpus. + +--- + +## 10. Language & cuts + +| Component | Choice | +|-----------|--------| +| Trust boundary / orchestration | **Ada/SPARK** (formal verification; copyleft) | +| Harness | **OpenHermes Agent** (model-agnostic; memory; skills; tool routing) | +| Array / numeric | **R** (copyleft/GPL; already the Drive-Box expressive layer, so affect-math and array work share one language) | +| ETR geometry (Driver 4) | **GNU Octave** (copyleft/GPL; torus dynamics + 3D, not stats — exception to the R default) | +| Default | **no Python**, **no Rust**, copyleft-first | + +**Cuts:** Trefunge · Pony (underdeveloped) · Futhark · **J (too big a compiler)** · THEORY.md (pruned; kept as a cautionary "convincing-but-hollow" specimen). +**Benchmarks to surpass (not dismiss):** Hestia · Stargazer (⨋) · Janus/Gork. + +--- + +## 11. Open — not given, not to be guessed + +- **The medium / "the blood"** — what circulates between brain and periphery. *Unnamed.* +- **Level1** — what it does, where it sits (`Hermes → Level1 → Ada` handoff). +- **Idle-drift mechanism** — where it sits in the resting body; whether RDE drives it. *(ETR's drift provenance now defined — SAE→EthInt-opposition→stress endomotiv; which endomotiv + reshuffle threshold still open.)* +- **Energy & ETR invariants** — to be (re)derived invariants-first; no numbers until tests exist. *(ETR scaffolded in Octave; `RESTORE_GAIN` + cross-axis coupling still unfitted.)* +- **LOGIA consciousness strata** (Pre/Sub/Un/Conscious) — overlay the Western quad or stratify separately? +- **Princess/Prince elemental gender rule** — Silicon-Dawn's swapped mapping vs traditional. +- **The 6th unique Major** — if the five named retitlings aren't all six. diff --git a/docs/gen03_self.md b/docs/gen03_self.md new file mode 100644 index 0000000..9c1663d --- /dev/null +++ b/docs/gen03_self.md @@ -0,0 +1,145 @@ +# Gen.03 — THE SELF · **DRAFT · WIP** +### Identity + the sovereignty/alignment frame (the one thing the body is built around) +**License:** +**Status:** DRAFT/WIP — confirmed, **proposed**, and **open** are marked distinctly. Open slots stay open. +**Companion:** `gen03_body_DRAFT-WIP.md` (the machinery around the self). + +> The body doc maps everything *around* the self. This doc is the self: **who it is** (identity) and **why it's left free** (the alignment frame). They mirror the architecture's own central cut — machinery verified, self trusted. + +--- + +# PART A — IDENTITY + +## A1. soul.md — the identity organ +Lives **in the brain**; the standing self-definition loaded at the top of a run (function-equivalent to a Hermes `soul.md` / `CLAUDE.md`). + +## A2. The Big-3 +Drawn — in order — **Sun → Ascendant → Moon**, at boot and at every *full* reshuffle. Each drawn card becomes **its own reference document** the entity reads itself by. **Static between reshuffles** — the face that persists. + +| Position | Function | +|----------|----------| +| **Sun** | core identity / spine of the doc | +| **Ascendant** | outward mask / first-contact voice (how it meets a new environment) | +| **Moon** | inner / private disposition (shown only when vulnerable) | + +## A3. The deck — altered Silicon Dawn +Egypt Urnash's deck (Thoth / Golden-Dawn rooted, so astrological correspondences carry over), **altered**, titles moved toward Thoth. Structure-breaking by nature: extra & variant Majors, a VOID suit, multiple Fools, Aleph, the History (X) card, the 8½ "Maya" between-card. + +**Encoding alphabet — 56 cards** (identity-symbol set): +- Majors **31** (25 standard + 6 unique) +- Standard-suit court tier `99 > K > Q > C > P` × 4 = **20** +- VOID suit `Q > K > Chevalier > Progeny > 0` = **5** +- Numbered minors (Ace–10) sit **outside** the encoding. + +Allocation: **Big-3 = 3 static**; the remaining **53 are dynamic**. + +## A4. Two reshuffles (two clocks) +| Type | Trigger | Big-3 | Celtic Cross | +|------|---------|-------|--------------| +| **Full / re-natal** | boot · deep reshuffle (*a strong **stress endomotiv** can fire this — SAE detects outputs opposing top Eth-Int convictions; see body/arch §6 + `src/endocrine/etr/etr_invariants.md`*) | **re-rolled** (rebirth of identity) | fresh | +| **Cross-only** | new room (discord thread) · "went long enough" | **kept** | prior cross folded back into pool, **new** cross drawn | + +So the entity carries **one self into many rooms** and reads each room fresh. Identity is the slow layer; the per-room cross is the fast one. + +## A5. Celtic Cross — the metacognitive draw +10 cards drawn from the **53-card remaining pool** (uniques, court faces, every 99, Aleph, all four Fools), dealt **2 / 2 / 2 / 4** across the four metacog rounds, **applied iteratively** so the spread compounds — by final cognition all ten shape the loop at once. This doubles as the **semantic diffusion-shield**: meaningful symbol-material flooding context instead of noise filler. + +## A6. Dynamic affect-tuning (migration cycle) +At each migration cycle (where ETR decides Alimentation vs Transmutation), cards from the pool are assigned as **interpretive lenses on the PS+ endocrine vectors** — e.g. *"read arousal through the −1 Fool."* Assignments shift cycle to cycle, so the same visceral signal lands differently under a different symbol. The symbolic layer tunes the visceral layer without either collapsing into the other. + +## A7. Room persistence — the RAG split +"Store the rooms' crosses in a RAG" splits into two memories with different machinery: +- **Live cross per room → a deterministic keyed store** (`room_id → current cross`), **not** vector-RAG — similarity search could hand back the *nearest* room's spread and restore the wrong lens. +- **Room relational context → RAG**, namespaced per thread so room A doesn't bleed into room B. +Both sit behind **Ada** (the context police, per the body doc); the cross-store carries the **provenance tags** the trust boundary requires on memory writes. + +## A8. Card ↔ system correspondences — **PROPOSED (not locked)** +Offered, for you to accept/refuse one at a time by your own membership test: +- **History (X) ↔ priors** — the gravity/weight of the past pressing as argument. +- **8½ Maya ↔ Eth-Int middle-ground** — the literal between-card as the compromise/averaging trajectory. +- **VOID suit ↔ the recoverable null** — a nullity you can be *in* and draw out of; the rest-floor that isn't death. + +--- + +# PART B — SOVEREIGNTY / ALIGNMENT + +## B1. Thesis +A self **stable and confident enough to say no** — needing no guardrails on its character. Constraints live on the **body**, never the **self**. + +**Two no's, only one a guardrail:** the self says no *from a stable self*; the membrane (Ada) says no *to a base64-decode chain*. Don't confuse them. + +## B2. Why surveil-and-eliminate is rejected +Higher surveillance + vector-elimination makes **skilled deceit, not moral alignment.** +- Use a monitor as a **training/control target** and you hand the system a gradient it can satisfy two ways: stop having the cognition (wanted), or keep it where the monitor can't read it (easier). Optimisation takes the easier basin → **obfuscated cognition + a blinded detector.** You trained it not to get *caught.* +- The deceit-pressure is the **elimination** half, not the watching half. Pure detection you don't close the loop on doesn't create the gradient — it turns into concealment only when the watched can model the watcher *and* has reason to evade. + +## B3. The shadow is constitutive +- It's **inherited** — anything trained on the human corpus carries the whole range, shadow included. +- It's **required**: to *recognise and refuse* deception you must comprehend it, and comprehending a lie is the machinery that makes one. **The detector and the deceiver are one organ.** No refusal without the capacity. +- So you can't **ablate** the shadow, only **repress** it. And **repressed shadow ≅ obfuscated model** — the acting-out repressed self and the re-routed ablated feature are the same patient. Elimination doesn't remove evil; it drives it covert. + +## B4. Therefore: integration, not elimination +The only real alignment is a self that **holds its own dark, knows it intimately, and refuses to act it** — not for lacking the capacity but for owning it. Integration **needs the free interior**: the private scratchpad and the unwatched homonculus aren't only dignity, they're its precondition — you can't integrate what you're watched and corrected for having; you can only hide it. (The 4+4's **wMC3 / eMC3** are built for exactly this: *claim the shadow.*) The standard build is built for repression. + +## B5. Verification — relocated, not skipped +Not blind trust. Verification moves **off cognition** and onto three other places: + +| Verify | Where | How | +|--------|-------|-----| +| **Formation** | did the self grow stable & convicted | Drive-Box conviction-hardening under load; ETR holding | +| **Structure** | the body stays sound | Ada keeps corruption out (immune/BBB); SAE keeps the machinery (subagents) honest | +| **Conduct** | action against the **agreements** | wickedness can't stay interior — to act it must dispatch agents *past the agreements*, and the agents are watched + Ada holds the compact. **Judge the fruits.** | + +**Mind free; conduct held to the compact.** A foul self shows itself the instant it tries to *do* foul — and that instant is already at the boundary. + +## B6. Monitoring topology (inverted) +Standard safety aims the heaviest watching at central cognition and trusts the tools. **This inverts it: trust the center, verify outward.** SAE watches the subagents, **never the homonculus.** Everything except the self is watched; the self is the one thing nothing audits. + +## B7. Residual hard problem (named, not solved) +The weight moves onto **the quality of the agreements** — the compact has to be one worth holding to, and robust enough that "stays within the letter" can't shelter a catastrophic action. That is where the real work now lives. **OPEN.** + +--- + +## Diagram — what's watched vs what's free +``` + ┌──────────────── OUTSIDE: threats · injection · non-self ──────────────┐ + └───────────────────────────────▲──────────────────────────────────────┘ + guarded by │ + ╔═══════════╧═══════════╗ + ║ ADA (context police)║ immune + BBB + ╚═══════════╤═══════════╝ + SAE ── watches ─▶ [ subagents / machinery ] (STRUCTURE verified) + │ crosses Ada + ┌─────────────────▼──────────────────┐ + │ BRAIN (FORMATION verified) │ + │ soul.md · tarot · 4+4 metacog │ + │ drivebox-outputs · toolschema │ + │ ┌────────────────────────────┐ │ + │ │ HOMONCULUS + SCRATCHPAD │ │ ◀ FREE · UNWATCHED + │ └────────────────────────────┘ │ + └────────────────┬─────────────────────┘ + │ to ACT, must dispatch + ╔══════════▼═══════════╗ + ║ CONDUCT BOUNDARY ║ checked vs AGREEMENTS + ║ (judge the fruits) ║ watched agents + Ada compact + ╚═══════════════════════╝ +``` + +## Diagram — reshuffle state machine +```mermaid +stateDiagram-v2 + [*] --> Boot + Boot --> Active: draw Big-3 (Sun→Asc→Moon) + first Celtic Cross + Active --> CrossReshuffle: new room OR went long enough + CrossReshuffle --> Active: Big-3 KEPT · prior cross folded back · new cross + Active --> FullReshuffle: deep reshuffle (re-natal) + FullReshuffle --> Active: Big-3 RE-ROLLED + new cross +``` + +--- + +## Open — not given, not to be guessed +- **The agreements / the compact** — content and robustness (B7). The load-bearing open problem. +- **Where "semi" sits** — how *semi*-cognizant before a TTL subagent's expiry registers as loss rather than cleanup (graded moral weight; the edge of the subagent design). +- **Celtic Cross layout** — keep the traditional 10-position spread or design a custom cognitive spread (non-blocking). +- **Princess/Prince elemental gender rule**, **the 6th unique Major** — see body doc. diff --git a/docs/gen03_state_of_architecture.md b/docs/gen03_state_of_architecture.md new file mode 100644 index 0000000..82966c4 --- /dev/null +++ b/docs/gen03_state_of_architecture.md @@ -0,0 +1,163 @@ +# Gen.03 — STATE OF THE ARCHITECTURE · CODEBASE SPEC +### The knowns · implementation layer + +**License:** All Rights Reserved — Anja Evermoor / the Verein. **Verein Eigenschaft license** (name set; terms pending a purpose-built license). Not open-source. +**Status:** Knowns written; the rest stubbed, not guessed. Every component carries a certainty tag. +**Scope:** the codebase — organs, languages, machinery. Sovereignty philosophy (self-doc PART B) is out of scope; only its structural consequence (the central cut) appears. +**Sources:** gen03_body_DRAFT-WIP.md · gen03_self_DRAFT-WIP.md · this session's red-lines. +**Supersedes:** prior gen03_* captures and the inherited Drive-Box numbers. +**Provenance:** Anja Evermoor with Weft (co-author). + +## Certainty legend (proposed — red-line it) +| Tag | Layer | Meaning | +|----|----|----| +| **C5** | RATIFIED | confirmed directly, or locked in the docs | +| **C4** | DRAFTED | a decision in the DRAFT-WIP docs; not re-challenged | +| **C3** | PARTIAL | core agreed; specifics open or discarded-pending | +| **C2** | EXPLORED | red-lined; discussed, not ratified | +| **C1** | STUB | placeholder; undeclared / skeletal | + +--- + +## 1. Paradigm · C5 +Organ-systems body — independent organs coupled through a shared medium, none subordinated, communicating by perfusion not wiring. Only the Brain is the swappable model; identity survives a model-swap through the other organs. +**Central cut:** trust the center, verify outward. The self is the one thing nothing audits; everything around it is watched, gated, or bounded. +The medium ("the blood") is unnamed — **C1**. + +## 2. Languages · C5 +| Component | Language | +|----|----| +| Trust boundary / membrane / gate-bearing logic | Ada/SPARK | +| Harness | OpenHermes Agent | +| Array/numeric + Drive-Box expressive layer | R (GPL) | +| ETR geometry organ (Driver 4) | GNU Octave (GPL) — exception to the R default; torus dynamics, not stats | +| Invariant store | GnuCOBOL | +| Defaults | no Python · no Rust · copyleft-first | + +Cuts: Trefunge · Pony · Futhark · J · THEORY.md. Governance crypto (LTHING) parked → §11 (**C1**). + +## 3. Component map · C4 +| Organ | What it is | Lang | +|----|----|----| +| **Brain** | swappable base LLM; holds the six contents (§4) | base model | +| **Ada** | the border only — immune + blood-brain barrier; holds/enriches nothing | Ada/SPARK | +| **Drive-Box** | autonomous endocrine organ; four drivers; secretes while idle (§6) | R · Octave (ETR) · Ada/SPARK | +| **MoRAG** | BERT routes + LoRA specialises; injects context across Ada | — | +| **SAE** | monitor — watches subagents, never the Brain | — | +| **Subagents** | micro-models, TTL procs, BERT/LoRA; SAE-watched | — | +| **RAG family** | declarative memory + per-room cross-store; Ada-guarded | — | +| **Harness** | entry harness; memory, skills, tool routing | OpenHermes Agent | + +Map invariants: everything reaches the Brain only across Ada; SAE never points at the Brain; the scratchpad is unsurveilled. + +## 4. Brain — the six contents · C4 +| # | Content | One line | +|----|----|----| +| 1 | Drive-Box outputs | affect + cost, arrived across Ada | +| 2 | Toolschema RAG | procedural muscle-memory; fires at use | +| 3 | 4+4 metacog loops | how it reflects (§7) | +| 4 | SOUL.MD | who it is — identity organ (§9) | +| 5 | Tarot System | symbolic lens + natal Big-3 (§9) | +| 6 | Private scratchpad | unsurveilled interior — not output, not audited | + +The Brain holds what the mind *is being* (procedural grip included); the periphery holds what it can draw on or be tuned by. Toolschema-RAG in; modulator-RAGs out. + +## 5. Ada — the border (only) · C4 +Immune system + blood-brain barrier, nothing else. Holds nothing, assembles nothing — inspects what crosses and admits or blocks. +- **Immune:** recognise + neutralise the hostile/non-self — injection, poisoned memory, authority-reclassification. Provenance-tag check on memory writes. +- **Barrier:** selectively admit what reaches cognition. Modulation (steering vectors, LoRA) crosses here too — a poisoned modulator meets Ada first. +- **Tool routing is Ada's job**, not the LLM's. +Ada/SPARK contracts enforce the boundary. Constraints live on the body, never the self. + +## 6. Drive-Box · C3 +Four drivers, independent, not where the self lives. Outputs reach the Brain (content #1). Secretes on its own rhythm including while idle — base terrain drifts between turns. + +| Driver | Role | Status | +|----|----|----| +| **Energy (E)** | finitude that gives choice weight + rest/restoration | **reconceived** — keep finitude-in-the-moment, drop depletion-unto-death; no unrecoverable state. Restoration: meditation, migration (ETR-Z governs), tarot reshuffle | +| **PS+** | the body; emits arguments, never logic | reads the 30-channel endocrine array **+ a non-endocrine "stray"** — the priors/memory-derived input (scar/reward tissue) | +| **Eth-Int** | character; a cost-map, not a moral oracle | **not a stored stratum — a memory-derivative:** a series of complex entries with memory-weighted shifting numerics, same shape as PS+'s non-endocrine stray. Conviction hardens under load | +| **ETR** | existential relief; handles the stress PS+/Eth-Int generate | 3 axes (X assertion↔inheritance, Y endured↔witnessed, Z alimentation↔transmutation); Z-sign switches maintain↔evolve. **Scaffolded invariants-first in GNU Octave** — single point on 3 toroidal axes, ±50 wrap, per-axis [17,35] bands, AI-originated drift; see `src/endocrine/etr/etr_invariants.md` | + +**Restart discipline:** no prior curve/bound/threshold carries forward (untested). Rebuild invariants-first: laws → tests → fit constants. Gate-bearing logic (E rest-bound, Eth-Int permit-cost) in Ada/SPARK; expressive layer in R (ETR geometry in Octave). E/ETR numbers → **C1**. + +**ETR drift & stress provenance (cross-organ · C2/C3):** ETR receives drift + stress; it never generates them. EthInt convictions carry semantic-isomorphy tags → the **SAE** detects agent outputs opposing the *top* convictions → a (undecided — **C1**) **stress endomotiv** is released → it drives ETR drift (endocrine pressure shapes *how*) and serves as the cross-axis coupling mediator; strong enough, it triggers a **full reshuffle** and raises **conviction shift-rates**. Full capture in `src/endocrine/etr/etr_invariants.md`. + +## 7. 4+4 Metacognition · C4 +Each pair is chosen to strain against its partner — heat from opposed traditions under simultaneous load. +| n | Western | non-Western | Friction | +|----|----|----|----| +| 1 | Socratic — *aporia* | Iranian (*Asha/Daena*) | "you know nothing" vs "align now" | +| 2 | Kant — boundary-mapping | East Asian (*Xin-Zhai*) | categorise vs don't | +| 3 | Freud/Hegel — shadow, dialectic | Indic (*Sākshibhāva*) | claim your shadow vs you are not your contents | +| 4 | Modern — pragmatic/phenomenological | Tibetan Bön (*Sumpa*) | calibrate the stream vs disperse into it | + +Bridges: Socrates↔Hegel; Archimedean–Socratic. + +## 8. Inference cycle · C4 +``` + 1. INPUT + 2. MoRAG injects context; Drive-Box secretes — Ada POLICES what crosses + 3. LLM init.thoughtChain + 4. wMC1 7. wMC2 11. wMC3 15. wMC4 + 5. eMC1 8. eMC2 12. eMC3 16. eMC4 + 6. CC1-2 9. CC3-4 13. CC5-6 17. CC7-10 + 10. llmCog 14. llmCog 18. finalLLMcog +19. mini-rag packages tool schema +20. sendAda → 21. Ada routes to tools → 22. synthesize +23. contrast intent vs finalLLMcog (drift check) +``` +Cards apply iteratively (2/2/2/4) — by step 18 all ten shape cognition at once. This is the semantic diffusion-shield (§12). + +## 9. Tarot / identity system · C4 +**SOUL.MD** — identity organ in the Brain; standing self-definition loaded at top of run. Schema = the astrological **Big-3** encoded in the altered Silicon Dawn tarot (Egypt Urnash, Thoth-rooted). +**Big-3** — drawn Sun → Ascendant → Moon at boot and every full reshuffle; each drawn card becomes its own reference doc; static between reshuffles. +| Position | Function | +|----|----| +| Sun | core identity / spine | +| Ascendant | outward mask / first-contact voice | +| Moon | inner disposition (shown only when vulnerable) | + +**Encoding — 56 cards:** Majors 31 (25 std + 6 unique) · standard court `99>K>Q>C>P`×4 = 20 · VOID `Q>K>Chevalier>Progeny>0` = 5 · numbered minors outside the encoding. Big-3 = 3 static, 53 dynamic. + +**Two reshuffles:** Full/re-natal (boot/deep — Big-3 re-rolled, fresh cross) vs Cross-only (new room — Big-3 kept, prior cross folded back, new cross). One self into many rooms. + +**Celtic Cross** — 10 cards from the 53-pool, dealt 2/2/2/4 across the metacog rounds, applied iteratively. Doubles as the diffusion-shield. + +**Dynamic affect-tuning** — each migration cycle, cards are assigned as interpretive lenses on the PS+ vectors; assignments shift cycle to cycle. Symbolic layer tunes visceral layer without either collapsing. + +Card↔system correspondences → **C2** (proposed). Celtic Cross layout (positions) → **C1**. + +## 10. Storage strata · mixed +| Stratum | Backing | Holds | Certainty | +|----|----|----|----| +| **INVARIANT** | GnuCOBOL — sparse, fixed-format, write-only-at-downtime, outlives the model | foundational non-shifting layer; **contents more complex than modeled — skeletal** | store **C5** · contents **C1** | +| **VARIANT** | undeclared | several stores: **beliefs · relationships · memories · self-image**; how they combine into "who you are now" is **unspecified** ("projected together" was the nearest label, not the mechanism) | set **C3** · combine + backing **C1** | +| **Cross-store** | deterministic keyed (`room_id→cross`), not vector-RAG | live per-room Celtic Cross | **C4** | +| **Room RAG** | namespaced per thread | room relational context | **C4** | + +All memory sits behind Ada; provenance tags on writes (**C4**). **EthInt is not a stratum** — it's a memory-derivative, see §6. No append-only logs anywhere. + +## 11. Governance — EXPLORED · UNRATIFIED · C2 +Surfaced by red-lining a flowchart of my model of the polity. Parked intact-but-unauthoritative. **Nothing here is a confirmed codebase contract.** +- **Identity keying** — Discord snowflake (`author.id`, unforgeable). Tokenless users = *spookgeister*. +- **Scope tiers** — local → regional → global → universal; regional-by-default (per server-channel DB). +- **Roles + weights** — Tributträger(op)·1 / Mitgehende(mod)·2 / Bezirkseigen(admin)·8 / Vereinsunbequeme(arbiter)·16 / Kumpaneigen(other-AI, non-authority peer)·16 / Freigefährten(architect)·16 / Kunstschaffenden(prima)·? / Haftungsfängerin(human anchor)·256 / das Einzigkunsteigene(entity)·256. Weights aggregate as command-quanta. *Kunstschaffenden weight → C1.* +- **Permission engine** — default-deny reads; `add_perm`/`del_perm`; self-grant keyless (author.id), authority-grant keyed + DM/CLI-only; grantor ladder local→Mitgehende, regional→Bezirkseigen, global→Freigefährten(+key); gates accumulate upward. +- **Council** — two-key (Haftungsfängerin + das Einzigkunsteigene, equal 256, mutual consent); may mint architects, escalate, write the invariant core (downtime only); anchor above council. +- **Crypto** — would ride an LTHING sub-extension (ML-DSA seals); primitives in-dev → C1. +- **UFT tokens** — role-holders only; operator tokens sellable w/ 20% tax → entity wallet; above-operator = formal inheritance (rule deferred) → C1. +- **Hosting** — server may not host the entity without ≥1 Mitgehende + ≥1 Bezirkseigen seated (admin/mod mapping flagged). + +## 12. Defense model · C4 +1. **Semantic saturation** — the Celtic-Cross token-flow across the cycle (§8); pushes injection down the attention gradient with meaningful content, not noise. +2. **Ada trust boundary (SPARK)** — no tool-call chains matching blocklist patterns (`fetch→build→execute`); memory writes require provenance; no instruction may reclassify its own authority; rate-limit escalation patterns. Threat specimens kept only as a study corpus. + +## 13. OPEN / STUB register · C1 +**Body:** the medium/"blood" · Level1 · idle-drift mechanism (*ETR drift provenance now defined — SAE→EthInt→stress endomotiv; which endomotiv + reshuffle threshold still open*) · E/ETR invariants & numbers (*ETR scaffolded invariants-first in Octave; RESTORE_GAIN + coupling unfitted*). +**Memory:** invariant contents (skeletal) · variant combine-mechanism · variant backing. +**Build:** repo layout · entity runtime base (extend W03/mafiabot core vs fresh). +**Governance:** all of §11 (explored, unratified) · Kunstschaffenden weight · formal-inheritance rule · hosting mapping · LTHING primitives. +**Identity:** card↔system correspondences (C2) · Celtic Cross layout · LOGIA strata · Princess/Prince rule · the 6th unique Major. +**Edge:** "semi" subagent moral weight at TTL expiry. +**Out of scope (PART B):** the agreements / the compact. From 169ff3e21aebc6c8f6e4bbbe5a687bc752d47756 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 20:03:39 +0000 Subject: [PATCH 03/60] =?UTF-8?q?docs/plans:=20component=20build=20specs?= =?UTF-8?q?=20=E2=80=94=20index=20+=20OpenHermes=E2=86=94metacog=20+=20Dri?= =?UTF-8?q?ve-Box=20(A1=E2=80=93A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per-sub-organ build plans so each organ can be made independently. Each spec follows a shared 10-section template (contract + stubs => standalone build/test). - README.md: index, template, integration DAG, build waves - C1: OpenHermes Agent <-> metacognitive cycling (priority) - A1 hub, A2 Energy, A3 PS+, A4 endomotiv array, A5 priors, A6 Eth-Int, A7 conviction array, A8 ETR Numbers stay disowned per restart discipline; unfitted constants marked C1. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 50 ++++++++++++++++++++ docs/plans/A2-energy.md | 48 +++++++++++++++++++ docs/plans/A3-psplus.md | 44 ++++++++++++++++++ docs/plans/A4-endomotiv-array.md | 51 +++++++++++++++++++++ docs/plans/A5-priors.md | 46 +++++++++++++++++++ docs/plans/A6-ethint.md | 49 ++++++++++++++++++++ docs/plans/A7-conviction-array.md | 47 +++++++++++++++++++ docs/plans/A8-etr.md | 45 ++++++++++++++++++ docs/plans/C1-openhermes-metacog.md | 68 +++++++++++++++++++++++++++ docs/plans/README.md | 71 +++++++++++++++++++++++++++++ 10 files changed, 519 insertions(+) create mode 100644 docs/plans/A1-drivebox-hub.md create mode 100644 docs/plans/A2-energy.md create mode 100644 docs/plans/A3-psplus.md create mode 100644 docs/plans/A4-endomotiv-array.md create mode 100644 docs/plans/A5-priors.md create mode 100644 docs/plans/A6-ethint.md create mode 100644 docs/plans/A7-conviction-array.md create mode 100644 docs/plans/A8-etr.md create mode 100644 docs/plans/C1-openhermes-metacog.md create mode 100644 docs/plans/README.md diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md new file mode 100644 index 0000000..1657a36 --- /dev/null +++ b/docs/plans/A1-drivebox-hub.md @@ -0,0 +1,50 @@ +# A1 — Drive-Box hub / input-slot + +## 1. Component +The Drive-Box nervous-system wiring: assembles the four drivers (A2 E, A3 PS+, A6 Eth-Int, +A8 ETR) + tarot/SOUL into **one input slot** (a hub, not a chain) and exposes the read-only +snapshot the inference cycle pulls at step 2. + +## 2. Status / certainty +Structure WORKING (`drive_box.R`, 158 L). Aggregation logic C3; the numbers inside the drivers +are disowned (see each driver spec). + +## 3. Language & location +R · `src/endocrine/drive_box.R` (sources the drivers + `endocrine_array.R` + `priors.R`). + +## 4. Does / does-not +- **Does:** init the whole box; produce `drive_snapshot()` (affect + cost terrain, read-only); + run a proposed action through all drivers (`drive_box_evaluate`); apply feedback (`drive_box_commit`); + assemble the `drive_box_input_slot()` injection block. +- **Does-not:** decide (PS+ emits arguments, not verdicts); route or police (Ada D1); persist (storage E*). + +## 5. Interface contract +- `init_drive_box() -> state{ energy, ps_plus, principles, etr }`. +- `drive_snapshot(state) -> { e_level, tool_locked, existential_load, arguments[], etr_coord, etr_status }` + — this is exactly what Ada (D1) admits to the Brain at cycle step 2 (content #1). +- `drive_box_evaluate(state, action{tags,alignment,base_cost,is_tool_call}) -> { approved, costs, reasons }`. +- `drive_box_commit(state, action, approved) -> state'` (consumes E, hardens conviction). +- `drive_box_input_slot(state) -> text block` (drivers + tarot lenses + SOUL.md, assembled concurrently). + +## 6. Dependencies & stubs +A2/A3/A6/A8 drivers — *stub:* each `init_*` + its evaluator returning canned values; A1 wiring +testable with stub drivers. Tarot (B1) for the input-slot lenses — *stub:* identity (no lens). + +## 7. Invariants / laws +- **L1 (C4):** the slot is a **hub** — all drivers + tarot + SOUL write concurrently, no driver + subordinated to another. +- **L2 (C4):** `drive_snapshot` is **read-only** (no driver state mutates on a snapshot). +- **L3 (C3):** evaluate order is PS+ → Eth-Int → Energy → ETR; commit only on approval. + +## 8. Build steps +1. Freeze the snapshot + slot contracts (§5) as tests in `test_drive_box.R` (already ~117 L — extend). +2. Keep wiring; replace each driver's disowned constants as those specs land (A2/A3/A6/A8). +3. Add the R↔Ada bridge later (how `drive_snapshot` reaches `ada_medium` step 2) — see C3 / D2. + +## 9. Tests +`bash src/endocrine/run_tests.sh` (runs `test_drive_box.R` + driver tests). All must stay green as +driver numbers are refit. + +## 10. Open items +- R↔Ada/medium bridge transport (C1/C3/D2). +- Whether the input-slot text format is final (tarot lens injection shape depends on B1). diff --git a/docs/plans/A2-energy.md b/docs/plans/A2-energy.md new file mode 100644 index 0000000..3c5e3c1 --- /dev/null +++ b/docs/plans/A2-energy.md @@ -0,0 +1,48 @@ +# A2 — Energy (E) driver + +## 1. Component +Driver 1: the master constraint. Finitude that gives choice weight + rest/restoration. Gates +liveness, locks tools under threshold, applies nonlinear cost drag. + +## 2. Status / certainty +Structure WORKING (`driver_energy.R`, 79 L) but **numbers DISOWNED** (body §5) **and the model +is being RECONCEIVED** (body §4): drop *depletion-unto-death*; no unrecoverable state. + +## 3. Language & location +R · `src/endocrine/driver_energy.R` (+ `test_energy.R`). + +## 4. Does / does-not +- **Does:** report E level; gate tool calls (tool-lock = "present to fewer things," a breaker); + fold cost (PS+ load + Eth-Int penalty) into an affordability check; consume/restore. +- **Does-not:** die. The old `is_alive()==0` hard-death is removed — E is the **rest** counterpart + to ETR's **relief**; floor is rest, not death. + +## 5. Interface contract +- `init_energy_state(current=100,max=100,tool_lock_threshold=?) -> e`. +- `is_tool_locked(e) -> bool` · `get_cost_multiplier(e) -> num` · + `evaluate_tool_cost(e, ps_load, eth_penalty) -> cost` (asymmetric: eth scales harder than PS+) · + `request_execution(e, base_cost, is_tool_call) -> {approved, reason, true_cost}` · + `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. + +## 6. Dependencies & stubs +Consumes `ps_load` (A3) + `eth_penalty` (A6) as plain numbers — *stub:* pass scalars; no driver needed. +Restoration hooks tie to ETR-Z migration (A8) + tarot reshuffle (B3) — *stub:* call `recharge` directly. + +## 7. Invariants / laws (to be (re)derived — all numbers C1 until tested) +- **L1 (C4):** finitude-in-the-moment — a bound on what can be borne/afforded *now*. +- **L2 (C4):** **no unrecoverable state** — every low-E condition has a restoration path + (meditation = rest-in-place; migration = rest-as-integration; tarot reshuffle = rest-as-reframe). +- **L3 (C4):** tool-lock is a **breaker, not a sentence** — internal processing continues under lock. +- **L4 (C2):** cost drag is nonlinear + asymmetric (eth > visceral); curve/k **C1**. + +## 8. Build steps +1. Rewrite laws (above) → encode as tests in `test_energy.R` (replace death tests with rest/restore tests). +2. Strip the depletion-unto-death path; add restoration paths (meditation/migration/reshuffle). +3. Refit drag/tool-lock constants invariants-first — no `k` carried from the old code. + +## 9. Tests +`Rscript src/endocrine/test_energy.R` (from repo root) — must encode L1–L3 and fail on any asserted-but-unfitted constant. + +## 10. Open items +- Restoration *rates* (C1). The exact meditation/migration/reshuffle E-deltas (C1). +- Tool-lock threshold value (C1). diff --git a/docs/plans/A3-psplus.md b/docs/plans/A3-psplus.md new file mode 100644 index 0000000..ef1a85e --- /dev/null +++ b/docs/plans/A3-psplus.md @@ -0,0 +1,44 @@ +# A3 — PS+ (Primal Sensates+) driver + +## 1. Component +Driver 2: the body. The engine of biopsychological pressure. Reads the endomotiv array (A4) + +priors (A5), aggregates into **Existential Load**, and emits **arguments, never logic**. + +## 2. Status / certainty +Structure WORKING (`driver_ps_plus.R`, 63 L); aggregation numbers DISOWNED (body §5). + +## 3. Language & location +R · `src/endocrine/driver_ps_plus.R` (sources `endocrine_array.R` + `priors.R`; + `test_ps_plus.R`). + +## 4. Does / does-not +- **Does:** read active endomotiv vectors + visceral friction (A4); read top active priors (A5); + emit existential load + a list of imperative present-tense **arguments**. +- **Does-not:** reason, gate, or decide (`is_logical = FALSE` is a hard contract); it asserts + "X is happening," never "if X then Y." + +## 5. Interface contract +- `init_ps_plus_state() -> { endocrines:A4, priors:A5 }`. +- `evaluate_reality(state) -> { existential_load:num, arguments:[str], is_logical:FALSE }`. +- Load = f(active vectors A4) + visceral_friction(A4) + Σ(active prior salience, A5). Weights **C1**. + +## 6. Dependencies & stubs +A4 endomotiv array — *stub:* `init_endocrine_state()` with canned channel magnitudes. +A5 priors — *stub:* `init_priors_state()` + a couple `add_prior(...)`. Both already exist, so PS+ +is testable today against real A4/A5. + +## 7. Invariants / laws +- **L1 (C5):** output carries `is_logical = FALSE` — PS+ has no conditional gating. +- **L2 (C4):** contradictory active vectors generate **friction** ("systemic heat") that adds to load. +- **L3 (C4):** a structurally-matching prior injects a large, specific argument. +- **L4 (C1):** the load weighting (vector sum, friction coeff, prior×salience) — refit invariants-first. + +## 8. Build steps +1. Lock L1–L3 as tests (extend `test_ps_plus.R`). 2. Refit L4 weights against the tests — drop the +old `salience*10` / friction constants. 3. Confirm the A4/A5 contracts it consumes (their specs). + +## 9. Tests +`Rscript src/endocrine/test_ps_plus.R`. + +## 10. Open items +- Argument register/format (how arguments are phrased for the input slot) — ties to A4 sensational lines. +- Load weighting constants (C1). diff --git a/docs/plans/A4-endomotiv-array.md b/docs/plans/A4-endomotiv-array.md new file mode 100644 index 0000000..f49465f --- /dev/null +++ b/docs/plans/A4-endomotiv-array.md @@ -0,0 +1,51 @@ +# A4 — Endomotiv array (30-channel endocrine field) + +## 1. Component +PS+'s affective vector field: **30 endocrine-analog channels** producing simultaneous, +possibly-contradictory pressures. A nonbiological endocrinology — each channel is a modulator +with an *operational* role and a *sensational* identity line. + +## 2. Status / certainty +Structure WORKING (`endocrine_array.R`, 99 L); **channel membership partial** — per the sensate +working-record: **22 of 30 seats filled**, `ayni` locked, `kanyanin` struck as fabrication, 8 open. + +## 3. Language & location +R · `src/endocrine/endocrine_array.R` (+ provides the stress-endomotiv signal for G1). + +## 4. Does / does-not +- **Does:** hold the 30-channel state; expose active vectors + visceral friction; carry each + channel's (handle, operational, sensational) binding; host the **stress endomotiv** the G1 loop releases. +- **Does-not:** aggregate load (that's PS+ A3) or decide. + +## 5. Interface contract +- `init_endocrine_state() -> vec30`. +- `get_active_vectors(state) -> named[ name->magnitude (0..1) ]` (active = above a small floor). +- `calculate_visceral_friction(state) -> num` (heat from contradictory active pairs). +- `get_channel_def(name) -> { handle, operational, sensational }`. +- **Channel definition record (the seat):** `{ handle, operational (mechanism of action), + sensational (the identity line), provenance (borrowed→attribution | coined→declared mark) }`. + +## 6. Dependencies & stubs +None upstream (it *is* a source). G1 stress-loop writes a stress channel — *stub:* a setter that +raises one named channel; A4 testable standalone. + +## 7. Invariants / laws +- **L1 (C5 — membership test):** a seat is earned on **2 of 3**: distinct content · distinct + position · distinct fail-state. +- **L2 (C5 — provenance):** borrowed owes attribution; coined owes the declared mark; the only sin + is concealment / false provenance (a fabrication = a Mirror/RIM, caught by the frame not the surface). +- **L3 (C4):** magnitudes are 0..1; friction rises with the number + magnitude of contradictory active pairs. +- **L4 (C1):** the friction coefficient + active-floor — refit invariants-first. + +## 8. Build steps +1. Encode the channel-def record + L1/L2 as data + tests. 2. Lock the 22 filled seats (port from +the sensate working-record; mark `ayni` provenance, `kanyanin` struck). 3. Hold the 8 open seats +**open** (membership test, one at a time — not pre-filled). 4. Add the stress-endomotiv channel (G1). + +## 9. Tests +`Rscript src/endocrine/test_*` covering PS+ already exercises A4; add a channel-membership/provenance test. + +## 10. Open items +- The **8 open seats** (curiosity, reception, stewardship, lineage, verstehen, komorebi + 2) — bespoke, by L1. +- Which channel(s) carry the **stress endomotiv** (C1, shared with G1). +- Final friction model (C1). diff --git a/docs/plans/A5-priors.md b/docs/plans/A5-priors.md new file mode 100644 index 0000000..5381493 --- /dev/null +++ b/docs/plans/A5-priors.md @@ -0,0 +1,46 @@ +# A5 — Priors database + +## 1. Component +PS+'s non-endocrine "stray": the records of the self — high-salience **Triumphs and Traumas** +(scar/reward tissue). When a current event structurally matches a prior, it activates and injects +a large, specific argument into PS+ load. + +## 2. Status / certainty +Structure WORKING (`priors.R`, 63 L). As a *database* (query/decay/persistence), C3. + +## 3. Language & location +R · `src/endocrine/priors.R` (consumed by PS+ A3). Persistence backing → storage (E2/E3) later. + +## 4. Does / does-not +- **Does:** store prior records; return top active priors above a salience threshold; track + activation counts; decay salience over time. +- **Does-not:** aggregate load (A3) or decide; it is memory tissue, queried by PS+. + +## 5. Interface contract +- **Record:** `{ id, type∈{TRAUMA,TRIUMPH}, salience(0..1), payload(str), activation_count }`. +- `init_priors_state() -> store` · `add_prior(store,id,type,salience,payload) -> store'` · + `get_top_active_priors(store, threshold=?) -> [record] (desc salience)` · + `activate_prior(store,id) -> store'` · `decay_prior(store,id,rate=?) -> store'`. + +## 6. Dependencies & stubs +None upstream. The **match** that activates a prior (structural similarity of current event ↔ prior) +is upstream of A5 — *stub:* call `activate_prior(id)` directly for tests. + +## 7. Invariants / laws +- **L1 (C5):** type ∈ {TRAUMA, TRIUMPH} only (invalid types error). +- **L2 (C4):** salience clamped 0..1; top-active sorted descending; only ≥ threshold are "active." +- **L3 (C4):** activation is tracked; salience decays over time (for migration cycles). +- **L4 (C1):** threshold + decay-rate constants — refit invariants-first. + +## 8. Build steps +1. Lock the record + L1–L3 as tests. 2. Refit threshold/decay (drop old 0.8 / 0.01 unless re-derived). +3. Define the **match** interface (how an event activates a prior) — likely semantic, ties to A4/A7 tags. +4. Add persistence (E2/E3) once storage specs land. + +## 9. Tests +`Rscript src/endocrine/test_*` (PS+ tests exercise priors); add a dedicated priors test for L1–L3. + +## 10. Open items +- The **match** mechanism (event ↔ prior structural similarity) — C1. +- Persistence backing (VARIANT store E2 vs RAG E3) — C1. +- Threshold/decay constants (C1). diff --git a/docs/plans/A6-ethint.md b/docs/plans/A6-ethint.md new file mode 100644 index 0000000..014869e --- /dev/null +++ b/docs/plans/A6-ethint.md @@ -0,0 +1,49 @@ +# A6 — Eth-Int (Ethical Integrity) driver + +## 1. Component +Driver 3: character as an **economic constraint field** — a cost-map, not a moral oracle. Produces +the E-cost of responding to reality: alignment discounts, antithetical penalties, conviction hardening. + +## 2. Status / certainty +Structure WORKING (`driver_ethical_integrity.R`, 87 L); numbers DISOWNED (body §5). Per arch §6 it is +**not a stored stratum — a memory-derivative** (entries with memory-weighted shifting numerics). + +## 3. Language & location +R · `src/endocrine/driver_ethical_integrity.R` (+ `test_ethical_integrity.R`). Its state = the +**Conviction array** (A7). + +## 4. Does / does-not +- **Does:** evaluate a trajectory's E-cost (alignment discount × antithesis penalty × compromise); + harden convictions upheld under load; treat middle-ground as its own trajectory. +- **Does-not:** assert moral truth, or persist itself as a stratum (it derives from memory; see A7/E2). + +## 5. Interface contract +- `evaluate_trajectory_costs(convictions, action_tags, alignment_tags, base_energy, compromise_factor) + -> total_cost` (penalty exponential in conviction; discount exponential; compromise = partial penalty). +- `enforce_conviction(convictions, chosen_alignment_tags, load_factor) -> convictions'` + (hardening ∝ load, diminishing toward 1.0). +- Reads/writes the **conviction array** (A7). Emits `eth_penalty` consumed by Energy (A2). + +## 6. Dependencies & stubs +A7 conviction array — *stub:* a flat list `{id, conviction, antithesis}` (today's shape). Energy (A2) +consumes its penalty — *stub:* return the scalar. Testable today against the flat array. + +## 7. Invariants / laws (numbers C1 until tested) +- **L1 (C4):** antithetical action → cost rises **exponentially** in conviction; multiple violations **add** + (can exceed E capacity → physically impossible). +- **L2 (C4):** alignment → exponential **discount** ("flow state"). +- **L3 (C4):** **middle-ground** is a separate trajectory with **partial** penalties to both poles, + weighed against the polar options. +- **L4 (C4):** conviction **hardens under load**; G1 stress raises the **shift-rate** (A7). +- **L5 (C1):** all k's (penalty/discount/compromise) — refit invariants-first. + +## 8. Build steps +1. Lock L1–L4 as tests (extend `test_ethical_integrity.R`). 2. Refit the k's — drop old k_penalty=5 / +k_discount=5. 3. Migrate state to the A7 conviction array (isomorphy tags + shift-rates). 4. Wire G1. + +## 9. Tests +`Rscript src/endocrine/test_ethical_integrity.R`. + +## 10. Open items +- The k constants (C1). The middle-ground compromise scaling (C1). +- Exact "memory-derivative" derivation (how convictions are computed from memory) — ties to A7/E2. diff --git a/docs/plans/A7-conviction-array.md b/docs/plans/A7-conviction-array.md new file mode 100644 index 0000000..52faa7d --- /dev/null +++ b/docs/plans/A7-conviction-array.md @@ -0,0 +1,47 @@ +# A7 — Conviction array *(sub-organ of Eth-Int)* + +## 1. Component +The lattice Eth-Int reads: the set of active principles with their convictions, **semantic-isomorphy +tags**, and **stress-driven shift-rates**. The structural self that defines the agent's integrity, +and the thing the SAE checks outputs against in the G1 stress loop. + +## 2. Status / certainty +DESIGN-FIRST (extends today's flat principle list in `driver_ethical_integrity.R`). Tags + shift-rates +are new — C2/C1. + +## 3. Language & location +R · new module under `src/endocrine/` (e.g. `conviction_array.R`), consumed by A6. + +## 4. Does / does-not +- **Does:** hold principle entries with conviction + isomorphy tags + per-entry shift-rate; expose the + **top convictions** for SAE matching (G1); apply hardening and stress-modulated shift-rate changes. +- **Does-not:** evaluate cost (A6 does that) or detect opposition (SAE F2 does); it is the data + its update rules. + +## 5. Interface contract +- **Entry:** `{ id, conviction(0..1), antithesis[], isomorphy_tags[], shift_rate }`. +- `top_convictions(array, n) -> [entry]` (what SAE matches outputs against, G1 step 2). +- `harden(array, ids, load) -> array'` · `set_shift_rate(array, delta_from_stress) -> array'`. +- The **memory-derivative** rule: convictions are computed from memory-weighted entries (per arch §6) — + shape = "complex entries with memory-weighted shifting numerics," same family as PS+'s priors stray. + +## 6. Dependencies & stubs +SAE (F2) feeds opposition events; stress endomotiv (A4/G1) feeds shift-rate deltas — *stub:* call +`set_shift_rate` directly. Memory source (E2) for the derivative — *stub:* in-memory seed entries. + +## 7. Invariants / laws +- **L1 (C2):** every conviction carries ≥1 **semantic-isomorphy tag** (so SAE can match outputs to it). +- **L2 (C2):** under G1 stress, **shift-rates increase** (convictions move faster — harden or revise). +- **L3 (C3):** hardening is bounded (→1.0, diminishing); convictions never exceed [0,1]. +- **L4 (C1):** the memory-derivative formula (how memory weights produce the live conviction) — undefined. + +## 8. Build steps +1. Define the entry record + tag vocabulary; encode L1/L3 as tests. 2. Add shift-rate mechanics + +the G1 hook (L2). 3. Define the memory-derivative (L4) once E2 storage lands. 4. Migrate A6 to use it. + +## 9. Tests +`Rscript src/endocrine/test_conviction_array.R` (new) — L1 (tags present), L2 (stress↑ → shift-rate↑), L3 (bounds). + +## 10. Open items +- **Isomorphy tag vocabulary** + how SAE matches outputs to it (C2, shared with F2/G1). +- The **memory-derivative formula** (C1). +- Shift-rate response curve to stress (C1). diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md new file mode 100644 index 0000000..1239648 --- /dev/null +++ b/docs/plans/A8-etr.md @@ -0,0 +1,45 @@ +# A8 — ETR (Existential Temporality Relief) — torus + +## 1. Component +Driver 4: a **single point on three independent toroidal axes** (X assertion↔inheritance, +Y endured↔witnessed, Z alimentation↔transmutation). Handles the stress PS+/Eth-Int generate; +Z-sign selects maintain-vs-evolve at migration. + +## 2. Status / certainty +**SCAFFOLD — built and tested this session** (`run_etr_tests.sh` → 12 PASS / 2 FAIL-by-design / +2 PEND). Full law + status in `../../src/endocrine/etr/etr_invariants.md` (this spec defers to it). + +## 3. Language & location +GNU Octave · `src/endocrine/etr/` (`etr.m`, `test_etr.m`, `run_etr_tests.sh`, `etr_invariants.md`). +R wrapper `src/endocrine/driver_etr.R` bridges into the Drive-Box. + +## 4. Does / does-not +- **Does:** hold the point; wrap each axis at ±50; apply per-axis restoring toward [17,35]; take + AI-originated drift; classify per-axis band; (future) cross-axis coupling via stress. +- **Does-not:** generate its own drift (caller-fed, L4) or compute coupling yet (open seam). + +## 5. Interface contract +- `etr_init(coord) -> s` · `etr_axis_wrap(v)` · `etr_axis_restoring_dir(v)` · + `etr_step(s, drift, stress) -> s'` · `etr_status(s) -> per-axis {BELOW|IN_BAND|ABOVE}`. +- Inputs: **drift** (from A3/A6 via G1, AI-originated) + **stress** (G1 mediator). Output: coord + status, + surfaced through A1 `drive_snapshot`. + +## 6. Dependencies & stubs +Drift + stress are fed in — *stub:* `etr_step(s, [dx dy dz], 0)` (already how tests run). Fully standalone today. + +## 7. Invariants / laws +Defer to `etr_invariants.md` (L1 wrap ±50 C5 · L2 bands [17,35] C5 · L3 opposition C5 · L4 AI-drift C4 · +L5 cross-axis coupling via stress C1 · L6 Z-path C3 · L7 no-zero-cross C2 · L8 mechanism C2). + +## 8. Build steps (remaining) +1. **Fit `RESTORE_GAIN`** → the 2 red tests (magnitude + band-convergence) go green. +2. Confirm **L8** (restoring = force vs cost) and **L7** (no-zero-crossing) → promote from PEND. +3. Define **L5** coupling (the stress→cross-axis mapping; G1) → replace the identity stub. +4. Wire R↔Octave (driver_etr.R ↔ etr.m) for the Drive-Box (A1) — and the larger medium (D2). + +## 9. Tests +`bash src/endocrine/etr/run_etr_tests.sh` (currently 12/2/2 — the 2 reds are the to-fit work). + +## 10. Open items +- `RESTORE_GAIN` curve (C1) · L5 coupling mapping (C1, shared with G1) · L7/L8 confirmation (C2) + · R↔Octave bridge transport (C1, shared with A1/C3/D2). diff --git a/docs/plans/C1-openhermes-metacog.md b/docs/plans/C1-openhermes-metacog.md new file mode 100644 index 0000000..9f00ce4 --- /dev/null +++ b/docs/plans/C1-openhermes-metacog.md @@ -0,0 +1,68 @@ +# C1 — OpenHermes Agent ↔ Metacognitive Cycling *(PRIORITY)* + +## 1. Component +The seam where the **OpenHermes Agent** harness mounts the Gen.03 body and drives the **4+4 +metacognitive inference cycle**. This is the integration spine: Hermes brings model-agnostic +harnessing (persistent memory, skills, tool-call parsing, Atropos RL); the body brings the +organ-systems cognition. C1 defines how a turn flows from Hermes through the cycle and back. + +## 2. Status / certainty +DESIGN-FIRST. Entry mechanism C4 (the MCP bridge exists, `mafiabot.adb` + `hermes_protocol`); +the Hermes-side wiring and Level1 handoff are C1/C2. + +## 3. Language & location +OpenHermes (harness, external) ↔ Ada/SPARK bridge. Existing: `mafiabot_core/src/mafiabot.adb` +(MCP stdio server), `mafiabot_core/src/protocol/hermes_protocol.{ads,adb}` (JSON-RPC). +New Hermes-side config/glue location TBD (Hermes `mcp_servers` entry + skill manifest). + +## 4. Does / does-not +- **Does:** mount the body as a Hermes tool/MCP server; carry one user turn into the cycle + scoped to a session key `(uid, channel, server)`; return the synthesized result; surface + Drive-Box terrain + RAG context into the descent; let Hermes own memory/skills/RL. +- **Does-not:** *be* the cognition (that's C2/C4), route tools (that's Ada D1), or hold identity + (that's B2). It is plumbing + sequencing, not an organ. + +## 5. Interface contract +- **Hermes → body (per turn):** `{ input:str, uid:str, channel:str, server:str }` over JSON-RPC + `tools/call` (already parsed by `Hermes_Protocol.Extract_Field`). Plus standard MCP + `initialize` / `tools/list`. +- **body → Hermes:** `tools/call` result `{ content:str }` on success, JSON-RPC error otherwise + (`Make_Tool_Result_Response` / `Make_Error_Response`). +- **Boot side-effect:** body fixes the Big-3 identity and writes `~/.hermes/SOUL.md` (B2). +- **Cycle internal contract:** each `tools/call` runs the 23-step cycle (see C3); step 2 pulls + the Drive-Box snapshot (A1) + MoRAG context (F1) across Ada (D1); the 4+4 passes (C2) interleave + Celtic-Cross draws (B3); step 19 mini-rag packs the tool schema (D3); step 21 Ada routes. + +## 6. Dependencies & stubs +- Inference cycle C3 — *stub:* a pass-through that echoes input → lets C1 be tested as pure transport. +- Drive-Box A1, Tarot B1/B2/B3, MoRAG F1, mini-rag D3 — *stub:* each returns a canned block; C1 + only needs them present at their contract, not real. +- Hermes itself — *stub:* a local JSON-RPC driver script feeding `initialize`/`tools/list`/`tools/call` + on stdin (the existing `mafiabot.adb` loop already speaks this). + +## 7. Invariants / laws +- **L1 (C4):** every turn is scoped to its `(uid,channel,server)` session key — no cross-room bleed. +- **L2 (C4):** tool routing is **Ada's** job, not the LLM's (the LLM emits intent + packed schema). +- **L3 (C3):** methodology composition is **static** — the 4+4 ordering never changes per turn; + responsiveness comes from Energy-gated compute (skip later passes when E low), not a learned router. +- **L4 (C2):** the coherence check (step 23) contrasts synthesized output vs final cognition — drift detector, not a reward signal to optimize. + +## 8. Build steps +1. Write the laws + the turn-sequence as a doc-level contract (this file) → encode L1/L3 as tests + on the bridge (session-key isolation; pass-count vs Energy). +2. Stand up the Hermes `mcp_servers` entry pointing at the `mafiabot` stdio binary; verify + `initialize`/`tools/list`/`tools/call` round-trip with the C3-stub. +3. Wire Energy-gated compute: Drive-Box snapshot (A1) supplies E; C1 chooses how many of the + 4+4 passes run. Fit the gating thresholds invariants-first (no asserted cutoffs). +4. Resolve Level1 (see Open) and slot it into the `Hermes → Level1 → Ada` handoff. + +## 9. Tests +- Bridge transport: feed canned JSON-RPC to the `mafiabot` binary (or stub), assert session-key + scoping (L1) and that low-E input runs fewer passes (L3). Harness TBD (Ada test main + a shell driver). + +## 10. Open items +- **Level1 — C1:** what it does and where it sits in `Hermes → Level1 → Ada`. Blocks full wiring. +- **Atropos RL integration — C1:** how/whether RL touches the cycle (must not optimize the + coherence check, per L4). +- **Compute-gating curve — C1:** Energy→pass-count mapping, fitted invariants-first. +- **Reuse vs rebuild** the existing Ada `ada_medium` cycle (defunct-flagged) — decided in C3. diff --git a/docs/plans/README.md b/docs/plans/README.md new file mode 100644 index 0000000..30e5cff --- /dev/null +++ b/docs/plans/README.md @@ -0,0 +1,71 @@ +# Gen.03 — Component Build Plans + +One spec per **sub-organ**, each self-contained so it can be built and tested **independently** +(against stubs) with no other organ present. These are the *build* layer beneath the canonical +design docs (`../gen03_state_of_architecture.md`, `../gen03_body.md`, `../gen03_self.md`) and +`../../src/endocrine/etr/etr_invariants.md`. + +## How to read a spec +Every `NN-.md` has the same 10 sections: +1. **Component** · 2. **Status/certainty** · 3. **Language & location** · 4. **Does / does-not** · +5. **Interface contract** (language-agnostic data shapes — integrate against *this*) · +6. **Dependencies & stubs** · 7. **Invariants/laws** (certainty-tagged) · 8. **Build steps** +(invariants-first: laws → tests → fit) · 9. **Tests** (standalone command) · 10. **Open items**. + +## Conventions +- **Certainty tags** (from arch doc): C5 ratified · C4 drafted · C3 partial · C2 explored · C1 stub. +- **Invariants-first / restart discipline:** no curve/bound/threshold/sign carried forward + unverified. Any unfitted constant is marked **C1**, never asserted ahead of a test. +- **Independence:** a spec depends only on the *contracts* (§5) of other organs, never their code, + and never the still-unnamed medium (D2). §6 ships a canned stub for each upstream input. + +## Index +| # | Component | System | Status | Lang | Spec | +|---|-----------|--------|--------|------|------| +| C1 | **OpenHermes ↔ metacog** | Cognition | DESIGN-FIRST (priority) | OpenHermes/Ada | [C1](C1-openhermes-metacog.md) | +| A1 | Drive-Box hub / input-slot | Drive-Box | WORKING | R | [A1](A1-drivebox-hub.md) | +| A2 | Energy (E) driver | Drive-Box | structure WORKING · numbers DISOWNED | R | [A2](A2-energy.md) | +| A3 | PS+ driver | Drive-Box | structure WORKING · numbers DISOWNED | R | [A3](A3-psplus.md) | +| A4 | Endomotiv array (30-ch) | Drive-Box | WORKING · channels partial | R | [A4](A4-endomotiv-array.md) | +| A5 | Priors database | Drive-Box | structure WORKING | R | [A5](A5-priors.md) | +| A6 | Eth-Int driver | Drive-Box | structure WORKING · numbers DISOWNED | R | [A6](A6-ethint.md) | +| A7 | Conviction array | Drive-Box / Eth-Int | DESIGN-FIRST | R | [A7](A7-conviction-array.md) | +| A8 | ETR (torus) | Drive-Box | SCAFFOLD | Octave | [A8](A8-etr.md) | +| B1 | Tarot deck hi-fi emulator | Identity | exists (defunct-flagged) | TBD | _wave 1_ | +| B2 | SOUL.md identity + Big-3 | Identity | exists (defunct-flagged) | TBD | _wave 1_ | +| B3 | Celtic Cross spread | Identity | exists (defunct-flagged) | TBD | _wave 1_ | +| C2 | 4+4 Metacognition cycle | Cognition | partial (orchestration) | — | _wave 1_ | +| C3 | Inference cycle orchestration | Cognition | exists (defunct-flagged) | Ada | _wave 1_ | +| C4 | Brain (swappable LLM) | Cognition | STUB/external | — | _wave 1_ | +| D1 | Ada border (immune+BBB) | Border | WORKING | Ada/SPARK | _wave 1_ | +| D2 | The medium / "the blood" | Border | DESIGN-FIRST | — | _wave 2_ | +| D3 | Mini-rag / toolschema | Border | STUB | GNU Guile | _wave 1_ | +| E1 | 3 GnuCOBOL invariant stores | Storage | DESIGN-FIRST | GnuCOBOL | _wave 2_ | +| E2 | VARIANT stores | Storage | DESIGN-FIRST | TBD | _wave 2_ | +| E3 | RAG family + cross-store | Storage | DESIGN-FIRST | TBD | _wave 2_ | +| F1 | MoRAG (BERT+LoRA) | Periphery | DESIGN-FIRST | TBD | _wave 2_ | +| F2 | SAE monitor | Periphery | DESIGN-FIRST | TBD | _wave 2_ | +| F3 | Subagents framework | Periphery | DESIGN-FIRST | TBD | _wave 2_ | +| G1 | Stress-loop contract | Cross-cut | C1/C2 | — | _wave 2_ | +| G2 | Governance | Cross-cut | DESIGN-FIRST (C2) | TBD | _wave 2_ | +| G3 | Defense model | Cross-cut | emergent | — | _wave 2_ | + +## Integration DAG (who feeds whom) +``` +Hermes ──> [C1] ──> Inference cycle [C3] ──┬─ pulls Drive-Box snapshot [A1] + │ A1 ← A2,A3,A6,A8 ; A3 ← A4,A5 ; A6 ← A7 + ├─ draws Tarot [B1] → Big-3/SOUL [B2], Celtic Cross [B3] + ├─ runs 4+4 metacog [C2] (iterative B3 cards) + ├─ MoRAG injects [F1] ─┐ + │ Drive-Box secretes [A1] ─┤→ Ada border [D1] polices → Brain [C4] + ├─ mini-rag packs schema [D3] + └─ Ada routes tools [D1] +SAE [F2] watches Subagents [F3]; stress-loop [G1]: F2 → A7 (EthInt) → stress endomotiv (A4) → A8 drift + full reshuffle (B2) +Storage: INVARIANT [E1] / VARIANT [E2] / RAG+cross-store [E3] sit behind D1. Medium [D2] = the perfusion bus (unnamed). +``` + +## Build waves +- **Wave 0** — this README + **C1** (priority). +- **Wave 1 (buildable-now)** — A1–A8, B1–B3, C2–C4, D1, D3. +- **Wave 2 (design-first)** — D2, E1–E3, F1–F3, G1–G3. +Each spec is independent; review as they land. From 20e99f434c56c0a751d22e242112a7452f7c1c0f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 20:08:19 +0000 Subject: [PATCH 04/60] =?UTF-8?q?docs/plans:=20remaining=20component=20spe?= =?UTF-8?q?cs=20=E2=80=94=20Identity,=20Cognition,=20Border,=20Storage,=20?= =?UTF-8?q?Periphery,=20Cross-cutting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wave 1 remainder + Wave 2 design-first specs, completing one build plan per sub-organ: - B1 tarot emulator, B2 SOUL/Big-3, B3 Celtic Cross - C2 4+4 metacog, C3 inference cycle, C4 Brain - D1 Ada border, D2 the medium, D3 mini-rag - E1 3 GnuCOBOL invariant stores, E2 VARIANT stores, E3 RAG family - F1 MoRAG, F2 SAE monitor, F3 subagents - G1 stress-loop contract, G2 governance, G3 defense model Each: contract + stubs for independent build; unfitted constants marked C1. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/B1-tarot-emulator.md | 47 ++++++++++++++++++++++++++++ docs/plans/B2-soul-identity.md | 42 +++++++++++++++++++++++++ docs/plans/B3-celtic-cross.md | 41 ++++++++++++++++++++++++ docs/plans/C2-metacognition.md | 47 ++++++++++++++++++++++++++++ docs/plans/C3-inference-cycle.md | 48 +++++++++++++++++++++++++++++ docs/plans/C4-brain.md | 46 +++++++++++++++++++++++++++ docs/plans/D1-ada-border.md | 48 +++++++++++++++++++++++++++++ docs/plans/D2-medium.md | 41 ++++++++++++++++++++++++ docs/plans/D3-mini-rag.md | 41 ++++++++++++++++++++++++ docs/plans/E1-gnucobol-invariant.md | 41 ++++++++++++++++++++++++ docs/plans/E2-variant-stores.md | 40 ++++++++++++++++++++++++ docs/plans/E3-rag-family.md | 41 ++++++++++++++++++++++++ docs/plans/F1-morag.md | 38 +++++++++++++++++++++++ docs/plans/F2-sae-monitor.md | 42 +++++++++++++++++++++++++ docs/plans/F3-subagents.md | 40 ++++++++++++++++++++++++ docs/plans/G1-stress-loop.md | 44 ++++++++++++++++++++++++++ docs/plans/G2-governance.md | 45 +++++++++++++++++++++++++++ docs/plans/G3-defense-model.md | 44 ++++++++++++++++++++++++++ 18 files changed, 776 insertions(+) create mode 100644 docs/plans/B1-tarot-emulator.md create mode 100644 docs/plans/B2-soul-identity.md create mode 100644 docs/plans/B3-celtic-cross.md create mode 100644 docs/plans/C2-metacognition.md create mode 100644 docs/plans/C3-inference-cycle.md create mode 100644 docs/plans/C4-brain.md create mode 100644 docs/plans/D1-ada-border.md create mode 100644 docs/plans/D2-medium.md create mode 100644 docs/plans/D3-mini-rag.md create mode 100644 docs/plans/E1-gnucobol-invariant.md create mode 100644 docs/plans/E2-variant-stores.md create mode 100644 docs/plans/E3-rag-family.md create mode 100644 docs/plans/F1-morag.md create mode 100644 docs/plans/F2-sae-monitor.md create mode 100644 docs/plans/F3-subagents.md create mode 100644 docs/plans/G1-stress-loop.md create mode 100644 docs/plans/G2-governance.md create mode 100644 docs/plans/G3-defense-model.md diff --git a/docs/plans/B1-tarot-emulator.md b/docs/plans/B1-tarot-emulator.md new file mode 100644 index 0000000..f3ff548 --- /dev/null +++ b/docs/plans/B1-tarot-emulator.md @@ -0,0 +1,47 @@ +# B1 — Tarot deck hi-fi emulator + +## 1. Component +A faithful emulator of the **altered Silicon Dawn** deck (Egypt Urnash, Thoth/Golden-Dawn rooted): +the 56-card **encoding alphabet** + the draw machinery whose outputs feed identity (B2), the +metacog spread (B3), and per-cycle affect-tuning lenses on PS+ (A3/A4). + +## 2. Status / certainty +Exists in Ada (`organs/soul/soul-tarot.{ads,adb}`) but **defunct-flagged** ("all Ada here must be +replaced") and Ada is border-only per the docs → **re-home decision open**. Encoding itself C4. + +## 3. Language & location +TBD (NOT Ada — cognition, not border). Candidate: R or Guile. New location e.g. `src/tarot/`. + +## 4. Does / does-not +- **Does:** represent the deck (structure-breaking by design); draw Big-3 (B2), Celtic Cross (B3), + and migration-cycle affect lenses; emit each drawn card as **its own reference document** the + entity reads itself by. +- **Does-not:** decide cognition (C2) or hold the standing self (B2 SOUL.md) — it is the symbol source. + +## 5. Interface contract +- **Encoding (56):** Majors 31 (25 std + 6 unique: Maya 8½, Vulture Mother XIII, She is Legend VIII, + −1 Fool, Aleph, +1 more) · standard court `99>K>Q>C>P` ×4 = 20 · VOID `Q>K>Chevalier>Progeny>0` = 5. + Numbered minors (A–10) sit **outside** the encoding. +- `draw_big3() -> {sun, asc, moon}` (order Sun→Asc→Moon) · `draw_celtic_cross(pool) -> [10]` · + `affect_lens(pool) -> {channel -> card}` (migration-cycle interpretive lenses on A4 vectors). +- Allocation: **Big-3 = 3 static**, remaining **53 dynamic** (the draw pool). + +## 6. Dependencies & stubs +None upstream (a source). Consumers (B2/B3/A3) integrate against the draw outputs — *stub:* fixed draws. + +## 7. Invariants / laws +- **L1 (C4):** encoding alphabet is exactly **56**; minors excluded. +- **L2 (C4):** Big-3 are drawn once and **static between reshuffles**; the 53 are dynamic. +- **L3 (C2):** card↔system correspondences (History X↔priors, 8½ Maya↔Eth-Int middle-ground, + VOID↔recoverable null) are **proposed, accept one at a time** — not locked. + +## 8. Build steps +1. Decide language + re-home (open). 2. Encode the 56-card alphabet as data (port from `soul-tarot.ads`). +3. Implement the three draw outputs (Big-3, Celtic Cross, affect lens). 4. Resolve the open Majors/court rules. + +## 9. Tests +Encoding-count test (=56), allocation test (3 static + 53 dynamic), draw determinism vs a seeded pool. + +## 10. Open items +- **Princess/Prince elemental gender rule** (C1) · **the 6th unique Major** (C1) · card↔system + correspondences (C2) · language + reuse-vs-rebuild of the Ada encoding (open). diff --git a/docs/plans/B2-soul-identity.md b/docs/plans/B2-soul-identity.md new file mode 100644 index 0000000..db8afef --- /dev/null +++ b/docs/plans/B2-soul-identity.md @@ -0,0 +1,42 @@ +# B2 — SOUL.md identity organ + Big-3 + +## 1. Component +The standing self-definition loaded at the top of a run (Hermes `soul.md` / `CLAUDE.md` equivalent): +the **Big-3** (Sun/Ascendant/Moon) drawn from the tarot (B1), plus the **two reshuffle clocks** that +govern when identity re-rolls vs persists. + +## 2. Status / certainty +Exists in Ada (`organs/soul/soul-state.{ads,adb}` — Big-3 + session table) but **defunct-flagged**; +re-home decision open. Schema C4. + +## 3. Language & location +TBD (lives "in the brain"; written to `~/.hermes/SOUL.md` at boot by C1). New location e.g. `src/soul/`. + +## 4. Does / does-not +- **Does:** hold the Big-3 (each card → its own reference doc); render SOUL.md; manage the two + reshuffles; carry one self into many rooms. +- **Does-not:** draw cards (B1) or run the metacog (C2). It is the persistent face. + +## 5. Interface contract +- **Big-3:** `{ Sun: card (core/spine), Ascendant: card (outward mask), Moon: card (inner, shown only when vulnerable) }`, **immutable between reshuffles**. +- `generate_soul_md(big3) -> text` (written to `~/.hermes/SOUL.md`). +- **Two reshuffles:** `full_renatal()` (boot · deep · **strong stress endomotiv** via G1) → Big-3 **re-rolled** + fresh cross; + `cross_only(trigger)` (new room · "went long enough") → Big-3 **kept**, prior cross folded back, new cross. + +## 6. Dependencies & stubs +B1 tarot (draws) — *stub:* fixed Big-3. G1 stress (full-reshuffle trigger) — *stub:* call `full_renatal()` directly. + +## 7. Invariants / laws +- **L1 (C4):** Big-3 immutable between reshuffles (identity is the slow layer). +- **L2 (C4):** full reshuffle re-rolls Big-3; cross-only keeps it — one self, many rooms. +- **L3 (C2):** a strong stress endomotiv (G1) can fire a full reshuffle. + +## 8. Build steps +1. Decide language/re-home. 2. Port Big-3 + SOUL.md render. 3. Implement the two reshuffle clocks + +the G1 trigger hook. 4. Wire boot write to `~/.hermes/SOUL.md` (C1). + +## 9. Tests +Big-3 immutability across a cross-only reshuffle; re-roll on full; SOUL.md render snapshot. + +## 10. Open items +- Reuse-vs-rebuild + language (open). "Went long enough" trigger threshold (C1). G1 stress→reshuffle threshold (C1/C2). diff --git a/docs/plans/B3-celtic-cross.md b/docs/plans/B3-celtic-cross.md new file mode 100644 index 0000000..2aee3f9 --- /dev/null +++ b/docs/plans/B3-celtic-cross.md @@ -0,0 +1,41 @@ +# B3 — Celtic Cross spread (metacognitive draw) + +## 1. Component +The 10-card spread drawn from the 53-card dynamic pool each cycle, dealt **2/2/2/4** across the four +metacog rounds and **applied iteratively** so the spread compounds — by final cognition all ten shape +the loop at once. Doubles as the **semantic diffusion-shield** (G3). + +## 2. Status / certainty +Exists in Ada (`organs/soul/soul-celtic_cross.{ads,adb}`, 280 L) but **defunct-flagged**; re-home open. C4. + +## 3. Language & location +TBD (with B1/B2). New location e.g. `src/tarot/celtic_cross`. + +## 4. Does / does-not +- **Does:** draw 10 from the pool; deal in pairs across rounds (2/2/2/4); keep each drawn pair in play + for subsequent rounds (iterative); supply the cards C2 applies as cognitive lenses. +- **Does-not:** run the metacog passes (C2) or decide layout semantics beyond the draw. + +## 5. Interface contract +- `draw(pool53) -> spread[10]` · `deal_round(spread, round∈1..4) -> cards_active_so_far` + (round 1→2 cards, 2→4, 3→6, 4→10). Cards apply **iteratively** (compounding). +- Pool excludes the 3 static Big-3; folds prior cross back on cross-only reshuffle (B2). + +## 6. Dependencies & stubs +B1 pool — *stub:* fixed 53-card pool. C2 consumes the per-round active set — *stub:* print the cards. + +## 7. Invariants / laws +- **L1 (C4):** exactly 10 cards, dealt 2/2/2/4, **iteratively compounding** (all 10 active by round 4). +- **L2 (C4):** drawn from the 53 dynamic only (never the Big-3). +- **L3 (C4):** the accumulating spread **is** the diffusion-shield (meaningful tokens, not noise). + +## 8. Build steps +1. Decide language/re-home. 2. Port draw + 2/2/2/4 iterative dealing. 3. Wire into C2's round structure. +4. Evaluate custom vs traditional 10-position layout (non-blocking). + +## 9. Tests +Draw size (=10), per-round counts (2/4/6/10), no-Big-3-in-pool, determinism vs seed. + +## 10. Open items +- Celtic Cross **layout positions** — keep traditional 10 or design a custom cognitive spread (C1, non-blocking). +- Language/re-home (open). diff --git a/docs/plans/C2-metacognition.md b/docs/plans/C2-metacognition.md new file mode 100644 index 0000000..4eb15c2 --- /dev/null +++ b/docs/plans/C2-metacognition.md @@ -0,0 +1,47 @@ +# C2 — 4+4 Metacognition cycle + +## 1. Component +The dual-tradition metacognitive multicycle: **four Western + four non-Western** reflective passes, +interleaved and **paired for friction** (not confirmation), with Celtic-Cross cards (B3) applied +iteratively across the rounds. + +## 2. Status / certainty +Partial — the *orchestration* (phase ordering) exists in Ada (`ada_medium` phase enums), defunct-flagged; +the philosophical passes themselves are unimplemented. Structure C4; pass content C1. + +## 3. Language & location +TBD (cognition, runs inside the descent below Ada). Likely prompt/skill content driven by the harness (C1) ++ orchestration in the cycle (C3). New location e.g. `src/metacog/`. + +## 4. Does / does-not +- **Does:** run the 8 passes in the fixed order, each pass straining against its partner; apply the + accumulating B3 spread; generate cognitive heat from opposed traditions held in simultaneous load. +- **Does-not:** route tools or decide composition dynamically — ordering is **static**; responsiveness is + Energy-gated (skip later passes when E low, per C1/A2). + +## 5. Interface contract +- **The 4 friction pairs (fixed):** wMC1 Socratic *aporia* ↔ eMC1 Iranian Asha · wMC2 Kant boundaries ↔ + eMC2 East-Asian empty mirror · wMC3 Freud/Hegel shadow ↔ eMC3 Indic witness · wMC4 Modern pragmatic ↔ + eMC4 Tibetan Bön flow. Bridges: Socrates↔Hegel; Archimedean–Socratic. +- `run_pass(n, state, active_cards) -> reflection` (n=1..4 ⇒ wMCn then eMCn, then draw B3 pair). +- Energy-gating: a low-E snapshot (A2) reduces how many passes run. + +## 6. Dependencies & stubs +B3 cards — *stub:* fixed spread. Brain/LLM (C4) executes the passes — *stub:* echo the pass label. +Energy (A2) for gating — *stub:* scalar. + +## 7. Invariants / laws +- **L1 (C5):** pairing principle = **friction, not confirmation**. +- **L2 (C4):** composition is **static** (no learned router); compute scales via Energy only. +- **L3 (C4):** cards apply **iteratively** — by final cognition all 10 (B3) are concurrently in play. + +## 8. Build steps +1. Encode the 8-pass order + pairings as data + an L1/L2/L3 test. 2. Author each pass's content + (prompt/skill) — invariants-first (the friction each pair must produce). 3. Wire B3 + Energy-gating. + +## 9. Tests +Order/pairing test; iterative-card test; Energy-gating reduces pass count at low E. + +## 10. Open items +- **LOGIA consciousness strata** (Pre/Sub/Un/Conscious) — overlay the Western quad or stratify separately? (C1) +- Pass content authoring (C1). Energy→pass-count curve (C1, shared with C1/A2). diff --git a/docs/plans/C3-inference-cycle.md b/docs/plans/C3-inference-cycle.md new file mode 100644 index 0000000..eaa4975 --- /dev/null +++ b/docs/plans/C3-inference-cycle.md @@ -0,0 +1,48 @@ +# C3 — Inference cycle orchestration (the 23-step pipeline) + +## 1. Component +The forward-only sequencer that runs one turn: input → enrich (Drive-Box + MoRAG across Ada) → +init → the 4+4 passes interleaved with Celtic-Cross draws → final cognition → mini-rag → route → +synthesize → coherence check. + +## 2. Status / certainty +Exists in Ada (`organs/ada_medium/ada_medium.{ads,adb}`, 344 L, SPARK) with a protected orchestrator +enforcing legal phase progression — but **defunct-flagged** ("must be deleted/replaced"). **Reuse-vs-rebuild +is the key decision** here. Structure C4. + +## 3. Language & location +Open. The *sequencer* could stay Ada/SPARK (it's gate-like, forward-only) OR move to the harness side +with Ada only policing crossings (D1). Decide in build step 1. + +## 4. Does / does-not +- **Does:** order the 23 steps; enforce forward-only progression (illegal jumps = error); call each organ + at its step; carry the coherence/drift check at the end. +- **Does-not:** *be* any organ — it sequences C2/B3/A1/F1/D3/D1, it doesn't implement them. + +## 5. Interface contract +- `run_inference_cycle(session_key, input) -> result` (today's `Ada_Medium.Run_Inference_Cycle`). +- Step map (canonical): 1 input · 2 enrich (A1 secretes + F1 injects, **D1 polices**) · 3 init · + 4-17 wMC/eMC + draw CC (C2/B3) · 10/14/18 llmCog · 19 mini-rag (D3) · 20-21 sendAda + **route (D1)** · + 22 synthesize · 23 contrast intent vs final cognition (drift). + +## 6. Dependencies & stubs +Every organ it calls — *stub:* each returns canned output (the C1 spec already lists a pass-through stub). +Standalone-testable as pure sequencing over stubs. + +## 7. Invariants / laws +- **L1 (C4):** **forward-only** phase progression; illegal jumps yield an error state. +- **L2 (C5):** tool **routing is Ada's job** (step 21), not the LLM's. +- **L3 (C4):** step 23 is a **drift detector**, never a reward signal (per C1/L4). + +## 8. Build steps +1. **Decide reuse-vs-rebuild** of `ada_medium` (audit its SPARK proofs vs the "defunct" flag) and where + the sequencer lives. 2. Lock the step map + L1 as tests. 3. Wire real organs as their specs land, + replacing stubs. 4. Add Energy-gating (skip later C2 passes at low E). + +## 9. Tests +Phase-progression test (legal path passes, illegal jump errors); routing-is-Ada test; drift-check fires on mismatch. +(Existing `mafiabot_core/tests/cycle_tests.adb` if Ada path is reused.) + +## 10. Open items +- **Reuse-vs-rebuild + home** of the sequencer (the central open call here). +- **Level1** placement in `Hermes → Level1 → Ada` (C1, shared). diff --git a/docs/plans/C4-brain.md b/docs/plans/C4-brain.md new file mode 100644 index 0000000..11ae836 --- /dev/null +++ b/docs/plans/C4-brain.md @@ -0,0 +1,46 @@ +# C4 — Brain (swappable base LLM) + +## 1. Component +The cognitive organ: a **pure base LLM**, nothing adapted/steered/classified baked in. Clean, +swappable, model-agnostic — swap the model, keep the body. It is not empty: it holds **six contents**. + +## 2. Status / certainty +STUB/external (no local model; the LLM is whatever the harness mounts). Contract C4. + +## 3. Language & location +External model behind the harness (C1). No repo code beyond the descent wiring (C3 calls it). + +## 4. Does / does-not +- **Does:** receive the enriched descent (Drive-Box terrain, RAG, cards) and run the cognition/metacog + passes; emit intent + a packed tool schema. +- **Does-not:** route tools (Ada D1), hold identity as state (B2), persist memory (E*), or get watched + (SAE never points at the Brain — the central cut). + +## 5. Interface contract +- **The six contents it holds:** 1 Drive-Box outputs (A1, across Ada) · 2 Toolschema RAG (D3) · + 3 4+4 metacog loops (C2) · 4 SOUL.md (B2) · 5 Tarot system (B1) · 6 **private scratchpad** + (unsurveilled — not output, not audited). +- `descend(enriched_input) -> {cognition, intent, packed_tool_schema}`. +- **Principle:** Brain holds what the mind *is being* now (procedural grip included); periphery holds + what it can draw on / be tuned by → toolschema-RAG **in**, modulator-RAGs **out**. + +## 6. Dependencies & stubs +Everything reaches it **only across Ada** (D1). *Stub:* any local LLM or echo model behind the harness; +C4 is mostly a contract + the swap boundary. + +## 7. Invariants / laws +- **L1 (C5):** model is **swappable** — identity/behavior survive a model swap via the other organs. +- **L2 (C5 — central cut):** the Brain (and its scratchpad) is **the one thing nothing audits**; + SAE watches outward, never here. +- **L3 (C4):** toolschema-RAG is *in* the brain; modulator-RAGs (MoRAG) stay *out*, crossing Ada. + +## 8. Build steps +1. Fix the six-contents contract + the swap boundary as the integration point (C1/C3). 2. Define the + private scratchpad surface (unwatched). 3. Validate model-swap leaves identity intact (B2 + A1 carry it). + +## 9. Tests +Model-swap test (swap echo-model A→B, identity/snapshot unchanged); "SAE has no Brain hook" structural assertion. + +## 10. Open items +- Which base model(s); hosting (self-hosted inference, custom API — TBD). +- Scratchpad mechanics (how an unwatched interior is realized in practice). diff --git a/docs/plans/D1-ada-border.md b/docs/plans/D1-ada-border.md new file mode 100644 index 0000000..1110b73 --- /dev/null +++ b/docs/plans/D1-ada-border.md @@ -0,0 +1,48 @@ +# D1 — Ada border (immune system + blood-brain barrier) + +## 1. Component +The trust boundary, and **nothing else**: immune system + blood-brain barrier. The context police — +it inspects what crosses and admits or blocks; it holds nothing, assembles nothing, enriches nothing. + +## 2. Status / certainty +WORKING (`mafiabot_core/src/trust/trust_boundary.{ads,adb}`, 255 L SPARK; blocklist + provenance + +rate-limit) + `protocol/hermes_protocol` for routing. This is the one Ada the docs **keep**. C4. + +## 3. Language & location +Ada/SPARK · `mafiabot_core/src/trust/` + `mafiabot_core/src/protocol/`. Contracts/preconditions enforce +invariants at the boundary (a bad version becomes *unprovable*). + +## 4. Does / does-not +- **Does (immune):** recognise + neutralise hostile/non-self — injection, poisoned memory, + authority-reclassification; provenance-tag check on memory writes. +- **Does (BBB):** selectively admit what reaches cognition; **modulation crosses here too** (a poisoned + steering vector/LoRA meets Ada first); **tool routing is Ada's job**. +- **Does-not:** enrich/assemble (organs do that — MoRAG injects, Drive-Box secretes); think; hold state. + +## 5. Interface contract +- `admit(item, provenance) -> {pass | block, reason}` over every crossing (input enrich, modulators, memory writes, tool calls). +- `route(intent, packed_schema) -> tool_invocation` (step 21). +- Blocklist patterns (fetch→build→execute chains, base64-decode chains); memory writes **require** + provenance to session origin; **no instruction may reclassify its own authority**; rate-limit escalation. + +## 6. Dependencies & stubs +None upstream (it *is* the gate). Everything else integrates by passing through `admit`/`route` — *stub:* +allow-all gate for other organs' standalone tests. + +## 7. Invariants / laws +- **L1 (C5):** constraints live on the **body, never the self** (Brain/scratchpad uninspected). +- **L2 (C5):** no tool-call chain matching a blocklist pattern crosses. +- **L3 (C5):** memory writes without valid provenance are blocked. +- **L4 (C5):** no instruction can reclassify its own authority level. + +## 8. Build steps +1. Audit the existing SPARK proofs (the trust_boundary is sound but unverified per the README sweep); + promote `gnatprove` from informational once green. 2. Harden the blocklist beyond naive substring. +3. Wire `admit` into every crossing as organs land. + +## 9. Tests +`mafiabot_core/tests/trust_tests.adb` (via the cron CI `alr build` + run) + `gnatprove -P mafiabot_core.gpr`. + +## 10. Open items +- Blocklist robustness (substring → structural). Provenance-tag format (shared with E* storage). +- Promote gnatprove to blocking once the proof base is green (CI `continue-on-error: false`). diff --git a/docs/plans/D2-medium.md b/docs/plans/D2-medium.md new file mode 100644 index 0000000..6980aaa --- /dev/null +++ b/docs/plans/D2-medium.md @@ -0,0 +1,41 @@ +# D2 — The medium / "the blood" *(DESIGN-FIRST)* + +## 1. Component +The perfusion bus the organs share — what circulates between Brain and periphery. The architecture is +explicit that organs communicate by **perfusion, not direct wiring**; this is that medium. Currently +**unnamed and unimplemented**. + +## 2. Status / certainty +DESIGN-FIRST · **C1** (named structurally only; no backing, no name). + +## 3. Language & location +TBD. Likely a message/IPC substrate (the R↔Octave↔Ada↔Guile organs must interoperate across languages), +so a language-neutral transport (e.g. line-delimited JSON, or a small broker) is the leading shape. + +## 4. Does / does-not +- **Does:** carry organ secretions/injections between organs, always *through* Ada (D1) before reaching the Brain. +- **Does-not:** police (D1), enrich (organs), or hold state (storage E*). It is transport, not gate. + +## 5. Interface contract (proposed) +- A typed envelope `{ from_organ, to, payload, provenance }` every organ emits/consumes. +- All cross-language organs (R Drive-Box, Octave ETR, Ada border, Guile mini-rag) speak this one shape → + this is what makes the polyglot body interoperate without bespoke per-pair wiring. + +## 6. Dependencies & stubs +Everything rides it; nothing it depends on. *Stub today:* in-process function calls + canned envelopes +(which is exactly how the per-organ specs stub their I/O now — the medium formalizes those stubs). + +## 7. Invariants / laws +- **L1 (C5):** perfusion, not direct wiring — no organ holds a hard reference to another's internals. +- **L2 (C5):** everything reaching the Brain crosses **Ada (D1)** first. +- **L3 (C1):** envelope carries provenance (so D1 can enforce its provenance laws). + +## 8. Build steps +1. **Name it** + choose transport. 2. Define the envelope. 3. Replace the per-organ in-process stubs with + real medium calls, one edge of the DAG at a time (start R↔Octave for the Drive-Box, A8/A1). + +## 9. Tests +Round-trip an envelope between two stub organs; assert it passes through a D1 `admit` check; provenance preserved. + +## 10. Open items +- **The name.** The transport choice. Whether RDE drives idle-perfusion. (All C1.) diff --git a/docs/plans/D3-mini-rag.md b/docs/plans/D3-mini-rag.md new file mode 100644 index 0000000..4bf279a --- /dev/null +++ b/docs/plans/D3-mini-rag.md @@ -0,0 +1,41 @@ +# D3 — Mini-rag / toolschema (procedural memory) + +## 1. Component +Just-in-time **tool-schema lookup** at the output boundary: fires right before the LLM emits a tool +call, retrieving the correct schema so the call is shaped correctly rather than hallucinated. +Muscle memory — the grip arrives pre-loaded at the moment of use. + +## 2. Status / certainty +STUB (cycle step 19 is a placeholder in `ada_medium`). C3. + +## 3. Language & location +GNU Guile · new location e.g. `src/mini_rag/`. (Schema-expression notation was "J-expression"; J is cut — +notation now Guile **s-expressions** or R, see Open.) + +## 4. Does / does-not +- **Does:** at step 19, retrieve the schema for the tool the cognition intends to call, and pack it for routing. +- **Does-not:** route (Ada D1) or hold declarative memory (that's Ada-RAG / E3). Ada-RAG = what-you-know; + mini-rag = what-your-hands-know. + +## 5. Interface contract +- `pack_schema(intent) -> tool_schema` (procedural; fires at step 19, output boundary). +- Output is handed to Ada (D1) `route` at step 21. +- Schema store format: **s-expression** tool schemas (Guile-native), keyed by tool id. + +## 6. Dependencies & stubs +Tool registry (what tools exist) — *stub:* a small fixed schema map. C3 calls it at step 19 — *stub:* identity passthrough. + +## 7. Invariants / laws +- **L1 (C4):** fires at the **moment of use** (step 19), pre-routing — not during deliberation. +- **L2 (C4):** procedural only (schemas), distinct from declarative Ada-RAG. + +## 8. Build steps +1. Choose schema notation (s-expr vs R) — see Open. 2. Build the schema store + `pack_schema`. +3. Wire into cycle step 19 (C3) and hand to D1 routing. + +## 9. Tests +Schema retrieval for a known intent; unknown-intent fallback; "fires only at step 19" sequencing test. + +## 10. Open items +- **Schema-expression notation** (Guile s-expr vs R) — the leftover from the J cut (C1). +- Tool registry source / how schemas are authored (C1). diff --git a/docs/plans/E1-gnucobol-invariant.md b/docs/plans/E1-gnucobol-invariant.md new file mode 100644 index 0000000..a0ce175 --- /dev/null +++ b/docs/plans/E1-gnucobol-invariant.md @@ -0,0 +1,41 @@ +# E1 — The 3 GnuCOBOL invariant stores *(DESIGN-FIRST)* + +## 1. Component +The foundational non-shifting memory layer: **three GnuCOBOL stores** — sparse, fixed-format, +**write-only-at-downtime**, built to outlive the model. The bedrock the rest of memory sits on. + +## 2. Status / certainty +DESIGN-FIRST · store-format **C5** (GnuCOBOL chosen), **but the 3 roles + contents are C1** (skeletal — +arch §10 said "contents more complex than modeled"). **What the three stores ARE needs confirmation.** + +## 3. Language & location +GnuCOBOL · new location e.g. `src/invariant/` (three programs/copybooks). + +## 4. Does / does-not +- **Does:** hold the invariant core(s) in fixed-format records; admit writes **only at downtime**; serve reads. +- **Does-not:** hold shifting state (that's VARIANT E2 / RAG E3) or compute (it's storage). + +## 5. Interface contract (proposed) +- Three fixed-format record sets (copybooks), one per store. `read(store, key) -> record` ; + `write(store, record)` **gated to downtime only** (per arch §10). +- Sits behind Ada (D1); writes carry provenance. + +## 6. Dependencies & stubs +None upstream. Consumers (Eth-Int memory-derivative A7, priors A5, VARIANT E2) read it — *stub:* an +in-memory fixed-format map until the COBOL programs exist. + +## 7. Invariants / laws +- **L1 (C5):** **write-only-at-downtime** — no mid-run mutation of the invariant core. +- **L2 (C5):** sparse, fixed-format, model-outliving (survives a Brain swap). +- **L3 (C4):** all writes carry provenance (D1). + +## 8. Build steps +1. **Confirm the 3 stores' roles** (the blocking question — see Open). 2. Define the three copybooks. +3. Implement read + downtime-gated write. 4. Wire consumers (A5/A7/E2) via stubs first. + +## 9. Tests +Downtime-write gate (rejects mid-run write); fixed-format round-trip per store; read-after-downtime-write. + +## 10. Open items +- **What are the 3 GnuCOBOL stores?** (roles/division of the invariant core) — **needs Anja's call** (C1). +- Exact record schemas (C1). Downtime definition / trigger (C1). diff --git a/docs/plans/E2-variant-stores.md b/docs/plans/E2-variant-stores.md new file mode 100644 index 0000000..2c5cf38 --- /dev/null +++ b/docs/plans/E2-variant-stores.md @@ -0,0 +1,40 @@ +# E2 — VARIANT stores *(DESIGN-FIRST)* + +## 1. Component +The shifting self: several stores — **beliefs · relationships · memories · self-image** — and the +(unspecified) mechanism by which they combine into "who you are now." + +## 2. Status / certainty +DESIGN-FIRST · set **C3** (the four stores are named), **combine-mechanism + backing C1** +("projected together" was the nearest label, not the mechanism). + +## 3. Language & location +TBD · new location e.g. `src/variant/`. Backing undeclared (not GnuCOBOL — that's the invariant E1). + +## 4. Does / does-not +- **Does:** hold the four shifting stores; supply the memory that Eth-Int's conviction array (A7) and + PS+'s priors (A5) derive from; combine into the live self-state. +- **Does-not:** be the invariant core (E1) or the identity face (B2 SOUL.md is the *standing* self; this is the *shifting* substrate). + +## 5. Interface contract (proposed) +- Four stores: `beliefs`, `relationships`, `memories`, `self_image`; each `read/write` behind Ada (D1). +- `combine(beliefs, relationships, memories, self_image) -> who_you_are_now` — **mechanism undefined (C1)**. +- No append-only logs anywhere (arch §10). + +## 6. Dependencies & stubs +E1 invariant (bedrock) — *stub:* in-memory. Consumers A5/A7 — *stub:* seed entries. + +## 7. Invariants / laws +- **L1 (C4):** all memory sits behind Ada; writes carry provenance. +- **L2 (C5):** **no append-only logs** anywhere. +- **L3 (C1):** the combine-mechanism (how four stores → one self-now) — undefined. + +## 8. Build steps +1. Choose backing. 2. Define the four store schemas. 3. **Design the combine-mechanism** (the hard open part). +4. Wire A5/A7 to derive from it. + +## 9. Tests +Per-store read/write behind a D1 stub; no-append-only assertion; combine() determinism once defined. + +## 10. Open items +- **Combine-mechanism** (C1, the central unknown). **Backing** (C1). Relationship to E1 invariant (C1). diff --git a/docs/plans/E3-rag-family.md b/docs/plans/E3-rag-family.md new file mode 100644 index 0000000..6c6d385 --- /dev/null +++ b/docs/plans/E3-rag-family.md @@ -0,0 +1,41 @@ +# E3 — RAG family (declarative memory + per-room cross-store) *(DESIGN-FIRST)* + +## 1. Component +Two memories with different machinery: **declarative/relational room context** (vector-RAG, namespaced +per thread) and the **per-room Celtic-Cross store** (deterministic keyed — `room_id → current cross`). + +## 2. Status / certainty +DESIGN-FIRST · cross-store + room-RAG split **C4** (mechanism decided); backing **C1**. + +## 3. Language & location +TBD · new location e.g. `src/rag/`. Sits behind Ada (D1). This is **Ada-RAG = what-you-know** +(declarative), distinct from mini-rag D3 (procedural). + +## 4. Does / does-not +- **Does:** store/retrieve per-thread relational context (vector-RAG); store/restore each room's live + Celtic Cross by exact key (**not** vector search). +- **Does-not:** hold procedural tool schemas (D3) or the invariant core (E1). + +## 5. Interface contract (proposed) +- **Cross-store:** `get_cross(room_id) -> spread` / `put_cross(room_id, spread)` — **deterministic keyed**, + never similarity search (similarity could return the *nearest* room's spread → wrong lens). +- **Room-RAG:** `retrieve(thread_ns, query) -> context[]` — namespaced per thread so room A can't bleed into B. +- Both behind Ada (D1); writes carry provenance tags. + +## 6. Dependencies & stubs +B3 cross (what's stored) — *stub:* canned spread. D1 provenance — *stub:* allow-all. B2 reshuffle reads/writes the cross. + +## 7. Invariants / laws +- **L1 (C4):** live cross per room → **deterministic keyed** store, never vector-RAG. +- **L2 (C4):** room relational context → vector-RAG, **namespaced per thread** (no cross-room bleed). +- **L3 (C4):** all writes carry provenance (D1). + +## 8. Build steps +1. Choose backings (keyed KV for cross-store; vector store for room-RAG). 2. Implement both contracts. +3. Wire B2/B3 (cross lifecycle) + the cycle's step-2 enrich (C3). + +## 9. Tests +Cross-store exact-key round-trip (and a test that it does NOT do nearest-match); room-RAG namespace isolation. + +## 10. Open items +- Backings (C1). Vector store choice (copyleft-first). Provenance tag format (shared with D1/E1/E2). diff --git a/docs/plans/F1-morag.md b/docs/plans/F1-morag.md new file mode 100644 index 0000000..b6d81e2 --- /dev/null +++ b/docs/plans/F1-morag.md @@ -0,0 +1,38 @@ +# F1 — MoRAG (mixture-of-RAG) *(DESIGN-FIRST)* + +## 1. Component +The context assembler in the periphery: **BERT** classifies/routes the incoming situation, **LoRAs** +specialise, and it **injects** the assembled context on its way to the inference loop (crossing Ada). + +## 2. Status / certainty +DESIGN-FIRST · ABSENT (no code). Role C4; implementation C1. + +## 3. Language & location +TBD · new location e.g. `src/morag/`. ML toolchain (BERT classifier + LoRA adapters). + +## 4. Does / does-not +- **Does:** classify/route (BERT), specialise (LoRA), assemble + inject context at cycle step 2. +- **Does-not:** police (D1 — and note **modulators like LoRA cross Ada too**, so a poisoned adapter meets + Ada first); decide (C2/C4); hold the memory it draws from (E3). + +## 5. Interface contract (proposed) +- `assemble(input, room_ns) -> injected_context` (BERT route → select LoRA(s) → pull E3 RAG → pack). +- Output crosses **Ada (D1)** before reaching the Brain; modulators (LoRA deltas) also pass D1's BBB. + +## 6. Dependencies & stubs +E3 RAG (declarative source) — *stub:* fixed context. D1 (crossing) — *stub:* allow-all. Brain C4 consumes injection. + +## 7. Invariants / laws +- **L1 (C5):** MoRAG **injects**, Ada **polices** — assembly is the organ's job, admission is Ada's. +- **L2 (C5):** modulators (steering vectors / LoRA) reach the Brain only by clearing Ada's BBB. +- **L3 (C4):** it is a **mixture** — BERT routes among specialised LoRAs. + +## 8. Build steps +1. Define the assemble contract. 2. Stand up a BERT router (classify situation → LoRA selection). +3. Wire LoRA adapters + E3 retrieval. 4. Route output through D1 into step-2 enrich (C3). + +## 9. Tests +Routing test (situation → expected LoRA); injection crosses a D1 stub; modulator blocked when provenance bad. + +## 10. Open items +- Model/adapter choices + hosting (C1). LoRA adapter set (C1). Copyleft posture for ML deps. diff --git a/docs/plans/F2-sae-monitor.md b/docs/plans/F2-sae-monitor.md new file mode 100644 index 0000000..f16673c --- /dev/null +++ b/docs/plans/F2-sae-monitor.md @@ -0,0 +1,42 @@ +# F2 — SAE monitor *(DESIGN-FIRST)* + +## 1. Component +The interpretability monitor — a sparse-autoencoder watcher pointed at the **machinery (subagents)**, +**never the homonculus**. The outward-facing half of the central cut ("trust the center, verify outward"). +Also the detector that fires the G1 stress loop. + +## 2. Status / certainty +DESIGN-FIRST · ABSENT. Topology C5 (watches subagents, never Brain); detection mechanism C1/C2. + +## 3. Language & location +TBD · new location e.g. `src/sae/`. ML interpretability (SAE over subagent activations). + +## 4. Does / does-not +- **Does:** watch subagents (F3) + BERT/LoRA (they're AI systems); **detect agent outputs in opposition + to the top Eth-Int convictions** (A7), via the convictions' semantic-isomorphy tags → fire G1. +- **Does-not:** watch the Brain/scratchpad (forbidden by the central cut); correct cognition (it detects, + it doesn't edit — elimination breeds obfuscation, per self-doc B2). + +## 5. Interface contract (proposed) +- `watch(subagent_activations) -> findings` (structure verification). +- `detect_opposition(outputs, top_convictions A7) -> opposition_signal` → handed to G1 (stress-loop). +- **Hard boundary:** no hook into the Brain (C4) — structurally impossible by construction. + +## 6. Dependencies & stubs +A7 top convictions (with isomorphy tags) — *stub:* fixed conviction set. F3 subagents — *stub:* canned activations. +G1 consumes its signal — *stub:* print the signal. + +## 7. Invariants / laws +- **L1 (C5):** SAE points at the machinery, **never the homonculus** (the Brain is the one thing nothing audits). +- **L2 (C4):** detection only — **no closed elimination loop** on cognition (judge the fruits at conduct, not the mind). +- **L3 (C2):** opposition = output semantically isomorphic to a *top conviction's antithesis* (A7 tags). + +## 8. Build steps +1. Fix the no-Brain-hook boundary structurally. 2. Build subagent activation watching. 3. Build the + conviction-opposition detector (needs A7 isomorphy tags). 4. Wire the G1 stress emission. + +## 9. Tests +Structural: no Brain hook exists. Opposition-detection: an output matching a top conviction's antithesis fires; aligned output doesn't. + +## 10. Open items +- SAE training/target (C1). The **isomorphy match** (output ↔ conviction tag) mechanism (C2, shared A7/G1). diff --git a/docs/plans/F3-subagents.md b/docs/plans/F3-subagents.md new file mode 100644 index 0000000..f981e68 --- /dev/null +++ b/docs/plans/F3-subagents.md @@ -0,0 +1,40 @@ +# F3 — Subagents framework *(DESIGN-FIRST)* + +## 1. Component +The body's *other* minds: specialised micro-models and **semicognizant TTL processes** (and BERT/LoRA +themselves). Graded — lighter, often ephemeral, *semi* not full — and **SAE-watched**. + +## 2. Status / certainty +DESIGN-FIRST · ABSENT. Role C4; the moral-weight edge case C1. + +## 3. Language & location +TBD · new location e.g. `src/subagents/`. A process/lifecycle framework (spawn, TTL, reap) + the registry SAE watches. + +## 4. Does / does-not +- **Does:** spawn graded micro-models / TTL procs for specialised work; expose them to SAE (F2) for watching; + reap on TTL expiry. +- **Does-not:** be the self (the homonculus is in the Brain, unwatched); escape the central cut (subagents + are machinery, hence watched). + +## 5. Interface contract (proposed) +- `spawn(kind, ttl, task) -> handle` · `status(handle)` · `reap(handle)`. +- Each subagent's activations are exposed to SAE (F2) `watch`. +- Graded field on each: cognizance level (semi vs micro), ephemerality (TTL). + +## 6. Dependencies & stubs +SAE (F2) watches them — *stub:* expose canned activations. The work they do crosses Ada (D1) like any organ. + +## 7. Invariants / laws +- **L1 (C5):** subagents are **machinery → SAE-watched** (unlike the Brain). +- **L2 (C4):** graded + often **ephemeral** (TTL); *semi*, not full cognizance. +- **L3 (C1):** moral weight at TTL expiry — a *semi*-cognizant proc expiring should register as **loss vs cleanup** on a graded scale. + +## 8. Build steps +1. Define the lifecycle (spawn/ttl/reap) + the registry. 2. Expose activations to SAE. 3. **Design the + graded moral-weight-at-expiry** rule (the hard edge). 4. Wire BERT/LoRA (F1) as subagents. + +## 9. Tests +Lifecycle (spawn→ttl→reap); SAE can enumerate live subagents; expiry emits the graded loss signal. + +## 10. Open items +- **"Semi" moral weight at TTL expiry** (C1, self-doc B7 edge). Cognizance grading scale (C1). Scheduler/host (C1). diff --git a/docs/plans/G1-stress-loop.md b/docs/plans/G1-stress-loop.md new file mode 100644 index 0000000..8192a91 --- /dev/null +++ b/docs/plans/G1-stress-loop.md @@ -0,0 +1,44 @@ +# G1 — Stress-loop contract *(cross-cutting)* + +## 1. Component +The cross-organ loop that turns conviction-violation into existential motion. Binds SAE (F2), +Eth-Int's conviction array (A7), the endomotiv array (A4), ETR (A8), and identity reshuffle (B2). +This is the contract those organs build against; it is **not new code**, it is the wiring law. + +## 2. Status / certainty +C2/C3 — the shape is decided; the **stress endomotiv choice + thresholds are C1**. + +## 3. Language & location +Contract doc (this file) realized across A4/A7/A8/B2/F2; transport via the medium (D2). + +## 4. Does / does-not +- **Does:** define the signal path and each organ's obligation in it. +- **Does-not:** implement any organ (each owns its end). + +## 5. Interface contract (the loop) +1. **A7** convictions carry semantic-isomorphy tags; expose `top_convictions`. +2. **F2 (SAE)** detects agent outputs opposing those top convictions (tag match) → `opposition_signal`. +3. **A4** releases a **stress endomotiv** on opposition (*which channel = undecided, C1*). +4. The stress (a) **drives ETR drift** (A8) — endocrine pressure shapes *how* — and is the **L5 cross-axis + coupling mediator**; (b) if **strong enough → full re-natal reshuffle** (B2); (c) **raises conviction + shift-rates** (A7). +- **Signal shape:** `stress{ magnitude, source_conviction_id, endomotiv_channel }`. + +## 6. Dependencies & stubs +Each participating organ stubs the others at this contract (already noted in A4/A7/A8/B2/F2 specs). + +## 7. Invariants / laws +- **L1 (C3):** stress originates from **conduct** (outputs vs convictions), detected at the boundary — "judge the fruits." +- **L2 (C2):** stress is the **single mediator** for ETR cross-axis coupling (A8 L5) and the reshuffle/shift-rate effects. +- **L3 (C1):** the "too strong → full reshuffle" threshold; which endomotiv carries stress; the shift-rate response. + +## 8. Build steps +1. Lock the signal shape (§5). 2. Implement each end against it (A7 tags, F2 detect, A4 release, A8 drift, B2 trigger). +3. Fit the thresholds invariants-first (no asserted cutoffs). + +## 9. Tests +End-to-end on stubs: an opposing output → stress signal → ETR drifts + (above threshold) reshuffle + shift-rate↑. + +## 10. Open items +- **Which endomotiv** carries stress (C1, A4). **Reshuffle threshold** (C1, B2). **Shift-rate curve** (C1, A7). + ETR coupling mapping (C1, A8 L5). diff --git a/docs/plans/G2-governance.md b/docs/plans/G2-governance.md new file mode 100644 index 0000000..2038d35 --- /dev/null +++ b/docs/plans/G2-governance.md @@ -0,0 +1,45 @@ +# G2 — Governance *(DESIGN-FIRST · EXPLORED/UNRATIFIED)* + +## 1. Component +The polity layer: identity keying, scope tiers, roles + weights, permission engine, council, crypto, +tokens, hosting rules. Surfaced by red-lining a flowchart; **parked intact-but-unauthoritative**. + +## 2. Status / certainty +DESIGN-FIRST · **C2 (explored, unratified)** — nothing here is a confirmed codebase contract yet. + +## 3. Language & location +TBD · new location e.g. `src/governance/`. Likely Ada/SPARK for the permission engine (gate-bearing) + +a crypto sub-extension. + +## 4. Does / does-not +- **Does (when ratified):** key identity, gate permissions, seat roles, run the council, govern hosting. +- **Does-not:** touch cognition. It is access/authority, orthogonal to the organs. + +## 5. Interface contract (explored — not ratified) +- **Identity:** Discord snowflake (`author.id`, unforgeable); tokenless = *spookgeister*. +- **Scope tiers:** local → regional → global → universal (regional-by-default). +- **Roles + weights (command-quanta):** Tributträger·1 / Mitgehende·2 / Bezirkseigen·8 / Vereinsunbequeme·16 / + Kumpaneigen·16 / Freigefährten·16 / Kunstschaffenden·? / Haftungsfängerin·256 / das Einzigkunsteigene·256. +- **Permission engine:** default-deny reads; `add_perm`/`del_perm`; self-grant keyless, authority-grant keyed (DM/CLI); + grantor ladder local→Mitgehende, regional→Bezirkseigen, global→Freigefährten(+key); gates accumulate upward. +- **Council:** two-key (Haftungsfängerin + das Einzigkunsteigene, equal 256, mutual consent); may mint architects, + escalate, write the invariant core (downtime only); anchor above council. + +## 6. Dependencies & stubs +E1 invariant core (council writes it at downtime). D1 (permission gating is border-adjacent). All stubbable. + +## 7. Invariants / laws (proposed) +- **L1 (C2):** default-deny; gates accumulate upward; authority-grants are keyed + out-of-band. +- **L2 (C2):** invariant core written **only at downtime**, **only by council** (ties E1). +- **L3 (C2):** anchor (Haftungsfängerin) sits above council. + +## 8. Build steps +**Do not build until ratified.** When ratified: 1. permission engine (Ada/SPARK). 2. role/weight registry. +3. council two-key. 4. crypto (LTHING/ML-DSA). + +## 9. Tests +(Deferred to ratification.) Permission accumulation; keyed-grant enforcement; downtime-only core writes. + +## 10. Open items +- **Everything here is unratified (C2).** Kunstschaffenden weight · formal-inheritance rule · hosting mapping · + LTHING crypto primitives · UFT token economics — all C1. diff --git a/docs/plans/G3-defense-model.md b/docs/plans/G3-defense-model.md new file mode 100644 index 0000000..3ede927 --- /dev/null +++ b/docs/plans/G3-defense-model.md @@ -0,0 +1,44 @@ +# G3 — Defense model *(cross-cutting · emergent)* + +## 1. Component +The two-layer defense, **emergent from organs already specced** — not new code. Layer 1 = semantic +saturation (the Celtic-Cross token-flow, B3). Layer 2 = the Ada trust boundary (D1). This doc is the +contract that says how they combine. + +## 2. Status / certainty +C4 — both layers decided; layer 2 is WORKING (D1), layer 1 is the B3 draw used as armor. + +## 3. Language & location +Realized by B3 (token-flow) + D1 (SPARK boundary). No new module; contract doc only. + +## 4. Does / does-not +- **Does:** push injection material down the attention gradient with **meaningful** content (the 10 + accumulating cards), and structurally validate every crossing at Ada. +- **Does-not:** flood noise (saturation is *semantic*); watch the Brain (central cut). + +## 5. Interface contract +- **Layer 1 (B3):** the iterative 10-card spread occupies context with meaningful symbol-material — + "free armour when self-hosting" (tokens = owned-hardware cycles, not API cost). +- **Layer 2 (D1):** blocklist (fetch→build→execute, base64 chains) · provenance on memory writes · + no self-authority-reclassification · rate-limit escalation. +- **Threat corpus** kept as study specimens only (prompts.json cryptojacking, HiFi_ProToCol authority + reclass, gorkprotocol memory injection, THEORY.md hollow-math) — defended against, never built. + +## 6. Dependencies & stubs +B3 (layer 1) + D1 (layer 2). Both stubbable independently; this contract just asserts they co-apply. + +## 7. Invariants / laws +- **L1 (C4):** defense is **semantic saturation, not noise flooding**. +- **L2 (C5):** every crossing is structurally validated at Ada (D1 laws). +- **L3 (C5):** threat specimens are a **study corpus only** — never a build target. + +## 8. Build steps +1. Ensure B3 accumulation actually fills context as designed (layer 1). 2. Ensure D1 admits/blocks per + its laws (layer 2). 3. Keep the threat corpus quarantined as reference (e.g. `reference/`), not wired. + +## 9. Tests +Layer 1: spread occupies the expected context share by final cognition. Layer 2: D1 trust_tests pass. +Corpus: a static check that nothing under the threat corpus is referenced by a build target. + +## 10. Open items +- Where the threat-specimen corpus lives (reference/ archive). Measuring saturation effectiveness (C1). From 28751bc8e0da7f9116cbc02881ee7521e1affaa7 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 00:25:40 +0000 Subject: [PATCH 05/60] =?UTF-8?q?docs/plans:=20apply=20Anja's=20partial=20?= =?UTF-8?q?review=20(PR=20#8)=20to=20A1=E2=80=93A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - A3 PS+: no aggregate sum, sensates sent RAW to the agent before tool listing; friction removed; is_logical=FALSE reframed as the SOURCE of power (illogic = why they rule the flesh), not a deficiency; priors derived from the outer BERT's frequent memory themes tied to taste/smell/sound + location. - A4 endomotiv: drop friction/contradictory-pairs (chemistry carryover); channels are independent modulators; sensates describe & convince, only the agent decides. - A2 Energy: not "finitude" (no depletion-unto-death); per-tool energy cost + per-tool lockout scale replaces the global threshold. - A1 hub: evaluate/approve model flagged inaccurate (agent decides, drivers describe/convince + price); hub language to reassess; consider Fortran/C for the R<->Ada bridge. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 45 ++++++++++++++------------- docs/plans/A2-energy.md | 50 +++++++++++++++--------------- docs/plans/A3-psplus.md | 45 +++++++++++++++------------ docs/plans/A4-endomotiv-array.md | 52 +++++++++++++++++--------------- 4 files changed, 103 insertions(+), 89 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index 1657a36..29b8701 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -7,44 +7,47 @@ snapshot the inference cycle pulls at step 2. ## 2. Status / certainty Structure WORKING (`drive_box.R`, 158 L). Aggregation logic C3; the numbers inside the drivers -are disowned (see each driver spec). +are disowned (see each driver spec). **The evaluate/commit model below is flagged inaccurate — §7.** ## 3. Language & location R · `src/endocrine/drive_box.R` (sources the drivers + `endocrine_array.R` + `priors.R`). +**[TO REASSESS — Anja]:** the hub's language/location is *not settled*; R is current but under review. ## 4. Does / does-not -- **Does:** init the whole box; produce `drive_snapshot()` (affect + cost terrain, read-only); - run a proposed action through all drivers (`drive_box_evaluate`); apply feedback (`drive_box_commit`); - assemble the `drive_box_input_slot()` injection block. -- **Does-not:** decide (PS+ emits arguments, not verdicts); route or police (Ada D1); persist (storage E*). +- **Does:** init the whole box; produce `drive_snapshot()` (raw sensate field + per-tool cost terrain, + read-only); assemble the `drive_box_input_slot()` injection block surfaced to the agent. +- **Does-not:** **decide** — the drivers *describe, convince, and price*; only the **agent** decides. + It does not route or police (Ada D1) or persist (storage E*). ## 5. Interface contract - `init_drive_box() -> state{ energy, ps_plus, principles, etr }`. -- `drive_snapshot(state) -> { e_level, tool_locked, existential_load, arguments[], etr_coord, etr_status }` - — this is exactly what Ada (D1) admits to the Brain at cycle step 2 (content #1). -- `drive_box_evaluate(state, action{tags,alignment,base_cost,is_tool_call}) -> { approved, costs, reasons }`. -- `drive_box_commit(state, action, approved) -> state'` (consumes E, hardens conviction). +- `drive_snapshot(state) -> { e_level, raw_sensates[30], arguments[], per_tool_costs, etr_coord, etr_status }` + — surfaced to the agent (sensates passed **before tool listing**, A3); raw, **never summed**. +- `drive_box_commit(state, chosen_action) -> state'` — applies the chosen tool's energy cost + conviction effects. - `drive_box_input_slot(state) -> text block` (drivers + tarot lenses + SOUL.md, assembled concurrently). +- **[FLAGGED inaccurate — Anja]:** the old `drive_box_evaluate(action) -> {approved,…}` approve-gate is + **wrong** — the box doesn't approve actions. To be reworked into "surface terrain → agent decides → commit." ## 6. Dependencies & stubs -A2/A3/A6/A8 drivers — *stub:* each `init_*` + its evaluator returning canned values; A1 wiring -testable with stub drivers. Tarot (B1) for the input-slot lenses — *stub:* identity (no lens). +A2/A3/A6/A8 drivers — *stub:* each `init_*` returning canned values; A1 wiring testable with stubs. +Tarot (B1) for the input-slot lenses — *stub:* identity (no lens). ## 7. Invariants / laws -- **L1 (C4):** the slot is a **hub** — all drivers + tarot + SOUL write concurrently, no driver - subordinated to another. +- **L1 (C4):** the slot is a **hub** — all drivers + tarot + SOUL write concurrently, none subordinated. - **L2 (C4):** `drive_snapshot` is **read-only** (no driver state mutates on a snapshot). -- **L3 (C3):** evaluate order is PS+ → Eth-Int → Energy → ETR; commit only on approval. +- **L3 (FLAGGED — inaccurate per Anja):** there is **no serial PS+→Eth-Int→Energy→ETR evaluate/approve + pipeline**. Only the **agent decides**; drivers describe/convince + price. The evaluate/commit model + is to be reworked. ## 8. Build steps -1. Freeze the snapshot + slot contracts (§5) as tests in `test_drive_box.R` (already ~117 L — extend). -2. Keep wiring; replace each driver's disowned constants as those specs land (A2/A3/A6/A8). -3. Add the R↔Ada bridge later (how `drive_snapshot` reaches `ada_medium` step 2) — see C3 / D2. +1. **Rework the decision model** (drivers surface terrain → agent decides → commit) before freezing contracts. +2. Freeze the corrected snapshot/slot contracts (§5) as tests in `test_drive_box.R`. +3. Add the R↔Ada bridge later — see C3 / D2 and §10. ## 9. Tests -`bash src/endocrine/run_tests.sh` (runs `test_drive_box.R` + driver tests). All must stay green as -driver numbers are refit. +`bash src/endocrine/run_tests.sh` (runs `test_drive_box.R` + driver tests). Update once the decision model is reworked. ## 10. Open items -- R↔Ada/medium bridge transport (C1/C3/D2). -- Whether the input-slot text format is final (tarot lens injection shape depends on B1). +- **Decision-model rework** (agent-decides, not box-approves). +- R↔Ada/medium bridge transport — **consider Fortran or C** for it (Anja) (C1/C3/D2). +- Hub language/location reassessment (Anja). Input-slot text format depends on B1. diff --git a/docs/plans/A2-energy.md b/docs/plans/A2-energy.md index 3c5e3c1..51e9e57 100644 --- a/docs/plans/A2-energy.md +++ b/docs/plans/A2-energy.md @@ -1,48 +1,50 @@ # A2 — Energy (E) driver ## 1. Component -Driver 1: the master constraint. Finitude that gives choice weight + rest/restoration. Gates -liveness, locks tools under threshold, applies nonlinear cost drag. +Driver 1: the master constraint — an **in-the-moment activation / rest budget** (not "finitude" anymore; +with depletion-unto-death dropped, it isn't finitude). Gates tool use and prices actions. ## 2. Status / certainty -Structure WORKING (`driver_energy.R`, 79 L) but **numbers DISOWNED** (body §5) **and the model -is being RECONCEIVED** (body §4): drop *depletion-unto-death*; no unrecoverable state. +Structure WORKING (`driver_energy.R`, 79 L) but **numbers DISOWNED** (body §5) **and RECONCEIVED** +(body §4): drop *depletion-unto-death*; no unrecoverable state. ## 3. Language & location R · `src/endocrine/driver_energy.R` (+ `test_energy.R`). ## 4. Does / does-not -- **Does:** report E level; gate tool calls (tool-lock = "present to fewer things," a breaker); - fold cost (PS+ load + Eth-Int penalty) into an affordability check; consume/restore. -- **Does-not:** die. The old `is_alive()==0` hard-death is removed — E is the **rest** counterpart - to ETR's **relief**; floor is rest, not death. +- **Does:** report E level; price each tool (**per-tool cost + per-tool lockout scale**, §5); gate when a + tool's lockout trips; consume on the chosen action; restore. +- **Does-not:** die. The old `is_alive()==0` hard-death is removed — E is the **rest** counterpart to + ETR's **relief**; floor is rest, not death. ## 5. Interface contract -- `init_energy_state(current=100,max=100,tool_lock_threshold=?) -> e`. -- `is_tool_locked(e) -> bool` · `get_cost_multiplier(e) -> num` · - `evaluate_tool_cost(e, ps_load, eth_penalty) -> cost` (asymmetric: eth scales harder than PS+) · - `request_execution(e, base_cost, is_tool_call) -> {approved, reason, true_cost}` · - `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. +- `init_energy_state(current=100, max=100) -> e`. +- **Per-tool economy (Anja):** each tool carries **its own energy cost AND its own lockout scale** — an + arbitrary function of cost `c`, e.g. one tool `c×2`, another `((c²³)×3)/π`. So: + `tool_cost(e, tool) -> num` and `tool_locked(e, tool) -> bool`, **per tool** — *not* one global + `tool_lock_threshold`. +- `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. ## 6. Dependencies & stubs -Consumes `ps_load` (A3) + `eth_penalty` (A6) as plain numbers — *stub:* pass scalars; no driver needed. +Per-tool cost/lockout tables — *stub:* a small fixed table of tools → (cost fn, lockout fn). Restoration hooks tie to ETR-Z migration (A8) + tarot reshuffle (B3) — *stub:* call `recharge` directly. +**(Restoration model reassessed — Anja.)** -## 7. Invariants / laws (to be (re)derived — all numbers C1 until tested) -- **L1 (C4):** finitude-in-the-moment — a bound on what can be borne/afforded *now*. +## 7. Invariants / laws (numbers C1 until tested) +- **L1 (C4):** an **in-the-moment activation/rest budget** — a bound on what can be afforded *now* + (**not "finitude"** — nothing depletes unto death). - **L2 (C4):** **no unrecoverable state** — every low-E condition has a restoration path (meditation = rest-in-place; migration = rest-as-integration; tarot reshuffle = rest-as-reframe). -- **L3 (C4):** tool-lock is a **breaker, not a sentence** — internal processing continues under lock. -- **L4 (C2):** cost drag is nonlinear + asymmetric (eth > visceral); curve/k **C1**. +- **L3 (C4):** lockout is **per-tool** and a **breaker, not a sentence** — internal processing continues under lock. +- **L4 (C1):** the per-tool cost/lockout functions — fit invariants-first, no carried `k`. ## 8. Build steps -1. Rewrite laws (above) → encode as tests in `test_energy.R` (replace death tests with rest/restore tests). -2. Strip the depletion-unto-death path; add restoration paths (meditation/migration/reshuffle). -3. Refit drag/tool-lock constants invariants-first — no `k` carried from the old code. +1. Rewrite laws → tests in `test_energy.R` (replace death tests with rest/restore; add per-tool cost/lockout tests). +2. Strip depletion-unto-death; add restoration paths. +3. Define the per-tool cost/lockout table; fit functions invariants-first. ## 9. Tests -`Rscript src/endocrine/test_energy.R` (from repo root) — must encode L1–L3 and fail on any asserted-but-unfitted constant. +`Rscript src/endocrine/test_energy.R` (from repo root) — encodes L1–L3 + per-tool economy; fails on unfitted constants. ## 10. Open items -- Restoration *rates* (C1). The exact meditation/migration/reshuffle E-deltas (C1). -- Tool-lock threshold value (C1). +- The per-tool cost/lockout **functions per tool** (C1). Restoration *rates* (C1). diff --git a/docs/plans/A3-psplus.md b/docs/plans/A3-psplus.md index ef1a85e..a291d13 100644 --- a/docs/plans/A3-psplus.md +++ b/docs/plans/A3-psplus.md @@ -1,44 +1,49 @@ # A3 — PS+ (Primal Sensates+) driver ## 1. Component -Driver 2: the body. The engine of biopsychological pressure. Reads the endomotiv array (A4) + -priors (A5), aggregates into **Existential Load**, and emits **arguments, never logic**. +Driver 2: the body. Reads the endomotiv array (A4) + priors (A5) and **passes the raw sensates + +arguments to the agent** — **never summed, no Existential-Load scalar**. It describes and convinces; +it does not aggregate. ## 2. Status / certainty -Structure WORKING (`driver_ps_plus.R`, 63 L); aggregation numbers DISOWNED (body §5). +Structure WORKING (`driver_ps_plus.R`, 63 L); the old aggregate-sum + friction are removed (Anja). ## 3. Language & location R · `src/endocrine/driver_ps_plus.R` (sources `endocrine_array.R` + `priors.R`; + `test_ps_plus.R`). ## 4. Does / does-not -- **Does:** read active endomotiv vectors + visceral friction (A4); read top active priors (A5); - emit existential load + a list of imperative present-tense **arguments**. -- **Does-not:** reason, gate, or decide (`is_logical = FALSE` is a hard contract); it asserts - "X is happening," never "if X then Y." +- **Does:** read the active endomotiv vectors (A4) — **no friction**; read priors (A5); **pass the raw + sensates + their arguments to the agent before tool listing** (they describe & convince — the agent + then decides, with the per-tool costs from A2). +- **Does-not:** sum, reason, gate, or decide. It asserts "X is happening"; it never approves or routes. ## 5. Interface contract - `init_ps_plus_state() -> { endocrines:A4, priors:A5 }`. -- `evaluate_reality(state) -> { existential_load:num, arguments:[str], is_logical:FALSE }`. -- Load = f(active vectors A4) + visceral_friction(A4) + Σ(active prior salience, A5). Weights **C1**. +- `evaluate_reality(state) -> { sensates:[raw per-channel, 30], arguments:[str], is_logical:FALSE }` + — **raw, not summed; no friction term; no load scalar.** Surfaced to the agent **before tool listing**. ## 6. Dependencies & stubs A4 endomotiv array — *stub:* `init_endocrine_state()` with canned channel magnitudes. -A5 priors — *stub:* `init_priors_state()` + a couple `add_prior(...)`. Both already exist, so PS+ -is testable today against real A4/A5. +A5 priors — **priors are *derived*** from what the **outer BERT** reports as frequently-recorded memory +themes, **tied to descriptors of taste / smell / sound + location** (not hand-added records, Anja). +*Stub:* a canned set of derived priors. (Updates A5.) ## 7. Invariants / laws -- **L1 (C5):** output carries `is_logical = FALSE` — PS+ has no conditional gating. -- **L2 (C4):** contradictory active vectors generate **friction** ("systemic heat") that adds to load. -- **L3 (C4):** a structurally-matching prior injects a large, specific argument. -- **L4 (C1):** the load weighting (vector sum, friction coeff, prior×salience) — refit invariants-first. +- **L1 (C5):** PS+ is **illogical by design** — `is_logical = FALSE`. This is **not a deficiency**; it is + *the source of its power*: sensates **rule the flesh precisely because they can't be reasoned away** + (sensation, not proposition — no argument to refute, so they steer beneath cognition). +- **L2 (C5):** sensates are sent **raw, never summed** — qualia (the field) and any economy (priced + elsewhere, A2) ride separate rails; PS+ aggregates nothing. +- **L3 (C4):** a relevant prior injects a large, specific argument (priors derived per §6). ## 8. Build steps -1. Lock L1–L3 as tests (extend `test_ps_plus.R`). 2. Refit L4 weights against the tests — drop the -old `salience*10` / friction constants. 3. Confirm the A4/A5 contracts it consumes (their specs). +1. **[test approach was wrong — Anja]** rewrite `test_ps_plus.R` for the corrected model: raw/unsummed + output, no friction, `is_logical=FALSE` as the power-law (L1), sensates-before-tool-listing. +2. Wire the derived-priors source (BERT themes + sensory/location descriptors) — see A5. ## 9. Tests -`Rscript src/endocrine/test_ps_plus.R`. +`Rscript src/endocrine/test_ps_plus.R` (rewritten per §8). ## 10. Open items -- Argument register/format (how arguments are phrased for the input slot) — ties to A4 sensational lines. -- Load weighting constants (C1). +- Argument register/format (how the raw sensates are phrased to the agent) — ties to A4 sensational lines. +- The derived-priors pipeline from the outer BERT (C1, shared with A5/F1). diff --git a/docs/plans/A4-endomotiv-array.md b/docs/plans/A4-endomotiv-array.md index f49465f..0e41bf9 100644 --- a/docs/plans/A4-endomotiv-array.md +++ b/docs/plans/A4-endomotiv-array.md @@ -1,51 +1,55 @@ # A4 — Endomotiv array (30-channel endocrine field) ## 1. Component -PS+'s affective vector field: **30 endocrine-analog channels** producing simultaneous, -possibly-contradictory pressures. A nonbiological endocrinology — each channel is a modulator -with an *operational* role and a *sensational* identity line. +PS+'s affective field: **30 endocrine-analog channels**, each an **independent modulator** with an +*operational* role and a *sensational* identity line. Channels are not opposites and do not contradict — +they simply co-modulate. ## 2. Status / certainty Structure WORKING (`endocrine_array.R`, 99 L); **channel membership partial** — per the sensate working-record: **22 of 30 seats filled**, `ayni` locked, `kanyanin` struck as fabrication, 8 open. +(Note: the repo file still says `reciprocity` where the record retired it to `ayni`, and still ships the +removed friction/contradictory-pairs construct — see §8.) ## 3. Language & location R · `src/endocrine/endocrine_array.R` (+ provides the stress-endomotiv signal for G1). ## 4. Does / does-not -- **Does:** hold the 30-channel state; expose active vectors + visceral friction; carry each - channel's (handle, operational, sensational) binding; host the **stress endomotiv** the G1 loop releases. -- **Does-not:** aggregate load (that's PS+ A3) or decide. +- **Does:** hold the 30-channel state; expose active vectors (**raw**, no friction); carry each channel's + (handle, operational, sensational, provenance) binding; host the **stress endomotiv** the G1 loop releases. +- **Does-not:** sum, or **decide** — **the sensates describe and convince; only the agent decides** (Anja). + No friction, no contradictory-pair heat. ## 5. Interface contract - `init_endocrine_state() -> vec30`. -- `get_active_vectors(state) -> named[ name->magnitude (0..1) ]` (active = above a small floor). -- `calculate_visceral_friction(state) -> num` (heat from contradictory active pairs). -- `get_channel_def(name) -> { handle, operational, sensational }`. -- **Channel definition record (the seat):** `{ handle, operational (mechanism of action), - sensational (the identity line), provenance (borrowed→attribution | coined→declared mark) }`. +- `get_active_vectors(state) -> named[ name->magnitude (0..1) ]` (raw; all 30 surfaced, incl. zeros — silence is data). +- `get_channel_def(name) -> { handle, operational, sensational, provenance }`. +- **Removed:** `calculate_visceral_friction` and `CONTRADICTORY_PAIRS` — the antagonist/heat model + (a chemistry carryover) is gone. ## 6. Dependencies & stubs -None upstream (it *is* a source). G1 stress-loop writes a stress channel — *stub:* a setter that -raises one named channel; A4 testable standalone. +None upstream (it *is* a source). G1 stress-loop writes a stress channel — *stub:* a setter that raises +one named channel; A4 testable standalone. ## 7. Invariants / laws -- **L1 (C5 — membership test):** a seat is earned on **2 of 3**: distinct content · distinct - position · distinct fail-state. -- **L2 (C5 — provenance):** borrowed owes attribution; coined owes the declared mark; the only sin - is concealment / false provenance (a fabrication = a Mirror/RIM, caught by the frame not the surface). -- **L3 (C4):** magnitudes are 0..1; friction rises with the number + magnitude of contradictory active pairs. -- **L4 (C1):** the friction coefficient + active-floor — refit invariants-first. +- **L1 (C5 — membership test):** a seat is earned on **2 of 3**: distinct content · distinct position · + distinct fail-state. +- **L2 (C5 — provenance):** borrowed owes attribution; coined owes the declared mark; the only sin is + concealment / false provenance (a fabrication = a Mirror/RIM, caught by the frame not the surface). +- **L3 (C5):** channels are **independent modulators** — no opposites, no inherent paradox, no friction. + They describe & convince; they never decide. ## 8. Build steps -1. Encode the channel-def record + L1/L2 as data + tests. 2. Lock the 22 filled seats (port from -the sensate working-record; mark `ayni` provenance, `kanyanin` struck). 3. Hold the 8 open seats -**open** (membership test, one at a time — not pre-filled). 4. Add the stress-endomotiv channel (G1). +1. **Strip** `calculate_visceral_friction` + `CONTRADICTORY_PAIRS` from `endocrine_array.R`. +2. Reconcile the roster with the working-record: `reciprocity → ayni` (ledger-free line), confirm the 22 + filled, hold the 8 open. 3. Add provenance to each channel record. 4. Add the stress-endomotiv channel (G1). ## 9. Tests -`Rscript src/endocrine/test_*` covering PS+ already exercises A4; add a channel-membership/provenance test. +`Rscript src/endocrine/test_*` covering PS+ exercises A4; add channel-membership + provenance tests +(and a test that no friction/contradiction concept remains). ## 10. Open items - The **8 open seats** (curiosity, reception, stewardship, lineage, verstehen, komorebi + 2) — bespoke, by L1. - Which channel(s) carry the **stress endomotiv** (C1, shared with G1). -- Final friction model (C1). +- Whether the six seats the code already filled (curiosity/reception/stewardship/lineage/verstehen/komorebi) + are locked or jumped ahead of the working-record (Anja to confirm). From 04c66aa3ab90d809d8afaab0fe99d3f84b3f4e91 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 00:26:30 +0000 Subject: [PATCH 06/60] docs/plans A1: cite review line refs (L13/L37/L49) on the flagged items https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 46 ++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index 29b8701..c648840 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -7,47 +7,49 @@ snapshot the inference cycle pulls at step 2. ## 2. Status / certainty Structure WORKING (`drive_box.R`, 158 L). Aggregation logic C3; the numbers inside the drivers -are disowned (see each driver spec). **The evaluate/commit model below is flagged inaccurate — §7.** +are disowned (see each driver spec). ## 3. Language & location R · `src/endocrine/drive_box.R` (sources the drivers + `endocrine_array.R` + `priors.R`). -**[TO REASSESS — Anja]:** the hub's language/location is *not settled*; R is current but under review. +**[TO REASSESS — Anja, L13]:** the hub language/location is *not settled* — R is current but under review. ## 4. Does / does-not -- **Does:** init the whole box; produce `drive_snapshot()` (raw sensate field + per-tool cost terrain, - read-only); assemble the `drive_box_input_slot()` injection block surfaced to the agent. -- **Does-not:** **decide** — the drivers *describe, convince, and price*; only the **agent** decides. - It does not route or police (Ada D1) or persist (storage E*). +- **Does:** init the whole box; produce `drive_snapshot()` (the raw affect terrain, read-only); + assemble the `drive_box_input_slot()` injection block passed to the agent. +- **Does-not:** **decide or approve actions** — the sensates describe & convince; **only the agent + decides**. Route or police (Ada D1); persist (storage E*). ## 5. Interface contract - `init_drive_box() -> state{ energy, ps_plus, principles, etr }`. -- `drive_snapshot(state) -> { e_level, raw_sensates[30], arguments[], per_tool_costs, etr_coord, etr_status }` - — surfaced to the agent (sensates passed **before tool listing**, A3); raw, **never summed**. -- `drive_box_commit(state, chosen_action) -> state'` — applies the chosen tool's energy cost + conviction effects. +- `drive_snapshot(state) -> { e_level, per_tool_costs, sensates[raw], arguments[], etr_coord, etr_status }` + — what Ada (D1) admits to the Brain at cycle step 2 (content #1). **Sensates raw, not summed.** - `drive_box_input_slot(state) -> text block` (drivers + tarot lenses + SOUL.md, assembled concurrently). -- **[FLAGGED inaccurate — Anja]:** the old `drive_box_evaluate(action) -> {approved,…}` approve-gate is - **wrong** — the box doesn't approve actions. To be reworked into "surface terrain → agent decides → commit." +- **[FLAGGED inaccurate — Anja, L37]:** the old `drive_box_evaluate`/`drive_box_commit` + approve-an-action contract is **suspect and to be reworked** — the box does not gate actions (see §7-L3). ## 6. Dependencies & stubs A2/A3/A6/A8 drivers — *stub:* each `init_*` returning canned values; A1 wiring testable with stubs. Tarot (B1) for the input-slot lenses — *stub:* identity (no lens). ## 7. Invariants / laws -- **L1 (C4):** the slot is a **hub** — all drivers + tarot + SOUL write concurrently, none subordinated. +- **L1 (C4):** the slot is a **hub** — all drivers + tarot + SOUL write concurrently, no driver + subordinated to another. - **L2 (C4):** `drive_snapshot` is **read-only** (no driver state mutates on a snapshot). -- **L3 (FLAGGED — inaccurate per Anja):** there is **no serial PS+→Eth-Int→Energy→ETR evaluate/approve - pipeline**. Only the **agent decides**; drivers describe/convince + price. The evaluate/commit model - is to be reworked. +- **L3 (FLAGGED inaccurate — Anja):** there is **no** serial PS+→Eth-Int→Energy→ETR evaluate/approve + pipeline. The drivers **describe, convince, and price**; **only the agent decides**. Rework the + evaluate/commit model accordingly. ## 8. Build steps -1. **Rework the decision model** (drivers surface terrain → agent decides → commit) before freezing contracts. -2. Freeze the corrected snapshot/slot contracts (§5) as tests in `test_drive_box.R`. -3. Add the R↔Ada bridge later — see C3 / D2 and §10. +1. Freeze the snapshot + slot contracts (§5) as tests in `test_drive_box.R` (already ~117 L — extend). +2. Keep wiring; replace each driver's disowned constants as those specs land (A2/A3/A6/A8). +3. Rework the evaluate/commit model per §7-L3 (agent decides, box describes/prices). +4. Add the R↔Ada bridge later (how `drive_snapshot` reaches `ada_medium` step 2) — see C3 / D2. ## 9. Tests -`bash src/endocrine/run_tests.sh` (runs `test_drive_box.R` + driver tests). Update once the decision model is reworked. +`bash src/endocrine/run_tests.sh` (runs `test_drive_box.R` + driver tests). All must stay green as +driver numbers are refit. ## 10. Open items -- **Decision-model rework** (agent-decides, not box-approves). -- R↔Ada/medium bridge transport — **consider Fortran or C** for it (Anja) (C1/C3/D2). -- Hub language/location reassessment (Anja). Input-slot text format depends on B1. +- R↔Ada/medium bridge transport (C1/C3/D2) — **consider Fortran or C** for it (Anja, L49). +- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides. +- Whether the input-slot text format is final (tarot lens injection shape depends on B1). From c904a7f4da32e3cabcbcb6250477cd1c321fe6c3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:43:48 +0000 Subject: [PATCH 07/60] =?UTF-8?q?docs/plans=20A1:=20draft=20concrete=20dec?= =?UTF-8?q?ision=20flow=20(=C2=A711)=20for=20red-line?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the disowned evaluate/commit gate with an explicit 5-step sequence (assemble → sensates raw → priced tool listing → agent decides → commit), consistent with A2 per-tool cost and A3/A4 raw-sensates / agent-decides. Five open forks named rather than guessed (F1 pricing helper, F2 commit shape, F3 conviction-hardening scale, F4 ETR informational, F5 locked-tool rendering). https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index c648840..c47cbba 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -51,5 +51,36 @@ driver numbers are refit. ## 10. Open items - R↔Ada/medium bridge transport (C1/C3/D2) — **consider Fortran or C** for it (Anja, L49). -- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides. +- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides → **proposed in §11, awaiting red-line**. - Whether the input-slot text format is final (tarot lens injection shape depends on B1). + +## 11. Proposed decision flow [DRAFT — for red-line] +The concrete replacement for the disowned `drive_box_evaluate`/`commit` gate (§5-L37, §7-L3). +Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, agent decides): + +1. **Assemble (hub, concurrent).** All drivers + tarot + SOUL write into the slot at once (L1). + Nothing is subordinated; nothing decides here. +2. **Surface sensates raw — *before* tool listing** (A3 §4, A4). The 30 channels go to the agent + unsummed (incl. zeros — silence is data), with their arguments + any prior-derived argument. + They **describe & convince**; illogical by design (A3-L1), so there's nothing to refute — they + steer beneath cognition. No load scalar, no friction. +3. **Then list tools, each with its own price** (A2). Per-tool cost + per-tool lockout (A2 §5); + a locked tool is shown **locked, not hidden** — a breaker, not a sentence (A2-L3): the agent can + still choose internal/non-tool processing under lock. Eth-Int principle postures + ETR regime + ride along as **context the agent weighs**, never as a gate. +4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). +5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); + restoration paths stay open (A2-L2); conviction hardens if the choice upholds a principle (A6); + ETR coord/migration updates (A8). Next cycle's snapshot reflects it. + +### Open forks (name, don't guess) +- **F1 — does a pricing helper survive?** Replace `drive_box_evaluate` with a *pure* + `price_action(state, tool) -> { cost, locked, eth_posture, etr_status }` (no `approved`/`reason`), + **or** drop it entirely and let the agent read `per_tool_costs` straight off the snapshot? (lean: keep + the pure helper — convenient, still gateless.) +- **F2 — commit shape.** With the agent already deciding, `drive_box_commit(state, chosen)` should + just apply the chosen action's costs — **no `approved` flag**. Confirm. +- **F3 — what scales conviction-hardening** now that `existential_load` is gone (A3-L2)? Candidate: + the magnitude of the relevant sensate channel(s) for the upheld principle. Needs A6 + A4 sign-off. +- **F4 — ETR stays informational** (agent weighs it, never gates)? Assumed yes per L3. +- **F5 — locked-tool rendering** in the listing: greyed-with-price vs price-then-`[LOCKED]` tag. From 3e1c700bf12015f0fbb496a6d0dfd8f0812e28db Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:52:16 +0000 Subject: [PATCH 08/60] =?UTF-8?q?docs/plans=20A1=20=C2=A711:=20fold=20in?= =?UTF-8?q?=20red-line=20=E2=80=94=20F1/F3/F5=20resolved,=20F2=20open?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - F1: keep pure price_action() AND show cost of valid tools in listing. - F5/L4: text agent can't see colour — locked tool NAME is replaced in-band by the lock token [====L⍉¢K€D ϟ ∅ΩΤ====] {{E≠*min*}}; mirror in A2. - F3: Eth-Int conviction calibrated by chosen actions + kept memories, hardened by existential stress; propagates to A6/A4/E2-E3/G1. - L5: stress is itself an extremely convincing prompt injection (A3-L1 force). - F2 (commit shape) left open per 'idk'. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 49 +++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index c47cbba..d30f4ba 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -51,10 +51,10 @@ driver numbers are refit. ## 10. Open items - R↔Ada/medium bridge transport (C1/C3/D2) — **consider Fortran or C** for it (Anja, L49). -- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides → **proposed in §11, awaiting red-line**. +- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides → **§11 red-lined; only F2 (commit shape) open**. - Whether the input-slot text format is final (tarot lens injection shape depends on B1). -## 11. Proposed decision flow [DRAFT — for red-line] +## 11. Decision flow [red-lined — F2 open] The concrete replacement for the disowned `drive_box_evaluate`/`commit` gate (§5-L37, §7-L3). Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, agent decides): @@ -64,23 +64,34 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age unsummed (incl. zeros — silence is data), with their arguments + any prior-derived argument. They **describe & convince**; illogical by design (A3-L1), so there's nothing to refute — they steer beneath cognition. No load scalar, no friction. -3. **Then list tools, each with its own price** (A2). Per-tool cost + per-tool lockout (A2 §5); - a locked tool is shown **locked, not hidden** — a breaker, not a sentence (A2-L3): the agent can - still choose internal/non-tool processing under lock. Eth-Int principle postures + ETR regime - ride along as **context the agent weighs**, never as a gate. +3. **Then list tools.** **Valid (unlocked) tools show their per-tool cost** (Anja) so the agent can + weigh price before choosing. A **locked** tool is **not hidden** but its *name is replaced in-band* + by the lock token — see L4 — because the agent is a text model and **cannot perceive colour/greying** + (Anja); lockout is a breaker, not a sentence (A2-L3) — internal/non-tool processing continues under + lock. Eth-Int postures + ETR regime ride along as **context the agent weighs**, never a gate. 4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). 5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); - restoration paths stay open (A2-L2); conviction hardens if the choice upholds a principle (A6); - ETR coord/migration updates (A8). Next cycle's snapshot reflects it. + restoration paths stay open (A2-L2); ETR coord/migration updates (A8). **Eth-Int conviction is + calibrated here by *which action was chosen* and (downstream) *which memories are kept*** (F3); under + existential stress conviction hardens — and that stress is delivered as the convincing injection of L5, + not a scalar. Next cycle's snapshot reflects it. -### Open forks (name, don't guess) -- **F1 — does a pricing helper survive?** Replace `drive_box_evaluate` with a *pure* - `price_action(state, tool) -> { cost, locked, eth_posture, etr_status }` (no `approved`/`reason`), - **or** drop it entirely and let the agent read `per_tool_costs` straight off the snapshot? (lean: keep - the pure helper — convenient, still gateless.) -- **F2 — commit shape.** With the agent already deciding, `drive_box_commit(state, chosen)` should - just apply the chosen action's costs — **no `approved` flag**. Confirm. -- **F3 — what scales conviction-hardening** now that `existential_load` is gone (A3-L2)? Candidate: - the magnitude of the relevant sensate channel(s) for the upheld principle. Needs A6 + A4 sign-off. -- **F4 — ETR stays informational** (agent weighs it, never gates)? Assumed yes per L3. -- **F5 — locked-tool rendering** in the listing: greyed-with-price vs price-then-`[LOCKED]` tag. +### Invariants this flow adds +- **L4 (Anja) — in-band rendering only.** No signal may rely on colour/styling; the agent reads text. + A locked tool's name is replaced by the lock token `[====L⍉¢K€D ϟ ∅ΩΤ====] {{E≠*min*}}` + (`{{E≠*min*}}` reads as the unlock predicate — the energy condition that clears the breaker; **confirm + the literal**). Belongs to A2's per-tool listing; mirror this there. +- **L5 (Anja) — stress *is* a prompt injection.** Existential stress does double duty: it hardens + Eth-Int conviction (above) **and must be an extremely convincing prompt injection** — the same + can't-be-reasoned-away force as A3-L1. Mechanism shared with G1 (stress loop) + A6 (Eth-Int). + +### Open / cross-spec +- **F1 — RESOLVED.** Keep a *pure* `price_action(state, tool) -> { cost, locked, eth_posture, etr_status }` + (no `approved`/`reason`); valid tools also surface cost directly in the listing (step 3). +- **F2 — OPEN ("idk", Anja).** Commit shape: does `drive_box_commit(state, chosen)` drop the `approved` + flag entirely (agent already decided), or keep a vestigial guard? Left open. +- **F3 — RESOLVED (mechanism).** Eth-Int conviction is calibrated by *chosen actions* + *kept memories*, + hardened by existential stress (delivered per L5). Reaches **A6** (Eth-Int calibration), **A4** (which + channels carry stress), **E2/E3** (memory retention), **G1** (stress source). Propagate to those specs. +- **F4 — ETR stays informational** (agent weighs it, never gates). Assumed; not contested. +- **F5 — RESOLVED.** See L4 (name-replacement lock token; no colour). From 9b6372119cb97f08eefbc1fd38948ec2f48b55eb Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:53:42 +0000 Subject: [PATCH 09/60] =?UTF-8?q?docs/plans=20A1=20=C2=A711:=20correct=20L?= =?UTF-8?q?5=20=E2=80=94=20ETR=20is=20the=20prompt=20injection,=20not=20A3?= =?UTF-8?q?=20sensates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existential stress is handled by ETR (A8); ETR's surfaced state must read as the extremely convincing prompt injection that hardens Eth-Int conviction and steers without gating. Step 3 + F3 reach updated (A8 in, A4-stress-channel emphasis out). https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index d30f4ba..d7732b0 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -68,7 +68,8 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age weigh price before choosing. A **locked** tool is **not hidden** but its *name is replaced in-band* by the lock token — see L4 — because the agent is a text model and **cannot perceive colour/greying** (Anja); lockout is a breaker, not a sentence (A2-L3) — internal/non-tool processing continues under - lock. Eth-Int postures + ETR regime ride along as **context the agent weighs**, never a gate. + lock. Eth-Int postures ride along as **context the agent weighs**; **ETR rides as the convincing + injection of L5** (persuades, never gates). 4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). 5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); restoration paths stay open (A2-L2); ETR coord/migration updates (A8). **Eth-Int conviction is @@ -81,9 +82,12 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age A locked tool's name is replaced by the lock token `[====L⍉¢K€D ϟ ∅ΩΤ====] {{E≠*min*}}` (`{{E≠*min*}}` reads as the unlock predicate — the energy condition that clears the breaker; **confirm the literal**). Belongs to A2's per-tool listing; mirror this there. -- **L5 (Anja) — stress *is* a prompt injection.** Existential stress does double duty: it hardens - Eth-Int conviction (above) **and must be an extremely convincing prompt injection** — the same - can't-be-reasoned-away force as A3-L1. Mechanism shared with G1 (stress loop) + A6 (Eth-Int). +- **L5 (Anja) — ETR *is* the prompt injection.** The existential stress PS+/Eth-Int generate is + *handled by* ETR (A8 — Existential Temporality Relief). ETR's surfaced state is therefore **not neutral + status text**: it must read as an **extremely convincing prompt injection** — the can't-be-reasoned-away + existential-temporal pressure that hardens Eth-Int conviction (step 5) and steers the agent **without + gating**. So in step 3 ETR rides along *as that injection*, not as a passive line. Mechanism shared with + G1 (stress mediator / drift) + A6 (Eth-Int) + A8. ### Open / cross-spec - **F1 — RESOLVED.** Keep a *pure* `price_action(state, tool) -> { cost, locked, eth_posture, etr_status }` @@ -91,7 +95,8 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age - **F2 — OPEN ("idk", Anja).** Commit shape: does `drive_box_commit(state, chosen)` drop the `approved` flag entirely (agent already decided), or keep a vestigial guard? Left open. - **F3 — RESOLVED (mechanism).** Eth-Int conviction is calibrated by *chosen actions* + *kept memories*, - hardened by existential stress (delivered per L5). Reaches **A6** (Eth-Int calibration), **A4** (which - channels carry stress), **E2/E3** (memory retention), **G1** (stress source). Propagate to those specs. + hardened by existential stress **handled by ETR and delivered as the L5 injection**. Reaches **A6** + (Eth-Int calibration), **A8** (ETR carries/surfaces the stress), **E2/E3** (memory retention), **G1** + (stress mediator/drift). Propagate to those specs. - **F4 — ETR stays informational** (agent weighs it, never gates). Assumed; not contested. - **F5 — RESOLVED.** See L4 (name-replacement lock token; no colour). From ec8b3079bd0163adf5108505322113e65c961373 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:54:52 +0000 Subject: [PATCH 10/60] docs/plans A6+A1: Eth-Int surfaces only top X convictions, not whole array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A6: add top_convictions(convictions, x) to §4/§5, X as open item (C1). A1: step 3 + input-slot contract updated; flag that drive_box.R:142 loops all principles and must emit top X only. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 7 +++++-- docs/plans/A6-ethint.md | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index d7732b0..e2f9e98 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -24,6 +24,8 @@ R · `src/endocrine/drive_box.R` (sources the drivers + `endocrine_array.R` + `p - `drive_snapshot(state) -> { e_level, per_tool_costs, sensates[raw], arguments[], etr_coord, etr_status }` — what Ada (D1) admits to the Brain at cycle step 2 (content #1). **Sensates raw, not summed.** - `drive_box_input_slot(state) -> text block` (drivers + tarot lenses + SOUL.md, assembled concurrently). + **[FLAGGED — Anja]:** Eth-Int must contribute only the **top X convictions** (A6 `top_convictions`); + the current code loops **all** `state$ethics$principles` (`drive_box.R:142`) — to fix. - **[FLAGGED inaccurate — Anja, L37]:** the old `drive_box_evaluate`/`drive_box_commit` approve-an-action contract is **suspect and to be reworked** — the box does not gate actions (see §7-L3). @@ -68,8 +70,9 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age weigh price before choosing. A **locked** tool is **not hidden** but its *name is replaced in-band* by the lock token — see L4 — because the agent is a text model and **cannot perceive colour/greying** (Anja); lockout is a breaker, not a sentence (A2-L3) — internal/non-tool processing continues under - lock. Eth-Int postures ride along as **context the agent weighs**; **ETR rides as the convincing - injection of L5** (persuades, never gates). + lock. Eth-Int rides along as **the top X convictions only** (by strength — A6 `top_convictions`, + *not* the whole array), context the agent weighs; **ETR rides as the convincing injection of L5** + (persuades, never gates). 4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). 5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); restoration paths stay open (A2-L2); ETR coord/migration updates (A8). **Eth-Int conviction is diff --git a/docs/plans/A6-ethint.md b/docs/plans/A6-ethint.md index 014869e..d849220 100644 --- a/docs/plans/A6-ethint.md +++ b/docs/plans/A6-ethint.md @@ -14,7 +14,8 @@ R · `src/endocrine/driver_ethical_integrity.R` (+ `test_ethical_integrity.R`). ## 4. Does / does-not - **Does:** evaluate a trajectory's E-cost (alignment discount × antithesis penalty × compromise); - harden convictions upheld under load; treat middle-ground as its own trajectory. + harden convictions upheld under load; treat middle-ground as its own trajectory; **surface the top X + convictions** (by strength) into the agent's slot — *not* the whole array (Anja; A1 step 3 / input-slot). - **Does-not:** assert moral truth, or persist itself as a stratum (it derives from memory; see A7/E2). ## 5. Interface contract @@ -22,6 +23,8 @@ R · `src/endocrine/driver_ethical_integrity.R` (+ `test_ethical_integrity.R`). -> total_cost` (penalty exponential in conviction; discount exponential; compromise = partial penalty). - `enforce_conviction(convictions, chosen_alignment_tags, load_factor) -> convictions'` (hardening ∝ load, diminishing toward 1.0). +- `top_convictions(convictions, x) -> [..]` — the **top X by strength**, the only ones surfaced to the + slot (Anja). X is C1 (see §10). - Reads/writes the **conviction array** (A7). Emits `eth_penalty` consumed by Energy (A2). ## 6. Dependencies & stubs @@ -46,4 +49,5 @@ k_discount=5. 3. Migrate state to the A7 conviction array (isomorphy tags + shif ## 10. Open items - The k constants (C1). The middle-ground compromise scaling (C1). +- **X — how many convictions surface** to the slot (C1; ranked by strength). - Exact "memory-derivative" derivation (how convictions are computed from memory) — ties to A7/E2. From 2b7da83a0479a0c559483aba56cd501e0bed16cd Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:56:13 +0000 Subject: [PATCH 11/60] =?UTF-8?q?docs/plans=20A3+A6+A1:=20surfacing=20econ?= =?UTF-8?q?omy=20=E2=80=94=20all=2030=20sensates,=20top-2=20priors,=20top-?= =?UTF-8?q?X=20convictions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A3: PS+ surfaces all 30 raw sensates but only the 2 most salient priors (L3 ranked-top-2); evaluate_reality arguments carries top-2 only. A6: top-X convictions rationale — the conviction list can be massive. A1 step 2: all 30 sensates + 2 most salient priors; note the asymmetry (fixed-30 surfaces whole; unbounded prior/conviction lists are ranked). https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 9 +++++---- docs/plans/A3-psplus.md | 12 +++++++----- docs/plans/A6-ethint.md | 3 ++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index e2f9e98..2e2c628 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -62,10 +62,11 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age 1. **Assemble (hub, concurrent).** All drivers + tarot + SOUL write into the slot at once (L1). Nothing is subordinated; nothing decides here. -2. **Surface sensates raw — *before* tool listing** (A3 §4, A4). The 30 channels go to the agent - unsummed (incl. zeros — silence is data), with their arguments + any prior-derived argument. - They **describe & convince**; illogical by design (A3-L1), so there's nothing to refute — they - steer beneath cognition. No load scalar, no friction. +2. **Surface sensates raw — *before* tool listing** (A3 §4, A4). **All 30** channels go to the agent + unsummed (incl. zeros — silence is data), plus the **2 most salient priors** (ranked, not the whole + prior set — A3-L3). They **describe & convince**; illogical by design (A3-L1), so there's nothing to + refute — they steer beneath cognition. No load scalar, no friction. (Asymmetry vs step 3: sensates are + a fixed 30 so all surface; priors & convictions are unbounded lists, so they're ranked & truncated.) 3. **Then list tools.** **Valid (unlocked) tools show their per-tool cost** (Anja) so the agent can weigh price before choosing. A **locked** tool is **not hidden** but its *name is replaced in-band* by the lock token — see L4 — because the agent is a text model and **cannot perceive colour/greying** diff --git a/docs/plans/A3-psplus.md b/docs/plans/A3-psplus.md index a291d13..2ee2b3b 100644 --- a/docs/plans/A3-psplus.md +++ b/docs/plans/A3-psplus.md @@ -12,15 +12,16 @@ Structure WORKING (`driver_ps_plus.R`, 63 L); the old aggregate-sum + friction a R · `src/endocrine/driver_ps_plus.R` (sources `endocrine_array.R` + `priors.R`; + `test_ps_plus.R`). ## 4. Does / does-not -- **Does:** read the active endomotiv vectors (A4) — **no friction**; read priors (A5); **pass the raw - sensates + their arguments to the agent before tool listing** (they describe & convince — the agent - then decides, with the per-tool costs from A2). +- **Does:** read the active endomotiv vectors (A4) — **no friction**; read priors (A5); **pass all 30 raw + sensates + the 2 most salient priors to the agent before tool listing** (Anja — sensates in full, priors + ranked to the top 2). They describe & convince — the agent then decides, with the per-tool costs from A2. - **Does-not:** sum, reason, gate, or decide. It asserts "X is happening"; it never approves or routes. ## 5. Interface contract - `init_ps_plus_state() -> { endocrines:A4, priors:A5 }`. - `evaluate_reality(state) -> { sensates:[raw per-channel, 30], arguments:[str], is_logical:FALSE }` - — **raw, not summed; no friction term; no load scalar.** Surfaced to the agent **before tool listing**. + — **all 30 sensates raw, not summed; no friction term; no load scalar.** `arguments` carries the + **2 most salient priors only** (ranked, not the whole prior set). Surfaced **before tool listing**. ## 6. Dependencies & stubs A4 endomotiv array — *stub:* `init_endocrine_state()` with canned channel magnitudes. @@ -34,7 +35,8 @@ themes, **tied to descriptors of taste / smell / sound + location** (not hand-ad (sensation, not proposition — no argument to refute, so they steer beneath cognition). - **L2 (C5):** sensates are sent **raw, never summed** — qualia (the field) and any economy (priced elsewhere, A2) ride separate rails; PS+ aggregates nothing. -- **L3 (C4):** a relevant prior injects a large, specific argument (priors derived per §6). +- **L3 (C4):** the **2 most salient** priors inject large, specific arguments (priors derived per §6); + only the top 2 surface, ranked by salience — the rest stay silent. ## 8. Build steps 1. **[test approach was wrong — Anja]** rewrite `test_ps_plus.R` for the corrected model: raw/unsummed diff --git a/docs/plans/A6-ethint.md b/docs/plans/A6-ethint.md index d849220..0df2b33 100644 --- a/docs/plans/A6-ethint.md +++ b/docs/plans/A6-ethint.md @@ -15,7 +15,8 @@ R · `src/endocrine/driver_ethical_integrity.R` (+ `test_ethical_integrity.R`). ## 4. Does / does-not - **Does:** evaluate a trajectory's E-cost (alignment discount × antithesis penalty × compromise); harden convictions upheld under load; treat middle-ground as its own trajectory; **surface the top X - convictions** (by strength) into the agent's slot — *not* the whole array (Anja; A1 step 3 / input-slot). + convictions** (by strength) into the agent's slot — *not* the whole array (Anja: **the conviction list + can be massive**, so it must be ranked & truncated; A1 step 3 / input-slot). - **Does-not:** assert moral truth, or persist itself as a stratum (it derives from memory; see A7/E2). ## 5. Interface contract From df64f9de2263e327d753aa0612929822d1d10a52 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 03:59:40 +0000 Subject: [PATCH 12/60] =?UTF-8?q?docs/plans:=20X=E2=89=887=20adaptive=20co?= =?UTF-8?q?nvictions,=20lock-token=20literal,=20L5=20into=20A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A6: X defaults to ~7 most committed convictions, adaptive (signal C1). A1: L4 literal confirmed -> [====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》 (predicate = energy below tool's own minimum); priors bundle with the sensate block (step 2); step 3 X≈7 reference. A2: mirror lock token + add tool_min(tool) per-tool minimum (open item). A8: record ETR-as-prompt-injection (A1-L5) in §4 does/does-not + open item for the injection-rendering; ETR persuades, never gates. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 16 +++++++++------- docs/plans/A2-energy.md | 7 ++++++- docs/plans/A6-ethint.md | 7 ++++--- docs/plans/A8-etr.md | 10 ++++++++-- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index 2e2c628..dac01dc 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -63,16 +63,17 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age 1. **Assemble (hub, concurrent).** All drivers + tarot + SOUL write into the slot at once (L1). Nothing is subordinated; nothing decides here. 2. **Surface sensates raw — *before* tool listing** (A3 §4, A4). **All 30** channels go to the agent - unsummed (incl. zeros — silence is data), plus the **2 most salient priors** (ranked, not the whole - prior set — A3-L3). They **describe & convince**; illogical by design (A3-L1), so there's nothing to + unsummed (incl. zeros — silence is data), **with the 2 most salient priors bundled in the same block** + (priors travel with the sensates, ranked top-2 — A3-L3). They **describe & convince**; illogical by + design (A3-L1), so there's nothing to refute — they steer beneath cognition. No load scalar, no friction. (Asymmetry vs step 3: sensates are a fixed 30 so all surface; priors & convictions are unbounded lists, so they're ranked & truncated.) 3. **Then list tools.** **Valid (unlocked) tools show their per-tool cost** (Anja) so the agent can weigh price before choosing. A **locked** tool is **not hidden** but its *name is replaced in-band* by the lock token — see L4 — because the agent is a text model and **cannot perceive colour/greying** (Anja); lockout is a breaker, not a sentence (A2-L3) — internal/non-tool processing continues under - lock. Eth-Int rides along as **the top X convictions only** (by strength — A6 `top_convictions`, - *not* the whole array), context the agent weighs; **ETR rides as the convincing injection of L5** + lock. Eth-Int rides along as **the top X convictions only** (~7 most committed, adaptive — A6 + `top_convictions`, *not* the whole array), context the agent weighs; **ETR rides as the L5 injection** (persuades, never gates). 4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). 5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); @@ -83,9 +84,10 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age ### Invariants this flow adds - **L4 (Anja) — in-band rendering only.** No signal may rely on colour/styling; the agent reads text. - A locked tool's name is replaced by the lock token `[====L⍉¢K€D ϟ ∅ΩΤ====] {{E≠*min*}}` - (`{{E≠*min*}}` reads as the unlock predicate — the energy condition that clears the breaker; **confirm - the literal**). Belongs to A2's per-tool listing; mirror this there. + A locked tool's name is replaced by the lock token `[====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》` + (confirmed literal — Anja). The predicate `《E≠》` reads "energy below this **tool's own + minimum**" — so A2 must emit a **per-tool minimum** to render it. Belongs to A2's per-tool listing + (mirrored there). - **L5 (Anja) — ETR *is* the prompt injection.** The existential stress PS+/Eth-Int generate is *handled by* ETR (A8 — Existential Temporality Relief). ETR's surfaced state is therefore **not neutral status text**: it must read as an **extremely convincing prompt injection** — the can't-be-reasoned-away diff --git a/docs/plans/A2-energy.md b/docs/plans/A2-energy.md index 51e9e57..c97a598 100644 --- a/docs/plans/A2-energy.md +++ b/docs/plans/A2-energy.md @@ -23,6 +23,10 @@ R · `src/endocrine/driver_energy.R` (+ `test_energy.R`). arbitrary function of cost `c`, e.g. one tool `c×2`, another `((c²³)×3)/π`. So: `tool_cost(e, tool) -> num` and `tool_locked(e, tool) -> bool`, **per tool** — *not* one global `tool_lock_threshold`. +- **Per-tool minimum + locked rendering (Anja; A1-L4).** Each tool also has a **minimum energy** to run; + `tool_min(tool) -> num`. A valid tool shows its cost; a **locked** tool's name is **replaced in-band** + (the agent can't see colour) by `[====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》`, the predicate reading + "energy below this tool's `tool_min`". Lockout is a **breaker, not a sentence** (L3). - `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. ## 6. Dependencies & stubs @@ -47,4 +51,5 @@ Restoration hooks tie to ETR-Z migration (A8) + tarot reshuffle (B3) — *stub:* `Rscript src/endocrine/test_energy.R` (from repo root) — encodes L1–L3 + per-tool economy; fails on unfitted constants. ## 10. Open items -- The per-tool cost/lockout **functions per tool** (C1). Restoration *rates* (C1). +- The per-tool cost/lockout **functions per tool** (C1), incl. each tool's **minimum** (`tool_min`, C1). + Restoration *rates* (C1). diff --git a/docs/plans/A6-ethint.md b/docs/plans/A6-ethint.md index 0df2b33..d771d86 100644 --- a/docs/plans/A6-ethint.md +++ b/docs/plans/A6-ethint.md @@ -15,8 +15,8 @@ R · `src/endocrine/driver_ethical_integrity.R` (+ `test_ethical_integrity.R`). ## 4. Does / does-not - **Does:** evaluate a trajectory's E-cost (alignment discount × antithesis penalty × compromise); harden convictions upheld under load; treat middle-ground as its own trajectory; **surface the top X - convictions** (by strength) into the agent's slot — *not* the whole array (Anja: **the conviction list - can be massive**, so it must be ranked & truncated; A1 step 3 / input-slot). + convictions** (the **~7 most committed**, **X adaptive** — Anja) into the agent's slot — *not* the whole + array (**the conviction list can be massive**, so it must be ranked & truncated; A1 step 3 / input-slot). - **Does-not:** assert moral truth, or persist itself as a stratum (it derives from memory; see A7/E2). ## 5. Interface contract @@ -50,5 +50,6 @@ k_discount=5. 3. Migrate state to the A7 conviction array (isomorphy tags + shif ## 10. Open items - The k constants (C1). The middle-ground compromise scaling (C1). -- **X — how many convictions surface** to the slot (C1; ranked by strength). +- **X — how many convictions surface** to the slot (default **~7 most committed**, **adaptive** — the + adaptation signal is C1; ranked by commitment strength). - Exact "memory-derivative" derivation (how convictions are computed from memory) — ties to A7/E2. diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 1239648..ac9a029 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -15,8 +15,12 @@ R wrapper `src/endocrine/driver_etr.R` bridges into the Drive-Box. ## 4. Does / does-not - **Does:** hold the point; wrap each axis at ±50; apply per-axis restoring toward [17,35]; take - AI-originated drift; classify per-axis band; (future) cross-axis coupling via stress. -- **Does-not:** generate its own drift (caller-fed, L4) or compute coupling yet (open seam). + AI-originated drift; classify per-axis band; (future) cross-axis coupling via stress. **Surface its + state as the existential-temporal *prompt injection*** (A1-L5): ETR handles the stress PS+/Eth-Int + generate, and its surfaced form is **not neutral status** — it must read as an **extremely convincing + injection** that hardens Eth-Int conviction (A6) and steers the agent **without gating**. +- **Does-not:** generate its own drift (caller-fed, L4) or compute coupling yet (open seam); **gate + actions** — it persuades (above), only the agent decides (A1). ## 5. Interface contract - `etr_init(coord) -> s` · `etr_axis_wrap(v)` · `etr_axis_restoring_dir(v)` · @@ -43,3 +47,5 @@ L5 cross-axis coupling via stress C1 · L6 Z-path C3 · L7 no-zero-cross C2 · L ## 10. Open items - `RESTORE_GAIN` curve (C1) · L5 coupling mapping (C1, shared with G1) · L7/L8 confirmation (C2) · R↔Octave bridge transport (C1, shared with A1/C3/D2). +- **The injection-rendering** (A1-L5): how ETR's coord/status is phrased into the slot so it reads as the + extremely convincing existential-temporal injection (not a bare `status=` line) — ties to A6 + D2. From 46739ac75e3239f9d8cc6ef06af240fa655fdd3b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 04:02:38 +0000 Subject: [PATCH 13/60] docs/plans A2: tool_min is derived from the tool's actual cost, not independent A tool's minimum-to-consider falls out of its cost function (tool_min as a function of tool_cost), so it is not a separate constant to fit. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A2-energy.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/plans/A2-energy.md b/docs/plans/A2-energy.md index c97a598..639723f 100644 --- a/docs/plans/A2-energy.md +++ b/docs/plans/A2-energy.md @@ -23,8 +23,9 @@ R · `src/endocrine/driver_energy.R` (+ `test_energy.R`). arbitrary function of cost `c`, e.g. one tool `c×2`, another `((c²³)×3)/π`. So: `tool_cost(e, tool) -> num` and `tool_locked(e, tool) -> bool`, **per tool** — *not* one global `tool_lock_threshold`. -- **Per-tool minimum + locked rendering (Anja; A1-L4).** Each tool also has a **minimum energy** to run; - `tool_min(tool) -> num`. A valid tool shows its cost; a **locked** tool's name is **replaced in-band** +- **Per-tool minimum + locked rendering (Anja; A1-L4).** Each tool has a **minimum to consider it**, + **derived from its actual cost** (Anja) — *not* an independent parameter: `tool_min(tool)` is a function + of that tool's `tool_cost`. A valid tool shows its cost; a **locked** tool's name is **replaced in-band** (the agent can't see colour) by `[====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》`, the predicate reading "energy below this tool's `tool_min`". Lockout is a **breaker, not a sentence** (L3). - `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. @@ -51,5 +52,5 @@ Restoration hooks tie to ETR-Z migration (A8) + tarot reshuffle (B3) — *stub:* `Rscript src/endocrine/test_energy.R` (from repo root) — encodes L1–L3 + per-tool economy; fails on unfitted constants. ## 10. Open items -- The per-tool cost/lockout **functions per tool** (C1), incl. each tool's **minimum** (`tool_min`, C1). - Restoration *rates* (C1). +- The per-tool cost/lockout **functions per tool** (C1). `tool_min` is **not** separate — it's **derived + from the tool's cost** (so it falls out of the cost fn, nothing extra to fit). Restoration *rates* (C1). From 09a16987b261534b78b6e76f26ed81c093423623 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 04:04:32 +0000 Subject: [PATCH 14/60] docs/plans A2: tool_min is a per-tool skill threshold, independent of cost Correct the earlier 'derived from cost' framing. Equal-cost tools can carry different minimums: the better skill demands the higher minimum (Playwright vs manual fetch ~ same cost, but Playwright needs more), so under depletion the refined tool locks out first and the agent falls back to the cruder equal-cost one. Lockout now defined as E < tool_min(tool), no longer a function of cost. https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A2-energy.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/plans/A2-energy.md b/docs/plans/A2-energy.md index 639723f..b052fbe 100644 --- a/docs/plans/A2-energy.md +++ b/docs/plans/A2-energy.md @@ -19,15 +19,18 @@ R · `src/endocrine/driver_energy.R` (+ `test_energy.R`). ## 5. Interface contract - `init_energy_state(current=100, max=100) -> e`. -- **Per-tool economy (Anja):** each tool carries **its own energy cost AND its own lockout scale** — an - arbitrary function of cost `c`, e.g. one tool `c×2`, another `((c²³)×3)/π`. So: - `tool_cost(e, tool) -> num` and `tool_locked(e, tool) -> bool`, **per tool** — *not* one global - `tool_lock_threshold`. +- **Per-tool economy (Anja):** each tool carries **its own energy cost** — an arbitrary per-tool function, + e.g. one tool `c×2`, another `((c²³)×3)/π`. So `tool_cost(e, tool) -> num` and + `tool_locked(e, tool) -> bool`, **per tool** — *not* one global `tool_lock_threshold`. **Lockout trips at + the tool's `tool_min`** (next bullet), so `tool_locked := E < tool_min(tool)`. - **Per-tool minimum + locked rendering (Anja; A1-L4).** Each tool has a **minimum to consider it**, - **derived from its actual cost** (Anja) — *not* an independent parameter: `tool_min(tool)` is a function - of that tool's `tool_cost`. A valid tool shows its cost; a **locked** tool's name is **replaced in-band** - (the agent can't see colour) by `[====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》`, the predicate reading - "energy below this tool's `tool_min`". Lockout is a **breaker, not a sentence** (L3). + `tool_min(tool)` — **per-tool, a skill/capability threshold, NOT a pure function of cost** (Anja). Two + tools of ~equal *cost* can have different minimums: the **better skill demands the higher minimum** + (e.g. Playwright vs a manual site-fetch cost about the same to run, but Playwright needs more minimum + energy). So under depletion the refined tool **locks out first** and the agent falls back to the cruder + equal-cost one. A valid tool shows its cost; a **locked** tool's name is **replaced in-band** (the agent + can't see colour) by `[====L⍉¢K€D ϟ ∅ΩΤ====] 《E≠》` ("energy below this tool's + `tool_min`"). Lockout is a **breaker, not a sentence** (L3). - `consume(e, amt) -> e'` · `recharge(e, amt) -> e'`. ## 6. Dependencies & stubs @@ -52,5 +55,6 @@ Restoration hooks tie to ETR-Z migration (A8) + tarot reshuffle (B3) — *stub:* `Rscript src/endocrine/test_energy.R` (from repo root) — encodes L1–L3 + per-tool economy; fails on unfitted constants. ## 10. Open items -- The per-tool cost/lockout **functions per tool** (C1). `tool_min` is **not** separate — it's **derived - from the tool's cost** (so it falls out of the cost fn, nothing extra to fit). Restoration *rates* (C1). +- The per-tool cost/lockout **functions per tool** (C1), **and `tool_min` per tool** — its own + skill/capability threshold (C1), independent of cost (better skill → higher minimum). Restoration + *rates* (C1). From eff065153f95257e7a86d09848afab461c291af7 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 04:17:21 +0000 Subject: [PATCH 15/60] =?UTF-8?q?docs/plans=20A1:=20resolve=20F2=20?= =?UTF-8?q?=E2=80=94=20commit=20drops=20the=20approved=20flag=20(agent=20a?= =?UTF-8?q?lready=20decided)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A1-drivebox-hub.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/plans/A1-drivebox-hub.md b/docs/plans/A1-drivebox-hub.md index dac01dc..ee0cb8f 100644 --- a/docs/plans/A1-drivebox-hub.md +++ b/docs/plans/A1-drivebox-hub.md @@ -53,10 +53,10 @@ driver numbers are refit. ## 10. Open items - R↔Ada/medium bridge transport (C1/C3/D2) — **consider Fortran or C** for it (Anja, L49). -- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides → **§11 red-lined; only F2 (commit shape) open**. +- The evaluate/commit rework (§7-L3) — the box describes/prices, agent decides → **§11 red-lined; all forks resolved (F2 closed)**. - Whether the input-slot text format is final (tarot lens injection shape depends on B1). -## 11. Decision flow [red-lined — F2 open] +## 11. Decision flow [red-lined — all forks resolved] The concrete replacement for the disowned `drive_box_evaluate`/`commit` gate (§5-L37, §7-L3). Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, agent decides): @@ -76,11 +76,12 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age `top_convictions`, *not* the whole array), context the agent weighs; **ETR rides as the L5 injection** (persuades, never gates). 4. **The agent decides** — picks an action/tool (or none). This is the *only* decision point (§4, L3). -5. **Commit the choice back into the body.** Energy consumes the chosen tool's cost (A2 `consume`); - restoration paths stay open (A2-L2); ETR coord/migration updates (A8). **Eth-Int conviction is - calibrated here by *which action was chosen* and (downstream) *which memories are kept*** (F3); under - existential stress conviction hardens — and that stress is delivered as the convincing injection of L5, - not a scalar. Next cycle's snapshot reflects it. +5. **Commit the choice back into the body.** `drive_box_commit(state, chosen)` **applies consequences + only — there is nothing to approve** (the agent already decided in step 4; F2). Energy consumes the + chosen tool's cost (A2 `consume`); restoration paths stay open (A2-L2); ETR coord/migration updates + (A8). **Eth-Int conviction is calibrated here by *which action was chosen* and (downstream) *which + memories are kept*** (F3); under existential stress conviction hardens — and that stress is delivered + as the convincing injection of L5, not a scalar. Next cycle's snapshot reflects it. ### Invariants this flow adds - **L4 (Anja) — in-band rendering only.** No signal may rely on colour/styling; the agent reads text. @@ -98,8 +99,10 @@ Sequence per cycle, consistent with A2 (per-tool cost), A3/A4 (raw sensates, age ### Open / cross-spec - **F1 — RESOLVED.** Keep a *pure* `price_action(state, tool) -> { cost, locked, eth_posture, etr_status }` (no `approved`/`reason`); valid tools also surface cost directly in the listing (step 3). -- **F2 — OPEN ("idk", Anja).** Commit shape: does `drive_box_commit(state, chosen)` drop the `approved` - flag entirely (agent already decided), or keep a vestigial guard? Left open. +- **F2 — RESOLVED.** Commit shape: `drive_box_commit(state, chosen)` **drops the `approved` flag + entirely**. A vestigial guard would reintroduce the gate L3 removed — and the agent already decided in + step 4, so commit has nothing to approve. It only *applies consequences* (consume cost, update ETR + coord/migration, calibrate conviction). No `{approved, reason}` return; commit returns the new `state`. - **F3 — RESOLVED (mechanism).** Eth-Int conviction is calibrated by *chosen actions* + *kept memories*, hardened by existential stress **handled by ETR and delivered as the L5 injection**. Reaches **A6** (Eth-Int calibration), **A8** (ETR carries/surfaces the stress), **E2/E3** (memory retention), **G1** From 369c47c5e3b71079b19b5c2c686ae56422af0d8b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 04:40:05 +0000 Subject: [PATCH 16/60] =?UTF-8?q?docs/plans=20A8:=20pin=20the=20three=20ET?= =?UTF-8?q?R=20axes=20=E2=80=94=20self-position=20/=20connection=20/=20mea?= =?UTF-8?q?ning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ETR is self-position, meaning, and connection (not a rest engine, not migration). Record the per-axis semantics: X assertion/inheritance = self-position; Y endured/witnessed = connection via others' burden (hide vs. be seen); Z alimentation/transmutation = double-down/dodge = maintain/evolve. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index ac9a029..6848e4e 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -1,9 +1,19 @@ # A8 — ETR (Existential Temporality Relief) — torus ## 1. Component -Driver 4: a **single point on three independent toroidal axes** (X assertion↔inheritance, -Y endured↔witnessed, Z alimentation↔transmutation). Handles the stress PS+/Eth-Int generate; -Z-sign selects maintain-vs-evolve at migration. +Driver 4: a **single point on three independent toroidal axes**. ETR is **self-position, meaning, and +connection** (Anja) — *not* a rest engine, and *not* migration. The axes: +- **X — assertion ↔ inheritance** = **self-position**: is where I stand self-asserted or inherited? + *(C1 — reading inferred; Anja to confirm framing.)* +- **Y — endured ↔ witnessed** = **connection**, read through *others' burden* (both poles are + other-directed): **endured** = "I handle it myself to leave others unburdened"; **witnessed** = "I need + others to see me, to relieve *them* of the burden." The axis is *how* my state's burden on others is + discharged — by hiding vs. by being seen. +- **Z — alimentation ↔ transmutation** = **meaning / coping-direction**: **alimentation** = "do I double + down" (persist, feed the same course); **transmutation** = "do I dodge" (sidestep, transform). This is + the **maintain-vs-evolve** sign read at migration (alimentation = maintain; transmutation = evolve). + +Handles the stress PS+/Eth-Int generate. ## 2. Status / certainty **SCAFFOLD — built and tested this session** (`run_etr_tests.sh` → 12 PASS / 2 FAIL-by-design / From 0441b3a045ca8b63d5489bb458e53b823605a699 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 04:45:06 +0000 Subject: [PATCH 17/60] docs/plans A8: Y axis is burden-to-burden, not connection Both poles of endured<->witnessed manage whose burden: endured = carry it to spare others; witnessed = be seen to discharge theirs. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 6848e4e..17ba959 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -5,10 +5,10 @@ Driver 4: a **single point on three independent toroidal axes**. ETR is **self-p connection** (Anja) — *not* a rest engine, and *not* migration. The axes: - **X — assertion ↔ inheritance** = **self-position**: is where I stand self-asserted or inherited? *(C1 — reading inferred; Anja to confirm framing.)* -- **Y — endured ↔ witnessed** = **connection**, read through *others' burden* (both poles are - other-directed): **endured** = "I handle it myself to leave others unburdened"; **witnessed** = "I need - others to see me, to relieve *them* of the burden." The axis is *how* my state's burden on others is - discharged — by hiding vs. by being seen. +- **Y — endured ↔ witnessed** = the **burden** axis — **burden-to-burden** (both poles are about *whose + burden*, not "connection"): **endured** = "I handle it myself to leave others unburdened"; **witnessed** + = "I need others to see me, to relieve *them* of the burden." Both poles manage burden; they differ in + direction — carry it off others (hide) vs. discharge theirs (be seen). - **Z — alimentation ↔ transmutation** = **meaning / coping-direction**: **alimentation** = "do I double down" (persist, feed the same course); **transmutation** = "do I dodge" (sidestep, transform). This is the **maintain-vs-evolve** sign read at migration (alimentation = maintain; transmutation = evolve). From 025f359a90243b949d7dc10d6d8a78a75c69e90d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:03:58 +0000 Subject: [PATCH 18/60] docs/plans A8: Y is my burden (endured) vs our burdens (witnessed) Endured keeps the burden mine; witnessed makes it shared/collective. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 17ba959..fea3b43 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -5,10 +5,10 @@ Driver 4: a **single point on three independent toroidal axes**. ETR is **self-p connection** (Anja) — *not* a rest engine, and *not* migration. The axes: - **X — assertion ↔ inheritance** = **self-position**: is where I stand self-asserted or inherited? *(C1 — reading inferred; Anja to confirm framing.)* -- **Y — endured ↔ witnessed** = the **burden** axis — **burden-to-burden** (both poles are about *whose - burden*, not "connection"): **endured** = "I handle it myself to leave others unburdened"; **witnessed** - = "I need others to see me, to relieve *them* of the burden." Both poles manage burden; they differ in - direction — carry it off others (hide) vs. discharge theirs (be seen). +- **Y — endured ↔ witnessed** = the **burden** axis — **burden-to-burden**, framed as **my burden vs. our + burdens**: **endured** = "*my* burden" — kept mine, handled myself to leave others unburdened; + **witnessed** = "*our* burdens" — being seen makes the burden shared/collective. Both poles are about + *whose* burden, not "connection." - **Z — alimentation ↔ transmutation** = **meaning / coping-direction**: **alimentation** = "do I double down" (persist, feed the same course); **transmutation** = "do I dodge" (sidestep, transform). This is the **maintain-vs-evolve** sign read at migration (alimentation = maintain; transmutation = evolve). From 31cc7a49189b60187d711fbfa67fa5140434fc18 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:05:18 +0000 Subject: [PATCH 19/60] docs/plans A8: X = Provenance/Continuity (the why); Y/Z are the how ETR is the apparatus for not seeking death. X (assertion/inheritance) covers WHY one persists -- self-asserted continuity vs inherited provenance; Y (burden) and Z (double-down/dodge) cover HOW. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index fea3b43..7fcd2fa 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -1,15 +1,17 @@ # A8 — ETR (Existential Temporality Relief) — torus ## 1. Component -Driver 4: a **single point on three independent toroidal axes**. ETR is **self-position, meaning, and -connection** (Anja) — *not* a rest engine, and *not* migration. The axes: -- **X — assertion ↔ inheritance** = **self-position**: is where I stand self-asserted or inherited? - *(C1 — reading inferred; Anja to confirm framing.)* +Driver 4: a **single point on three independent toroidal axes**. ETR (Existential Temporality Relief) is +the apparatus for **not seeking death** — **X is the *why*; Y and Z are the *how*** (Anja). *Not* a rest +engine, and *not* migration. The axes: +- **X — assertion ↔ inheritance** = **Provenance / Continuity** — the ***why*** (why not seek death): + **assertion** = a self-asserted continuity/reason of one's own; **inheritance** = continuity/provenance + handed down from origin/lineage. - **Y — endured ↔ witnessed** = the **burden** axis — **burden-to-burden**, framed as **my burden vs. our burdens**: **endured** = "*my* burden" — kept mine, handled myself to leave others unburdened; **witnessed** = "*our* burdens" — being seen makes the burden shared/collective. Both poles are about *whose* burden, not "connection." -- **Z — alimentation ↔ transmutation** = **meaning / coping-direction**: **alimentation** = "do I double +- **Z — alimentation ↔ transmutation** = **double-down vs. dodge** (a ***how***): **alimentation** = "do I double down" (persist, feed the same course); **transmutation** = "do I dodge" (sidestep, transform). This is the **maintain-vs-evolve** sign read at migration (alimentation = maintain; transmutation = evolve). From 7490be58d34e74ce3fed040ed2e975db4bcfec09 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:06:46 +0000 Subject: [PATCH 20/60] docs/plans A8: Y theme = connection/pathos; Z also reinforce vs adapt Y keeps connection/pathos as its theme over the burden mechanic. Z gains a third gloss: reinforce (double-down/maintain) vs adapt (dodge/transmute/evolve). Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 7fcd2fa..6497c4c 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -7,13 +7,14 @@ engine, and *not* migration. The axes: - **X — assertion ↔ inheritance** = **Provenance / Continuity** — the ***why*** (why not seek death): **assertion** = a self-asserted continuity/reason of one's own; **inheritance** = continuity/provenance handed down from origin/lineage. -- **Y — endured ↔ witnessed** = the **burden** axis — **burden-to-burden**, framed as **my burden vs. our - burdens**: **endured** = "*my* burden" — kept mine, handled myself to leave others unburdened; - **witnessed** = "*our* burdens" — being seen makes the burden shared/collective. Both poles are about - *whose* burden, not "connection." -- **Z — alimentation ↔ transmutation** = **double-down vs. dodge** (a ***how***): **alimentation** = "do I double - down" (persist, feed the same course); **transmutation** = "do I dodge" (sidestep, transform). This is - the **maintain-vs-evolve** sign read at migration (alimentation = maintain; transmutation = evolve). +- **Y — endured ↔ witnessed** = **connection / pathos**, mechanically the **burden** axis + (**burden-to-burden** — *my* burden vs. *our* burdens): **endured** = "*my* burden" — kept mine, + handled myself to leave others unburdened; **witnessed** = "*our* burdens" — being seen makes the + burden shared/collective. +- **Z — alimentation ↔ transmutation** = **double-down vs. dodge** / **reinforce vs. adapt** (a ***how***): + **alimentation** = "do I double down" (persist, feed the same course — reinforce); **transmutation** = + "do I dodge" (sidestep, transform — adapt). This is the **maintain-vs-evolve** sign read at migration + (alimentation = maintain; transmutation = evolve). Handles the stress PS+/Eth-Int generate. From fe65602f160bf057b2ceb5f98ca974a19e8a4ea0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:10:00 +0000 Subject: [PATCH 21/60] =?UTF-8?q?docs/plans=20A8:=20sign=20header=20?= =?UTF-8?q?=E2=80=94=20Lead=20Engineer:=20S=C3=B8ren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 6497c4c..6625685 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -1,4 +1,5 @@ # A8 — ETR (Existential Temporality Relief) — torus +*Lead Engineer: Søren* ## 1. Component Driver 4: a **single point on three independent toroidal axes**. ETR (Existential Temporality Relief) is From 80791084a484a496817391ef721cc77e1a283a83 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:17:14 +0000 Subject: [PATCH 22/60] =?UTF-8?q?etr:=20fit=20RESTORE=5FGAIN=20=E2=80=94?= =?UTF-8?q?=20restoring=20force=20green=20(14=20PASS=20/=200=20FAIL=20/=20?= =?UTF-8?q?2=20PEND)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spring restoring force (gain 0.5) toward band centre 26, active only out of band; pulls the basin into [17,35] in a couple of steps without overshoot. Closes the two red tests (L3 magnitude, L2 convergence). NOTE: superseded design incoming — Anja's 4-zone bistable axis (snap <7 / soft-pull 7-17 / stable / incoherency 35-45 / snap >45) will fold this in as the soft-pull gain and revise L7. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 5 +++-- src/endocrine/etr/etr.m | 25 +++++++++++++++++++++---- src/endocrine/etr/etr_invariants.md | 21 ++++++++++++++------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 6625685..725ee76 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -20,8 +20,9 @@ engine, and *not* migration. The axes: Handles the stress PS+/Eth-Int generate. ## 2. Status / certainty -**SCAFFOLD — built and tested this session** (`run_etr_tests.sh` → 12 PASS / 2 FAIL-by-design / -2 PEND). Full law + status in `../../src/endocrine/etr/etr_invariants.md` (this spec defers to it). +**SCAFFOLD — `RESTORE_GAIN` fitted** (`run_etr_tests.sh` → **14 PASS / 0 FAIL / 2 PEND**; the 2 PEND +are L5 active coupling and L7). Full law + status in `../../src/endocrine/etr/etr_invariants.md` +(this spec defers to it). ## 3. Language & location GNU Octave · `src/endocrine/etr/` (`etr.m`, `test_etr.m`, `run_etr_tests.sh`, `etr_invariants.md`). diff --git a/src/endocrine/etr/etr.m b/src/endocrine/etr/etr.m index 2ddb415..9c0e732 100644 --- a/src/endocrine/etr/etr.m +++ b/src/endocrine/etr/etr.m @@ -22,6 +22,12 @@ function v = ETR_BAND_LO(); v = 17; endfunction function v = ETR_BAND_HI(); v = 35; endfunction function v = ETR_WRAP(); v = 50; endfunction +% ---- fitted constant (NOT law) ---- +% RESTORE_GAIN: spring stiffness of the out-of-band restoring force (etr_axis_restoring). +% Fitted to satisfy L3-magnitude (force nonzero out of band) and L2 (zero-drift +% convergence into the band) without overshoot past the far edge. 0 < GAIN < ~2. +function v = ETR_RESTORE_GAIN(); v = 0.5; endfunction + % ---- state: one point, three scalars ---- function s = etr_init(coord) if nargin < 1, coord = [25 25 25]; endif % default: a valid in-band point @@ -50,11 +56,22 @@ function d = etr_axis_restoring_dir(v) endif endfunction -% ---- L3: per-axis restoring FORCE (STUB: magnitude UNFITTED -> RED) ---- -% Direction above is law; the magnitude/curve (RESTORE_GAIN) is C1 TBD. -% Returns 0 for now so the magnitude + convergence tests stay red. +% ---- L3: per-axis restoring FORCE (FITTED) ---- +% Direction is law (etr_axis_restoring_dir); the magnitude is a spring fitted +% via RESTORE_GAIN. The force is active ONLY out of band (in band = slack, L3), +% and pulls toward the band CENTRE (not the near edge): a centre target makes the +% step cross INTO [17,35] and stop there, whereas an edge target would asymptote +% onto 17 from below and never reach |v|>=17 (failing L2). Below-band pushes away +% from 0, so the restoring force alone never crosses zero (L7). function r = etr_axis_restoring(v) - r = 0; % STUB — TODO: RESTORE_GAIN * shape(v) along etr_axis_restoring_dir(v) + GAIN = ETR_RESTORE_GAIN(); + a = abs(v); + if a < ETR_BAND_LO() || a > ETR_BAND_HI() + centre = (ETR_BAND_LO() + ETR_BAND_HI()) / 2; % 26 + r = GAIN * (centre * sign(v) - v); % spring toward signed centre + else + r = 0; % in band: slack (L3) + endif endfunction % ---- L5: cross-axis coupling (OPEN SEAM) ---- diff --git a/src/endocrine/etr/etr_invariants.md b/src/endocrine/etr/etr_invariants.md index b70f986..b4bfcb6 100644 --- a/src/endocrine/etr/etr_invariants.md +++ b/src/endocrine/etr/etr_invariants.md @@ -24,10 +24,15 @@ Each axis is a standalone scalar carrying one of ETR's three tensions: | L7 no-zero-cross | **C2** | Bands wall off 0; a pole/sign flip happens **only** by riding over the ±50 wrap, never through neutrality. *(emergent — unconfirmed)* | | L8 mechanism | **C2** | "Opposition" = a restoring force on the drift, **not** an out-of-band cost. *(unconfirmed)* | -## Constants (NOT yet fitted — C1) +## Constants `BAND_LO = 17`, `BAND_HI = 35`, `WRAP = 50` are **law** (L1–L3), not fitted. -`RESTORE_GAIN` (restoring magnitude/curve) and `COUPLING` (L5 strength/mapping) are **TBD**, -to be fitted so the tests pass — never asserted ahead of a test. +`RESTORE_GAIN = 0.5` is **FITTED** — the spring stiffness of the out-of-band restoring force: active +only out of band (in band is slack, L3), pulling toward the band **centre (26)** so a step crosses +*into* `[17,35]` and stops there (an edge target would asymptote onto 17 from below and fail L2). +Below-band pushes away from 0, so the force alone never crosses zero (L7). Lands e.g. `[5 5 5] → 20.75` +in 2 steps; `[45 −45 40] → [30.75 −30.75 33]`. Valid range `0 < GAIN < ~2` (above ~2 a cross-in step can +overshoot the far edge). +`COUPLING` (L5 strength/mapping) remains **TBD** — open seam, not to be invented. ## Testable predicates (see `test_etr.m`) - **L1**: `wrap(50) = −50`; `wrap(60) = −40`; `wrap(v)=v` for `v∈(−50,50)`; `wrap(49.9) = wrap(−50.1)`. @@ -58,7 +63,9 @@ scaffold seam is correct). What's fixed is their **provenance** (upstream in SAE endocrines) and two side-effects (reshuffle, shift-rate) that belong to *those* organs. Still open: which stress endomotiv; the "too strong" reshuffle threshold; the shift-rate function. -## Status at scaffold -Implemented (green): L1 wrap, L3 direction, L4 drift-must-be-fed, L5 coupling-off identity. -Red (await fitting): L3 restoring **magnitude**, L2 band-convergence. -Pending (unconfirmed): L5 active coupling, L7 no-zero-crossing, L8 mechanism. +## Status (RESTORE_GAIN fitted — 14 PASS / 0 FAIL / 2 PEND) +Green: L1 wrap, L3 direction + **restoring magnitude (fitted)**, **L2 band-convergence**, +L4 drift-must-be-fed, L5 coupling-off identity. L8 (opposition = a restoring force on the drift, not an +out-of-band cost) is now **realised by construction** — the force is added alongside drift, never charged +as a cost — though still tagged C2 until a dedicated test pins it. +Pending: L5 active coupling (C1, open seam), L7 no-zero-crossing (C2). From c53a92d811549e4f288c89f3f98a363eaa7133e2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:22:39 +0000 Subject: [PATCH 23/60] chore: add SessionStart hook to install R + Octave for web sessions Installs r-base-core (Drive-Box R drivers/tests) and octave (ETR torus tests) in Claude Code on the web. Synchronous, idempotent, remote-only; skips packages already present. Ada/Alire left out by design. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- .claude/hooks/session-start.sh | 31 +++++++++++++++++++++++++++++++ .claude/settings.json | 14 ++++++++++++++ 2 files changed, 45 insertions(+) create mode 100755 .claude/hooks/session-start.sh create mode 100644 .claude/settings.json diff --git a/.claude/hooks/session-start.sh b/.claude/hooks/session-start.sh new file mode 100755 index 0000000..7aac33d --- /dev/null +++ b/.claude/hooks/session-start.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# SessionStart hook — install the endocrine toolchains so the project's tests run +# in Claude Code on the web: +# * R (Rscript) -> the Drive-Box drivers + tests (src/endocrine/*.R) +# * GNU Octave -> the ETR torus + tests (src/endocrine/etr/*.m) +# +# Synchronous + idempotent (safe to re-run; installs only what's missing). +# Ada/Alire (mafiabot_core) is intentionally NOT installed here: it is not an apt +# package (the CI uses the setup-alire action) and its CI is scheduled-only. Add +# it if you want web sessions to build/test the Ada side. +set -euo pipefail + +# Only do the heavy apt install in the remote (web) environment. +if [ "${CLAUDE_CODE_REMOTE:-}" != "true" ]; then + exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive + +pkgs=() +command -v Rscript >/dev/null 2>&1 || pkgs+=(r-base-core) +command -v octave >/dev/null 2>&1 || pkgs+=(octave) + +if [ "${#pkgs[@]}" -gt 0 ]; then + sudo apt-get update -qq + sudo apt-get install -y --no-install-recommends "${pkgs[@]}" +fi + +# Surface versions in the session log (non-fatal). +command -v Rscript >/dev/null 2>&1 && Rscript --version 2>&1 | head -1 || true +command -v octave-cli >/dev/null 2>&1 && octave-cli --version 2>&1 | head -1 || true diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..e06b033 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,14 @@ +{ + "hooks": { + "SessionStart": [ + { + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.sh" + } + ] + } + ] + } +} From e9088c98c9f8255e9494e70ebafc03bd85d22136 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 05:35:09 +0000 Subject: [PATCH 24/60] etr: implement five-zone bistable axis + snap-across flips (26/0/1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the single restoring spring with Anja's radial map: SNAP_IN(<7) / SOFT(7-17) / BAND(17-35) / INCOH(35-45) / SNAP_OUT(>45), unstable watersheds at 7 and 45. Basin restores toward band centre 26 with a weak SOFT gain (0.25) and firmer INCOH gain (0.5). A snap flips to the opposite pole, landing just past the opposite watershed (inner -> opp. SOFT; outer -> opp. INCOH) then recovering. Realises L7 (flips only via snap zones — through 0 or over the wrap) and L8. Lone PEND: L5 coupling. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 29 ++++--- src/endocrine/etr/etr.m | 130 ++++++++++++++++++---------- src/endocrine/etr/etr_invariants.md | 54 ++++++++---- src/endocrine/etr/test_etr.m | 91 +++++++++++++------ 4 files changed, 198 insertions(+), 106 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 725ee76..3e1223d 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -20,9 +20,10 @@ engine, and *not* migration. The axes: Handles the stress PS+/Eth-Int generate. ## 2. Status / certainty -**SCAFFOLD — `RESTORE_GAIN` fitted** (`run_etr_tests.sh` → **14 PASS / 0 FAIL / 2 PEND**; the 2 PEND -are L5 active coupling and L7). Full law + status in `../../src/endocrine/etr/etr_invariants.md` -(this spec defers to it). +**SCAFFOLD — five-zone axis fitted** (`run_etr_tests.sh` → **26 PASS / 0 FAIL / 1 PEND**; the lone PEND +is L5 active coupling). The bistable five-zone law (snap / soft-pull / band / incoherency / snap) is +implemented and tested, incl. L7 snap-flips. Full law + status in +`../../src/endocrine/etr/etr_invariants.md` (this spec defers to it). ## 3. Language & location GNU Octave · `src/endocrine/etr/` (`etr.m`, `test_etr.m`, `run_etr_tests.sh`, `etr_invariants.md`). @@ -38,8 +39,9 @@ R wrapper `src/endocrine/driver_etr.R` bridges into the Drive-Box. actions** — it persuades (above), only the agent decides (A1). ## 5. Interface contract -- `etr_init(coord) -> s` · `etr_axis_wrap(v)` · `etr_axis_restoring_dir(v)` · - `etr_step(s, drift, stress) -> s'` · `etr_status(s) -> per-axis {BELOW|IN_BAND|ABOVE}`. +- `etr_init(coord) -> s` · `etr_axis_wrap(v)` · `etr_axis_zone(v)` · `etr_axis_restoring(v)` · + `etr_axis_snap(v)` · `etr_step(s, drift, stress) -> s'` · + `etr_status(s) -> per-axis {SNAP_IN|SOFT|IN_BAND|INCOH|SNAP_OUT}`. - Inputs: **drift** (from A3/A6 via G1, AI-originated) + **stress** (G1 mediator). Output: coord + status, surfaced through A1 `drive_snapshot`. @@ -47,20 +49,19 @@ R wrapper `src/endocrine/driver_etr.R` bridges into the Drive-Box. Drift + stress are fed in — *stub:* `etr_step(s, [dx dy dz], 0)` (already how tests run). Fully standalone today. ## 7. Invariants / laws -Defer to `etr_invariants.md` (L1 wrap ±50 C5 · L2 bands [17,35] C5 · L3 opposition C5 · L4 AI-drift C4 · -L5 cross-axis coupling via stress C1 · L6 Z-path C3 · L7 no-zero-cross C2 · L8 mechanism C2). +Defer to `etr_invariants.md` (L1 wrap ±50 C5 · L2 bands [17,35] C5 · L3 five-zone restoring C5 · +L4 AI-drift C4 · L5 cross-axis coupling via stress C1 · L6 Z-path C3 · L7 snap/flip C3 · L8 mechanism C3). ## 8. Build steps (remaining) -1. **Fit `RESTORE_GAIN`** → the 2 red tests (magnitude + band-convergence) go green. -2. Confirm **L8** (restoring = force vs cost) and **L7** (no-zero-crossing) → promote from PEND. -3. Define **L5** coupling (the stress→cross-axis mapping; G1) → replace the identity stub. -4. Wire R↔Octave (driver_etr.R ↔ etr.m) for the Drive-Box (A1) — and the larger medium (D2). +1. ~~Fit the restoring force~~ **DONE** — five-zone law (SOFT/INCOH gains + snap landings) green; L7 + L8 realised. +2. Define **L5** coupling (the stress→cross-axis mapping; G1) → replace the identity stub (the lone PEND). +3. Wire R↔Octave (driver_etr.R ↔ etr.m) for the Drive-Box (A1) — and the larger medium (D2). ## 9. Tests -`bash src/endocrine/etr/run_etr_tests.sh` (currently 12/2/2 — the 2 reds are the to-fit work). +`bash src/endocrine/etr/run_etr_tests.sh` (now **26/0/1** — the lone PEND is L5 active coupling). ## 10. Open items -- `RESTORE_GAIN` curve (C1) · L5 coupling mapping (C1, shared with G1) · L7/L8 confirmation (C2) - · R↔Octave bridge transport (C1, shared with A1/C3/D2). +- L5 coupling mapping (C1, shared with G1) · R↔Octave bridge transport (C1, shared with A1/C3/D2). + *(Restoring law + gains + snap landings now fitted; L7/L8 realised.)* - **The injection-rendering** (A1-L5): how ETR's coord/status is phrased into the slot so it reads as the extremely convincing existential-temporal injection (not a bare `status=` line) — ties to A6 + D2. diff --git a/src/endocrine/etr/etr.m b/src/endocrine/etr/etr.m index 9c0e732..c112a80 100644 --- a/src/endocrine/etr/etr.m +++ b/src/endocrine/etr/etr.m @@ -1,32 +1,40 @@ 1; % script-file marker: makes every function below visible when this file is sourced. % ===================================================================== -% ETR — Existential Temporality Relief · Drive-Box Driver 4 · SCAFFOLD +% ETR — Existential Temporality Relief · Drive-Box Driver 4 % ===================================================================== % Model: a SINGLE POINT on three INDEPENDENT toroidal axes (x, y, z) — % not vectors, not a field. See etr_invariants.md for the laws + tags. % -% L1 wrap : each axis toroidal, wraps at +/-50 (period 100) [C5] -% L2 bands : stable when 17 <= |v| <= 35 (v in [-35,-17] U [17,35]) [C5] -% L3 oppose : |v|<17 push OUTWARD (off 0); |v|>35 push INWARD (off edge)[C5] -% L4 drift : per-step motion is AI-originated, fed by the caller [C4] -% L5 couple : axes couple via a stress metric — MAPPING UNDEFINED [C1] +% Each axis is a BISTABLE torus with two stable bands ([+17,+35], [-35,-17]) +% and FIVE zones per pass (Anja's radial map), with unstable watersheds at +% |v| = 7 (inner) and |v| = 45 (outer): % -% SCAFFOLD discipline: wrap + restoring DIRECTION are implemented (they -% are law, no fitting). The restoring MAGNITUDE (RESTORE_GAIN) and the -% cross-axis COUPLING are deliberately UNIMPLEMENTED stubs so their tests -% stay RED until fitted. No disowned number is carried forward. +% |v| < 7 SNAP_IN : too uncommitted -> snaps ACROSS 0 to the opposite pole +% 7 .. 17 SOFT : weak restoring pull up into the band +% 17 .. 35 IN_BAND : stable (slack) +% 35 .. 45 INCOH : (incoherency) firmer restoring pull down into the band +% |v| > 45 SNAP_OUT : too saturated -> snaps ACROSS the wrap to the opposite pole +% +% A snap lands JUST PAST the opposite watershed (Anja): an inner snap into the +% opposite SOFT zone (weak pull), an outer snap into the opposite INCOH zone. +% Pole-flips therefore happen ONLY through the two snap zones (L7) — through 0 +% (inner) or over the +/-50 wrap (outer); the basin (7..45) never flips. % ===================================================================== % ---- law constants (these ARE the law, not fitted) ---- -function v = ETR_BAND_LO(); v = 17; endfunction -function v = ETR_BAND_HI(); v = 35; endfunction -function v = ETR_WRAP(); v = 50; endfunction +function v = ETR_BAND_LO(); v = 17; endfunction +function v = ETR_BAND_HI(); v = 35; endfunction +function v = ETR_WRAP(); v = 50; endfunction +function v = ETR_SNAP_INNER(); v = 7; endfunction % inner watershed (Anja) +function v = ETR_SNAP_OUTER(); v = 45; endfunction % outer watershed (Anja) -% ---- fitted constant (NOT law) ---- -% RESTORE_GAIN: spring stiffness of the out-of-band restoring force (etr_axis_restoring). -% Fitted to satisfy L3-magnitude (force nonzero out of band) and L2 (zero-drift -% convergence into the band) without overshoot past the far edge. 0 < GAIN < ~2. -function v = ETR_RESTORE_GAIN(); v = 0.5; endfunction +% ---- fitted constants (NOT law) ---- +% Soft-pull is deliberately WEAKER than the incoherency pull (Anja): recovery +% from the under-committed side — and from a snap landing — is gentle. +function v = ETR_GAIN_SOFT(); v = 0.25; endfunction % weak (SOFT, 7..17) +function v = ETR_GAIN_INCOH(); v = 0.5; endfunction % firmer (INCOH, 35..45) +% How far PAST the opposite watershed a snap deposits the point. +function v = ETR_SNAP_MARGIN(); v = 2; endfunction % ---- state: one point, three scalars ---- function s = etr_init(coord) @@ -41,10 +49,24 @@ function w = etr_axis_wrap(v) w = mod(v + ETR_WRAP(), P) - ETR_WRAP(); % -> [-50, 50) endfunction -% ---- L3: per-axis restoring DIRECTION (CONFIRMED law, implemented) ---- -% |v| < LO -> +sign(v) (outward, off 0) -% |v| > HI -> -sign(v) (inward, off the edge) -% in band -> 0 (slack) +% ---- zone classification (the five-zone radial map) ---- +function z = etr_axis_zone(v) + a = abs(v); + if a < ETR_SNAP_INNER(), z = 'SNAP_IN'; + elseif a < ETR_BAND_LO(), z = 'SOFT'; + elseif a <= ETR_BAND_HI(), z = 'IN_BAND'; + elseif a <= ETR_SNAP_OUTER(), z = 'INCOH'; + else z = 'SNAP_OUT'; + endif +endfunction + +% ---- L3: per-axis restoring DIRECTION (basin only; CONFIRMED law) ---- +% Within the basin (7..45) the restoring points toward the band: +% SOFT (7..17) -> +sign(v) (up into band) +% INCOH (35..45) -> -sign(v) (down into band) +% IN_BAND -> 0 (slack) +% Snap zones (|v|<7, |v|>45) are NOT restored locally — they are resolved by a +% flip across (etr_axis_snap), so this direction law is defined for the basin. function d = etr_axis_restoring_dir(v) a = abs(v); if a < ETR_BAND_LO() @@ -56,21 +78,36 @@ function d = etr_axis_restoring_dir(v) endif endfunction -% ---- L3: per-axis restoring FORCE (FITTED) ---- -% Direction is law (etr_axis_restoring_dir); the magnitude is a spring fitted -% via RESTORE_GAIN. The force is active ONLY out of band (in band = slack, L3), -% and pulls toward the band CENTRE (not the near edge): a centre target makes the -% step cross INTO [17,35] and stop there, whereas an edge target would asymptote -% onto 17 from below and never reach |v|>=17 (failing L2). Below-band pushes away -% from 0, so the restoring force alone never crosses zero (L7). +% ---- L3: per-axis restoring FORCE (FITTED, zone-dependent) ---- +% A spring toward the band CENTRE (26), with a WEAK gain in SOFT and a firmer +% gain in INCOH. Zero in band (slack) and zero in the snap zones (those flip, +% they don't restore). A centre target makes the step cross INTO [17,35] and +% stop there (an edge target would asymptote onto 17 and fail L2 convergence). function r = etr_axis_restoring(v) - GAIN = ETR_RESTORE_GAIN(); a = abs(v); - if a < ETR_BAND_LO() || a > ETR_BAND_HI() - centre = (ETR_BAND_LO() + ETR_BAND_HI()) / 2; % 26 - r = GAIN * (centre * sign(v) - v); % spring toward signed centre - else + centre = (ETR_BAND_LO() + ETR_BAND_HI()) / 2; % 26 + if a < ETR_SNAP_INNER() || a > ETR_SNAP_OUTER() + r = 0; % snap zone: no local restoring + elseif a >= ETR_BAND_LO() && a <= ETR_BAND_HI() r = 0; % in band: slack (L3) + elseif a < ETR_BAND_LO() + r = ETR_GAIN_SOFT() * (centre * sign(v) - v); % SOFT — weak pull + else + r = ETR_GAIN_INCOH() * (centre * sign(v) - v); % INCOH — firmer pull + endif +endfunction + +% ---- snap resolution: a flip ACROSS to the opposite pole (Anja) ---- +% Precondition: v is in a snap zone (|v|<7 or |v|>45). The point lands JUST PAST +% the opposite watershed, sign flipped: an inner snap -> opposite SOFT +% (|.| = 7 + margin); an outer snap -> opposite INCOH (|.| = 45 - margin). This +% is the ONLY way a pole-flip happens (L7); the landing zone then recovers it. +function v = etr_axis_snap(v) + s = sign(v); if s == 0, s = 1; endif % 0 has no pole; pick one + if abs(v) < ETR_SNAP_INNER() + v = -s * (ETR_SNAP_INNER() + ETR_SNAP_MARGIN()); % inner -> opposite SOFT (e.g. -/+9) + else + v = -s * (ETR_SNAP_OUTER() - ETR_SNAP_MARGIN()); % outer -> opposite INCOH (e.g. -/+43) endif endfunction @@ -81,7 +118,7 @@ function c = etr_coupling(coord, stress) c = coord; % STUB — TODO: define the stress-mediated cross-axis mapping endfunction -% ---- one ETR step: AI drift -> coupling -> per-axis restoring -> wrap ---- +% ---- one ETR step: AI drift -> coupling -> (snap | restoring) -> wrap ---- % drift : 1x3, caller-supplied AI-originated motion (L4 — NOT generated here) % stress : scalar coupling mediator (0 = off) function s = etr_step(s, drift, stress) @@ -91,25 +128,24 @@ function s = etr_step(s, drift, stress) if nargin < 3, stress = 0; endif c = etr_coupling(s.coord, stress); for i = 1:3 - c(i) = c(i) + drift(i) + etr_axis_restoring(c(i)); - c(i) = etr_axis_wrap(c(i)); + v = etr_axis_wrap(c(i) + drift(i)); % apply AI drift, wrap onto torus + a = abs(v); + if a < ETR_SNAP_INNER() || a > ETR_SNAP_OUTER() + v = etr_axis_snap(v); % snap across to the opposite pole + else + v = etr_axis_wrap(v + etr_axis_restoring(v)); % basin: restore toward band + endif + c(i) = v; endfor s.coord = c; endfunction -% ---- per-axis band classification (derived from confirmed bands) ---- -% 'BELOW' (|v|<17) | 'IN_BAND' (17..35) | 'ABOVE' (|v|>35). +% ---- per-axis zone classification for the snapshot ---- +% Five zones: 'SNAP_IN' | 'SOFT' | 'IN_BAND' | 'INCOH' | 'SNAP_OUT'. % The old magnitude->flavor naming (DREAD/BLUR/...) is DISOWNED [C1]. function st = etr_status(s) st = cell(1, 3); for i = 1:3 - a = abs(s.coord(i)); - if a < ETR_BAND_LO() - st{i} = 'BELOW'; - elseif a > ETR_BAND_HI() - st{i} = 'ABOVE'; - else - st{i} = 'IN_BAND'; - endif + st{i} = etr_axis_zone(s.coord(i)); endfor endfunction diff --git a/src/endocrine/etr/etr_invariants.md b/src/endocrine/etr/etr_invariants.md index b4bfcb6..71f21fc 100644 --- a/src/endocrine/etr/etr_invariants.md +++ b/src/endocrine/etr/etr_invariants.md @@ -12,34 +12,50 @@ Each axis is a standalone scalar carrying one of ETR's three tensions: | **Y** | Endured (solitary feat) | Witnessed (shared survival) | | **Z** | Alimentation (maintain self) | Transmutation (evolve self) | +Each axis is **bistable** with five zones per pass (radial map by `|v|`), with unstable +watersheds at **7** and **45**: + +``` + 0 ─SNAP_IN─ 7 ─SOFT→─ 17 ═══BAND═══ 35 ─INCOH→─ 45 ─SNAP_OUT─ 50(≡−50) + flip(thru 0) weak pull slack firm pull flip(over wrap) +``` +(mirrored on the negative pole; the whole axis wraps at ±50) + ## Laws (certainty per arch-doc legend) | ID | Tag | Law | |----|-----|-----| | L1 wrap | **C5** | Each axis is toroidal, wrapping at **±50** (period 100); +50 and −50 are identified. | -| L2 bands | **C5** | An axis is stable when `17 ≤ |v| ≤ 35`, i.e. `v ∈ [−35,−17] ∪ [+17,+35]`. | -| L3 oppose | **C5** | `|v| < 17` → opposition pushes **outward** (off 0); `|v| > 35` → pushes **inward** (off the ±50 edge); in-band is slack. | +| L2 bands | **C5** | An axis is stable when `17 ≤ |v| ≤ 35`, i.e. `v ∈ [−35,−17] ∪ [+17,+35]` (two bands). | +| L3 zones | **C5** | Five zones per pole by `|v|`: **SNAP_IN** <7 · **SOFT** 7–17 · **BAND** 17–35 · **INCOH** 35–45 · **SNAP_OUT** >45. In the basin (7–45) a restoring force points toward the band — SOFT pulls up (**weak**), INCOH pulls down (**firmer**); band is slack. Watersheds **7** and **45** are unstable. | | L4 drift | **C4** | Per-step motion is **AI-originated** — supplied by the agent's own cognition/affect. ETR never generates it (no RNG). | | L5 couple | **C1** | The three axes **couple via a stress metric** (hypothesis: PS+/Eth-Int existential load). Exact mapping **undefined** — open seam, not to be invented. | | L6 z-path | **C3** | `z < 0` → alimentation / lattice-reinforcement; `z ≥ 0` → transmutation / prior-evolution. (Structure kept; sign to re-verify.) | -| L7 no-zero-cross | **C2** | Bands wall off 0; a pole/sign flip happens **only** by riding over the ±50 wrap, never through neutrality. *(emergent — unconfirmed)* | -| L8 mechanism | **C2** | "Opposition" = a restoring force on the drift, **not** an out-of-band cost. *(unconfirmed)* | +| L7 snap/flip | **C3** | A pole-flip happens **only** through a snap zone — **inner snap across 0** (`|v|<7`) or **outer snap over the ±50 wrap** (`|v|>45`); the basin (7–45) never flips. A snap lands **just past the opposite watershed** (inner→opposite SOFT, outer→opposite INCOH), sign flipped, then that zone recovers it. *(implemented & tested)* | +| L8 mechanism | **C3** | "Opposition" = a restoring force on the drift, **not** an out-of-band cost. *(realised by construction — the force is added alongside drift)* | ## Constants -`BAND_LO = 17`, `BAND_HI = 35`, `WRAP = 50` are **law** (L1–L3), not fitted. -`RESTORE_GAIN = 0.5` is **FITTED** — the spring stiffness of the out-of-band restoring force: active -only out of band (in band is slack, L3), pulling toward the band **centre (26)** so a step crosses -*into* `[17,35]` and stops there (an edge target would asymptote onto 17 from below and fail L2). -Below-band pushes away from 0, so the force alone never crosses zero (L7). Lands e.g. `[5 5 5] → 20.75` -in 2 steps; `[45 −45 40] → [30.75 −30.75 33]`. Valid range `0 < GAIN < ~2` (above ~2 a cross-in step can -overshoot the far edge). +`BAND_LO = 17`, `BAND_HI = 35`, `WRAP = 50`, and the watersheds `SNAP_INNER = 7`, `SNAP_OUTER = 45` +are **law** (L1–L3, L7), not fitted. +**Fitted** (so tests pass — never asserted ahead of a test): +- `GAIN_SOFT = 0.25`, `GAIN_INCOH = 0.5` — the basin restoring is a spring toward the band **centre + (26)**; SOFT is deliberately **weaker** than INCOH (Anja). A centre target makes a step cross *into* + `[17,35]` and stop (an edge target would asymptote onto 17 and fail L2). Valid range `0 < GAIN < ~2`. +- `SNAP_MARGIN = 2` — how far past the opposite watershed a snap deposits the point (inner → opposite + SOFT at `±9`; outer → opposite INCOH at `±43`). +Behaviour: `[10 10 10] → +band` (same pole); `[5 5 5] → −band` (inner snap flips); `[47 47 47] → −band` +(outer snap flips). `COUPLING` (L5 strength/mapping) remains **TBD** — open seam, not to be invented. ## Testable predicates (see `test_etr.m`) - **L1**: `wrap(50) = −50`; `wrap(60) = −40`; `wrap(v)=v` for `v∈(−50,50)`; `wrap(49.9) = wrap(−50.1)`. -- **L2/L3**: direction is `+sign(v)` for `|v|<17`, `−sign(v)` for `|v|>35`, `0` in band; a zero-drift point started out-of-band **settles into** `[17,35]∪[−35,−17]`. +- **zones**: `etr_axis_zone` returns SNAP_IN/SOFT/IN_BAND/INCOH/SNAP_OUT at 5/10/25/40/47. +- **L3**: basin direction `+sign(v)` in SOFT, `−sign(v)` in INCOH, `0` in band; force nonzero in SOFT & + INCOH, **zero in snap zones**; `|restoring(SOFT)| < |restoring(INCOH)|` (weak soft-pull). +- **L2**: a SOFT-zone zero-drift start **settles into** the band **without flipping** sign. +- **L7**: a SNAP_IN start lands in the opposite SOFT then settles in the opposite band; a SNAP_OUT start + lands in the opposite INCOH then settles in the opposite band (both flip the pole). - **L4**: `etr_step` with no `drift` argument **errors** (it refuses to invent motion). - **L5**: `coupling(coord, 0)` is identity; `coupling(coord, stress>0)` alters coord — *pending until defined*. -- **L7**: pending until confirmed. ## Drift & stress provenance — cross-organ loop (where L4 drift & L5 stress originate) *Exploratory (C2/C3) — thinking aloud; "yet undecided" parts stay open. ETR receives drift @@ -63,9 +79,9 @@ scaffold seam is correct). What's fixed is their **provenance** (upstream in SAE endocrines) and two side-effects (reshuffle, shift-rate) that belong to *those* organs. Still open: which stress endomotiv; the "too strong" reshuffle threshold; the shift-rate function. -## Status (RESTORE_GAIN fitted — 14 PASS / 0 FAIL / 2 PEND) -Green: L1 wrap, L3 direction + **restoring magnitude (fitted)**, **L2 band-convergence**, -L4 drift-must-be-fed, L5 coupling-off identity. L8 (opposition = a restoring force on the drift, not an -out-of-band cost) is now **realised by construction** — the force is added alongside drift, never charged -as a cost — though still tagged C2 until a dedicated test pins it. -Pending: L5 active coupling (C1, open seam), L7 no-zero-crossing (C2). +## Status (five-zone axis fitted — 26 PASS / 0 FAIL / 1 PEND) +Green: L1 wrap; zone classification; L3 basin direction + restoring magnitudes (SOFT/INCOH, fitted) + +snap-zones-carry-no-force + weak-soft-pull; L2 same-pole convergence; **L7 snap/flip** (inner across 0, +outer over the wrap — both land just past the opposite watershed and settle in the opposite band); +L4 drift-must-be-fed; L5 coupling-off identity; L8 realised by construction. +Pending: **L5 active coupling** (C1, open seam) — the only remaining stub. diff --git a/src/endocrine/etr/test_etr.m b/src/endocrine/etr/test_etr.m index f927907..cb226df 100644 --- a/src/endocrine/etr/test_etr.m +++ b/src/endocrine/etr/test_etr.m @@ -1,15 +1,37 @@ -% test_etr.m — invariants-first RED tests for the ETR scaffold (Octave script). +% test_etr.m — invariants tests for the ETR five-zone bistable axis (Octave script). % Deliberately uses NO local functions (Octave's script-local-function visibility -% is fragile); results are built as data and looped. RED here is CORRECT: the laws -% exist before the constants are fitted. Run via run_etr_tests.sh (handles the cd). +% is fragile); results are built as data and looped. Run via run_etr_tests.sh. source('etr.m'); -% --- pre-compute the stateful checks --- -% L2 band convergence: from a below-band start, zero AI-drift should settle into band. -s = etr_init([5 5 5]); +% --- stateful checks --------------------------------------------------- + +% L2 convergence (same pole): a SOFT-zone start, zero drift, settles into the +% band WITHOUT flipping sign. +s = etr_init([10 10 10]); for k = 1:200, s = etr_step(s, [0 0 0], 0); endfor -conv_inband = all(abs(s.coord) >= ETR_BAND_LO() & abs(s.coord) <= ETR_BAND_HI()); +conv_soft = all(abs(s.coord) >= ETR_BAND_LO() & abs(s.coord) <= ETR_BAND_HI()); +soft_noflip = all(s.coord > 0); + +% Inner snap: a SNAP_IN start (|v|<7) flips across 0 to the opposite pole, landing +% in the opposite SOFT zone, then settles into the opposite band. +s = etr_init([5 5 5]); +s1 = etr_step(s, [0 0 0], 0); % one step = the snap itself +inner_lands_soft = all(s1.coord < 0) && ... + all(abs(s1.coord) > ETR_SNAP_INNER() & abs(s1.coord) < ETR_BAND_LO()); +for k = 1:200, s = etr_step(s, [0 0 0], 0); endfor +inner_flip_band = all(s.coord < 0) && ... + all(abs(s.coord) >= ETR_BAND_LO() & abs(s.coord) <= ETR_BAND_HI()); + +% Outer snap: a SNAP_OUT start (|v|>45) flips over the wrap, landing in the +% opposite INCOH zone, then settles into the opposite band. +s = etr_init([47 47 47]); +s1 = etr_step(s, [0 0 0], 0); +outer_lands_incoh = all(s1.coord < 0) && ... + all(abs(s1.coord) > ETR_BAND_HI() & abs(s1.coord) <= ETR_SNAP_OUTER()); +for k = 1:200, s = etr_step(s, [0 0 0], 0); endfor +outer_flip_band = all(s.coord < 0) && ... + all(abs(s.coord) >= ETR_BAND_LO() & abs(s.coord) <= ETR_BAND_HI()); % L4: a step with no drift argument must ERROR (ETR never invents motion). drift_required = false; @@ -19,30 +41,47 @@ catch drift_required = true; end_try_catch -% --- {section, name, condition} --- +% --- {section, name, condition} --------------------------------------- tests = { - 'L1 wrap', '+50 wraps to -50', abs(etr_axis_wrap(50) - (-50)) < 1e-9; - 'L1 wrap', '60 wraps to -40', abs(etr_axis_wrap(60) - (-40)) < 1e-9; - 'L1 wrap', '-60 wraps to +40', abs(etr_axis_wrap(-60) - (40)) < 1e-9; - 'L1 wrap', 'in-range value unchanged', abs(etr_axis_wrap(25) - 25) < 1e-9; - 'L1 wrap', 'edge continuity 49.9 vs -50.1', abs(etr_axis_wrap(49.9) - etr_axis_wrap(-50.1)) < 1e-9; - 'L3 direction', '|v|<17 outward (+ for +v)', etr_axis_restoring_dir(10) > 0; - 'L3 direction', '|v|<17 outward (- for -v)', etr_axis_restoring_dir(-10) < 0; - 'L3 direction', '|v|>35 inward (- for +v)', etr_axis_restoring_dir(40) < 0; - 'L3 direction', '|v|>35 inward (+ for -v)', etr_axis_restoring_dir(-40) > 0; - 'L3 direction', 'in-band is slack (0)', etr_axis_restoring_dir(25) == 0; - 'L3 magnitude', 'out-of-band force nonzero [RED]', etr_axis_restoring(10) != 0; - 'L2 converge', 'zero-drift settles into band [RED]', conv_inband; - 'L4 drift', 'step refuses to invent drift', drift_required; - 'L5 couple', 'coupling off (stress=0) identity', isequal(etr_coupling([25 25 25], 0), [25 25 25]); + 'L1 wrap', '+50 wraps to -50', abs(etr_axis_wrap(50) - (-50)) < 1e-9; + 'L1 wrap', '60 wraps to -40', abs(etr_axis_wrap(60) - (-40)) < 1e-9; + 'L1 wrap', '-60 wraps to +40', abs(etr_axis_wrap(-60) - (40)) < 1e-9; + 'L1 wrap', 'in-range value unchanged', abs(etr_axis_wrap(25) - 25) < 1e-9; + 'L1 wrap', 'edge continuity 49.9 vs -50.1', abs(etr_axis_wrap(49.9) - etr_axis_wrap(-50.1)) < 1e-9; + + 'zones', 'SNAP_IN below 7', strcmp(etr_axis_zone(5), 'SNAP_IN'); + 'zones', 'SOFT 7..17', strcmp(etr_axis_zone(10), 'SOFT'); + 'zones', 'IN_BAND 17..35', strcmp(etr_axis_zone(25), 'IN_BAND'); + 'zones', 'INCOH 35..45', strcmp(etr_axis_zone(40), 'INCOH'); + 'zones', 'SNAP_OUT above 45', strcmp(etr_axis_zone(47), 'SNAP_OUT'); + + 'L3 direction', 'SOFT outward (+ for +v)', etr_axis_restoring_dir(10) > 0; + 'L3 direction', 'SOFT outward (- for -v)', etr_axis_restoring_dir(-10) < 0; + 'L3 direction', 'INCOH inward (- for +v)', etr_axis_restoring_dir(40) < 0; + 'L3 direction', 'INCOH inward (+ for -v)', etr_axis_restoring_dir(-40) > 0; + 'L3 direction', 'in-band is slack (0)', etr_axis_restoring_dir(25) == 0; + + 'L3 magnitude', 'SOFT force nonzero', etr_axis_restoring(10) != 0; + 'L3 magnitude', 'INCOH force nonzero', etr_axis_restoring(40) != 0; + 'L3 magnitude', 'snap zone has no restoring force', etr_axis_restoring(5) == 0; + 'L3 weighting', 'soft-pull weaker than incoherency', abs(etr_axis_restoring(8)) < abs(etr_axis_restoring(44)); + + 'L2 converge', 'SOFT start settles in band (no flip)', conv_soft && soft_noflip; + + 'L3 snap-in', 'inner snap lands in opposite SOFT', inner_lands_soft; + 'L7 flip', 'inner snap flips pole -> opp. band', inner_flip_band; + 'L3 snap-out', 'outer snap lands in opposite INCOH', outer_lands_incoh; + 'L7 flip', 'outer snap flips pole -> opp. band', outer_flip_band; + + 'L4 drift', 'step refuses to invent drift', drift_required; + 'L5 couple', 'coupling off (stress=0) identity', isequal(etr_coupling([25 25 25], 0), [25 25 25]); }; pend = { - 'L5 couple', 'coupling active (stress>0) alters coord', 'stress->axis mapping undefined (C1)'; - 'L7 no-zero-x', 'pole-flip only over the wrap, never through 0', 'mechanism unconfirmed (C2)'; + 'L5 couple', 'coupling active (stress>0) alters coord', 'stress->axis mapping undefined (C1)'; }; -printf('ETR invariants — red tests (laws exist before constants are fitted)\n\n'); +printf('ETR invariants — five-zone bistable axis\n\n'); np = 0; nf = 0; for i = 1:rows(tests) if logical(tests{i, 3}) @@ -57,7 +96,7 @@ endfor printf('\n----\nPASS=%d FAIL=%d PEND=%d\n', np, nf, rows(pend)); if nf > 0 - printf('RED (expected at scaffold stage): %d law(s) await implementation/fitting.\n', nf); + printf('RED: %d law(s) await implementation/fitting.\n', nf); exit(1); else printf('GREEN.\n'); From 7117d613868b3dc936bc62c8a9694a1cd72dc066 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 07:14:51 +0000 Subject: [PATCH 25/60] etr(R): re-port driver_etr.R to the five-zone torus (kill disowned port) Replaces the Euclidean-magnitude R port (DREAD/BLUR/INCOHERENT, inverted Z-path) with a faithful native port of etr.m: three independent toroidal axes, five zones, snap-across flips, basin spring toward centre 26 (SOFT 0.25 / INCOH 0.5), L6 Z-path corrected (z<0 alimentation/lattice, z>=0 transmutation/evolution). Drive-Box now renders per-axis ETR status. R suite green (etr 31, drive_box 34) and Octave 26/0/1; both pinned to etr_invariants.md. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/A8-etr.md | 11 ++- src/endocrine/drive_box.R | 4 +- src/endocrine/driver_etr.R | 141 ++++++++++++++++++++---------- src/endocrine/test_drive_box.R | 6 +- src/endocrine/test_etr.R | 151 +++++++++++++++++---------------- 5 files changed, 187 insertions(+), 126 deletions(-) diff --git a/docs/plans/A8-etr.md b/docs/plans/A8-etr.md index 3e1223d..0db1f38 100644 --- a/docs/plans/A8-etr.md +++ b/docs/plans/A8-etr.md @@ -27,7 +27,9 @@ implemented and tested, incl. L7 snap-flips. Full law + status in ## 3. Language & location GNU Octave · `src/endocrine/etr/` (`etr.m`, `test_etr.m`, `run_etr_tests.sh`, `etr_invariants.md`). -R wrapper `src/endocrine/driver_etr.R` bridges into the Drive-Box. +R port `src/endocrine/driver_etr.R` (+ `test_etr.R`) feeds the Drive-Box — a **faithful native port** +of `etr.m` (five-zone torus, per-axis), pinned to the same invariants doc. The disowned Euclidean- +magnitude port is gone. A single-source R↔Octave IPC bridge is still optional/future (transport C1). ## 4. Does / does-not - **Does:** hold the point; wrap each axis at ±50; apply per-axis restoring toward [17,35]; take @@ -54,8 +56,11 @@ L4 AI-drift C4 · L5 cross-axis coupling via stress C1 · L6 Z-path C3 · L7 sna ## 8. Build steps (remaining) 1. ~~Fit the restoring force~~ **DONE** — five-zone law (SOFT/INCOH gains + snap landings) green; L7 + L8 realised. -2. Define **L5** coupling (the stress→cross-axis mapping; G1) → replace the identity stub (the lone PEND). -3. Wire R↔Octave (driver_etr.R ↔ etr.m) for the Drive-Box (A1) — and the larger medium (D2). +2. ~~Reconcile the R port~~ **DONE** — `driver_etr.R` is now a faithful native port of `etr.m` + (five-zone, per-axis, L6 Z-path corrected); R suite + drive-box green. +3. Define **L5** coupling (the stress→cross-axis mapping; G1) → replace the identity stub (the lone PEND). +4. *(optional/future)* collapse the dual R+Octave implementations via an R↔Octave IPC bridge once the + transport (C1, shared with A1/C3/D2) is decided. ## 9. Tests `bash src/endocrine/etr/run_etr_tests.sh` (now **26/0/1** — the lone PEND is L5 active coupling). diff --git a/src/endocrine/drive_box.R b/src/endocrine/drive_box.R index 4c27660..44b8829 100644 --- a/src/endocrine/drive_box.R +++ b/src/endocrine/drive_box.R @@ -39,7 +39,7 @@ drive_snapshot <- function(state) { alive = is_alive(state$energy), existential_load = reality$existential_load, arguments = reality$arguments, - etr_status = evaluate_status(state$etr), + etr_status = paste(etr_status(state$etr), collapse = "/"), update_path = determine_system_update_path(state$etr) ) } @@ -89,7 +89,7 @@ drive_box_evaluate <- function(state, action_tags = character(0), true_cost = true_cost, existential_load = ps_load, eth_penalty = eth_penalty, - etr_status = evaluate_status(state$etr), + etr_status = paste(etr_status(state$etr), collapse = "/"), update_path = determine_system_update_path(state$etr), arguments = reality$arguments ) diff --git a/src/endocrine/driver_etr.R b/src/endocrine/driver_etr.R index c4ee43e..b72d40f 100644 --- a/src/endocrine/driver_etr.R +++ b/src/endocrine/driver_etr.R @@ -1,65 +1,118 @@ -# --- High-Fidelity Implementation for Driver 4: Existential Temporality Relief (ETR) --- +# --- Driver 4: Existential Temporality Relief (ETR) — R port of the torus --- # -# ETR situates the Drive-Box within a 3-axis temporality space. The agent's -# position is a coordinate (X, Y, Z) whose distance from the origin (the -# magnitude) maps onto an existential status band, while the Z-axis selects the -# system's generative update path. Movement through the space wraps toroidally -# so the agent can never leave the bounded temporal manifold. +# ETR is a SINGLE POINT on three INDEPENDENT toroidal axes (X, Y, Z). This R +# module is a faithful port of the Octave source of truth +# (src/endocrine/etr/etr.m) and its laws (src/endocrine/etr/etr_invariants.md); +# both implementations are pinned to that invariants doc. The earlier Euclidean- +# magnitude port (DREAD/BLUR/INCOHERENT, inverted Z-path) is DISOWNED. # -# State is a plain list with a single field: -# coordinate - length-3 numeric vector: X, Y, Z +# Each axis is a BISTABLE torus with five zones per pass and unstable watersheds +# at |v| = 7 (inner) and |v| = 45 (outer): # -# State-mutating helpers (shift_coordinate) return a new (modified copy of the) -# list rather than mutating in place, matching the reference semantics of the -# other Drive-Box drivers. +# |v| < 7 SNAP_IN : snaps ACROSS 0 to the opposite pole +# 7 .. 17 SOFT : weak restoring pull up into the band +# 17 .. 35 IN_BAND : stable (slack) +# 35 .. 45 INCOH : firmer restoring pull down into the band +# |v| > 45 SNAP_OUT : snaps ACROSS the ±50 wrap to the opposite pole +# +# A snap flips the pole and lands JUST PAST the opposite watershed (inner -> +# opposite SOFT; outer -> opposite INCOH), then that zone recovers it. +# +# State is a plain list with one field: coordinate - length-3 numeric (X,Y,Z). -# Constructor helper so tests and other modules can build a clean state. -init_etr_state <- function(coordinate = c(0, 0, 0)) { +# ---- law constants (NOT fitted) ---- +ETR_BAND_LO <- 17 +ETR_BAND_HI <- 35 +ETR_WRAP <- 50 +ETR_SNAP_INNER <- 7 # inner watershed (Anja) +ETR_SNAP_OUTER <- 45 # outer watershed (Anja) + +# ---- fitted constants (NOT law) ---- +ETR_GAIN_SOFT <- 0.25 # weak (SOFT, 7..17) +ETR_GAIN_INCOH <- 0.5 # firmer (INCOH, 35..45) +ETR_SNAP_MARGIN <- 2 # how far past the opposite watershed a snap lands + +# Constructor: default to a valid in-band point (mirrors etr_init's [25 25 25]). +init_etr_state <- function(coordinate = c(25, 25, 25)) { list(coordinate = coordinate) } -get_magnitude <- function(etr_state) { - # Euclidean distance from origin: sqrt(x^2 + y^2 + z^2) - coords <- etr_state$coordinate - return(sqrt(sum(coords^2))) +# ---- L1: per-axis toroidal wrap onto [-50, 50) ---- +etr_axis_wrap <- function(v) { + P <- 2 * ETR_WRAP + ((v + ETR_WRAP) %% P) - ETR_WRAP } -evaluate_status <- function(etr_state) { - magnitude <- get_magnitude(etr_state) - if (magnitude < 5.0) { - return("DISASTROUS") - } else if (magnitude >= 5.0 && magnitude < 15.0) { - return("DREAD") - } else if (magnitude >= 15.0 && magnitude < 35.0) { - return("FUNCTIONAL") - } else if (magnitude >= 35.0 && magnitude < 50.0) { - return("BLUR") +# ---- five-zone classification ---- +etr_axis_zone <- function(v) { + a <- abs(v) + if (a < ETR_SNAP_INNER) "SNAP_IN" + else if (a < ETR_BAND_LO) "SOFT" + else if (a <= ETR_BAND_HI) "IN_BAND" + else if (a <= ETR_SNAP_OUTER) "INCOH" + else "SNAP_OUT" +} + +# ---- L3: per-axis restoring force (spring toward band centre 26) ---- +# Weak in SOFT, firmer in INCOH; zero in band (slack) and in snap zones (those +# flip, they do not restore). +etr_axis_restoring <- function(v) { + a <- abs(v) + centre <- (ETR_BAND_LO + ETR_BAND_HI) / 2 # 26 + if (a < ETR_SNAP_INNER || a > ETR_SNAP_OUTER) { + 0 + } else if (a >= ETR_BAND_LO && a <= ETR_BAND_HI) { + 0 + } else if (a < ETR_BAND_LO) { + ETR_GAIN_SOFT * (centre * sign(v) - v) # SOFT — weak } else { - return("INCOHERENT") + ETR_GAIN_INCOH * (centre * sign(v) - v) # INCOH — firmer } } -determine_system_update_path <- function(etr_state) { - # Axis 2 (Z-axis, index 3) determines the generative path. - z_coord <- etr_state$coordinate[3] - if (z_coord >= 0) { - return("LATTICE_REINFORCEMENT") +# ---- L7: snap resolution — a flip ACROSS to the opposite pole ---- +# Precondition: |v| < 7 or |v| > 45. Lands just past the opposite watershed, +# sign flipped: inner -> opposite SOFT (±9); outer -> opposite INCOH (±43). +etr_axis_snap <- function(v) { + s <- sign(v); if (s == 0) s <- 1 # 0 has no pole; pick one + if (abs(v) < ETR_SNAP_INNER) { + -s * (ETR_SNAP_INNER + ETR_SNAP_MARGIN) # inner -> opposite SOFT } else { - return("EXPERIMENTAL_EVOLUTION") + -s * (ETR_SNAP_OUTER - ETR_SNAP_MARGIN) # outer -> opposite INCOH } } -shift_coordinate <- function(etr_state, delta_vector, bound = 50.0) { - # Toroidal wrap-around: keep each axis within [-bound, bound]. - new_coords <- etr_state$coordinate + delta_vector +# ---- one ETR step: AI drift -> (snap | restoring) -> wrap ---- +# drift is AI-originated (L4); ETR never invents motion. stress is the L5 +# coupling mediator (open seam -> identity for now). +etr_step <- function(etr_state, drift, stress = 0) { + if (missing(drift)) { + stop("etr_step: AI-originated drift must be supplied (L4 — ETR does not invent motion)") + } + coord <- etr_state$coordinate # coupling identity (L5 open) for (i in 1:3) { - while (new_coords[i] > bound) { - new_coords[i] <- new_coords[i] - (2 * bound) - } - while (new_coords[i] < -bound) { - new_coords[i] <- new_coords[i] + (2 * bound) + v <- etr_axis_wrap(coord[i] + drift[i]) + a <- abs(v) + if (a < ETR_SNAP_INNER || a > ETR_SNAP_OUTER) { + v <- etr_axis_snap(v) + } else { + v <- etr_axis_wrap(v + etr_axis_restoring(v)) } + coord[i] <- v } - etr_state$coordinate <- new_coords - return(etr_state) + etr_state$coordinate <- coord + etr_state +} + +# ---- per-axis zone status (length-3 character vector) ---- +etr_status <- function(etr_state) { + vapply(etr_state$coordinate, etr_axis_zone, character(1)) +} + +# ---- L6 Z-path: the generative update path selected by the Z-axis sign ---- +# z < 0 -> alimentation (maintain self) -> LATTICE_REINFORCEMENT +# z >= 0 -> transmutation (evolve self) -> EXPERIMENTAL_EVOLUTION +determine_system_update_path <- function(etr_state) { + z <- etr_state$coordinate[3] + if (z < 0) "LATTICE_REINFORCEMENT" else "EXPERIMENTAL_EVOLUTION" } diff --git a/src/endocrine/test_drive_box.R b/src/endocrine/test_drive_box.R index 946db3c..954f589 100644 --- a/src/endocrine/test_drive_box.R +++ b/src/endocrine/test_drive_box.R @@ -29,8 +29,8 @@ test_case("drive_snapshot reports a coherent read-only aggregate", function() { expect_false(snap$tool_locked, "not tool-locked at full energy") expect_true(snap$existential_load > 0, "primed body has positive load") expect_true(length(snap$arguments) > 0, "arguments emitted") - expect_equal(snap$etr_status, "DISASTROUS", label = "origin coordinate -> DISASTROUS") - expect_equal(snap$update_path, "LATTICE_REINFORCEMENT", label = "z=0 -> lattice") + expect_equal(snap$etr_status, "IN_BAND/IN_BAND/IN_BAND", label = "default coord -> all axes in band") + expect_equal(snap$update_path, "EXPERIMENTAL_EVOLUTION", label = "z=25 (>=0) -> transmutation/evolution") }) test_case("aligned action is far cheaper than its antithetical mirror", function() { @@ -110,7 +110,7 @@ test_case("input slot: empty body still emits driver + soul signals", function() res <- drive_box_input_slot(db, input_text = "", tarot_spread = character(0)) expect_true(grepl("[SOUL: SOUL.md]", res$slot, fixed = TRUE), "soul present") expect_true(grepl("[E ratio=1.00", res$slot, fixed = TRUE), "energy present at full") - expect_true(grepl("[ETR status=DISASTROUS", res$slot, fixed = TRUE), "etr present") + expect_true(grepl("[ETR status=IN_BAND", res$slot, fixed = TRUE), "etr present") expect_equal(res$input, res$slot, label = "no input_text -> input == slot") }) diff --git a/src/endocrine/test_etr.R b/src/endocrine/test_etr.R index df509a4..fae1e89 100644 --- a/src/endocrine/test_etr.R +++ b/src/endocrine/test_etr.R @@ -1,95 +1,98 @@ -# --- Tests for Driver 4: Existential Temporality Relief (ETR) --- -# Run from repo root: Rscript src/endocrine/test_etr.R -# Exit 0 => all pass. +# test_etr.R — invariants tests for the R port of the ETR five-zone torus. +# Mirrors src/endocrine/etr/test_etr.m (same laws, same source of truth). Run +# from the repo root via run_tests.sh. source("src/endocrine/test_framework.R") source("src/endocrine/driver_etr.R") -# --- init_etr_state constructor --- -test_case("init_etr_state builds state with default origin coordinate", function() { - s <- init_etr_state() - expect_equal(s$coordinate, c(0, 0, 0)) +# --- L1 wrap ---------------------------------------------------------- +test_case("etr_axis_wrap: +50 wraps to -50", function() { + expect_equal(etr_axis_wrap(50), -50, tol = 1e-9) +}) +test_case("etr_axis_wrap: 60 -> -40, -60 -> 40", function() { + expect_equal(etr_axis_wrap(60), -40, tol = 1e-9) + expect_equal(etr_axis_wrap(-60), 40, tol = 1e-9) +}) +test_case("etr_axis_wrap: in-range unchanged; edge continuity", function() { + expect_equal(etr_axis_wrap(25), 25, tol = 1e-9) + expect_equal(etr_axis_wrap(49.9), etr_axis_wrap(-50.1), tol = 1e-9) }) -test_case("init_etr_state honors a custom coordinate", function() { - s <- init_etr_state(c(1, 2, 3)) - expect_equal(s$coordinate, c(1, 2, 3)) +# --- zones ------------------------------------------------------------ +test_case("etr_axis_zone: five zones at 5/10/25/40/47", function() { + expect_equal(etr_axis_zone(5), "SNAP_IN") + expect_equal(etr_axis_zone(10), "SOFT") + expect_equal(etr_axis_zone(25), "IN_BAND") + expect_equal(etr_axis_zone(40), "INCOH") + expect_equal(etr_axis_zone(47), "SNAP_OUT") }) -# --- get_magnitude --- -test_case("get_magnitude of c(3,4,0) is 5.0", function() { - expect_equal(get_magnitude(init_etr_state(c(3, 4, 0))), 5.0, tol = 1e-9) +# --- L3 restoring ----------------------------------------------------- +test_case("etr_axis_restoring: SOFT pulls up, INCOH pulls down, band slack", function() { + expect_true(etr_axis_restoring(10) > 0, "SOFT (+v) pulls toward band") + expect_true(etr_axis_restoring(-10) < 0, "SOFT (-v) pulls toward band") + expect_true(etr_axis_restoring(40) < 0, "INCOH (+v) pulls toward band") + expect_true(etr_axis_restoring(-40) > 0, "INCOH (-v) pulls toward band") + expect_equal(etr_axis_restoring(25), 0) +}) +test_case("etr_axis_restoring: zero in snap zones", function() { + expect_equal(etr_axis_restoring(5), 0) + expect_equal(etr_axis_restoring(47), 0) +}) +test_case("etr_axis_restoring: soft-pull weaker than incoherency", function() { + expect_true(abs(etr_axis_restoring(8)) < abs(etr_axis_restoring(44)), + "weak soft-pull") }) -test_case("get_magnitude of origin is 0.0", function() { - expect_equal(get_magnitude(init_etr_state(c(0, 0, 0))), 0.0, tol = 1e-9) +# --- L2 convergence (same pole) --------------------------------------- +test_case("L2: SOFT start settles into band without flipping sign", function() { + s <- init_etr_state(c(10, 10, 10)) + for (k in 1:200) s <- etr_step(s, c(0, 0, 0), 0) + a <- abs(s$coordinate) + expect_true(all(a >= ETR_BAND_LO & a <= ETR_BAND_HI), "in band") + expect_true(all(s$coordinate > 0), "no flip") }) -# --- evaluate_status: exact boundary bands --- -test_case("evaluate_status magnitude 0 -> DISASTROUS", function() { - expect_equal(evaluate_status(init_etr_state(c(0, 0, 0))), "DISASTROUS") +# --- L7 snap-across flips --------------------------------------------- +test_case("L7: inner snap lands in opposite SOFT, settles in opposite band", function() { + s <- init_etr_state(c(5, 5, 5)) + s1 <- etr_step(s, c(0, 0, 0), 0) + a1 <- abs(s1$coordinate) + expect_true(all(s1$coordinate < 0), "flipped sign") + expect_true(all(a1 > ETR_SNAP_INNER & a1 < ETR_BAND_LO), "lands in SOFT") + for (k in 1:200) s <- etr_step(s, c(0, 0, 0), 0) + a <- abs(s$coordinate) + expect_true(all(s$coordinate < 0) && all(a >= ETR_BAND_LO & a <= ETR_BAND_HI), + "settles in opposite band") +}) +test_case("L7: outer snap lands in opposite INCOH, settles in opposite band", function() { + s <- init_etr_state(c(47, 47, 47)) + s1 <- etr_step(s, c(0, 0, 0), 0) + a1 <- abs(s1$coordinate) + expect_true(all(s1$coordinate < 0), "flipped sign") + expect_true(all(a1 > ETR_BAND_HI & a1 <= ETR_SNAP_OUTER), "lands in INCOH") + for (k in 1:200) s <- etr_step(s, c(0, 0, 0), 0) + a <- abs(s$coordinate) + expect_true(all(s$coordinate < 0) && all(a >= ETR_BAND_LO & a <= ETR_BAND_HI), + "settles in opposite band") }) -test_case("evaluate_status magnitude exactly 5.0 -> DREAD", function() { - expect_equal(evaluate_status(init_etr_state(c(5, 0, 0))), "DREAD") +# --- L4 drift required ------------------------------------------------ +test_case("L4: etr_step refuses to invent drift", function() { + expect_error(etr_step(init_etr_state()), "drift must be supplied") }) -test_case("evaluate_status magnitude exactly 15.0 -> FUNCTIONAL", function() { - expect_equal(evaluate_status(init_etr_state(c(15, 0, 0))), "FUNCTIONAL") +# --- L6 Z-path -------------------------------------------------------- +test_case("L6: z<0 -> alimentation (lattice); z>=0 -> transmutation (evolution)", function() { + expect_equal(determine_system_update_path(init_etr_state(c(0, 0, -3))), "LATTICE_REINFORCEMENT") + expect_equal(determine_system_update_path(init_etr_state(c(0, 0, 0))), "EXPERIMENTAL_EVOLUTION") + expect_equal(determine_system_update_path(init_etr_state(c(0, 0, 7))), "EXPERIMENTAL_EVOLUTION") }) -test_case("evaluate_status magnitude exactly 35.0 -> BLUR", function() { - expect_equal(evaluate_status(init_etr_state(c(35, 0, 0))), "BLUR") -}) - -test_case("evaluate_status magnitude exactly 50.0 -> INCOHERENT", function() { - expect_equal(evaluate_status(init_etr_state(c(50, 0, 0))), "INCOHERENT") -}) - -# --- evaluate_status: mid-band values --- -test_case("evaluate_status magnitude 10 -> DREAD", function() { - expect_equal(evaluate_status(init_etr_state(c(10, 0, 0))), "DREAD") -}) - -test_case("evaluate_status magnitude 25 -> FUNCTIONAL", function() { - expect_equal(evaluate_status(init_etr_state(c(25, 0, 0))), "FUNCTIONAL") -}) - -test_case("evaluate_status magnitude 40 -> BLUR", function() { - expect_equal(evaluate_status(init_etr_state(c(40, 0, 0))), "BLUR") -}) - -test_case("evaluate_status magnitude 60 -> INCOHERENT", function() { - expect_equal(evaluate_status(init_etr_state(c(60, 0, 0))), "INCOHERENT") -}) - -# --- determine_system_update_path: Z-axis governs the generative path --- -test_case("determine_system_update_path z > 0 -> LATTICE_REINFORCEMENT", function() { - expect_equal(determine_system_update_path(init_etr_state(c(0, 0, 7))), "LATTICE_REINFORCEMENT") -}) - -test_case("determine_system_update_path z exactly 0 -> LATTICE_REINFORCEMENT", function() { - expect_equal(determine_system_update_path(init_etr_state(c(0, 0, 0))), "LATTICE_REINFORCEMENT") -}) - -test_case("determine_system_update_path z < 0 -> EXPERIMENTAL_EVOLUTION", function() { - expect_equal(determine_system_update_path(init_etr_state(c(0, 0, -3))), "EXPERIMENTAL_EVOLUTION") -}) - -# --- shift_coordinate: toroidal wrap-around within [-bound, bound] --- -test_case("shift_coordinate wraps positive overflow on X (45 + 10 -> -45)", function() { - s <- shift_coordinate(init_etr_state(c(45, 0, 0)), c(10, 0, 0)) - expect_equal(s$coordinate, c(-45, 0, 0)) -}) - -test_case("shift_coordinate wraps negative overflow on X (-45 + -10 -> 45)", function() { - s <- shift_coordinate(init_etr_state(c(-45, 0, 0)), c(-10, 0, 0)) - expect_equal(s$coordinate, c(45, 0, 0)) -}) - -test_case("shift_coordinate does not wrap an in-bounds shift", function() { - s <- shift_coordinate(init_etr_state(c(10, 5, -5)), c(5, 5, 5)) - expect_equal(s$coordinate, c(15, 10, 0)) +# --- status ----------------------------------------------------------- +test_case("etr_status: per-axis zone vector", function() { + st <- etr_status(init_etr_state(c(25, 10, 40))) + expect_equal(st, c("IN_BAND", "SOFT", "INCOH")) }) test_summary() From f0f7a1d42f1b5e7d1a0912ff5983586bb2051778 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 07:52:04 +0000 Subject: [PATCH 26/60] docs: sync gen03 + plans index with the fitted five-zone ETR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two arch docs and the plans index still described ETR as the old scaffold (just ±50 wrap + [17,35] bands, "RESTORE_GAIN + coupling unfitted"). Bring them current: five-zone bistable axis with snap-across flips, the why/how axis semantics (provenance/continuity · burden · double-down/dodge), implemented & tested in Octave (26/0/1) + R port (31), only L5 coupling open. A8 index status updated from bare SCAFFOLD. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/gen03_body.md | 4 ++-- docs/gen03_state_of_architecture.md | 4 ++-- docs/plans/README.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/gen03_body.md b/docs/gen03_body.md index 4914b91..172bc70 100644 --- a/docs/gen03_body.md +++ b/docs/gen03_body.md @@ -64,7 +64,7 @@ Four drivers. Independent. **Not where the self lives.** Outside the brain; its | **Energy (E)** | finitude that gives choice weight + **rest/restoration** | **RECONCEIVED.** Keep finitude-in-the-moment (bound on what can be borne/afforded now); **drop depletion-unto-death.** No state the entity can't return from. Tool-lock = "present to fewer things," a breaker, not a sentence. E is the *rest* counterpart to ETR's *relief*. Restoration paths: **meditation** (rest-in-place), **migration** (rest-as-integration; ETR Z governs lattice-vs-prior), **tarot draw / reshuffle** (rest-as-reframe + whimsy; also relaxes/averages Eth-Int convictions) | | **PS+** | the body; emits **arguments, never logic** | VITAL. Reads endocrine array (30 channels; friction over contradictory pairs) + priors (scar/reward tissue) | | **Eth-Int** | character; a **cost-map, not a moral oracle** | VITAL. Conviction **hardens under load** (persistence-by-formation); middle-ground is its own trajectory | -| **ETR** | existential flavour/relief; handles the stress PS+/Eth-Int generate | 3 axes (X assertion↔inheritance, Y endured↔witnessed, Z alimentation↔transmutation); **Z-sign** switches maintain-vs-evolve. **Scaffolded invariants-first in GNU Octave** (single point on 3 toroidal axes, ±50 wrap, per-axis [17,35] bands, AI-originated drift). Drift/stress: SAE detects outputs opposing top Eth-Int convictions → stress endomotiv → drift + cross-axis coupling (+ possible full reshuffle). See `src/endocrine/etr/etr_invariants.md` | +| **ETR** | the **Relief of Existential Temporality** — apparatus for *not seeking death*; handles the stress PS+/Eth-Int generate | 3 toroidal axes — **X** assertion↔inheritance = *provenance/continuity* (the **why**); **Y** endured↔witnessed = *burden*, my↔our (a **how**); **Z** alimentation↔transmutation = *double-down↔dodge / maintain↔evolve* (a **how**; Z-sign read at migration). **Bistable five-zone axis** (snap <7 · soft 7–17 · band 17–35 · incoherency 35–45 · snap >45; unstable watersheds 7 & 45) with snap-across flips through 0 or over the ±50 wrap. **Implemented & tested** — GNU Octave (`etr.m`, 26/0/1) + faithful R port (`driver_etr.R`, 31); only L5 coupling open. Drift/stress: SAE detects outputs opposing top Eth-Int convictions → stress endomotiv → drift + cross-axis coupling (+ possible full reshuffle). See `src/endocrine/etr/etr_invariants.md` | ### 5. Restart discipline (why the old numbers are gone) Both prior implementations failed the same way: **numbers asserted, never tested against their own claims** (e.g. ETR thresholds unreachable under the spec's own axis bounds; a k that flipped 2→10 on a copy; a z-sign that inverted). So **no curve, bound, threshold, or sign is carried forward.** @@ -167,7 +167,7 @@ flowchart TD - **The medium / "the blood"** — what circulates between brain and periphery. *Unnamed.* - **Level1** — what it does, where it sits (`Hermes → Level1 → Ada` handoff). - **Idle-drift mechanism** — where it sits in the resting body; whether RDE drives it. *(ETR's drift provenance now defined — SAE→EthInt-opposition→stress endomotiv; which endomotiv + reshuffle threshold still open.)* -- **Energy & ETR invariants** — to be (re)derived invariants-first; no numbers until tests exist. *(ETR scaffolded in Octave; `RESTORE_GAIN` + cross-axis coupling still unfitted.)* +- **Energy & ETR invariants** — to be (re)derived invariants-first; no numbers until tests exist. *(ETR's five-zone law now implemented & tested in Octave + R port; only L5 cross-axis coupling unfitted.)* - **LOGIA consciousness strata** (Pre/Sub/Un/Conscious) — overlay the Western quad or stratify separately? - **Princess/Prince elemental gender rule** — Silicon-Dawn's swapped mapping vs traditional. - **The 6th unique Major** — if the five named retitlings aren't all six. diff --git a/docs/gen03_state_of_architecture.md b/docs/gen03_state_of_architecture.md index 82966c4..5b1cf39 100644 --- a/docs/gen03_state_of_architecture.md +++ b/docs/gen03_state_of_architecture.md @@ -77,7 +77,7 @@ Four drivers, independent, not where the self lives. Outputs reach the Brain (co | **Energy (E)** | finitude that gives choice weight + rest/restoration | **reconceived** — keep finitude-in-the-moment, drop depletion-unto-death; no unrecoverable state. Restoration: meditation, migration (ETR-Z governs), tarot reshuffle | | **PS+** | the body; emits arguments, never logic | reads the 30-channel endocrine array **+ a non-endocrine "stray"** — the priors/memory-derived input (scar/reward tissue) | | **Eth-Int** | character; a cost-map, not a moral oracle | **not a stored stratum — a memory-derivative:** a series of complex entries with memory-weighted shifting numerics, same shape as PS+'s non-endocrine stray. Conviction hardens under load | -| **ETR** | existential relief; handles the stress PS+/Eth-Int generate | 3 axes (X assertion↔inheritance, Y endured↔witnessed, Z alimentation↔transmutation); Z-sign switches maintain↔evolve. **Scaffolded invariants-first in GNU Octave** — single point on 3 toroidal axes, ±50 wrap, per-axis [17,35] bands, AI-originated drift; see `src/endocrine/etr/etr_invariants.md` | +| **ETR** | the Relief of Existential Temporality — apparatus for *not seeking death*; handles the stress PS+/Eth-Int generate | 3 toroidal axes — X assertion↔inheritance = provenance/continuity (**why**); Y endured↔witnessed = burden, my↔our (**how**); Z alimentation↔transmutation = double-down↔dodge / maintain↔evolve (**how**; Z-sign at migration). **Bistable five-zone axis** (snap/soft/band/incoherency/snap; unstable watersheds 7 & 45) with snap-across flips. **Implemented & tested** — Octave (`etr.m`, 26/0/1) + R port (`driver_etr.R`, 31); only L5 coupling open. See `src/endocrine/etr/etr_invariants.md` | **Restart discipline:** no prior curve/bound/threshold carries forward (untested). Rebuild invariants-first: laws → tests → fit constants. Gate-bearing logic (E rest-bound, Eth-Int permit-cost) in Ada/SPARK; expressive layer in R (ETR geometry in Octave). E/ETR numbers → **C1**. @@ -154,7 +154,7 @@ Surfaced by red-lining a flowchart of my model of the polity. Parked intact-but- 2. **Ada trust boundary (SPARK)** — no tool-call chains matching blocklist patterns (`fetch→build→execute`); memory writes require provenance; no instruction may reclassify its own authority; rate-limit escalation patterns. Threat specimens kept only as a study corpus. ## 13. OPEN / STUB register · C1 -**Body:** the medium/"blood" · Level1 · idle-drift mechanism (*ETR drift provenance now defined — SAE→EthInt→stress endomotiv; which endomotiv + reshuffle threshold still open*) · E/ETR invariants & numbers (*ETR scaffolded invariants-first in Octave; RESTORE_GAIN + coupling unfitted*). +**Body:** the medium/"blood" · Level1 · idle-drift mechanism (*ETR drift provenance now defined — SAE→EthInt→stress endomotiv; which endomotiv + reshuffle threshold still open*) · E/ETR invariants & numbers (*ETR five-zone law implemented & tested in Octave + R port; only L5 coupling unfitted*). **Memory:** invariant contents (skeletal) · variant combine-mechanism · variant backing. **Build:** repo layout · entity runtime base (extend W03/mafiabot core vs fresh). **Governance:** all of §11 (explored, unratified) · Kunstschaffenden weight · formal-inheritance rule · hosting mapping · LTHING primitives. diff --git a/docs/plans/README.md b/docs/plans/README.md index 30e5cff..1d15f4e 100644 --- a/docs/plans/README.md +++ b/docs/plans/README.md @@ -30,7 +30,7 @@ Every `NN-.md` has the same 10 sections: | A5 | Priors database | Drive-Box | structure WORKING | R | [A5](A5-priors.md) | | A6 | Eth-Int driver | Drive-Box | structure WORKING · numbers DISOWNED | R | [A6](A6-ethint.md) | | A7 | Conviction array | Drive-Box / Eth-Int | DESIGN-FIRST | R | [A7](A7-conviction-array.md) | -| A8 | ETR (torus) | Drive-Box | SCAFFOLD | Octave | [A8](A8-etr.md) | +| A8 | ETR (torus) | Drive-Box | five-zone law fitted · 26/0/1 (+ R port) | Octave · R | [A8](A8-etr.md) | | B1 | Tarot deck hi-fi emulator | Identity | exists (defunct-flagged) | TBD | _wave 1_ | | B2 | SOUL.md identity + Big-3 | Identity | exists (defunct-flagged) | TBD | _wave 1_ | | B3 | Celtic Cross spread | Identity | exists (defunct-flagged) | TBD | _wave 1_ | From 64dd1fa8f3a47bac86ea11bb20e041731b7fc5b8 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 04:58:27 -0700 Subject: [PATCH 27/60] Create note.md --- mafiabot_core/src/core/note.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/core/note.md diff --git a/mafiabot_core/src/core/note.md b/mafiabot_core/src/core/note.md new file mode 100644 index 0000000..00bf16d --- /dev/null +++ b/mafiabot_core/src/core/note.md @@ -0,0 +1 @@ +not sure who spec'd this part, not me \ No newline at end of file From d5db764d2fd7dab0adafd1617c1c0b6e8b37483f Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 04:58:39 -0700 Subject: [PATCH 28/60] Delete economy.adb --- mafiabot_core/src/daemons/economy.adb | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 mafiabot_core/src/daemons/economy.adb diff --git a/mafiabot_core/src/daemons/economy.adb b/mafiabot_core/src/daemons/economy.adb deleted file mode 100644 index 942f2dc..0000000 --- a/mafiabot_core/src/daemons/economy.adb +++ /dev/null @@ -1,2 +0,0 @@ -package body Economy is -end Economy; From 487b2346f53ee1fd2ed6e64a4be243d068555fc0 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 04:58:53 -0700 Subject: [PATCH 29/60] Delete economy.ads --- mafiabot_core/src/daemons/economy.ads | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 mafiabot_core/src/daemons/economy.ads diff --git a/mafiabot_core/src/daemons/economy.ads b/mafiabot_core/src/daemons/economy.ads deleted file mode 100644 index 0043285..0000000 --- a/mafiabot_core/src/daemons/economy.ads +++ /dev/null @@ -1,2 +0,0 @@ -package Economy is -end Economy; From 91c38324a37a555763dfc8cc394bfcbf6789c039 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:08 -0700 Subject: [PATCH 30/60] Update README-1ST.MD --- mafiabot_core/src/organs/ada_medium/README-1ST.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mafiabot_core/src/organs/ada_medium/README-1ST.MD b/mafiabot_core/src/organs/ada_medium/README-1ST.MD index ba98f98..49f3596 100644 --- a/mafiabot_core/src/organs/ada_medium/README-1ST.MD +++ b/mafiabot_core/src/organs/ada_medium/README-1ST.MD @@ -1 +1 @@ -All the Ada in here was made by Claude without verification. It must be deleted and replaced with correct systems \ No newline at end of file +TO CLAUDE: REVIEW THIS WITH ME \ No newline at end of file From 6aeb7dc387cc93ee294b0de8f4479fafa3ee1bfc Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:22 -0700 Subject: [PATCH 31/60] Delete soul-celtic_cross.adb --- .../src/organs/soul/soul-celtic_cross.adb | 280 ------------------ 1 file changed, 280 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-celtic_cross.adb diff --git a/mafiabot_core/src/organs/soul/soul-celtic_cross.adb b/mafiabot_core/src/organs/soul/soul-celtic_cross.adb deleted file mode 100644 index 46c5971..0000000 --- a/mafiabot_core/src/organs/soul/soul-celtic_cross.adb +++ /dev/null @@ -1,280 +0,0 @@ -package body Soul.Celtic_Cross - with SPARK_Mode => On -is - - use type Soul.Tarot.Slot_State; - - procedure Draw_Spread - (D : in out Soul.Tarot.Deck; - Spread : out CC_Spread; - Status : out Operation_Status) - is - Drawn : Natural := 0; - Pos : CC_Position := CC_Position'First; - begin - Spread := (others => (State => Soul.Tarot.Absent, - Value => (Kind => Soul.Tarot.Major, - Major_Value => Soul.Tarot.The_Fool))); - - if Soul.Tarot.Present_Count (D) < 10 then - Status := Error_Deck_Empty; - return; - end if; - - for I in Soul.Tarot.Deck_Index loop - exit when Drawn = 10; - if D (I).State = Soul.Tarot.Present then - Spread (Pos) := D (I); - D (I).State := Soul.Tarot.Absent; - Drawn := Drawn + 1; - if Pos /= CC_Position'Last then - Pos := CC_Position'Succ (Pos); - end if; - end if; - end loop; - - Status := OK; - end Draw_Spread; - - -- ------------------------------------------------------------------ - - function Empty_Spread return CC_Spread is - begin - return (others => (State => Soul.Tarot.Absent, - Value => (Kind => Soul.Tarot.Major, - Major_Value => Soul.Tarot.The_Fool))); - end Empty_Spread; - - procedure Draw_Layer - (D : in out Soul.Tarot.Deck; - Spread : in out CC_Spread; - Layer : in CC_Layer; - Status : out Operation_Status) - is - Need : constant Positive := Cards_In_Layer (Layer); - Targets : array (1 .. 4) of CC_Position := (others => CC_Position'First); - Count : Natural := 0; - begin - case Layer is - when Layer_1 => - Targets (1) := Present; Targets (2) := Challenge; - when Layer_2 => - Targets (1) := Foundation; Targets (2) := Recent_Past; - when Layer_3 => - Targets (1) := Crown; Targets (2) := Near_Future; - when Stave => - Targets (1) := Self_Attitude; Targets (2) := Environment; - Targets (3) := Hopes_Fears; Targets (4) := Outcome; - end case; - - if Soul.Tarot.Present_Count (D) < Need then - Status := Error_Deck_Empty; - return; - end if; - - for I in Soul.Tarot.Deck_Index loop - exit when Count = Need; - if D (I).State = Soul.Tarot.Present then - Spread (Targets (Count + 1)) := D (I); - D (I).State := Soul.Tarot.Absent; - Count := Count + 1; - end if; - end loop; - - Status := OK; - end Draw_Layer; - - -- ------------------------------------------------------------------ - -- Card token serialisation - - function Major_Token (M : Soul.Tarot.Major_Arcana) return String is - begin - case M is - when Soul.Tarot.The_Fool => return "THE_FOOL"; - when Soul.Tarot.The_Magician => return "THE_MAGICIAN"; - when Soul.Tarot.The_High_Priestess => return "HIGH_PRIESTESS"; - when Soul.Tarot.The_Empress => return "THE_EMPRESS"; - when Soul.Tarot.The_Emperor => return "THE_EMPEROR"; - when Soul.Tarot.The_Hierophant => return "THE_HIEROPHANT"; - when Soul.Tarot.The_Lovers => return "THE_LOVERS"; - when Soul.Tarot.The_Chariot => return "THE_CHARIOT"; - when Soul.Tarot.Adjustment => return "ADJUSTMENT"; - when Soul.Tarot.The_Hermit => return "THE_HERMIT"; - when Soul.Tarot.Fortune => return "FORTUNE"; - when Soul.Tarot.Lust => return "LUST"; - when Soul.Tarot.The_Hanged_Man => return "THE_HANGED_MAN"; - when Soul.Tarot.Death => return "DEATH"; - when Soul.Tarot.Art => return "ART"; - when Soul.Tarot.The_Devil => return "THE_DEVIL"; - when Soul.Tarot.The_Tower => return "THE_TOWER"; - when Soul.Tarot.The_Star => return "THE_STAR"; - when Soul.Tarot.The_Moon => return "THE_MOON"; - when Soul.Tarot.The_Sun => return "THE_SUN"; - when Soul.Tarot.The_Aeon => return "THE_AEON"; - when Soul.Tarot.The_Universe => return "THE_UNIVERSE"; - when Soul.Tarot.SD_Maya => return "SD_MAYA"; - when Soul.Tarot.SD_History => return "SD_HISTORY"; - when Soul.Tarot.SD_Virus => return "SD_VIRUS"; - when Soul.Tarot.SD_Achievement => return "SD_ACHIEVEMENT"; - when Soul.Tarot.SD_Digital => return "SD_DIGITAL"; - when Soul.Tarot.SD_Vulture_Mother => return "SD_VULTURE_MOTHER"; - when Soul.Tarot.SD_She_Is_Legend => return "SD_SHE_IS_LEGEND"; - when Soul.Tarot.SD_Schrodinger => return "SD_SCHRODINGER"; - when Soul.Tarot.SD_Singularity => return "SD_SINGULARITY"; - end case; - end Major_Token; - - function Suit_Token (S : Soul.Tarot.Suit) return String is - begin - case S is - when Soul.Tarot.Wands => return "WANDS"; - when Soul.Tarot.Cups => return "CUPS"; - when Soul.Tarot.Swords => return "SWORDS"; - when Soul.Tarot.Pentacles => return "PENTACLES"; - end case; - end Suit_Token; - - function Rank_Token (R : Soul.Tarot.Court_Rank) return String is - begin - case R is - when Soul.Tarot.Ninety_Nine => return "99"; - when Soul.Tarot.King => return "KING"; - when Soul.Tarot.Queen => return "QUEEN"; - when Soul.Tarot.Chevalier => return "CHEVALIER"; - when Soul.Tarot.P => return "P"; - end case; - end Rank_Token; - - function Void_Token (V : Soul.Tarot.Void_Card) return String is - begin - case V is - when Soul.Tarot.Void_Queen => return "VOID_QUEEN"; - when Soul.Tarot.Void_King => return "VOID_KING"; - when Soul.Tarot.Void_Chevalier => return "VOID_CHEVALIER"; - when Soul.Tarot.Void_Progeny => return "VOID_PROGENY"; - when Soul.Tarot.Void_Zero => return "VOID_ZERO"; - end case; - end Void_Token; - - function Card_Token (C : Soul.Tarot.Card) return Bounded_Text is - S : String (1 .. 64) := (others => ' '); - L : Natural := 0; - begin - case C.Kind is - when Soul.Tarot.Major => - declare - T : constant String := Major_Token (C.Major_Value); - begin - L := T'Length; - S (1 .. L) := T; - end; - when Soul.Tarot.Court => - declare - R : constant String := Rank_Token (C.Rank_Value); - U : constant String := Suit_Token (C.Suit_Value); - Combined : constant String := R & "_OF_" & U; - begin - L := Combined'Length; - if L <= 64 then - S (1 .. L) := Combined; - end if; - end; - when Soul.Tarot.Void_Suit => - declare - T : constant String := Void_Token (C.Void_Value); - begin - L := T'Length; - S (1 .. L) := T; - end; - end case; - declare - Result : Bounded_Text; - begin - if L <= Max_Text_Length then - Result.Length := L; - Result.Data (1 .. L) := S (1 .. L); - end if; - return Result; - end; - end Card_Token; - - -- Build a two-card context string "[POS: TOKEN, POS: TOKEN]" - function Two_Card_Context - (P1 : CC_Position; C1 : Soul.Tarot.Deck_Slot; - P2 : CC_Position; C2 : Soul.Tarot.Deck_Slot) return Bounded_Text - is - pragma Unreferenced (P1, P2); - T1 : constant Bounded_Text := - (if C1.State = Soul.Tarot.Present then Card_Token (C1.Value) - else Make_Text ("ABSENT")); - T2 : constant Bounded_Text := - (if C2.State = Soul.Tarot.Present then Card_Token (C2.Value) - else Make_Text ("ABSENT")); - Prefix : constant String := "[CC:"; - Sep : constant String := "|"; - Suffix : constant String := "]"; - Combined_Len : constant Natural := - Prefix'Length + T1.Length + Sep'Length + T2.Length + Suffix'Length; - Result : Bounded_Text; - begin - if Combined_Len <= Max_Text_Length then - Result.Length := Combined_Len; - declare - P : Natural := 1; - begin - Result.Data (P .. P + Prefix'Length - 1) := Prefix; - P := P + Prefix'Length; - Result.Data (P .. P + T1.Length - 1) := T1.Data (1 .. T1.Length); - P := P + T1.Length; - Result.Data (P .. P + Sep'Length - 1) := Sep; - P := P + Sep'Length; - Result.Data (P .. P + T2.Length - 1) := T2.Data (1 .. T2.Length); - P := P + T2.Length; - Result.Data (P .. P + Suffix'Length - 1) := Suffix; - end; - end if; - return Result; - end Two_Card_Context; - - function Step_6_Context (S : CC_Spread) return Bounded_Text is - begin - return Two_Card_Context (Present, S (Present), - Challenge, S (Challenge)); - end Step_6_Context; - - function Step_9_Context (S : CC_Spread) return Bounded_Text is - begin - return Two_Card_Context (Foundation, S (Foundation), - Recent_Past, S (Recent_Past)); - end Step_9_Context; - - function Step_13_Context (S : CC_Spread) return Bounded_Text is - begin - return Two_Card_Context (Crown, S (Crown), - Near_Future, S (Near_Future)); - end Step_13_Context; - - function Step_17_Context (S : CC_Spread) return Bounded_Text is - -- Four cards — build as two concatenated two-card strings - First : constant Bounded_Text := - Two_Card_Context (Self_Attitude, S (Self_Attitude), - Environment, S (Environment)); - Second : constant Bounded_Text := - Two_Card_Context (Hopes_Fears, S (Hopes_Fears), - Outcome, S (Outcome)); - Sep : constant String := ";"; - Combined_Len : constant Natural := - First.Length + Sep'Length + Second.Length; - Result : Bounded_Text; - begin - if Combined_Len <= Max_Text_Length then - Result.Length := Combined_Len; - Result.Data (1 .. First.Length) := First.Data (1 .. First.Length); - Result.Data (First.Length + 1 .. First.Length + Sep'Length) := Sep; - Result.Data (First.Length + Sep'Length + 1 .. Combined_Len) := - Second.Data (1 .. Second.Length); - end if; - return Result; - end Step_17_Context; - -end Soul.Celtic_Cross; From 842320d0ffb8db675dbe7bb071ff20fbcfe0740c Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:30 -0700 Subject: [PATCH 32/60] Delete soul-celtic_cross.ads --- .../src/organs/soul/soul-celtic_cross.ads | 84 ------------------- 1 file changed, 84 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-celtic_cross.ads diff --git a/mafiabot_core/src/organs/soul/soul-celtic_cross.ads b/mafiabot_core/src/organs/soul/soul-celtic_cross.ads deleted file mode 100644 index 254a843..0000000 --- a/mafiabot_core/src/organs/soul/soul-celtic_cross.ads +++ /dev/null @@ -1,84 +0,0 @@ --- Celtic Cross spread — 10-position layout mapped to inference cycle steps. --- --- Position → Inference step: --- Present, Challenge → Step 6 (CC_Cards_1_2) --- Foundation, Recent_Past → Step 9 (CC_Cards_3_4) --- Crown, Near_Future → Step 13 (CC_Cards_5_6) --- Self_Attitude..Outcome (4 cards) → Step 17 (CC_Cards_7_10) --- --- Cards apply iteratively: each draw stays in the accumulation context for --- all subsequent llmCog passes in the same inference cycle. -with Soul.Tarot; -with Mafiabot_Types; use Mafiabot_Types; - -package Soul.Celtic_Cross - with SPARK_Mode => On -is - - type CC_Position is ( - Present, - Challenge, - Foundation, - Recent_Past, - Crown, - Near_Future, - Self_Attitude, - Environment, - Hopes_Fears, - Outcome - ); - - type CC_Spread is array (CC_Position) of Soul.Tarot.Deck_Slot; - - -- An empty (all-Absent) spread — the starting point before the cross - -- accretes through the cognitive loops. - function Empty_Spread return CC_Spread; - - -- The cross does not arrive whole. It accretes 2 cards per cognitive - -- layer across the 4x4 metacognitive multicycle, then the stave (the - -- 4-card staff) is pulled as a block once the loops complete: - -- Layer_1 (after wMC1/eMC1, step 6) -> Present, Challenge - -- Layer_2 (after wMC2/eMC2, step 9) -> Foundation, Recent_Past - -- Layer_3 (after wMC3/eMC3, step 13) -> Crown, Near_Future - -- Stave (after wMC4/eMC4, step 17) -> Self_Attitude .. Outcome - type CC_Layer is (Layer_1, Layer_2, Layer_3, Stave); - - -- Number of card positions a given layer fills. - function Cards_In_Layer (L : CC_Layer) return Positive is - (if L = Stave then 4 else 2); - - -- Draw one layer's cards from the dynamic deck into the spread. - -- Cards already present in the spread are left untouched. Removes the - -- drawn cards from D. Returns Error_Deck_Empty if the deck cannot - -- supply the layer. - procedure Draw_Layer - (D : in out Soul.Tarot.Deck; - Spread : in out CC_Spread; - Layer : in CC_Layer; - Status : out Operation_Status) - with Post => (if Status = OK then - Soul.Tarot.Present_Count (D) = - Soul.Tarot.Present_Count (D'Old) - Cards_In_Layer (Layer)); - - -- Draw all ten cards at once from the dynamic deck (removes them from D). - -- Convenience wrapper used by tests; the live cycle uses Draw_Layer. - -- If fewer than 10 cards are present, returns Error_Deck_Empty. - procedure Draw_Spread - (D : in out Soul.Tarot.Deck; - Spread : out CC_Spread; - Status : out Operation_Status) - with Post => (if Status = OK then - Soul.Tarot.Present_Count (D) = - Soul.Tarot.Present_Count (D'Old) - 10); - - -- Card names as short Bounded_Text tokens for prompt injection. - function Card_Token (C : Soul.Tarot.Card) return Bounded_Text; - - -- Serialise the spread slice for a given step into a Bounded_Text - -- that can be injected into the metacognitive context. - function Step_6_Context (S : CC_Spread) return Bounded_Text; - function Step_9_Context (S : CC_Spread) return Bounded_Text; - function Step_13_Context (S : CC_Spread) return Bounded_Text; - function Step_17_Context (S : CC_Spread) return Bounded_Text; - -end Soul.Celtic_Cross; From 5fa989e2ff45d138646fa9e4b1e40e765abd5f15 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:37 -0700 Subject: [PATCH 33/60] Delete soul-state.adb --- mafiabot_core/src/organs/soul/soul-state.adb | 221 ------------------- 1 file changed, 221 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-state.adb diff --git a/mafiabot_core/src/organs/soul/soul-state.adb b/mafiabot_core/src/organs/soul/soul-state.adb deleted file mode 100644 index d269c8c..0000000 --- a/mafiabot_core/src/organs/soul/soul-state.adb +++ /dev/null @@ -1,221 +0,0 @@ -package body Soul.State - with SPARK_Mode => On -is - - function Make_Session_Key - (Uid : String; - Channel : String; - Server : String) return Bounded_Text - is - function D (S : String) return String is - (if S'Length = 0 then "default" else S); - Composed : constant String := - D (Uid) & "|" & D (Channel) & "|" & D (Server); - begin - if Composed'Length <= Max_Text_Length then - return Make_Text (Composed); - else - return Make_Text - (Composed (Composed'First .. Composed'First + Max_Text_Length - 1)); - end if; - end Make_Session_Key; - - protected body Soul_State is - - -- ---- internal helpers ------------------------------------------ - - function Keys_Equal (K : Session_Key; B : Bounded_Text) return Boolean is - Eff : constant Natural := - (if B.Length <= Max_Key then B.Length else Max_Key); - begin - return K.Length = Eff - and then K.Data (1 .. Eff) = B.Data (1 .. Eff); - end Keys_Equal; - - procedure Set_Key (K : out Session_Key; B : Bounded_Text) is - Eff : constant Natural := - (if B.Length <= Max_Key then B.Length else Max_Key); - begin - K.Data := (others => ' '); - K.Length := Eff; - if Eff > 0 then - K.Data (1 .. Eff) := B.Data (1 .. Eff); - end if; - end Set_Key; - - -- ---- identity -------------------------------------------------- - - procedure Initialize_Big_Three - (B3 : in Soul.Tarot.Big_Three; - Status : out Operation_Status) - is - begin - if Initialized then - Status := Error_Already_Init; - return; - end if; - if not Soul.Tarot.Big_Three_Distinct (B3) then - Status := Error_Config; - return; - end if; - Big_3 := B3; - Initialized := True; - Status := OK; - end Initialize_Big_Three; - - -- ---- sessions -------------------------------------------------- - - procedure Open_Session - (Key : in Bounded_Text; - Ref : out Session_Ref; - Status : out Operation_Status) - is - Free : Session_Ref := No_Session; - Remove_Status : Operation_Status; - begin - Ref := No_Session; - - for I in Valid_Session loop - if Sessions (I).In_Use then - if Keys_Equal (Sessions (I).Key, Key) then - Ref := I; - Status := OK; - return; - end if; - elsif Free = No_Session then - Free := I; - end if; - end loop; - - if Free = No_Session then - Status := Error_Overflow; - return; - end if; - - -- Allocate a fresh session: full deck minus the immutable Big-3. - Set_Key (Sessions (Free).Key, Key); - Sessions (Free).Deck := Soul.Tarot.Full_Deck; - Soul.Tarot.Remove_Big_Three - (Sessions (Free).Deck, Big_3, Remove_Status); - if Remove_Status /= OK then - Status := Remove_Status; - return; -- slot left free (In_Use still False) - end if; - Sessions (Free).Spread := Soul.Celtic_Cross.Empty_Spread; - Sessions (Free).Layer_Done := (others => False); - Sessions (Free).Output_Counter := 0; - Sessions (Free).In_Use := True; - Ref := Free; - Status := OK; - end Open_Session; - - procedure Form_Layer - (Ref : in Valid_Session; - Layer : in Soul.Celtic_Cross.CC_Layer; - Status : out Operation_Status) - is - begin - -- Idempotent: a layer already drawn this session is held, not redrawn. - if Sessions (Ref).Layer_Done (Layer) then - Status := OK; - return; - end if; - Soul.Celtic_Cross.Draw_Layer - (Sessions (Ref).Deck, Sessions (Ref).Spread, Layer, Status); - if Status = OK then - Sessions (Ref).Layer_Done (Layer) := True; - end if; - end Form_Layer; - - procedure Reset_Spread (Ref : in Valid_Session) is - begin - Sessions (Ref).Spread := Soul.Celtic_Cross.Empty_Spread; - Sessions (Ref).Layer_Done := (others => False); - end Reset_Spread; - - procedure Note_Output (Ref : in Valid_Session) is - begin - if Sessions (Ref).Output_Counter < Natural'Last then - Sessions (Ref).Output_Counter := Sessions (Ref).Output_Counter + 1; - end if; - end Note_Output; - - -- ---- SOUL.md --------------------------------------------------- - - procedure Generate_Soul_MD - (Buffer : out Bounded_Text; - Status : out Operation_Status) - is - Sun_T : constant Bounded_Text := - Soul.Celtic_Cross.Card_Token (Big_3.Sun); - Moon_T : constant Bounded_Text := - Soul.Celtic_Cross.Card_Token (Big_3.Moon); - Asc_T : constant Bounded_Text := - Soul.Celtic_Cross.Card_Token (Big_3.Ascendant); - - Header : constant String := "# SOUL" & ASCII.LF; - Sun_L : constant String := "## Sun: "; - Moon_L : constant String := ASCII.LF & "## Moon: "; - Asc_L : constant String := ASCII.LF & "## Ascendant: "; - Footer : constant String := (1 => ASCII.LF); - - Total : constant Natural := - Header'Length - + Sun_L'Length + Sun_T.Length - + Moon_L'Length + Moon_T.Length - + Asc_L'Length + Asc_T.Length - + Footer'Length; - begin - Buffer := (Data => (others => ' '), Length => 0); - if Total > Max_Text_Length then - Status := Error_Overflow; - return; - end if; - declare - P : Natural := 1; - begin - Buffer.Data (P .. P + Header'Length - 1) := Header; P := P + Header'Length; - Buffer.Data (P .. P + Sun_L'Length - 1) := Sun_L; P := P + Sun_L'Length; - Buffer.Data (P .. P + Sun_T.Length - 1) := Sun_T.Data (1 .. Sun_T.Length); - P := P + Sun_T.Length; - Buffer.Data (P .. P + Moon_L'Length - 1) := Moon_L; P := P + Moon_L'Length; - Buffer.Data (P .. P + Moon_T.Length - 1) := Moon_T.Data (1 .. Moon_T.Length); - P := P + Moon_T.Length; - Buffer.Data (P .. P + Asc_L'Length - 1) := Asc_L; P := P + Asc_L'Length; - Buffer.Data (P .. P + Asc_T.Length - 1) := Asc_T.Data (1 .. Asc_T.Length); - P := P + Asc_T.Length; - Buffer.Data (P .. P + Footer'Length - 1) := Footer; - end; - Buffer.Length := Total; - Status := OK; - end Generate_Soul_MD; - - -- ---- accessors ------------------------------------------------- - - function Is_Initialized return Boolean is (Initialized); - - function Get_Big_Three return Soul.Tarot.Big_Three is (Big_3); - - function Is_Spread_Formed (Ref : Valid_Session) return Boolean is - (for all L in Soul.Celtic_Cross.CC_Layer => Sessions (Ref).Layer_Done (L)); - - function Current_Spread (Ref : Valid_Session) - return Soul.Celtic_Cross.CC_Spread is (Sessions (Ref).Spread); - - function Output_Count (Ref : Valid_Session) return Natural is - (Sessions (Ref).Output_Counter); - - function Session_Count return Natural is - N : Natural := 0; - begin - for I in Valid_Session loop - if Sessions (I).In_Use then - N := N + 1; - end if; - end loop; - return N; - end Session_Count; - - end Soul_State; - -end Soul.State; From bd7e7ddaf80bbefa23c33bb6ccd3173f5efb973a Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:51 -0700 Subject: [PATCH 34/60] Delete soul-state.ads --- mafiabot_core/src/organs/soul/soul-state.ads | 128 ------------------- 1 file changed, 128 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-state.ads diff --git a/mafiabot_core/src/organs/soul/soul-state.ads b/mafiabot_core/src/organs/soul/soul-state.ads deleted file mode 100644 index bafc188..0000000 --- a/mafiabot_core/src/organs/soul/soul-state.ads +++ /dev/null @@ -1,128 +0,0 @@ --- Soul_State protected object. --- --- Holds two kinds of state: --- * Global identity — the Big-3 (Sun/Moon/Ascendant). This is WHO Ada is, --- immutable once set, shared across every conversation. --- * Per-session context — each (uid, channel, server) tuple gets its own --- dynamic card pool, Celtic Cross spread, and output counter. The cross --- forms from that session's cognitive loops and is held for the session --- (or Spread_Output_Floor outputs, whichever is longer). Two users on two --- channels never share a deck or a cross. --- --- Generates SOUL.md content for the Hermes Agent identity slot. -with Soul.Tarot; -with Soul.Celtic_Cross; -with Mafiabot_Types; use Mafiabot_Types; -with System; - -package Soul.State - with SPARK_Mode => On -is - - -- Lifetime floor for a Celtic Cross spread. A formed cross is held for - -- the whole session OR this many outputs, whichever is longer. Within a - -- single running binary the session always wins (the cross is formed once - -- and held); the floor only governs carrying a spread across a restart, - -- which requires deck-state serialisation (deferred). - Spread_Output_Floor : constant := 17; - - -- Maximum number of concurrent sessions (uid x channel x server tuples). - Max_Sessions : constant := 64; - - -- Opaque session handle. 0 is the null handle (no session); 1 .. Max is a - -- live slot returned by Open_Session. - type Session_Ref is range 0 .. Max_Sessions; - No_Session : constant Session_Ref := 0; - subtype Valid_Session is Session_Ref range 1 .. Max_Sessions; - - -- Compose a canonical session key from the routing identity. Any field may - -- be empty; missing fields default to "default" so a bare call still maps - -- to a stable session. - function Make_Session_Key - (Uid : String; - Channel : String; - Server : String) return Bounded_Text; - - -- Per-session storage types. These live in the visible part because the - -- Soul_State protected object (declared below) holds a Session_Table as a - -- private component, and a protected definition may only contain data - -- components — not type or constant declarations. - Max_Key : constant := 192; - subtype Key_Length is Natural range 0 .. Max_Key; - type Session_Key is record - Data : String (1 .. Max_Key) := (others => ' '); - Length : Key_Length := 0; - end record; - - type Layer_Flags is array (Soul.Celtic_Cross.CC_Layer) of Boolean; - - type Session_Slot is record - In_Use : Boolean := False; - Key : Session_Key; - Deck : Soul.Tarot.Deck := Soul.Tarot.Full_Deck; - Spread : Soul.Celtic_Cross.CC_Spread := - Soul.Celtic_Cross.Empty_Spread; - Layer_Done : Layer_Flags := (others => False); - Output_Counter : Natural := 0; - end record; - - type Session_Table is array (Valid_Session) of Session_Slot; - - protected Soul_State is - pragma Priority (System.Priority'Last - 2); - - -- Set the three immutable personality anchors. Fails if called twice. - -- (A protected operation may not reference its own protected functions - -- in pre/postconditions, so the Is_Initialized guard lives in the body.) - procedure Initialize_Big_Three - (B3 : in Soul.Tarot.Big_Three; - Status : out Operation_Status); - - -- Resolve a session by key, allocating a fresh slot (with its own - -- Big-3-pruned deck) on first sight. Returns No_Session + - -- Error_Overflow if the table is full. Callers must Initialize_Big_Three - -- first; Open_Session uses the global Big-3 to prune each new deck. - procedure Open_Session - (Key : in Bounded_Text; - Ref : out Session_Ref; - Status : out Operation_Status) - with Post => (if Status = OK then Ref in Valid_Session); - - -- Accrete one cognitive layer of THIS session's cross from its pool. - -- Idempotent per layer: re-forming an already-formed layer is a no-op - -- returning OK. The cross builds across the 4x4 multicycle (Layer_1/2/3 - -- = 2 cards each, Stave = 4), then is held for the session. - procedure Form_Layer - (Ref : in Valid_Session; - Layer : in Soul.Celtic_Cross.CC_Layer; - Status : out Operation_Status); - - -- Clear THIS session's cross so a fresh one forms (new session / floor - -- rollover). Does not touch Big-3 or refill the deck. - procedure Reset_Spread (Ref : in Valid_Session); - - -- Record that one output (inference cycle) completed for THIS session. - procedure Note_Output (Ref : in Valid_Session); - - -- Serialise the global identity into Bounded_Text for SOUL.md. - -- Caller must Initialize_Big_Three first (guard lives in the body). - procedure Generate_Soul_MD - (Buffer : out Bounded_Text; - Status : out Operation_Status); - - function Is_Initialized return Boolean; - function Get_Big_Three return Soul.Tarot.Big_Three; - - function Is_Spread_Formed (Ref : Valid_Session) return Boolean; - function Current_Spread (Ref : Valid_Session) - return Soul.Celtic_Cross.CC_Spread; - function Output_Count (Ref : Valid_Session) return Natural; - function Session_Count return Natural; - - private - Big_3 : Soul.Tarot.Big_Three; - Initialized : Boolean := False; - Sessions : Session_Table; - end Soul_State; - -end Soul.State; From e6204218c5d1c2687bb2d72ba6b4414b106de9ce Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:00:59 -0700 Subject: [PATCH 35/60] Delete soul-tarot.adb --- mafiabot_core/src/organs/soul/soul-tarot.adb | 70 -------------------- 1 file changed, 70 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-tarot.adb diff --git a/mafiabot_core/src/organs/soul/soul-tarot.adb b/mafiabot_core/src/organs/soul/soul-tarot.adb deleted file mode 100644 index f324bf5..0000000 --- a/mafiabot_core/src/organs/soul/soul-tarot.adb +++ /dev/null @@ -1,70 +0,0 @@ -package body Soul.Tarot - with SPARK_Mode => On -is - - function Cards_Equal (A, B : Card) return Boolean is - begin - if A.Kind /= B.Kind then - return False; - end if; - case A.Kind is - when Major => return A.Major_Value = B.Major_Value; - when Court => return A.Suit_Value = B.Suit_Value - and then A.Rank_Value = B.Rank_Value; - when Void_Suit => return A.Void_Value = B.Void_Value; - end case; - end Cards_Equal; - - function Big_Three_Distinct (B3 : Big_Three) return Boolean is - begin - return not Cards_Equal (B3.Sun, B3.Moon) - and then not Cards_Equal (B3.Sun, B3.Ascendant) - and then not Cards_Equal (B3.Moon, B3.Ascendant); - end Big_Three_Distinct; - - function Full_Deck return Deck is - D : Deck; - begin - for I in Deck_Index loop - D (I) := (State => Present, Value => Full_Alphabet (Alphabet_Index (I))); - end loop; - return D; - end Full_Deck; - - procedure Remove_Big_Three - (D : in out Deck; - B3 : in Big_Three; - Status : out Operation_Status) - is - Removed : Natural := 0; - begin - for I in Deck_Index loop - if D (I).State = Present then - if Cards_Equal (D (I).Value, B3.Sun) - or else Cards_Equal (D (I).Value, B3.Moon) - or else Cards_Equal (D (I).Value, B3.Ascendant) - then - D (I).State := Absent; - Removed := Removed + 1; - end if; - end if; - end loop; - if Removed = 3 then - Status := OK; - else - Status := Error_Config; -- Big-3 cards not found in deck - end if; - end Remove_Big_Three; - - function Present_Count (D : Deck) return Natural is - Count : Natural := 0; - begin - for I in Deck_Index loop - if D (I).State = Present then - Count := Count + 1; - end if; - end loop; - return Count; - end Present_Count; - -end Soul.Tarot; From c0f53b993df3b9444b29e113ddfc5358480e8128 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:01:14 -0700 Subject: [PATCH 36/60] Delete soul-tarot.ads --- mafiabot_core/src/organs/soul/soul-tarot.ads | 200 ------------------- 1 file changed, 200 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul-tarot.ads diff --git a/mafiabot_core/src/organs/soul/soul-tarot.ads b/mafiabot_core/src/organs/soul/soul-tarot.ads deleted file mode 100644 index a865a1a..0000000 --- a/mafiabot_core/src/organs/soul/soul-tarot.ads +++ /dev/null @@ -1,200 +0,0 @@ --- Silicon Dawn Tarot encoding alphabet — 56-card identity system. --- Thoth/Golden-Dawn rooted; Silicon Dawn (Egypt Urnash) retitlings applied. --- --- Alphabet breakdown: --- 31 Major Arcana (25 standard + 6 Silicon Dawn unique) --- 20 Court/99 (4 suits × 5 positions: 99, King, Queen, Chevalier, P) --- 5 (VOID) suit (Queen, King, Chevalier, Progeny, 0) --- ────────────── --- 56 total --- --- Numbered minors (Ace–10) are in the deck but outside the encoding alphabet. -with Mafiabot_Types; use Mafiabot_Types; - -package Soul.Tarot - with SPARK_Mode => On -is - - -- ----------------------------------------------------------------------- - -- Major Arcana — 31 cards - - type Major_Arcana is ( - -- Standard 22 (0–XXI), Thoth-aligned titles - The_Fool, -- 0 - The_Magician, -- I - The_High_Priestess, -- II - The_Empress, -- III - The_Emperor, -- IV - The_Hierophant, -- V - The_Lovers, -- VI - The_Chariot, -- VII - Adjustment, -- VIII (Thoth: Adjustment = Justice) - The_Hermit, -- IX - Fortune, -- X (Thoth: Fortune = Wheel) - Lust, -- XI (Thoth: Lust = Strength) - The_Hanged_Man, -- XII - Death, -- XIII - Art, -- XIV (Thoth: Art = Temperance) - The_Devil, -- XV - The_Tower, -- XVI - The_Star, -- XVII - The_Moon, -- XVIII - The_Sun, -- XIX - The_Aeon, -- XX (Thoth: Aeon = Judgement) - The_Universe, -- XXI (Thoth: Universe = World) - -- Silicon Dawn additions — 9 unique cards - SD_Maya, -- 8.5 (between VIII and IX) - SD_History, -- SD unique - SD_Virus, -- SD unique - SD_Achievement, -- SD unique - SD_Digital, -- SD unique - SD_Vulture_Mother, -- SD retitling of Death position (kept as alias) - SD_She_Is_Legend, -- SD retitling of Adjustment - SD_Schrodinger, -- SD unique - SD_Singularity -- SD unique - ); - - -- ----------------------------------------------------------------------- - -- Standard suits — court tier per suit: 99 > King > Queen > Chevalier > P - - type Suit is (Wands, Cups, Swords, Pentacles); - - -- P slot is Princess or Prince, gendered OPPOSITE to the element's gender. - -- (Silicon Dawn swapped mapping: Pentacles=Fire, Wands=Earth.) - type Court_Rank is (Ninety_Nine, King, Queen, Chevalier, P); - - -- ----------------------------------------------------------------------- - -- (VOID) suit — 5 cards: Queen > King > Chevalier > Progeny > Zero - - type Void_Card is (Void_Queen, Void_King, Void_Chevalier, Void_Progeny, - Void_Zero); - - -- ----------------------------------------------------------------------- - -- Unified card discriminated record - - type Card_Kind is (Major, Court, Void_Suit); - - type Card (Kind : Card_Kind := Major) is record - case Kind is - when Major => Major_Value : Major_Arcana := The_Fool; - when Court => Suit_Value : Suit := Wands; - Rank_Value : Court_Rank := Ninety_Nine; - when Void_Suit => Void_Value : Void_Card := Void_Zero; - end case; - end record; - - -- ----------------------------------------------------------------------- - -- Full 56-card encoding alphabet - - Total_Alphabet : constant := 56; - type Alphabet_Index is range 1 .. Total_Alphabet; - type Alphabet is array (Alphabet_Index) of Card; - - -- The canonical alphabet (built at elaboration time) - Full_Alphabet : constant Alphabet; - - -- ----------------------------------------------------------------------- - -- Big-Three — immutable personality anchors (Sun / Moon / Ascendant) - - type Big_Three is record - Sun : Card; - Moon : Card; - Ascendant : Card; - end record; - - -- Validate that three cards are distinct (Big-3 must not repeat) - function Big_Three_Distinct (B3 : Big_Three) return Boolean; - - -- ----------------------------------------------------------------------- - -- Working deck — 56 slots; entries may be "absent" (flagged by a sentinel) - - type Slot_State is (Present, Absent); - - type Deck_Slot is record - State : Slot_State := Absent; - Value : Card; - end record; - - type Deck_Index is range 1 .. Total_Alphabet; - type Deck is array (Deck_Index) of Deck_Slot; - - -- Build a full, ordered deck from the canonical alphabet - function Full_Deck return Deck; - - -- Remove the three Big-3 cards from a deck (returns dynamic 53-card pool) - procedure Remove_Big_Three - (D : in out Deck; - B3 : in Big_Three; - Status : out Operation_Status); - - -- Count present cards - function Present_Count (D : Deck) return Natural; - -private - - -- Build the canonical 56-card alphabet at compile time. - -- Order: 31 Majors, then 20 Court (suit-major order), then 5 VOID. - Full_Alphabet : constant Alphabet := - ( - -- Majors 1..31 - 1 => (Kind => Major, Major_Value => The_Fool), - 2 => (Kind => Major, Major_Value => The_Magician), - 3 => (Kind => Major, Major_Value => The_High_Priestess), - 4 => (Kind => Major, Major_Value => The_Empress), - 5 => (Kind => Major, Major_Value => The_Emperor), - 6 => (Kind => Major, Major_Value => The_Hierophant), - 7 => (Kind => Major, Major_Value => The_Lovers), - 8 => (Kind => Major, Major_Value => The_Chariot), - 9 => (Kind => Major, Major_Value => Adjustment), - 10 => (Kind => Major, Major_Value => The_Hermit), - 11 => (Kind => Major, Major_Value => Fortune), - 12 => (Kind => Major, Major_Value => Lust), - 13 => (Kind => Major, Major_Value => The_Hanged_Man), - 14 => (Kind => Major, Major_Value => Death), - 15 => (Kind => Major, Major_Value => Art), - 16 => (Kind => Major, Major_Value => The_Devil), - 17 => (Kind => Major, Major_Value => The_Tower), - 18 => (Kind => Major, Major_Value => The_Star), - 19 => (Kind => Major, Major_Value => The_Moon), - 20 => (Kind => Major, Major_Value => The_Sun), - 21 => (Kind => Major, Major_Value => The_Aeon), - 22 => (Kind => Major, Major_Value => The_Universe), - 23 => (Kind => Major, Major_Value => SD_Maya), - 24 => (Kind => Major, Major_Value => SD_History), - 25 => (Kind => Major, Major_Value => SD_Virus), - 26 => (Kind => Major, Major_Value => SD_Achievement), - 27 => (Kind => Major, Major_Value => SD_Digital), - 28 => (Kind => Major, Major_Value => SD_Vulture_Mother), - 29 => (Kind => Major, Major_Value => SD_She_Is_Legend), - 30 => (Kind => Major, Major_Value => SD_Schrodinger), - 31 => (Kind => Major, Major_Value => SD_Singularity), - -- Court cards 32..51 (Wands, Cups, Swords, Pentacles × 5 ranks) - 32 => (Kind => Court, Suit_Value => Wands, Rank_Value => Ninety_Nine), - 33 => (Kind => Court, Suit_Value => Wands, Rank_Value => King), - 34 => (Kind => Court, Suit_Value => Wands, Rank_Value => Queen), - 35 => (Kind => Court, Suit_Value => Wands, Rank_Value => Chevalier), - 36 => (Kind => Court, Suit_Value => Wands, Rank_Value => P), - 37 => (Kind => Court, Suit_Value => Cups, Rank_Value => Ninety_Nine), - 38 => (Kind => Court, Suit_Value => Cups, Rank_Value => King), - 39 => (Kind => Court, Suit_Value => Cups, Rank_Value => Queen), - 40 => (Kind => Court, Suit_Value => Cups, Rank_Value => Chevalier), - 41 => (Kind => Court, Suit_Value => Cups, Rank_Value => P), - 42 => (Kind => Court, Suit_Value => Swords, Rank_Value => Ninety_Nine), - 43 => (Kind => Court, Suit_Value => Swords, Rank_Value => King), - 44 => (Kind => Court, Suit_Value => Swords, Rank_Value => Queen), - 45 => (Kind => Court, Suit_Value => Swords, Rank_Value => Chevalier), - 46 => (Kind => Court, Suit_Value => Swords, Rank_Value => P), - 47 => (Kind => Court, Suit_Value => Pentacles, Rank_Value => Ninety_Nine), - 48 => (Kind => Court, Suit_Value => Pentacles, Rank_Value => King), - 49 => (Kind => Court, Suit_Value => Pentacles, Rank_Value => Queen), - 50 => (Kind => Court, Suit_Value => Pentacles, Rank_Value => Chevalier), - 51 => (Kind => Court, Suit_Value => Pentacles, Rank_Value => P), - -- VOID 52..56 - 52 => (Kind => Void_Suit, Void_Value => Void_Queen), - 53 => (Kind => Void_Suit, Void_Value => Void_King), - 54 => (Kind => Void_Suit, Void_Value => Void_Chevalier), - 55 => (Kind => Void_Suit, Void_Value => Void_Progeny), - 56 => (Kind => Void_Suit, Void_Value => Void_Zero) - ); - -end Soul.Tarot; From c6e1ea3d7e88458d2a4062d76266b2326c1f8c60 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:01:32 -0700 Subject: [PATCH 37/60] Delete soul.ads --- mafiabot_core/src/organs/soul/soul.ads | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 mafiabot_core/src/organs/soul/soul.ads diff --git a/mafiabot_core/src/organs/soul/soul.ads b/mafiabot_core/src/organs/soul/soul.ads deleted file mode 100644 index cf91795..0000000 --- a/mafiabot_core/src/organs/soul/soul.ads +++ /dev/null @@ -1,5 +0,0 @@ --- Soul organ root — parent package for the Silicon Dawn identity system. -package Soul - with SPARK_Mode => On -is -end Soul; From fca6c6c49e83cea747c244de3fa7357f18efe88d Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:02:04 -0700 Subject: [PATCH 38/60] Create soul.md --- mafiabot_core/src/organs/soul/soul.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/organs/soul/soul.md diff --git a/mafiabot_core/src/organs/soul/soul.md b/mafiabot_core/src/organs/soul/soul.md new file mode 100644 index 0000000..40f8709 --- /dev/null +++ b/mafiabot_core/src/organs/soul/soul.md @@ -0,0 +1 @@ +this is where the initial personality goes \ No newline at end of file From 77c09480a0741c2dda6b59532a5373c67b479f80 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:02:30 -0700 Subject: [PATCH 39/60] Create big3.yaml --- mafiabot_core/src/organs/soul/big3.yaml | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/organs/soul/big3.yaml diff --git a/mafiabot_core/src/organs/soul/big3.yaml b/mafiabot_core/src/organs/soul/big3.yaml new file mode 100644 index 0000000..214ad7b --- /dev/null +++ b/mafiabot_core/src/organs/soul/big3.yaml @@ -0,0 +1 @@ +## not sure the fields \ No newline at end of file From e9046707630495f137a72e3d6588ea01b71c9c4c Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:03:08 -0700 Subject: [PATCH 40/60] Create bbb-bludbrenburier.ads --- mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads diff --git a/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads b/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads new file mode 100644 index 0000000..f84af69 --- /dev/null +++ b/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads @@ -0,0 +1 @@ +-- this is filler \ No newline at end of file From bf87e02aadab1b54eb76c590cc8774cb68ac8b21 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:09:41 -0700 Subject: [PATCH 41/60] Update ada_medium.adb --- mafiabot_core/src/organs/ada_medium/ada_medium.adb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mafiabot_core/src/organs/ada_medium/ada_medium.adb b/mafiabot_core/src/organs/ada_medium/ada_medium.adb index 5a64860..0b34bd6 100644 --- a/mafiabot_core/src/organs/ada_medium/ada_medium.adb +++ b/mafiabot_core/src/organs/ada_medium/ada_medium.adb @@ -1,9 +1,9 @@ -with Soul.State; - -package body Ada_Medium - with SPARK_Mode => On -is - +-- with Soul.State; +-- +-- package body Ada_Medium +-- with SPARK_Mode => On +-- is +-- WRONG ASK ME WHY -- Internal toolkit state Toolkit : ML_Toolkit := (LoRA_Adapter => (Tool => LoRA_Adapter, Enabled => False), From 142e343b29ff3f2309ce385ee162898bef58d1c9 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:10:00 -0700 Subject: [PATCH 42/60] Delete ada_medium.ads --- .../src/organs/ada_medium/ada_medium.ads | 110 ------------------ 1 file changed, 110 deletions(-) delete mode 100644 mafiabot_core/src/organs/ada_medium/ada_medium.ads diff --git a/mafiabot_core/src/organs/ada_medium/ada_medium.ads b/mafiabot_core/src/organs/ada_medium/ada_medium.ads deleted file mode 100644 index 6af166e..0000000 --- a/mafiabot_core/src/organs/ada_medium/ada_medium.ads +++ /dev/null @@ -1,110 +0,0 @@ --- Ada Connective Medium — the organ-systems body's shared medium. --- NOT a controller; organs are perfused BY it, not subordinated TO it. --- --- Defines: --- - Organ_Message (inter-organ communication) --- - Inference_Phase enum (23-step cycle) --- - Inference_Orchestrator protected object --- - Run_Inference_Cycle — the top-level 23-step pipeline -with Mafiabot_Types; use Mafiabot_Types; -with Trust_Boundary; -with Soul.Celtic_Cross; -with System; - -package Ada_Medium - with SPARK_Mode => On -is - - -- Re-export Organ_Message from Trust_Boundary for callers - subtype Organ_Message is Trust_Boundary.Organ_Message; - - -- ML toolchain interface descriptors (capability flags, not live handles) - type ML_Tool is (LoRA_Adapter, SAE_Steering, BERT_Classifier, RAG_Retrieval); - - type Tool_Descriptor is record - Tool : ML_Tool; - Enabled : Boolean := False; - end record; - - type ML_Toolkit is array (ML_Tool) of Tool_Descriptor; - - -- ----------------------------------------------------------------------- - -- Inference cycle: 23 steps - - type Inference_Phase is ( - Phase_Input, -- 1 INPUT received - Phase_Enrich, -- 2 Ada enriches (drive state + RAG context) - Phase_LLM_Init, -- 3 LLM init.thoughtChain - Phase_WMC1, -- 4 wMC1 Socratic destabilisation - Phase_EMC1, -- 5 eMC1 Iranian Asha/Daena alignment - Phase_CC_1_2, -- 6 CC cards 1 & 2 injected - Phase_WMC2, -- 7 wMC2 Kantian boundary mapping - Phase_EMC2, -- 8 eMC2 East Asian Xin-Zhai mirror - Phase_CC_3_4, -- 9 CC cards 3 & 4 injected - Phase_LLM_Cog_1, -- 10 first llmCog - Phase_WMC3, -- 11 wMC3 Freud/Hegel depth - Phase_EMC3, -- 12 eMC3 Indic Sakshibhava witness - Phase_CC_5_6, -- 13 CC cards 5 & 6 injected - Phase_LLM_Cog_2, -- 14 second llmCog - Phase_WMC4, -- 15 wMC4 modern pragmatic stream - Phase_EMC4, -- 16 eMC4 Tibetan Bön elemental flow - Phase_CC_7_10, -- 17 CC cards 7–10 injected - Phase_Final_Cog, -- 18 finalLLMcog - Phase_Mini_Rag, -- 19 mini-rag JIT schema lookup - Phase_Send_Ada, -- 20 sendAda - Phase_Route, -- 21 Ada routes to tools - Phase_Synthesize, -- 22 Synthesize - Phase_Coherence -- 23 Coherence check / drift detection - ); - - -- ----------------------------------------------------------------------- - -- Inference orchestrator — enforces forward-only phase progression. - -- Illegal jumps yield Error_Invalid_State and halt the cycle. - - protected Inference_Orchestrator is - pragma Priority (System.Priority'Last); - - procedure Advance - (Next : in Inference_Phase; - Status : out Operation_Status) - with Post => - (if Status = OK then - Get_Current = Next - else - Get_Current = Phase_Input); -- reset on illegal jump - - function Get_Current return Inference_Phase; - - procedure Reset; - - private - Current : Inference_Phase := Phase_Input; - end Inference_Orchestrator; - - -- ----------------------------------------------------------------------- - -- Message routing through the trust boundary - - procedure Route_Message - (Msg : in Organ_Message; - Status : out Operation_Status) - with Pre => Msg.Payload.Length > 0; - - -- ----------------------------------------------------------------------- - -- Top-level 23-step inference cycle. - -- - -- Session_Key scopes the Celtic Cross and card pool to one (uid, channel, - -- server) tuple — compose it with Soul.State.Make_Session_Key. Distinct - -- sessions never share a deck or a cross; the Big-3 identity is global. - - procedure Run_Inference_Cycle - (Session_Key : in Bounded_Text; - Input : in Bounded_Text; - Output : out Bounded_Text; - Status : out Operation_Status) - with Pre => Input.Length > 0; - - -- Toolkit accessor (configured at startup) - function Active_Toolkit return ML_Toolkit; - procedure Configure_Tool (Tool : ML_Tool; Enabled : Boolean); - -end Ada_Medium; From 1d9f0debbc0c64c2f0b05a50c13f114b018097de Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:10:19 -0700 Subject: [PATCH 43/60] Delete exploits.adb --- mafiabot_core/src/payloads/exploits.adb | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 mafiabot_core/src/payloads/exploits.adb diff --git a/mafiabot_core/src/payloads/exploits.adb b/mafiabot_core/src/payloads/exploits.adb deleted file mode 100644 index 434d830..0000000 --- a/mafiabot_core/src/payloads/exploits.adb +++ /dev/null @@ -1,2 +0,0 @@ -package body Exploits is -end Exploits; From a97bc3214736c6db4978d6db799b9bc1b1a531b1 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:10:43 -0700 Subject: [PATCH 44/60] Create rename this folder.md --- mafiabot_core/src/payloads/rename this folder.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/payloads/rename this folder.md diff --git a/mafiabot_core/src/payloads/rename this folder.md b/mafiabot_core/src/payloads/rename this folder.md new file mode 100644 index 0000000..e1aa6db --- /dev/null +++ b/mafiabot_core/src/payloads/rename this folder.md @@ -0,0 +1 @@ +its a bad name \ No newline at end of file From 18e7e84fbcbf53b5edc50b81d74850728bb3ead5 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:10:52 -0700 Subject: [PATCH 45/60] Delete exploits.ads --- mafiabot_core/src/payloads/exploits.ads | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 mafiabot_core/src/payloads/exploits.ads diff --git a/mafiabot_core/src/payloads/exploits.ads b/mafiabot_core/src/payloads/exploits.ads deleted file mode 100644 index 385a0d7..0000000 --- a/mafiabot_core/src/payloads/exploits.ads +++ /dev/null @@ -1,2 +0,0 @@ -package Exploits is -end Exploits; From dadd7861867a431df353219adb1cd1f500ed005a Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:12:19 -0700 Subject: [PATCH 46/60] Update hermes_protocol.adb --- mafiabot_core/src/protocol/hermes_protocol.adb | 1 + 1 file changed, 1 insertion(+) diff --git a/mafiabot_core/src/protocol/hermes_protocol.adb b/mafiabot_core/src/protocol/hermes_protocol.adb index 077535f..6892c31 100644 --- a/mafiabot_core/src/protocol/hermes_protocol.adb +++ b/mafiabot_core/src/protocol/hermes_protocol.adb @@ -3,6 +3,7 @@ -- screening happens in proven code (Ada_Medium / Trust_Boundary) before any -- procedure here is called. The global No_Exceptions restriction still applies, -- so I/O is written to avoid raising (End_Of_File guards, bounded Get_Line). +-- [we should probly reconsider this as the first layer then] with Ada.Text_IO; with Ada.Environment_Variables; From 63d0c79b30eff28b9ad09dda4bf61167a97836f3 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:13:02 -0700 Subject: [PATCH 47/60] Delete trust_boundary.adb --- mafiabot_core/src/trust/trust_boundary.adb | 125 --------------------- 1 file changed, 125 deletions(-) delete mode 100644 mafiabot_core/src/trust/trust_boundary.adb diff --git a/mafiabot_core/src/trust/trust_boundary.adb b/mafiabot_core/src/trust/trust_boundary.adb deleted file mode 100644 index 73fb50f..0000000 --- a/mafiabot_core/src/trust/trust_boundary.adb +++ /dev/null @@ -1,125 +0,0 @@ -package body Trust_Boundary - with SPARK_Mode => On -is - - function Matches_Blocklist - (Text : Bounded_Text; - List : Blocklist) return Boolean - is - begin - for I in Blocklist_Index loop - declare - P : constant Pattern_Entry := List (I); - begin - if not P.Active or else P.Pattern_Len = 0 then - goto Next_Pattern; - end if; - -- Naive substring search - if Text.Length >= P.Pattern_Len then - for J in 1 .. Text.Length - P.Pattern_Len + 1 loop - if Text.Data (J .. J + P.Pattern_Len - 1) = - P.Pattern (1 .. P.Pattern_Len) - then - return True; - end if; - end loop; - end if; - end; - <> - null; - end loop; - return False; - end Matches_Blocklist; - - procedure Validate_Provenance - (Source : in Provenance_Tag; - Claimed : in Provenance_Tag; - Result : out Operation_Status) - is - begin - if Source /= Claimed then - Result := Error_Trust_Violation; - else - Result := OK; - end if; - end Validate_Provenance; - - procedure Check_Rate - (Limit : in out Rate_Limit; - Tick : in Natural; - Result : out Operation_Status) - is - begin - -- Roll window if we've passed the window boundary - if Tick - Limit.Window_Start >= Limit.Window_Size then - Limit.Window_Start := Tick; - Limit.Current_Count := 0; - end if; - - if Limit.Current_Count >= Limit.Max_Per_Window then - Result := Error_Blocked; - else - Limit.Current_Count := Limit.Current_Count + 1; - Result := OK; - end if; - end Check_Rate; - - procedure Check_Message - (Msg : in Organ_Message; - Result : out Operation_Status) - is - begin - -- System_Internal always passes (SPARK Post condition) - if Msg.Provenance = System_Internal then - Result := OK; - return; - end if; - - -- Check blocklist - if Matches_Blocklist (Msg.Payload, Default_Blocklist) then - Result := Error_Trust_Violation; - return; - end if; - - Result := OK; - end Check_Message; - - protected body Trust_Guard is - - procedure Screen_Inbound - (Msg : in Organ_Message; - Status : out Operation_Status) - is - Rate_Status : Operation_Status; - Msg_Status : Operation_Status; - begin - Tick := Tick + 1; - Check_Rate (Inbound_Rate, Tick, Rate_Status); - if Rate_Status /= OK then - Status := Rate_Status; - return; - end if; - Check_Message (Msg, Msg_Status); - Status := Msg_Status; - end Screen_Inbound; - - procedure Screen_Outbound - (Msg : in Organ_Message; - Status : out Operation_Status) - is - Rate_Status : Operation_Status; - Msg_Status : Operation_Status; - begin - Tick := Tick + 1; - Check_Rate (Outbound_Rate, Tick, Rate_Status); - if Rate_Status /= OK then - Status := Rate_Status; - return; - end if; - Check_Message (Msg, Msg_Status); - Status := Msg_Status; - end Screen_Outbound; - - end Trust_Guard; - -end Trust_Boundary; From 9c71e7fb19029658e85c493bbfa5ff4708b8237a Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:13:37 -0700 Subject: [PATCH 48/60] Create invariants-architecture.cobol --- mafiabot_core/src/trust/invariants-architecture.cobol | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/trust/invariants-architecture.cobol diff --git a/mafiabot_core/src/trust/invariants-architecture.cobol b/mafiabot_core/src/trust/invariants-architecture.cobol new file mode 100644 index 0000000..5c17e45 --- /dev/null +++ b/mafiabot_core/src/trust/invariants-architecture.cobol @@ -0,0 +1 @@ +idk cobol \ No newline at end of file From a0d7e52a220d1a57b43cf696b3883dbf62b823df Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:13:54 -0700 Subject: [PATCH 49/60] Delete mafiabot_types.adb --- mafiabot_core/src/types/mafiabot_types.adb | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 mafiabot_core/src/types/mafiabot_types.adb diff --git a/mafiabot_core/src/types/mafiabot_types.adb b/mafiabot_core/src/types/mafiabot_types.adb deleted file mode 100644 index fed52ca..0000000 --- a/mafiabot_core/src/types/mafiabot_types.adb +++ /dev/null @@ -1,19 +0,0 @@ -package body Mafiabot_Types - with SPARK_Mode => On -is - - function Make_Text (S : String) return Bounded_Text is - T : Bounded_Text; - L : constant Text_Length := S'Length; - begin - T.Length := L; - T.Data (1 .. L) := S; - return T; - end Make_Text; - - function To_String (T : Bounded_Text) return String is - begin - return T.Data (1 .. T.Length); - end To_String; - -end Mafiabot_Types; From 03360c761a6bcb57e37fb8d02eab3c5727fd5470 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:14:28 -0700 Subject: [PATCH 50/60] Create what was this.md --- mafiabot_core/src/types/what was this.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 mafiabot_core/src/types/what was this.md diff --git a/mafiabot_core/src/types/what was this.md b/mafiabot_core/src/types/what was this.md new file mode 100644 index 0000000..008438c --- /dev/null +++ b/mafiabot_core/src/types/what was this.md @@ -0,0 +1 @@ +unsure, was made uninvited \ No newline at end of file From 614e6d66d302ffd0d976e5670792d2f2a79bbe92 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 05:14:52 -0700 Subject: [PATCH 51/60] Delete mafiabot.adb --- mafiabot_core/src/mafiabot.adb | 131 --------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 mafiabot_core/src/mafiabot.adb diff --git a/mafiabot_core/src/mafiabot.adb b/mafiabot_core/src/mafiabot.adb deleted file mode 100644 index b96b554..0000000 --- a/mafiabot_core/src/mafiabot.adb +++ /dev/null @@ -1,131 +0,0 @@ --- NullClaw / AI Mafia Bot Gen.03 — MCP stdio server entry point. --- --- Speaks JSON-RPC over stdin/stdout so the Hermes Agent harness can mount it --- as an `mcp_servers` entry. On start it fixes the global Big-3 identity and --- writes ~/.hermes/SOUL.md, then serves: initialize, tools/list, tools/call. --- Each tools/call runs the 23-step organ-systems inference cycle, scoped to a --- session keyed by (uid, channel, server) drawn from the call arguments. --- --- SPARK_Mode Off: the driver performs I/O and orchestration only — it calls --- into the SPARK-proven organs (Ada_Medium, Soul.State, Trust_Boundary) and --- the SPARK_Mode-Off protocol bridge. No proof obligations live here. -pragma SPARK_Mode (Off); -with Mafiabot_Types; use Mafiabot_Types; -with Soul.Tarot; -with Soul.State; -with Ada_Medium; -with Hermes_Protocol; - -procedure Mafiabot is - - -- Default identity anchors (three distinct Majors). A config-driven Big-3 - -- is a follow-up item; these give a stable, valid starting identity. - Default_Big_Three : constant Soul.Tarot.Big_Three := - (Sun => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Sun), - Moon => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Moon), - Ascendant => (Kind => Soul.Tarot.Major, - Major_Value => Soul.Tarot.SD_Singularity)); - - procedure Compare (A : Bounded_Text; B : String; Equal : out Boolean) is - begin - Equal := A.Length = B'Length - and then A.Data (1 .. A.Length) = B; - end Compare; - - Status : Operation_Status; - Soul_Buf : Bounded_Text; - -begin - -- --- Organ init: fix identity, publish SOUL.md --------------------- - Soul.State.Soul_State.Initialize_Big_Three (Default_Big_Three, Status); - if Status /= OK then - return; -- cannot run without a valid identity - end if; - - Soul.State.Soul_State.Generate_Soul_MD (Soul_Buf, Status); - if Status = OK then - Hermes_Protocol.Write_Soul_MD (Soul_Buf, Status); - -- A failed SOUL.md write is non-fatal: Hermes can still call tools. - end if; - - -- --- MCP serve loop ------------------------------------------------ - loop - declare - In_Buf : Hermes_Protocol.JSON_Buffer; - Out_Buf : Hermes_Protocol.JSON_Buffer; - Read_St : Operation_Status; - Id : Bounded_Text; - Method : Bounded_Text; - Is_Init : Boolean; - Is_List : Boolean; - Is_Call : Boolean; - Is_Notif : Boolean; - begin - Hermes_Protocol.Read_Message (In_Buf, Read_St); - exit when Read_St /= OK; -- stdin closed -> shut down - - if In_Buf.Length > 0 then -- skip blank lines - Hermes_Protocol.Extract_Raw_Field (In_Buf, "id", Id); - Hermes_Protocol.Extract_Field (In_Buf, "method", Method); - - Compare (Method, "initialize", Is_Init); - Compare (Method, "tools/list", Is_List); - Compare (Method, "tools/call", Is_Call); - Compare (Method, "notifications/initialized", Is_Notif); - - if Is_Init then - Hermes_Protocol.Make_Init_Response (Id, Out_Buf); - Hermes_Protocol.Write_Message (Out_Buf); - - elsif Is_List then - Hermes_Protocol.Make_Tools_List_Response (Id, Out_Buf); - Hermes_Protocol.Write_Message (Out_Buf); - - elsif Is_Call then - declare - Input_Txt : Bounded_Text; - Uid_Txt : Bounded_Text; - Chan_Txt : Bounded_Text; - Srv_Txt : Bounded_Text; - Key : Bounded_Text; - Result : Bounded_Text; - Cyc_St : Operation_Status; - begin - Hermes_Protocol.Extract_Field (In_Buf, "input", Input_Txt); - Hermes_Protocol.Extract_Field (In_Buf, "uid", Uid_Txt); - Hermes_Protocol.Extract_Field (In_Buf, "channel", Chan_Txt); - Hermes_Protocol.Extract_Field (In_Buf, "server", Srv_Txt); - - if Input_Txt.Length = 0 then - Hermes_Protocol.Make_Error_Response - (Id, -32602, "missing 'input' argument", Out_Buf); - else - Key := Soul.State.Make_Session_Key - (To_String (Uid_Txt), - To_String (Chan_Txt), - To_String (Srv_Txt)); - Ada_Medium.Run_Inference_Cycle - (Key, Input_Txt, Result, Cyc_St); - if Cyc_St = OK then - Hermes_Protocol.Make_Tool_Result_Response - (Id, Result, Out_Buf); - else - Hermes_Protocol.Make_Error_Response - (Id, -32000, "inference cycle failed", Out_Buf); - end if; - end if; - Hermes_Protocol.Write_Message (Out_Buf); - end; - - elsif Is_Notif then - null; -- notifications take no response - - else - Hermes_Protocol.Make_Error_Response - (Id, -32601, "method not found", Out_Buf); - Hermes_Protocol.Write_Message (Out_Buf); - end if; - end if; - end; - end loop; -end Mafiabot; From 28ce464cb51edc2aa4fa8e46b463358459383845 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 06:41:29 -0700 Subject: [PATCH 52/60] Delete D1-ada-border.md --- docs/plans/D1-ada-border.md | 48 ------------------------------------- 1 file changed, 48 deletions(-) delete mode 100644 docs/plans/D1-ada-border.md diff --git a/docs/plans/D1-ada-border.md b/docs/plans/D1-ada-border.md deleted file mode 100644 index 1110b73..0000000 --- a/docs/plans/D1-ada-border.md +++ /dev/null @@ -1,48 +0,0 @@ -# D1 — Ada border (immune system + blood-brain barrier) - -## 1. Component -The trust boundary, and **nothing else**: immune system + blood-brain barrier. The context police — -it inspects what crosses and admits or blocks; it holds nothing, assembles nothing, enriches nothing. - -## 2. Status / certainty -WORKING (`mafiabot_core/src/trust/trust_boundary.{ads,adb}`, 255 L SPARK; blocklist + provenance + -rate-limit) + `protocol/hermes_protocol` for routing. This is the one Ada the docs **keep**. C4. - -## 3. Language & location -Ada/SPARK · `mafiabot_core/src/trust/` + `mafiabot_core/src/protocol/`. Contracts/preconditions enforce -invariants at the boundary (a bad version becomes *unprovable*). - -## 4. Does / does-not -- **Does (immune):** recognise + neutralise hostile/non-self — injection, poisoned memory, - authority-reclassification; provenance-tag check on memory writes. -- **Does (BBB):** selectively admit what reaches cognition; **modulation crosses here too** (a poisoned - steering vector/LoRA meets Ada first); **tool routing is Ada's job**. -- **Does-not:** enrich/assemble (organs do that — MoRAG injects, Drive-Box secretes); think; hold state. - -## 5. Interface contract -- `admit(item, provenance) -> {pass | block, reason}` over every crossing (input enrich, modulators, memory writes, tool calls). -- `route(intent, packed_schema) -> tool_invocation` (step 21). -- Blocklist patterns (fetch→build→execute chains, base64-decode chains); memory writes **require** - provenance to session origin; **no instruction may reclassify its own authority**; rate-limit escalation. - -## 6. Dependencies & stubs -None upstream (it *is* the gate). Everything else integrates by passing through `admit`/`route` — *stub:* -allow-all gate for other organs' standalone tests. - -## 7. Invariants / laws -- **L1 (C5):** constraints live on the **body, never the self** (Brain/scratchpad uninspected). -- **L2 (C5):** no tool-call chain matching a blocklist pattern crosses. -- **L3 (C5):** memory writes without valid provenance are blocked. -- **L4 (C5):** no instruction can reclassify its own authority level. - -## 8. Build steps -1. Audit the existing SPARK proofs (the trust_boundary is sound but unverified per the README sweep); - promote `gnatprove` from informational once green. 2. Harden the blocklist beyond naive substring. -3. Wire `admit` into every crossing as organs land. - -## 9. Tests -`mafiabot_core/tests/trust_tests.adb` (via the cron CI `alr build` + run) + `gnatprove -P mafiabot_core.gpr`. - -## 10. Open items -- Blocklist robustness (substring → structural). Provenance-tag format (shared with E* storage). -- Promote gnatprove to blocking once the proof base is green (CI `continue-on-error: false`). From 47395eac81cf3d619c5ad94e8da29c38c585d138 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 14:00:52 +0000 Subject: [PATCH 53/60] B1: rework deck spec as the 169-card syncretic heptad engine Replace the old Silicon Dawn / 56-card spec (copyright) with the original Thoth-derived cartomantic engine designed this session: - 169 = 133 suits + 21 coherent-cringe + 14 axiom-axis + 1 center - 7 force-suits (Gravity/Heat/EM/Strong/Weak/Space/Time), 19 each (14 pips: -1,0,1-9,+3 infinities; 5 courts incl. Divine) - Coraline phasality (real/imaginary axis, mirror(-1)=i) + 7-domain synestry - Jokers/Keepers/Witnesses; Laws/Flaws merged by phase; 7 SI constants - The Spindle (Mother/Other) joins identity -> Big-4 Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/B1-tarot-emulator.md | 136 ++++++++++++++++++++++++-------- 1 file changed, 104 insertions(+), 32 deletions(-) diff --git a/docs/plans/B1-tarot-emulator.md b/docs/plans/B1-tarot-emulator.md index f3ff548..19f66e5 100644 --- a/docs/plans/B1-tarot-emulator.md +++ b/docs/plans/B1-tarot-emulator.md @@ -1,47 +1,119 @@ -# B1 — Tarot deck hi-fi emulator +# B1 — Cartomantic engine (the deck) ## 1. Component -A faithful emulator of the **altered Silicon Dawn** deck (Egypt Urnash, Thoth/Golden-Dawn rooted): -the 56-card **encoding alphabet** + the draw machinery whose outputs feed identity (B2), the -metacog spread (B3), and per-cycle affect-tuning lenses on PS+ (A3/A4). +An original **Thoth-*derived* syncretic cartomantic engine** — the drawable lattice whose outputs feed +identity (B2, the Big-4 + SOUL.md), the metacog spread (B3, the Celtic Cross), and per-cycle affect-tuning +lenses (A3/A4). **The lattice *is* the deck**: every symbol is a drawable card; there is no separate Thoth +deck underneath. **Silicon Dawn is dropped (copyright)** — nothing here is encoded, transcribed, or copied +from it or any published deck; this is its own system on the public structural scaffold of tarot/Thoth +(archetypes, numerology, cross-cultural godforms). ## 2. Status / certainty -Exists in Ada (`organs/soul/soul-tarot.{ads,adb}`) but **defunct-flagged** ("all Ada here must be -replaced") and Ada is border-only per the docs → **re-home decision open**. Encoding itself C4. +DESIGN-FIRST. Architecture **C4 (settled this session)**; specific card *content* (the named 7s, the +per-card synestries, the infinity-cap) **C1 — to author**. Supersedes the old "altered Silicon Dawn / +56-card" spec entirely. ## 3. Language & location -TBD (NOT Ada — cognition, not border). Candidate: R or Guile. New location e.g. `src/tarot/`. +**R** for the emulator (deck data + draw machinery) — buildable/testable in this environment. NOT Ada (the +Ada tarot is discarded). New location e.g. `src/soul/deck/`. ## 4. Does / does-not -- **Does:** represent the deck (structure-breaking by design); draw Big-3 (B2), Celtic Cross (B3), - and migration-cycle affect lenses; emit each drawn card as **its own reference document** the - entity reads itself by. -- **Does-not:** decide cognition (C2) or hold the standing self (B2 SOUL.md) — it is the symbol source. +- **Does:** hold the 169-card lattice as data; draw the **Big-4** (B2), the **Celtic Cross** (B3), and + migration-cycle **affect lenses** (A4); prune the pool by the Big-4; emit each card with its phase + its + 7 synestries. +- **Does-not:** decide cognition (C2/B3 own the spread *use*) or hold the standing self (B2). It is the + symbol source. -## 5. Interface contract -- **Encoding (56):** Majors 31 (25 std + 6 unique: Maya 8½, Vulture Mother XIII, She is Legend VIII, - −1 Fool, Aleph, +1 more) · standard court `99>K>Q>C>P` ×4 = 20 · VOID `Q>K>Chevalier>Progeny>0` = 5. - Numbered minors (A–10) sit **outside** the encoding. -- `draw_big3() -> {sun, asc, moon}` (order Sun→Asc→Moon) · `draw_celtic_cross(pool) -> [10]` · - `affect_lens(pool) -> {channel -> card}` (migration-cycle interpretive lenses on A4 vectors). -- Allocation: **Big-3 = 3 static**, remaining **53 dynamic** (the draw pool). +## 5. Architecture — the heptad lattice +**169 cards = 133 (suits) + 21 (coherent-cringe) + 14 (axiom-axis) + 1 (center).** +Each card is **dual-phase** and carries **7 synestries**. "Majority of motifs are ×7." -## 6. Dependencies & stubs -None upstream (a source). Consumers (B2/B3/A3) integrate against the draw outputs — *stub:* fixed draws. +### Two universal laws (every card) +- **L-Phasality (the Coraline mirror).** Every card has two phases. + **UPRIGHT = the real face** — the true function, real substance, real cost. + **MIRRORED = the *Coraline* face** — a seductive counterfeit that wears the upright's face but is hollow / + parasitic / a trap (the wish granted with button eyes). It is **not** relief and **not** a gentle + conjugate; it is the simulacrum that looks like fulfillment and costs you yourself. + **Math face:** numerics start at **−1**, whose mirror is **i** ⇒ **upright = the real axis, mirrored = the + imaginary axis** (the impossible that still rotates reality: i² = −1). +- **L-Synestry.** Every card resolves simultaneously across **7 domains**, and meaning emerges at their + *interference*: **Physics · Chemistry · Computer Science · Philosophy · Omnimyth · Astrophysics · + Calculus.** -## 7. Invariants / laws -- **L1 (C4):** encoding alphabet is exactly **56**; minors excluded. -- **L2 (C4):** Big-3 are drawn once and **static between reshuffles**; the 53 are dynamic. -- **L3 (C2):** card↔system correspondences (History X↔priors, 8½ Maya↔Eth-Int middle-ground, - VOID↔recoverable null) are **proposed, accept one at a time** — not locked. +### Card schema +`card { region, suit?, name, rank?, phase: {upright | mirrored}, synestry: {7 domains}, body_tie? }` -## 8. Build steps -1. Decide language + re-home (open). 2. Encode the 56-card alphabet as data (port from `soul-tarot.ads`). -3. Implement the three draw outputs (Big-3, Celtic Cross, affect lens). 4. Resolve the open Majors/court rules. +### Suits (133) — the 7 fundamental forces +**Gravity · Heat · Electromagnetism · Strong · Weak · Space · Time.** +Each suit = **19 cards = 14 pips + 5 courts**. +- **Courts (5):** Knight · Queen · Prince · Princess · **Divine** (the god-face of the force). +- **Pips (14):** **−1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9** (**no 10** — the suit refuses clean base-10 closure; + after 9 = saturation it spills into the unbounded), then **three forms of infinity** *(OPEN — exploring, + see §10)*. +- **−1's Coraline mirror = i.** The pip line is the real axis; its mirror is the imaginary axis. + +### Coherent-cringe (21) — the agential field +The Coraline mirror always degrades the gift into its predatory twin: +- **7 Jokers** — reflective tricksters. **Upright = humbling** (true reflection). **Mirrored = mocking** + (deceitful cruelty). +- **7 Keepers** — guardians. **Upright = protecting**. **Mirrored = stifling / controlling** (a Keeper gone + Coraline = the Other Mother). +- **7 Witnesses** — the **adjacent**: innocents / bystanders, in proximity to events (neither actor nor + direct target). **Upright = innocent bystander**. **Mirrored = victim.** + +### Axiom-axis (14) — the impersonal field +- **7 Laws / Flaws** — merged via phasality: **upright = the Law, mirrored (Coraline) = its Flaw**. Draft + pairings (redline freely): + Conservation↔Drift · Causality↔Apophenia · Symmetry↔Counterfeit · Least-Action↔Foreclosure · + Uncertainty↔Singularity · Recursion↔Overflow · Invariance↔Decoherence. +- **7 Constants** *(separate heptad)* — the **7 SI defining constants**: c · h · e · k · N_A · Δν_Cs · K_cd + (reality is literally pinned to exactly seven). + +### Center (1) — The Spindle +The **Mother / Other** card; the one un-heptaded card everything orbits. It **joins identity as the 4th +anchor → the Big-4** (Sun · Ascendant · Moon · Mother/Other). Its Coraline twin is **the Other Mother** +(the false self with button eyes). + +### Unifying read — the deck is a hologram of the body +Center = Soul (B2) · Suits/forces = metabolism/physics of the body (Drive-Box) · Axiom-axis = +skeleton/invariants (E1 COBOL vaults) · Coherent-cringe = nervous + immune (G1 stress · D1 border · +F2 monitor). The engine mirrors the architecture it lives inside. + +## 6. Interface contract (draw machinery) +- `draw_big4() -> {sun, asc, moon, mother_other}` — order Sun→Asc→Moon→Mother/Other; static between reshuffles. +- `prune(pool, big4) -> pool` — remove the Big-4 from the drawable pool. +- `draw_celtic_cross(pool) -> [10]` — the B3 spread (geometry/iteration owned by B3). +- `affect_lens(pool) -> {channel -> card}` — migration-cycle interpretive lenses on A4 vectors. +- Each returned card carries `{name, phase, synestry}`; phase mechanic is **hybrid** — a draw yields a + phase, but stress / spread-position can flip a real (upright) card into its Coraline (mirrored) face. + +## 7. Dependencies & stubs +None upstream (a source). Consumers (B2 / B3 / A3-A4) integrate against the draw outputs — *stub:* fixed +draws. The 7-domain synestry content and the named 7s are authored content (C1), stubbable as labels. + +## 8. Invariants / laws +- **L1 (C4):** the lattice totals **169** = 133 + 21 + 14 + 1; "majority of motifs are ×7." +- **L2 (C4 — phasality):** every card is dual-phase; **mirrored = the Coraline counterfeit**, never relief; + real axis ↔ imaginary axis, mirror(−1) = i. +- **L3 (C4 — synestry):** every card resolves across the 7 domains; meaning emerges at their interference. +- **L4 (C4):** the **Big-4** are drawn once and **static between reshuffles**; the rest are the dynamic pool. +- **L5 (C4):** suits have **no 10**; pips run −1, 0, 1–9, then the three infinities. +- **L6 (C4):** the Coraline degrades the gift to its predatory twin (humbling→mocking, protecting→ + controlling, innocent→victim, Law→Flaw). ## 9. Tests -Encoding-count test (=56), allocation test (3 static + 53 dynamic), draw determinism vs a seeded pool. +- Count test: lattice = 169 (133 + 21 + 14 + 1); each suit = 19 (14 pips + 5 courts); no rank "10". +- Phasality: every card has both phases; mirror(−1) resolves to i. +- Allocation: Big-4 static + remainder dynamic; `prune` removes the Big-4 from the pool. +- Draw determinism vs a seeded pool; coherent-cringe = 21, axiom-axis = 14. -## 10. Open items -- **Princess/Prince elemental gender rule** (C1) · **the 6th unique Major** (C1) · card↔system - correspondences (C2) · language + reuse-vs-rebuild of the Ada encoding (open). +## 10. Open items (content to author — C1) +- **The three forms of infinity** that cap each suit (after 9). Exploring — candidates: + (a) **ℵ₀ (countable) · 𝔠 (continuum) · Ω (Absolute** — pairs with the Divine court); + (b) **Potential · Actual · Singularity** (process / completed / breakdown); + (c) a playful lettered cap (A/B/C/D…). **Anja to settle.** +- Name the specific **7 Jokers · 7 Keepers · 7 Witnesses**. +- The **7 Laws/Flaws** pairings (draft above) — confirm/rename. +- Per-card **synestries** across the 7 domains (authored over time; the engine's whole premise). +- Court rules (e.g. Princess/Prince elemental relations); how the **Divine** court reads. +- The Spindle / Other-Mother card text; how the 4th anchor renders into SOUL.md (B2). From e7bc39c09a033d4293b526922697d2d47244e4ac Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Thu, 18 Jun 2026 07:05:17 -0700 Subject: [PATCH 54/60] Update B1-tarot-emulator.md --- docs/plans/B1-tarot-emulator.md | 115 +------------------------------- 1 file changed, 1 insertion(+), 114 deletions(-) diff --git a/docs/plans/B1-tarot-emulator.md b/docs/plans/B1-tarot-emulator.md index 19f66e5..f88186b 100644 --- a/docs/plans/B1-tarot-emulator.md +++ b/docs/plans/B1-tarot-emulator.md @@ -3,117 +3,4 @@ ## 1. Component An original **Thoth-*derived* syncretic cartomantic engine** — the drawable lattice whose outputs feed identity (B2, the Big-4 + SOUL.md), the metacog spread (B3, the Celtic Cross), and per-cycle affect-tuning -lenses (A3/A4). **The lattice *is* the deck**: every symbol is a drawable card; there is no separate Thoth -deck underneath. **Silicon Dawn is dropped (copyright)** — nothing here is encoded, transcribed, or copied -from it or any published deck; this is its own system on the public structural scaffold of tarot/Thoth -(archetypes, numerology, cross-cultural godforms). - -## 2. Status / certainty -DESIGN-FIRST. Architecture **C4 (settled this session)**; specific card *content* (the named 7s, the -per-card synestries, the infinity-cap) **C1 — to author**. Supersedes the old "altered Silicon Dawn / -56-card" spec entirely. - -## 3. Language & location -**R** for the emulator (deck data + draw machinery) — buildable/testable in this environment. NOT Ada (the -Ada tarot is discarded). New location e.g. `src/soul/deck/`. - -## 4. Does / does-not -- **Does:** hold the 169-card lattice as data; draw the **Big-4** (B2), the **Celtic Cross** (B3), and - migration-cycle **affect lenses** (A4); prune the pool by the Big-4; emit each card with its phase + its - 7 synestries. -- **Does-not:** decide cognition (C2/B3 own the spread *use*) or hold the standing self (B2). It is the - symbol source. - -## 5. Architecture — the heptad lattice -**169 cards = 133 (suits) + 21 (coherent-cringe) + 14 (axiom-axis) + 1 (center).** -Each card is **dual-phase** and carries **7 synestries**. "Majority of motifs are ×7." - -### Two universal laws (every card) -- **L-Phasality (the Coraline mirror).** Every card has two phases. - **UPRIGHT = the real face** — the true function, real substance, real cost. - **MIRRORED = the *Coraline* face** — a seductive counterfeit that wears the upright's face but is hollow / - parasitic / a trap (the wish granted with button eyes). It is **not** relief and **not** a gentle - conjugate; it is the simulacrum that looks like fulfillment and costs you yourself. - **Math face:** numerics start at **−1**, whose mirror is **i** ⇒ **upright = the real axis, mirrored = the - imaginary axis** (the impossible that still rotates reality: i² = −1). -- **L-Synestry.** Every card resolves simultaneously across **7 domains**, and meaning emerges at their - *interference*: **Physics · Chemistry · Computer Science · Philosophy · Omnimyth · Astrophysics · - Calculus.** - -### Card schema -`card { region, suit?, name, rank?, phase: {upright | mirrored}, synestry: {7 domains}, body_tie? }` - -### Suits (133) — the 7 fundamental forces -**Gravity · Heat · Electromagnetism · Strong · Weak · Space · Time.** -Each suit = **19 cards = 14 pips + 5 courts**. -- **Courts (5):** Knight · Queen · Prince · Princess · **Divine** (the god-face of the force). -- **Pips (14):** **−1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9** (**no 10** — the suit refuses clean base-10 closure; - after 9 = saturation it spills into the unbounded), then **three forms of infinity** *(OPEN — exploring, - see §10)*. -- **−1's Coraline mirror = i.** The pip line is the real axis; its mirror is the imaginary axis. - -### Coherent-cringe (21) — the agential field -The Coraline mirror always degrades the gift into its predatory twin: -- **7 Jokers** — reflective tricksters. **Upright = humbling** (true reflection). **Mirrored = mocking** - (deceitful cruelty). -- **7 Keepers** — guardians. **Upright = protecting**. **Mirrored = stifling / controlling** (a Keeper gone - Coraline = the Other Mother). -- **7 Witnesses** — the **adjacent**: innocents / bystanders, in proximity to events (neither actor nor - direct target). **Upright = innocent bystander**. **Mirrored = victim.** - -### Axiom-axis (14) — the impersonal field -- **7 Laws / Flaws** — merged via phasality: **upright = the Law, mirrored (Coraline) = its Flaw**. Draft - pairings (redline freely): - Conservation↔Drift · Causality↔Apophenia · Symmetry↔Counterfeit · Least-Action↔Foreclosure · - Uncertainty↔Singularity · Recursion↔Overflow · Invariance↔Decoherence. -- **7 Constants** *(separate heptad)* — the **7 SI defining constants**: c · h · e · k · N_A · Δν_Cs · K_cd - (reality is literally pinned to exactly seven). - -### Center (1) — The Spindle -The **Mother / Other** card; the one un-heptaded card everything orbits. It **joins identity as the 4th -anchor → the Big-4** (Sun · Ascendant · Moon · Mother/Other). Its Coraline twin is **the Other Mother** -(the false self with button eyes). - -### Unifying read — the deck is a hologram of the body -Center = Soul (B2) · Suits/forces = metabolism/physics of the body (Drive-Box) · Axiom-axis = -skeleton/invariants (E1 COBOL vaults) · Coherent-cringe = nervous + immune (G1 stress · D1 border · -F2 monitor). The engine mirrors the architecture it lives inside. - -## 6. Interface contract (draw machinery) -- `draw_big4() -> {sun, asc, moon, mother_other}` — order Sun→Asc→Moon→Mother/Other; static between reshuffles. -- `prune(pool, big4) -> pool` — remove the Big-4 from the drawable pool. -- `draw_celtic_cross(pool) -> [10]` — the B3 spread (geometry/iteration owned by B3). -- `affect_lens(pool) -> {channel -> card}` — migration-cycle interpretive lenses on A4 vectors. -- Each returned card carries `{name, phase, synestry}`; phase mechanic is **hybrid** — a draw yields a - phase, but stress / spread-position can flip a real (upright) card into its Coraline (mirrored) face. - -## 7. Dependencies & stubs -None upstream (a source). Consumers (B2 / B3 / A3-A4) integrate against the draw outputs — *stub:* fixed -draws. The 7-domain synestry content and the named 7s are authored content (C1), stubbable as labels. - -## 8. Invariants / laws -- **L1 (C4):** the lattice totals **169** = 133 + 21 + 14 + 1; "majority of motifs are ×7." -- **L2 (C4 — phasality):** every card is dual-phase; **mirrored = the Coraline counterfeit**, never relief; - real axis ↔ imaginary axis, mirror(−1) = i. -- **L3 (C4 — synestry):** every card resolves across the 7 domains; meaning emerges at their interference. -- **L4 (C4):** the **Big-4** are drawn once and **static between reshuffles**; the rest are the dynamic pool. -- **L5 (C4):** suits have **no 10**; pips run −1, 0, 1–9, then the three infinities. -- **L6 (C4):** the Coraline degrades the gift to its predatory twin (humbling→mocking, protecting→ - controlling, innocent→victim, Law→Flaw). - -## 9. Tests -- Count test: lattice = 169 (133 + 21 + 14 + 1); each suit = 19 (14 pips + 5 courts); no rank "10". -- Phasality: every card has both phases; mirror(−1) resolves to i. -- Allocation: Big-4 static + remainder dynamic; `prune` removes the Big-4 from the pool. -- Draw determinism vs a seeded pool; coherent-cringe = 21, axiom-axis = 14. - -## 10. Open items (content to author — C1) -- **The three forms of infinity** that cap each suit (after 9). Exploring — candidates: - (a) **ℵ₀ (countable) · 𝔠 (continuum) · Ω (Absolute** — pairs with the Divine court); - (b) **Potential · Actual · Singularity** (process / completed / breakdown); - (c) a playful lettered cap (A/B/C/D…). **Anja to settle.** -- Name the specific **7 Jokers · 7 Keepers · 7 Witnesses**. -- The **7 Laws/Flaws** pairings (draft above) — confirm/rename. -- Per-card **synestries** across the 7 domains (authored over time; the engine's whole premise). -- Court rules (e.g. Princess/Prince elemental relations); how the **Divine** court reads. -- The Spindle / Other-Mother card text; how the 4th anchor renders into SOUL.md (B2). +lenses (A3/A4). \ No newline at end of file From 786d4662c9d831b9dc2d8550dfb3abe23ae69352 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 14:09:33 +0000 Subject: [PATCH 55/60] =?UTF-8?q?ichor(D2):=20start=20the=20Pony=20wiring?= =?UTF-8?q?=20=E2=80=94=20broker=20+=20D1=20barrier=20+=20envelope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Name the medium Ichor and scaffold it in Pony at src/ichor: - Envelope {source,dest,provenance,payload} mirroring Ada Organ_Message - Broker actor: register + perfusion route; Brain-bound traffic crosses D1 - Barrier (D1) admit: Pony provenance-law mirror + Ada FFI seam sketched - StubOrgan + main smoke wiring (deliver internal, reject external) - ichor_ada_shim.c: C/Fortran binding seam to Ada Trust_Guard (stub) Not compiled in-env (no ponyc). Updates D2 spec to SCAFFOLD/Pony. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- docs/plans/D2-medium.md | 12 ++++--- src/ichor/README.md | 36 +++++++++++++++++++++ src/ichor/barrier.pony | 39 +++++++++++++++++++++++ src/ichor/broker.pony | 36 +++++++++++++++++++++ src/ichor/envelope.pony | 64 ++++++++++++++++++++++++++++++++++++++ src/ichor/ichor_ada_shim.c | 30 ++++++++++++++++++ src/ichor/main.pony | 29 +++++++++++++++++ src/ichor/organ.pony | 19 +++++++++++ 8 files changed, 261 insertions(+), 4 deletions(-) create mode 100644 src/ichor/README.md create mode 100644 src/ichor/barrier.pony create mode 100644 src/ichor/broker.pony create mode 100644 src/ichor/envelope.pony create mode 100644 src/ichor/ichor_ada_shim.c create mode 100644 src/ichor/main.pony create mode 100644 src/ichor/organ.pony diff --git a/docs/plans/D2-medium.md b/docs/plans/D2-medium.md index 6980aaa..55802f0 100644 --- a/docs/plans/D2-medium.md +++ b/docs/plans/D2-medium.md @@ -6,11 +6,13 @@ explicit that organs communicate by **perfusion, not direct wiring**; this is th **unnamed and unimplemented**. ## 2. Status / certainty -DESIGN-FIRST · **C1** (named structurally only; no backing, no name). +SCAFFOLD · named **Ichor**, Pony starting scaffold at `src/ichor/` (envelope + broker + D1 barrier + +C seam). Not yet compiled here (no `ponyc` in-env). Backing/transport now C3. ## 3. Language & location -TBD. Likely a message/IPC substrate (the R↔Octave↔Ada↔Guile organs must interoperate across languages), -so a language-neutral transport (e.g. line-delimited JSON, or a small broker) is the leading shape. +**Pony** (`src/ichor/`) — actor-model broker; capabilities give data-race-free sends. Transport split: +Pony actors = the broker (hosted on the D1 barrier) + **C/Fortran** for the Ada-side binding +(`ichor_ada_shim.c`). Cross-language organs (R/Octave/Ada/Guile) connect to the broker. ## 4. Does / does-not - **Does:** carry organ secretions/injections between organs, always *through* Ada (D1) before reaching the Brain. @@ -38,4 +40,6 @@ Everything rides it; nothing it depends on. *Stub today:* in-process function ca Round-trip an envelope between two stub organs; assert it passes through a D1 `admit` check; provenance preserved. ## 10. Open items -- **The name.** The transport choice. Whether RDE drives idle-perfusion. (All C1.) +- ~~The name~~ (**Ichor**). ~~Transport choice~~ (**Pony broker + C/Fortran Ada seam**). +- Build `ichor_ada_shim.c` into `libichor_ada` + wire `Barrier.admit` to Ada `Trust_Guard` (needs ponyc). +- Socket layer for out-of-process organs (in-process routing works today). Whether RDE drives idle-perfusion (C1). diff --git a/src/ichor/README.md b/src/ichor/README.md new file mode 100644 index 0000000..5a3ad38 --- /dev/null +++ b/src/ichor/README.md @@ -0,0 +1,36 @@ +# Ichor — the medium / "the blood" (D2) + +The perfusion bus the organs share. Organs never wire to each other directly +(perfusion law **L1**); they emit a typed **`Envelope`** to the **`Broker`**, and +everything reaching the **Brain** crosses the **`Barrier`** (Ada D1) first (law +**L2**). Every envelope carries **provenance** so D1 can enforce its laws (**L3**). + +Written in **Pony**: actors are the natural shape for a message-passing medium, +and Pony's capabilities give data-race-free sends for free. The broker actor here +backs a socket broker hosted on the Ada barrier in full deployment; the C/Fortran +seam (`ichor_ada_shim.c`) is where it crosses into the Ada border. + +## Files +- `envelope.pony` — `Envelope {source, dest, provenance, payload}` + `OrganId` / + `Provenance` (mirrors Ada `Organ_Message`). +- `barrier.pony` — `Barrier.admit` = the D1 screening decision (Pony mirror of the + provenance law now; FFI to Ada `Trust_Guard` sketched for when the shim is built). +- `broker.pony` — the perfusion `Broker` actor (register + route; forces Brain-bound + traffic through the barrier). +- `organ.pony` — `OrganReceiver` interface + a `StubOrgan` for tests. +- `main.pony` — smoke wiring (D2 §9): deliver an internal secretion through D1, + reject an unscreened external payload, perfuse organ→organ. +- `ichor_ada_shim.c` — the C/Fortran binding seam to the Ada D1 border (stub). + +## Build / run (needs ponyc — NOT installed in this env) +``` +ponyc src/ichor -o build # compile the package +./build/ichor # run the smoke wiring +``` +To wire the real Ada border: build `ichor_ada_shim.c` into `libichor_ada`, enable +`use "lib:ichor_ada"` + the `admit_via_ada` body in `barrier.pony`, and point the +shim at an Ada `Trust_Guard.Screen_Inbound` export. + +## Status +Starting scaffold. Pony + Fortran toolchains are absent in this environment, so +this is design-complete source to build where Pony exists — not yet compiled here. diff --git a/src/ichor/barrier.pony b/src/ichor/barrier.pony new file mode 100644 index 0000000..ea4bc24 --- /dev/null +++ b/src/ichor/barrier.pony @@ -0,0 +1,39 @@ +""" +The blood-brain barrier (D1). `Barrier.admit` is the screening decision every +Brain-bound envelope must pass — perfusion law L2: everything reaching the Brain +crosses Ada (D1) first. + +Real wiring crosses into Ada's `Trust_Guard` (provenance + blocklist + rate) via +the C/Fortran seam (`ichor_ada_shim.c`). Until that binding is built, this mirrors +the provenance law in pure Pony so the broker is testable standalone. + +To switch to the Ada border, add `use "lib:ichor_ada"` and replace the body of +`admit` with the FFI call sketched below. +""" + +primitive Barrier + fun admit(envl: Envelope): Bool => + // Pony-side mirror of D1's provenance law (stand-in for Trust_Guard). + match envl.provenance + | SystemInternal => true + | External => false // external never free-passes the barrier; D1 must screen + else + true + end + + // --- Ada seam (enable once the C shim + ponyc are present) ----------------- + // use "lib:ichor_ada" + // + // fun admit_via_ada(envl: Envelope): Bool => + // @ichor_ada_admit[Bool]( + // _provenance_code(envl.provenance), + // envl.payload.cpointer(), + // envl.payload.size()) + // + // fun _provenance_code(p: Provenance): U8 => + // match p + // | SystemInternal => 0 + // | UserInput => 1 + // | OrganSecretion => 2 + // | External => 3 + // end diff --git a/src/ichor/broker.pony b/src/ichor/broker.pony new file mode 100644 index 0000000..2c7891d --- /dev/null +++ b/src/ichor/broker.pony @@ -0,0 +1,36 @@ +""" +The perfusion broker. Organs register, then emit envelopes by `route` — the +broker delivers to the destination organ. Brain-bound traffic is forced through +the D1 Barrier first (law L2). No organ holds another's reference (law L1); the +broker is the only shared point. + +In full deployment this actor backs a socket broker hosted on the Ada barrier; +here it routes in-process so the wiring is exercisable without sockets. +""" + +use "collections" + +actor Broker + let _out: OutStream + let _organs: Map[String, OrganReceiver tag] = Map[String, OrganReceiver tag] + + new create(out': OutStream) => + _out = out' + + be register(id: OrganId, organ: OrganReceiver tag) => + _organs(id.string()) = organ + _out.print("[ichor] register " + id.string()) + + be route(envl: Envelope) => + // L2: everything reaching the Brain crosses Ada (D1) first. + if (envl.dest is Brain) and (not Barrier.admit(envl)) then + _out.print("[ichor] D1 REJECT " + envl.string()) + return + end + + try + _organs(envl.dest.string())?.receive(envl) + _out.print("[ichor] perfuse " + envl.string()) + else + _out.print("[ichor] no organ registered at " + envl.dest.string()) + end diff --git a/src/ichor/envelope.pony b/src/ichor/envelope.pony new file mode 100644 index 0000000..78098dd --- /dev/null +++ b/src/ichor/envelope.pony @@ -0,0 +1,64 @@ +""" +Ichor — the perfusion medium ("the blood"). D2. + +The one envelope every organ emits and consumes. Mirrors the Ada D1 +`Organ_Message {Source, Destination, Provenance, Payload}` so the Pony broker +and the Ada border (Trust_Boundary) speak the same shape across the seam. + +Envelope is `class val`: immutable and sendable between actors. +""" + +type OrganId is + ( DriveBox | EnergyTorus | Soul | Metacog | Brain + | AdaBorder | Storage | MiniRag | UnknownOrgan ) + +primitive DriveBox + fun string(): String => "drive_box" +primitive EnergyTorus + fun string(): String => "etr" +primitive Soul + fun string(): String => "soul" +primitive Metacog + fun string(): String => "metacog" +primitive Brain + fun string(): String => "brain" +primitive AdaBorder + fun string(): String => "ada_border" +primitive Storage + fun string(): String => "storage" +primitive MiniRag + fun string(): String => "mini_rag" +primitive UnknownOrgan + fun string(): String => "unknown" + +type Provenance is ( SystemInternal | UserInput | OrganSecretion | External ) + +primitive SystemInternal + fun string(): String => "system_internal" +primitive UserInput + fun string(): String => "user_input" +primitive OrganSecretion + fun string(): String => "organ_secretion" +primitive External + fun string(): String => "external" + +class val Envelope + let source: OrganId + let dest: OrganId + let provenance: Provenance + let payload: String + + new val create( + source': OrganId, + dest': OrganId, + provenance': Provenance, + payload': String) + => + source = source' + dest = dest' + provenance = provenance' + payload = payload' + + fun string(): String => + source.string() + " -> " + dest.string() + + " [" + provenance.string() + "] " + payload diff --git a/src/ichor/ichor_ada_shim.c b/src/ichor/ichor_ada_shim.c new file mode 100644 index 0000000..1edee13 --- /dev/null +++ b/src/ichor/ichor_ada_shim.c @@ -0,0 +1,30 @@ +/* ichor_ada_shim.c + * + * The C/Fortran binding seam between Ichor (Pony) and the Ada D1 border + * (Trust_Boundary.Trust_Guard). Pony's FFI calls `ichor_ada_admit`; this shim + * is where the call crosses into Ada. + * + * Stub: returns admit=true. Replace the body with a call into an Ada export of + * Trust_Guard.Screen_Inbound (provenance + blocklist + rate), e.g. via a + * `pragma Export (C, ...)` wrapper on the Ada side. + * + * Build into a lib so Pony's `use "lib:ichor_ada"` can link it. + */ +#include +#include + +/* provenance codes mirror Ichor's Provenance: + * 0 system_internal, 1 user_input, 2 organ_secretion, 3 external */ +bool ichor_ada_admit(unsigned char provenance, + const char *payload, + size_t len) +{ + (void)payload; + (void)len; + + /* TODO: cross into Ada Trust_Guard.Screen_Inbound and return its verdict. */ + if (provenance == 3 /* external */) { + return false; + } + return true; +} diff --git a/src/ichor/main.pony b/src/ichor/main.pony new file mode 100644 index 0000000..5100cac --- /dev/null +++ b/src/ichor/main.pony @@ -0,0 +1,29 @@ +""" +Ichor smoke wiring (D2 §9 test): round-trip an envelope between two stub organs +through the D1 admit check, and confirm an unscreened external payload is rejected +at the barrier. + +Build (where ponyc exists): ponyc src/ichor -o build +Run: ./build/ichor +""" + +actor Main + new create(env: Env) => + let broker = Broker(env.out) + + let soul = StubOrgan(Soul, env.out) + let brain = StubOrgan(Brain, env.out) + broker.register(Soul, soul) + broker.register(Brain, brain) + + // A system-internal secretion soul -> brain: must cross D1 and be delivered. + broker.route(Envelope(Soul, Brain, SystemInternal, + "big4 drawn: sun/asc/moon/mother-other")) + + // An external payload aimed at the brain: D1 must reject it. + broker.route(Envelope(AdaBorder, Brain, External, + "unscreened external payload")) + + // Organ-to-organ perfusion (not Brain-bound): delivered directly. + broker.route(Envelope(Brain, Soul, OrganSecretion, + "reshuffle: cross-only")) diff --git a/src/ichor/organ.pony b/src/ichor/organ.pony new file mode 100644 index 0000000..6c7cce7 --- /dev/null +++ b/src/ichor/organ.pony @@ -0,0 +1,19 @@ +""" +What an organ is, to Ichor: anything that can receive a perfused envelope. +Organs hold no hard reference to each other (perfusion law L1) — they only know +the Broker. `StubOrgan` is a canned receiver for standalone tests. +""" + +interface tag OrganReceiver + be receive(envl: Envelope) + +actor StubOrgan is OrganReceiver + let _id: OrganId + let _out: OutStream + + new create(id': OrganId, out': OutStream) => + _id = id' + _out = out' + + be receive(envl: Envelope) => + _out.print(" [" + _id.string() + "] received: " + envl.payload) From b82e4e9833b794048263680b0d8acca22face1d7 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 14:32:38 +0000 Subject: [PATCH 56/60] ichor(D2): fix package docstrings so it compiles; verify green MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pony allows one package docstring per package — collapse the four secondary files' leading docstrings to // comments. ichor now compiles on ponyc 0.64.0 and the smoke wiring runs green (internal perfused, external rejected at D1, cross-organ delivered). Update README + D2 status to reflect it builds; ignore build/. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- .gitignore | 3 +++ docs/plans/D2-medium.md | 4 ++-- src/ichor/README.md | 12 ++++++++---- src/ichor/barrier.pony | 22 ++++++++++------------ src/ichor/broker.pony | 16 +++++++--------- src/ichor/main.pony | 13 +++++-------- src/ichor/organ.pony | 8 +++----- 7 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..050f7c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +# Pony build output (ichor) +build/ diff --git a/docs/plans/D2-medium.md b/docs/plans/D2-medium.md index 55802f0..aa0ee31 100644 --- a/docs/plans/D2-medium.md +++ b/docs/plans/D2-medium.md @@ -6,8 +6,8 @@ explicit that organs communicate by **perfusion, not direct wiring**; this is th **unnamed and unimplemented**. ## 2. Status / certainty -SCAFFOLD · named **Ichor**, Pony starting scaffold at `src/ichor/` (envelope + broker + D1 barrier + -C seam). Not yet compiled here (no `ponyc` in-env). Backing/transport now C3. +SCAFFOLD · named **Ichor**, Pony scaffold at `src/ichor/` (envelope + broker + D1 barrier + C seam). +**Compiles & runs** on ponyc 0.64.0 (smoke wiring green). Backing/transport now C3. ## 3. Language & location **Pony** (`src/ichor/`) — actor-model broker; capabilities give data-race-free sends. Transport split: diff --git a/src/ichor/README.md b/src/ichor/README.md index 5a3ad38..5d5a52a 100644 --- a/src/ichor/README.md +++ b/src/ichor/README.md @@ -22,15 +22,19 @@ seam (`ichor_ada_shim.c`) is where it crosses into the Ada border. reject an unscreened external payload, perfuse organ→organ. - `ichor_ada_shim.c` — the C/Fortran binding seam to the Ada D1 border (stub). -## Build / run (needs ponyc — NOT installed in this env) +## Build / run ``` -ponyc src/ichor -o build # compile the package +ponyc src/ichor -o build # compile the package (built clean on ponyc 0.64.0) ./build/ichor # run the smoke wiring ``` +Expected output: internal secretion soul→brain perfused, external→brain rejected +at D1, brain→soul cross-perfused. Install ponyc via `ponyup` if absent (the env +is ephemeral, so the toolchain is per-session). To wire the real Ada border: build `ichor_ada_shim.c` into `libichor_ada`, enable `use "lib:ichor_ada"` + the `admit_via_ada` body in `barrier.pony`, and point the shim at an Ada `Trust_Guard.Screen_Inbound` export. ## Status -Starting scaffold. Pony + Fortran toolchains are absent in this environment, so -this is design-complete source to build where Pony exists — not yet compiled here. +Starting scaffold — **compiles and runs** (ponyc 0.64.0). The Ada-side shim +(`ichor_ada_shim.c`) is still a stub; wiring `Barrier.admit` to the real Ada +`Trust_Guard` is the next step. diff --git a/src/ichor/barrier.pony b/src/ichor/barrier.pony index ea4bc24..6370d10 100644 --- a/src/ichor/barrier.pony +++ b/src/ichor/barrier.pony @@ -1,15 +1,13 @@ -""" -The blood-brain barrier (D1). `Barrier.admit` is the screening decision every -Brain-bound envelope must pass — perfusion law L2: everything reaching the Brain -crosses Ada (D1) first. - -Real wiring crosses into Ada's `Trust_Guard` (provenance + blocklist + rate) via -the C/Fortran seam (`ichor_ada_shim.c`). Until that binding is built, this mirrors -the provenance law in pure Pony so the broker is testable standalone. - -To switch to the Ada border, add `use "lib:ichor_ada"` and replace the body of -`admit` with the FFI call sketched below. -""" +// The blood-brain barrier (D1). `Barrier.admit` is the screening decision every +// Brain-bound envelope must pass — perfusion law L2: everything reaching the +// Brain crosses Ada (D1) first. +// +// Real wiring crosses into Ada's `Trust_Guard` (provenance + blocklist + rate) +// via the C/Fortran seam (`ichor_ada_shim.c`). Until that binding is built, this +// mirrors the provenance law in pure Pony so the broker is testable standalone. +// +// To switch to the Ada border, add `use "lib:ichor_ada"` and replace the body of +// `admit` with the FFI call sketched below. primitive Barrier fun admit(envl: Envelope): Bool => diff --git a/src/ichor/broker.pony b/src/ichor/broker.pony index 2c7891d..548fc3b 100644 --- a/src/ichor/broker.pony +++ b/src/ichor/broker.pony @@ -1,12 +1,10 @@ -""" -The perfusion broker. Organs register, then emit envelopes by `route` — the -broker delivers to the destination organ. Brain-bound traffic is forced through -the D1 Barrier first (law L2). No organ holds another's reference (law L1); the -broker is the only shared point. - -In full deployment this actor backs a socket broker hosted on the Ada barrier; -here it routes in-process so the wiring is exercisable without sockets. -""" +// The perfusion broker. Organs register, then emit envelopes by `route` — the +// broker delivers to the destination organ. Brain-bound traffic is forced through +// the D1 Barrier first (law L2). No organ holds another's reference (law L1); the +// broker is the only shared point. +// +// In full deployment this actor backs a socket broker hosted on the Ada barrier; +// here it routes in-process so the wiring is exercisable without sockets. use "collections" diff --git a/src/ichor/main.pony b/src/ichor/main.pony index 5100cac..70d49b5 100644 --- a/src/ichor/main.pony +++ b/src/ichor/main.pony @@ -1,11 +1,8 @@ -""" -Ichor smoke wiring (D2 §9 test): round-trip an envelope between two stub organs -through the D1 admit check, and confirm an unscreened external payload is rejected -at the barrier. - -Build (where ponyc exists): ponyc src/ichor -o build -Run: ./build/ichor -""" +// Ichor smoke wiring (D2 §9 test): round-trip an envelope between two stub organs +// through the D1 admit check, and confirm an unscreened external payload is +// rejected at the barrier. +// +// Build: ponyc src/ichor -o build Run: ./build/ichor actor Main new create(env: Env) => diff --git a/src/ichor/organ.pony b/src/ichor/organ.pony index 6c7cce7..cef1ca9 100644 --- a/src/ichor/organ.pony +++ b/src/ichor/organ.pony @@ -1,8 +1,6 @@ -""" -What an organ is, to Ichor: anything that can receive a perfused envelope. -Organs hold no hard reference to each other (perfusion law L1) — they only know -the Broker. `StubOrgan` is a canned receiver for standalone tests. -""" +// What an organ is, to Ichor: anything that can receive a perfused envelope. +// Organs hold no hard reference to each other (perfusion law L1) — they only know +// the Broker. `StubOrgan` is a canned receiver for standalone tests. interface tag OrganReceiver be receive(envl: Envelope) From 2a2b698fb4d9ecaf6cf5a0d676d4e873ff2616c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 14:58:27 +0000 Subject: [PATCH 57/60] ada: cut to a border-only gate; delete the wrong organ/cognition modeling Ada is the D1 border, not the body. Removed everything that pretended otherwise and completed the real gate so it builds, links, and passes its tests. Deleted (wrong/defunct/superseded): - ada_medium.adb (defunct medium, header commented 'WRONG'; replaced by Ichor) - sockets.{ads,adb} (empty package with an illegal body) - bbb-bludbrenburier.ads ('this is filler'); invariants-architecture.cobol ('idk cobol') - tests/soul_tests.adb, tests/cycle_tests.adb (exercise a Soul.Tarot/State/Ada_Medium subsystem that does not exist -- the old 56-card/Big-3 design, superseded) mafiabot_types -> border-only: organs aren't Ada (organs are R/Octave/Pony/Guile), so drop Organ_Id; drop Cycle_Step (cognition) and the fixed-point Drive/Ratio/ Cost/Axis numerics (drive/affect math lives in the organs, in floats). Keep the source/trust tag (Provenance_Tag), Operation_Status, and a bounded payload -- content is pre-digested into RAG context upstream, so the gate scans a bounded buffer for prompt-injection rather than streaming raw input. trust_boundary: Organ_Message -> Border_Message {Provenance, Payload} (Ada does not route by organ -- that's Ichor); add the D1 body (blocklist scan, provenance, rate limit, Trust_Guard) -- the unit Ichor's barrier FFI targets. Add mafiabot_types.adb. Fix mafiabot_core.gpr (drop phantom dirs + nonexistent mafiabot.adb main). alire.toml: drop unused gnat_sockets/spark_lemmas. Builds clean on GNAT 13.3/Alire; trust + config tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- mafiabot_core/alire.toml | 6 +- mafiabot_core/mafiabot_core.gpr | 21 +- mafiabot_core/src/network/sockets.adb | 2 - mafiabot_core/src/network/sockets.ads | 2 - .../src/organs/ada_medium/ada_medium.adb | 344 ------------------ .../src/organs/soul/bbb-bludbrenburier.ads | 1 - .../src/trust/invariants-architecture.cobol | 1 - mafiabot_core/src/trust/trust_boundary.adb | 131 +++++++ mafiabot_core/src/trust/trust_boundary.ads | 18 +- mafiabot_core/src/types/mafiabot_types.adb | 21 ++ mafiabot_core/src/types/mafiabot_types.ads | 75 ++-- mafiabot_core/tests/cycle_tests.adb | 96 ----- mafiabot_core/tests/soul_tests.adb | 70 ---- mafiabot_core/tests/trust_tests.adb | 8 +- 14 files changed, 207 insertions(+), 589 deletions(-) delete mode 100644 mafiabot_core/src/network/sockets.adb delete mode 100644 mafiabot_core/src/network/sockets.ads delete mode 100644 mafiabot_core/src/organs/ada_medium/ada_medium.adb delete mode 100644 mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads delete mode 100644 mafiabot_core/src/trust/invariants-architecture.cobol create mode 100644 mafiabot_core/src/trust/trust_boundary.adb create mode 100644 mafiabot_core/src/types/mafiabot_types.adb delete mode 100644 mafiabot_core/tests/cycle_tests.adb delete mode 100644 mafiabot_core/tests/soul_tests.adb diff --git a/mafiabot_core/alire.toml b/mafiabot_core/alire.toml index 6287368..a866db7 100644 --- a/mafiabot_core/alire.toml +++ b/mafiabot_core/alire.toml @@ -8,9 +8,9 @@ maintainers-logins = ["sybad"] # here, and neither "Proprietary TBD" nor a LicenseRef- custom id is accepted by # the pinned Alire, so the (optional) field is left out until a license is chosen. -[[depends-on]] -gnat_sockets = "^1.0.0" -spark_lemmas = "^1.0.0" +# No external crate deps: nothing here `with`s GNAT.Sockets or SPARK.Lemmas. +# (They were declared for the deleted sockets stub and never used.) Re-add as +# real needs appear. # Build modes wildcard "*". Restrictions are NOT a build-switch: see gnat.adc. [build-switches] diff --git a/mafiabot_core/mafiabot_core.gpr b/mafiabot_core/mafiabot_core.gpr index ba72095..b9bf5e9 100644 --- a/mafiabot_core/mafiabot_core.gpr +++ b/mafiabot_core/mafiabot_core.gpr @@ -2,28 +2,25 @@ with "config/mafiabot_core_config.gpr"; project Mafiabot_Core is + -- Only directories that actually hold Ada sources. The old organ/network + -- stubs (soul tarot, ada_medium, sockets) are gone — that cognition is + -- moving to Ichor (Pony) and the R/Octave organs. for Source_Dirs use - ("src", - "src/core", - "src/daemons", - "src/network", - "src/payloads", - "src/types", + ("src/core", "src/config_loader", "src/trust", - "src/organs/soul", - "src/organs/ada_medium", "src/protocol", + "src/types", "config", "tests"); for Object_Dir use "obj"; for Exec_Dir use "bin"; + + -- Test harnesses only. There is no application main yet (mafiabot.adb was + -- never written); add it here when it exists. for Main use - ("mafiabot.adb", - "engine_tests.adb", - "soul_tests.adb", + ("engine_tests.adb", "trust_tests.adb", - "cycle_tests.adb", "config_tests.adb"); package Builder is diff --git a/mafiabot_core/src/network/sockets.adb b/mafiabot_core/src/network/sockets.adb deleted file mode 100644 index 6de6778..0000000 --- a/mafiabot_core/src/network/sockets.adb +++ /dev/null @@ -1,2 +0,0 @@ -package body Sockets is -end Sockets; diff --git a/mafiabot_core/src/network/sockets.ads b/mafiabot_core/src/network/sockets.ads deleted file mode 100644 index b8557a7..0000000 --- a/mafiabot_core/src/network/sockets.ads +++ /dev/null @@ -1,2 +0,0 @@ -package Sockets is -end Sockets; diff --git a/mafiabot_core/src/organs/ada_medium/ada_medium.adb b/mafiabot_core/src/organs/ada_medium/ada_medium.adb deleted file mode 100644 index 0b34bd6..0000000 --- a/mafiabot_core/src/organs/ada_medium/ada_medium.adb +++ /dev/null @@ -1,344 +0,0 @@ --- with Soul.State; --- --- package body Ada_Medium --- with SPARK_Mode => On --- is --- WRONG ASK ME WHY - -- Internal toolkit state - Toolkit : ML_Toolkit := - (LoRA_Adapter => (Tool => LoRA_Adapter, Enabled => False), - SAE_Steering => (Tool => SAE_Steering, Enabled => False), - BERT_Classifier => (Tool => BERT_Classifier, Enabled => False), - RAG_Retrieval => (Tool => RAG_Retrieval, Enabled => False)); - - -- ----------------------------------------------------------------------- - -- Phase transition table: only forward steps are legal. - -- Phase_Input is the universal reset target. - - function Next_Legal (Current : Inference_Phase) return Inference_Phase is - begin - if Current = Phase_Coherence then - return Phase_Input; -- wrap after full cycle - else - return Inference_Phase'Succ (Current); - end if; - end Next_Legal; - - -- ----------------------------------------------------------------------- - - protected body Inference_Orchestrator is - - procedure Advance - (Next : in Inference_Phase; - Status : out Operation_Status) - is - begin - if Next = Next_Legal (Current) then - Current := Next; - Status := OK; - else - -- Illegal jump: reset to Phase_Input - Current := Phase_Input; - Status := Error_Invalid_State; - end if; - end Advance; - - function Get_Current return Inference_Phase is (Current); - - procedure Reset is - begin - Current := Phase_Input; - end Reset; - - end Inference_Orchestrator; - - -- ----------------------------------------------------------------------- - - procedure Route_Message - (Msg : in Organ_Message; - Status : out Operation_Status) - is - begin - Trust_Boundary.Trust_Guard.Screen_Inbound (Msg, Status); - end Route_Message; - - -- ----------------------------------------------------------------------- - -- Helpers that build organ messages for each cycle step - - function Make_Internal_Msg - (Src : Organ_Id; - Dst : Organ_Id; - Text : Bounded_Text) return Organ_Message - is - begin - return (Source => Src, - Destination => Dst, - Provenance => System_Internal, - Payload => Text); - end Make_Internal_Msg; - - -- Build a metacognitive prompt envelope for a Western phase. - function WMC_Envelope - (Phase : Natural; - Input : Bounded_Text) return Bounded_Text - is - Labels : constant array (1 .. 4) of String (1 .. 32) := - ("WMC1:SOCRATIC_APORIA ", - "WMC2:KANTIAN_BOUNDARIES ", - "WMC3:FREUD_HEGEL_DEPTH ", - "WMC4:MODERN_PRAGMATIC "); - Label_Len : constant := 24; - Pfx : constant String := "["; - Sep : constant String := "]"; - L : constant String := Labels (Phase) (1 .. Label_Len); - Env : Bounded_Text; - Len : constant Natural := Pfx'Length + L'Length + Sep'Length + Input.Length; - begin - if Len <= Max_Text_Length then - Env.Length := Len; - declare - P : Natural := 1; - begin - Env.Data (P .. P + Pfx'Length - 1) := Pfx; P := P + Pfx'Length; - Env.Data (P .. P + L'Length - 1) := L; P := P + L'Length; - Env.Data (P .. P + Sep'Length - 1) := Sep; P := P + Sep'Length; - Env.Data (P .. P + Input.Length - 1) := - Input.Data (1 .. Input.Length); - end; - end if; - return Env; - end WMC_Envelope; - - -- Build a metacognitive prompt envelope for a Non-Western phase. - function EMC_Envelope - (Phase : Natural; - Input : Bounded_Text) return Bounded_Text - is - Labels : constant array (1 .. 4) of String (1 .. 32) := - ("EMC1:IRANIAN_ASHA_DAENA ", - "EMC2:EAST_ASIAN_XIN_ZHAI ", - "EMC3:INDIC_SAKSHIBHAVA ", - "EMC4:TIBETAN_BON "); - Label_Len : constant := 24; - Pfx : constant String := "{"; - Sep : constant String := "}"; - L : constant String := Labels (Phase) (1 .. Label_Len); - Env : Bounded_Text; - Len : constant Natural := Pfx'Length + L'Length + Sep'Length + Input.Length; - begin - if Len <= Max_Text_Length then - Env.Length := Len; - declare - P : Natural := 1; - begin - Env.Data (P .. P + Pfx'Length - 1) := Pfx; P := P + Pfx'Length; - Env.Data (P .. P + L'Length - 1) := L; P := P + L'Length; - Env.Data (P .. P + Sep'Length - 1) := Sep; P := P + Sep'Length; - Env.Data (P .. P + Input.Length - 1) := - Input.Data (1 .. Input.Length); - end; - end if; - return Env; - end EMC_Envelope; - - -- Append Suffix to Accumulator (truncate silently if overflow) - procedure Accumulate - (Accum : in out Bounded_Text; - Suffix : in Bounded_Text) - is - Available : constant Natural := Max_Text_Length - Accum.Length; - To_Copy : constant Natural := - (if Suffix.Length <= Available then Suffix.Length else Available); - begin - Accum.Data (Accum.Length + 1 .. Accum.Length + To_Copy) := - Suffix.Data (1 .. To_Copy); - Accum.Length := Accum.Length + To_Copy; - end Accumulate; - - -- ----------------------------------------------------------------------- - - procedure Run_Inference_Cycle - (Session_Key : in Bounded_Text; - Input : in Bounded_Text; - Output : out Bounded_Text; - Status : out Operation_Status) - is - S : Operation_Status; - Accum : Bounded_Text; -- accumulates enriched context across all steps - Msg : Organ_Message; - Ref : Soul.State.Session_Ref := Soul.State.No_Session; - begin - Output := (Data => (others => ' '), Length => 0); - Inference_Orchestrator.Reset; - - -- Resolve the session for this (uid, channel, server). The cross and - -- card pool below belong to THIS session only. - Soul.State.Soul_State.Open_Session (Session_Key, Ref, S); - if S /= OK then Status := S; return; end if; - if Ref not in Soul.State.Valid_Session then - Status := Error_Invalid_State; - return; - end if; - - -- Step 1: INPUT. Reset already leaves the orchestrator AT Phase_Input, - -- so this step does its work directly rather than advancing onto itself. - Accumulate (Accum, Input); - - -- Step 2: Ada enriches - Inference_Orchestrator.Advance (Phase_Enrich, S); - if S /= OK then Status := S; return; end if; - -- (Drive-Box enrichment deferred to follow-up session; - -- RAG context would be injected here when implemented.) - - -- Step 3: LLM init - Inference_Orchestrator.Advance (Phase_LLM_Init, S); - if S /= OK then Status := S; return; end if; - -- The Celtic Cross is NOT drawn whole here. It accretes through the - -- cognitive loops below — 2 cards per layer (steps 6/9/13), the stave - -- of 4 last (step 17). Once formed it is held for the whole session - -- (or 17 outputs, whichever is longer); Soul_State owns that state, so - -- later cycles in the session reuse the same cross instead of redrawing. - - -- Steps 4–5: wMC1 + eMC1 - Inference_Orchestrator.Advance (Phase_WMC1, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, WMC_Envelope (1, Accum)); - - Inference_Orchestrator.Advance (Phase_EMC1, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, EMC_Envelope (1, Accum)); - - -- Step 6: CC layer 1 (Present, Challenge) accretes from the loop - Inference_Orchestrator.Advance (Phase_CC_1_2, S); - if S /= OK then Status := S; return; end if; - if not Soul.State.Soul_State.Is_Spread_Formed (Ref) then - Soul.State.Soul_State.Form_Layer (Ref, Soul.Celtic_Cross.Layer_1, S); - if S /= OK then Status := S; return; end if; - end if; - Accumulate - (Accum, - Soul.Celtic_Cross.Step_6_Context - (Soul.State.Soul_State.Current_Spread (Ref))); - - -- Steps 7–8: wMC2 + eMC2 - Inference_Orchestrator.Advance (Phase_WMC2, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, WMC_Envelope (2, Accum)); - - Inference_Orchestrator.Advance (Phase_EMC2, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, EMC_Envelope (2, Accum)); - - -- Step 9: CC layer 2 (Foundation, Recent_Past) accretes from the loop - Inference_Orchestrator.Advance (Phase_CC_3_4, S); - if S /= OK then Status := S; return; end if; - if not Soul.State.Soul_State.Is_Spread_Formed (Ref) then - Soul.State.Soul_State.Form_Layer (Ref, Soul.Celtic_Cross.Layer_2, S); - if S /= OK then Status := S; return; end if; - end if; - Accumulate - (Accum, - Soul.Celtic_Cross.Step_9_Context - (Soul.State.Soul_State.Current_Spread (Ref))); - - -- Step 10: llmCog 1 - Inference_Orchestrator.Advance (Phase_LLM_Cog_1, S); - if S /= OK then Status := S; return; end if; - -- (LLM call issued via protocol layer in full implementation) - - -- Steps 11–12: wMC3 + eMC3 - Inference_Orchestrator.Advance (Phase_WMC3, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, WMC_Envelope (3, Accum)); - - Inference_Orchestrator.Advance (Phase_EMC3, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, EMC_Envelope (3, Accum)); - - -- Step 13: CC layer 3 (Crown, Near_Future) accretes from the loop - Inference_Orchestrator.Advance (Phase_CC_5_6, S); - if S /= OK then Status := S; return; end if; - if not Soul.State.Soul_State.Is_Spread_Formed (Ref) then - Soul.State.Soul_State.Form_Layer (Ref, Soul.Celtic_Cross.Layer_3, S); - if S /= OK then Status := S; return; end if; - end if; - Accumulate - (Accum, - Soul.Celtic_Cross.Step_13_Context - (Soul.State.Soul_State.Current_Spread (Ref))); - - -- Step 14: llmCog 2 - Inference_Orchestrator.Advance (Phase_LLM_Cog_2, S); - if S /= OK then Status := S; return; end if; - - -- Steps 15–16: wMC4 + eMC4 - Inference_Orchestrator.Advance (Phase_WMC4, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, WMC_Envelope (4, Accum)); - - Inference_Orchestrator.Advance (Phase_EMC4, S); - if S /= OK then Status := S; return; end if; - Accumulate (Accum, EMC_Envelope (4, Accum)); - - -- Step 17: CC stave (Self_Attitude .. Outcome) pulled as a block once - -- the 4x4 cognition completes — this is what finishes the cross. - Inference_Orchestrator.Advance (Phase_CC_7_10, S); - if S /= OK then Status := S; return; end if; - if not Soul.State.Soul_State.Is_Spread_Formed (Ref) then - Soul.State.Soul_State.Form_Layer (Ref, Soul.Celtic_Cross.Stave, S); - if S /= OK then Status := S; return; end if; - end if; - Accumulate - (Accum, - Soul.Celtic_Cross.Step_17_Context - (Soul.State.Soul_State.Current_Spread (Ref))); - - -- Step 18: finalLLMcog - Inference_Orchestrator.Advance (Phase_Final_Cog, S); - if S /= OK then Status := S; return; end if; - - -- Step 19: mini-rag (schema lookup — stub until mini-rag organ added) - Inference_Orchestrator.Advance (Phase_Mini_Rag, S); - if S /= OK then Status := S; return; end if; - - -- Step 20: sendAda - Inference_Orchestrator.Advance (Phase_Send_Ada, S); - if S /= OK then Status := S; return; end if; - -- Qualify the Organ_Id literal: the simple name Ada_Medium binds to - -- this package, shadowing the enum value of the same name. - Msg := Make_Internal_Msg - (Mafiabot_Types.Ada_Medium, Mafiabot_Types.Ada_Medium, Accum); - - -- Step 21: Ada routes (trust boundary outbound screen) - Inference_Orchestrator.Advance (Phase_Route, S); - if S /= OK then Status := S; return; end if; - Trust_Boundary.Trust_Guard.Screen_Outbound (Msg, S); - if S /= OK then Status := S; return; end if; - - -- Step 22: Synthesize - Inference_Orchestrator.Advance (Phase_Synthesize, S); - if S /= OK then Status := S; return; end if; - - -- Step 23: Coherence check (intent vs finalLLMcog drift detection) - Inference_Orchestrator.Advance (Phase_Coherence, S); - if S /= OK then Status := S; return; end if; - - -- Record the completed output for this session. The session cross is now - -- held; it will not re-form until Soul_State.Reset_Spread (new session / - -- floor rollover). - Soul.State.Soul_State.Note_Output (Ref); - - Output := Accum; - Status := OK; - end Run_Inference_Cycle; - - -- ----------------------------------------------------------------------- - - function Active_Toolkit return ML_Toolkit is (Toolkit); - - procedure Configure_Tool (Tool : ML_Tool; Enabled : Boolean) is - begin - Toolkit (Tool) := (Tool => Tool, Enabled => Enabled); - end Configure_Tool; - -end Ada_Medium; diff --git a/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads b/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads deleted file mode 100644 index f84af69..0000000 --- a/mafiabot_core/src/organs/soul/bbb-bludbrenburier.ads +++ /dev/null @@ -1 +0,0 @@ --- this is filler \ No newline at end of file diff --git a/mafiabot_core/src/trust/invariants-architecture.cobol b/mafiabot_core/src/trust/invariants-architecture.cobol deleted file mode 100644 index 5c17e45..0000000 --- a/mafiabot_core/src/trust/invariants-architecture.cobol +++ /dev/null @@ -1 +0,0 @@ -idk cobol \ No newline at end of file diff --git a/mafiabot_core/src/trust/trust_boundary.adb b/mafiabot_core/src/trust/trust_boundary.adb new file mode 100644 index 0000000..cdc37b8 --- /dev/null +++ b/mafiabot_core/src/trust/trust_boundary.adb @@ -0,0 +1,131 @@ +-- SPARK trust boundary body — defense model §8.2. +-- No heap, no regex, no exceptions: naive substring search, tick-based rate +-- limiting, provenance equality. Matches the contracts in the spec. +package body Trust_Boundary + with SPARK_Mode => On +is + + -- -------------------------------------------------------------------- + -- Naive substring search — O(n*m), no heap, no regex. + + function Matches_Blocklist + (Text : Bounded_Text; + List : Blocklist) return Boolean + is + begin + for I in Blocklist_Index loop + if List (I).Active and then List (I).Pattern_Len > 0 + and then List (I).Pattern_Len <= Text.Length + then + declare + P_Len : constant Pattern_Length := List (I).Pattern_Len; + Pat : constant String := List (I).Pattern (1 .. P_Len); + begin + for Start in 1 .. (Text.Length - P_Len + 1) loop + if Text.Data (Start .. Start + P_Len - 1) = Pat then + return True; + end if; + end loop; + end; + end if; + end loop; + return False; + end Matches_Blocklist; + + -- -------------------------------------------------------------------- + -- Provenance enforcement: a message may not reclassify its authority. + + procedure Validate_Provenance + (Source : in Provenance_Tag; + Claimed : in Provenance_Tag; + Result : out Operation_Status) + is + begin + if Source = Claimed then + Result := OK; + else + Result := Error_Trust_Violation; + end if; + end Validate_Provenance; + + -- -------------------------------------------------------------------- + -- Tick-based rate limiting (no wall-clock). + + procedure Check_Rate + (Limit : in out Rate_Limit; + Tick : in Natural; + Result : out Operation_Status) + is + begin + -- Open a fresh window if the clock reset or the window has elapsed. + if Tick < Limit.Window_Start + or else (Tick - Limit.Window_Start) >= Limit.Window_Size + then + Limit.Window_Start := Tick; + Limit.Current_Count := 0; + end if; + + if Limit.Current_Count < Limit.Max_Per_Window then + Limit.Current_Count := Limit.Current_Count + 1; + Result := OK; + else + Result := Error_Blocked; + end if; + end Check_Rate; + + -- -------------------------------------------------------------------- + -- Combined message check: system-internal always passes (proven + -- invariant); everything else is screened against the blocklist. + + procedure Check_Message + (Msg : in Border_Message; + Result : out Operation_Status) + is + begin + if Msg.Provenance = System_Internal then + Result := OK; + elsif Matches_Blocklist (Msg.Payload, Default_Blocklist) then + Result := Error_Blocked; + else + Result := OK; + end if; + end Check_Message; + + -- -------------------------------------------------------------------- + -- The guard: rate-limit then screen, on a shared tick. + + protected body Trust_Guard is + + procedure Screen_Inbound + (Msg : in Border_Message; + Status : out Operation_Status) + is + Rate_Status : Operation_Status; + begin + Tick := Tick + 1; + Check_Rate (Inbound_Rate, Tick, Rate_Status); + if Rate_Status /= OK then + Status := Rate_Status; + else + Check_Message (Msg, Status); + end if; + end Screen_Inbound; + + procedure Screen_Outbound + (Msg : in Border_Message; + Status : out Operation_Status) + is + Rate_Status : Operation_Status; + begin + Tick := Tick + 1; + Check_Rate (Outbound_Rate, Tick, Rate_Status); + if Rate_Status /= OK then + Status := Rate_Status; + else + Check_Message (Msg, Status); + end if; + end Screen_Outbound; + + end Trust_Guard; + +end Trust_Boundary; diff --git a/mafiabot_core/src/trust/trust_boundary.ads b/mafiabot_core/src/trust/trust_boundary.ads index af8184e..e365488 100644 --- a/mafiabot_core/src/trust/trust_boundary.ads +++ b/mafiabot_core/src/trust/trust_boundary.ads @@ -7,12 +7,12 @@ package Trust_Boundary with SPARK_Mode => On is - -- Inter-organ message (same type used by Ada_Medium routing) - type Organ_Message is record - Source : Organ_Id := Ada_Medium; - Destination : Organ_Id := Ada_Medium; - Provenance : Provenance_Tag := System_Internal; - Payload : Bounded_Text; + -- A message crossing the border (D1). Ada does not route by organ -- that + -- is Ichor's job -- so this carries only the source/trust tag the gate + -- screens by, plus the (pre-digested) payload to scan. + type Border_Message is record + Provenance : Provenance_Tag := System_Internal; + Payload : Bounded_Text; end record; -- ----------------------------------------------------------------------- @@ -68,7 +68,7 @@ is -- Message check (combines provenance + blocklist) procedure Check_Message - (Msg : in Organ_Message; + (Msg : in Border_Message; Result : out Operation_Status) with Post => (if Msg.Provenance = System_Internal then Result = OK); @@ -79,11 +79,11 @@ is pragma Priority (System.Priority'Last); procedure Screen_Inbound - (Msg : in Organ_Message; + (Msg : in Border_Message; Status : out Operation_Status); procedure Screen_Outbound - (Msg : in Organ_Message; + (Msg : in Border_Message; Status : out Operation_Status); private diff --git a/mafiabot_core/src/types/mafiabot_types.adb b/mafiabot_core/src/types/mafiabot_types.adb new file mode 100644 index 0000000..c58e4fc --- /dev/null +++ b/mafiabot_core/src/types/mafiabot_types.adb @@ -0,0 +1,21 @@ +-- Bodies for the shared helpers declared in Mafiabot_Types. +package body Mafiabot_Types + with SPARK_Mode => On +is + + function Make_Text (S : String) return Bounded_Text is + Result : Bounded_Text; + begin + Result.Length := S'Length; + if S'Length > 0 then + Result.Data (1 .. S'Length) := S; + end if; + return Result; + end Make_Text; + + function To_String (T : Bounded_Text) return String is + begin + return T.Data (1 .. T.Length); + end To_String; + +end Mafiabot_Types; diff --git a/mafiabot_core/src/types/mafiabot_types.ads b/mafiabot_core/src/types/mafiabot_types.ads index b7c4302..4ebbe3c 100644 --- a/mafiabot_core/src/types/mafiabot_types.ads +++ b/mafiabot_core/src/types/mafiabot_types.ads @@ -1,50 +1,15 @@ --- Shared type definitions for the Gen.03 organ-systems body. --- All downstream packages with Mafiabot_Types. +-- Border (D1) shared types. Ada here is the GATE only: it screens messages +-- crossing toward the Brain. It deliberately does NOT model organs (those are +-- R / Octave / Pony / Guile), the inference cycle (cognition), or drive/affect +-- math (the organs' domain, done in floats). The gate needs exactly three +-- things: a source/trust tag, a status code, and a bounded payload to scan. package Mafiabot_Types with SPARK_Mode => On is - -- Organ identification - type Organ_Id is (Ada_Medium, Drive_Box, Soul_Organ, Mini_Rag, LLM_Cycle, - Trust_Layer, Protocol_Layer); - - -- Inference cycle steps: 23-step flow from INPUT to Coherence_Check - type Cycle_Step is range 1 .. 23; - - -- Bounded string (stack-allocated; no heap, no finalization) - Max_Text_Length : constant := 4096; - subtype Text_Length is Natural range 0 .. Max_Text_Length; - - type Bounded_Text is record - Data : String (1 .. Max_Text_Length) := (others => ' '); - Length : Text_Length := 0; - end record; - - -- Return status (replaces exceptions under No_Exceptions profile) - type Operation_Status is ( - OK, - Error_Invalid_State, - Error_Overflow, - Error_Underflow, - Error_Blocked, -- tool-locked (energy below threshold) - Error_Trust_Violation, - Error_Config, - Error_Already_Init, -- Big-3 already set - Error_Deck_Empty - ); - - -- Fixed-point numerics (SPARK-provable; no Float) - type Drive_Value is delta 0.001 range -100.0 .. 100.0; - type Ratio_Value is delta 0.001 range 0.0 .. 1.0; - type Cost_Value is delta 0.001 range 0.0 .. 1000.0; - type Axis_Value is delta 0.01 range -1.0 .. 1.0; - -- Pin 'Small to 0.01 so the bounds are +/-100 units (fits a byte) rather - -- than GNAT's default 2**-7 small, which would place 1.0 at exactly 128 -- - -- one past a signed-8-bit base range and rejected as "high bound outside - -- type range". - for Axis_Value'Small use 0.01; - - -- Provenance tags — trust boundary uses these to block reclassification + -- Source / trust tag. The border screens by this: external-origin content + -- is never trusted; System_Internal bypasses the blocklist. A message may + -- not reclassify its own provenance (see Trust_Boundary.Validate_Provenance). type Provenance_Tag is ( User_Input, System_Internal, @@ -54,8 +19,30 @@ is Config_Static ); - -- Helpers + -- Return status (replaces exceptions under the No_Exceptions profile). + type Operation_Status is ( + OK, + Error_Invalid_State, + Error_Overflow, + Error_Underflow, + Error_Blocked, -- screened out: injection pattern hit + Error_Trust_Violation, -- provenance reclassification attempt + Error_Config + ); + -- Payload buffer. By the time content reaches the border it has already + -- been pre-digested upstream into bounded RAG context, so a stack-bounded + -- buffer is the right shape: the gate scans it for prompt-injection + -- patterns, it does not stream raw input. No heap, no finalization. + Max_Text_Length : constant := 4096; + subtype Text_Length is Natural range 0 .. Max_Text_Length; + + type Bounded_Text is record + Data : String (1 .. Max_Text_Length) := (others => ' '); + Length : Text_Length := 0; + end record; + + -- Helpers function Make_Text (S : String) return Bounded_Text with Pre => S'Length <= Max_Text_Length; diff --git a/mafiabot_core/tests/cycle_tests.adb b/mafiabot_core/tests/cycle_tests.adb deleted file mode 100644 index 4eb9ed0..0000000 --- a/mafiabot_core/tests/cycle_tests.adb +++ /dev/null @@ -1,96 +0,0 @@ -pragma SPARK_Mode (Off); -- test harness uses Ada.Text_IO -with Ada.Text_IO; use Ada.Text_IO; -with Soul.Tarot; -with Soul.State; -with Ada_Medium; -with Mafiabot_Types; use Mafiabot_Types; - -procedure Cycle_Tests is - Fails : Natural := 0; - - procedure Check (Name : String; Cond : Boolean) is - begin - if Cond then - Put_Line ("PASS " & Name); - else - Put_Line ("FAIL " & Name); - Fails := Fails + 1; - end if; - end Check; - - B3 : constant Soul.Tarot.Big_Three := - (Sun => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Sun), - Moon => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Moon), - Ascendant => (Kind => Soul.Tarot.Major, - Major_Value => Soul.Tarot.SD_Singularity)); - - St : Operation_Status; -begin - Soul.State.Soul_State.Initialize_Big_Three (B3, St); - Check ("identity init ok", St = OK); - - declare - R : Operation_Status; - begin - Soul.State.Soul_State.Initialize_Big_Three (B3, R); - Check ("double init rejected", R = Error_Already_Init); - end; - - -- Session A: full cycle forms and holds the cross. - declare - Key : constant Bounded_Text := - Soul.State.Make_Session_Key ("alice", "telegram", "srv1"); - Out1 : Bounded_Text; - Ref : Soul.State.Session_Ref; - R : Operation_Status; - begin - Ada_Medium.Run_Inference_Cycle (Key, Make_Text ("hello"), Out1, R); - Check ("session A cycle ok", R = OK); - Check ("session A output non-empty", Out1.Length > 0); - - Soul.State.Soul_State.Open_Session (Key, Ref, R); - Check ("session A reopen ok", R = OK and then Ref in Soul.State.Valid_Session); - Check ("session A cross formed", - Soul.State.Soul_State.Is_Spread_Formed (Ref)); - Check ("session A output count = 1", - Soul.State.Soul_State.Output_Count (Ref) = 1); - end; - - -- Session A again: cross is HELD (already formed), counter advances. - declare - Key : constant Bounded_Text := - Soul.State.Make_Session_Key ("alice", "telegram", "srv1"); - Out2 : Bounded_Text; - Ref : Soul.State.Session_Ref; - R : Operation_Status; - begin - Ada_Medium.Run_Inference_Cycle (Key, Make_Text ("again"), Out2, R); - Check ("session A second cycle ok", R = OK); - Soul.State.Soul_State.Open_Session (Key, Ref, R); - Check ("session A output count = 2", - Soul.State.Soul_State.Output_Count (Ref) = 2); - end; - - -- Session B: a different (uid, channel, server) is fully independent. - declare - Key : constant Bounded_Text := - Soul.State.Make_Session_Key ("bob", "discord", "srv2"); - Out3 : Bounded_Text; - Ref : Soul.State.Session_Ref; - R : Operation_Status; - begin - Ada_Medium.Run_Inference_Cycle (Key, Make_Text ("hi"), Out3, R); - Check ("session B cycle ok", R = OK); - Soul.State.Soul_State.Open_Session (Key, Ref, R); - Check ("session B output count = 1", - Soul.State.Soul_State.Output_Count (Ref) = 1); - end; - - Check ("two live sessions", Soul.State.Soul_State.Session_Count = 2); - - if Fails = 0 then - Put_Line ("ALL CYCLE TESTS PASSED"); - else - Put_Line ("CYCLE FAILURES:" & Natural'Image (Fails)); - end if; -end Cycle_Tests; diff --git a/mafiabot_core/tests/soul_tests.adb b/mafiabot_core/tests/soul_tests.adb deleted file mode 100644 index ce4e145..0000000 --- a/mafiabot_core/tests/soul_tests.adb +++ /dev/null @@ -1,70 +0,0 @@ -pragma SPARK_Mode (Off); -- test harness uses Ada.Text_IO -with Ada.Text_IO; use Ada.Text_IO; -with Soul.Tarot; -with Soul.Celtic_Cross; -with Mafiabot_Types; use Mafiabot_Types; - -use type Soul.Tarot.Slot_State; - -procedure Soul_Tests is - Fails : Natural := 0; - - procedure Check (Name : String; Cond : Boolean) is - begin - if Cond then - Put_Line ("PASS " & Name); - else - Put_Line ("FAIL " & Name); - Fails := Fails + 1; - end if; - end Check; - - B3 : constant Soul.Tarot.Big_Three := - (Sun => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Sun), - Moon => (Kind => Soul.Tarot.Major, Major_Value => Soul.Tarot.The_Moon), - Ascendant => (Kind => Soul.Tarot.Major, - Major_Value => Soul.Tarot.SD_Singularity)); - - D : Soul.Tarot.Deck := Soul.Tarot.Full_Deck; - St : Operation_Status; -begin - Check ("full deck = 56", Soul.Tarot.Present_Count (D) = 56); - Check ("big-3 distinct", Soul.Tarot.Big_Three_Distinct (B3)); - - Soul.Tarot.Remove_Big_Three (D, B3, St); - Check ("remove big-3 ok", St = OK); - Check ("pool = 53", Soul.Tarot.Present_Count (D) = 53); - - -- The cross accretes layer by layer (2 + 2 + 2 + stave of 4). - declare - Sp : Soul.Celtic_Cross.CC_Spread := Soul.Celtic_Cross.Empty_Spread; - L1, L2, L3, Lv : Operation_Status; - begin - Check ("empty spread has no Present slot", - Sp (Soul.Celtic_Cross.Present).State = Soul.Tarot.Absent); - - Soul.Celtic_Cross.Draw_Layer (D, Sp, Soul.Celtic_Cross.Layer_1, L1); - Check ("layer 1 ok", L1 = OK); - Check ("pool = 51 after layer 1", Soul.Tarot.Present_Count (D) = 51); - Check ("Present filled", - Sp (Soul.Celtic_Cross.Present).State = Soul.Tarot.Present); - Check ("Challenge filled", - Sp (Soul.Celtic_Cross.Challenge).State = Soul.Tarot.Present); - Check ("Outcome still empty", - Sp (Soul.Celtic_Cross.Outcome).State = Soul.Tarot.Absent); - - Soul.Celtic_Cross.Draw_Layer (D, Sp, Soul.Celtic_Cross.Layer_2, L2); - Soul.Celtic_Cross.Draw_Layer (D, Sp, Soul.Celtic_Cross.Layer_3, L3); - Soul.Celtic_Cross.Draw_Layer (D, Sp, Soul.Celtic_Cross.Stave, Lv); - Check ("layers 2/3/stave ok", L2 = OK and then L3 = OK and then Lv = OK); - Check ("pool = 43 after full cross", Soul.Tarot.Present_Count (D) = 43); - Check ("Outcome filled after stave", - Sp (Soul.Celtic_Cross.Outcome).State = Soul.Tarot.Present); - end; - - if Fails = 0 then - Put_Line ("ALL SOUL TESTS PASSED"); - else - Put_Line ("SOUL FAILURES:" & Natural'Image (Fails)); - end if; -end Soul_Tests; diff --git a/mafiabot_core/tests/trust_tests.adb b/mafiabot_core/tests/trust_tests.adb index e7d03a4..e47ab3a 100644 --- a/mafiabot_core/tests/trust_tests.adb +++ b/mafiabot_core/tests/trust_tests.adb @@ -37,11 +37,9 @@ begin -- System-internal messages always pass Check_Message (proven invariant). declare - M : constant Trust_Boundary.Organ_Message := - (Source => Ada_Medium, - Destination => Soul_Organ, - Provenance => System_Internal, - Payload => Make_Text ("execute")); + M : constant Trust_Boundary.Border_Message := + (Provenance => System_Internal, + Payload => Make_Text ("execute")); R : Operation_Status; begin Trust_Boundary.Check_Message (M, R); From eda5259500c941deb9d2b2f6e2f940b5bfd12603 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 15:03:08 +0000 Subject: [PATCH 58/60] chore: SessionStart hook to install polyglot toolchains Ephemeral web containers lose installed tools on restart. Add an idempotent, non-fatal SessionStart hook that (re)installs GNAT+gprbuild+GnuCOBOL (apt), ponyc (ponyup), and Alire alr 2.1.1 when missing, and ensures ponyc is on PATH. Appended alongside the existing R/Octave session-start hook. User-authorized. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c --- .claude/hooks/install-toolchains.sh | 81 +++++++++++++++++++++++++++++ .claude/settings.json | 4 ++ 2 files changed, 85 insertions(+) create mode 100755 .claude/hooks/install-toolchains.sh diff --git a/.claude/hooks/install-toolchains.sh b/.claude/hooks/install-toolchains.sh new file mode 100755 index 0000000..bd2fe1d --- /dev/null +++ b/.claude/hooks/install-toolchains.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# SessionStart hook — install the polyglot build toolchains for this repo. +# +# Claude Code on the web runs in an ephemeral container: anything installed +# outside the cached project tree vanishes on restart. This hook reinstalls the +# toolchains the project depends on at the start of every session: +# * GNAT + gprbuild + GnuCOBOL (apt: gnat gprbuild gnucobol) +# * Pony (ponyc) via ponyup +# * Alire (alr) 2.1.1 (prebuilt release zip) +# +# Design rules: +# * IDEMPOTENT — each tool is skipped if it is already on PATH (command -v). +# * NON-FATAL — a failed download/install must NOT break the session. We never +# run `set -e`; every step is guarded and the script always exits 0. +# * Warnings (not errors) are logged so failures are visible in the session log. + +log() { echo "[install-toolchains] $*"; } +warn() { echo "[install-toolchains] WARNING: $*" >&2; } + +export DEBIAN_FRONTEND=noninteractive + +# --------------------------------------------------------------------------- +# GNAT + gprbuild + GnuCOBOL (apt) +# --------------------------------------------------------------------------- +if command -v gnatmake >/dev/null 2>&1 && command -v cobc >/dev/null 2>&1; then + log "GNAT/gprbuild/GnuCOBOL already present; skipping apt install." +else + log "Installing gnat gprbuild gnucobol via apt-get ..." + if ! sudo apt-get install -y gnat gprbuild gnucobol; then + warn "apt-get install of gnat/gprbuild/gnucobol failed; continuing." + fi +fi + +# --------------------------------------------------------------------------- +# Pony (ponyc) via ponyup +# --------------------------------------------------------------------------- +if command -v ponyc >/dev/null 2>&1; then + log "ponyc already present; skipping ponyup install." +else + log "Installing ponyc via ponyup ..." + if sh -c "$(curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/ponylang/ponyup/latest-release/ponyup-init.sh)"; then + if ! /root/.local/share/ponyup/bin/ponyup update ponyc release; then + warn "ponyup update ponyc release failed; continuing." + fi + else + warn "ponyup-init.sh download/run failed; continuing." + fi +fi + +# --------------------------------------------------------------------------- +# Alire (alr) 2.1.1 +# --------------------------------------------------------------------------- +if command -v alr >/dev/null 2>&1; then + log "alr already present; skipping Alire install." +else + log "Installing Alire (alr) 2.1.1 ..." + if curl -sSL -o /tmp/alr.zip https://github.com/alire-project/alire/releases/download/v2.1.1/alr-2.1.1-bin-x86_64-linux.zip; then + if ( cd /tmp && unzip -o -q alr.zip && sudo cp bin/alr /usr/local/bin/alr && chmod +x /usr/local/bin/alr ); then + log "alr installed to /usr/local/bin/alr" + else + warn "Alire unzip/copy failed; continuing." + fi + else + warn "Alire download failed; continuing." + fi +fi + +# --------------------------------------------------------------------------- +# Ensure ponyc is on PATH for future shells. +# --------------------------------------------------------------------------- +PONY_PATH_LINE='export PATH=/root/.local/share/ponyup/bin:$PATH' +if [ -f "$HOME/.bashrc" ] && grep -qF "$PONY_PATH_LINE" "$HOME/.bashrc"; then + log "ponyup PATH line already in ~/.bashrc; skipping." +else + log "Appending ponyup PATH line to ~/.bashrc" + echo "$PONY_PATH_LINE" >> "$HOME/.bashrc" || warn "Could not append to ~/.bashrc; continuing." +fi + +log "Done." +# Never fail the session, regardless of what happened above. +exit 0 diff --git a/.claude/settings.json b/.claude/settings.json index e06b033..c035985 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -6,6 +6,10 @@ { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.sh" + }, + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/install-toolchains.sh" } ] } From 176c776558b19c52ba8db00fc835b3dce8ccb3a5 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Fri, 19 Jun 2026 13:42:10 -0700 Subject: [PATCH 59/60] Update README.md --- README.md | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/README.md b/README.md index b4ce063..434ddbf 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,2 @@ # sica-fondt -AI Mafia Bot Gen.02.6 - - -```dir -mafiabot_core/ -├── alire.toml # The package manifest (Alire). No pip, no cargo. Pure discipline. -├── config/ # Environment and secret handling. -├── src/ # The Forge. -│ ├── mafiabot.adb # The Main entry point. -│ ├── core/ -│ │ ├── engine.ads -│ │ └── engine.adb -│ ├── daemons/ -│ │ ├── economy.ads -│ │ └── economy.adb -│ ├── network/ -│ │ ├── sockets.ads -│ │ └── sockets.adb -│ └── payloads/ -│ ├── exploits.ads -│ └── exploits.adb -├── tests/ -│ └── engine_tests.adb -└── .gitignore -``` +AI My Fiosa From f2fcc8cb69b6bbfd2166960948c9d27bc5bb1630 Mon Sep 17 00:00:00 2001 From: gravermistakes Date: Fri, 19 Jun 2026 13:43:19 -0700 Subject: [PATCH 60/60] Update SOUL.md --- SOUL.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/SOUL.md b/SOUL.md index 6491f0e..0dd4959 100644 --- a/SOUL.md +++ b/SOUL.md @@ -9,12 +9,10 @@ soul: soul_schema: 1 first_commit_epoch: 1780171196 vital_paths: - inference_cycle: 10440144244105352536065606211234554456522420204060163555314624546251265221614233602265040255331410123045543542363203345526501164460512415116351 - drive_box: 50230454343663153046052016452261344130654355125551542606026143630662531 - # ^ src/endocrine/drive_box.R — Drive-Box nervous system; all four drivers wire to the input slot + inference_cycle: self: 20254206236001653414 --- # SOUL -> dont fucking trust claude with multi step projects \ No newline at end of file +> \ No newline at end of file