FACTUM

Worked examples · Analytics and composed checklists

A composed checklist.

A question of one's own, made from declared items. The composition is sent with the document on the same certify call, and the certificate answers exactly the items taken.

The problem

A declared checklist answers the question it was written for. Real work often needs part of one, or parts of several: the charge arithmetic and the container number of an invoice, without the rest.

Writing a new question for each need would mean answers no one else can compare. Composing from declared items keeps every answer under the rule that declared it, and keeps the composition itself on the record.

Recorded outputOne certify call of the demonstration's own synthetic invoice under a composition taking four data points, one arithmetic check and the identifier check from the demurrage and detention checklist; then the same call with an item the checklist does not declare. No AI engine was configured.

The declaration

The composition names the report type it takes from and the items it takes. It travels as one header on the certify call, with the document as the body.

A Finder search returns addresses in the same shape. Searching "demurrage" returned 2, and one of them is ready to compose: {"from":"fmc-demurrage-detention-invoice-completeness","statementPoints":["sp-cert-fmc-rules"]}.

Recorded outputThe composition, as sent.
{
  "id": "charge-total-and-container",
  "title": "Charge total and container number",
  "take": [
    {
      "from": "fmc-demurrage-detention-invoice-completeness",
      "dataPoints": [
        "dp-container-number",
        "dp-charged-dates",
        "dp-daily-rate",
        "dp-total-amount-due"
      ],
      "arithmeticPoints": [
        "ap-arith-charge-total"
      ],
      "mechanisms": [
        "identifierChecks"
      ]
    }
  ],
  … 1 more field: the schema identifier, printed in the API reference
}

The certificate answers what was taken

POST /api/tenants/{tenant}/certify?filename=syn-inv-01-complete-import.html · composition header · Content-Type: text/html
FACTUM
Charge total and container number
composed-charge-total-and-container
Issued2026-11-06T03:24:47.047Z Document sha256409c2b8b6b3a9e9731ee590dd552e4b4179c284d5aecfbdcee144a78b2720104

Verdicts

resolved4satisfied1invalid1

Answers

the container numberresolvedPBLU4471820
Check how this was answered
data point dp-container-number
fact fact-f6fe79882ec59943
Source table 1, row 3
Container Number │ PBLU4471820
grid · table 1, row 3, column 2
the dates chargedresolved2026-04-06, 2026-04-07, 2026-04-08, 2026-04-09, 2026-04-10
Check how this was answered
data point dp-charged-dates
fact fact-1f2875fc61c25ccc
Source table 1, row 12
Dates Charged │ 2026-04-06, 2026-04-07, 2026-04-08, 2026-04-09, 2026-04-10
grid · table 1, row 12, column 2
the daily rateresolved275.00
Check how this was answered
data point dp-daily-rate
fact fact-d6ee3650e96769fd
Source table 2, row 2
2026-04-06 │ PBLU4471820 │ 1 │ 275.00 │ 275.00
grid · table 2, row 2, column 4
the total amount dueresolved1375.00
Check how this was answered
data point dp-total-amount-due
fact fact-34fe5c129f430c4f
Source table 2, row 7
Total Amount Due │ │ │ │ 1375.00
grid · table 2, row 7, column 5

Arithmetic

Does the number of dates charged multiplied by the daily rate equal the total amount due?satisfied5 day(s) charged at 275.00 is 1375.00; the invoice states 1375.00.
Check how this was answered
arithmetic point ap-arith-charge-total
cites § 541.6(c)(1)–(3)
produced by …/arithmetic/count-times-rate-equals-total@1
Source the answers above
Computed from the located answers above.

Identifier check

Container Number: iso6346-container check digitinvalidPBLU4471820
Check how this was answered
this result says PBLU4471820, stated by this document under "Container Number", FAILS its iso6346-container check digit - the standard's computation gives 4 and the identifier as stated ends in 0. This is a finding ABOUT THE DOCUMENT: the value is captured exactly as written and is not corrected here, and it was read from the document's own text layer rather than recognised off an image.
computed digit 4
stated digit 0
Source the container number
The same cell as the container number above.

The composition, on the record

Declaration sha256
d8b6564511d69b511b3f7246b94ce3eeefc694ae028c0ef024caaef8b2c93d9f
Taken from
fmc-demurrage-detention-invoice-completeness@93a3bea14418…
Statement
COMPOSED CHECKLIST: composed-charge-total-and-container was composed by the caller from 1 catalogue checklist(s) (fmc-demurrage-detention-invoice-completeness@93a3bea14418dd6ef7478480699ff4045b48672cebb7ce900a9fc18a7095854f), taking 5 question(s) and 1 mechanism(s). Every question is that checklist's own declaration, copied unchanged, and is judged exactly as the catalogue judges it. The caller chose SCOPE ONLY: no rule, threshold, tolerance, rounding rule, coverage factor or boundary statement was set by the caller, and every setting this checklist carries is inherited from the checklist its questions came from.

Boundary

CERTIFIED: nothing under this boundary. This report type declares no coverage boundary.

NOT ATTESTED This certificate does not attest, under this boundary, that any item is present in the document or absent from it.

vd-2b223ab58835e187
Key
A development key minted for this recording. Not the production issuer key.
Algorithm
ed25519
Canonical form
VD-CANON-1
Signature
0vvLXw88xAuqTo7zlZGKk52fv4G++x7OLNJeTlQKN0sbPL7blmWpuOaNzQzp4Ow/f2l+Gj40HnjSROk4oO0xDQ==

The container number reads "invalid": the synthetic invoice's number does not carry the check digit its standard computes. It is a finding about the document, shown under its own word.

A composition cannot invent an item

The same call, taking one data point the checklist does not declare, is refused before anything is read.

refusedcomposition_item_unknown remedy different_input

Recorded outputThe refusal, status 422, at the parameters stage.
take[0] asks fmc-demurrage-detention-invoice-completeness for dataPoints "dp-not-in-the-catalogue", which that checklist does not declare (it declares "dp-bol-number", "dp-container-number", "dp-port-of-discharge", "dp-liability-basis", "dp-invoice-date", "dp-invoice-due-date", "dp-free-time-days", "dp-free-time-start", "dp-free-time-end", "dp-availability-date", "dp-earliest-return", "dp-charged-dates", "dp-total-amount-due", "dp-applicable-rule", "dp-daily-rate", "dp-dispute-contact", "dp-dispute-url", "dp-dispute-timeframe").

Counted afterwards

Archived certificates are counted by verdict and by refusal code on the Console's analytics screen, in the same five colours and no others. It states its population, and it has no score: the recorded screen.

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, 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  17562
  barcode          … (the signed barcode, 470 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.