Parked sketch · Purchase affidavit + receipts — print renderer
Sketched 21 May 2026 evening. Dan: “The purchase affidavits with attached receipts will be key to print, as we have to sign and include the new receipt. Lets add that as a user-case to print/test. Park it for tomorrow.”
A printable renderer that emits one self-contained affidavit + its attached receipt(s) as a multi-page PDF/print-ready document — signed and sent to Liberty Mutual as part of the replacement-cost coverage workflow on claim 046414618.
This is the first external-stakeholder printable surface on the portfolio. Different shape from the claim cockpit print (which is operator paper).
Use case
Liberty Mutual replacement-cost coverage workflow: when an item is replaced, the insurer pays out the like-kind functional equivalent’s purchase price. To release the depreciation withhold, the policyholder must submit:
- Sworn affidavit stating the item was actually purchased (under penalty of perjury)
- Receipt(s) as evidence — purchase order, invoice, credit-card statement excerpt
- Item cross-reference so the adjuster matches it back to the claim’s inventory
Liberty’s typical packet: 1 affidavit page + 1–N receipt pages, physically grouped (paperclip / staple / cover sheet) but on separate sheets because they’re filed differently in the adjuster’s office.
Why this matters now
22 contents items on this claim need replacement. Each replacement = one affidavit packet. That’s potentially 22 × (1 affidavit + 1–3 receipts) = ~30–80 printed pages of structured legal paperwork that must be correct (this is sworn testimony).
Manual production = high friction, error-prone, slow. A render-from-sidecar approach = correct every time, reproducible after corrections.
Structural pattern
┌─ Print sheet 1 ──────────────────────────────────────────┐
│ │
│ ⌜ Claim 046414618 · Item #07 · Affidavit 1 of 1 ⌝ │ ← header
│ │
│ AFFIDAVIT OF PURCHASE │
│ ────────────────────── │
│ │
│ State of Pennsylvania │
│ County of Bucks │
│ │
│ We, DAN SELLARS and AUDREY LAM, being duly sworn, │
│ depose and say: │
│ │
│ 1. We are the named insureds on Liberty Mutual │
│ homeowners policy H3V-281-240408-75, claim │
│ number 046414618-01-046414618-02. │
│ │
│ 2. On 17 May 2026 we purchased a [ITEM DESCRIPTION] │
│ for $[AMOUNT] from [VENDOR] as the like-kind │
│ functional replacement for the [ORIGINAL ITEM] │
│ lost in the covered [PERIL] event of [DATE]. │
│ │
│ 3. Receipt(s) attached to this affidavit as evidence │
│ of purchase: [RECEIPT FILENAMES]. │
│ │
│ 4. We make this affidavit knowing that it will be │
│ relied upon by Liberty Mutual Personal Insurance │
│ Company in evaluating our claim. │
│ │
│ ───────────────────── ───────────────── │
│ Dan Sellars Date │
│ │
│ ───────────────────── ───────────────── │
│ Audrey Lam Date │
│ │
│ Sworn before me this _____ day of _____, 2026 │
│ │
│ ───────────────────── │
│ Notary Public (if required by Liberty for this claim) │
│ │
└──────────────────────────────────────────────────────────┘
(page-break-after: always)
┌─ Print sheet 2 ──────────────────────────────────────────┐
│ ⌜ Claim 046414618 · Item #07 · Receipt 1 of 1 ⌝ │ ← repeating header
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ [FULL-WIDTH RECEIPT IMAGE OR PDF EMBED] │ │
│ │ │ │
│ │ (full-page or near-full-page, 300dpi target, │ │
│ │ print-color-adjust: exact for amazon/etc. │ │
│ │ receipts with brand colors) │ │
│ │ │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
…repeat for each additional receipt for this item…
…then next item's affidavit packet starts at page-break…
Citation specificity — high-fidelity from Liberty source docs
Dan, 2026-05-21 evening: “This page we build tomorrow will be super important for closing out the file. And the specificity about references from Liberty Mutual documents will be high, meaning references/names, cited codes etc.”
The principle: any string that originated from Liberty (policy number, claim number, named insureds, loss-cause code, coverage section, item description, approved value, depreciation withhold) gets pulled verbatim from Liberty’s own documents. We do not paraphrase. We do not normalize. We do not “clean up” punctuation.
Why this matters at file-close:
- Liberty’s adjusters file by exact-string matching their worksheets
- Any divergence between our affidavit text and Liberty’s source becomes friction (questions, callbacks, payout delays)
- At file-close, the file goes to a coverage-review desk that audits terminology consistency — paraphrased item descriptions get flagged
- We are sworn-statement defending what we say — the closer our language tracks Liberty’s, the less room for “you said X, we said Y, please clarify” loop
Specific strings to pull verbatim from Liberty source:
| Field | Source location | Notes |
|---|---|---|
| Policy number | Declarations page · adjuster letterhead · any Liberty cover sheet | Format: H3V-281-240408-75 (with the hyphens) |
| Claim number | Liberty correspondence subject lines + claim portal | Format: 046414618-01 / 046414618-02 (the slash matters — it’s how Liberty groups sub-claims) |
| Named insureds | Declarations page | Dan Sellars + Audrey Lam (NEVER Daniel Dare — see user_legal_names_us_personal_paper) |
| Loss date | First-notice-of-loss + adjuster scope cover page | Format Liberty uses (typically ISO or US format — match theirs) |
| Loss cause / peril code | Adjuster scope sheet · ALE schedule | Verbatim — e.g. “Wind/Hail damage” not “storm damage” if Liberty’s code says wind/hail |
| Coverage section | Policy + adjuster’s coverage decision letter | e.g. “Coverage C — Personal Property” — match exactly |
| Item description | Adjuster scope worksheet (line items from the inventory) | Verbatim from Liberty’s spreadsheet — they have specific descriptions per item-id |
| Approved replacement value (RCV) | Liberty’s depreciation/RCV worksheet | Match to the penny |
| Depreciation withhold | Same worksheet | Match to the penny |
| Policy provision references | Policy form + endorsement schedule | e.g. “Section II.E.3 Replacement Cost Loss Settlement” — full reference, not “the RCV clause” |
Sidecar shape implication:
The sidecar JSON needs a liberty_source block per item, capturing verbatim strings:
{
"item_id": "07",
"liberty_source": {
"scope_line": "Item 7: [exact Liberty description verbatim]",
"approved_rcv": "$XXX.XX",
"depreciation_withhold": "$XX.XX",
"scope_doc_ref": "Liberty adjuster scope worksheet dated YYYY-MM-DD",
"coverage_section_cited": "Coverage C — Personal Property",
"provision_invoked": "Section II.E.3 Replacement Cost Loss Settlement"
},
"replacement": { … as before, OUR data … }
}
The renderer template uses liberty_source strings inside the affidavit copy directly. Editors of the sidecar (Dan or me, when transcribing from Liberty docs) must paste verbatim — no rewording.
Verification step before submitting any batch:
A small pa_claim_affidavit_verify.py companion script that:
1. Reads the sidecar
2. For each item, prints the affidavit text side-by-side with Liberty’s source string
3. Flags any item where liberty_source.* fields are paraphrased / missing / mis-cased
Catches transcription drift before it ships out of the door.
Cross-references:
feedback_liberty_variance_defence_framework.md— sibling: defending variances uses the 4-question diff_explanation; citing Liberty’s terminology removes the need to defend in the first placeuser_legal_names_us_personal_paper.md— corollary: the named insureds must match Liberty’s file exactlyfeedback_capture_at_source_durable_substrate.md— same impulse: the source IS the answer; pull strings from Liberty’s own docs rather than reconstructing from memory
Print-CSS specifics that will matter
Lessons from tonight’s cockpit print fix (feedback_chrome_auto_expands_details_on_print.md) apply, plus extensions:
/* Each affidavit packet is a self-contained unit */
.affidavit-packet {
break-before: always; /* always start on a fresh sheet */
break-inside: avoid; /* don't split the affidavit text itself across pages */
}
/* Each receipt page lives in its own break-controlled wrapper */
.affidavit-receipt {
break-before: always;
break-inside: avoid;
}
.affidavit-receipt img {
max-width: 100%;
height: auto;
image-rendering: -webkit-optimize-contrast;
print-color-adjust: exact; /* keep colored receipts colored */
-webkit-print-color-adjust: exact;
}
/* Repeating per-page header — claim ref + item + sheet position */
@page {
margin: 0.75in 0.6in;
size: letter;
@top-left { content: "Claim 046414618 · Item #" counter(item-num); }
@top-right { content: "Sheet " counter(page) " of " counter(pages); }
}
/* Signature line must be wide + on its own line — never wrapped */
.signature-line {
display: inline-block;
width: 3in;
border-bottom: 1px solid #000;
height: 1.5em;
}
/* Body copy at legal-readable size — adjusters use bifocals */
.affidavit-body { font-size: 11pt; line-height: 1.6; }
One-page manager — cards per item (Dan, 2026-05-21 evening)
“It would be good to build that as a page that manages all allowed purchases, based on the items they approved for replacement, so one large page, made up on cards, maybe.”
Re-shaping: not N standalone documents. Instead one operator-facing page at pa/home-insurance/claims/_bulk-source/_affidavits/ that:
- Shows every Liberty-approved replacement item as a card (one card per item from the approval list)
- Per-card status + state machine:
awaiting purchase→purchased, no receipt→receipt captured→affidavit ready→printed + signed→sent to Liberty→paid out - Per-card dropzone for the receipt (lifts the v0.1.0 primitive — context
pa-claim-046414618-affidavit, field per item-id) - Per-card mini-form for: vendor name, purchase date, $ amount, item description
- Master “🖨 Print all ready affidavits” button → emits the multi-page PDF (1 affidavit + N receipts per item, page-break boundaries, same operator-only
.no-printsuppression for the manager chrome)
┌──────────────────────────────────────────────────────────────────┐
│ CLAIM 046414618 · AFFIDAVITS │
│ Liberty-approved replacements · purchase + sign + send packet │
│ │
│ Status summary: 4 paid · 7 ready · 6 capturing · 5 awaiting │
│ [🖨 Print all 7 ready affidavits] [↓ Export status] │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ Item #07 ───────────────── ✓ Receipt captured ─┐ │
│ │ Original: [original item description] │ │
│ │ Approved replacement value: $X │ │
│ │ Vendor: [____] Date: [__/__/____] $: [____] │ │
│ │ Receipt(s): amazon-2026-05-17-item07.pdf ✓ │ │
│ │ [+ Drop receipt] [Mark affidavit ready →] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌─ Item #12 ────────────── ⚠ Receipt missing ─────┐ │
│ │ Original: [original item description] │ │
│ │ Approved replacement value: $X │ │
│ │ Purchased 14 May 2026 for $89.99 @ Home Depot │ │
│ │ Receipt(s): (none yet) │ │
│ │ [📥 Drop receipt to enable affidavit] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌─ Item #15 ──────── 📨 Sent to Liberty 2026-05-20 ┐ │
│ │ Original: [original item description] │ │
│ │ Vendor: Amazon · Date: 2026-05-19 · $: $124.00 │ │
│ │ Receipt: amazon-2026-05-19-item15.pdf │ │
│ │ Affidavit signed: ✓ Dan ✓ Audrey 2026-05-20 │ │
│ │ Awaiting Liberty payout · 14 days elapsed │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ …22 cards total, sorted: ready → capturing → awaiting → paid… │
│ │
└──────────────────────────────────────────────────────────────────┘
Card state colors (lifted from existing pa/ palette):
| State | Visual cue |
|---|---|
awaiting purchase |
Grey card, no action affordance |
capturing (receipt missing) |
Amber border, dropzone prompt prominent |
ready (affidavit emit-ready) |
Green border, “Mark ready to print” CTA |
printed (waiting on signature physical) |
Blue border, “Mark signed” CTA |
sent (mailed/scanned to Liberty) |
Slate border with “📨 Sent |
paid (Liberty paid out the depreciation withhold) |
Quiet/grey-gold, decoration ✓ Paid |
Print pipeline from the manager page:
When operator clicks “🖨 Print all 7 ready affidavits”:
1. Filter cards where status === 'ready'
2. For each, render affidavit + receipt pages into the print-output area below the cards (already in DOM, hidden via .no-print)
3. Manager chrome (cards, status summary, buttons) all wrapped in .no-print per tonight’s discipline
4. Print-only header/footer for each affidavit (per feedback_chrome_auto_expands_details_on_print.md)
5. After print, prompt: “Mark these 7 as printed?” → updates state in localStorage (or sidecar via dropzone-export-style sync)
State persistence: localStorage by default (per-browser); export-to-JSON button writes a state file the cockpit can read back. Or — better tomorrow — write each card’s state to the sidecar JSON via the same pa_dropzone_apply.py-style helper.
Cross-links from the cockpit:
- Action sequence card for “Submit affidavits” links here
- Folder index for _affidavits/ shows this is the manager (not raw filesystem)
- Money-map shows the depreciation-withhold dollar figure that this dashboard is built to unlock
Step 0 — research best-in-class examples FIRST (Dan, 2026-05-21)
“Have a look for best-in-class examples for how to pull it off easily and get it 100% approved. Visual examples might spark us.”
Before any code or template design, do a research pass:
- Liberty Mutual claim-portal docs — log in, look for any “affidavit of purchase” / “proof of replacement” template attachment in Taylor’s correspondence or the claims-portal forms section. Carrier-provided is always preferred (already approved-by-default).
- Public-adjuster firms’ sample affidavits — public adjusters (PAs, the trade) publish redacted samples on their sites showing how they package replacement-cost claims. Hi-fi visual references.
- State-specific affidavit templates — Pennsylvania department of insurance + AAA + similar sometimes publish recommended affidavit forms for property claims.
- Insurance-forms aggregators — UCC/legal-form sites (US Legal Forms, eForms, etc.) have “Affidavit of Purchase” templates that show standard language structure.
- Visual-design references — even non-insurance affidavits (real estate, contract attestation) can spark the typography + signature-block layout.
Capture findings as a small note (pa/home-insurance/claims/_bulk-source/_affidavit-research.md) referencing whatever’s useful. Then design with the best examples in front of us — not in the abstract.
Build path (after step 0)
-
Sidecar shape extension — add per-replacement-item affidavit metadata to each item record in
pa/home-insurance/claims/_bulk-source/_sidecar.json(or its successor format):json { "item_id": "07", "original": { "description": "...", "lost_in_peril": "..." }, "replacement": { "item_description": "...", "vendor": "...", "purchase_date": "2026-05-17", "amount_usd": 89.99, "receipts": [ { "path": "30-invoices/amazon-2026-05-17-item07.pdf", "type": "pdf" }, { "path": "30-invoices/credit-card-statement-may-2026-line47.png", "type": "image" } ] } } -
~/bin/pa_claim_affidavit_render.py— new script: - Reads sidecar - For each item with areplacementblock, emits a self-contained HTML page (one per claim run, all items concatenated with page-break boundaries) - Renders affidavit text from a template using item data - Embeds receipts via<img src="data:image/png;base64,...">(PDFs converted to PNG via pdf2image at render time, OR embedded via<embed>if PDFs render cleanly) - Filename:pa/home-insurance/claims/_bulk-source/_affidavits/affidavit_packet_2026-05-22.html- Print button at top (operator-only via.no-print) -
Liberty-template lookup — check if Liberty has a preferred affidavit form (some carriers do, some accept any sworn statement). Two paths: a. Open form (we draft) — simpler b. Liberty’s template — find PDF, OCR / re-create, match field positions First check Liberty’s claims portal / adjuster correspondence for any “please use this form” attachments.
-
Notary check — Dan flagged 2026-05-21: “Does an affidavit need to be endorsement or official stamp?” — open question, not assumption-defaults.
What I know generally: - 28 USC §1746 lets a written declaration “under penalty of perjury” substitute for a notarized affidavit at the federal level — many state insurance adjusters accept this without notary. - Most US carriers (Liberty included) on routine replacement-cost claims accept self-sworn statements. Notary is the exception, not the rule. - HIGH-VALUE items (jewelry above policy schedule, fine art, collectibles) sometimes trigger notarization per policy-specific scheduled-personal-property terms.
For claim 046414618 specifically — confirm with Liberty BEFORE first print:
- Send Taylor a single short email: “For the replacement-cost affidavits on this claim — do you accept self-sworn statements under penalty of perjury per 28 USC §1746, or does Liberty require notarization for this submission?”
- Wait for written reply (lands in adjuster file — protects us if Liberty later argues differently)
- Default sidecar flag: "notary_required": false (the safe-bet default = simpler, faster, cheaper)
- Renderer respects flag: notary block hidden when false, visible when true
- Flip flag + re-render if Taylor confirms notary required
Design implication: notary block is a CONDITIONAL render, not a constant. Don’t print 22 affidavits with empty notary fields if Liberty doesn’t need them — it looks unprofessional and hints we don’t know our own process.
- First end-to-end test — render 1 item’s packet (lowest-amount item to minimize re-do cost), print, sign, send. Confirm with Liberty adjuster Taylor that the format is acceptable BEFORE running all 22.
Print-test coverage matrix (Dan’s ask: “add as a user-case to print/test”)
| Test | What to verify | Pass criteria |
|---|---|---|
| Page count | 1 affidavit + 1 receipt = 2 pages | Exactly 2 pages, no blanks |
| Page count multi-receipt | 1 affidavit + 3 receipts = 4 pages | Exactly 4 pages |
| Page breaks | Affidavit body never splits mid-paragraph; receipt image never splits mid-image | Visual inspection |
| Header consistency | Claim # + item # appears on every page | All sheets carry the cross-reference |
| Signature line | Wide enough to sign with a normal pen | ≥3 inches |
| Receipt fidelity | Color receipts (Amazon orange, etc.) print colored, not B&W | Visual match |
| Multi-item batch | 22 items → 22 affidavits + N receipts, all correctly grouped | Cmd+P on the batch HTML yields one PDF with correct page breaks |
| Adjuster usability | Loose-leaf sheets at any point still have item-#07 traceable | Header on every sheet |
Resume conditions
Build when ANY of: 1. Tomorrow’s first replacement-receipt arrives (most likely trigger — Dan said park for tomorrow) 2. Liberty adjuster Taylor explicitly requests affidavit submission (per claim correspondence rhythm) 3. The replacement-coverage 90-day clock starts ticking on any item (deadline-driven)
Skip / defer
- Don’t build before having ≥1 real receipt to test against (designing in the abstract = re-work later)
- Don’t notarize-by-default if Liberty hasn’t asked for it on this claim (added friction + cost)
- Don’t auto-send / fax / e-deliver yet — manual print + sign + scan + email is fine until volume hits ≥10/week
Cross-references
feedback_chrome_auto_expands_details_on_print.md— print pipeline trap that applies here too (any<details>we use in the affidavit page will auto-expand; design without<details>OR wrap properly)feedback_paper_cockpit_print_affordance.md— print-button conventionfeedback_liberty_variance_defence_framework.md— adjacent surface; defence framework is for diff_explanation prose, this is for purchase-evidence packetpa/home-insurance/claims/_bulk-source/_variance-framework.md— local doc, sibling to where affidavits will live_ingest-form.html(existing) + dropzone (shipped 2026-05-21) — capture surfaces that feed the same sidecar this renderer will consume
The aphorism
The cockpit prints for the operator. The affidavit prints for the insurer. Different audiences = different print rules.