You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
scientific(membership): reject contradictory duplicate observation topology in support wire #653
tepp.membership_observation_support_projection.v1 intentionally preserves duplicate longitudinal observations as a multiset, but canonical Membership state is deterministic for one (MemberId, EventTime): repeating the same observation coordinate must resolve to the same active assignment topology every time.
The current parser validates each row independently, enforces canonical ordering, design/topology consistency, duplicate edge refusal, exact share budgets, and a recomputable wire digest. It does not require two rows with the same (member_ordinal, event_time) to carry identical assignments. A byte-canonical payload can therefore contain two copies of the same local observation coordinate with different valid assignment sets, recompute wire_sha256, and still pass even though no canonical MembershipNetwork can issue that state.
This is distinct from #651: duplicate role/group edges inside one row and same-role share overruns are already rejected. The defect is cross-row determinism for a duplicated observation coordinate.
Required RED
Add a public support-wire fixture with two rows sharing the same member_ordinal and canonical event_time but different individually valid assignment topology. Keep:
contiguous member/group ordinal spaces;
a design label consistent with the aggregate reconstructed signals;
valid exact (0,1] binary64 weights and same-role share budgets;
canonical row/assignment ordering; and
a correctly recomputed tepp.membership_observation_support_projection_digest.v1.
MembershipObservationSupportWire::from_json must fail closed. A duplicate coordinate with byte-identical assignments must remain valid so multiplicity is preserved rather than deduplicated.
Minimal causal repair
During wire validation, remember the assignment slice first observed for each canonical (member_ordinal, EventTime) coordinate. A repeated coordinate is valid only when its full ordered assignment vector is identical. Reuse the existing parsed/canonical EventTime and assignment equality; do not add another topology classifier, normalize rows, remove duplicates, or weaken #649/#650 multiplicity semantics.
Boundary
This is reachable-state validation at the Membership serialization boundary. It does not make parsed wire authoritative, add HR/person identity, change estimator arithmetic, or replace release provenance/authentication. #605 remains the canonical owner vehicle and #638/#639 remain downstream until normal protected-main landing.
source RED 0bee645841bc9bb5029e4d82ec0083663d291395 adds a canonical, digest-consistent cross_classified payload with two rows at the same (member_ordinal=0, 2026-06-01T00:00:00Z) but different individually valid assignment topology; predecessor validation can accept this unreachable state;
causal repair 8cd8a6db62c5ce75a56cd342302bb3c9466704e4 records the first ordered assignment slice for each parsed canonical (member_ordinal, EventTime) and rejects only contradictory repeats;
CHANGELOG/current exact head ef50885bc21e7e1247a22e4ce1e1c59d8efbd331.
No hosted failing RED or GREEN is claimed. #605 remains Draft and must still satisfy exact-head hosted gates + qualifying independent review before normal protected landing. #638/#639 must not consume this mutable branch.
Follow-up quality repair: f5670df0ca2cd1ef7626a939aa61ecef89852721 restores the trailing source newline that the contents-API causal edit had dropped. This is now #605's exact head; no scientific behavior changed. Fresh exact-head runs: Rust Foundation 35649251391, Security 35649251311, Semgrep 35649251344, CodeQL PR 35649251192, Documentation 35649251380, all non-terminal/queued at the current sweep.
Activity
test(membership): reject contradictory duplicate support topology (#653)
fix(membership): enforce duplicate support coordinate determinism (#653)
docs(changelog): record duplicate support coordinate guard (#653)
seonghobae commentedon Sep 21, 2026
Owner lineage on canonical #605:
0bee645841bc9bb5029e4d82ec0083663d291395adds a canonical, digest-consistentcross_classifiedpayload with two rows at the same(member_ordinal=0, 2026-06-01T00:00:00Z)but different individually valid assignment topology; predecessor validation can accept this unreachable state;8cd8a6db62c5ce75a56cd342302bb3c9466704e4records the first ordered assignment slice for each parsed canonical(member_ordinal, EventTime)and rejects only contradictory repeats;ef50885bc21e7e1247a22e4ce1e1c59d8efbd331.No hosted failing RED or GREEN is claimed. #605 remains Draft and must still satisfy exact-head hosted gates + qualifying independent review before normal protected landing. #638/#639 must not consume this mutable branch.
style(membership): restore support wire source newline (#653)
seonghobae commentedon Sep 21, 2026
Follow-up quality repair:
f5670df0ca2cd1ef7626a939aa61ecef89852721restores the trailing source newline that the contents-API causal edit had dropped. This is now #605's exact head; no scientific behavior changed. Fresh exact-head runs: Rust Foundation35649251391, Security35649251311, Semgrep35649251344, CodeQL PR35649251192, Documentation35649251380, all non-terminal/queued at the current sweep.