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-notesstyle (subtitle-like, gray,white-space: pre-lineso multi-line notes keep their line breaks). - Render
item.notesas a paragraph under the fee type inside the description cell. - Removed the
item.notesfallback from the multiplier column; it now renders only thexN+ unit whenshouldShowWopcMultiplieris true, else nothing. - No data / type / wire change.
item.notesis 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.tsxleft untouched per T-055 (an earlier pass in this session had mistakenly edited it for "consistency" and was reverted in commit33bb477). - 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 commit0031223; dead-file revert in33bb477. - 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, sotsc/vitest/next buildcould 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
mainas merge commitb5dd46fa(owner-approved via AskUserQuestion: "Merge #787 β main now"). Thenas-image.ymlworkflow (run27994398386) builtghcr.io/girafeev1/eop-app:main(new imagesha256: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:mainon the NAS, then recreated theeop-appcontainer preserving its exact config β networkeop-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 idef579c9f, running onsha256:cea29323β¦. - Verified: clean startup logs (Firebase admin creds valid, projects module loaded); local
curl http://localhost:3000β HTTP 307; publichttps://eop.theestablishers.comβ HTTP 307 β/auth/signin. The previous prod imagesha256:c9c8e537β¦is retained on the NAS as a rollback. - Blast radius (deploy): recreating
eop-appalso rolled prod forward from the 2026-06-22 07:45 image to currentmain, so allmaincommits 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(sameeop-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-notesinlib/paymentConfirmation/PaymentConfirmation.tsxnow mirrors the project-invoice notes (lib/invoiceItemRowβ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.tsonly requests Roboto Mono + Yuji Mai + Iansui + β¦ from Google Fonts; Zihi Kai Plain is self-hosted), so CJK falls back to the WOPC's existingYuji Mai / Iansui / Zihi Kai Plainstack 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 commitcac64ed4, owner-approved via AskUserQuestion: "Deploy to NAS prod now").nas-image.ymlrun27996449871builteop-app:main(new imagesha256:680fd40fβ¦, created 01:54 UTC) β GHCR. On the NAS (via the ClaudeβNAS tunnel channel) pulled:mainand recreatedeop-appwith the identical run config (new container id1ce5455d). Verified: clean startup, localcurl :3000β 307, publichttps://eop.theestablishers.comβ 307 β /auth/signin. Prior imagesha256: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.