docmeta:stewardship:1.0.0-proposal.2
The question it answers: is this page cared for? Every field here is a fact
a person asserts about the document, though a version control system can
approximate some of them. That is who wrote the page, who owns it, and who to
consult. It is also when the page was written, when it last changed, when it
was last verified, and against what. Review round 9 added created and
last-updated. Git’s
timestamps answer a neighbouring question, which is when a path in this repo
changed, and a published page carries no repo at all.
Fields
Section titled “Fields”| Field | Type | Notes |
|---|---|---|
authors |
string, object, or list of them | Who wrote it. owner is who answers for it now |
owner |
string or list | Who answers for the page, as a name, handle, chat channel, or team slug. Ownership systems such as Backstage make this field mandatory |
stakeholders |
string or list | Who has a stake in this page being right, such as the feature’s engineer, the product owner, or the support lead. It is page-level because the right people differ from page to page |
reviewed-by |
string or list | Who did the last review. The spelling avoids reviewers, which MyST uses for scholarly metadata |
created |
W3CDTF date | When the document was written. The document’s date, not the date its path appeared in this repo |
last-updated |
W3CDTF date | When the content last changed in a way a reader would notice. Not every commit that touched the file |
last-reviewed |
W3CDTF date | When the last review happened. Freshness tooling reads this field |
review-interval |
ISO 8601 duration | How often review is due: P90D, P1Y. Machines can compare these, unlike 90d |
verified-against |
string, object, or list of them | The product version or spec the content was checked against: operator 1.4.2, or {name: operator, version: 1.4.2} |
source-of-truth |
string, object, or list of them | Where the facts live, as a repo path or an API spec. A drift check compares the page against it |
All list fields accept one string or a non-empty list without
duplicates. Three fields go further and take objects as well.
authors accepts the person objects that MyST and Docusaurus define.
verified-against and source-of-truth accept an object with any keys,
so an anchor can be structured for a checker instead of written for a
reader. Every form still refuses to be empty.
Example
Section titled “Example”---title: Install the operator on Kubernetesdescription: Deploy the operator with Helm and verify the rollout.authors: - Jane Doe - name: Sam Reviewer # MyST/Docusaurus person objects are legalowner: platform-docsstakeholders: [jane.doe, pm-alex]reviewed-by: [sam.reviewer]created: 2025-11-04last-updated: 2026-08-20last-reviewed: 2026-08-20review-interval: P90Dverified-against: operator 1.4.2source-of-truth: https://github.com/example/operator/tree/main/helm---An anchor can also be structured, or carry more than one entry:
---title: Roll out the admission webhookdescription: Enable the operator's admission webhook and confirm it is serving.verified-against: - name: operator version: 1.4.2 - kubernetes 1.31source-of-truth: path: charts/operator/values.yaml kind: helm-values---Design decisions
Section titled “Design decisions”authorsrecords who wrote the page;ownerrecords who answers for it now. The two part company the moment an author moves on, which is why both exist.authorsmoved here from core in review round 6. Core answers what the page is, and who wrote it belongs with the question of whether the page is cared for. It is not a derivable fact either. Git records who committed a change, not who wrote the prose. The two differ whenever a page is landed by a bot, a CMS, or a colleague merging someone else’s draft.authorskeeps its own shape.owner,stakeholders, andreviewed-byare a plain name or a list of names.authorsmust also accept every documented MyST and Docusaurus person form, so it cannot share thestringListdefinition those fields use. The cost is that stewardship is not uniform in shape. Normalizingauthorsfor tidiness would break the family’s compatibility rule against two schemas that define the field. It still refuses every empty form:"",[],{}, and bare numbers.- The document’s own dates are asserted, not derived. Review round 9
added
createdandlast-updatedhere, against the family’s own principle that derivable facts lie. The reason is that git answers a neighbouring question.git logreports the history of a path in this repo. A page migrated from a CMS, or split out of a longer one, has a path younger than its content. A last commit date also moves for a typo fix, a link sweep, or a bulk frontmatter migration. None of those change what the page says. This is the argument that putauthorshere too. Git records who committed a change, not who wrote the prose. The second half is the reader. A published page carries no repo, so a stamped date travels with the document where a derived one cannot. - The cost of stamping a date is real. A hand-typed
last-updatedgoes stale quietly, and no JSON Schema can catch that. Comparing the field against the repository’s own history is a job for tooling that can read both. What stays out is a stored copy of a value this vocabulary already derives, which is why there is no due-date field. last-updatedis notlast-reviewed. An update changes the content. A review confirms it is still true. A page can have either without the other, which is why both dates exist. Both carry thelast-prefix because both name the most recent instance of a repeating event.createdneeds no prefix, because a document is written once.- The names avoid every neighbour’s spelling. Six built-ins claim
date. The family’s compatibility rule would hold that key at their loosest definition, which does not require a date at all. Nothing claims a barecreatedorlast-updated. The near neighbours are all spelled otherwise:critdates.createdandcritdates.revisedin DITA,lastmodin Hugo,last_updatein Docusaurus,lastUpdatedin Starlight and VitePress, andarticle:modified_timein Open Graph. - An anchor can be written for a reader or for a checker.
verified-againstandsource-of-truthtake a string, an object, or a list of either.operator 1.4.2is the short spelling.{name: operator, version: 1.4.2}is the one a drift check can compare without parsing prose. The list form is there because a page is usually anchored to more than one thing.verified-againstwas a single string until round 9, and could not say that at all. Object keys are left open, so{name, version}and{path, kind}are recommendations rather than contracts. - The review dates are records only. JSON Schema cannot compare a
date to today, so a
last-reviewedfrom 1998 validates, and a test asserts that it keeps doing so. Computing the due date (last-reviewedplusreview-interval) and judging it belongs to tooling that can read a clock. Any freshness grader can consume these fields. - There is no stored due-date field. It would duplicate a value the two existing fields already give, and a hand-maintained copy of a derived value goes stale.
- All three dates use W3CDTF with a field-range check. Reduced
precision is legal (
2026,2026-08). A timestamp requires its timezone, because the W3CDTF profile mandates one. An impossible date such as2026-13-45fails here. Without that check it would reach downstream tooling asInvalid Date, and the page would silently never come due. The check is not calendar-exact: February 31 passes and is left for a reviewer to catch. No date is compared to another one either, so alast-updatedolder than itscreatedvalidates. A test pins that, the same way it pins the overdue review. - The field is
stakeholdersrather thansme. It is broader than a subject-matter expert on purpose. The product owner and the support lead have a stake in the page being right, without being its technical authority. Project-wide stakeholder lists stay in project docs. This field is for the people who differ from page to page.
What reviewers should poke at
Section titled “What reviewers should poke at”Four questions. Should owner eventually be required for teams
adopting this vocabulary? (It is optional as proposed.) Do the field
names alone make the distinction between verified-against and
last-reviewed clear, that is, reviewed against something versus
reviewed at some time? And does authors read as belonging here?
Generators put it next to title, so expecting it in
core is reasonable. The counter-argument is
that every other people field is here, and splitting them means two
adoption decisions for one habit.
Round 9 adds one more. Should the object form of an anchor require a
key? As proposed it accepts any object, so a drift checker cannot rely
on finding a name or a path. Requiring one would be a small
vocabulary this proposal has not yet reviewed.