Repository navigation
membership: refuse partial-weight rows as nested ICC structure #608
Description
Scientific / DDD finding
membership_core::classify_membership_design on the predecessor logic classified a member with exactly one active group in one role as MembershipDesign::Nested without considering assignment weight. A lone partial assignment such as weight 0.5 was therefore treated as a complete one-way nested membership, and nested_intraclass_correlation ignored that weight and estimated the row as if membership were full.
That contradicts ADR 0003 and the Membership owner contract. MembershipWeight in (0,1) is explicit partial membership; the one-way nested ICC profile is admissible only when every included outcome member has exactly one active full-weight assignment. A partial edge means the observed structure cannot be represented losslessly by that profile even if complementary memberships are absent from the local network.
Ordinary-forward RED → repair on #605
- Public RED
23a8af5d85697b8445aec3d5a4dde80e1597cd89addspartial_membership_nested_icc_contract.rs. An otherwise estimable two-cluster population with one lone weight0.5membership must classify asMultipleMembershipand returnNestedIccInapplicable; an all-full control remainsNestedand estimable. The predecessor reportsNestedand proceeds numerically. - Causal repair
4b65bd373be2551a03dedbf2f056fb3434dc1d89treats one-role partial weights as weighted/multiple membership rather than complete nested structure. Same-role multi-group membership remainsMultipleMembership; multi-role structure remains fail-closed for the nested ICC; ANOVA arithmetic is unchanged. - Boundary contract
7e52f864e3294f412075916629a21e6799ed6888adds a pure full-weight two-role control proving cross-classification still reportsCrossClassifiedrather than being conflated with the new partial-weight rule.
This repair does not normalize weights, duplicate rows, infer missing complementary memberships, or introduce an MMMC estimator. It only prevents the nested estimator from claiming applicability to unsupported structure.
Current owner vehicle is Draft TEPP#605@7e52f864e3294f412075916629a21e6799ed6888 on protected main@a243f18da4a4ca8a8d068c39922537f1f8ed6ad0, ahead 17 / behind 0 with nine changed files. Exact-head hosted evidence and independent review must be acquired on this head; predecessor results do not transfer.
Acceptance
Keep open until the surviving #605 head has exact Rust/rustdoc/test/owned line+branch+edge coverage/security/CodeQL/Semgrep, qualifying independent approval, ordinary protected-main landing, and verified downstream inheritance by #604/#501 as applicable.
Activity
test(membership): refuse partial rows as nested ICC structure (#608)
fix(membership): refuse partial weights in nested ICC classification (#…
test(membership): preserve full cross-classification boundary (#608)
seonghobae commentedon Sep 19, 2026
Surviving owner-head update: #605 advanced to exact
b653eed5963efde246a9224078e1a51d979c53e6for #609. #608's rule that a partial membership cannot be reinterpreted as complete nested structure remains inherited. #609 also corrected the older pure-cross control to full Project weight because a0.5cross-role assignment now correctly carries a multiple-membership signal. Acceptance for #608 must therefore be evaluated onb653eed..., not7e52f864....