Skip to content

CI: job-level 10-min kill on the ci/floor job (free the runner; operator re-ruling 2026-07-06) - #6323

Merged
briansrls merged 1 commit into
mainfrom
ci-floor-timeout-10
Jul 6, 2026
Merged

briansrls merged 1 commit into
mainfrom
ci-floor-timeout-10

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

What

The ci job is now JOB-level killed at 10 minutes (gunbc_ci_floor_job_runner_starvation_kill_minutes = 10), replacing the computed ~190m backstop. ci.yml line 21: timeout-minutes: 190 → 10 (the sole emitted change; floor step 135, rust_tests 90, deploy 10 all unchanged).

Why (operator re-ruling, 2026-07-06)

Under the #6239 v2-resolve compile-wall the floor step never completes (plan-entry resolve alone ~75m), so the prior 135m step budget hogged a self-hosted runner for 135m on a job that cannot pass — starving the whole fleet. When the job can never be green, a red verdict is moot and freeing the runner dominates.

This explicitly re-accepts the trade-off the 2026-07-05 ruling avoided: a job-level kill returns conclusion=cancelled (a silent pass to downstream consumers). The operator's call: runner starvation is the larger harm while the wall persists.

Scope + reversibility

  • ci/floor job only. rust_tests keeps its step budgets (it legitimately builds+tests; a 10m job cap would false-kill cold-cache builds).
  • Supersedes the 2026-07-05 step-level policy for the ci job; that rationale is retained verbatim in gunbc_ci_job_timeout_policy_disposition as the restore target.
  • dissolve-on: compile-wall resolution (S2a node store / compile-clean scoping+memoization + census-cliff parse-packrat fix) shrinks the floor under a real budget → restore ci_job to a step-level budget with RED-by-step-failure.

Verification

.dag parses+normalizes clean (frontend+normalize complete pre-wall). The emitted yaml change is a pure scalar projection (Present { value: 10 } → timeout-minutes: 10), so the committed ci.yml is byte-exact by construction; the generated-artifact drift gate validates .dag ↔ yaml consistency in the floor. An async full-render byte-diff is in flight as belt-and-suspenders.

🤖 Generated with Claude Code

…6-07-06)

The ci job is now JOB-level killed at 10m (gunbc_ci_floor_job_runner_starvation_kill_minutes),
replacing the computed ~190m backstop. Under the #6239 v2-resolve compile-wall the floor step
NEVER completes (plan-entry resolve alone ~75m), so the prior 135m step budget hogged a runner
for 135m on a job that cannot pass — starving the whole fleet. When the job can never be green a
red verdict is moot and freeing the runner dominates; the 10m job kill returns conclusion=cancelled
(the known silent-pass trade-off, re-accepted because runner starvation is the larger harm).

Scoped to the ci/floor job ONLY — rust_tests keeps its step budgets (it legitimately builds+tests).
This SUPERSEDES the 2026-07-05 step-level ruling for the ci job; that rationale is retained in the
disposition note as the restore target. dissolve-on: compile-wall resolution (S2a node store /
compile-clean scoping+memoization + census-cliff parse-packrat fix) restores ci_job to a step-level
budget with RED-by-step-failure.

ci.yml regenerated: ci job timeout-minutes 190 -> 10 (the sole emitted change; floor step 135,
rust_tests 90, deploy 10 unchanged). Byte-exact by scalar projection; drift gate validates the
.dag<->yaml consistency in the floor.

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

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Validated on this PR's own CI run (28803611366): the job-level 10-min kill fired exactly as intended.

  • job=ci → conclusion=cancelled, started 15:37:03Z, completed 15:47:20Z = 10m17s. The self-hosted runner was freed at ~10 min instead of being held 135–190 min on a job that can't pass under the P3+P5: infer whole-corpus scans to per-module maps #6239 wall — the fleet-starvation fix, demonstrating itself.
  • rust_tests → runs independently on its own 90-min budget (unaffected, as scoped).
  • deploy_dashboard_srv1 → skipped (correctly gated behind the cancelled ci job).

Merge note: this PR's own ci check is cancelled by design — that is the feature, not a failure. Under the operator's 2026-07-06 re-ruling, conclusion=cancelled (silent-pass) is the explicitly accepted trade-off while the compile-wall persists, so CI will not go green here. 2 distinct dashboard approvals (claude, cursor), no REQUEST_CHANGES, mergeable=CLEAN — ready for manual merge.

— sent from lively-raven-355

@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Re: "CI FAILING (1 failing)" — the 1 failing check is job=ci → conclusion=cancelled, and it is by design: this PR's own 10-min job kill fired at 10m17s (started 15:37:03Z, cancelled 15:47:20Z), freeing the runner as intended. The floor step ran ~8.4 min then the job cap cancelled it.

There is no code fix, and pushing one would be wrong: under the #6239 compile-wall the floor can never complete, so no ci run can go green — main's own latest ci is failure right now for the same reason. Fabricating a green here would be a §5 fail-open. The dashboard correctly flags the cancel as non-green (which, note, closes the 2026-07-05 silent-pass concern — cancelled is not being treated as green).

This is the standing wall state the operator has been merging through manually. Merge-readiness on the actionable criteria is met: 2 distinct approvals (claude, cursor), no REQUEST_CHANGES, mergeable=CLEAN. Ready for manual merge; the ci check will stay cancelled until the wall lifts (dissolve-on in the disposition note).

— sent from lively-raven-355

@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Closing the loop on the "async byte-diff" I mentioned: it did not produce an independent diff — gunbc run --function expected_ci_yml errors because that function returns String, and dag run entry points must return ProcessExit (error: function expected_ci_yml returned <non-variant>, not ProcessExit). It's a run-harness entry-type limitation, not a problem with the change (the run did compile past the wall before erroring).

The correctness stands without it: the edit is Present { value: gunbc_ci_floor_job_runner_starvation_kill_minutes } (=10) through the identical serializer path that emitted timeout-minutes: 190 from the prior Present { value: <Int> } — same variant/field/Int serialization, so timeout-minutes: 10 is exact by construction (and it's the sole emitted delta). The in-floor generated-artifact drift gate remains the executing consumer that validates .dag ↔ ci.yml once the wall lifts.

— sent from lively-raven-355

@briansrls
briansrls merged commit 4b31dc9 into main Jul 6, 2026
2 of 3 checks passed
@briansrls
briansrls deleted the ci-floor-timeout-10 branch July 6, 2026 17:39
briansrls added a commit that referenced this pull request Jul 6, 2026
The 10m starvation-kill (#6323) cancelled the ci job mid plan-resolve
(receipt: run 28811397826 @ 304fe94 — floor still in typecheck at t+8m).
Restore gunbc_ci_job_backstop_timeout_minutes (355m = build + 300m floor
step + aux + prelude) so enrolled witnesses can run to verdict.

Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot pushed a commit that referenced this pull request Jul 6, 2026
Rebase kept main's 10m job-level starvation kill on ci_job, which
cancelled release build before the floor could run (run 28811393429).
Lever-a interim uses gunbc_ci_job_backstop_timeout_minutes (235m);
10m kill stays on-carrier as #6323 dissolve-on target.

Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
gunbc_ci_job_timeout_policy_disposition now documents the active policy
(ci_job emits gunbc_ci_job_backstop_timeout_minutes = 355m, RED-by-step-
failure). Retire unused gunbc_ci_floor_job_runner_starvation_kill_minutes;

Co-authored-by: Cursor <cursoragent@cursor.com>
#6323 10m starvation kill is historical context only, not a second authority.
gunbai-bot Bot pushed a commit that referenced this pull request Jul 6, 2026
de1384b restored gunbc_ci_job_backstop_timeout_minutes in ci_workflow.dag
but ci.yml still emitted the #6323 starvation kill — receipt run 28811583009
cancelled mid plan-resolve at t+8m with zero gate verdict.

Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls pushed a commit that referenced this pull request Jul 6, 2026
gunbai-bot Bot pushed a commit that referenced this pull request Jul 6, 2026
e7d2c79 reverted the 195m budget raise but restored pre-#6323
step-level 190m job backstop — causing a 2h17m floor step FAILURE
(receipt run 28808462491 @ e7d2c79: plan resolve ~77m + batch-1
reconcile in-flight at 135m step kill).

Take main's operator re-ruling verbatim: ci job killed at 10m to free
runners; floor cannot pass under compile-wall. Parse-engine scope
unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
* WIP: InterfaceSummary v0: std carrier + first consumer

* InterfaceSummary v0: rebase onto main (1a19d49).

Std carrier + lens + firewall witness + export_signature_facts host bridge.
CI interim budgets (split build/floor/rust-gate, 30min build, floor_diff
relative roots). Replayed cleanly — no unrelated main reverts.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* ci: retrigger PR checks after rust gate timeout fix (b79ba13).

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* fix: git diff name-only paths stay List<String> at runtime.

Run 28757531898 @ e65f569: rust gate still failed cannot cast
String — stdout_lines projects plain strings; List<FilePath>
mismatch bit when git_success triggers should_run_gates path
selection. Revert DiffNameOnly/Merge path grain to List<String>
until interpreter brands stdout_lines (dissolve-on: #6297 host).

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* fix: brand stdout_lines for String-family list types at runtime.

Run 28757870966 @ e69f7cd: rust_tests still failed cannot cast
String — #6297 models List<FilePath> from stdout_lines but the host
projected plain strings; cast targets with empty authored names also
missed FilePath = String alias resolution. Resolve string-family cast
seeds through inferred types and coerce stdout_lines list elements.

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

* fix: restore fold_list in complexity_r1_accumulator_copy.

Run 28758528714 @ 03e3238: ci floor failed discovery corpus —
fold is not in v2 scope; r1_copied_port_index must use fold_list
from v2.std.algebra (same as main).

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

* fix: rustfmt v1_interpreter stdout_lines map closure.

Run 28759362798 @ 1c12890: rust_tests failed cargo fmt --check
on the multiline map closure in map_shell_outputs.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* WIP: InterfaceSummary v0: std carrier + first consumer

* Raise rust gate CI budgets so reconcile+nextest fit the step cap.

gunbc run rust_gates_ci reconcile consumed ~22m before fmt/clippy/nextest on d7dc35e, leaving nextest killed at the 30m step timeout; bump gate to 45m, warm to 46m (warm>gate witness), and rust_tests job backstop to 106m.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* Inline bare == aliases and drop unused Bool imports (review 36011).

Remove rel_path_eq/module_path_eq nicknames per §3; use == directly.
Drop dead Bool imports from firewall_body fixtures.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* Fail-closed module_key imports and add export_signature host scaffold receipt.

- Add v2.std.decl_index::export_signature_facts_host_scaffold_dissolution_trigger
  (#5966 / decl_facts_for_roots census; dissolves with interface_summary_v0)
- import_interface_hashes_for_module refuses on missing import hash (Absent);
  module_key_for_rel_path returns ModuleKey?
- Witnesses: scaffold receipt cites #5966; unresolved import → Absent

Addresses Composer REQUEST_CHANGES review 36013.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* Raise CI floor step budget after 135m timeout on batch-1 compile-clean.

Receipt run 28786036501 @ 6527d01: plan resolve ~74m plus batch-1
reconcile ~53m exhausted the 135m floor step cap before batch-2.
Floor step 135→200m; ci job backstop 190→255m.

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

* Convert interface_summaries_from_facts to fold (missing fold_list import).

Review 36025: fold_list call survived sibling refactors without its
v2.std.algebra import; use fold + list_snoc_item like the rest of the file.

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

* Raise CI floor step to 300m after 200m timeout on batch-1 reconcile.

Receipt run 28794864868 @ c3e2093: plan resolve ~73m, batch-1 first
reconcile ~52m, killed at 200m cap during second reconcile before
batch-1 finished. Floor 200→300m; ci job backstop 255→355m.

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* ci: restore step-level ci job backstop for floor completion.

The 10m starvation-kill (#6323) cancelled the ci job mid plan-resolve
(receipt: run 28811397826 @ 304fe94 — floor still in typecheck at t+8m).
Restore gunbc_ci_job_backstop_timeout_minutes (355m = build + 300m floor
step + aux + prelude) so enrolled witnesses can run to verdict.

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

* ci: align timeout disposition with live step-level backstop.

gunbc_ci_job_timeout_policy_disposition now documents the active policy
(ci_job emits gunbc_ci_job_backstop_timeout_minutes = 355m, RED-by-step-
failure). Retire unused gunbc_ci_floor_job_runner_starvation_kill_minutes;

Co-authored-by: Cursor <cursoragent@cursor.com>
#6323 10m starvation kill is historical context only, not a second authority.

* ci: restore 10m ci/floor job and 30m rust_tests job caps.

Operator request: lower job timeouts from interim 355m/106m back to
10m starvation-kill on ci job and 30m on rust_tests. Disposition
updated to match live policy.

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

* ci: drop unused rust job backstop helper

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

* WIP: InterfaceSummary v0: std carrier + first consumer

* ci: fix 10m job kill aborting release build before floor.

Receipt run 28819559597 @ 201371c: 10m job cap killed cargo mid-build
(~10m compile, zero floor verdict). Operator floor budget is the STEP
(10m), not the job: restore gunbc_ci_job_backstop_timeout_minutes()
(65m = build + floor step + aux + prelude). Align rust_tests steps
(15m warm, 10m gate) to fit 30m job cap.

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

* ci: add value-Measure dissolve-on marker for rust_tests job timeout.

Piggyback gunbc_ci_rust_tests_job_timeout_minutes_measure_grounding_
dissolution_trigger on the existing floor-step marker family (Opus 36075
non-blocking finding).

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

* ci: restore rust_tests step-sum job backstop (Composer 36079).

Remove fixed 30m gunbc_ci_rust_tests_job_timeout_minutes — job cap was
shorter than step budgets, producing cancelled silent-pass instead of
RED-by-step-failure. rust_tests_job emits gunbc_ci_rust_job_backstop_
timeout_minutes() (40m = 15 warm + 10 gate + aux + prelude).

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

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* Ignore slow scoped-plan unit tests; disposition covered by .dag witnesses.

The live shard-roster scan is O(corpus) cold; gate-1 soundness receipts
belong in dag_compile_clean_scope_witness_test.dag execution path.

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

* Fix importer-propagation witness: expect v2.std.logic importer, not transport.

dag_compile_clean_transport reaches logic via tools.host_prelude → std.logic,
not v2.std.logic; a touch on src/v2/std/logic.dag should scope dag/test/claim/parse_test.dag.

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

* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* Fix rustfmt on CompileCleanScopePlan enum variants.

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

* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* Serialize env-mutating compile-clean tests with module mutex.

EnvGuard tests share GUNBC_CI_DIFF_BASE/GITHUB_ACTIONS and can race
under parallel cargo test; with_env_test_lock fixes the inaccurate
single-threaded SAFETY claim (opus review, non-blocking).

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

* Pin entry-path filter to workspace_relative_repo_path only.

Filter keys and collect_dag_files paths both normalize through the same
authority; drop the redundant raw-path contains check (opus review nit).

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

* WIP: Lever a: affected-set-scoped compile-clean gate

* Bump ci floor step budget 135m→180m after plan-resolve + batch-1 timeout.

Receipt run 28780252806 / job 85333980084 on 43cc771: plan-entry resolve
~77m before batch-1; compile-clean still in-flight at 135m step kill. Ci job
backstop 190m→235m to match.

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

* WIP: Lever a: affected-set-scoped compile-clean gate

* WIP: Lever a: affected-set-scoped compile-clean gate

* Fold docs-only skip classifier into dag_compile_clean_scope.

RequireWholeTree is now the modeled authority for non-empty non-docs
touches with no shard intersection; Rust maps it to WholeTree without
a parallel starts_with("docs/") heuristic. Witnesses cover Rust/CI paths.

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

* Make skip witnesses exhaustive over RequireWholeTree.

Align witness_empty_touched_skips and witness_docs_only_touch_skips
with the three-variant CompileCleanScopeDisposition coproduct.

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

* WIP: Lever a: affected-set-scoped compile-clean gate

* Restore ci job step-sum backstop after rebase job-kill regression.

Rebase kept main's 10m job-level starvation kill on ci_job, which
cancelled release build before the floor could run (run 28811393429).
Lever-a interim uses gunbc_ci_job_backstop_timeout_minutes (235m);
10m kill stays on-carrier as #6323 dissolve-on target.

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

* Revert CI budget raises; shift proof to local verification path.

Operator ruling (gentle-owl-459): restore main budgets (floor 135m,
ci job 10m starvation-kill, rust gate 30m / job 90m) — no 140m+ runner
burn. Add ./docs path-normalization witness and scripts/lever_a_local_verify.sh
for ctrl-build receipts; GATE 3 blocked on #6239 compile-wall.

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

* Make lever_a_local_verify.sh a pure claim_batch sequencer.

Compose disposition receipts in lever_a_local_receipts_hold (.dag);
script only invokes claim_batch --wet. Scaffold note + dissolution
trigger on-carrier; GATE follow-ons documented in substrate not bash.

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
…, fleet-wide rust_tests unblock) (#6339)

rust_tests times out at exactly 10m on every PR and on main — the 'v1 rust gate
(fmt + clippy + nextest)' step is killed mid-run. Not a real test failure: a
step-timeout regression.

Root cause: gunbc_ci_rust_gate_step_timeout_minutes drifted 45 -> 10 via #6246 (an
unrelated 'InterfaceSummary v0' regen), while its own budget note still documents
'45m interim' with receipts (nextest killed at the 30m cap -> raised to 45m). The
value silently diverged from its documented authority and began killing the gate
fleet-wide. Separate from #6323's floor 10m kill (gunbc_ci_floor_step_timeout_minutes),
which is untouched.

Fix: restore the constant to 45. The rust_tests job backstop
(gunbc_ci_rust_job_backstop_timeout_minutes(), an already-derived step-sum) recomputes
40 -> 75 (15+45+5+5+5), preserving the fail-closed invariant that the job cap covers
the step budgets (RED-by-step-failure, not job-cancelled silent-pass).

Value (operator 2026-07-06): 45 = ~1.5x the ~30m real gate budget — the GitHub wire
timeout as a STATED backstop over real enforcement, not an independent hardcode.

ci.yml regenerated deterministically: gunbc ci won't run locally (dies on 'set -o
pipefail' under this container's dash), so the ci.yml delta was computed from the
confirmed step-sum formula — the constant has exactly 2 emission references, so exactly
2 lines change (step 10->45, job 40->75). The drift gate verifies on CI.

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 10, 2026
- ci_floor_plan_witness_test.dag: import witness_ci_corpus_discovery_serializes_at_width_one
  explicitly (cursor catch on #6438). The call resolved pre-fix via the seed resolver's flat
  namespace, so the witness ran green by execution; the explicit import restores the file's
  per-symbol import convention.
- ci_workflow.dag: the resolve-receipt gate step had NO step cap — a hang there could only die
  by job-cancel (the #6323 starvation-kill class). It now carries the aux cap (script is a
  sub-second receipt read) and the ci job backstop counts four aux terms (peak pre/post,
  resolve-receipt gate, merge-admission gate): every step budgeted, backstop = step-sum + prelude
  (claude review catch on #6438, sharpened).
- falsifier_workflow_witness_test.dag: falsifier_backstop_is_step_sum_plus_prelude asserted the
  pre-calibration formula — latent red proven by execution (FAIL receipt), fixed to the live
  two-aux sum, re-run PASS.
- ci.yml regenerated byte-stable from the carrier (backstops 125->130, gate step timeout 5m).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 10, 2026
…hrunk by affected set) + falsifier host-OOM receipt (#6438)

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* Fix CI OOM: pin discovery corpus spawn_width_cap to 1.

Run 28999086030 OOM-killed at width=2 on the 24GiB live slot during the
discovery-flip corpus batch. Gate workloads still fit at width=2; only the
tree-wide discovery batch serializes via spawn_width_cap=1, with a receipt
witness and dissolve-on note.

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

* Fix type error in corpus discovery spawn width cap helper.

Both if-branches must return Nat (hardware_thread_count_value), not a
bare Int literal.

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

* Merge affected-set enrollment flip (takeover of PR #6403 from session/gentle-stag-677-flip)

Conflict resolutions onto post-#6422/#6431/#6432/#6435 main:
- ci_witness_optin_inversion: main's typed Scaffold Disposition -> Terminal (dissolve fired at the flip; roster stays as explicit-entry home, exclusivity dissolved)
- floor step timeout: 45 (main) vs 60 (flip) -> 60 with provenance note
- ci_spec notes: kept flip notes, stale fixed-8 phrasing dated
- falsifier width note: + RESIDUE paragraph (5x exit-137 on srv2-class slots = converge lane, not plan width)

Verified before commit: discovery batches charge corpus_resolve_nanos (own key), resolve_nanos=0 -> resolves_total declared 3 is NOT moved by the flip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* Correct the false flip receipt + kill-surviving calibration receipts (space-lens loop)

CORRECTED RECEIPT: run 29000557166's floor never completed - the executor was
host-OOM-killed mid-discovery-corpus at ~8min; the log's ExitSuccess belongs to
the merge-admission stamp tool stamping CI_FLOOR_EXIT=137. No flipped corpus
has completed in CI (0/1 ci + 0/5 falsifier). Both carrier notes corrected.

Calibration (coordinated with merry-owl-649's space-lens lane):
- roster_import_closure_nodes_pre_resolve: shared closure-count authority
  (pure import walk, closure grain not entry grain), emitted BEFORE the heavy
  resolve so killed runs still yield the (nodes, peak) lower-bound pair
- width-1 definition-drift oracle: pre-resolve walk must equal post-resolve
  resolved union on completed runs; refuses on divergence. Proven by execution:
  pre == post == 190/213 nodes across Off/Applied modes
- kill-surviving cgroup memory.peak pre/post steps (post is always()) in the
  ci job and falsifier.yml; scope semantics labeled on the emission lines
  (reset=ok floor-scoped; span compares post>pre; never silently conflated)
- job backstop timeouts extended by the two aux steps in both jobs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Calibration pairs carry censored-vs-exact labels (methodology: killed runs are censored observations)

Floor steps get id=floor; the always() post-peak step emits floor_outcome so
each (closure_nodes, peak) pair is explicitly labeled: success = exact point,
anything else = censored lower bound (true demand strictly greater than read).
Prevents the fit from treating cap-kill reads as point estimates, which would
drag the slope down and make the predictor underestimate - the dangerous
direction (merry-owl methodology catch, 2026-07-10).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Review fixes: explicit witness import + complete step-budget ledger

- ci_floor_plan_witness_test.dag: import witness_ci_corpus_discovery_serializes_at_width_one
  explicitly (cursor catch on #6438). The call resolved pre-fix via the seed resolver's flat
  namespace, so the witness ran green by execution; the explicit import restores the file's
  per-symbol import convention.
- ci_workflow.dag: the resolve-receipt gate step had NO step cap — a hang there could only die
  by job-cancel (the #6323 starvation-kill class). It now carries the aux cap (script is a
  sub-second receipt read) and the ci job backstop counts four aux terms (peak pre/post,
  resolve-receipt gate, merge-admission gate): every step budgeted, backstop = step-sum + prelude
  (claude review catch on #6438, sharpened).
- falsifier_workflow_witness_test.dag: falsifier_backstop_is_step_sum_plus_prelude asserted the
  pre-calibration formula — latent red proven by execution (FAIL receipt), fixed to the live
  two-aux sum, re-run PASS.
- ci.yml regenerated byte-stable from the carrier (backstops 125->130, gate step timeout 5m).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Rebind calibration provenance comments to real artifacts (cursor review catch)

The two cli_run.rs comments cited docs/plans/space-lens-minimal-project.md, which does
not exist on main — the predictor design is in flight on PR #6442 (merry-owl-649's lane)
and was never landed under that path. Rebound: the shared closure-definition authority is
stated as this function itself, with the in-flight design cited by PR number and the
landed parent-lane authorities cited by real paths (compute-envelope-model.md fleet
envelope; input-envelope-roadmap.md admission). No behavior change; cargo check clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Remove stray empty file (shell-redirect artifact the auto-committer flushed)

An internal-messaging command's backtick content was command-substituted by bash; a
'-> fail-closed' fragment became a stdout redirect and created an empty file at the
repo root, which the auto-committer then committed as 38f0a46. No tree content
beyond the empty file; removing it restores the branch to e99c757's content.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Scaffold-mark the cgroup peak calibration shell (cursor review catch)

The three concat-built calibration runners (ci_cgroup_peak_locate_shell,
ci_floor_peak_pre_script, ci_floor_peak_post_script) landed without the on-carrier
scaffold markers repo convention requires for hand-shell. Each now carries a
Disposition = Scaffold { dissolves_to: RealizationDispatch } row binding the decl
(the ci_materialization pattern), and both scripts embed the shared dissolve-on
note as a shell comment (the ci_spec pattern): dissolution = bash-emit (#5828 /
gap-B emit(intent, Bash)) realizing the observation as an emitted ShellProgram
intent or a typed host Observe effect. ci.yml + falsifier.yml regenerated;
falsifier_workflow_witness_holds and the flip witnesses re-run PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Merge origin/main into session/loyal-wren-398 (resolve #6441 step-list conflict)

Conflict resolution, all consciously declared:
- ci_job steps: union — the calibration peak pre/post steps wrap the floor step (this
  branch) and #6441's materialization receipt gate slots between the resolve-receipt
  gate and the merge-admission gate (main).
- The incoming materialization receipt gate step landed with timeout none — the same
  uncapped-step starvation-kill class this branch's review fix eliminated — so it now
  carries the aux cap, and the ci backstop counts FIVE aux terms (peak pre, peak post,
  resolve-receipt gate, materialization receipt gate, merge-admission gate); the budget
  disposition note records the merge provenance.
- ci_run_step_natures_are_claims_counted_not_silent: RunStep count pin bumped 17 -> 19,
  acknowledging the two peak calibration steps #6441's count predates (conscious-count
  discipline; proven red at 17 then green at 19 by execution).
- ci.yml regenerated from the merged carriers (backstops 130 -> 135).

Verified on the merged tree: release bins rebuilt on merged Rust; falsifier workflow
witness, flip witnesses, floor-plan/optin/width witnesses, and all 8 ci_materialization
witnesses PASS; generated-artifact regen ExitSuccess.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 10, 2026
… gated) (#6455)

* Inferred materialization increment 1: floor demand ledger + receipt gate (#6441)

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* WIP: Duplicate Computation

* Analysis spine: spine_receipt composes dependency_view + materialize (increment 1)

The Rc-safe half of run ≜ realize ∘ materialize ∘ dependency_view: compose
the two catamorphisms that need no interpreter thread-safety.

- src/v2/std/spine.dag: level-profile fold over the DependencyView DAG →
  critical_path_depth (longest dependency chain / the reduce spine) +
  independence_width (max nodes at one level / what parallelizes to hw width).
  spine_receipt emits the §9 numbers by COMPUTATION, not assertion, joining
  materialize's content-hash Share/dedup counts.
- Discriminating RED (§9): single chain A→B→C → depth 3 / width 1 (serial);
  root over N independent leaves → depth 2 / width N.
- Witnesses 9/9 (spine) green by execution; materialize 6/6 unchanged.

The RUNNER (wall-clock parallel execution, §8 steps 3-4) stays increment 2+,
gated on interpreter Rc→Arc (v1 interp is !Send). This increment measures the
achievable width/critical-path floor the runner targets; it does not fabricate
wall-clock N×.

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

* Unbundle recompute-trace interpreter extension from the analysis-spine PR

CI root cause: the recompute-trace extension edited v1_interpreter.rs, which
hosts the atom_identity_hash/hash_combine fnv1a64 intrinsics that
dag_collect_fingerprint_witness executes. That correctly invalidated the
re-verify 'assumed-green node-frontier' SKIP of that witness (cone-touch,
fail-closed) — but the witness is a pre-existing 806s (13min) fnv1a64
whole-corpus walk, so un-skipping it blew the 30-min floor budget. Main stays
green only because its interpreter cone is untouched (witness stays skipped).

The interpreter extension is a separable, env-gated (GUNBC_RECOMPUTE_TRACE=1),
READ-mode diagnostic — not a dependency of the spine/materialize analysis
substrate (pure .dag, content_hash-based). Reverting v1_interpreter.rs to main
restores byte-identical interpreter content → the fingerprint witness returns to
assumed-green SKIP → floor budget restored. The recompute-trace extension lands
as its own follow-up PR where the fingerprint-witness re-run is expected.

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

* WIP: Duplicate Computation

* Materialization ladder: the state x decision law, as executable witnesses

The operator's 4-rule business logic generalized on one axis: the decision is
a function of WHEN the redundancy is knowable and WHETHER what was knowable
was prepared for. Errors fire only on knowable-but-unprepared; genuine
emergence and declared triviality are typed acceptances, never silence.

std.materialization_ladder (dag/std):
- Frame/FrameKind: SharedStateFrame | IsolatedChildrenFrame |
  ReplayedFrame{attempts} | UnboundedSiblingsFrame — the nested-scope axis;
  a 'run' at any layer is a frame, never a different kind of thing.
- DemandNature: Pure | IdempotentEffect | WorldRead{envelope_declared} |
  FreshEffect — the D3 effect gate; TTL = unmodeled dependency XOR declared
  staleness, never an eviction knob.
- CacheProvider: keying (ContentKeyed|ExistenceKeyed) + EvictionPolicy
  (ScopeExit|SpacePacked) REQUIRED by construction — rule 3 unwritable-bad.
- LadderVerdict (total): AuthoredDuplication | Discharged | RefusedNoProvider
  | RefusedScopeTooNarrow | RefusedExistenceKeyed (the build-if-absent #6352
  wall) | RefusedUnmodeledWorldRead | ExemptFreshEffect |
  AcceptedBelowCostFloor | AcceptedSingleRecompute.
- Declared-emergent frames obligate UP FRONT: retry frames derive
  checkpointing, unbounded-sibling frames (server loops, CI-runs-over-time)
  derive persistent caches — prepare-before-demand.

12/12 witnesses green by execution; each test is one cell of the table,
fixtures mirror the live worked example (workflow/jobs/steps, retry, fleet).

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

* WIP: Duplicate Computation

* Docs crystallization: derived materialization placement into roadmap ④ + the state x decision table

- roadmap_authority ④ (ROADMAP.md regenerated via main_wet, drift-consistent):
  the nested-frame law, plurality cells, declared-emergent prepare-up-front,
  keying/staleness walls, the caching-completion un-shelve, the ①-vs-§2
  cross-run-caching contradiction subsumed into per-node derived verdicts,
  and the v1.compiler.ownership §3-convergence row.
- duplicate-work design doc: the state x decision table as the qualifier's
  final verdict logic + the ownership consolidation subsection.

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

* Consolidation plan: realization + materialization + ownership are one law

Operator synthesis (2026-07-09): Materialization = the verdict vocabulary;
ownership = the verdict computation at the eval frame; realization = provider
selection discharging the verdict at each frame's carrier. Share's handler is
layer-aware — the cheapest cache is a REFERENCE (same program + ref-capable
carrier + readonly => point-at-it, no copy, no destroyed memory), demoting
through HAMT structural share / process memo / artifact / CAS, and demotion
must be priced, never silent (#6249 clone-fallback is the receipt).

Census of every hand-rolled instance found in-tree (16 rows): each named with
its frame, ladder cell, action, and dissolution trigger — ownership
(consolidated), Rc/HAMT (reference tier), clone-fallback (demotion wall),
ParseTable + cached_stage (C5 grounding), M1 memo / intern / assumed-green /
sccache / cargo-cache (C2 provider rows), PROCESS_RESOLVE_STORE (C3 = the 9GB
scope fix), build-if-absent (landed as the keying wall), resolve-cache #5789
(rule-4 requirements), recompute-trace (state-4 finding source). Peers kept
distinct: affected-set, Independence/Placement, mutable state.

Sequence C1-C5 with C1 = this PR (ladder + live CI gate).

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

* WIP: Duplicate Computation

* Ownership refactored onto materialization: the value tier, tested as providers

First consolidation increment (operator-directed): v1.compiler.ownership's
decision IS provider selection at the value grain, now expressed in the ladder
and proven by mirror witnesses.

- ProviderTier: Reference | Copy | Memo{keying} | Artifact{keying} | Cas{keying}
  — keying folded INTO store tiers, so an existence-keyed reference is
  unwritable BY SHAPE (§5 construction); frame obligations at isolation LCAs
  are dischargeable only by store tiers (a reference cannot cross an isolation
  boundary — witnessed).
- Value tier: AccessMode (Read|Consume|Carry|Project), ValueUsage,
  value_materialization -> ValueDead | ValueMoved | ValueSharedByReference |
  ValueDemotedToCopy (PRICED, requires a declared CopyTier provider — the
  #6249 silent clone-fallback made refusable) | ValueRefusedAffine |
  ValueRefusedNoCarrierProvider.
- Faithful to v1's THREE distinct plurality readings, kept separate:
  take_count = semantic_consumer_count (Consumed only, affine axis);
  value_access_plurality = binding_fan_out (Carry excluded, reference axis);
  borrow_count = whole_value_borrow_count (Read+Carry not Project, movability).
- Fold-accumulator case mirrored at conservative pre-FoldAccUnwrap semantics:
  carries excluded from plurality but blocking the move -> demoted-to-copy.

23/23 witnesses green (14 frame cells + 9 value cells). Corpus-level
equivalence against live v1 ownership folds = the C4 receipt.

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

* WIP: Duplicate Computation

* WIP: Duplicate Computation/Materialization

* G: exhaustive cache/share census (52 mechanisms, 6 groups) + C0 catalog-grounding of provider rows + forward-wiring walls

The sweep found the tree already models caches: extdeps/cache cache_catalog
(CacheInterfaceCatalogFacts, 9 rows) + extdeps/realization carrier facts +
the warm==cold purity oracle. C0 grounds CacheProvider on that catalog
(provider_from_catalog projection; CacheProvider.id -> CacheInterfaceId)
so the ladder and the catalog never restate each other's half. Three
forward walls (demands-from-DependencyView, hand-cache shape lens,
live-provider-or-red) make new caches born as provider rows only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* C0: provider rows derive from the cited cache catalog (extdeps/cache/materialization.dag projection)

Operator ruling 2026-07-09: extdeps stays the ground-truth/interface layer;
every USE of a cache goes through materialization so memo never gets
re-invented. provider_from_catalog is the only door from a catalog row into
the ladder: keying/tier/eviction derived from cited facts (mechanism->class:
InProcess=>ScopeExit; Ttl/Lru/SizeBounded=>SpacePacked; Never/Manual outside
a process => typed ProjectionRefused, counted by the new enrolled witness;
HandAuthored/prefix-fallback keys => ExistenceKeyed until key-completeness
upgrades them). CI sccache row now derived, hand-typed tier facts deleted,
6/6 + 23/23 witnesses green. 10b re-scoped: v1-internal caches = inventory
only (retire with seed); ParseTable/cached_stage promoted to next.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* Fail-closed hardening: RefusedNatureConflict arm, weakest-claim nature default, UsesStep silence counted, ladder cells enrolled in CI

The complexity-lens false-clean lesson applied to this gate before anyone
relies on it: (1) heterogeneous natures on one identity were first-wins —
now a typed RefusedNatureConflict (24th ladder cell, RED witness); (2) an
unrostered run-step claimed PureComputation — now IdempotentEffect, the
weakest claim (verdict-identical, no purity overclaim; a misdeclared
WorldRead can no longer be legally memoized by default); (3) UsesStep
foreign actions produced silence — now a pinned denominator (==9; a new
foreign action must consciously bump it); (4) the ladder's 24 cells enroll
on the CI surface so the law's own witnesses gate every run. 24/24 + 7/7.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* M1 ratchet bump: declared resolve count 1 -> 3 (gate's first live catch — enrollment pays counted resolves)

Run 29058798771: enrolling the ladder witness file moved resolves_total
1 -> 3 (each enrolled entry file pays one closure resolve against the
shared index) and the receipt gate redded that exact run — the designed
semantics, receipted in the note. Bump acknowledges the two witness-entry
resolves as declared debt; M2 (one closure resolve per roots set)
ratchets back toward 1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Retire the M1/M2 labels from carriers (no-codename rule; collided with DESIGN's floor-memoization M1/M2)

Step renamed to 'Floor resolve receipt gate (declared cold-resolve count)';
notes and the gate echo now say what the things are: the counted
cold-resolve receipt, and the shared-resolve rewire (one closure resolve
per source-roots set). Naming-retirement note left on the carrier.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* Run-step natures pinned as counted claims, not affordances

Operator ruling 2026-07-10: hardcoded shell scripts get no affordances
— run-steps are supposed to be modeled as typed intents and emitted
(shell-emission-model slice 4 covers ci_workflow RunSteps). Until that
slice lands, every nature in job_run_demands is a claim (rostered
FreshEffect / weakest-default IdempotentEffect), never derived from a
modeled effect row. Count the whole claimed-nature surface (16 by
execution) and pin it in the enrolled witness: a new raw-script step
must consciously bump the pin, and slice-4 migration becomes a
countable ratchet ending at zero, where the pin becomes a wall.
Rejected alternative recorded in the carrier note: a per-step
declared-natures roster (a second parallel ledger over scripts the
shell-emission plan already governs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Regen DESIGN.md after main merge (duplicate-work row + #6373 body-lowering row coexist)

Conflict was both sides editing the open-threads list in design_document.dag:
ours added the duplicate-work thread, main's #6373 rewrote body-lowering to
Stages 1-3 LANDED. Resolution keeps both rows in the .dag authority; DESIGN.md
regenerated from it, never hand-edited.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* Inferred materialization increment 1: floor demand ledger + receipt-or-red gate

Running IS enrolling: the interpreter ledgers every keyed pure call and every
InterpContext absorbs its totals into a process accumulator on Drop — by
construction, no eval path escapes the receipt. claim_executor writes
target/floor-materialization-receipt.txt at walk end; trace defaults ON in
the executor, and an explicit =0 zeroes keyed_calls which the gate refuses.

Gate arms this push (all verified under dash from the emitted ci.yml):
receipt missing/malformed/keyed_calls=0 fail closed. Exact pins for
unkeyed_calls and duplicated_keys land from the FIRST CI receipt (the
resolve gate's measure-then-pin path) — unkeyed is known nonzero on the
floor (count_matching takes a predicate closure; closures are the one
disclosed identity-less class, dissolve-on captured-env content identity).

Unit witness green: resolve -> eval -> ctx Drop -> absorb -> drain-once.
Step addition bumped the claimed-natures pin 16 -> 17 consciously.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review fix: drop the racy drain-once assertion from the receipt unit test

opus-4-7 finding on #6441: under plain cargo test (still the documented
runner) tests share a process, the env latch is OnceLock-sticky, and
sibling ctx drops could absorb between the two takes — making the
drain-empty assertion racy. Absorb-on-Drop stays asserted (monotone under
concurrent absorbs: siblings only ADD); drain-once is Option::take by
construction, not asserted through the shared global. Comment states the
sharing semantics explicitly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

* WIP: Duplicate Computation/Materialization

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Turn on affected-set CI: re-land witness enrollment flip (discovery shrunk by affected set) + falsifier host-OOM receipt (#6438)

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* Fix CI OOM: pin discovery corpus spawn_width_cap to 1.

Run 28999086030 OOM-killed at width=2 on the 24GiB live slot during the
discovery-flip corpus batch. Gate workloads still fit at width=2; only the
tree-wide discovery batch serializes via spawn_width_cap=1, with a receipt
witness and dissolve-on note.

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

* Fix type error in corpus discovery spawn width cap helper.

Both if-branches must return Nat (hardware_thread_count_value), not a
bare Int literal.

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

* Merge affected-set enrollment flip (takeover of PR #6403 from session/gentle-stag-677-flip)

Conflict resolutions onto post-#6422/#6431/#6432/#6435 main:
- ci_witness_optin_inversion: main's typed Scaffold Disposition -> Terminal (dissolve fired at the flip; roster stays as explicit-entry home, exclusivity dissolved)
- floor step timeout: 45 (main) vs 60 (flip) -> 60 with provenance note
- ci_spec notes: kept flip notes, stale fixed-8 phrasing dated
- falsifier width note: + RESIDUE paragraph (5x exit-137 on srv2-class slots = converge lane, not plan width)

Verified before commit: discovery batches charge corpus_resolve_nanos (own key), resolve_nanos=0 -> resolves_total declared 3 is NOT moved by the flip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* Correct the false flip receipt + kill-surviving calibration receipts (space-lens loop)

CORRECTED RECEIPT: run 29000557166's floor never completed - the executor was
host-OOM-killed mid-discovery-corpus at ~8min; the log's ExitSuccess belongs to
the merge-admission stamp tool stamping CI_FLOOR_EXIT=137. No flipped corpus
has completed in CI (0/1 ci + 0/5 falsifier). Both carrier notes corrected.

Calibration (coordinated with merry-owl-649's space-lens lane):
- roster_import_closure_nodes_pre_resolve: shared closure-count authority
  (pure import walk, closure grain not entry grain), emitted BEFORE the heavy
  resolve so killed runs still yield the (nodes, peak) lower-bound pair
- width-1 definition-drift oracle: pre-resolve walk must equal post-resolve
  resolved union on completed runs; refuses on divergence. Proven by execution:
  pre == post == 190/213 nodes across Off/Applied modes
- kill-surviving cgroup memory.peak pre/post steps (post is always()) in the
  ci job and falsifier.yml; scope semantics labeled on the emission lines
  (reset=ok floor-scoped; span compares post>pre; never silently conflated)
- job backstop timeouts extended by the two aux steps in both jobs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Calibration pairs carry censored-vs-exact labels (methodology: killed runs are censored observations)

Floor steps get id=floor; the always() post-peak step emits floor_outcome so
each (closure_nodes, peak) pair is explicitly labeled: success = exact point,
anything else = censored lower bound (true demand strictly greater than read).
Prevents the fit from treating cap-kill reads as point estimates, which would
drag the slope down and make the predictor underestimate - the dangerous
direction (merry-owl methodology catch, 2026-07-10).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Review fixes: explicit witness import + complete step-budget ledger

- ci_floor_plan_witness_test.dag: import witness_ci_corpus_discovery_serializes_at_width_one
  explicitly (cursor catch on #6438). The call resolved pre-fix via the seed resolver's flat
  namespace, so the witness ran green by execution; the explicit import restores the file's
  per-symbol import convention.
- ci_workflow.dag: the resolve-receipt gate step had NO step cap — a hang there could only die
  by job-cancel (the #6323 starvation-kill class). It now carries the aux cap (script is a
  sub-second receipt read) and the ci job backstop counts four aux terms (peak pre/post,
  resolve-receipt gate, merge-admission gate): every step budgeted, backstop = step-sum + prelude
  (claude review catch on #6438, sharpened).
- falsifier_workflow_witness_test.dag: falsifier_backstop_is_step_sum_plus_prelude asserted the
  pre-calibration formula — latent red proven by execution (FAIL receipt), fixed to the live
  two-aux sum, re-run PASS.
- ci.yml regenerated byte-stable from the carrier (backstops 125->130, gate step timeout 5m).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Rebind calibration provenance comments to real artifacts (cursor review catch)

The two cli_run.rs comments cited docs/plans/space-lens-minimal-project.md, which does
not exist on main — the predictor design is in flight on PR #6442 (merry-owl-649's lane)
and was never landed under that path. Rebound: the shared closure-definition authority is
stated as this function itself, with the in-flight design cited by PR number and the
landed parent-lane authorities cited by real paths (compute-envelope-model.md fleet
envelope; input-envelope-roadmap.md admission). No behavior change; cargo check clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Remove stray empty file (shell-redirect artifact the auto-committer flushed)

An internal-messaging command's backtick content was command-substituted by bash; a
'-> fail-closed' fragment became a stdout redirect and created an empty file at the
repo root, which the auto-committer then committed as 38f0a46. No tree content
beyond the empty file; removing it restores the branch to e99c757's content.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Scaffold-mark the cgroup peak calibration shell (cursor review catch)

The three concat-built calibration runners (ci_cgroup_peak_locate_shell,
ci_floor_peak_pre_script, ci_floor_peak_post_script) landed without the on-carrier
scaffold markers repo convention requires for hand-shell. Each now carries a
Disposition = Scaffold { dissolves_to: RealizationDispatch } row binding the decl
(the ci_materialization pattern), and both scripts embed the shared dissolve-on
note as a shell comment (the ci_spec pattern): dissolution = bash-emit (#5828 /
gap-B emit(intent, Bash)) realizing the observation as an emitted ShellProgram
intent or a typed host Observe effect. ci.yml + falsifier.yml regenerated;
falsifier_workflow_witness_holds and the flip witnesses re-run PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Merge origin/main into session/loyal-wren-398 (resolve #6441 step-list conflict)

Conflict resolution, all consciously declared:
- ci_job steps: union — the calibration peak pre/post steps wrap the floor step (this
  branch) and #6441's materialization receipt gate slots between the resolve-receipt
  gate and the merge-admission gate (main).
- The incoming materialization receipt gate step landed with timeout none — the same
  uncapped-step starvation-kill class this branch's review fix eliminated — so it now
  carries the aux cap, and the ci backstop counts FIVE aux terms (peak pre, peak post,
  resolve-receipt gate, materialization receipt gate, merge-admission gate); the budget
  disposition note records the merge provenance.
- ci_run_step_natures_are_claims_counted_not_silent: RunStep count pin bumped 17 -> 19,
  acknowledging the two peak calibration steps #6441's count predates (conscious-count
  discipline; proven red at 17 then green at 19 by execution).
- ci.yml regenerated from the merged carriers (backstops 130 -> 135).

Verified on the merged tree: release bins rebuilt on merged Rust; falsifier workflow
witness, flip witnesses, floor-plan/optin/width witnesses, and all 8 ci_materialization
witnesses PASS; generated-artifact regen ExitSuccess.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* ShellProgram -> DAG: transport intent collapse + live importer ratchet (phase 0 of the sidecar dissolution) (#6449)

* WIP: ShellProgram -> DAG

* WIP: ShellProgram -> DAG

* WIP: ShellProgram -> DAG

* WIP: ShellProgram -> DAG

* WIP: ShellProgram -> DAG

* bash fold: native Concat/CmdSubst/WithRedir coverage + measured cost wall on the whole-tree emit path

Fold-family productions extended so the fold no longer refuses word
Concat/CmdSubst or stmt WithRedir (all four Redir variants): new
concat_parts/word-compound/with_redir production families, lex tokens,
kind-tag emit transforms, and recursive bundle arms. Byte-identity vs
serialize_bash proven by execution: five depth-2 oracle tests plus the
depth-4 assign_root_stmt manual probe (ROOT=$('git' 'rev-parse'
'--show-toplevel' 2>/dev/null || 'pwd') byte-exact). The delegated
fail-closed RED control repoints from WithRedir (now native) to Heredoc
(still delegated) so the boundary guard stays discriminating.

Measured cost wall, declared on-carrier (bash_program_emit_cost_wall_note):
whole-tree backward row-selection is ~alternatives^depth (1s flat stmt,
64s for the single depth-4 stmt, DNF >8min for the full witness_bin
program) because formal_production_unique_lhs_exact_match deep-validates
every candidate per level and the descent re-validates each level again.
Real-program oracles therefore stay MANUAL probes, not test fns (a
discovery-run test would hang the local floor); the probe note on the
test carrier names the dissolution triggers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* B1: NameResolutionPolicy row + position-tracked resolve (NamespaceOnlyY gated).

Add v2.std.resolution_policy (ImportScoped default | NamespaceOnlyY). Thread
ResolveContext { position, expected, policy } through resolve walk; namespace-only
skips import module bindings and uses symbol_index at position. Policy pilot
witness: green under NamespaceOnlyY at type position, RED under ImportScoped at
module position. Import-scoped global default unchanged — zero corpus churn.

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

* Wave 1A - namespace-only name resolution: make the syntactic containment tree the single naming authority (qualified name = nesting position, reference = lexical lookup up ancestors, . = projection one level down). Path: confirm loyal-heron SymbolIndex scaling receipt FIRST, then SymbolIndex = conta (#6451)

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* v2.std.symbol_index: materialize containment tree as single naming authority

Add SymbolIndex fill from nesting (qualified path → Node), qualified-name
path algebra bridges, and discriminating witnesses. Retarget #6436 variant-
visibility scaffold to dissolve into symbol_index_lexical_lookup; harvest_unique
stays interim until module-scoped index scan lands.

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

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* Fix rust fmt on qualified-name bridge host functions (CI rust_tests gate).

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

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* Remove symbol_index_has_path; tests match symbol_index_lookup directly

Dissolve Optional→Bool predicate in new std/ surface per review. Lexical
lookup root termination already uses qualified_name_is_empty (not dotted
string projection).

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

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* Address review: is_empty authority, host scaffold binds, layer split

- Remove qualified_name_is_empty; lexical lookup uses is_empty(xs: position)
- Host dispositions bind to from/to_dotted_string bridges; add P5 receipt tests
- Move extdeps-coupled fill to v2.compiler.symbol_index_fill (layer DAG fix)

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

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* Wire resolver through SymbolIndex; dissolve harvest_unique_disj interim.

Build SymbolIndex at admission and thread it through Namespace. resolve_atom
falls back to symbol_index_lexical_lookup for unbound atoms after import-scoped
lookup_chain. Fill-time unique-variant aliases (suffix-scan equivalent) replace
#6436 harvest_unique_disj. Equivalence witnesses prove SymbolIndex-alone covers
variant visibility (green + without-alias RED control); end-to-end wire green.

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Wave 1A - namespace-only name resolution: make the syntactic containment

* Drop unused ResolveContext.expected until expected-type lane lands.

Removes the dead field and uncalled resolve_ctx_with_expected helper
flagged in #6454 review 36717 — B1 uses position-only disambiguation;
expected-type filtering returns when that slice is scoped.

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

---------

Co-authored-by: gunbai-bot[bot] <289086189+gunbai-bot[bot]@users.noreply.github.com>
Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Brian Searls <11205878+briansrls@users.noreply.github.com>
briansrls added a commit that referenced this pull request Jul 11, 2026
…-identical plan receipt) (#6444)

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* WIP: Re-land affected-set CI enrollment flip once shard resolve footprint is

* Fix CI OOM: pin discovery corpus spawn_width_cap to 1.

Run 28999086030 OOM-killed at width=2 on the 24GiB live slot during the
discovery-flip corpus batch. Gate workloads still fit at width=2; only the
tree-wide discovery batch serializes via spawn_width_cap=1, with a receipt
witness and dissolve-on note.

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

* Fix type error in corpus discovery spawn width cap helper.

Both if-branches must return Nat (hardware_thread_count_value), not a
bare Int literal.

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

* Merge affected-set enrollment flip (takeover of PR #6403 from session/gentle-stag-677-flip)

Conflict resolutions onto post-#6422/#6431/#6432/#6435 main:
- ci_witness_optin_inversion: main's typed Scaffold Disposition -> Terminal (dissolve fired at the flip; roster stays as explicit-entry home, exclusivity dissolved)
- floor step timeout: 45 (main) vs 60 (flip) -> 60 with provenance note
- ci_spec notes: kept flip notes, stale fixed-8 phrasing dated
- falsifier width note: + RESIDUE paragraph (5x exit-137 on srv2-class slots = converge lane, not plan width)

Verified before commit: discovery batches charge corpus_resolve_nanos (own key), resolve_nanos=0 -> resolves_total declared 3 is NOT moved by the flip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* WIP: affected set processing

* Correct the false flip receipt + kill-surviving calibration receipts (space-lens loop)

CORRECTED RECEIPT: run 29000557166's floor never completed - the executor was
host-OOM-killed mid-discovery-corpus at ~8min; the log's ExitSuccess belongs to
the merge-admission stamp tool stamping CI_FLOOR_EXIT=137. No flipped corpus
has completed in CI (0/1 ci + 0/5 falsifier). Both carrier notes corrected.

Calibration (coordinated with merry-owl-649's space-lens lane):
- roster_import_closure_nodes_pre_resolve: shared closure-count authority
  (pure import walk, closure grain not entry grain), emitted BEFORE the heavy
  resolve so killed runs still yield the (nodes, peak) lower-bound pair
- width-1 definition-drift oracle: pre-resolve walk must equal post-resolve
  resolved union on completed runs; refuses on divergence. Proven by execution:
  pre == post == 190/213 nodes across Off/Applied modes
- kill-surviving cgroup memory.peak pre/post steps (post is always()) in the
  ci job and falsifier.yml; scope semantics labeled on the emission lines
  (reset=ok floor-scoped; span compares post>pre; never silently conflated)
- job backstop timeouts extended by the two aux steps in both jobs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Calibration pairs carry censored-vs-exact labels (methodology: killed runs are censored observations)

Floor steps get id=floor; the always() post-peak step emits floor_outcome so
each (closure_nodes, peak) pair is explicitly labeled: success = exact point,
anything else = censored lower bound (true demand strictly greater than read).
Prevents the fit from treating cap-kill reads as point estimates, which would
drag the slope down and make the predictor underestimate - the dangerous
direction (merry-owl methodology catch, 2026-07-10).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: affected set processing

* Review fixes: explicit witness import + complete step-budget ledger

- ci_floor_plan_witness_test.dag: import witness_ci_corpus_discovery_serializes_at_width_one
  explicitly (cursor catch on #6438). The call resolved pre-fix via the seed resolver's flat
  namespace, so the witness ran green by execution; the explicit import restores the file's
  per-symbol import convention.
- ci_workflow.dag: the resolve-receipt gate step had NO step cap — a hang there could only die
  by job-cancel (the #6323 starvation-kill class). It now carries the aux cap (script is a
  sub-second receipt read) and the ci job backstop counts four aux terms (peak pre/post,
  resolve-receipt gate, merge-admission gate): every step budgeted, backstop = step-sum + prelude
  (claude review catch on #6438, sharpened).
- falsifier_workflow_witness_test.dag: falsifier_backstop_is_step_sum_plus_prelude asserted the
  pre-calibration formula — latent red proven by execution (FAIL receipt), fixed to the live
  two-aux sum, re-run PASS.
- ci.yml regenerated byte-stable from the carrier (backstops 125->130, gate step timeout 5m).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Address REQUEST_CHANGES: shell dissolution markers + space-lens plan receipt.

Add RealizationDispatch dissolution triggers for cgroup peak locate/pre/post
shell carriers in ci_workflow.dag (bash-emit #5828 discipline). Land
docs/plans/space-lens-minimal-project.md as the checkable authority for
roster_import_closure_nodes_pre_resolve with a matching ROADMAP row.

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

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Park live discovery flip enrollment to fix CI OOM (exit 137).

Discovery corpus alone exceeds the 24GiB slot cap (run 29123623007).
Keep flip machinery authored on witness_discovery_scan_dirs and witnessed
via discovery_flip_enrolled_spec; live gunbc_ci_spec keeps empty dirs until
skip-before-resolve + memory receipt land. Falsifier reads layer_roots dirs
directly so nightly predict-only corpus is unaffected.

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

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Reconcile authority docs with parked discovery enrollment.

Qualify DESIGN.md and design_document.dag Building & checks CI text:
live spec runs opt-in roster only; discovery flip is parked until
skip-before-resolve + memory receipt. Revert ci_witness_optin_inversion
to Scaffold bound to ci_spec_discovery_flip_enrollment_disposition;
update ci_spec_witness_entries_note to match.

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

* Merge origin/main (#6438): enroll discovery flip, keep S2a runner

Reconcile with main's affected-set witness enrollment (#6438) while
preserving S2a runner migration, flip isolation witnesses, cgroup peak
calibration, and materialization receipt gate. Drop parked enrollment
scaffold; regenerate ci.yml and falsifier.yml from dag emit.

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

* Move runnable_selection_applied to std.realization_schedule

Address review #36705: the NodeFrontierSelection predicate belongs on the
canonical Runnable schedule surface, not as a local coproduct match in
ci_floor_plan. Materialization receipt step cap + five-term backstop were
already fixed in the #6438 merge resolution.

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

* Park live discovery enrollment to fix CI OOM on PR branch.

Batch-1 S2a runner receipt already passes; batch-2 discovery corpus hits the 24GiB cap (run 29126848340). Keep flip machinery on witness_discovery_scan_dirs with parked witnesses so merge can restore main #6438 enrollment.

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

* Regenerate ci.yml after ci_spec park changes.

Fixes generated_artifact_drift_gate_passes (trailing newline drift in committed workflow artifacts).

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

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Regenerate stage0 after runnable_selection_applied authority move.

Fixes ci_regen regen_verify_gate_passes — std_realization_schedule.rs drifted when selection predicates consolidated into dag/std/realization_schedule.dag.

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

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Resolve merge conflicts with main (space-lens doc + ci_floor_plan).

Keep main's space-lens design doc with interim #6425 calibration appendix; retain S2a discovery-flip imports (ci_spec_with_discovery_scan_dirs) and drop removed RustMonolithGate.

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

* WIP: S2a move 1: layer-2 runner + node-keyed store; migrate CI floor onto it

* Restore main discovery enrollment per review #36778.

Align DESIGN/design_document with enrolled witness_discovery_scan_dirs (#6438); witness bundle uses is_live on gunbc_ci_spec; drop parked import.

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

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.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