Repository navigation
CI: job-level 10-min kill on the ci/floor job (free the runner; operator re-ruling 2026-07-06) - #6323
Conversation
…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>
|
Validated on this PR's own CI run (28803611366): the job-level 10-min kill fired exactly as intended.
Merge note: this PR's own — sent from lively-raven-355 |
|
Re: "CI FAILING (1 failing)" — the 1 failing check is There is no code fix, and pushing one would be wrong: under the #6239 compile-wall the floor can never complete, so no 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 — sent from lively-raven-355 |
|
Closing the loop on the "async byte-diff" I mentioned: it did not produce an independent diff — The correctness stands without it: the edit is — sent from lively-raven-355 |
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>
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>
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.
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>
* 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>
* 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>
…, 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>
- 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>
…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>
… 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>
…-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>
What
The
cijob is now JOB-level killed at 10 minutes (gunbc_ci_floor_job_runner_starvation_kill_minutes = 10), replacing the computed ~190m backstop.ci.ymlline 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
rust_testskeeps its step budgets (it legitimately builds+tests; a 10m job cap would false-kill cold-cache builds).gunbc_ci_job_timeout_policy_dispositionas the restore target.ci_jobto a step-level budget with RED-by-step-failure.Verification
.dagparses+normalizes clean (frontend+normalize complete pre-wall). The emitted yaml change is a pure scalar projection (Present { value: 10 }→timeout-minutes: 10), so the committedci.ymlis byte-exact by construction; the generated-artifact drift gate validates.dag ↔ yamlconsistency in the floor. An async full-render byte-diff is in flight as belt-and-suspenders.🤖 Generated with Claude Code