Skip to content

ltm: FixedIndex reference into a disjoint-dim ApplyToAll target is loud-skipped though recoverable via the #510 per-element construction #769

Description

@bpowers

Summary

The GH #758 loud-skip gate (commit 5c9c2d41 on branch ltm-fix-batch-2: skip dim-incompatible conservative link scores -- target_dims == [] with both endpoints arrayed non-module -- with one Warning, no link-score variable, and loops through the edge dropped) sweeps in a sub-case that is recoverable in principle: a FixedIndex reference into a disjoint-dimension ApplyToAll target.

Fixture shape:

pop[D1]                      -- source over D1; a1 is a literal element of D1
hub[D2] = pop[a1] * 0.05     -- ApplyToAll target over disjoint dimension D2
... a feedback loop closed through pop and hub

The gate loud-skips this edge: one Warning, no link-score variable, and every loop through it is dropped. That is a strict improvement over the pre-#758 behavior (a never-compiling scalar score whose dependents stubbed to warned zeros -- verified), so nothing regressed. But the shape does not need to be skipped at all.

Why it is recoverable

Every target slot genuinely reads the same pop[a1], so a per-element link-score construction -- an Equation::ApplyToAll over the target's dims holding pop[a1] live -- is well-defined for every slot. This is the GH #510 Ast::Arrayed per-element construction generalized to ApplyToAll targets. Unlike the element-mapped cross-product class the #758 gate primarily exists for, there is no wrong-slot-diagonal hazard: the literal index pins the source element uniformly across all target slots.

Why it matters

Severity: low. This is a capability gap behind a loud warning, not silent wrongness. But the shape -- literal-element cross-dimension references in feedback loops -- appears in MDL-imported models, and each occurrence currently drops every loop through the edge from LTM analysis.

Components affected

  • src/simlin-engine/src/db/ltm/link_scores.rs -- emit_per_shape_link_scores and try_disjoint_dim_arrayed_link_scores (both present at 5c9c2d41)

Fix direction

Extend the #510 per-element construction in try_disjoint_dim_arrayed_link_scores to accept FixedIndex references into ApplyToAll (not just Equation::Arrayed) disjoint-dim targets: emit $⁚ltm⁚link_score⁚{from}[{elem}]→{to} as an Equation::ApplyToAll over the target's dims holding {from}[{elem}] live. Edges handled this way then no longer reach the loud-skip gate's sweep, shrinking the unscoreable-edge set (which also shrinks the #768 pathway/composite residual surface).

Discovery context

Identified during adversarial review of the GH #758 work on branch ltm-fix-batch-2 (commit 5c9c2d41).

Tracking / related

Part of LTM tracking epic #488 (Core algorithm group) and array-support umbrella #273. Related but distinct:

Activity

  1. added
    ltmLoops that Matter (LTM) analysis subsystem
    on Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    ltmLoops that Matter (LTM) analysis subsystem

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions