Document completeness check
Checks a set of documents against a checklist. Returns complete, incomplete or unclear, accounting for missing, expired, unsigned or incorrectly attributed documents.
Example
Context
- context
- organisation: A small business lender reviewer: Loan operations analyst pack_kind: Business loan application purpose: Check the application pack is complete before credit review review_date: 2 November 2026
- checklist
- - Signed loan application form (all pages) - Business bank statements for the last three months - Photo identification of every director - Latest annual accounts (only for businesses trading more than two years)
Input
case: {"name":"Ferngrove Bakery Ltd","reference":"APP-20931","trading_since":"March 2025","directors":["Priya Natarajan","Tom Okafor"]} documents_received: [{"kind":"Loan application form","date":"28 October 2026","pages":"4 of 4","signatures":"signed by Priya Natarajan"},{"kind":"Business bank statements","date":"July, August and September 2026","pages":"complete"},{"kind":"Passport","date":"valid until 2031","about":"Priya Natarajan"}]
- Answer (JSON)
- value incomplete, confidence 0.965
- Top options
- incomplete 0.965
- complete 0.034
- unclear 0.001
The bakery has two directors but the pack holds photo identification for only one, so it is incomplete.
import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": { "organisation": "A small business lender", "reviewer": "Loan operations analyst", "pack_kind": "Business loan application", "purpose": "Check the application pack is complete before credit review", "review_date": "2 November 2026", }, "checklist": [ "Signed loan application form (all pages)", "Business bank statements for the last three months", "Photo identification of every director", "Latest annual accounts (only for businesses trading more than two years)", ], }) decision = decide({ "case": { "name": "Ferngrove Bakery Ltd", "reference": "APP-20931", "trading_since": "March 2025", "directors": [ "Priya Natarajan", "Tom Okafor", ], }, "documents_received": [ { "kind": "Loan application form", "date": "28 October 2026", "pages": "4 of 4", "signatures": "signed by Priya Natarajan", }, { "kind": "Business bank statements", "date": "July, August and September 2026", "pages": "complete", }, { "kind": "Passport", "date": "valid until 2031", "about": "Priya Natarajan", }, ], }) print(decision.value, decision.confidence)
More examples
Director's passport that has expiredanswer incomplete · confidence 0.986
Context
- context
- organisation: A small business lender reviewer: Loan operations analyst pack_kind: Business loan application purpose: Check the application pack is complete before credit review review_date: 2 November 2026
- checklist
- - Signed loan application form (all pages) - Business bank statements for the last three months - Photo identification of every director - Latest annual accounts (only for businesses trading more than two years)
Input
case: {"name":"Quayside Bikes Ltd","reference":"APP-20945","trading_since":"June 2025","directors":["Ewan Gallagher"]} documents_received: [{"kind":"Loan application form","date":"30 October 2026","pages":"4 of 4","signatures":"signed by Ewan Gallagher"},{"kind":"Business bank statements","date":"August, September and October 2026","pages":"complete"},{"kind":"Passport","date":"expired on 3 March 2026","about":"Ewan Gallagher"}]
- Answer (JSON)
- value incomplete, confidence 0.986
- Top options
- incomplete 0.986
- complete 0.013
- unclear 0.001
The only director's passport expired before the review, so the pack is
incomplete.import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": { "organisation": "A small business lender", "reviewer": "Loan operations analyst", "pack_kind": "Business loan application", "purpose": "Check the application pack is complete before credit review", "review_date": "2 November 2026", }, "checklist": [ "Signed loan application form (all pages)", "Business bank statements for the last three months", "Photo identification of every director", "Latest annual accounts (only for businesses trading more than two years)", ], }) decision = decide({ "case": { "name": "Quayside Bikes Ltd", "reference": "APP-20945", "trading_since": "June 2025", "directors": [ "Ewan Gallagher", ], }, "documents_received": [ { "kind": "Loan application form", "date": "30 October 2026", "pages": "4 of 4", "signatures": "signed by Ewan Gallagher", }, { "kind": "Business bank statements", "date": "August, September and October 2026", "pages": "complete", }, { "kind": "Passport", "date": "expired on 3 March 2026", "about": "Ewan Gallagher", }, ], }) print(decision.value, decision.confidence)
Trading start date not givenanswer unclear · confidence 0.977
Context
- context
- organisation: A small business lender reviewer: Loan operations analyst pack_kind: Business loan application purpose: Check the application pack is complete before credit review review_date: 2 November 2026
- checklist
- - Signed loan application form (all pages) - Business bank statements for the last three months - Photo identification of every director - Latest annual accounts (only for businesses trading more than two years)
Input
case: {"name":"Brackenridge Florists Ltd","reference":"APP-20960","trading_since":"not stated on the application","directors":["Amara Osei"]} documents_received: [{"kind":"Loan application form","date":"31 October 2026","pages":"4 of 4","signatures":"signed by Amara Osei"},{"kind":"Business bank statements","date":"July, August and September 2026","pages":"complete"},{"kind":"Passport","date":"valid until 2030","about":"Amara Osei"}]
- Answer (JSON)
- value unclear, confidence 0.977
- Top options
- unclear 0.977
- incomplete 0.017
- complete 0.006
The pack does not say when the firm started trading, which decides whether annual accounts are needed, so the answer is
unclear.import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": { "organisation": "A small business lender", "reviewer": "Loan operations analyst", "pack_kind": "Business loan application", "purpose": "Check the application pack is complete before credit review", "review_date": "2 November 2026", }, "checklist": [ "Signed loan application form (all pages)", "Business bank statements for the last three months", "Photo identification of every director", "Latest annual accounts (only for businesses trading more than two years)", ], }) decision = decide({ "case": { "name": "Brackenridge Florists Ltd", "reference": "APP-20960", "trading_since": "not stated on the application", "directors": [ "Amara Osei", ], }, "documents_received": [ { "kind": "Loan application form", "date": "31 October 2026", "pages": "4 of 4", "signatures": "signed by Amara Osei", }, { "kind": "Business bank statements", "date": "July, August and September 2026", "pages": "complete", }, { "kind": "Passport", "date": "valid until 2030", "about": "Amara Osei", }, ], }) print(decision.value, decision.confidence)
Application form nobody signedanswer incomplete · confidence 1
Context
- context
- organisation: A small business lender reviewer: Loan operations analyst pack_kind: Business loan application purpose: Check the application pack is complete before credit review review_date: 2 November 2026
- checklist
- - Signed loan application form (all pages) - Business bank statements for the last three months - Photo identification of every director - Latest annual accounts (only for businesses trading more than two years)
Input
case: {"name":"Tern Valley Kayaks Ltd","reference":"APP-20967","trading_since":"May 2025","directors":["Luca Benedetti"]} documents_received: [{"kind":"Loan application form","date":"1 November 2026","pages":"4 of 4","signatures":"not signed"},{"kind":"Business bank statements","date":"August, September and October 2026","pages":"complete"},{"kind":"Passport","date":"valid until 2032","about":"Luca Benedetti"}]
- Answer (JSON)
- value incomplete, confidence 1
- Top options
- incomplete 1
- complete 0
- unclear 0
The application form is in the pack but nobody signed it, so the pack is
incomplete.import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": { "organisation": "A small business lender", "reviewer": "Loan operations analyst", "pack_kind": "Business loan application", "purpose": "Check the application pack is complete before credit review", "review_date": "2 November 2026", }, "checklist": [ "Signed loan application form (all pages)", "Business bank statements for the last three months", "Photo identification of every director", "Latest annual accounts (only for businesses trading more than two years)", ], }) decision = decide({ "case": { "name": "Tern Valley Kayaks Ltd", "reference": "APP-20967", "trading_since": "May 2025", "directors": [ "Luca Benedetti", ], }, "documents_received": [ { "kind": "Loan application form", "date": "1 November 2026", "pages": "4 of 4", "signatures": "not signed", }, { "kind": "Business bank statements", "date": "August, September and October 2026", "pages": "complete", }, { "kind": "Passport", "date": "valid until 2032", "about": "Luca Benedetti", }, ], }) print(decision.value, decision.confidence)
Long-trading firm without its accountsanswer incomplete · confidence 0.982
Context
- context
- organisation: A small business lender reviewer: Loan operations analyst pack_kind: Business loan application purpose: Check the application pack is complete before credit review review_date: 2 November 2026
- checklist
- - Signed loan application form (all pages) - Business bank statements for the last three months - Photo identification of every director - Latest annual accounts (only for businesses trading more than two years)
Input
case: {"name":"Hollin & Daughters Joinery Ltd","reference":"APP-20952","trading_since":"April 2011","directors":["Ruth Hollin"]} documents_received: [{"kind":"Loan application form","date":"29 October 2026","pages":"4 of 4","signatures":"signed by Ruth Hollin"},{"kind":"Business bank statements","date":"August, September and October 2026","pages":"complete"},{"kind":"Passport","date":"valid until 2033","about":"Ruth Hollin"}]
- Answer (JSON)
- value incomplete, confidence 0.982
- Top options
- incomplete 0.982
- complete 0.015
- unclear 0.003
The firm has traded since 2011, so it needs its latest annual accounts, and they are missing, so the pack is
incomplete.import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": { "organisation": "A small business lender", "reviewer": "Loan operations analyst", "pack_kind": "Business loan application", "purpose": "Check the application pack is complete before credit review", "review_date": "2 November 2026", }, "checklist": [ "Signed loan application form (all pages)", "Business bank statements for the last three months", "Photo identification of every director", "Latest annual accounts (only for businesses trading more than two years)", ], }) decision = decide({ "case": { "name": "Hollin & Daughters Joinery Ltd", "reference": "APP-20952", "trading_since": "April 2011", "directors": [ "Ruth Hollin", ], }, "documents_received": [ { "kind": "Loan application form", "date": "29 October 2026", "pages": "4 of 4", "signatures": "signed by Ruth Hollin", }, { "kind": "Business bank statements", "date": "August, September and October 2026", "pages": "complete", }, { "kind": "Passport", "date": "valid until 2033", "about": "Ruth Hollin", }, ], }) print(decision.value, decision.confidence)
Use when
- You need to assess whether a document submission meets a checklist.
Avoid when
- You need an itemised list of missing documents; this adapter assesses the submission as a whole.
Context and input
| Field | Kind | Description |
|---|---|---|
submission | input | The pack received: an object with the case (name, reference) and the documents received, each described (kind, date, pages, signatures). |
context | context | The review: an object with the organisation, the reviewer, the kind of pack, its purpose and the date of the review. |
checklist | context | The checklist: a list of required documents and conditions (some only for some cases). |
Functions
| Key | Interface | Instructions | Labels |
|---|---|---|---|
| is_complete | classify | Is the pack complete against the checklist? Go through every checklist line that applies to this case. A required document counts only if it is the kind of document listed (not a similar one), is about the subject of the case, has all its pages, is signed where the checklist asks for a signature, has not expired on the date of the review, and was issued within the period the checklist allows. A conditional line applies only when its circumstance holds for the case. complete: every applicable line is met (extra documents do not matter). incomplete: at least one applicable line is not met. unclear: no line is clearly unmet, but at least one cannot be decided from what is shown, for example a needed date, signature or page count is not visible, a document's kind cannot be told, or the case details do not say whether a conditional line's circumstance holds while its document is absent. Cover notes and labels may be misleading; judge the documents themselves. | complete, incomplete, unclear |
How it was measured
Test accuracy: the share of test rows whose top answer was right.
- 96.8% on the in-house test (1,974 rows). in-house: same generator as the training data
- 95.7% on a second in-house test of unseen cases (1,932 rows). in-house: same generator as the training data
When confident
From the calibration set: at or above the threshold confidence, how often the answer is right, and how often the adapter is that confident. Below it, escalate.
| Function | Right when confident | Confident on | Threshold | Calibration rows |
|---|---|---|---|---|
| is_complete | 98.0% | 96.7% | 0.79 | 1,941 |
Base: Jeff v1.4. Adapter trained: 25 October 2026.
Base
jeff-base v1.4
Call it
jeff.reasoning.is-complete.is_complete, with placeholders for its input and context.
import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client: decide = client.function("jeff.reasoning.is-complete.is_complete", context={ "context": "<context>", "checklist": "<checklist>", }) decision = decide("<submission>") print(decision.value, decision.confidence)
Download
Weights: mstrasser/jeff-adapter-is-complete (v1.4)
Licence: Apache-2.0