%22%22%22Human-in-the-loop%20judge%20interface.%0A%0AShow%20pieces%20in%20a%20grid%2C%20click%201-5%20stars%20to%20rate%20them.%0ARatings%20save%20to%20human_judge_results.tsv%20and%20can%20be%20used%20as%20a%206th%20LLM%20judge%0Aor%20as%20training%20data%20for%20a%20learned%20judge%20model.%0A%0AWorkflow%3A%0A1.%20Pick%20a%20sampling%20strategy%20(random%20%2F%20top-N%20%2F%20by%20factory%20%2F%20disagreement)%0A2.%20Rate%20each%20piece%201-5%20stars%0A3.%20Submit%20batch%0A4.%20Ratings%20append%20to%20human_judge_results.tsv%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%22Human%20Judge%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%20random%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%20datetime%2C%20lib%2C%20mo%2C%20random%2C%20timezone%0A%0A%0A%40app.cell%0Adef%20_(lib)%3A%0A%20%20%20%20HUMAN_JUDGE_TSV%20%3D%20lib.AUTORESEARCH_DIR%20%2F%20%22human_judge_results.tsv%22%0A%20%20%20%20HUMAN_JUDGE_HEADER%20%3D%20%22id%5Cttimestamp%5Ctrating%5Ctrater%5Ctnotes%22%0A%20%20%20%20return%20HUMAN_JUDGE_HEADER%2C%20HUMAN_JUDGE_TSV%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20Human%20Judge%0A%0A%20%20%20%20Rate%20generated%20pieces%201-5%20stars.%20Ratings%20train%20a%206th%20judge%20that%20captures%20your%20personal%20aesthetic%20%E2%80%94%20useful%20where%20the%20algorithmic%20and%20LLM%20judges%20disagree.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lib%2C%20mo)%3A%0A%20%20%20%20strategy%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22random%22%2C%20%22top%20scored%22%2C%20%22lowest%20scored%22%2C%20%22by%20factory%22%2C%20%22disagreement%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22random%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Sampling%20strategy%22%2C%0A%20%20%20%20)%0A%20%20%20%20factory_filter%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22(any)%22%5D%20%2B%20lib.FACTORIES%2C%0A%20%20%20%20%20%20%20%20value%3D%22(any)%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Factory%20filter%22%2C%0A%20%20%20%20)%0A%20%20%20%20n_pieces%20%3D%20mo.ui.slider(4%2C%2024%2C%20value%3D12%2C%20label%3D%22Pieces%20to%20rate%22%2C%20show_value%3DTrue)%0A%20%20%20%20seed%20%3D%20mo.ui.number(value%3D0%2C%20start%3D0%2C%20stop%3D99999%2C%20label%3D%22Random%20seed%22)%0A%20%20%20%20sample_btn%20%3D%20mo.ui.run_button(label%3D%22Sample%20new%20batch%22)%0A%20%20%20%20mo.hstack(%5Bstrategy%2C%20factory_filter%2C%20n_pieces%2C%20seed%2C%20sample_btn%5D%2C%20gap%3D2%2C%20justify%3D%22start%22)%0A%20%20%20%20return%20factory_filter%2C%20n_pieces%2C%20sample_btn%2C%20seed%2C%20strategy%0A%0A%0A%40app.cell%0Adef%20_(factory_filter%2C%20lib%2C%20n_pieces%2C%20random%2C%20sample_btn%2C%20seed%2C%20strategy)%3A%0A%20%20%20%20%23%20Sample%20pieces%20based%20on%20strategy%0A%20%20%20%20sampled_ids%20%3D%20%5B%5D%0A%20%20%20%20if%20sample_btn.value%3A%0A%20%20%20%20%20%20%20%20factory%20%3D%20None%20if%20factory_filter.value%20%3D%3D%20%22(any)%22%20else%20factory_filter.value%0A%20%20%20%20%20%20%20%20all_rows%20%3D%20lib.load_experiments(factory)%0A%20%20%20%20%20%20%20%20all_rows%20%3D%20%5Br%20for%20r%20in%20all_rows%20if%20r%5B%22kept%22%5D%20%3D%3D%20%22yes%22%5D%0A%0A%20%20%20%20%20%20%20%20if%20strategy.value%20%3D%3D%20%22random%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20random.Random(seed.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20sampled%20%3D%20rng.sample(all_rows%2C%20min(n_pieces.value%2C%20len(all_rows)))%0A%20%20%20%20%20%20%20%20elif%20strategy.value%20%3D%3D%20%22top%20scored%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20sampled%20%3D%20sorted(all_rows%2C%20key%3Dlambda%20r%3A%20-float(r%5B%22composite_score%22%5D))%5B%3An_pieces.value%5D%0A%20%20%20%20%20%20%20%20elif%20strategy.value%20%3D%3D%20%22lowest%20scored%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20sampled%20%3D%20sorted(all_rows%2C%20key%3Dlambda%20r%3A%20float(r%5B%22composite_score%22%5D))%5B%3An_pieces.value%5D%0A%20%20%20%20%20%20%20%20elif%20strategy.value%20%3D%3D%20%22by%20factory%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20One%20per%20factory%0A%20%20%20%20%20%20%20%20%20%20%20%20seen_cats%20%3D%20set()%0A%20%20%20%20%20%20%20%20%20%20%20%20sampled%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20r%20in%20sorted(all_rows%2C%20key%3Dlambda%20r%3A%20-float(r%5B%22composite_score%22%5D))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20r%5B%22category%22%5D%20not%20in%20seen_cats%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seen_cats.add(r%5B%22category%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sampled.append(r)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(sampled)%20%3E%3D%20n_pieces.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%3A%20%20%23%20disagreement%20(placeholder%20%E2%80%94%20would%20need%20LLM%20scores%20per%20piece)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20For%20now%2C%20use%20middle-scoring%20pieces%20(50-70%20range)%20as%20proxy%0A%20%20%20%20%20%20%20%20%20%20%20%20mid%20%3D%20%5Br%20for%20r%20in%20all_rows%20if%2050%20%3C%3D%20float(r%5B%22composite_score%22%5D)%20%3C%3D%2070%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20random.Random(seed.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20sampled%20%3D%20rng.sample(mid%2C%20min(n_pieces.value%2C%20len(mid)))%0A%0A%20%20%20%20%20%20%20%20sampled_ids%20%3D%20%5Br%5B%22id%22%5D%20for%20r%20in%20sampled%5D%0A%20%20%20%20return%20(sampled_ids%2C)%0A%0A%0A%40app.cell%0Adef%20_(lib%2C%20mo%2C%20sampled_ids)%3A%0A%20%20%20%20%23%20Render%20rating%20widgets%0A%20%20%20%20if%20not%20sampled_ids%3A%0A%20%20%20%20%20%20%20%20rating_grid%20%3D%20mo.md(%22_Click%20'Sample%20new%20batch'%20to%20load%20pieces._%22)%0A%20%20%20%20%20%20%20%20ratings_dict%20%3D%20%7B%7D%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20ratings_dict%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sample_pid%3A%20mo.ui.slider(0%2C%205%2C%20value%3D0%2C%20label%3Df%22%E2%AD%90%20%7Bsample_pid%7D%22%2C%20show_value%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20sample_pid%20in%20sampled_ids%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20sample_cards%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.Html(%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%22%3E%3Cimg%20src%3D%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%7Blib.png_data_uri(lib.piece_path(sample_pid%2C%20%22png%22))%7D%22%20'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'style%3D%22width%3A100%25%3B%20max-width%3A200px%3B%20border%3A1px%20solid%20%23444%3B%22%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ratings_dict%5Bsample_pid%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D0.5)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20sample_pid%20in%20sampled_ids%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20lib.piece_path(sample_pid%2C%20%22png%22).exists()%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20rating_grid%20%3D%20mo.hstack(sample_cards%2C%20wrap%3DTrue%2C%20gap%3D1%2C%20justify%3D%22start%22)%0A%20%20%20%20rating_grid%0A%20%20%20%20return%20(ratings_dict%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20ratings_dict)%3A%0A%20%20%20%20if%20ratings_dict%3A%0A%20%20%20%20%20%20%20%20submit_btn%20%3D%20mo.ui.run_button(label%3D%22%F0%9F%92%BE%20Save%20ratings%22)%0A%20%20%20%20%20%20%20%20rater_name%20%3D%20mo.ui.text(value%3D%22djm%22%2C%20label%3D%22Rater%22)%0A%20%20%20%20%20%20%20%20notes%20%3D%20mo.ui.text(value%3D%22%22%2C%20label%3D%22Notes%20(optional)%22)%0A%20%20%20%20%20%20%20%20controls%20%3D%20mo.hstack(%5Brater_name%2C%20notes%2C%20submit_btn%5D%2C%20gap%3D2%2C%20justify%3D%22start%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20submit_btn%20%3D%20mo.ui.run_button(label%3D%22(no%20pieces)%22)%0A%20%20%20%20%20%20%20%20rater_name%20%3D%20mo.ui.text(value%3D%22djm%22)%0A%20%20%20%20%20%20%20%20notes%20%3D%20mo.ui.text(value%3D%22%22)%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%20notes%2C%20rater_name%2C%20submit_btn%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20HUMAN_JUDGE_HEADER%2C%0A%20%20%20%20HUMAN_JUDGE_TSV%2C%0A%20%20%20%20datetime%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20notes%2C%0A%20%20%20%20rater_name%2C%0A%20%20%20%20ratings_dict%2C%0A%20%20%20%20submit_btn%2C%0A%20%20%20%20timezone%2C%0A)%3A%0A%20%20%20%20save_msg%20%3D%20mo.md(%22%22)%0A%20%20%20%20if%20submit_btn.value%20and%20ratings_dict%3A%0A%20%20%20%20%20%20%20%20%23%20Append%20non-zero%20ratings%20to%20TSV%0A%20%20%20%20%20%20%20%20rated%20%3D%20%5B(rate_pid%2C%20slider.value)%20for%20rate_pid%2C%20slider%20in%20ratings_dict.items()%20if%20slider.value%20%3E%200%5D%0A%20%20%20%20%20%20%20%20if%20rated%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20HUMAN_JUDGE_TSV.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HUMAN_JUDGE_TSV.write_text(HUMAN_JUDGE_HEADER%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20ts%20%3D%20datetime.now(timezone.utc).strftime(%22%25Y-%25m-%25dT%25H%3A%25M%3A%25SZ%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20open(HUMAN_JUDGE_TSV%2C%20%22a%22)%20as%20out_fh%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20rate_pid%2C%20rating%20in%20rated%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out_fh.write(f%22%7Brate_pid%7D%5Ct%7Bts%7D%5Ct%7Brating%7D%5Ct%7Brater_name.value%7D%5Ct%7Bnotes.value%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20save_msg%20%3D%20mo.md(f%22%E2%9C%85%20Saved%20%7Blen(rated)%7D%20ratings%20to%20%60%7BHUMAN_JUDGE_TSV.name%7D%60%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20save_msg%20%3D%20mo.md(%22%E2%9A%A0%EF%B8%8F%20No%20ratings%20to%20save%20(all%20sliders%20at%200)%22)%0A%20%20%20%20save_msg%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(HUMAN_JUDGE_TSV%2C%20csv%2C%20mo)%3A%0A%20%20%20%20%23%20Show%20running%20totals%0A%20%20%20%20if%20HUMAN_JUDGE_TSV.exists()%3A%0A%20%20%20%20%20%20%20%20with%20open(HUMAN_JUDGE_TSV)%20as%20stats_fh%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20stats_rows%20%3D%20list(csv.DictReader(stats_fh%2C%20delimiter%3D%22%5Ct%22))%0A%20%20%20%20%20%20%20%20if%20stats_rows%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20stats_n%20%3D%20len(stats_rows)%0A%20%20%20%20%20%20%20%20%20%20%20%20stats_avg%20%3D%20sum(int(r%5B%22rating%22%5D)%20for%20r%20in%20stats_rows)%20%2F%20stats_n%0A%20%20%20%20%20%20%20%20%20%20%20%20stats_5%20%3D%20sum(1%20for%20r%20in%20stats_rows%20if%20int(r%5B%22rating%22%5D)%20%3D%3D%205)%0A%20%20%20%20%20%20%20%20%20%20%20%20stats%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%23%23%20Running%20totals%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20**Total%20ratings**%3A%20%7Bstats_n%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20**Average%20rating**%3A%20%7Bstats_avg%3A.2f%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20**5-star%20pieces**%3A%20%7Bstats_5%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20stats%20%3D%20mo.md(%22_No%20ratings%20yet._%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20stats%20%3D%20mo.md(%22_No%20ratings%20yet._%22)%0A%20%20%20%20stats%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
24eb00cfdc56f6f34a8ce3e6ccbf4243