You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: rename author to issuer with URI-based identity
Replace the opaque `author` string with `issuer`, a URI-based identity
field (`mailto:`, `https:`, `urn:qualifier:`). Rename `author_type` to
`issuer_type` and `AuthorType` to `IssuerType`. This is a breaking
change to the Metabox envelope — all content-addressed IDs change due
to the MCF field rename and body field reordering.
2.**Body fields** are sorted lexicographically by key. Sorting is recursive:
131
131
nested objects also have their keys sorted lexicographically.
132
132
@@ -192,22 +192,22 @@ define:
192
192
A Qualifier attestation in Metabox format:
193
193
194
194
```json
195
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8","body":{"author_type":"human","kind":"concern","ref":"git:3aba500","score":-30,"summary":"Panics on malformed input"}}
195
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8","body":{"issuer_type":"human","kind":"concern","ref":"git:3aba500","score":-30,"summary":"Panics on malformed input"}}
196
196
```
197
197
198
-
Note that body fields are sorted lexicographically: `author_type`, `kind`,
198
+
Note that body fields are sorted lexicographically: `issuer_type`, `kind`,
|`kind`| string | yes | The type of attestation (see 2.7) |
218
218
|`ref`| string | no | VCS reference pin (e.g., `"git:3aba500"`). Opaque to qualifier. |
219
219
|`score`| integer | yes | Signed quality delta, -100..100 |
@@ -229,14 +229,14 @@ Canonical Form (MCF) serialization order.
229
229
**Example:**
230
230
231
231
```json
232
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-25T10:00:00Z","id":"a1b2c3d4...","body":{"author_type":"human","kind":"concern","ref":"git:3aba500","score":-10,"span":{"start":{"line":42},"end":{"line":58}},"suggested_fix":"Use the ? operator instead of unwrap()","summary":"Panics on malformed input","tags":["robustness"]}}
232
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-25T10:00:00Z","id":"a1b2c3d4...","body":{"issuer_type":"human","kind":"concern","ref":"git:3aba500","score":-10,"span":{"start":{"line":42},"end":{"line":58}},"suggested_fix":"Use the ? operator instead of unwrap()","summary":"Panics on malformed input","tags":["robustness"]}}
233
233
```
234
234
235
235
**Shorthand (equivalent):** Since `type` defaults to `"attestation"`, it may
236
236
be omitted:
237
237
238
238
```json
239
-
{"metabox":"1","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-25T10:00:00Z","id":"a1b2c3d4...","body":{"kind":"concern","score":-10,"summary":"Panics on malformed input"}}
239
+
{"metabox":"1","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-25T10:00:00Z","id":"a1b2c3d4...","body":{"kind":"concern","score":-10,"summary":"Panics on malformed input"}}
240
240
```
241
241
242
242
### 2.7 Attestation Kinds
@@ -303,7 +303,7 @@ obey the following rules:
303
303
-`id` MUST be set to `""` (the empty string).
304
304
305
305
2.**Envelope field order.** Envelope fields MUST appear in this fixed order:
3.**Body field order.** Body fields MUST appear in lexicographic
309
309
(alphabetical) order. Nested objects (like `span`) also have their fields
@@ -332,13 +332,13 @@ See the [Metabox specification](METABOX.md) for the full MCF definition.
332
332
Given an attestation with no optional body fields, the MCF is:
333
333
334
334
```json
335
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"","body":{"kind":"concern","score":-30,"summary":"Panics on malformed input"}}
335
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"","body":{"kind":"concern","score":-30,"summary":"Panics on malformed input"}}
336
336
```
337
337
338
-
With a span and author_type:
338
+
With a span and issuer_type:
339
339
340
340
```json
341
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"","body":{"author_type":"human","kind":"concern","score":-30,"span":{"start":{"line":42},"end":{"line":42}},"summary":"Panics on malformed input"}}
341
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"","body":{"issuer_type":"human","kind":"concern","score":-30,"span":{"start":{"line":42},"end":{"line":42}},"summary":"Panics on malformed input"}}
342
342
```
343
343
344
344
Note that `span.end` has been materialized (it was omitted in the input,
@@ -401,8 +401,8 @@ All layouts are backwards-compatible and can coexist in the same project.
401
401
**Example (mixed record types):**
402
402
403
403
```jsonl
404
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"a1b2c3d4...","body":{"author_type":"human","kind":"concern","ref":"git:3aba500","score":-30,"span":{"start":{"line":42},"end":{"line":58}},"suggested_fix":"Replace .unwrap() with proper error propagation","summary":"Panics on malformed UTF-8 input","tags":["robustness","error-handling"]}}
405
-
{"metabox":"1","type":"attestation","subject":"src/parser.rs","author":"bob@example.com","created_at":"2026-02-24T11:00:00Z","id":"e5f6a7b8...","body":{"author_type":"human","kind":"praise","score":40,"summary":"Excellent property-based test coverage","tags":["testing"]}}
404
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:alice@example.com","created_at":"2026-02-24T10:00:00Z","id":"a1b2c3d4...","body":{"issuer_type":"human","kind":"concern","ref":"git:3aba500","score":-30,"span":{"start":{"line":42},"end":{"line":58}},"suggested_fix":"Replace .unwrap() with proper error propagation","summary":"Panics on malformed UTF-8 input","tags":["robustness","error-handling"]}}
405
+
{"metabox":"1","type":"attestation","subject":"src/parser.rs","issuer":"mailto:bob@example.com","created_at":"2026-02-24T11:00:00Z","id":"e5f6a7b8...","body":{"issuer_type":"human","kind":"praise","score":40,"summary":"Excellent property-based test coverage","tags":["testing"]}}
|`author_type`| string | no | Always `"tool"` for epochs |
424
+
|`issuer_type`| string | no | Always `"tool"` for epochs |
425
425
|`refs`| string[]| yes | IDs of the compacted records |
426
426
|`score`| integer | yes | Raw score at compaction time |
427
427
|`span`| object | no | Sub-artifact range |
428
428
|`summary`| string | yes |`"Compacted from N records"`|
429
429
430
-
Epoch records MUST set `author` to `"qualifier/compact"`.
430
+
Epoch records MUST set `issuer` to `"urn:qualifier:compact"`.
431
431
432
432
**Example:**
433
433
434
434
```json
435
-
{"metabox":"1","type":"epoch","subject":"src/parser.rs","author":"qualifier/compact","created_at":"2026-02-25T12:00:00Z","id":"f9e8d7c6...","body":{"author_type":"tool","refs":["a1b2...","c3d4..."],"score":10,"summary":"Compacted from 12 records"}}
435
+
{"metabox":"1","type":"epoch","subject":"src/parser.rs","issuer":"urn:qualifier:compact","created_at":"2026-02-25T12:00:00Z","id":"f9e8d7c6...","body":{"issuer_type":"tool","refs":["a1b2...","c3d4..."],"score":10,"summary":"Compacted from 12 records"}}
436
436
```
437
437
438
438
Epoch records are treated as normal scored records by the scoring engine. The
0 commit comments