%22%22%22Cycle%20Dashboard%20%E2%80%94%20THE%20WILD%20CARD.%0A%0AThe%20autoresearch%20loop%20as%20a%20single-screen%20interface.%0A-%20Current%20state%20(factory%20rankings%2C%20top%20bottleneck)%0A-%20Cycle%20history%20with%20score%20deltas%0A-%20Cumulative%20score%20graph%20over%20time%0A-%20One-button%20cycle%20execution%0A%0AThis%20is%20the%20public-facing%20dashboard%20for%20Edgeless%20Lab.%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%22Pen%20Plotter%20Autoresearch%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20csv%0A%20%20%20%20import%20json%0A%20%20%20%20from%20datetime%20import%20datetime%2C%20timezone%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20import%20sys%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%20csv%2C%20lib%2C%20mo%0A%0A%0A%40app.cell%0Adef%20_(lib)%3A%0A%20%20%20%20CYCLE_LOG_TSV%20%3D%20lib.AUTORESEARCH_DIR%20%2F%20%22cycle_log.tsv%22%0A%20%20%20%20CYCLE_LOG_HEADER%20%3D%20%22cycle_id%5Cttimestamp%5Ctfactory%5Ctaction%5Ctbaseline_avg%5Ctnew_avg%5Ctdelta%5Ctnotes%22%0A%20%20%20%20return%20(CYCLE_LOG_TSV%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.Html(%0A%20%20%20%20%20%20%20%20'%3Cdiv%20style%3D%22background%3Alinear-gradient(135deg%2C%230a0a0a%2C%231a1a1a)%3B%20'%0A%20%20%20%20%20%20%20%20'padding%3A32px%3B%20border-radius%3A8px%3B%20border%3A1px%20solid%20%23333%3B%22%3E'%0A%20%20%20%20%20%20%20%20'%3Ch1%20style%3D%22margin%3A0%3B%20font-size%3A32px%3B%20color%3A%23fff%3B%20'%0A%20%20%20%20%20%20%20%20'font-family%3Asystem-ui%2Csans-serif%3B%20letter-spacing%3A-0.5px%3B%22%3E'%0A%20%20%20%20%20%20%20%20'Pen%20Plotter%20Autoresearch'%0A%20%20%20%20%20%20%20%20'%3C%2Fh1%3E'%0A%20%20%20%20%20%20%20%20'%3Cp%20style%3D%22margin%3A8px%200%200%3B%20color%3A%23888%3B%20font-size%3A14px%3B%22%3E'%0A%20%20%20%20%20%20%20%20'Live%20optimization%20loop%20%C2%B7%2017%20factories%20%C2%B7%2016K%2B%20scored%20pieces'%0A%20%20%20%20%20%20%20%20'%3C%2Fp%3E'%0A%20%20%20%20%20%20%20%20'%3C%2Fdiv%3E'%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lib%2C%20mo)%3A%0A%20%20%20%20summaries%20%3D%20lib.all_factory_summaries()%0A%20%20%20%20for%20fs%20in%20summaries%3A%0A%20%20%20%20%20%20%20%20fs%5B%22ceiling_gain%22%5D%20%3D%20lib.ceiling_potential(fs)%0A%0A%20%20%20%20%23%20Global%20stats%0A%20%20%20%20total_pieces%20%3D%20sum(s%5B%22n%22%5D%20for%20s%20in%20summaries)%0A%20%20%20%20total_70%20%3D%20sum(s%5B%22over_70%22%5D%20for%20s%20in%20summaries)%0A%20%20%20%20total_80%20%3D%20sum(s%5B%22over_80%22%5D%20for%20s%20in%20summaries)%0A%20%20%20%20avg_of_avgs%20%3D%20sum(s%5B%22avg%22%5D%20*%20s%5B%22n%22%5D%20for%20s%20in%20summaries)%20%2F%20max(total_pieces%2C%201)%0A%20%20%20%20best_factory%20%3D%20max(summaries%2C%20key%3Dlambda%20s%3A%20s%5B%22best%22%5D)%0A%0A%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%22Factories%22%2C%20value%3Dstr(len(summaries)))%2C%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%22Pieces%22%2C%20value%3Df%22%7Btotal_pieces%3A%2C%7D%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%22Mean%22%2C%20value%3Df%22%7Bavg_of_avgs%3A.1f%7D%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%2270%2B%22%2C%20value%3Dstr(total_70))%2C%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%2280%2B%22%2C%20value%3Dstr(total_80))%2C%0A%20%20%20%20%20%20%20%20mo.stat(label%3D%22Best%22%2C%20value%3Df%22%7Bbest_factory%5B'best'%5D%3A.1f%7D%22%2C%20caption%3Dbest_factory%5B%22factory%22%5D)%2C%0A%20%20%20%20%5D%2C%20gap%3D2%2C%20justify%3D%22space-around%22)%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%20Top%205%20bottlenecks%20(the%20cycle's%20targets)%0A%20%20%20%20top5%20%3D%20sorted(summaries%2C%20key%3Dlambda%20s%3A%20-s%5B%22ceiling_gain%22%5D)%5B%3A5%5D%0A%20%20%20%20bn_html%20%3D%20'%3Cdiv%20style%3D%22background%3A%230f0f0f%3B%20padding%3A24px%3B%20border-radius%3A8px%3B%20border%3A1px%20solid%20%23333%3B%20margin-top%3A16px%3B%22%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Ch2%20style%3D%22margin%3A0%200%2016px%3B%20font-size%3A18px%3B%20color%3A%23fff%3B%22%3ENext%205%20Targets%20%C2%B7%20Highest%20ROI%20Fixes%3C%2Fh2%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Ctable%20style%3D%22width%3A100%25%3B%20border-collapse%3Acollapse%3B%20color%3A%23ccc%3B%20font-family%3Amonospace%3B%20font-size%3A13px%3B%22%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cthead%3E%3Ctr%20style%3D%22border-bottom%3A1px%20solid%20%23333%3B%22%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%2012px%3B%22%3E%23%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%2012px%3B%22%3Efactory%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aright%3B%20padding%3A8px%2012px%3B%22%3Ecurrent%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aright%3B%20padding%3A8px%2012px%3B%22%3E%E2%86%92%20potential%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aright%3B%20padding%3A8px%2012px%3B%22%3Egain%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%2012px%3B%22%3Ebottleneck%3C%2Fth%3E'%0A%20%20%20%20bn_html%20%2B%3D%20'%3C%2Ftr%3E%3C%2Fthead%3E%3Ctbody%3E'%0A%20%20%20%20for%20bn_i%2C%20bn_s%20in%20enumerate(top5%2C%201)%3A%0A%20%20%20%20%20%20%20%20bar_w%20%3D%20min(int(bn_s%5B%22ceiling_gain%22%5D%20*%208)%2C%20100)%0A%20%20%20%20%20%20%20%20bn_html%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%20style%3D%22border-bottom%3A1px%20solid%20%231a1a1a%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20color%3A%23666%3B%22%3E%7Bbn_i%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20color%3A%23fff%3B%22%3E%7Bbn_s%5B%22factory%22%5D%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20text-align%3Aright%3B%22%3E%7Bbn_s%5B%22avg%22%5D%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20text-align%3Aright%3B%20color%3A%234ade80%3B%22%3E%7Bbn_s%5B%22avg%22%5D%20%2B%20bn_s%5B%22ceiling_gain%22%5D%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20text-align%3Aright%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cspan%20style%3D%22display%3Ainline-block%3B%20width%3A%7Bbar_w%7Dpx%3B%20height%3A8px%3B%20'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'background%3Alinear-gradient(90deg%2C%234ade80%2C%2322c55e)%3B%20border-radius%3A2px%3B%20vertical-align%3Amiddle%3B%22%3E%3C%2Fspan%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%20%2B%7Bbn_s%5B%22ceiling_gain%22%5D%3A.1f%7D'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A10px%2012px%3B%20color%3A%23888%3B%22%3E%7Bbn_s%5B%22weakest%22%5D%7D%20%3D%20%7Bbn_s%5B%22weakest_val%22%5D%3A.3f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20bn_html%20%2B%3D%20'%3C%2Ftbody%3E%3C%2Ftable%3E%3C%2Fdiv%3E'%0A%20%20%20%20mo.Html(bn_html)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20summaries)%3A%0A%20%20%20%20%23%20Factory%20leaderboard%0A%20%20%20%20sorted_by_avg%20%3D%20sorted(summaries%2C%20key%3Dlambda%20fs%3A%20-fs%5B%22avg%22%5D)%0A%20%20%20%20lb_html%20%3D%20'%3Cdiv%20style%3D%22background%3A%230f0f0f%3B%20padding%3A24px%3B%20border-radius%3A8px%3B%20border%3A1px%20solid%20%23333%3B%20margin-top%3A16px%3B%22%3E'%0A%20%20%20%20lb_html%20%2B%3D%20'%3Ch2%20style%3D%22margin%3A0%200%2016px%3B%20font-size%3A18px%3B%20color%3A%23fff%3B%22%3EFactory%20Leaderboard%3C%2Fh2%3E'%0A%20%20%20%20lb_html%20%2B%3D%20'%3Cdiv%20style%3D%22display%3Agrid%3B%20grid-template-columns%3Arepeat(auto-fill%2C%20minmax(220px%2C1fr))%3B%20gap%3A12px%3B%22%3E'%0A%20%20%20%20for%20lb_s%20in%20sorted_by_avg%3A%0A%20%20%20%20%20%20%20%20%23%20Color%20tier%0A%20%20%20%20%20%20%20%20if%20lb_s%5B%22avg%22%5D%20%3E%3D%2075%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tier_color%20%3D%20%22%234ade80%22%0A%20%20%20%20%20%20%20%20elif%20lb_s%5B%22avg%22%5D%20%3E%3D%2068%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tier_color%20%3D%20%22%2322d3ee%22%0A%20%20%20%20%20%20%20%20elif%20lb_s%5B%22avg%22%5D%20%3E%3D%2062%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tier_color%20%3D%20%22%23fbbf24%22%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tier_color%20%3D%20%22%23f87171%22%0A%0A%20%20%20%20%20%20%20%20bar_pct%20%3D%20int((lb_s%5B%22avg%22%5D%20-%2050)%20%2F%2040%20*%20100)%0A%20%20%20%20%20%20%20%20bar_pct%20%3D%20max(0%2C%20min(100%2C%20bar_pct))%0A%0A%20%20%20%20%20%20%20%20lb_html%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22background%3A%231a1a1a%3B%20padding%3A14px%3B%20border-radius%3A6px%3B%20'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'border-left%3A3px%20solid%20%7Btier_color%7D%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22display%3Aflex%3B%20justify-content%3Aspace-between%3B%20align-items%3Abaseline%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-family%3Amonospace%3B%20font-size%3A13px%3B%20color%3A%23fff%3B%20font-weight%3A600%3B%22%3E%7Blb_s%5B%22factory%22%5D%7D%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-family%3Amonospace%3B%20font-size%3A18px%3B%20color%3A%7Btier_color%7D%3B%20font-weight%3A600%3B%22%3E%7Blb_s%5B%22avg%22%5D%3A.1f%7D%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22background%3A%230a0a0a%3B%20height%3A4px%3B%20border-radius%3A2px%3B%20margin%3A8px%200%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22background%3A%7Btier_color%7D%3B%20height%3A100%25%3B%20width%3A%7Bbar_pct%7D%25%3B%20border-radius%3A2px%3B%22%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-size%3A11px%3B%20color%3A%23666%3B%20font-family%3Amonospace%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'best%20%7Blb_s%5B%22best%22%5D%3A.1f%7D%20%C2%B7%20%7Blb_s%5B%22over_80%22%5D%7D%20pcs%20%E2%89%A580%20%C2%B7%20n%3D%7Blb_s%5B%22n%22%5D%7D'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20lb_html%20%2B%3D%20'%3C%2Fdiv%3E%3C%2Fdiv%3E'%0A%20%20%20%20mo.Html(lb_html)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(CYCLE_LOG_TSV%2C%20csv%2C%20mo)%3A%0A%20%20%20%20if%20CYCLE_LOG_TSV.exists()%3A%0A%20%20%20%20%20%20%20%20with%20open(CYCLE_LOG_TSV)%20as%20cl_fh%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cycle_log%20%3D%20list(csv.DictReader(cl_fh%2C%20delimiter%3D%22%5Ct%22))%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20cycle_log%20%3D%20%5B%5D%0A%0A%20%20%20%20if%20not%20cycle_log%3A%0A%20%20%20%20%20%20%20%20cycle_view%20%3D%20mo.md(%22%23%23%23%20Cycle%20History%5Cn%5Cn_No%20cycles%20logged%20yet.%20Run%20a%20cycle%20to%20start%20tracking._%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20recent%20%3D%20cycle_log%5B-10%3A%5D%5B%3A%3A-1%5D%0A%20%20%20%20%20%20%20%20cycle_html%20%3D%20'%3Cdiv%20style%3D%22background%3A%230f0f0f%3B%20padding%3A24px%3B%20border-radius%3A8px%3B%20border%3A1px%20solid%20%23333%3B%20margin-top%3A16px%3B%22%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Ch2%20style%3D%22margin%3A0%200%2016px%3B%20font-size%3A18px%3B%20color%3A%23fff%3B%22%3ERecent%20Cycles%3C%2Fh2%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Ctable%20style%3D%22width%3A100%25%3B%20border-collapse%3Acollapse%3B%20color%3A%23ccc%3B%20font-family%3Amonospace%3B%20font-size%3A12px%3B%22%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cthead%3E%3Ctr%20style%3D%22border-bottom%3A1px%20solid%20%23333%3B%22%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%3B%22%3Ewhen%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%3B%22%3Efactory%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%3B%22%3Eaction%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aright%3B%20padding%3A8px%3B%22%3Edelta%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3Cth%20style%3D%22text-align%3Aleft%3B%20padding%3A8px%3B%22%3Enotes%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3C%2Ftr%3E%3C%2Fthead%3E%3Ctbody%3E'%0A%20%20%20%20%20%20%20%20for%20c%20in%20recent%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20delta%20%3D%20float(c.get(%22delta%22%2C%200)%20or%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20ValueError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20delta%20%3D%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20color%20%3D%20%22%234ade80%22%20if%20delta%20%3E%200%20else%20(%22%23f87171%22%20if%20delta%20%3C%200%20else%20%22%23888%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20sign%20%3D%20%22%2B%22%20if%20delta%20%3E%200%20else%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%20style%3D%22border-bottom%3A1px%20solid%20%231a1a1a%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20color%3A%23666%3B%22%3E%7Bc.get(%22timestamp%22%2C%20%22%22)%5B%3A16%5D%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20color%3A%23fff%3B%22%3E%7Bc.get(%22factory%22%2C%20%22%22)%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%22%3E%7Bc.get(%22action%22%2C%20%22%22)%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%20color%3A%7Bcolor%7D%3B%22%3E%7Bsign%7D%7Bdelta%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20color%3A%23666%3B%22%3E%7Bc.get(%22notes%22%2C%20%22%22)%5B%3A60%5D%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20cycle_html%20%2B%3D%20'%3C%2Ftbody%3E%3C%2Ftable%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20cycle_view%20%3D%20mo.Html(cycle_html)%0A%20%20%20%20cycle_view%0A%20%20%20%20return%20(cycle_log%2C)%0A%0A%0A%40app.cell%0Adef%20_(cycle_log%2C%20mo)%3A%0A%20%20%20%20%23%20Cumulative%20score%20graph%20(sparkline-style)%0A%20%20%20%20if%20not%20cycle_log%3A%0A%20%20%20%20%20%20%20%20graph%20%3D%20mo.md(%22%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%23%20Build%20a%20simple%20inline%20SVG%20sparkline%20of%20new_avg%20over%20time%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20points%20%3D%20%5Bfloat(c.get(%22new_avg%22%2C%200)%20or%200)%20for%20c%20in%20cycle_log%20if%20c.get(%22new_avg%22)%5D%0A%20%20%20%20%20%20%20%20except%20ValueError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20points%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20if%20len(points)%20%3E%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20w%2C%20h%20%3D%20600%2C%2080%0A%20%20%20%20%20%20%20%20%20%20%20%20mn%2C%20mx%20%3D%20min(points)%2C%20max(points)%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20max(mx%20-%20mn%2C%200.1)%0A%20%20%20%20%20%20%20%20%20%20%20%20coords%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20graph_i%2C%20p%20in%20enumerate(points)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20graph_i%20%2F%20(len(points)%20-%201)%20*%20w%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%20%3D%20h%20-%20(p%20-%20mn)%20%2F%20rng%20*%20h%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20coords.append(f%22%7Bx%3A.1f%7D%2C%7By%3A.1f%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20path%20%3D%20%22M%20%22%20%2B%20%22%20L%20%22.join(coords)%0A%20%20%20%20%20%20%20%20%20%20%20%20svg%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22background%3A%230f0f0f%3B%20padding%3A24px%3B%20border-radius%3A8px%3B%20border%3A1px%20solid%20%23333%3B%20margin-top%3A16px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ch2%20style%3D%22margin%3A0%200%2016px%3B%20font-size%3A18px%3B%20color%3A%23fff%3B%22%3EScore%20Trajectory%3C%2Fh2%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Csvg%20viewBox%3D%220%200%20%7Bw%7D%20%7Bh%7D%22%20style%3D%22width%3A100%25%3B%20height%3A80px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cpath%20d%3D%22%7Bpath%7D%22%20fill%3D%22none%22%20stroke%3D%22%234ade80%22%20stroke-width%3D%222%22%2F%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fsvg%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22display%3Aflex%3B%20justify-content%3Aspace-between%3B%20font-family%3Amonospace%3B%20font-size%3A11px%3B%20color%3A%23666%3B%20margin-top%3A8px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cspan%3E%7Bmn%3A.1f%7D%3C%2Fspan%3E%3Cspan%3E%7Bmx%3A.1f%7D%3C%2Fspan%3E'%0A%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)%0A%20%20%20%20%20%20%20%20%20%20%20%20graph%20%3D%20mo.Html(svg)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20graph%20%3D%20mo.md(%22%22)%0A%20%20%20%20graph%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20---%0A%20%20%20%20_Cycle%20execution%20is%20run%20via%20CLI%20for%20now%20(%60python3.11%20audit_factories.py%60%2C%20edit%20factory%2C%20regen%2C%20score).%20Future%3A%20'Run%20cycle'%20button%20that%20orchestrates%20the%20full%20loop%20with%20logging%20back%20to%20cycle_log.tsv._%0A%20%20%20%20%22%22%22)%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
ab442ee715a88478736399e6f40679b5