Problem
The #750 fix (branch ltm-fix-batch-2, commit 03a9ec1f) stops None-partition loops from cross-normalizing by giving each one a singleton normalization group (NormGroup::Solo): sound, never pollutes, but it under-merges genuinely-coupled module-internal-stock loops. Two loops through SMOOTH instance A and SMOOTH instance B that share a parent path are genuinely coupled feedback in the same subsystem, yet each now normalizes alone -- both rel_loop_scores pin to sign-preserving +/-1, so their relative contributions cannot be compared even against each other.
The principled refinement (named and rejected-for-scope in the 03a9ec1f commit body): resolve partitions for state-carrying module instances instead of letting them fall to None:
- treat the module instance as a partition node in the stock-coupling graph, and
- map module-internal stock names (
sub·stock) to the instance's partition,
so module-internal-stock loops land in the parent partition their instance participates in (or in a shared partition with their true siblings), and only genuinely-uncoupled loops keep the Solo backstop.
A further step composes with #773 / #749: treat PREVIOUS-holding variables as partition state nodes too, so lagged-state loops also get real partitions instead of Solo.
Why this is phase-sized (the honest assessment from the commit body)
Why it matters
Restores comparability of relative loop scores for module-heavy models (the exact value partition normalization exists to provide), where the singleton rule currently degenerates every module-internal loop to +/-1. Severity: low-medium; absolute scores unaffected, the Solo behavior is sound just uninformative.
Components affected
Cross-references
Discovery context
Named as the rejected-for-scope principled alternative in commit 03a9ec1f on ltm-fix-batch-2 (the #750 fix), 2026-06-09; filed so the refinement is independently trackable.
Problem
The #750 fix (branch
ltm-fix-batch-2, commit03a9ec1f) stopsNone-partition loops from cross-normalizing by giving each one a singleton normalization group (NormGroup::Solo): sound, never pollutes, but it under-merges genuinely-coupled module-internal-stock loops. Two loops through SMOOTH instance A and SMOOTH instance B that share a parent path are genuinely coupled feedback in the same subsystem, yet each now normalizes alone -- bothrel_loop_scores pin to sign-preserving +/-1, so their relative contributions cannot be compared even against each other.The principled refinement (named and rejected-for-scope in the
03a9ec1fcommit body): resolve partitions for state-carrying module instances instead of letting them fall toNone:sub·stock) to the instance's partition,so module-internal-stock loops land in the parent partition their instance participates in (or in a shared partition with their true siblings), and only genuinely-uncoupled loops keep the Solo backstop.
A further step composes with #773 / #749: treat PREVIOUS-holding variables as partition state nodes too, so lagged-state loops also get real partitions instead of Solo.
Why this is phase-sized (the honest assessment from the commit body)
model_cycle_partitions(src/simlin-engine/src/db/analysis.rs~2548),model_element_cycle_partitions(same file ~3057), and the discovery-graph build (ltm_finding.rs/CausalGraph::compute_cycle_partitionsinsrc/simlin-engine/src/ltm/graph.rs~1110).Noneand are not covered by module-instance partition nodes alone (unless the further PREVIOUS-as-state-node step is taken).Why it matters
Restores comparability of relative loop scores for module-heavy models (the exact value partition normalization exists to provide), where the singleton rule currently degenerates every module-internal loop to +/-1. Severity: low-medium; absolute scores unaffected, the Solo behavior is sound just uninformative.
Components affected
src/simlin-engine/src/db/analysis.rs(model_cycle_partitions,model_element_cycle_partitions)src/simlin-engine/src/ltm/graph.rs(compute_cycle_partitions) /src/simlin-engine/src/ltm/partitions.rs(partition_for_loop's module-internalNoneresolution)src/simlin-engine/src/ltm_finding.rs(discovery-graph partition grouping)src/libsimlin(partition stock sets), pysimlin, MCP (ltm: expose cycle-partition metadata on exhaustive/pinned loop surfaces (SimlinLoop, Model.loops/Run.loops, MCP LoopDominanceSummary), keyed by stock-set identity #685)Cross-references
None-bucket cross-normalization bug; the singleton-group fix closing it is the backstop this issue refines (commit03a9ec1f)Discovery context
Named as the rejected-for-scope principled alternative in commit
03a9ec1fonltm-fix-batch-2(the #750 fix), 2026-06-09; filed so the refinement is independently trackable.