You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(benchmarks-website): refresh planning docs after UI + perf merges
Brings AGENTS.md and README.md in line with what's actually on
ct/benchmarks-v3 after the four UI workstreams (tooltip-pr-link,
range-scrollbar, global-filters, full-history) and the perf pass
(CompressionLayer, LANDING_INLINE_N) landed.
AGENTS.md:
- Bullet 1: note the tower-http CompressionLayer.
- Bullet 7: rewrite. No more 1000-commit cap; fetch is `?n=all`,
visual downsampling is client-side LTTB on the visible range,
range-scrollbar drives rebuilds in lockstep with the toolbar.
- Bullet 8: groups are all collapsed by default; first group's
payloads are inlined at LANDING_INLINE_N=100 commits with
lazy-fetch on zoom-out.
- Bullet 9: the URL params are `?n=&engine=&format=` (not
`?y=&mode=&hidden=`); per-chart toolbar state is local-only.
- Code map: fix LANDING_INLINE_N name/value; refresh chart-init.js
description (LTTB rebuild, range strip, filter chips, click-to-PR);
add rows for app.rs and migrate/src/verify.rs; note the new
range-strip/filter-chip CSS selectors.
- Things to avoid: nuance the "don't refetch on scope change" rule
(the inline-payload zoom-out path is a one-time exception); add
the predecessor-walk lesson from PR #7723 review (commits[] is
oldest-first by SQL); add the "no server-side commit cap" rule;
clarify that the global filter bar is a visibility driver, not a
forbidden page-level toolbar.
README.md:
- Status: list the recent merges (LTTB UI, compression, inline trim).
- Item 1 (secrets): mark done.
- Item 2 (CI wiring): note the f7fd270 dual-write commit; flag
end-to-end verification as the still-open subtask.
- Item 3 (test deployment): bump the host DNS to the current EC2
box; mention the c6a.4xlarge build-on-box path.
- Item 4 (smoke test): mark in-progress; record the Random Access
recovery so future agents see the regression class to watch for.
- Deferred UI follow-ups: drop client-side LTTB (now done); refresh
the collect_group_charts N+1 line range (1131-1162 → 1202-1233);
expand the mobile legend item with the actual cause (matchMedia
is read once at construction).
Signed-off-by: Claude <noreply@anthropic.com>
|`benchmarks-website/server/src/app.rs`|`AppState` (DB handle + bearer + path) and the `Router` composition. `CompressionLayer` wraps every response. |
57
69
|`benchmarks-website/server/src/api.rs`|`chart_payload(conn, &ChartKey, &CommitWindow)` — the shared implementation behind `/api/chart/{slug}`, the inline `<script>` JSON, and `collect_group_charts`. Known N+1 in `collect_group_charts` — flagged with a TODO. |
58
-
|`benchmarks-website/server/src/html.rs`| Three HTML routes and the `<details>`-per-group landing page. `LANDING_DEFAULT_N: u32 = 50`. `UiQuery` parses `?n=&y=&mode=&hidden=` on permalink routes. |
70
+
|`benchmarks-website/server/src/html.rs`| Three HTML routes and the `<details>`-per-group landing page. `LANDING_INLINE_N: u32 = 100` caps the first group's inlined chart JSON; HTML routes default to `CommitWindow::All`. `UiQuery` parses `?n=&engine=&format=`.|
59
71
|`benchmarks-website/server/src/slug.rs`|`ChartKey` / `GroupKey` enums and `to_slug` / `from_slug` round-trip. |
60
-
|`benchmarks-website/server/static/chart-init.js`| Hydration, `IntersectionObserver`, custom external tooltip with delta rows, inline `afterDatasetsDraw` plugin for the dashed crosshair. |
61
-
|`benchmarks-website/server/static/style.css`|`.chart-tooltip-host` is `position: absolute; pointer-events: none;` (do not change — fixes the flicker). `.chart-card` is `position: relative`. |
72
+
|`benchmarks-website/server/static/chart-init.js`| Hydration, `IntersectionObserver`, lazy-fetch on `<details>` toggle, `rebuildVisibleAndUpdate` (client-side LTTB on the visible range, `MAX_VISIBLE_POINTS = 500`), custom external tooltip + delta rows + click-to-PR, range-scrollbar strip, global filter chips, inline crosshair plugin.|
73
+
|`benchmarks-website/server/static/style.css`|`.chart-tooltip-host` is `position: absolute; pointer-events: none;` (do not change — fixes the flicker). `.chart-card` is `position: relative`. `.chart-range-strip*` and `.filter-*` selectors back the range scrollbar and global filter chips.|
62
74
|`benchmarks-website/server/tests/web_ui.rs`|`insta` snapshot tests, seeded by POSTing to `/api/ingest`. No external fixtures. |
63
75
|`benchmarks-website/migrate/src/classifier.rs`|`classify_outcome` routes records into a fact table, `Skip(reason)`, or `Unknown`. >5% Unknown gates the run. |
76
+
|`benchmarks-website/migrate/src/verify.rs`| Structural diff between a migrated DuckDB and v2's live `/api/metadata`. Exits non-zero if any v2 group is missing in v3 — gates a CI step. |
64
77
65
78
## Local dev / smoke test
66
79
@@ -111,13 +124,25 @@ See the root [`CLAUDE.md`](/CLAUDE.md) for Rust style, test layout, and CI norms
111
124
[`README.md`](./README.md) first — it is almost certainly already deferred.
112
125
-**Don't write a server-side classifier for live ingest.** The emitter is responsible for v3-shape
113
126
records. The migrator's classifier exists only to translate v2 records once.
114
-
-**Don't rebuild a global page-level toolbar.** Controls are per-chart. This was a real failure
115
-
mode the first time around — the page-level toolbar drove every chart together, which is not what
116
-
users want.
127
+
-**Don't rebuild a global page-level toolbar with chart-state controls.** Per-chart controls
128
+
(slider, Y-axis, scope) stay per-chart. The sticky filter bar at the top of every page is the
129
+
exception — it drives series *visibility* across every chart at once, which is what users want
130
+
for the engine/format dimension. Don't extend it with per-chart settings.
117
131
-**Don't bind a slider's reactive logic to `change` events.** Use `input` events with a small
118
132
throttle + debounce, otherwise the slider only updates on release and feels broken.
119
-
-**Don't refetch on scope change.** Each chart fetches a generous window once; scope buttons +
120
-
slider operate on that buffer via `chart.update("none")`.
133
+
-**Don't refetch every time the scope changes.** The chart fetches its full history once; scope
134
+
buttons, slider, drag-pan, wheel-pan, and the range strip all rebuild via the in-memory LTTB
135
+
pass on the cached payload. The one exception is the inline-payload zoom-out path: when the user
136
+
zooms past the first group's inlined `LANDING_INLINE_N` window for the first time,
137
+
`chart-init.js` lazy-fetches `?n=all` once and replaces the payload.
138
+
-**Don't re-introduce a server-side commit cap.**`?n=all` is the default for HTML routes and the
139
+
upper bound is unbounded everywhere. Visual downsampling lives client-side in `chart-init.js`,
140
+
not on the wire.
141
+
-**Don't reverse the predecessor walk in the tooltip.** The chart payload's `commits[]` is sorted
142
+
oldest-first by SQL — `commits[0]` is the oldest commit, `commits[N-1]` is the newest. For
143
+
per-row delta the chronological predecessor of `commits[idx]` lives at `idx - 1`. We caught a
144
+
regression where a "fix" flipped this to `idx + 1`; the original walk-backward direction was
145
+
right.
121
146
-**Don't re-introduce `pointer-events: auto` on the tooltip host.** The tooltip is positioned at
122
147
the cursor; making it pointer-interactive causes a flicker loop. Keep it `pointer-events: none`
123
148
and offset via `transform: translate(12px, 12px)`.
0 commit comments