Repository navigation
Derived-node identity step 2, repair (a): peel_nominal_alias_identity keeps a type parameter's mark (census 37 -> 0; plan specimens unmoved) - #13329
Conversation
…ment (output grain) v1.tests.claim.generic_identity_census reads the typed graph and records, per stored type node, which generic-identity marks it carries. Its blind spot is a typed UNOBSERVED population in every receipt. Not ready to push: the mirror and lib.rs line were emitted by a local compiler that is not main's emitter and must be regenerated; the gunbc test label and the callee-argument column are not written yet. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d-for-want-of-context
claim_executor --regen-round-cost in a standalone clone, looped to rebuild_packages=0. The census mirror and lib.rs line were already a fixed point. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-identity census label gi_supplied_node_readings calls substitute_generics_apply and unify_generics over nodes the real producer emitted for the fixture. Not ready: the mirror here may be stale against the .dag (a rebuild is in flight) and has not been regenerated with --regen-round-cost. Stacks on #13290. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…y its mark (mirrors not regenerated)
1. gi_foreign_reading is three-valued. "No marked occurrence in the owner's value arguments" no longer reads as "no occurrence": a leaf spelled as the parameter and carrying no mark is ForeignParameterValueArgumentUndecided. 2. The bound-call control and the collision reading rest on ResultCarrierObservation, which says whether the carrier was seen at all. 3. gi_sig_rows reads every signature, not only those declaring a type parameter. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cuted control owner_argument_arms_discriminate asks about one marked parameter under three supplied owners built from head_of's real signature and requires three different answers. missing_carriers_are_unobserved requires Unobserved for a name with no item and for an item with no body. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…pending regeneration
…D conformance_keeps_the_parameter_mark (mirrors pending regen round)
…rebuild_packages=0) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…pt the branch's superset) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
LAND. This is the correct repair-(a) cut. peel_nominal_alias_identity is an alias operation, so a node already carrying a DeclField::TypeParameter identity is not eligible for name-based nominal lookup; returning that node unchanged preserves the existing declaration authority and copy law rather than adding another inference rule. The predicate lives beside DeclarationRef, and the old path remains unchanged for every non-parameter reference.
The fixture is discriminating at the affected carrier: a function parameter Q shares a spelling with the record parameter Box<Q>, and formal_declaration_bound_conformance must retain the function parameter's exact (owner, TypeParameter) mark. The reported 37 -> 0 movement confined to that carrier, fixed-point regeneration, and successful 00_compile resolution support the claimed blast radius.
The PR also states the ceiling honestly: neither the srv3 join refusal nor the accepted head_of<Int> into String specimen moves, and this review credits neither as repaired. The supplied-node bet readings are observations, not gates or production behavior.
GitHub's live status currently still shows the exact-head witnesses run in progress despite the request saying green; treat this approval as the code/modeling verdict and queue only after the exact-head required run completes successfully.
… mirrors bootstrapped by 3-way merge, regenerated next
Derived-node identity step 2, repair (a) only:
v1.compiler.infer_resolvepeel_nominal_alias_identitykeeps a type parameter's mark. Plan:docs/plans/derived-node-identity-design.md§6 step 2.What it fixes
peel_nominal_alias_identitylooked a type-parameter reference up by name and returned whatever the environment bound to that spelling. Where a module binds the same spelling (a recordBox<Q>besidefn f<Q>), it replaced the parameter leaf and dropped its own mark. The repair reads the mark instead: a node carrying aTypeParameterdeclaration is returned as given (std.decl_refdeclaration_ref_is_type_parameter).gunbc test //gunbc/instruments:generic-identity-census, Derived-node identity step 2: the generic-identity census (gunbc test //gunbc/instruments:generic-identity-census) #13290) goes from 37 rows of this shape to 0, and no other row moves.conformance_keeps_the_parameter_markoverfixtures/generic_identity_census/a.dag(same_spelling_as_a_record_parameter). It fails before the repair and holds after.substitute_generics_applykeeps the child declaration; the plan-field reading). They are readings in the census label, not gates, run over nodes the real compiler emitted.Evidence at 69d839c (gunbc / claim_executor built from this tree)
claim_executor --regen-round-costgivesconvergence_stages=0,rebuild_packages=0, and leaves the mirrors unchanged.src/v2/compiler/00_compile.dagresolves (NoSuchFunction). The fourfold_listrows an earlier attempt newly refused do not refuse.The plan's specimens: both UNMOVED, and not claimed
Both are shapes of
gunbc.recurring_failure_modegeneric_identity_decided_by_spelling, and both stay with the rest of step 2 (carry origins, switch the three sites to identity). The receipts below come fromgunbcbuilt at mained68b5573band at this head:test.claim.srv3_websocat_sequence_witnessthe_readback_never_runs_after_a_failed_step(shape 1, valid code refused)function 'join' not found in scope(122:34)take_s(s: head_of(xs: [1], d: 2)),take_s(s: String)(shape 2, wrong code accepted)11aaShape 2 is silent wrongness, and it is the next priority in step 2. This PR does not touch it.
🤖 Generated with Claude Code