Change verifier statement kind to 14672

This commit is contained in:
Alex Gleason
2026-06-12 12:55:00 -05:00
parent b271c4e889
commit 59c0d25fa6
4 changed files with 13 additions and 13 deletions
+8 -8
View File
@@ -15,7 +15,7 @@
| 33863 | Campaign | Self-authored fundraising campaign with a single Bitcoin wallet endpoint (`bc1...` or `sp1...`) | | 33863 | Campaign | Self-authored fundraising campaign with a single Bitcoin wallet endpoint (`bc1...` or `sp1...`) |
| 30385 | Community Stats Snapshot | Pre-computed per-country / global community leaderboards | | 30385 | Community Stats Snapshot | Pre-computed per-country / global community leaderboards |
| 36639 | Pledge | Donor pledge for concrete submissions, stored as sats | | 36639 | Pledge | Donor pledge for concrete submissions, stored as sats |
| 15063 | Verifier Statement | Self-authored statement describing how the author verifies campaigns (one per user) | | 14672 | Verifier Statement | Self-authored statement describing how the author verifies campaigns (one per user) |
### Agora Protocols ### Agora Protocols
@@ -741,7 +741,7 @@ Fold by `(coord, moderator)`, keeping the newest label per pair. A campaign is "
--- ---
## Kind 15063: Verifier Statement ## Kind 14672: Verifier Statement
### Summary ### Summary
@@ -749,13 +749,13 @@ Replaceable event kind for a **self-authored statement describing how the author
Exactly one statement per user (replaceable, no `d` tag): publishing a new event replaces the previous one. Clients surface the statement prominently on the author's profile page. Exactly one statement per user (replaceable, no `d` tag): publishing a new event replaces the previous one. Clients surface the statement prominently on the author's profile page.
This kind is **distinct from** the `agora.verified` campaign-verification labels (kind 1985, see Kind 33863 above). Those are moderator-signed, gated by the Team Soapbox follow pack, and vouch for one specific campaign. A kind 15063 statement is an open, self-published description of an author's *general* verification methodology and confers no special authority — it is a reputation signal donors read, not an access-control mechanism. This kind is **distinct from** the `agora.verified` campaign-verification labels (kind 1985, see Kind 33863 above). Those are moderator-signed, gated by the Team Soapbox follow pack, and vouch for one specific campaign. A kind 14672 statement is an open, self-published description of an author's *general* verification methodology and confers no special authority — it is a reputation signal donors read, not an access-control mechanism.
### Event Structure ### Event Structure
```json ```json
{ {
"kind": 15063, "kind": 14672,
"pubkey": "<author-pubkey>", "pubkey": "<author-pubkey>",
"content": "I personally visit each campaign organizer over video call, confirm their identity against a government ID, and cross-check the cause with at least two independent local sources before I vouch for it. ...", "content": "I personally visit each campaign organizer over video call, confirm their identity against a government ID, and cross-check the cause with at least two independent local sources before I vouch for it. ...",
"tags": [ "tags": [
@@ -776,24 +776,24 @@ The `content` field is the verifier statement, formatted as **Markdown**. Client
| `alt` | Recommended | NIP-31 human-readable fallback describing the event's purpose. | | `alt` | Recommended | NIP-31 human-readable fallback describing the event's purpose. |
| `t` | Optional | Agora content marker (`t:agora`). Added at publish time via `withAgoraTag`. | | `t` | Optional | Agora content marker (`t:agora`). Added at publish time via `withAgoraTag`. |
The statement carries no queryable fields beyond the author and kind — it is identified entirely by `(15063, pubkey)`. The statement carries no queryable fields beyond the author and kind — it is identified entirely by `(14672, pubkey)`.
### Querying ### Querying
**Fetch a user's verifier statement:** **Fetch a user's verifier statement:**
```json ```json
{ "kinds": [15063], "authors": ["<pubkey>"], "limit": 1 } { "kinds": [14672], "authors": ["<pubkey>"], "limit": 1 }
``` ```
Clients MUST filter by `authors` — a verifier statement only describes the diligence of the pubkey that signed it, so an unfiltered query would be meaningless (and would let anyone's statement be attributed to anyone). Clients MUST filter by `authors` — a verifier statement only describes the diligence of the pubkey that signed it, so an unfiltered query would be meaningless (and would let anyone's statement be attributed to anyone).
### Client Behavior ### Client Behavior
- **Becoming a verifier:** a user publishes a kind 15063 event with their statement in `content`. No approval, allowlist, or moderation gate applies. - **Becoming a verifier:** a user publishes a kind 14672 event with their statement in `content`. No approval, allowlist, or moderation gate applies.
- **Withdrawing:** a user republishes the event with empty `content`, or publishes a NIP-09 kind 5 deletion referencing the event. Either way clients stop rendering the verifier section. - **Withdrawing:** a user republishes the event with empty `content`, or publishes a NIP-09 kind 5 deletion referencing the event. Either way clients stop rendering the verifier section.
- **Rendering:** clients SHOULD surface the statement prominently on the author's profile (e.g. a dedicated "Verifier" section in the profile overview), rendering the Markdown content sanitized. - **Rendering:** clients SHOULD surface the statement prominently on the author's profile (e.g. a dedicated "Verifier" section in the profile overview), rendering the Markdown content sanitized.
- **Editing:** because the kind is replaceable, the latest event per `(15063, pubkey)` wins. Clients performing an edit SHOULD pass the previous event as `prev` so `published_at` is preserved (NIP-23 convention). - **Editing:** because the kind is replaceable, the latest event per `(14672, pubkey)` wins. Clients performing an edit SHOULD pass the previous event as `prev` so `published_at` is preserved (NIP-23 convention).
--- ---
@@ -390,7 +390,7 @@ export function ProfileOverviewSections({
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div className={cn('flex flex-col gap-5', className)}> <div className={cn('flex flex-col gap-5', className)}>
{/* Verifier statement (kind 15063) — surfaced first so donors can {/* Verifier statement (kind 14672) — surfaced first so donors can
immediately see how this account verifies campaigns. Renders immediately see how this account verifies campaigns. Renders
nothing when the profile has not published a statement. */} nothing when the profile has not published a statement. */}
<ProfileVerifierSection pubkey={pubkey} /> <ProfileVerifierSection pubkey={pubkey} />
@@ -12,7 +12,7 @@ interface ProfileVerifierSectionProps {
} }
/** /**
* Renders a profile's kind 15063 verifier statement — a self-published * Renders a profile's kind 14672 verifier statement — a self-published
* explanation of how the account verifies campaigns. Surfaced prominently * explanation of how the account verifies campaigns. Surfaced prominently
* in the profile overview so donors can judge whether to trust the * in the profile overview so donors can judge whether to trust the
* account's verifications. * account's verifications.
+3 -3
View File
@@ -7,16 +7,16 @@ import { fetchFreshEvent } from '@/lib/fetchFreshEvent';
import { withAgoraTag } from '@/lib/agoraNoteTags'; import { withAgoraTag } from '@/lib/agoraNoteTags';
/** /**
* Kind 15063 — Verifier Statement (see NIP.md). * Kind 14672 — Verifier Statement (see NIP.md).
* *
* A replaceable event (one per user) whose `content` is a freeform Markdown * A replaceable event (one per user) whose `content` is a freeform Markdown
* statement describing how the author verifies campaigns. Anyone can publish * statement describing how the author verifies campaigns. Anyone can publish
* one to "become a verifier"; empty content means the author has withdrawn. * one to "become a verifier"; empty content means the author has withdrawn.
*/ */
export const VERIFIER_STATEMENT_KIND = 15063; export const VERIFIER_STATEMENT_KIND = 14672;
/** /**
* Query a user's verifier statement (kind 15063). * Query a user's verifier statement (kind 14672).
* *
* Returns the trimmed Markdown statement, or `null` when the user has no * Returns the trimmed Markdown statement, or `null` when the user has no
* statement or has withdrawn it (empty content). * statement or has withdrawn it (empty content).