{"id":"92f7bd6e2cb14d64f834a7c061bc9fa5c7ae1464b728a5d34148e20fc3fc2f6d","pubkey":"da19f1cd34beca44be74da4b306d9d1dd86b6343cef94ce22c49c6f59816e5bd","created_at":1774618257,"kind":30817,"tags":[["title","NIP-DISPUTES: Dispute Resolution Protocol"],["k","7543"],["k","30545"],["d","nip-disputes"]],"content":"NIP-DISPUTES\n==============\n\nDispute Resolution Protocol\n------------------------------\n\n`draft` `optional`\n\nTwo event kinds for structured dispute resolution on Nostr: claim filing and resolution.\n\n> **Standalone.** This NIP works independently on any Nostr application.\n\n## Motivation\n\nNIP-56 provides content reporting (flagging notes for moderation), but Nostr has no protocol for resolving disputes between parties. When a marketplace purchase goes wrong, a group governance decision is contested, a freelance job is abandoned, or content is wrongly removed, there is no standardised way to:\n\n- **File a structured complaint** referencing a specific event, with typed categories and optional mediator assignment\n- **Resolve the complaint** with a transparent, signed ruling\n\nThis NIP defines two event kinds: a dispute claim and a dispute resolution. They work with any Nostr interaction that produces an event: marketplace transactions (NIP-15), classified listings (NIP-99), group moderation (NIP-29), content publishing, or any custom application.\n\n## Relationship to Existing NIPs\n\n### NIP-56 (Reporting)\n\nNIP-56 handles content and user reporting for moderation. Dispute Claims (`kind:7543`) are structured complaints between parties with typed dispute categories, optional financial amounts, and optional mediator assignment. The two serve different purposes: NIP-56 is unilateral reporting to relays; NIP-DISPUTES is bilateral dispute resolution between parties.\n\nApplications MAY implement reputation consequences based on dispute history. For example, an application that detects patterns of at-fault rulings against the same pubkey MAY publish NIP-56 reports with structured `report` tags. This keeps abuse reporting at the application layer where pattern detection logic belongs.\n\n### NIP-EVIDENCE (kind 30578)\n\nDispute evidence SHOULD be submitted as [NIP-EVIDENCE](NIP-EVIDENCE.md) records (`kind:30578`). The `e` tag references the dispute claim event. Evidence types (photo, video, screenshot, receipt, etc.) map directly to NIP-EVIDENCE's `evidence_type` vocabulary. This composability means dispute evidence is discoverable alongside other evidence records and benefits from NIP-EVIDENCE's file hash verification, geolocation, and capture timestamp metadata.\n\nSee [Composing with NIP-EVIDENCE](#composing-with-nip-evidence) for concrete examples.\n\n### NIP-94 / Blossom\n\nFor media attachments (photos, videos, documents), use NIP-94 file metadata or Blossom (BUD-01) uploads, referenced from NIP-EVIDENCE records via `file_hash` and URL tags. Media upload is a generic file management concern, not dispute-specific.\n\n### NIP-APPROVAL\n\nFor multi-party dispute panels (e.g. three-mediator arbitration), compose with [NIP-APPROVAL](NIP-APPROVAL.md) gates. Each panel member publishes an approval event; the dispute resolution is published once the required threshold is met.\n\n## Kinds\n\n| kind  | description         | type        |\n| ----- | ------------------- | ----------- |\n| 7543  | Dispute Claim       | regular     |\n| 30545 | Dispute Resolution  | addressable |\n\nClaims are regular events (NIP-01); once published, they cannot be replaced at the relay level (regular events have no addressable replacement semantics). NIP-09 deletion requests may be issued but relays MAY ignore them; the cryptographic signature on the original event remains independently verifiable. Resolutions are addressable events; the resolver may correct a ruling before settlement.\n\n---\n\n## Dispute Claim (`kind:7543`)\n\nFiled by a complainant against another party. Immutable: as a regular event, the claim cannot be replaced or retracted at the relay level. It can only be resolved via a `kind:30545` resolution.\n\n```json\n{\n    \"kind\": 7543,\n    \"pubkey\": \"<complainant-hex-pubkey>\",\n    \"created_at\": 1698770000,\n    \"tags\": [\n        [\"p\", \"<accused-pubkey>\"],\n        [\"e\", \"<referenced-event-id>\"],\n        [\"alt\", \"Dispute claim: quality issue in freelance engagement\"],\n        [\"dispute_type\", \"quality\"],\n        [\"resolution_model\", \"mediator\"],\n        [\"mediator\", \"<mediator-pubkey>\"],\n        [\"domain\", \"freelance\"],\n        [\"t\", \"domain:freelance\"],\n        [\"amount_disputed\", \"25000\"],\n        [\"currency\", \"SAT\"]\n    ],\n    \"content\": \"Deliverables did not match the agreed specification. Three of five requirements were not addressed.\"\n}\n```\n\nTags:\n\n* `p` (REQUIRED): Accused party's pubkey.\n* `e` (REQUIRED): References the event being disputed.\n* `dispute_type` (REQUIRED): Application-defined dispute category. Common examples include `no_show`, `quality`, `pricing`, `damage`, `safety`, `fraud`, `moderation`, `governance`, but applications MAY define any value appropriate to their domain.\n* `resolution_model` (REQUIRED): Application-defined resolution model. Common models include `mediator` (designated party reviews and rules), `mutual` (parties negotiate directly), and `automated` (rule-based auto-resolution), but applications MAY define any value.\n* `mediator` (OPTIONAL): Nominated mediator's pubkey. How the mediator is selected (marketplace-assigned, mutually agreed, random from pool) is application-defined.\n* `domain` (OPTIONAL): Category of the disputed interaction (e.g. `freelance`, `delivery`, `marketplace`, `moderation`, `governance`). This is a multi-letter tag; relays cannot filter on it. Clients MUST post-filter by `domain` after retrieval.\n* `t` (RECOMMENDED when `domain` is present): `[\"t\", \"domain:<category>\"]` (e.g. `[\"t\", \"domain:freelance\"]`). Enables relay-side discovery by domain via `#t` filters. The `domain` tag remains the canonical source; the `t` tag is a relay-filterable mirror.\n* `amount_disputed` (OPTIONAL): Financial amount in dispute, in smallest currency unit.\n* `currency` (OPTIONAL): Currency code (e.g. `GBP`, `USD`, `EUR`, `SAT`).\n\nFiling deadlines, resolution timeframes, and escalation rules are application concerns. Applications SHOULD document their dispute policies separately.\n\n### REQ Filters\n\n```jsonc\n// Subscribe to all disputes involving a specific pubkey (as accused)\n[\"REQ\", \"disputes\", {\"kinds\": [7543], \"#p\": [\"<accused-pubkey>\"]}]\n\n// Subscribe to all disputes filed by a specific pubkey\n[\"REQ\", \"my-disputes\", {\"kinds\": [7543], \"authors\": [\"<complainant-pubkey>\"]}]\n\n// Subscribe to disputes for a specific event\n[\"REQ\", \"event-disputes\", {\"kinds\": [7543], \"#e\": [\"<referenced-event-id>\"]}]\n```\n\n### Appeals\n\nApplications MAY implement appeal workflows by publishing additional Dispute Claim events referencing the original resolution.\n\n> **Privacy:** This event MUST be delivered via NIP-59 gift wrap. See [Privacy](#privacy).\n\n---\n\n## Dispute Resolution (`kind:30545`)\n\nThe resolution of a dispute claim. Addressable: the resolver may update the ruling before settlement.\n\n```json\n{\n    \"kind\": 30545,\n    \"pubkey\": \"<resolver-hex-pubkey>\",\n    \"created_at\": 1698775000,\n    \"tags\": [\n        [\"d\", \"resolution_<dispute-claim-event-id>\"],\n        [\"e\", \"<dispute-claim-event-id>\"],\n        [\"alt\", \"Dispute resolution: partial refund of 15000 SAT\"],\n        [\"ruling\", \"partial_refund\"],\n        [\"resolution_model\", \"mediator\"],\n        [\"at_fault\", \"<accused-pubkey>\"],\n        [\"refund_amount\", \"15000\"],\n        [\"refund_currency\", \"SAT\"],\n        [\"resolved_at\", \"1698775000\"]\n    ],\n    \"content\": \"After reviewing submitted evidence, the deliverables met 2 of 5 requirements. A 60% refund is awarded to the complainant.\"\n}\n```\n\nTags:\n\n* `d` (REQUIRED): Format `resolution_<dispute-claim-event-id>`. The `<dispute-claim-event-id>` is the SHA-256 event ID from the `e` tag referencing the claim. Using the event ID (a globally unique SHA-256 hash) guarantees uniqueness without requiring application-level identifiers.\n* `e` (REQUIRED): References the Dispute Claim event (`kind:7543`).\n* `ruling` (REQUIRED): One of:\n    * `full_refund` - complainant receives full refund\n    * `partial_refund` - complainant receives partial refund\n    * `no_refund` - accused party keeps payment\n    * `respondent_compensated` - accused party awarded additional compensation\n    * `mutual_release` - both parties agree to walk away\n    * `voided` - interaction voided entirely\n* `resolution_model` (REQUIRED): Model used (matches the claim's `resolution_model`).\n* `at_fault` (OPTIONAL): Pubkey of the party found at fault.\n* `refund_amount`, `refund_currency` (OPTIONAL): Refund details. Amount in smallest currency unit.\n* `resolved_at` (REQUIRED): Unix timestamp when the ruling was made.\n\n`content`: Reasoning and explanation for the ruling. Signed by the resolver's key.\n\n### REQ Filters\n\n```jsonc\n// Subscribe to resolutions for a specific dispute\n[\"REQ\", \"resolution\", {\"kinds\": [30545], \"#e\": [\"<dispute-claim-event-id>\"]}]\n\n// Subscribe to all resolutions by a specific resolver\n[\"REQ\", \"resolver-rulings\", {\"kinds\": [30545], \"authors\": [\"<resolver-pubkey>\"]}]\n```\n\n> **Privacy:** This event MUST be delivered via NIP-59 gift wrap. See [Privacy](#privacy).\n\n---\n\n## OPTIONAL Composition with NIP-ESCROW\n\nWhen disputes involve escrowed funds, applications MAY include stake outcome tags in the resolution event:\n\n* `complainant_stake_outcome` (OPTIONAL): Outcome of the complainant's escrowed stake. Example values: `released`, `partial_forfeit`, `full_forfeit`.\n* `accused_stake_outcome` (OPTIONAL): Outcome of the accused party's escrowed stake. Example values: `released`, `partial_forfeit`, `full_forfeit`.\n\nA resolution MAY trigger settlement (Lock to Settlement with `release_reason: dispute_resolved`). When a `kind:30545` resolution includes a refund ruling, the escrow system can use the resolution event as authorisation to release or forfeit funds. See [NIP-ESCROW](NIP-ESCROW.md).\n\n---\n\n## Composing with NIP-EVIDENCE\n\nDispute evidence SHOULD be submitted as [NIP-EVIDENCE](NIP-EVIDENCE.md) records (`kind:30578`). The `e` tag on the evidence record references the dispute claim event, linking evidence to the dispute.\n\n### Submitting Dispute Evidence\n\nA complainant submitting photographic evidence of a quality dispute:\n\n```json\n{\n    \"kind\": 30578,\n    \"pubkey\": \"<complainant-hex-pubkey>\",\n    \"created_at\": 1698771000,\n    \"tags\": [\n        [\"d\", \"<dispute-claim-event-id>:evidence:photo_01\"],\n        [\"t\", \"evidence-record\"],\n        [\"e\", \"<dispute-claim-event-id>\"],\n        [\"evidence_type\", \"photo\"],\n        [\"captured_at\", \"1698770500\"],\n        [\"file_hash\", \"sha256:a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2\"],\n        [\"g\", \"gcpuuz\"],\n        [\"p\", \"<accused-pubkey>\"],\n        [\"p\", \"<mediator-pubkey>\"]\n    ],\n    \"content\": \"Photo of delivered item showing visible damage to left panel. Compare with agreed specification in the original listing.\"\n}\n```\n\nAn accused party submitting a screenshot of the agreed terms:\n\n```json\n{\n    \"kind\": 30578,\n    \"pubkey\": \"<accused-hex-pubkey>\",\n    \"created_at\": 1698772000,\n    \"tags\": [\n        [\"d\", \"<dispute-claim-event-id>:evidence:screenshot_01\"],\n        [\"t\", \"evidence-record\"],\n        [\"e\", \"<dispute-claim-event-id>\"],\n        [\"evidence_type\", \"screenshot\"],\n        [\"captured_at\", \"1698772000\"],\n        [\"file_hash\", \"sha256:b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3\"],\n        [\"p\", \"<complainant-pubkey>\"],\n        [\"p\", \"<mediator-pubkey>\"]\n    ],\n    \"content\": \"Screenshot of original agreement showing the five deliverables. Items 1 and 2 were delivered as specified.\"\n}\n```\n\nA receipt submission for a pricing dispute:\n\n```json\n{\n    \"kind\": 30578,\n    \"pubkey\": \"<complainant-hex-pubkey>\",\n    \"created_at\": 1698771500,\n    \"tags\": [\n        [\"d\", \"<dispute-claim-event-id>:evidence:receipt_01\"],\n        [\"t\", \"evidence-record\"],\n        [\"e\", \"<dispute-claim-event-id>\"],\n        [\"evidence_type\", \"receipt\"],\n        [\"captured_at\", \"1698771500\"],\n        [\"file_hash\", \"sha256:c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"],\n        [\"p\", \"<accused-pubkey>\"],\n        [\"p\", \"<mediator-pubkey>\"]\n    ],\n    \"content\": \"Payment receipt showing 25000 SAT charged. The agreed price was 18000 SAT per the original quote.\"\n}\n```\n\n### Evidence `d` Tag Convention\n\nFor dispute evidence, the recommended `d` tag format is:\n\n```\n<dispute-claim-event-id>:evidence:<label>\n```\n\nThis links evidence to the dispute while ensuring each record has a unique `d` tag (append-only semantics). The `<label>` is author-chosen (e.g. `photo_01`, `screenshot_01`, `receipt_01`).\n\n### Discovering Dispute Evidence\n\nClients can discover all evidence for a dispute by filtering on the `e` tag:\n\n```json\n[\"REQ\", \"dispute-evidence\", {\"kinds\": [30578], \"#e\": [\"<dispute-claim-event-id>\"]}]\n```\n\n### Evidence Privacy\n\nWhen dispute evidence contains sensitive information, the NIP-EVIDENCE `content` field SHOULD be NIP-44 encrypted to the relevant parties. Evidence events MUST be delivered via NIP-59 gift wrap (one copy per recipient: complainant, accused, mediator). See [Privacy](#privacy).\n\n---\n\n## Protocol Flow\n\n\n![Dispute Lifecycle](https://raw.githubusercontent.com/forgesworn/nip-drafts/main/images/disputes-1.png)\n\n```mermaid\nsequenceDiagram\n    actor C as Complainant\n    actor A as Accused\n    participant R as Resolver\n\n    C-->>A: kind:7543 Dispute Claim (gift-wrapped)\n    Note left of C: Filed per application policy\n\n    rect rgb(27, 45, 61)\n        Note over C,A: Evidence phase (application-defined window)\n        C-->>R: kind:30578 Evidence (gift-wrapped)\n        A-->>R: kind:30578 Evidence (gift-wrapped)\n        Note over C,R: NIP-EVIDENCE records with e tag<br/>referencing the dispute claim\n    end\n\n    R-->>C: kind:30545 Resolution (gift-wrapped)\n    R-->>A: kind:30545 Resolution (gift-wrapped)\n    Note right of R: Ruling with reasoning\n```\n\n> **Arrow legend:** `-->>` dashed = NIP-59 gift-wrapped (private)\n\n1. **Filing:** Complainant publishes `kind:7543` referencing the disputed event.\n2. **Evidence:** Both parties submit `kind:30578` evidence records (NIP-EVIDENCE).\n3. **Ruling:** Resolver publishes `kind:30545` resolution with reasoning.\n4. **Settlement:** Applications handle settlement per the ruling (e.g. escrow release, access restoration, policy update).\n\n### State Transitions\n\n```mermaid\nflowchart TD\n    EV[\"Event Published\"] --> CF[\"Claim Filed\\nkind:7543\"]\n    CF --> ES[\"Evidence Submission\\nkind:30578 (NIP-EVIDENCE)\"]\n    ES --> RU[\"Resolution\\nkind:30545\"]\n    RU --> SE[\"Resolved\"]\n\n    style CF fill:#2d2d1b,stroke:#f5a623\n    style ES fill:#2d2d1b,stroke:#f5a623\n    style RU fill:#1b3d2d,stroke:#16c79a\n    style SE fill:#1b3d2d,stroke:#16c79a\n```\n\nLegend: <span style=\"color:#ffc107\">**yellow**</span> = in progress, <span style=\"color:#28a745\">**green**</span> = terminal\n\n### Enforcement Note\n\nThe state transitions above are **client-side guidance**, not relay-enforced constraints. Nothing in the Nostr protocol prevents out-of-order event publication (e.g. a resolution before the evidence phase ends). Clients SHOULD validate state transitions and reject or flag events that arrive out of sequence. Relays have no mechanism to enforce ordering across event kinds.\n\n## Use Cases\n\n### Marketplace Purchase Disputes\nBuyer and seller disagree on item condition. Dispute claim (`kind:7543`) references the original listing or order event. Evidence records (`kind:30578`) include photos with file hashes. A designated mediator issues resolution (`kind:30545`).\n\n### Freelance Contract Disputes\nClient claims deliverable does not match brief. Structured dispute flow with evidence and optional mediation replaces unstructured DM arguments.\n\n### Content Moderation Disputes\nA relay or community moderator removes a note. The author files a dispute claim (`kind:7543`) referencing the removal event, with `dispute_type` set to `moderation` and `resolution_model` set to `mutual` or `mediator`. Evidence might include the original note content and the community guidelines. The resolution documents whether the removal stands or is reversed.\n\n### Group Governance Disputes\nA member of a NIP-29 group disagrees with an admin action (e.g. role change, channel deletion). The member files a claim referencing the admin event. A governance body or elected mediator reviews the group's charter and issues a resolution. The group client can use the resolution event to trigger policy changes.\n\n### Rental Damage Claims\nLandlord claims damage after checkout. Tenant submits counter-evidence (pre-checkout photos as `kind:30578` records). Third-party mediator reviews both sides.\n\n### Content Takedown Appeals\nCreator disputes a content removal. The creator submits counter-evidence via NIP-EVIDENCE. Resolution documents the outcome for transparency.\n\n## Security Considerations\n\n* **Evidence integrity.** NIP-EVIDENCE records include `file_hash` tags with SHA-256 hashes for tamper detection. Implementations SHOULD verify hashes against submitted files and reject mismatches.\n* **Encrypted evidence.** Evidence content SHOULD be NIP-44 encrypted to dispute participants only. Relays see event metadata (kind, tags, pubkeys) but cannot read evidence content.\n* **Resolver accountability.** Resolutions are signed events; the resolver's pubkey is transparent and their ruling history is publicly auditable. Clients MAY display resolver statistics (rulings issued, appeal rate, average resolution time).\n* **Immutability guarantees.** Dispute claims (`kind:7543`) are regular events; relays cannot replace them once published. This ensures complaints are tamper-proof at the protocol level. Resolutions (`kind:30545`) remain addressable to allow corrections before settlement.\n* **Spam prevention.** Without filing constraints at the protocol level, applications SHOULD implement their own rate limiting, staking requirements, or reputation gates to prevent dispute spam.\n\n## Privacy\n\nDispute events contain sensitive information: accusations, evidence, rulings, and fault determinations. These MUST NOT be visible to relay operators or passive observers. All dispute events MUST be delivered privately using [NIP-59](https://github.com/nostr-protocol/nips/blob/master/59.md) gift wrap.\n\n### Gift-wrap requirements\n\n| Kind | Event | Requirement | Recipients |\n|------|-------|-------------|------------|\n| 7543 | Dispute Claim | MUST gift-wrap | Complainant, accused, mediator (if known) |\n| 30578 | Dispute Evidence (NIP-EVIDENCE) | MUST gift-wrap | Complainant, accused, mediator |\n| 30545 | Dispute Resolution | MUST gift-wrap | Complainant, accused |\n\nThe inner event (the sealed rumour) retains its full tag structure; gift wrap provides the privacy layer, not tag restructuring. Recipients unwrap the NIP-59 envelope to access the original event.\n\nEvidence (`kind:30578`) content MAY additionally be NIP-44 encrypted pairwise to each gift-wrap recipient. This provides defence in depth: even if the gift-wrap envelope is compromised, the content remains encrypted. Each gift-wrapped copy carries content encrypted to that specific recipient; NIP-44 is pairwise and a single ciphertext cannot be decrypted by multiple keys.\n\n### Metadata minimisation\n\nImplementations SHOULD include only the tags marked REQUIRED or RECOMMENDED in each event kind. Optional tags (`domain`, `amount_disputed`, `currency`) increase the metadata surface; omit them unless the application specifically needs them.\n\n## Test Vectors\n\n### Dispute Claim (kind 7543)\n\n```json\n{\n    \"kind\": 7543,\n    \"pubkey\": \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2\",\n    \"created_at\": 1698770000,\n    \"tags\": [\n        [\"p\", \"b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3\"],\n        [\"e\", \"c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"],\n        [\"alt\", \"Dispute claim: quality issue in freelance engagement\"],\n        [\"dispute_type\", \"quality\"],\n        [\"resolution_model\", \"mediator\"],\n        [\"mediator\", \"d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5\"],\n        [\"domain\", \"freelance\"],\n        [\"t\", \"domain:freelance\"],\n        [\"amount_disputed\", \"25000\"],\n        [\"currency\", \"SAT\"]\n    ],\n    \"content\": \"Deliverables did not match the agreed specification. Three of five requirements were not addressed.\"\n}\n```\n\nExpected validation:\n- `kind` is 7543 (regular event, immutable)\n- `p` tag present (accused pubkey)\n- `e` tag present (referenced event)\n- `dispute_type` tag present (application-defined value)\n- `resolution_model` tag present (application-defined value)\n- `mediator` tag present when `resolution_model` is `mediator`\n\n### Dispute Resolution (kind 30545)\n\n```json\n{\n    \"kind\": 30545,\n    \"pubkey\": \"d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5\",\n    \"created_at\": 1698775000,\n    \"tags\": [\n        [\"d\", \"resolution_e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6\"],\n        [\"e\", \"e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6\"],\n        [\"alt\", \"Dispute resolution: partial refund of 15000 SAT\"],\n        [\"ruling\", \"partial_refund\"],\n        [\"resolution_model\", \"mediator\"],\n        [\"at_fault\", \"b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3\"],\n        [\"refund_amount\", \"15000\"],\n        [\"refund_currency\", \"SAT\"],\n        [\"resolved_at\", \"1698775000\"]\n    ],\n    \"content\": \"After reviewing submitted evidence, the deliverables met 2 of 5 requirements. A 60% refund is awarded to the complainant.\"\n}\n```\n\nExpected validation:\n- `kind` is 30545 (addressable event)\n- `d` tag starts with `resolution_`\n- `e` tag present (dispute claim reference)\n- `ruling` is one of the six permitted values\n- `resolution_model` matches the claim's model\n- `resolved_at` is a valid Unix timestamp\n- `pubkey` matches the mediator nominated in the claim (when `resolution_model` is `mediator`)\n\n## Dependencies\n\n* [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md): Basic protocol flow, regular and addressable events\n* [NIP-32](https://github.com/nostr-protocol/nips/blob/master/32.md): Labelling (abuse categorisation via NIP-56)\n* [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md): Versioned encrypted payloads\n* [NIP-56](https://github.com/nostr-protocol/nips/blob/master/56.md): Reporting (application-layer abuse detection)\n* [NIP-59](https://github.com/nostr-protocol/nips/blob/master/59.md): Gift wrap (private delivery of dispute events)\n* [NIP-EVIDENCE](NIP-EVIDENCE.md): Timestamped evidence recording (dispute evidence submission)\n\n## Reference Implementation\n\nNo public reference implementation exists yet. Implementors SHOULD refer to the kind definitions above.\n\nA minimal implementation requires:\n\n1. A Nostr client that supports regular and addressable event publishing, NIP-44 encryption, and NIP-59 gift wrap.\n2. A dispute management interface for filing claims and viewing resolutions.\n3. Resolver tooling for reviewing evidence and publishing rulings.\n4. NIP-EVIDENCE integration for submitting and discovering dispute evidence (`kind:30578`).","sig":"f179e3b34c505d6563ec976b24b22e765c33dce7e12d4dedec904db801211d6339d1e56063832baeed484bcd78711cc563f0673f8b5c20d6e3b59852f61a9341"}