Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
4422638
Make the witness-roster walk demand-directed instead of unconditional…
Aug 11, 2026
ff43f42
Update the design authority for the demand-directed hygiene walk (rev…
Aug 11, 2026
dfefcc4
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 11, 2026
b6c50f2
Repair the stale output-policy comment left by the walk move (review …
Aug 11, 2026
932778a
Merge remote-tracking branch 'origin/session/eager-cat-841' into sess…
Aug 11, 2026
d497cbd
Merge remote-tracking branch 'origin/main' into session/eager-cat-841
Aug 11, 2026
47584ea
Delete supply-side lens enforcement from floor discovery
Aug 11, 2026
0c044d1
Merge 47584ea8c8ab9dba707b1f75dde0ae268f998432 into 341d3203bc2be4f3d…
gunbai-bot[bot] Aug 11, 2026
2d5306d
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 11, 2026
ca2d3b4
Reconcile the plan carrier and stale comments with the deleted enforc…
Aug 11, 2026
06424e3
Merge remote-tracking branch 'origin/session/eager-cat-841' into sess…
Aug 11, 2026
9b7626f
Delete the dead lens classifier and date-scope the cost claim
Aug 11, 2026
e585778
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 11, 2026
da4b7fd
Merge remote-tracking branch 'origin/main' into session/eager-cat-841
Aug 11, 2026
a6e55e5
Repoint the sibling plan authorities that still advertise the deleted…
Aug 11, 2026
a911593
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 11, 2026
6364020
Derive the bridge-family split control instead of pinning its population
Aug 11, 2026
78bfd93
Merge remote-tracking branch 'origin/main' into session/eager-cat-841
Aug 11, 2026
7f32031
Merge remote-tracking branch 'origin/main' into session/eager-cat-841
Aug 12, 2026
6add1c3
Delete the orphan-helper census and the `__` filename rule from floor…
Aug 12, 2026
3e2118f
Refresh the two authority notes the deletion falsified
Aug 12, 2026
f7ddaef
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 12, 2026
4300a39
Carry the deleted-witness rationale as an authored annotation, not a …
Aug 12, 2026
9cc7909
Merge remote-tracking branch 'origin/main' into session/eager-cat-841
Aug 12, 2026
be420af
Merge origin/main into session/eager-cat-841
Aug 12, 2026
a5b441b
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 12, 2026
69009a3
Make the deleted censuses past tense in the Building & checks paragraph
Aug 12, 2026
738c1b8
Merge remote-tracking branch 'origin/session/eager-cat-841' into sess…
Aug 12, 2026
d6ace83
Drop orphan/helpers from the snapshot consumer-census row
Aug 12, 2026
5304c4b
chore: regenerate drifted generated artifacts (ci auto-heal)
Aug 12, 2026
b6baf6c
Repair the comment whose contrast named a deleted function
Aug 12, 2026
f05c00c
Merge remote-tracking branch 'origin/session/eager-cat-841' into sess…
Aug 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,4 @@ hollow alias (minimality ≠ grounding) · state-space conflation (an `Option`/`
- `cargo test --workspace` · `cargo clippy --all-targets -- -D warnings` · `cargo fmt --all --check`
- one-time per clone: `git config core.hooksPath .githooks` — the only documented manual seed; generated pre-commit/pre-push hooks then idempotently converge `merge.generated-artifact.driver` and re-assert `core.hooksPath` via argv derived from `gunbc.repo_local_git_config` (clones that skip hooksPath degrade to vanilla text-merge for generated-artifact paths; drift gate still guards at CI). The driver REFUSES rather than answering `true`: git reaches a low-level merge driver only when both sides changed the path since the merge base — measured on a four-case matrix, one-sided and identical changes never reach it — and taking the ours side there dropped the other side's authority-derived bytes with no conflict, twice on #7836 against the stage0 seed. It now leaves the ours side in the worktree with no conflict markers, marks the path unmerged, and prints the regeneration recipe; the class is mechanically preventable, not structural, and its next-rung trigger is the commit-writer binding rows in `gunbc.commit_workflow`
- explicit actuator (CI / tooling): `gunbc run --source-root dag --source-root src/v2 --entry dag/gunbc/repo_local_git_config.dag --function converge`
- CI (`gunbc ci` generates `.github/workflows/ci.yml`; all `v1-compiler` seed bins, no shell gate): **one** composed floor pass — `claim_executor --source-root src/v2 --source-root dag --plan-entry src/v2/workflow/ci_floor_plan.dag --plan-function gunbc_ci_floor_plan`. The v2 scheduler decides the batches from the single-authority spec (`gunbc.ci_spec`); the only structural fact the plan adds is *compile-clean gates the rest* (batch-1 `dag_compile_clean_gate` → batch-2 everything else, a dependency edge). Witness enrollment: **discovery shrunk by the affected set** (operator acceptance 2026-07-09, firing the 2026-07-04 opt-in inversion's dissolve-on — see `gunbc.ci_spec` `ci_spec_discovery_flip_note`): the corpus batch scans `CiSpec.discovery_scan_dirs` (plus the source-root `*_test.dag` walk) with `SelectionApplied`, so a PR runs the tree-wide witness corpus (~1,721 rows at flip time) shrunk to the diff's affected set; selection is fail-closed (a provenance gap refuses, never widens; host-scaffold/live-tree rows never predict-skip) and the scheduled `affected-set-falsifier` (every 4 hours) runs the corpus cold with predictions recorded, so a missing selection edge surfaces as a counted divergence within one cadence window. `CiSpec.witness_entries` (`CommitWitnessClaim` rows on the `GithubActionsCiJob` surface, projected by `project_ci_floor_witness_entries`) remains the explicit-entry roster — execution-kind rows with their own resource profile, and any row that must run as declared. Empty entries AND empty discovery dirs = zero witness-corpus nodes (the regen spec's shape). Naming hygiene stays fail-closed (a `test fn` outside `*_test.dag` is still a violation) but is **demand-directed, not unconditional** (#8140, 2026-08-11, superseding the prior clause 'the executor runs the zero-enrollment naming walk when no discovery batch is scheduled'): `claim_executor` ran the whole-source-root roster walk BEFORE resolving the plan on every invocation, on the stated ground that a naming violation should be 'the cheapest possible failure'; measured, it was the most expensive phase in the process — 5.9 min of a 56.5-min ordinary floor (run 31477894666) and ~6 min of a ~15-min regen whose plan has two nodes and no roster — because the producer it reaches also builds module-graph facts, runs a second strict reference-resolution pass, and runs inert-lens reachability plus the construction-justification census. The walk now runs where the demand is structural (`schedules_discovery`: the plan carries a discovery or scoped-witness batch), at unchanged whole-source-root scope and unchanged cost — the roster is memoized by request digest, so the corpus batch hits the memo this call fills, and the coordinator's expected pre-plan digest is byte-identical. TWO CONSEQUENCES, both deliberate. (a) SCOPE: discovery-free plans (regen, plan-artifact) no longer run the corpus-wide nameability rules at all. Per-PR coverage is unchanged because every PR runs the `ci` job, whose plan schedules discovery and walks the full tree; what is lost is a *second* redundant walk on regen-only and plan-artifact-only runs. This is a scope narrowing declared here rather than silently taken, and it is NOT backstopped by the affected-set falsifier — that cadence has produced no green verdict since 2026-08-03. (b) ORDERING: for plans that DO schedule discovery the walk now runs after plan resolve/eval, since batches are known only then, so a naming violation pays full plan resolution (~0.5 min) before refusing. The 'cheapest possible failure' ordering is knowingly traded for deleting the same walk from every plan that never needed it; the trade is ~0.5 min later on the refusing path against ~6 min saved on every regen. Dissolve-on: the placement rules move to canonical source ingestion and test identities derive from parser-produced declarations, at which point the separate walk, this clause, and the `__`-basename rule all retire. Tree-wide unselected discovery remains the **local** path (`claim_batch --roster-from-discovery --source-root dag --source-root src/v2 --scan-dir dag/test/claim --scan-dir src/v2/test/claim/manual`). Batch-2 also carries the effectful gates: the rust fmt gate (when a `.rs` changes; nextest was removed from CI 2026-07-11 — operator ruling recorded in `gunbc.commit_workflow` `commit_gate_rust_suite_removed_disposition`, the suite runs locally only; clippy removed from CI 2026-07-08 — crate-wide `#![allow(clippy::all)]` made it zero-signal over ~44m/run, still available as a local dev check), emit-host MVP smokes, source-root-ingest, and the `ci.yml` drift+parse gate (ci.yml == `gunbc ci` output). The compile-clean gate is `--target dag`, and its per-PR scope is the same import-closure authority (2026-07-16, channel 2 of the 2026-07-10 grain fork): an all-`.dag`/docs diff compiles only the affected shard-entry closures (`tools.dag_compile_clean_scope`, host fast path `entry_file_touched_via_import_closure`); any non-selectable touched path (`.rs`, workflow yml, manifests), any non-docs departed path, or any selection refusal keeps the whole-tree baseline, loudly; the falsifier cadence carries the deterministic whole-tree cold control (`GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL=1`, widen-only). The regen step (self-host fixed-point) is scoped the same way at its own closure (#6732 + this change's departed-path guard): `regen_floor_skip_witness` skips the pull_request step only when a non-empty merge-base diff is provably disjoint from the regen input set (`cli_run::regen_input_sources` — the SAME closure authority `regen_stage0` compiles — plus the src/v1/** prefix and Cargo/toolchain config); empty diffs, departed non-docs paths, and every failure arm run regen, and the skip is shell-gated to pull_request events so main pushes stay the unconditional cold control. Parse is grammar-owned: `ingest_yaml_source` (`dag/extdeps/languages/yaml/ingest.dag`), no shell/host parser.
- CI (`gunbc ci` generates `.github/workflows/ci.yml`; all `v1-compiler` seed bins, no shell gate): **one** composed floor pass — `claim_executor --source-root src/v2 --source-root dag --plan-entry src/v2/workflow/ci_floor_plan.dag --plan-function gunbc_ci_floor_plan`. The v2 scheduler decides the batches from the single-authority spec (`gunbc.ci_spec`); the only structural fact the plan adds is *compile-clean gates the rest* (batch-1 `dag_compile_clean_gate` → batch-2 everything else, a dependency edge). Witness enrollment: **discovery shrunk by the affected set** (operator acceptance 2026-07-09, firing the 2026-07-04 opt-in inversion's dissolve-on — see `gunbc.ci_spec` `ci_spec_discovery_flip_note`): the corpus batch scans `CiSpec.discovery_scan_dirs` (plus the source-root `*_test.dag` walk) with `SelectionApplied`, so a PR runs the tree-wide witness corpus (~1,721 rows at flip time) shrunk to the diff's affected set; selection is fail-closed (a provenance gap refuses, never widens; host-scaffold/live-tree rows never predict-skip) and the scheduled `affected-set-falsifier` (every 4 hours) runs the corpus cold with predictions recorded, so a missing selection edge surfaces as a counted divergence within one cadence window. `CiSpec.witness_entries` (`CommitWitnessClaim` rows on the `GithubActionsCiJob` surface, projected by `project_ci_floor_witness_entries`) remains the explicit-entry roster — execution-kind rows with their own resource profile, and any row that must run as declared. Empty entries AND empty discovery dirs = zero witness-corpus nodes (the regen spec's shape). Naming hygiene stays fail-closed (a `test fn` outside `*_test.dag` is still a violation) but is **demand-directed, not unconditional** (#8140, 2026-08-11, superseding the prior clause 'the executor runs the zero-enrollment naming walk when no discovery batch is scheduled'): `claim_executor` ran the whole-source-root roster walk BEFORE resolving the plan on every invocation, on the stated ground that a naming violation should be 'the cheapest possible failure'; measured, it was the most expensive phase in the process — 5.9 min of a 56.5-min ordinary floor (run 31477894666) and ~6 min of a ~15-min regen whose plan has two nodes and no roster — because the producer it reaches also builds module-graph facts, runs a second strict reference-resolution pass, and — until gunbc#8141 deleted them — ran inert-lens reachability plus the construction-justification census. The walk now runs where the demand is structural (`schedules_discovery`: the plan carries a discovery or scoped-witness batch), at unchanged whole-source-root scope and unchanged cost — the roster is memoized by request digest, so the corpus batch hits the memo this call fills, and the coordinator's expected pre-plan digest is byte-identical. TWO CONSEQUENCES, both deliberate. (a) SCOPE: discovery-free plans (regen, plan-artifact) no longer run the corpus-wide nameability rules at all. Per-PR coverage is unchanged because every PR runs the `ci` job, whose plan schedules discovery and walks the full tree; what is lost is a *second* redundant walk on regen-only and plan-artifact-only runs. This is a scope narrowing declared here rather than silently taken, and it is NOT backstopped by the affected-set falsifier — that cadence has produced no green verdict since 2026-08-03. (b) ORDERING: for plans that DO schedule discovery the walk now runs after plan resolve/eval, since batches are known only then, so a naming violation pays full plan resolution (~0.5 min) before refusing. The 'cheapest possible failure' ordering is knowingly traded for deleting the same walk from every plan that never needed it; the trade is ~0.5 min later on the refusing path against ~6 min saved on every regen. Dissolve-on: the placement rules move to canonical source ingestion and test identities derive from parser-produced declarations, at which point the separate walk and this clause retire. **TWO OF THAT WALK'S THREE JOBS ARE ALREADY GONE (#8155, 2026-08-11), by deletion rather than by migration.** The `__`-basename rule is deleted: a census found ZERO offending basenames in the corpus and no stated rationale anywhere in the tree, so it guarded an empty population — and reaching it cost a whole-corpus path walk plus a SEPARATE `.dag` entry resolve (`FLOOR_NAMING_HYGIENE_ENTRY`) on every discovery-bearing run, which is why a zero-population style rule was not free. The orphan-helper census is deleted: it walked every `*_test.dag`, parsed each, projected `ModuleSurface` values, resolved a second interpreter context, and ran a fuelled reachability fixpoint against a hand-authored cross-module export roster, to decide whether a plain helper in a test file was referenced. An unreferenced test helper is dead-code hygiene, not evidence the compiler or the tests are correct, and it did not justify a recurring whole-corpus traversal on a required path. **Scope narrowing, declared not implied:** an unreferenced test helper and a `__` basename are both writable again and nothing detects either; the orphan class had fourteen enrolled witnesses and they are deleted with it, which §4b permits only because the class is ABANDONED rather than climbing — there is no higher rung for that evidence to guard. What survives is the `test fn` placement rule and the file-grain expand half. If the dead-helper inspection is wanted back it belongs as a demand-pulled query, never a required floor phase. Tree-wide unselected discovery remains the **local** path (`claim_batch --roster-from-discovery --source-root dag --source-root src/v2 --scan-dir dag/test/claim --scan-dir src/v2/test/claim/manual`). Batch-2 also carries the effectful gates: the rust fmt gate (when a `.rs` changes; nextest was removed from CI 2026-07-11 — operator ruling recorded in `gunbc.commit_workflow` `commit_gate_rust_suite_removed_disposition`, the suite runs locally only; clippy removed from CI 2026-07-08 — crate-wide `#![allow(clippy::all)]` made it zero-signal over ~44m/run, still available as a local dev check), emit-host MVP smokes, source-root-ingest, and the `ci.yml` drift+parse gate (ci.yml == `gunbc ci` output). The compile-clean gate is `--target dag`, and its per-PR scope is the same import-closure authority (2026-07-16, channel 2 of the 2026-07-10 grain fork): an all-`.dag`/docs diff compiles only the affected shard-entry closures (`tools.dag_compile_clean_scope`, host fast path `entry_file_touched_via_import_closure`); any non-selectable touched path (`.rs`, workflow yml, manifests), any non-docs departed path, or any selection refusal keeps the whole-tree baseline, loudly; the falsifier cadence carries the deterministic whole-tree cold control (`GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL=1`, widen-only). The regen step (self-host fixed-point) is scoped the same way at its own closure (#6732 + this change's departed-path guard): `regen_floor_skip_witness` skips the pull_request step only when a non-empty merge-base diff is provably disjoint from the regen input set (`cli_run::regen_input_sources` — the SAME closure authority `regen_stage0` compiles — plus the src/v1/** prefix and Cargo/toolchain config); empty diffs, departed non-docs paths, and every failure arm run regen, and the skip is shell-gated to pull_request events so main pushes stay the unconditional cold control. Parse is grammar-owned: `ingest_yaml_source` (`dag/extdeps/languages/yaml/ingest.dag`), no shell/host parser.
Loading
Loading