Skip to content

scientific(membership): reject support wire states impossible under canonical membership admission #651

Open

Description

@seonghobae

Finding

#649 now verifies canonical ordering, individual weight validity and design/topology consistency, but a parsed support row can still describe a state that canonical MembershipNetwork could never admit:

  • two simultaneously active entries with the same (role, group) but different weights; or
  • same-role group shares whose exact represented binary64 sum exceeds 1.0.

MembershipNetwork::insert already owns both invariants. Accepting such bytes in tepp.membership_observation_support_projection.v1 would make the wire structurally reconstructable but scientifically outside the owner aggregate's reachable state space.

Required RED

Starting from a valid owner-produced payload, mutate only the support topology while keeping every individual weight in (0,1] and the declared design otherwise plausible. Require MembershipObservationSupportWire::from_json to fail closed for:

  1. duplicate (role, group_ordinal) entries with different exact binary64 weight bits; and
  2. same-role weights whose exact represented binary64 sum exceeds unity, including an overrun that ordinary f64 accumulation could round back to 1.0.

Minimal causal repair

Do not create a second share-budget arithmetic implementation. Reuse the canonical exact binary64 budget predicate from Membership admission at crate scope, and validate each reconstructed observation against the same reachable-state invariants. Keep the parser non-authoritative; this repair only constrains wire bytes to states the owner aggregate can actually issue.

Refs #605 #610 #612 #649 #650.

Activity

  1. seonghobae commented on Sep 21, 2026

    @seonghobae
    ContributorAuthor

    Implemented on canonical #605 owner branch.

    RED 2774e1c327f971dcba370dfec28dc74b81f49c99 adds two unreachable-state parser fixtures: duplicate (role, group_ordinal) edges with distinct valid weights, and exact same-role overrun 1.0 + minimum_subnormal whose ordinary binary64 sum can round back to 1.0. Both must be refused even when the declared design remains otherwise plausible.

    fff822d40cd8ad28f6ed8aa3c17b63beafbcbf15 exposes the existing exact represented-binary64 share-budget predicate at crate scope only; estimator arithmetic and admission thresholds are unchanged. Causal parser repair 8a73734d3f3f36dfa8f141bacea6c08171cca938 rejects duplicate role/group edges and applies that same canonical exact budget predicate per role before accepting reconstructed support. CHANGELOG/current head is 3177e98c40135368f81644bf5354baaf80216a46.

    Fresh exact-head runs are non-terminal: Rust Foundation 35643667975, Security 35643668031, Semgrep 35643668510, CodeQL 35643667919, Documentation 35643667994. Rust Foundation's four jobs remain queued before runner admission. Keep this issue open through exact-head GREEN, independent approval, protected landing, and downstream 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