%23%20%2F%2F%2F%20script%0A%23%20%5Btool.marimo.display%5D%0A%23%20theme%20%3D%20%22light%22%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.25.0%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22%2C%20css_file%3D%22ab_testing_dashboard.css%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20_dashboard_demo%20as%20demo%0A%20%20%20%20import%20ibis%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20from%20increment%20import%20Analysis%0A%20%20%20%20from%20increment.dashboard%20import%20(%0A%20%20%20%20%20%20%20%20DashboardConfig%2C%0A%20%20%20%20%20%20%20%20dashboard_styles%2C%0A%20%20%20%20%20%20%20%20group_data_csv%2C%0A%20%20%20%20%20%20%20%20load_explore%2C%0A%20%20%20%20%20%20%20%20prepare_dashboard%2C%0A%20%20%20%20%20%20%20%20readout_csv%2C%0A%20%20%20%20%20%20%20%20render_details%2C%0A%20%20%20%20%20%20%20%20render_explore%2C%0A%20%20%20%20%20%20%20%20render_header%2C%0A%20%20%20%20%20%20%20%20render_health%2C%0A%20%20%20%20%20%20%20%20render_metric_details%2C%0A%20%20%20%20%20%20%20%20render_results%2C%0A%20%20%20%20)%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Analysis%2C%0A%20%20%20%20%20%20%20%20DashboardConfig%2C%0A%20%20%20%20%20%20%20%20Path%2C%0A%20%20%20%20%20%20%20%20dashboard_styles%2C%0A%20%20%20%20%20%20%20%20demo%2C%0A%20%20%20%20%20%20%20%20group_data_csv%2C%0A%20%20%20%20%20%20%20%20ibis%2C%0A%20%20%20%20%20%20%20%20load_explore%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20prepare_dashboard%2C%0A%20%20%20%20%20%20%20%20readout_csv%2C%0A%20%20%20%20%20%20%20%20render_details%2C%0A%20%20%20%20%20%20%20%20render_explore%2C%0A%20%20%20%20%20%20%20%20render_header%2C%0A%20%20%20%20%20%20%20%20render_health%2C%0A%20%20%20%20%20%20%20%20render_metric_details%2C%0A%20%20%20%20%20%20%20%20render_results%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(Path%2C%20demo)%3A%0A%20%20%20%20%23%20The%20synthetic%20warehouse%20is%20generated%2C%20never%20committed.%20Only%20this%20example%0A%20%20%20%20%23%20needs%20the%20repository%20root%3A%20its%20definitions%20hold%20relative%20parquet%20paths.%0A%20%20%20%20demo_manifest%20%3D%20demo.ensure_demo_warehouse(Path.cwd())%0A%20%20%20%20return%20(demo_manifest%2C)%0A%0A%0A%40app.cell%0Adef%20_(ibis)%3A%0A%20%20%20%20con%20%3D%20ibis.duckdb.connect()%0A%20%20%20%20return%20(con%2C)%0A%0A%0A%40app.cell%0Adef%20_(Analysis%2C%20DashboardConfig%2C%20con%2C%20demo%2C%20demo_manifest)%3A%0A%20%20%20%20analysis%20%3D%20Analysis.from_definitions(%0A%20%20%20%20%20%20%20%20%22checkout_redesign%22%2C%20%22examples%2Frealistic_demo%2Fdefinitions%22%2C%20con%0A%20%20%20%20)%0A%20%20%20%20config%20%3D%20DashboardConfig(%0A%20%20%20%20%20%20%20%20expected_allocation%3D%7B%22control%22%3A%200.5%2C%20%22treatment%22%3A%200.5%7D%2C%0A%20%20%20%20%20%20%20%20title%3D%22Checkout%20redesign%22%2C%0A%20%20%20%20%20%20%20%20source_label%3D%22Synthetic%20snapshot%22%2C%0A%20%20%20%20%20%20%20%20metric_units%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22revenue_per_user%22%3A%20%22USD%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22average_order_value%22%3A%20%22USD%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22checkout_latency_ms%22%3A%20%22ms%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20provenance%3Ddemo.demo_provenance(demo_manifest)%2C%0A%20%20%20%20)%0A%20%20%20%20return%20analysis%2C%20config%0A%0A%0A%40app.cell%0Adef%20_(analysis%2C%20config%2C%20prepare_dashboard)%3A%0A%20%20%20%20snapshot%20%3D%20prepare_dashboard(analysis%2C%20config%3Dconfig)%0A%20%20%20%20return%20(snapshot%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(dashboard_styles)%3A%0A%20%20%20%20%23%20Injects%20packaged%20section%20styles%3B%20no%20data%20changes.%20The%20app's%20css_file%0A%20%20%20%20%23%20separately%20styles%20the%20notebook%20page.%20Keep%20this%20cell%20for%20HTML%20exports.%0A%20%20%20%20dashboard_styles()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.Html(%22%22%22%0A%20%20%20%20%20%20%20%20%3Cheader%20class%3D%22inc-dashboard-root%20inc-dashboard-navigation%22%3E%0A%20%20%20%20%20%20%20%20%20%20%3Ca%20class%3D%22inc-dashboard-brand%22%20href%3D%22%23overview%22%3Eincrement%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cnav%20aria-label%3D%22Dashboard%20sections%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23overview%22%3EOverview%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23health%22%3EHealth%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23results%22%3EResults%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23explore%22%3EExplore%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23metric-details%22%3EMetric%20details%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href%3D%22%23details%22%3EDetails%3C%2Fa%3E%0A%20%20%20%20%20%20%20%20%20%20%3C%2Fnav%3E%0A%20%20%20%20%20%20%20%20%3C%2Fheader%3E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(render_header%2C%20snapshot)%3A%0A%20%20%20%20render_header(snapshot)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(render_health%2C%20snapshot)%3A%0A%20%20%20%20render_health(snapshot)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(render_results%2C%20snapshot)%3A%0A%20%20%20%20render_results(snapshot)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20explore_view%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Cumulative%20lift%22%3A%20%22cumulative_lift%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Daily%20metric%20values%22%3A%20%22daily_values%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Cumulative%20metric%20values%22%3A%20%22cumulative_values%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Segments%22%3A%20%22segments%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20value%3D%22Cumulative%20lift%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22View%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(explore_view%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20snapshot)%3A%0A%20%20%20%20segment_choice%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bdimension%7D%20%C2%B7%20%7Bsource%7D%22%3A%20(source%2C%20dimension)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20source%2C%20dimension%20in%20snapshot.breakouts%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20value%3Dnext((f%22%7Bdimension%7D%20%C2%B7%20%7Bsource%7D%22%20for%20source%2C%20dimension%20in%20snapshot.breakouts)%2C%20None)%2C%0A%20%20%20%20%20%20%20%20label%3D%22Breakout%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(segment_choice%2C)%0A%0A%0A%40app.cell%0Adef%20_(explore_view%2C%20mo)%3A%0A%20%20%20%20%23%20Recreated%20per%20view%3A%20the%20maturity%20gate%20is%20cumulative-only%2C%20and%20a%20daily%0A%20%20%20%20%23%20request%20must%20never%20silently%20carry%20it.%0A%20%20%20%20completed_windows%20%3D%20mo.ui.switch(%0A%20%20%20%20%20%20%20%20label%3D%22Completed%20windows%20only%22%2C%0A%20%20%20%20%20%20%20%20disabled%3Dexplore_view.value%20in%20(%22daily_values%22%2C%20%22segments%22)%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(completed_windows%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(completed_windows%2C%20explore_view%2C%20mo%2C%20segment_choice%2C%20snapshot)%3A%0A%20%20%20%20_controls%20%3D%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20explore_view%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bsegment_choice%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20explore_view.value%20%3D%3D%20%22segments%22%20and%20snapshot.breakouts%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%5Bcompleted_windows%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20explore_view.value%20in%20(%22cumulative_lift%22%2C%20%22cumulative_values%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20justify%3D%22start%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wrap%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20mo.Html(f'%3Cdiv%20class%3D%22inc-dashboard-root%20inc-dashboard-controls%22%3E%7B_controls.text%7D%3C%2Fdiv%3E')%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20analysis%2C%0A%20%20%20%20completed_windows%2C%0A%20%20%20%20explore_view%2C%0A%20%20%20%20load_explore%2C%0A%20%20%20%20segment_choice%2C%0A%20%20%20%20snapshot%2C%0A)%3A%0A%20%20%20%20explore_data%20%3D%20load_explore(%0A%20%20%20%20%20%20%20%20analysis%2C%0A%20%20%20%20%20%20%20%20snapshot%3Dsnapshot%2C%0A%20%20%20%20%20%20%20%20metric%3DNone%2C%0A%20%20%20%20%20%20%20%20view%3Dexplore_view.value%2C%0A%20%20%20%20%20%20%20%20completed_windows_only%3Dcompleted_windows.value%2C%0A%20%20%20%20%20%20%20%20breakout%3Dsegment_choice.value%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(explore_data%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(completed_windows%2C%20explore_data%2C%20explore_view%2C%20render_explore%2C%20snapshot)%3A%0A%20%20%20%20render_explore(%0A%20%20%20%20%20%20%20%20snapshot%2C%0A%20%20%20%20%20%20%20%20explore_data%2C%0A%20%20%20%20%20%20%20%20metric%3DNone%2C%0A%20%20%20%20%20%20%20%20view%3Dexplore_view.value%2C%0A%20%20%20%20%20%20%20%20completed_windows_only%3Dcompleted_windows.value%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20snapshot)%3A%0A%20%20%20%20metric_choice%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5Bmetric.name%20for%20metric%20in%20snapshot.metrics%5D%2C%0A%20%20%20%20%20%20%20%20value%3Dsnapshot.primary_metric%2C%0A%20%20%20%20%20%20%20%20label%3D%22Metric%20details%22%2C%0A%20%20%20%20)%0A%20%20%20%20mo.Html(f'%3Cdiv%20class%3D%22inc-dashboard-root%20inc-dashboard-controls%22%3E%7Bmetric_choice.text%7D%3C%2Fdiv%3E')%0A%20%20%20%20return%20(metric_choice%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(metric_choice%2C%20render_metric_details%2C%20snapshot)%3A%0A%20%20%20%20render_metric_details(snapshot%2C%20metric%3Dmetric_choice.value)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(group_data_csv%2C%20metric_choice%2C%20mo%2C%20snapshot)%3A%0A%20%20%20%20mo.download(%0A%20%20%20%20%20%20%20%20data%3Dgroup_data_csv(snapshot%2C%20metric%3Dmetric_choice.value)%2C%0A%20%20%20%20%20%20%20%20filename%3Df%22%7Bsnapshot.experiment_name%7D-%7Bmetric_choice.value%7D-groups.csv%22%2C%0A%20%20%20%20%20%20%20%20mimetype%3D%22text%2Fcsv%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Download%20data%20by%20group%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(render_details%2C%20snapshot)%3A%0A%20%20%20%20render_details(snapshot)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20readout_csv%2C%20snapshot)%3A%0A%20%20%20%20mo.download(%0A%20%20%20%20%20%20%20%20data%3Dreadout_csv(snapshot)%2C%0A%20%20%20%20%20%20%20%20filename%3Df%22%7Bsnapshot.experiment_name%7D-readout.csv%22%2C%0A%20%20%20%20%20%20%20%20mimetype%3D%22text%2Fcsv%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Download%20headline%20readout%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
5bdb9db4257bbcdf97740ecdce17ed3a