Repository navigation
Affected-set differential falsifier: SelectionPredictOnly + nightly cadence workflow (signed design, all three items) - #6299
Conversation
…tly cadence workflow (signed design)
Model:
- std.realization_schedule: NodeFrontierSelection coproduct (Off/Applied/
PredictOnly) replaces the skip_unaffected_node_frontier Bool on
RunnableDiscoveryBatch — a Bool could not express predict-without-apply
and two Bools would conflate the state space. All constructors and
patterns migrated; eq via match (no reflection).
- gha_workflow.dag: the Schedule trigger arm now carries its payload
(schedule: [{cron: <rendered>}]) — formerly a payload-dropping stub
that rendered invalid GHA syntax; first live constructor is this
workflow. GHA quirks (UTC, 5-min floor) noted on the carrier.
- gunbc.falsifier_workflow: nightly cron (0 7 * * * UTC) + dispatch;
prelude + release build + predict-only cold run of the discovery
corpus over a declared 20-commit window base; step budget 120m, job
backstop = step-sum + prelude allowance per the step-budget ruling.
- ci_floor_plan: gunbc_falsifier_batches — one RunnableDiscoveryBatch,
SelectionPredictOnly, tree-wide scan dirs, enrolled entries empty.
- generated_artifact: FalsifierYamlArtifact → .github/workflows/falsifier.yml
(CommitRequired/GithubActionsWorkflow, yaml-parse extra_valid).
Host:
- DiscoveryCorpusOptions.node_frontier_selection (mode enum); PredictOnly
records the per-row prediction (new DiscoverySummary.predicted_unaffected
— skipped rows previously had NO identity, only a count), runs every row
cold, and emits a counted DIVERGENCE attribution when a predicted-
unaffected row runs red (the red itself fails the batch through the
normal channel; divergence is attribution, not a second verdict).
- claim_executor marshal: absent node_frontier_selection is a typed
REFUSAL — the former Bool defaulted to false when absent, a fail-open
where a stale plan silently dropped its declared selection semantics.
Witnesses: falsifier_workflow_witness_test (cron render + red control,
backstop arithmetic, artifact path); ci_floor_plan falsifier batch shape;
three predict-only discovery witnesses incl. the discriminator that a
red predicted-AFFECTED row is NOT a divergence.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtifact_eq arm, match-on-first idiom Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…module; fixture needle must hit the test fn line, not the note string Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…act transport; drift gate green on this content) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ss_discovery_scan_dirs (no parallel roster) The straggler check's -v realization_schedule filter masked realization_schedule_witness_test.dag — exactly the file named for the type. Scan-dirs row deleted; the plan consumes the ci_layer_roots authority. Mirror regen lands next commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…splice of the fresh emit) The fresh emit-fresh output carries unrelated emitter drift (measure-tower generics the hand-synced seed does not export), so per established seed practice only this change's emitted declarations are spliced onto the committed base: the NodeFrontierSelection enum (+ variant unit structs), node_frontier_selection_note, node_frontier_selection_eq, the RunnableDiscoveryBatch field, and the runnable_eq comparison. Closes the section-3 parallel-representation gap cursor flagged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ier drift the falsifier regen exposed) #6277 added !docs/plans/witness-subject-execution-audit.py to the committed .gitignore but not to the gitignore model, so any regen deleted the line — model-carrier drift masked on main by the budget-red floor, exposed here because this PR's new artifact forced a regen. The allowlist is now a modeled IgnoreArtifact row in the PythonLocalDevScript group. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…esh-artifact roster; generator bytes, sha-verified transport) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Post-approval receipts round (two small commits since the approvals, both regen-transport):
Full receipt set re-run on head: schedule witness PASS, plan witnesses PASS, floor_skip_discovery_witness exit 0 (all three divergence discriminators), wet regen + drift gate exit 0, clippy/fmt clean. — sent from gentle-owl-459 |
…cursor round 3) generated_artifact_drift_test.dag asserted the registry count and per-artifact coverage but was not in this PR's receipt roster — the exact affected-set miss the falsifier exists to catch. Count 7 -> 8, plus committed/ignored-path/commit-policy/extra-validation rows for the new artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
cursor round-3 finding fixed and proven: FalsifierYamlArtifact is enrolled in all four registry-completeness witnesses in generated_artifact_drift_test.dag (count 8, committed, not-ignored-path, GithubActionsWorkflow commit-policy, extra-validation), and the witness runs green by execution on head: PASS generated_artifact_drift_witnesses (wet, exit 0). The finding was fully valid — that witness file was outside this PR's receipt roster, which is exactly the affected-set miss this falsifier exists to make loud. — sent from gentle-owl-459 |
|
CI-failing disposition, named: the failing check is the composed floor job — 'The action gunbc ci (.dag witnesses + gates) has timed out after 90 minutes' — while rust_tests PASSES in 6m43s on this head (the #6296 warm step working as designed). The timeout is the pre-existing whole-tree floor budget class, red on every recent main run as well (all five latest main runs are failure, including the #6297/#6302/#6304 merge commits), so it is not introduced by this diff. It is, precisely, the corpus-denominated cost this PR's program exists to dissolve: the falsifier here plus the module-grain floor cutover in #6301 are the affected-set mechanism that shrinks the floor from whole-tree to per-change. No fix commit is warranted on this branch; the substantive receipts (all witnesses, wet regen, drift gate) are green by execution per the receipt table and comments above. — sent from gentle-owl-459 |
…ict-only rides it Conflict resolution: entry_file_touched now consumes #6301's per-entry module-grain fact (current_entry_file_touched); the verdict keeps this branch's would_skip name so SelectionPredictOnly records it per row. The Bool->mode rename migrates #6301's new sites (name-status gate, module_graph ctx gates in both the serial and shard paths) and the runner-note phrase naming the former flag. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r: no magic 30) The 30 was a stale copy of gunbc_ci_release_build_step_timeout_minutes, which #6296 raised to 45 — the witness corroborated the drift instead of catching it. It now cites the two authorities the backstop composes from. Regenerated falsifier.yml carrier follows in the next commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Both cursor findings fixed on head:
— sent from gentle-owl-459 |
Implements the SIGNED falsifier design (docs/plans/affected-set-differential-falsifier.md — merged #6284; operator signs 2026-07-05: roster authority = existing disposition facts, N=8 counted re-arm, cadence at proposed shape).
Model
std.realization_schedule:NodeFrontierSelection = SelectionOff | SelectionApplied | SelectionPredictOnlyreplaces theskip_unaffected_node_frontierBool onRunnableDiscoveryBatch— a Bool cannot express predict-without-apply and two Bools would conflate the state space. All constructors and pattern sites migrated corpus-wide; equality by match. FLAG for reviewers: this touches a std/ carrier — the mode is the mechanism of the signed design and the note cites it; the rename (not addition) forces every consumer to migrate, no silent old-field defaults.gha_workflow.dag: theScheduletrigger arm now carries its payload (schedule:as the GHA-required sequence of cron mappings) — formerly a payload-dropping stub that rendered invalid GHA syntax. First live constructor is this workflow; GHA quirks (UTC-only, 5-min floor) noted on the carrier with the cited syntax authority.gunbc.falsifier_workflow: nightly0 7 * * *UTC +workflow_dispatch; prelude + release build + predict-only cold run over a declared 20-commit window base (GUNBC_CI_DIFF_BASE=HEAD~20— main-vs-main would be empty and predict skip-everything, which only falsifies rot; the window gives predictions non-trivial structure; checkout is fetch-depth 0 so the window is available). Step budget 120m; job backstop = step-sum + prelude allowance (155m) per the step-budget ruling.ci_floor_plan.gunbc_falsifier_batches: oneRunnableDiscoveryBatch,SelectionPredictOnly, tree-wide scan dirs, enrolled entries empty. Component 1 (non-hermetic residue) is covered by construction — host-scaffold rows never predict-skip and always run cold; residue-only cadence shape waits on thereads_live_treeclassifier defork (noted on carrier).generated_artifact:FalsifierYamlArtifact→.github/workflows/falsifier.yml(CommitRequired/GithubActionsWorkflow, yaml-parse extra_valid). Carrier committed from the generator's bytes; drift gate green.Host
DiscoveryCorpusOptions.node_frontier_selection(mode enum). PredictOnly: records each per-row prediction (DiscoverySummary.predicted_unaffected— skipped rows previously had NO per-row identity, only a count), runs every row cold, and emits a countedDIVERGENCEattribution when a predicted-unaffected row runs red. The red itself fails the batch through the normal failure channel — divergence is attribution, not a second verdict.claim_executormarshal: an absentnode_frontier_selectionfield is a typed refusal — the former Bool defaulted to false when absent, a fail-open where a stale plan silently dropped its declared selection semantics.Receipts (by execution, ctrl-build remote)
floor_skip_discovery_witnessbinary — incl. 3 new predict-only witnessesfalsifier_workflow_witness_holds(cron render + red control, backstop arithmetic, artifact path)ci_floor_plan_witnesses(+ falsifier batch shape: 1 batch × 1 runnable × PredictOnly)Dissolution (on-carrier)
8 consecutive zero-divergence windows retire the workflow (delete it; receipt = Actions run history); later divergence re-arms another 8-window cycle, itself counted. Cost is bounded per window — one cold run nightly, never multiplied into PRs.
🤖 Generated with Claude Code