Reputation Signal v1 Invariants¶
reputation-signal.v1 is a small append-only fact record. The schema captures
the portable shape; this note freezes the invariant card that strict consumers
should enforce on ingest.
Invariants¶
subject/kind = node->subject/idMUST benode:did:key:...subject/kind = participant->subject/idMUST beparticipant:did:key:...subject/kind = org->subject/idMUST beorg:did:key:...subject/kind = nym->subject/idMUST benym:did:key:...signal/typeprefix =procedural/*->subject/kindMUST NOT benymsignal/typeprefix =contract/*->subject/kindMUST NOT benymsignal/typeprefix =community/*->subject/kindMAY benym, but MUST NOT beorgin MVPsignal/typeprefix =incident/*->subject/kindMAY benode,participant,org, ornymrecorded/at >= observed/atweight ∈ (0.0, 1.0]polarity ∈ { positive, negative }
Enforcement note¶
Standard JSON Schema can directly enforce:
- rules
1-8, - rule
10, - rule
11.
Rule 9 is still mechanically verifiable, but not by vanilla draft-2020-12
schema alone, because it requires comparison of two timestamps. Consumers that
want strict ingest SHOULD enforce it in boundary tests or runtime validation.
Domain model note¶
signal/type is the only source of truth for the domain:
procedural/...contract/...community/...incident/...
There is no separate domain field in the record. This avoids a duplicated
field pair that could drift out of sync.
Nym note¶
nym is a valid reputation subject only where the surrounding layer actually
permits pseudonymous reputation. This is why community/* and some
incident/* signals may target nym:did:key:..., while procedural/* and
contract/* do not.
This keeps the contract aligned with the governance boundary:
- governance and panel service run on stable
participant:did:key - pseudonymous reputation may still exist in the social layer
Organization note¶
org is an accountable institutional subject, not a presentation alias.
Therefore in MVP:
procedural/*MAY targetorg:did:key:...,contract/*MAY targetorg:did:key:...,incident/*MAY targetorg:did:key:...,community/*MUST NOT targetorg:did:key:...by default.
This preserves the asymmetry between organizational accountability and social-layer rumor or acclaim.
Retention note¶
retention/hint is not a decay engine. It is only emitter intent:
ephemeralpersistentepoch-scoped
Consumers may ignore it in MVP read models, but keeping it in the base contract prevents later decay logic from having to backfill intent after the fact.