shipyard-worker-5/nix-grpc-farm-worker-x86-64-598b49f685-2zbpc: building x3lc03x919g3ibb1rccd3p7iir9ckx29-horae-browser-checks.drv initdb: warning: enabling "trust" authentication for local connections initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. waiting for server to start.... done server started 2026-11-05T18:45:11.248646Z INFO horae: Running migrations... 2026-11-05T18:45:11.376161Z INFO horae: Migrations complete. 2026-11-05T18:45:11.386257Z INFO horae::seed: Seeding demo data… 2026-11-05T18:45:11.403595Z INFO horae::seed: Seed complete. 2026-11-05T18:45:11.404380Z INFO horae::seed: time_entries: 10 rows 2026-11-05T18:45:11.404530Z INFO horae::seed: clients: 2 rows admin 1440px light: text rows per total line: billable 1,1; cost 1 admin 1440px light text 32px: text rows per total line: billable 2,2; cost 2 admin 1440px dark: text rows per total line: billable 1,1; cost 1 admin 1440px dark text 32px: text rows per total line: billable 2,2; cost 2 admin 390px light: text rows per total line: billable 2,2; cost 2 admin 390px light text 32px: text rows per total line: billable 2,2; cost 2 admin 390px dark: text rows per total line: billable 2,2; cost 2 admin 390px dark text 32px: text rows per total line: billable 2,2; cost 2 admin 320px light: text rows per total line: billable 2,2; cost 2 admin 320px light text 32px: text rows per total line: billable 2,2; cost 2 admin 320px dark: text rows per total line: billable 2,2; cost 2 admin 320px dark text 32px: text rows per total line: billable 2,2; cost 2 restricted 1440px light: text rows per total line: billable 1,1; cost 1 restricted 1440px light text 32px: text rows per total line: billable 2,2; cost 1 restricted 1440px dark: text rows per total line: billable 1,1; cost 1 restricted 1440px dark text 32px: text rows per total line: billable 2,2; cost 1 restricted 390px light: text rows per total line: billable 2,2; cost 1 restricted 390px light text 32px: text rows per total line: billable 2,2; cost 1 restricted 390px dark: text rows per total line: billable 2,2; cost 1 restricted 390px dark text 32px: text rows per total line: billable 2,2; cost 1 restricted 320px light: text rows per total line: billable 2,2; cost 1 restricted 320px light text 32px: text rows per total line: billable 2,2; cost 1 restricted 320px dark: text rows per total line: billable 2,2; cost 1 restricted 320px dark text 32px: text rows per total line: billable 2,2; cost 1 PASS: legacy report currency totals EUR 1,330.00 / USD 1,475.00, groupings, filter, loading, retry, both themes with base and 32px root text at 1440/390/320px, and withheld cost; Chromium 148.0.7778.96 PASS: legacy report exports for no filter, project only, client only, client and project, teammate only: links, Time and Detailed rows, CSV bytes and XLSX downloads; Chromium 148.0.7778.96 PASS: archived own timer labels survive without granting catalog or global-rate access PASS: catalog/rate grants never enable unlinked or archived tasks for a new timer; valid start/stop persists PASS: rail popovers accept clicks and release the resize handle after closing PASS: scoped project list/detail expose workflow labels without directory access, private notes or rates PASS: edit and managed-project revocation remove current UI authority without legacy Administrator fallback PASS: inactive-account and changed-policy responses clear retained detail; retry recovers only the original binding PASS: keyboard manager removal preserves archived membership and withheld money/notes at desktop and narrow widths PASS: staged project task archive/restore, undo, cancellation and running-timer rejection preserve hidden configuration and restrictions PASS: financial read grants display disabled values and ordinary saves preserve stored fields PASS: explicit zero, cost reset and lost-acknowledgement replay preserve exact original intent PASS: current-authority revocation discards old editor state; explicit reload restores a fresh authorized form PASS: an explicit hours-only budget edit preserves inactive hidden money and recorded history PASS: scoped report paging, totals, four individual reports, four nested breakdowns, filtered exports, stale/invalid states and policy binding; Chromium 148.0.7778.96 ✔ permissions: pending navigation preserves history until the request is resolved (3.388791ms) ✔ permissions: dirty navigation requires an explicit discard (0.672326ms) ✔ client: pending navigation preserves history until the request is resolved (1.363908ms) ✔ client: dirty navigation requires an explicit discard (0.614817ms) ✔ invoice: pending navigation preserves history until the request is resolved (0.672877ms) ✔ invoice: dirty navigation requires an explicit discard (0.60042ms) ✔ project: pending navigation preserves history until the request is resolved (1.277765ms) ✔ project: dirty navigation requires an explicit discard (0.778045ms) ✔ timesheet: pending navigation preserves history until the request is resolved (0.801729ms) ✔ timesheet: dirty navigation requires an explicit discard (0.987129ms) ✔ permissions: scroll-only replacements preserve Dioxus coordinates without prompting (0.715017ms) ✔ timesheet: scroll-only replacements preserve Dioxus coordinates without prompting (0.550216ms) ✔ the legacy project opt-in and explicit release keep working (0.683027ms) ℹ tests 13 ℹ suites 0 ℹ pass 13 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 21.177217 ✔ store acknowledgement precedes a load from a new execution (2.799913ms) ✔ identical store is idempotent; another request cannot replace it (1.270894ms) ✔ clear requires the exact stored record and is idempotent (2.877227ms) ✔ storage errors never acknowledge a mutation or erase a request (1.816971ms) ✔ size limit counts UTF-8 bytes on both reads and writes (2.53862ms) ✔ other requesters and unrelated browser records are untouched (1.738664ms) ℹ tests 6 ℹ suites 0 ℹ pass 6 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 19.766591 Permission recovery browser: Chromium 148.0.7778.96 PASS: canonical People separates read scope, Administrator editing and legacy roles without legacy reads PASS: editor reload rejects a changed session and recovers only for the original requester PASS: real person save survives lost response/reload and replays exactly one receipt PASS: account changes isolate tab recovery; same-user reauthentication and restored authority recover the template PASS: a deleted template is recovered from its exact receipt without recreating it PASS: real permission history supports empty state, keyboard details, stable paging, deleted profiles, refresh/revocation and canonical access PASS: storage refusal prevents sends; acknowledged self-demotion cleanup issues no second mutation PASS: Export: semantics, keyboard, focus return, backdrop and short viewport PASS: Add entry: semantics, keyboard, focus return, backdrop and short viewport PASS: + Add row: semantics, keyboard, focus return, backdrop and short viewport PASS: pending save blocks dismissal; failure preserves input and allows retry PASS: row deletion is atomic after a stale-client lock and supports retry PASS: move failure is visible and reconciles with saved data PASS: resize failure is visible and reconciles with saved data PASS: reorder failure is visible and reconciles with saved data PASS: lost response failure is visible and reconciles with saved data PASS: historical move works without current tracking choices PASS: historical resize works without current tracking choices PASS: historical reorder works without current tracking choices PASS: day-view timer failure is visible PASS: project scope includes zero-entry active teammates without exposing unrelated hours PASS: changing person and browser history reload the correct sheet, including an empty teammate PASS: Day and Week edits carry the selected owner and preserve hidden work PASS: delegated creation uses the selected person and eligible project/task PASS: delegated Calendar drawing, day movement and resizing persist exact minutes PASS: delegated untimed moves and order inversions persist the complete ordered entry set PASS: delegated modal and Week row deletion preserve unrelated hours and requester timer PASS: revocation between click and commit rejects the write and preserves the draft/data PASS: delegated timer leaves the requester timer alone and requires restored tracking eligibility PASS: only the owner can use terminal recovery after losing project assignment Timesheet read failed: 403 http://127.0.0.1:8093/api/load_timesheet_page16386063561583833955 PASS: relationship revocation removes the selected sheet without falling back to own data PASS: header actions, supported metrics and labelled native budget progress PASS: design heading, compact row typography and inline project type PASS: filtered empty state resets search, scope and client PASS: narrow/short layouts, keyboard row actions and export formats PASS: loading spend is unavailable until the read completes PASS: failed spend is unavailable; retry restores real amounts PASS: configured monthly consumption replaces lifetime spend only after loading PASS: keyboard-accessible scope breakdown exposes overruns without layout overflow PASS: failed configured budget never falls back to lifetime figures PASS: empty-state guidance and action visibility for admin PASS: empty-state guidance and action visibility for manager PASS: empty-state guidance and action visibility for member PASS: shared Menu, Combobox, empty-state and navigation-icon defaults are unchanged PASS: /clients header at 320px PASS: /clients header at 390px PASS: /clients header at 768px PASS: /clients header at 1280px PASS: /clients header at 1440px PASS: /projects header at 320px PASS: /projects header at 390px PASS: /projects header at 768px PASS: /projects header at 1280px PASS: /projects header at 1440px PASS: /invoices header at 320px PASS: /invoices header at 390px PASS: /invoices header at 768px PASS: /invoices header at 1280px PASS: /invoices header at 1440px PASS: /reports header at 320px PASS: /reports header at 390px PASS: /reports header at 768px PASS: /reports header at 1280px PASS: /reports header at 1440px PASS: /admin/users header at 320px PASS: /admin/users header at 390px PASS: /admin/users header at 768px PASS: /admin/users header at 1280px PASS: /admin/users header at 1440px PASS: /approvals header at 320px PASS: /approvals header at 390px PASS: /approvals header at 768px PASS: /approvals header at 1280px PASS: /approvals header at 1440px PASS: /settings header at 320px PASS: /settings header at 390px PASS: /settings header at 768px PASS: /settings header at 1280px PASS: /settings header at 1440px PASS: /admin/importers header at 320px PASS: /admin/importers header at 390px PASS: /admin/importers header at 768px PASS: /admin/importers header at 1280px PASS: /admin/importers header at 1440px PASS: /timesheet/week/2026-11-02 header at 320px PASS: /timesheet/week/2026-11-02 header at 390px PASS: /timesheet/week/2026-11-02 header at 768px PASS: /timesheet/week/2026-11-02 header at 1280px PASS: /timesheet/week/2026-11-02 header at 1440px PASS: /timesheet/day/2026-11-02 header at 320px PASS: /timesheet/day/2026-11-02 header at 390px PASS: /timesheet/day/2026-11-02 header at 768px PASS: /timesheet/day/2026-11-02 header at 1280px PASS: /timesheet/day/2026-11-02 header at 1440px PASS: /timesheet/calendar/2026-11-02 header at 320px PASS: /timesheet/calendar/2026-11-02 header at 390px PASS: /timesheet/calendar/2026-11-02 header at 768px PASS: /timesheet/calendar/2026-11-02 header at 1280px PASS: /timesheet/calendar/2026-11-02 header at 1440px PASS: project names and badges stay within aligned columns; scrolling to last-row actions opens editing PASS: small-screen timesheet pager, date picker and view controls remain usable PASS: admin subnavigation and its content remain reachable on mobile PASS: day strip scrolls to Sunday and long entry labels do not cover actions PASS: shared toasts keep message and dismiss control inside the viewport at normal and enlarged text CHECK: late popover initialization restores missing focus without overriding deliberate focus PASS: late popover initialization restores missing focus without overriding deliberate focus CHECK: content reflow preserves an open menu while deliberate scrolling still dismisses it PASS: content reflow preserves an open menu while deliberate scrolling still dismisses it CHECK: first and last project-row actions are initially visible and clickable PASS: first and last project-row actions are initially visible and clickable CHECK: menu keyboard, disabled items, outside click and repeated opening PASS: menu keyboard, disabled items, outside click and repeated opening CHECK: scroll and resize dismiss without leaving stale menus or focus PASS: scroll and resize dismiss without leaving stale menus or focus CHECK: short-screen menu scrolls internally and supports reverse Tab and Space PASS: short-screen menu scrolls internally and supports reverse Tab and Space CHECK: filter and calendar menus keep their callbacks and survive route changes PASS: filter and calendar menus keep their callbacks and survive route changes CHECK: Timesheet keeps the shared calendar and week selection behavior PASS: Timesheet keeps the shared calendar and week selection behavior CHECK: menus, selects and calendars stay anchored inside the viewport under CSS zoom PASS: menus, selects and calendars stay anchored inside the viewport under CSS zoom PASS: mobile content width, keyboard toggle, Escape/focus restoration and navigation close PASS: short mobile viewport reaches account navigation and preserves desktop collapse state PASS: desktop drag width survives mobile and breakpoint transitions PASS: rail lists Harvest sections in order and Team/Tasks left the user menu PASS: collapsed idle timer is a centred 44px chip; expanded timer unchanged PASS: avatar initials are centred on their cap height at every size PASS: keyboard selection, mixed/select-all states and Actions count PASS: search, status and client changes clear selection PASS: keyboard selection/confirmation and no document overflow in both themes at three widths PASS: cancel/focus, failure retry, pending guard and archive/reactivate confirmation PASS: oversized selection cannot submit and members have no bulk controls PASS: real atomic archive/reactivate, anonymous/member/inactive denial, manager/admin and safe retries PASS: bulk success restores focus and recovers the list without stale actions PASS: bulk pending restores focus and recovers the list without stale actions PASS: bulk pending-navigation restores focus and recovers the list without stale actions PASS: bulk failure restores focus and recovers the list without stale actions { "results": { "row archive": { "remounts": 0, "loading": 0, "rows": 3, "busy": true, "loadingText": false, "bulkDisabled": true, "auxReads": 0, "ms": 429, "search": "alpha", "client": "Acme" }, "bulk archive": { "remounts": 0, "loading": 0, "rows": 2, "busy": true, "loadingText": false, "bulkDisabled": true, "auxReads": 0, "ms": 488, "search": "alpha", "client": "Acme" }, "failed reload": { "remounts": 0, "loading": 0, "rows": 1, "busy": true, "loadingText": false, "bulkDisabled": true, "auxReads": 0, "ms": 440, "search": "alpha", "client": "Acme" } }, "afterRow": { "two": "true", "three": "true" }, "failedAlert": "Could not load projects. Retry to refresh the list. Retry", "bulkAfterFailure": true } projects-keep-filters: ok PASS: client activation failure remains visible with form closed, open and cancelled PASS: successful form save preserves action error; real status retry clears it and refreshes the row PASS: archive failure survives menu dismissal; shared edit failure preserves input and safely retries PASS: failed team removal preserves the draft, safely retries and can be restored through the shared editor PASS: initial catalog/draft failures show loading and recovery without rendering or saving an empty replacement PASS: design typography, section spacing, quiet dividers and theme-aware task information PASS: project types retain native keyboard selection and the designed icon/option-card states PASS: searchable client selection, pending/error recovery and explicit/inherited currency PASS: client default-rate currency rejects relabelling, preserves failed input and permits compatible edits PASS: task and teammate searches handle pending results, keyboard selection, duplicates and retry PASS: real client, team, task restrictions, billing and invoice defaults survive reload PASS: all invoice-default errors identify and focus their field, preserve input and recover at three widths PASS: basic-field rejections retain values, link visible errors and restore focus at three widths PASS: failed resume and retry preserve the existing draft without a replacement write PASS: invalid hourly rates and hour/fee budgets retain input and focus their error at three widths PASS: a stale email configuration rejection can be corrected without sending mail PASS: task/person rate, cost and budget errors identify their row and preserve other inputs at three widths PASS: single/monthly fees, empty schedules and individual milestone errors recover without changing another row PASS: responsive form, conditional panels and Cancel preserve the draft PASS: edits made while a save is pending are saved after its acknowledgement PASS: lost acknowledgement retries the same request and preserves newer edits PASS: real finalized budget reaches the authorized Projects endpoint and display PASS: a new tagged project reaches reports and both exports; pending/error filters never show stale rows PASS: project invoice defaults prefill real estimates, stale reviews cannot generate, and editable draft values persist independently PASS: lost creation response is idempotent and clears the completed draft PASS: stale tabs cannot overwrite saved input; explicit discard removes only the draft ReferenceError: feeReads is not defined at /nix/store/5amqqal529brrqp5if3851yzd4g59mmr-horae/tests/browser/invoice-preparation.cjs:542:18 { url: 'http://127.0.0.1:8093/invoices', errors: [], page: '- complementary "Navigation":\n' + ' - text: Horae\n' + ' - button "Collapse sidebar": «\n' + ' - button "Start timer"\n' + ' - text: Track\n' + ' - link "Timesheet":\n' + ' - /url: /timesheet/week/2026-11-05?span=week&user=\n' + ' - img\n' + ' - text: Timesheet\n' + ' - text: Organize\n' + ' - link "Team":\n' + ' - /url: /admin/users\n' + ' - img\n' + ' - text: Team\n' + ' - link "Clients":\n' + ' - /url: /clients\n' + ' - img\n' + ' - text: Clients\n' + ' - link "Projects":\n' + ' - /url: /projects\n' + ' - img\n' + ' - text: Projects\n' + ' - text: Bill\n' + ' - link "Invoices":\n' + ' - /url: /invoices\n' + ' - img\n' + ' - text: Invoices\n' + ' - text: Review\n' + ' - link "Approvals":\n' + ' - /url: /approvals?week=\n' + ' - img\n' + ' - text: Approvals\n' + ' - link "Reports":\n' + ' - /url: /reports\n' + ' - img\n' + ' - text: Reports\n' + ' - button "AU Admin User Admin ⌄"\n' + '- main:\n' + ' - heading "Invoices" [level=1]\n' + ' - button "Cancel"\n' + ' - heading "Prepare invoice" [level=3]\n' + ' - paragraph: Review unbilled time and monthly fees in this period, plus overdue single fees and milestones. The estimate reserves nothing; generation rechecks available charges. Nothing is sent automatically.\n' + ' - group "Invoice sources":\n' + ' - text: Client\n' + ' - combobox "Client":\n' + ' - option "Select a client…"\n' + ' - option "Acme Corp" [selected]\n' + ' - option "Action error browser 1793904403552"\n' + ' - option "New project browser client"\n' + ' - option "TechStart Inc"\n' + ' - text: Period from\n' + ' - textbox "Period from":\n' + ' - /placeholder: ""\n' + ' - text: 2026-09-01\n' + ' - text: Period to\n' + ' - textbox "Period to":\n' + ' - /placeholder: ""\n' + ' - text: 2026-10-31\n' + ' - heading "Projects" [level=4]\n' + ' - checkbox "All projects for this client"\n' + ' - checkbox "Acme Website Redesign"\n' + ' - checkbox "Team recovery 1793904404568"\n' + ' - checkbox "TechStart API Integration" [checked]\n' + ' - heading "Invoice values" [level=4]\n' + ' - group "Invoice values":\n' + ' - text: Payment terms\n' + ' - combobox "Payment terms":\n' + ' - option "Due on receipt"\n' + ' - option "Net 15"\n' + ' - option "Net 30"\n' + ' - option "Net 45"\n' + ' - option "Net 60"\n' + ' - option "Custom days" [selected]\n' + ' - text: Days until payment is due\n' + ' - textbox "Days until payment is due":\n' + ' - /placeholder: ""\n' + ' - text: "90"\n' + ' - paragraph: From 0 to 365 days after the invoice date.\n' + ' - text: PO number\n' + ' - textbox "PO number":\n' + ' - /placeholder: ""\n' + ' - text: TECH-01\n' + ' - paragraph: Optional\n' + ' - text: Tax (%)\n' + ' - textbox "Tax (%)":\n' + ' - /placeholder: ""\n' + ' - text: "0.00"\n' + ' - paragraph: Optional · up to two decimal places\n' + ' - button "Add a second tax"\n' + ' - text: Discount (%)\n' + ' - textbox "Discount (%)":\n' + ' - /placeholder: ""\n' + ' - text: "0.00"\n' + ' - paragraph: Discount is applied before tax. Both taxes use the discounted subtotal without compounding.\n' + ' - group "Fees to invoice":\n' + ' - heading "Fees to invoice" [level=4]\n' + ' - paragraph: Amounts and descriptions change this invoice only. Balances are from the last review and include drafts, before tax. Settled fees are not selected automatically. Refreshing preserves edits and leaves new fees unselected.\n' + ` - 'group "Fee: TechStart API Integration — 2026-09 fee (EUR)"':\n` + ` - 'checkbox "Include fee: TechStart API Integration — 2026-09 fee" [checked]'\n` + ' - text: Fee description\n' + ' - textbox "Fee description":\n' + ' - /placeholder: ""\n' + ' - text: TechStart API Integration — 2026-09 fee\n' + ' - text: Fee amount (EUR)\n' + ' - textbox "Fee amount (EUR)":\n' + ' - /placeholder: ""\n' + ' - text: "900.00"\n' + ' - paragraph: "Last review · Agreed: EUR 900.00 · Invoiced (including drafts): EUR 0.00 · Remaining: EUR 900.00"\n' + ` - 'group "Fee: TechStart API Integration — 2026-10 fee (EUR)"':\n` + ` - 'checkbox "Include fee: TechStart API Integration — 2026-10 fee" [checked]'\n` + ' - text: Fee description\n' + ' - textbox "Fee description":\n' + ' - /placeholder: ""\n' + ' - text: TechStart API Integration — 2026-10 fee\n' + ' - text: Fee amount (EUR)\n' + ' - textbox "Fee amount (EUR)":\n' + ' - /placeholder: ""\n' + ' - text: "900.00"\n' + ' - paragraph: "Last review · Agreed: EUR 900.00 · Invoiced (including drafts): EUR 0.00 · Remaining: EUR 900.00"\n' + ' - button "Review invoice"\n' + ' - button "Generate draft"\n' + ' - button "Refresh fee sources"\n' + ' - paragraph: "Invoice date: 2026-11-05 · Due: 2027-02-03"\n' + ' - table "Estimated invoice charges (EUR)":\n' + ' - caption: Estimated invoice charges (EUR)\n' + ' - rowgroup:\n' + ' - row "Description Hours Rate Amount":\n' + ' - columnheader "Description"\n' + ' - columnheader "Hours"\n' + ' - columnheader "Rate"\n' + ' - columnheader "Amount"\n' + ' - rowgroup:\n' + ` - 'row "TechStart API Integration — 2026-09 fee Agreed: EUR 900.00 Invoiced (including drafts): EUR 0.00 Available: EUR 900.00 Proposed net before tax: EUR 900.00 — — 900.00"':\n` + ` - 'cell "TechStart API Integration — 2026-09 fee Agreed: EUR 900.00 Invoiced (including drafts): EUR 0.00 Available: EUR 900.00 Proposed net before tax: EUR 900.00"':\n` + ' - text: TechStart API Integration — 2026-09 fee\n' + ' - paragraph: "Agreed: EUR 900.00"\n' + ' - paragraph: "Invoiced (including drafts): EUR 0.00"\n' + ' - paragraph: "Available: EUR 900.00"\n' + ' - paragraph: "Proposed net before tax: EUR 900.00"\n' + ' - cell "—"\n' + ' - cell "—"\n' + ' - cell "900.00"\n' + ` - 'row "TechStart API Integration — 2026-10 fee Agreed: EUR 900.00 Invoiced (including drafts): EUR 0.00 Available: EUR 900.00 Proposed net before tax: EUR 900.00 — — 900.00"':\n` + ` - 'cell "TechStart API Integration — 2026-10 fee Agreed: EUR 900.00 Invoiced (including drafts): EUR 0.00 Available: EUR 900.00 Proposed net before tax: EUR 900.00"':\n` + ' - text: TechStart API Integration — 2026-10 fee\n' + ' - paragraph: "Agreed: EUR 900.00"\n' + ' - paragraph: "Invoiced (including drafts): EUR 0.00"\n' + ' - paragraph: "Available: EUR 900.00"\n' + ' - paragraph: "Proposed net before tax: EUR 900.00"\n' + ' - cell "—"\n' + ' - cell "—"\n' + ' - cell "900.00"\n' + ' - rowgroup:\n' + ' - row "Subtotal EUR 1800.00":\n' + ' - rowheader "Subtotal"\n' + ' - cell "EUR 1800.00"\n' + ' - row "Total EUR 1800.00":\n' + ' - rowheader "Total"\n' + ' - cell "EUR 1800.00"\n' + ' - table:\n' + ' - rowgroup:\n' + ' - row "Number Client Status Issued Due Total Actions":\n' + ' - columnheader "Number"\n' + ' - columnheader "Client"\n' + ' - columnheader "Status"\n' + ' - columnheader "Issued"\n' + ' - columnheader "Due"\n' + ' - columnheader "Total"\n' + ' - columnheader "Actions"\n' + ' - rowgroup:\n' + ' - row "INV-202611-004 Acme Corp draft 2026-11-05 2026-11-19 EUR 22.99 View":\n' + ' - cell "INV-202611-004"\n' + ' - cell "Acme Corp"\n' + ' - cell "draft"\n' + ' - cell "2026-11-05"\n' + ' - cell "2026-11-19"\n' + ' - cell "EUR 22.99"\n' + ' - cell "View":\n' + ' - link "View":\n' + ' - /url: /invoices/01a1ad0b-8367-7c22-93be-ea16021ef2a2\n' + ' - row "INV-202611-003 Acme Corp draft 2026-11-05 2026-11-19 EUR 21.78 View":\n' + ' - cell "INV-202611-003"\n' + ' - cell "Acme Corp"\n' + ' - cell "draft"\n' + ' - cell "2026-11-05"\n' + ' - cell "2026-11-19"\n' + ' - cell "EUR 21.78"\n' + ' - cell "View":\n' + ' - link "View":\n' + ' - /url: /invoices/01a1ad0b-8003-7882-97e1-a8d218cd7f6f\n' + ' - row "INV-202611-002 Acme Corp draft 2026-11-05 2026-11-19 EUR 108.90 View":\n' + ' - cell "INV-202611-002"\n' + ' - cell "Acme Corp"\n' + ' - cell "draft"\n' + ' - cell "2026-11-05"\n' + ' - cell "2026-11-19"\n' + ' - cell "EUR 108.90"\n' + ' - cell "View":\n' + ' - link "View":\n' + ' - /url: /invoices/01a1ad0b-721b-7842-9049-9a4bfc832bee\n' + ' - row "INV-202611-001 New project browser client sent 2026-11-05 2026-12-20 EUR 80.66 View":\n' + ' - cell "INV-202611-001"\n' + ' - cell "New project browser client"\n' + ' - cell "sent"\n' + ' - cell "2026-11-05"\n' + ' - cell "2026-12-20"\n' + ' - cell "EUR 80.66"\n' + ' - cell "View":\n' + ' - link "View":\n' + ' - /url: /invoices/01a1ad0b-5743-7d42-aa8a-b7ab260932a2' } ReferenceError: feeReads is not defined at /nix/store/5amqqal529brrqp5if3851yzd4g59mmr-horae/tests/browser/invoice-preparation.cjs:542:18 2026-11-05T18:45:11.444176Z WARN horae: DEV_LOGIN=1: /auth/dev-login signs anyone in as an admin without a password. Use it for local development only. 2026-11-05 18:45:11.040 UTC [18] LOG: starting PostgreSQL 17.10 on x86_64-pc-linux-gnu, compiled by clang version 21.1.8, 64-bit 2026-11-05 18:45:11.040 UTC [18] LOG: listening on Unix socket "/tmp/horae-browser.HO0FJX/.s.PGSQL.5432" 2026-11-05 18:45:11.041 UTC [21] LOG: database system was shut down at 2026-11-05 18:45:09 UTC 2026-11-05 18:45:11.044 UTC [18] LOG: database system is ready to accept connections 2026-11-05 18:45:38.573 UTC [926] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.573 UTC [926] FATAL: connection to client lost 2026-11-05 18:45:38.583 UTC [930] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.583 UTC [930] FATAL: connection to client lost 2026-11-05 18:45:38.587 UTC [933] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.588 UTC [933] FATAL: connection to client lost 2026-11-05 18:45:38.597 UTC [934] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.597 UTC [934] FATAL: connection to client lost 2026-11-05 18:45:38.601 UTC [935] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.601 UTC [935] FATAL: connection to client lost 2026-11-05 18:45:38.611 UTC [936] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.611 UTC [936] FATAL: connection to client lost 2026-11-05 18:45:38.615 UTC [937] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.615 UTC [937] FATAL: connection to client lost 2026-11-05 18:45:38.624 UTC [938] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.624 UTC [938] FATAL: connection to client lost 2026-11-05 18:45:38.628 UTC [939] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.628 UTC [939] FATAL: connection to client lost 2026-11-05 18:45:38.637 UTC [941] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.637 UTC [941] FATAL: connection to client lost 2026-11-05 18:45:38.643 UTC [942] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.643 UTC [942] FATAL: connection to client lost 2026-11-05 18:45:38.650 UTC [943] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.650 UTC [943] FATAL: connection to client lost 2026-11-05 18:45:38.657 UTC [944] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.657 UTC [944] FATAL: connection to client lost 2026-11-05 18:45:38.664 UTC [945] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.664 UTC [945] FATAL: connection to client lost 2026-11-05 18:45:38.671 UTC [946] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.671 UTC [946] FATAL: connection to client lost 2026-11-05 18:45:38.678 UTC [947] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.678 UTC [947] FATAL: connection to client lost 2026-11-05 18:45:38.685 UTC [948] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.685 UTC [948] FATAL: connection to client lost 2026-11-05 18:45:38.692 UTC [949] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.692 UTC [949] FATAL: connection to client lost 2026-11-05 18:45:38.699 UTC [950] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.699 UTC [950] FATAL: connection to client lost 2026-11-05 18:45:38.706 UTC [951] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.706 UTC [951] FATAL: connection to client lost 2026-11-05 18:45:38.712 UTC [952] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.712 UTC [952] FATAL: connection to client lost 2026-11-05 18:45:38.719 UTC [953] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.719 UTC [953] FATAL: connection to client lost 2026-11-05 18:45:38.726 UTC [954] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.726 UTC [954] FATAL: connection to client lost 2026-11-05 18:45:38.733 UTC [955] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.733 UTC [955] FATAL: connection to client lost 2026-11-05 18:45:38.740 UTC [956] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.740 UTC [956] FATAL: connection to client lost 2026-11-05 18:45:38.747 UTC [957] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.747 UTC [957] FATAL: connection to client lost 2026-11-05 18:45:38.754 UTC [958] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.754 UTC [958] FATAL: connection to client lost 2026-11-05 18:45:38.761 UTC [959] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.761 UTC [959] FATAL: connection to client lost 2026-11-05 18:45:38.767 UTC [960] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.767 UTC [960] FATAL: connection to client lost 2026-11-05 18:45:38.774 UTC [961] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.774 UTC [961] FATAL: connection to client lost 2026-11-05 18:45:38.781 UTC [962] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.781 UTC [962] FATAL: connection to client lost 2026-11-05 18:45:38.788 UTC [963] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.788 UTC [963] FATAL: connection to client lost 2026-11-05 18:45:38.794 UTC [964] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.794 UTC [964] FATAL: connection to client lost 2026-11-05 18:45:38.800 UTC [965] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.800 UTC [965] FATAL: connection to client lost 2026-11-05 18:45:38.807 UTC [966] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.807 UTC [966] FATAL: connection to client lost 2026-11-05 18:45:38.813 UTC [967] LOG: could not send data to client: Broken pipe 2026-11-05 18:45:38.813 UTC [967] FATAL: connection to client lost 2026-11-05 18:49:37.418 UTC [18] LOG: received fast shutdown request 2026-11-05 18:49:37.418 UTC [18] LOG: aborting any active transactions 2026-11-05 18:49:37.420 UTC [18] LOG: background worker "logical replication launcher" (PID 24) exited with exit code 1 2026-11-05 18:49:37.424 UTC [19] LOG: shutting down 2026-11-05 18:49:37.424 UTC [19] LOG: checkpoint starting: shutdown immediate 2026-11-05 18:49:37.446 UTC [19] LOG: checkpoint complete: wrote 1349 buffers (8.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.021 s, sync=0.001 s, total=0.023 s; sync files=0, longest=0.000 s, average=0.000 s; distance=7978 kB, estimate=7978 kB; lsn=0/1CB74F0, redo lsn=0/1CB74F0 2026-11-05 18:49:37.456 UTC [18] LOG: database system is shut down