Huginn/docs/eureka-body-map.md
Meta Vens f6b3ec5e78 Map: who stops her units when the brake is held (mind-launch r2, brake-stop r1)
Imagination imagination-brake-stop, session self-2026-10-09-eureka: body
facts F18-F20, model rows for run, Brake and Units, and the rationale for
a synchronous stop owned by `mind-control brake hold`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:38:44 +02:00

309 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# eureka-body: map (Imagination, 2026-10-08)
Status: map, Imagination (`imagination-eureka-body`), session `self-2026-10-08`.
Campaign `eureka-body` in Eureka's mind (instance `eureka`). Target in force
`eureka-body:target:r1`, whose doc is Huginn `docs/eureka-self-cut.md` at
`570f369` (map r4 of 2026-10-01). This page keeps body facts, the model page
(step 0b) and rationale. Questions, cut specs, follow-ups and rulings are typed
documents in the mind; read them by id. Self commits this page where the
target doc lives (Huginn `docs/`), probably as `docs/eureka-body-map.md`.
Revised 2026-10-09 (Modeling, session `self-2026-10-09-morning`) after
`leaf-into-huginn` (Huginn `afc35f9`) and the Epiphany body teardown
(gamecult-ops `9c12adb`; leftovers in follow-up
`eureka-body:follow_up:epiphany-body-leftovers`). Pinned heads and facts F1-F14 are
as read on 2026-10-08 and keep their tense; each carries a note where a cut has since
changed it. F15-F17 are new.
Revised again on 2026-10-09 by Imagination (`imagination-brake-stop`, session
`self-2026-10-09-eureka`) at Huginn `df7507b`, after leaf-into-huginn, mind-authority,
mind-control-store and run-kind had merged. New facts are F18-F20, which name the
owner of the brake stop. The Brake, Units and run rows changed, and a rationale
section was added.
## Pinned heads (fetched 2026-10-08 ~12:10 UTC)
| Repo | Ref | Commit | Note |
| --- | --- | --- | --- |
| Huginn | `origin/main` = local `main`, `F:\Projects\Huginn`, clean | `6b496eb` | last commit 2026-10-02; deployed daemon is `107552d` (docs-only diff to main) |
| Epiphany | `origin/main` | `ef956865` | was Huginn's leaf pin (no pin since `afc35f9`); local checkout is on `codex/eureka-pipeline-state` `4006b14b`. GitHub `isArchived: false` |
| CodexConnector | `origin/main` | `3ddc12e` | local checkout is on `codex/ghostlight-release-binding` `6519289`; Ghostlight pins `68fe94b` |
| gamecult-ops | `origin/main` | `7e23387` | clean |
| Bifrost | `origin/main` | `160fac2` | clean |
| Eureka (forge) | `main` | `0bb414d` | scratch clone, removed after |
| Idunn | `origin/main` | `6667f0f` | read only; not a campaign repo |
## Body facts
Each line: what was run, where, result.
- **F1 Huginn never left Epiphany (at 6b496eb; cut at `afc35f9`, no build edge remains).** `grep epiphany crates/*/Cargo.toml` (Huginn 6b496eb):
`crates/huginn-mind/Cargo.toml:22` pins `epiphany-pipeline` by git at Epiphany
`ef956865`. `Cargo.lock:376-378` carries the git source. The map-r4 cut
`leaf-into-huginn` was never specified; no `cut_spec` for it exists in any
campaign (query of cut_spec headers under `eureka-substrate` and `eureka-body`).
- **F2 Leaf users in Huginn.** `pub use epiphany_pipeline;` at
`crates/huginn-mind/src/lib.rs:62`; direct `use epiphany_pipeline` in huginn-mind
`admission.rs:33` (26 mentions), `docs.rs:9`, `fixtures.rs:7`, `index.rs:10,157`,
`mind.rs:16` (9), `query.rs:28,624`, `receipt.rs:19,50-52,314`, `refusal.rs:6`,
`rows.rs:15`, `wire.rs:9`; through the re-export
`huginn_mind::epiphany_pipeline::` in eureka-state `src/lib.rs:29`, `src/main.rs:25`,
`tests/client.rs:17`, `tests/common/mod.rs:16`, `tests/mcp.rs:14,539`; huginn-daemon
`src/daemon.rs:7,220,688,718,747`, `src/index/mod.rs:102`, `src/semantic_tests.rs:13`,
`src/serve.rs:71,551`. Prose: `README.md:64`, `AGENTS.md:18`.
- **F3 The leaf at the pin (now Huginn `crates/eureka-pipeline`, `afc35f9`).** Epiphany `ef956865`: `epiphany-pipeline/Cargo.toml`
(lib `epiphany_pipeline`, deps anyhow, chrono, cultcache-rs at CultLib `8fc74c7`
= Huginn's own CultLib pin, rmp-serde, schemars, serde; dev serde_json),
`epiphany-pipeline/src/lib.rs` (schema-publication test reads
`CARGO_MANIFEST_DIR/../schemas/cultnet` at lib.rs:2725). `schemas/cultnet/` holds
13 `epiphany.pipeline.*.v2` schemas, `epiphany.work_organ_state.v0`,
`gamecult.persona_state.v0`, `index.json`, README; `schemas/README.md`.
- **F4 Mind deployment.** `ssh yggdrasil`: `huginn.service` active, ExecStart
`/opt/gamecult/huginn/current/huginn-daemon --state-root /var/lib/gamecult/huginn
--instance eureka --bind 10.77.0.1:17872 ...`; `current ->
releases/107552dc...` (Huginn merge of huginn-admission-rules; on 2026-10-08 main added docs only, and since then main has moved code: see F17).
UFW admits 17872/udp on wg-gamecult from 10.77.0.2 only (runbook
`huginn-yggdrasil.md:38,124`). The daemon has no peer authentication
(`serve.rs`: one session per peer, `max_peers = 256`); any reachable peer admits
as any faculty.
- **F5 Epiphany residue on Yggdrasil (12:13 UTC, before the teardown; what the teardown left is follow-up `eureka-body:follow_up:epiphany-body-leftovers`).** Units `epiphany.service`,
`epiphany-swarm.service`, `epiphany-heartbeat.service` inactive/dead;
`epiphany-model-connector.service` loaded, disabled. Users `epiphany` (988; groups
epiphany-state, bifrost-feedback-readers) and `epiphany-model` (984; group
gamecult-model); no process runs as either. Roots and sizes: `/srv/epiphany` 6.8G,
`/srv/epiphany-model-connector` 16G, `/var/lib/gamecult/epiphany` 1.9G (body.cc,
heartbeat.cc, codex-home, artifacts, capstones), `/var/lib/gamecult/epiphany-model-connector`
28K, `/etc/gamecult/epiphany` (bifrost-persona-feedback-anchor.msgpack, credentials/,
idunn-provider-projection-anchor.cc, mcp.toml), `/etc/gamecult/epiphany-model-connector`
(connection.key). Manifests `/srv/odin/deploy-manifests/epiphany`, `epiphany-capstone-17`,
`epiphany.capstone-17.yggdrasil.yaml`, `epiphany-ox17`, `epiphany.ox17.yggdrasil.yaml`,
`epiphany-swarm.service`, `epiphany.yggdrasil.Dockerfile`.
`/etc/gamecult/idunn/daemon-health-trust.cc` contains the string `epiphany`.
About 24.7 GB in all.
- **F6 What the live crossing still names.** `/etc/systemd/system/bifrost-persona-mouth.service`
carries flags `--epiphany-persona-mouth-trust-anchor`, `--epiphany-persona-permit-rudp`,
`--epiphany-persona-permit-trust-anchor`, `--epiphany-runtime-id epiphany-starfire`.
gamecult-ops `runbooks/bifrost-persona-feedback-yggdrasil.md:17` names
`/etc/gamecult/epiphany/bifrost-persona-feedback-anchor.msgpack`, `:45` the installed
`/usr/local/sbin/bifrost-authorize-epiphany-release` (sealed historical name), `:67`
the feedback target `--persona-id epiphany --repo GameCult/Epiphany --runtime-id
epiphany-yggdrasil`. These belong to the mouth rebinding, not to the teardown.
- **F7 Nothing Epiphany runs on Starfire.** `Get-Process`, `Get-ScheduledTask`,
`Get-Service` filtered on epiphany|eureka|persona|bifrost: empty. The permit
issuer the crossing expects on Starfire is not running, so the mouth cannot
obtain a permit today.
- **F8 Idunn still lists Epiphany.** Idunn `deploy/legacy/README.md:51-52` lists
targets `epiphany`, `epiphany-capstone-17`; `deploy/legacy/idunn-yggdrasil:126-135`
dispatch, `:312,:321` restart/deploy cases; `deploy/legacy/idunn-yggdrasil.sudoers:10-11,19`.
The precedent for retirement is the same file's "Retired targets"
(bifrost-persona-feedback, 2026-09-30). Idunn is not one of `eureka-body`'s repos.
- **F9 Codex is dead in practice.** Idunn `docs/migration.md:49-55`: "The operator is
not returning to Codex"; the deployed daemon failed with `401 token_expired`. On
Yggdrasil `codex-connector.service` is disabled, inactive since 2026-09-05 21:54 UTC,
and nothing listens on 4103. Ghostlight's codex-connector library dependency is pinned
at `68fe94b`, so a kit lift does not move Ghostlight.
- **F10 CodexConnector at origin/main 3ddc12e** (2026-09-13): `src/lib.rs` 1,958,
`daemon.rs` 1,180, `provider_backend.rs` 1,463, `idunn_health.rs` 1,396, `main.rs` 188,
`deployment/idunn/recipe.toml`. Contract types: `CodexProviderRequest` lib.rs:76-94,
`CodexInputItem` :212-229 (UserText, AssistantText, ToolCall, ToolResult; no
reasoning item), `CodexTransportInvocation` :238-245 (no `max_cost_usd`),
`CodexTransportOutcome::Completed` :449-462 (tokens, no cost), `CodexRefusal`
:464-474 (no `Budget`). Schema ids `gamecult.codex.*.v2` lib.rs:51-55.
- **F11 gamecult-ops Epiphany tooling, before the teardown** (`git ls-files | grep -i epiphany`, 7e23387):
`compose/epiphany.capstone-17.yggdrasil.yaml` 38, `compose/epiphany.yggdrasil.Dockerfile` 55,
`runbooks/epiphany-yggdrasil-deploy.md` 196, `runbooks/epiphany-starfire-bifrost-crossing.md` 101
(live crossing binding, kept), scripts `bootstrap-epiphany-yggdrasil.sh` 134,
`check-epiphany-yggdrasil.sh` 136, `construct-epiphany-image-yggdrasil.sh` 91,
`deploy-epiphany-yggdrasil.sh` 499, `deploy-epiphany-capstone-17-transaction-yggdrasil.sh` 5,
`deploy-epiphany-capstone-17-yggdrasil.sh` 79, `epiphany-capstone-17-connector-bridge-yggdrasil.sh` 50,
`provision-epiphany-provider-health-yggdrasil.sh` 116, `seal-epiphany-capstone-failure.sh` 67,
`test-deploy-epiphany-yggdrasil-order.sh` 144, `test-epiphany-container-promotion.sh` 47,
`systemd/epiphany.service` 31, `systemd/epiphany-swarm.service` 34; kept for the mouth
cut: `allow-starfire-epiphany-persona-permit.ps1`, `bifrost-authorize-epiphany-release.sh`,
`configure-voidbot-epiphany-feedback-target-yggdrasil.sh`. Inventory prose:
`inventory.md:581-588` (Starfire as Epiphany body), `:726-730` (archived Verse residue),
`:773-785` (intended Epiphany deployment body). `docs/repo-census-2026-09/` is history.
- **F12 Eureka repo (forge main 0bb414d)** carries the charters and doctrine (PR #3
landed). Epiphany citations remain: `README.md:63,86-87,95`, `SKILL.md:3,8-9,146`,
every charter's line 14 ("Self-improvement law (Epiphany `epiphany_doctrine.md`)"),
`agents/hands.md:28`, `agents/soul.md:48`, `agents/life.md:24`, `doctrine/persona.md:3,13`,
`doctrine/CLAUDE.md:31,229,233`, `doctrine/colossus.md:47,51` (lore, kept).
- **F13 eureka-substrate specs written against Epiphany.** `cut-mind-authority.r1` and
`cut-run-kind.r1` have repo `GameCult/Epiphany`, base `ef956865`;
`cut-huginn-persona-state.r2` base `bf73c42`; `cut-doctrine-persona-in-huginn.r2`
gamecult-ops base `2aeb7364`. None has a report. Since `leaf-into-huginn` they point at
a repo nothing builds from; `mind-authority` and `run-kind` have r2 specs against Huginn
(see Undone).
- **F14 Discord developer policy** on training with message content: the policy page
(support-dev.discord.com article 8563934450327) answered 403 to a fetch on 2026-10-08.
Self's recollection, unverified: the policy forbids using message content obtained
through the API to train AI models without express permission. An Eyes pass must
verify before question `persona-trace-retention` is ruled.
- **F15 Selection order is admission ordinal.** CultLib `packages/cultnet-rs/src/selection.rs:1998-2005`
(`order_rows`: ordinal, then schema id, then record key; reversed when descending). So
"newest" is `descending: true, limit: 1`, and a run label needs no order of its own.
- **F16 Huginn's leaf holds `leaf-key-bound`.** `crates/eureka-pipeline/src/lib.rs`
at `afc35f9`: `SUBJECT_LOCAL_MAX` (:898), `RESOLUTION_LOCAL_MAX` derived from it (:912),
`Sha::names_same_commit` (:272). The literal `64` at :915 (the root bound in the
fits-`Short` assert) is follow-up `eureka-substrate:follow_up:leaf-bound-hygiene`.
`leaf-key-bound` landed at Epiphany `ef956865` and came in with the leaf.
- **F17 The live Huginn release is still `107552dc`.** Read-only `ssh yggdrasil readlink
/opt/gamecult/huginn/current` on 2026-10-09: `releases/107552dc4b27b8856b043616ae74c2ebe7908b66`.
Main (`afc35f9`) is ahead of it by the leaf move and the relicense; no deploy has happened since.
- **F18 At Huginn `df7507b` nothing stops a unit of hers.** Read from `git show df7507b:`
on 2026-10-09 (Imagination `imagination-brake-stop`). `crates/mind-body` holds
`control.rs`, `cli.rs`, `main.rs` and `lib.rs`. `cli::run` (cli.rs:40-61) dispatches `show`,
`brake hold`, `brake release` and `dial set`. `brake hold` is `ControlWriter::open(&path)?.set_brake(false, ..)`
(cli.rs:53) and does nothing else. `git grep systemctl` over `crates/mind-body` finds nothing.
The binary sets umask 077 and calls `cli::run` with the root `CONTROL_ROOT` (main.rs:21-37).
The window probe runs the real binary with `brake release` and `brake hold` 100 times
(tests/control.rs:573-581), so a hold that ran `systemctl` would run it in the verify container.
No `launch.rs` exists yet: the Launcher is cut mind-launch. RunTurn and RunOperator carry
`NAMES` (crates/eureka-pipeline/src/lib.rs:507-508).
- **F19 Yggdrasil has no unit, user or control store of hers.** Read-only `ssh yggdrasil`
as `gamecultadmin` on 2026-10-09:
- `systemctl list-units --all 'mind-*'` and `list-unit-files 'mind-*'` both list nothing.
- `ls /etc/gamecult/minds` gives "No such file or directory". `command -v mind-control`
finds nothing. `id mind-eureka` gives "no such user".
- The host runs systemd 257 (257.13-1~deb13u1). `systemctl --help` lists
`stop UNIT...` and "--no-block Do not wait until operation finished", so a stop
waits by default.
- `systemctl stop --no-ask-password 'zz-probe-none@eureka:*.service'` as non-root returned 0:
a glob that matches no loaded unit is a no-op. `systemctl is-active 'huginn*.service'`
matched by glob (`active`).
- Operators act through `sudo`: the gamecult-ops runbook `huginn-yggdrasil.md:86` uses
`sudo systemctl stop huginn`, and `/etc/sudoers.d/` holds `90-gamecultadmin`.
- **F20 The ruling decides when the stop happens.** Ruling `eureka-body:ruling:self-run-actuator` says:
"Holding the brake stops running units (systemctl stop; SIGTERM exits 143 with the turn
unfinished, section 1.4)". It cites the OpenClaw inbox incident: a stop sent as a message
was not acted on in time, and the process was killed at the host (prior-art file
lines 323-325, secondary). Cut mind-wake r2 has the waker return `Held` before any query,
admission or unit call, and lists "the waker ... ending a live run" among its forbidden writers.
## The model page (step 0b)
One row per persistent kind this body introduces or changes. Rows for the thirteen
pipeline kinds are in Huginn `docs/eureka-substrate-map.md`.
| Kind | Identity (what names it) | Lifecycle (what happens over time) | Authority (who decides) |
| --- | --- | --- | --- |
| Pipeline wire ids | `epiphany.pipeline.<kind>.v2`, epoch `epiphany.pipeline.epoch.v2`, defined by the leaf, the Huginn crate `crates/eureka-pipeline` (lib `eureka_pipeline`), ids unchanged. | Renamed once to `eureka.pipeline.<kind>.v3` by one `mind.redb` migration, at the next breaking leaf change or before the first hosted mind (ruling `wire-names-rename-before-hosting`). Adding the `run` kind or the `Mind` authority variant is additive (old stored documents decode; no migration), so it does not trigger the rename; a field added with the leaf's `= absent` marker is additive too (leaf-read-anchors r2: old bytes decode, empty fields encode byte-identically, `golden/envelopes.txt` gains lines and loses none); a field added any other way would. | Huginn owns the leaf. The migration is a live-mind upgrade, which is the operator's (`mind-rules-which-forks`). |
| Leaf crate and schema catalogue | Huginn `crates/eureka-pipeline`, `schemas/cultnet/` (13 pipeline schemas, `gamecult.persona_state.v0`, index, README). `epiphany.work_organ_state.v0` dies: no reader outside Epiphany (grep, F1/F3). | Landed at Huginn `afc35f9` (leaf-into-huginn). Wire pinned by `crates/eureka-pipeline/golden/envelopes.txt` and the opt-in `stored_documents_read_back`. Huginn is AGPL-3.0-only (ruling `eureka-body:ruling:leaf-relicensed-agpl`). | Huginn. Forbidden: any Cargo source resolving into GameCult/Epiphany (`nothing-runs-from-epiphany`). |
| `run` | `<instance>:run:<label>` (cut-run-kind r2). Label `mind-<YYYYMMDD>T<HHMMSS><mmm>Z` from mind-launch's `run_label`; two launches in one millisecond produce the same key with different content, which admission answers `Conflict`, so the name stays injective. Order is admission ordinal (F15), not label. | Each wake opens a PersonaTurn run with no claims (ruling `eureka-substrate:ruling:every-wake-a-run`); the Persona tool opens SelfRun runs with claims; both go through `open_and_launch`, and the unit starts only after the run commits (the run is the grant). The Self in a unit admits under its label and ends it `Recorded { reason }`. The waker withdraws a run whose unit is not alive past a 120 s grace (replaces the 24 h rule). Cadence comes from the newest PersonaTurn run's `admitted_at`, found through the `turn` and `operated_by` aliases, not `started_on` (a date cannot carry seconds). | Opening: `open_and_launch`, called by the waker for PersonaTurn and by the Persona tool for SelfRun. Ending: the Self that worked it; the waker only withdraws dead ones. Concurrency of live runs: at most one in-force SelfRun of hers per instance; `open_and_launch` answers `Busy` to a second (ruling `one-live-self-run`, cut mind-launch r2). A unit stopped by a brake hold leaves its run in force until the waker's first sweep after release. Forbidden: Hands, Soul, Imagination, Life. |
| Repetition breaker | No state of its own (rulings `self-waker`, `merge-gate-own-soul`). Trip condition derived from the item's ended SelfRun runs: last 3 empty, or 10 of the last 50. A run is empty when no non-run document citing the item has an ordinal in its window (its admission up to the next run's, or now). | Evaluated in `open_and_launch` when a Self run claims the item, not by the waker. When tripped, it admits one `question` labelled `breaker-<item local>` under the item's campaign, `raised_in` the item, and launches nothing; the existing blocked-spec recipe then removes the item from the queue. Answered by a ruling or withdrawn; either reopens the item. | `open_and_launch` admits the question; any Self may answer it (substrate-internal, `mind-rules-which-forks`). |
| Brake | One document per instance in a root-owned CultCache store `/etc/gamecult/minds/<instance>/control.cc`, type `eureka.control.brake.v1 { released: bool, set_at, set_by }`. | Replaced whole by the operator's CLI; never appended. Absent or undecodable reads as held. `mind-control brake hold` writes it held and then, in the same command, stops her running units: `systemctl stop` (blocking) over `mind-self@<i>:*` and `mind-persona@<i>:*`, through `SystemdLauncher::stop_all` (cut brake-stop; ruling `self-run-actuator`; F18-F20). | Operator only (ruling `brake-dial-root-store-now`); her units read it, and the file is not writable by any user she runs as. The hold is the one stopper of her units. |
| Burn-rate dial | Same store, `eureka.control.burn_rate.v1 { heat, base_cooldown_s, base_run_usd, set_at, set_by }`; `heat` in 0.05..=2.0. | Replaced whole by the CLI. Absent or out of bounds reads as heat 0, which launches nothing (fail closed, LiteLLM scar rider of ruling `connector-owner`). Schedules and her own rest arrive later as follow-up `burn-schedule-and-rest`. | Operator. Derived (never stored): wake cadence `base_cooldown_s / heat`, per-run cap `--max-budget-usd = base_run_usd × heat`, per-request `max_cost_usd`. |
| Connector request and transcript items | Request: `(caller_runtime_id, request_id)`, the replay key the daemon already keeps (`replay.cc`). Items: UserText, AssistantText, ToolCall, ToolResult, plus `ReasoningState { provider, model, opaque }` (ruling `connector-opaque-state-item`). Contract ids become provider-neutral `gamecult.model.*.v3` (follow-up `connector-contract-untyped`); the connector serves Ghostlight too, so not `eureka.*`. | Invocation expires at `expires_at_unix_ms`; replay record per key; restart-era `Indeterminate`. The caller stores the transcript and replays it verbatim; foreign-tagged reasoning state inside an in-flight tool exchange is refused typed; completed-turn foreign state is settled per provider in the connector cut (follow-up `connector-reasoning-state-cheap-providers`). | The connector produces, reads or refuses reasoning bytes; callers never branch on provider. |
| Connector spend ledger | `gamecult.model.caller_spend.v1` keyed by caller runtime id and window start, in each daemon's state root. | Rolled per window; refusal `Budget` at the cap; durable, and a missing ledger refuses the request. | Each daemon writes its own; the root caller config sets the cap. |
| Persona turn traces | **Empty: question `persona-trace-retention`.** Candidate: per turn, the request digest, the transcript items and the typed output, keyed by the turn's run. | Empty: how long they are kept, whether Discord-sourced content may enter a training export (F14). | Empty: who may export them. |
| Persona state | `gamecult.persona_state.v0`, one per mind, `personaId` = instance (cut-huginn-persona-state r2, eureka-substrate). | Replaced whole under CAS with a receipt; she may rewrite any field (`identity-write-all-visible`). | The Persona organ is the only writer. |
| Identity diffs | The pair of receipts of two consecutive Persona puts whose identity fields (publicName, publicDescription, presentation, values) differ. Derived, not stored. | Composed by the Persona organ at put time and sent as one delivery request through the crossing; a failed post is retried by Bifrost's delivery journal, not by her. | Persona organ composes; Bifrost posts under the permit. No rate limit. |
| Discord body surfaces | Outbound: crossing ids `epiphany.persona_discord_delivery_request.v0` and `..._permit.v0`, agent `epiphany.Persona`, runtime `epiphany-starfire` (F6), renamed to `eureka.*` and `eureka-yggdrasil` in the mouth rebinding (`mouth-crossing-on-yggdrasil`). Inbound: Bifrost persona-feedback deliveries for target `epiphany` (F6). Persona-session tools reach both (`body-includes-discord`). | Request, permit, post, receipt (Bifrost journal). Inbound deliveries: **unprobed** who records that a delivery was answered; `run-is-the-grant` forbids her organ from holding that fact. Blocks the Persona cuts only, not the cuts admitted today. | Bifrost owns posting and delivery records; her permit issuer grants while the brake is released. |
| Units and instance templates | `mind-wake@<instance>.timer/.service`, `mind-self@<instance>:<label>.service`, `mind-persona@<instance>:<label>.service` (one-shot per Persona turn; `RuntimeMaxSec` set at install bounds a hung unit), `mind-permit@<instance>`; users `mind-<instance>` (organs) and `mind-<instance>-self` (Self runs); state `/var/lib/gamecult/minds/<instance>/`; control `/etc/gamecult/minds/<instance>/`. Instance `eureka`. | Hand-installed by gamecult-ops now; Idunn targets declared before the first hosted member, which deletes the hand install (`mind-units-templated-interim`). | gamecult-ops installs; Idunn later. Starting: `open_and_launch` through `SystemdLauncher::start`, as her users, who are granted start only. Stopping: only the operator's `brake hold`, as root (cut brake-stop). The unit-level brake gate and the start-only grant are follow-up `mind-units-brake-gate`. None of this exists on Yggdrasil yet (F19). |
| Self-run credential | `CLAUDE_CODE_OAUTH_TOKEN` in a root-0600 EnvironmentFile per instance. | Created by `claude setup-token`; rotated by the operator. | **Open: question `self-run-token-reach`.** The Self run's `claude` process can read its own environment, so `token-out-of-her-reach` holds only if the operator names this unit (F4 of the prior-art file, follow-up `token-reach-two-units`). |
| Wake frame | Fixed prompt frame (provenance, jurisdiction, brake obedience) in `/etc/gamecult/minds/<instance>/wake-frame.md`, root-owned. Composed by the Persona organ from host config; the waker passes the unit only the instance and the run label. | Changed only by an install. | Host config (ruling `self-waker` rider 2); never a file her runs merge into. |
| Epiphany residue | F5, F8, F11, as they stood before the teardown. | Teardown landed (gamecult-ops `9c12adb`); what it did not name is follow-up `eureka-body:follow_up:epiphany-body-leftovers`; the repo is archived last. | gamecult-ops for host and repo tooling; Idunn for its legacy target list (follow-up). |
## Rationale
### Why the order is leaf, teardown, control, wake
The four specs admitted today depend on nothing the operator has to rule except the
wake target. `leaf-into-huginn` removed the only build edge into Epiphany and is the
base every Huginn-side body cut needs (the `run` kind re-pointed, Persona state, the
v3 rename); it landed at `afc35f9`. The teardown removed the 24.7 GB (F5) and the tooling that would otherwise be
re-read by every later pass; it landed at gamecult-ops `9c12adb`. The control store comes before the waker because the
waker's first rule is "read the brake before any consequence". The waker raises
`wake-target`, because the operator's 2026-10-03 ruling (`body-includes-discord`, "the
Persona session, which is also what drives the Self") and the Defaulted `self-waker`
("starts at most one Self run") read differently.
### One crate for her organs
Her organs live in Huginn's workspace (`organ-homes-huginn`). They share the control
reader, the client and the instance templating, and they deploy together. So they are
one crate, `mind-body`, with one binary per earned process (`mind-control` for the
root CLI, `mind-wake`; the Persona organ and permit issuer later), not a crate per
organ. The crate name is instance-generic because the units are templates.
### Who stops her units when the brake is held
Ruling `self-run-actuator` says holding the brake stops her running units. Three cuts each
held part of that and none held all of it (finding
`cut-mind-control-store.s1.brake-hold-stops-no-units`). The control-store CLI writes the brake.
mind-launch owns the unit actuator, which had start and alive. mind-wake reads the brake. The
stop now has one owner: the operator's `mind-control brake hold`. It writes the brake held
and then, in the same command, runs `SystemdLauncher::stop_all`, a blocking `systemctl stop`
over the instance's `mind-self@` and `mind-persona@` units (cut brake-stop).
- **Synchronous, not on the waker's next tick.** The ruling's own precedent is a stop that
had to happen at the host. A stop sent as a message was not acted on in time (F20). The
waker's next tick comes one timer interval later, and mind-wake r2 already keeps the waker
away from units while the brake is held. Prior art agrees. `systemctl stop` waits for its job
unless `--no-block` (F19). `kubectl drain` cordons the node and then evicts its pods.
`supervisorctl stop` waits through `stopwaitsecs` and then kills. In each, the operator's
command does the stop; no reconciler's next pass does.
- **Write first, then stop, and stop even if the write failed.** This is cordon before drain.
A unit that starts after the write must already see the brake held. Stopping is always the
safe direction, so a failed write does not skip it.
- **Privilege.** The hold runs as root because the store is root-owned, and root needs no polkit
rule to stop a system unit. Her users get start only (follow-up `mind-units-brake-gate`), so no
organ of hers can stop or restart around the operator.
- **Stop is not on the Launcher port.** `stop_all` is a method on `SystemdLauncher` itself, called
only from `main.rs`. Code that holds a `Launcher`, such as `open_and_launch` or the waker,
cannot reach it. The stop patterns come from the same templates as start, so the units
stopped are exactly the ones started.
- **Not a mind client.** A Self run killed by a hold cannot record its own end. Its run stays in
force until the waker's sweep after release withdraws it, so the operator's CLI never talks
to the mind.
- **One race the CLI cannot close.** A launch can read `Released`, then the hold writes and stops,
then the launch starts its unit. The unit's own `ExecCondition=` on the brake closes that, so
the gate belongs with the units install (follow-up `mind-units-brake-gate`), not in a second
stopper.
- **Idunn.** Her Self and Persona units are one-shot jobs. Idunn's continuity restarts installed
daemons, so stopping one of these jobs is not a continuity decision. When Idunn targets
replace the hand install, Idunn must not restart a unit the hold stopped.
### Why the kit keeps its Codex backend
Idunn's migration doc says Codex is dead (F9). The kit is lifted out of CodexConnector,
and the Codex backend's existing tests are the only proof that the lift is behaviour
neutral. Keeping the backend compiling costs nothing; deploying it is not proposed.
### Undone (not mapped this pass)
In dependency order, with what blocks each:
1. eureka-substrate re-points, admitted 2026-10-09 against Huginn: `mind-authority` r2
(landed on branch `eureka-substrate/mind-authority`, Soul pending), `run-kind` r2
(absorbs `huginn-mind-self-kinds`: `AlreadyClaimed`, the run's resolution row, the
`claims` edge; question `persona-turn-run` is ruled by `every-wake-a-run`),
`huginn-persona-state` r3, `doctrine-persona-in-huginn` r3.
`leaf-key-bound` landed at Epiphany `ef956865` and came in with the leaf (F16).
`leaf-read-anchors` r2 (absorbs `huginn-read-anchors`, withdrawn), `ops-read-anchors-upgrade`
r2 and `context-pack-reads` r2 were admitted 2026-10-09; `leaf-read-anchors` depends on
`mind-authority` merging.
2. `connector-kit-lift`, `connector-spend`, `connector-reasoning-item`,
`connector-contract-v3`, `claude-connector`, `openai-compatible-connector`: blocked
on the kit repo joining the campaign (follow-up `body-campaign-repos`).
3. `self-run-unit` and `skill-mind-self` (Eureka): blocked on `self-run-token-reach`
and `wake-target`. `mind-launch` r2 (Huginn `df7507b`, unblocked: the
`one-live-self-run` ruling answered its question), then `brake-stop` r1 and
`mind-wake` r2, which both depend on it.
4. `mind-units-install` (gamecult-ops): after 3; needs `body-repos-on-forge`.
5. `mind-persona` and `mouth-rebinding` (Huginn, Bifrost): blocked on `wake-target`,
`persona-trace-retention`, the inbound-delivery cell, and the connector cuts.
6. `doctrine-repoint` (Eureka, F12), `epiphany-archive` (last).
## Admitted this pass (receipts in the mind)
Specs, in dependency order: `eureka-body:cut_spec:cut-leaf-into-huginn.r1`,
`cut-epiphany-body-teardown.r1` (independent), `cut-mind-control-store.r1`,
`cut-mind-wake.r1` (superseded by r2 on 2026-10-09).
Questions: `eureka-body:question:wake-target`, `self-run-token-reach`,
`persona-trace-retention`. Follow-ups: `eureka-body:follow_up:substrate-specs-repoint`,
`body-campaign-repos`. H9 sources exist at Epiphany ef956865: notes/huginn-organ-cut.md,
eureka-body-plane-cut.md, eureka-pipeline-state-cut.md, eureka-pipeline-state-target.md,
eureka-query-prior-art.md, eureka-read-side-cut.md, postmortem-eureka-schema-phase.md.
Huginn carries an AGPL-3.0 LICENSE and the workspace license is AGPL-3.0-only
(rulings `license-split`, `eureka-body:ruling:leaf-relicensed-agpl`).