Reputation Signal v1¶
Source schema: doc/schemas/reputation-signal.v1.schema.json
Machine-readable schema for a small append-only reputation fact record. This contract carries one reputation-affecting signal about a node, participant, org, or nym subject. It is intentionally unsigned in the core shape so local write-path storage and later transport envelopes stay decoupled.
Governing Basis¶
doc/normative/50-constitutional-ops/PROCEDURAL-REPUTATION-SPEC.mddoc/normative/50-constitutional-ops/ROOT-IDENTITY-AND-NYMS.mddoc/normative/50-constitutional-ops/EMERGENCY-ACTIVATION-CRITERIA.mddoc/normative/50-constitutional-ops/ABUSE-DISCLOSURE-PROTOCOL.mddoc/project/20-memos/reputation-signal-v1-invariants.mddoc/project/40-proposals/017-organization-subjects-and-org-did-key.mddoc/project/50-requirements/requirements-008.md
Project Lineage¶
Requirements¶
Stories¶
Fields¶
| Field | Required | Shape | Description |
|---|---|---|---|
schema/v |
yes |
const: 1 |
Schema version. |
signal/id |
yes |
string | Stable identifier of the emitted reputation signal record. |
observed/at |
yes |
string | Time when the underlying behavior, incident, or review outcome was observed. |
recorded/at |
yes |
string | Time when the reputation signal was written as a fact record. Consumers SHOULD enforce recorded/at >= observed/at. |
signal/type |
yes |
string | Open signal namespace. The first path segment is the reputation domain and MUST stay consistent with subject constraints. |
polarity |
yes |
enum: positive, negative |
Reputation direction of the signal. Neutral observations do not belong in this contract. |
weight |
yes |
number | Relative strength of the signal, normalized to (0.0, 1.0]. |
subject/kind |
yes |
enum: node, participant, org, nym |
Identity layer on which the signal lands. |
subject/id |
yes |
string | Canonical identifier of the reputation subject. The allowed format depends on subject/kind. |
observed-via/node-id |
no |
string | Optional node through which the behavior was observed when the subject is a participant or nym. |
emitted-by/kind |
yes |
enum: local-runtime, operator, peer, panel, federation-review, council |
Emitter class of the signal. |
emitted-by/id |
yes |
string | Identifier of the emitter. The format may depend on emitted-by/kind; council uses canonical council:did:key:.... |
case/ref |
no |
string | Optional case or review reference when the signal originates in a formal case pipeline. |
basis/refs |
no |
array | Optional references to supporting artifacts, reviews, exceptions, or evidence. Negative signals without basis may be downranked by consumers. |
retention/hint |
yes |
enum: ephemeral, persistent, epoch-scoped |
Emitter-side hint about how long this signal should naturally matter. |
notes |
no |
string | Optional human-readable explanation. |
Conditional Rules¶
Rule 1¶
When:
{
"properties": {
"subject/kind": {
"const": "node"
}
},
"required": [
"subject/kind"
]
}
Then:
{
"properties": {
"subject/id": {
"pattern": "^node:did:key:z[1-9A-HJ-NP-Za-km-z]+$"
}
}
}
Rule 2¶
When:
{
"properties": {
"subject/kind": {
"const": "participant"
}
},
"required": [
"subject/kind"
]
}
Then:
{
"properties": {
"subject/id": {
"pattern": "^participant:did:key:z[1-9A-HJ-NP-Za-km-z]+$"
}
}
}
Rule 3¶
When:
{
"properties": {
"subject/kind": {
"const": "org"
}
},
"required": [
"subject/kind"
]
}
Then:
{
"properties": {
"subject/id": {
"pattern": "^org:did:key:z[1-9A-HJ-NP-Za-km-z]+$"
}
}
}
Rule 4¶
When:
{
"properties": {
"subject/kind": {
"const": "nym"
}
},
"required": [
"subject/kind"
]
}
Then:
{
"properties": {
"subject/id": {
"pattern": "^nym:did:key:z[1-9A-HJ-NP-Za-km-z]+$"
}
}
}
Rule 5¶
When:
{
"properties": {
"signal/type": {
"pattern": "^procedural/"
}
},
"required": [
"signal/type"
]
}
Then:
{
"properties": {
"subject/kind": {
"not": {
"const": "nym"
}
}
}
}
Rule 6¶
When:
{
"properties": {
"signal/type": {
"pattern": "^community/"
}
},
"required": [
"signal/type"
]
}
Then:
{
"properties": {
"subject/kind": {
"not": {
"const": "org"
}
}
}
}
Rule 7¶
When:
{
"properties": {
"signal/type": {
"pattern": "^contract/"
}
},
"required": [
"signal/type"
]
}
Then:
{
"properties": {
"subject/kind": {
"not": {
"const": "nym"
}
}
}
}
Rule 8¶
When:
{
"properties": {
"emitted-by/kind": {
"const": "council"
}
},
"required": [
"emitted-by/kind"
]
}
Then:
{
"properties": {
"emitted-by/id": {
"pattern": "^council:did:key:z[1-9A-HJ-NP-Za-km-z]+$"
}
}
}
Field Semantics¶
schema/v¶
- Required:
yes - Shape: const:
1
Schema version.
signal/id¶
- Required:
yes - Shape: string
Stable identifier of the emitted reputation signal record.
observed/at¶
- Required:
yes - Shape: string
Time when the underlying behavior, incident, or review outcome was observed.
recorded/at¶
- Required:
yes - Shape: string
Time when the reputation signal was written as a fact record. Consumers SHOULD enforce recorded/at >= observed/at.
signal/type¶
- Required:
yes - Shape: string
Open signal namespace. The first path segment is the reputation domain and MUST stay consistent with subject constraints.
polarity¶
- Required:
yes - Shape: enum:
positive,negative
Reputation direction of the signal. Neutral observations do not belong in this contract.
weight¶
- Required:
yes - Shape: number
Relative strength of the signal, normalized to (0.0, 1.0].
subject/kind¶
- Required:
yes - Shape: enum:
node,participant,org,nym
Identity layer on which the signal lands.
subject/id¶
- Required:
yes - Shape: string
Canonical identifier of the reputation subject. The allowed format depends on subject/kind.
observed-via/node-id¶
- Required:
no - Shape: string
Optional node through which the behavior was observed when the subject is a participant or nym.
emitted-by/kind¶
- Required:
yes - Shape: enum:
local-runtime,operator,peer,panel,federation-review,council
Emitter class of the signal.
emitted-by/id¶
- Required:
yes - Shape: string
Identifier of the emitter. The format may depend on emitted-by/kind; council uses canonical council:did:key:....
case/ref¶
- Required:
no - Shape: string
Optional case or review reference when the signal originates in a formal case pipeline.
basis/refs¶
- Required:
no - Shape: array
Optional references to supporting artifacts, reviews, exceptions, or evidence. Negative signals without basis may be downranked by consumers.
retention/hint¶
- Required:
yes - Shape: enum:
ephemeral,persistent,epoch-scoped
Emitter-side hint about how long this signal should naturally matter.
notes¶
- Required:
no - Shape: string
Optional human-readable explanation.