Skip to content

scientific(membership): issue downstream observation-to-local-support coordinates #650

Description

@seonghobae

Finding

#649 makes the Membership support itself reconstructable and privacy-reduced, but the canonical wire is intentionally sorted and omits downstream observation/document identity. A downstream owner such as #639 therefore cannot bind each of its own observations to the correct projection-local member coordinate without re-sorting raw MemberId values or otherwise reproducing the owner mapping.

That is a DDD leak: Membership should issue the local coordinate mapping at the same time it builds the projection. Analysis should retain its own document/evidence identity and only consume the Membership-issued coordinate.

Required RED

For an input slice containing multiple members, time-varying observations, and duplicates, require the owner-issued projection to expose a coordinate slice parallel to the caller's admitted observation order where each entry contains:

  • the projection-local member_ordinal chosen by Membership; and
  • the exact canonical EventTime supplied for that observation.

The canonical serialized support wire must remain input-order insensitive. Reordering the caller observations may reorder the returned input-coordinate slice, but must not change the canonical support bytes. Duplicate observations must retain duplicate coordinate entries rather than being deduplicated.

No raw MemberId/GroupId may be exposed by this mapping.

Minimal repair

Extend MembershipObservationSupportProjection with a Membership-owned, non-wire input-coordinate mapping derived from the same local ordinal table used to build tepp.membership_observation_support_projection.v1. Do not make Analysis reconstruct that ordinal table.

This mapping is owner-issued analytical coordination data, not natural-person identity and not a standalone serialization authority. #639 can later zip it with its own document IDs when the #605 contract lands normally on protected main.

Refs #605 #638 #639 #649.

Activity

  1. seonghobae commented on Sep 21, 2026

    @seonghobae
    ContributorAuthor

    Implemented on canonical #605 owner branch.

    RED 0355549c187043768e69c0d4a667b18e3a27e672 requires an owner-issued coordinate slice parallel to the admitted input observation order while keeping canonical #649 support bytes order-insensitive. Causal repair e2e8eb2668c18d2e65d47ef8f885ec37e6f6de78 adds MembershipObservationSupportCoordinate { member_ordinal, event_time } inside MembershipObservationSupportProjection; ce4d068a1381debb6a8e9d8503e44a025dd76b45 exports it; current head 2eca15330e52e585ed4044fc152b88fac29ca2ec records the contract.

    The test proves the input coordinate slice follows caller order, duplicate observations remain duplicate coordinates, and reordering inputs changes only the non-wire coordinate ordering while canonical support JSON remains identical. The mapping exposes no raw member/group UUID.

    Fresh current-head runs are non-terminal: Rust Foundation 35643220699, Security 35643220706, Semgrep 35643220713, CodeQL 35643220645, Documentation 35643220749. Keep open through exact-head GREEN, independent approval, protected-main landing and downstream #639 released-contract consumption.

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