2026-05-10: Feedback & Fixes
Context
Section titled “Context”Accumulated feedback and bugs from the issues/todo/feedback-and-fixes.md tracker, addressed in a single plan.
Problem Statement
Section titled “Problem Statement”- CI broken:
prisma generatefails (missingDATABASE_URL); Astro build fails (Node 20 not supported) docker:prodshows wrong version: shows dev-mode version instead of latest release tag- Docs content not centered: asymmetric left/right margin in
.sl-container - Wrong favicon on front app: SVG favicon overrides matching PNGs
- White flash on dark-mode navigation: brief white background on sidebar link clicks
- Asset detail page: acquisition date not displayed
- Delete button: uses native
confirm()instead of proper modal dialog - Codecov badge “unknown”: CI was failing so coverage was never uploaded; stale token from repo transfer
Changes
Section titled “Changes”A — CI Fixes
Section titled “A — CI Fixes”A1. Backend DATABASE_URL (.github/workflows/ci.yml):
- Added
env: DATABASE_URL: file:/tmp/ci.dbto the backend job beforenpx prisma generate - Root cause:
prisma.config.tscallsenv('DATABASE_URL')at config-load time; CI runner has no.env
A2. Node 24 LTS (.github/workflows/ci.yml, backend/Dockerfile, front/Dockerfile, docs/Dockerfile):
- CI backend job:
node-version: 20→node-version: "24" - CI frontend job:
node-version: 20→node-version: "24" - CI docs job:
node-version: "22"→node-version: "24" - All three Dockerfiles:
FROM node:22-alpine→FROM node:24-alpine
B — Versioning: docker:prod uses latest git tag
Section titled “B — Versioning: docker:prod uses latest git tag”Files: scripts/version.mjs, package.json
- Added
VERSION_OVERRIDEenv var support toversion.mjs: when set, uses that value directly and classifies env asproduction - Modified
docker:prodnpm script to exportVERSION_OVERRIDE=$(git describe --tags --abbrev=0 2>/dev/null)before callinggen-version.mjs all - Result: running
npm run docker:prodon a commit pastv1.0.0now produces1.0.0(production), not1.0.0-1-gf3a1d9d(development)
C — Docs Content Centering
Section titled “C — Docs Content Centering”File: docs/src/styles/custom.css
- Added CSS to center
.sl-containersymmetrically (fix extra left margin from Starlight sidebar accounting)
D — Front App Favicon
Section titled “D — Front App Favicon”Files: front/public/favicon.svg (deleted), front/src/layouts/MainLayout.astro
- Deleted
front/public/favicon.svg(a “blue S” SVG that browsers prefer over PNGs) - Removed
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />fromMainLayout.astro - The front PNGs (
favicon-16x16.png,favicon-32x32.png) were already byte-identical to the docs PNGs — no other change needed
E — White Flash Fix
Section titled “E — White Flash Fix”File: front/src/layouts/MainLayout.astro
- Added
<style is:inline>block in<head>with:@media (prefers-color-scheme: dark)rule for users on system dark preferencehtml.darkrule for users with explicit dark mode stored in localStorage
- This is pure CSS (no JS), applied immediately on HTML parse before any stylesheet loads or script runs
- Covers both system-preference and explicit dark mode during the brief window between page navigations
F — UI: Acquisition Date + Delete Dialog
Section titled “F — UI: Acquisition Date + Delete Dialog”F1. AssetHeader (front/src/components/assets/AssetHeader.tsx):
- Added
acquisitionDateto subtitle line:… · Acquired {date}(omitted if null)
F2. AssetSnapshotsList (front/src/components/assets/AssetSnapshotsList.tsx):
- Added optional
acquisitionDateandacquisitionPriceprops - Renders an “Acquired” pseudo-row at the top of the snapshots table (visually distinct)
F3. AssetDetailPage (front/src/components/assets/AssetDetailPage.tsx):
- Passes
acquisitionDateand acquisition price toAssetSnapshotsList - Replaced
confirm()withshowDeleteConfirmstate +<DeleteConfirmDialog />
F4. DeleteConfirmDialog (front/src/components/assets/DeleteConfirmDialog.tsx) — new:
- Simple modal: “Are you sure you want to delete this asset?” with Cancel / Delete buttons
- Props:
{ open, pending, onClose, onConfirm }
G — Tests
Section titled “G — Tests”AssetHeader.test.tsx: new tests for acquisition date display (present / absent)AssetSnapshotsList.test.tsx: new tests for acquisition row (date + price)DeleteConfirmDialog.test.tsx: new — renders message, confirm button callsonConfirm, cancel callsonClose
H — Codecov
Section titled “H — Codecov”Files: codecov.yml, README.md
- Added frontend path fix and
flag_management.carryforward: truetocodecov.yml - Split README badge into separate backend + frontend per-flag badges
- Token was manually re-created by the user (repo transfer
francoiducat→fducat18had stale token)
Execution Summary
Section titled “Execution Summary”Commit: (see git log for SHA after this commit)
Actual changes
Section titled “Actual changes”All planned changes were implemented as specified. No scope reduction.
| File | Status |
|---|---|
.github/workflows/ci.yml | ✅ DATABASE_URL + Node 24 upgrade (all 3 jobs) |
backend/Dockerfile | ✅ node:22-alpine → node:24-alpine |
front/Dockerfile | ✅ node:22-alpine → node:24-alpine |
docs/Dockerfile | ✅ node:22-alpine → node:24-alpine |
scripts/version.mjs | ✅ VERSION_OVERRIDE env var support |
package.json | ✅ docker:prod exports VERSION_OVERRIDE from latest git tag |
docs/src/styles/custom.css | ✅ .sl-container margin-inline: auto |
front/public/favicon.svg | ✅ Deleted |
front/src/layouts/MainLayout.astro | ✅ SVG favicon link removed; inline dark-mode CSS added |
front/src/components/assets/AssetHeader.tsx | ✅ Acquisition date in subtitle |
front/src/components/assets/AssetSnapshotsList.tsx | ✅ Acquired pseudo-row at top of table |
front/src/components/assets/AssetDetailPage.tsx | ✅ DeleteConfirmDialog wired; acquisition data passed to snapshots list |
front/src/components/assets/DeleteConfirmDialog.tsx | ✅ NEW — confirmation modal |
front/src/components/assets/__tests__/AssetHeader.test.tsx | ✅ 2 new tests for acquisition date |
front/src/components/assets/__tests__/AssetSnapshotsList.test.tsx | ✅ 3 new tests for acquisition row |
front/src/components/assets/__tests__/DeleteConfirmDialog.test.tsx | ✅ NEW — 5 tests |
codecov.yml | ✅ Frontend path fix + flag_management carryforward |
README.md | ✅ Per-flag coverage badges |
docs/src/content/docs/dev-setup.md | ✅ Updated Node 22 → Node 24 references |
Deviations from plan
Section titled “Deviations from plan”None. Implementation matched the plan exactly.
Test results
Section titled “Test results”| Gate | Result |
|---|---|
| Backend unit | ⏭ Skipped (no backend changes) |
| Backend e2e | ⏭ Skipped (no backend changes) |
| Frontend unit | ✅ 391 tests passed (63 files) |
| Frontend e2e | ⏭ Skipped (UI changes are covered by unit tests; e2e requires live backend) |
Key discoveries
Section titled “Key discoveries”front/public/favicon.svgwas a blue “S” SVG that browsers preferred over the PNG favicons — deleting it was sufficient; PNGs were already correct and byte-identical to the docs site.- The
AssetSnapshotsListempty-state condition was updated fromsorted.length > 0tosorted.length > 0 || acquisitionDateso the table renders even when there are zero snapshots but an acquisition date exists. dev-setup.mdhad a stale reference saying Docker usesnode:22-alpine— updated tonode:24-alpineas part of the doc grep pass.