NIP-C1 ====== Collaborative Ownership ----------------------- `draft` `optional` This NIP defines a mechanism for multiple pubkeys to collaboratively maintain events. ## Motivation Certain applications require shared ownership where: 1. **Attribution matters**: Each collaborator signs with their own key 2. **Dynamic membership**: Owners can be added or removed 3. **Backwards compatibility**: Non-supporting clients see normal events ## Specification ### Collaborative Pointer Event An addressable event kind `39382` serves as a pointer to collaboratively-owned content: ```jsonc { "kind": 39382, "pubkey": "", "tags": [ ["d", ""], ["k", ""], ["p", ""], ["p", ""], ["p", ""] ], "content": "", "created_at": 1234567890 } ``` #### Tag Definitions | Tag | Required | Description | |-----|----------|-------------| | `d` | Yes | Shared identifier for the collaborative content | | `k` | Yes | Target event kind (any kind) | | `p` | Yes | Owner pubkeys (one or more) | The creator's pubkey is implicitly an owner. ### Target Events Any event kind MAY be a target of collaborative ownership. All target events: - MUST include a `d` tag matching the pointer's `d` tag - MUST include an `a` tag referencing the `39382` pointer event ```jsonc { "kind": , "pubkey": "", "tags": [ ["d", ""], ["a", "39382::"] ], "content": "..." } ``` ### Resolution Algorithm To resolve the current state of collaboratively-owned content: 1. Collect owners from the `39382` pointer's `p` tags (plus the pointer's pubkey) 2. Query: `{"kinds": [], "authors": [], "#d": [""], "limit": 1}` 3. Return the most recent event ## Client Behavior ### Co-Author Attribution Clients SHOULD NOT display co-author attribution for a target event unless: 1. The event contains an `a` tag referencing a `39382` pointer event, **and** 2. The event's author pubkey appears in that pointer's `p` tags (or is the pointer's creator) An event without a verifiable `a` tag backlink to a `39382` pointer MUST NOT be presented as collaboratively authored. This prevents spoofed co-authorship claims. ## Example ### Pointer Event ```jsonc { "kind": 39382, "pubkey": "alice-pubkey", "tags": [ ["d", "collaborative-guide"], ["k", "30023"], ["p", "bob-pubkey"], ["p", "carol-pubkey"] ], "content": "" } ``` ### Target Event (by any owner) ```jsonc { "kind": 30023, "pubkey": "bob-pubkey", "tags": [ ["d", "collaborative-guide"], ["title", "A Collaborative Guide"], ["a", "39382:alice-pubkey:collaborative-guide"] ], "content": "..." } ``` ### Client Resolution 1. Client receives the `39382` pointer 2. Owners: `[alice, bob, carol]`, target kind: `30023` 3. Queries: `{"kinds": [30023], "authors": ["alice", "bob", "carol"], "#d": ["collaborative-guide"], "limit": 1}`