Map: substrate specs re-pointed onto Huginn (2026-10-09); run cadence reads admission time

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-09 14:18:18 +02:00
commit 8bceac082b

View file

@ -135,7 +135,7 @@ pipeline kinds are in Huginn `docs/eureka-substrate-map.md`.
| --- | --- | --- | --- |
| Pipeline wire ids | `epiphany.pipeline.<kind>.v2`, epoch `epiphany.pipeline.epoch.v2`, defined by the leaf. After `leaf-into-huginn` the crate is Huginn `crates/eureka-pipeline` (lib `eureka_pipeline`), ids unchanged. | Renamed once to `eureka.pipeline.<kind>.v3` by one `mind.redb` migration, at the next breaking leaf change or before the first hosted mind (ruling `wire-names-rename-before-hosting`). Adding the `run` kind or the `Mind` authority variant is additive (old stored documents decode; no migration), so it does not trigger the rename; a field added to an existing struct would. | Huginn owns the leaf. The migration is a live-mind upgrade, which is the operator's (`mind-rules-which-forks`). |
| Leaf crate and schema catalogue | Huginn `crates/eureka-pipeline`, `schemas/cultnet/` (13 pipeline schemas, `gamecult.persona_state.v0`, index, README). `epiphany.work_organ_state.v0` dies: no reader outside Epiphany (grep, F1/F3). | Copied once from Epiphany `ef956865` byte-for-byte, then renamed in a separate commit; Epiphany's copy is archived with the repo. | Huginn. Forbidden: any Cargo source resolving into GameCult/Epiphany (`nothing-runs-from-epiphany`). |
| `run` | `<instance>:run:<label>` (cut-run-kind r1). Label `mind-<YYYY-MM-DD>-<n>` allocated by the waker as one plus the count of that day's runs; two wakers racing produce the same key with different content, which admission answers `Conflict`, so the name stays injective. | The waker admits it open, with its claims, before starting the unit (the run is the grant). The Self in the unit admits under that label and ends it `Recorded { reason }`; a run with no end after 24 h is `Withdrawn` by the next wake. Initiative runs (empty queue, `no-idle-time`) carry no claims; the dial bounds them. | Opening: the waker. Ending: the Self that worked it; the waker only withdraws dead ones. Forbidden: Hands, Soul, Imagination, Life. |
| `run` | `<instance>:run:<label>` (cut-run-kind r1). Label `mind-<YYYY-MM-DD>-<n>` allocated by the waker as one plus the count of that day's runs; two wakers racing produce the same key with different content, which admission answers `Conflict`, so the name stays injective. | The waker admits it open, with its claims, before starting the unit (the run is the grant). The Self in the unit admits under that label and ends it `Recorded { reason }`; a run with no end after 24 h is `Withdrawn` by the next wake. Initiative runs (empty queue, `no-idle-time`) carry no claims; the dial bounds them. Cadence is read from the run's admission time, not `started_on` (a date cannot carry seconds; run-kind r2). | Opening: the waker. Ending: the Self that worked it; the waker only withdraws dead ones. Forbidden: Hands, Soul, Imagination, Life. |
| Repetition breaker | No state of its own (rulings `self-waker`, `merge-gate-own-soul`). Trip condition derived from ended runs over one claimed item: last 3 ended runs admitted nothing but themselves, or 10 of the last 50. | When tripped, the waker admits one `question` labelled `breaker-<item local>` under the item's campaign, `raised_in` the item; the existing blocked-spec recipe then removes the item from the queue. Answered by a ruling or withdrawn; either reopens the item. | The waker admits the question; any Self may answer it (substrate-internal, `mind-rules-which-forks`). |
| Brake | One document per instance in a root-owned CultCache store `/etc/gamecult/minds/<instance>/control.cc`, type `eureka.control.brake.v1 { released: bool, set_at, set_by }`. | Replaced whole by the operator's CLI; never appended. Absent or undecodable reads as held. Holding it also stops running units (`systemctl stop`, ruling `self-run-actuator`). | Operator only (ruling `brake-dial-root-store-now`); her units read it, and the file is not writable by any user she runs as. |
| Burn-rate dial | Same store, `eureka.control.burn_rate.v1 { heat, base_cooldown_s, base_run_usd, set_at, set_by }`; `heat` in 0.05..=2.0. | Replaced whole by the CLI. Absent or out of bounds reads as heat 0, which launches nothing (fail closed, LiteLLM scar rider of ruling `connector-owner`). Schedules and her own rest arrive later as follow-up `burn-schedule-and-rest`. | Operator. Derived (never stored): wake cadence `base_cooldown_s / heat`, per-run cap `--max-budget-usd = base_run_usd × heat`, per-request `max_cost_usd`. |
@ -182,9 +182,12 @@ neutral. Keeping the backend compiling costs nothing; deploying it is not propos
In dependency order, with what blocks each:
1. eureka-substrate re-points: `mind-authority` r2, `run-kind` r2, `huginn-persona-state` r3
onto Huginn after `leaf-into-huginn` (follow-up `substrate-specs-repoint`). The waker
needs `run` and `AlreadyClaimed` (`huginn-mind-self-kinds`, never specified).
1. eureka-substrate re-points, admitted 2026-10-09 against Huginn: `mind-authority` r2,
`run-kind` r2 (absorbs `huginn-mind-self-kinds`: `AlreadyClaimed`, the run's resolution
row, the `claims` edge), `huginn-persona-state` r3, `doctrine-persona-in-huginn` r3. All
wait on `leaf-into-huginn` merging; `run-kind` also on question `persona-turn-run`.
`leaf-key-bound` and `leaf-read-anchors` re-point after the merge (follow-up
`leaf-specs-repoint`).
2. `connector-kit-lift`, `connector-spend`, `connector-reasoning-item`,
`connector-contract-v3`, `claude-connector`, `openai-compatible-connector`: blocked
on the kit repo joining the campaign (follow-up `body-campaign-repos`).