Repository navigation
membership: preserve mixed cross-classified and multiple-membership structure #609
Description
Scientific / DDD finding
membership_core::classify_membership_design documents that it classifies active memberships “without collapsing structure”, but the predecessor #605 head could not represent a population containing both cross-classification and multiple membership at one event time.
At TEPP#605@7e52f864e3294f412075916629a21e6799ed6888, classify_members returned MultipleMembership immediately when it encountered same-role group multiplicity or a one-role partial weight. If another member was simultaneously cross-classified across roles, that cross-classified dimension disappeared. The public MembershipDesign enum also had only Nested, CrossClassified, and MultipleMembership, so there was no truthful result for the combined design.
This did not make nested ICC numerically permissive—the nested estimator already refused both non-nested categories—but it was scientifically lossy for model selection, Validation Evidence, traceability, and the future MMMC estimator boundary. Browne, Goldstein, and Rasbash (2001, DOI 10.1177/1471082X0100100202) explicitly motivate models in which cross-classification and multiple membership are combined; TEPP’s own docs/research/multilevel-multiple-membership-measurement.md cites that work and requires the underlying relational structure to be preserved rather than flattened.
Ordinary-forward RED -> repair on #605
- Public RED
cb2abf79b608e29c8deb0085dc0ce5224dd4158aaddsmixed_membership_design_contract.rs. One member is full-weight cross-classified across Author/Project while another has weighted same-role Department membership. The population must classify as a combined design and nested ICC must fail closed. The predecessor cannot compile the required combined enum state and is therefore RED by construction. - Causal repair
edaddb1f202d07ee5b92b1f32238ad175241b98daddsMembershipDesign::CrossClassifiedMultipleMembership, tracks cross-classification and multiple-membership signals independently across the active population, and returns the combined state when both are present. Pure nested, pure cross-classified, and pure multiple-membership states remain distinct; the nested ANOVA arithmetic is unchanged. - Control repair
b653eed5963efde246a9224078e1a51d979c53e6makes the older pure-cross regression fixture actually pure by using full Project membership. Under membership: refuse partial-weight rows as nested ICC structure #608 semantics, the previous0.5Project weight itself carried a multiple-membership signal, so keeping it while expectingCrossClassifiedwould have contradicted the new lossless classifier.
Current surviving owner vehicle is Draft TEPP#605@b653eed5963efde246a9224078e1a51d979c53e6 on protected main@a243f18da4a4ca8a8d068c39922537f1f8ed6ad0. Relative to predecessor 7e52f864..., the #609 delta is three ordinary-forward commits touching only icc.rs, one new public contract, and the one-line pure-cross fixture correction. No estimator, row duplication, weight normalization, membership inference, persistence schema, or Analysis Run source is introduced.
Acceptance
Keep open until the surviving #605 head has:
- exact-head Rust/rustdoc/tests/owned line+branch+edge coverage/security/CodeQL/Semgrep;
- mixed + pure nested/cross/multiple controls GREEN;
- qualifying independent current-head approval;
- ordinary protected-main landing;
- verified downstream inheritance by scientific(longitudinal): preserve time-varying cross-classified membership in CWC admission #604/scientific: establish longitudinal CWC recovery acceptance evidence #501 before any scientific acceptance claim.
No force push, destructive rebase, skip/xfail, precedence-based hiding of a design dimension, or gate weakening.
Activity
test(membership): expose mixed MMMC classification loss #609
fix(membership): preserve mixed MMMC design classification #609
test(membership): keep pure cross-classification control full-weight #…
docs(traceability): currentize Membership owner through #609