From 570f369f408593519cec0d7c4da5b077ca3d8ea0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 1 Oct 2026 23:03:08 +0200 Subject: [PATCH] Eureka self cut map r4 (Imagination): Epiphany archived; the harvest, the connector split, nine questions re-checked Co-Authored-By: Claude Fable 5.1 --- docs/eureka-self-cut.md | 1682 +++++++++++++++++++-------------------- 1 file changed, 802 insertions(+), 880 deletions(-) diff --git a/docs/eureka-self-cut.md b/docs/eureka-self-cut.md index ae130a5..3b65a92 100644 --- a/docs/eureka-self-cut.md +++ b/docs/eureka-self-cut.md @@ -1,19 +1,22 @@ # The Mind's own Self: map -Status: map, Imagination (`imagination-self`), revision 3 of 2026-10-01, +Status: map, Imagination (`imagination-self`), revision 4 of 2026-10-01, session `self-2026-10-01b`. Campaign `eureka-substrate` in Eureka's mind (instance `eureka`). Questions, cut specs, follow-ups and rulings are typed -documents there; this page keeps body facts, the model page and rationale. -Target: `docs/eureka-substrate-target.md` (`133324a7`). Rulings this revision -rests on: `eureka-substrate:ruling:operator-means-shape-ends`, -`:operator-eureka-adopts-epiphany-body`, `:operator-this-is-epiphany`, -`:operator-provider-portable-connector`, `:operator-mind-runs-own-self`, -`:operator-mind-mission`, `:mind-self-burn-rate`, `:operator-persona-in-mind`, +documents there; this page keeps body facts, the harvest, the model page and +rationale. Target: `docs/eureka-substrate-target.md` (`133324a7`). Rulings +this revision rests on: `eureka-substrate:ruling:operator-archive-epiphany`, +`:operator-mind-runs-own-self`, `:operator-mind-mission`, +`:mind-self-burn-rate`, `:operator-persona-in-mind`, +`:operator-provider-portable-connector`, `:operator-means-shape-ends`, `:mind-rules-which-forks`, `:mind-self-merge-authority`, -`:charters-into-eureka-repo`. +`:charters-into-eureka-repo`. Superseded and no longer law: +`:operator-this-is-epiphany`, `:operator-eureka-adopts-epiphany-body` +(revision 3's premise). Revision 3 is Huginn `e16663f`; its probe record +(B1-B17, Yggdrasil units, CodexConnector and Ghostlight internals) is cited +here by section rather than repeated where nothing changed. -The operator's words, in order. The first two were the first revision's law -(both admitted as rulings; the first superseded by the second): +The operator's words, in order. Revision 1: > Eureka thinks in campaigns, right? Well, we already have a Mind campaign, and > we're adding evidence to it with every run. The design currently delegates @@ -24,7 +27,7 @@ The operator's words, in order. The first two were the first revision's law > I get it to work on the stuff I care about, like Aetheria. The Mind must > operate its own Self instance, with the goal of improving itself. -The second revision's law: +Revision 2: > I mean impersonation in the sense that there is no operational difference > between a work item dispatched on my request versus one dispatched on the @@ -41,7 +44,7 @@ The second revision's law: > shape it can have is the agency machinery we already built with voidbot. Then > she can speak for herself on Discord, and act by her Self with Eureka. -The third revision's law: +Revision 3 (the first and third of these are superseded): > I don't think this is voidbot anymore. This is epiphany. What is this if not > epiphany? @@ -57,716 +60,628 @@ The third revision's law: > shape the ends. We shape the means with the agents we're building, with > Epiphany and how we steward it. -So: Eureka is the first Mind's name (instance `eureka`, forge user `eureka`, -the forge itself). Epiphany is her body and the open project. The faculty -method (pipeline, charters, briefs, tools; today the `GameCult/Eureka` repo) -is one of her organs, not a sibling product. Where this map says "Epiphany", -read "Eureka's body"; where it says "her", read Eureka. +Revision 4's law (`operator-archive-epiphany`): -What stands from revision 1: the bloodhound observation ("RLVR-trained agents -chase the objective in front of them, steering be damned") means the Mind's -Self is a second agent whose only objective is the Mind, not a rule added to -the operator-facing Self. What stands from revision 2: the waking organ is a -Persona with initiative pressure, memory and a mouth, who dispatches her own -Eureka Self when her pressure says so; the timer is dead. What revision 3 -changes: the organism is Epiphany. Her resident Self (`epiphany-swarm`), her -native Persona (`epiphany-persona-service`, Projector, Persona, Interpreter), -her permit issuer and her typed Discord crossing are the body. VoidBot's -scheduler, Interpreter prompt, registry and heat dial are demoted to prior art -(B7). Model access goes through one typed connector daemon with Claude Code -print mode as one provider behind it (B13-B14). The Persona document in Huginn -stays the one Persona state; Epiphany reads and writes it (B15). +> I think the clean cut is to archive Epiphany. Eureka absorbed her in the +> womb as fetuses sometimes do. + +And a direction on the connector, relayed by the Self this revision, not yet +admitted as a ruling (question `connector-owner` carries it): + +> Btw CodexConnector should be the codex connector, like it says on the tin. +> We'll want a Claude compatible connector beside it with shared machinery +> lifted out, as well as the other options available to Ghostlight. + +So: Eureka is the organism and the open project. Her Mind is Huginn (instance +`eureka`), her method is the faculty pipeline (the `GameCult/Eureka` repo), +and her body is whatever of Epiphany still lives, harvested into Eureka's own +repos before Epiphany is archived. Nothing stays alive in Epiphany. Where this +map says "her", read Eureka. + +What stands from revision 1: the Mind's Self is a second agent whose only +objective is the Mind, not a rule added to the operator-facing Self. From +revision 2: the waking organ is a Persona with pressure, memory and a mouth, +who launches her own Eureka Self when the Mind's queue says so; no timer +manufactures turns. From revision 3: one typed connector contract in the +Ghostlight tradition; Persona state in Huginn as one document; the Discord +mouth is the live permit crossing; the GCLP attachments. What revision 4 +changes: Epiphany is a harvest source, not a body. Her resident Self and +Persona service are not moved as code; what lives of them (the no-replay +rule, the crossing and permit modules, the Interpreter's typed output) is +rebuilt small inside Huginn's workspace. The `epiphany-pipeline` leaf and the +schema catalogue move into Huginn first, because the live mind is built from +them. The model adapter dies; the connector direction replaces it. Pinned heads for every fact below: | Repo | Ref | Commit | | --- | --- | --- | -| Huginn | `origin/main` | `bf73c42` (docs only over `a699630bbc49552fa747e9c0fabba24598fec77a`; crate line numbers hold at both) | -| Epiphany | local `main`, `F:\Projects\Epiphany` (clean) | `4006b14bf29b49410bd18b43acb4d42c3c4e2443` (2026-09-30). Huginn's leaf pin is `ef956865`; the two differ only in notes and the leaf's CultLib pin. | -| CodexConnector | `main`, `F:\Projects\CodexConnector` | `65192892f0ed829b8a228eabba44a4f3ba0f7268` (2026-09-04; frozen since) | +| Huginn | `main`, `F:\Projects\Huginn` | `e16663f` (docs only over `a699630b`; crate line numbers hold) | +| Epiphany | `main`, `F:\Projects\Epiphany` (clean; GitHub `GameCult/Epiphany`) | `4006b14bf29b49410bd18b43acb4d42c3c4e2443` (2026-09-30). Huginn's leaf pin is `ef956865`; `git diff ef956865 HEAD -- epiphany-pipeline schemas` is 58+/227- in `lib.rs` only. | +| CodexConnector | `main`, `F:\Projects\CodexConnector` | `65192892f0ed829b8a228eabba44a4f3ba0f7268` (frozen since 2026-09-04) | | Ghostlight | `main`, `F:\Projects\Ghostlight` | `eeb3a68` (2026-09-23) | -| Bifrost | `main` `F:\Projects\Bifrost`; release on Yggdrasil `cb3239aa-f67f5122` | `160fac2` (2026-10-01) | +| Bifrost | `main`, `F:\Projects\Bifrost`; release on Yggdrasil `cb3239aa-f67f5122` | `160fac2` (2026-10-01) | | gamecult-ops | `main` | `2aeb7364fffcd404aada28bfd30fb4e5c753cf53` | | Eureka skill | `main` (checkout `~/.claude/skills/eureka`) | `b260fbeec6d96ff06882ed9c37d3e1204c424e99` | -| VoidBot | `main`, working tree `F:\Projects\VoidBot` (clean) | `46d891b` (2026-09-13) | -| Idunn | `main` | `6667f0f` (2026-10-01) | +| VoidBot | `main`, `F:\Projects\VoidBot` (clean) | `46d891b` (2026-09-13) | +| epiphany-graph-rs | `main`, `F:\Projects\epiphany-graph-rs` | `07cd7c1` | -Probes of revision 1 ran from Starfire 2026-10-01 18:40-19:10 UTC; revision 2 -(B7-B10) 19:40-20:10 UTC; revision 3 (B11-B16 and the re-checks in B3, B5) -after 20:15 UTC, from Starfire over `ssh ygg` (read-only; `sudo -n` only for -`ls`, `cat` of deployment records and `journalctl`). Repo facts for Epiphany, -CodexConnector and Ghostlight come from two Explore passes over the working -trees (nothing built, nothing run) and my own reads. `lib.rs` is -`epiphany-pipeline/src/lib.rs`. +Revision 4 ran no host probes; its new facts are repo reads (Epiphany +workspace, Huginn workspace, gamecult-ops tree, Bifrost grep, doctrine files) +made 2026-10-01 after 20:40 UTC. Yggdrasil facts are revision 3's (B3, B5). ## Body facts -### B1. The Mind (Huginn on Yggdrasil) +### B1. The Mind (Huginn on Yggdrasil): unchanged from r3 -- `whoami` (revision 3): instance `eureka`, endpoint `rudp://10.77.0.1:17872`, - reachable, 422 documents, 133 receipts, index `Current`, epoch - `epiphany.pipeline.epoch.v2`. -- `huginn.service` (probe: `systemctl cat`): user `huginn`, - `--bind 10.77.0.1:17872`, hand-managed ("interim unit until Idunn owns it"). - `ss -lunp` shows the socket only on the WireGuard address `10.77.0.1` - (`wg-gamecult`). So the mind is reachable from Starfire over the mesh and - from Yggdrasil itself, and from nowhere else. -- Campaigns in the mind: `idunn-watchdog` and `eureka-substrate`. - `eureka-substrate`'s repos are `GameCult/Huginn`, `GameCult/Epiphany`, - `GameCult/Eureka`, `GameCult/gamecult-ops`; a campaign has no resolution and - no revision, so a CodexConnector or Bifrost cut cannot be a `cut_spec` under - it (B16). Its target r1 lists "Persona-state reading in Huginn" under - `not_in_scope`; the Persona ruling contradicts that line (proposed r2 in the - rationale). -- Kinds: thirteen (`lib.rs:760-790`). None records a Self session, a claim on - a spec, a burn rate, Persona state or a landing (`gap-landing-untyped`). -- `RulingAuthority { Operator, Standing, Defaulted }` (`lib.rs:458`); a unit - enum variant added by name is a widening (map `eureka-substrate-map.md` B1). -- `Faculty` has `Operator` and `SelfFaculty` (`rows.rs:42`); admission does not - check faculty (`gap-faculty-attribution`). Nothing in the mind today can tell - the Mind's Self from the operator-facing Self except the `session` label on - the receipt; follow-up `operator-authority-needs-operator-credential`. -- Instance-rooted kinds are the pattern for a run record (`lib.rs:913-946`; - Huginn admission for `hand_off` at `admission.rs:231-262, 328-330`). -- **The Rust client exists.** `crates/eureka-state` is a library plus a binary: - `HuginnClient { endpoint, instance, timeout }` with one method - `call(HuginnMindRequest) -> Result` over - `cultnet-rs` RUDP, resolving `Deferred` bodies (Huginn Cut 13a, merged - `33641f4`; `notes/huginn-organ-cut.md:447-456, 474-482`). Epiphany is Rust, - so it reaches the mind through this crate as a git dependency on Huginn. No - TypeScript client is needed by this design (revision 2's `huginn-ts-client` - is withdrawn). +Instance `eureka` at `rudp://10.77.0.1:17872`, 463 documents at `as_of` 140; +thirteen kinds; `RulingAuthority { Operator, Standing, Defaulted }`; +`HuginnClient` in `crates/eureka-state` (library plus binary). Huginn's +workspace is three crates: `huginn-mind`, `huginn-daemon`, `eureka-state`. +`huginn-mind/Cargo.toml:22` pins `epiphany-pipeline` as a git dependency on +`GameCult/Epiphany` at `ef956865`; `epiphany_pipeline` is named in 20 Huginn +source files (66 uses). CultLib pins: Huginn `8fc74c7` on all three crates; the +leaf pins the same `8fc74c7` (Epiphany `73edee5c`); Epiphany's root and core +pin `a0813c6e`. So the leaf and Huginn already share one CultLib; only the +git edge to Epiphany is in the way. -### B2. Claude Code on Starfire: auth, headless mode, usage +### B2. Claude Code on Starfire: unchanged from r3 -- `claude --version`: 2.1.268. Account (`~/.claude.json` `oauthAccount`, - secrets not read): Max plan, `billingType: stripe_subscription`, rate-limit - tier `default_claude_max_20x`, extra usage off. No API key: every model call - the Persona or her Self makes spends the operator's subscription quota. -- The interactive OAuth access token lives eight hours - (`~/.claude/.credentials.json` `expiresAt`); a running subagent does not - survive the parent's token expiring (`401 OAuth access token has expired`, - this session's transcript). -- `claude setup-token` makes a long-lived subscription token read from - `CLAUDE_CODE_OAUTH_TOKEN` (61 references in the binary). This is the - headless credential. Its lifetime and revocation are the operator's. -- The token reaches `claude` as an environment variable, so the agent inside - that process can read it with one shell call. What protects it is the reach - of the user it runs as, not secrecy from the agent (revision 2 demotion). - Revision 3 narrows where it lives: the connector daemon's user (B14) and the - Self-run unit's user (B12), never Epiphany's own user. -- Print mode: `claude -p` with `--output-format json|stream-json`, - `--json-schema`, `--agents `, `--mcp-config`, `--allowedTools`, - `--permission-mode`, `--max-budget-usd `, `--bg`, `--resume`, - `--fallback-model`. The `json` output carries `total_cost_usd` and usage. The - Claude Agent SDK (Ghostlight's sidecar, B13) exposes the same: per-model - `modelUsage`, `total_cost_usd` as a client-side estimate, and a - `MaxBudgetUsd` fault, so a per-request spend cap is enforced by the provider - child itself. -- Plan usage as data: readable only through the desktop app's `get_usage` - (`gap-usage-not-typed`, in force). The CLI binary knows no usage endpoint. - **There is no typed reading of plan usage reachable from Yggdrasil.** The - connector's cost field (B14) is an estimate summed per caller, not the plan. -- Local scheduled tasks and cloud routines: dead for this purpose (revision - 2: workstation load budget, no overnight burns, off-mesh, no forge key). +Max plan, no API key; `claude setup-token` is the headless credential; print +mode flags including `--max-budget-usd`; no typed plan usage reachable from +Yggdrasil (`gap-usage-not-typed`). Local scheduled tasks and cloud routines +are dead for this purpose. -### B3. Yggdrasil: what runs, what is dead, and whose body it is +### B3. Yggdrasil: what runs, what dies with Epiphany -`systemctl list-units --all` for `epiphany* codex* ghostlight* huginn* -bifrost*` (revision 3): +From r3 B3, now read as a deletion list rather than a body to rebuild: -| Unit | State | Note | +- Dead Epiphany units: `epiphany.service`, `epiphany-swarm.service`, + `epiphany-heartbeat.service` (enabled, dead; the first and third have no + source at head), `epiphany-model-connector.service` (disabled, dead, source + extracted into CodexConnector 2026-08-24). Release roots `/srv/epiphany/app`, + `/srv/epiphany/source`, `/srv/epiphany-model-connector`. State root + `/var/lib/gamecult/epiphany` (user `epiphany`, 988; Codex home, workspace, + runtime store `mind.cc`). Config `/etc/gamecult/epiphany` (Bifrost feedback + anchor, empty `mcp.toml`, root-only `credentials/`). Idunn targets + `epiphany` and `epiphany-model-connector` with the Aug 22 recipe at + `/srv/odin/deploy-manifests/epiphany`. Users `epiphany`, `epiphany-model`. + All of it is the deletion line of `mind-self-wake` r4; none of it is a + harvest item (the runtime store's Persona memory is superseded by B11). +- gamecult-ops carries the matching dead tooling: `systemd/epiphany.service`, + `systemd/epiphany-swarm.service`, `runbooks/epiphany-yggdrasil-deploy.md`, + `runbooks/epiphany-starfire-bifrost-crossing.md`, and the scripts + `bootstrap-epiphany-yggdrasil.sh`, `deploy-epiphany-yggdrasil.sh`, + `check-epiphany-yggdrasil.sh`, `construct-epiphany-image-yggdrasil.sh`, + `deploy-epiphany-capstone-17*.sh`, `epiphany-capstone-17-connector-bridge- + yggdrasil.sh`, `provision-epiphany-provider-health-yggdrasil.sh`, + `seal-epiphany-capstone-failure.sh`, `test-deploy-epiphany-yggdrasil-order.sh`, + `test-epiphany-container-promotion.sh`, `bifrost-authorize-epiphany-release.sh`, + `configure-voidbot-epiphany-feedback-target-yggdrasil.sh` (grep + 2026-10-01). `inventory.md:581-588, 726-785` describes the Starfire cognition + body and the "intended Epiphany deployment body (not installed)". These are + deleted or rewritten in the same cut. +- What stays: `huginn.service`, the Bifrost units (`bifrost-persona-feedback`, + `bifrost-persona-mouth`, the watchdog timer), `codex-connector.service` as a + dead unit until the connector cuts land, the `gamecult-model` group and its + key files, user `codex-connector`. +- Linux users for her: none exist (`eureka-mind` absent in r3's probe). She + needs `eureka` (body organs: waker, Persona organ, permit issuer; state root + `/var/lib/gamecult/eureka`) and `eureka-self` (the Self-run unit holding the + token); the connector daemons keep their own users. + +### B4. The forge and the Mind's identity: unchanged except the body's names + +Forge user `eureka`, team `minds`, key `eureka@starfire`, no branch protection +yet. The body's identifiers r3 kept under "Epiphany names her body" (Linux +user `epiphany`, runtime id `epiphany-yggdrasil`, Persona agent id +`epiphany.Persona`) lose their reason: the Linux user and runtime id are +values she sets herself (`eureka`, `eureka-yggdrasil`); the agent id and the +crossing's document type ids are Bifrost-side constants (question +`wire-names`, B9). Repos on the forge: Huginn and Eureka are the ones she +lands code in; Epiphany never goes to the forge (follow-up +`body-repos-on-forge` narrows to Huginn). + +### B5. The operator's channel and the Persona's mouth: contract unchanged + +The live crossing (r3 B5) is Bifrost's: `bifrost-persona-mouth.service` admits +a signed `epiphany.persona_discord_delivery_request.v0` from the configured +runtime id, asks the permit issuer at the configured RUDP endpoint for a fresh +`epiphany.persona_discord_delivery_permit.v0`, posts through the bridge CLI as +`epiphany.Persona`, receipts. Bifrost names these in ten files (19 +occurrences: `tools/persona-discord-delivery-documents.mjs`, +`persona-discord-delivery.mjs`, `persona-discord-permit.mjs`, +`persona-discord-rudp.mjs`, `persona-feedback.mjs:90`, `bifrost-bridge.mjs`, +`docs/bridge.md`, three test files). The runtime id, endpoints and anchors are +flag values and root files; the type ids and the agent id are code. The +Epiphany side of the contract is two modules and one 38-line binary +(`epiphany-core/src/persona_discord_crossing.rs` 535 lines, +`persona_discord_permit.rs` 524, `bin/epiphany-persona-discord-permit.rs`), +depending on `ed25519-dalek`, `cultcache-rs`, `cultmesh-rs` (the brake +document) and the core's runtime store for the effect document it signs over. +That is the harvest item H5. Inbound feedback (`bifrost-persona-feedback` +outbox deliveries) is unchanged and already Bifrost-native. + +### B6. Scheduling today, and what the skill derives: unchanged + +The recipes derive the queue; the `run` kind carries claims and ends; the +dial is the fourth missing fact. Who reads the queue to wake her: the waker +of B10, through `HuginnClient`. + +### B7. VoidBot: what `operator-persona-in-mind` now means + +With `operator-this-is-epiphany` superseded, the ruling's words are the +nearest law on the Persona's shape: "the agency machinery we already built +with voidbot". Revision 2's probe stands: VoidBot's scheduler and initiative +engine are paused since 2026-07-16 on the pressure-replay defect; its +Interpreter prompt parses `SAY` / `STATE NOTE` text blocks by rules; its +registry is a JSON file; it is TypeScript over Postgres and a Discord bot. +What is borrowed from it is unchanged: the `gamecult.persona_state.v0` schema +(zod types, projector, `persona:migrate-portable` as the seed path). What is +not borrowed: the scheduler, worker, Postgres queue, bot and providers (the +machinery has the defect the `run` claim removes, B10, and a second Discord +identity outside the permit). The ruling's direction is served by shape, not +by code: she has a Persona document, pressure, a mouth and a Self she +dispatches, which is what VoidBot's machinery was for. Whether that is the +reading the operator meant is question `persona-turn-runtime`'s third option. + +### B8. The `epiphany-pipeline` leaf and the schema catalogue (harvest H1, H2) + +- `epiphany-pipeline` (2,836 lines incl. tests; `Cargo.toml` deps `anyhow`, + `chrono`, `cultcache-rs 8fc74c7`, `rmp-serde`, `schemars`, `serde`; dev + `serde_json`) exports the thirteen kinds, `PipelineRefusal`, `PipelineRef`, + `ResolutionOutcome`, `PIPELINE_SCHEMA_EPOCH = "epiphany.pipeline.epoch.v2"`, + `pipeline_key`, `validate_pipeline_write_envelope`. Inside Epiphany nothing + consumes it (grep: only its own `Cargo.toml` and a note). Its only consumer + is Huginn. Its test `pipeline_published_schemas_match_derivation` + (`lib.rs:2555-2562`) reads `../schemas/cultnet` relative to the crate, so + the fourteen `epiphany.pipeline.*.v2.schema.json` files and `index.json` + move with it. +- `schemas/cultnet/` holds 16 schema files plus `index.json` and a README: + the thirteen pipeline kinds, `gamecult.persona_state.v0` (the Persona + standard; consumers: VoidBot's zod types and projector, the standard doc, + Huginn's planned admission validator) and `epiphany.work_organ_state.v0` + (consumer search across `F:\Projects` timed out; the only known reader is + the skill's `faculty-philosophy-cut.md:101` citing it as prose; treat as + dead unless Hands finds a reader). +- The type ids carry the name: `epiphany.pipeline..v2`, + `epiphany.pipeline.epoch.v2`, and every stored document in `mind.redb` is + keyed and typed by them. The target invariant `stored-documents-valid` + forbids re-keying or re-encoding stored documents; renaming is an epoch bump + and a migration (question `wire-names`). The skill's recipes + (`references/campaign-state.md:148-304`) spell the ids out in every query. +- Unlanded Epiphany-repo specs in the mind: `cut-mind-authority.r1` and + `cut-run-kind.r1` (base `ef956865`, repo `GameCult/Epiphany`), + `cut-leaf-key-bound.r1` (base `4006b14b`; branch + `eureka-substrate/leaf-key-bound` exists on origin, not merged), + `cut-merge-epiphany-main.r1` (Cut 0a, landed: `codex/eureka-pipeline-state` + is on main). After H1 every leaf cut has repo `GameCult/Huginn`. + +### B9. What else lives in Epiphany, by directory (harvest H3-H9 and the dead) + +Line counts are `*.rs,*.toml,*.md` per directory at head. + +| Path | Lines | Verdict | | --- | --- | --- | -| `huginn.service` | active | the mind (B1) | -| `bifrost.service`, `bifrost-persona-feedback.service` | active | Bifrost alpha; the Persona-feedback provider (user `bifrost-feedback`) | -| `bifrost-persona-mouth.service` | **active** | "Bifrost authenticated Epiphany Persona Discord mouth" (B5) | -| `bifrost-watchdog-notice.timer` | active | once a minute | -| `epiphany.service`, `epiphany-swarm.service`, `epiphany-heartbeat.service` | dead (enabled) | the Aug 22 body (below) | -| `epiphany-model-connector.service` | dead (disabled) | Epiphany's first connector, Aug 24 (B14) | -| `codex-connector.service` | dead (disabled) | the standalone connector, last alive 2026-09-05 21:51 UTC, stopped on a Codex `401 token_expired` (journal) | -| `ghostlight-dungeon.service` | dead | its unit still names `GHOSTLIGHT_MODEL_PROVIDER=codex-connector` at `127.0.0.1:4103`; its code no longer opens that lane (B13) | +| `epiphany-pipeline/`, `schemas/cultnet/` | 2,836 + schemas | **Moves** (H1, H2). | +| `epiphany-core/` (`runtime_spine.rs` 8,728, `current_work.rs` 5,610, `resident_self.rs` 3,044, `reasoning_context.rs` 3,000, `repo_model_documents.rs` 2,292, `repository_body_observer.rs` 2,112, `persona_conversation.rs` 1,818, `atlas/` 10,178, `packaged_release/` 1,172, `surfaces/` 1,034, `memory_graph/` 400, bins 3,394) | 54,205 | **Dies**, except the two crossing modules and the permit binary (H5, ~1,100 lines) and the Interpreter's typed output schema in `persona_conversation.rs` (H6, read for shape, not moved). The resident Self (`resident_self.rs` + `bin/epiphany-swarm.rs` 820) is harvested as rules, not code (H4). Its dependency on `ghostlight-persona-projection` (a reverse edge into Ghostlight) dies with it. | +| `epiphany-openai-runtime/` (`lib.rs` 3,230, `persona_executor.rs` 782, `provider_transport.rs` 296, bins 1,554 + 544) | 6,431 | **Dies.** The Persona service's turn is rebuilt as one connector request (H6). | +| `epiphany-model-adapter/` | 1,079 | **Dies** (H7). `cut-epiphany-connector-only.r1` is withdrawn. | +| `epiphany-tool-adapter/`, `epiphany-tool-mcp-runtime/` | 156 + 1,479 | **Dies.** Eureka's tools are Claude Code's. | +| `epiphany-state-model/src/prompts/epiphany_doctrine.md` (28 lines, no code consumer), `epiphany_state_intro.md` | 34 | `epiphany_doctrine.md` **moves as text** (H8); the intro dies. | +| `epiphany-openai-auth-spine/`, `epiphany-openai-codex-spine/`, `epiphany-self-policy/`, `epiphany-release-construction/`, `apps/` | 0 / README only | **Dead directories.** | +| `notes/` | 37 files | `huginn-organ-cut.md` (Huginn's own cut map, 84 Huginn references), `eureka-pipeline-state-target.md`, `eureka-pipeline-state-cut.md`, `eureka-read-side-cut.md`, `eureka-body-plane-cut.md`, `eureka-query-prior-art.md`, `postmortem-eureka-schema-phase.md` **move to Huginn `docs/history/`** (H9: they are the mind's own design record). `persona-discord-permit-authority-map.md`, `persona-conversation-authority-map.md` move beside the Persona organ (H5/H6). `faculty-workflow-lessons-2026-09-04.md` moves to the Eureka repo `references/` (the skill already cites it). The rest (anatomy, investor readiness, safety architecture, audits, `archive/`) **stay in the archive**. | +| `docs/` (whitepaper `.tex`/`.pdf`, investor brief, positioning, avatar) | | **Stay in the archive**; the positioning prose the operator wants public lives in gamecult-site, not here. | +| `README.md` ("the beginning of governed human/agent labor", the GameCult bet) | | **Harvest as prose** into the Eureka repo README's opening (H8); the archive README gains the pointer. | +| `state/` (`map.yaml`, `persona-discord.toml`, `persona-reddit.toml`, msgpack ledgers), `.epiphany-*` sandboxes, `target/` | | **Die** with the checkout; gitignored or local. | +| `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `CONTRIBUTOR_LICENSE_AGREEMENT.md`, `LICENSE`, `eval-plan.md` | | Stay in the archive. The CLA and LICENSE are the operator's to re-apply to Eureka if the open project wants them (H8 asks). | -- **The deployed Epiphany body is older than the repo.** `/srv/epiphany/app/current` - (Aug 22) holds 18 binaries, among them `epiphany-daemon-supervisor`, - `epiphany-heartbeat-store`, `epiphany-model-runtime`, - `epiphany-persona-discord-permit`, `epiphany-persona-feedback-ingress`. Head's - `Cargo.toml:60-100` builds nine: `epiphany-release`, `epiphany-state`, - `epiphany-repository-body`, `epiphany-swarm`, `epiphany-persona-service`, - `epiphany-persona-discord-permit`, `epiphany-mvp-coordinator`, - `epiphany-openai-runtime` (the model runtime bin) and the tool runtime. The - heartbeat scheduler authority was deleted on 2026-08-23 (`4d0db2c7`), the - semantic projector on the same day (`856648de`), and `epiphany_specialists.toml` - with "fictional contracts and dead prompt surfaces" (`ab3cacfb`). So - `epiphany.service` (supervisor) and `epiphany-heartbeat.service` cannot be - rebuilt from head: they are dead units with no source, and the deletion line - of this map removes them. `epiphany-swarm.service` can be rebuilt; its unit - ran `--model-provider openrouter --model stealth/ox-alpha` with an OpenRouter - key via `LoadCredential`, `--codex-home`, `--max-steps 1`, - `--cooldown-seconds 120 --idle-sleep-seconds 15`, and read Bifrost Persona - feedback from `/srv/bifrost/persona-feedback/outbox/deliveries.cc`. Its last - journal (Aug 22 17:46) reports `status: braked` and the wake authority - quoted in B11. -- Users that exist: `epiphany` (988, home `/var/lib/gamecult/epiphany`), - `epiphany-model` (984), `codex-connector` (983), `huginn`, `voidbot`, - `bifrost-feedback`, `bifrost-notice`, `ghostlight`. **No `eureka-mind`.** - Group `gamecult-model` holds the connector keys (`/etc/gamecult/codex-connector/ - ghostlight.key`, `epiphany-capstone-17.key`, root:gamecult-model 0640). -- Idunn: targets under `/var/lib/gamecult` include `epiphany`, - `epiphany-model-connector`, `codex-connector`, `huginn` (state root only; the - unit is interim). `/etc/gamecult/epiphany` holds the Bifrost feedback anchor, - an empty `mcp.toml` and a root-only `credentials/`. The Idunn recipe for - Epiphany is the Aug body's (`/srv/odin/deploy-manifests/epiphany`, - `inventory.md:775-788`); it does not describe head. `TargetDeclaration.service` - stays required (`Idunn src/deployment.rs:33`), which is fine here: every - Epiphany organ in this map is a resident service. -- Load: 16 cores, 62 GiB, load average 1.4. The verify stopgap caps 5 jobs at - 4 CPUs and 6 GiB. `node` v24.14.1 and `npm` present; no Claude Code installed. -- `127.0.0.1:18080` listens (Ghostlight's local lane, Bonsai 2 on Raven); the - Qdrant/Ollama facts of `huginn-organ-cut.md` P1-P3 hold. +Not of Epiphany, despite the name: `epiphany-graph-rs` (a standalone +Sugiyama/force layout crate, no dependency on Epiphany, MIT/Apache, own +GitHub repo) and the `EpiphanyAquarium*` repos (Aquarium clients; the census +`gamecult-ops/docs/repo-census-2026-09/repos/EpiphanyAquarium.md` already +records their deleted `EpiphanyAgent` and Python scripts). They are outside +this harvest; renaming them is cosmetic and nobody's cut here. -### B4. The forge and the Mind's identity +Bifrost-side names that survive the archive as wire constants: +`epiphany.Persona`, `epiphany.persona_discord_delivery_request.v0`, +`epiphany.persona_discord_delivery_permit.v0`, +`bifrost.persona_discord_delivery_permit_request.v0`, source role +`epiphany-persona-mouth`, RUDP connection ids `0xe91f_0002/0003`, the Bifrost +`--epiphany-*` flag names. Question `wire-names`. -Unchanged from revision 2: `GameCult/Eureka` on the forge has no branch -protection yet (ruling `mind-self-merge-authority` needs it); team `minds` has -write; user `eureka` exists with one key `eureka@starfire`; -`provision-forge-minds-eureka` adds one key per host; the charters are not yet -in the Eureka repo. Reach is the scope boundary: a Linux user on Yggdrasil -with the `eureka` forge key, checkouts of the Mind's repos, no GitHub -credential, no SSH to Starfire, cannot touch an operator project. Revision 3 -adds: the Linux user that already owns Epiphany's state on the host is -`epiphany`; under `operator-eureka-adopts-epiphany-body` she is Eureka on -every surface that names the Mind (instance, forge user, Discord display -name), and `epiphany` names her body (Linux user, runtime id -`epiphany-yggdrasil`, Persona agent id `epiphany.Persona`, which Bifrost -checks as a constant in `persona-feedback.mjs:90`). The one open naming -question is the Discord display name (question `her-name`). -- Huginn and Epiphany are on GitHub today; the forge (`eureka.gamecult.org`) - is hers. Ruling `mind-self-merge-authority` wants branch protection on the - forge for every repo she merges into, so her body's repos need the forge as - their canonical remote before she lands code in them (follow-up - `body-repos-on-forge`). +### B10. The resident Self, read as rules (harvest H4) -### B5. The operator's channel and the Persona's mouth +What `epiphany-swarm` and `resident_self.rs` protect (r3 B11): the brake is +read before any consequence; pressure is consumed exactly once, by a +single-consumption grant held by one launched turn under a lease; no typed +obligation means no wake ("Heartbeat does not ruminate, dream, mutate memory, +or manufacture work"); cadence is cooldown, idle and failure backoff. With the +`run` kind in the mind (`cut-run-kind`: a run claims specs; admission refuses +a claim a live run holds, `AlreadyClaimed`), the grant and the lease are the +same fact as the run document: a launch that opens a run with a claim is the +grant, and a second waker cycle over the same queue finds the spec claimed +and launches nothing. So the resident Self's own state machine +(`ResidentSelfState`, `ResidentSelfGrant`, `ResidentSelfPressure`, the +prepared-launch and active-turn lease) is not harvested; the mind holds the +one fact it existed to hold. What remains to build is a waker that reads the +brake and the dial, derives the queue through `HuginnClient` minus live +claims, and starts at most one Self run (question `self-waker`: one-shot +under a timer whose idempotence is the claim, or a resident loop). -Revision 2 mapped the bridge CLI `discord-post` as her mouth. Revision 3 finds -the typed mouth live on the host and demotes the CLI path to its transport leg. +### B11. Persona state: one document, one writer (harvest H6 shape) -- `bifrost-persona-mouth.service` (user `bifrost-feedback`, active, requires - `bifrost-persona-feedback.service`) runs - `tools/persona-feedback.mjs serve-persona-delivery` over the single-writer - crossing stores `/srv/bifrost/persona-discord-crossing/requests.cc` and - `receipts.cc`, with `--epiphany-runtime-id epiphany-starfire`, - `--epiphany-persona-mouth-trust-anchor starfire-mouth-request-anchor.ccmp`, - `--epiphany-persona-permit-trust-anchor starfire-permit-anchor.ccmp`, - `--epiphany-persona-permit-rudp rudp://10.77.0.2:17877`, listening on - `rudp://10.77.0.1:17876`, reading `persona-delivery.env` (bot token). The - anchors are root-owned, dated Aug 8; the stores were last written Aug 8. - `inventory.md:760-771`: the production binding is the GameCult Aquarium - channel `1501196543150264332`, runtime `epiphany-starfire`, Persona agent - `epiphany.Persona`; "restarting it would arm the Persona crossing". -- The contract (Bifrost `tools/persona-discord-delivery-documents.mjs`, - `persona-discord-delivery.mjs`, `persona-discord-rudp.mjs`; Epiphany - `persona_discord_crossing.rs:32, 294-319`, `persona_discord_permit.rs`): - Epiphany signs `epiphany.persona_discord_delivery_request.v0` - (`requestId, effectDocumentId, targetRuntimeId, personaAgentId, channelId, - replyToMessageId, content, contentSha256, issuedAt, expiresAt, - privateStateExposed, signerIdentityId`) as source role `epiphany-persona-mouth` - on RUDP connection id `0xe91f_0003`; Bifrost admits it only when the - envelope's `sourceRuntimeId` equals its configured runtime id and the anchor - tuple (`gamecult.service_trust_anchor.v1`, service `epiphany-persona-mouth`, - runtime id, ed25519 key, purpose, signed schema, `bindingAuthority: root`) - verifies; it then asks Epiphany's permit issuer - (`bifrost.persona_discord_delivery_permit_request.v0`, connection id - `0xe91f_0002`, source runtime `bifrost-discord-yggdrasil`) and posts only - with a fresh `epiphany.persona_discord_delivery_permit.v0` (lifetime at most - 5 s, bound to request digest, nonce and the canonical CultMesh brake - document digest; issued only while the brake is `released`). The post is - the bridge CLI `discord-post --identity epiphany.Persona --source-kind - epiphany_persona_speech` with a crossing receipt. Receipts are the only - delivery proof; `unknown` is terminal. Full authority maps: - `notes/persona-discord-permit-authority-map.md`, - `notes/persona-conversation-authority-map.md`. -- **So her mouth exists with no new code on either side.** What is missing is - binding: the mouth unit is anchored to a Starfire runtime whose permit port - (`10.77.0.2:17877`) is not listening (`netstat` on Starfire: only 17875 and - 17878). Moving her to Yggdrasil means new anchors for runtime - `epiphany-yggdrasil` (Bifrost's own test fixture already uses that id, - `tests/persona-discord-delivery.test.mjs:13-35`), a permit issuer bound on - `10.77.0.1`, and the mouth unit's three flags changed: a root action in - gamecult-ops, no Bifrost code. The channel stays the operator's to name - (question `mouth-binding`). -- The brake is a separate control from the dial: binary, operator-released, - gating every external consequence (permit) and every resident Self cycle - (`epiphany-swarm.rs` cycle step 2). The dial scales cadence and run size; the - brake stops. Both stay. -- `tools/watchdog-notice.mjs` (owner DMs from a typed store) and the raw - `discord-post` webhook CLI remain available but are not her mouth: a second - path that bypasses the permit would put her speech outside the brake. -- Inbound: `bifrost-persona-feedback.service` already turns Discord events - addressed to the bound Persona into signed `bifrost.persona_feedback.delivery` - documents in the outbox, which `epiphany-swarm` imports as pressure (cycle - step 2) and which the conversation map lowers into Persona turns with reply - targets. The Bifrost-native ingress the conversation map's cut line 1 asks - for is the live `serve-discord` path (`persona-feedback.mjs:96-99`, - `bifrost.discord.persona_conversation_event.v0`). What is unbuilt is the - Epiphany side of mention obligations at head (follow-up - `epiphany-inbound-mentions`, superseding `persona-inbound-mentions`). +Unchanged in substance from r3 B15, with the second store gone: +`gamecult.persona_state.v0` in Huginn, opaque, schema-validated at the door, +replaced whole under CAS with a receipt (`cut-huginn-persona-state.r2`). +Epiphany's `epiphany.mind.persona_memory.v2` documents and the runtime store +that holds them die with the checkout and the host state root; nothing of +hers was ever written there (the deployed body never ran her). The live +writer becomes the Persona organ of H6, through `HuginnClient` +`persona_get`/`persona_put`. Question `persona-state-owner` therefore has one +option left and is withdrawn (below). -### B6. Scheduling today, and what the skill already derives +### B12. The connector: what exists, and the operator's new direction -Unchanged: the recipes derive the queue (specs with no report, reports with no -verdict, open findings, open questions and follow-ups, gaps). What the queue -cannot say: who is working a spec now; whether a holding verdict landed; -follow-up order; how active the Mind may be; which Self admitted a ruling. The -`run` kind (spec `cut-run-kind.r1`) carries the first and last; the dial is -the fourth; `gap-landing-untyped` stays. Revision 3 adds where the queue is -read from: Epiphany's resident Self reads it through `HuginnClient` each cycle -as its pressure source (B11, B12). +CodexConnector at `65192892` (r3 B14): one crate, feature `daemon`; +`lib.rs` 1,958 (contract types `gamecult.codex.provider_request.v2`, +`transport_invocation.v2`, `transport_result.v2`, `transport_receipt.v2`, +refusals, AES-GCM envelope, framing, `CodexConnectorClient`), `daemon.rs` +1,180 (TCP loopback bind, per-caller shared-secret keys, one request per +connection, concurrency/payload/output-token limits, 300 s expiry skew, keyed +replay `replay.cc`, restart-era `Indeterminate`, config +`gamecult.codex.connector_config.v1`), `provider_backend.rs` 1,463 +(`CodexProviderBackend`: hard-coded OpenAI URLs, auth `ApiKey | Chatgpt`, a +pinned `codex app-server` child as credential authority), +`idunn_health.rs` 1,396 (Linux-only presence and health participant, +capability `gamecult.codex.subscription-inference`), `main.rs` 188; the +Idunn recipe `deployment/idunn/recipe.toml`. The request type is rendered as +a literal OpenAI Responses body (`lib.rs:487-614`). -### B7. VoidBot: what is borrowed, what is demoted +Ghostlight's provider options (r3 B13): the in-process trait +`InferencePort { prepare, infer, lend_tool_results }` +(`crates/ghostlight/src/controllers.rs:299-311`), routed by model-name prefix, +longest claim wins (`sdk_inference.rs:732-757`, `controllers.rs:2454-2518`); +three implementors, every one lowering from `CodexProviderRequest`: +`CodexConnectorInferencePort` (the connector client), `SdkInferencePort` +(`sidecar/claude-sdk/src/main.ts`, 517 lines, `@anthropic-ai/claude-agent-sdk` +0.3.261 over a msgpack pipe; one Claude Code subprocess per query; the +request's tools registered as an in-process MCP server; returns usage, +`total_cost_usd`, faults `RateLimited | BillingError | MaxBudgetUsd`; +ambient login or setup-token), `LocalInferencePort` (OpenAI-compatible +loopback POST, no credential, prefix `local/`). Dungeon no longer opens the +connector lane; the live lane is local. Ghostlight's recorded direction +(`state/map.yaml:438-443`): one standardized connector API, the same one +Epiphany uses, and a generic OpenAI-compatible connector on it. -Revision 2's B7-B8 facts stand as recorded (scheduler, initiative engine, -Interpreter prompt, `gamecult.persona_state.v0` reader and one-shot migration, -`globalHeat` dial, nothing running, paused since 2026-07-16). Under -`operator-this-is-epiphany` the demotions are: +The direction, mapped onto that code. "Shared machinery lifted out" is +everything in CodexConnector that is not `provider_backend.rs`: the contract +types and refusals, the envelope and framing, the client, the daemon loop +(bind, caller keys, limits, replay, config), the Idunn health participant, +and the two additions r3 asked for (`max_cost_usd` on the invocation, +`cost_usd_estimate` on the receipt, the per-caller window spend ledger with +refusal `Budget`). What each connector keeps is its backend: Codex keeps +`provider_backend.rs` as it is; the Claude connector's backend is +Ghostlight's SDK sidecar moved in and spawned by that daemon under its own +user with the setup-token in a root-0600 `EnvironmentFile` (a native +`claude -p` backend is a later cut); the OpenAI-compatible connector's backend +is `LocalInferencePort`'s POST with a configured base URL and optional key. +Callers (Ghostlight, her Persona organ) choose a connector by model prefix in +their own config, so Ghostlight's longest-claim routing stays where it is and +routes among connector clients instead of in-process ports; no router daemon +stands in front of the connectors. Two things the direction does not say, +put as sub-questions under `connector-owner`: where the lifted crate lives +(a new repo, or `CultLib/packages`), and whether the shared request keeps +the OpenAI-Responses shape under a provider-neutral name (an epoch bump of +the contract ids, `connector-contract-untyped`) or is redesigned. The ruling +`operator-provider-portable-connector` says "a typed connector daemon" +singular; the direction says connectors plural sharing one contract. Read +together: one contract, several daemons. That reading is recorded in the +question rather than assumed. -- VoidBot's `persona-scheduler` and initiative engine are **not** the waking - organ. Epiphany's resident Self already has the primitive VoidBot lacked: - a single-consumption grant consumed by one launched turn (B11), which is why - VoidBot's pause reason cannot recur here. Follow-up - `voidbot-pressure-replay-pause` is withdrawn; its rule is pinned in the - Epiphany cut instead. -- VoidBot's Interpreter prompt (`SAY`, `STATE NOTE` text blocks parsed by rules) - is prior art; Epiphany's Interpreter emits a strict typed schema - (`persona_conversation.rs`, conversation map cut line 4). -- VoidBot's registry (`repo-discord-identities.json`) is not her identity; - Bifrost's target binding (B5) and the Huginn instance are. -- VoidBot's `globalHeat` is not the dial's home (question `dial-home`). -- What is borrowed: the `gamecult.persona_state.v0` schema (Epiphany publishes - it; VoidBot's zod types and projector are the only readers today) and the - one-shot `persona:migrate-portable` as the seed path for her first document - (its target becomes Huginn's `persona_put`, run by the operator-facing Self; - spec `cut-huginn-persona-state`). +### B13. The method repo and the body repo -### B8. (merged into B7 and B12) +`GameCult/Eureka` on the forge: `LICENSE README.md SKILL.md docs references +tools`, installed by checkout at `~/.claude/skills/eureka`; the charters +move in under `charters-into-eureka-repo`. Its Epiphany references: +`SKILL.md:3` ("the skill counterpart of Epiphany"), `:8-9` ("sits next to +Epiphany, the running organism in `F:\Projects\Epiphany`"), `:146` (a call +count scar; history), `:200` ("Eureka has no Persona"); `README.md:63, 86-87, +95` ("Epiphany owns the schemas (`epiphany-pipeline`) and Huginn owns..."); +`references/campaign-state.md` (the type ids, correct as wire names); +`references/faculty-philosophy-cut.md` and `tool-calling-cut.md` (dated +comparisons; history); `references/epiphany-comparison-2026-09-15.md` +(history). Huginn's workspace is the one Rust workspace that already talks to +the mind, has the client crate, the deploy runbook and the release symlink on +Yggdrasil. Question `body-repo-home` asks whether her Rust organs (waker, +Persona organ, permit issuer) are crates in Huginn's workspace or a repo of +their own; `method-repo-home` (fold the method into Epiphany) dies with its +premise. -### B9. What Huginn needs to hold `gamecult.persona_state.v0` +### B14. Doctrine citations of Epiphany (Life's sweep, nothing edited) -Unchanged from revision 2 (schema shape, `Mind::open_checked` type gate at -`mind.rs:168-187, 280`, wire operations, no JSON Schema validator in the crate, -the two doctrine passages in `F:\Projects\CLAUDE.md:79-85` and -`gamecult-ops/docs/persona-state-standard.md:29-33, 44-55`). Revision 3 -changes the consumer: the live writer is Epiphany's Persona service, in Rust, -through `HuginnClient` (B1), not VoidBot over a TS client. The spec's `first` -and `adds` are revised accordingly (`cut-huginn-persona-state.r2`). +| File and lines | Today | After the harvest | +| --- | --- | --- | +| `F:\Projects\CLAUDE.md` | No direct citation; points to the Persona standard doc. | Unchanged. | +| `gamecult-ops/docs/persona-state-standard.md:7-9` | Schema path under `Epiphany\schemas\cultnet`. | Points to the schema's new home (H2): Huginn `schemas/cultnet/gamecult.persona_state.v0.schema.json`. | +| same `:36-41` | `epiphany-persona-service` runs a separate native Persona Mind; `epiphany-agent-memory-store` removed; `.epiphany-run/` copy. | Deleted. Replaced by one sentence: the Persona organ of Eureka reads and writes the Huginn document (H6). | +| same `:57-63` | "Huginn ... still unbuilt ... no agent should route Persona-state work to Huginn"; "raise it against VoidBot's implementation and the Epiphany schema". | Reversed by `operator-persona-in-mind`: Huginn is the canonical holder per instance once `huginn-persona-state` lands; VoidBot keeps projection and the migration source for repo Personas; "the Epiphany schema" becomes "the published schema in Huginn". This is `cut-doctrine-persona-in-huginn` r3 (cut 8). | +| `~/.claude/agents/{eyes,hands,imagination,life,modeling,soul}.md:14` | "Self-improvement law (Epiphany `epiphany_doctrine.md`): ..." | "Self-improvement law (Eureka `doctrine/self-improvement.md`): ..." once H8 lands the file in the Eureka repo; the charters move into the same repo (`charters-into-eureka-repo`), so the citation becomes a relative path. | +| `life.md:24`, `soul.md:48` | `epiphany_specialists.toml` at `71a5d6fb^`. | Stay as history: a commit-pinned citation into an archived repo still resolves. Add "(archived)" after the repo name. | +| `hands.md:28` | The 75-binary build-bloat scar. | Stays as history; it is the scar that matters, not the repo. | +| `~/.claude/doctrine/persona.md:3` | "serves VoidBot and Epiphany Persona work". | "serves VoidBot repo Personas and Eureka's Persona". | +| `persona.md:13` | Self-improvement law citation. | As the charters' line 14. | +| `~/.claude/CLAUDE.md:218, 222` (operator-owned; wording proposed only) | "named for Epiphany's continuity organ"; "Epiphany's Life also owns continuity, pressure, and resume-or-regather after re-entry." | Proposed: "named for the continuity organ of Epiphany, Eureka's archived predecessor"; and "That organ also owned continuity, pressure, and resume-or-regather after re-entry; the wider scope arrives when Huginn owns each instance's mind as typed state." | +| `~/.claude/CLAUDE.md:31` | "not Epiphany lore" | Stays: it names the lore by its historical name, and `colossus.md` keeps the myth. | +| Eureka `SKILL.md:3, 8-9` | counterpart of / sits next to Epiphany. | "Eureka is the organism: a Mind (Huginn), a faculty method (this skill) and a body (Huginn's organ crates). Epiphany, its predecessor, is archived." By PR (H8). | +| Eureka `SKILL.md:200` | "Eureka has no Persona: Self is the operator-facing surface". | "The operator channel is this session. Eureka's Persona (the Mind's own mouth on Discord) is not the operator channel; a blocking question still goes to the operator here or by the notifier." By PR, with `skill-mind-self` (cut 7). | +| Eureka `README.md:63, 86-87, 95` | Links Epiphany as the organism; "Epiphany owns the schemas". | "Huginn owns the schemas (`eureka-pipeline`)"; the comparison reference stays as a dated document. | +| `~/.claude/doctrine/colossus.md:47, 51` | The Epiphany event as myth. | Stays. | +| `gamecult-ops/inventory.md`, runbooks, scripts, `systemd/` (B3) | The host body of Epiphany. | Deleted or rewritten in `mind-self-wake` r4 (cut 9). | -### B10. Campaign scope +### B15. The governance the Mind's stewardship is an embryo of: unchanged from r3 B17 -`eureka-substrate` holds Huginn, Epiphany, Eureka and gamecult-ops. The -connector cut lives in CodexConnector and the mouth rebinding touches only -root files on the host (gamecult-ops), so one cut of this map has no campaign -to live in. The proposal is in the rationale ("Campaign home"); follow-up -`epiphany-cuts-need-a-campaign` supersedes `persona-cuts-need-a-campaign`. +GCLP decision paths, membership separate from login, work and care work, +ledgers and decay, nothing pulling money unsupervised. The four attachments +in the rationale stand with "Epiphany" read as Eureka. -### B11. Epiphany's resident Self at head (`epiphany-core/src/bin/epiphany-swarm.rs`, 853 lines) +## The harvest -- Commands `once`, `serve`, `status`, `initialize-and-release-brake` - (`:44-46, 497-515`); `serve` requires `--max-steps 1` (`:471-478`). No - environment variables; everything is a flag (`:512-640`), including - `--model-provider`, `--model`, `--connector-endpoint` (must be loopback), - `--provider-credential`, the stores, the Bifrost feedback anchor and - `--persona-model-allowed-data-classifications`. -- `cycle()` (`:246-398`), in order: reap worker children; check the brake and, - when released, import Bifrost Persona feedback deliveries into social - pressure; bind the repo domain and ingest "current work" pressure - (`ingest_resident_self_current_work_pressure`); reload `ResidentSelfState`; - handle a prepared launch or an active turn lease; otherwise - `issue_resident_self_grant` then `prepare_resident_self_launch`; `None` is - `Sleeping`, else launch the coordinator child and wait up to 10 s for its - claim. Sleep after the cycle: `failure_backoff_seconds` (60), - `cooldown_seconds` (60) or `idle_sleep_seconds` (15) from `ResidentSelfPolicy` - (`:121-125`). Maintenance (receipt and lifecycle retention) every 60 s. -- Types (`epiphany-core/src/resident_self.rs`): `ResidentSelfState { revision, - active_turn, last_coordinator_receipt_id, next_eligible_at_millis, - consecutive_failures, prepared_launch }` (`:505-535`); - `ResidentSelfPressure { pressure_id, kind, provenance_ref, objective, status, - consumed_by_grant_id }` (`:36-59`; a CLI `--objective` becomes kind - `operator-objective`, `epiphany-swarm.rs:572-585`); `ResidentSelfGrant` - (single consumption); `ResidentSelfPolicy` (`:269-296`, model fields and - paths); the `ResidentSelfPorts` trait (`:557-568`) implemented by - `NativePorts` (`epiphany-swarm.rs:402-516`); `coordinator_argv` - (`:602-649`) carries `--model-provider`, `--model`, `--connector-endpoint`, - `--provider-credential` to the child. -- **Self makes no model call.** Its own summary: "Self may launch one bounded - coordinator turn; it cannot directly invoke model/tools, mutate Mind/Hands, - review, release, or deploy", and its wake authority: "standard heartbeat - consumes typed operator, admitted Modeling-map direction consideration, - Persona feedback, or Imagination proposal pressure and emits one - single-consumption Self grant" (`epiphany-swarm.rs:349`, journal Aug 22). - Doctrine (`epiphany-state-model/src/prompts/epiphany_doctrine.md`, 28 lines, - no code consumer): "When no typed work obligation is active, the swarm - sleeps. Heartbeat does not ruminate, dream, mutate memory, or manufacture - work." -- The coordinator it launches is `epiphany-mvp-coordinator` (2,124 lines), - which spawns `epiphany-model-runtime run-worker` (`:1658-1700`): the - Codex-era native cognition stack, closed over the provider enum of B13. - Under `operator-mind-runs-own-self` the turn her Self takes is a Eureka run, - not this coordinator (question `self-run-actuator`); the coordinator path is - demoted, not deleted in this map. -- Nothing in `epiphany-swarm.rs`, `epiphany-persona-service.rs` or - `epiphany-openai-runtime` changed after 2026-09-05; `resident_self.rs` was - touched 2026-09-15 (`00991c1b`, storeless reads). `epiphany-heartbeat` has - no binary at head (`heartbeat_state/` is empty). +Order is the order of cuts; a later item may not land before an earlier one +it names. "Consumer" is who reads it today; "home" is where it lives after. -### B12. The Self run as an actuator, and where the token lives +| # | What | Consumer today | Home after | Decides the home | Order | +| --- | --- | --- | --- | --- | --- | +| H1 | `epiphany-pipeline` leaf crate (B8) | Huginn (`huginn-mind`, `huginn-daemon`, `eureka-state`) | Huginn `crates/eureka-pipeline` (package and lib renamed; type ids unchanged), copied from Epiphany head `4006b14b` with the `leaf-key-bound` branch's change folded in or re-cut; `huginn-mind` takes a path dependency; the git edge dies | No fork (the only consumer is the home). `wire-names` decides the ids later, not this cut | 1 | +| H2 | `schemas/cultnet/` (thirteen pipeline schemas, `index.json`, README) and `gamecult.persona_state.v0.schema.json`; `epiphany.work_organ_state.v0` dies unless Hands finds a reader | The leaf's derivation test; VoidBot zod types; the Persona standard doc; Huginn's planned validator | Huginn `schemas/cultnet/` (same cut as H1; the test path becomes `../../schemas/cultnet`); the standard doc re-points (B14) | No fork | 1 | +| H3 | The unlanded leaf specs `cut-mind-authority.r1`, `cut-run-kind.r1`, `cut-leaf-key-bound.r1` | The mind | Re-admitted as r2 with repo `GameCult/Huginn`, base = the H1 landing commit; same content | No fork | 2 | +| H4 | The resident Self (`epiphany-swarm`, `resident_self.rs`) as rules (B10) | Nothing live | `crates/eureka-wake` in the body repo: brake and dial read, queue minus live claims through `HuginnClient`, at most one Self-run start; no grant/lease state of its own | `self-waker`, `dial-home`, `body-repo-home` | 5 | +| H5 | The Persona crossing and permit (`persona_discord_crossing.rs`, `persona_discord_permit.rs`, the permit binary; the two authority-map notes) | Bifrost's mouth (contract) | The Persona organ crate (H6) and its `eureka-persona-permit` binary; the notes under its `docs/` | `body-repo-home`, `wire-names` (what the signed request is called) | 6 | +| H6 | The Persona turn: the Interpreter's typed output (speech + state notes, `persona_conversation.rs`), the feedback-delivery import, the delivery-request signing | Nothing live | `crates/eureka-persona`: one connector request per turn with an output schema; reads the Persona document and ended runs from Huginn, feedback deliveries from Bifrost's outbox; puts the Persona document under CAS; signs one delivery request | `persona-turn-runtime`, `connector-owner`, `body-repo-home` | 6 | +| H7 | The model adapter (`epiphany-model-adapter`, `provider_transport.rs`) | Epiphany only | **Dies.** The connector contract is the lifted crate of B12; `cut-epiphany-connector-only.r1` is withdrawn | `connector-owner` (the lifted crate replaces it) | 4 | +| H8 | `epiphany_doctrine.md` (text), the README's open-project prose, `faculty-workflow-lessons-2026-09-04.md`, the CLA/LICENSE question | The charters' line 14 cites the doctrine; the skill cites the lessons | Eureka repo: `doctrine/self-improvement.md` (the per-lane law paragraph and the heartbeat and swarm-boundary lines), README opening, `references/`; the charters land in the same repo | `charters-into-eureka-repo` (ruled); whether the CLA applies to Eureka is the operator's, asked in the cut report, not a fork here | 8 | +| H9 | The mind's design record in `notes/` (`huginn-organ-cut.md` and the six `eureka-*`/postmortem notes) | Readers of Huginn's history | Huginn `docs/history/` verbatim, with a one-line provenance header | No fork | 1 (same cut as H1; prose only) | +| H10 | Host state and tooling of the Epiphany body (B3) | Nothing | **Deleted**: units, release roots, Idunn targets and recipe, users `epiphany` and `epiphany-model`, state and config roots; gamecult-ops scripts, runbooks, units; inventory rewritten | `host-and-units` | 9 | +| H11 | The GitHub repo | | **Archived** last: README pointer to Eureka and Huginn naming what moved and from which commit; final tag `archive-2026-10`; GitHub archive flag (operator action, read-only) | No fork; the operator flips the flag | 11 | -- The Eureka Self is a Claude Code agentic session (skill, `eureka-state` MCP, - git, subagents), not one model request. The connector (B14) transports - requests and receipts and "cannot execute a returned model tool call" - (`standalone-codex-transport-migration.md:146`). So the Self run is not a - provider call behind the connector; it is an actuation, like the coordinator - launch today, whose one runtime is Claude Code print mode. Reading the - provider ruling that way keeps the connector's boundary intact and keeps - Epiphany's own cognition (Persona turn, any native deliberation) portable. - This is a reading of the ruling, so it is a question, not a default - (`self-run-actuator`). -- Reach: the run needs `CLAUDE_CODE_OAUTH_TOKEN`, the `eureka` forge key, the - Mind's checkouts and the `eureka-state` MCP config. Epiphany's user must not - hold the token (B2). The shape that keeps it out of her reach: a template - unit `eureka-self@.service` under a dedicated user (`eureka-self`) with a - root-0600 `EnvironmentFile`, started by the resident Self through one - sudoers line (`systemctl start eureka-self@