Skip to content

feat(membership): add owner-issued single-membership admission - #605

Draft
seonghobae wants to merge 101 commits into
mainfrom
feat/membership-single-admission-604
Draft

seonghobae wants to merge 101 commits into
mainfrom
feat/membership-single-admission-604

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

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:

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_observations resolves every opaque (MemberId, EventTime) coordinate at that observation's own event time and fails closed on missing context. classify_membership_observations_wire issues MembershipDesignClassification only after canonical classification and retains support cardinality, event-time bounds, versioned tepp.membership_observation_support.v1 opaque-support identity, and the six-state Membership design vocabulary.

project_membership_observations_wire issues tepp.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-order input_coordinates() mapping. Raw MemberId/GroupId UUID text is omitted from the released projection.

The source support_sha256 fingerprints 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_icc remains 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 f5670df0ca2cd1ef7626a939aa61ecef89852721 has fresh non-terminal runs: Rust Foundation 35649251391, Security 35649251311, Semgrep 35649251344, CodeQL PR 35649251192, Documentation 35649251380; 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

  • exact-head Rust/rustdoc/tests/owned line+branch+edge coverage/security/CodeQL/Semgrep GREEN;
  • qualifying independent current-head approval;
  • observation-specific event time and missing-context refusal preserved;
  • six design states retain owner-issued versioned wire names and distinct parsed-wire vs owner-authority types;
  • owner classification retains support count/bounds and exact versioned opaque-support/topology identity;
  • support wire reconstructs temporal/grouping/multiple-membership structure with local ordinals, exact weights, deterministic ordering and duplicate multiplicity without raw UUID text;
  • repeated identical observation coordinates remain multiplicity-sensitive but cannot carry contradictory topology;
  • parsed support bytes fail closed for topology/design mismatch and states unreachable through canonical Membership admission;
  • source opaque-support identity and privacy-reduced reconstruction remain distinct; wire-content digest stays deterministic/recomputable without being treated as authentication;
  • release(contract): publish immutable temporal-analysis contract for Orgmetra consumers #638/fix(release): bind fail-closed reconstructable topic-lineage results (#638) #639 consume only after protected-main landing and add consumer mismatch fixtures;
  • fast-mlsirm one-way ICC lands and is released immutably before TEPP replaces duplicated arithmetic through a versioned ACL;
  • scientific: establish longitudinal CWC recovery acceptance evidence #501 recovery is reacquired after the relevant Analysis ACL is implemented.

#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.

@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Contributor Author

Fresh foundation handoff for the Membership owner lane: #648 exact 0be133ae0e0a58c1a0f88a8c59df839eae971ead has validated the central-admission contract repair through repository/Python, authored coverage, PostgreSQL, rustfmt/Clippy, 1,443 tests with 0 skipped, doctests, and rustdoc. Its sole Rust Foundation failure is cargo deny on RUSTSEC-2026-0285 / GHSA-2mjx-qc3c-rqvc from protected-main rustls 0.23.43; canonical remediation is already owned by #526 and inherited by main-target successor #538 exact f335624cea977fea7d7fe6f36871868557fe2bb7 (rustls = 0.23.45, Rust Foundation GREEN).

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 main and remains Draft pending #538 normal landing and ordinary-forward reconciliation. #605 exact f5670df0... remains unchanged and its own required runs are still queued; no foundation receipt is transferred to this head.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority: high

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant