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:
parent
272f5ca5d3
commit
f0ff4842c6
3 changed files with 46 additions and 23 deletions
24
SKILL.md
24
SKILL.md
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue