Symptom
The product works correctly: the grid derives one Receipt column with a real input[type=file] (objectui#2360 does not reproduce), picking a file runs a genuine presign → PUT → complete → thumbnail trace, and submit emits one atomic POST /api/v1/batch (atomic:true, {"$ref":0} parent reference), persisting both records. But checklist clause 3 reads partial because it expects a resolved stored-file object carrying receipt.name and an absolute http(s) URL, whereas the shipped payload is the bare opaque sys_file id.
Root cause
Located — checklist-vs-product drift, not a defect. Under ADR-0104 D3 (docs/adr/0104-field-runtime-value-shape-contract.md, "D3 — File-as-reference: field values point into sys_file"), a file field stores an opaque sys_file id as a field-ownership reference. The persisted value is a managed reference ({status:'committed', ref_object:'showcase_invoice_line', ref_id:…, ref_field:'receipt', acl:'private'}), not a data:/blob: placeholder, and is correctly gated (anon 401 / two members 403 / admin 200). storage-routes.ts documents the id as "the value a file field stores as a reference". The clause should be restated against ADR-0104 D3.
Reproduction
Run the inline-grid-receipt-cells item; inspect the submitted receipt value → it is the opaque sys_file id, not a resolved {name, url} object. Clause 3 as written expects the resolved shape and therefore reads partial.
Source
Extracted from the QA run #7635 (framework 92f26f7, console 6314e87f).
Symptom
The product works correctly: the grid derives one Receipt column with a real
input[type=file](objectui#2360 does not reproduce), picking a file runs a genuine presign →PUT→ complete → thumbnail trace, and submit emits one atomicPOST /api/v1/batch(atomic:true,{"$ref":0}parent reference), persisting both records. But checklist clause 3 readspartialbecause it expects a resolved stored-file object carryingreceipt.nameand an absolute http(s) URL, whereas the shipped payload is the bare opaquesys_fileid.Root cause
Located — checklist-vs-product drift, not a defect. Under ADR-0104 D3 (
docs/adr/0104-field-runtime-value-shape-contract.md, "D3 — File-as-reference: field values point intosys_file"), a file field stores an opaquesys_fileid as a field-ownership reference. The persisted value is a managed reference ({status:'committed', ref_object:'showcase_invoice_line', ref_id:…, ref_field:'receipt', acl:'private'}), not adata:/blob:placeholder, and is correctly gated (anon 401 / two members 403 / admin 200).storage-routes.tsdocuments the id as "the value a file field stores as a reference". The clause should be restated against ADR-0104 D3.Reproduction
Run the
inline-grid-receipt-cellsitem; inspect the submittedreceiptvalue → it is the opaquesys_fileid, not a resolved{name, url}object. Clause 3 as written expects the resolved shape and therefore readspartial.Source
Extracted from the QA run #7635 (framework 92f26f7, console 6314e87f).