Skip to content

membership: refuse partial-weight rows as nested ICC structure #608

Description

@seonghobae

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 23a8af5d85697b8445aec3d5a4dde80e1597cd89 adds partial_membership_nested_icc_contract.rs. An otherwise estimable two-cluster population with one lone weight 0.5 membership must classify as MultipleMembership and return NestedIccInapplicable; an all-full control remains Nested and estimable. The predecessor reports Nested and proceeds numerically.
  • Causal repair 4b65bd373be2551a03dedbf2f056fb3434dc1d89 treats one-role partial weights as weighted/multiple membership rather than complete nested structure. Same-role multi-group membership remains MultipleMembership; multi-role structure remains fail-closed for the nested ICC; ANOVA arithmetic is unchanged.
  • Boundary contract 7e52f864e3294f412075916629a21e6799ed6888 adds a pure full-weight two-role control proving cross-classification still reports CrossClassified rather 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

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions