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:

  1. Sworn affidavit stating the item was actually purchased (under penalty of perjury)
  2. Receipt(s) as evidence — purchase order, invoice, credit-card statement excerpt
  3. 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:

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:

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:

  1. Shows every Liberty-approved replacement item as a card (one card per item from the approval list)
  2. Per-card status + state machine: awaiting purchasepurchased, no receiptreceipt capturedaffidavit readyprinted + signedsent to Libertypaid out
  3. Per-card dropzone for the receipt (lifts the v0.1.0 primitive — context pa-claim-046414618-affidavit, field per item-id)
  4. Per-card mini-form for: vendor name, purchase date, $ amount, item description
  5. Master “🖨 Print all ready affidavits” button → emits the multi-page PDF (1 affidavit + N receipts per item, page-break boundaries, same operator-only .no-print suppression 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 ” header
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:

  1. 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).
  2. 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.
  3. State-specific affidavit templates — Pennsylvania department of insurance + AAA + similar sometimes publish recommended affidavit forms for property claims.
  4. Insurance-forms aggregators — UCC/legal-form sites (US Legal Forms, eForms, etc.) have “Affidavit of Purchase” templates that show standard language structure.
  5. 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)

  1. 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" } ] } }

  2. ~/bin/pa_claim_affidavit_render.py — new script: - Reads sidecar - For each item with a replacement block, 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)

  3. 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.

  4. 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.

  1. 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.
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

Cross-references

The aphorism

The cockpit prints for the operator. The affidavit prints for the insurer. Different audiences = different print rules.

Source: parked_sketch_purchase_affidavit_print_renderer_2026-05-21.md · Rendered 2026-05-21 22:35