Skip to content

T 092


uid: T-092 title: WOPC β€” render per-line-item notes under the fee type, styled like the project invoice status: done area: wopc created: 2026-06-22 updated: 2026-06-23 related: T-055


Why (owner, 2026-06-22, verbatim)

"My web app is currently written to render 'notes' on where the quantity unit and quantity fields are on the WOPC when creating a WOPC thru the entry points that allows the user to create one, while I'd actually like the notes per each line items to be rendered right under the line item's fee type like how it's rendered for the project invoices. Can you make this amend for me?"

A WOPC (Payment Confirmation) line item carries an optional per-item notes string. The live renderer placed it in the quantity / "multiplier" column (the blank-header column that shows xN + unit) as a fallback when there was no multiplier to show. The owner wants notes to read under the line item's fee type in the description column, mirroring the project-invoice layout where notes sit beneath the fee type (lib/invoice/components/items/ItemRow.tsx).

Context / relationship to T-055

T-055 (done, 2026-06-16) reworked the same WOPC line-item region β€” it tightened the multiplier gate so a bare xN with no real unit is suppressed, and at the time preserved the notes fallback in that column. This task supersedes that fallback: notes move out of the quantity column entirely and render in the description column under the fee type. The multiplier column now shows only xN + unit (via the existing shouldShowWopcMultiplier / resolveWopcQuantityUnit helpers, unchanged).

T-055 also documented that lib/pdfTemplates/paymentConfirmation.tsx is DEAD (zero importers) β€” do NOT edit it, and that the single live WOPC renderer is lib/paymentConfirmation/PaymentConfirmation.tsx (used by preview, thumbnail, the Puppeteer PDF renderer, and the inline match plugin). This task honors that: the change lives only in the live renderer.

What changed

  • lib/paymentConfirmation/PaymentConfirmation.tsx (live renderer):
  • Added a .pc-table-desc-notes style (subtitle-like, gray, white-space: pre-line so multi-line notes keep their line breaks).
  • Render item.notes as a paragraph under the fee type inside the description cell.
  • Removed the item.notes fallback from the multiplier column; it now renders only the xN + unit when shouldShowWopcMultiplier is true, else nothing.
  • No data / type / wire change. item.notes is already on the line-item snapshot; only its render position moved. Multiplier/unit display rules from T-055 are untouched.

Decision log

2026-06-22 β€” opened + implemented

  • βœ… Attestation (Document Rendering Fine-Tuning): read AGENTS.md; scope-scanned the board (by scope, not UID) β€” no covering open task. T-055 is the adjacent WOPC quantity/unit bug (done); its scope was suppressing a stray quantity/unit, not relocating notes, so this is genuinely new work that supersedes T-055's "notes stay in the column" detail.
  • Source: Document Rendering Fine-Tuning Β· https://claude.ai/code/session_01A2tdTGEeYDMDVhrceFpJ8D
  • What changed: see "What changed" above. Live renderer only; dead lib/pdfTemplates/paymentConfirmation.tsx left untouched per T-055 (an earlier pass in this session had mistakenly edited it for "consistency" and was reverted in commit 33bb477).
  • Proposed by: the owner (feature request). Approved by: the owner β€” the verbatim request above is the directive.
  • Branch / PR: claude/wopc-notes-under-fee-type-rrcs79 β†’ PR #787 (draft). Renderer change in commit 0031223; dead-file revert in 33bb477.
  • Verification note: the WOPC render path is server-side (Puppeteer) and not browser-previewable without auth + a notes-bearing WOPC. Container had no node_modules, so tsc/vitest/next build could not be run here β€” change is a small, self-contained JSX + CSS edit following the existing description-cell pattern (multi-line title/subtitle rendering directly above it). Vercel's PR check is currently failing on an unrelated "Account is blocked" account-level block, so its build hasn't validated the change either.
  • Blast radius: touches only the WOPC line-item description cell in lib/paymentConfirmation/PaymentConfirmation.tsx. Affects every surface that renders a WOPC (create preview, records thumbnail, signing PDF, inline match plugin) since they share this one component. No effect on project invoices, the dead PDF template, or the quantity/unit suppression logic from T-055.

2026-06-23 β€” DONE: merged to main + deployed to NAS prod (verified)

  • βœ… Attestation (Document Rendering Fine-Tuning): read AGENTS.md; closing T-092 with verdict + commit/image + blast radius per the "close the loop" rule.
  • Source: Document Rendering Fine-Tuning Β· https://claude.ai/code/session_01A2tdTGEeYDMDVhrceFpJ8D
  • Verdict β€” what landed vs. plan: the WOPC notes-under-fee-type change is live in NAS prod. PR #787 merged to main as merge commit b5dd46fa (owner-approved via AskUserQuestion: "Merge #787 β†’ main now"). The nas-image.yml workflow (run 27994398386) built ghcr.io/girafeev1/eop-app:main (new image sha256:cea29323…, created ~01:00 UTC 2026-06-23) and pushed it to GHCR.
  • NAS deploy (manual pull per T-082 β€” no watchtower/cron): done via the Claude↔NAS Cloudflare-tunnel channel (docs/eop-tasks/runbooks/claude-nas-channel.md). Pulled :main on the NAS, then recreated the eop-app container preserving its exact config β€” network eop-net, -p 3000:3000, --restart unless-stopped, --shm-size 67108864, --env-file /volume1/docker/eop/.env.production. Env parity verified first: every key in .env.production (85) is present in the running container; the only container-only keys are the 5 image-baked Dockerfile vars. New container id ef579c9f, running on sha256:cea29323….
  • Verified: clean startup logs (Firebase admin creds valid, projects module loaded); local curl http://localhost:3000 β†’ HTTP 307; public https://eop.theestablishers.com β†’ HTTP 307 β†’ /auth/signin. The previous prod image sha256:c9c8e537… is retained on the NAS as a rollback.
  • Blast radius (deploy): recreating eop-app also rolled prod forward from the 2026-06-22 07:45 image to current main, so all main commits since then (e.g. the IR56M T-047 work) are now live in prod too β€” expected under the 🟒 lockstep/ship-to-main branch policy. bank-login (same eop-net) and the home-automation containers were untouched. Observation, not changed: prod runs --shm-size 64MB (not the 1 GB the nas-runbook mentions) and no memory cap β€” replicated as-is to avoid changing behavior during the deploy; flag for a separate review if PDF renders ever crash on /dev/shm.

2026-06-23 β€” REOPENED: match the notes font + color to the project invoice (owner follow-up)

  • βœ… Attestation (Document Rendering Fine-Tuning): read AGENTS.md; same-scope refinement of the WOPC notes rendering, so extending T-092 rather than opening a parallel task.
  • Source: Document Rendering Fine-Tuning Β· https://claude.ai/code/session_01A2tdTGEeYDMDVhrceFpJ8D
  • Owner request (verbatim, 2026-06-23):

    "Regarding the rendering of notes on the WOPC, I'd like you to also use the font style (font and color) that is used on the project invoice"

  • What changed: .pc-table-desc-notes in lib/paymentConfirmation/PaymentConfirmation.tsx now mirrors the project-invoice notes (lib/invoice ItemRow β†’ NotesContent): Roboto Mono for Latin text and black (#000), replacing the prior EB Garamond / GRAY_MEDIUM (#666). The invoice uses Chocolate Classical Sans for CJK, but that face is not loaded in the WOPC render harness (lib/wopc/pdfRenderer.server.ts only requests Roboto Mono + Yuji Mai + Iansui + … from Google Fonts; Zihi Kai Plain is self-hosted), so CJK falls back to the WOPC's existing Yuji Mai / Iansui / Zihi Kai Plain stack instead. Weight/size left as-is (the invoice notes are bold 12px; owner scoped the request to font and color).
  • Status: code done; pending deploy to NAS prod (same mergeβ†’buildβ†’pullβ†’recreate flow as the first pass). Flipped status back to doing; will re-close once deployed + verified.

2026-06-23 β€” DONE (2nd deploy): font/color refinement live in NAS prod (verified)

  • βœ… Attestation (Document Rendering Fine-Tuning): read AGENTS.md; re-closing T-092 after the font/color refinement deployed.
  • Source: Document Rendering Fine-Tuning Β· https://claude.ai/code/session_01A2tdTGEeYDMDVhrceFpJ8D
  • Verdict: the font/color refinement is live in NAS prod. PR #788 merged to main (merge commit cac64ed4, owner-approved via AskUserQuestion: "Deploy to NAS prod now"). nas-image.yml run 27996449871 built eop-app:main (new image sha256:680fd40f…, created 01:54 UTC) β†’ GHCR. On the NAS (via the Claude↔NAS tunnel channel) pulled :main and recreated eop-app with the identical run config (new container id 1ce5455d). Verified: clean startup, local curl :3000 β†’ 307, public https://eop.theestablishers.com β†’ 307 β†’ /auth/signin. Prior image sha256:cea29323… retained on the NAS as rollback.
  • Blast radius: WOPC notes now render Roboto Mono / black on every WOPC surface. No other behavior change (this build was main + the single CSS edit on top of the already-deployed b5dd46fa). Same --shm-size 64MB / no-mem-cap observation as the first deploy still stands.