Repository navigation
feat: trigger on/off history, run plan page, job page layout and run log rework - #1390
Merged
Merged
Conversation
A new person read lists a trigger's operator changes, newest first, from the security audit: what changed, who changed it (by name for a person), when, and the reason with credential-shaped text redacted. It needs view on every current node of the target, like the trigger listing, and an unknown trigger is refused the same way. The trigger page shows it in its On/off history section.
…ext only for slow first loads Each read's last answer is kept in memory for the page load, keyed by person, location, page and read, and shown at once while the page reloads. A first load faster than 400 ms shows no loading text.
A node's finished queries fold under its outcome row and open on demand. A failed query keeps its own row. Run-level bookkeeping queries and query progress stay in the Statements tab. Printed output is hidden behind a switch, except a failing run's last printed block, which holds its failures.
A 403 or 404 on reload now clears the read's remembered answer and the data on screen, so someone whose access was removed sees the refusal instead of the earlier answer. Network errors keep the data.
The root loader starts each page's first reads before the switch and waits for them, up to 1.5 s, and the page takes those reads over instead of sending them again. Links already preload on hover, so most switches land with the data in place. A slow switch shows a thin bar along the top.
Schedules, the latest run and critical nodes move to chips in the header, and runs and code to their own tabs, so the graph fills the page. Clicking a node selects it and shows it in the side panel; Shift, Ctrl or Cmd adds to the selection, and the selected nodes can be run on their own.
Hover still preloads code. Reading data on hover recorded SQL and denial audit rows for pages the person never opened.
Every Run entry point (lineage, catalog, node, job selection, runs, checks and the overview) now opens /plan with the command. The page shows the dry-run check: the selected nodes as a graph, grouped by state, with permissions and options. Nothing starts until Run is pressed there.
The trigger history, tick and run-node reads each began a writer transaction, authorized the whole-target listing, checked that the row belongs to the target and committed early when it did not. row_in_target now owns that sequence and returns the open transaction only for a known row, so each read keeps just its own query.
kvlonge
enabled auto-merge (squash)
November 9, 2026 11:04
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Audited UI work plus one person read, in one Verify run.
Changes
Additive read
listPersonTriggerChanges(client regenerated), UI feedback work; single-row person reads sharerow_in_target.Verification
make check-ci(with client check), orchestration tests (SQLite, PostgreSQL), vitest, svelte-check, vite build. Audited; hygiene clean. DuckShop: not involved.BEGIN_COMMIT_OVERRIDE
feat(triggers): people who can view a whole target can read a trigger's on/off history: each pause, switch-on, reset and cursor change, with who made it, when and why. Credentials in the reason are redacted
feat(ui): the trigger page's On/off history shows those changes
fix(ui): the trigger page shows the reason box only to people who can pause or switch on the trigger
fix(ui): pages you return to show their last data at once and refresh it behind the scenes; "Loading…" appears only when a first load is slow
fix(ui): a refused reload clears the remembered data, so someone whose access was removed sees the refusal, not old data
feat(ui): the run log shows one row per node, with that node's queries folded under it; run-level queries stay in the Statements tab
feat(ui): printed output in the run log sits behind a "Show printed output" switch; a failing run's last printed block, which holds its errors, is always shown
feat(ui): a click stays on the current page until the next page's data is ready, then switches; a slow switch shows a thin bar along the top
feat(ui): the job page puts its schedules, latest run and critical nodes in the header, with Overview, Runs and Code tabs, so the graph fills the page
feat(ui): clicking nodes in a job's graph selects them (Shift, Ctrl or Cmd adds more), and the selected nodes can be run on their own
feat(ui): every Run button opens a plan page that shows what the command selects and why each node would run; nothing starts until you press Run there
chore(ui): drop explanatory captions that repeated the docs
END_COMMIT_OVERRIDE