Substrate gaps live in the mind; Imagination owns the model page

The gap table in campaign-state.md duplicated eight typed follow-ups; it now
gives the query instead. The first campaign no longer admits the list; every
campaign runs the query. Imagination edits the model page when a probe
changes a row. Stewardship is universal (operator, 2026-09-30).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-30 16:39:37 +02:00
commit e96c482940
4 changed files with 78 additions and 27 deletions

View file

@ -40,7 +40,7 @@ its own brief. A faculty that grades its own work has lost the point.
| Faculty | Runs against | Admits | Must not |
|---|---|---|---|
| **Imagination** | the Body (source, docs, probes), plus the target | `question`s and `cut_spec`s specified to `file:line`, and `follow_up`s for work no cut owns; body facts and rationale go to the prose map | commit code, choose a product fork silently |
| **Imagination** | the Body (source, docs, probes), plus the target | `question`s and `cut_spec`s specified to `file:line`, and `follow_up`s for work no cut owns; body facts, the model page and rationale go to the prose map | commit code, choose a product fork silently |
| **Hands** | one `cut_spec` | small pushed commits, then one `cut_report` | redesign the spec, work around a fork |
| **Soul** | Hands' *executed* commits | one `verdict` and its `finding`s | edit or commit a repo, or review a plan (a pass on a plan is Imagination) |
| **Life** | memory surfaces | nothing: named mutations and proposals | touch Body code, restate what an owner records |
@ -265,8 +265,8 @@ nothing is pasted or paraphrased. The brief says:
`mutations` (at most 64) holds every survivor and the kills Soul should
rerun; the totals (generated, caught, unviable, missed) go in its
`verification` evidence. Each survivor also gets a `deviations` entry with
its triage, because the mutation record has no field for it (a substrate gap
in `references/campaign-state.md`). Soul reruns the tool on the range rather
its triage, because the mutation record has no field for it (substrate gap
`idunn-watchdog:follow_up:gap-mutation-triage-field`). Soul reruns the tool on the range rather
than trusting Hands' triage.
- **No committed hand-written mutation suites, and no fallback harness.**
The operator ruled this on 2026-09-22: "Better to have nothing than a
@ -460,7 +460,7 @@ and reconciles the target doc with the Body.
store. Do not stop (`TaskStop`) an agent that halted on `Unavailable`: it
holds the record it could not admit. Resume it when the organ answers.
- **Keep the prose map current.** After a ruling changes a design, sweep the
map's body facts and rationale, and the target doc, for the old version the
map's body facts, model page and rationale, and the target doc, for the old version the
same day. The specs and rulings need no sweep, because their resolutions
already say what is in force.
- **One owner per decision, in code too.** When Hands moves a decision partway, for
@ -506,7 +506,8 @@ and reconciles the target doc with the Body.
the missing thing or route work to it: work around it and leave evidence. The
evidence is a `follow_up` whose source is the document where the run felt the
gap, and whose owner is the missing thing's owner. The gaps already known are
listed in `references/campaign-state.md`.
follow-ups in the mind; "Substrate gaps" in `references/campaign-state.md`
gives the query and where a new one is admitted.
- **Never claim an agent's result before its notification arrives.**
## Git and tooling rules (scars)

View file

@ -54,12 +54,16 @@ Self's own checklist; Self admits as `SelfFaculty`.
Open: check the eureka-state tools are present, then whoami (the mind's
instance document, <instance>:instance:self, already exists). Write the target
document and commit it on the working branch. For each repo in scope with no
stewardship in force, admit a stewardship (sequence = latest + 1). Then admit
the campaign (slug, title, every repo a cut may touch, working_branch,
target_doc = a DocRef to that commit) and target revision 1 (labelled
invariants, not in scope, canonical implementations, doc = the same DocRef).
In the first campaign, admit a follow_up for each substrate gap listed in
campaign-state.md.
stewardship in force, admit a stewardship (sequence = latest + 1).
Stewardship is universal today: one mind, one steward. The operator said on
2026-09-30 that leasing it between agents is a deferred cut. The per-repo
record exists only because admission requires it
(idunn-watchdog:follow_up:gap-stewardship-ceremony). Then admit the campaign
(slug, title, every repo a cut may touch, working_branch, target_doc = a
DocRef to that commit) and target revision 1 (labelled invariants, not in
scope, canonical implementations, doc = the same DocRef). Run the
substrate-gaps query in campaign-state.md, so the campaign starts knowing
which workarounds are in force.
Rule: for each operator answer, a ruling (answers, choice, authority, and
operator_quote when the words matter). A direction that answers no question is
@ -115,8 +119,10 @@ You are Imagination for <migration>. Admit a cut_spec for <cut or cuts> so
Hands can go straight to the cut with little reading.
Admit only cut_specs, their superseding resolutions, and questions. In the
prose map at <path>, edit only body facts and rationale. Do not commit; the
root agent commits. Do not change code in any repo. Scratch probes in
prose map at <path>, edit body facts and rationale. Also edit the model page
whenever a probe changes a row's identity, lifecycle or authority. Imagination
wrote that page in 0b, and a model a cut contradicts is stale steering text.
Do not commit; the root agent commits. Do not change code in any repo. Scratch probes in
<scratchpad> are fine.
Rehydrate (recipes: target in force, rulings in force, open questions and

View file

@ -286,21 +286,33 @@ reading its verdicts and findings, check that `admission.provenance.faculty` is
## Substrate gaps
The skill works around each of these, and Self admits each as a `follow_up`
(source: the campaign, owner as named) in the first campaign, so the gap is
counted rather than forgotten. Add to this list when a run works around
something new.
The known gaps in the mind's substrate are `follow_up`s in the mind, not a
list on this page. Each one names the gap, its owner, and in
`why_it_can_wait` the workaround the skill uses meanwhile. The workarounds
that steer agents are also written into the step or brief that applies them.
Examples are the mutation triage in `deviations`, the ruling id at the start
of a claim, and the retry on `Unavailable`.
| Gap | What the skill does meanwhile | Owner |
|---|---|---|
| `faculty` is attribution only. Admission does not check that verdicts and findings come from Soul, or that rulings come from Self. | Recipes filter `faculty`, and readers check provenance. | Huginn admission, with the Epiphany schema owner |
| `MutationRecord` has no field for why a survivor is equivalent, and a report holds at most 64 mutations. | `mutations` holds the survivors and the kills Soul should rerun; the totals (generated, caught, unviable, missed) go in `verification` evidence. Each surviving mutation gets one `deviations` entry (`what`: its label; `why`: the triage). Deviations hold at most 32, so more survivors than that means the cut was too big. | `epiphany-pipeline` |
| A `cut_report` needs a commit (`range.head`), so a pass that stops at a fork before its first commit leaves no report. | Hands admits only the question and reports its id. The blocked-spec check reads it. | `epiphany-pipeline` |
| The faculty enum says `MindSteward`; the faculty is Life. | Life admits nothing, so nothing is mislabelled today. | `huginn-mind` |
| A verdict claim cannot reference a ruling: `VerdictClaim` has `promise: Option<Label>` and no ruling reference. | Soul starts each ruling claim's text with the ruling id. | `epiphany-pipeline` |
| A cold semantic embed after an idle spell exceeds the client's 15 s deadline. | Retry `Unavailable` once. | Huginn, with the embedder |
| No tool supplies the session's id. | Self picks a session label and passes it in every brief. | `eureka-state` |
| The reports-with-no-verdict hop cannot filter the citer's faculty. | Soul's queue is checked against the verdict's provenance. | CultNet selection |
Every follow-up is rooted in a campaign, so no substrate-rooted home exists
yet (`idunn-watchdog:follow_up:gap-substrate-followups-campaign-rooted`).
Until one does, substrate gaps live under the first typed campaign,
`idunn-watchdog`, with labels starting `gap-`:
```json
{ "selection": { "schemas": ["epiphany.pipeline.follow_up.v2"],
"fields": [{ "index": "root", "op": "any_of", "values": ["idunn-watchdog"] },
{ "index": "in_force", "op": "any_of", "values": ["true"] }] } }
```
- **When a run works around a gap that is not there,** Self admits a new
`gap-<name>` follow-up under that root. Its source is the document where the
run felt the gap, and its owner is the missing thing's owner.
- **When a run hits a gap that is already there,** it admits nothing new. The
run records the recurrence where it happened: a report's `deviations`, or the
prose map. The count lives in that evidence until the follow-up kind can
carry it.
- **Do not copy the list back here.** A table on this page is a second copy, and
it goes stale the day an owner fixes a gap.
## The prose map

View file

@ -2,6 +2,38 @@
Record each change to the skill together with the evidence that motivated it.
## 2026-09-30: substrate gaps are read from the mind, and Imagination owns the model page
The first typed campaign, `idunn-watchdog`, admitted the eight gaps from
`campaign-state.md` as follow-ups, as the Self checklist said. That left the
same eight facts in two places: the typed follow-ups and the page's table. The
table would go stale the day an owner fixed a gap, and the skill forbids
exactly that second copy. It also showed that a follow-up is keyed to its
campaign, so the next campaign's recipe could not see the gaps at all
(`gap-substrate-followups-campaign-rooted`).
In the same run, Imagination's cut pass found that incidents must live in their
own file rather than in Idunn's `control.cc`. That merged two rows of the model
page. The cut-mapping brief allowed Imagination to edit only body facts and
rationale, so it handed the stale page to Self. That was the page it had
written itself in 0b.
The operator also stated that stewardship is universal: "there is only one
Mind, one steward. Leasing stewardship between agents is a deferred cut".
What changed:
- **`campaign-state.md`:** "Substrate gaps" no longer carries a table. It gives
the query for the `gap-*` follow-ups under `idunn-watchdog`, and says where a
new gap is admitted and how a recurring one is recorded.
- **`SKILL.md`:** the two references to that table now point at the mind.
- **Self's checklist:** the first campaign no longer admits the gap list. Every
campaign instead runs the substrate-gaps query. The checklist also records
that stewardship is universal and that the per-repo record only satisfies
admission.
- **The cut-mapping brief:** Imagination edits the model page whenever a probe
changes a row. The faculty table and the same-day sweep line now name the
model page.
## 2026-09-22: the hand-written mutation harness is retired, with no fallback
The operator said: "The manual mutation testing turned out to be a terrible