Problem
divine-web's useReportContent() hook puts app-level reason strings directly in the e/p tag 3rd element (e.g., csam, sexual-content, harassment). NIP-56 requires one of 7 standard types: nudity, malware, profanity, illegal, spam, impersonation, other.
divine-web already emits NIP-32 l/L tags correctly (['L', 'social.nos.ontology'] + ['l', 'NS-csam', 'social.nos.ontology']), so the app-level reason is already preserved in a structured, queryable tag. The only change needed is mapping the e/p tag 3rd element to NIP-56 standard types.
Current (non-compliant)
["e", "<eventId>", "csam"]
Expected (NIP-56 compliant)
["e", "<eventId>", "illegal"]
The l/L tags already carry the app-level reason, so no information is lost.
Mapping needed
Same as divine-mobile's _toNip56ReportType():
| App reason |
NIP-56 type |
| csam |
illegal |
| violence |
illegal |
| copyright |
illegal |
| harassment |
profanity |
| sexual-content |
nudity |
| false-info |
other |
| ai-generated |
other |
| spam |
spam |
| impersonation |
impersonation |
| illegal |
illegal |
| other |
other |
Related
Problem
divine-web's
useReportContent()hook puts app-level reason strings directly in the e/p tag 3rd element (e.g.,csam,sexual-content,harassment). NIP-56 requires one of 7 standard types:nudity,malware,profanity,illegal,spam,impersonation,other.divine-web already emits NIP-32 l/L tags correctly (
['L', 'social.nos.ontology']+['l', 'NS-csam', 'social.nos.ontology']), so the app-level reason is already preserved in a structured, queryable tag. The only change needed is mapping the e/p tag 3rd element to NIP-56 standard types.Current (non-compliant)
Expected (NIP-56 compliant)
The l/L tags already carry the app-level reason, so no information is lost.
Mapping needed
Same as divine-mobile's
_toNip56ReportType():Related
docs/superpowers/specs/2026-04-27-report-reason-label-tags-design.md