upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/C1.md
blob: 2b9ffab675d0e8e74f6c9104f49f2a18ef7159d4 (plain)
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}`