The TUI had good coverage of state transitions and graph-viewport arithmetic, but nothing ever rendered a frame, so layout selection, panel presence, and the text a user actually sees were unprotected.
Eleven tests drive the existing draw_dashboard(Frame, &TuiState) seam through Ratatui's TestBackend and assert on visible rows:
below the minimum width, and below the minimum height — only the resize notice, no status line;
the smallest usable terminal (MIN_WIDTH × MIN_HEIGHT) and a typical 80×24 compact terminal — header, packet counters, status line, and the absence of the large-only panels;
a large terminal — every panel present, status line on the last bordered row;
a large terminal with active sample data — session token, remote, last sequence, effective RTT, warning text, last-warning row;
a failed run — error status on the status line and the error message on screen;
multi-target — the target table replaces the packet panel, all labels visible, first-target panel titles;
the graph view in single- and multi-target mode — chart title and live marker, dashboard panels absent;
paused display with dropped events — both reported on the status line.
Assertions are selected text and layout facts (which row carries the status line, which panels are present at which size), not full-screen golden snapshots, so ordinary cosmetic edits will not churn them.
Behavior
No behavior change. The existing pure graph-viewport and state tests are untouched.
One observation worth recording, deliberately not changed here: at 140–180 columns the timing panel is a few columns narrower than its own row format, so every metric row wraps onto a second line and the last rows (send call, timer error) fall off the bottom of the panel. That is a panel-proportion tradeoff in production layout, not a bug this test PR should quietly change, so the tests assert on metrics that are visible today rather than pinning the wrap.
Scope
Explicitly not changed:
ui.rs was not split into render/state/layout modules.
No view-model or render-model abstraction was introduced.
No production rendering code, layout constant, or widget was modified.
Existing pure viewport/arithmetic tests were preserved as-is.
cargo check -p irtt-cli --no-default-features --features server --all-targets --locked
git diff --check
## Summary
**Test-only PR.** No production code changed.
- The TUI had good coverage of state transitions and graph-viewport arithmetic, but nothing ever rendered a frame, so layout selection, panel presence, and the text a user actually sees were unprotected.
- Eleven tests drive the existing `draw_dashboard(Frame, &TuiState)` seam through Ratatui's `TestBackend` and assert on visible rows:
- below the minimum width, and below the minimum height — only the resize notice, no status line;
- the smallest usable terminal (`MIN_WIDTH` × `MIN_HEIGHT`) and a typical 80×24 compact terminal — header, packet counters, status line, and the absence of the large-only panels;
- a large terminal — every panel present, status line on the last bordered row;
- a large terminal with active sample data — session token, remote, last sequence, effective RTT, warning text, last-warning row;
- a failed run — error status on the status line and the error message on screen;
- multi-target — the target table replaces the packet panel, all labels visible, first-target panel titles;
- the graph view in single- and multi-target mode — chart title and live marker, dashboard panels absent;
- paused display with dropped events — both reported on the status line.
- Assertions are selected text and layout facts (which row carries the status line, which panels are present at which size), not full-screen golden snapshots, so ordinary cosmetic edits will not churn them.
## Behavior
No behavior change. The existing pure graph-viewport and state tests are untouched.
One observation worth recording, deliberately **not** changed here: at 140–180 columns the `timing` panel is a few columns narrower than its own row format, so every metric row wraps onto a second line and the last rows (`send call`, `timer error`) fall off the bottom of the panel. That is a panel-proportion tradeoff in production layout, not a bug this test PR should quietly change, so the tests assert on metrics that are visible today rather than pinning the wrap.
## Scope
Explicitly not changed:
- `ui.rs` was not split into render/state/layout modules.
- No view-model or render-model abstraction was introduced.
- No production rendering code, layout constant, or widget was modified.
- Existing pure viewport/arithmetic tests were preserved as-is.
## Verification
Run from the task worktree, all successful:
- `cargo fmt --all -- --check`
- `cargo check --workspace --all-targets --all-features --locked`
- `cargo test --workspace --all-targets --all-features --locked`
- `cargo clippy --workspace --all-targets --all-features --locked -- -D warnings`
- `RUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps --locked`
- `cargo check -p irtt-cli --no-default-features --features client --all-targets --locked`
- `cargo check -p irtt-cli --no-default-features --features tui --all-targets --locked`
- `cargo check -p irtt-cli --no-default-features --features server --all-targets --locked`
- `git diff --check`
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
### 💡 Codex Review
Here are some automated review suggestions for this pull request.
**Reviewed commit:** `17d3fed7c5`
<details> <summary>ℹ️ About Codex in GitHub</summary>
<br/>
[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
</details>
If the sample panel regresses to rendering last warning: - while the recent-events panel still contains wrong token, both of these whole-frame substring assertions continue to pass, so the claimed last-warning-row coverage does not protect that user-visible behavior. Inspect the sample-panel row (or assert the combined last warning: ...wrong token text) instead.
**<sub><sub></sub></sub> Assert the warning value on its sample row**
If the sample panel regresses to rendering `last warning: -` while the recent-events panel still contains `wrong token`, both of these whole-frame substring assertions continue to pass, so the claimed last-warning-row coverage does not protect that user-visible behavior. Inspect the sample-panel row (or assert the combined `last warning: ...wrong token` text) instead.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/17d3fed7c5dc99020c622a8aadfde85063667491/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Good catch — the assertion now locates the last warning: row and requires that row to contain the warning, so a regression to the placeholder fails even while the recent-events panel still shows it.
Good catch — the assertion now locates the `last warning:` row and requires that row to contain the warning, so a regression to the placeholder fails even while the recent-events panel still shows it.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
### 💡 Codex Review
Here are some automated review suggestions for this pull request.
**Reviewed commit:** `2062535c20`
<details> <summary>ℹ️ About Codex in GitHub</summary>
<br/>
[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
</details>
If the alpha or beta row disappears from the target table, these whole-frame assertions still pass: alpha is also rendered as the first target in the header, while the injected beta reply puts that label in the recent-events panel and graph legend; the remaining gamma row is enough to prove only that some table content survived. Restrict these checks to the rows occupied by the target panel, or assert each label together with its table-row fields, so the claimed table coverage protects every visible target row.
**<sub><sub></sub></sub> Scope target labels to the target table**
If the `alpha` or `beta` row disappears from the target table, these whole-frame assertions still pass: `alpha` is also rendered as the first target in the header, while the injected `beta` reply puts that label in the recent-events panel and graph legend; the remaining `gamma` row is enough to prove only that some table content survived. Restrict these checks to the rows occupied by the target panel, or assert each label together with its table-row fields, so the claimed table coverage protects every visible target row.
AGENTS.md reference: [AGENTS.md:L89-L89](https://github.com/Lochnair/irtt-rs/blob/2062535c20459a097a098d664a8f75e17c9cfcff/AGENTS.md#L89-L89)
Useful? React with 👍 / 👎.
If the sample panel regresses to rendering a missing or incorrect effective RTT, this test still passes because the recent-events panel independently contains reply seq=11 effective=2.5ms, while the separate sequence assertion only proves that another sample row rendered. Find the row containing raw / adjusted / effective: and assert 2.5ms on that row so the intended sample-panel value is actually protected.
**<sub><sub></sub></sub> Assert the RTT value on the sample metric row**
If the sample panel regresses to rendering a missing or incorrect effective RTT, this test still passes because the recent-events panel independently contains `reply seq=11 effective=2.5ms`, while the separate sequence assertion only proves that another sample row rendered. Find the row containing `raw / adjusted / effective:` and assert `2.5ms` on that row so the intended sample-panel value is actually protected.
AGENTS.md reference: [AGENTS.md:L89-L89](https://github.com/Lochnair/irtt-rs/blob/2062535c20459a097a098d664a8f75e17c9cfcff/AGENTS.md#L89-L89)
Useful? React with 👍 / 👎.
Check the timing panel title instead of metric spacing
If a compact-layout regression renders a condensed or otherwise reformatted timing panel, this negative assertion can still pass because it searches for one incidental sequence of spaces from the current large timing-row formatter rather than for the panel itself. Check for the unique timing panel title, or inspect the compact layout's panel regions, so the test protects the stated absence of that panel independently of metric formatting.
**<sub><sub></sub></sub> Check the timing panel title instead of metric spacing**
If a compact-layout regression renders a condensed or otherwise reformatted timing panel, this negative assertion can still pass because it searches for one incidental sequence of spaces from the current large timing-row formatter rather than for the panel itself. Check for the unique `timing` panel title, or inspect the compact layout's panel regions, so the test protects the stated absence of that panel independently of metric formatting.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/2062535c20459a097a098d664a8f75e17c9cfcff/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Assert that dashboard panels are absent below minimum height
If the short-terminal path regresses to rendering the resize notice together with ordinary dashboard content while still omitting the status line, this test continues to pass because it only checks for the notice and the absence of q quit. The corresponding minimum-width test explicitly rejects the packet panel; add an equivalent negative dashboard-panel assertion here so the test actually protects its stated resize-notice-only behavior.
**<sub><sub></sub></sub> Assert that dashboard panels are absent below minimum height**
If the short-terminal path regresses to rendering the resize notice together with ordinary dashboard content while still omitting the status line, this test continues to pass because it only checks for the notice and the absence of `q quit`. The corresponding minimum-width test explicitly rejects the packet panel; add an equivalent negative dashboard-panel assertion here so the test actually protects its stated resize-notice-only behavior.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/2062535c20459a097a098d664a8f75e17c9cfcff/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Agreed — labels are now matched against the target table's own columns (rows sliced at the panel separator), each with its status column, plus the replying target's last sample; verified it fails when a table row is dropped.
Agreed — labels are now matched against the target table's own columns (rows sliced at the panel separator), each with its status column, plus the replying target's last sample; verified it fails when a table row is dropped.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed — the minimum-height case now rejects dashboard content (`packets`) as the minimum-width case does.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed, and stronger than suggested: asserting 2.5ms on that row still passed with the effective field dropped, because the fixture's adjusted and effective RTT coincide — so the whole row is now asserted, verified against that exact regression.
Agreed, and stronger than suggested: asserting `2.5ms` on that row still passed with the effective field dropped, because the fixture's adjusted and effective RTT coincide — so the whole row is now asserted, verified against that exact regression.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed — replaced the spacing-dependent check with the `timing` panel title, confirmed absent from the compact frame.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
### 💡 Codex Review
Here are some automated review suggestions for this pull request.
**Reviewed commit:** `c12617a669`
<details> <summary>ℹ️ About Codex in GitHub</summary>
<br/>
[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
</details>
The SessionStarted fixture also appends session started token=0xabcd to the recent-events panel, so this whole-frame assertion still passes if the session header regresses to displaying session: -. Locate the header’s session row and assert the token there so this test actually protects the user-visible session identity it claims to cover.
**<sub><sub></sub></sub> Scope the session token assertion to the header**
The `SessionStarted` fixture also appends `session started token=0xabcd` to the recent-events panel, so this whole-frame assertion still passes if the session header regresses to displaying `session: -`. Locate the header’s session row and assert the token there so this test actually protects the user-visible session identity it claims to cover.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/c12617a669d8bf8126ffd977a27fda86d125ca57/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Reject every dashboard panel in the graph-view test
These negative checks only exclude the recent-events and sample panels; a regression that also renders the packet or timing panel alongside the graph would still pass, despite the test claiming the graph replaces the dashboard panels. Assert the absence of those uniquely titled panels as well so the view-selection behavior is fully protected.
**<sub><sub></sub></sub> Reject every dashboard panel in the graph-view test**
These negative checks only exclude the recent-events and sample panels; a regression that also renders the packet or timing panel alongside the graph would still pass, despite the test claiming the graph replaces the dashboard panels. Assert the absence of those uniquely titled panels as well so the view-selection behavior is fully protected.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/c12617a669d8bf8126ffd977a27fda86d125ca57/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Scope graph-view target labels to the target table
Unlike the corrected dashboard case, this separate graph-view test still searches the entire frame for beta; because the reply creates a chart series named beta, the assertion passes even if the target table drops that row. Inspect the target-table rows here as well so every target shown in the graph view is actually protected.
**<sub><sub></sub></sub> Scope graph-view target labels to the target table**
Unlike the corrected dashboard case, this separate graph-view test still searches the entire frame for `beta`; because the reply creates a chart series named `beta`, the assertion passes even if the target table drops that row. Inspect the target-table rows here as well so every target shown in the graph view is actually protected.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/c12617a669d8bf8126ffd977a27fda86d125ca57/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Scope the warning assertion to the recent-events panel
The sample panel’s last warning: WrongToken: wrong token row also contains both warning and wrong token, so this predicate passes even if the warning disappears from recent events entirely. Restrict the search to the recent-events panel or require the event-specific warning WrongToken: wrong token text so that panel’s behavior is independently protected.
**<sub><sub></sub></sub> Scope the warning assertion to the recent-events panel**
The sample panel’s `last warning: WrongToken: wrong token` row also contains both `warning` and `wrong token`, so this predicate passes even if the warning disappears from recent events entirely. Restrict the search to the recent-events panel or require the event-specific `warning WrongToken: wrong token` text so that panel’s behavior is independently protected.
AGENTS.md reference: [AGENTS.md:L85-L89](https://github.com/Lochnair/irtt-rs/blob/c12617a669d8bf8126ffd977a27fda86d125ca57/AGENTS.md#L85-L89)
Useful? React with 👍 / 👎.
Agreed — the token is now asserted on the session panel's own row via a new panel_contains helper; verified it fails when the header regresses to session: -.
Agreed — the token is now asserted on the session panel's own row via a new `panel_contains` helper; verified it fails when the header regresses to `session: -`.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed — the graph-view test now rejects all four dashboard panels (packets, timing, recent events, sample) by panel title; verified it fails when the packet panel is drawn alongside the graph.
Agreed — the graph-view test now rejects all four dashboard panels (packets, timing, recent events, sample) by panel title; verified it fails when the packet panel is drawn alongside the graph.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed — the graph-view case now uses the same table-scoped check as the dashboard case; verified it fails when a target table row is dropped.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Agreed — the recent-events check now requires the event-specific warning WrongToken: wrong token text within that panel's own rows; verified it fails when the event line loses its message.
Agreed — the recent-events check now requires the event-specific `warning WrongToken: wrong token` text within that panel's own rows; verified it fails when the event line loses its message.
_🤖 Addressed by [Claude Code](https://claude.com/claude-code)_
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Test-only PR. No production code changed.
draw_dashboard(Frame, &TuiState)seam through Ratatui'sTestBackendand assert on visible rows:MIN_WIDTH×MIN_HEIGHT) and a typical 80×24 compact terminal — header, packet counters, status line, and the absence of the large-only panels;Behavior
No behavior change. The existing pure graph-viewport and state tests are untouched.
One observation worth recording, deliberately not changed here: at 140–180 columns the
timingpanel is a few columns narrower than its own row format, so every metric row wraps onto a second line and the last rows (send call,timer error) fall off the bottom of the panel. That is a panel-proportion tradeoff in production layout, not a bug this test PR should quietly change, so the tests assert on metrics that are visible today rather than pinning the wrap.Scope
Explicitly not changed:
ui.rswas not split into render/state/layout modules.Verification
Run from the task worktree, all successful:
cargo fmt --all -- --checkcargo check --workspace --all-targets --all-features --lockedcargo test --workspace --all-targets --all-features --lockedcargo clippy --workspace --all-targets --all-features --locked -- -D warningsRUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps --lockedcargo check -p irtt-cli --no-default-features --features client --all-targets --lockedcargo check -p irtt-cli --no-default-features --features tui --all-targets --lockedcargo check -p irtt-cli --no-default-features --features server --all-targets --lockedgit diff --check💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:
17d3fed7c5ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));If the sample panel regresses to rendering
last warning: -while the recent-events panel still containswrong token, both of these whole-frame substring assertions continue to pass, so the claimed last-warning-row coverage does not protect that user-visible behavior. Inspect the sample-panel row (or assert the combinedlast warning: ...wrong tokentext) instead.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Good catch — the assertion now locates the
last warning:row and requires that row to contain the warning, so a regression to the placeholder fails even while the recent-events panel still shows it.🤖 Addressed by Claude Code
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:
2062535c20ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));If the
alphaorbetarow disappears from the target table, these whole-frame assertions still pass:alphais also rendered as the first target in the header, while the injectedbetareply puts that label in the recent-events panel and graph legend; the remaininggammarow is enough to prove only that some table content survived. Restrict these checks to the rows occupied by the target panel, or assert each label together with its table-row fields, so the claimed table coverage protects every visible target row.AGENTS.md reference: AGENTS.md:L89-L89
Useful? React with 👍 / 👎.
If the sample panel regresses to rendering a missing or incorrect effective RTT, this test still passes because the recent-events panel independently contains
reply seq=11 effective=2.5ms, while the separate sequence assertion only proves that another sample row rendered. Find the row containingraw / adjusted / effective:and assert2.5mson that row so the intended sample-panel value is actually protected.AGENTS.md reference: AGENTS.md:L89-L89
Useful? React with 👍 / 👎.
If a compact-layout regression renders a condensed or otherwise reformatted timing panel, this negative assertion can still pass because it searches for one incidental sequence of spaces from the current large timing-row formatter rather than for the panel itself. Check for the unique
timingpanel title, or inspect the compact layout's panel regions, so the test protects the stated absence of that panel independently of metric formatting.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
@@ -2938,0 +3112,4 @@let state = active_dashboard_state();let rows = render_rows(&state, MIN_WIDTH, MIN_HEIGHT);let text = rows.join("\n");If the short-terminal path regresses to rendering the resize notice together with ordinary dashboard content while still omitting the status line, this test continues to pass because it only checks for the notice and the absence of
q quit. The corresponding minimum-width test explicitly rejects the packet panel; add an equivalent negative dashboard-panel assertion here so the test actually protects its stated resize-notice-only behavior.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — labels are now matched against the target table's own columns (rows sliced at the panel separator), each with its status column, plus the replying target's last sample; verified it fails when a table row is dropped.
🤖 Addressed by Claude Code
@@ -2938,0 +3112,4 @@let state = active_dashboard_state();let rows = render_rows(&state, MIN_WIDTH, MIN_HEIGHT);let text = rows.join("\n");Agreed — the minimum-height case now rejects dashboard content (
packets) as the minimum-width case does.🤖 Addressed by Claude Code
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed, and stronger than suggested: asserting
2.5mson that row still passed with the effective field dropped, because the fixture's adjusted and effective RTT coincide — so the whole row is now asserted, verified against that exact regression.🤖 Addressed by Claude Code
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — replaced the spacing-dependent check with the
timingpanel title, confirmed absent from the compact frame.🤖 Addressed by Claude Code
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:
c12617a669ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));The
SessionStartedfixture also appendssession started token=0xabcdto the recent-events panel, so this whole-frame assertion still passes if the session header regresses to displayingsession: -. Locate the header’s session row and assert the token there so this test actually protects the user-visible session identity it claims to cover.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
These negative checks only exclude the recent-events and sample panels; a regression that also renders the packet or timing panel alongside the graph would still pass, despite the test claiming the graph replaces the dashboard panels. Assert the absence of those uniquely titled panels as well so the view-selection behavior is fully protected.
AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
Unlike the corrected dashboard case, this separate graph-view test still searches the entire frame for
beta; because the reply creates a chart series namedbeta, the assertion passes even if the target table drops that row. Inspect the target-table rows here as well so every target shown in the graph view is actually protected.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
The sample panel’s
last warning: WrongToken: wrong tokenrow also contains bothwarningandwrong token, so this predicate passes even if the warning disappears from recent events entirely. Restrict the search to the recent-events panel or require the event-specificwarning WrongToken: wrong tokentext so that panel’s behavior is independently protected.AGENTS.md reference: AGENTS.md:L85-L89
Useful? React with 👍 / 👎.
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — the token is now asserted on the session panel's own row via a new
panel_containshelper; verified it fails when the header regresses tosession: -.🤖 Addressed by Claude Code
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — the graph-view test now rejects all four dashboard panels (packets, timing, recent events, sample) by panel title; verified it fails when the packet panel is drawn alongside the graph.
🤖 Addressed by Claude Code
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — the graph-view case now uses the same table-scoped check as the dashboard case; verified it fails when a target table row is dropped.
🤖 Addressed by Claude Code
@@ -2935,4 +2936,353 @@ mod tests {assert_eq!(graph.server_to_client_ns, Some(30_000));Agreed — the recent-events check now requires the event-specific
warning WrongToken: wrong tokentext within that panel's own rows; verified it fails when the event line loses its message.🤖 Addressed by Claude Code