Repository navigation
Conversation
🤖 CI report
|
| Function | Location | Complexity |
|---|---|---|
RunningTimeCell |
products/experiments/frontend/components/RunningTimeCell.tsx:11 |
13 |
⚠️ Bundle size — 🔺 +1009 B (+0.0%)
Uncompressed size of every built .js bundle, compared against the base branch.
Total: 68.16 MiB · 🔺 +1009 B (+0.0%)
No file changed by more than 1000 B.
Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report
✅ Eager graph — within budget
How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.
| Root | Eager (shipped) | Δ vs base | Budget |
|---|---|---|---|
entry (logged-out pages, app bootstrap)src/index.tsx |
1.43 MiB · 22 files | no change | ███░░░░░░░ 31.6% of 4.51 MiB |
authenticated shell (every logged-in page)src/scenes/AuthenticatedShell.tsx |
8.85 MiB · 3,250 files | 🔺 +971 B (+0.0%) | █████████░ 91.1% of 9.71 MiB |
🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
Largest files eagerly shipped from src/index.tsx
| Size | File |
|---|---|
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 24.6 KiB | ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js |
| 6.3 KiB | ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js |
| 4.5 KiB | ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js |
| 3.9 KiB | ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js |
| 1.4 KiB | ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js |
| 1.3 KiB | src/RootErrorBoundary.tsx |
| 912 B | ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js |
| 789 B | src/scenes/ChunkLoadErrorBoundary.tsx |
| 762 B | src/index.tsx |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
| Size | File |
|---|---|
| 307.0 KiB | ../node_modules/.pnpm/posthog-js@1.422.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js |
| 267.7 KiB | ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
| 263.5 KiB | ../node_modules/.pnpm/posthog-js@1.422.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.js |
| 256.1 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 154.2 KiB | ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js |
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 104.5 KiB | src/lib/api.ts |
| 95.2 KiB | ../packages/quill/packages/quill/dist/index.js |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 90.6 KiB | ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js |
Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479
✅ Toolbar bundle — eager 2.26 MiB within budget
What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.
| Metric | Size | Δ vs base | Budget |
|---|---|---|---|
| Eager (shipped) entry + static imports |
2.26 MiB · 18 files | no change | ████░░░░░░ 39.5% of 5.72 MiB |
| Deferred (lazy) | 2.11 MiB · 45 files | no change | n/a — loads on demand |
Loader dist/toolbar.js |
1.1 KiB | no change | █░░░░░░░░░ 5.8% of 19.5 KiB |
Largest eagerly-shipped chunks
| Size | File |
|---|---|
| 751.7 KiB | dist/toolbar/toolbar-app-JNIXJPZH.css |
| 590.1 KiB | dist/toolbar/chunk-chunk-EFVXUHYC.js |
| 484.7 KiB | dist/toolbar/chunk-chunk-RNKUEDGA.js |
| 134.1 KiB | dist/toolbar/chunk-chunk-7F43S5WJ.js |
| 131.8 KiB | dist/toolbar/chunk-chunk-FDH2IBXT.js |
| 71.3 KiB | dist/toolbar/toolbar-app-3FOHUVAY.js |
| 69.0 KiB | dist/toolbar/chunk-chunk-TSAL54PB.js |
| 35.6 KiB | dist/toolbar/chunk-chunk-JDE4NYP5.js |
| 21.0 KiB | dist/toolbar/chunk-chunk-U37JV6N2.js |
| 6.8 KiB | dist/toolbar/chunk-chunk-DV7IWQNF.js |
Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile
✅ Dist folder size — 🔺 +15.2 KiB (+0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1448.74 MiB · 🔺 +15.2 KiB (+0.0%)
|
This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the |
|
This PR was closed due to lack of activity. Feel free to reopen if it's still relevant. |
Problem
The experiments list showed each running experiment's remaining time from a value the detail page persisted back onto the experiment on every exposure refresh. That number went stale, and the list often showed no progress at all. This is the frontend half of moving remaining time onto the on-demand endpoint.
Changes
This PR points the experiments list at the running-time estimate endpoint added in the base PR, so the "Remaining" column reflects current data and progress. It is stacked on
experiments/experiment-running-time-endpoint.Batch load per page
After the list loads,
experimentsLogicfetches estimates for the running rows in one request, keyed by experiment id. It filters to running experiments, so drafts and finished ones make no call. This follows the surveysresponses_countpattern.products/experiments/frontend/scenes/experimentsLogic.tsThe cell
A new
RunningTimeCellrenders the "Remaining" column from the estimate: a spinner while loading, a progress bar with a "~N days remaining" tooltip, and distinct empty and complete states. Progress is exposures toward the target when live exposures exist, and elapsed days against the total otherwise.products/experiments/frontend/components/RunningTimeCell.tsxList wiring
The "Remaining" column now renders
RunningTimeCellinstead of reading the storedrecommended_running_time. The columns array is memoized so an estimate load re-renders only the changed cells, not all rows. The rest of the column diff is a mechanical re-indent from wrapping the array inuseMemo.products/experiments/frontend/scenes/ExperimentsScene.tsxScreenshot pending: the local preview is being rebuilt on this branch. A list screenshot showing the live remaining-time progress bars will be added here.
How did you test this code?
Verified in the running app that the list "Remaining" column matches the detail page for the same experiment, and that the progress bar reflects exposures toward the target.
Automatic notifications
Docs update
None.
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Model: Opus 4.8 (1M context)
Manually refactored: no
Skills used:
Relevant decisions:
RunningTimeCell, not a per-row logic component, so the whole page loads in one request against the batch endpoint rather than N single-id calls.loadExperimentsSuccesslistener, filtered to running experiments, since remaining time only applies to them.LemonTable's per-rowReact.memo, so an estimate load would otherwise re-render every row.