ONP-1000
Open News Protocol (ONP): News Object
Abstract
This document defines the News Object envelope: the top-level wire
structure every ONP Object MUST use, composed of Core State (owned
by this document, with exact formats delegated to ONP-1001 and
ONP-1003), an opaque Content region (owned by whichever Companion a
content_type identifier names), and the OPTIONAL Extensions
container already structurally defined in ONP-0001. It finalizes,
as authoritative wire format, the lifecycle fields ONP-0006
introduced illustratively, and the Minimal Viable Object field list
Principle P2 (ONP-0003) requires to exist but did not itself specify.
It also resolves a naming overlap the Terminology Registry carried
since ONP-0001: "Tombstone state" is not a second field alongside
lifecycle_state — it is the name for what lifecycle_state:
retracted is.
Status of This Document
This document is part of the ONP Core series (ONP-1000-1999). Unlike the Foundation series, it is directly implementable: a conforming Node can be built against this document, ONP-1001, and ONP-1003 alone and correctly parse and Core-validate any News Object, independent of which Companions or Extensions that Object also carries (ONP-0001 Section 6.5). It is a Working Draft.
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
Every prior Foundation document described the News Object's shape
illustratively and deferred its authoritative form here: ONP-0001
sketched the three-region envelope (Core State, Content, Extensions);
ONP-0004 illustrated a publisher reference without fixing its
field names; ONP-0006 defined lifecycle_state, supersedes,
revision_reason, and republish_of_retraction as mechanism, noting
their wire format was "structurally finalized in ONP-1000/1001."
This document is where those deferrals are collected and fixed.
2. Scope
2.1 In Scope
- the top-level envelope structure and its required/optional keys;
- the Core State field list this document owns directly (
publisherreference) and the fields it finalizes on behalf of ONP-0006 (lifecycle fields); - the Minimal Viable Object's exact field list (finalizing the term ONP-0003 owns, per Section 4.2);
- the Content region's opacity requirement relative to Core validation;
- the
content_typenamespace identifier scheme; - the reconciliation of "Tombstone state" with
lifecycle_state.
2.2 Out of Scope
This document does NOT define:
- the exact OID/VID generation algorithm or string format (ONP-1001);
- canonical serialization/byte encoding for signing (ONP-1002);
- the signature computation, algorithm registry entries, or signature field's exact encoding (ONP-1003);
- the multi-level validation procedure itself, beyond restating that Content MUST remain opaque to it (ONP-1004);
- any specific Companion's Content schema (e.g. Article, ONP-2100)
or any Extension's fields under
onp:extensions.
3. Terminology
This document is the owning specification for the following terms.
Envelope
: The complete top-level JSON structure of a News Object: Core
State fields, the content region, and the OPTIONAL
onp:extensions container, all as direct siblings at the top
level (Section 5.1).
Content Region
: The content field: opaque to Core, its schema owned entirely by
whichever Companion the Object's content_type names.
Content Type
: The namespaced identifier (Section 4.4) declaring which Companion
specification defines the schema of content.
Publisher Reference
: The publisher field: the Core-owned pointer (domain and key
identifier) a Node uses to perform Trust Anchor resolution per
ONP-0004.
Claimed Signing Time
: The signed_at field: the ISO 8601 UTC timestamp a publisher
claims as this Version's signing time (Section 5.1, rule on
signed_at), consumed by ONP-0004's key-rotation validity-window
check and ONP-1003's verification procedure. Added as a field in
v0.2.0; this formal term entry completes that change in v0.3.1
(PATCH: the ONP-0002 Appendix A row for this term already named
this document as owner, but no definition existed here — a
registry/definition drift caught by tools/check-specs.py).
Terms used but owned elsewhere: News Object (ONP-0000, this
document supplies its structural definition), Minimal Viable
Object (ONP-0003, this document supplies its concrete field list
in Section 4.2), Lifecycle State, Supersession, Revision
Reason (ONP-0006, this document supplies their wire format in
Section 5.1), Tombstone state (ONP-0001; Section 4.5 of this
document resolves its relationship to lifecycle_state).
4. Requirements
4.1 Envelope Structure
- A News Object MUST be a single JSON object at its top level.
- The following top-level keys are REQUIRED on every News Object:
oid,vid,publisher,signed_at,signature,content_type,content. - The following top-level keys are OPTIONAL:
lifecycle_state,supersedes,revision_reason,republish_of_retraction,onp:extensions,onp:metadata(added in v0.3.0; see ONP-1005). - A Node MUST NOT require any key beyond those listed in rules 2
and 3 to be present for an Object to be considered structurally
well-formed at the envelope level; a Companion or Extension MAY
require additional keys within
contentor within its ownonp:extensionsnamespace, but MUST NOT require a new top-level envelope key (this would violate ONP-0001 Section 4.1, rule 3 — no Companion or Extension may introduce a field that shadows or sits alongside Core-owned envelope structure without going through this document's own versioning process, ONP-0007). signed_atMUST be an ISO 8601 UTC timestamp string, stating the time the publisher claims to have signed this Version. It is the value ONP-0004 Section 4.4 uses asTwhen checking a signing key's validity window, and the value ONP-1003 (Digital Signatures) consumes as the claimed signing time during verification. It MUST participate in the signing pre-image (ONP-1003 Section 4.1) exactly like any other included field; its authenticity is protected by the same signature that protects the rest of the envelope, not by any separate mechanism.
4.2 Minimal Viable Object
Per Principle P2 (ONP-0003), this document fixes the Minimal Viable Object as exactly the seven REQUIRED keys in Section 4.1, rule 2, with no other key present:
oid, vid, publisher, signed_at, signature, content_type, content
A Node MUST accept an Object containing only these seven keys as
structurally complete, provided each satisfies its own field-level
requirements (Section 5.1). An absent lifecycle_state MUST be
interpreted as published; an absent supersedes MUST be
interpreted as "first Version in its lineage" (ONP-0006 Section 4.2,
rule 1). This absence-has-meaning design keeps the truly minimal
case free of any lifecycle bookkeeping a first-time publisher does
not yet need.
Correction note (v0.2.0): version 0.1.0 of this document omitted
signed_at, a field ONP-0004's key rotation validity-window check
(Section 4.4 of that document) requires to determine whether an
Object's signing key was valid at the time it claims to have signed.
This gap surfaced while drafting ONP-1003 and is corrected here; see
Section 10.3.
4.3 Publisher Reference
publisherMUST be an object with, at minimum, adomainfield (the value used for Trust Anchor resolution per ONP-0004 Section 4.2) and akey_idfield (the key identifier used to look up the signing key within that domain's Publisher Key Record).- A Node MUST use
publisher.domainandpublisher.key_idexactly as ONP-0004 Section 6.1 (Resolution Algorithm) consumesDandKrespectively; this document does not introduce a second, competing way to express publisher identity.
4.4 Content Region and Content Type
contentMUST be opaque to Core-level validation: a Node MUST be able to complete Core validation (ONP-0001 Section 6.2, level 1) —structural well-formedness, signature validity, Trust Anchor resolution — without parsing or understanding the internal structure ofcontent.content_typeMUST be a namespaced identifier of the formonp:companion:<name>(e.g.onp:companion:article), naming the Companion specification that definescontent's schema. This mirrors theorg.onp.<name>namespacing ONP-0001 Section 4.3 requires for Extensions, applied here to Companions instead.- A Node encountering a
content_typeit does not recognize MUST still complete Core validation successfully (per rule 1) and MUST NOT reject the Object solely for unrecognized content_type; it MAY decline to interpret or displaycontentmeaningfully, but the Object remains authentically verified at the Core level. This is the concrete mechanism behind the interoperability guarantee pattern established in ONP-0001 Section 6.5, ONP-0004 Section 6.4, and ONP-0006 Section 6.3.
4.5 Lifecycle Fields and Tombstone State Reconciliation
lifecycle_state,supersedes,revision_reason, andrepublish_of_retractionMUST use exactly the semantics ONP-0006 Sections 4.1 through 4.5 define, with the wire-level field names given in Section 5.1 of this document.- The term "Tombstone state," owned by ONP-0001 and referenced in
this document's Terminology Registry entry as "structurally
defined in ONP-1000," is hereby resolved as follows: Tombstone
state is not a separate field. It is the descriptive Core-
ownership name for the condition
lifecycle_state == "retracted". No News Object carries both alifecycle_statefield and a distincttombstonefield; a specification or implementation that introduces a second, redundant field for this purpose is non-conformant. - ONP-0002's registry gloss for "Tombstone state" is updated alongside this document's publication to reflect this resolution (see Section 10.3).
5. Object Model
5.1 Full Envelope Schema (Authoritative)
{
"oid": "string, REQUIRED — exact format owned by ONP-1001",
"vid": "string, REQUIRED — exact format owned by ONP-1001",
"publisher": {
"domain": "string, REQUIRED — e.g. regiopurmerend.nl",
"key_id": "string, REQUIRED — e.g. onp:key:2026-07-01"
},
"signed_at": "string, REQUIRED — ISO 8601 UTC, e.g. 2026-07-28T10:00:00Z",
"signature": "string, REQUIRED — exact encoding owned by ONP-1003",
"content_type": "string, REQUIRED — e.g. onp:companion:article",
"content": {
"...": "opaque to Core; schema owned by the named Companion"
},
"lifecycle_state": "string, OPTIONAL, default 'published' — 'published' | 'retracted'",
"supersedes": "string or absent, OPTIONAL — a prior vid in the same oid lineage",
"revision_reason": "string, OPTIONAL",
"republish_of_retraction": "string, OPTIONAL — a prior vid, only on a republish",
"onp:extensions": {
"...": "OPTIONAL — structure owned by ONP-0001 Section 5.2"
},
"onp:metadata": {
"...": "OPTIONAL — structure owned by ONP-1005"
}
}
5.2 Field Table
| Field | Required | Owning Document (exact format) |
|---|---|---|
oid |
REQUIRED | ONP-1001 |
vid |
REQUIRED | ONP-1001 |
publisher.domain |
REQUIRED | This document (Section 4.3); consumed by ONP-0004 |
publisher.key_id |
REQUIRED | This document (Section 4.3); consumed by ONP-0004 |
signed_at |
REQUIRED | This document (Section 4.1, rule 5); consumed by ONP-0004 and ONP-1003 |
signature |
REQUIRED | ONP-1003 |
content_type |
REQUIRED | This document (Section 4.4) |
content |
REQUIRED | Named Companion (e.g. ONP-2100) |
lifecycle_state |
OPTIONAL, default published |
ONP-0006 (semantics); this document (wire form) |
supersedes |
OPTIONAL, default absent | ONP-0006 (semantics); this document (wire form) |
revision_reason |
OPTIONAL | ONP-0006 |
republish_of_retraction |
OPTIONAL | ONP-0006 |
onp:extensions |
OPTIONAL | ONP-0001 Section 5.2 |
onp:metadata |
OPTIONAL | ONP-1005 |
6. Processing Model
6.1 Parsing Order
1. Parse the top-level JSON object.
2. Confirm the six REQUIRED keys (Section 4.1, rule 2) are present
and structurally valid per Section 5.2.
-> FAIL (structural) if any is missing or malformed.
3. Apply defaults for absent OPTIONAL keys (Section 4.2).
4. Hand oid/vid to ONP-1001 processing; hand signature + publisher
to ONP-1003/ONP-0004 processing for cryptographic and Trust
Anchor verification.
5. Only after step 4 succeeds does a Node proceed to interpret
`content` (per content_type, Companion-owned) or
`onp:extensions` (per namespace, Extension-owned) — consistent
with the three-level validation ordering in ONP-0001 Section 6.2.
6.2 Content Opacity Enforcement
A Node's Core-validation code path MUST NOT branch on the contents
of content. This is an implementation discipline as much as a wire
rule: an implementation that inspects content to decide whether an
Object is "trustworthy" has reintroduced exactly the layer confusion
ONP-0001's Vertical Invariant and ONP-0005 Section 4.5 prohibit.
Core trust and Content interpretation MUST remain separate code
paths.
6.3 Interoperability
A Node implementing only ONP-1000, ONP-1001, and ONP-1003 — with no
support for any specific Companion or Extension — MUST be able to:
verify any News Object's signature, resolve its Trust Anchor,
determine its Current Version within a known set (per ONP-0006), and
correctly report it as untrusted if any of those fail — all without
understanding a single content_type or onp:extensions namespace.
This is the concrete, testable form of the interoperability
guarantee every prior Foundation document promised in the abstract.
7. Examples
7.1 Minimal Viable Object
{
"oid": "onp:oid:regiopurmerend.nl:fusie-onderzoek-necker-van-naem",
"vid": "onp:vid:sha-256:AbC123-example-digest-bytes",
"publisher": {
"domain": "regiopurmerend.nl",
"key_id": "onp:key:2026-07-01"
},
"signed_at": "2026-07-28T10:00:00Z",
"signature": "onp:sig:ed25519:base64url-signature-bytes",
"content_type": "onp:companion:article",
"content": {
"headline": "Fusie-onderzoek Purmerend gepubliceerd",
"body_ref": "https://regiopurmerend.nl/artikel/fusie-onderzoek"
}
}
No lifecycle_state present -> a Node MUST interpret this as
published. No supersedes present -> a Node MUST interpret this
as the first Version in its lineage.
7.2 A Correction (Second Version in a Lineage)
{
"oid": "onp:oid:regiopurmerend.nl:fusie-onderzoek-necker-van-naem",
"vid": "onp:vid:sha-256:XyZ789-example-digest-bytes",
"supersedes": "onp:vid:sha-256:AbC123-example-digest-bytes",
"revision_reason": "Cijfer in tweede alinea gecorrigeerd",
"publisher": { "domain": "regiopurmerend.nl", "key_id": "onp:key:2026-07-01" },
"signed_at": "2026-07-29T08:00:00Z",
"signature": "onp:sig:ed25519:base64url-signature-bytes-of-this-version",
"content_type": "onp:companion:article",
"content": { "headline": "Fusie-onderzoek Purmerend gepubliceerd (gecorrigeerd)", "body_ref": "..." }
}
Same oid, new vid, supersedes pointing at the prior vid.
Applying ONP-0006 Section 6.1's algorithm to both Objects together
correctly identifies this Version as Current and the first as
Superseded.
7.3 Unrecognized content_type, Still Core-Valid
A Node with no Media Companion support receives:
content_type: "onp:companion:media"
Per Section 4.4, rule 3: the Node completes Core validation
normally (signature + Trust Anchor resolution both succeed) and
reports the Object as authentically verified, while declining to
render or interpret `content` meaningfully.
8. Security Considerations
Content opacity (Section 4.4, rule 1; Section 6.2) is a direct security control, not merely an architectural nicety: it is what makes it structurally impossible for a malicious or buggy Companion implementation to affect whether an Object is judged authentic. This restates, at the wire-field level, the Vertical Invariant already analyzed in ONP-0001 Section 8 and ONP-0005 Section 4.5; it is not a new risk, but this document is where the enforcement point actually lives in code, so it is restated here for implementers who read Core documents without necessarily re-reading Foundation security analysis.
The publisher reference (Section 4.3) is the exact handoff point
into ONP-0004's Trust Anchor resolution; a Node MUST treat a News
Object whose publisher.domain cannot be resolved, or whose
publisher.key_id is not found current or historically valid per
ONP-0004 Section 6.1, as unverified — this document introduces no
new trust logic of its own, it only fixes the field names ONP-0004's
already-normative algorithm consumes.
9. Privacy Considerations
The REQUIRED envelope fields (Section 4.1, rule 2) carry minimal
personal data: publisher.domain identifies an organization, not an
individual; oid, vid, signature, and content_type carry none.
This is a direct consequence of Principle P2 (Minimal Required
Surface) as applied concretely by Section 4.2 of this document — any
personally identifying content is confined to the opaque content
region (governed by whichever Companion defines it, e.g. ONP-2300)
or to onp:extensions, neither of which this document requires to
be populated.
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 — owns the term "News Object"; this document supplies its structural definition.
- ONP-0001, Architecture — Core ownership rules (Section 4.1), the
onp:extensionscontainer (Section 5.2), and the interoperability guarantee pattern (Section 6.5) this document instantiates concretely. - ONP-0003, Design Principles — Principle P2 (Minimal Required Surface), owning "Minimal Viable Object," whose exact field list this document fixes in Section 4.2.
- ONP-0004, Trust Model — the Resolution Algorithm (Section 6.1)
this document's
publisherfield (Section 4.3) feeds directly. - ONP-0005, Security Model — Section 4.5 (layer confusion), restated at the field level in Section 8 of this document.
- ONP-0006, News Object Lifecycle — owns the semantics of
lifecycle_state,supersedes,revision_reason, andrepublish_of_retraction; this document fixes their wire form.
10.2 Informative References
- ONP-1001, Identifiers (forward reference — exact
oid/vidformat). - ONP-1002, Serialization (forward reference — canonical byte encoding for signing).
- ONP-1003, Digital Signatures (forward reference — exact
signaturefield encoding and Algorithm Registry). - ONP-1004, Validation — the full multi-level validation procedure this document's Section 6.1 outlines only at the parsing-order level).
- ONP-2100, Article (forward reference — an example Companion
defining a
content_typeschema, used in Section 7).
10.3 Corresponding Update to ONP-0002
As part of this document's publication, ONP-0002's registry gloss
for "Tombstone state" is updated to state that it is realized by the
lifecycle_state field (value retracted) rather than a separate
field, per Section 4.5 of this document. This is a PATCH-level
change under ONP-0007 Section 4.4, rule 2 (gloss correction, no
change of owning document or substantive meaning — the concept
Tombstone state names was always this condition; only its wire
realization is now stated precisely).
10.4 Version 0.2.0 Classification
The addition of signed_at as a seventh REQUIRED envelope field
(Section 4.1, rule 5; Section 4.2) invalidates any prior
understanding of this document's Minimal Viable Object as a
six-field structure. Per ONP-0007 Section 4.2 (pre-1.0 semantics),
this is classified MINOR — not MAJOR, since this document remains
below Version 1.0.0 — with this explicit callout satisfying ONP-0007
Section 4.2, rule 4's requirement that a pre-1.0 change meeting the
MAJOR criteria be called out in prose rather than left to the
version number alone to convey.
10.5 Version 0.3.0 Classification
The addition of onp:metadata as an OPTIONAL top-level key (per
ONP-1005) does not invalidate any previously valid News Object — the
Minimal Viable Object (Section 4.2) remains the same seven REQUIRED
fields. This is classified MINOR under ONP-0007 Section 4.1
(additive, backward-compatible) and does not require the explicit-
breaking-change callout Section 10.4 needed, since no MAJOR-level
criterion is met.
Appendix A: Minimal Viable Object Checklist
[ ] oid present and well-formed (ONP-1001)
[ ] vid present and well-formed (ONP-1001)
[ ] publisher.domain present
[ ] publisher.key_id present
[ ] signed_at present, ISO 8601 UTC
[ ] signature present and well-formed (ONP-1003)
[ ] content_type present, namespaced onp:companion:<name>
[ ] content present (opaque, per content_type's Companion)
[ ] no envelope key beyond the seven required + the four OPTIONAL
lifecycle/extensions keys listed in Section 4.1
Appendix B: Absence-Has-Meaning Defaults
Field | Absent means
--------------------------|--------------------------------------
lifecycle_state | published
supersedes | first Version in its lineage (no prior)
revision_reason | no reason stated (permitted; not an error)
republish_of_retraction | this Version is not a republish
onp:extensions | no Extensions attached
onp:metadata | no generic Companion-agnostic metadata stated
End of Document