Attach schema.org JSON-LD nodes to ONE record {contentId, graph} or to EVERY record of a post type {postType, graph}. The node type is not an argument: it goes INSIDE graph, a list of nodes without @context — graph: [{"@type": "Event", "name": "{{title}}", …}]. Pieces of a post-type graph are a template with {{url}}, {{site_url}}, {{title}}, {{excerpt}}, {{featured_image}}, {{date_published}}, {{date_modified}} (Yoast's own values for the page), {{field:}} (a Fabrement field as the page shows it: default applied, image → URL, date-time → ISO with offset; group.sub, .label, .date, .title/.url/.fields. of a picked record), {{option:.}}, {{meta:}} (other plugins' fields), {{term:}} (a public one)… Unknown fields are refused; a protected meta key (leading "_") too; on a password-protected record excerpt, fields, meta and terms resolve empty. graph: [] removes them. The @id of a Yoast node (the page URL, #organization…) is refused: nodes are added to Yoast's graph, never swapped for its own. Refused when Yoast is not active. Returns the resolved preview and warnings — read both, then verify on the live page source.
Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.