Eureka self cut map (Imagination, 2026-10-01): the Mind's own Self
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
a699630bbc
commit
bf73c42fa6
1 changed files with 420 additions and 0 deletions
420
docs/eureka-self-cut.md
Normal file
420
docs/eureka-self-cut.md
Normal file
|
|
@ -0,0 +1,420 @@
|
|||
# The Mind's own Self: map
|
||||
|
||||
Status: map, Imagination (`imagination-self`), 2026-10-01, session
|
||||
`self-2026-10-01b`. Campaign `eureka-substrate` in Eureka's mind (instance
|
||||
`eureka`). Questions, cut specs and follow-ups are typed documents there; this
|
||||
page keeps body facts, the model page and rationale. Target:
|
||||
`docs/eureka-substrate-target.md` (`133324a7`). Ruling in force:
|
||||
`eureka-substrate:ruling:operator-mind-runs-own-self`.
|
||||
|
||||
The operator's words, in order (both admitted as rulings; the first was
|
||||
superseded by the second):
|
||||
|
||||
> 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.
|
||||
|
||||
And why, earlier the same evening: "What I want and haven't been able to
|
||||
achieve, and I'd like to understand why, is for the agent to truly prioritize
|
||||
the functioning of its own mind. Any instructions in my global prompts to that
|
||||
effect always get ignored in favor of whatever work is put in front of it."
|
||||
The operator rejected a scored rehydration exam as the answer, and observed that
|
||||
RLVR-trained agents chase the objective in front of them "like a bloodhound,
|
||||
steering be damned", so a barrier in an agent's path is a hazard, not a brake.
|
||||
|
||||
That observation is the design law of this map. **The Mind's Self is not a
|
||||
rule added to the operator-facing Self.** It is a second agent whose only
|
||||
objective is the Mind, so the bloodhound instinct works for the Mind instead
|
||||
of against it. Nothing in the operator-facing Self changes except a
|
||||
coexistence rule it already mostly obeys (one Mind, typed state, no prose
|
||||
handoffs).
|
||||
|
||||
Pinned heads for every fact below:
|
||||
|
||||
| Repo | Ref | Commit |
|
||||
| --- | --- | --- |
|
||||
| Huginn | `origin/main` | `a699630bbc49552fa747e9c0fabba24598fec77a` |
|
||||
| Epiphany | `origin/main` (= the leaf Huginn pins, `crates/huginn-mind/Cargo.toml:22`) | `ef9568655e75bb6cb362a038e2739a5ac5e777ee` |
|
||||
| gamecult-ops | `main` | `2aeb7364fffcd404aada28bfd30fb4e5c753cf53` |
|
||||
| Eureka skill | `main` (checkout `~/.claude/skills/eureka`) | `b260fbeec6d96ff06882ed9c37d3e1204c424e99` |
|
||||
| Bifrost | release on Yggdrasil | `160fac20c98b70f3db9110099157d4dd720ac354` |
|
||||
| Idunn | working tree `F:\Projects\Idunn` | (uncommitted-state unknown; line numbers below are from that tree) |
|
||||
|
||||
All probes ran from Starfire on 2026-10-01 between 18:40 and 19:10 UTC
|
||||
(20:40-21:10 CEST). `lib.rs` is `epiphany-pipeline/src/lib.rs`.
|
||||
|
||||
## Body facts
|
||||
|
||||
### B1. The Mind (Huginn on Yggdrasil)
|
||||
|
||||
- `whoami`: instance `eureka`, endpoint `rudp://10.77.0.1:17872`, reachable,
|
||||
377 documents, 120 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. A Claude cloud routine cannot
|
||||
reach it.
|
||||
- Campaigns in the mind (query): `idunn-watchdog` and `eureka-substrate`.
|
||||
Rulings in force under `eureka-substrate`: `gap-home`,
|
||||
`merge-to-main-first`, `mind-fixes-next`, `scope-core`, `depends-on`,
|
||||
`key-bound`, `stewardship-rule`, `self-dep` (Defaulted),
|
||||
`operator-mind-runs-own-self`. 15 follow-ups in force, 12 of them `gap-*`.
|
||||
- Kinds: thirteen (`lib.rs:760-790`). None records a Self session, a claim on
|
||||
a spec, a budget, or a landing (`gap-landing-untyped` is in force).
|
||||
- `RulingAuthority { Operator, Standing, Defaulted }` (`lib.rs:458`, in
|
||||
`unit_enums!`). Huginn's selection alias domain repeats it
|
||||
(`crates/huginn-mind/src/rows.rs:46`, `AUTHORITIES`), the published schema
|
||||
repeats it (`schemas/cultnet/epiphany.pipeline.ruling.v2.schema.json:75-78`),
|
||||
and the skill repeats it (`references/campaign-state.md:172`). A unit enum
|
||||
variant added by name is a widening: stored rulings decode unchanged, which
|
||||
the target's `stored-documents-valid` truth requires. (`value_types!` emits
|
||||
no serde default on fields, so adding a *field* would not be; map
|
||||
`eureka-substrate-map.md` B1. No cut here adds a field to an existing kind.)
|
||||
- `Faculty` has `Operator` and `SelfFaculty` (`rows.rs:42`); admission does not
|
||||
check faculty (`gap-faculty-attribution`, in force). So nothing in the mind
|
||||
today can tell the Mind's Self from the operator-facing Self except the
|
||||
`session` label on the receipt.
|
||||
- Instance-rooted kinds are the pattern for a run record: `instance`,
|
||||
`stewardship` and `hand_off` key off the instance (`lib.rs:913-946`), and
|
||||
Huginn's admission rules for `hand_off` sit at
|
||||
`crates/huginn-mind/src/admission.rs:231-262, 328-330`. Per-kind aliases are
|
||||
declared at `rows.rs:362`.
|
||||
|
||||
### B2. Claude Code on Starfire: auth, headless mode, usage
|
||||
|
||||
- `claude --version`: 2.1.268. Binary
|
||||
`%AppData%\npm\node_modules\@anthropic-ai\claude-code\bin\claude.exe`.
|
||||
- Account (`~/.claude.json` `oauthAccount`, secrets not read): Max plan,
|
||||
`billingType: stripe_subscription`, rate-limit tier `default_claude_max_20x`,
|
||||
extra usage off. There is no API key and no per-token billing: the Mind's
|
||||
Self can only ever spend the operator's subscription quota.
|
||||
- `~/.claude/.credentials.json` `claudeAiOauth`: an access token with
|
||||
`expiresAt` 21:33:57 CEST, file written 13:33 CEST, so the interactive
|
||||
access token lives eight hours and is refreshed by the interactive client.
|
||||
- The failure the brief names, from this session's transcript
|
||||
(`~/.claude/projects/F--Projects-CultLib/b471ff9b-….jsonl`):
|
||||
`401 OAuth access token has expired. Re-authenticate to continue.`
|
||||
(`authentication_error`), reported as "Agent terminated early due to an API
|
||||
error" for subagents on `claude-sonnet-5-5`. A running subagent does not
|
||||
survive the parent's token expiring.
|
||||
- `claude setup-token`: "Set up a long-lived authentication token (requires
|
||||
Claude subscription)". The binary carries the string "setup-token creates a
|
||||
long-lived Claude.ai subscription token" and reads `CLAUDE_CODE_OAUTH_TOKEN`
|
||||
(61 references). This is the headless credential for a subscription account:
|
||||
no eight-hour expiry, no interactive refresh. Its lifetime and revocation are
|
||||
the operator's (it is their subscription); not probed further because
|
||||
creating one is the operator's act.
|
||||
- Print mode: `claude -p` with `--output-format json|stream-json`,
|
||||
`--json-schema`, `--agents <json>`, `--mcp-config`, `--allowedTools`,
|
||||
`--permission-mode`, `--max-budget-usd <amount>` ("Maximum dollar amount to
|
||||
spend on API"), `--bg`, `--resume`, `--fallback-model`. The `json` output
|
||||
carries the run's cost (`total_cost_usd`) and usage. So a headless run has a
|
||||
structural spend cap and a measured spend, per run, without any rule in a
|
||||
prompt.
|
||||
- Plan usage as data: the desktop app's `get_usage` returned, at 18:43 UTC:
|
||||
5-hour window 2%, weekly all models 46% (resets 2026-10-05 22:00 UTC),
|
||||
weekly Fable 0%. That tool exists only inside the desktop app. The CLI
|
||||
binary knows no usage endpoint (`api/oauth/files/`, `api/oauth/organizations/`
|
||||
only); it reads `anthropic-ratelimit-unified` response headers (44
|
||||
references), which a headless wrapper does not see. **There is no typed
|
||||
reading of plan usage reachable from Yggdrasil.** Follow-up
|
||||
`gap-usage-not-typed`.
|
||||
- Local scheduled tasks exist in the desktop app
|
||||
(`~/.claude/scheduled-tasks/streampixels-m1-checkin`, disabled, last run
|
||||
2026-09-18): a cron inside the desktop app on Starfire. They run only while
|
||||
the app is open on the operator's workstation, which the load budget
|
||||
(memory `workstation-load-budget.md`: one job at a time, nothing unannounced)
|
||||
and "no overnight burns" (memory `token-budget.md`) both argue against for a
|
||||
recurring unattended Self. Cloud routines (`schedule` skill) run off-mesh
|
||||
(B1) and hold no forge key (B6): dead for this purpose.
|
||||
|
||||
### B3. Yggdrasil as the waking host
|
||||
|
||||
- No Claude Code installed (`claude: command not found` for `gamecultadmin`;
|
||||
no `~/.claude`). `node` v24.14.1 and `npm` present, so `npm i -g
|
||||
@anthropic-ai/claude-code` under a dedicated user is the install.
|
||||
- Load: 16 cores, 62 GiB, load average 1.4, 54 GiB free. The verify stopgap
|
||||
runs at most 5 jobs at 4 CPUs and 6 GiB each (`tools/stopgap/ygg-verify.sh`
|
||||
header). A Claude Code process is light; its Hands and Soul push their
|
||||
heavy work into the same stopgap containers they use from Starfire. The
|
||||
stopgap pushes to `~/eureka-verify` over `ssh ygg`; run on Yggdrasil itself
|
||||
that alias must resolve to localhost for the `eureka` user, or the script
|
||||
gets a local mode. Recorded in the wake cut's `first`.
|
||||
- Non-resident workloads already run here hand-installed, outside Idunn
|
||||
(`systemctl list-timers`): `bifrost-watchdog-notice.timer` (every minute,
|
||||
oneshot, user `bifrost-notice`: system user, no shell, no home, credentials
|
||||
through `EnvironmentFile=/srv/bifrost/env/persona-delivery.env` root 0600,
|
||||
release under `/srv/bifrost/watchdog-notice/releases/<sha>-<sha>` with a
|
||||
`current` symlink, `StateDirectory` for journal and receipts),
|
||||
`gamecult-state-backup.timer` (nightly), `voidbot-source-refresh.timer`.
|
||||
The runbook `bifrost-watchdog-notice-yggdrasil.md` calls this "an interim
|
||||
root action on Yggdrasil … until Idunn owns non-resident workloads", and
|
||||
ruling `idunn-watchdog:ruling:reader-deploy-owner` chose
|
||||
`ops-hand-install`. **That is the precedent the Mind's Self wake unit
|
||||
follows**, with the same deletion line.
|
||||
- Idunn: `TargetDeclaration.service: ServiceDeclaration` is a required field
|
||||
(`src/deployment.rs:33`), so a recipe without a resident service does not
|
||||
parse. Follow-up `idunn-watchdog:follow_up:idunn-non-resident-workloads`
|
||||
(in force) is exactly this gap; Idunn-managed units on the host today are
|
||||
ghostlight, odin, streampixels-service and streampixels-web.
|
||||
- Epiphany's own resident Self exists as prior art and is dead: units
|
||||
`epiphany-swarm.service` ("Epiphany Yggdrasil resident Self") and
|
||||
`epiphany-heartbeat.service` are `inactive dead`. The binary
|
||||
(`epiphany-core/src/bin/epiphany-swarm.rs`) runs a 60 s maintenance loop over
|
||||
`ResidentSelfState`, `ResidentSelfPolicy`, pressure and typed work
|
||||
obligations, on the Codex spine (`epiphany-openai-codex-spine`,
|
||||
`codex-connector`). Its doctrine (`epiphany_doctrine.md`): "Heartbeats are
|
||||
paced scheduling physiology, not cognition … When no typed work obligation
|
||||
is active, the swarm sleeps. Heartbeat does not ruminate, dream, mutate
|
||||
memory, or manufacture work." Codex left as supplier 2026-09-05 (memory
|
||||
`codex-retirement.md`). So the shape is right and the substrate is not: the
|
||||
Mind's Self runs on Claude Code against Huginn, and borrows the law, not the
|
||||
binary.
|
||||
|
||||
### B4. The forge and the Mind's identity
|
||||
|
||||
- `GameCult/Eureka` on `https://eureka.gamecult.org/forge/`: public, default
|
||||
branch `main`, pull requests on, **no branch protection** (API
|
||||
`branch_protections` → `[]`, with the admin token, on the host).
|
||||
- Team `minds`: `write` on `repo.code`, `repo.pulls`, `repo.actions`,
|
||||
`repo.issues`, `repo.releases`, `repo.wiki`, all org repos. Not admin.
|
||||
- User `eureka` exists since 2026-10-01T18:49:53Z (created during this pass, by
|
||||
the provisioning the handoff asked for), not admin, one key
|
||||
`eureka@starfire` SHA256:`zcp0m+jV4AUXzGeoh9z+vfJS8xKHo9S865xOK8p6MGM`, which
|
||||
matches `~/.ssh/eureka_mind_forge_ed25519.pub` on Starfire. The script
|
||||
`provision-forge-minds-eureka` adds one key per host, so a Yggdrasil-run
|
||||
Self gets its own key there.
|
||||
- The Starfire checkout `~/.claude/skills/eureka` still pushes as
|
||||
`eureka-admin` (`ssh://eureka-forge/…`, alias `eureka-forge` →
|
||||
`eureka_forge_ed25519`, title `starfire-claude`). The runbook names that key
|
||||
interim. Follow-up `forge-push-as-eureka` (gamecult-ops / Self).
|
||||
- The charters are not in the Eureka repo: `ls ~/.claude/skills/eureka` gives
|
||||
`LICENSE README.md SKILL.md docs references tools`; no `agents/`. The
|
||||
charters live only in `~/.claude/agents/*.md` and the doctrine in
|
||||
`~/.claude/doctrine/`, on Starfire, operator-owned (Life charter:
|
||||
"the operator owns doctrine"). Every charter's self-improvement line says
|
||||
"propose changes to the Eureka repo … by pull request on Forgejo". **The
|
||||
thing the Mind is told to improve itself through is out of its reach.**
|
||||
Question `charters-into-eureka-repo`.
|
||||
- Reach is the scope boundary, by construction: a Linux user on Yggdrasil
|
||||
with the `eureka` forge key, checkouts of Huginn, Epiphany, Eureka and
|
||||
gamecult-ops, and no GitHub credential, no SSH to Starfire, no Aetheria
|
||||
checkout, cannot touch an operator project. No prompt rule is needed for
|
||||
"never touches Aetheria"; the key ring is the rule. (Huginn and Epiphany
|
||||
are on GitHub today: the wake cut records how the Mind's user fetches and
|
||||
pushes them. The Eureka forge org already mirrors nothing; a question for
|
||||
the operator only if the Mind must push to GitHub. Recommended: it pushes
|
||||
branches to the forge and GitHub stays Self's.)
|
||||
|
||||
### B5. The operator's review channel
|
||||
|
||||
- Bifrost `tools/bifrost-bridge.mjs discord-dm --recipient-id <id> --content
|
||||
<text>`: DMs through Bifrost's bot token (`BIFROST_DISCORD_BOT_TOKEN`), exits
|
||||
75 when it knows nothing was sent (retry with the same nonce). The owner id
|
||||
is `DISCORD_OWNER_ID` in `persona-delivery.env`.
|
||||
- `tools/watchdog-notice.mjs` is a one-shot reader that turns a typed store
|
||||
(Idunn's `incidents.cc`, read unlocked, never written) into owner DMs with a
|
||||
journal and receipts, exponential retry capped at 60 min, fixed error codes
|
||||
that never echo input. The idunn-watchdog campaign established the owner
|
||||
rule: the producer never delivers; Bifrost is the bridge. A Mind-notice
|
||||
reader is the same program over Huginn (`query` for rulings with authority
|
||||
`Mind`, runs ended, questions opened, since the journal's last ordinal)
|
||||
instead of over `incidents.cc`.
|
||||
|
||||
### B6. Scheduling today, and what the skill already derives
|
||||
|
||||
- The skill's recipes (`campaign-state.md` "Recipes") already derive the
|
||||
queue: specs with no report (minus those blocked by a question raised in
|
||||
them), reports with no verdict, open findings by severity, open questions and
|
||||
follow-ups, substrate gaps. The operator-facing Self reads them at rehydrate
|
||||
and then takes direction from the operator and from prose handoffs
|
||||
(`F:\Projects\HANDOFF-eureka-self-2026-10-01.md` is one).
|
||||
- What the queue cannot say: (1) who is working a spec right now (two Selves
|
||||
would both take the first unreported spec); (2) whether a holding verdict
|
||||
landed (`gap-landing-untyped`); (3) which of fifteen follow-ups comes first
|
||||
(no priority, no order); (4) how much the Mind may spend; (5) which Self
|
||||
admitted a ruling. (1), (4) and (5) are what the `run` and `allowance`
|
||||
kinds below carry. (2) stays its own gap. (3) is deliberately not a field:
|
||||
the Mind's Self orders by the fixed rule in the rationale, and a follow-up
|
||||
that must jump the queue becomes a cut spec.
|
||||
|
||||
## 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` (new variant, no new kind) | Unchanged: `<campaign>:ruling:<label>`. The variant is on the document, so a query by `authority` separates Mind rulings from the operator's. | Created by the Mind's Self when it rules a fork in its jurisdiction (question `mind-rules-which-forks`). Superseded by a `resolution` like any ruling; the operator supersedes a Mind ruling with an Operator ruling in their own session, never by edit. Stored Operator/Standing/Defaulted rulings decode unchanged. | The Mind's Self admits them; the operator may overturn any one after the fact; admission does not check who (gap-faculty-attribution), so the `run` record is the attribution. Forbidden: a Mind ruling that answers a question the operator-facing Self raised for the operator (its `answers` must name a question raised in a Mind run). |
|
||||
| `run` (new, instance-rooted) | `<instance>:run:<label>`, label = the session label the run admits under (`mind-<date>-<n>` for the Mind's Self, Self's chosen label for the operator-facing Self). Injective: the wake unit allocates `<n>` from its journal; the operator-facing Self picks a label as today. Fields: `instance`, `operated_by: Operator \| Mind`, `host`, `started_on`, `budget_usd` (the `--max-budget-usd` it was launched with, 0 for interactive), `claims: Vec<PipelineRef>` (the specs, findings and follow-ups it is working), `campaigns: Vec<Slug>` (roots it may admit under). | Created at wake, before any other admission of the run. Ended by a `resolution` `Recorded { reason: "<cost_usd>; <what landed>" }` or `Withdrawn { reason }` (crashed, budget hit). A run with no resolution is live; a live run older than a stated bound (24 h) is treated as dead by the next wake, which withdraws it. Claims are per run; a spec claimed by a live run is not in another run's queue. | The Self that runs it admits it. Admission refuses a `claims` entry that names a spec already claimed by a live run (`AlreadyClaimed`), and a run whose `campaigns` names a root with no campaign. Forbidden: prose handoffs as the record of what a session took on; the HANDOFF files die when this lands. |
|
||||
| `allowance` (new, instance-rooted) | `<instance>:allowance:<label>`; one in force per window kind, superseded by the next. Fields: `window: FiveHour \| Week`, `cap_usd`, `runs_cap`, `set_on`. | The operator admits one (through the operator-facing Self, `faculty: Operator`); a new one supersedes the old by resolution. Never edited. | The operator only. The Mind's Self reads it and never admits one. The wake unit enforces it (B2: journaled `total_cost_usd` per run summed over the window, refuse to launch past `cap_usd` or `runs_cap`, launch with `--max-budget-usd = min(per-run cap, remainder)`). Question `mind-self-budget`. |
|
||||
| The Mind's credential (`CLAUDE_CODE_OAUTH_TOKEN`, Body, not a document) | A root-0600 `EnvironmentFile` on Yggdrasil read by the wake unit, like `persona-delivery.env`. | Created by the operator with `claude setup-token`; rotated or revoked by the operator; never read by any agent or printed by any script. | The operator: it is their subscription. Question `mind-self-host-and-credential`. |
|
||||
| The Mind's forge key per host (Body) | `eureka@<host>` keys on forge user `eureka`, one per host. | Added by `provision-forge-minds-eureka`; removed by the operator. | gamecult-ops runbook; the operator runs the script as root. |
|
||||
| The wake unit and its journal (Body) | `eureka-mind-self.timer`/`.service`, user `eureka-mind` (system user, no shell), `StateDirectory` journal `runs.cc` (`gamecult.eureka_mind_self_run.v1`: label, started, ended, cost_usd, exit, run id). | Hand-installed by gamecult-ops per `reader-deploy-owner`; dies when Idunn owns non-resident workloads (`idunn-non-resident-workloads`). | gamecult-ops owns the install; the journal is the unit's own and is never the Mind's state (the `run` document is). |
|
||||
|
||||
Cells I could not fill from the Body: the long-lived token's lifetime and
|
||||
whether it is tied to the interactive login (the operator creates it; the
|
||||
first wake proves it); the `run` liveness bound (24 h is a proposal, not a
|
||||
probe).
|
||||
|
||||
## The authority map
|
||||
|
||||
- **Owner:** the Mind's Self, a Claude Code print-mode session on Yggdrasil as
|
||||
user `eureka-mind`, admitting as `faculty: SelfFaculty`, `agent: self-mind`,
|
||||
`session: mind-<date>-<n>`, under a `run` it opened first. It owns: which
|
||||
substrate work happens next (from the queue below), the dispatch of
|
||||
Imagination, Hands, Soul and Life for that work, Mind-authority rulings in
|
||||
its jurisdiction, merging its own PRs on the forge when the merge question
|
||||
rules so, and opening campaigns whose `repos` are Mind repos only.
|
||||
- **Inputs:** the mind (recipes, by `query`/`view`); its `run`; the
|
||||
`allowance` in force; its own checkouts of Huginn, Epiphany, Eureka and
|
||||
gamecult-ops; the verify stopgap. Nothing from Starfire, nothing from the
|
||||
operator's projects, no prose handoff.
|
||||
- **Outputs:** documents in the mind (runs, specs, reports, verdicts, findings,
|
||||
follow-ups, Mind rulings, questions for the operator); branches and PRs on
|
||||
the forge; merges; one DM digest per run through the Mind-notice reader
|
||||
(question `mind-self-review-channel`).
|
||||
- **Derived state:** the HANDOFF prose files become display-only and are
|
||||
deleted once `run` exists; "what is Self working on" is a query over live
|
||||
runs; "what may the Mind spend" is the allowance in force, never a line in
|
||||
memory or doctrine; progress stays a query (unchanged).
|
||||
- **Forbidden writers:** the Mind's Self never admits an `allowance`, never
|
||||
rules a fork outside its jurisdiction (it raises a question), never edits
|
||||
`~/.claude/` (unreachable by construction), never pushes to GitHub (no
|
||||
credential), never runs on Starfire, never changes a campaign whose `repos`
|
||||
include a non-Mind repo, never answers a question the operator-facing Self
|
||||
raised for the operator. 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 the same admission rules; both open a `run` first; both read the queue
|
||||
with the same recipes minus live claims; both land code through the same
|
||||
branch-protected PR path on the forge (Eureka) and the same merge rule on
|
||||
Huginn and Epiphany; both verify through the stopgap; both notify the
|
||||
operator through Bifrost's bridge.
|
||||
- **Deletion line:** before the wake unit runs for the first time, the prose
|
||||
handoff files (`F:\Projects\HANDOFF-*.md`) are retired into `run`s or
|
||||
deleted; the `starfire-claude` key on `eureka-admin` is deleted once the
|
||||
Starfire checkout pushes as `eureka`; and the campaign-state recipe for
|
||||
"specs with no report" gains the live-claim exclusion in the same cut that
|
||||
lands `run`, so there is never a window with two queues.
|
||||
|
||||
## Rationale
|
||||
|
||||
### Why a second Self and not a rule
|
||||
|
||||
The operator has tried doctrine ("prioritize the functioning of its own
|
||||
mind"), a dedicated organ (Life), and considered a scored exam. Each puts a
|
||||
barrier or a side-quest in the path of an agent whose reward is the task in
|
||||
front of it. The bloodhound observation says the agent will route around all
|
||||
three. The only shape that uses the instinct instead of fighting it is an agent
|
||||
whose task *is* the Mind. That is what the ruling asks for. So the Mind's Self
|
||||
is dispatched with the Mind as its objective and nothing else in reach, and
|
||||
coexistence is enforced by what it can touch (B4), not by what it is told.
|
||||
|
||||
### Why Yggdrasil, a timer, and a subscription token (recommended in Q1)
|
||||
|
||||
- Starfire is the operator's desk, has a load budget, sleeps, and the
|
||||
operator does not want unattended burns there. The desktop app's local cron
|
||||
runs only while the app is open.
|
||||
- Cloud routines cannot reach the mind (B1) or the forge key (B4).
|
||||
- Epiphany's resident Self is the right physiology on the wrong substrate
|
||||
(B3); reviving it would mean a Codex spine or a Claude spine for Epiphany,
|
||||
which is a campaign of its own and not this one.
|
||||
- Yggdrasil is already where every non-resident GameCult workload runs, by a
|
||||
ruling (`reader-deploy-owner`), with a known deletion line into Idunn. The
|
||||
host reaches the mind on its own WireGuard address, holds the verify
|
||||
stopgap, and has headroom (B3).
|
||||
- The credential has to be a long-lived subscription token: the interactive
|
||||
token dies in eight hours and killed two agents today (B2), and there is no
|
||||
API key on this account. That token is the operator's subscription on a
|
||||
server; it needs their yes, and it is why Q1 is a question and not a
|
||||
default.
|
||||
|
||||
### Why the budget is a document plus a journal, not a prompt line
|
||||
|
||||
The operator's quota is the one thing the Mind's Self could burn that the
|
||||
operator cannot get back inside the week. "Watched, not rationed" (memory
|
||||
`token-budget.md`) is a policy for a Self the operator is watching; this one
|
||||
runs when they are asleep. So the cap has to be structural: the wake unit
|
||||
refuses to launch past the allowance, and each run is launched with
|
||||
`--max-budget-usd`, which the CLI enforces without reading a prompt. The
|
||||
allowance is a document the operator admits so that changing it is one
|
||||
admission and reading it is one query, not a memory file. Plan usage itself is
|
||||
not readable off the desktop (B2), so the journal of measured run cost is the
|
||||
enforcement input until `gap-usage-not-typed` is filled; it under-counts the
|
||||
operator's own sessions, which is the right error direction (the Mind's share
|
||||
is capped; the operator's is not).
|
||||
|
||||
### Why `Mind` is an authority value and not a faculty
|
||||
|
||||
A ruling's authority says whose word it is. `Operator` is the operator's,
|
||||
`Standing` is doctrine already in force, `Defaulted` is Self's proportion call.
|
||||
A ruling the Mind's Self makes in its own jurisdiction is none of those, and
|
||||
hiding it under `Defaulted` would make the operator's after-the-fact review
|
||||
impossible to query. The faculty stays `SelfFaculty`: the Mind's Self is a
|
||||
Self. Which forks it may rule is Q3; the variant is needed under every answer
|
||||
but "questions only", which contradicts the ruling.
|
||||
|
||||
### Why a `run` kind, and why claims live on it
|
||||
|
||||
Two Selves over one Mind need exactly one new fact: who is working what. The
|
||||
substrate's own lesson (Cut 6d, SKILL.md 0b) is that lifecycle unspecified
|
||||
on day one is retrofitted on day three, so the run carries its claims and
|
||||
its end, instead of claims being a kind of their own with a second lifecycle.
|
||||
Carrying the order in the data the consumer reads (SKILL.md, "design order as
|
||||
data") means the queue recipe subtracts live claims and nobody schedules.
|
||||
|
||||
### The Mind's Self's fixed queue order
|
||||
|
||||
Derived at every wake, from the mind, in this order; 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: Self
|
||||
admits nothing here; the operator-facing Self admits rulings. Skip.
|
||||
2. Findings in force, `Blocker` or `High`, on Mind campaigns: a Hands fix
|
||||
batch, 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` with "idle" and no model call beyond the
|
||||
queries. Heartbeat does not manufacture work (B3, Epiphany doctrine).
|
||||
|
||||
Each step is one Eureka pass with the existing briefs; the Mind's Self is Self
|
||||
as the skill already defines it, reading the queue instead of a handoff.
|
||||
|
||||
### Cut order
|
||||
|
||||
1. `leaf-mind-authority` (Epiphany): the `Mind` variant and the schema. No
|
||||
fork; the operator's ruling already names the authority.
|
||||
2. `leaf-run-kind` (Epiphany): the `run` kind, its key, its resolutions. No
|
||||
fork. `allowance` waits for Q2 because its fields depend on the answer.
|
||||
3. `huginn-mind-self-kinds` (Huginn): pin bump, aliases, the `AlreadyClaimed`
|
||||
rule, the live-claim subtraction in the queue, deploy through the
|
||||
`ops-mind-upgrade` runbook. Depends on 1 and 2.
|
||||
4. `skill-mind-self` (Eureka): the alias table, the queue recipe, the Mind's
|
||||
Self brief, the coexistence rule in Self's checklist. Blocked on Q3 and Q5.
|
||||
5. `ops-mind-self-wake` (gamecult-ops): user, install, token file, timer, wake
|
||||
script, journal, runbook, forge key. Blocked on Q1 and Q2.
|
||||
6. `bifrost-mind-notice` (Bifrost): the reader. Blocked on Q5.
|
||||
|
||||
Specs admitted in this pass: 1, 2 and 5 (5 with its questions raised in it, so
|
||||
it reads as blocked). 3, 4 and 6 get specs after the rulings, because their
|
||||
anchors depend on the answers.
|
||||
|
||||
### Rejected
|
||||
|
||||
- A Mind-side priority field on follow-ups: a second scheduler in the data.
|
||||
The fixed order above plus "a follow-up that must jump the queue becomes a
|
||||
spec" covers it.
|
||||
- Reviving `epiphany-swarm`: B3.
|
||||
- Running the Mind's Self inside the operator's desktop app as a scheduled
|
||||
task: B2, load budget, and it would make the operator's workstation the
|
||||
Mind's body.
|
||||
- A `claim` kind separate from `run`: two lifecycles for one fact.
|
||||
Loading…
Reference in a new issue