horae-browser-checks
checks.x86_64-linux.browser
· build #657
· raw
1initdb: warning: enabling "trust" authentication for local connections2initdb: 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.3waiting for server to start.... done4server started52026-10-12T21:20:49.467591Z INFO horae: Running migrations...62026-10-12T21:20:53.587359Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="-- New creation settings …" db.statement="\n\n-- New creation settings are opt-in. Existing and imported projects retain the\n-- legacy billing cascade when no project_settings row exists.\nALTER TABLE users ADD CONSTRAINT users_id_org_unique UNIQUE (id, org_id);\nALTER TABLE projects ADD CONSTRAINT projects_id_org_unique UNIQUE (id, org_id);\nALTER TABLE tasks ADD CONSTRAINT tasks_id_org_unique UNIQUE (id, org_id);\n\nALTER TABLE clients ADD COLUMN default_rate_cents bigint\n CHECK (default_rate_cents IS NULL OR default_rate_cents >= 0);\n\nCREATE TABLE project_drafts (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n creator_id uuid NOT NULL,\n revision bigint NOT NULL DEFAULT 1 CHECK (revision > 0),\n payload_version smallint NOT NULL DEFAULT 1 CHECK (payload_version = 1),\n payload jsonb NOT NULL CHECK (\n jsonb_typeof(payload) = 'object'\n AND octet_length(payload::text) <= 262144),\n completed_project_id uuid,\n discarded_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n FOREIGN KEY (creator_id, org_id) REFERENCES users(id, org_id),\n FOREIGN KEY (completed_project_id, org_id) REFERENCES projects(id, org_id),\n CHECK (completed_project_id IS NULL OR discarded_at IS NULL)\n);\n\nCREATE UNIQUE INDEX project_drafts_current_creator_idx\n ON project_drafts (org_id, creator_id)\n WHERE completed_project_id IS NULL AND discarded_at IS NULL;\n\nCREATE TABLE project_settings (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL UNIQUE,\n creator_id uuid NOT NULL,\n rate_mode text NOT NULL CHECK (rate_mode IN ('person', 'task', 'project')),\n budget_scope text NOT NULL DEFAULT 'project'\n CHECK (budget_scope IN ('project', 'task', 'person')),\n monthly_reset boolean NOT NULL DEFAULT false,\n include_nonbillable boolean NOT NULL DEFAULT false,\n alert_enabled boolean NOT NULL DEFAULT false,\n alert_threshold smallint NOT NULL DEFAULT 80 CHECK (alert_threshold BETWEEN 0 AND 100),\n report_visibility text NOT NULL DEFAULT 'managers'\n CHECK (report_visibility IN ('managers', 'project_members')),\n fee_mode text CHECK (fee_mode IN ('single', 'milestones', 'monthly')),\n fee_amount_cents bigint CHECK (fee_amount_cents >= 0),\n monthly_day text CHECK (monthly_day IN ('first', 'fifteenth', 'last')),\n terms_days smallint NOT NULL DEFAULT 30 CHECK (terms_days BETWEEN 0 AND 365),\n po_number text NOT NULL DEFAULT '' CHECK (char_length(po_number) <= 200),\n discount_bps smallint NOT NULL DEFAULT 0 CHECK (discount_bps BETWEEN 0 AND 10000),\n tax1_bps smallint NOT NULL DEFAULT 0 CHECK (tax1_bps BETWEEN 0 AND 10000),\n tax2_name text CHECK (char_length(btrim(tax2_name)) BETWEEN 1 AND 100),\n tax2_bps smallint CHECK (tax2_bps BETWEEN 0 AND 10000),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (creator_id, org_id) REFERENCES users(id, org_id),\n CHECK ((tax2_name IS NULL) = (tax2_bps IS NULL)),\n CHECK (CASE fee_mode\n WHEN 'single' THEN fee_amount_cents IS NOT NULL AND monthly_day IS NULL\n WHEN 'milestones' THEN fee_amount_cents IS NULL AND monthly_day IS NULL\n WHEN 'monthly' THEN fee_amount_cents IS NOT NULL AND monthly_day IS NOT NULL\n ELSE fee_amount_cents IS NULL AND monthly_day IS NULL\n END)\n);\n\n-- Private fields must not inherit table-level SELECT grants on projects or\n-- assignments held by the plugin database role.\nCREATE TABLE project_private_settings (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL UNIQUE,\n admin_notes text NOT NULL DEFAULT '' CHECK (char_length(admin_notes) <= 10000),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE\n);\n\nCREATE TABLE project_member_costs (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n user_id uuid NOT NULL,\n cost_rate_cents bigint NOT NULL CHECK (cost_rate_cents >= 0),\n UNIQUE (project_id, user_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (user_id, org_id) REFERENCES users(id, org_id),\n FOREIGN KEY (project_id, user_id) REFERENCES assignments(project_id, user_id) ON DELETE CASCADE\n);\n\nCREATE TABLE project_tags (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n name text NOT NULL CHECK (char_length(btrim(name)) BETWEEN 1 AND 50),\n UNIQUE (id, org_id)\n);\n\nCREATE UNIQUE INDEX project_tags_name_idx ON project_tags (org_id, lower(btrim(name)));\n\nCREATE TABLE project_tag_links (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n tag_id uuid NOT NULL,\n UNIQUE (project_id, tag_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id, org_id) REFERENCES project_tags(id, org_id)\n);\n\nCREATE TABLE project_task_settings (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n task_id uuid NOT NULL,\n restricted boolean NOT NULL DEFAULT false,\n budget_minutes bigint CHECK (budget_minutes >= 0),\n budget_cents bigint CHECK (budget_cents >= 0),\n UNIQUE (project_id, task_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (task_id, org_id) REFERENCES tasks(id, org_id),\n FOREIGN KEY (project_id, task_id) REFERENCES project_tasks(project_id, task_id) ON DELETE CASCADE,\n CHECK (budget_minutes IS NULL OR budget_cents IS NULL)\n);\n\nCREATE TABLE project_task_members (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n task_id uuid NOT NULL,\n user_id uuid NOT NULL,\n UNIQUE (project_id, task_id, user_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (task_id, org_id) REFERENCES tasks(id, org_id),\n FOREIGN KEY (user_id, org_id) REFERENCES users(id, org_id),\n FOREIGN KEY (project_id, task_id) REFERENCES project_task_settings(project_id, task_id) ON DELETE CASCADE,\n FOREIGN KEY (project_id, user_id) REFERENCES assignments(project_id, user_id) ON DELETE CASCADE\n);\n\nCREATE TABLE project_member_budgets (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n user_id uuid NOT NULL,\n budget_minutes bigint NOT NULL CHECK (budget_minutes >= 0),\n UNIQUE (project_id, user_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE,\n FOREIGN KEY (user_id, org_id) REFERENCES users(id, org_id),\n FOREIGN KEY (project_id, user_id) REFERENCES assignments(project_id, user_id) ON DELETE CASCADE\n);\n\nCREATE TABLE project_fee_milestones (\n id uuid PRIMARY KEY,\n org_id uuid NOT NULL REFERENCES organizations(id),\n project_id uuid NOT NULL,\n name text NOT NULL CHECK (char_length(btrim(name)) BETWEEN 1 AND 200),\n due_on date NOT NULL,\n amount_cents bigint NOT NULL CHECK (amount_cents >= 0),\n position smallint NOT NULL CHECK (position BETWEEN 0 AND 99),\n UNIQUE (project_id, position),\n UNIQUE (id, org_id),\n FOREIGN KEY (project_id, org_id) REFERENCES projects(id, org_id) ON DELETE CASCADE\n);\n\nREVOKE ALL ON project_drafts, project_settings, project_private_settings,\n project_member_costs, project_tags, project_tag_links, project_task_settings,\n project_task_members, project_member_budgets, project_fee_milestones FROM PUBLIC;\n\n" rows_affected=0 rows_returned=0 elapsed=3.140160969s elapsed_secs=3.140160969 slow_threshold=1s72026-10-12T21:20:55.983693Z INFO horae: Migrations complete.82026-10-12T21:20:56.079223Z INFO horae::seed: Seeding demo data…92026-10-12T21:20:56.516539Z INFO horae::seed: Seed complete.102026-10-12T21:20:56.543477Z INFO horae::seed: time_entries: 10 rows112026-10-12T21:20:56.582975Z INFO horae::seed: clients: 2 rows12PASS: archived own timer labels survive without granting catalog or global-rate access13PASS: catalog/rate grants never enable unlinked or archived tasks for a new timer; valid start/stop persists14PASS: rail popovers accept clicks and release the resize handle after closing15PASS: scoped project list/detail expose workflow labels without directory access, private notes or rates16PASS: edit and managed-project revocation remove current UI authority without legacy Administrator fallback17PASS: inactive-account and changed-policy responses clear retained detail; retry recovers only the original binding18PASS: keyboard manager removal preserves archived membership and withheld money/notes at desktop and narrow widths19PASS: staged project task archive/restore, undo, cancellation and running-timer rejection preserve hidden configuration and restrictions20PASS: financial read grants display disabled values and ordinary saves preserve stored fields21PASS: explicit zero, cost reset and lost-acknowledgement replay preserve exact original intent22PASS: current-authority revocation discards old editor state; explicit reload restores a fresh authorized form23PASS: an explicit hours-only budget edit preserves inactive hidden money and recorded history24PASS: scoped report paging, totals, four individual reports, four nested breakdowns, filtered exports, stale/invalid states and policy binding; Chromium 148.0.7778.9625✔ permissions: pending navigation preserves history until the request is resolved (178.032192ms)26✔ permissions: dirty navigation requires an explicit discard (214.582031ms)27✔ client: pending navigation preserves history until the request is resolved (322.695268ms)28✔ client: dirty navigation requires an explicit discard (1.650297ms)29✔ invoice: pending navigation preserves history until the request is resolved (190.253963ms)30✔ invoice: dirty navigation requires an explicit discard (153.932744ms)31✔ project: pending navigation preserves history until the request is resolved (1.698083ms)32✔ project: dirty navigation requires an explicit discard (162.746268ms)33✔ timesheet: pending navigation preserves history until the request is resolved (1.223676ms)34✔ timesheet: dirty navigation requires an explicit discard (103.109895ms)35✔ permissions: scroll-only replacements preserve Dioxus coordinates without prompting (78.9375ms)36✔ timesheet: scroll-only replacements preserve Dioxus coordinates without prompting (1.318223ms)37✔ the legacy project opt-in and explicit release keep working (184.983973ms)38ℹ tests 1339ℹ suites 040ℹ pass 1341ℹ fail 042ℹ cancelled 043ℹ skipped 044ℹ todo 045ℹ duration_ms 2248.11847646✔ store acknowledgement precedes a load from a new execution (69.420539ms)47✔ identical store is idempotent; another request cannot replace it (24.500553ms)48✔ clear requires the exact stored record and is idempotent (58.599963ms)49✔ storage errors never acknowledge a mutation or erase a request (20.597848ms)50✔ size limit counts UTF-8 bytes on both reads and writes (45.803486ms)51✔ other requesters and unrelated browser records are untouched (16.338298ms)52ℹ tests 653ℹ suites 054ℹ pass 655ℹ fail 056ℹ cancelled 057ℹ skipped 058ℹ todo 059ℹ duration_ms 284.39522260Permission recovery browser: Chromium 148.0.7778.9661PASS: canonical People separates read scope, Administrator editing and legacy roles without legacy reads62PASS: editor reload rejects a changed session and recovers only for the original requester63PASS: real person save survives lost response/reload and replays exactly one receipt64PASS: account changes isolate tab recovery; same-user reauthentication and restored authority recover the template65PASS: a deleted template is recovered from its exact receipt without recreating it66PASS: real permission history supports empty state, keyboard details, stable paging, deleted profiles, refresh/revocation and canonical access67PASS: storage refusal prevents sends; acknowledged self-demotion cleanup issues no second mutation68PASS: Export: semantics, keyboard, focus return, backdrop and short viewport69PASS: Add entry: semantics, keyboard, focus return, backdrop and short viewport70PASS: + Add row: semantics, keyboard, focus return, backdrop and short viewport71PASS: pending save blocks dismissal; failure preserves input and allows retry72PASS: row deletion is atomic after a stale-client lock and supports retry73PASS: move failure is visible and reconciles with saved data74PASS: resize failure is visible and reconciles with saved data75PASS: reorder failure is visible and reconciles with saved data76PASS: lost response failure is visible and reconciles with saved data77PASS: historical move works without current tracking choices78PASS: historical resize works without current tracking choices79PASS: historical reorder works without current tracking choices80PASS: day-view timer failure is visible81PASS: project scope includes zero-entry active teammates without exposing unrelated hours82PASS: changing person and browser history reload the correct sheet, including an empty teammate83PASS: Day and Week edits carry the selected owner and preserve hidden work84PASS: delegated creation uses the selected person and eligible project/task85PASS: delegated Calendar drawing, day movement and resizing persist exact minutes86PASS: delegated untimed moves and order inversions persist the complete ordered entry set87PASS: delegated modal and Week row deletion preserve unrelated hours and requester timer88PASS: revocation between click and commit rejects the write and preserves the draft/data89PASS: delegated timer leaves the requester timer alone and requires restored tracking eligibility90PASS: only the owner can use terminal recovery after losing project assignment91Timesheet read failed: 403 http://127.0.0.1:8093/api/load_timesheet_page1638606356158383395592PASS: relationship revocation removes the selected sheet without falling back to own data93PASS: header actions, supported metrics and labelled native budget progress94PASS: design heading, compact row typography and inline project type95PASS: filtered empty state resets search, scope and client96PASS: narrow/short layouts, keyboard row actions and export formats97PASS: loading spend is unavailable until the read completes98PASS: failed spend is unavailable; retry restores real amounts99PASS: configured monthly consumption replaces lifetime spend only after loading100PASS: keyboard-accessible scope breakdown exposes overruns without layout overflow101PASS: failed configured budget never falls back to lifetime figures102PASS: empty-state guidance and action visibility for admin103PASS: empty-state guidance and action visibility for manager104PASS: empty-state guidance and action visibility for member105PASS: shared Menu, Combobox, empty-state and navigation-icon defaults are unchanged106PASS: /clients header at 320px107PASS: /clients header at 390px108PASS: /clients header at 768px109PASS: /clients header at 1280px110PASS: /clients header at 1440px111PASS: /projects header at 320px112PASS: /projects header at 390px113PASS: /projects header at 768px114PASS: /projects header at 1280px115PASS: /projects header at 1440px116PASS: /invoices header at 320px117PASS: /invoices header at 390px118PASS: /invoices header at 768px119PASS: /invoices header at 1280px120PASS: /invoices header at 1440px121PASS: /reports header at 320px122PASS: /reports header at 390px123PASS: /reports header at 768px124PASS: /reports header at 1280px125PASS: /reports header at 1440px126PASS: /admin/users header at 320px127PASS: /admin/users header at 390px128PASS: /admin/users header at 768px129PASS: /admin/users header at 1280px130PASS: /admin/users header at 1440px131PASS: /approvals header at 320px132PASS: /approvals header at 390px133PASS: /approvals header at 768px134PASS: /approvals header at 1280px135PASS: /approvals header at 1440px136PASS: /settings header at 320px137PASS: /settings header at 390px138PASS: /settings header at 768px139PASS: /settings header at 1280px140PASS: /settings header at 1440px141PASS: /admin/importers header at 320px142PASS: /admin/importers header at 390px143PASS: /admin/importers header at 768px144PASS: /admin/importers header at 1280px145PASS: /admin/importers header at 1440px146PASS: /timesheet/week/2026-10-12 header at 320px147PASS: /timesheet/week/2026-10-12 header at 390px148PASS: /timesheet/week/2026-10-12 header at 768px149PASS: /timesheet/week/2026-10-12 header at 1280px150PASS: /timesheet/week/2026-10-12 header at 1440px151PASS: /timesheet/day/2026-10-12 header at 320px152PASS: /timesheet/day/2026-10-12 header at 390px153PASS: /timesheet/day/2026-10-12 header at 768px154PASS: /timesheet/day/2026-10-12 header at 1280px155PASS: /timesheet/day/2026-10-12 header at 1440px156PASS: /timesheet/calendar/2026-10-12 header at 320px157PASS: /timesheet/calendar/2026-10-12 header at 390px158PASS: /timesheet/calendar/2026-10-12 header at 768px159PASS: /timesheet/calendar/2026-10-12 header at 1280px160PASS: /timesheet/calendar/2026-10-12 header at 1440px161PASS: project names and badges stay within aligned columns; scrolling to last-row actions opens editing162PASS: small-screen timesheet pager, date picker and view controls remain usable163PASS: admin subnavigation and its content remain reachable on mobile164PASS: day strip scrolls to Sunday and long entry labels do not cover actions165CHECK: late popover initialization restores missing focus without overriding deliberate focus166PASS: late popover initialization restores missing focus without overriding deliberate focus167CHECK: content reflow preserves an open menu while deliberate scrolling still dismisses it168PASS: content reflow preserves an open menu while deliberate scrolling still dismisses it169CHECK: first and last project-row actions are initially visible and clickable170PASS: first and last project-row actions are initially visible and clickable171CHECK: menu keyboard, disabled items, outside click and repeated opening172PASS: menu keyboard, disabled items, outside click and repeated opening173CHECK: scroll and resize dismiss without leaving stale menus or focus174PASS: scroll and resize dismiss without leaving stale menus or focus175CHECK: short-screen menu scrolls internally and supports reverse Tab and Space176PASS: short-screen menu scrolls internally and supports reverse Tab and Space177CHECK: filter and calendar menus keep their callbacks and survive route changes178PASS: filter and calendar menus keep their callbacks and survive route changes179CHECK: Timesheet keeps the shared calendar and week selection behavior180PASS: Timesheet keeps the shared calendar and week selection behavior181PASS: mobile content width, keyboard toggle, Escape/focus restoration and navigation close182PASS: short mobile viewport reaches account navigation and preserves desktop collapse state183PASS: desktop drag width survives mobile and breakpoint transitions184PASS: keyboard selection, mixed/select-all states and Actions count185PASS: search, status and client changes clear selection186PASS: keyboard selection/confirmation and no document overflow in both themes at three widths187PASS: cancel/focus, failure retry, pending guard and archive/reactivate confirmation188PASS: oversized selection cannot submit and members have no bulk controls189PASS: real atomic archive/reactivate, anonymous/member/inactive denial, manager/admin and safe retries190ExpectError: expect(locator).toHaveCount(expected) failed191192Locator: locator('.proj-row')193Expected: 2194Received: 0195Timeout: 5000ms196197Call log:198 - Expect "to.have.count" with timeout 5000ms199 - waiting for locator('.proj-row')200 3 × locator resolved to 0 elements201 - unexpected value "0"202203 at captureRawStack (/nix/store/i6xnc927g8yrwq0fws8wbmjvj4y36fq5-playwright-test-1.60.0/lib/node_modules/playwright-core/lib/coreBundle.js:3130:17)204 at callMatcherAsStep (/nix/store/i6xnc927g8yrwq0fws8wbmjvj4y36fq5-playwright-test-1.60.0/lib/node_modules/playwright/lib/matchers/expect.js:12873:57)205 at Object.toHaveCount (/nix/store/i6xnc927g8yrwq0fws8wbmjvj4y36fq5-playwright-test-1.60.0/lib/node_modules/playwright/lib/matchers/expect.js:12863:23)206 at /nix/store/69j97diy8ybgln8phsmhlmbf07nb9rx1-horae/tests/browser/project-bulk-recovery.cjs:50:49 {207 matcherResult: {208 actual: 0,209 expected: 2,210 message: '\x1B[2mexpect(\x1B[22m\x1B[31mlocator\x1B[39m\x1B[2m).\x1B[22mtoHaveCount\x1B[2m(\x1B[22m\x1B[32mexpected\x1B[39m\x1B[2m)\x1B[22m failed\n' +211 '\n' +212 "Locator: locator('.proj-row')\n" +213 'Expected: \x1B[32m2\x1B[39m\n' +214 'Received: \x1B[31m0\x1B[39m\n' +215 'Timeout: 5000ms\n' +216 '\n' +217 'Call log:\n' +218 '\x1B[2m - Expect "to.have.count" with timeout 5000ms\x1B[22m\n' +219 "\x1B[2m - waiting for locator('.proj-row')\x1B[22m\n" +220 '\x1B[2m 3 × locator resolved to 0 elements\x1B[22m\n' +221 '\x1B[2m - unexpected value "0"\x1B[22m\n',222 name: 'toHaveCount',223 pass: false,224 log: [225 ' - Expect "to.have.count" with timeout 5000ms',226 " - waiting for locator('.proj-row')",227 ' 3 × locator resolved to 0 elements',228 ' - unexpected value "0"'229 ],230 timeout: 5000,231 ariaSnapshot: undefined232 }233}2342026-10-12T21:20:58.001705Z WARN horae: DEV_LOGIN=1: /auth/dev-login signs anyone in as an admin without a password. Use it for local development only.2352026-10-12T21:23:13.179053Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="SELECT p.id, p.name, p.code, …" db.statement="\n\nSELECT p.id, p.name, p.code, c.name AS client_name, p.currency,\n CASE WHEN (CASE WHEN $4 THEN u.org_role IN ('admin', 'manager')\n ELSE ($8 OR ($9 AND management.id IS NOT NULL))\n AND ($10 OR ($11 AND management.id IS NOT NULL)) END)\n AND p.project_type <> 'non_billable'\n AND (settings.project_id IS NULL\n OR (p.project_type = 'time_and_materials' AND settings.rate_mode = 'task'))\n THEN p.currency END AS task_rate_currency,\n p.starts_on as \"starts_on: chrono::NaiveDate\",\n p.ends_on as \"ends_on: chrono::NaiveDate\",\n ARRAY(SELECT t.name FROM project_tag_links l\n JOIN project_tags t ON t.id = l.tag_id AND t.org_id = l.org_id\n WHERE l.project_id = p.id AND l.org_id = p.org_id\n ORDER BY lower(t.name), t.id) as \"tags!\",\n CASE WHEN (CASE WHEN $4 THEN u.org_role = 'admin' ELSE $7 END)\n THEN private.admin_notes END AS admin_notes\n FROM projects p\n JOIN clients c ON c.id = p.client_id AND c.org_id = p.org_id\n JOIN users u ON u.id = $2 AND u.org_id = p.org_id AND u.active\n LEFT JOIN project_read_access a ON a.project_id = p.id AND a.org_id = p.org_id AND a.user_id = u.id\n LEFT JOIN project_management_assignments management ON management.org_id = p.org_id\n AND management.project_id = p.id AND management.manager_id = u.id\n LEFT JOIN assignments member ON member.project_id = p.id AND member.user_id = u.id\n LEFT JOIN project_private_settings private ON private.project_id = p.id AND private.org_id = p.org_id\n LEFT JOIN project_settings settings ON settings.project_id = p.id AND settings.org_id = p.org_id\n WHERE p.org_id = $1 AND p.id = $3\n AND CASE WHEN $4 THEN COALESCE(a.can_view_progress, false)\n ELSE $5 OR ($6 AND management.id IS NOT NULL)\n OR (member.id IS NOT NULL AND COALESCE(settings.report_visibility, 'project_members') = 'project_members') END\n" rows_affected=1 rows_returned=1 elapsed=1.353492014s elapsed_secs=1.353492014 slow_threshold=1s2362026-10-12T21:24:13.488397Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="WITH scoped AS NOT …" db.statement="\n\nWITH scoped AS NOT MATERIALIZED (\n SELECT e.id, e.spent_date, p.name AS project_name,\n t.name AS task_name, u.name AS user_name, e.minutes,\n effective_minutes(e.minutes,e.rounded_minutes,o.round_minutes,o.round_dir) AS rounded_minutes,\n (e.billable AND (e.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) AS billable, e.notes\n FROM time_entries e\n JOIN organizations o ON o.id=e.org_id\n JOIN users u ON u.id=e.user_id AND u.org_id=e.org_id\n JOIN projects p ON p.id=e.project_id AND p.org_id=e.org_id\n JOIN tasks t ON t.id=e.task_id AND t.org_id=e.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=e.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE e.org_id=$1 AND (\n $5::bool OR ($3::bool AND e.user_id=$2) OR ($4::bool AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=e.org_id AND m.manager_id=$2 AND m.managed_user_id=e.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=e.org_id AND m.manager_id=$2 AND m.project_id=e.project_id))))\n AND e.spent_date BETWEEN $6 AND $7\n AND (NOT $17::bool OR p.active)\n AND ($18::bool IS NULL OR $18 = (e.billable AND (e.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($8::uuid[])=0 OR p.client_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR e.project_id=ANY($9))\n AND (cardinality($10::uuid[])=0 OR e.user_id=ANY($10))\n AND (cardinality($11::uuid[])=0 OR e.task_id=ANY($11))\n AND (cardinality($12::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=e.org_id AND l.project_id=e.project_id AND tag.id=ANY($12)))\n ), stats AS (\n SELECT COUNT(*) AS entry_count,\n COALESCE(SUM(minutes),0)::bigint AS total_minutes,\n COALESCE(SUM(rounded_minutes),0)::bigint AS rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint AS billable_minutes\n FROM scoped\n ), page AS (\n SELECT * FROM scoped\n WHERE ($13::date IS NULL OR (spent_date,project_name COLLATE \"C\",task_name COLLATE \"C\",id)\n > ($13,$14::text COLLATE \"C\",$15::text COLLATE \"C\",$16::uuid))\n ORDER BY spent_date,project_name COLLATE \"C\",task_name COLLATE \"C\",id LIMIT 501\n )\n SELECT s.entry_count AS \"entry_count!\", s.total_minutes AS \"total_minutes!\",\n s.rounded_minutes AS \"total_rounded_minutes!\", s.billable_minutes AS \"billable_minutes!\",\n p.id AS \"id?\", p.spent_date AS \"spent_date?: chrono::NaiveDate\",\n p.project_name AS \"project_name?\", p.task_name AS \"task_name?\", p.user_name AS \"user_name?\",\n p.minutes AS \"minutes?\", p.rounded_minutes AS \"rounded_minutes?\", p.billable AS \"billable?\", p.notes\n FROM stats s LEFT JOIN page p ON true\n ORDER BY p.spent_date,p.project_name COLLATE \"C\",p.task_name COLLATE \"C\",p.id\n" rows_affected=501 rows_returned=501 elapsed=1.443271653s elapsed_secs=1.443271653 slow_threshold=1s2372026-10-12T21:24:50.408791Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="DECLARE horae_csv NO SCROLL …" db.statement="\n\nDECLARE horae_csv NO SCROLL CURSOR FOR\n WITH authority AS MATERIALIZED (\n SELECT o.permission_policy_version policy,u.active,\n s.catalog_version,s.grants,s.is_administrator,s.source permission_source,\n s.built_in_profile,s.template_id,s.applied_template_revision,s.revision,\n COALESCE(octet_length(s.source),0)::bigint + COALESCE(octet_length(s.built_in_profile),0)::bigint\n + COALESCE((SELECT SUM(octet_length(g)::bigint) FROM unnest(s.grants) g),0)::bigint authority_bytes\n FROM (VALUES ($1::uuid,$2::uuid)) identity(org_id,user_id)\n LEFT JOIN organizations o ON o.id=identity.org_id\n LEFT JOIN users u ON u.id=identity.user_id AND u.org_id=identity.org_id\n LEFT JOIN person_permission_states s ON s.org_id=o.id AND s.user_id=u.id\n ), scoped AS (\n SELECT CASE $10::text WHEN 'client' THEN c.id WHEN 'project' THEN p.id\n WHEN 'task' THEN t.id WHEN 'person' THEN u.id END group_id,\n CASE $10::text WHEN 'client' THEN c.name WHEN 'project' THEN p.name\n WHEN 'task' THEN t.name WHEN 'person' THEN u.name END name,\n te.user_id,te.project_id,\n effective_minutes(te.minutes,te.rounded_minutes,o.round_minutes,o.round_dir) rounded_minutes,\n (te.billable AND (te.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) billable\n FROM authority a CROSS JOIN time_entries te JOIN organizations o ON o.id=te.org_id\n JOIN projects p ON p.id=te.project_id AND p.org_id=te.org_id\n JOIN tasks t ON t.id=te.task_id AND t.org_id=te.org_id\n JOIN users u ON u.id=te.user_id AND u.org_id=te.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=te.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE te.org_id=$1 AND a.active AND a.policy=1 AND (\n 'time_read_all'=ANY(a.grants) OR ('time_read_own'=ANY(a.grants) AND te.user_id=$2)\n OR ('time_read_managed'=ANY(a.grants) AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.managed_user_id=te.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.project_id=te.project_id))))\n AND te.spent_date BETWEEN $3 AND $4\n AND (NOT $11::bool OR p.active)\n AND ($12::bool IS NULL OR $12 = (te.billable AND (te.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($5::uuid[])=0 OR p.client_id=ANY($5))\n AND (cardinality($6::uuid[])=0 OR te.project_id=ANY($6))\n AND (cardinality($7::uuid[])=0 OR te.user_id=ANY($7))\n AND (cardinality($8::uuid[])=0 OR te.task_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=te.org_id AND l.project_id=te.project_id AND tag.id=ANY($9)))\n ), contexts AS (\n SELECT group_id,name,user_id,project_id,SUM(rounded_minutes)::bigint rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint billable_minutes\n FROM scoped GROUP BY group_id,name,user_id,project_id\n ), fragments AS (\n SELECT group_id,name,user_id,project_id,\n SUM(rounded_minutes) OVER (PARTITION BY group_id)::bigint rounded_minutes,\n SUM(billable_minutes) OVER (PARTITION BY group_id)::bigint billable_minutes,\n ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY user_id DESC,project_id DESC)=1 last_context\n FROM contexts\n )\n SELECT a.policy,a.active,a.catalog_version,a.grants,a.is_administrator,\n a.permission_source,a.built_in_profile,a.template_id,a.applied_template_revision,a.revision,\n f.group_id,f.name,f.user_id,f.project_id,f.rounded_minutes,f.billable_minutes,f.last_context,\n 256::bigint + a.authority_bytes + COALESCE(octet_length(f.name),0)::bigint export_bytes\n FROM authority a LEFT JOIN fragments f ON true\n ORDER BY f.name COLLATE \"C\",f.group_id,f.user_id,f.project_id\n" rows_affected=0 rows_returned=0 elapsed=1.608012977s elapsed_secs=1.608012977 slow_threshold=1s2382026-10-12T21:24:51.485632Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="SELECT policy,active,catalog_version,grants,is_administrator, permission_source,built_in_profile,template_id,applied_template_revision,revision, group_id,name,user_id,project_id,rounded_minutes,billable_minutes,last_context …" db.statement="\n\nSELECT policy,active,catalog_version,grants,is_administrator,\n permission_source,built_in_profile,template_id,applied_template_revision,revision,\n group_id,name,user_id,project_id,rounded_minutes,billable_minutes,last_context\n FROM fetch_csv_export_rows($1) AS source(policy integer,active boolean,\n catalog_version integer,grants text[],is_administrator boolean,permission_source text,\n built_in_profile text,template_id uuid,applied_template_revision bigint,revision bigint,\n group_id uuid,name text,user_id uuid,project_id uuid,rounded_minutes bigint,\n billable_minutes bigint,last_context boolean,export_bytes bigint)\n" rows_affected=1 rows_returned=1 elapsed=1.076536972s elapsed_secs=1.076536972 slow_threshold=1s2392026-10-12T21:24:59.270381Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="DECLARE horae_csv NO SCROLL …" db.statement="\n\nDECLARE horae_csv NO SCROLL CURSOR FOR\n WITH authority AS MATERIALIZED (\n SELECT o.permission_policy_version policy,u.active,\n s.catalog_version,s.grants,s.is_administrator,s.source permission_source,\n s.built_in_profile,s.template_id,s.applied_template_revision,s.revision,\n COALESCE(octet_length(s.source),0)::bigint + COALESCE(octet_length(s.built_in_profile),0)::bigint\n + COALESCE((SELECT SUM(octet_length(g)::bigint) FROM unnest(s.grants) g),0)::bigint authority_bytes\n FROM (VALUES ($1::uuid,$2::uuid)) identity(org_id,user_id)\n LEFT JOIN organizations o ON o.id=identity.org_id\n LEFT JOIN users u ON u.id=identity.user_id AND u.org_id=identity.org_id\n LEFT JOIN person_permission_states s ON s.org_id=o.id AND s.user_id=u.id\n ), scoped AS (\n SELECT CASE $10::text WHEN 'client' THEN c.id WHEN 'project' THEN p.id\n WHEN 'task' THEN t.id WHEN 'person' THEN u.id END group_id,\n CASE $10::text WHEN 'client' THEN c.name WHEN 'project' THEN p.name\n WHEN 'task' THEN t.name WHEN 'person' THEN u.name END name,\n te.user_id,te.project_id,\n effective_minutes(te.minutes,te.rounded_minutes,o.round_minutes,o.round_dir) rounded_minutes,\n (te.billable AND (te.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) billable\n FROM authority a CROSS JOIN time_entries te JOIN organizations o ON o.id=te.org_id\n JOIN projects p ON p.id=te.project_id AND p.org_id=te.org_id\n JOIN tasks t ON t.id=te.task_id AND t.org_id=te.org_id\n JOIN users u ON u.id=te.user_id AND u.org_id=te.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=te.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE te.org_id=$1 AND a.active AND a.policy=1 AND (\n 'time_read_all'=ANY(a.grants) OR ('time_read_own'=ANY(a.grants) AND te.user_id=$2)\n OR ('time_read_managed'=ANY(a.grants) AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.managed_user_id=te.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.project_id=te.project_id))))\n AND te.spent_date BETWEEN $3 AND $4\n AND (NOT $11::bool OR p.active)\n AND ($12::bool IS NULL OR $12 = (te.billable AND (te.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($5::uuid[])=0 OR p.client_id=ANY($5))\n AND (cardinality($6::uuid[])=0 OR te.project_id=ANY($6))\n AND (cardinality($7::uuid[])=0 OR te.user_id=ANY($7))\n AND (cardinality($8::uuid[])=0 OR te.task_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=te.org_id AND l.project_id=te.project_id AND tag.id=ANY($9)))\n ), contexts AS (\n SELECT group_id,name,user_id,project_id,SUM(rounded_minutes)::bigint rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint billable_minutes\n FROM scoped GROUP BY group_id,name,user_id,project_id\n ), fragments AS (\n SELECT group_id,name,user_id,project_id,\n SUM(rounded_minutes) OVER (PARTITION BY group_id)::bigint rounded_minutes,\n SUM(billable_minutes) OVER (PARTITION BY group_id)::bigint billable_minutes,\n ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY user_id DESC,project_id DESC)=1 last_context\n FROM contexts\n )\n SELECT a.policy,a.active,a.catalog_version,a.grants,a.is_administrator,\n a.permission_source,a.built_in_profile,a.template_id,a.applied_template_revision,a.revision,\n f.group_id,f.name,f.user_id,f.project_id,f.rounded_minutes,f.billable_minutes,f.last_context,\n 256::bigint + a.authority_bytes + COALESCE(octet_length(f.name),0)::bigint export_bytes\n FROM authority a LEFT JOIN fragments f ON true\n ORDER BY f.name COLLATE \"C\",f.group_id,f.user_id,f.project_id\n" rows_affected=0 rows_returned=0 elapsed=1.709460094s elapsed_secs=1.709460094 slow_threshold=1s2402026-10-12T21:25:01.957646Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="DECLARE horae_csv NO SCROLL …" db.statement="\n\nDECLARE horae_csv NO SCROLL CURSOR FOR\n WITH authority AS MATERIALIZED (\n SELECT o.permission_policy_version policy,u.active,\n s.catalog_version,s.grants,s.is_administrator,s.source permission_source,\n s.built_in_profile,s.template_id,s.applied_template_revision,s.revision,\n COALESCE(octet_length(s.source),0)::bigint + COALESCE(octet_length(s.built_in_profile),0)::bigint\n + COALESCE((SELECT SUM(octet_length(g)::bigint) FROM unnest(s.grants) g),0)::bigint authority_bytes\n FROM (VALUES ($1::uuid,$2::uuid)) identity(org_id,user_id)\n LEFT JOIN organizations o ON o.id=identity.org_id\n LEFT JOIN users u ON u.id=identity.user_id AND u.org_id=identity.org_id\n LEFT JOIN person_permission_states s ON s.org_id=o.id AND s.user_id=u.id\n ), scoped AS (\n SELECT CASE $10::text WHEN 'client' THEN c.id WHEN 'project' THEN p.id\n WHEN 'task' THEN t.id WHEN 'person' THEN u.id END group_id,\n CASE $10::text WHEN 'client' THEN c.name WHEN 'project' THEN p.name\n WHEN 'task' THEN t.name WHEN 'person' THEN u.name END name,\n te.user_id,te.project_id,\n effective_minutes(te.minutes,te.rounded_minutes,o.round_minutes,o.round_dir) rounded_minutes,\n (te.billable AND (te.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) billable\n FROM authority a CROSS JOIN time_entries te JOIN organizations o ON o.id=te.org_id\n JOIN projects p ON p.id=te.project_id AND p.org_id=te.org_id\n JOIN tasks t ON t.id=te.task_id AND t.org_id=te.org_id\n JOIN users u ON u.id=te.user_id AND u.org_id=te.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=te.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE te.org_id=$1 AND a.active AND a.policy=1 AND (\n 'time_read_all'=ANY(a.grants) OR ('time_read_own'=ANY(a.grants) AND te.user_id=$2)\n OR ('time_read_managed'=ANY(a.grants) AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.managed_user_id=te.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.project_id=te.project_id))))\n AND te.spent_date BETWEEN $3 AND $4\n AND (NOT $11::bool OR p.active)\n AND ($12::bool IS NULL OR $12 = (te.billable AND (te.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($5::uuid[])=0 OR p.client_id=ANY($5))\n AND (cardinality($6::uuid[])=0 OR te.project_id=ANY($6))\n AND (cardinality($7::uuid[])=0 OR te.user_id=ANY($7))\n AND (cardinality($8::uuid[])=0 OR te.task_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=te.org_id AND l.project_id=te.project_id AND tag.id=ANY($9)))\n ), contexts AS (\n SELECT group_id,name,user_id,project_id,SUM(rounded_minutes)::bigint rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint billable_minutes\n FROM scoped GROUP BY group_id,name,user_id,project_id\n ), fragments AS (\n SELECT group_id,name,user_id,project_id,\n SUM(rounded_minutes) OVER (PARTITION BY group_id)::bigint rounded_minutes,\n SUM(billable_minutes) OVER (PARTITION BY group_id)::bigint billable_minutes,\n ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY user_id DESC,project_id DESC)=1 last_context\n FROM contexts\n )\n SELECT a.policy,a.active,a.catalog_version,a.grants,a.is_administrator,\n a.permission_source,a.built_in_profile,a.template_id,a.applied_template_revision,a.revision,\n f.group_id,f.name,f.user_id,f.project_id,f.rounded_minutes,f.billable_minutes,f.last_context,\n 256::bigint + a.authority_bytes + COALESCE(octet_length(f.name),0)::bigint export_bytes\n FROM authority a LEFT JOIN fragments f ON true\n ORDER BY f.name COLLATE \"C\",f.group_id,f.user_id,f.project_id\n" rows_affected=0 rows_returned=0 elapsed=1.672647051s elapsed_secs=1.672647051 slow_threshold=1s2412026-10-12T21:25:04.627644Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="DECLARE horae_csv NO SCROLL …" db.statement="\n\nDECLARE horae_csv NO SCROLL CURSOR FOR\n WITH authority AS MATERIALIZED (\n SELECT o.permission_policy_version policy,u.active,\n s.catalog_version,s.grants,s.is_administrator,s.source permission_source,\n s.built_in_profile,s.template_id,s.applied_template_revision,s.revision,\n COALESCE(octet_length(s.source),0)::bigint + COALESCE(octet_length(s.built_in_profile),0)::bigint\n + COALESCE((SELECT SUM(octet_length(g)::bigint) FROM unnest(s.grants) g),0)::bigint authority_bytes\n FROM (VALUES ($1::uuid,$2::uuid)) identity(org_id,user_id)\n LEFT JOIN organizations o ON o.id=identity.org_id\n LEFT JOIN users u ON u.id=identity.user_id AND u.org_id=identity.org_id\n LEFT JOIN person_permission_states s ON s.org_id=o.id AND s.user_id=u.id\n ), scoped AS (\n SELECT CASE $10::text WHEN 'client' THEN c.id WHEN 'project' THEN p.id\n WHEN 'task' THEN t.id WHEN 'person' THEN u.id END group_id,\n CASE $10::text WHEN 'client' THEN c.name WHEN 'project' THEN p.name\n WHEN 'task' THEN t.name WHEN 'person' THEN u.name END name,\n te.user_id,te.project_id,\n effective_minutes(te.minutes,te.rounded_minutes,o.round_minutes,o.round_dir) rounded_minutes,\n (te.billable AND (te.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) billable\n FROM authority a CROSS JOIN time_entries te JOIN organizations o ON o.id=te.org_id\n JOIN projects p ON p.id=te.project_id AND p.org_id=te.org_id\n JOIN tasks t ON t.id=te.task_id AND t.org_id=te.org_id\n JOIN users u ON u.id=te.user_id AND u.org_id=te.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=te.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE te.org_id=$1 AND a.active AND a.policy=1 AND (\n 'time_read_all'=ANY(a.grants) OR ('time_read_own'=ANY(a.grants) AND te.user_id=$2)\n OR ('time_read_managed'=ANY(a.grants) AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.managed_user_id=te.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=te.org_id AND m.manager_id=$2 AND m.project_id=te.project_id))))\n AND te.spent_date BETWEEN $3 AND $4\n AND (NOT $11::bool OR p.active)\n AND ($12::bool IS NULL OR $12 = (te.billable AND (te.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($5::uuid[])=0 OR p.client_id=ANY($5))\n AND (cardinality($6::uuid[])=0 OR te.project_id=ANY($6))\n AND (cardinality($7::uuid[])=0 OR te.user_id=ANY($7))\n AND (cardinality($8::uuid[])=0 OR te.task_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=te.org_id AND l.project_id=te.project_id AND tag.id=ANY($9)))\n ), contexts AS (\n SELECT group_id,name,user_id,project_id,SUM(rounded_minutes)::bigint rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint billable_minutes\n FROM scoped GROUP BY group_id,name,user_id,project_id\n ), fragments AS (\n SELECT group_id,name,user_id,project_id,\n SUM(rounded_minutes) OVER (PARTITION BY group_id)::bigint rounded_minutes,\n SUM(billable_minutes) OVER (PARTITION BY group_id)::bigint billable_minutes,\n ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY user_id DESC,project_id DESC)=1 last_context\n FROM contexts\n )\n SELECT a.policy,a.active,a.catalog_version,a.grants,a.is_administrator,\n a.permission_source,a.built_in_profile,a.template_id,a.applied_template_revision,a.revision,\n f.group_id,f.name,f.user_id,f.project_id,f.rounded_minutes,f.billable_minutes,f.last_context,\n 256::bigint + a.authority_bytes + COALESCE(octet_length(f.name),0)::bigint export_bytes\n FROM authority a LEFT JOIN fragments f ON true\n ORDER BY f.name COLLATE \"C\",f.group_id,f.user_id,f.project_id\n" rows_affected=0 rows_returned=0 elapsed=1.05798917s elapsed_secs=1.05798917 slow_threshold=1s2422026-10-12T21:26:27.182384Z WARN sqlx::query: slow statement: execution time exceeded alert threshold summary="WITH scoped AS NOT …" db.statement="\n\nWITH scoped AS NOT MATERIALIZED (\n SELECT e.id, e.spent_date, p.name AS project_name,\n t.name AS task_name, u.name AS user_name, e.minutes,\n effective_minutes(e.minutes,e.rounded_minutes,o.round_minutes,o.round_dir) AS rounded_minutes,\n (e.billable AND (e.invoice_id IS NOT NULL OR (p.project_type <> 'non_billable'\n AND COALESCE(pt.billable,t.billable_default)))) AS billable, e.notes\n FROM time_entries e\n JOIN organizations o ON o.id=e.org_id\n JOIN users u ON u.id=e.user_id AND u.org_id=e.org_id\n JOIN projects p ON p.id=e.project_id AND p.org_id=e.org_id\n JOIN tasks t ON t.id=e.task_id AND t.org_id=e.org_id\n JOIN clients c ON c.id=p.client_id AND c.org_id=e.org_id\n LEFT JOIN project_tasks pt ON pt.project_id=p.id AND pt.task_id=t.id\n WHERE e.org_id=$1 AND (\n $5::bool OR ($3::bool AND e.user_id=$2) OR ($4::bool AND (\n EXISTS (SELECT 1 FROM person_management_assignments m\n WHERE m.org_id=e.org_id AND m.manager_id=$2 AND m.managed_user_id=e.user_id)\n OR EXISTS (SELECT 1 FROM project_management_assignments m\n WHERE m.org_id=e.org_id AND m.manager_id=$2 AND m.project_id=e.project_id))))\n AND e.spent_date BETWEEN $6 AND $7\n AND (NOT $17::bool OR p.active)\n AND ($18::bool IS NULL OR $18 = (e.billable AND (e.invoice_id IS NOT NULL\n OR (p.project_type <> 'non_billable' AND COALESCE(pt.billable,t.billable_default)))))\n AND (cardinality($8::uuid[])=0 OR p.client_id=ANY($8))\n AND (cardinality($9::uuid[])=0 OR e.project_id=ANY($9))\n AND (cardinality($10::uuid[])=0 OR e.user_id=ANY($10))\n AND (cardinality($11::uuid[])=0 OR e.task_id=ANY($11))\n AND (cardinality($12::uuid[])=0 OR EXISTS (\n SELECT 1 FROM project_tag_links l JOIN project_tags tag ON tag.id=l.tag_id AND tag.org_id=l.org_id\n WHERE l.org_id=e.org_id AND l.project_id=e.project_id AND tag.id=ANY($12)))\n ), stats AS (\n SELECT COUNT(*) AS entry_count,\n COALESCE(SUM(minutes),0)::bigint AS total_minutes,\n COALESCE(SUM(rounded_minutes),0)::bigint AS rounded_minutes,\n COALESCE(SUM(rounded_minutes) FILTER (WHERE billable),0)::bigint AS billable_minutes\n FROM scoped\n ), page AS (\n SELECT * FROM scoped\n WHERE ($13::date IS NULL OR (spent_date,project_name COLLATE \"C\",task_name COLLATE \"C\",id)\n > ($13,$14::text COLLATE \"C\",$15::text COLLATE \"C\",$16::uuid))\n ORDER BY spent_date,project_name COLLATE \"C\",task_name COLLATE \"C\",id LIMIT 501\n )\n SELECT s.entry_count AS \"entry_count!\", s.total_minutes AS \"total_minutes!\",\n s.rounded_minutes AS \"total_rounded_minutes!\", s.billable_minutes AS \"billable_minutes!\",\n p.id AS \"id?\", p.spent_date AS \"spent_date?: chrono::NaiveDate\",\n p.project_name AS \"project_name?\", p.task_name AS \"task_name?\", p.user_name AS \"user_name?\",\n p.minutes AS \"minutes?\", p.rounded_minutes AS \"rounded_minutes?\", p.billable AS \"billable?\", p.notes\n FROM stats s LEFT JOIN page p ON true\n ORDER BY p.spent_date,p.project_name COLLATE \"C\",p.task_name COLLATE \"C\",p.id\n" rows_affected=501 rows_returned=501 elapsed=1.0162269s elapsed_secs=1.0162269 slow_threshold=1s2432026-10-12 21:20:44.491 UTC [18] LOG: starting PostgreSQL 17.10 on x86_64-pc-linux-gnu, compiled by clang version 21.1.8, 64-bit2442026-10-12 21:20:44.495 UTC [18] LOG: listening on Unix socket "/tmp/horae-browser.JaZlCI/.s.PGSQL.5432"2452026-10-12 21:20:44.556 UTC [21] LOG: database system was shut down at 2026-10-12 21:20:42 UTC2462026-10-12 21:20:44.608 UTC [18] LOG: database system is ready to accept connections2472026-10-12 21:20:55.988 UTC [77] LOG: could not send data to client: Broken pipe2482026-10-12 21:20:55.994 UTC [77] FATAL: connection to client lost2492026-10-12 21:25:44.671 UTC [19] LOG: checkpoint starting: time2502026-10-12 21:27:26.136 UTC [926] LOG: could not send data to client: Broken pipe2512026-10-12 21:27:26.137 UTC [926] FATAL: connection to client lost2522026-10-12 21:27:26.368 UTC [924] LOG: could not send data to client: Broken pipe2532026-10-12 21:27:26.368 UTC [924] FATAL: connection to client lost2542026-10-12 21:27:26.435 UTC [923] LOG: could not send data to client: Broken pipe2552026-10-12 21:27:26.436 UTC [923] FATAL: connection to client lost2562026-10-12 21:27:26.931 UTC [929] LOG: could not send data to client: Broken pipe2572026-10-12 21:27:26.931 UTC [929] FATAL: connection to client lost2582026-10-12 21:27:26.944 UTC [879] LOG: could not send data to client: Broken pipe2592026-10-12 21:27:26.944 UTC [879] FATAL: connection to client lost2602026-10-12 21:27:26.980 UTC [930] LOG: could not send data to client: Broken pipe2612026-10-12 21:27:26.980 UTC [930] FATAL: connection to client lost2622026-10-12 21:27:27.018 UTC [931] LOG: could not send data to client: Broken pipe2632026-10-12 21:27:27.019 UTC [931] FATAL: connection to client lost2642026-10-12 21:27:27.163 UTC [934] LOG: could not send data to client: Broken pipe2652026-10-12 21:27:27.163 UTC [934] FATAL: connection to client lost2662026-10-12 21:27:27.176 UTC [932] LOG: could not send data to client: Broken pipe2672026-10-12 21:27:27.176 UTC [932] FATAL: connection to client lost2682026-10-12 21:27:27.227 UTC [935] LOG: could not send data to client: Broken pipe2692026-10-12 21:27:27.227 UTC [935] FATAL: connection to client lost2702026-10-12 21:27:27.332 UTC [937] LOG: could not send data to client: Broken pipe2712026-10-12 21:27:27.332 UTC [937] FATAL: connection to client lost2722026-10-12 21:27:27.399 UTC [936] LOG: could not send data to client: Broken pipe2732026-10-12 21:27:27.399 UTC [936] FATAL: connection to client lost2742026-10-12 21:27:27.446 UTC [933] LOG: could not send data to client: Broken pipe2752026-10-12 21:27:27.446 UTC [933] FATAL: connection to client lost2762026-10-12 21:27:27.633 UTC [939] LOG: could not send data to client: Broken pipe2772026-10-12 21:27:27.633 UTC [939] FATAL: connection to client lost2782026-10-12 21:27:27.729 UTC [941] LOG: could not send data to client: Broken pipe2792026-10-12 21:27:27.729 UTC [941] FATAL: connection to client lost2802026-10-12 21:27:27.772 UTC [942] LOG: could not send data to client: Broken pipe2812026-10-12 21:27:27.772 UTC [942] FATAL: connection to client lost2822026-10-12 21:27:27.782 UTC [938] LOG: could not send data to client: Broken pipe2832026-10-12 21:27:27.783 UTC [938] FATAL: connection to client lost2842026-10-12 21:27:27.806 UTC [940] LOG: could not send data to client: Broken pipe2852026-10-12 21:27:27.806 UTC [940] FATAL: connection to client lost2862026-10-12 21:27:28.133 UTC [945] LOG: could not send data to client: Broken pipe2872026-10-12 21:27:28.133 UTC [945] FATAL: connection to client lost2882026-10-12 21:27:28.153 UTC [944] LOG: could not send data to client: Broken pipe2892026-10-12 21:27:28.153 UTC [944] FATAL: connection to client lost2902026-10-12 21:27:28.303 UTC [943] LOG: could not send data to client: Broken pipe2912026-10-12 21:27:28.303 UTC [943] FATAL: connection to client lost2922026-10-12 21:27:28.332 UTC [947] LOG: could not send data to client: Broken pipe2932026-10-12 21:27:28.332 UTC [947] FATAL: connection to client lost2942026-10-12 21:27:28.351 UTC [948] LOG: could not send data to client: Broken pipe2952026-10-12 21:27:28.351 UTC [948] FATAL: connection to client lost2962026-10-12 21:27:28.378 UTC [946] LOG: could not send data to client: Broken pipe2972026-10-12 21:27:28.378 UTC [946] FATAL: connection to client lost2982026-10-12 21:27:28.408 UTC [950] LOG: could not send data to client: Broken pipe2992026-10-12 21:27:28.408 UTC [950] FATAL: connection to client lost3002026-10-12 21:27:28.842 UTC [951] LOG: could not send data to client: Broken pipe3012026-10-12 21:27:28.842 UTC [951] FATAL: connection to client lost3022026-10-12 21:27:28.988 UTC [953] LOG: could not send data to client: Broken pipe3032026-10-12 21:27:28.992 UTC [953] FATAL: connection to client lost3042026-10-12 21:27:29.069 UTC [952] LOG: could not send data to client: Broken pipe3052026-10-12 21:27:29.069 UTC [952] FATAL: connection to client lost3062026-10-12 21:27:29.251 UTC [955] LOG: could not send data to client: Broken pipe3072026-10-12 21:27:29.251 UTC [955] FATAL: connection to client lost3082026-10-12 21:27:29.293 UTC [949] LOG: could not send data to client: Broken pipe3092026-10-12 21:27:29.293 UTC [949] FATAL: connection to client lost3102026-10-12 21:27:29.384 UTC [957] LOG: could not send data to client: Broken pipe3112026-10-12 21:27:29.384 UTC [957] FATAL: connection to client lost3122026-10-12 21:27:29.442 UTC [956] LOG: could not send data to client: Broken pipe3132026-10-12 21:27:29.442 UTC [956] FATAL: connection to client lost3142026-10-12 21:27:29.554 UTC [958] LOG: could not send data to client: Broken pipe3152026-10-12 21:27:29.554 UTC [958] FATAL: connection to client lost3162026-10-12 21:27:29.571 UTC [960] LOG: could not send data to client: Broken pipe3172026-10-12 21:27:29.575 UTC [960] FATAL: connection to client lost3182026-10-12 21:27:29.589 UTC [954] LOG: could not send data to client: Broken pipe3192026-10-12 21:27:29.589 UTC [954] FATAL: connection to client lost3202026-10-12 21:27:29.632 UTC [959] LOG: could not send data to client: Broken pipe3212026-10-12 21:27:29.632 UTC [959] FATAL: connection to client lost3222026-10-12 21:27:56.410 UTC [19] LOG: checkpoint complete: wrote 1246 buffers (7.6%); 0 WAL file(s) added, 0 removed, 0 recycled; write=131.664 s, sync=0.001 s, total=131.740 s; sync files=0, longest=0.000 s, average=0.000 s; distance=6800 kB, estimate=6800 kB; lsn=0/1BD9FC0, redo lsn=0/1B90B583232026-10-12 21:30:44.551 UTC [19] LOG: checkpoint starting: time3242026-10-12 21:30:50.822 UTC [19] LOG: checkpoint complete: wrote 65 buffers (0.4%); 1 WAL file(s) added, 0 removed, 0 recycled; write=6.249 s, sync=0.001 s, total=6.271 s; sync files=0, longest=0.000 s, average=0.000 s; distance=438 kB, estimate=6164 kB; lsn=0/1C02508, redo lsn=0/1BFE7203252026-10-12 21:35:44.923 UTC [19] LOG: checkpoint starting: time3262026-10-12 21:35:52.735 UTC [19] LOG: checkpoint complete: wrote 76 buffers (0.5%); 0 WAL file(s) added, 0 removed, 0 recycled; write=7.787 s, sync=0.001 s, total=7.812 s; sync files=0, longest=0.000 s, average=0.000 s; distance=307 kB, estimate=5578 kB; lsn=0/1C5A580, redo lsn=0/1C4B3203272026-10-12 21:40:42.782 UTC [18] LOG: received fast shutdown request3282026-10-12 21:40:42.793 UTC [18] LOG: aborting any active transactions3292026-10-12 21:40:42.849 UTC [18] LOG: background worker "logical replication launcher" (PID 24) exited with exit code 13302026-10-12 21:40:42.851 UTC [19] LOG: shutting down3312026-10-12 21:40:42.860 UTC [19] LOG: checkpoint starting: shutdown immediate3322026-10-12 21:40:42.959 UTC [19] LOG: checkpoint complete: wrote 29 buffers (0.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.079 s, sync=0.001 s, total=0.108 s; sync files=0, longest=0.000 s, average=0.000 s; distance=153 kB, estimate=5036 kB; lsn=0/1C71870, redo lsn=0/1C718703332026-10-12 21:40:43.270 UTC [18] LOG: database system is shut down