ONP-2700
Open News Protocol (ONP): Corrections
Abstract
This document defines the Corrections Companion:
content_type = "onp:companion:corrections", the structured,
human-readable explanation layer ONP-0006 Section 4.5 promised but
deliberately did not build: a Corrections Object pins precisely to
one exact prior Version and one exact fixing Version (using the VID
reference form ONP-2000 Section 4.3 was generalized to support while
this document was being designed), states a correction type, and
gives a full explanation. Unlike every other Companion published so
far, the reference direction runs from the Corrections Object to
the Article it explains, not the other way around — a design already
anticipated in ONP-2100's references before this document existed to
confirm it.
Status of This Document
This document is part of the ONP Companion series (ONP-2000-2999).
It is directly implementable. Concurrently with its publication,
ONP-2100 (Article) is updated with a new OPTIONAL, discovery-only
corrections_ref field (Section 10.3). It is a Working Draft.
Change note (v0.1.1): corrected Sections 2.2, 4.7, and 10.2, which had informally pointed to ONP-3200 (Search) as the future home for correction discovery. ONP-3200 was published addressing indexing consent and result snippets only; it does not define any enumeration or ranking mechanism and never resolved this limitation. No wording elsewhere in this document depended on that assumption. Classified PATCH under ONP-0007 Section 4.2, rule 3: purely editorial, no normative requirement changed.
Normative Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174], per the interpretation established in ONP-0000.
1. Introduction
ONP-0006 Section 4.5 gave every Article a lightweight
revision_reason string and explicitly deferred anything richer to
this document. A one-line reason is enough to note that something
changed; it is not enough to actually explain what was wrong, how
serious it was, or how it was fixed — the kind of accountable,
structured correction record wire services and major newsrooms
already maintain by convention, and that ONP-0000 Section 1.1 named
as part of the original problem: "rechten en licenties gaan verloren
bij herpublicatie" applies just as much to correction history, which
today lives, if anywhere, in a separate database disconnected from
the Object it concerns.
2. Scope
2.1 In Scope
- the
onp:companion:correctionscontent schema; - VID-pinned referencing of the exact corrected and correcting Versions;
- the reversed reference direction (Corrections Object -> Article) and the discovery limitation that follows from it;
- the cross-check a Node MAY perform against an Article's own
supersedeschain.
2.2 Out of Scope
This document does NOT define:
- a mechanism for discovering every Corrections Object that concerns a given Article — that remains a search/indexing problem with no current owning document (ONP-3200 addresses indexing consent and search-result snippets only, not enumeration or ranking, and does not solve it either), not solved here (Section 4.7);
- any correction taxonomy beyond the small enum in Section 4.5 —
publishers with more elaborate internal classification MAY extend
via
onp:extensions, not by redefiningcorrection_type; - retraction itself, which remains a Core-level lifecycle concept (ONP-0006 Section 4.4) — a Corrections Object MAY explain a retraction, but does not perform one.
3. Terminology
This document is the owning specification for the following terms.
Corrections Object
: An informal name for a News Object whose content_type is
onp:companion:corrections.
Corrected Version : The exact, VID-pinned prior Version a Corrections Object identifies as having contained the error.
Correcting Version : The exact, VID-pinned Version that fixed it.
4. Requirements
4.1 content_type Declaration
Every Corrections Object MUST declare content_type as exactly
onp:companion:corrections.
4.2 Companion-vs-Extension Classification
Does "Correction" have independent identity and an independent
lifecycle, separable from the Article it explains?
- A correction record can be independently referenced (e.g. by a
media-accountability or corrections-tracking service cataloguing
patterns across publishers) without needing the Article's own
content.
- A correction explanation can itself, in principle, be revised
later (e.g. a more complete account of why an error occurred),
independently of the Article's own Version lineage.
- YES -> Companion.
4.3 Content Schema
subject_oidis REQUIRED: the OID of the Article (or other content Companion Object) this correction concerns.corrected_vidis REQUIRED: a VID-form Object Reference (ONP-2000 Section 4.3) identifying the exact prior Version that was in error.correcting_vidis REQUIRED: a VID-form Object Reference identifying the exact Version that fixed it.correction_typeis REQUIRED, per Section 4.5.explanationis REQUIRED: a string in the Safe Markdown Subset (ONP-2100 Section 4.4), reused here for the same XSS-prevention rationale.corrected_atis REQUIRED: an ISO 8601 timestamp for when the correction was published — distinct from, and possibly later than,correcting_vid's ownsigned_at.
4.4 VID Pinning
corrected_vid and correcting_vid MUST use VID form, not OID form
(ONP-2000 Section 4.3, as generalized concurrently with this
document's publication). Pinning to the exact, immutable Version is
the entire point: a Corrections Object describes a specific
historical transition, not "whatever this lineage's Current Version
happens to be" — which would drift out of accuracy the moment a
further, unrelated Version is published.
4.5 Correction Type
correction_type MUST be one of: "factual" (an error of fact),
"clarification" (accurate but potentially misleading, now
clarified), "typographical" (a non-substantive text error),
"retraction" (explains a Core-level retraction, ONP-0006 Section
4.4, without itself performing one), or "update" (a routine,
non-error update, e.g. adding information as a developing story
progresses).
4.6 Reference Direction
- The authoritative relationship runs from the Corrections Object to
the Article:
subject_oid,corrected_vid, andcorrecting_vidare what establish the connection, not any field on the Article itself. - An Article's OPTIONAL
corrections_ref(ONP-2100 Section 4.12, added concurrently, Section 10.3) is a discovery convenience only, populated at the publisher's option when a new, correcting Version happens to be issued anyway. It MUST NOT be treated as authoritative or exhaustive — the Corrections Object's own fields remain the source of truth regardless of whether any Article links back to it.
4.7 Discovery Limitation
This document does not provide, and ONP does not otherwise mandate, a
mechanism for discovering every Corrections Object that concerns a
given subject_oid without either the publisher's own indexing or an
independent aggregator service. No current ONP document owns this
problem: ONP-3200 (Search) addresses indexing consent and result
snippets only, not enumeration or ranking, despite this document
previously pointing to it as a forward reference. A Node
encountering an Article has no guaranteed way to enumerate its
corrections short of already knowing to look, consistent with the "no
global resolver" posture ONP-1001 Section 4.6 already established for
OID resolution generally.
5. Object Model
{
"content_type": "onp:companion:corrections",
"content": {
"subject_oid": "onp:oid:..., REQUIRED",
"corrected_vid": "onp:vid:..., REQUIRED — VID form (Section 4.4)",
"correcting_vid": "onp:vid:..., REQUIRED — VID form (Section 4.4)",
"correction_type": "'factual' | 'clarification' | 'typographical' | 'retraction' | 'update', REQUIRED",
"explanation": "string, REQUIRED — Safe Markdown Subset",
"corrected_at": "string (ISO 8601), REQUIRED"
}
}
| Field | Required | Notes |
|---|---|---|
subject_oid |
REQUIRED | OID form (the lineage) |
corrected_vid |
REQUIRED | VID form, exact prior Version |
correcting_vid |
REQUIRED | VID form, exact fixing Version |
correction_type |
REQUIRED | Section 4.5 enum |
explanation |
REQUIRED | Safe Markdown Subset |
corrected_at |
REQUIRED | ISO 8601 |
6. Processing Model
6.1 Cross-Check Against the Article's Own Lineage
A Node MAY, and SHOULD where it has access to the subject Article's
full Version history, verify that correcting_vid's own supersedes
field (ONP-1000 Section 4.1, rule 5; ONP-0006 Section 4.2) actually
equals corrected_vid, as the Corrections Object claims. A mismatch
means the Corrections Object describes a transition that does not
match what the Article's own signed lineage actually records — a
strong signal the Corrections Object is fabricated, mistaken, or
describes a different Article than it claims to (Section 8.1).
6.2 Interoperability
A Node without Corrections Companion support simply does not see
correction explanations. The Article itself remains fully verifiable
regardless, and its own lightweight revision_reason (ONP-0006)
remains available as a fallback, exactly as ONP-0006 Section 4.5
already anticipated.
7. Examples
7.1 A Factual Correction
{
"oid": "onp:oid:regiopurmerend.nl:correctie-fusie-onderzoek-01",
"vid": "onp:vid:sha-256:StU901-example-digest-bytes",
"publisher": { "domain": "regiopurmerend.nl", "key_id": "onp:key:2026-07-01" },
"signed_at": "2026-07-29T08:05:00Z",
"signature": "onp:sig:ed25519:base64url-signature-bytes",
"content_type": "onp:companion:corrections",
"content": {
"subject_oid": "onp:oid:regiopurmerend.nl:fusie-onderzoek-necker-van-naem",
"corrected_vid": "onp:vid:sha-256:AbC123-example-digest-bytes",
"correcting_vid": "onp:vid:sha-256:XyZ789-example-digest-bytes",
"correction_type": "factual",
"explanation": "In de oorspronkelijke publicatie stond een onjuist bedrag in de tweede alinea. Dit is gecorrigeerd op basis van het officiële rapport van Necker van Naem.",
"corrected_at": "2026-07-29T08:00:00Z"
}
}
This is the same corrected_vid/correcting_vid pair already used
illustratively in ONP-1000 Section 7.2's Core-level example — this
document is where that transition finally gets a full, structured
explanation instead of only a one-line revision_reason.
7.2 Cross-Check Failure
Corrections Object claims:
corrected_vid = V1, correcting_vid = V2
Article's actual lineage shows:
V2.supersedes = V3 (not V1)
Per Section 6.1: mismatch detected. A Node SHOULD treat this
Corrections Object as unreliable — either mistaken or fabricated —
and SHOULD NOT present it as an authoritative accounting of what
changed, notwithstanding its own valid signature (which only proves
who signed the claim, not that the claim is accurate).
8. Security Considerations
8.1 A Valid Signature Does Not Guarantee an Accurate Claim
A Corrections Object's signature proves who asserted the correction,
not that corrected_vid and correcting_vid actually stand in the
claimed relationship within the subject Article's own lineage. The
cross-check in Section 6.1 is the mechanism for catching this; a Node
that skips it accepts Corrections Objects on faith rather than on
verifiable consistency with the Article's own Core-level record.
8.2 Why the Reversed Reference Direction Matters Here
Because the Corrections Object references the Article rather than the reverse (Section 4.6), a compromised Corrections-issuing key cannot alter the Article itself — it can only publish a claim about it, which the cross-check in Section 6.1 can independently evaluate against the Article's own, separately-signed lineage. This is a direct benefit of keeping the two Companions' authority strictly separate.
9. Privacy Considerations
explanation text could, depending on the nature of the correction,
reference specific individuals (e.g. correcting a misattributed
quote), carrying the same limited personal-data considerations
already discussed for body (ONP-2100 Section 9). This document
introduces no new privacy mechanism beyond what that document already
establishes.
10. References
10.1 Normative References
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119.
- [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174.
- ONP-0000, Introduction — Section 1.1, corrections named as an original design goal.
- ONP-0006, News Object Lifecycle — Section 4.5, the
revision_reasonfield this document's richer explanation layer supplements, not replaces. - ONP-1000, News Object — Section 4.1, rule 5 (
supersedes), the field Section 6.1's cross-check inspects. - ONP-2000, Companion Framework — Section 4.3, generalized to VID form concurrently with this document's design (Section 4.4 of this document depends on that generalization).
- ONP-2100, Article — Section 4.4 (Safe Markdown Subset, reused for
explanation); updated concurrently withcorrections_ref(Section 10.3).
10.2 Informative References
- ONP-1006, Retrieval — Section 4.4 (feed carriage, a workable discovery channel) and Section 8.4 (no enumeration endpoint, deliberately) — together the reason Section 4.7's limitation exists and one concrete way around part of it.
- ONP-3200, Search — addresses indexing consent and search-result snippets only; despite being informally treated elsewhere (including an earlier version of this document, and ONP-2900) as a forward reference for correction/endorsement discovery, it does not define any enumeration or ranking mechanism and does not resolve Section 4.7's limitation.
10.3 Corresponding Update to ONP-2100
As part of this document's publication, ONP-2100 (Article) is updated
to add corrections_ref (OPTIONAL, array of OID strings referencing
Corrections Objects), as a discovery convenience only — never
authoritative, per Section 4.6 of this document. Classified MINOR
(additive) under ONP-0007 Section 4.1.
Appendix A: Full Schema Reference
{
"content_type": "onp:companion:corrections",
"content": {
"subject_oid": "string (OID), REQUIRED",
"corrected_vid": "string (VID), REQUIRED",
"correcting_vid": "string (VID), REQUIRED",
"correction_type": "enum, REQUIRED",
"explanation": "string, REQUIRED, Safe Markdown Subset",
"corrected_at": "string (ISO 8601), REQUIRED"
}
}
Appendix B: Corrections Object Checklist
[ ] subject_oid present (OID form)
[ ] corrected_vid and correcting_vid both present, both VID form
(not OID form)
[ ] correction_type is one of the five recognized values
[ ] explanation uses Safe Markdown Subset, no raw HTML
[ ] corrected_at present
[ ] (recommended) cross-checked: does correcting_vid.supersedes
actually equal corrected_vid in the subject Article's own
lineage?
End of Document