Summary
The per-element link-score pinning machinery in src/simlin-engine/src/ltm_augment.rs has two sibling bare-Var arms that pin an unsubscripted arrayed reference without consulting the variable's DECLARED dimensions. Both should be fixed together by threading declared dims (and the mapped-dim correspondence) into every per-element bare-Var pin.
1. Reachable: bare subset-dims dep in a per-element / arrayed-agg target body (silent-zero scores)
subscript_idents_at_element's bare-Var arm (ltm_augment.rs ~2179 at f057ef38; the Expr0::Var match in subscript_idents_in_expr0) pins EVERY listed bare dep with the target's FULL element tuple, regardless of the dep's own arity:
growth[Region,Age] = pop[Region, young] * w # w declared [Age]
The per-element pinning pass rewrites the bare w to w[region·r, age·y] -- arity 2 over a 1-D variable. Every per-element link-score fragment for the pop -> growth edge fails to compile, the fragments are dropped, and the pop -> growth scores silently read constant 0 for the whole run. The only signal is per-fragment "failed to compile" Assembly warnings (the #546/#548/#587 hazard class: degraded score masquerades as an inactive link).
2. Latent analogue: bare live-source ref in a positionally-MAPPED per-element target
rewrite_per_element_source_refs' own bare-Var arm (ltm_augment.rs ~2555 at f057ef38) -- which pins a genuinely-bare reference to the LIVE SOURCE -- projects by the source's OWN dims (AxisRead::Iterated { dim, source_dim } with dim == source_dim for every axis) and has no mapped-correspondence arm. A bare source reference in a positionally-mapped per-element target (growth[State,Age] = pop[State,young] * pop with a positional State -> Region mapping) would fail to row-resolve (per_element_row_for_target returns None) the same way. This shape is contrived and untested (both endpoints must type-check as a bare mapped broadcast), but it is the exact analogue of arm 1 and the same fix covers it.
Fix direction
Pin a bare arrayed dep only over the dimensions it DECLARES (a subset of the target's element tuple), which requires threading the dep's declared dims into the per-element pinning pass; for the live-source arm, additionally consult DimensionsContext::mapped_element_correspondence so a positionally-mapped axis resolves to the corresponding source element (the same correspondence the Subscript arm already carries via per_element_row_for_target's Iterated { dim, source_dim }).
Components affected
src/simlin-engine/src/ltm_augment.rs -- subscript_idents_at_element / subscript_idents_in_expr0 (bare-Var arm), rewrite_per_element_source_refs (bare-Var arm)
Discovery context
Found during adversarial review of the LTM transform-first restructuring on branch roundtrips-track-a (part of the #965 typed-IR arc). Verified byte-identical between HEAD f057ef38 and the restructured tree -- pre-existing, NOT a regression of that work. Empirically confirmed: the bare-w model above emits four "failed to compile" Assembly warnings on both trees.
Tracking
Part of LTM epic #488 (Augmentation group). Related but distinct:
Summary
The per-element link-score pinning machinery in
src/simlin-engine/src/ltm_augment.rshas two sibling bare-Vararms that pin an unsubscripted arrayed reference without consulting the variable's DECLARED dimensions. Both should be fixed together by threading declared dims (and the mapped-dim correspondence) into every per-element bare-Varpin.1. Reachable: bare subset-dims dep in a per-element / arrayed-agg target body (silent-zero scores)
subscript_idents_at_element's bare-Vararm (ltm_augment.rs~2179 atf057ef38; theExpr0::Varmatch insubscript_idents_in_expr0) pins EVERY listed bare dep with the target's FULL element tuple, regardless of the dep's own arity:The per-element pinning pass rewrites the bare
wtow[region·r, age·y]-- arity 2 over a 1-D variable. Every per-element link-score fragment for thepop -> growthedge fails to compile, the fragments are dropped, and thepop -> growthscores silently read constant 0 for the whole run. The only signal is per-fragment "failed to compile"Assemblywarnings (the #546/#548/#587 hazard class: degraded score masquerades as an inactive link).2. Latent analogue: bare live-source ref in a positionally-MAPPED per-element target
rewrite_per_element_source_refs' own bare-Vararm (ltm_augment.rs~2555 atf057ef38) -- which pins a genuinely-bare reference to the LIVE SOURCE -- projects by the source's OWN dims (AxisRead::Iterated { dim, source_dim }withdim == source_dimfor every axis) and has no mapped-correspondence arm. A bare source reference in a positionally-mapped per-element target (growth[State,Age] = pop[State,young] * popwith a positionalState -> Regionmapping) would fail to row-resolve (per_element_row_for_targetreturnsNone) the same way. This shape is contrived and untested (both endpoints must type-check as a bare mapped broadcast), but it is the exact analogue of arm 1 and the same fix covers it.Fix direction
Pin a bare arrayed dep only over the dimensions it DECLARES (a subset of the target's element tuple), which requires threading the dep's declared dims into the per-element pinning pass; for the live-source arm, additionally consult
DimensionsContext::mapped_element_correspondenceso a positionally-mapped axis resolves to the corresponding source element (the same correspondence the Subscript arm already carries viaper_element_row_for_target'sIterated { dim, source_dim }).Components affected
src/simlin-engine/src/ltm_augment.rs--subscript_idents_at_element/subscript_idents_in_expr0(bare-Vararm),rewrite_per_element_source_refs(bare-Vararm)Discovery context
Found during adversarial review of the LTM transform-first restructuring on branch
roundtrips-track-a(part of the #965 typed-IR arc). Verified byte-identical between HEADf057ef38and the restructured tree -- pre-existing, NOT a regression of that work. Empirically confirmed: the bare-wmodel above emits four "failed to compile" Assembly warnings on both trees.Tracking
Part of LTM epic #488 (Augmentation group). Related but distinct: