horae-browser-checks
checks.x86_64-linux.browser
· build #775
· raw
1shipyard-worker-5/nix-grpc-farm-worker-x86-64-598b49f685-2zbpc: building x3lc03x919g3ibb1rccd3p7iir9ckx29-horae-browser-checks.drv2initdb: warning: enabling "trust" authentication for local connections3initdb: 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.4waiting for server to start.... done5server started62026-11-05T18:45:11.248646Z INFO horae: Running migrations...72026-11-05T18:45:11.376161Z INFO horae: Migrations complete.82026-11-05T18:45:11.386257Z INFO horae::seed: Seeding demo data…92026-11-05T18:45:11.403595Z INFO horae::seed: Seed complete.102026-11-05T18:45:11.404380Z INFO horae::seed: time_entries: 10 rows112026-11-05T18:45:11.404530Z INFO horae::seed: clients: 2 rows12admin 1440px light: text rows per total line: billable 1,1; cost 113admin 1440px light text 32px: text rows per total line: billable 2,2; cost 214admin 1440px dark: text rows per total line: billable 1,1; cost 115admin 1440px dark text 32px: text rows per total line: billable 2,2; cost 216admin 390px light: text rows per total line: billable 2,2; cost 217admin 390px light text 32px: text rows per total line: billable 2,2; cost 218admin 390px dark: text rows per total line: billable 2,2; cost 219admin 390px dark text 32px: text rows per total line: billable 2,2; cost 220admin 320px light: text rows per total line: billable 2,2; cost 221admin 320px light text 32px: text rows per total line: billable 2,2; cost 222admin 320px dark: text rows per total line: billable 2,2; cost 223admin 320px dark text 32px: text rows per total line: billable 2,2; cost 224restricted 1440px light: text rows per total line: billable 1,1; cost 125restricted 1440px light text 32px: text rows per total line: billable 2,2; cost 126restricted 1440px dark: text rows per total line: billable 1,1; cost 127restricted 1440px dark text 32px: text rows per total line: billable 2,2; cost 128restricted 390px light: text rows per total line: billable 2,2; cost 129restricted 390px light text 32px: text rows per total line: billable 2,2; cost 130restricted 390px dark: text rows per total line: billable 2,2; cost 131restricted 390px dark text 32px: text rows per total line: billable 2,2; cost 132restricted 320px light: text rows per total line: billable 2,2; cost 133restricted 320px light text 32px: text rows per total line: billable 2,2; cost 134restricted 320px dark: text rows per total line: billable 2,2; cost 135restricted 320px dark text 32px: text rows per total line: billable 2,2; cost 136PASS: 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.9637PASS: 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.9638PASS: archived own timer labels survive without granting catalog or global-rate access39PASS: catalog/rate grants never enable unlinked or archived tasks for a new timer; valid start/stop persists40PASS: rail popovers accept clicks and release the resize handle after closing41PASS: scoped project list/detail expose workflow labels without directory access, private notes or rates42PASS: edit and managed-project revocation remove current UI authority without legacy Administrator fallback43PASS: inactive-account and changed-policy responses clear retained detail; retry recovers only the original binding44PASS: keyboard manager removal preserves archived membership and withheld money/notes at desktop and narrow widths45PASS: staged project task archive/restore, undo, cancellation and running-timer rejection preserve hidden configuration and restrictions46PASS: financial read grants display disabled values and ordinary saves preserve stored fields47PASS: explicit zero, cost reset and lost-acknowledgement replay preserve exact original intent48PASS: current-authority revocation discards old editor state; explicit reload restores a fresh authorized form49PASS: an explicit hours-only budget edit preserves inactive hidden money and recorded history50PASS: scoped report paging, totals, four individual reports, four nested breakdowns, filtered exports, stale/invalid states and policy binding; Chromium 148.0.7778.9651✔ permissions: pending navigation preserves history until the request is resolved (3.388791ms)52✔ permissions: dirty navigation requires an explicit discard (0.672326ms)53✔ client: pending navigation preserves history until the request is resolved (1.363908ms)54✔ client: dirty navigation requires an explicit discard (0.614817ms)55✔ invoice: pending navigation preserves history until the request is resolved (0.672877ms)56✔ invoice: dirty navigation requires an explicit discard (0.60042ms)57✔ project: pending navigation preserves history until the request is resolved (1.277765ms)58✔ project: dirty navigation requires an explicit discard (0.778045ms)59✔ timesheet: pending navigation preserves history until the request is resolved (0.801729ms)60✔ timesheet: dirty navigation requires an explicit discard (0.987129ms)61✔ permissions: scroll-only replacements preserve Dioxus coordinates without prompting (0.715017ms)62✔ timesheet: scroll-only replacements preserve Dioxus coordinates without prompting (0.550216ms)63✔ the legacy project opt-in and explicit release keep working (0.683027ms)64ℹ tests 1365ℹ suites 066ℹ pass 1367ℹ fail 068ℹ cancelled 069ℹ skipped 070ℹ todo 071ℹ duration_ms 21.17721772✔ store acknowledgement precedes a load from a new execution (2.799913ms)73✔ identical store is idempotent; another request cannot replace it (1.270894ms)74✔ clear requires the exact stored record and is idempotent (2.877227ms)75✔ storage errors never acknowledge a mutation or erase a request (1.816971ms)76✔ size limit counts UTF-8 bytes on both reads and writes (2.53862ms)77✔ other requesters and unrelated browser records are untouched (1.738664ms)78ℹ tests 679ℹ suites 080ℹ pass 681ℹ fail 082ℹ cancelled 083ℹ skipped 084ℹ todo 085ℹ duration_ms 19.76659186Permission recovery browser: Chromium 148.0.7778.9687PASS: canonical People separates read scope, Administrator editing and legacy roles without legacy reads88PASS: editor reload rejects a changed session and recovers only for the original requester89PASS: real person save survives lost response/reload and replays exactly one receipt90PASS: account changes isolate tab recovery; same-user reauthentication and restored authority recover the template91PASS: a deleted template is recovered from its exact receipt without recreating it92PASS: real permission history supports empty state, keyboard details, stable paging, deleted profiles, refresh/revocation and canonical access93PASS: storage refusal prevents sends; acknowledged self-demotion cleanup issues no second mutation94PASS: Export: semantics, keyboard, focus return, backdrop and short viewport95PASS: Add entry: semantics, keyboard, focus return, backdrop and short viewport96PASS: + Add row: semantics, keyboard, focus return, backdrop and short viewport97PASS: pending save blocks dismissal; failure preserves input and allows retry98PASS: row deletion is atomic after a stale-client lock and supports retry99PASS: move failure is visible and reconciles with saved data100PASS: resize failure is visible and reconciles with saved data101PASS: reorder failure is visible and reconciles with saved data102PASS: lost response failure is visible and reconciles with saved data103PASS: historical move works without current tracking choices104PASS: historical resize works without current tracking choices105PASS: historical reorder works without current tracking choices106PASS: day-view timer failure is visible107PASS: project scope includes zero-entry active teammates without exposing unrelated hours108PASS: changing person and browser history reload the correct sheet, including an empty teammate109PASS: Day and Week edits carry the selected owner and preserve hidden work110PASS: delegated creation uses the selected person and eligible project/task111PASS: delegated Calendar drawing, day movement and resizing persist exact minutes112PASS: delegated untimed moves and order inversions persist the complete ordered entry set113PASS: delegated modal and Week row deletion preserve unrelated hours and requester timer114PASS: revocation between click and commit rejects the write and preserves the draft/data115PASS: delegated timer leaves the requester timer alone and requires restored tracking eligibility116PASS: only the owner can use terminal recovery after losing project assignment117Timesheet read failed: 403 http://127.0.0.1:8093/api/load_timesheet_page16386063561583833955118PASS: relationship revocation removes the selected sheet without falling back to own data119PASS: header actions, supported metrics and labelled native budget progress120PASS: design heading, compact row typography and inline project type121PASS: filtered empty state resets search, scope and client122PASS: narrow/short layouts, keyboard row actions and export formats123PASS: loading spend is unavailable until the read completes124PASS: failed spend is unavailable; retry restores real amounts125PASS: configured monthly consumption replaces lifetime spend only after loading126PASS: keyboard-accessible scope breakdown exposes overruns without layout overflow127PASS: failed configured budget never falls back to lifetime figures128PASS: empty-state guidance and action visibility for admin129PASS: empty-state guidance and action visibility for manager130PASS: empty-state guidance and action visibility for member131PASS: shared Menu, Combobox, empty-state and navigation-icon defaults are unchanged132PASS: /clients header at 320px133PASS: /clients header at 390px134PASS: /clients header at 768px135PASS: /clients header at 1280px136PASS: /clients header at 1440px137PASS: /projects header at 320px138PASS: /projects header at 390px139PASS: /projects header at 768px140PASS: /projects header at 1280px141PASS: /projects header at 1440px142PASS: /invoices header at 320px143PASS: /invoices header at 390px144PASS: /invoices header at 768px145PASS: /invoices header at 1280px146PASS: /invoices header at 1440px147PASS: /reports header at 320px148PASS: /reports header at 390px149PASS: /reports header at 768px150PASS: /reports header at 1280px151PASS: /reports header at 1440px152PASS: /admin/users header at 320px153PASS: /admin/users header at 390px154PASS: /admin/users header at 768px155PASS: /admin/users header at 1280px156PASS: /admin/users header at 1440px157PASS: /approvals header at 320px158PASS: /approvals header at 390px159PASS: /approvals header at 768px160PASS: /approvals header at 1280px161PASS: /approvals header at 1440px162PASS: /settings header at 320px163PASS: /settings header at 390px164PASS: /settings header at 768px165PASS: /settings header at 1280px166PASS: /settings header at 1440px167PASS: /admin/importers header at 320px168PASS: /admin/importers header at 390px169PASS: /admin/importers header at 768px170PASS: /admin/importers header at 1280px171PASS: /admin/importers header at 1440px172PASS: /timesheet/week/2026-11-02 header at 320px173PASS: /timesheet/week/2026-11-02 header at 390px174PASS: /timesheet/week/2026-11-02 header at 768px175PASS: /timesheet/week/2026-11-02 header at 1280px176PASS: /timesheet/week/2026-11-02 header at 1440px177PASS: /timesheet/day/2026-11-02 header at 320px178PASS: /timesheet/day/2026-11-02 header at 390px179PASS: /timesheet/day/2026-11-02 header at 768px180PASS: /timesheet/day/2026-11-02 header at 1280px181PASS: /timesheet/day/2026-11-02 header at 1440px182PASS: /timesheet/calendar/2026-11-02 header at 320px183PASS: /timesheet/calendar/2026-11-02 header at 390px184PASS: /timesheet/calendar/2026-11-02 header at 768px185PASS: /timesheet/calendar/2026-11-02 header at 1280px186PASS: /timesheet/calendar/2026-11-02 header at 1440px187PASS: project names and badges stay within aligned columns; scrolling to last-row actions opens editing188PASS: small-screen timesheet pager, date picker and view controls remain usable189PASS: admin subnavigation and its content remain reachable on mobile190PASS: day strip scrolls to Sunday and long entry labels do not cover actions191PASS: shared toasts keep message and dismiss control inside the viewport at normal and enlarged text192CHECK: late popover initialization restores missing focus without overriding deliberate focus193PASS: late popover initialization restores missing focus without overriding deliberate focus194CHECK: content reflow preserves an open menu while deliberate scrolling still dismisses it195PASS: content reflow preserves an open menu while deliberate scrolling still dismisses it196CHECK: first and last project-row actions are initially visible and clickable197PASS: first and last project-row actions are initially visible and clickable198CHECK: menu keyboard, disabled items, outside click and repeated opening199PASS: menu keyboard, disabled items, outside click and repeated opening200CHECK: scroll and resize dismiss without leaving stale menus or focus201PASS: scroll and resize dismiss without leaving stale menus or focus202CHECK: short-screen menu scrolls internally and supports reverse Tab and Space203PASS: short-screen menu scrolls internally and supports reverse Tab and Space204CHECK: filter and calendar menus keep their callbacks and survive route changes205PASS: filter and calendar menus keep their callbacks and survive route changes206CHECK: Timesheet keeps the shared calendar and week selection behavior207PASS: Timesheet keeps the shared calendar and week selection behavior208CHECK: menus, selects and calendars stay anchored inside the viewport under CSS zoom209PASS: menus, selects and calendars stay anchored inside the viewport under CSS zoom210PASS: mobile content width, keyboard toggle, Escape/focus restoration and navigation close211PASS: short mobile viewport reaches account navigation and preserves desktop collapse state212PASS: desktop drag width survives mobile and breakpoint transitions213PASS: rail lists Harvest sections in order and Team/Tasks left the user menu214PASS: collapsed idle timer is a centred 44px chip; expanded timer unchanged215PASS: avatar initials are centred on their cap height at every size216PASS: keyboard selection, mixed/select-all states and Actions count217PASS: search, status and client changes clear selection218PASS: keyboard selection/confirmation and no document overflow in both themes at three widths219PASS: cancel/focus, failure retry, pending guard and archive/reactivate confirmation220PASS: oversized selection cannot submit and members have no bulk controls221PASS: real atomic archive/reactivate, anonymous/member/inactive denial, manager/admin and safe retries222PASS: bulk success restores focus and recovers the list without stale actions223PASS: bulk pending restores focus and recovers the list without stale actions224PASS: bulk pending-navigation restores focus and recovers the list without stale actions225PASS: bulk failure restores focus and recovers the list without stale actions226{227 "results": {228 "row archive": {229 "remounts": 0,230 "loading": 0,231 "rows": 3,232 "busy": true,233 "loadingText": false,234 "bulkDisabled": true,235 "auxReads": 0,236 "ms": 429,237 "search": "alpha",238 "client": "Acme"239 },240 "bulk archive": {241 "remounts": 0,242 "loading": 0,243 "rows": 2,244 "busy": true,245 "loadingText": false,246 "bulkDisabled": true,247 "auxReads": 0,248 "ms": 488,249 "search": "alpha",250 "client": "Acme"251 },252 "failed reload": {253 "remounts": 0,254 "loading": 0,255 "rows": 1,256 "busy": true,257 "loadingText": false,258 "bulkDisabled": true,259 "auxReads": 0,260 "ms": 440,261 "search": "alpha",262 "client": "Acme"263 }264 },265 "afterRow": {266 "two": "true",267 "three": "true"268 },269 "failedAlert": "Could not load projects. Retry to refresh the list. Retry",270 "bulkAfterFailure": true271}272projects-keep-filters: ok273PASS: client activation failure remains visible with form closed, open and cancelled274PASS: successful form save preserves action error; real status retry clears it and refreshes the row275PASS: archive failure survives menu dismissal; shared edit failure preserves input and safely retries276PASS: failed team removal preserves the draft, safely retries and can be restored through the shared editor277PASS: initial catalog/draft failures show loading and recovery without rendering or saving an empty replacement278PASS: design typography, section spacing, quiet dividers and theme-aware task information279PASS: project types retain native keyboard selection and the designed icon/option-card states280PASS: searchable client selection, pending/error recovery and explicit/inherited currency281PASS: client default-rate currency rejects relabelling, preserves failed input and permits compatible edits282PASS: task and teammate searches handle pending results, keyboard selection, duplicates and retry283PASS: real client, team, task restrictions, billing and invoice defaults survive reload284PASS: all invoice-default errors identify and focus their field, preserve input and recover at three widths285PASS: basic-field rejections retain values, link visible errors and restore focus at three widths286PASS: failed resume and retry preserve the existing draft without a replacement write287PASS: invalid hourly rates and hour/fee budgets retain input and focus their error at three widths288PASS: a stale email configuration rejection can be corrected without sending mail289PASS: task/person rate, cost and budget errors identify their row and preserve other inputs at three widths290PASS: single/monthly fees, empty schedules and individual milestone errors recover without changing another row291PASS: responsive form, conditional panels and Cancel preserve the draft292PASS: edits made while a save is pending are saved after its acknowledgement293PASS: lost acknowledgement retries the same request and preserves newer edits294PASS: real finalized budget reaches the authorized Projects endpoint and display295PASS: a new tagged project reaches reports and both exports; pending/error filters never show stale rows296PASS: project invoice defaults prefill real estimates, stale reviews cannot generate, and editable draft values persist independently297PASS: lost creation response is idempotent and clears the completed draft298PASS: stale tabs cannot overwrite saved input; explicit discard removes only the draft299ReferenceError: feeReads is not defined300 at /nix/store/5amqqal529brrqp5if3851yzd4g59mmr-horae/tests/browser/invoice-preparation.cjs:542:18301{302 url: 'http://127.0.0.1:8093/invoices',303 errors: [],304 page: '- complementary "Navigation":\n' +305 ' - text: Horae\n' +306 ' - button "Collapse sidebar": «\n' +307 ' - button "Start timer"\n' +308 ' - text: Track\n' +309 ' - link "Timesheet":\n' +310 ' - /url: /timesheet/week/2026-11-05?span=week&user=\n' +311 ' - img\n' +312 ' - text: Timesheet\n' +313 ' - text: Organize\n' +314 ' - link "Team":\n' +315 ' - /url: /admin/users\n' +316 ' - img\n' +317 ' - text: Team\n' +318 ' - link "Clients":\n' +319 ' - /url: /clients\n' +320 ' - img\n' +321 ' - text: Clients\n' +322 ' - link "Projects":\n' +323 ' - /url: /projects\n' +324 ' - img\n' +325 ' - text: Projects\n' +326 ' - text: Bill\n' +327 ' - link "Invoices":\n' +328 ' - /url: /invoices\n' +329 ' - img\n' +330 ' - text: Invoices\n' +331 ' - text: Review\n' +332 ' - link "Approvals":\n' +333 ' - /url: /approvals?week=\n' +334 ' - img\n' +335 ' - text: Approvals\n' +336 ' - link "Reports":\n' +337 ' - /url: /reports\n' +338 ' - img\n' +339 ' - text: Reports\n' +340 ' - button "AU Admin User Admin ⌄"\n' +341 '- main:\n' +342 ' - heading "Invoices" [level=1]\n' +343 ' - button "Cancel"\n' +344 ' - heading "Prepare invoice" [level=3]\n' +345 ' - 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' +346 ' - group "Invoice sources":\n' +347 ' - text: Client\n' +348 ' - combobox "Client":\n' +349 ' - option "Select a client…"\n' +350 ' - option "Acme Corp" [selected]\n' +351 ' - option "Action error browser 1793904403552"\n' +352 ' - option "New project browser client"\n' +353 ' - option "TechStart Inc"\n' +354 ' - text: Period from\n' +355 ' - textbox "Period from":\n' +356 ' - /placeholder: ""\n' +357 ' - text: 2026-09-01\n' +358 ' - text: Period to\n' +359 ' - textbox "Period to":\n' +360 ' - /placeholder: ""\n' +361 ' - text: 2026-10-31\n' +362 ' - heading "Projects" [level=4]\n' +363 ' - checkbox "All projects for this client"\n' +364 ' - checkbox "Acme Website Redesign"\n' +365 ' - checkbox "Team recovery 1793904404568"\n' +366 ' - checkbox "TechStart API Integration" [checked]\n' +367 ' - heading "Invoice values" [level=4]\n' +368 ' - group "Invoice values":\n' +369 ' - text: Payment terms\n' +370 ' - combobox "Payment terms":\n' +371 ' - option "Due on receipt"\n' +372 ' - option "Net 15"\n' +373 ' - option "Net 30"\n' +374 ' - option "Net 45"\n' +375 ' - option "Net 60"\n' +376 ' - option "Custom days" [selected]\n' +377 ' - text: Days until payment is due\n' +378 ' - textbox "Days until payment is due":\n' +379 ' - /placeholder: ""\n' +380 ' - text: "90"\n' +381 ' - paragraph: From 0 to 365 days after the invoice date.\n' +382 ' - text: PO number\n' +383 ' - textbox "PO number":\n' +384 ' - /placeholder: ""\n' +385 ' - text: TECH-01\n' +386 ' - paragraph: Optional\n' +387 ' - text: Tax (%)\n' +388 ' - textbox "Tax (%)":\n' +389 ' - /placeholder: ""\n' +390 ' - text: "0.00"\n' +391 ' - paragraph: Optional · up to two decimal places\n' +392 ' - button "Add a second tax"\n' +393 ' - text: Discount (%)\n' +394 ' - textbox "Discount (%)":\n' +395 ' - /placeholder: ""\n' +396 ' - text: "0.00"\n' +397 ' - paragraph: Discount is applied before tax. Both taxes use the discounted subtotal without compounding.\n' +398 ' - group "Fees to invoice":\n' +399 ' - heading "Fees to invoice" [level=4]\n' +400 ' - 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' +401 ` - 'group "Fee: TechStart API Integration — 2026-09 fee (EUR)"':\n` +402 ` - 'checkbox "Include fee: TechStart API Integration — 2026-09 fee" [checked]'\n` +403 ' - text: Fee description\n' +404 ' - textbox "Fee description":\n' +405 ' - /placeholder: ""\n' +406 ' - text: TechStart API Integration — 2026-09 fee\n' +407 ' - text: Fee amount (EUR)\n' +408 ' - textbox "Fee amount (EUR)":\n' +409 ' - /placeholder: ""\n' +410 ' - text: "900.00"\n' +411 ' - paragraph: "Last review · Agreed: EUR 900.00 · Invoiced (including drafts): EUR 0.00 · Remaining: EUR 900.00"\n' +412 ` - 'group "Fee: TechStart API Integration — 2026-10 fee (EUR)"':\n` +413 ` - 'checkbox "Include fee: TechStart API Integration — 2026-10 fee" [checked]'\n` +414 ' - text: Fee description\n' +415 ' - textbox "Fee description":\n' +416 ' - /placeholder: ""\n' +417 ' - text: TechStart API Integration — 2026-10 fee\n' +418 ' - text: Fee amount (EUR)\n' +419 ' - textbox "Fee amount (EUR)":\n' +420 ' - /placeholder: ""\n' +421 ' - text: "900.00"\n' +422 ' - paragraph: "Last review · Agreed: EUR 900.00 · Invoiced (including drafts): EUR 0.00 · Remaining: EUR 900.00"\n' +423 ' - button "Review invoice"\n' +424 ' - button "Generate draft"\n' +425 ' - button "Refresh fee sources"\n' +426 ' - paragraph: "Invoice date: 2026-11-05 · Due: 2027-02-03"\n' +427 ' - table "Estimated invoice charges (EUR)":\n' +428 ' - caption: Estimated invoice charges (EUR)\n' +429 ' - rowgroup:\n' +430 ' - row "Description Hours Rate Amount":\n' +431 ' - columnheader "Description"\n' +432 ' - columnheader "Hours"\n' +433 ' - columnheader "Rate"\n' +434 ' - columnheader "Amount"\n' +435 ' - rowgroup:\n' +436 ` - '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` +437 ` - '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` +438 ' - text: TechStart API Integration — 2026-09 fee\n' +439 ' - paragraph: "Agreed: EUR 900.00"\n' +440 ' - paragraph: "Invoiced (including drafts): EUR 0.00"\n' +441 ' - paragraph: "Available: EUR 900.00"\n' +442 ' - paragraph: "Proposed net before tax: EUR 900.00"\n' +443 ' - cell "—"\n' +444 ' - cell "—"\n' +445 ' - cell "900.00"\n' +446 ` - '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` +447 ` - '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` +448 ' - text: TechStart API Integration — 2026-10 fee\n' +449 ' - paragraph: "Agreed: EUR 900.00"\n' +450 ' - paragraph: "Invoiced (including drafts): EUR 0.00"\n' +451 ' - paragraph: "Available: EUR 900.00"\n' +452 ' - paragraph: "Proposed net before tax: EUR 900.00"\n' +453 ' - cell "—"\n' +454 ' - cell "—"\n' +455 ' - cell "900.00"\n' +456 ' - rowgroup:\n' +457 ' - row "Subtotal EUR 1800.00":\n' +458 ' - rowheader "Subtotal"\n' +459 ' - cell "EUR 1800.00"\n' +460 ' - row "Total EUR 1800.00":\n' +461 ' - rowheader "Total"\n' +462 ' - cell "EUR 1800.00"\n' +463 ' - table:\n' +464 ' - rowgroup:\n' +465 ' - row "Number Client Status Issued Due Total Actions":\n' +466 ' - columnheader "Number"\n' +467 ' - columnheader "Client"\n' +468 ' - columnheader "Status"\n' +469 ' - columnheader "Issued"\n' +470 ' - columnheader "Due"\n' +471 ' - columnheader "Total"\n' +472 ' - columnheader "Actions"\n' +473 ' - rowgroup:\n' +474 ' - row "INV-202611-004 Acme Corp draft 2026-11-05 2026-11-19 EUR 22.99 View":\n' +475 ' - cell "INV-202611-004"\n' +476 ' - cell "Acme Corp"\n' +477 ' - cell "draft"\n' +478 ' - cell "2026-11-05"\n' +479 ' - cell "2026-11-19"\n' +480 ' - cell "EUR 22.99"\n' +481 ' - cell "View":\n' +482 ' - link "View":\n' +483 ' - /url: /invoices/01a1ad0b-8367-7c22-93be-ea16021ef2a2\n' +484 ' - row "INV-202611-003 Acme Corp draft 2026-11-05 2026-11-19 EUR 21.78 View":\n' +485 ' - cell "INV-202611-003"\n' +486 ' - cell "Acme Corp"\n' +487 ' - cell "draft"\n' +488 ' - cell "2026-11-05"\n' +489 ' - cell "2026-11-19"\n' +490 ' - cell "EUR 21.78"\n' +491 ' - cell "View":\n' +492 ' - link "View":\n' +493 ' - /url: /invoices/01a1ad0b-8003-7882-97e1-a8d218cd7f6f\n' +494 ' - row "INV-202611-002 Acme Corp draft 2026-11-05 2026-11-19 EUR 108.90 View":\n' +495 ' - cell "INV-202611-002"\n' +496 ' - cell "Acme Corp"\n' +497 ' - cell "draft"\n' +498 ' - cell "2026-11-05"\n' +499 ' - cell "2026-11-19"\n' +500 ' - cell "EUR 108.90"\n' +501 ' - cell "View":\n' +502 ' - link "View":\n' +503 ' - /url: /invoices/01a1ad0b-721b-7842-9049-9a4bfc832bee\n' +504 ' - row "INV-202611-001 New project browser client sent 2026-11-05 2026-12-20 EUR 80.66 View":\n' +505 ' - cell "INV-202611-001"\n' +506 ' - cell "New project browser client"\n' +507 ' - cell "sent"\n' +508 ' - cell "2026-11-05"\n' +509 ' - cell "2026-12-20"\n' +510 ' - cell "EUR 80.66"\n' +511 ' - cell "View":\n' +512 ' - link "View":\n' +513 ' - /url: /invoices/01a1ad0b-5743-7d42-aa8a-b7ab260932a2'514}515ReferenceError: feeReads is not defined516 at /nix/store/5amqqal529brrqp5if3851yzd4g59mmr-horae/tests/browser/invoice-preparation.cjs:542:185172026-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.5182026-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-bit5192026-11-05 18:45:11.040 UTC [18] LOG: listening on Unix socket "/tmp/horae-browser.HO0FJX/.s.PGSQL.5432"5202026-11-05 18:45:11.041 UTC [21] LOG: database system was shut down at 2026-11-05 18:45:09 UTC5212026-11-05 18:45:11.044 UTC [18] LOG: database system is ready to accept connections5222026-11-05 18:45:38.573 UTC [926] LOG: could not send data to client: Broken pipe5232026-11-05 18:45:38.573 UTC [926] FATAL: connection to client lost5242026-11-05 18:45:38.583 UTC [930] LOG: could not send data to client: Broken pipe5252026-11-05 18:45:38.583 UTC [930] FATAL: connection to client lost5262026-11-05 18:45:38.587 UTC [933] LOG: could not send data to client: Broken pipe5272026-11-05 18:45:38.588 UTC [933] FATAL: connection to client lost5282026-11-05 18:45:38.597 UTC [934] LOG: could not send data to client: Broken pipe5292026-11-05 18:45:38.597 UTC [934] FATAL: connection to client lost5302026-11-05 18:45:38.601 UTC [935] LOG: could not send data to client: Broken pipe5312026-11-05 18:45:38.601 UTC [935] FATAL: connection to client lost5322026-11-05 18:45:38.611 UTC [936] LOG: could not send data to client: Broken pipe5332026-11-05 18:45:38.611 UTC [936] FATAL: connection to client lost5342026-11-05 18:45:38.615 UTC [937] LOG: could not send data to client: Broken pipe5352026-11-05 18:45:38.615 UTC [937] FATAL: connection to client lost5362026-11-05 18:45:38.624 UTC [938] LOG: could not send data to client: Broken pipe5372026-11-05 18:45:38.624 UTC [938] FATAL: connection to client lost5382026-11-05 18:45:38.628 UTC [939] LOG: could not send data to client: Broken pipe5392026-11-05 18:45:38.628 UTC [939] FATAL: connection to client lost5402026-11-05 18:45:38.637 UTC [941] LOG: could not send data to client: Broken pipe5412026-11-05 18:45:38.637 UTC [941] FATAL: connection to client lost5422026-11-05 18:45:38.643 UTC [942] LOG: could not send data to client: Broken pipe5432026-11-05 18:45:38.643 UTC [942] FATAL: connection to client lost5442026-11-05 18:45:38.650 UTC [943] LOG: could not send data to client: Broken pipe5452026-11-05 18:45:38.650 UTC [943] FATAL: connection to client lost5462026-11-05 18:45:38.657 UTC [944] LOG: could not send data to client: Broken pipe5472026-11-05 18:45:38.657 UTC [944] FATAL: connection to client lost5482026-11-05 18:45:38.664 UTC [945] LOG: could not send data to client: Broken pipe5492026-11-05 18:45:38.664 UTC [945] FATAL: connection to client lost5502026-11-05 18:45:38.671 UTC [946] LOG: could not send data to client: Broken pipe5512026-11-05 18:45:38.671 UTC [946] FATAL: connection to client lost5522026-11-05 18:45:38.678 UTC [947] LOG: could not send data to client: Broken pipe5532026-11-05 18:45:38.678 UTC [947] FATAL: connection to client lost5542026-11-05 18:45:38.685 UTC [948] LOG: could not send data to client: Broken pipe5552026-11-05 18:45:38.685 UTC [948] FATAL: connection to client lost5562026-11-05 18:45:38.692 UTC [949] LOG: could not send data to client: Broken pipe5572026-11-05 18:45:38.692 UTC [949] FATAL: connection to client lost5582026-11-05 18:45:38.699 UTC [950] LOG: could not send data to client: Broken pipe5592026-11-05 18:45:38.699 UTC [950] FATAL: connection to client lost5602026-11-05 18:45:38.706 UTC [951] LOG: could not send data to client: Broken pipe5612026-11-05 18:45:38.706 UTC [951] FATAL: connection to client lost5622026-11-05 18:45:38.712 UTC [952] LOG: could not send data to client: Broken pipe5632026-11-05 18:45:38.712 UTC [952] FATAL: connection to client lost5642026-11-05 18:45:38.719 UTC [953] LOG: could not send data to client: Broken pipe5652026-11-05 18:45:38.719 UTC [953] FATAL: connection to client lost5662026-11-05 18:45:38.726 UTC [954] LOG: could not send data to client: Broken pipe5672026-11-05 18:45:38.726 UTC [954] FATAL: connection to client lost5682026-11-05 18:45:38.733 UTC [955] LOG: could not send data to client: Broken pipe5692026-11-05 18:45:38.733 UTC [955] FATAL: connection to client lost5702026-11-05 18:45:38.740 UTC [956] LOG: could not send data to client: Broken pipe5712026-11-05 18:45:38.740 UTC [956] FATAL: connection to client lost5722026-11-05 18:45:38.747 UTC [957] LOG: could not send data to client: Broken pipe5732026-11-05 18:45:38.747 UTC [957] FATAL: connection to client lost5742026-11-05 18:45:38.754 UTC [958] LOG: could not send data to client: Broken pipe5752026-11-05 18:45:38.754 UTC [958] FATAL: connection to client lost5762026-11-05 18:45:38.761 UTC [959] LOG: could not send data to client: Broken pipe5772026-11-05 18:45:38.761 UTC [959] FATAL: connection to client lost5782026-11-05 18:45:38.767 UTC [960] LOG: could not send data to client: Broken pipe5792026-11-05 18:45:38.767 UTC [960] FATAL: connection to client lost5802026-11-05 18:45:38.774 UTC [961] LOG: could not send data to client: Broken pipe5812026-11-05 18:45:38.774 UTC [961] FATAL: connection to client lost5822026-11-05 18:45:38.781 UTC [962] LOG: could not send data to client: Broken pipe5832026-11-05 18:45:38.781 UTC [962] FATAL: connection to client lost5842026-11-05 18:45:38.788 UTC [963] LOG: could not send data to client: Broken pipe5852026-11-05 18:45:38.788 UTC [963] FATAL: connection to client lost5862026-11-05 18:45:38.794 UTC [964] LOG: could not send data to client: Broken pipe5872026-11-05 18:45:38.794 UTC [964] FATAL: connection to client lost5882026-11-05 18:45:38.800 UTC [965] LOG: could not send data to client: Broken pipe5892026-11-05 18:45:38.800 UTC [965] FATAL: connection to client lost5902026-11-05 18:45:38.807 UTC [966] LOG: could not send data to client: Broken pipe5912026-11-05 18:45:38.807 UTC [966] FATAL: connection to client lost5922026-11-05 18:45:38.813 UTC [967] LOG: could not send data to client: Broken pipe5932026-11-05 18:45:38.813 UTC [967] FATAL: connection to client lost5942026-11-05 18:49:37.418 UTC [18] LOG: received fast shutdown request5952026-11-05 18:49:37.418 UTC [18] LOG: aborting any active transactions5962026-11-05 18:49:37.420 UTC [18] LOG: background worker "logical replication launcher" (PID 24) exited with exit code 15972026-11-05 18:49:37.424 UTC [19] LOG: shutting down5982026-11-05 18:49:37.424 UTC [19] LOG: checkpoint starting: shutdown immediate5992026-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/1CB74F06002026-11-05 18:49:37.456 UTC [18] LOG: database system is shut down