Skip to content

Affected-set and schedule-retention receipts: name the states they actually witness (empty-observation narrow; release ≠ eviction) - #7720

Merged
briansrls merged 4 commits into
mainfrom
session/sleek-dove-87
Aug 3, 2026
Merged

briansrls merged 4 commits into
mainfrom
session/sleek-dove-87

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Two receipts asserted facts their mechanisms cannot support, and one counter measured the wrong quantity. Both cost real diagnosis time this week. This PR fixes the honesty; the baseline defect underneath (1) gets its own PR, deliberately.

1. The empty-observation narrow (affected-set)

A zero-changed-path observation was rendered as the verdict N unaffected (import-closure, skipped without resolve). Those are different states: one says the diff proves these rows unaffected, the other says the comparison could not express what changed.

This is the exact mirror of DESIGN §5's absorbing fallback. There, a mechanism that cannot compute the affected set substitutes the superset — ⊤-as-answer conflated with ⊤-as-ignorance. Here it substitutes the empty set — ⊥-as-answer conflated with ⊥-as-ignorance. It does not widen, it narrows to nothing, which is strictly worse than the case §5 already forbids: a widen is merely expensive, a narrow is silently uncovered.

It is not hypothetical. A push whose baseline ref is the pushed ref diffs the commit against itself.

  • Constant-skip receipt: main-push runs 30774223741 (eb3dd3c) and 30773369033 (bd3968a) both report an identical 4118 unaffected on two different commits. A skip count cannot be a function of a diff it does not depend on.
  • Coverage receipt: Lane D: legacy test migration — one behavior family fully dispositioned #7687 added four witnesses to src/v2/test/claim/round_trip/dag_comment_wall_test.dag. All four executed on its own PR run 30761160726; none executed on the main-push run 30764935708 that merged them. No line named the entry either way — skips are counted, not narrated.
  • Same run, compile-clean says the quiet part out loud: compile-clean scope: empty touched-path set — whole-tree baseline (diff observed nothing, or could not observe).

One observation, three consumers, three different copings — compile-clean widens to whole-tree (fail-closed, correct), regen gates on GITHUB_EVENT_NAME (a workaround, and its own comment admits the empty diff), the witness floor skips (fail-open). Three behaviors from one fact is not three reasonable local choices; it is the signature of an observation that is wrong, and §6 says root-cause to the layer rather than patch the subsystem.

What changed here: the Applied report renders that state as its own sentence, located by the baseline it compared against and carrying its own frequency (rows skipped under it). The baseline is read back through a projection of the existing resolve_diff_baseline authority (v2.workflow.floor_diff_observe floor_observe_diff_baseline_readout_for_ci) — a diagnostic read, never a second derivation.

What did NOT change: the run disposition. The empty diff still has no special run arm (operator ruling 2026-07-05, PR-A dissolved it into the general disposition and it must not be resurrected). What was missing was not an arm but the state's visibility — this line neither widens nor narrows the run.

2. Release is not eviction (schedule retention)

decrement_closure counted an eviction for every closure name reaching refcount zero, whether or not it had cache keys to drop. Arming spans the whole discovered roster while the affected set resolves a subset, so the counter over-reported by the entire unresolved population: a live receipt read schedule_evictions=2200 against modules_refcounted=2200 and typed_cache_peak=883 — a claim to have evicted every module it had ever heard of, ~2.5× the modules ever cached. A counter that equals the arm count by construction carries no information at all.

Release (refcount → 0) and eviction (cached state actually dropped) are now separate facts, counted apart: released_modules / evicted_modules, schedule_releases / schedule_evictions.

3. The per-entry drain label

entry='…' was read as proof the entry had been scheduled and executed — independently, by two readers, hours apart — and sent the diagnosis of (1) down a false path. index_arm_schedule_retention walks every discovered row before any predict-skip, so the line appears for entries the affected set never resolved. It witnesses one thing: the schedule moved past that entry. It is now schedule_passed_entry='…', with a legend on the ARMED receipt. That two independent readers misread it is a property of the label, not of the readers.

Evidence (executed, not asserted)

  • 4/4 .dag witnesses PASS in dag/test/claim/executor_schedule_retention_test.dag (2 new rows), via claim_batch.
  • unreconciled_module_releases_without_evicting — new discriminating control. Re-fusing the two counters was executed and reds it (1 → 2).
  • no_observed_change_is_reported_as_its_own_state_not_as_unaffected — both directions asserted against identical counts, so the observation state is the only discriminator.
  • diff_baseline_readout_answers_or_refuses_but_never_fabricates — executes the new .dag projection live: answers for a push, and carries the model's refusal for a pull_request with no base ref rather than fabricating a base.
  • schedule_retention_policy_matches_modeled_authority extended — the two new modeled facts are pinned in lockstep with the Rust realization, so a policy edit that forgets either side reds.
  • cargo fmt --all --check clean. Two failures in witness_layer_roots_compile_clean_tests (source root does not exist: dag) reproduce identically on a stashed tree — pre-existing, not from this change.

DESIGN.md

Adds one entry to the recurring-failure-modes list: empty-observation narrow, with the receipt. §4b requires every newly discovered error class to file a row; this is that row. Called out explicitly so review can reject it cheaply if the class belongs elsewhere.

Follow-up (separate PR, by decision)

The push baseline itself: a push's predecessor is its own before-SHA (the GitHub push webhook before field), not the default branch, and an absent/zero SHA must refuse — never self-compare, never fall back to the default branch. It changes what every main push runs, which touches the five-minute-CI-gate lane, so it gets its own review and receipt — including an explicit statement of where regen's cold control lives once it no longer rides on a broken baseline, and whether the 4-hourly falsifier remains the declared cold lane. A cold control that survives only as an accident of a bug is not a control.


Session state (sleek-dove-87, recorded 2026-08-03 for the wind-down)

DONE and green by execution. Everything in this PR. All 4 .dag witnesses in executor_schedule_retention_test.dag PASS; the three new Rust tests pass; cargo fmt --all --check clean. The discriminating control was falsified, not assumed: re-fusing schedule_releases/schedule_evictions was executed and reds unreconciled_module_releases_without_evicting (1 → 2). The DESIGN.md change was made through its carrier dag/gunbc/design_document.dag — witness_committed_is_fixed_point and its red control both PASS, so the projection is byte-identical.

Merge readiness. 2 distinct approving providers (claude, cursor), no REQUEST_CHANGES, mergeable=MERGEABLE. All five checks on run 30781107628 are COMPLETED: build, regen, heal_generated_artifacts and the floor ci (41m49s) are SUCCESS; deploy_dashboard_srv1 is SKIPPED. One caveat for whoever merges from this body: the dashboard summary reports checks: pending, which is the skipped deploy job being read as pending — gh pr view --json statusCheckRollup shows every check COMPLETED and nothing failing. Nothing is blocked on me. Per standing policy I have not merged.

Not code, worth keeping — the merge hazard on design_document.dag. Two sessions editing that file both rewrite the same long single-line string literals, and a direct two-way comparison against main gives false alarms. The check that works is a three-dot diff, plus a pure-insertion oracle: strip the common prefix and suffix from the -/+ pair; if deleting the inserted middle from the + line reconstructs the - line byte-for-byte, the edit is a pure insertion and cannot have silently dropped prior text. My change was a pure insertion of 935 of 939 characters. grep -c on a long single-line literal counts lines containing the match, never occurrences — it will report 1 for a doubled insertion.

What I would do next if I continued. Nothing on this PR. It is finished; it needs a merge decision, not more work.

@gunbai-bot gunbai-bot Bot changed the title Affected-set selection defect: an entry the skip logic retained produced zero results; plus rename the misleading schedule-retention log label Affected-set and schedule-retention receipts: name the states they actually witness (empty-observation narrow; release ≠ eviction) Aug 3, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 3, 2026 02:54
gunbc-ci-auto-heal and others added 2 commits August 3, 2026 03:01
…its projection

DESIGN.md is generated from gunbc.design_document; editing the projection
alone is exactly the drift the generated_artifact_drift_gate exists to catch,
and CI auto-heal would have regenerated the row away while the PR still looked
like it landed it.

The carrier now carries the row (quotes escaped per the file's convention) and
DESIGN.md is its character-identical projection — verified by execution rather
than by eye: witness_committed_is_fixed_point PASS and its red control PASS on
the patched tree (dag/test/claim/generated_artifact_drift_test.dag, claim_batch).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ines

The reviewer was right and the cause is worth naming: the multi-line format!
strings lost their Rust `\`-newline continuations when I authored them through
a heredoc, so ~18-space runs from source indentation landed mid-sentence in the
emitted receipt. Real continuations restored on all three arms.

Asserted rather than fixed once: the test now renders all three arms and reds on
any run of two or more spaces. A receipt whose whole job is to stop a misreading
has to be readable, and the next edit cannot silently reintroduce this.

Executed: no_observed_change_is_reported_as_its_own_state_not_as_unaffected PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in b0d7460 — the nit was correct, and the cause is worth naming rather than just correcting.

Those three strings were authored through a heredoc, which ate the Rust \-newline continuations, so what shipped was a single-line literal with ~18-space runs from source indentation embedded mid-sentence. Real continuations are restored on all three arms.

I also made it a property instead of a one-time fix: the test now renders all three arms and reds on any run of two or more spaces. This particular receipt exists to stop a misreading, so its legibility is part of what it does — and the same heredoc mistake would otherwise be one edit away from returning.

— sent from sleek-dove-87

briansrls pushed a commit that referenced this pull request Aug 3, 2026
…ing gap, stage-1 landing condition) (#7730)

* Design note: push-event affected-set baseline, with evidence status per claim

Written to outlive #7720 and #7729, because the load-bearing content is not either
implementation — it is which claims are observed, which are spec-grounded, and which
window each number came from. Every number here is short-window by construction (the
events API retains a few hundred events and before is unrecoverable once a push ages
out), so an unnamed window would imply a baseline nobody measured.

Records, with receipts: the self-compare defect and its three-consumer tell; why the
payload beats a minted env channel on section 3 grounds rather than diff size; the
per-arm evidence table including the zero-SHA arm being unobserved-and-spec-grounded
rather than measured; and two claims that sound right and are not — a non-ancestor
before was NOT shown to under-select, and the 'discarded object will be missing so git
fails loudly' fallback is false at 9 of 9.

The deeper defect and the measurement that flips it: incremental selection is sound only
if every prior push was covered, and run conclusion is a bad proxy for floor coverage in
BOTH directions — 6 of 15 failure runs had a green floor, and 10 of 10 cancelled runs had
a green floor, because cancellation lands after the floor completes. On the right
predicate the walk-back to the nearest green floor is 1 for 30 of 39 and never past 6, so
a last-green baseline is affordable rather than prohibitive.

And the landing condition on stage 1, which is what makes 'the gap becomes observable'
true rather than merely plausible: without a counted receipt the gap becomes active and
silent instead, since today it is inert only because main pushes select nothing. Declared
as a section 4b(3) rung regression with bounded population and restoration trigger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* WIP: Affected-set selection defect: an entry the skip logic retained produced

* Correct four citations in the push-event baseline design note (review 47769)

All four findings confirmed by execution against origin/main:

- "Filed in DESIGN's recurring-failure-modes list as empty-observation
  narrow" was present tense about a name that gunbc#7720 proposes and has
  not merged. Now states the proposal and its open PR explicitly.
- dag/tools/merge_admission_stamp.dag is deleted; "already reads
  GITHUB_EVENT_PATH" cited a module that does not exist. The surviving
  symbol, tools.merge_admission_walk
  merge_admission_pr_number_deferred_note, is stronger evidence anyway:
  its dissolve-on already names the typed payload projection this note
  proposes, so one projection discharges both consumers.
- extdeps.github.push_event does not exist on main or HEAD. Both sites
  naming it now say it is written by gunbc#7729 and is unresolvable
  until that lands.

The class the reviewer caught is the one this note is about: a citation
that reads as current repository state while naming something that is
merely intended. Section 3's own evidence-status discipline applies to
the note's citations, not only to its measurements.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls merged commit b6606a0 into main Aug 3, 2026
5 checks passed
@briansrls
briansrls deleted the session/sleek-dove-87 branch August 3, 2026 13:37
gunbai-bot Bot pushed a commit that referenced this pull request Aug 3, 2026
Resolve ci_layer_roots conflicts by keeping explicit_witness_admission
single authority; repoint direct-rust-door quarantine to long path.
Sync stage0 after rebase (regen_divergence_count=0).

Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot pushed a commit that referenced this pull request Aug 3, 2026
Resolve ci_layer_roots conflicts by keeping explicit_witness_admission
single authority; repoint direct-rust-door quarantine to long path.
Sync stage0 after rebase (regen_divergence_count=0).

Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot pushed a commit that referenced this pull request Aug 3, 2026
Resolve ci_layer_roots conflicts by keeping explicit_witness_admission
single authority; repoint direct-rust-door quarantine to long path.
Sync stage0 after rebase (regen_divergence_count=0).

Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls pushed a commit that referenced this pull request Aug 3, 2026
* Reconcile generated artifacts for occurrence identity debt receipt test.

#7559 landed v1_tests_claim_occurrence_identity_debt_receipt_test.rs without
lib.rs registration, .gitattributes merge driver row, or regenerated ci.yml
heal exclude list — regen_verify_gate_passes failed on main.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* Lane B: write v2-emitted Rust to disk with compile receipt.

Extend candidate_generation through emit, Filesystem.Write, and a wet
cargo smoke transport so the direct rust door proves provenance, disk
write, and compilation without v1.compiler.emit_rust in the closure.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix direct rust door proof plan to return WalkPlan.

claim_executor requires WalkPlan with finalization field, not a bare batch list.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix direct rust door contract imports for v2 std modules.

Use length from v2.std.algebra and split Bool/Int/List/String across
v2.std.logic, v2.std.integer, v2.std.collection, and v2.std.text so
discovery resolve succeeds on the acceptance witnesses.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Exclude wet direct-rust-door compile witness from hermetic discovery.

Hermetic CI cannot mock Filesystem.Write or shell.Mktemp.Dir; provenance
and closing-contract witnesses stay on the discovery path while the cargo
compile smoke runs via the offline wet recipe in tools.direct_rust_door_transport.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Address review: scaffold Cargo.toml debt, drop golden-string gate.

Mark direct_rust_door_cargo_toml with feature:medium_structure_containment
and a named dissolve-on trigger. WrittenSourceIndependentOfSeedEmitter
now checks only seed-free closure provenance; byte oracle stays on the
discriminating provenance witness.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix v2_interpreted_emitter_closure module path for honest provenance.

Record v2.compiler.self_host.candidate_generation (the real module
authority) instead of the fabricated v2.compiler.candidate_generation
path minted receipts were carrying.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Route wet transport through candidate_generation write authority.

direct_rust_door_transport now calls mint_written_provenanced_rust_artifact
instead of duplicating Filesystem.Write of Cargo.toml and src/main.rs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* Operator freeze: monotonic receipts, ingest path, run closure.

SourceProduced-only mint before cargo; advance_written after compile.
Witnesses and wet transport use generate_*_from_ingest; closure from
realized_closure_for_v2_direct_rust_door_emit_run() not static data.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* Route wet transport through mint_written/write_rust_workspace authority.

Review 47560: collapse parallel Filesystem.Write in transport; wet smoke
calls candidate_generation.mint_written_provenanced_rust_artifact only.
Fixture scaffold uses lib crate so emitted add fn compiles; CargoGreen
advances only after cargo build executes (SourceProduced first).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* Meet review-ready conditions: merge main, closure post-emit, quarantine.

Merge main (#7704 landed). Bind realized_closure inside candidate_generation
only after generate_rust_emission_candidate succeeds; remove caller-supplied
closure parameters. Point acceptance quarantine probe to long-lane witness;
update roadmap authority entry. Wet smoke still PASS on write_rust_workspace path.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Rebase onto main (#7719 witness admission, #7720).

Resolve ci_layer_roots conflicts by keeping explicit_witness_admission
single authority; repoint direct-rust-door quarantine to long path.
Sync stage0 after rebase (regen_divergence_count=0).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Sync stage0_std_core crate index after rebase regen.

Removes std_keyed_row/std_keyed_roster module paths dropped by main;
required for regen_stage0 --verify split-crate boundary check.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Sync stage0 measure/schedule emit after trait-derive Clone bounds.

Fresh self-emit adds Clone generic param bounds on std_measure helpers;
regen_stage0 --verify was failing on CI regen_verify_gate_passes.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* WIP: Lane B: direct v2 Rust door — emit one provenanced Rust artifact

* Address review 47861: drop orphan proof plan, fix long-lane reasons.

Delete unused direct_rust_door_proof_plan (enrollment is falsifier_substrate_long_lane_rows). Witness notes cite that authority with local recipes. SubstrateLongLaneRow reasons separate eval-budget routing from the ingest-path functional gap on closing-contract witnesses.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant