Skip to content

scientific(membership): bind design vocabulary version and owner name as one typed wire coordinate #642

Open

Description

@seonghobae

Finding

#641 gives MembershipDesign a stable owner vocabulary (tepp.membership_design.v1) and fail-closed name parsing, but release consumers still receive the vocabulary version and design name as independent strings. A consumer can therefore pair a valid owner name with an unsupported/mistyped version unless every downstream projection reimplements the cross-field invariant.

That is the wrong boundary for #638/#639: the Membership owner should issue and validate the pair atomically so downstream code consumes one owner-derived coordinate rather than assembling {version, name} itself.

Required owner contract

Add a narrow immutable value object in membership_core that:

  • is constructed from an owner-derived MembershipDesign and emits exactly MEMBERSHIP_DESIGN_WIRE_VERSION plus that design's wire_name();
  • parses (version, name) only when the version is exactly supported and the name is in the closed owner vocabulary;
  • returns UnsupportedWireVersion for a mismatched version and UnknownMembershipDesign for an unknown name;
  • exposes the recovered MembershipDesign, version, and name without authorizing caller-asserted classification;
  • keeps fix(release): bind fail-closed reconstructable topic-lineage results (#638) #639 from inventing its own cross-field validation or version/name pairing.

Acceptance

This is a Membership serialization/value-object boundary only. It must not add estimator arithmetic, HR/person truth, or consumer-authorized design labels.

Activity

  1. seonghobae commented on Sep 21, 2026

    @seonghobae
    ContributorAuthor

    Implemented on canonical #605 branch without consumer duplication.

    RED caa147344addd10e1388440c04e15dd2e210d798 added the missing atomic contract: all six owner designs must round-trip through one version+name coordinate, a valid nested name paired with tepp.membership_design.v2 must fail UnsupportedWireVersion, and an unknown name under v1 must fail UnknownMembershipDesign.

    Causal repair b0cb90365a196bffae4fe2a05ff51d38df6c022d adds MembershipDesignWire; public export a9eccde731ebabc1bf13af25d02cad0869cb9b92; CHANGELOG/current exact head ccecb461805310ee45e7ca8680d2b1751294e595. Protected main remains a243f18da4a4ca8a8d068c39922537f1f8ed6ad0; compare is ahead 52 / behind 0. Current-head required workflows 35622655575 Rust, 35622655666 Security, 35622655477 Semgrep, 35622655534 CodeQL, 35622655349 Documentation are fresh and queued/non-terminal. No current-head independent approval exists, so #642 remains open and #605 remains Draft.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions