What machines see¶
On the canonical page of any entity with a resolved disclosure, the module
adds two things to the document head: a schema.org JSON-LD block and a
<meta name="ai-disclosure"> tag. Both are on by default and each has its
own checkbox on the Output tab.
The JSON-LD block¶
The block carries digitalSourceType, the schema.org property whose values
echo the IPTC digital source type vocabulary. A grade stores the
IPTC URI. The module translates that URI into the matching schema.org
enumeration member, which is the form Google's structured data documentation
asks for. Three IPTC terms have no schema.org member yet, and those come out
as the IPTC URI itself.
Those URIs start with http://. The IPTC vocabulary declares its own
identifiers that way, and schema.org repeats the same http:// URIs in its
skos:exactMatch statements. Changing the scheme would name a different
resource.
The @type is Article for nodes. A media entity gets ImageObject,
VideoObject or AudioObject when the module maps its source plugin, and
MediaObject when it does not. Everything else gets CreativeWork. A site that
needs another type replaces the ai_disclosure.machine_readable service
through a ServiceProvider. See For Developers.
The meta tag¶
The tag carries the grade, the verdict and the icon:
<meta name="ai-disclosure" content="ai_summarized; required=undetermined; icon=ai_generated">
required is one of required, not-required or undetermined, spelled out
rather than reduced to 0 or 1. A consumer reading a zero could not tell
"assessed and out of scope" from "not assessed", and that is the distinction
the assessment exists to make. Where an evidently artistic
work limits the manner of the disclosure, modality=unobtrusive is appended.
icon names the icon the page actually renders. A grade carrying an icon the
module does not know draws no image, and the tag says icon=none rather than
repeating the value stored on the grade. The two surfaces answer the same
question, so a consumer never reads an icon that the reader cannot see.
Sites reading the previous required=0 / required=1 form need to be told:
this is a published format that changed.
Media¶
A media entity only gets the marking above where it has a canonical page of
its own. Drupal ships media.settings.standalone_url disabled, which leaves
/media/1 without a page to mark. An AI image shown inside an article would
go unmarked, so the page of the article lists it too.
When the JSON-LD block is on, the canonical page of an entity adds an
ImageObject, VideoObject or AudioObject node to its document for every
image, video or audio file it shows whose disclosure resolves to a grade with
an IPTC URI, whatever the grade. The nodes sit under associatedMedia of the
page's main entity:
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://example.com/node/1",
"associatedMedia": [
{
"@type": "ImageObject",
"contentUrl": "https://example.com/sites/default/files/team.png",
"digitalSourceType": {"@id": "https://schema.org/TrainedAlgorithmicMediaDigitalSource"},
"disambiguatingDescription": "This is synthetic media produced by AI."
}
]
}
What counts as shown is what the entity's full view display holds, or its
default display when full has no custom settings:
- Image and file fields. Images are
ImageObject, other files are typed by their MIME type (image/,video/,audio/), and the rest is left out. - Entity reference fields to media. The type comes from the media source and the file from its source field.
<drupal-media>elements in long formatted text. They are read from the stored text, so they count whatever the text format does with them.
Nothing is followed further. The media referenced by a media entity are not visited, and neither are those of an entity referenced from the page.
contentUrl is the original file, not an image style derivative. Each file
is resolved as described in resolving disclosures for
files, so a media entity with a disclosure of
its own decides for its file. A file used twice on a page appears once, in
display order, and a page lists at most 50.
A disclosure whose scope medium is text is skipped. It says the AI work was on the words, and an article graded that way would otherwise mark every photo in it as AI. A grade without an IPTC URI is skipped too, as there is nothing machine-readable to say.
A page whose entity has no disclosure of its own still gets a document when
it shows AI media: @context, @type, url and associatedMedia, and no
meta tag. A page with no AI media keeps the document described above, with no
associatedMedia key.
Remote video¶
A media item whose source is an oEmbed video, such as one from YouTube or
Vimeo, has no file. When it has a disclosure of its own that resolves to a
grade with an IPTC URI, the page that shows it lists a VideoObject with the
video's page URL as embedUrl, as contentUrl would claim a file the site
does not serve:
{
"@type": "VideoObject",
"embedUrl": "https://www.youtube.com/watch?v=abc",
"digitalSourceType": {"@id": "https://schema.org/TrainedAlgorithmicMediaDigitalSource"},
"disambiguatingDescription": "This is synthetic media produced by AI."
}
The URL is the one stored in the media item's source field. Nothing is fetched from the provider. The same scope and IPTC rules apply as for files, and the node counts towards the limit of 50.
Turning off the JSON-LD block turns all of this off. The meta tag is
unaffected, since it speaks for the page and not for its media. A media
entity's own standalone page is not given an associatedMedia list.
Scope¶
This marking is a page-level signal for crawlers and aggregators. Article 50(2) asks a provider to mark the file itself, and a JSON-LD block does not survive someone saving the image. C2PA and watermark embedding stay out of scope for 1.0.