Node Validate

Checks a single node against every Requirement of the Form Contract it claims. Validation is the mirror of authoring — where Node Create applies a Contract at write time, Node Validate reads the same Contract at verification time and reports where the node does not satisfy it. The two skills share their grounding Decisions because both are ways of enforcing the same commitments, from opposite sides of the file.

An agent invokes this skill when a draft needs to clear its contract before commit, when an existing node's curation state is advancing (Working Draft → Stable → Canonical), or when a node's claim is about to be cited and the citer wants to know the target is structurally trustworthy. The skill does not fix violations — fixing is a separate act, usually direct editing. Reporting a remediation per violation lets the user or a follow-up skill close the gap without re-deriving what the violation means.

Steps

Step 1: Load the node

Read the node file with the Read tool. The file may be a flat nodes/<Taxonomy>/<Name>.md, a compound-node lead nodes/<Taxonomy>/<Name>/<Name>.md, or a Skill lead nodes/Skills/<Folder>/<Folder>.md. If the path resolves to a folder, read the lead file whose name matches the folder.

If the file does not exist, stop and report the path that was requested. Do not infer the intended node.

Step 2: Identify the form

Find the conforms_to::[[<Form> Contract]] line in the identity predicate block above the H1. That target names the Form Contract the node claims.

If no conforms_to:: line exists, the node violates Markdown Node Contract's Identity predicate block Requirement — report that as the first finding and stop; no form-specific checks apply because the form is not declared.

If the conforms_to:: line exists but the target does not resolve to a file under nodes/Contracts/, record this as a violation with target <name>; the agent may still attempt base-contract checks against Markdown Node Contract but cannot run form-specific checks.

Step 3: Walk the Contract inheritance chain

Read the Form Contract's ## Requirements section. Contracts extend other Contracts via extends_contract::[[Parent Contract]] in their Relations section. Walk the chain upward: if the form's Contract extends Markdown Node Contract (the common case), collect Requirements from both. If the chain is deeper (for example, Predicate Form Contract extends Gloss Form Contract extends Markdown Node Contract), collect Requirements from every level.

The validation set is the union of every Requirement in the chain. Inheritance is strict per Contract Form Contract — a child Contract may add Requirements and may refine a parent Requirement by naming it, but cannot silently override.

Step 4: Check base Requirements

Apply Markdown Node Contract's Requirements to the node:

For each check that fails, record the Requirement's short name, what was found, and what the Requirement expects.

Step 5: Check form-specific Requirements

Apply the form-specific Contract's Requirements. The exact checks vary by form:

The form-specific predicate reservations come from Reserve Predicate Vocabularies to Specific Forms. A has_commitment:: on a Conviction, a has_epistemic_status:: on a Decision, or a serves_as:: on a Gloss is a category error — flag it with the reserving Contract named.

Step 6: Check Relations annotations

For each edge in ## Relations, verify:

Vocabulary health — whether a predicate has a backing Predicate node, whether a provisional predicate should be codified, whether two predicates have drifted into synonyms — is Graph Audit's concern, not Node Validate's. Per-node vocabulary reporting conflates base-contract predicates (introduced by Markdown Node Contract and form-specific Contracts — conforms_to, authored_by, has_lifecycle, has_commitment, extends_contract, and so on) with genuinely provisional predicates, producing noise on every node. Defer vocabulary questions to Graph Audit, which separates backed predicates from base-contract predicates from provisional drift at graph scope.

An edge with no annotation is tag spaghetti by Annotate Edges With Why-They-Matter; report each unannotated edge as its own finding with the edge text quoted.

Step 7: Report findings

Group findings by severity:

For each finding, report:

Order findings from cheapest-to-fix (filename, ASCII dashes, missing conforms_to::) to most expensive (missing body section, node-atomicity split, predicate axis refactor). Cheaper fixes unlock later checks; running them first is usually productive.

If no findings, report "Conforms to <Form Contract>" and name the Contracts walked in the inheritance chain. A clean report is itself information the user can act on.

Step 8: Stop

Do not edit the node. Do not stage or commit. Validation produces findings; fixing is a separate act the user or a follow-up skill performs.

Relations