A valid draft can still be a different draft
A validator can accept a record while normalizing its content. Trimming a text value is a small example, but it still means the accepted payload differs from the file someone reviewed.
The handoff runner compares canonical content hashes before and after validation. If they differ, the draft needs to be normalized and reviewed again. Indentation and object-key order do not change the canonical content, so formatting alone does not trigger that result.
Three identities answer three different questions
The fileSha256 value identifies the original bytes. contentHash identifies the canonical payload. validatorSha256 identifies the validation module used for the check.
A changed file hash with an unchanged content hash points to serialization differences. A changed content hash means the payload changed. The validator hash records which module performed the check, but does not include its dependencies. None of these hashes is an approval receipt or a signature.
Check the bundle, not just individual records
The runner also requires Draft status, rejects publication dates and checks IDs and slugs for duplicates. Each article must link to a project supplied in the same bundle.
That rule keeps the check self-contained, but means an article about an existing project still needs its project file beside it. The runner does not query the content store to resolve missing links. It returns a local report and leaves saving and publication to the portfolio.
Exact bytes, canonical content and validator identity
The runner reports three hashes only after supplied and normalized content agree.
Input authority
Validation
Handoff identities
Scroll or drag the background to move. Use the zoom buttons to resize.Arrow keys move between components. Enter selects.
Choose a component to explore
Select a numbered component on the map or use the component menu. Its details and connections will appear here.
No component selected.
All connections (12)
- 01 · Draft JSON bytes → 03 · Validate and normalizeparsed payload · Direct call
- 02 · Website validator module → 03 · Validate and normalizeshared contract · Direct call
- 03 · Validate and normalize → 05 · Rejected handoffinvalid or not Draft · Blocked / denied
- 03 · Validate and normalize → 04 · Canonical input unchanged?normalized payload · Direct call
- 01 · Draft JSON bytes → 04 · Canonical input unchanged?original parsed content · Direct call
- 04 · Canonical input unchanged? → 05 · Rejected handoffcontent changed · Blocked / denied
- 01 · Draft JSON bytes → 06 · File SHA-256hash original bytes · Direct call
- 04 · Canonical input unchanged? → 07 · Canonical content hashaccepted content identity · Direct call
- 02 · Website validator module → 08 · Validator-file SHA-256hash module bytes · Direct call
- 06 · File SHA-256 → 09 · Local handoff reportfile identity · Direct call
- 07 · Canonical content hash → 09 · Local handoff reportpayload identity · Direct call
- 08 · Validator-file SHA-256 → 09 · Local handoff reportvalidation-file identity · Direct call