Cut 15 fix batch 2: operator directions reach Soul; fix batches and mutations

Self's triage of Soul pass 2 on 272f5ca:
- Soul's rehydrate runs rulings in force, so standing operator directions
  (including ones admitted after the spec) reach it, and it claims against
  them. A verdict claim has no ruling reference, so Soul starts the claim
  text with the ruling id; recorded as a substrate gap (epiphany-pipeline).
- Gaps table: a cold semantic embed exceeds the client's 15 s deadline
  (Huginn, with the embedder).
- Self does not TaskStop an agent halted on Unavailable; it holds the
  unadmitted record and is resumed when the organ answers.
- A fix batch's cut_report is the next attempt on the finding's in-force
  cut_spec, on that spec's branch; landing elsewhere needs a revised spec
  first (SKILL step 5, Hands brief).
- mutations holds survivors plus the kills Soul should rerun (at most 64);
  totals go in verification evidence.
- InvalidInput and TooLarge are caller-fixable and retried after fixing
  the call; only Unavailable after a retry and other errors stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-30 15:41:08 +02:00
commit f0ff4842c6
3 changed files with 46 additions and 23 deletions

View file

@ -261,11 +261,13 @@ nothing is pasted or paraphrased. The brief says:
name: a behavioural test is missing, a fixture is degenerate (see below),
or the mutant is equivalent and gets a one-line reason. Boundary flips on
float thresholds are equivalent by default and are not chased. The score is
not a gate; the triaged survivor list is the record. Every mutation goes in
the report's `mutations`; each survivor also gets a `deviations` entry with
not a gate; the triaged survivor list is the record. The report's
`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 than trusting Hands'
triage.
in `references/campaign-state.md`). 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
harness that punishes refactoring." Anchors couple a suite to the code's
@ -337,7 +339,9 @@ not fine in the same working tree, and never while a Soul pass reads that tree.
Brief Soul with the `cut_report` id and the session label. The report carries
the exact range and Hands' promises. **Soul's claims are not bounded by what
Hands chose to promise.** Soul also views every ruling the `cut_spec` cites and
makes one claim per ruling, and measures the target invariants the cut touches.
makes one claim per ruling, runs the rulings-in-force recipe so that standing
operator directions reach it (including ones admitted after the spec), and
measures the target invariants the cut touches.
Hands' self-report is one input to attack, never the list of what gets checked.
Point Soul at the specific places a shortcut would hide. Soul:
@ -374,8 +378,11 @@ exists.
For each finding in force, decide:
- **fix now:** brief Hands with the finding's id. Only Self closes the finding
`Fixed`, and only after a Soul pass on the fix's report holds;
- **fix now:** brief Hands with the finding's id. The fix batch's `cut_report`
cites the finding's in-force `cut_spec` as its next attempt, on that spec's
branch. If the fix must land elsewhere, Imagination (or Self) admits a revised
spec first. Only Self closes the finding `Fixed`, and only after a Soul pass
on the fix's report holds;
- **operator fork:** a `question` raised in the finding, with a recommendation;
- **defer:** a `follow_up` with the reason it can wait, and the finding
resolved `Deferred` to it;
@ -450,7 +457,8 @@ and reconciles the target doc with the Body.
`references/campaign-state.md`). Say so to the operator. Continue a stopped
agent with `SendMessage` once `whoami` answers. Never keep the record in prose
or memory "until it is back": that is a second copy, and the mind is the only
store.
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
same day. The specs and rulings need no sweep, because their resolutions

View file

@ -39,9 +39,11 @@ Campaign state lives in the instance's mind, through the eureka-state tools
them, stop and report which.
3. Run <recipes>, with root = <c>, and view every id this brief names.
Admit as faculty <Faculty>, agent <your name>, session <session>. A refusal
names the rule that refused: fix the batch and admit again. Retrying an admit
is safe (AlreadyAdmitted). Any other isError, or the mind going away mid-pass:
stop where you are and report the step; never send your record as prose.
names the rule that refused: fix the batch and admit again. InvalidInput and
TooLarge are the same: fix the call (or narrow it) and retry. Retrying an admit
is safe (AlreadyAdmitted). Unavailable after one retry, any other isError, or
the mind going away mid-pass: stop where you are and report the step; never
send your record as prose.
```
## Self: open a campaign, rule, triage
@ -188,7 +190,9 @@ cites, read by id):
Every rule the spec or the operator names gets a behavioural test. Measure the
suite with <the ecosystem's mutation tool>, scoped to this cut's diff
(`--since:<base>` or the tool's equivalent), against the final spelling of the
code. Record every mutation in the report's mutations. Triage every survivor
code. The report's mutations (at most 64) holds every survivor and the kills
Soul should rerun; put the totals (generated, caught, unviable, missed) in
verification evidence. Triage every survivor
by name and line: killed by a new test, killed by fixing a degenerate fixture,
or equivalent with a one-line reason. The mutation record has no field for that
reason, so each survivor also gets one deviations entry (what: its label; why:
@ -306,13 +310,17 @@ boundary with no half-deleted authority, and put what remains in undone.
Don't edit the prose map.
Admit one cut_report for <cut_spec id>, attempt <n>:
Admit one cut_report for <cut_spec id>, attempt <n>. A fix batch is the next
attempt on the finding's in-force spec, on that spec's branch; if the fix
cannot land there, stop and report, because Self or Imagination must admit a
revised spec first. Its fields:
- commits (builds: false for any that don't build), and the range; the head
must be one of the commits
- verification: one evidence entry per build, test run and grep, with the
command as locator and the counts as result
- mutations: each entry, its exact edit (before and after), and whether it
failed as expected; the survivor triage goes with it
- mutations: every survivor and the kills Soul should rerun (at most 64),
each with its exact edit (before and after) and whether it failed as
expected; totals go in verification, each survivor's triage in deviations
- deviations: spec discrepancies you fixed, each with why
- forks: the question ids you admitted
- structural_delta: lines, dependencies, formats and targets removed or added
@ -343,14 +351,15 @@ Admit one verdict and its findings, and nothing else.
Yielding to announce the wait is the same violation: block in-turn or read
the finished output, never end the turn to say you are waiting.
Scope: <cut_report id>. Rehydrate (recipes: target in force, one cut's record
for <cut>), then view the report (its range and its promises), the cut_spec it
Scope: <cut_report id>. Rehydrate (recipes: target in force, rulings in force,
one cut's record for <cut>), then view the report (its range and its promises), the cut_spec it
cites, and every ruling the spec cites. Admitting your verdict is a write to
the mind, not to a repo.
Hands' promises are one input, not the boundary of the pass. Falsify every
promise, every ruling the spec cites (operator directions included, in the
operator's own words), and every target invariant the cut touches, and
promise, every ruling the spec cites, every operator direction in force (even
one admitted after the spec; in the operator's own words), and every target
invariant the cut touches, and
specifically:
- <the load-bearing claim, and what would make it false>
- <where split authority could hide. Two paths that decide the same rule are
@ -399,8 +408,9 @@ Admit one verdict (pass <n>) and its findings in one batch:
- one claim per promise in the report, Holds, Falsified or Unproven, each with
its evidence (the numbers: test counts, entries killed, the survivors you
retriaged) and the report's mutation labels it reran
- one claim per ruling the spec cites, naming the ruling id, whether or not
Hands promised anything about it
- one claim per ruling the spec cites and per operator direction in force,
its text starting with the ruling id (a claim has no ruling field), whether
or not Hands promised anything about it
- claims of your own for what you attacked beyond those
- each finding Confirmed or Plausible, with its locations (file:line), failure
scenario, severity, origin, and the target invariant labels it breaks. A

View file

@ -53,7 +53,10 @@ This is the one rule for every faculty.
2. **`Unavailable`:** retry the same call once. A cold semantic embed after an
idle spell took over 15 s live, which is the client's whole timeout.
Retrying `admit` is safe, because an exact replay answers `AlreadyAdmitted`.
3. **Still no answer, or any other `isError`:** stop. A subagent reports the
3. **`InvalidInput` or `TooLarge`:** the call is wrong, not the organ. Fix it
(the arguments, or a narrower selection or smaller batch) and retry, as for
a refusal.
4. **`Unavailable` after the retry, or any other `isError`:** stop. A subagent reports the
error and the step it stopped at, and stays resumable: Self continues it
with `SendMessage` once `whoami` answers. Never send the record to Self as
prose, and never keep it anywhere else meanwhile. The mind is the only
@ -74,7 +77,7 @@ mismatch. The root is the campaign slug, or the instance for `instance`,
| `question` | `<label>` | Imagination; Hands or Soul for a fork | title, question, options (≥2), recommended, depends, raised in | `raised_in` |
| `ruling` | `<label>` | Self | answers (none for an operator direction), choice, ruling, operator quote, date, authority | `answers` |
| `cut_spec` | `cut-<cut>.r<rev>` | Imagination | repo, branch, base, depends on, first, deletes, keeps and moves, adds, file changes, authority map, verification, estimate | `rulings`, `questions` |
| `cut_report` | `cut-<cut>.h<attempt>` | Hands | commits, range, verification evidence, mutations, deviations, forks, structural delta, landed names, undone, promises | `cut_spec`, `forks` |
| `cut_report` | `cut-<cut>.h<attempt>` (a fix batch is the next attempt) | Hands | commits, range, verification evidence (mutation totals included), mutations (survivors and the ones Soul should rerun), deviations, forks, structural delta, landed names, undone, promises | `cut_spec`, `forks` |
| `verdict` | `cut-<cut>.s<pass>` | Soul | range, claims (each with an outcome, evidence, findings, promise, mutations) | `cut_report`, `findings` |
| `finding` | `cut-<cut>.s<pass>.<label>` | Soul, in the verdict's batch | confidence, severity, claim, invariants, locations, failure scenario, evidence, origin | `verdict` |
| `follow_up` | `<label>` | Self; Imagination for work no cut owns | source, repo, locations, item, why it can wait, owner | `source` |
@ -294,6 +297,8 @@ something new.
| `MutationRecord` has no field for why a survivor is equivalent, and a report holds at most 64 mutations. | Every mutation goes in `mutations`. 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 |