|
58 | 58 | - [ ] Clear the title input after successfully creating a regression. |
59 | 59 | - [ ] Replace the `<details>` "Add to Regression" panel with a sticky floating |
60 | 60 | button (bottom-right) that expands into a panel on click. |
61 | | -- [x] Implement multi-knob noise filtering (Delta %, p-value, absolute floor) |
62 | | - per the updated `docs/design/ui/compare.md` spec. |
63 | 61 | - [ ] Understand whether the Compare page should allow inputting an arbitrary |
64 | 62 | local run. |
65 | | -- [ ] Fix: sample aggregation changes are not being plotted on the graph (same |
66 | | - data appears to be used regardless of aggregation). |
67 | | -- [ ] On the S curve, experiment with graying out tests that have a high |
68 | | - p-value. |
69 | | -- [x] Display the percentage of tests that are faster/slower/noise on the graph. |
70 | 63 | - [ ] Understand how to surface tests with high vs. low confidence when multiple |
71 | 64 | samples are present. |
72 | 65 |
|
|
91 | 84 |
|
92 | 85 | ## UI — Graph / Compare Shared |
93 | 86 |
|
94 | | -- [x] Simplify baseline commit pickers to use `GET /commits?machine={name}` |
95 | | - instead of the current two-step fetch pattern (all commits + machine runs for |
96 | | - client-side filtering). |
97 | 87 | - [ ] Experiment with placing the search bar just above the table rows instead |
98 | 88 | of its current position. |
99 | 89 |
|
|
110 | 100 | not just the current page. NOTE: The `?search=` parameter already searches |
111 | 101 | across commit, tag, and searchable commit_fields. |
112 | 102 |
|
113 | | -- [ ] Fix: the "Copy" button for the API key token does not actually copy to |
114 | | - the clipboard. |
115 | | - |
116 | | -## Schema |
117 | | - |
118 | | -- [x] Understand what happens if a commit field in the schema is named |
119 | | - `ordinal`. Validate and reject if necessary. |
120 | | -- [x] Handle bigger-is-better semantics in the schema. Also consider adding |
121 | | - display name, units, and other field metadata. |
122 | | - |
123 | 103 | ## Cleanup & Tech Debt |
124 | 104 |
|
125 | | -- [x] Remove the `# Load the v5 frontend` comment and associated stale code in |
126 | | - `app.py` — a remnant from before v5 was disjoint from v4. Audit for other |
127 | | - stale v4 integration points. |
128 | | -- [x] Remove the `[v4 UI]` button in the navbar — it cannot work anymore. |
129 | 105 | - [ ] Undo changes made to the v4 layer (e.g. new migrations). |
130 | 106 | - [ ] Reorganize `combobox.ts` and `machine-combobox.ts` — remnants of the |
131 | 107 | Compare page being standalone. Either unify into a single combobox component |
|
141 | 117 |
|
142 | 118 | ### P0 — Critical |
143 | 119 |
|
144 | | -- [x] **Add `(test_id, run_id)` compound index on Sample table** (impact: |
145 | | - 100–1000x for time-series queries). The existing `(run_id, test_id)` compound |
146 | | - index has columns in the wrong order for the dominant access pattern. |
147 | | - Time-series queries (`query_time_series`, `/query`, `/trends`, |
148 | | - `GET /tests?machine=`) filter by `test_id` first, but the index leads with |
149 | | - `run_id`. At 100M+ rows, these queries fall back to sequential scans. |
150 | | - |
151 | | -- [x] **Batch test get-or-create in run submission** (impact: ~1000x fewer DB |
152 | | - round-trips per submission). `get_or_create_test` is called per-test in a loop |
153 | | - (`__init__.py:1295`), issuing one SELECT + optional SAVEPOINT/INSERT/FLUSH per |
154 | | - test. For a 7,500-test submission, this is 7,500–30,000 round-trips. Replace |
155 | | - with `SELECT ... WHERE name IN (...)` + `INSERT ... ON CONFLICT DO NOTHING` to |
156 | | - reduce to ~3 round-trips. |
157 | | - |
158 | 120 | - [ ] **Add pagination/limit to `POST /trends`** (impact: prevents unbounded |
159 | 121 | queries). The trends endpoint returns ALL matching data points with no limit. |
160 | 122 | The `EXP(AVG(LN(metric)))` geomean scans the entire Sample table — O(N) on |
|
168 | 130 | at limit=10,000, this adds ~1–2 seconds of pure Python overhead. The validate |
169 | 131 | step should be skipped in production. |
170 | 132 |
|
171 | | -- [x] **Add response compression** (impact: 80–90% bandwidth reduction). |
172 | | - No gzip/brotli middleware is configured. All JSON responses are sent |
173 | | - uncompressed. A 3 MB query response could be ~450 KB with gzip. Add |
174 | | - `flask-compress` or document that a reverse proxy must handle compression. |
175 | | - |
176 | 133 | ### P1 — High |
177 | 134 |
|
178 | | -- [x] **Use Core INSERT for samples instead of ORM objects** (impact: 3–10x |
179 | | - speedup on sample insertion). `create_samples` (`__init__.py:813`) creates |
180 | | - 7,500 ORM objects via `add_all()`. SQLAlchemy 1.3 emits individual INSERT |
181 | | - statements. Using `session.execute(Sample.__table__.insert(), list_of_dicts)` |
182 | | - with psycopg2's `executemany` batches thousands of rows into a handful of |
183 | | - round-trips. |
184 | | - |
185 | 135 | - [ ] **Remove `ordered = True` from BaseSchema.Meta** (impact: eliminates |
186 | 136 | `OrderedDict` overhead across all schemas). All schemas inherit |
187 | 137 | `ordered = True`, forcing marshmallow to use `OrderedDict` instead of plain |
|
299 | 249 |
|
300 | 250 | ## Profiles |
301 | 251 |
|
302 | | -- [x] **DB model and submission**: Profile table with deferred LargeBinary, |
303 | | - submission integration (base64 decode, version validation, size limit). |
304 | | -- [x] **Binary format parser**: Clean read-only parser with lazy BZ2 |
305 | | - decompression. Wire-compatible with v4 ProfileV2. |
306 | | -- [x] **REST API endpoints**: Listing (per run), metadata, functions, function |
307 | | - detail — all UUID-based. |
308 | | -- [x] **Profiles UI page**: A/B picker, stats bar, straight-line disassembly |
309 | | - view. See `docs/design/ui/profiles.md`. |
310 | 252 | - [ ] **CFG view**: Control-flow graph renderer (D3-based, ISA-specific). |
311 | 253 | Deferred to a future phase. |
312 | 254 | - [ ] **Replace N+1 profile-existence check in commit picker**: The Profiles |
313 | 255 | page commit dropdown calls `GET /runs/{uuid}/profiles` for every run on the |
314 | 256 | selected machine to filter commits without profiles. Replace with a |
315 | 257 | server-side mechanism (e.g. `has_profiles` flag on run list responses or a |
316 | 258 | filtered commits endpoint). |
317 | | -- [x] **Compare page integration**: Profile link column in comparison table. |
318 | | -- [x] **Run Detail integration**: Profile link/icon in samples table. |
319 | | -- [x] **Remove `has_profile` from frontend**: Clean up `SampleInfo.has_profile` |
320 | | - in `types.ts` and test fixtures. |
0 commit comments