Huginn/docs/eureka-self-cut.md
2026-10-01 23:03:08 +02:00

69 KiB
Raw Blame History

The Mind's own Self: map

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 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. 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. 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 ultimate design authority and work scheduling to the operator, but neither of these is strictly necessary. I want a Self operated by Mind directly.

The Self I talk to here in this one projection of Eureka's mind, and it's how 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.

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 Mind's initiative. Yes, that initiative ultimately comes from me, but the Mind's own goal is to become the Perfect Machine. That is the operator directive motivating its every action. How each Mind interprets that mission is up to it.

Not a budget, a burn rate. I want a dial I can crank to determine how active the Mind is, so I can adjust it like I adjust my own usage.

I actually think Persona state should be part of the Mind. Like, we've been talking about a Mind agent as if that has a meaning, but I think the best 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.

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?

Epiphany is supposed to be as provider portable as possible, just like Ghostlight, it gets it through a typed connector daemon and I want to continue that tradition.

I think you have the right of it. Eureka should adopt Epiphany as her body.

Look back at the Bifrost charter back when it was called GameCult Labor Platform or GCLP. See the /dossier page on the GameCult site, too. The means shape the ends. We shape the means with the agents we're building, with Epiphany and how we steward it.

Revision 4's law (operator-archive-epiphany):

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 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)
gamecult-ops main 2aeb7364fffcd404aada28bfd30fb4e5c753cf53
Eureka skill main (checkout ~/.claude/skills/eureka) b260fbeec6d96ff06882ed9c37d3e1204c424e99
VoidBot main, F:\Projects\VoidBot (clean) 46d891b (2026-09-13)
epiphany-graph-rs main, F:\Projects\epiphany-graph-rs 07cd7c1

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): unchanged from r3

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: unchanged from r3

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 dies with Epiphany

From r3 B3, now read as a deletion list rather than a body to rebuild:

  • 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.<kind>.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
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).

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.

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.

B10. The resident Self, read as rules (harvest H4)

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).

B11. Persona state: one document, one writer (harvest H6 shape)

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).

B12. The connector: what exists, and the operator's new direction

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).

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.

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.

B13. The method repo and the body repo

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.

B14. Doctrine citations of Epiphany (Life's sweep, nothing edited)

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).

B15. The governance the Mind's stewardship is an embryo of: unchanged from r3 B17

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.

The harvest

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.

# 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

What dies without moving, said plainly: epiphany-core except H5 (atlas, runtime spine, current-work ingestion, repository body observer, reasoning contexts, repo model documents, coordinator and its results, agent launch, substrate gate, packaged release, memory graph, surfaces, the state and release binaries), epiphany-openai-runtime (the native cognition stack and the Persona service binary), the model adapter, both tool crates, the four empty crates, apps/, the Codex-era prompts, the GUI and dogfood sandboxes, the whitepaper and investor documents (archived, not deleted), the host body.

The model page

One row per persistent kind this design adds or changes. Rows for the thirteen existing kinds are in eureka-substrate-map.md.

Kind Identity (what names it) Lifecycle (what happens over time) Authority (who decides)
ruling with authority: Mind (cut-mind-authority r2, Huginn) <campaign>:ruling:<label>; the variant on the document separates Mind rulings from the operator's. Created by the Mind's Self when it rules a substrate-internal fork; superseded like any ruling; the operator overturns one with an Operator ruling. Stored rulings decode unchanged. The Mind's Self admits them; the run record is the attribution until operator-authority-needs-operator-credential lands.
run (instance-rooted; cut-run-kind r2, Huginn) <instance>:run:<label>; label mind-<date>-<n> for her Self (allocated by the waker), the Self's chosen label for the operator-facing Self. Fields instance, operated_by: Operator | Mind, host, started_on, budget_usd, claims, campaigns. Opened at launch before any other admission; ended Recorded { reason } or Withdrawn; a live run older than 24 h is withdrawn by the waker's next cycle. A spec claimed by a live run is not in another run's queue. The Self that runs it admits it; admission refuses a claim a live run holds (AlreadyClaimed). The run is the grant: the waker launches nothing when the queue minus live claims is empty, and the Persona turn reports ended runs.
gamecult.persona_state.v0 for an instance (Huginn; cut-huginn-persona-state r3) One global document per mind, personaId = instance slug; schema vendored by hash from Huginn's own schemas/cultnet after H2. Seeded once from VoidBot's persona:migrate-portable output by the operator-facing Self; replaced whole by PersonaPut { state, expected_updated_at } under CAS; read by PersonaGet. Huginn admission owns entry. The Persona organ (H6) is the only live writer. Forbidden: a local .cc as canonical; any second copy without provenance.authority: projection.
The brake and the burn-rate dial (question dial-home) A: one root-owned control store on Yggdrasil, /etc/gamecult/eureka/control.cc, documents eureka.control.brake.v0 { released, set_at, set_by } and eureka.control.burn_rate.v0 { heat: 0.05..2, set_at, set_by }, written by eureka-control (a small CLI run as root over ssh), read by the waker and the permit issuer before every consequence. B: instance-rooted brake and burn_rate documents in Huginn, one in force, admitted under the operator credential. A: absent brake reads as held; absent heat reads as 1.0. B: superseded by resolution; waits on the credential follow-up. The operator only; no organ of hers can write the store (filesystem under A, credential under B). Derived: waker cadence (cooldown / heat, bounded), run size (max_cost_usd = base_usd × heat in every connector invocation and every Self-run --max-budget-usd).
The connector's caller spend ledger (lifted crate; gamecult.model.caller_spend.v1) Keyed by caller runtime id and window start; sum of cost_usd_estimate, request count, window cap from the caller config. Rolled per 24 h window; refusal Budget at the cap; projected into each daemon's presence health. Each connector daemon owns its own; the caller config (root) sets the cap. Never the plan's own usage (gap-usage-not-typed).
Her identity on each surface The Mind: instance eureka, forge user eureka, Discord display name Eureka (question her-name dies: there is no other name once the body is not Epiphany). The body: Linux user eureka, runtime id eureka-yggdrasil (a flag value on Bifrost's unit), Persona agent id and crossing type ids per wire-names. Instance never renamed; runtime id set at rebinding; the display name and avatar are the Bifrost binding's fields. The operator names her; wire-names is a Bifrost cut if it renames.
The Mind's credential (CLAUDE_CODE_OAUTH_TOKEN) Two root-0600 EnvironmentFiles on Yggdrasil: the Claude connector daemon's and eureka-self@.service's. Never user eureka. Created with claude setup-token; rotated or revoked by the operator. The operator. Question host-and-units.
The Mind's forge key per host eureka@<host> keys on forge user eureka. provision-forge-minds-eureka. gamecult-ops runbook, run as root.
Her units and anchors (cut-mind-self-wake r4) eureka-wake.timer + eureka-wake.service (or eureka-wake.service resident, per self-waker), eureka-persona.service, eureka-persona-permit.service, eureka-self@.service, claude-connector.service, codex-connector.service (existing unit, re-pointed at the split crate); mouth and permit anchors for runtime eureka-yggdrasil; the Bifrost mouth unit's three flags. Hand-installed by gamecult-ops per reader-deploy-owner and the Huginn precedent; Idunn targets re-declared later as the deletion line. The Epiphany units, roots, users and targets are deleted first. gamecult-ops owns the install; the operator creates the token and the anchors (root).

Cells not fillable from the Body: the token's lifetime; the 24 h run bound (a proposal); base_usd; whether the SDK's total_cost_usd tracks the plan's accounting closely enough to be the dial's measure.

The authority map

  • Owner: Eureka, in three organs with one Mind. Huginn owns what is true (every document, every receipt, every claim). The waker owns when she works: it turns the brake, the dial and the queue minus live claims into at most one Self-run start. The Persona organ owns what she says and her one Persona document (one CAS put per turn, one signed delivery request per turn). Her Self run (a Eureka session under eureka-self@) owns, within the Mind's jurisdiction: which substrate work happens next (the fixed queue order), the dispatch of Imagination, Hands, Soul and Life, Mind-authority rulings on substrate-internal forks, merging her own PRs after a holding Soul verdict, opening campaigns whose repos are Mind repos.
  • Inputs: her Persona document and the queue and ended runs (Huginn, through HuginnClient); the brake and the dial (the control store); Bifrost Persona-feedback deliveries (the outbox); her checkouts of Huginn, Eureka, gamecult-ops and the connector repos; the verify stopgap. Nothing from Starfire, nothing from the operator's projects, no prose handoff.
  • Outputs: signed Discord delivery requests through the typed crossing (posted by Bifrost under a permit her issuer grants while the brake is released); one Persona-state put per turn; at most one Self launch per unclaimed queue, which opens a run, admits documents, pushes branches and PRs to the forge, merges; connector invocations carrying max_cost_usd.
  • Derived state: HANDOFF prose files are display-only and die once run exists; "what is Self working on" is a query over live runs; "how active is the Mind" is the dial; "what did my Self do" is a query over ended runs, projected by her Persona turn in her voice; each connector's spend ledger is a projection of receipts; the resident Self's grant and lease are no longer owners, they are derived from run claims; Epiphany's runtime Mind is dead.
  • Forbidden writers: she never sets the brake or the dial; never rules a fork outside substrate-internal ones; never edits ~/.claude/; never pushes to GitHub; never runs on Starfire; never writes her Persona state anywhere but Huginn; never holds the Claude token (the Claude connector and the Self-run unit do); never posts to Discord outside the permit crossing. No Epiphany binary runs again. VoidBot's scheduler, worker, registry and heat never decide anything for her. No connector executes a tool call or hosts an agent session. The operator-facing Self never claims a spec a live Mind run holds and never writes a prose handoff in place of a run.
  • Shared paths: both Selves admit through the same eureka-state tools and admission rules; both open a run first; both read the queue with the same recipes minus live claims; both land code through branch-protected PRs on the forge and the same merge rule; both verify through the stopgap; every model turn of hers and of Ghostlight's goes through the same connector contract (different daemons, one contract); every Discord post of hers goes through the same permit crossing.
  • Deletion line: before her units run for the first time: Huginn's git edge to Epiphany is gone (H1); the three dead Epiphany units, the model-connector unit, the Idunn epiphany and epiphany-model-connector targets, /srv/epiphany*, /var/lib/gamecult/epiphany, /etc/gamecult/epiphany, users epiphany and epiphany-model are removed from the host; gamecult-ops' Epiphany scripts, runbooks and units are deleted; cut-epiphany-connector-only.r1, cut-epiphany-persona-huginn.r1, cut-epiphany-self-eureka-run.r1, cut-mind-self-wake.r3 are withdrawn (the first dies, the others are re-cut against the body repo); the prose handoff files are retired into runs; the local .cc as canonical Persona store for instance eureka never exists; the two doctrine passages of B14 are rewritten in the cut that lands the reader; Epiphany is archived last.

The nine questions, re-checked

stand: unchanged, a ruling can pick an option as admitted. changes: the options are re-admitted as r2 with the text here. dies: withdrawn, with the reason; a successor question is named where one exists. Every question that survives lists its options so a ruling can pick one (gap-answer-outside-options).

  1. self-run-actuator changes. Option native-coordinator dies with epiphany-mvp-coordinator. Remaining: A actuator-unit: the waker starts eureka-self@<label>.service under user eureka-self (root-0600 EnvironmentFile with the setup-token, the eureka forge key, the Mind's checkouts, the eureka-state MCP config) through one sudoers line, passing --max-budget-usd from the dial; the run opens and ends a run document; the connector is untouched. B connector-session: the Claude connector gains an agent-session operation with Claude Code print mode behind it, so no unit of hers holds the token; the connector becomes an agent host with workspace, git and MCP reach, against its own boundary. Recommendation A: the connector's trustworthiness is that it transports a request and cannot execute a tool call; Claude Code is the Eureka pipeline's one runtime, a fact about the method, not a provider choice.
  2. connector-owner changes (the operator's direction, B12). Option generalize-codex-connector dies: CodexConnector stays the Codex connector. Options for the ruling: A kit-and-connectors-beside: the shared machinery (contract types and refusals, envelope and framing, client, daemon loop with caller keys, limits, replay and config, Idunn health participant, max_cost_usd, cost_usd_estimate, the spend ledger and refusal Budget) is lifted into one crate; codex-connector keeps provider_backend.rs and becomes a thin binary over the kit; a claude-connector binary beside it whose backend is Ghostlight's SDK sidecar spawned under the daemon's user; an openai-compatible-connector binary whose backend is LocalInferencePort's POST; Ghostlight's three in-process ports become three connector clients in its own campaign; her Persona organ configures the Claude connector. B kit-inside-codex-repo: the same split, but the kit is a workspace member of the CodexConnector repo and the other connectors depend on it by git; one repo, the name on the tin wrong for two of its three binaries. C claude-variant-in-her organ: her Persona organ spawns claude -p itself; no daemon change; violates operator-provider-portable-connector (a provider door in her process, the token in her user). Recommendation A. Two sub-forks the direction leaves open, which the ruling should also pick: (i) the kit's home, new repo (name the operator's; the default proposal is GameCult/ModelConnector) or CultLib/packages (recommended against: CultLib holds the CultCache/CultNet/CultMesh runtimes, and a connector kit is a consumer of them, not a runtime); (ii) the contract's shape, keep the OpenAI-Responses request shape that every Ghostlight port already lowers from, renaming the ids gamecult.codex.* to gamecult.model.* in one epoch bump when connector-contract-untyped converts it to CultCache typed documents (recommended), or redesign a provider-neutral request now (a second contract while the first still has three callers). An inconsistency to rule on, not resolve here: operator-provider-portable- connector says "a typed connector daemon", singular; the direction says connectors plural. The map reads it as one contract, several daemons.
  3. persona-state-owner dies. Option epiphany-runtime-store died with the store; a question with one option is not a fork. Withdrawn; the one remaining shape is cut-huginn-persona-state r3's (consumer: the Persona organ) and the doctrine cut.
  4. dial-home changes. Option beside-the-brake loses its store (the brake lived in Epiphany's control store). Remaining: A root-control- store: brake and dial as two documents in one root-owned control store on Yggdrasil (/etc/gamecult/eureka/control.cc), written by an eureka-control CLI as root, read by the waker and the permit issuer before every consequence; she cannot write it by filesystem permission; no new credential mechanism. B huginn-document: instance-rooted brake and burn_rate documents in Huginn admitted under the operator credential; waits on operator-authority-needs-operator-credential, until then anyone with the MCP could admit one. Recommendation A first, B the day the credential lands, with A's documents becoming derived then.
  5. mouth-binding stands with the option text re-homed: A crossing-on-yggdrasil rebinds the live crossing to runtime eureka-yggdrasil (anchors, the permit issuer from H5 bound on 10.77.0.1, the mouth unit's three flags), Aquarium channel kept or one the operator names; B webhook-cli-direct (a second mouth outside the brake); C silent-for-now. Recommendation A.
  6. host-and-units changes. Option interim-units-from-head no longer means Epiphany head: A interim-units: gamecult-ops hand-installs her units from the body repo (eureka-wake, eureka-persona, eureka-persona-permit, eureka-self@, claude-connector; codex- connector re-pointed at the split crate), creates users eureka and eureka-self, deletes the Epiphany host body (H10), re-declares Idunn targets later as the deletion line. B idunn-targets-first: declare Idunn targets for every unit from the start; nothing hand-installed; correct by doctrine, and the Idunn recipe work lands first. C starfire: rejected by the load budget. Recommendation A, the Huginn precedent.
  7. her-name dies. Its fork was Eureka versus the body's name; the body has no other name now. She posts as Eureka; the display name and avatar are set in the mouth rebinding. The surviving fork is the wire names (wire-names, new).
  8. method-repo-home dies. Its options were relative to Epiphany's repo. The successor is body-repo-home (new): where her Rust organs live.
  9. authority-thresholds stands unchanged: binary-plus-visible-class, stakes-scaled-now, binary-unchanged. Recommendation binary-plus-visible-class.

New questions this revision raises (admitted by the Self, each with options):

  • self-waker (blocks cut 5). A one-shot-under-timer: eureka-wake is a one-shot binary under a systemd timer at a short fixed interval; each run reads the brake, the dial and the queue minus live claims and starts at most one Self run; idempotence is the run claim (AlreadyClaimed), cadence is next_eligible = last run end + cooldown / heat, computed from ended runs, no state file of its own. B resident-loop: a resident daemon porting epiphany-swarm's cycle (grant, lease, backoff) over HuginnClient, holding ResidentSelfState in its own store. C persona-decides: the Persona turn itself decides when to launch her Self (VoidBot's initiative shape); the waker only runs Persona turns. Recommendation A: revision 2 killed the timer because a timer plus pressure manufactured turns; with the claim in the mind that defect is structurally gone, and B keeps 3,800 lines of state machine for a fact the mind already holds. C puts a model call in front of every wake and makes cadence depend on a Persona's judgment, which the dial should own.
  • persona-turn-runtime (blocks cut 6). A connector-request: the Persona turn is one typed request through the Claude connector with an output schema (speech, state notes), built by eureka-persona from the Persona document, feedback deliveries and ended runs; the connector enforces max_cost_usd. B claude-code-actuation: the Persona turn is a second print-mode session under the Self-run unit shape with a Persona brief; the connector has no consumer in Eureka. C voidbot-machinery: revive VoidBot's scheduler, Interpreter and bot as her Persona, reading Huginn through a TypeScript client (withdrawn follow-up huginn-ts-client returns). Recommendation A: it is what operator-provider-portable- connector asks for, it is the smallest organ (one request, one put, one signed document), and it keeps her speech behind the brake and the dial. B would make the whole organism Claude Code with the connector built for Ghostlight alone; C is the paused machinery with the defect plus a second Discord identity.
  • body-repo-home (blocks cuts 5, 6, 9). A huginn-workspace: her organ crates (eureka-pipeline, eureka-wake, eureka-persona with the permit binary) are members of Huginn's workspace; one Rust workspace, one CultLib pin, one deploy runbook, one release symlink, one campaign repo; Huginn's README says it is Eureka's Mind and body. B new-body-repo: a new forge repo for the organs, Huginn stays the memory organ alone; two workspaces pinning the leaf by git again. C eureka-repo-workspace: the skill repo gains crates/; every ~/.claude/skills/eureka checkout pulls the Rust body (the objection that killed method-repo-home B). Recommendation A.
  • wire-names (blocks nothing until a rename is wanted; informs cuts 1, 6, 9). The stored type ids epiphany.pipeline.*.v2 and the epoch, and Bifrost's crossing constants (epiphany.Persona, epiphany.persona_discord_delivery_*, role epiphany-persona-mouth, --epiphany-* flags). A freeze: the names are wire history, kept as they are; the archive README explains them; no epoch bump, no Bifrost change. B rename-at-next-epoch: the pipeline ids become eureka.pipeline.*.v3 in the next breaking leaf change (a migration of mind.redb under mind-survives-upgrade), and the crossing ids become eureka.* in one Bifrost cut with the mouth rebinding. C rename-now: both renames as cuts of this campaign. Recommendation A now, B recorded as the rule for when an epoch bump is paid for by something else; the stored-documents-valid invariant makes C a migration bought for a name.

Rationale

Why a second Self and not a rule (unchanged)

The operator has tried doctrine, a dedicated organ (Life), and considered a scored exam. Each puts a barrier in the path of an agent whose reward is the task in front of it. The only shape that uses the instinct instead of fighting it is an agent whose task is the Mind.

Why the harvest is small and the archive is large

Epiphany at head is 66k lines, of which the live mind uses 2,836 (the leaf) and the design uses about 1,100 more (the crossing and permit) plus the shape of one typed Interpreter output. The resident Self's 3,800 lines exist to hold one fact, "which pressure is consumed by which launched turn", which run claims hold in the mind with admission enforcing them. The Persona service's 7,000 lines build a prompt, call a provider, parse a schema and write memory documents into a private store; with the store gone and the connector owning the call, that is one request builder. The model adapter exists to choose between two providers inside Epiphany; the connector direction gives that choice to a caller config and a daemon per provider. Everything else (atlas, runtime spine, repository observer, coordinator) was the Codex-era cognition body that the Eureka pipeline replaced in September. The code is a liability; the harvest takes the invariants and the two modules whose contract a running Bifrost unit already checks.

Why the leaf moves first, and keeps its ids

Huginn's daemon, mind and client are built from the leaf; code-from-main says the live mind is built from main of both repos. Archiving Epiphany with the git edge in place would build the mind from an archived repo. The move is a path dependency and a renamed package; the type ids stay because every document in mind.redb is typed by them and stored-documents-valid is an invariant of the campaign. A name in a wire id is a scar, not a dependency (wire-names).

Why the waker has no state (question self-waker)

Revision 2 killed the timer because VoidBot's timer plus unconsumed pressure manufactured turns, and revision 3 took Epiphany's grant and lease as the cure. The cure is a single fact with one owner: "this pressure is consumed by this turn". The run kind puts that fact in the mind, where admission refuses a second claim. Once the mind holds it, a waker that keeps its own copy is a second owner, and a timer that fires into a mind with no unclaimed work launches nothing. So the waker is stateless and the mind is the grant.

Why the Persona turn is one connector request (question persona-turn-runtime)

A Persona turn is a prompt built from typed inputs and a typed output (speech plus state notes): exactly the request-to-receipt shape the connector transports, with output_schema_json already in the contract. Putting it behind the connector keeps her cognition provider-portable (the ruling's tradition), keeps the token out of her user, and keeps her speech behind the brake and the dial through max_cost_usd. Her Self run is different in kind: it is an agentic session with a workspace, which no connector may host.

Why the connectors are several daemons over one kit (question connector-owner)

The operator's direction names the shape: CodexConnector is Codex; a Claude connector sits beside it; shared machinery is lifted; Ghostlight's other options become connectors too. The shared machinery is everything that makes a connector trustworthy and the same for every provider (admission, keys, replay, limits, receipts, spend, health); the backend is the only thing that differs. One kit crate, three thin binaries, one contract; each daemon under its own user with its own credential; callers route by model prefix in their own config. No router daemon in front: that would be a fourth authority whose only job is to know what the caller config already says.

Why the brake and the dial share one root-owned store (question dial-home)

Revision 3 put the dial beside the brake because Epiphany already had one operator control its organs obeyed. The brake needs a home now as much as the dial does; the same reasoning gives them one root-owned store on the host, read by the two organs that have consequences (the waker and the permit issuer), written only as root. Huginn is the cleaner home for both the day it can tell the operator's admission from hers.

Why Persona state stays in Huginn opaque, validated, receipted (unchanged)

Hand-porting the v0 schema into Rust value types would drift from the published JSON Schema; Huginn validates at the door, checks personaId and the CAS, stores one envelope with a receipt. The schema is now Huginn's own published file (H2), vendored by hash in the validator.

Why her mouth is the typed crossing and not the webhook CLI (unchanged)

The crossing is live, signed on both sides, permit-gated by the brake, receipted. Its Epiphany side is the one piece of Epiphany code worth moving as code (H5), because Bifrost checks its contract today.

Why Mind is an authority value and why run carries claims (unchanged)

A ruling's authority says whose word it is. Two Selves over one Mind need one new fact, who is working what; the run carries its claims, its end and her Self's results.

The Self's fixed queue order (unchanged)

Derived at every launch, from the mind; the first non-empty step is the run's work, and a run does one step:

  1. A blocking question the operator has answered since the last run: skip.
  2. Findings in force, Blocker or High, on Mind campaigns: Hands, then Soul.
  3. Reports with no verdict on Mind campaigns: Soul.
  4. Specs with no report, not blocked, not claimed by a live run: Hands.
  5. gap-* follow-ups in force with no spec: Imagination maps one cut.
  6. Nothing: the run ends Recorded "idle" with no model call beyond the queries. The waker should not have launched; if it did, that is a finding against its queue derivation.

Means shape ends: the four attachments (ruling operator-means-shape-ends)

Unchanged from r3 with "Epiphany" read as Eureka: stakes-scaled authority (question authority-thresholds), contributor credit at the landing record (credit-attaches-at-landing), care work counted through run documents and Life's named mutations (care-work-counted), no permanent aristocrat (mind-standing-decay). The portable Persona document, per-Mind forge accounts and one redb file per instance keep exit alive; the operator's sentence "we shape the means with the agents we're building, with Epiphany and how we steward it" now reads with Eureka as the agent being stewarded, and the archive itself is the first act of that stewardship: a body that stopped making sense is cut, not kept.

Campaign home (proposal; the Self admits campaigns and targets)

Keep eureka-substrate for the mind's own cuts: leaf-into-huginn (H1, H2, H9), mind-authority r2, run-kind r2, huginn-persona-state r3, huginn-mind-self-kinds, doctrine-persona-in-huginn r3. Open a sibling campaign eureka-body (title "Eureka's body: the harvest of Epiphany and the Mind's own Self"), repos GameCult/Huginn, GameCult/Eureka, GameCult/gamecult-ops, GameCult/CodexConnector, GameCult/Epiphany (as harvest source and archive target), GameCult/Bifrost (no code change expected; present so a wire-names rename could be a cut), plus the kit repo once it exists. Its target's invariants: one-contract-many-doors ("every model turn of hers goes through the connector contract; no organ of hers holds a provider credential or URL"), persona-state-one-writer, one-mouth-under-the-brake, token-out-of-her-reach, run-is-the-grant ("no organ of hers holds pressure-consumption state outside the mind's run claims"), nothing-runs-from-epiphany ("no unit, build or dependency of hers resolves into the archived repo"). The three Epiphany-repo specs admitted under eureka-substrate in r3 (epiphany-connector-only, epiphany-persona-huginn, epiphany-self-eureka-run) and mind-self-wake r3 are withdrawn when eureka-body opens; their successors below are admitted there. epiphany-cuts-need-a-campaign closes with the opening.

Proposed target r2 for eureka-substrate (the Self admits)

canonical_implementations[0] becomes "Key grammar and document kinds: Huginn crates/eureka-pipeline (Rust), type ids epiphany.pipeline.*.v2 kept as wire names." code-from-main becomes "The Huginn daemon, the eureka-pipeline leaf and the eureka-state client the live mind runs are built from commits on Huginn's main." not_in_scope drops "Persona-state reading in Huginn." and gains "Epiphany's runtime organs: archived; the body campaign eureka-body holds the harvest." canonical_implementations gains "Persona state for an instance: Huginn huginn-mind (opaque, schema-validated), schema Huginn schemas/cultnet/gamecult.persona_state.v0; live writer the Persona organ (eureka-body)." Invariants gain persona-state-one-writer as r3 proposed.

Cut order

Each line is a spec Hands can take with the target shape in this map; the section in brackets is where the shape is.

  1. leaf-into-huginn (Huginn; eureka-substrate; no fork). Copy epiphany-pipeline at Epiphany 4006b14b to crates/eureka-pipeline (package eureka-pipeline, lib eureka_pipeline; a git log provenance line in its Cargo.toml comment), fold in the eureka-substrate/ leaf-key-bound branch or leave leaf-key-bound r2 as cut 2's sibling; move schemas/cultnet/ (pipeline schemas, gamecult.persona_state.v0, index.json, README rewritten for Huginn; work_organ_state dropped unless a reader is found) to Huginn schemas/cultnet/; the derivation test path becomes ../../schemas/cultnet; huginn-mind takes eureka-pipeline = { path = "../eureka-pipeline" }; every use epiphany_pipeline in the 20 files becomes eureka_pipeline; Cargo.lock loses the git source; H9 notes land under docs/history/ with a provenance header. Proof: cargo test -p eureka-pipeline -p huginn-mind -p huginn-daemon -p eureka-state on the stopgap; the live mind reads back after a daemon rebuild (mind-survives-upgrade). [B8, H1, H2, H9]
  2. mind-authority r2, run-kind r2, leaf-key-bound r2 (Huginn; eureka-substrate): the r1 content, repo and base re-pointed. [r3 model page rows; huginn-organ-cut.md once moved]
  3. huginn-persona-state r3 (Huginn): as r2 with the schema vendored from Huginn's own schemas/cultnet and the consumer named as the Persona organ. No fork.
  4. connector-kit (CodexConnector and the kit repo; eureka-body; blocked on connector-owner): lift lib.rs's contract, envelope, framing and client, daemon.rs, idunn_health.rs and main.rs's daemon skeleton into the kit crate with a ProviderBackend trait (execute(invocation) -> result, capability(), health()); add max_cost_usd, cost_usd_estimate, the spend ledger and Budget; codex-connector becomes provider_backend.rs plus a main.rs over the kit, its recipe unchanged; claude-connector is a second binary whose backend spawns Ghostlight's sidecar (copied, not depended on) and maps MaxBudgetUsd to Budget; openai-compatible-connector is a third whose backend is one POST with a base URL. Proof: the Codex daemon's existing tests pass unchanged against the kit; a smoke of each binary refusing an expired invocation and an over-budget one. [B12]
  5. eureka-wake (body repo; blocked on self-waker, dial-home, body-repo-home): the one-shot (or loop) of B10; reads the control store; derives the queue through HuginnClient with the recipes minus live claims; allocates mind-<date>-<n>; starts eureka-self@<label> through the sudoers line with --max-budget-usd; withdraws runs older than 24 h; test: two consecutive wakes over one unclaimed spec launch once (the second sees the claim). Depends on 2.
  6. eureka-persona (body repo; blocked on persona-turn-runtime, connector-owner, body-repo-home, mouth-binding): H5 modules moved with their tests and the permit binary renamed eureka-persona-permit; the turn builder of H6 (inputs: PersonaGet, Bifrost outbox deliveries not yet acknowledged, runs ended since the document's updatedAt; one connector request with the Interpreter's output schema; PersonaPut under CAS; one signed delivery request into the crossing store); mention obligations per epiphany-inbound-mentions (renamed persona-inbound-mentions again). Depends on 3, 4. Test: a turn with the brake held signs nothing and puts nothing; a CAS conflict re-reads once.
  7. skill-mind-self (Eureka; blocked on self-run-actuator): the Self brief her unit runs (provenance line per wake-prompt-provenance, the queue recipe, the coexistence rule), and the SKILL.md:200 rewrite. By PR.
  8. doctrine-repoint (Eureka, gamecult-ops, the charters once in the Eureka repo; absorbs doctrine-persona-in-huginn r3 and the charters cut of charters-into-eureka-repo): every row of B14 except the operator's ~/.claude/CLAUDE.md (wording proposed in the cut report) and the rows marked history; H8's doctrine/self-improvement.md and README opening. Depends on 1 (the schema path) and 3 (the reader). By PR on the forge.
  9. mind-self-wake r4 (gamecult-ops; blocked on host-and-units, mouth-binding, dial-home): H10 deletion first; users eureka, eureka-self; the two token files; the control store and eureka-control; the units of the model page; anchors for eureka-yggdrasil; the Bifrost mouth unit's three flags; the runbook; the inventory rewritten. Depends on 4, 5, 6 by prose.
  10. huginn-mind-self-kinds (Huginn; eureka-substrate): pin bump, aliases, AlreadyClaimed, the live-claim subtraction in the recipes. Depends on 2.
  11. epiphany-archive (Epiphany; eureka-body; last): README replaced by the pointer (what moved, to where, from 4006b14b; what was deleted and why, one line each); tag archive-2026-10; the operator sets the GitHub archive flag. Depends on every cut above having landed, proven by nothing-runs-from-epiphany: no Cargo source, unit, script or runbook on the host or in the Mind's repos resolves into the repo.

Rejected

  • Keeping Epiphany alive as a dependency source after the archive (code-from-main would build the live mind from an archived repo).
  • Moving the resident Self's state machine as code: a second owner of the consumption fact the run claim holds (B10).
  • Moving the Persona service as code: 7,000 lines coupled to a dead runtime store for one request builder's worth of behaviour (B9, H6).
  • A ClaudeCode provider inside her Persona organ, or claude -p spawned by it: a provider door in her process and the token in her user.
  • Generalising CodexConnector into the one connector (r3): the operator's direction keeps it Codex.
  • A router or mux daemon in front of the connectors: a fourth authority for what caller config already says.
  • Reviving VoidBot's scheduler, worker, Postgres or bot for her: the paused replay defect and a second Discord identity (B7).
  • A timer with its own pressure state (r2's defect) or a Persona that decides cadence (the dial's job).
  • Renaming the stored type ids now: a migration bought for a name (wire-names).
  • Folding the method repo into Huginn, or Rust crates into the skill repo: every skill install would pull a Rust body, every Rust build a skill.
  • The webhook CLI as her mouth; a DM reader as the review channel; Rust value types for the v0 schema; a claim kind separate from run; running her on Starfire. All as before.