fix(activity): an ad-hoc run's row is one run's, a rollback keeps a run whole, Back reads one entry's filters

- The channel-backfill row says "running" from the runs this process has open, not from the table:
  a row whose outcome failed to write no longer reads as running until a restart. The run still
  going leads the row, so a newer run's outcome never sits under the older one's channel.
- Migration 0109's downgrade carries every run's trigger, spend and start in the audit row, and the
  upgrade restores them: a manual run whose admin was deleted stays manual.
- Back/Forward is read by the page's one popstate listener, both halves in one render; the server
  log adopts its half during that render, so no read goes out with one entry's filters and the
  other's range.
- The server log's failed facets use the other tabs' words (the menus may be short); the accounts
  message shows only when the menu really lacks them.
This commit is contained in:
2026-10-18 17:32:22 +02:00
parent fad656988a
commit 13b7577d9f
12 changed files with 188 additions and 72 deletions
@@ -18,7 +18,6 @@
"empty": "No lines match the filters.",
"stale": "Couldn't refresh — what you see may be out of date",
"olderFailed": "Couldn't load the older lines",
"countsFailed": "Couldn't load the filter counts",
"count_one": "{{count}} line loaded · newest first",
"count_other": "{{count}} lines loaded · newest first",
"older": "Load older",
@@ -18,7 +18,6 @@
"empty": "Nincs a szűrésnek megfelelő sor.",
"stale": "Nem sikerült frissíteni — amit látsz, elavult lehet",
"olderFailed": "Nem sikerült betölteni a régebbi sorokat",
"countsFailed": "Nem sikerült betölteni a szűrők számait",
"count_one": "{{count}} sor betöltve · a legújabb felül",
"count_other": "{{count}} sor betöltve · a legújabb felül",
"older": "Régebbiek betöltése",
@@ -16,12 +16,7 @@ import { describe, expect, it } from "vitest";
// keys — so it covers nothing; a key it reads that nothing else names is listed below. Plural forms
// count through their base key. A key read in a way this cannot see goes in ALLOWED with the reason,
// rather than the check being loosened for everyone.
const LOG_FAILURE = "AdminLogs reads `adminLogs.${failure}`, a word its query hook returns";
const ALLOWED: Record<string, string> = {
"adminLogs.olderFailed": LOG_FAILURE,
"adminLogs.stale": LOG_FAILURE,
"adminLogs.countsFailed": LOG_FAILURE,
};
const ALLOWED: Record<string, string> = {};
// Namespaces that are one backend enum each, and held key-for-value to it by backendIds.contract.
const BACKEND_ENUMS = ["auditActions.", "quotaActions."];