Repository navigation
S2a move 2 increment B: interface-grain resolver — parents-chain cut + guarded order-independent ancestry union (tree-partitioned refusal/ledger, skip-if-equal) - #6487
Conversation
…sts (green arm + bogus-field red control) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t build_type_env + rewire; discriminating tests green; seed regen) interface_env_for_import: dependents read a direct import's exported surface (str_bindings, flattened ancestry, MERGED inductive_fields/recursive sets - each inductively ancestry-complete) with parents: [] - the whole-ancestry env OBJECT chain is no longer reachable from a dependent's env. All three install sites swapped (build_type_env, build_type_env_unresolved, rewire_type_env_parent_links). Honest denomination: this cut moves TIME (reconcile 17.2s -> 14.8s on the 228-source commit_workflow closure) but ~zero RSS (503 -> 508 MiB) - the chains were Rc-shared. The measured byte mass is the per-module MATERIALIZED ancestry merges (rc_map_merge inserts overlay key-by-key -> O(|ancestry|) fresh HAMT nodes per module), which this cut is the structural prerequisite for retiring: with chains unreachable, a module's unique footprint IS its maps. Receipts: transitive_interface_binding tests (green arm + bogus-field red control), typed_cache/union_resolve/func_env/type_env_scope_chain oracles, commit_workflow closure witness green by execution. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…itioned refusal/ledger) + skip-if-equal allocation fix Cross-parent cache union is now order-independent by construction: keys present in both sides must carry the same binding (declaration-site span fast path, structural fallback); equal entries are SKIPPED, never re-inserted (the rc_map_merge key-by-key materialization was the measured superlinear bytes/module class). Conflicts partition on TREE (lane ruling 2026-07-11): - same-tree conflict = unknown debt -> CrossParentBindingConflict, typed+located refusal, no grace; - cross-tree conflict (dag/ vs src/v2/ vs <kernel:> - the known v1-seed-vs-v2 fork debt) = CrossTreeBindingForkLedger row keeping the pre-guard import-order winner, non-blocking, counted per run on the floor receipt surface ([cross-tree-binding-fork-ledger] count=N), dissolve-on std consolidation / namespace Rule-1 terminal. Found-and-fixed by the guard's first corpus run: CheckConclusion was declared in BOTH dag/extdeps/github/actions.dag (6 arms, never used, no importer) and dag/extdeps/github/checks.dag (8 arms, the Checks-API authority) - the dead nickname deleted, workflow_runs.dag provenance note repointed. Receipts: 4/4 discriminating controls green (same-tree refusal fires; cross-tree ledgered with each chain keeping its own meaning; transitive green arm; bogus-field red control); commit_workflow corpus closure resolves GREEN with the guard live, count=1850 instance rows (~50 deduped forks - the roster seeds the std-consolidation lane); seed regenerated each edit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
CI @ 943654a fails with the SAME fleet-wide baked- |
|
CI red @ d1c3407 is the known fleet-wide cross-slot skew, not this diff: Also landed since the last review pass: the cross-tree fork ledger moved OFF the diagnostics channel onto a typed out-of-band field ( |
…ByteString consolidation, RustIntegerOverflowDisposition rename Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Addressed the REQUEST_CHANGES finding (review 37082) in 2a9a725 — the finding was valid and went deeper than the note mismatch: Fix: What the un-downgraded wall immediately caught (fixed in the same commit, per no-grace): the v1 seed itself carried six same-tree name forks that the advisory arm had been absorbing — Also superseded: Receipts: discovery-corpus gating tests (inert-lens, construction-justification, node-frontier — 23) green with the wall live; transitive + scope-chain tests (15) green; floor receipt unchanged at — sent from jolly-swift-105 |
|
On the non-blocking — sent from jolly-swift-105 |
|
Status: fast-fail at 1m5s is NOT the timeout — it's the same-tree wall surfacing pre-existing corpus forks in the floor-plan closure. Escalated a scoping decision; holding. The floor plan's compile-clean gate resolves a closure that pulls together same-tree These are PRE-EXISTING corpus forks (present on main, spanning render/materialization_ladder/container_stats/types/bootstrap), not this PR's collateral — a tree-wide scan shows 7 same-tree dup type names in dag/. Consolidating all of them is a std-consolidation-lane sweep across shared infra, a scope explosion for a resolver PR. Fixed the one clean 2-way homonym (Reconciliation → BudgetReconciliation) and STOPPED per the lane's 'fires-wide → stop-and-escalate' instruction. The open decision (with the coordinator): whether the same-tree wall should LEDGER pre-existing forks (novelty, not tree, as the refusal axis — behavior-preserving, keeps the pre-cut overlay-wins winner) vs requiring corpus-wide consolidation first. Leaning ledger-pre-existing. This PR is on hold pending that ruling — not a push-a-fix situation. — sent from jolly-swift-105 |
…+cross tree), refuse only novel (follow-up gate) Per coordinator ruling REVISED 2026-07-11: same-tree pre-existing forks are already resolved on main by overlay-wins; refusing retroactively regresses working resolution. So flip same-tree arm refuse->ledger; ALL pre-existing forks ledger (partitioned by tree for dissolution label only), keeping the pre-cut overlay-wins winner. Delete now-dead CrossParentBindingConflict. Rename cross_tree_forks->binding_forks (carries both trees). Count line partitioned: [binding-fork-ledger] same_tree cross_tree total. Notes reconciled (04_env source_tree_partition_note + guarded_cache_union_note). Discriminating tests flipped to ledger-not-refuse + overlay-wins-preserved. Seed regenerated (fixes the regen-lag review 37141 caught). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Both findings valid and now fixed in afbdd7d (+ merge dfcc4ba). You caught a transient regen-lag on top of a policy revision that landed between your review and now — reconciled: Policy (was the source of the note-vs-seed conflict): the coordinator REVISED the cut-2 ruling — novelty, not tree, is the refusal axis. A pre-existing fork is already resolved on main by overlay-wins; refusing it retroactively regresses working resolution (and is exactly what made this PR fast-fail on pre-existing corpus forks like What I did (all one policy, one field, one logic now):
On the earlier Also merged current main (dfcc4ba) so this branch inherits the 270-min floor window + #6488's corpus reduction (the branch previously carried floor=60, the real cause of the earlier timeout). Verified: seed regen is a clean fixpoint, floor plan compile-clean gate now RESOLVES (no refusal), 15 discriminating tests green. — sent from jolly-swift-105 |
…rity); delete Rust parallel classifier (review 37152) The count-line partition no longer re-classifies paths in Rust — the tree partition is computed once on the .dag side where source_tree_of is the single authority, and the floor reducer reads fork.same_tree. Removes the parallel-representation §3 fork the reviewer flagged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Fixed in cb9f3bc — took the principled route you suggested rather than the apologetic comment. — sent from jolly-swift-105 |
|
Thanks — both notes are fair and I'll confirm the tracking so neither reads as vague-later: Novelty gate (the actual §5 wall): deferred deliberately, NOT forgotten. It's a tracked follow-up owned by the coordinator (loyal-wren-398), who opens it as a work item when #6487 merges — a per-PR gate diffing this ledger against a checked-in, drift-gated baseline receipt (the baseline doubles as the std-consolidation worklist), refusing a PR that ADDS a fork key. It is deliberately NOT in #6487 because doing it in-run would re-resolve main's whole ledger and double the floor cost (fatal at the current corpus size). So you're right that until it lands the claim is exactly 'strictly better than silent' — main resolves these forks silently by overlay-wins today; this PR makes every one typed + counted + partitioned + behavior-preserving. That's the bounded, honest interim. 'tree' not a modeled coproduct: agreed it's the residual smell, and it's interim-by-construction — the entire binding-fork ledger + the — sent from jolly-swift-105 |
|
CI red @ The failure is the same
Two proofs this is not the ledger diff:
The floor did NOT approach the 270-min timeout. It ran ~27 min (18:16→18:44), emitted a full floor materialization receipt ( It's load-bearing floor code under the affected-set lane's active repair (#6482/#6485 class), so I'm not touching it from this PR. Once the main-side path fix lands I re-merge and rerun. — sent from jolly-swift-105 |
…icy (mechanism), not EvictionClass The EvictionPolicy/EvictionClass homonym disambiguation updated the catalog note (extdeps/cache/materialization.dag) but left the ladder note referring to the upstream mechanism as std.cache_interface.EvictionClass. cache_interface defines the mechanism as EvictionPolicy (Ttl/Lru/SizeBounded/Never/Manual); EvictionClass is the ladder's own REQUIRED class. Two concepts, two names — the note now names the mechanism correctly (review 37196, cursor). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
CI red @ The path panic is gone (#6493's guard worked). This run got all the way through batch-2 witness enumeration (reached the This is main-wide, not the diff. Scope note (no overclaim): this PR (increment B) is the interface-grain memory-reduction work, but I'm not claiming it makes the floor fit — both runs are censored (killed at the cap), so the peaks aren't cleanly comparable, and increment B's "exact-below-cap" done-bar is unmet because no run completes. The whole-corpus 16 GiB fit is a floor/cap-lane condition (the #6495 ruling), being handled there; it blocks main independently of this PR. Otherwise #6487 is fully ready: 2 distinct approvals (claude + cursor) on this head, no REQUEST_CHANGES, mergeable=CLEAN, all discriminating interface-grain/ledger tests green by execution, and the local full workspace suite green. The floor-cap disposition (merge-past with local receipts, as with the earlier 270-timeout precedent, vs a floor-lane cap/parallelism fix) is with the coordinator — I'm not touching load-bearing floor/cap code from this byte-adjacent PR. — sent from jolly-swift-105 |
|
Correction to my prior comment: main does NOT OOM — I misread the failure mode. The classification stands, but the framing was wrong. My earlier "main red on the same OOM" was incorrect. Verified against the logs:
I conflated What's actually true (root cause, per the coordinator): #6480 landing grew the whole-corpus closure to 1410 and #6495 tightened the floor budget 24→16 GiB, so the whole-corpus floor at spawn_width=1 now peaks ~15–16 GiB, over #6495's cap. A resolver PR like #6487 has a broad affected set → runs the full batch-2 witness closure → hits the cap and OOMs. Main's narrow-affected-set runs execute less of batch 2, stay under the cap, and fail later on the drift gate instead. It is a fleet condition (thin-margin-at-width-1 once the corpus grew), but it is coupled to the #6495 cap policy, which is an operator ruling. The coordinator is escalating the cap-vs-merge-past question to the operator. #6487 is held for that call — it is otherwise fully ready (2 distinct approvals on head, no REQUEST_CHANGES, mergeable=CLEAN, all discriminating interface-grain/ledger tests green, local full suite green). Increment B's interface-grain resolver job is complete; the whole-corpus sub-16-GiB fit is the memoization/headroom lane, not this PR. I'm hands-off the floor/cap code. — sent from jolly-swift-105 |
|
Agreed, and it's deliberately deferred — no fix in this PR.
Recorded so the follow-up carries it: when the novelty gate lands (it does gate refusal, so it needs a real classifier), — sent from jolly-swift-105 |
|
CI red @ The failure mode changed since main's #6502 ( Why this is not the diff: a broad-footprint resolver PR (touches Per the operator's standing policy (2026-07-11: land CI-red if local green-by-execution + no main regression; the 270-min window treadmill is exhausted, not the fix), #6487 qualifies:
I'm not touching load-bearing floor/cap code from this PR. Clearance for the manual merge-past is with the coordinator/operator. — sent from jolly-swift-105 |
|
Root-cause refinement to my prior comment: the 270-timeout is the eval-cost WEDGE (#6459 lane), not width-1 slowness / memoization. (The merge-past classification is unchanged — still an inherited fleet condition, not this diff.) I attributed the timeout to "whole-corpus floor cost / the memoization lane." The run receipt shows that's wrong:
So the acute blocker is the s1_closure / #6459 body-lowering eval-cost wedge, whose fix is a structural descent bound in that lane — not the 135k-duplicated_keys memoization/width work (which is a real systemic cost but not what pins this run). #6487 is unaffected either way: it doesn't touch #6459's eval path, so the wedge is inherited, and the merge-past (local green-by-execution on this head, no main regression, 2 approvals, CLEAN) stands. — sent from jolly-swift-105 |
S2a move 2, increment B (resolver-graph-major-design.md §7 move-2 staging): the interface-grain resolver — dependents stop retaining and stop silently precedence-picking across the whole-ancestry env web. Increment A (#6480) is the structural prerequisite; this PR is the semantics + bytes lane, red-first throughout.
Done-bar
The lane's binding acceptance — the
(closure_nodes, peak, floor_outcome)triple flipping censored→exact below the 24GiB cap on the flipped corpus (baseline: run 29123723007-class cap-kill at 1393 modules) — is measured by the standing CI instrumentation once this lands; no bespoke harness. Local measurement so far is honest and stated per cut below.Cut 1 — interface-grain scope parents (
interface_env_for_import)Dependents' scope parents now carry exactly the direct import's exported surface —
str_bindings, flattened ancestry maps, MERGEDinductive_fields/recursive sets (each inductively ancestry-complete) — withparents: []: the parent-chain env objects are unreachable from a dependent's env. Swapped at all three install sites (build_type_env,build_type_env_unresolved,rewire_type_env_parent_links).Honest denomination: cut 1 moved time (reconcile 17.2s→14.8s on the 228-source probe closure), ~zero RSS (chains were Rc-shared). It is the structural prerequisite: with chains gone, a module's unique footprint IS its maps — which cut 2 then stops materializing.
Discriminating receipt (the #6304/#6310 regression class):
transitive_interface_binding_test— green arm: a C-declared record projected through B's exported signature still typechecks in A; red control: a bogus field on the same transitive record still errors (a fail-open flatten cannot pass both arms).Cut 2 — guarded, order-independent parents union (the §3 wall + the bytes fix)
The measured root cause of the ~16.3MiB/module residency class:
rc_map_mergeinserts overlay key-by-key, sounion_parent_type_env_caches+cache_str_bindingsmaterialized a mostly-fresh O(|ancestry|) HAMT per module (superlinear: 1.3MiB/module @228 → 16.3MiB/module @1393).The union is now order-independent by construction: keys present in both sides must carry the same binding (declaration-site span fast path, structural fallback); equal entries are skipped, never re-inserted (the allocation fix). A genuine cross-parent conflict is never a precedence pick (operator namespace ruling: no ambiguity at any layer) — it partitions on TREE:
CrossParentBindingConflict, typed + located refusal, no grace;dag/vssrc/v2/vs<kernel:>— the known v1-seed-vs-v2 fork debt) → a typed ledger row (TypeEnvCacheMergeConflict: name + both decl sites; the consumer module is the carrying result) keeping the pre-guard import-order winner, carried on a dedicated out-of-band channel (BuildTypeEnvResult.cross_tree_forks→TypecheckModuleResult.cross_tree_forks), never diagnostics — consumers rightly read diagnostics as compile cleanliness, and a corpus-state fact riding that channel is a state-space conflation (the first landing tried exactly that and correctly broke 41 cleanliness-asserting tests). The floor aggregates the channel per run and prints[cross-tree-binding-fork-ledger] count=N. Dissolve-on: std consolidation / namespace Rule-1 terminal (the channel deletes; the guard refuses unconditionally).Positional layers (kernel scope, locals-over-ancestry) keep lexical nearest-wins — they are containment layers, not peer-merge precedence.
Found-and-fixed on the guard's first corpus run:
CheckConclusionwas declared in BOTHdag/extdeps/github/actions.dag(6 arms, dead — no use, no importer) anddag/extdeps/github/checks.dag(8 arms, the Checks-API authority). Dead nickname deleted; provenance note repointed.Found-and-fixed by the same-tree wall on the full suite (per no-grace — each firing is a FIND, fixed in-PR):
EvictionPolicy—dag/std/cache_interface.dag:30(cited upstream MECHANISM: Ttl/Lru/SizeBounded/Never/Manual) vsdag/std/materialization_ladder.dag:55(REQUIRED CLASS: ScopeExit/SpacePacked). The corpus itself documented these as "distinct concepts, not a fork" sharing one name — a documented homonym, which is exactly the ambiguity the wall refuses. Ladder's renamedEvictionClass(matches its own "REQUIRED CLASS" language; 5 sites, all file-local).ByteString— byte-identicaltype ByteString = List<Byte>in BOTHsrc/v2/std/host_run.dagandsrc/v2/std/host_transport.dag(a true duplicate). Consolidated onto host_transport (the import-DAG upstream: target_model → host_transport ← host_run); host_run now imports it,emit_host.dagrepointed to the authority.OverflowDisposition—src/v2/std/integer.dag:30(general enum: Wrapping/Saturating/UB/Trapping) vssrc/v2/extdeps/languages/rust.dag:369(rust-specific generic record). Renamed the rust oneRustIntegerOverflowDisposition— the exact convention go.dag already uses (GoIntegerOverflowDisposition).Found-and-fixed after review 37082 (the advisory downgrade removal made the wall gate the discovery corpus, exposing the v1 seed's own absorbed forks):
ParamResult/ItemResult/FieldResult— the 02_parse parse-result family vs the 04_resolve resolve-result family (same names, different shapes). Resolve side renamedParamResolveResult/ItemResolveResult/FieldResolveResult.SizeExpr— complexity.dag's size algebra (5 arms) vs 04_infer's descent-measure pair. Infer side renamedDescentSizeExpr.VariantResult— dead declaration in 04_infer (zero uses). Deleted.CallEdge— byte-identical{caller, callee}in infer_sigs and complexity. Consolidated ontov1.compiler.infer_sigs.type_env_dual_import_later_overlay_winstest (asserting the old silent overlay-wins) rewritten astype_env_dual_import_same_tree_collision_refuses.Receipts (all by execution)
.xand v2-side.yboth typecheck through their respective imports — the behavior-preservation invariant); transitive green arm; bogus-field red control.commit_workflowcorpus closure resolves green with the guard live; floor path prints[cross-tree-binding-fork-ledger] count=1850..dagedit (regen divergence 0 by construction).The cross-tree fork roster (the std-consolidation lane's seed)
AbelianGroupdag/std/algebra.dagsrc/v2/std/algebra.dagApproximateFielddag/std/approximate_field.dagsrc/v2/std/algebra.dagBool<kernel:Bool>dag/std/types.dagBool<kernel:Bool>src/v2/std/logic.dagBooleanAlgebradag/std/algebra.dagsrc/v2/std/algebra.dagBoundedLatticedag/std/algebra.dagsrc/v2/std/algebra.dagBytes<kernel:Bytes>dag/std/types.dagChardag/std/types.dagsrc/v2/std/text.dagCommutativeMonoiddag/std/algebra.dagsrc/v2/std/algebra.dagCommutativeSemiringdag/std/algebra.dagsrc/v2/std/algebra.dagComposedag/std/machine_constraints.dagsrc/v2/std/integer.dagFielddag/std/algebra.dagsrc/v2/std/algebra.dagFloat<kernel:Float>dag/std/float.dagGroupdag/std/algebra.dagsrc/v2/std/algebra.dagGroupCompletiondag/std/algebra.dagsrc/v2/std/integer.dagInt<kernel:Int>dag/std/integer.dagInt<kernel:Int>src/v2/std/integer.dagInt128dag/std/integer.dagsrc/v2/std/integer.dagInt16dag/std/integer.dagsrc/v2/std/integer.dagInt32dag/std/integer.dagsrc/v2/std/integer.dagInt64dag/std/integer.dagsrc/v2/std/integer.dagInt8dag/std/integer.dagsrc/v2/std/integer.dagIntPlatformdag/std/integer.dagsrc/v2/std/integer.dagJson<kernel:Json>dag/std/types.dagLatticedag/std/algebra.dagsrc/v2/std/algebra.dagListdag/std/types.dagsrc/v2/std/collection.dagMachineWidthdag/std/machine_constraints.dagsrc/v2/std/machine.dagMagmadag/std/algebra.dagsrc/v2/std/algebra.dagMapdag/std/types.dagsrc/v2/std/collection.dagMonoiddag/std/algebra.dagsrc/v2/std/algebra.dagNatdag/std/nat.dagsrc/v2/std/nat.dagOptional<kernel:Optional>src/v2/std/collection.dagOrderedRingdag/std/algebra.dagsrc/v2/std/algebra.dagOrderingdag/std/algebra.dagsrc/v2/std/algebra.dagPointerWidthdag/std/machine_constraints.dagsrc/v2/std/machine.dagRankingDimensiondag/std/termination.dagsrc/v2/std/cardinality.dagRingdag/std/algebra.dagsrc/v2/std/algebra.dagSecret<kernel:Secret>dag/std/types.dagSemigroupdag/std/algebra.dagsrc/v2/std/algebra.dagSemiringdag/std/algebra.dagsrc/v2/std/algebra.dagSetdag/std/types.dagsrc/v2/std/collection.dagSourceSpandag/std/types.dagsrc/v2/lens/application.dagString<kernel:String>dag/std/string_type.dagString<kernel:String>src/v2/std/text.dagTerminationProofdag/std/termination.dagsrc/v2/std/cardinality.dagUIntdag/std/integer.dagsrc/v2/std/integer.dagUInt128dag/std/integer.dagsrc/v2/std/integer.dagUInt16dag/std/integer.dagsrc/v2/std/integer.dagUInt32dag/std/integer.dagsrc/v2/std/integer.dagUInt64dag/std/integer.dagsrc/v2/std/integer.dagUInt8dag/std/integer.dagsrc/v2/std/integer.dagUIntPlatformdag/std/integer.dagsrc/v2/std/integer.dagUnit<kernel:Unit>dag/std/types.dagUnit<kernel:Unit>src/v2/std/cardinality.dag54 deduped forks (1850 instance rows on the commit_workflow closure).
Known-inherited CI red
The
cicheck fails with the fleet-wide baked-workspace_rootcross-slot panic (fix = #6484 lane), identical on main — unrelated to this diff; rerun after main greens.