Skip to content

fix(experiments): show live remaining time on the experiments list - #92868

Closed
rodrigoi wants to merge 1 commit into
experiments/experiment-running-time-endpointfrom
experiments/experiments-running-time-cell
Closed

rodrigoi wants to merge 1 commit into
experiments/experiment-running-time-endpointfrom
experiments/experiments-running-time-cell

Conversation

@rodrigoi

@rodrigoi rodrigoi commented Sep 1, 2026 •

Copy link
Copy Markdown
Member

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, experimentsLogic fetches 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 surveys responses_count pattern.

  • products/experiments/frontend/scenes/experimentsLogic.ts

The cell

A new RunningTimeCell renders 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.tsx

List wiring

The "Remaining" column now renders RunningTimeCell instead of reading the stored recommended_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 in useMemo.

  • products/experiments/frontend/scenes/ExperimentsScene.tsx

Screenshot 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.

pnpm --filter=@posthog/frontend typescript:check

cat-type-small

Automatic notifications

  • Publish to changelog?

Docs update

None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Model: Opus 4.8 (1M context)
Manually refactored: no

Skills used:

  • /brainstorming (superpowers)
  • /writing-ui-components (local)
  • /writing-kea-logics (local)
  • /adopting-generated-api-types (local)

Relevant decisions:

  • Batch loader plus a dumb 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.
  • Fired the estimate load from a new loadExperimentsSuccess listener, filtered to running experiments, since remaining time only applies to them.
  • Memoized the columns array because a fresh array each render defeats LemonTable's per-row React.memo, so an estimate load would otherwise re-render every row.

@rodrigoi rodrigoi added skip-inkeep-docs Use this label to skip an Inkeep docs PR in posthog.com skip-agent-review Save $$$, skip auto agent reviews (Greptile) — use for trivial or chore PRs labels Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 1 function above 10 (max 13)

Cyclomatic complexity above 10 in changed typescript files. Warn only: worth simplifying when you next touch these functions.

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%)

@trunk-io

trunk-io Bot commented Sep 1, 2026

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

View Full Report ↗︎ ⋅ Docs

@rodrigoi rodrigoi changed the title fix(experiments): experiments list now uses the runtime batch endpoint fix(experiments): show live remaining time on the experiments list Sep 1, 2026
@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

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 stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

This PR was closed due to lack of activity. Feel free to reopen if it's still relevant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-agent-review Save $$$, skip auto agent reviews (Greptile) — use for trivial or chore PRs skip-inkeep-docs Use this label to skip an Inkeep docs PR in posthog.com stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant