A printed research paper on a desk

Examples

Examples

See a paper become a grounded article — command, output, and the provenance you can check.

See the gate work

Grounding is easier to trust when you can see it. Here is one sentence draft wrote, the verbatim source span that let it survive the gate, and the attribution entry that binds them.

The source said (verbatim, from the paper):

Rendering-tolerant matching and source-based quote repair cut the verification drop rate from 29.6% to 8.5% across 3,217 extraction blocks.

draft wrote:

Rendering-tolerant matching and source-based quote repair together lowered the drop rate from 29.6% to 8.5% across 3,217 extraction blocks.

The attribution file records the link (…-attribution.json):

{
  "sentence": "Rendering-tolerant matching and source-based quote repair together lowered the drop rate from 29.6% to 8.5% across 3,217 extraction blocks.",
  "claim_id": "c-0417",
  "quote": "Rendering-tolerant matching and source-based quote repair cut the verification drop rate from 29.6% to 8.5% across 3,217 extraction blocks",
  "strength": "quantitative"
}

Every number in the sentence (29.6, 8.5, 3,217) appears in the quote, and the quote appears verbatim in the source — the two checks that let this claim through. Note the sentence keeps the source's joint attribution to both changes: the gate checks quotes and numbers, so faithful wording is on the writer, and this is what faithful wording looks like. A sentence without an attribution entry cannot exist in the article, and draft --verify recomputes the manifest digests against exactly this.

One paper, start to finish

draft "2603.23420.pdf"

draft reads the paper, builds a verified claim ledger, writes the article from it, and saves a dated set:

2026-07-29/
├── source/2026-07-29-attention-routing-body.md
├── yaml/2026-07-29-attention-routing-frontmatter.yaml
├── final/2026-07-29-attention-routing-final.md
└── provenance/
    ├── 2026-07-29-attention-routing-attribution.json
    └── 2026-07-29-attention-routing-c2pa.json

The attribution file maps each sentence in the article to the claim, and the verbatim source quote, that backs it. Nothing in the body exists without a line in that file.

Verify it

draft --verify recomputes the digests written beside the article and checks them. Point it at any file of the set. When a signed .c2pa credential is present and c2patool is installed, it validates the signature and trust chain too.

draft --verify 2026-07-29/final/2026-07-29-attention-routing-final.md

PROVENANCE

made by draft 0.0.36

·written with claude sonnet

article unchanged since it was written (7254c2c8d463)

claim ledger matches the verified claims

GROUNDING

·claims 6 verified

·attribution 22 of 24 sentences rest on a claim

SOURCES

2603.23420.pdf unchanged since it was read

SIGNATURE

·signature valid; signing certificate not in a known trust list (e.g. a development certificate)

Verified. The article matches the provenance written beside it.

Edit a sentence the ledger did not support and verification fails — that is the guarantee. It exits non-zero when the article, the ledger, a source, or the signature no longer matches.

A receipt a machine can check

Add --json and --verify emits a portable draft.verification-record/v1 instead of the human report — the digest and whether it matches, the grounding summary, the source and signature state, and the verdict. The schema lives in the importable provenance package, so a CI gate or an independent verifier can consume it without the CLI. Bring your own artifact, verify anywhere.

{
  "kind": "draft.verification-record/v1",
  "verified": true,
  "generator": { "name": "draft", "version": "0.0.36" },
  "article": { "sha256": "7254c2c8d463106f…071254b6", "matches": true },
  "grounding": { "claims": 6, "sentences": 24, "attributed": 22, "ungrounded_number_sentences": 0 },
  "sources": [ { "path": "2603.23420.pdf", "found": true, "matches": true } ],
  "signature": { "present": true, "checked": true, "valid": true, "trusted": true, "state": "Valid" }
}

Signing is opt-in: set DRAFT_C2PA_CERT and DRAFT_C2PA_KEY to a certificate chain and key. With no certificate, the manifest stays an unsigned definition, and the record simply omits the signature — everything else still verifies.

Tighten it further: the semantic second gate

The verbatim gate proves a claim's quote is in the source. It does not judge whether the quote supports the claim — a different subject, or a hedge stated as settled. --second-gate adds that pass on request: a local model checks each verified claim, and unsupported ones are dropped before writing.

draft --second-gate "my-paper.pdf"

· read 5 section(s)

· 8 claim(s) verified, 5 dropped

· second gate dropped 1 claim(s) a model found unsupported by their quote

· writing…

It is strictly additive and off by default: the verbatim gate stays the primary check, and a model error keeps the claim rather than dropping it — the pass can only ever tighten the ledger.

A batch, merged into one draft

draft --merge a.pdf b.pdf c.pdf

Offline, on a plane

draft --engine ollama "my-paper.pdf"

No network, no API key. The same gate runs; only the writer changes.

A complete, verifiable set from a real run — article, attribution, C2PA manifest and source — is on the provenance & compliance page. More runnable examples live in the repository.