- BUG D: clicking "Bulk Edit" with no invoices selected 500'd. selected->ids
returns nil with no selection, and all-ids-not-locked fed that nil into a
Datomic `:in $ [?i ...]` query ("Unable to find data source"). Guard the body
with (when (seq all-ids) ...) so an empty selection yields [] and the modal
opens cleanly. Verified live: no "Oh, drat" toast, no 500.
- BUG B: modal-footer- called (hx/alpine-appear ...) twice; the 2nd return value
(an attribute map) landed in child position and rendered as literal EDN
({:x-show ...}) in the red error banner whenever unexpectedError flipped true.
Delete the duplicate. Verified: rendered HTML now has one alpine-appear and no
EDN-text child. (Pre-existing defect, also present on master.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BUG E/F: the Vendor and Client wizard step cards overflowed — horizontal
scrollbar, clipped fields, a huge empty grey left region. The step-card lays the
step timeline in a vertical left sidebar (grow-0, self-stretch), but
vendor-timeline/client-timeline rendered the HORIZONTAL `timeline` component,
which forced the shrink-to-fit sidebar to ~full card width and pushed the body
off-screen.
- vendor-timeline / client-timeline: use timeline/vertical-timeline +
vertical-timeline-step (the components already existed) instead of the
horizontal pair.
- vendors.clj: step bodies w-[600px] h-[350px] -> w-full h-[350px] so the body
fills the width left of the now-narrow vertical timeline.
Verified live (agent-browser): Vendor 760x520, Client 820x560, vertical timeline,
no horizontal overflow, Info->Terms navigation + validation re-render lay out
correctly. Both files pass lein cljfmt check.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Three regressions from the SSR rendering-modernization migration, all verified
live via agent-browser:
- BUG A — New Invoice: choosing a client 500'd from /invoice/new/due-date
(ClassCastException: DateTime cannot be cast to java.util.Date). `due-date`
and `scheduled-payment-date` called `coerce/from-date` on values already
decoded to clj-time DateTimes. Drop the coerce; use the decoded dates.
- BUG C — Transaction Edit: any whole-form swap (mode toggle, vendor change,
add/remove row) 500'd whenever the txn had >=1 autopay-invoice match
(ClassCastException at links-body*: PersistentVector cannot be cast to Named).
The autopay link-panel's hidden `action` input was missing `:form ""`, so it
serialized alongside the main `action` hidden, producing a duplicate param
that Ring collapsed to a vector. Add `:form ""` to match the unpaid/rule panels.
- Modal sizes: Vendor/Client/Invoice-Pay modals ballooned to full width because
resources/public/output.css was missing their arbitrary Tailwind size classes.
Root cause: tailwind.config.js `content` never scanned resources/templates/**/*.html
(46 Selmer templates the migration introduced), so a rebuild also dropped
template-only classes like md:w-[950px]. Add the templates glob and rebuild;
all modal size classes now present, no working modal regressed.
Docs: add 2026-06-27 QA findings + resumable fix task list; cross-link from the
migration plan. Remaining (per the new plan): Vendor/Client inner step-body
overflow, wizard step animations, bulk-edit empty-selection 500, footer EDN leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>