Candidate has no block_id and no typed payload, so there is no method on the interface that could write to a Merkle
DAG.
The four rules a proposal fails on
evidenceis never empty, and it cites the task’s source. A derived block with no evidence has no root to audit against. There is no case where a proposer legitimately cannot cite: the source block is always there.- No numbers in a payload. These documents get hashed, and a float does not hash reproducibly.
confidenceis a decimal string:"0.85", never0.85. This is the most common rejection by a wide margin. locatorsays where in the source it came from. A citation pointing at a whole document is barely one.- Do not restate the document. An extraction that is the document again has added nothing and made ranking worse.
duplicate rejection is not a defect —
it means the brain already holds that block, and it does not block a commit, which is what makes the
repair-one-and-resubmit loop work.
Verdicts
validated earns a commit. rejected names a code to repair. contradicted conflicts with knowledge already held —
surface both block ids to the user rather than silently picking a side. pending_review means the protocol cannot
decide alone: stop and ask a person, because there is nothing wrong to repair.
The shortcut
structure, uses no model: it reads Markdown headings and proposes one semantic block per
section, extractively. Every statement it emits is text that was in the source, so it cannot invent — which makes it
both a real answer for structured documents and the right thing to build the rest of the pipeline against.
It also tracks code fences, because # do the thing inside a fenced block looks exactly like an H1, and a proposer
that reads it as one produces a semantic block asserting a shell comment.
--dry-run first, always, against a new kind of document.