feat(membership): add owner-issued single-membership admission - #605
seonghobae wants to merge 101 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Fresh foundation handoff for the Membership owner lane: #648 exact Do not copy that dependency repair into Membership. A base-only #648→#538 stack was tested without force and proved non-mergeable because both lanes edit the hourly runbook/quality contract, so #648 was restored to |
Scope
Canonical Membership owner vehicle for #604 and the longitudinal/release prerequisites consumed by #638/#639. This PR owns Membership-domain admission, longitudinal design classification, provenance, privacy-reduced reconstruction coordinates, reachable-state wire validation, and serialization. Reusable one-way ICC arithmetic remains a fast-mlsirm responsibility.
Protected base:
main@a243f18da4a4ca8a8d068c39922537f1f8ed6ad0.Current exact head:
f5670df0ca2cd1ef7626a939aa61ecef89852721.Base→head: ordinary-forward, ahead 101 / behind 0, merge base = protected main. No force update or destructive rebase was used.
Membership owner lineage
The branch retains #604 and #606–#613 admission/weight/leave-reentry/design work, then ordinary-forwards the longitudinal release boundary through:
e84e38bcac0bde0aee90f6ec9f74158de8929fc5→ classifierfaed96e783fafdbc8e0565cb1075c0dca72a98d4→ export/coverage/research doctoring through708642e55b1f021a3201b9de7f684e06750c108f;3b27cba84f5ceebf0c39c87b9287958656e3a8f1;MembershipDesignWirethroughccecb461805310ee45e7ca8680d2b1751294e595;8d2f8367221cb7bb653c8a0c2d71857f8572885d;aef1fa24b2af8fee1b75a9af3bad7720334a2605;fa8ffdf77c1f0cf404d06d46bfa45037854122b7;539c5ee7b7f85e22dce4c6f7d2ba0a9222318925;tepp.membership_observation_support_projection.v1, canonical ordering/parser hardening and topology/design consistency throughe425c7034da3f505c8dff49fc19d3ffe80adf40d;MembershipObservationSupportCoordinatemapping through2eca15330e52e585ed4044fc152b88fac29ca2ec;3177e98c40135368f81644bf5354baaf80216a46;tepp.membership_observation_support_projection_digest.v1: RED028a0660eeea76c6ce0c16ecfd7b179accb99a9d→ causal repair4e5b64e663868d63a77d9dbed2baedd7cae27621→ deterministic/detached-coordinate coverage and CHANGELOG through32871b52e801bd501d3ff1f4fee8cd12f17530b3;0bee645841bc9bb5029e4d82ec0083663d291395constructs a byte-canonical, digest-consistent payload where one local(member_ordinal, EventTime)appears twice with different individually valid topology. Causal repair8cd8a6db62c5ce75a56cd342302bb3c9466704e4remembers the first ordered assignment slice per canonical coordinate and rejects only contradictory repeats; identical duplicate observations remain valid and multiplicity-sensitive under existing owner projection coverage. CHANGELOGef50885bc21e7e1247a22e4ce1e1c59d8efbd331; source-newline repair/current headf5670df0ca2cd1ef7626a939aa61ecef89852721.No hosted failing RED is claimed for #653; repair followed the source-level contract before a runner executed the RED head.
Current owner contract
classify_membership_observationsresolves every opaque(MemberId, EventTime)coordinate at that observation's own event time and fails closed on missing context.classify_membership_observations_wireissuesMembershipDesignClassificationonly after canonical classification and retains support cardinality, event-time bounds, versionedtepp.membership_observation_support.v1opaque-support identity, and the six-state Membership design vocabulary.project_membership_observations_wireissuestepp.membership_observation_support_projection.v1: projection-local member/group ordinals, canonical UTC event times, stable role names, exact lowercase binary64 weight bits, owner design coordinates, the source-support digest, a separate recomputable wire digest, and a parallel caller-orderinput_coordinates()mapping. RawMemberId/GroupIdUUID text is omitted from the released projection.The source
support_sha256fingerprints opaque owner identity/topology and intentionally cannot be recomputed after UUID redaction. The wire digest covers the privacy-reduced serialized coordinates and is recomputed by the parser. Neither digest is authentication, and parsed wire remains non-authoritative.Parsed bytes fail closed for unsupported/unknown fields, noncanonical event-time spelling/JSON/order, malformed weight bits, invalid ordinal spaces, design/topology mismatch, duplicate role/group edges, exact same-role share overruns, detached wire/source-digest coordinates, and now contradictory topology for repeated local member/event-time observations. Byte-identical repeats remain valid so declared observation multiplicity is not collapsed.
Boundary to #638/#639
#639 must not choose a synthetic global
as_of, copy Membership source, invent design/group/ordinal mappings, treat parsed wire as owner authority, reproduce Membership digest/classification logic, or treat the recomputable wire digest as authentication. Until #605 lands normally on protected main, #639 may carry only an owner-path dependency note.After landing, Analysis can zip its own document/evidence IDs with owner-issued
input_coordinates()and bind the canonical support wire into its versioned temporal-analysis result, then add mismatch fixtures. Membership owns observation-specific grouping/time/multiple-membership reconstruction; Analysis retains run/window/cohort/document semantics and must not infer HR/person truth from local ordinals.Numerical owner boundary
membership_core::icc::anova_nested_iccremains duplicated reusable numerical arithmetic and is not final owner truth. Canonical one-way random-intercept arithmetic remains fast-mlsirm #2047. TEPP must not copy its mutable branch. The required sequence remains fast-mlsirm exact-head GREEN + independent approval → protected merge → immutable package release with version/CHANGELOG/SBOM/provenance/reproducibility → TEPP versioned ACL → duplicated arithmetic removal while Membership admission still fails closed before the numerical call.Current exact-head gate
Exact head
f5670df0ca2cd1ef7626a939aa61ecef89852721has fresh non-terminal runs: Rust Foundation35649251391, Security35649251311, Semgrep35649251344, CodeQL PR35649251192, Documentation35649251380; all were queued at the current sweep. No predecessor receipt is accepted. No qualifying independent exact-head approval exists.Shared-foundation repair #648/#647 remains separate. #605 must not work around protected-main gate defects; after its normal landing, this branch must reconcile/rerun on repaired protected main as needed.
Acceptance
#604, #606, #607, #608, #609, #610, #611, #612, #613, #640, #641, #642, #643, #644, #645, #646, #649, #650, #651, #652, and #653 remain open until downstream/release acceptance is actually satisfied.