1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
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": "<creator-pubkey>",
"tags": [
["d", "<identifier>"],
["k", "<target-kind>"],
["p", "<owner-1-pubkey>"],
["p", "<owner-2-pubkey>"],
["p", "<owner-3-pubkey>"]
],
"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": <target-kind>,
"pubkey": "<owner-pubkey>",
"tags": [
["d", "<identifier>"],
["a", "39382:<pointer-creator-pubkey>:<identifier>"]
],
"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": [<target-kind>], "authors": [<all-owners>], "#d": ["<identifier>"], "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}`
|