FACTUM

Worked examples · Legal

The pre-signature checklist.

Before a contract is signed, it is read for the clauses it should carry and for the faults of its drafting. Factum reads it against a declared checklist: each clause located or absent, each drafting fault named at the place it occurs. Between two drafts, it states what changed.

The problem

A first-pass review asks two questions of a draft. Are the clauses that matter present: the parties, the term, termination, governing law, payment, assignment, a cap on liability? And does the draft hold together: are its defined terms used, are they spelled as defined, does every cross-reference point at a section that exists?

A missing clause is a fact about the draft. So is a reference to a section that is not there. A reviewer who states them needs to say where, and needs the next draft to be compared with this one, clause by clause.

Recorded outputTwo certify calls on constructed contracts with fictitious parties. The first draft is the engine's own test document for its drafting checks: a short agreement written with one fault for each check. The comparison uses a longer constructed agreement and a second draft with two stated edits. No AI engine was configured.

A short draft, read against the checklist

POST /api/tenants/{tenant}/certify?reportType=commercial-contract-first-pass-review&filename=drafting-fixture.html
FACTUM
Commercial contract — first-pass review
commercial-contract-first-pass-review
Issued2026-11-06T03:24:29.983Z Document sha256674b0dd9556d2b4ef7b97266980b5620468571fa4834640fe84b7fc07c6c5f57

Verdicts

resolved1gap8drafting findings7cross-references resolved1cross-references dangling1

Clauses the checklist asks for

a clause identifying the parties to the agreementresolved
Check how this was answered
statement point sp-parties
matched forms Agreement, by and between
Source paragraph 2
This Master Supply Agreement (the "Agreement") is entered into by and between Acme Corp. (the "Seller") and Beta LLC (the "Buyer").
paragraph 2 of the draft
a clause stating the effective dategapno_statement_answers_this_point
Check how this was answered
statement point sp-effective-date
code no_statement_answers_this_point
this result says a clause stating the effective date: no_statement_answers_this_point
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause stating the term of the agreementgapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-term
code no_segment_matches_the_declared_scope
this result says a clause stating the term of the agreement: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause addressing renewal or extensiongapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-renewal
code no_segment_matches_the_declared_scope
this result says a clause addressing renewal or extension: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause stating termination rights and the notice they requiregapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-termination
code no_segment_matches_the_declared_scope
this result says a clause stating termination rights and the notice they require: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause stating the governing lawgapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-governing-law
code no_segment_matches_the_declared_scope
this result says a clause stating the governing law: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause stating when payment is duegapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-payment-terms
code no_segment_matches_the_declared_scope
this result says a clause stating when payment is due: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause addressing assignment and the consent it requiresgapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-assignment
code no_segment_matches_the_declared_scope
this result says a clause addressing assignment and the consent it requires: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.
a clause capping liabilitygapno_segment_matches_the_declared_scope
Check how this was answered
statement point sp-liability-cap
code no_segment_matches_the_declared_scope
this result says a clause capping liability: no_segment_matches_the_declared_scope
remedy not_curable
Source nothing was located
No span. No clause matching this item was located in the draft, so there is nothing to mark.

Drafting

uncapitalized-defined-term: Agreementfindinguncapitalized-defined-term
Check how this was answered
check uncapitalized-defined-term
term Agreement
uses elsewhere in the draft 1
derivation drv:69bdc4935d39784ab41aafbe693f51f5
produced by …/legal/drafting-finding@1
Source paragraph 10 of the draft
2.2 Each Indemnitee shall give notice to the Seller. This agreement shall be governed by the laws of New York.
paragraph 10 of the draft, character 58
defined-never-used: Affiliatefindingdefined-never-used
Check how this was answered
check defined-never-used
term Affiliate
uses elsewhere in the draft 0
derivation drv:1f86eaed09deba01aab34e6c4f33195b
produced by …/legal/drafting-finding@1
Source paragraph 6 of the draft
1.3 "Affiliate" means any entity controlling a party.
paragraph 6 of the draft, character 5
defined-never-used: Beneficial Ownership Regulationfindingdefined-never-used
Check how this was answered
check defined-never-used
term Beneficial Ownership Regulation
uses elsewhere in the draft 0
derivation drv:320318d8f7f673a457da3ae7354a0d0c
produced by …/legal/drafting-finding@1
Source paragraph 7 of the draft
1.4 "Beneficial Ownership Regulation" means 31 C.F.R. § 1010.230.
paragraph 7 of the draft, character 5
declared-defined-never-defined: Required Insurancefindingdeclared-defined-never-defined
Check how this was answered
check declared-defined-never-defined
term Required Insurance
uses elsewhere in the draft 1
derivation drv:bdfbee055833db2b2f46ec509b6a73a9
produced by …/legal/drafting-finding@1
Source paragraph 15 of the draft
4.1 The Buyer shall maintain the Required Insurance (as defined below).
paragraph 15 of the draft, character 33
dangling-cross-reference: Section 9.4findingdangling-cross-reference
Check how this was answered
check dangling-cross-reference
term Section 9.4
uses elsewhere in the draft 1
derivation drv:13d0a53554a1f6048d33300fc9f2aeb3
produced by …/legal/drafting-finding@1
Source paragraph 4 of the draft
1.1 "Indemnitee" means any person entitled to indemnification under Section 9.4.
paragraph 4 of the draft, character 68
modal-convention: Sellerfindingmodal-convention
Check how this was answered
check modal-convention
term Seller
uses elsewhere in the draft 1
derivation drv:82d0636b6fb92c1776164eaf30b04c2e
produced by …/legal/drafting-finding@1
Source paragraph 12 of the draft
3.1 The Seller will indemnify each Indemintee.
paragraph 12 of the draft, character 8
defined-term-near-miss: Indemniteefindingdefined-term-near-miss
Check how this was answered
check defined-term-near-miss
term Indemnitee
uses elsewhere in the draft 1
derivation drv:9b096876c14213795866fe3b0eced854
produced by …/legal/drafting-finding@1
Source paragraph 12 of the draft
3.1 The Seller will indemnify each Indemintee.
paragraph 12 of the draft, character 35

Cross-references

Cross-reference: Section 9.4dangling
Check how this was answered
verdict dangling
kind section
produced by …/legal/cross-reference@1
Source paragraph 4 of the draft
1.1 "Indemnitee" means any person entitled to indemnification under Section 9.4.
paragraph 4 of the draft

Boundary

CERTIFIED: this report states which of the operator's declared checklist items were LOCATED in the document submitted, and names the section each was located in.

NOT ATTESTED That an item reported as not located is absent from the agreement is not attested. That no clause matching a checklist item was located is a statement about what these declarations matched. A term may sit in an exhibit, in a separate instrument, or be phrased past any declaration.

CERTIFIED: each finding is a binary test against this document's own declarations - a term it quoted as defined, a phrase it said is defined, a reference the cross-reference resolver could not resolve in the copy submitted, a count of the modal verbs it uses, a token one edit from a term it defined - and every finding carries the sites it was found at.

NOT CERTIFIED: that any finding is an error. A lowercase use may be the ordinary word, a near-miss may be a different word, and a reference not located in the copy submitted may be in an attachment filed separately. Nothing here is corrected, merged or judged, and no finding refuses the document.

vd-2b223ab58835e187
Key
A development key minted for this recording. Not the production issuer key.
Algorithm
ed25519
Canonical form
VD-CANON-1
Signature
H45Ig/5XCDppqEulxGwu0rswqBvKvT6S91yZqNqnPjtLwC5HuowuYNE4ji0V6gkoUVXYflKWItcEY9rfj8qsCQ==

8 of 9 clause items are absent, each with its code. The draft does mention payment and governing law, inside its supply article. The checklist looks for each clause in a section whose heading names it, and finding none it says so with no_segment_matches_the_declared_scope, a different code from a section that exists but does not say it. In the longer agreement below, where those sections exist, the clauses are located. The 5 prose sections were refused by name, because no AI engine was configured.

Two drafts, compared

The second draft is the first with two edits: figure changed in 5.1 (limitation of liability), and clause removed in ARTICLE 6 TERMINATION and its paragraph 6.1. Every other byte is the same.

The comparison reads each checklist clause in each draft and states one verdict for it.

unchanged3changed1removed1added0not located in either4refused0
POST /api/tenants/{tenant}/certify-revision
a clause identifying the parties to the agreementunchanged
Check how this was answered
statement point sp-parties
rule clause-span-text-whitespace-folded@1
this result says "sp-parties" (a clause identifying the parties to the agreement): UNCHANGED - the clause located in the baseline "baseline.html" in block 1 and the clause located in the candidate "candidate.html" in block 1 are equal under clause-span-text-whitespace-folded@1
Source the clause in each draft
This Master Supply Agreement (the "Agreement") is entered into by and between Acme Corp.
first draft, paragraph 2
This Master Supply Agreement (the "Agreement") is entered into by and between Acme Corp.
second draft, paragraph 2
a clause stating the effective datenot_located_in_either
Check how this was answered
statement point sp-effective-date
rule clause-span-text-whitespace-folded@1
this result says "sp-effective-date" (a clause stating the effective date): NOT LOCATED IN EITHER DRAFT - no clause matching this checklist item was located in the baseline "baseline.html" [no_statement_answers_this_point] or in the candidate "candidate.html" [no_statement_answers_this_point] under the declared forms
Source the clause in each draft
Not located in the first draft.
Not located in the second draft.
a clause stating the term of the agreementnot_located_in_either
Check how this was answered
statement point sp-term
rule clause-span-text-whitespace-folded@1
this result says "sp-term" (a clause stating the term of the agreement): NOT LOCATED IN EITHER DRAFT - no clause matching this checklist item was located in the baseline "baseline.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] or in the candidate "candidate.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] under the declared forms
Source the clause in each draft
Not located in the first draft.
Not located in the second draft.
a clause addressing renewal or extensionnot_located_in_either
Check how this was answered
statement point sp-renewal
rule clause-span-text-whitespace-folded@1
this result says "sp-renewal" (a clause addressing renewal or extension): NOT LOCATED IN EITHER DRAFT - no clause matching this checklist item was located in the baseline "baseline.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] or in the candidate "candidate.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] under the declared forms
Source the clause in each draft
Not located in the first draft.
Not located in the second draft.
a clause stating termination rights and the notice they requireremoved
Check how this was answered
statement point sp-termination
rule clause-span-text-whitespace-folded@1
this result says "sp-termination" (a clause stating termination rights and the notice they require): REMOVED - a clause matching this checklist item was located in the baseline "baseline.html" in the section marked "6.1"; no clause matching this checklist item was located in the candidate "candidate.html" under the declared forms [no_segment_matches_the_declared_scope, 0 section(s) searched]
Source the clause in each draft
Either party may terminate this Agreement by giving sixty days written notice to the other party.
first draft, paragraph 16
Not located in the second draft.
a clause stating the governing lawunchanged
Check how this was answered
statement point sp-governing-law
rule clause-span-text-whitespace-folded@1
this result says "sp-governing-law" (a clause stating the governing law): UNCHANGED - the clause located in the baseline "baseline.html" in the section marked "7.1" and the clause located in the candidate "candidate.html" in the section marked "7.1" are equal under clause-span-text-whitespace-folded@1
Source the clause in each draft
This Agreement shall be governed by the laws of New York.
first draft, paragraph 18
This Agreement shall be governed by the laws of New York.
second draft, paragraph 16
a clause stating when payment is dueunchanged
Check how this was answered
statement point sp-payment-terms
rule clause-span-text-whitespace-folded@1
this result says "sp-payment-terms" (a clause stating when payment is due): UNCHANGED - the clause located in the baseline "baseline.html" in the section marked "4.1" and the clause located in the candidate "candidate.html" in the section marked "4.1" are equal under clause-span-text-whitespace-folded@1
Source the clause in each draft
The Buyer shall pay each undisputed invoice within thirty days after the Buyer receives it.
first draft, paragraph 12
The Buyer shall pay each undisputed invoice within thirty days after the Buyer receives it.
second draft, paragraph 12
a clause addressing assignment and the consent it requiresnot_located_in_either
Check how this was answered
statement point sp-assignment
rule clause-span-text-whitespace-folded@1
this result says "sp-assignment" (a clause addressing assignment and the consent it requires): NOT LOCATED IN EITHER DRAFT - no clause matching this checklist item was located in the baseline "baseline.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] or in the candidate "candidate.html" [no_segment_matches_the_declared_scope, 0 section(s) searched] under the declared forms
Source the clause in each draft
Not located in the first draft.
Not located in the second draft.
a clause capping liabilitychanged
Check how this was answered
statement point sp-liability-cap
rule clause-span-text-whitespace-folded@1
this result says "sp-liability-cap" (a clause capping liability): CHANGED - the clause located in the baseline "baseline.html" in the section marked "5.1" and the clause located in the candidate "candidate.html" in the section marked "5.1" differ under clause-span-text-whitespace-folded@1; both texts are carried on this verdict
Source the clause in each draft
The total liability of the Seller under this Agreement shall not exceed 500,000 dollars.
first draft, paragraph 14
The total liability of the Seller under this Agreement shall not exceed 250,000 dollars.
second draft, paragraph 14

CERTIFIED: this report states, for the declared pair of contract drafts, which items of the declared checklist were located in the baseline and which in the candidate, whether each item located in both is equal under the named equality rule, one verdict per checklist item naming that rule and the checklist version, and the content hash of each draft as submitted. For every one of the 9 located readings its verdicts carry, it also states the byte range in that draft at which the clause or reference was read and the markup there, whose reading is the located text.

NOT ATTESTED That either draft is correct, or that the candidate improves on or worsens the baseline, is not attested. The legal effect of any clause, of any change between the drafts, or of any removal is not attested. That either draft is complete beyond the questions this checklist declares is not attested. That an item reported as not located in a draft is absent from that agreement is not attested; it is a statement about what these declarations matched in the copy submitted. That two clauses reported as unchanged mean the same thing beyond equality of their text under the named rule is not attested. Which draft came first, and whether one supersedes or incorporates the other, is not attested beyond what the caller declared.

Four clauses are not located in either draft, under the same rule in both. A comparison states differences between these two files, and nothing about any other.

Check it without Factum

The certificate is published as it was returned. Download it with the key and the Factum Verifier, and run the command. It needs Node 18 or later and nothing else.

Verifiedexit 0

The files: certificate.json, public-key.txt, the short draft, first draft, second draft, SHA256SUMS.

The key is a development key minted for this recording. A valid signature says the holder of this key signed these bytes.

Recorded outputThe verifier's output on this certificate (exit code 0).
node factum-verify.mjs certificate.json public-key.txt
VERIFIED
  keyId            vd-2b223ab58835e187
  canonical bytes  57094
  barcode          … (the signed barcode, 462 characters, printed in full when you run it)
  surface          FULL - the body carries no surface block, so every claim the run captured is on it

  CERTIFIED BY THIS CHECK: this document was signed by the holder of the private half of the
  key you supplied, over the canonical form named in its signature block, and has not been
  altered by one byte since.
  NOT CERTIFIED BY THIS CHECK: that the key you supplied is the operator's. That comes from
  WHERE YOU OBTAINED THE KEY and from nothing in this file - a valid signature under the wrong
  key is exactly what a forgery looks like.

The certificate is published as it was returned. Download it with the key and the Factum Verifier, and run the command. It needs Node 18 or later and nothing else.

Verifiedexit 0

The files: revision.json, public-key.txt.

Recorded outputThe verifier's output on this certificate (exit code 0).
node factum-verify.mjs revision.json public-key.txt
VERIFIED
  keyId            vd-2b223ab58835e187
  canonical bytes  72389
  barcode          … (the signed barcode, 525 characters, printed in full when you run it)
  surface          FULL - the body carries no surface block, so every claim the run captured is on it

  CERTIFIED BY THIS CHECK: this document was signed by the holder of the private half of the
  key you supplied, over the canonical form named in its signature block, and has not been
  altered by one byte since.
  NOT CERTIFIED BY THIS CHECK: that the key you supplied is the operator's. That comes from
  WHERE YOU OBTAINED THE KEY and from nothing in this file - a valid signature under the wrong
  key is exactly what a forgery looks like.