Skip to content

Experiments Portlet — Screen 3: View Results #37004

Description

@oidacra

Description

The Results screen on the portlet's stack: stat strip, Daily/Bayesian tabs, summary table, promote. The current reports screen is the cheapest to port — its store is already page-independent (state is only {experiment, status, results}, loaded by experimentId alone) — but it is rewritten on Signal Store Events like the rest of the portlet, and the charts/data plumbing are reused, not reinvented.

Heads-up before starting: experiment results still go through CubeJSClient on main (2 CubeJS round-trips + a 1000-sample Monte Carlo per call, @NoCache) — #36763 Part 1 migrates that to CAEM + ClickHouse. Confirm with the analytics team whether to build against the current contract or wait for the new one; the result model (ExperimentResults, GoalResults, VariantResults) is unchanged by the migration, so building now is expected to be safe.

Design: approved prototype, results screen.

Scope

  • Route: /experiments/:experimentId/results (placeholder wired by Experiments Portlet — Screen 1: portlet base + site-wide List #36989).
  • Header: back to the list · name + status tag · subline {pageTitle} · {pagePath} · {n} Variants · Configuration button (→ Experiments Portlet — Screen 2: Create/Update (/experiments/new + /:id/configuration) #37003's screen) · Stop Experiment when RUNNING.
  • Stat strip: Winner (ENDED) / Leading Variant (otherwise) with inline Promote when the leader is not the control · Goal name · Period · Sessions To Date. Ported: "no winner yet" negative state (block icon + legend — the design has no negative state) and the refresh-results button (results are @NoCache; users watch this screen while the test runs).
  • Tabs: Daily Results (conversion rate by day, one series per variant, interactive legend) · Bayesian Results (posterior distribution). Reuse the existing Chart.js setup (dot-experiments-reports-chart/chartjs/ chart options) — do not hand-roll the prototype's SVG. Bayesian summary data comes from the backend (bayesianResult in the results payload): conversion rate, credibility interval, probability and risk per variant. The posterior curve is sampled on the client. BayesianResult.distributionPdfs can supply it, but it is gated behind INCLUDE_BETA_DISTRIBUTION_SAMPLES (off by default) and carries BETA_DISTRIBUTION_SAMPLE_SIZE points per variant — a thousand out of the box — on an endpoint that is @NoCache. Sampling a Beta locally costs less than putting those points on the wire on every read.
  • Summary table (under both tabs): Variant (dot, name, CONTROL/LEADING chips) · Sessions · Conversions · Conversion Rate · Lift vs Original (percentage points, +11.7 pts, green/red, — on control — the one design addition over the current table) · Probability To Be Best · Conversion Rate Range (95%) · Promote. Ported: minimum-10-sessions gate (below it, empty state instead of meaningless rates) and promoted state (Promote buttons hidden once a variant is promoted; a variant must not be promotable twice).
  • Promote confirm: promoting while RUNNING auto-ends the experiment (ExperimentsAPIImpl.java:1392) — the confirm must say so; the design draws a bare button.
  • Analytics health gate on this route only: reuse dotAnalyticsHealthCheckResolver from @dotcms/ui (not the edit-page-coupled AnalyticsAppGuard). The list must not be gated.
  • Store: Signal Store Events (experiments-results.events.ts), load/refresh/promote as Request → Succeeded → Failed triples.
  • Unhide from Screen 1: the View Results primary row action in Experiments Portlet — Screen 1: portlet base + site-wide List #36989 routes here.

Acceptance Criteria

  • /experiments/:id/results renders stat strip, tabs and summary per the design for RUNNING and ENDED experiments.
  • Daily and Bayesian charts render with the existing Chart.js config; legend toggles series.
  • Lift vs Original shows points vs the control row, green/red, — on control.
  • Below 10 sessions the summary shows the empty state.
  • Refresh re-fetches results without a full navigation.
  • No suggested winner → the negative state renders, not a false "Leading Variant".
  • Promote asks confirmation; RUNNING copy states the experiment will be ended; after promoting, Promote buttons disappear and the promoted row is marked.
  • A misconfigured analytics app blocks only this route, not the list.
  • The old UVE reports screen is untouched.
  • Jest specs for the results store and summary table.

Priority

Medium — independent of #37003; can run in parallel once #36989's shell exists.

Additional Context

Activity

  1. added theissue type on Aug 11, 2026
  2. moved this from New to Current Sprint Backlog in dotCMS - Product Planningon Aug 11, 2026
  3. moved this from Current Sprint Backlog to In Progress in dotCMS - Product Planningon Aug 19, 2026
  4. github-actions commented on Aug 20, 2026

    @github-actions
    Contributor
  5. moved this from In Progress to Spec In Review in dotCMS - Product Planningon Sep 2, 2026
  6. moved this from Spec In Review to In Review in dotCMS - Product Planningon Sep 2, 2026
  7. moved this from In Review to QA in dotCMS - Product Planningon Sep 8, 2026
  8. erickgonzalez commented on Sep 21, 2026

    @erickgonzalez
    Member

    @freddyDOTCMS tested this while doing the impl of the new infra.

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

Metadata

Metadata

Assignees

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions