Just ink on a page. No software fields.
Filling one means printing it and writing on it by hand.
Same visual layout, but with invisible named boxes overlaid on the page.
Named boxes are what let us read and write programmatically.
The tenant sends us their entire form corpus — email dump, Drive folder, SharePoint export.
We drop every PDF into one working directory. Each form gets a stable form_key; unresolved files park in _unmatched/ until a human decides what they are.
form_key.
Text14. Needs a manual visual pass.Text14-style names, so this form is heading for a manual visual pass.
For each form, we generate a Markdown file — forms/<form_key>.md — that becomes the source of truth for that form's field structure.
The bootstrap seeds it from the catalogue. Human review comes at the next stage, once we can anchor the file against the paper.
For every widget whose meaning isn't obvious from its name, we render the PDF with widget outlines drawn on top.
A human writes down what each opaque widget actually captures — in a bindings CSV that pairs the widget's PDF-internal name with a proposed field key.
snake_case. Save with a - RQxx suffix in the filename.Why the suffix? The original blank exemplar stays untouched. Every RequiemOS-added field can be told apart from tenant-authored fields at a glance.
- RQ01 suffix ↓case_deceased.legal_name.form_submissions.data, for one-offs.The output of Stage 7 is a canonical field dictionary — a single vocabulary of a few hundred keys spanning the entire corpus. Every field on every form is a pointer into that dictionary.
Tenant-owned forms (a funeral home's own paperwork) can have their AcroForm widgets renamed in the PDF itself. Text14 becomes decedent_legal_name. Simplifies runtime fill; makes future onboarding trivial.
Third-party mandated forms (provincial vital stats, CPP/OAS, insurance) are never renamed. The issuer owns them. We live with the original names and let the bindings CSV bridge.
document_templates with template_format = PDF_FORM.tenants/ └─ kearney/ ├─ document_templates/ ← blank templates │ └─ tpl_first_call_sheet/ │ ├─ v1.pdf │ ├─ v2.pdf ← after RQ01 │ └─ v3.pdf ← after rename └─ case_documents/ ← filled copies per case └─ case_2026_0042/ └─ first_call_sheet.pdf
The platform produces a completed copy from live case data. Every field populates from case_deceased, case_family_members, custody_events, and so on. No re-keying.
The platform accepts a filled version — typed or scanned — and lands the values back into the database, tied to the right case.
Every field ties back to a canonical key. Adding a new form doesn't add a new definition of "deceased legal name"; it adds a mapping to an existing one.