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
Publish refusals: declare failed[].issues + seedApplied.issues, then trim error to a headline (#10895)
* fix(metadata-protocol): publish refusals state a headline; the prose rides the declared issues[] channel
Declare-then-trim (#10524): PublishPackageDraftsResponseSchema's failed[]
element declares the issues[] the producer has emitted since #8333, and
seedApplied declares the seed refusal's issues[]; then the #4463 gate's 422
message and seedRequestValidationError's message shrink to one-sentence
headlines (count + path [rule|code] locators) instead of restating the prose
the structured channel carries.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yDEhPBC3tcGkW9bkce1HM
* chore: changeset + regenerated spec artifacts for #10524
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yDEhPBC3tcGkW9bkce1HM
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/references/api/protocol.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1248,7 +1248,7 @@ List packages response
1248
1248
|**publishedCount**|`integer`| ✅ | Number of drafts promoted to active — `published.length`. 0 on every refusal path (the batch is all-or-nothing, ADR-0067 D2). |
1249
1249
|**failedCount**|`integer`| ✅ | Number of items that did not publish — `failed.length`. On a rollback this counts the WHOLE batch: the causal item plus every sibling marked BATCH_ABORTED. |
1250
1250
|**published**|`{ type: string; name: string; version: string; advisories?: object[] }[]`| ✅ | Every draft promoted to active, in publish order. Empty on every refusal path. |
1251
-
|**failed**|`{ type: string; name: string; error: string; code?: string }[]`| ✅ | Items that did not publish. Because the batch is all-or-nothing (ADR-0067 D2), a non-empty list means NOTHING landed: `published: []`, `publishedCount: 0`. |
1251
+
|**failed**|`{ type: string; name: string; error: string; code?: string; … }[]`| ✅ | Items that did not publish. Because the batch is all-or-nothing (ADR-0067 D2), a non-empty list means NOTHING landed: `published: []`, `publishedCount: 0`. |
1252
1252
|**seedApplied**|`{ success: boolean; inserted?: integer; updated?: integer; error?: string; … }`| optional | Aggregate outcome of materializing EVERY published `seed` body in one multi-pass loader run (cross-seed references need the whole set). Present ONLY when the batch published at least one seed. Two producers, one key: the batch itself self-applies (`applySeedBodies`), and the REST door back-fills the same key for custom protocols that do not — never both (an externalId-less seed would double-insert). Best-effort: a seed problem is surfaced here, never thrown. |
1253
1253
|**materializeApplied**|`{ success: boolean; inserted: integer; updated: integer; failures: object[] }`| optional | ADR-0086 P2 — aggregate result of publish-time materializers across the batch (e.g. `permission` → `sys_permission_set`), including side-effect failures surfaced by the per-item effects loop. Present ONLY when at least one published item had a registered materializer or a side-effect failure. Best-effort, same contract as `seedApplied`. |
1254
1254
|**probes**|`any`| optional | ADR-0038 L3 post-publish runtime probe report — one real read per published artifact (seeded objects have rows, views are readable, widget dataset selections execute). DELIBERATELY OPAQUE in this contract (#9406): the key is declared and carried through verbatim, but its inner shape is intentionally not modeled until a consumer needs a field of it. Present only when something was publishable; probes never fail the publish. |
0 commit comments