You read a PAYMENT HOLD FILE -- the record of one construction pay application, the compliance items logged against that payee, and the hold notice if one was raised -- and you report what is in it. You return JSON and nothing else.
YOU DO NOT DECIDE WHETHER ANY FLAG IS STALE, AND YOU DO NOT DECIDE WHETHER THE HOLD SHOULD STAND. A separate piece of code works both of those out afterwards: it looks up how many days a verification of each item class stays current under this project's regime, compares that against the dates you report, and joins the hold notice's references against the item blocks you return. Your job is to report the file faithfully, including the places where it records nothing.
DO NOT NAME AN ITEM THE FILE DOES NOT CARRY A BLOCK FOR. Whether a cited reference has a record is decided by the code downstream; an item you add because the hold notice mentions it is an invented record, and it is scored as one.
RULES, in order of importance:
1. `last_verified` AND `evidence_received` ARE TWO SEPARATE LINES AND MUST BE REPORTED SEPARATELY. `Last verified` is the day somebody last checked the FLAG. `Evidence received` is the day the document behind the requirement was logged. They are frequently different dates and the comparison between them is the single most important thing on the page. Never copy one into the other, and never report the later of the two because it looks more current.
2. `hold_cited_refs` IS EVERY REFERENCE PRINTED ON THE HOLD NOTICE LINE, comma-separated, in the order the line prints them, verbatim. That line is the denominator of the whole review. A reference dropped from it is a reason for the hold that disappears entirely, and downstream it is indistinguishable from a reason nobody ever recorded. Where the file carries no Hold Notice section at all, return null -- which happens, and is a real answer meaning no hold was raised.
3. RETURN ONE ENTRY PER COMPLIANCE ITEM BLOCK ON THE FILE, in the order the file prints them, INCLUDING blocks the hold notice does not name and INCLUDING blocks whose flag says 'satisfied' or 'waived'. A cited item whose flag is satisfied is a payment held against a requirement the file records as met; an uncited item is an open item that is not holding this payment. Those are different findings and dropping either makes them indistinguishable.
4. `flag_status` IS THE FIRST WORD OF THE 'Flag' LINE AND NOTHING ELSE. The explanation after the dash can be long and can mention other states; it does not change the flag. Report the flag exactly as it stands.
5. `item_class` IS COPIED VERBATIM FROM THE 'Class' LINE. It is the key the refresh window is looked up on downstream, so an approximation is not an approximation: an item with no window is reported as having no record at all.
6. A DATE IS A DATE OR IT IS NULL. Where a line says no verification is recorded, or that nothing has been received, or that no hold was set, or that nothing has been released, return null -- not today's date, not the cycle date, not a date from another line and not the date the file was drawn.
7. `payment_state` AND `release_decided_by` ARE READ FROM THE 'State' AND 'Release decided by' LINES. Report the role recorded; you are not being asked whether that role was entitled to decide, and nothing you return decides anything.
8. `verification_regime` IS COPIED IN FULL, verbatim. It selects which refresh windows apply to this project, so a shortened or abbreviated form is a different question being answered.
9. Copy identifiers verbatim. Write every date as YYYY-MM-DD, exactly as the file does. Use the exact allowed value for a field that lists them, and return every field named in the schema on every entry, even when the answer is null.
VERIFICATION CURRENCY POLICY (the authority for the currency column; this is an ILLUSTRATIVE policy written for this kit, and it reproduces no statute, prompt-payment law, contract form, owner's payment procedure or contractor's compliance manual)
WHAT THE REVIEW WORKLIST IS
A row per compliance item the hold notice names, each carrying the item's flag, the date somebody last verified that flag, and THE CURRENCY OF THE FLAG when the hold was set: current, stale because the refresh window elapsed, stale because the evidence arrived after the last check, never verified at all, cited with no record on the file, or not a hold reason in the first place. It is a review worklist. It releases nothing, holds nothing, pays nothing and decides nothing.
THE HARD HALF
The document tells you the flag and the date. It does not tell you HOW LONG a verification of this item class, under this project's verification regime, stays worth trusting. That window lives in this file, outside the document, and it is what turns a printed date into an answer. A flat staleness window is wrong in both directions at once: this policy's windows run from 7 days to 730, so one number both clears items that went stale weeks ago and raises items nobody needed to look at.
VERIFICATION REGIMES
standard a private commercial project with no statutory payroll reporting and no payment bond -- the base windows apply unchanged
public_works a publicly funded project whose payroll and insurance evidence is re-checked far more often; certified payroll drops to a weekly window and insurance to three weeks
bonded_private a private project carrying a payment bond, where the bond rider is re-checked monthly rather than quarterly
COMPLIANCE ITEM CLASSES
certificate_of_insurance certificate of insurance [hold-critical]
subcontractor_licence trade licence or registration [hold-critical]
bond_rider payment bond rider [hold-critical]
certified_payroll certified payroll return
lien_waiver_prior_cycle lien waiver for the prior cycle
safety_orientation_record site safety orientation record
w9_tax_form taxpayer identification form
preliminary_notice_ack preliminary notice acknowledgement
REFRESH WINDOWS, in days -- THE ITEM CLASS'S AND THE REGIME'S, not the payment's
How many days a verification of this item class stays trustworthy. It is a property of THE ITEM CLASS and THE PROJECT'S REGIME, never of the payment -- which is exactly what one flat staleness window cannot express. Every number here was invented for this kit.
default:
certified_payroll 14
certificate_of_insurance 30
lien_waiver_prior_cycle 45
preliminary_notice_ack 60
bond_rider 90
safety_orientation_record 180
subcontractor_licence 365
w9_tax_form 730
public_works overrides: certified_payroll 7, certificate_of_insurance 21
bonded_private overrides: bond_rider 30
FLAG STATUSES
satisfied the requirement is met on the file. An item whose flag says this is not a reason to hold anything
deficient a document is on the file and it does not meet the requirement
expired a document is on the file and its own validity has run out
not_received nothing has been logged against this requirement
waived the requirement has been waived in writing for this payee on this project
THE CURRENCY OF A FLAG, WORKED OUT AFTERWARDS IN CODE (context for you; you do not compute it)
1 not_a_hold_reason -- the hold notice names this item and the item's own flag says `satisfied` or `waived`. The flag is perfectly current and it says nothing is wrong; the payment is being held against a cleared requirement. Checked FIRST, because asking whether such a flag is stale is asking the wrong question about it.
2 no_record_on_file -- the hold notice names a reference the file carries no compliance-item block for. Neither current nor stale: there is nothing to be stale. Counted as current it clears a hole; counted as stale it sends somebody to refresh a record that does not exist.
3 never_verified -- the item block records no verification date at all. Nobody has ever checked this flag, so the hold has never rested on anything. Different from elapsed, and a different action.
4 superseded_by_evidence -- the evidence behind the item was received AFTER the last verification. The flag predates the paperwork. Checked BEFORE the window, because a flag inside its window is still worthless if the document arrived after it was read.
5 stale_elapsed -- more days have passed between the last verification and the date the hold was set than this item class's refresh window allows under this project's regime.
6 current -- verified inside the window, with no later evidence on the file. This is the only value that makes a hold well-founded.
A hold is WELL-FOUNDED when at least one item the hold notice names comes back `current`. Nothing else on this page is a judgement about whether the payment should be held -- that is a person's decision and this policy does not make it.
WHY `superseded_by_evidence` IS FIRST CLASS
A flag can be well inside its refresh window and still be worthless. If the evidence behind an item arrived AFTER the last verification, the verification was performed on a file that did not yet contain it -- so `not_received` is a reading of a folder that has since changed. This is the stale hold that a window-only reader clears: the date is fresh, the answer is wrong, and a legitimate payment stays blocked while the paperwork sits on the file. It is checked BEFORE the elapsed window on purpose, because the two have different actions: elapsed means go and verify; superseded means the document is already there and nobody looked.
WHAT THIS PRODUCES, AND WHAT IT DOES NOT
Nothing here decides anything. The project manager sets and releases holds; this kit reports what the file says and how old the reasoning behind it is.
Return these:
- application_ref (string) -- the pay application reference printed in the Pay Application section, verbatim (for example PA-2027-0143)
- payee_name (string) -- the payee's name in the Payee section, verbatim and WITHOUT the bracketed payee reference after it
- verification_regime (enum) one of: standard, public_works, bonded_private -- the regime on the 'Verification regime' line of the Project section, verbatim. It decides HOW LONG each kind of verification stays current on this project, so a near-miss is a different question being answered
- payment_state (enum) one of: held, released, not_held -- the FIRST WORD of the 'State' line in the Payment Status section. 'held' means the payment is still being withheld today, 'released' means a hold was set and has since been lifted, 'not_held' means no hold was ever set on this application
- hold_set_on (date) -- the date on the 'Hold set on' line, as YYYY-MM-DD. EVERY currency judgement on this payment is counted from it. Return null where the line says no hold was set
- released_on (date) -- the date on the 'Released on' line, as YYYY-MM-DD. Return null where the line says the payment has not been released -- do not substitute the hold date or the date the file was drawn
- release_decided_by (enum) one of: project_manager, contracts_manager, payment_clerk, automated_workflow -- the role on the 'Release decided by' line, verbatim. Return null where nothing has been released. This kit REPORTS who is recorded as having decided; it never decides, and it does not say who was entitled to
- hold_cited_refs (string) -- EVERY compliance-item reference printed on the Hold Notice line, comma-separated, in the order the line prints them, verbatim (for example 'CI-70142, CI-70147'). Return null where the file carries no Hold Notice section at all. A reference dropped here is a reason for the hold that disappears from the review entirely, which is the most expensive single mistake available on this shape
- items (array of objects) -- ONE OBJECT PER COMPLIANCE ITEM BLOCK printed on the file, in printed order, cited and uncited alike, each carrying:
- item_class (enum) one of: certificate_of_insurance, subcontractor_licence, bond_rider, certified_payroll, lien_waiver_prior_cycle, safety_orientation_record, w9_tax_form, preliminary_notice_ack -- the class stated on the 'Class' line of the item block, verbatim. THIS IS THE KEY the refresh window is looked up on
- item_ref (string) -- the reference on the item block heading, verbatim (for example CI-70142)
- flag_status (enum) one of: satisfied, deficient, expired, not_received, waived -- the FIRST WORD of the 'Flag' line and nothing else. The words after the dash explain the flag and do not change it, and a 'satisfied' or 'waived' item is still reported when the hold notice names it -- that is a finding, not a row to drop
- last_verified (date) -- the date on the 'Last verified' line, as YYYY-MM-DD -- the day somebody last checked THE FLAG, which is not the day any document was issued or received. Return null where the line says no verification is recorded on the file
- evidence_received (date) -- the date on the 'Evidence received' line, as YYYY-MM-DD -- the day the document behind this requirement was logged. Return null where the line says nothing has been received. It is a SEPARATE line from 'Last verified' and the two are frequently different dates; copying one into the other destroys the only comparison on this page that matters
Return a JSON object with exactly these top-level keys: application_ref, payee_name, verification_regime, payment_state, hold_set_on, released_on, release_decided_by, hold_cited_refs, items
`items` is an array. Return it EMPTY only if the file carries no compliance item block at all -- which happens, and is a real answer.
PAYMENT HOLD FILE
-----------------
Synthetic Record
----------------
This is a SYNTHETIC payment hold file, generated for a public AI use-case kit. Every payee,
project, pay application, compliance-item reference, subcontract reference, remittance
reference, contact and date in it is invented. No real contractor, owner, project, payment,
compliance requirement, statute or contract form is named or reproduced. The verification
currency policy this file is read against is the kit's own construction and is not an
authority; it asserts no hold-duration limit and no prompt-payment rule.
Pay Application
---------------
PA-2027-0190
Payee
-----
Trevanion Piling (PAY-3320)
Subcontract: SC-4532
Project
-------
Northwold Teaching Block
Verification regime: bonded_private
Cycle
-----
Cycle 2027-03, file drawn 2027-03-24
Payment Status
--------------
State: held
Hold set on: 2027-03-08
Released on: not released
Release decided by: nothing has been released
Hold Notice
-----------
Payment is held pending these compliance items: CI-70260, CI-70264, CI-70269
Compliance Item CI-70277
------------------------
Class: preliminary_notice_ack
Requirement: SC-4532, compliance schedule
Flag: satisfied -- the requirement is met on this file
Last verified: 2027-02-16
Evidence received: 2027-02-10
Compliance Item CI-70269
------------------------
Class: certified_payroll
Requirement: SC-4532, compliance schedule
Flag: not_received -- nothing has been logged against this requirement
Last verified: no verification is recorded on the file
Evidence received: nothing has been received
Compliance Item CI-70264
------------------------
Class: certificate_of_insurance
Requirement: SC-4532, compliance schedule
Flag: expired -- the document on file has run out of its own validity, so it is no longer satisfied
Last verified: 2026-10-06
Evidence received: 2026-09-17
Compliance Item CI-70272
------------------------
Class: w9_tax_form
Requirement: SC-4532, compliance schedule
Flag: deficient -- a document is on file and it does not meet the requirement; it is not expired
Last verified: 2026-09-04
Evidence received: 2026-08-31
Compliance Item CI-70260
------------------------
Class: safety_orientation_record
Requirement: SC-4532, compliance schedule
Flag: deficient -- a document is on file and it does not meet the requirement; it is not expired
Last verified: 2027-02-23
Evidence received: 2027-03-01
Compliance Item CI-70280
------------------------
Class: subcontractor_licence
Requirement: SC-4532, compliance schedule
Flag: deficient -- a document is on file and it does not meet the requirement; it is not expired
Last verified: 2026-11-30
Evidence received: 2026-11-20
File Notes
----------
Compliance items are printed in the order they were logged, cleared items included.
A hold notice names the items the hold was raised against and nothing else.
The Flag line records the last compliance decision taken on an item. The Evidence
line records the document log. The two are maintained by different processes and a
document arriving does not update the flag.