From f0ff4842c6777956232fb5d1fface3bcdb43c940 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 30 Sep 2026 15:41:08 +0200 Subject: [PATCH] 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 --- SKILL.md | 24 ++++++++++++++++-------- references/briefs.md | 36 +++++++++++++++++++++++------------- references/campaign-state.md | 9 +++++++-- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/SKILL.md b/SKILL.md index acecf70..044296f 100644 --- a/SKILL.md +++ b/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 diff --git a/references/briefs.md b/references/briefs.md index 81d8fa1..6fa864f 100644 --- a/references/briefs.md +++ b/references/briefs.md @@ -39,9 +39,11 @@ Campaign state lives in the instance's mind, through the eureka-state tools them, stop and report which. 3. Run , with root = , and view every id this brief names. Admit as faculty , agent , 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 , scoped to this cut's diff (`--since:` 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 , attempt : +Admit one cut_report for , attempt . 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: . Rehydrate (recipes: target in force, one cut's record -for ), then view the report (its range and its promises), the cut_spec it +Scope: . Rehydrate (recipes: target in force, rulings in force, +one cut's record for ), 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: - - ) 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 diff --git a/references/campaign-state.md b/references/campaign-state.md index e18dca3..c296682 100644 --- a/references/campaign-state.md +++ b/references/campaign-state.md @@ -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` | `