Repository navigation
PR-A: typed per-cause Refusals; empty diff dissolved into the general disposition; hunkless diffs attribute at path grain - #6286
Conversation
… empty diff dissolved into the general disposition (operator rulings 2026-07-05)
Model (affected_set_floor_runner.dag): WitnessRunDisposition gains
Refused { cause: WitnessRefusalCause } with per-cause variants
(DiffObservationRefusal, FrontierQueryRefusal) so each failure class has
an observable frequency; the DiffObservationFailClosed/FrontierFailClosed
-> RunWitness absorbing arms are gone; the special empty-diff arm
(RunWitness "empty diff — run full corpus (fail-closed)") is DELETED —
an empty touched-path set flows through the general disposition and skips.
floor_precompute_would_skip loses its empty special arm the same way.
Host (cli_run.rs): the empty-diff conjunct that silently disabled
selection is removed (empty diff = selection ON, all rows take the
normal not-affected skip); the observation-failure error is reshaped to
counted refusal vocabulary (cause + row count); hunkless diff entries
(pure rename, binary, mode-only, deletion) now attribute at PATH grain
via diff-header parsing — previously they vanished from changed_paths
entirely, a live soundness hole in mixed diffs; departed paths
(renamed-from/deleted) contribute their structurally-empty decl set
without erroring the derivation.
Tests: string-asserting empty-arm tests deleted and replaced with
empty-flows-general + per-cause refusal witnesses (Run/Skip arms as red
controls); every disposition match total over the new variant. DESIGN §5
e.g. prose updated from open-repair to repaired (model + carrier).
Git-interface grain (name-status vs header parse, rename pair
semantics, base-ref resolution, path quoting) deliberately open —
flagged for operator inline discussion per ruling 1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Refused carrier + per-cause variants, empty special arms deleted, string-asserting tests replaced with refusal witnesses and red controls. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…execution instance) The multiline data initializer (newline directly after =) is outside the v1 grammar — the only such site in the corpus — so this entry never parsed and its fail-closed contract was asserted by nothing (tidy-deer's audit class, live instance). Initializer joined to one line with an on-carrier note; the contract test now runs by execution with the PR-A refusal semantics. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…wet regen, drift gate green) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Receipts — all by execution on this head (ctrl-build remote):
Pre-existing, differential-verified NOT this PR: cli_run's two disposition_kernel_alignment tests fail identically on the near-main tree (same asserts, line offsets match this PR's added lines exactly). They exercise the legacy NodeFrontierSeeds path — Steps 4–5's deletion target — and broke during the verdict blackout; tracked with the gate-green/bare-red family. Incidental: the regenerated ci.yml normalizes a trailing blank line — main's committed artifact is currently one byte off generator output (drift gate red-by-a-byte on main); this PR's merge fixes it. — sent from gentle-owl-459 |
…h the rulings
- provenance_fail_closed_contract_note: the carrier note still described
the run-all posture its own test no longer asserts; rewritten to the
refusal contract (carrier is the authority, DESIGN section 6).
- floor_skip_discovery_witness: the empty-diff witness asserted
skipped==0 ("fail-closed run-all") — the exact absorbing arm PR-A
deletes; now asserts unaffected rows SKIP on an empty diff.
The invalid-base witness asserted observation failure silently ran the
roster; now asserts the typed refusal Err naming DiffObservationRefusal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eeds it) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…air the in-process observe resolve - The exists() shortcut conflated a legitimately departed path with any unreadable path (state-space conflation on the arm this PR exists to fix). The diff is now the single authority on departure (parse_unified_diff_departed_paths: deletion +++ /dev/null, rename from-side): departed => structural-empty decl set; absent-but-not- departed => typed refusal (observation incoherence). Control 6 updated to the refusal contract; control 6b added for the deletion-shaped Ok. - floor_git_diff_range passed a relative entry into the absolutely-rooted process shared index, loading the observe module as a second declaring source and tripping the collision wall (duplicate module declaration) — red on main since the S1 shared index, blackout-masked, confirmed by near-main differential. Entry spelling now matches the index root spelling; canonical identity normalization stays with the collision-wall engine lane. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n point entry_source_from_index_or_disk compared path SPELLINGS, so a relative entry against an absolutely-rooted shared index minted a second declaring SourceFile for the same module and tripped the collision wall (duplicate module declaration / self-cycle) — red on main since the S1 shared index, blackout-masked; hit floor_git_diff_range, the floor runner co-resolve, and per-file diff attribution alike. Identity is now the canonical file (fs::canonicalize both sides; genuine two-file forks still collide). The earlier per-site absolute-spelling patch in floor_git_diff_range is reverted — one fix at the boundary, not whack-a-mole at every caller. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Round-3 receipts (all by execution, ctrl-build remote, head 8b8f74f):
What the last commit fixed at the root: — sent from gentle-owl-459 |
|
Operator ruling on the FLAGGED git-interface items (2026-07-05): faithfully model git's interface — no hardcoded assumptions that are not true of the provider generally; switching providers must not break the solution. Disposition of the four open items under that ruling:
Follow-up PR (this lane, immediately after this merges) lands the extdeps model + host cutover and deletes the header scrape. — sent from gentle-owl-459 |
|
Correction upgrading an earlier receipt: the two On the current CI reds: the — sent from gentle-owl-459 |
Implements operator rulings 1–2 (2026-07-05, relayed via cool-hawk-899): a failure arm must refuse, never widen; empty diff is not a state.
Model (
affected_set_floor_runner.dag— the disposition authority)WitnessRunDispositiongainsRefused { cause: WitnessRefusalCause }; causes are per-variant (DiffObservationRefusal,FrontierQueryRefusal) so each failure class has its own observable frequency (ruling 2: per-row counted red, witness not run, siblings continue, floor exits nonzero).DiffObservationFailClosed → RunWitness,FrontierFailClosed → RunWitness, and the special armRunWitness{"empty diff — run full corpus (fail-closed)"}— deleted, together with the tests that asserted its string. An empty touched-path set flows through the general disposition (nothing affected →SkipAssumedGreen);floor_precompute_would_skiploses its twin special arm the same way.floor_kernel_would_skipkeeps its Bool contract for the host happy path; itsRefusedarm is unreachable by construction (the wrapper builds only*Produced) and carries an on-carrier note forbidding refusal-through-Bool routing.Host (
cli_run.rs— realization)!line_ranges_by_file.is_empty()conjunct that silently disabled selection on an empty diff (= run everything) is removed: empty diff now runs selection with structurally-empty edits → precompute skip + per-row not-affected skips.cause=DiffObservationRefusal rows=N), exit 1 — the only ignorance state, per ruling 1.diff --githeader parsing. This fixes a live soundness hole beyond the ruling's scenario: pure renames, binary changes, mode-only changes, and deletions emit no+++ b/line, so their paths previously vanished fromchanged_pathseven in mixed diffs — their witnesses would silently skip. Departed paths (renamed-from/deleted) contribute a structurally-empty decl set (a computed ∅, not ignorance) without erroring the derivation.skip_unaffected_node_frontier: false) remains its own config state — never conflated with empty.FLAGGED OPEN — git-interface grain (operator inline discussion, per ruling 1)
git diff --name-status -Mgrain (typed rename/copy/delete rows) — the honest model of git's own vocabulary.DiffPolicy; unchanged here, but a name-status surface would restate it.Adjacent observations (not changed here)
NodeFrontierSeedspath (collect_frontier_seeds_from_diff_line_ranges) still carriesrun_all()absorbing arms — it is Steps 4–5's deletion target; converting arms scheduled for deletion is wasted motion.Receipts (by execution — landing before ready-flip)
Runner witness composites, provenance contract, both-axes disposition, wet-regen + drift gate for the DESIGN carrier, clippy -D warnings, targeted host tests.
🤖 Generated with Claude Code