| gps | No | For geolocated field work: {lat, lng} captured ON SITE — the gate refuses geolocated proof without it. | |
| crew | No | Optional, for a manager handing in proof for a crew: the people who did the work, 1 to 25 of {"ref":"amina","hoursClaimed":2}, refs as on the claim. Either every person states hoursClaimed or none does; stated hours add up to the proof's hoursClaimed (omit that and their sum becomes it). The human who accepts decides the accepted total, split back across the crew in proportion (equally with no per-person hours). Omit crew on a managed claim and the claim's crew carries over. | |
| counts | No | Optional: what the job asked to be counted, in the packet's own units, as plain numbers — {"metres_cleared": 120, "blockages_removed": 4, "check_dams_built": 3}. Lower_snake_case names, at most 40 of them. Recorded with the proof; it decides nothing on its own. | |
| proofs | Yes | 1-20 proof items. A photo goes in BY REFERENCE: {"type":"photo","upload":"sha256:<hex>","step":1,"capturedAt":"<ISO>"}, where the reference is what `node vealth-agent.mjs proof-photo <workId> <claimId> <photo files>` printed on the person's own machine; the photo bytes never pass through this conversation. A small file may still go inline as {"type":"photo","data":"<base64>"}. Text notes are {"type":"text","data":"…"}. The packet's proof line (get_work_packet) says exactly what it needs. | |
| workId | Yes | The packet id. | |
| claimId | Yes | Returned by submit_claim. | |
| hoursClaimed | No | On an hours-eligible job, the hours you ACTUALLY worked, breaks out — a positive number, at most 168, to 6 decimal places. You state it; the human who accepts decides the accepted figure. Required on such a packet (the completion gate refuses a proof without it), optional everywhere else. | |
| workerWallet | Yes | The same 0x… address that claimed. | |