2026.10.48 — 2026-10-14
Breaking
Performance hardening — UUIDv7 keys, partitioned history, bounded jobs, connections and streams, external PostgreSQL, load test (#236) (73e3b437)
docs(openspec): design and tasks for 19-performance-hardening
docs(openspec): external PostgreSQL support in 19-performance-hardening
perf(ui): scan a table's rows for column widths once per page of data
Sizing a table's columns read every row of the page for its longest values on each change of columns. The longest values are now kept per page of data and per column, so a change of density or of shown columns no longer costs more as the list grows.
- feat(ui): find in large tables
The browser's find cannot see the rows a large table has not drawn. Ctrl+F (Cmd+F on a Mac) in a table now opens its own find, which searches every row, says how many matches there are, and moves between them with Enter and Shift+Enter, scrolling to and marking the row. Escape closes it and returns focus to the matched row.
- perf(ui): list a user's sessions in the table
An account's sessions are not limited and were drawn as a plain list, so a very long list drew every row. They are now a table that draws only the rows in view.
- perf(db): bound database connections in count and time
The connection pool now has 16 connections per replica (ARTEMIS_STUDIO_DB_POOL_SIZE) and a request that waits more than 5 s for one fails instead of queueing. Every connection starts with a 30 s statement timeout, a 5 s lock timeout and a 60 s idle-in-transaction timeout, and the driver sets a 5 s connect timeout, a 15 min socket timeout and TCP keep-alive, so a stuck query or a partitioned network no longer holds a thread without end. The limits are set per connection, not on the server, so they hold on any PostgreSQL and through a session-mode pooler. Plugin pools take the same limits. The plugin connection budget counts Studio's 16 connections instead of 10.
The unused spring.task.scheduling setting is removed.
- perf(db): raise the statement timeout for long work inside its own transaction
The audit export, the lifecycle preview and the partition maintenance of the metric and message index tables run with a statement timeout of up to ten minutes (SET LOCAL), in a transaction of their own, so the 30 s limit on every other connection stays. The message index purge now detaches and drops a partition in one transaction.
- perf(db)!: ship one PostgreSQL configuration for the bundled database
The production, HA and development compose files mount deploy/postgres/postgresql.conf read-only instead of each carrying its own list of server flags. It adds statement statistics (pg_stat_statements with compute_query_id, created on first start), lock-wait logging, an explicit io_method=worker, autovacuum logging, max_connections=150 and a five-minute idle-in-transaction backstop to the earlier tuning. deploy/postgres/postgresql.tuning.conf is removed.
Changed
Performance hardening — UUIDv7 keys, partitioned history, bounded jobs, connections and streams, external PostgreSQL, load test (#236) (73e3b437)
docs(openspec): design and tasks for 19-performance-hardening
docs(openspec): external PostgreSQL support in 19-performance-hardening
perf(ui): scan a table's rows for column widths once per page of data
Sizing a table's columns read every row of the page for its longest values on each change of columns. The longest values are now kept per page of data and per column, so a change of density or of shown columns no longer costs more as the list grows.
- feat(ui): find in large tables
The browser's find cannot see the rows a large table has not drawn. Ctrl+F (Cmd+F on a Mac) in a table now opens its own find, which searches every row, says how many matches there are, and moves between them with Enter and Shift+Enter, scrolling to and marking the row. Escape closes it and returns focus to the matched row.
- perf(ui): list a user's sessions in the table
An account's sessions are not limited and were drawn as a plain list, so a very long list drew every row. They are now a table that draws only the rows in view.
- perf(db): bound database connections in count and time
The connection pool now has 16 connections per replica (ARTEMIS_STUDIO_DB_POOL_SIZE) and a request that waits more than 5 s for one fails instead of queueing. Every connection starts with a 30 s statement timeout, a 5 s lock timeout and a 60 s idle-in-transaction timeout, and the driver sets a 5 s connect timeout, a 15 min socket timeout and TCP keep-alive, so a stuck query or a partitioned network no longer holds a thread without end. The limits are set per connection, not on the server, so they hold on any PostgreSQL and through a session-mode pooler. Plugin pools take the same limits. The plugin connection budget counts Studio's 16 connections instead of 10.
The unused spring.task.scheduling setting is removed.
- perf(db): raise the statement timeout for long work inside its own transaction
The audit export, the lifecycle preview and the partition maintenance of the metric and message index tables run with a statement timeout of up to ten minutes (SET LOCAL), in a transaction of their own, so the 30 s limit on every other connection stays. The message index purge now detaches and drops a partition in one transaction.
- perf(db)!: ship one PostgreSQL configuration for the bundled database
The production, HA and development compose files mount deploy/postgres/postgresql.conf read-only instead of each carrying its own list of server flags. It adds statement statistics (pg_stat_statements with compute_query_id, created on first start), lock-wait logging, an explicit io_method=worker, autovacuum logging, max_connections=150 and a five-minute idle-in-transaction backstop to the earlier tuning. deploy/postgres/postgresql.tuning.conf is removed.