Repository navigation
Makes the dashboard usable on executions tables with millions of rows. See
changelog/2026-10-08-dashboard-on-large-executions-tables.md for measurements.
Upgrading: run rails generate ruby_llm_agents:upgrade and migrate to add
the idx_executions_analytics covering index (built concurrently on PostgreSQL)
and the [parent_execution_id, created_at] index behind the executions list.
Fixed
- Executions and agents lists timed out on large tables — both aggregated the whole executions table on every view (the agents list once per agent). The executions list now renders from an index walk with best-effort, cached totals, and the agents list computes every agent's stats with one grouped query
- Dashboard and analytics scanned the selected range once per section — every section is now derived from a single grouped scan (
Execution.breakdown), cached per range and filters - Requests list aggregated every tracked execution to show the latest 25 — the page is now found in a recent window and only its requests are aggregated
- Tenants list grouped the whole executions table by tenant — cost and last run now come from the counter columns on the tenant row
- Executions list loaded every prompt and response payload on the page just to render the error message on error rows, which could pull megabytes per view. List views now preload only
error_message(Execution#error_detail) - Cost and token totals on the executions list were inflated once per child execution, by a join without
DISTINCT. They now cover exactly the root executions the list shows - Requests list raised on PostgreSQL (
GROUP_CONCATdoes not exist there) - Request detail page raised on PostgreSQL (
DISTINCTwithORDER BY); it now loads the request's executions once - A finishing execution could overwrite a concurrent status change — completion wrote through the record loaded when the pipeline started, so a timeout sweep or cancellation recorded meanwhile was silently replaced. The row is now locked and re-read, and the completion is dropped if it already left
running(#36, thanks @symphony-stream) - Tracker
request_idand tags were lost when an execution completed — the completion rebuiltmetadatawithout them (#37, thanks @symphony-stream) rate_limited,retryable_errorsandwith_parameterscopes raised on PostgreSQL —jsonboperators were applied tojsoncolumns
Added
config.dashboard_query_timeout(default 5 seconds, PostgreSQL only) — a dashboard query that runs longer is cancelled by the database and the page explains what to narrow, instead of the request timing out with the query still runningidx_executions_analyticscovering index so range aggregates are answered from the index alone[parent_execution_id, created_at]index behind the executions listExecution.breakdown,Execution.usage_summary,Execution.distinct_values,Execution.with_statement_timeout,Execution.best_effort
Changed
- Some all-time figures are now windowed and labelled in the UI: agents list stats and agent page headline stats cover the last 30 days; tenant page totals and usage tables cover the current month; tenants list cost is month to date
- Executions list shows prev/next instead of page numbers when the total cannot be counted within a second; pick a time range to get totals back
- Dashboard figures are cached for 30 seconds ("today") to 5 minutes (wider ranges)
- Filter dropdowns list agent types and models across all tenants