Repository navigation
feat(web_ui): deep link eval result modals and widen the Result column - #2000
Conversation
…e table Opening "View Full Trace" on the eval run results page now writes #trace-<eval run id> into the URL with SvelteKit's replaceState, and closing the modal removes it, so a refresh or a shared link reopens the same trace. No history entries are added, so Back still leaves the page. When the page loads with a trace hash, it waits for the results, opens the linked trace, and then opens the "Are you sure you want to peek?" warning, so the warning stacks on top of the trace. Without a hash the warning still opens on mount as before. A hash naming a row that is not in the results opens only the warning. The Result column header for single-renderer judges now takes 40% of the table width, so a long interaction no longer squeezes it to a word per line. Adds trace_link.ts (hash build/parse) with unit tests, and page tests for writing, clearing, and loading the hash and for the dialog order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HdZSuxJDKdgfzLkswZM3RD
|
Caution Review failedThe pull request is closed. WalkthroughThe run-results page now supports hash-linked trace and judge-reasoning dialogs. It opens links for matching results, updates hashes when dialogs open or close, and coordinates linked dialogs with the peek warning. A shared utility selects judge reasoning from intermediate outputs. ChangesRun-result dialogs
Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Feature Sequence Diagram(s)sequenceDiagram
participant URLHash
participant RunResultsPage
participant Results
participant TraceDialog
participant JudgeReasoningDialog
URLHash->>RunResultsPage: Provide dialog type and evaluation run ID
RunResultsPage->>Results: Find the linked evaluation run
Results->>RunResultsPage: Return the matching run data
RunResultsPage->>TraceDialog: Open when trace data is available
RunResultsPage->>JudgeReasoningDialog: Open when reasoning is available
Possibly related PRs
Suggested reviewers: Merge Risk:
|
📊 Coverage ReportOverall Coverage: 94% Diff: origin/main...HEADNo lines with coverage information in this diff.
|
…own dialog LlmJudgeResult gains an optional on_view_reasoning callback so a host can show the judge's reasoning in its own dialog and deep link it. With no callback, the component keeps its own Judge Reasoning dialog as before. The only call site is the run_result page, through the eval-type registry's resultRendererComponent. The reasoning lookup (the reasoning key, falling back to chain_of_thought) moves to lib/utils/eval_types/judge_reasoning.ts so the component and its host read it the same way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HdZSuxJDKdgfzLkswZM3RD
…easoning Addresses review feedback on the eval run result page: the trace link in the URL hash was read only on first load. A hash-only navigation (a pasted link, an in-app link, Back or Forward) does not remount the page, so the linked trace never opened. - The page now listens for the browser's hashchange event, which fires for those navigations and never for the page's own replaceState calls. A link to another row switches the open dialog. A link to a missing row, or to no row dialog, closes it. - A link followed while the peek warning is still up waits until the warning closes, so a dialog never opens on top of it. If the link leaves the URL before the results load, the warning still shows. - The "View reasoning" modal gets the same treatment: opening it writes #reasoning-<eval run id>, closing clears it, and loading from that hash opens the reasoning with the peek warning on top. The page owns one shared Judge Reasoning dialog through LlmJudgeResult's on_view_reasoning callback. - trace_link.ts becomes dialog_link.ts, which parses both #trace- and #reasoning- links. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HdZSuxJDKdgfzLkswZM3RD
Description
Add a hash-link to trace modal in eval results
Author Review (required)
Architecture Review (select 1)
NAReview Requested from Code Reviewer (select 1)
UI only changeAgentic Code Review (must check all before requesting CR)
/spec deep cron this PR or used/specCRs throughoutWhat to Review
None, UI only.
UI Review (select all that apply)
SteveAgentic PR Summary
TLDR: A refresh closes the "View Full Trace" and "View reasoning" modals on the eval results page, and a user cannot send a link to them. This PR keeps the open modal in the URL hash, and gives the Result column a fair share of the table width. Targets
main.Before this PR, the trace modal and the reasoning modal on the
run_resultpage did not change the URL. A refresh closed the modal, and a link opened only the page. A long interaction also took almost the full row, so the Result column was about 150px wide and the eval name wrapped one word per line. After this PR, an open trace writes#trace-<eval run id>into the URL, and open reasoning writes#reasoning-<eval run id>. A refresh, a link, or a hash change on the same page opens the same modal. On load, the "Are you sure you want to peek?" warning shows on top of it. The Result column now has 40% of the table width.Implementation
#trace-<eval run id>, and opening "View reasoning" writes#reasoning-<eval run id>. Both use the SvelteKitreplaceState, and closing the modal clears the hash.replaceStateadds no history entry, so Back still leaves the page.hashchangeevent. The event fires for a pasted link, an in-app link, Back, and Forward, and never for the page's ownreplaceStatecalls. A link to another row switches the open modal. A link to a missing row closes it. A link that arrives while the peek warning is open waits until the warning closes.LlmJudgeResult(lib/components/eval_types/llm_judge_result.svelte) gets an optionalon_view_reasoningcallback. With the callback, the host page shows the reasoning in its own dialog. Without it, the component keeps its own dialog, as before. The only call site is therun_resultpage, through the eval-type registry. This change is in its own commit, 645629c.reasoning, thenchain_of_thought) moves tolib/utils/eval_types/judge_reasoning.ts, so the component and the page read it the same way.dialog_link.tsbuilds and parses the#trace-and#reasoning-hashes, with unit tests indialog_link.test.ts.w-2/5when the judge shows one Result column. The older layout with the Input & Output, Thinking, and score columns does not change.run_result.test.tscovers the hash write and clear, a load from each link type, the dialog order, same-page hash changes, and the peek warning wait. The test file now runs the SvelteonMountafter mount, becauseonMountdoes not run under jsdom. The dialog test stub records the dialog that opened last.Before you merge
llm_judge_result.svelte. The repo UI gate reportsSHARED_CONTROL_TOUCHEDfor it, which is expected. Other callers keep the old behavior.#reasoning-link on a page for an older judge type (for example G-Eval) opens a "Judge Reasoning" dialog, but those pages have no "View reasoning" button. No normal flow makes such a link.window.history.back(). In a new tab with no history, the button only closes the warning, and the modal stays open. This behavior existed before this PR, but links make it more frequent.Checks:
uv run ./checks.sh --agent-modegreen before the last review fixes. After those fixes,npm run lint,npm run format_check,npm run check,npm run test_run, andnpm run buildare green. No Python file changed. The optionalmisspellcheck did not run, because the tool is not installed in the agent environment. Each round went through a/speccode review by a separate sub-agent. The second review found one moderate issue: the peek warning did not show if the link left the URL before the results loaded. The fix and a test for it are in d63df4f. An agent opened the page in a browser with Playwright and took screenshots. The seeded project has no conversation traces, so the script replaced the results response in the browser with an LLM judge and long conversations.Docs and skills updated: none needed, no doc or skill names the changed page, the shared component, or their files.
Example links
Generated by Claude Code


Confidence Score: 5/5
The PR appears safe to merge; the previous same-page link issue is addressed.Reviews (2) · Last reviewed commit: "feat(web_ui): follow same-page hash chan..." · Reviewed by Greptile