Content Accessibility · Emerging · Medium impact
Content provenance declared
Author, publication date and update date are what let an agent judge whether a source is current and attributable before it quotes it.
- Emerging
- Medium impact
- Draft standard
| Property | Value |
|---|---|
| Check id | provenance-declared |
| Dimension | Content Accessibility (22%) |
| Tier | Emerging — pool 5 pts |
| Weight inside tier | 1 |
| Impact | Medium |
| Maturity | Draft — A published specification that is not yet ratified. |
| Conditional | No |
| Publishing skill | provenance |
| Standards | schema.org/author, C2PA |
What is measured
This check declares no probe path, so the scanner walks the JSON-LD of the already fetched homepage / for an article-level type (Article, NewsArticle, BlogPosting, ScholarlyArticle, Report) and reads author, datePublished and dateModified from it. Pass when such a type declares a named author (a Person or Organization with a name, not a bare string) plus datePublished and dateModified as ISO 8601 dates, so an agent can attribute the page and tell how current it is; partial when the entity exists but one of the three is missing, or author is an untyped string, or a date is not ISO 8601; fail when no article entity appears, or it carries no author and no dates. The scanner observes the schema.org HTML signals only: C2PA is the other standard named for this check, but it is a binary manifest embedded in a media file and is out of scope for a plain HTML page. This profile-scoped check is reported as not scored and excluded from the denominator unless the publisher or institution profile has been positively identified.
Reproduce it yourself
You do not have to take our word for any of this. Run the same measurement against your own domain:
DOMAIN="https://example.com"
curl -sL "$DOMAIN/" | perl -0777 -ne 'while (m{<script[^>]*application/ld\+json[^>]*>(.*?)</script>}gsi) { print "$1\n" }' | jq -r '.. | objects | select(([."@type"?] | flatten | map(tostring) | any(test("Article|BlogPosting|Report")))) | [((.author // "NO AUTHOR") | if type=="object" then (.name // "unnamed") elif type=="array" then ((.[0].name // .[0]) // "unnamed") else . end | tostring), (.datePublished // "NO datePublished"), (.dateModified // "NO dateModified")] | @tsv'
The fix
This is the artifact to ship. It is the complete change, not a description of one.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "How agent readiness is scored",
"url": "https://www.example.com/insights/agent-readiness-scoring",
"author": [
{ "@type": "Person", "name": "Dana Whitfield", "url": "https://www.example.com/authors/dana-whitfield" },
{ "@type": "Organization", "name": "Example Research Desk", "url": "https://www.example.com/about/research-desk" }
],
"publisher": { "@type": "Organization", "name": "Example Publishing Ltd", "url": "https://www.example.com/" },
"datePublished": "2025-11-04T09:00:00+01:00",
"dateModified": "2026-02-17T14:30:00+01:00"
}
</script>
Standards referenced
-
schema.org/author -
C2PA
Related checks
| Check | Tier | Impact | Same skill |
|---|---|---|---|
markdown-negotiation — Markdown content negotiation | Recommended | Critical | — |
headings — Semantic heading structure | Essential | High | — |
meta — Title and summary metadata | Essential | High | — |
jsonld — JSON-LD structured data | Essential | Critical | — |
faq-schema — FAQ / question-answer schema | Recommended | High | — |
breadcrumb — Breadcrumb / navigation schema | Emerging | Low | — |
summary — Prominent summary block | Recommended | Medium | — |
lang — Language declaration and multilingual access | Recommended | Medium | — |