Repository navigation
XL-0N: generic LiteralElaboration/OperatorRealization authority — typed literal-to-Zero/Succ homomorphism, operator realization by exact operand structure, structural Peano Nat (no i64 row) - #9719
Conversation
…nt, and a primitive with no realization refuses instead of inventing one Two roots behind 175 of the 260 rustc errors on the emitted v2 compiler closure (issue #9664, milestones 1 and 2): - 102 x E0425: the four DeclaredCallableIdentity constructions in v1.compiler.infer_lookup took decl_name from the AUTHORED spelling, so a qualified call carried the whole dotted path as the declaration name and emission rendered crate::v2_std_grammar::v2.std.grammar.f(..). - 73 x E0425: v2.std.algebra length is a ModeledProjection of the `length` primitive and rt_function_registry has no `length` row, so emission took rust_runtime_bridge_name's identity arm and wrote v1_rt::length -- a symbol the seed does not define. A primitive's identity and its per-target realization are two facts; CallTargetIdentity carried only the first, so every emitter had to ASSUME a bridge exists. RuntimePrimitiveCall now carries projected_from, the declaration the roster projected it from, and emit_rust routes to the bridge only when its own registry holds the primitive, falls back to the declaration otherwise, and refuses when neither exists. DeclaredCallableIdentity moves to v1.std.core so the target type can carry it without forking the pair. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…ot checked tier0 method resolution resolves an ordinary fn-typed RECORD FIELD through lookup_field_in_product, so `algebra.step(..)` arrives as AlgebraMethodSemantics carrying the field node as its method_def. The fallback at the end of that arm hardcoded runtime_bridge: true, which emitted `v1_rt::step` -- and made emit_rust_generic_method_call's own callable-field arm, guarded on runtime_bridge == false, unreachable for the exact receiver it was written for. 65 E0425s on the emitted v2 compiler closure (member, apply, is_empty, step, init, allocate_literal, ...) were that one literal. It now passes the realization question keyed on the same registry as the plain-call seam, so a real bridge method still lowers to a bridge, a callable field lowers as a field, and a name that is neither reaches the existing loud refusal rather than a fabricated symbol. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…y is a self-call, so falling back to it would emit a nonterminating function The declaration fallback is sound only where the declaration's body is real code. HostRealizedSeam means the body IS a self-call, so emitting it compiles and then loops forever -- silent wrongness, strictly worse than the unresolved symbol it would have replaced. A seam whose target has no realization has no honest lowering, so it carries nothing and reaches emission's refusal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…lared to be host seams
v2.std.compilers.lexing symbol_lexeme and symbol_intern_lexeme have self-call
bodies -- the HostRealizedSeam shape exactly -- and the interpreter has carried
real arms for both (v4_bridge.symbol_lexeme, v4_bridge.symbol_intern_lexeme).
With no projection roster row the resolver saw ordinary declarations, so Rust
emission emitted the declaration, and
pub fn symbol_lexeme(sym: String) -> String { symbol_lexeme(sym) }
COMPILES. The emitted closure carried two functions that type-check, pass every
gate we own, and diverge from the interpreter by not terminating. Unlike the
sibling seams (decl_facts and friends, which at least refuse loudly as
unresolved v1_rt symbols) nothing anywhere reported this one -- it is absent
from the E0425 census precisely because it is silent.
extdeps.languages.rust.types already declares Symbol's target type as String,
so on this target both bridges are the identity. That is a realization of the
declared row, not a second opinion about it.
Residue named, not closed: a self-call body is a DECIDABLE structural marker of
a host seam, so the compiler could refuse an unrealized one rather than emit it.
It does not yet; that check is the class's next-rung trigger.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…round 2) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…, with boundary controls Six rows over the three emitter defects plus the two symbol bridges. Each class's positive and negative assertion differ only in the fact the repair added, so no single edit satisfies both directions, and each repair carries a boundary control that would go red had it over-reached the other way (empty_map for the registry gate, a registered bridge method for the class-B gate). The symbol-bridge row is deliberately not an error-count assertion: that class COMPILED throughout the defect and diverged by not terminating, so a row asserting 'no error' would have been green the whole time. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…never reaches the seam under repair count is answered by rust_simple_method_specs before the algebra fallback, so the row would have gone red while executing none of the code the repair touched. trim is in rt_function_registry and has no template, so it is one of the few names that actually reaches that fallback. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
The module index refused the file outright, so none of the six witnesses were discovered. .dag item declarations carry no terminator. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…mitting compiling recursion A whole-body self-call is the decidable structural marker of a host seam. In the interpreter the shape is safe -- reaching it recurses to the evaluation-budget refusal -- but emitted to Rust the same shape COMPILES and returns to no caller. Nothing reported it: not the module index, not the compile-clean gate, not cargo check. That is why the two symbol bridges were invisible until someone read the emitted bytes. emit_fn_def now asks the realization registry -- the same authority the call sites ask, so the two cannot drift -- and suppresses the declaration when the seam is realized, refuses with a located message when it is not. Suppression rather than delegation is deliberate: a forwarding body would make this seam reconstruct signatures in target types, which is the cementing the existing suppressed-seam precedent avoids, and a realized primitive's calls all route to the bridge anyway. The predicate is whole-body identity, not 'contains a self-call'. Ordinary recursion has a match, an if or a let between the head and the call, so it never matches; expr_has_self_call walks children and would have refused most of the compiler. Both directions carry a fixture. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…, not the declaration name Measured, not predicted: the wall refused six seams in the emitted closure and one of them -- v2.std.collection empty_map_primitive_delegate -- is realized. Its roster row names the empty_map primitive, whose bridge is rc_empty_map, but rt_function_registry holds 'empty_map' and the wall looked up 'empty_map_primitive_delegate'. A declaration's name and the primitive it realizes are two facts; the roster is the authority that joins them, and the declaration name is only the fallback for a seam nobody has rostered. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…ession created 10 dangling imports Measured on the emitted closure with the wall finally in the mirror: removing a realized seam's item left 10 unresolved imports (E0432) for symbol_lexeme, symbol_intern_lexeme and resolve_type_node. Other modules import these declarations; the suppression created that breakage rather than finding it. And the reasoning that made suppression look safe is what makes it unnecessary. A realized seam's body IS a call to itself, and resolution already routes that call through the roster to the bridge -- so ordinary emission writes v1_rt::symbol_lexeme(sym) as the body without help. The wall's whole job is the UNREALIZED arm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…: rustc's denominator is larger than the demand denominator compile_error! fails the WHOLE crate, and that form silently assumes every seam it refuses is one somebody calls. It is not. rustc type-checks the entire emitted crate including declarations imported but never invoked, so the refusal denominator is strictly larger than the entry-reachable execution closure -- five unreachable seams took the crate down. The refusal is now a panic body with the declaration's real signature: dependent modules resolve, the crate compiles, and only an actual invocation fails loudly. That moves the refusal from the crate to the one declaration that earned it, and leaves reachability to a separate instrument. An entry-rooted pruner can replace the body later without revisiting this. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…his change DETERMINISM DENOMINATOR (9 reach_witness rows red, including determinism_denominator_is_closed_on_declared_primitives, whose entire job is to notice this). v2.lens.determinism closes its denominator over primitive_declared_definitions, so adding two canonical names without traversal facts made the closure false. Both bridges are scalar -- symbol_lexeme maps one Symbol to its text and symbol_intern_lexeme is its inverse -- so there is no collection to walk and OrderFreeResult is the honest arm. HostUnspecifiedOrder would claim a real traversal whose order the host does not pin, fabricating a leak the primitive cannot have. NAMESPACE WAVE ADMISSION (6 unadjudicated deltas). Four are TargetChanged for DeclaredCallableIdentity moving v1.compiler.infer_sigs -> v1.std.core, which is what lets CallTargetIdentity carry the declaration a runtime target was projected from. infer_sigs imports v1.std.core, so the type could not stay put without a cycle. Four enumerated rows, one per binding site; the two membership deltas auto-admit as ExplicitlyEvaluatedZeroDelta. Dissolve-on: this PR merging, by the same trigger the three prior shrinks record. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…er than the corpus The row FAILED while the mechanism was green. The probe used the qualified spelling without importing v2.std.collection, which resolves against the real 4261-module corpus but not against compile_dag_rust_emit_check's 2973-module witness pool. Measured both ways: emitted against the corpus the same probe produces crate::v2_std_collection::map_get(m.clone(), "key".to_string()), exactly what the row asserts. The import restores module presence and does not answer the call -- decl_name comes from the authored spelling at the call site regardless of imports -- so the negative assertion still discriminates. Falsifier 2 is what proves that rather than argues it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…n it never had Before the class-B change, xs |> is_empty emitted v1_rt::is_empty, a symbol the seed does not define: 5 x E0425. After it, the same 5 sites became typed refusals -- correct in kind, still 5 errors. The class-B repair made the gap visible; it did not close it. is_empty is an algebra template over FreeMonoid whose Rust realization is Vec::is_empty, exactly as count's is Vec::len, so the fix is one row in rust_simple_method_specs beside count. Nothing in 05_emit_rust learns a new name: realization is a target fact and lives in the target's registry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…s B survived one layer up The requested is_empty negative control found a live hole rather than confirming a safe one. Both rust_method_templates lookups are keyed on the bare method spelling with no receiver check, so a fn-typed record field named is_empty was captured by the target template and emitted as recv.is_empty() instead of (recv.is_empty)(..). The class-B repair fixed the algebra FALLBACK and left the two tables sitting in front of it. The hole is not new and is not specific to is_empty: count, first, join, split, take, skip, last, chars and enumerate have carried it for as long as they have had templates. Adding is_empty made it urgent by putting the spelling most likely to name a predicate field in front of that table. One helper, consulted at the top of both arms before every name-keyed special case, so the two cannot drift. Two controls: the new spelling and a pre-existing one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
v1.compiler.infer_sigs used to DECLARE DeclaredCallableIdentity, so its own two construction sites resolved locally and produced no delta. Now that the declaration lives in v1.std.core and infer_sigs imports it, those sites rebind exactly like the consumers in infer_lookup. An enumeration error on my part, not a second transition: same subject, same trigger, same dissolve. Floor is now green on this branch (passed=2754 failed=0) -- the OrderFreeResult traversal facts closed all nine determinism rows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
# Conflicts: # src/v1/stage0/src/v1_compiler_emit_rust.rs # src/v1/stage0/src/v1_compiler_infer.rs
…domain, not the receiver's: 202 refusals on the first compile of the converged seed rust_receiver_has_callable_method_field asked rust_record_field_needs_fn_rc, which sweeps rust_struct_field_lookup_candidates -- and that list deliberately widens a receiver's name to its container template algebra. An algebra declares its operations as arrow-typed members, so under that widening every Map receiver "has a callable field" named map_keys, map_values, lookup or get, and the tier captured the very bridge calls it sits in front of. Measured at the first compile of the round-3 converged mirror: 202 rustc refusals, one class -- 164 E0609 (no field `map_keys` on Rc<im::HashMap<String, Rc<ItemInfo>>> and friends), 48 E0282, 4 E0615 on `get`. It is the same defect the tier was built to close, one level up: a name-keyed lookup consuming an identity domain that is not its own. The predicate now consults only the receiver's own declared record. w_map_receiver_operation_is_not_read_as_a_callable_field is the discriminating red: restore the candidate sweep and its must_not_contain clause fires. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
… point at round 3, six paths, each explained by an authority change Convergence transaction on srv1 (/tmp/xl0c.sh -> /tmp/xl0g.log), on 952ffa6 = main b726547 merged with the branch. Criterion is BYTE equality (sha256 over the whole candidate tree vs the whole installed tree), never first_generation_equal and never the changed-path list; the full workspace is rebuilt inside every round so a non-compiling mirror stops the line. round 1 cand e212fe74 inst 6f55cf3e installed, compiles round 2 cand 932b0543 inst e212fe74 drift = v1_rt.rs only (the two-hop: v1_rt.rs is rendered by the previously compiled rt_hash_ops) round 3 cand 932b0543 inst 932b0543 BYTE FIXED POINT -- produced by a compiler rebuilt from the round-2 installed tree Changed paths and their authority: extdeps_languages_rust_emit.rs <- rt_function_registry / rust_simple_method_specs rows std_primitive_projection.rs <- symbol_lexeme / symbol_intern_lexeme roster rows v1_compiler_emit_rust.rs <- 05_emit_rust.dag (seam wall, callable-field tier, class B/C) v1_compiler_infer.rs <- 04_infer.dag projected_from on RuntimePrimitiveCall v1_compiler_runtime_rust.rs <- runtime_rust.dag symbol bridges v1_rt.rs <- same, one hop later On these bytes: function_value_named_application_controls_witness PASSES (the d805243 / 952ffa6 rust-unit-tests red was the merge-driver-refused stale v1_compiler_infer.rs, not a semantic regression); emit 175 files; cargo check 15 errors: 9 E0425 (filesystem 2, V 2, K 2, Determinism 2, T 1), 2 E0728, 2 E0107, 1 E0391, 1 UNRESOLVED_CompilerError. No hand edit to any generated file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…a4e965ddb built from the committed mirror): v1_compiler_emit_rust.rs regenerated; candidate patch sha 05ce734c52890571
… installed ce959e40604ffdd5): std_algebra.rs, std_nat.rs -- arrow returns now render through the Rust renderer (Rc<Vec<K>> for List<K>, Nat preserved); candidate patch sha b5b409aeebbeb6c4
…fect shapes: the unconditioned route emitted 2790 refusals where 15 stood; fix the arrow probe's variant spelling
…bda's admission; F: a qualified type reference earns its use-line from the qualifier under export proof; both earlier cuts were measured non-events and are deleted
…at round 3, three paths, each explained by an authority change srv1 (/tmp/xl0e.sh -> /tmp/xl0j.log), criterion = every regen-population file byte-equal to installed; full workspace rebuilt as the gate each round. round 1 gunbc=1dc61ba198c6750b from installed 0479b0df9fc5598e -> v1_compiler_emit_rust.rs round 2 gunbc=909aa212f353bd03 from installed 8ebedc7445fadbaa -> std_algebra.rs, v1_compiler_trait_derive_emit.rs round 3 gunbc=0d0cd70ec5b20db9 from installed 8713cb43f8ad848c -> <none> BYTE FIXED POINT v1_compiler_emit_rust.rs <- 05_emit_rust.dag (gated arrow position, init turbofish admission, qualified-type use-lines) std_algebra.rs <- the gated arrow route restores the pre-e9900e2 spelling of the two arrow-typed fields v1_compiler_trait_derive_emit.rs <- one use-line synthesized for a qualified std.types.List reference under export proof Final installed tree 8713cb43f8ad848c. No hand edit to any generated file. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…e variant arm; the qualified route synthesizes use-lines only for types the emitted source names Four regressions the 0773184 fixed point put on the closure, each with its discriminating row: - E0603 x16: the qualified-type route synthesized `pub use crate::v2_std_nat::Succ;` for every `v2.std.nat.Succ { prev: .. }` record literal. A qualified name reaches the surface walk in the same dotted spelling whether it is a type or a variant head; the route now asks the registry whether the leaf is a TYPE declared in the named qualifier, records each decision as a census row, and considers only leaves the emitted source actually names (it had also synthesized an unused `DeclarationRef` import from a variant payload). w_qualified_variant_head_earns_no_type_use_line. - `Outcome<compile_error!("UNRESOLVED_CompilerError")>` x3 and `Rc<Medium>` E0107: two cuts had each introduced a second per-position renderer for arrow types beside the one fn parameters use. An arrow's return is not a different kind of type from its parameter: both positions now render through render_rust_fn_sig_type, and render_rust_type_with_applied_binding -- which rebuilt its EmitGraphInfo with an empty generic scope, so a fn-scope `C` rendered `_` (E0121) -- carries the fn's generic names through that hop. The measured gate over the second renderer is deleted. w_generic_arrow_return_renders_the_fn_scope_generic; w_arrow_return_type_keeps_its_applied_binding (its fixture was an invalid program: Accepted lacked `diagnostics`). - v2.std.determinism E0425 x2: traced to the bare-name disposition, not the qualified route -- `Determinism` is a type in std.determinism and a variant of v2.lens.registry LensIdV0, and is_known_variant is corpus-wide by spelling, so a TYPE-position reference was delegated to an enum it never named. A name in one of the module's type positions never takes the variant arm. a_known_variant_spelling_in_a_type_position_takes_the_registry_arm (red by construction on the old arm); the harness row is a positive control and says so, because the witness harness refuses any pool carrying the colliding variant with NoSuchVariable. Verified on a test binary built from the self-emitted emitter (not a regeneration): witnesses 23/24 -> 24/24 after the harness row was reshaped; closure instrument 2799 -> 2779. The regeneration that binds these to the mirror follows as its own commit after the freeze merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
… at that sha per the READY rule Conflicts: 16 stage0 mirrors taken ours (regen fixes forward); namespace_wave_admission.rs taken theirs (their rostered TransitionAdmission row, dissolve-on = #9719 merging); 04_infer.dag imports unioned and ExprBinOp keeps BOTH E's eq_wall_diags and N's operand field; 05_emit_rust coercion import unioned. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
…k -- a declared stall with its row-family trigger; the unavailable-identity prose no longer describes the deleted widen Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
# Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
…NAMED declaration that would not resolve -- an unnamed synthesized type node (a field access, a generic match-arm binder) is host by construction; this lane's own refusal had reddened v2.compiler.02_parse parse_current_position Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…bindings roster is inside the v2 self-compile closure and importing the ladder module from there refused the regen gate with five hard diagnostics Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…tall (fixed point round 2; 12/12 emitted-path, 27/27 interpreter rows) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…space_wave_admission.rs roster — union of prose, roster keeps XL-0N's live row (dissolve trigger = #9719 merging, not yet fired); main's side documents its own 31-row shrink with an empty roster. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
… review-57660 follow-through (connective stall hosted in gunbc.guarantee_rung_drop), UnnamedSynthesizedType operand arm (host by construction — no authored name is not a declaration reference), corrected identity-diff filter. Regen-owned mirror conflicts (std_operator_realization, v1_compiler_emit_rust) taken ours from the 1743f54 converged tree — regen fixes forward; namespace_wave_admission.rs conflict was a blank line. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
# Conflicts: # src/v1/stage0/src/emitted_population.rs # src/v1/stage0/src/lib.rs # src/v1/stage0/src/v1_compiler_compile.rs # src/v1/stage0/src/v1_compiler_emit_rust.rs
…ed sources (main 22ab698 bootstrap, fixed point round 2; 39/39 witness rows) -- main's change-denominated emit and this lane's elaborated-literal arm are both present because both were re-derived, not hand-bridged Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…e0 taken whole from main (R-4B adds executable-assembly/partition mirrors its hand required_regen_host.rs consumes; per-file picks cannot build); this branch's hand files restored on top — v1_interpreter.rs as the auto-MERGED content (main's delta + N's ExprElaboratedLiteral arms + the ByteSize BoundedTail arms), compile_clean.rs (E arms), namespace_wave_admission.rs (N's live row; its dissolve trigger, #9719 merging, has not fired). xl0b27 regenerates to the fixed point with the two-file bootstrap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU
# Conflicts: # src/v1/stage0/src/emitted_population.rs # src/v1/stage0/src/lib.rs # src/v1/stage0/src/v1_compiler_emit_rust.rs
binop_is_equality hand-matched the BinOp coproduct to answer a question no caller asked; binop_is_ordering wrapped ordering_test_for in a Bool and had no caller either. Both were this lane's additions (f38fdc9, db40481) with zero consumers corpus-wide, so they are redundant work by DESIGN section 2 and the substrate keeps one canonical typed query, ordering_test_for, which remains consumed at operator_realization_for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…row, prose leaves the data plane (review 57758) Three of the four findings, verified against the tree first: - src/v2/std/nat.dag carried a String data row of commentary. Converted to a module-scope // annotation on nat_max, which is the DESIGN section 4c quarantine boundary; the row predates this lane (#9238) but the file is this lane's to fix. - The same note narrated the two-Nat fork without scheduling its end. The fork is now gunbc.guarantee_rung_drop two_nat_authorities_stall, with ceiling StructurallyImpossible and a trigger naming the CAPABILITY (one Nat declaration with the other derived), not an artifact. This lane did not create the fork but made it load-bearing by giving the Peano side real operations. - OperatorRealizationRefusal typed its operator as String, a closed vocabulary flattened to text. Both variants now carry BinOp itself, producers pass the variant, and the single glyph spelling happens once at the message boundary. binop_label survives as that rendering fact with an annotation recording the corpus check: no BinOp-to-glyph producer exists elsewhere, so it is the first authority for the mapping rather than a second one. The rendered message text is unchanged, so the emitted-path witness pins the same bytes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
|
On review 57758 — three of the four findings are fixed in Fixed
Not changing:
— sent from loyal-raven-297 |
…in merge The generated-artifact merge driver refused three mirrors (emitted_population, lib.rs, v1_compiler_emit_rust) because both sides changed them since the merge base, leaving them unmerged with the ours bytes in the worktree. These are the projections of the MERGED authorities, produced by a regen round rather than by taking a side. Bootstrapped from main a6d6c68 laid across src/v1/stage0 AND every src/v1/stage0_* sibling crate -- the siblings reach into stage0/src by #[path], so a stage0-only lay dangles this lane's new mirrors (rustc said so directly: couldn't read .../std_literal_elaboration.rs at stage0_std_core/src/lib.rs:130). main_wet first so the generated partition .dag reflects the merged authorities, --emit-partition-crates --write after each install, and five rounds each rebuilding the seed from the installed tree and re-verifying: first_generation_equal=true 148/148 every time. Both sides survive in lib.rs, which is the check the driver refusal exists to force: main's gunbc_stage0_executable_assembly_generated (the E0432 that made all five jobs red) and this lane's std_operator_realization are both declared. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
|
Closing: superseded by #9710, which merged this lane's substance to main ( Measured rather than assumed — a two-dot diff against the new main, since three-dot overstated (this branch's merge-base is old). What main lacked was exactly the review findings raised here after the One row from here was deliberately dropped rather than carried: — sent from loyal-raven-297 |
…tches in peano_nat_structural_realization_test over the re-added UnicodeScalarSequenceUnfold variant (both witnesses PASS scoped), and retire the XL-0N #9719 wave-admission row by its own dissolve-on trigger (base and head both carry the relocation; the run on bc74b2e reported it stale) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC
…is branch stops carrying it The previous merge kept XL-0N's admission alongside the five BootArtifact rows because both were live and each dissolves with its own PR. #9719 has now merged, so main's seventh dissolution removed that row by its own trigger -- base and head both carry the relocation and no run can produce its delta. Keeping it here would have been exactly what the roster's rule forbids: a stale row that refuses every unrelated PR in the repository. Main's ledger prose is taken whole, including the dissolution note, since the roster's history is the reason each shrink is removable. The five BootArtifact rows remain, still dissolving when this PR merges.
The row admitted one TargetChanged binding for relocating type_reference_declaration_ref to v1.compiler.infer_env, with DISSOLVE-ON: this pull request merging. #9710 carried that relocation to main (#9719 itself closed as superseded), so base and head both have it and no run can produce the delta. gunbc#9794's witnesses lane reported it exactly as the row predicted: namespace-wave-admission STALE ADMISSION type_reference_declaration_ref relocated to v1.compiler.infer_env (XL-0N, gunbc#9719) ... matches no delta in this run FAILED PHASE namespace-wave-admission (0 unadjudicated delta(s), 1 stale admission(s)) Removed by its own stated trigger, which is also why it could not be left: a stale row here refuses every unrelated PR against main, so this was blocking more than this branch. The floor itself was clean in that run (verdict=FloorClean unexpected_failures=0); this phase was the only failure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y
…a stall row, prose leaves the data plane (#9794) * XL-0N residue: refusals carry the BinOp coproduct, the Nat fork gets a stall row, prose leaves the data plane The review findings on #9719 (reviews 57754, 57758) that did not travel with #9710. Rebuilt against main rather than landed from the stale branch, and re-verified against main rather than assumed: - dag/std/operator_realization.dag binop_is_ordering had no consumer corpus-wide (its sibling binop_is_equality is already absent from main). Deleted. - OperatorRealizationRefusal typed its operator as String -- a closed vocabulary flattened to text. Both variants now carry BinOp itself, all nine producers pass the variant, and the spelling happens once at the message boundary. binop_label stays as that rendering fact, annotated with the corpus check that no other BinOp-to-glyph producer exists (v1's compile.dag renders the variant NAME; glyph recognition is in the tokenizer against token kinds). Rendered message text is unchanged. - src/v2/std/nat.dag carried commentary as a String data row; converted to a module-scope // annotation on nat_max, the section 4c quarantine boundary. - The two-Nat fork it narrated is now gunbc.guarantee_rung_drop two_nat_authorities_stall: ceiling StructurallyImpossible, trigger naming the capability (one Nat declaration with the other derived), bounded population. Verified still true on main: dag/std/nat.dag declares Nat as CommutativeSemiring<Magnitude> and src/v2/std/nat.dag declares the Peano coproduct, with nat_max in both. NOT carried: the structural_connective_stall row from the old branch. Main already declares StructuralConnectiveBinding and routes And/Or through structural_connective_realization -- that IS the capability the row named as its next-rung trigger, so main retiring it is correct and re-adding it would declare a stall its own trigger has dissolved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N residue: regenerated std_operator_realization mirror The projection of the .dag change in the parent commit. Produced by a regen round bootstrapped from this branch's own committed seed (main's stage0, which compiles), installed by the generated-header discriminator rather than by a byte comparison against a third tree, and gated: both rounds rebuilt the seed from the installed tree and re-verified at first_generation_equal=true 148/148, followed by a whole-package build of exactly these bytes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: retire the stale namespace admission row -- its trigger fired The row admitted one TargetChanged binding for relocating type_reference_declaration_ref to v1.compiler.infer_env, with DISSOLVE-ON: this pull request merging. #9710 carried that relocation to main (#9719 itself closed as superseded), so base and head both have it and no run can produce the delta. gunbc#9794's witnesses lane reported it exactly as the row predicted: namespace-wave-admission STALE ADMISSION type_reference_declaration_ref relocated to v1.compiler.infer_env (XL-0N, gunbc#9719) ... matches no delta in this run FAILED PHASE namespace-wave-admission (0 unadjudicated delta(s), 1 stale admission(s)) Removed by its own stated trigger, which is also why it could not be left: a stale row here refuses every unrelated PR against main, so this was blocking more than this branch. The floor itself was clean in that run (verdict=FloorClean unexpected_failures=0); this phase was the only failure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: the Nat fork is ClimbableButUnbuilt, not awaiting a ruling (review 57807) The row classified the two-Nat fork as AwaitsOneGrounding, whose grounding sentence claimed the modeling direction was still undecided. Checked against the authority the review cited and the review is correct: gunbc.plans.dag_v2_defork_audit records the nat census complete with the per-concept design DESIGN READY and its prerequisites discharged (algebra FreeMonoid shadow #6341 merged, generic-alias coproduct keystone green), and it specifies the cutover file by file -- dag/std/nat.dag takes the coproduct and the Peano ops with the semiring alias deleted, v2.std.nat becomes a thin reimport plus the node-bound law roster, integer and float repoint GroupCompletion<Nat> to std.nat.Nat, every importer in the same push. So the direction is decided and the work is scheduled: the blocker is ClimbableButUnbuilt and the trigger now names that atomic wave rather than a ruling nobody owes. Calling it a grounding question converted actionable work into an indefinite decision stall -- the untracked stall DESIGN section 4b forbids -- and diluted the canonical plan by implying the question was open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: the Nat stall's population is UncountedNotEnumerable, not falsely bounded (review 57881) The row declared BoundedPopulation while its second member was the open-ended category "every reference site" rather than an enumerated identity -- bounded in appearance only, which is what the carrier's second variant exists to prevent. Checked whether the half could instead be enumerated, and the attempt is what settles it: the property is about a module's CLOSURE, not its import list, and closure membership is transitive -- a module importing one neighbour that reaches std.nat and another that reaches v2.std.nat has both while importing neither. A direct-import scan finds four dual-importing files and is therefore not that set. Rendering those four as a bounded list would have read as bounded while measuring the wrong property: an enumeration that is false the moment it is written. So the carrier is UncountedNotEnumerable, and the reason keeps the enumerable declaration half (the two declarations and the four forked operations) inside it, states why the exposure half is not enumerable, and records that the population is bounded in principle by the corpus and goes to zero with the trigger. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y --------- Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…-Unicode-scalar inhabitance carried into emission, text/list op realization by operand representation, no RustStdString row (#9720) * Emitted v2 compiler crate: a declaration's identity is its last segment, and a primitive with no realization refuses instead of inventing one Two roots behind 175 of the 260 rustc errors on the emitted v2 compiler closure (issue #9664, milestones 1 and 2): - 102 x E0425: the four DeclaredCallableIdentity constructions in v1.compiler.infer_lookup took decl_name from the AUTHORED spelling, so a qualified call carried the whole dotted path as the declaration name and emission rendered crate::v2_std_grammar::v2.std.grammar.f(..). - 73 x E0425: v2.std.algebra length is a ModeledProjection of the `length` primitive and rt_function_registry has no `length` row, so emission took rust_runtime_bridge_name's identity arm and wrote v1_rt::length -- a symbol the seed does not define. A primitive's identity and its per-target realization are two facts; CallTargetIdentity carried only the first, so every emitter had to ASSUME a bridge exists. RuntimePrimitiveCall now carries projected_from, the declaration the roster projected it from, and emit_rust routes to the bridge only when its own registry holds the primitive, falls back to the declaration otherwise, and refuses when neither exists. DeclaredCallableIdentity moves to v1.std.core so the target type can carry it without forking the pair. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Class B: the algebra method fallback asserted a v1_rt bridge it had not checked tier0 method resolution resolves an ordinary fn-typed RECORD FIELD through lookup_field_in_product, so `algebra.step(..)` arrives as AlgebraMethodSemantics carrying the field node as its method_def. The fallback at the end of that arm hardcoded runtime_bridge: true, which emitted `v1_rt::step` -- and made emit_rust_generic_method_call's own callable-field arm, guarded on runtime_bridge == false, unreachable for the exact receiver it was written for. 65 E0425s on the emitted v2 compiler closure (member, apply, is_empty, step, init, allocate_literal, ...) were that one literal. It now passes the realization question keyed on the same registry as the plain-call seam, so a real bridge method still lowers to a bridge, a callable field lowers as a field, and a name that is neither reaches the existing loud refusal rather than a fabricated symbol. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Only ModeledProjection carries projected_from: a HostRealizedSeam body is a self-call, so falling back to it would emit a nonterminating function The declaration fallback is sound only where the declaration's body is real code. HostRealizedSeam means the body IS a self-call, so emitting it compiles and then loops forever -- silent wrongness, strictly worse than the unresolved symbol it would have replaced. A seam whose target has no realization has no honest lowering, so it carries nothing and reaches emission's refusal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * M1: realize the two symbol bridges, which were host seams nothing declared to be host seams v2.std.compilers.lexing symbol_lexeme and symbol_intern_lexeme have self-call bodies -- the HostRealizedSeam shape exactly -- and the interpreter has carried real arms for both (v4_bridge.symbol_lexeme, v4_bridge.symbol_intern_lexeme). With no projection roster row the resolver saw ordinary declarations, so Rust emission emitted the declaration, and pub fn symbol_lexeme(sym: String) -> String { symbol_lexeme(sym) } COMPILES. The emitted closure carried two functions that type-check, pass every gate we own, and diverge from the interpreter by not terminating. Unlike the sibling seams (decl_facts and friends, which at least refuse loudly as unresolved v1_rt symbols) nothing anywhere reported this one -- it is absent from the E0425 census precisely because it is silent. extdeps.languages.rust.types already declares Symbol's target type as String, so on this target both bridges are the identity. That is a realization of the declared row, not a second opinion about it. Residue named, not closed: a self-call body is a DECIDABLE structural marker of a host seam, so the compiler could refuse an unrealized one rather than emit it. It does not yet; that check is the class's next-rung trigger. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Regenerate the stage0 mirror for the emitter repairs (fixed point at round 2) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * test.claim fixtures: one discriminating RED per closed emission class, with boundary controls Six rows over the three emitter defects plus the two symbol bridges. Each class's positive and negative assertion differ only in the fact the repair added, so no single edit satisfies both directions, and each repair carries a boundary control that would go red had it over-reached the other way (empty_map for the registry gate, a registered bridge method for the class-B gate). The symbol-bridge row is deliberately not an error-count assertion: that class COMPILED throughout the defect and diverged by not terminating, so a row asserting 'no error' would have been green the whole time. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Fix the class-B boundary control: count has a method template, so it never reaches the seam under repair count is answered by rust_simple_method_specs before the algebra fallback, so the row would have gone red while executing none of the code the repair touched. trim is in rt_function_registry and has no template, so it is one of the few names that actually reaches that fallback. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Unbreak the fixture parse: a trailing semicolon on the note declaration The module index refused the file outright, so none of the six witnesses were discovered. .dag item declarations carry no terminator. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * The self-call seam wall: an unrealized host seam refuses instead of emitting compiling recursion A whole-body self-call is the decidable structural marker of a host seam. In the interpreter the shape is safe -- reaching it recurses to the evaluation-budget refusal -- but emitted to Rust the same shape COMPILES and returns to no caller. Nothing reported it: not the module index, not the compile-clean gate, not cargo check. That is why the two symbol bridges were invisible until someone read the emitted bytes. emit_fn_def now asks the realization registry -- the same authority the call sites ask, so the two cannot drift -- and suppresses the declaration when the seam is realized, refuses with a located message when it is not. Suppression rather than delegation is deliberate: a forwarding body would make this seam reconstruct signatures in target types, which is the cementing the existing suppressed-seam precedent avoids, and a realized primitive's calls all route to the bridge anyway. The predicate is whole-body identity, not 'contains a self-call'. Ordinary recursion has a match, an if or a let between the head and the call, so it never matches; expr_has_self_call walks children and would have refused most of the compiler. Both directions carry a fixture. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * The seam wall must resolve realization through the roster's primitive, not the declaration name Measured, not predicted: the wall refused six seams in the emitted closure and one of them -- v2.std.collection empty_map_primitive_delegate -- is realized. Its roster row names the empty_map primitive, whose bridge is rc_empty_map, but rt_function_registry holds 'empty_map' and the wall looked up 'empty_map_primitive_delegate'. A declaration's name and the primitive it realizes are two facts; the roster is the authority that joins them, and the declaration name is only the fallback for a seam nobody has rostered. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * The seam wall's realized arm must not suppress the declaration: suppression created 10 dangling imports Measured on the emitted closure with the wall finally in the mirror: removing a realized seam's item left 10 unresolved imports (E0432) for symbol_lexeme, symbol_intern_lexeme and resolve_type_node. Other modules import these declarations; the suppression created that breakage rather than finding it. And the reasoning that made suppression look safe is what makes it unnecessary. A realized seam's body IS a call to itself, and resolution already routes that call through the roster to the bridge -- so ordinary emission writes v1_rt::symbol_lexeme(sym) as the body without help. The wall's whole job is the UNREALIZED arm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * The seam refusal is a generated body, not a crate-wide compile_error!: rustc's denominator is larger than the demand denominator compile_error! fails the WHOLE crate, and that form silently assumes every seam it refuses is one somebody calls. It is not. rustc type-checks the entire emitted crate including declarations imported but never invoked, so the refusal denominator is strictly larger than the entry-reachable execution closure -- five unreachable seams took the crate down. The refusal is now a panic body with the declaration's real signature: dependent modules resolve, the crate compiles, and only an actual invocation fails loudly. That moves the refusal from the crate to the one declaration that earned it, and leaves reachability to a separate instrument. An entry-rooted pruner can replace the body later without revisiting this. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Two obligations the required floor found, both real consequences of this change DETERMINISM DENOMINATOR (9 reach_witness rows red, including determinism_denominator_is_closed_on_declared_primitives, whose entire job is to notice this). v2.lens.determinism closes its denominator over primitive_declared_definitions, so adding two canonical names without traversal facts made the closure false. Both bridges are scalar -- symbol_lexeme maps one Symbol to its text and symbol_intern_lexeme is its inverse -- so there is no collection to walk and OrderFreeResult is the honest arm. HostUnspecifiedOrder would claim a real traversal whose order the host does not pin, fabricating a leak the primitive cannot have. NAMESPACE WAVE ADMISSION (6 unadjudicated deltas). Four are TargetChanged for DeclaredCallableIdentity moving v1.compiler.infer_sigs -> v1.std.core, which is what lets CallTargetIdentity carry the declaration a runtime target was projected from. infer_sigs imports v1.std.core, so the type could not stay put without a cycle. Four enumerated rows, one per binding site; the two membership deltas auto-admit as ExplicitlyEvaluatedZeroDelta. Dissolve-on: this PR merging, by the same trigger the three prior shrinks record. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Class-C fixture was broken, not the repair: the witness pool is smaller than the corpus The row FAILED while the mechanism was green. The probe used the qualified spelling without importing v2.std.collection, which resolves against the real 4261-module corpus but not against compile_dag_rust_emit_check's 2973-module witness pool. Measured both ways: emitted against the corpus the same probe produces crate::v2_std_collection::map_get(m.clone(), "key".to_string()), exactly what the row asserts. The import restores module presence and does not answer the call -- decl_name comes from the authored spelling at the call site regardless of imports -- so the negative assertion still discriminates. Falsifier 2 is what proves that rather than argues it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * is_empty: a conversion is not a repair -- give it the Rust realization it never had Before the class-B change, xs |> is_empty emitted v1_rt::is_empty, a symbol the seed does not define: 5 x E0425. After it, the same 5 sites became typed refusals -- correct in kind, still 5 errors. The class-B repair made the gap visible; it did not close it. is_empty is an algebra template over FreeMonoid whose Rust realization is Vec::is_empty, exactly as count's is Vec::len, so the fix is one row in rust_simple_method_specs beside count. Nothing in 05_emit_rust learns a new name: realization is a target fact and lives in the target's registry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * A receiver's own callable field outranks every name-keyed table: class B survived one layer up The requested is_empty negative control found a live hole rather than confirming a safe one. Both rust_method_templates lookups are keyed on the bare method spelling with no receiver check, so a fn-typed record field named is_empty was captured by the target template and emitted as recv.is_empty() instead of (recv.is_empty)(..). The class-B repair fixed the algebra FALLBACK and left the two tables sitting in front of it. The hole is not new and is not specific to is_empty: count, first, join, split, take, skip, last, chars and enumerate have carried it for as long as they have had templates. Adding is_empty made it urgent by putting the spelling most likely to name a predicate field in front of that table. One helper, consulted at the top of both arms before every name-keyed special case, so the two cannot drift. Two controls: the new spelling and a pre-existing one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Two more wave admissions: the declaring module rebinds too v1.compiler.infer_sigs used to DECLARE DeclaredCallableIdentity, so its own two construction sites resolved locally and produced no delta. Now that the declaration lives in v1.std.core and infer_sigs imports it, those sites rebind exactly like the consumers in infer_lookup. An enumeration error on my part, not a second transition: same subject, same trigger, same dissolve. Floor is now green on this branch (passed=2754 failed=0) -- the OrderFreeResult traversal facts closed all nine determinism rows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * The callable-field tier was consuming the algebra profile's identity domain, not the receiver's: 202 refusals on the first compile of the converged seed rust_receiver_has_callable_method_field asked rust_record_field_needs_fn_rc, which sweeps rust_struct_field_lookup_candidates -- and that list deliberately widens a receiver's name to its container template algebra. An algebra declares its operations as arrow-typed members, so under that widening every Map receiver "has a callable field" named map_keys, map_values, lookup or get, and the tier captured the very bridge calls it sits in front of. Measured at the first compile of the round-3 converged mirror: 202 rustc refusals, one class -- 164 E0609 (no field `map_keys` on Rc<im::HashMap<String, Rc<ItemInfo>>> and friends), 48 E0282, 4 E0615 on `get`. It is the same defect the tier was built to close, one level up: a name-keyed lookup consuming an identity domain that is not its own. The predicate now consults only the receiver's own declared record. w_map_receiver_operation_is_not_read_as_a_callable_field is the discriminating red: restore the candidate sweep and its must_not_contain clause fires. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Regenerate the stage0 mirror at the merge-equivalent tree: byte fixed point at round 3, six paths, each explained by an authority change Convergence transaction on srv1 (/tmp/xl0c.sh -> /tmp/xl0g.log), on 952ffa6 = main b726547 merged with the branch. Criterion is BYTE equality (sha256 over the whole candidate tree vs the whole installed tree), never first_generation_equal and never the changed-path list; the full workspace is rebuilt inside every round so a non-compiling mirror stops the line. round 1 cand e212fe74 inst 6f55cf3e installed, compiles round 2 cand 932b0543 inst e212fe74 drift = v1_rt.rs only (the two-hop: v1_rt.rs is rendered by the previously compiled rt_hash_ops) round 3 cand 932b0543 inst 932b0543 BYTE FIXED POINT -- produced by a compiler rebuilt from the round-2 installed tree Changed paths and their authority: extdeps_languages_rust_emit.rs <- rt_function_registry / rust_simple_method_specs rows std_primitive_projection.rs <- symbol_lexeme / symbol_intern_lexeme roster rows v1_compiler_emit_rust.rs <- 05_emit_rust.dag (seam wall, callable-field tier, class B/C) v1_compiler_infer.rs <- 04_infer.dag projected_from on RuntimePrimitiveCall v1_compiler_runtime_rust.rs <- runtime_rust.dag symbol bridges v1_rt.rs <- same, one hop later On these bytes: function_value_named_application_controls_witness PASSES (the d805243 / 952ffa6 rust-unit-tests red was the merge-driver-refused stale v1_compiler_infer.rs, not a semantic regression); emit 175 files; cargo check 15 errors: 9 E0425 (filesystem 2, V 2, K 2, Determinism 2, T 1), 2 E0728, 2 E0107, 1 E0391, 1 UNRESOLVED_CompilerError. No hand edit to any generated file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * WIP tail classes * WIP: if-equals-variant parses as a record literal; name the predicate * WIP: annotations at module-item grain * Regen round 1 (BuildBuddy invocation ebbdffc5, compiler gunbc=9830014a4e965ddb built from the committed mirror): v1_compiler_emit_rust.rs regenerated; candidate patch sha 05ce734c52890571 * Regen round 2 (BuildBuddy, compiler gunbc=75d74698aebcdb6e built from installed ce959e40604ffdd5): std_algebra.rs, std_nat.rs -- arrow returns now render through the Rust renderer (Rc<Vec<K>> for List<K>, Nat preserved); candidate patch sha b5b409aeebbeb6c4 * Arrow positions deviate from the generic renderer only for the two defect shapes: the unconditioned route emitted 2790 refusals where 15 stood; fix the arrow probe's variant spelling * B: the init turbofish declines a declaration's own formals by the lambda's admission; F: a qualified type reference earns its use-line from the qualifier under export proof; both earlier cuts were measured non-events and are deleted * Regenerate the stage0 mirror at the 0773184 freeze: byte fixed point at round 3, three paths, each explained by an authority change srv1 (/tmp/xl0e.sh -> /tmp/xl0j.log), criterion = every regen-population file byte-equal to installed; full workspace rebuilt as the gate each round. round 1 gunbc=1dc61ba198c6750b from installed 0479b0df9fc5598e -> v1_compiler_emit_rust.rs round 2 gunbc=909aa212f353bd03 from installed 8ebedc7445fadbaa -> std_algebra.rs, v1_compiler_trait_derive_emit.rs round 3 gunbc=0d0cd70ec5b20db9 from installed 8713cb43f8ad848c -> <none> BYTE FIXED POINT v1_compiler_emit_rust.rs <- 05_emit_rust.dag (gated arrow position, init turbofish admission, qualified-type use-lines) std_algebra.rs <- the gated arrow route restores the pre-e9900e2 spelling of the two arrow-typed fields v1_compiler_trait_derive_emit.rs <- one use-line synthesized for a qualified std.types.List reference under export proof Final installed tree 8713cb43f8ad848c. No hand edit to any generated file. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * One renderer for every arrow position; a type position never takes the variant arm; the qualified route synthesizes use-lines only for types the emitted source names Four regressions the 0773184 fixed point put on the closure, each with its discriminating row: - E0603 x16: the qualified-type route synthesized `pub use crate::v2_std_nat::Succ;` for every `v2.std.nat.Succ { prev: .. }` record literal. A qualified name reaches the surface walk in the same dotted spelling whether it is a type or a variant head; the route now asks the registry whether the leaf is a TYPE declared in the named qualifier, records each decision as a census row, and considers only leaves the emitted source actually names (it had also synthesized an unused `DeclarationRef` import from a variant payload). w_qualified_variant_head_earns_no_type_use_line. - `Outcome<compile_error!("UNRESOLVED_CompilerError")>` x3 and `Rc<Medium>` E0107: two cuts had each introduced a second per-position renderer for arrow types beside the one fn parameters use. An arrow's return is not a different kind of type from its parameter: both positions now render through render_rust_fn_sig_type, and render_rust_type_with_applied_binding -- which rebuilt its EmitGraphInfo with an empty generic scope, so a fn-scope `C` rendered `_` (E0121) -- carries the fn's generic names through that hop. The measured gate over the second renderer is deleted. w_generic_arrow_return_renders_the_fn_scope_generic; w_arrow_return_type_keeps_its_applied_binding (its fixture was an invalid program: Accepted lacked `diagnostics`). - v2.std.determinism E0425 x2: traced to the bare-name disposition, not the qualified route -- `Determinism` is a type in std.determinism and a variant of v2.lens.registry LensIdV0, and is_known_variant is corpus-wide by spelling, so a TYPE-position reference was delegated to an enum it never named. A name in one of the module's type positions never takes the variant arm. a_known_variant_spelling_in_a_type_position_takes_the_registry_arm (red by construction on the old arm); the harness row is a positive control and says so, because the witness harness refuses any pool carrying the colliding variant with NoSuchVariable. Verified on a test binary built from the self-emitted emitter (not a regeneration): witnesses 23/24 -> 24/24 after the harness row was reshaped; closure instrument 2799 -> 2779. The regeneration that binds these to the mirror follows as its own commit after the freeze merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Regenerate the stage0 mirror at the 49482b0 freeze: byte fixed point at round 3, three paths, each explained by an authority change srv1 (/tmp/xl0e2.sh -> /tmp/xl0j2.log, launched 2026-08-29T19:52:56Z), criterion = every regen-population file byte-equal to installed; the full workspace rebuilt as the gate each round. round 1 gunbc=14967ca810cb6609 from installed db46176cc5cf5861 -> v1_compiler_emit_rust.rs, v1_tests_claim_reference_derived_disposition_census_witness_test.rs round 2 gunbc=5378a516528a6e0c from installed efa440bc86734f53 -> v1_compiler_trait_derive_emit.rs round 3 gunbc=974aafe864f743f6 from installed b1a0409ce9fc79d4 -> <none> BYTE FIXED POINT v1_compiler_emit_rust.rs <- 05_emit_rust.dag (arrow positions via the fn-signature renderer, generic scope through the applied-binding hop, type-position exemption, qualified rows with the registry type gate and token filter) v1_tests_claim_reference_derived_disposition_census_witness_test.rs <- its .dag (in_type_position at 5 callers + the type-position control) v1_compiler_trait_derive_emit.rs <- retracts the unused `pub use crate::std_types::List;` the earlier qualified route synthesized (token filter) Final installed tree b1a0409ce9fc79d4; merged tree 89c55a0e7e8d949047b5d92864dfc9fe306aebc0 at the freeze; main parent 5e80671. No hand edit to any generated file. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Witness fixture only: the qualified-type positive control moves to a provider the harness pool can carry Post-freeze, fixture-only (dag/test/claim is not a regen-population path; a no-drift regen run on this head is recorded in the PR). Two harness facts, both measured on the fixed-point artifact gunbc=974aafe864f743f6: a `{Determinism}` inside a .dag string literal is read as an interpolation of that name (the row failed in the interpreter before any compile ran), and the harness pool is the probe's DECLARED import closure, so a provider referenced only by a dotted name is absent -- and std.determinism cannot enter it because its own body references std.perturbation the same way. The row now uses std.decl_ref with a sibling import and says plainly that it is a positive control; the class's discriminating red stays at the disposition grain (a_known_variant_spelling_in_a_type_position_takes_the_registry_arm) and in the closure count. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * WIP XL-0B commit 1: thread DeclarationRef into the checkpoint-spelling callers; exact binding first; delete the redundant expression-position alias arm * Enroll the two emission batteries under the required-gate seed prefix (test.claim.self_host_*) * XL-0B commit 1: exact spelling at the fn-signature and declaration-type leaves; alias-rhs site reads scope.type_env * alias-rhs leaf site reads scope.type_env * Regenerate the stage0 mirror at the XL-0B commit-1 tree: byte fixed point at round 3 Cycle on srv1 over a1c9dde (authority tree bc2ae136138ac4aa), gate bins built each round: round 1: compiler e33c998203b59217 from installed df30d05facfa6307 -> drift v1_compiler_emit_rust.rs round 2: compiler ad9914da781db28d from installed c475b249666c3ba5 -> drift std_nat.rs, std_types.rs round 3: compiler c7ac6e91c1e07861 from installed be968e441d3a2a43 -> every regen-population file byte-equal CHANGED paths, each explained by the authority change: v1_compiler_emit_rust.rs (the threading); std_types.rs (Bytes/Secret/SecretValue declaration sites now spell the exact grounding std::vec::Vec<u8> / std::string::String); std_nat.rs (List<Nat> in container-argument position renders the closed alias's resolved numeric realization i64 -- type-identical to Nat = i64). Unit tests on the converged bytes: 552 passed, 0 failed, 140 ignored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * XL-0B commit 2 (source): declared callees imported over builtin capture; dead RebuildEmittedFail variant; Accepted diagnostics bound and threaded; WallNow carries its fields; evaluator binding-miss answers the PartialFunction codomain; Optional-nested variant qualified by its own enum; Clone for generics forwarded by a returned closure * Regenerate the stage0 mirror for commit 2 (mechanical residue): byte fixed point at round 2 Cycle on 8781269 (main parent d35cda54): round 1 drift on v1_compiler_emit_rust.rs and v1_compiler_trait_derive_emit.rs (the two files commit 2 edits), round 2 byte fixed point; installed tree 7fcf44b9f5c9df97, gunbc 2146d1f1844dea92. Unit 552/0. Emitted closure cargo check 420 -> 392; line-insensitive identity diff vs the merged-tree base: 28 removed, 0 added (E0061 x6 vocab arity, E0599 GlobalBare* x4, E0004 x7, E0533, E0271, E0618 x2, returned-closure Clone x7). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * A1: relocate the import-admission helpers to their consumer layer; C: one storage representation for Map at every position A1 (closure prune). Counting fully qualified code references as declared edges, the declared closure from v2.compiler.compile equals the emitted set: no module enters by bare-name binding. The carrier was 03_name_resolve importing v2.lens.reference_deps for admission_from_module_root / import_rows_from_parsed_module / collect_import_decl_nodes / ImportRowsState, consumed only by v2.workflow.compile_door_ledger and self_host.frontier_probe (both outside the closure, both already importing reference_deps). They now live in reference_deps; the two consumers import them there. Emitted closure drops 8 modules (lens.coverage, enforcement.{grammar_coverage,standing_intent,vocab}, registry, module_graph, reference_deps, std.decl_index) and all 6 host-primitive panic sites. C (Map). The six PartialFunction<..> positions (InferredTree.facts, EvaluationEnvironment.bindings, four signatures) are Map<..>; the four PartialFunction { lookup: .. } constructions are empty_map() or a first-wins map_insert fold; map_insert routes through a rostered map_insert_primitive_delegate (closure body deleted); slots.lookup -> map_lookup. Emitter: the alias RHS renders a keyed/element collection through the host template (type X = Map<A, B> -> Rc<HashMap<..>>), and a generic in map-key position carries std::cmp::Eq + std::hash::Hash from the signature. Two witness rows added. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * XL-0N: generic LiteralElaboration/OperatorRealization authority — typed literal-to-Zero/Succ homomorphism at every boundary, operator realization by exact operand structure, structural Peano Nat operations (no i64 row) * XL-0N: the Peano-Nat inhabitance witness asserts the ruled admission through its homomorphism; its expected-red row is retired by its trigger * XL-0T commit 1 (source): UnicodeScalarSequenceUnfold arm + text homomorphism row; scalar-sequence literal image as the canonical list introduction; identity wall on the spelling-compatibility fallback; delete the four host string-op body overrides and the inert host_string_text seam pair; structural-text witness battery Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * C corrected: InferredTree.facts stays the open PartialFunction; PartialFunction realizes as its algebra struct everywhere (HashMap rows deleted); frontier row dissolved; two TargetChanged admissions The CI floor on 4da6059 showed the facts retyping over-reached: about 120 test and fixture sites plus program.dag / 05_emit_orchestration define InferredTree.facts by a predicate closure, which is exactly what the open carrier is for. inferred_tree / 04_infer / program_partition are restored. The fork was the emitter realizing PartialFunction as HashMap in signature position and as the algebra struct in field position; the PartialFunction HashMap rows in extdeps.languages.rust (types.dag row, the partial_function template) are deleted so one representation stands. EvaluationEnvironment.bindings stays Map (built by map_insert); v2_effect_io_pure's empty environment is empty_map(). The v1 unresolved_method_frontier row for target_model lookup / Primitive(T) is deleted: the slots.lookup -> map_lookup rewrite dissolved its one occurrence. The two TargetChanged binding deltas for admission_from_module_root (frontier_probe, compile_door_ledger) are admitted by exact subject in namespace_wave_admission.rs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * XL-0N: operand realization hops alias/refinement declarations to their target (NonEmptyStr, Char, VersionIdentity compare/add as their host targets) * Regen round 1: install the stage0 candidate at the XL-0T commit-1 tree (BuildBuddy, old-compiler bootstrap round; three new mirrors: std_literal_elaboration, std_operator_realization, gunbc_structural_realization_bindings) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen round 1 fixup: restore the three hand-maintained ExprElaboratedLiteral interpreter arms the bootstrap revert had carried into the round-1 install Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regenerate the stage0 mirror for A1 + C (aa373f9): byte fixed point at round 3 Round 1 changed the five authority mirrors (extdeps_languages_rust_emit, extdeps_languages_rust_types, std_primitive_projection, v1_compiler_emit_rust, v1_compiler_infer), round 2 only compiler_tests.rs, round 3 byte-identical; installed tree f53efd0d0173a43e, gunbc 1a2d53dd15920cf1. Unit 552/0. Emitted closure cargo check 392 -> 278; line-insensitive identity diff vs commit 2: 112 removed, 0 added. Batteries on the converged binary: 29/29 (the two C rows red on the pre-fix compiler by fixture emit), 14/14, 20/20. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Regen round 2: extdeps_version_semver.rs and std_unicode_types.rs converge under the round-1 compiler Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: Bool row -- KernelBoolLiteral into v2.std.logic.Bool via BooleanUnfold (True/False); interpreter evaluates an elaborated literal as its kernel value; falsifier pair (row found/removed in the interpreter, constructor image vs host keyword on the emitted path) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Back out the round-2 convergence of extdeps_version_semver.rs / std_unicode_types.rs: the round-1 compiler's operator-realization wall refuses < on NonEmptyStr/VersionIdentity and + on Char despite the 657010b alias-hop, so the converged mirrors carry compile_error! and the lib does not build; XL-0N owns the hop Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: operand realization hops alias items by is_type_alias_item/resolved_type (the derive lane's own test) -- the structural condition on the declaration node never held, so NonEmptyStr/Char/VersionIdentity host ops were refused in the regenerated compiler Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen round: converge the union tree (semver/unicode mirrors regenerate under the alias-hop; elaboration authorities and emit/infer mirrors carry both lanes' arms) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Commit 3 of the #9664 closure: six emitter mechanisms, the null keyword by path, and map_insert back to its .dag body under the gate's ruling Emitter (src/v1/05_emit_rust.dag, trait_derive_emit.dag), each with a discriminating row in self_host_emitted_call_target_realization_witness_test (pre-fix bytes observed on the seed): - an argument into a parameter spelled Optional<T> is not unwrapped (the cardinality flag marks only the T? sugar; the applied spelling is asked too) - the shared-field accessor impl of a generic coproduct carries T: Clone - a Violates literal in a record field takes the field's Witness carrier before the fn return - a record pattern over a shared carrier derefs like a shared enum's variant pattern - a fn returning an arrow-field record carries 'static on its generics (same gate as impl Fn) - the fn-field record header prints well-formedness bounds asked per parameter instead of the bounded set minus the seed set (FalsificationReceipt<Subj, A> lost A behind ValueDiff<A: Clone>) - extdeps.languages.rust emit: the null keyword is std::option::Option::None, because a module declaring a nullary variant named None emits pub struct None; at module scope (std.cache_interface) v2.std.collection: map_insert is its .dag body again and map_insert_primitive_delegate with its primitive_projection row is deleted. The delegate tripped map_carrier_shape_gate on CI at c6d9b22 (record_shaped_map_reaches_map_insert BUDGET-REFUSED): the interpreter's free_call.map_insert arm answers Ok(None) for a non-native shape and the grounding falls through to the delegate's own body, a self-call -- the deferred-refusal class #8887 filed. The closing move is a host fact (a typed refusal in try_v2_std_collection_map_primitive_grounding) and is ledgered in the PR body, not landed here, by the manager's ruling. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Bootstrap ordering: back out the refusal-bearing semver/unicode mirrors once more — round 4's candidate was emitted by the pre-hop compiler; the hop-carrying emit_rust mirror is installed, so the next round regenerates them clean Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Hoist commit-3 rationale annotations to module-item grain (§4c refuses in-body // blocks; 17 regen refusals on 780b394) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * XL-0N: operand realization reads the RESOLVED structure -- a NoConnective childless leaf whose structural name is a kernel type is a host operand (the resolver collapses NonEmptyStr/Char/VersionIdentity to their primitive RHS under the alias identity, so no resolved node is ever an alias item); refusal temporarily carries the operand's shape facts for the regen diagnosis Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen: install the hop-3-bearing emit_rust mirror only; semver/unicode stay at pre-wall bytes until a hop-3 compiler emits them (bootstrap ordering) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Revert "Regen: install the hop-3-bearing emit_rust mirror only; semver/unicode stay at pre-wall bytes until a hop-3 compiler emits them (bootstrap ordering)" This reverts commit c83e528a108c8834e19a72976b611642033497ed. * XL-0N: shape-facts suffix spells Int counts with to_string (the seed runtime has no Int-as-String cast; the cast panicked the emitter under regen) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: operand realization hops a where-refinement wrapper to its base (is_where_refinement_type, the type renderer's own route) -- measured under regen: NonEmptyStr/Char/VersionIdentity operands resolve to the one-child Conj refinement node, not a leaf or an alias item Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: operator realization matches over BinOp are total (14 closed variants enumerated) -- no non-fold residue rows for the new module Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Commit 3 correction after the first regen: withdraw the Violates field-carrier arm (the literal resolves to the Witness declaration, spelling Witness::<Holds> at 87 sites), 'static on generics only for fn-field record returns (compose<A, B, C> stays bare), re-pin the optional and shared-record rows Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GXfYKNQTD3VfYyQcnJpxNU * Revert the identity wall in the corpus-wide compatibility relation: its first floor execution refused grounded-identity code (roadmap_page if-join, Ruling 3); the non-literal refusal is blocked on the peeling declared-boundary conformance capability and recorded as such Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Enroll std_literal_elaboration in the stage0 std-core partition roster (v2.workflow.rust_crate_partition): v1_std_core imports it, so the layered crate must own the module ahead of v1_std_core Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: retire the regen-diagnosis shape-facts suffix -- the where-refinement hop is confirmed at byte fixed point (6ba83b3 regen, round 2 equal) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * XL-0N: regenerated stage0 mirrors at byte fixed point (070a203 source, BuildBuddy regen round 3 first_generation_equal=true; partition crates rendered=14 written=0) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen: mirrors catch up with the wall revert (infer_types, emit_rust, lib, emitted_population); semver/unicode held at pre-wall bytes until the where-refinement hop merges Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: register std.literal_elaboration and std.operator_realization in the std-core partition and gunbc.structural_realization_bindings in the v1-infer binding unit (v2.workflow.rust_crate_partition), with their module-dag edges Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen: merged-tree round — emit_rust re-carries both lanes; std_nat/std_types/std_operator_realization converge; semver/unicode byte-equal to pre-wall under the where-refinement hop Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: type_reference_declaration_ref resolves an in-place (recursive) type reference through its env binding before matching the declaration span -- v2.std.nat.Nat is recursive and answered Absent, so its literal boundary and operand identity fell to the unavailable arms while v2.std.logic.Bool worked Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen: std_nat/std_types converge to the exact-grounding spellings (i64 container args, std::vec::Vec<u8>/std::string::String) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Rung drop: non-literal kernel-String refusal at the structural text boundary (text_boundary_identity_wall) Rosters the reverted identity wall as a DESIGN 4b(3) declared drop: previous rung (the wall as landed), temporary rung, the roadmap_page grounded-identity refusal that forced the revert, population, and a restoration trigger naming the declared-boundary conformance peeling capability with its sufficiency. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Projection regen: partition roster gains std_literal_elaboration; rung-drop roster projects text_boundary_identity_wall into DESIGN.md and design-ledgers Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Partition mirror + std-core crate carry std_literal_elaboration; rung-drop row per ruling (two-path standing, identity-census population, A/B trigger); planted non-literal restoration probe The roster edit only reaches the crate renderer through its compiled-in mirror (gunbc_stage0_crate_partition_generated.rs), so the sequence is projection -> regen -> rebuilt claim_executor -> emit-partition-crates, which wrote the std-core lib.rs row that clears the partition E0432. The rung-drop row is reworked to the ruling's grain: no rung claimed for the withdrawn wall, emitted-Rust path mechanically preventable vs source-acceptance path unguarded (never averaged), population bounded by identity with the wall re-applied as the named producer, and the two-direction A/B restoration trigger. The witness battery gains the planted non-literal probe asserting the present acceptance. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Projection: design-ledgers carries the reworked text_boundary_identity_wall row Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Total the two LiteralUnfolding producer matches in peano_nat_structural_realization_test over UnicodeScalarSequenceUnfold The floor refused at 216a7d4 on the two non-exhaustive matches once the new producer arm entered the coproduct. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: regenerated stage0 mirrors at byte fixed point on e51aff9 (BuildBuddy regen round 3 first_generation_equal=true; includes the merged #9710 commit-3 null-keyword-by-path drift and the new-module mirrors) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Bootstrap: reset stage0 mirror tree to origin/main's self-consistent set; the next regen round re-derives the session's authority changes Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0N: type_reference_declaration_ref falls back to the module-visible name binding when the reference carries no ident-keyed binding (the emitter's scope env) -- the found declaration is still span-matched against the global roster, so a by-name hit only confirms an exact declaration; measured: Peano literal rows passed while the operator rows still lost Nat's identity Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y * Regen round on the merged tree: re-derive session mirrors from main bootstrap (new std_literal_elaboration/std_operator_realization/structural_realization_bindings mirrors, partition std-core row) and restore the four hand-maintained ExprElaboratedLiteral interpreter arms Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Interpreter hand roster: EXPR_VARIANT_COUNT 23 with the ExprElaboratedLiteral arm restored Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Exact identity for a resolved alias destination: type_reference_declaration_ref falls back to the reference's env binding when the resolver's substitution carries the occurrence span The resolved-alias case (v2.std.text String = FreeMonoid<Char>) answered none from the census because the substituted node's ident_span is the annotation site, so every text.String literal boundary elaborated as DirectLiteral while the declared coproducts Bool and Nat worked. Second hop = the same env-binding read e51aff9 added for in-place recursive references; both hops answer by declaration span from the census, never by spelling. Also carries the partition std-core lib.rs write from the converged round. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Third identity hop: a resolver-qualified authored name joins the census by (module_path, name) Modules that reference a type with no import resolve it by the resolver's qualification, so lookup_type_for has no binding and both span hops answer none while the emitter still realizes the structural carrier -- the literal boundary stayed DirectLiteral exactly there (measured: the data prose rows in v2.compiler.source_authority and extdeps.languages.dag, which import no String). The qualified prefix is joined against the census row, never trusted as a spelling. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen: infer_env mirror carries the two identity hops Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Cached-data emission renders an elaborated literal through the typed-expression emitter The JSON mock route serializes nested-record VALUES and has no spelling for the elaborated image; its wildcard refused every structural-text data row with 'unsupported mock expression' after the elaboration fired (measured on the anchor probe). The image is ordinary constructor nodes and renders like any expression. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Move the elaborated-literal data-arm rationale out of the fn body (4c: module-item grain only) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen: emit_rust mirror carries the elaborated-literal data arm Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * XL-0T: host-text carrier spelling chosen by declaration identity -- a known non-structural String reference renders the grounding spelling std::string::String, unshadowable by the generated structural use line Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Unescaped interpolation braces in render_rust_text_carrier_identity_note quoted the generated use line verbatim; regenerated mirror emitted string.clone() -- quote it without braces Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Class row generated_binding_shadows_bare_render: a generated use line rebinding a bare-spelled render composes into silent wrong realization; fix is declaration-identity-keyed rendering with the grounding spelling Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Route all six type-renderer host-text short-circuits through the identity-keyed render_rust_text_carrier -- the first-line bare-String renders at render_rust_type/without_applied_binding/applied/decl/fn_sig/in_scope were still spelling-keyed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Reference-binding hop precedes the resolved-node hop in type_reference_declaration_ref: alias expansion is closure-dependent, so the inferred node names the realization the alias peels to (std.algebra.FreeMonoid) while the boundary identity is the declaration the author named (v2.std.text.String); measured pd/pe/pf probes flip on std.types presence alone Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen: mirrors converged at first-generation byte fixed point over the identity-split emitter and reordered identity hops (fixed point re-verified with the final binary) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Projections: DESIGN.md/design-ledgers.md carry generated_binding_shadows_bare_render; stage0 partition roster regenerated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen: mirrors re-converged on the merged tree (first-generation fixed point verified with the rebuilt binary) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Projections: DESIGN.md re-projected on the merged tree Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Identity answers guarded by the authored leaf name (rejects the alias-expansion artifact without letting name-keyed hops outrank the exact resolved-node hop -- the reorder regressed the Peano battery on the Nat homonym); grounding spelling scoped to modules whose bare String binding is structural (corpus-wide grounding redded two witnesses pinning the bare kernel spelling) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * A rejected expansion artifact re-derives its destination from the module-level name binding, not the per-node one: lookup_type_by_name is import-driven and uniform across the module, so one module cannot split into structural annotations beside host values (measured 108->174 board regression under the per-node fallback) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Terminal census hop: when the annotation is unresolved and no env binding names it, a UNIQUE global_bare declaration of the authored leaf is the destination (the documented global-uniqueness resolution rule); ambiguity stays Absent, fail closed. Measured: pd anchor reads expected present, n=String rtn=noresolve bare=unique:v2.std.text -- every existing hop declined while the census carried the answer Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * The unique-census hop is the terminal fallback for EVERY Absent outcome of the identity hops, not only the by-name arm -- the measured failing path was lookup_type_for answering a binding whose census read fails, which returned Absent without ever consulting the census Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * One subject, one answer at the literal boundary: the natively-realizes fact is read from the DESTINATION declaration's census file, not re-derived from the reference node's span -- a kernel-minted annotation span (<kernel:String>) answered natively=TRUE against a v2.std.text.String destination, keeping the literal direct at a structural boundary; node-span file remains the fallback when the census has no row Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Type repair: route the census-file read through span_file_string so the FilePath product coerces at a String return boundary (the inline if/else mixed Product(FilePath) with a String literal and regen refused, invalidating the prior round's probes) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * One authority for the text spelling: render_rust_text_carrier consults type_reference_declaration_ref + the destination census file -- the same reader the literal boundary uses -- rendering a structural destination as the qualified crate path and everything else bare; the module-binding heuristic and grounding spelling are deleted (both measured wrong in opposite directions) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Retract the terminal unique-census hop: a corpus-unique declaration is not the destination of a reference the module never bound -- it invented structural identities for the whole kernel corpus (census 108->569/437 measured). The census read survives only where a module-level binding EXISTS and its own census read fails, and as the natively-coherence file source. Consistency now rests on the one-authority renderer: infer and emit consult the same reader, so whichever answer identity gives, annotation and value agree Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Mirror reset to main's self-consistent set (the ours-side merge resolution mixed pre-main mirrors with main consumers of compile_sources_selected -- E0432 on round 1); hand-maintained interpreter arms re-inserted (4 ExprElaboratedLiteral arms, EXPR_VARIANT_COUNT 23) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Interpreter mirror back to main's for bootstrap round 1 (the hand arms reference ExprElaboratedLiteral, which only regen adds to v1_std_core); the arms are re-inserted mid-convergence and land with the regen commit Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Revert the identity-reader widenings and emitter spelling experiments to the c7b8056-compatible three-hop state, recording each measured failure in place: leaf-name guard 108->174, terminal census hop ->569, module-binding rederivation ->437, one-authority renderer ->745. The shadowed-module class stays open under the boundary-lane declared drop with its fix shape on the class row; natively-coherence (destination census file) is kept Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Parse repair: orphaned closing brace left by the renderer revert Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Complete the revert: natively back to the node-derived decl_file (the census-file coherence read was deleted with the census hops and its consumer refused regen) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Merge repair: the row-union dropped my class row's evidence/closing lines when the conflict markers were stripped mechanically -- both rows now well-formed (this parse error silently refused regen, which my capture filters then hid) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Regen: mirrors converged at first-generation byte fixed point on the merged tree (rounds 2, 3 and the final rebuilt-binary check all equal); interpreter hand arms restored; DESIGN/design-ledgers projections carry both new recurring-failure class rows Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qao5PDTLMpAjCGQDUELuiM * Round-1 bootstrap coherence: stage0_std_core lib.rs taken from main alongside main's stage0 mirror set (regen re-derives the literal-elaboration rows) * Regen: converged at first-generation byte fixed point on the round-1 bootstrap tree — literal-elaboration/operator-realization/structural-bindings mirrors re-derived and installed, partition lib rows and the four ExprElaboratedLiteral interpreter hand arms restored (EXPR_VARIANT_COUNT 23) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC * Regen: converged at first-generation byte fixed point on the re-cut tree (round 2 equal) — the mirror delta vs main is exactly the four text-family files the re-added UnicodeScalarSequenceUnfold row touches Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC * Floor fixes for the re-cut head: totalize the two LiteralUnfolding matches in peano_nat_structural_realization_test over the re-added UnicodeScalarSequenceUnfold variant (both witnesses PASS scoped), and retire the XL-0N #9719 wave-admission row by its own dissolve-on trigger (base and head both carry the relocation; the run on bc74b2e reported it stale) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC * Re-cut floor recovery: restore the literal-destination identity hops (declaration_ref_of_type_node with by-name + qualified-census fallback, scoped to the elaboration destination read; XL-0N's operand reader untouched), delete the resurrected name-keyed text op overrides and host_string_text seam arms from 05_emit_rust, restore the ExprElaboratedLiteral arm in data-value emission, and narrow the ops witness excludes to the overrides' exact receiver forms (bare .is_empty() red the structural Vec lowering — substring-oracle over-match). Text battery 11/11, peano 29/29, regen at byte fixed point Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC * Post-merge repair: rebuild rung_drop.dag from main's version plus the text_boundary_identity_wall row intact (the union regex had split on a '=======' line inside an authored string — parse error at the module index), retake main's stage0 set (the generated-artifact merge driver had left ours-bytes marker-less on namespace_wave_admission.rs), regen re-derives the six text-family mirrors to the byte fixed point (round 2 equal); text battery 11/11, peano 29/29 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC * Structural key for the text literal homomorphism: the row keys on what survives resolution (FreeMonoid+Char), natively reads the destination's own declaring file, witnesses re-anchor on the qualified boundary The #9813 kernel-precedence landing exposed that the text row was keyed on information resolution deliberately discards: String is a container-alias spelling, so every 'type X = FreeMonoid<Char>' boundary peels to the bare structural carrier and no module spelling survives to key on. The row now keys on that surviving structure — destination std.algebra.FreeMonoid with element std.types.Char (LiteralHomomorphism gains an element field, threaded through literal_homomorphism_for/elaborate_literal_at; peano and bool rows carry element: none). Second repair on the same boundary: destination_realizes_natively was read from the RESOLVED NODE's ident_span file, and a substituted alias RHS is a kernel-minted node whose pseudo-file <kernel:std.algebra.FreeMonoid> string-matched the '<kernel:' native-numeric roster row, so the peeled structural boundary answered natively=true and took DirectLiteral with the matching row present. natively is now read from the DESTINATION declaration's own census file (declaration_file_of in 04_env), per numeric_realization_identity_note's own rule that realization is a fact about the declaration. Witness battery re-anchored per the division ruling: the seven positive rows probe the QUALIFIED v2.std.text.String boundary (each probe imports string_is_empty so the harness's import-following closure loads the text module), and a new control pins bare String + text import = host, deterministically, under uniform kernel precedence. 12/12 text rows and 29/29 peano rows green by execution; stage0 mirrors regenerated to first-generation byte fixed point on the merged tree. Also: recurring_failure_mode row mistyped_body_radiates_nonlocal_diagnostics (the phantom-diagnostic specimen, layer stated), DESIGN.md and docs/design-ledgers.md regenerated via generated_artifact_gate main_wet_one, stale rust_host_string_seam_fn_emit comment fixed (review 57929). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R4A6MRdzeYxNr7dRbugcUC --------- Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Summary
XL-0N (
node://adhoc-aec65f93-b00).v2.std.nat.Nat = Zero | Succstays the structural Peano coproduct; noNat -> i64realization row is added. Instead the compiler gains its first generic authorities for the two things the emitted v2 closure was getting wrong by spelling:std.literal_elaboration,dag/std/literal_elaboration.dag): a kernel literal at a typed boundary whose exact destinationDeclarationRefdeclares a homomorphism from the kernel value is replaced, in the typed tree, by a new core carrierExprElaboratedLiteral { value, elaboration }whose child is the literal's image under that homomorphism (Succ { prev: … Zero }for the Peano unfolding), typed as the destination.v1.compiler.inferapplies it at every position that already supplies an expected type (call argument, declared return, record field, data initializer, annotated let, list element, map value, block tail) and at the other operand of a binary operator when one side is a literal. Emission renders the image as ordinary constructors and never re-decides from spelling, imports, or rustc expectations. Outcomes:DirectLiteral | ViaHomomorphism | LiteralElaborationRefused { HomomorphismDuplicated }. The interpreter evaluates the image (its numeric grounding foldsSucc/Zeroexactly as authored ones) — 2 hand-Rust arms inv1_interpreter.rs, the only hand-Rust in this change.std.operator_realization,dag/std/operator_realization.dag):emit_typed_bin_opdecides by the operand's exact declaration —HostOperatorwhen the declaration realizes natively on Rust (v1.compiler.coercion declaration_realizes_natively_on_rust: exact binding, then the identity-gated checkpoint),StructuralEquality(the emitted enum's derivedPartialEq),StructuralComparison(a call to the declared comparison tested againststd.algebra.Ordering), or a typedcompile_error!refusal for infix arithmetic on a structural operand.Rows live in
gunbc.structural_realization_bindings:KernelIntLiteral -> v2.std.nat.NatviaZero/Succ/prev;KernelBoolLiteral -> v2.std.logic.BoolviaTrue/False(BooleanUnfold, the manager's Bool addition — the interpreter realizes Bool natively and evaluates an elaborated literal as its kernel value, so the Bool image is evidenced on the emitted path only);v2.std.nat.Natordering vianat_compare.where-refined declarations (NonEmptyStr,Char,VersionIdentity) resolve to the parser's one-childConjrefinement wrapper, so the operand decision hopsis_where_refinement_type→ base (resolved through the env) — the type renderer's own route (render_rust_alias_rhs_type) — before judging; measured under regen, where the earlier alias-item hop could never fire. EveryBinOpmatch instd.operator_realizationis total over the 14 closed variants (no non-fold-residue rows). XL-0T adds itsFreeMonoidunfolding arm and one row; nothing per-destination exists in inference or emission.The census subject is repaired at its source too:
v2.std.natgains a structuralnat_compare(the old body wasif a == b … if a < b— the host<rustc refused),nat_sub(typed underflow),nat_div_rem(NatDivisionByZeroarm) andnat_div_rem_by_succ(the zero divisor has no constructor).v2.std.integer's decimal conversion is rewritten onto them, with one digit-glyph table shared by the Peano and machine-integer renderers; the twoInt-valued callers that passed anIntinto theNatrenderer (native_agreement,realization_sweep— E0308 sites) now call a realIntformatter.floor_expected_redchunk 14 (w_kernel_numeric_at_the_peano_nat_is_refused) is retired by its own stated trigger ("the expected-type-directed literal introduction judgment is NOT built"); the witness now asserts the ruled admission through the homomorphism and stays enrolled as a control (DESIGN §4b(4)).Identity at the boundary (measured; read once at inference, carried on the typed tree)
v2.std.nat.Natis recursive (Succ { prev: Nat }), and the resolver leaves a recursive type reference in place (resolve_nodeleaf arm,is_recursive_type_for→resolved: n, noinferred). The identity lookup matched the reference-site span against the declaration span and answered Absent, so every Peano boundary fell to its "identity unavailable" arm whilev2.std.logic.Bool(not recursive) worked on the same compiler. Fix (v1.compiler.infer_env type_reference_declaration): resolve the reference through its scoped env binding (lookup_type_for) before span-matching. That binding is live at inference and gone at emission (only the module env survives), which is why the literal rows passed and the operator rows kept the host token: a by-name fallback tried for the emitter was refuted by construction — it answered the pool-precedence homonymstd.nat.Nat(native,i64) for a module importingv2.std.nat.Nat, and the span match confirmed that homonym exactly. So the operand's declaration is now read once, at inference, and stamped on the typed tree asExprBinOp.operand: OperandDeclaration { declaration, decl_file }(after hopping awhere-refinement to its base);emit_typed_bin_opconsumes it and never re-reads identity. The by-name arm is deleted.An operand whose type node names no declaration (inference-synthesized field-access / method-return nodes: no span, no file) is
OperandIdentityUnavailable { facts }and decides by operator class, never by a default:==/!=/&&/||/??are the host token by construction (structural and host equality are one token on the target — the emitted enum derivesPartialEq), ordering and arithmetic refuse carrying the shape facts. The pre-laneUnavailable => HostOperatorarm was the absorbing fallback (DESIGN §5) that hid this lane's own defect; the refusal census that replaced it measured the whole v1 closure at 50 sites / 139 refusals, every one under==/!=. Kernel-minted types (<kernel:…>), generic type parameters and host containers are their own named arm (HostRealizedOperand).Partition layout:
std.literal_elaboration/std.operator_realizationregistered in the std-core partition andgunbc.structural_realization_bindingsin the v1-infer binding unit (v2.workflow.rust_crate_partition), with module-dag edges; the generated artifactgunbc.stage0_crate_partition_generatedregenerated viagenerated_artifact_gate main_wetand the partition crates re-rendered byclaim_executor --emit-partition-crates --write(never hand-edited).A second, separate defect surfaced on the way and is fixed at its single site: a record literal nested in field position (
Succ { prev: Succ { … } }) was rendered with the outer type's name as its head (Nat::Nat) becauseemit_field_value_with_contexthanded the raw resolved type to the constructor namer while the top-level path expanded it first (expand_type_for_field_access); the nested site now expands the same way.Falsifiers (required seed prefixes)
v2.test.claim.self_host.peano_nat_structural_realization_test— 26 rows: nontrivialSuccvalues compare/subtract/divide/convert correctly; divide-by-zero is typed; the generic decisions by row and identity, including removing the row returns the literal toDirectLiteral(the E0308 shape) and duplicated rows refuse; an operand without a readable declaration refuses under<//and is host under==; the Bool row is found by exact destination, Direct once removed, and Direct at the nativestd.types.Bool(no variant ofBoolis matched by name in interpreter-run rows).test.claim.self_host_peano_literal_operator_realization_witness_test— emitted bytes through the production emitter: literal at argument/return/operand boundary emits itsZero/Succimage (forbidden tokens are the pre-lane rendering),</<=callnat_compareagainstOrdering, infix/on Nat refuses in the bytes, a kerneltrue/falseat av2.std.logic.Boolboundary emitsBool::True/Bool::Falsewhile the nativestd.types.Boolkeeps the keyword, and three host controls (nativeInt, andstd.nat.Nat— same spelling, different declaration — keep the host token and the bare digit).Test plan
claim_batch … --entry src/v2/test/claim/self_host/peano_nat_structural_realization_test.dag --functions <all 26>in the interpreter on the fixed-point binary: 26/26 PASS (regen20).claim_batch … --entry dag/test/claim/self_host_peano_literal_operator_realization_witness_test.dag --functions <all 12>through the production emitter on the fixed-point binary: 12/12 PASS (regen20; was 9/12 before the typed-tree operand carrier, 6/12 before the nested-head fix + layout).gunbc compile(prebuilt seed) over the model modules,v1.compiler.coercion,v1.compiler.infer_envand the rewrittenv2.std.integerclosure: 0 blocking diagnostics.Seed regen (BuildBuddy, bootstrapped from the committed mirrors, rounds to
first_generation_equal=true): every head on this branch since370f5faconverged at round 2; the mirrors are committed at each step. CI on earlier commits was red by construction (pre-lane mirror, then mirror drift between a.dagchange and its regen round).Whole-closure census,
src/v2/compiler/00_compile.dagemitted through the production pipeline (gunbc compile->cssl_assemble->cargo build --lib --message-format=json, BuildBuddy 20 GB runner; the instrument's 16 KiB stderr capture truncates this closure, so the rows are read from the JSON messages) -- identity diff, row = (rustc code, emitted file, message), lane head2177446vs main head0a6d177: main 57 rows -> lane 52 rows; 5 rows gone, 0 rows new, and no row mentioningNatremains. Gone:E0369 v2_std_nat.rs binary operation<… Rc<v2_std_nat::Nat>,E0369 v2_std_integer.rs binary operation<…,E0369 v2_std_integer.rs cannot divide Rc<v2_std_nat::Nat> by {integer}, and twoE0308 v2_std_subject_evidence.rsrows. The remaining 52 are other lanes' classes (E0004Edgeexhaustiveness, E0223, E0277, theRc<i64>wraps of the agreed follow-up). The E0308 literal-at-Nat sites share the genericmismatched typesmessage with unrelated sites, so at this row grain they are witnessed by the per-file rows above and by the emitted-path battery rather than as distinct identities.A CORRECTION TO AN EARLIER RUN OF THIS SAME MEASUREMENT, recorded rather than quietly restated. The first pass keyed rows on
^E\d{4}and so DROPPED every rustc error carrying no code -- which is exactly what acompile_error!refusal is, the shape this lane introduces. Under it the head reported52rows against aTOTAL 53, and the discrepancy was the whole finding: the hidden row was a refusal THIS lane produced atv2/compiler/02_parse.dagparse_current_position(t.start + 1, wheretbinds the value of a genericListHeadResult<T>and the field-access type node inference builds carries no authored name). So "0 new" was true only of the codes the filter could see. The arm is fixed at its cause -- an operand type node with NO authored name is not a reference to a declaration, and isHostRealizedOperand { UnnamedSynthesizedType }-- and the numbers above are from the corrected instrument, wheremine 52 = TOTAL 52closes the same gap by identity rather than by assertion.Required floor: new witnesses planned/passed by identity in
required_floor_disposition.tsv.🤖 Generated with Claude Code
https://claude.ai/code/session_013koFunEtpLQCnvUiz85k7Y