%22%22%22Interactive%20audit%20dashboard.%0A%0AReplaces%20audit_factories.py%20CLI%20with%20a%20clickable%2C%20sortable%2C%20drillable%20web%20UI.%0A-%20Sortable%20factory%20table%20with%20all%20metrics%0A-%20Click%20a%20factory%20%E2%86%92%20see%20all%201000%20pieces%20in%20a%20thumbnail%20grid%0A-%20Filter%20pieces%20by%20score%20range%0A-%20Click%20a%20piece%20%E2%86%92%20see%20full%20SVG%2C%20params%2C%20all%2010%20scores%0A-%20Live%20ceiling%20potential%20ranking%0A%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.22.5%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22%2C%20app_title%3D%22Autoresearch%20Audit%20Dashboard%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20sys%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20sys.path.insert(0%2C%20str(Path(__file__).parent))%0A%20%20%20%20import%20_lib%20as%20lib%0A%0A%20%20%20%20return%20lib%2C%20mo%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20Autoresearch%20Audit%20Dashboard%0A%0A%20%20%20%20Factory%20rankings%2C%20ceiling%20potential%2C%20and%20per-piece%20drilldown.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lib)%3A%0A%20%20%20%20summaries%20%3D%20lib.all_factory_summaries()%0A%20%20%20%20%23%20Add%20ceiling_gain%20column%0A%20%20%20%20for%20s%20in%20summaries%3A%0A%20%20%20%20%20%20%20%20s%5B%22ceiling_gain%22%5D%20%3D%20lib.ceiling_potential(s)%0A%20%20%20%20return%20(summaries%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20summaries)%3A%0A%20%20%20%20%23%20Build%20a%20clean%20table%20for%20display%0A%20%20%20%20table_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factory%22%3A%20fs%5B%22factory%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22n%22%3A%20fs%5B%22n%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22avg%22%3A%20fs%5B%22avg%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22best%22%3A%20fs%5B%22best%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%2270%2B%22%3A%20fs%5B%22over_70%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%2280%2B%22%3A%20fs%5B%22over_80%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22kept%25%22%3A%20fs%5B%22kept_pct%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ink%22%3A%20fs%5B%22metrics%22%5D%5B%22ink_coverage%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ent%22%3A%20fs%5B%22metrics%22%5D%5B%22entropy%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniq%22%3A%20fs%5B%22metrics%22%5D%5B%22uniqueness%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22weakest%22%3A%20fs%5B%22weakest%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22weak_val%22%3A%20fs%5B%22weakest_val%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ceiling%2B%22%3A%20fs%5B%22ceiling_gain%22%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20for%20fs%20in%20sorted(summaries%2C%20key%3Dlambda%20x%3A%20-x%5B%22avg%22%5D)%0A%20%20%20%20%5D%0A%0A%20%20%20%20factory_table%20%3D%20mo.ui.table(%0A%20%20%20%20%20%20%20%20table_rows%2C%0A%20%20%20%20%20%20%20%20selection%3D%22single%22%2C%0A%20%20%20%20%20%20%20%20page_size%3D25%2C%0A%20%20%20%20%20%20%20%20label%3D%22Factory%20rankings%20%E2%80%94%20click%20a%20row%20to%20drill%20down%22%2C%0A%20%20%20%20)%0A%20%20%20%20factory_table%0A%20%20%20%20return%20(factory_table%2C)%0A%0A%0A%40app.cell%0Adef%20_(factory_table%2C%20mo)%3A%0A%20%20%20%20%23%20Drill-down%3A%20which%20factory%20was%20clicked%3F%0A%20%20%20%20selected_factory%20%3D%20None%0A%20%20%20%20if%20factory_table.value%3A%0A%20%20%20%20%20%20%20%20selected_factory%20%3D%20factory_table.value%5B0%5D%5B%22factory%22%5D%0A%0A%20%20%20%20if%20not%20selected_factory%3A%0A%20%20%20%20%20%20%20%20drilldown_header%20%3D%20mo.md(%22_Click%20a%20factory%20row%20above%20to%20drill%20down._%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20drilldown_header%20%3D%20mo.md(f%22%23%23%20Drilldown%3A%20%7Bselected_factory%7D%22)%0A%20%20%20%20drilldown_header%0A%20%20%20%20return%20(selected_factory%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20selected_factory)%3A%0A%20%20%20%20score_range%20%3D%20mo.ui.range_slider(%0A%20%20%20%20%20%20%20%20start%3D0%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D%5B60%2C%20100%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Filter%20by%20composite%20score%22%2C%0A%20%20%20%20%20%20%20%20show_value%3DTrue%2C%0A%20%20%20%20)%0A%20%20%20%20sort_by%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22composite_score%22%2C%20%22ink_coverage%22%2C%20%22entropy%22%2C%20%22uniqueness%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22composite_score%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Sort%20by%22%2C%0A%20%20%20%20)%0A%20%20%20%20if%20selected_factory%3A%0A%20%20%20%20%20%20%20%20controls%20%3D%20mo.hstack(%5Bscore_range%2C%20sort_by%5D%2C%20gap%3D2%2C%20justify%3D%22start%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20controls%20%3D%20mo.md(%22%22)%0A%20%20%20%20controls%0A%20%20%20%20return%20score_range%2C%20sort_by%0A%0A%0A%40app.cell%0Adef%20_(lib%2C%20mo%2C%20score_range%2C%20selected_factory%2C%20sort_by)%3A%0A%20%20%20%20if%20not%20selected_factory%3A%0A%20%20%20%20%20%20%20%20grid%20%3D%20mo.md(%22%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20rows%20%3D%20lib.load_experiments(selected_factory)%0A%20%20%20%20%20%20%20%20lo%2C%20hi%20%3D%20score_range.value%0A%20%20%20%20%20%20%20%20rows%20%3D%20%5Br%20for%20r%20in%20rows%20if%20lo%20%3C%3D%20float(r%5B%22composite_score%22%5D)%20%3C%3D%20hi%5D%0A%20%20%20%20%20%20%20%20rows.sort(key%3Dlambda%20r%3A%20-float(r%5Bsort_by.value%5D))%0A%20%20%20%20%20%20%20%20rows%20%3D%20rows%5B%3A48%5D%20%20%23%20cap%20thumbnail%20grid%0A%0A%20%20%20%20%20%20%20%20if%20not%20rows%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20grid%20%3D%20mo.md(%22_No%20pieces%20in%20selected%20score%20range._%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cards%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20r%20in%20rows%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pid%20%3D%20r%5B%22id%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20png%20%3D%20lib.piece_path(pid%2C%20%22png%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20png.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uri%20%3D%20lib.png_data_uri(png)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20composite%20%3D%20float(r%5B%22composite_score%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20html%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22text-align%3Acenter%3B%20padding%3A4px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cimg%20src%3D%22%7Buri%7D%22%20style%3D%22width%3A100%25%3B%20max-width%3A160px%3B%20border%3A1px%20solid%20%23444%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-size%3A11px%3B%20font-family%3Amonospace%3B%20margin-top%3A2px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%7Bpid%7D%3Cbr%3E%7Bcomposite%3A.1f%7D'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cards.append(mo.Html(html))%0A%20%20%20%20%20%20%20%20%20%20%20%20grid%20%3D%20mo.md(f%22%23%23%23%20%7Blen(cards)%7D%20pieces%20shown%22)%20if%20not%20cards%20else%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%23%23%23%20%7Blen(cards)%7D%20pieces%20(top%20by%20%7Bsort_by.value%7D)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(cards%2C%20wrap%3DTrue%2C%20gap%3D1%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D)%0A%20%20%20%20grid%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20summaries)%3A%0A%20%20%20%20%23%20Bottleneck%20ranking%20sidebar%0A%20%20%20%20by_gain%20%3D%20sorted(summaries%2C%20key%3Dlambda%20fs%3A%20-fs%5B%22ceiling_gain%22%5D)%0A%20%20%20%20bottleneck_rows%20%3D%20%5B%5D%0A%20%20%20%20rank%20%3D%200%0A%20%20%20%20for%20bs%20in%20by_gain%5B%3A10%5D%3A%0A%20%20%20%20%20%20%20%20if%20bs%5B%22ceiling_gain%22%5D%20%3C%200.5%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20rank%20%2B%3D%201%0A%20%20%20%20%20%20%20%20bottleneck_rows.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rank%22%3A%20rank%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factory%22%3A%20bs%5B%22factory%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22current%22%3A%20bs%5B%22avg%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22potential%22%3A%20round(bs%5B%22avg%22%5D%20%2B%20bs%5B%22ceiling_gain%22%5D%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gain%22%3A%20f%22%2B%7Bbs%5B'ceiling_gain'%5D%3A.1f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22bottleneck%22%3A%20bs%5B%22weakest%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20bs%5B%22weakest_val%22%5D%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20Top%2010%20Bottlenecks%20(highest%20ROI%20fixes)%22)%2C%0A%20%20%20%20%20%20%20%20mo.ui.table(bottleneck_rows%2C%20selection%3DNone%2C%20page_size%3D10)%2C%0A%20%20%20%20%5D)%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
e81bef6a8ab94d94dbe1a66167fa51b9