Repository navigation
scientific(membership): own stable wire vocabulary for longitudinal design #641
Description
DDD / release finding
MembershipDesign is the canonical owner-derived classification used by #640, but it previously had no owner-issued stable wire vocabulary. #638/#639 need to bind longitudinal Membership design into an immutable topic-lineage projection. If topic_measurement matches enum variants and invents its own strings, the consumer duplicates Membership-domain semantics and can drift from the owner.
Membership therefore owns a closed, fail-closed wire name for each design variant, analogous to MembershipRole::{wire_name,from_wire_name}, plus an explicit vocabulary version:
- vocabulary version
tepp.membership_design.v1; Nested->nested;CrossClassified->cross_classified;MultipleMembership->multiple_membership;CrossClassifiedMultipleMembership->cross_classified_multiple_membership;HeterogeneousClassification->heterogeneous_classification;HeterogeneousClassificationMultipleMembership->heterogeneous_classification_multiple_membership.
Unknown names fail closed through MembershipError::UnknownMembershipDesign. This is a serialization boundary only; it does not authorize downstream callers to assert a design label. Consumers must still obtain the enum from Membership-owned classification over canonical state.
RED → repair lineage
Canonical owner PR #605:
- source RED
3f044fdcaaa603a4dd059cb89ae78d82b7c7f7a6requires exact names, round-trip parse, and typed refusal; - owner implementation
37217511ab6c978e3500d652d67f9805a27e7690; - typed
UnknownMembershipDesignrefusal09e4320cefe4fb35ec80dadcf7d8c59ff1ca0bb4; - module integration
9cf7ac3d632d76ef0d4b5a8f634a62c90bddde26; - version RED
1c9f1c8b7a1ec0d23efd6f121d7880ea39019017; - vocabulary version
1fad4ef19ba6b1a4f25877687cf4fda9417f00e4; - public export
544cfb9f55087f9f6cdccf55bcde8148fe3b5d28; - CHANGELOG/current exact owner head
3b27cba84f5ceebf0c39c87b9287958656e3a8f1.
No hosted RED/GREEN is claimed yet. Current exact-head required workflows are queued/non-terminal and #605 has no qualifying current-head independent approval.
Acceptance
- exact names, round-trip, explicit owner version, and unknown-name refusal are exact-head GREEN;
- public rustdoc/error semantics and owned edge coverage are current;
- release(contract): publish immutable temporal-analysis contract for Orgmetra consumers #638/fix(release): bind fail-closed reconstructable topic-lineage results (#638) #639 consume only the owner-issued vocabulary after normal protected-main landing; no consumer-side string mapping or mutable source copy;
- feat(membership): add owner-issued single-membership admission #605 exact-head Rust/rustdoc/coverage/security/CodeQL/Semgrep plus qualifying independent review before protected merge;
- issue remains open until downstream/release acceptance is actually satisfied;
- no force push, destructive rebase, self-approval, skip/xfail, or gate weakening.
Protected base remains main@a243f18da4a4ca8a8d068c39922537f1f8ed6ad0.
Activity
test(membership): RED owner design wire vocabulary (#641)
feat(membership): own design wire vocabulary (#641)
feat(membership): type unknown design wire refusal (#641)
feat(membership): compile owner design wire contract (#641)
test(membership): RED explicit design vocabulary version (#641)
feat(membership): version owner design wire vocabulary (#641)
feat(membership): export design wire version (#641)
docs(membership): record design wire owner contract (#641)