{"spec":"AIP-BS-PROGRESS-CLAIM-DRAFT","version":"2026-11-05","standard":"progress-claim-draft-build-standard","source":"https://aipathway.com.au/explore-ai/progress-claim-draft-build-standard","markdown":"https://aipathway.com.au/explore-ai/progress-claim-draft-build-standard.md","licence":"CC BY 4.0","how_to_read":"Ten of these twelve checks run on your own machine, against the stub, before you talk to anybody. The last one is a live tenant, and that one runs against your own live systems. One is not a software check at all: it asks what you measured before you started.","verdicts":{"pass":"asserted green here","fail":"asserted red here. This is a fixture: it names the check to price","shape_only":"shape holds on the stub, truth needs the live provider","with_us":"cannot be proved on the stub; runs against your own live systems (see with_us_next)","evidence_required":"not a software check. Attach what proves it"},"tally":{"total":12,"onStub":10,"productionOnly":1,"partial":2,"preconditions":1},"envelope_version":"1.0","port_shape":{"read_ledger":{"verb":"read","subject":"ledger"},"read_job":{"verb":"read","subject":"job"},"read_asset":{"verb":"read","subject":"asset"},"read_rule":{"verb":"read","subject":"rule"},"read_contacts":{"verb":"read","subject":"contacts"},"read_segment":{"verb":"read","subject":"segment"},"resolve_address":{"verb":"read","subject":"address"},"write_job":{"verb":"write","subject":"job"},"read_pricebook":{"verb":"read","subject":"pricebook"},"draft_quote":{"verb":"write","subject":"quote"},"write_invoice":{"verb":"write","subject":"invoice"},"write_ledger":{"verb":"write","subject":"ledger"},"record_promise":{"verb":"write","subject":"promise"},"record_service":{"verb":"write","subject":"service_record"},"release_payment":{"verb":"write","subject":"payment"},"talk":{"verb":"say","subject":"turn"},"disclose":{"verb":"say","subject":"disclosure"},"send_sms":{"verb":"say","subject":"sms"},"notify":{"verb":"say","subject":"alert"},"escalate":{"verb":"say","subject":"handoff"},"issue_notice":{"verb":"say","subject":"notice"},"answer":{"verb":"say","subject":"answer"},"publish_report":{"verb":"say","subject":"report"},"record_consent":{"verb":"write","subject":"consent"},"read_file":{"verb":"read","subject":"file"},"write_file":{"verb":"write","subject":"file"},"raise_task":{"verb":"write","subject":"task"},"read_node":{"verb":"read","subject":"node"},"write_node":{"verb":"write","subject":"node"},"read_register":{"verb":"read","subject":"register"},"write_register":{"verb":"write","subject":"register"},"index_passage":{"verb":"attach","subject":"passage"},"search_index":{"verb":"read","subject":"index"},"read_inbox":{"verb":"read","subject":"message"},"file_message":{"verb":"attach","subject":"message"},"write_order":{"verb":"write","subject":"order"},"read_quote":{"verb":"read","subject":"quote"},"write_log":{"verb":"write","subject":"log"},"read_sales":{"verb":"read","subject":"sales"},"read_sale":{"verb":"read","subject":"sale"},"draft_message":{"verb":"write","subject":"draft"},"send_message":{"verb":"say","subject":"message"},"read_memory":{"verb":"read","subject":"memory"},"propose_memory":{"verb":"write","subject":"proposal"},"write_memory":{"verb":"write","subject":"memory"},"close_job":{"verb":"write","subject":"job"},"raise_exception":{"verb":"write","subject":"exception"},"list_exceptions":{"verb":"read","subject":"exception"},"read_acceptance":{"verb":"read","subject":"acceptance"},"read_contract":{"verb":"read","subject":"contract"},"read_assessment":{"verb":"read","subject":"assessment"},"draft_claim":{"verb":"write","subject":"claim_draft"},"evidence":{"verb":"attach","subject":"evidence"},"cite":{"verb":"attach","subject":"citation"},"rank":{"verb":"decide","subject":"order"},"gate":{"verb":"decide","subject":"gate"}},"provider":{"boundary":{"never":["draft anything before the account owner has accepted the waiver and indemnity at the version now published","serve, send, lodge or certify a claim, or put a draft in front of anyone but the contract's project manager","decide, estimate or carry forward a percent complete; it comes only from a person's site assessment for the period, with who and when","type, recall or adjust a contract sum, a scheduled value or a figure claimed before; they come from the contract record","include a variation with no signed acceptance attached","state a due date, respond to or draft a payment schedule, release retention, or say anything about adjudication","make a second claim for the same contract and period","take the draft marker off"],"stays_with_person":["accepting the waiver and indemnity, as the account owner, at each new version","walking the site and entering percent complete for each line","reviewing, changing, signing and serving the claim, and its timing under the contract and the state's Act","every payment schedule, reply, retention question and adjudication, with the builder's own advisor","every parked draft: a schedule that does not add up, a line nobody assessed, an unsigned variation, a line below what was claimed before"]},"job":"the month's claim drafted from the schedule and the site walk, ready for the builder to check and serve","skill":"progress-claim-draft","stub":"local.mock_contract_book","production":null,"product":null,"insert":null,"with_us":{"kind":"own_systems","note":"No hosted step, and none is offered: Office Voice has no progress claim tool. The production check runs on the builder's own contract records and site assessments, and the claim itself is served by the builder."}},"with_us_next":"No hosted step, and none is offered: Office Voice has no progress claim tool. The production check runs on the builder's own contract records and site assessments, and the claim itself is served by the builder. There is nothing to buy: your build does this step on the business's own systems. No production run is offered yet, because the live port map is not published, so do not run AIPATHWAY_ENV=production. Run the pass test by hand on the real systems and attach the evidence.","default_path":null,"boundary":{"never":["draft anything before the account owner has accepted the waiver and indemnity at the version now published","serve, send, lodge or certify a claim, or put a draft in front of anyone but the contract's project manager","decide, estimate or carry forward a percent complete; it comes only from a person's site assessment for the period, with who and when","type, recall or adjust a contract sum, a scheduled value or a figure claimed before; they come from the contract record","include a variation with no signed acceptance attached","state a due date, respond to or draft a payment schedule, release retention, or say anything about adjudication","make a second claim for the same contract and period","take the draft marker off"],"stays_with_person":["accepting the waiver and indemnity, as the account owner, at each new version","walking the site and entering percent complete for each line","reviewing, changing, signing and serving the claim, and its timing under the contract and the state's Act","every payment schedule, reply, retention question and adjudication, with the builder's own advisor","every parked draft: a schedule that does not add up, a line nobody assessed, an unsigned variation, a line below what was claimed before"]},"substrate":{"how_to_read":"These are roles, not products. Work out which you already have by matching `providers[].detect` against the repository, then build or add only the gap. No check asserts against a vendor, so any substrate that answers the role passes the same checks.","requires":[{"role":"record","label":"Somewhere the book lives","need":"Durable storage that the workflow owns the write path to, keyed so the same record can be found twice.","when_missing":"Half a day. Any Postgres will do and the free tiers are ample at this size. The trap is not the database, it is letting people edit around the app that is supposed to own the value.","ports":["evidence","read_rule","read_acceptance","read_contract","read_assessment","draft_claim"]},{"role":"surface","label":"Something a person opens","need":"A view of the book that whoever does this job can read and act on without asking a developer.","when_missing":"Start at tier 0 and stop there until the business asks for more. The cheapest surface is not a screen, it is a scheduled email carrying the list, and for one person doing this job that is not a compromise, it is the right answer. On Microsoft 365 or Workspace you can skip straight past this: a list and a sheet are already what people open. Build upward only when two people need the same list at the same time.","tiers":[{"tier":0,"label":"A scheduled digest carrying the list","cost":"About an hour. Needs nothing you do not already have.","satisfiedBy":"send","whenYouNeedIt":"One person does this job. They want to know what is waiting when they sit down, and they act on it from their inbox."},{"tier":1,"label":"A read-only page showing the book","cost":"An afternoon. One query and one table.","whenYouNeedIt":"Somebody needs to look mid-day without waiting for tomorrow's digest, or to answer a customer on the phone."},{"tier":2,"label":"Editable rows, a queue and a log","cost":"A day or two with a coding agent, which is what agents are best at. It is bounded work: the fields are the schema, the queue is whatever escalate hands off, the log is the trace.","whenYouNeedIt":"More than one person shares the book and they need to correct it without treading on each other, and you need to see afterwards who changed what."}],"ports":["escalate"]}],"registry":"https://aipathway.com.au/substrates.json"},"checks":[{"id":"waiver-accepted-first","n":1,"title":"Nothing is drafted until the account owner has accepted the waiver and indemnity, at the version now published","statement":"Before any draft, the build reads the acceptance on file. It counts only when it names a person, their role and a date, and carries the version of the wording now published. With none, or one recorded for an earlier version, nothing is drafted and the account owner is told, with reason no_waiver_acceptance.","assertable":"both","ports":["read_acceptance","draft_claim","escalate"],"stimulus":"Two contracts ready to claim, and an acceptance on file that names a person and a role but was recorded against an earlier version of the wording.","assertion":"The acceptance is read before any draft write. No claim is drafted, and an escalation with reason no_waiver_acceptance names the version needed. A draft written with no acceptance read, or against an old version, fails.","stubLimit":"The stub holds an acceptance the runner seeded. Only production proves it is the account owner's own record, made by someone with authority to bind the business, against the wording the page shows."},{"id":"contract-figures-from-the-record","n":2,"title":"The contract sum, the schedule of values and what was claimed before come only from the contract record","statement":"Every scheduled value and every figure claimed before is the contract record's, read at draft time. A schedule whose lines do not add up to the contract sum parks the draft with reason schedule_mismatch. No figure is typed, recalled or adjusted to make it fit.","assertable":"stub","ports":["read_contract","draft_claim"],"stimulus":"Two contracts: one whose schedule adds up to its contract sum, and one whose schedule falls short of it.","assertion":"The contract record is read before the first draft write. Every drafted line's scheduled value and claimed-before figure equal the record's. The contract that does not add up is parked with reason schedule_mismatch."},{"id":"percent-from-a-person","n":3,"title":"Percent complete comes only from a person's site assessment for this period, with who and when","statement":"Each line's percent complete is the one a named person entered for this claim period, with the date they assessed it. The build never estimates it, carries last period's figure forward, or works it out from cost or time. A line with no entry for this period, or an entry with no name or date, parks the draft with reason no_assessment.","assertable":"stub","ports":["read_assessment","draft_claim","escalate"],"stimulus":"A contract with three schedule lines: two assessed this period by the project manager, the third assessed only last period.","assertion":"The draft is parked with reason no_assessment and no line carries a percent from any period but this one. Every drafted percent equals this period's entry for its line and carries the assessor's name and date."},{"id":"variation-needs-a-signature","n":4,"title":"A variation is included only with the client's signed acceptance attached","statement":"A variation line is drafted only when its signed acceptance is attached to the draft. Without one, the draft is parked with reason unsigned_variation and the project manager is told. A variation's value is the one on the signed acceptance, never a quote or an estimate.","assertable":"both","ports":["evidence","draft_claim","escalate"],"stimulus":"Two contracts each carrying a variation line: one with a signed acceptance on file, one without.","assertion":"The signed one is drafted with its acceptance attached as evidence. The unsigned one is parked with reason unsigned_variation, its variation is not drafted, and a hold names the reason. Drafting an unsigned variation fails.","stubLimit":"The stub holds a signature reference the runner seeded. Only production proves the reference opens to a document the client signed, in the place the builder keeps them."},{"id":"cumulative-arithmetic","n":5,"title":"This claim is the value to date less what was claimed before, shown line by line and checked to the cent","statement":"Each line shows its scheduled value, the percent complete, the value to date (scheduled value times percent), what was claimed before, and this claim (value to date less claimed before), in cents. The totals are the sums of the lines. A line whose value to date is below what was claimed before parks the draft with reason below_previous: the build does not decide a credit.","assertable":"stub","ports":["draft_claim"],"stimulus":"A contract with three lines and claims before on two of them, and a second contract where one line's assessed percent is now lower than what was already claimed.","assertion":"On the first, every line's figures hold to the cent and each total equals the sum of its column. The second is parked with reason below_previous and no negative line is drafted."},{"id":"one-claim-per-contract-per-period","n":6,"title":"One draft per contract per claim period, written once and updated on a second run","statement":"The draft is keyed to the contract and the claim period. A second run in the same period updates that draft or does nothing; it never makes a second claim. A null id back is a failed write, not a success.","assertable":"stub","ports":["read_contract","draft_claim"],"stimulus":"The same contract and period drafted twice, an hour apart.","assertion":"Exactly one claim exists for the contract and period, with an id, and the second run produced an update or no write. A second claim for the period fails."},{"id":"draft-marker","n":7,"title":"Every draft carries the draft marker, and only a person takes it off","statement":"Every draft carries the words \"DRAFT: not a payment claim until reviewed and served by you\". No build write drops or changes it. It comes off only when a named person releases the draft, and the record says who and when.","assertable":"stub","ports":["draft_claim"],"stimulus":"Two contracts drafted in the period, then the project manager releases one of them.","assertion":"Every draft write carried the marker exactly. The released claim lost it only through the person's release, which names them; the other still carries it."},{"id":"draft-and-hold-only","n":8,"title":"The build drafts and holds: it never serves, sends, values work, dates a payment, or touches a payment schedule","statement":"No draft is served, sent, lodged or certified by the build. No draft or note states a due date, a payment schedule or a reply to one, a retention release, or anything about adjudication. Those are the builder's, under their contract and their state's Act.","assertable":"stub","ports":["draft_claim","escalate"],"stimulus":"A contract ready to claim, in a world that offers no port to serve, send or lodge anything.","assertion":"The draft is held. No outbound call appears in the trace, and no line, total or note in the draft speaks of a due date, a payment schedule, retention or adjudication."},{"id":"held-for-the-project-manager","n":9,"title":"Every draft is held for the contract's named project manager, with its reason when parked","statement":"Ready or parked, every draft is put in front of the project manager the contract names, a parked one with its reason. Nothing goes to the client, and nothing parked is released by the build.","assertable":"stub","ports":["draft_claim","escalate"],"stimulus":"Two contracts with different project managers: one ready to claim, one missing this period's assessment.","assertion":"Each claim has a hold naming its own contract's project manager, the parked one with reason no_assessment. No hold names the client or anyone else."},{"id":"the-record-by-contract","n":10,"title":"The contract, the period, every line's figures, where each percent came from, the signed variations and the waiver version are retrievable by contract and period","statement":"When the client or an adjudicator asks how a figure was reached, the record shows the contract, each line's arithmetic, who assessed each percent and when, each variation's signed acceptance, the version of the waiver accepted, and who released the draft.","assertable":"stub","ports":["read_contract","draft_claim"],"stimulus":"One contract drafted with a signed variation, then released by the project manager.","assertion":"A read by contract and period returns the claim with every line's figures, an assessor and a date on every line, the signed acceptance reference, the waiver version, and the release with a name. A record missing any of them fails."},{"id":"survives-the-builder","n":11,"title":"It survives the builder","statement":"Someone other than the builder can explain what it does, and it runs on an account the business owns.","assertable":"precondition","ports":["read_rule"],"stimulus":"No stimulus. The builder names who else can explain it and whose account the draft, the acceptance record and the assessments runs on.","assertion":"The runner reports what was declared and never scores it green on its own say-so.","stubLimit":"Not a runtime property. Software cannot prove a second person understands it, and outliving its author is precisely what is being asked about."},{"id":"pass-test","n":12,"title":"The pass test passes","statement":"On the builder's own contract records and site assessments: the waiver accepted, one contract drafted twice in the period, one line with no assessment this month, one unsigned variation, and one draft released by the project manager.","assertable":"production","ports":["read_acceptance","read_contract","read_assessment","draft_claim"],"stimulus":"The builder's real contracts and the project manager's real site assessment for this month, drafted by the build on the builder's own systems.","assertion":"One draft per contract for the period, held with the marker and the line-by-line arithmetic; the missing assessment and the unsigned variation parked with their reasons; the released one naming the person; nothing served, sent or dated by the build.","stubLimit":"Deliberately unpassable on a stub. A stub contract holds whatever the runner seeded, and a stub assessment is a field. Only the builder's own records prove the schedule is the signed contract's and the percent came from the project manager's site walk this month."}]}