diff --git "a/index.html" "b/index.html" --- "a/index.html" +++ "b/index.html" @@ -3,14 +3,14 @@ -Decision Index 0.2.1 - +Decision Index 0.3 + - - + + - + @@ -162,10 +162,24 @@ svg circle.pt.hot{stroke:#232323;stroke-width:3.5;opacity:1} .pt:hover{stroke-width:3} .pt.a-ar,.bar.a-ar{fill:var(--ar)}.pt.a-diff,.bar.a-diff{fill:var(--diff)}.pt.a-enc,.bar.a-enc{fill:var(--enc)}.pt.a-gli,.bar.a-gli{fill:var(--gli)}.pt.a-other,.bar.a-other{fill:#bbb}.pt.a-jev,.bar.a-jev{fill:var(--jev)} .bar{stroke:var(--ink);stroke-width:1.5;cursor:pointer} -.tip{position:absolute;z-index:10;pointer-events:none;background:var(--surface);border:2px solid var(--ink);border-radius:10px;box-shadow:4px 4px 0 var(--ink);padding:10px 12px;font-size:13px;min-width:200px} +.tip .tiprow{white-space:nowrap;font-variant-numeric:tabular-nums;gap:14px}.tip .tiprow b{font-weight:500}.tip .rustv{font-weight:600} +@media (max-width:640px){.tip .tiprow{align-items:flex-start}.tip .tiprow b{white-space:normal;text-align:right}.tip .bctx{display:block}.tip .chip{margin-left:0;display:inline-block;margin-top:2px}}.tip .bctx{color:var(--soft);font-weight:400;font-size:10.5px}.tip .chip{font-style:normal;font-size:9.5px;letter-spacing:.03em;text-transform:uppercase;border:1px solid currentColor;border-radius:999px;padding:0 6px;margin-left:7px;font-weight:500;vertical-align:1px}.tip .tipnote{white-space:normal}.tip{width:max-content;max-width:min(450px,100%);position:absolute;z-index:10;pointer-events:none;background:var(--surface);border:2px solid var(--ink);border-radius:10px;box-shadow:4px 4px 0 var(--ink);padding:10px 12px;font-size:13px;min-width:200px} .tip strong{display:block;font-size:14px;margin-bottom:6px} +.wninfo{margin-left:5px}.wninfo .info{width:15px;height:15px;font-size:9.5px}.wninfo .tipbox{width:200px;left:0;right:auto;top:20px;font-weight:400;text-transform:none;letter-spacing:0} +.tiprow.hl span,.tiprow.hl b{color:#E8740C;font-weight:700} +.mini.haspv li{grid-template-columns:18px minmax(0,1fr) 60px 42px 42px 0}.mini .pv{font-family:var(--mono);font-size:11.5px;color:var(--soft);text-align:right;min-width:36px}.pvhead{display:flex;justify-content:flex-end;gap:14px;font-family:var(--mono);font-size:10px;color:var(--soft);text-transform:uppercase;letter-spacing:.05em;margin:0 8px -2px 0}.pvhead span:first-child{width:46px;text-align:right}.pvhead span:last-child{width:42px;text-align:right} +@media (max-width:640px){.mini .pv,.pvhead,th.pvc,td.pvc,.pvnote{display:none}.mini.haspv li{grid-template-columns:18px minmax(0,1fr) 70px 46px 0}} +.orglogo{width:16px;height:16px;border-radius:50%;box-shadow:0 0 0 1.5px #fff,0 0 0 2.5px var(--line);vertical-align:-3px;margin-right:6px;flex:none;object-fit:cover;background:#fff}.orglogo.ohero{width:.62em;height:.62em;vertical-align:.08em;margin-right:.22em} +.kgap.kwarn{background:repeating-linear-gradient(135deg,rgba(176,96,58,.7) 0 2px,rgba(240,214,190,.9) 2px 4.5px)} +@media (max-width:640px){.v3key{justify-content:flex-start}} +.pcwrap{max-width:min(300px,calc(100vw - 48px))}.pcwrap .tipnote{white-space:normal} +.pchead{font-weight:700;font-size:13px;margin:4px 0 6px}.pchead.up{color:#B0603A} +.dstrip{display:block;width:100%;max-width:280px;height:auto;margin:2px 0 4px}.dsl{font-family:var(--mono);font-size:10px}.dsv{font-family:var(--mono);font-size:9.5px;font-weight:600;paint-order:stroke;stroke:#FBF8F1;stroke-width:3px}.tipnote.nd{margin-top:2px} +.dv{position:relative;margin:2px 0 6px;padding-top:15px;width:min(280px,calc(100vw - 72px))}.dvfull{position:absolute;top:0;left:50%;transform:translateX(-50%);font-family:var(--mono);font-size:10px;font-weight:600;white-space:nowrap}.dvline{position:absolute;left:50%;top:13px;bottom:0;border-left:1.5px dashed var(--ink)} +.dvr{margin-top:3px}.dvl{display:flex;gap:6px;align-items:baseline;font-family:var(--mono);font-size:10.5px;line-height:1.2}.dvl em{font-style:normal;color:var(--soft);font-size:10px} +.dvt{position:relative;height:10px;margin-top:2px}.dvt i{position:absolute;top:0;bottom:0;border-radius:2px}.dvt b{position:absolute;top:-2px;font-family:var(--mono);font-size:10px;font-weight:600;white-space:nowrap} .tiprow{display:flex;justify-content:space-between;gap:16px;font-family:var(--mono);font-size:11.5px;color:var(--soft)} -.tiprow b{color:var(--ink);font-weight:500} +.tiprow b{white-space:nowrap;color:var(--ink);font-weight:500} .newtag rect{fill:#FFD21E;stroke:#232323;stroke-width:1}.newtag text{font-family:var(--mono);font-size:7.5px;font-weight:600;letter-spacing:.06em;fill:#232323} .pill.newpill{background:#FFD21E;color:#232323;font-size:9.5px;padding:0 6px;margin-left:6px;vertical-align:2px} .tiprow b.tipbase{text-align:right;max-width:220px;overflow-wrap:anywhere} @@ -198,6 +212,8 @@ td{padding:13px 14px;border-bottom:1px solid var(--line);vertical-align:top;font tbody tr:last-child td{border-bottom:0} tbody tr:hover{background:#FFFCEF} tr.jev{background:#F3EFE3} +@media (min-width:641px){#table th,#table td{padding-left:8px;padding-right:8px}} +@media (max-width:640px){#table th:nth-child(1),#table td:nth-child(1){position:sticky;left:0;z-index:2;background:var(--surface);min-width:34px;width:34px}#table th:nth-child(2),#table td:nth-child(2){position:sticky;left:34px;z-index:2;background:var(--surface);min-width:132px;max-width:150px;white-space:normal;box-shadow:2px 0 0 var(--line)}#table tr.jev td:nth-child(1),#table tr.jev td:nth-child(2){background:#F3EFE3}#table td:nth-child(2) .bm-sub,#table td:nth-child(2) .variant{display:none}.cat-grid td .bm-sub{display:none}} tr.jev td{border-bottom:2px solid var(--ink)} .rank{font-family:var(--display);font-size:16px;color:var(--soft)} .bm{font-weight:700;font-size:16px;display:flex;align-items:center;gap:9px} @@ -259,7 +275,7 @@ footer a{color:var(--soft)} .model-main .tiles{margin-bottom:0} .standings{background:var(--surface);border:2px solid var(--ink);border-radius:14px;box-shadow:5px 5px 0 var(--ink);overflow:hidden;position:sticky;top:16px;margin-top:22px} .st-head{font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:10px 14px;background:var(--yellow);border-bottom:2px solid var(--ink);display:flex;justify-content:space-between} -.st-list{max-height:226px;overflow-y:auto} +.st-list{max-height:226px;overflow-y:auto;position:relative} .st-row{display:grid;grid-template-columns:24px 11px minmax(0,1fr) auto;align-items:center;gap:8px;padding:7px 12px;text-decoration:none;font-size:13.5px;border-bottom:1px solid var(--line)} .st-row:last-child{border-bottom:0} .st-row:hover{background:#FFFCEF} @@ -269,7 +285,6 @@ footer a{color:var(--soft)} .st-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .st-val{font-family:var(--mono);font-size:12px} .gap{display:block;margin-top:5px;font-family:var(--mono);font-size:10.5px;color:var(--red);line-height:1.45;white-space:normal} -.gapnote{margin-top:5px;font-family:var(--mono);font-size:11px;color:var(--soft);white-space:normal;max-width:320px;line-height:1.45} @media (max-width:980px){.model-top{grid-template-columns:1fr}.standings{position:static}.st-list{max-height:280px}} .pcat{background:var(--surface);border:2px solid var(--ink);border-radius:12px;padding:14px 14px;box-shadow:4px 4px 0 var(--ink);min-width:0} .pcat h3{margin:0 0 3px;font-size:15px;font-weight:700;line-height:1.25} @@ -331,7 +346,13 @@ footer a{color:var(--soft)} .mini li.jev{font-weight:700} .mini .rk{font-family:var(--display);font-size:12px;color:var(--soft);text-align:right} .mini .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.mini .mbar{height:8px;border:1.5px solid var(--ink);border-radius:4px;background:#fff;overflow:hidden}.mini .mbar i{display:block;height:100%} +.bc-note{margin:0 0 6px;font-family:var(--mono);font-size:10.5px;color:var(--soft)} +.mini .mbar{position:relative;height:8px;border:1.5px solid var(--ink);border-radius:4px;background:#fff;overflow:hidden}.mini .mbar i{display:block;height:100%} +.mini .mbar u.gapseg{position:absolute;top:0;bottom:0;min-width:4px;background:#B0603A;opacity:.9;cursor:help;text-decoration:none} +.mini li.plus{grid-template-columns:18px minmax(0,1fr) 56px 46px 46px} +.mini li.mhd{font-family:var(--mono);font-size:9.5px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em;margin-bottom:-2px} +.mini .pv{color:var(--soft)} +.mini .pv.rust{color:#B0603A;font-weight:600} .mini .v{font-family:var(--mono);font-size:11px;text-align:right} .bc-more{font-family:var(--mono);font-size:11px;color:var(--soft)} dialog#benchdlg{border:2.5px solid var(--ink);border-radius:16px;box-shadow:8px 8px 0 var(--ink);background:var(--bg);padding:0;width:min(960px,94vw);max-height:90vh;color:var(--ink)} @@ -352,6 +373,7 @@ body:has(dialog#benchdlg[open]){overflow:hidden} @media (max-width:600px){.bgrid{grid-template-columns:1fr}} .table-scroll{overflow-x:auto} .cat-grid table td:first-child{width:32%;min-width:210px} +@media (max-width:640px){.cat-grid table td:first-child{min-width:120px;width:auto}.cat-grid table td{padding:10px 6px}.cat-grid .table-scroll{overflow-x:auto}} .cat-grid table td{padding:12px 10px}.cat-grid table th{padding:11px 10px} .cat-grid table .score,.cat-grid table .gain,.cat-grid table .mono{white-space:nowrap} .cat-grid table td.base small{white-space:normal;max-width:150px;margin-left:auto} @@ -363,6 +385,148 @@ body:has(dialog#benchdlg[open]){overflow:hidden} @media (max-width:640px){main,.container{padding:0 16px 60px}.subnav{margin:0 -16px 18px;gap:6px 16px;font-size:11px}.tiles,.tiles.four,.profile{grid-template-columns:repeat(2,1fr);gap:10px}.tile{padding:13px 14px}.tile b{font-size:26px;white-space:normal;overflow:visible}.hero p{font-size:16px;line-height:1.45}.head{margin-top:36px} .model-main .hero h1{font-size:clamp(34px,10vw,52px)}.model-main .hero p{margin-top:14px}.who{gap:6px}.who .pill{font-size:10.5px;padding:3px 9px;max-width:100%;white-space:normal;text-align:center}.cta{gap:8px;margin-top:14px}.btn{font-size:12px;padding:8px 14px} .crumbs{margin-top:14px;font-size:11.5px}.crumbs .nav a{margin-left:10px}} +.switch button{font:inherit;letter-spacing:inherit;text-transform:inherit;background:none;border:0;cursor:pointer;padding:6px 18px;border-radius:999px;color:var(--soft)} +.switch button.on{background:var(--yellow);color:var(--ink);font-weight:500} +.switch button:not(.on):hover{color:var(--ink)} +.switch button:focus-visible{outline:3px solid var(--blue);outline-offset:1px} +.bar.gh{stroke:none} +.rlegend i{background-clip:padding-box} +.barchg{font-family:var(--mono);font-size:9.5px;fill:#6B6863} +.subboards{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin:0 0 6px} +.subcard{background:var(--surface);border:2px solid var(--ink);border-radius:12px;padding:18px 20px;box-shadow:4px 4px 0 var(--ink);min-width:0;position:relative} +.subcard h3{font-family:var(--display);font-weight:400;font-size:26px;margin:10px 0 4px;line-height:1.1} +.subcard p{margin:0;font-size:15px;color:var(--soft);line-height:1.5} +.subcard .big{font-family:var(--display);font-size:40px;line-height:1.1;margin-top:14px} +.subcard .big small{display:block;font-family:var(--mono);font-size:11.5px;color:var(--soft);letter-spacing:.03em;margin-top:2px} +.pill.soon{background:var(--yellow)} +.formula{display:block;font-family:var(--mono);font-size:12.5px;background:#F3F0E8;border:1.5px solid var(--line);border-radius:8px;padding:9px 12px;margin:14px auto 0;max-width:760px;color:var(--ink);text-align:left} +.tbright{display:flex;flex-direction:column;align-items:flex-end;gap:10px;min-width:0;max-width:100%} +.tbright .legend{justify-content:flex-end;padding-top:0} +.v3ctl{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end} +.v3cap{font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--soft)} +#summary .charts{margin-top:14px} +@media (min-width:641px){.toolbar{flex-wrap:nowrap}.toolbar>.sizebar{flex:0 1 430px}.toolbar>.tbright{flex:1 1 0;min-width:0}.tbright .legend{justify-content:flex-end}} +@media (max-width:640px){.tbright{align-items:flex-start;width:100%}.v3key{justify-content:flex-start}.tbright .legend{justify-content:flex-start}.v3ctl{justify-content:flex-start}} +.v3bar{display:flex;justify-content:space-between;align-items:center;gap:14px 18px;flex-wrap:wrap;padding:16px 22px 12px} +.v3key{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px 16px;font-family:var(--mono);font-size:11.5px;color:var(--soft);align-items:center} +.v3key span{display:inline-flex;align-items:center;gap:6px} +.v3key i{width:18px;height:9px;border-radius:2px;display:inline-block} +.v3note{font-size:14px;color:var(--soft);margin:0;padding:0 22px 12px;max-width:760px} +.v3t td{vertical-align:middle} +.v3t table{min-width:820px} +.v3t .bm{flex-wrap:wrap} +.v3t .chg{font-family:var(--mono);font-size:12px;color:var(--soft);white-space:nowrap} +.v3t .chg b{color:var(--ink);font-weight:500} +.v3t td.on{background:#FFF8D6} +.gapgrid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:26px;align-items:start} +.gapgrid figure{margin:0;min-width:0;background:#F3F0E8;border:1.5px solid var(--line);border-radius:12px;padding:14px 16px 8px} +.gapgrid figcaption{font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--soft);margin-bottom:8px} +.gapgrid svg{width:100%;height:auto;overflow:visible;display:block} +.gapgrid h3{margin:0 0 4px;font-size:16px} +.gapgrid p{margin:0 0 12px;font-size:15px;color:var(--soft);line-height:1.55} +.gapgrid .fignote{font-family:var(--mono);font-size:10.5px;color:var(--soft);margin:4px 0 6px} +.gpt{stroke:var(--ink);stroke-width:1.5} +.gapwrap .ptlab{paint-order:stroke;stroke:#F3F0E8;stroke-width:3.5px;stroke-linejoin:round;font-size:11px} +.gapwrap.panel.pad{padding:14px 20px 8px} +.gapgrid figure{padding:10px 14px 4px} +.gpt.in{fill:#8F8B82} +.gpt.out{fill:#D9A94E} +.gaptip.tt{font-family:var(--mono);font-size:11.5px;line-height:1.5;max-width:min(340px,calc(100vw - 16px))} +.gaptip{position:fixed;z-index:60;max-width:min(320px,calc(100vw - 16px));background:var(--surface);border:2px solid var(--ink);border-radius:10px;box-shadow:4px 4px 0 var(--ink);padding:10px 12px;font-size:13px;line-height:1.45;pointer-events:none} +.v3model .tiles{margin:0} +.v3model{padding:18px 22px 20px} +.v3model .gaprow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:16px 0 8px} +.v3model p{margin:8px 0 0;font-size:15px;color:var(--soft);max-width:760px} +@media (max-width:900px){.gapgrid{grid-template-columns:1fr}.subboards{grid-template-columns:1fr}} +@media (max-width:640px){.v3bar{padding:14px 14px 10px}.v3note{padding:0 14px 12px}.v3model{padding:14px}} +.cats .cat{min-width:0} +#vcats{grid-template-columns:1fr} +.cat.vradar{display:grid;grid-template-columns:minmax(0,56fr) minmax(0,44fr);grid-template-areas:"radar head" "radar side";column-gap:30px;align-items:center} +.vradar .vrhead{grid-area:head;align-self:end}.vradar .vrradar{grid-area:radar;max-width:380px;width:100%;justify-self:center}.vradar .vrside{grid-area:side;align-self:start;max-width:440px}.vradar .vrhead h3{font-size:20px}.vradar .rlegend a,.vradar .rlegend span.row{font-size:14.5px} +@media (max-width:760px){.cat.vradar{grid-template-columns:1fr;grid-template-areas:"head" "radar" "side"}} +#vcats .vaxlab{font-family:var(--mono)} +.vaxlab{cursor:help} +.vbwhat{margin:6px 0 0;font-size:13px;color:var(--soft);line-height:1.4} +.vbex{margin:4px 0;font-size:15px;max-width:720px} +.vbex b{font-weight:600} +.modebar{display:flex;justify-content:center;margin:18px 0 0} +.switch.modesw{padding:5px;box-shadow:4px 4px 0 var(--ink);font-size:17px;letter-spacing:.05em} +.switch.modesw button{display:inline-flex;align-items:center;gap:9px;padding:10px 28px} +.switch.modesw svg{width:20px;height:20px;flex:none} +@media (max-width:640px){.switch.modesw{font-size:15px}.switch.modesw button{padding:9px 20px;gap:7px}.switch.modesw svg{width:18px;height:18px}} +.vnotes{margin:6px 22px 4px;padding-left:18px;font-size:14px;color:var(--soft);line-height:1.55}.vnotes li{margin:4px 0}.vnotes b{color:var(--ink)} +table.vt{min-width:640px} +.halo{paint-order:stroke;stroke:#F3F0E8;stroke-width:4px;stroke-linejoin:round} +.kdash{width:16px;height:0;border-top:2px dashed #8F8B82;display:inline-block} +.v3note a{color:var(--ink)} +.tip .tipwhy{color:var(--ink);border-left:3px solid #B0603A;padding-left:7px;white-space:normal} +.explain{padding:20px 22px 10px} +.steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px} +.step{border-left:4px solid var(--yellow);padding:2px 0 2px 14px} +.contrib{margin:14px 0 2px} +.cbar{display:flex;gap:2px;height:14px;border-radius:4px;overflow:hidden} +.cbar .seg{display:block;min-width:2px} +.step b{display:block;font-size:16px} +.step .wt{display:block;font-family:var(--mono);font-size:11px;color:var(--soft);margin-top:2px} +.step p{margin:6px 0 0;font-size:14.5px;color:var(--soft);line-height:1.5} +.explfig{margin:10px 0 0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.explfig svg{width:100%;max-width:300px;height:auto;display:block;margin:6px auto 0} +.ex{border:1.5px solid var(--line);border-radius:12px;background:#F3F0E8;padding:12px 14px 10px;min-width:0;display:grid;grid-template-rows:auto auto 1fr;align-content:start} +.exhead{display:flex;flex-direction:column;align-items:flex-start;min-height:96px} +.extag{justify-self:start;display:inline-block;font-family:var(--mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase;border:1.5px solid var(--soft);color:var(--soft);border-radius:999px;padding:1px 8px} +.ex .halo{stroke:#F3F0E8} +.extag.rust{border-color:#B0603A;color:#B0603A} +.exname{display:block;font-size:15px;margin-top:6px} +.exbase{display:block;font-family:var(--mono);font-size:10.5px;color:var(--soft);line-height:1.4} +.exwhy{margin:4px 0 0;font-size:13.5px;color:var(--ink);line-height:1.45} +@media (max-width:900px){.explfig{grid-template-columns:1fr}} +.tally{border-top:1px solid var(--line);padding-top:10px} +.learn{margin-top:18px;padding:0} +.learn>summary{cursor:pointer;padding:14px 22px;font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;text-transform:uppercase;list-style:none;display:flex;align-items:center;gap:10px} +.learn>summary::-webkit-details-marker{display:none} +.learn>summary::before{content:'+';display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:1.5px solid var(--ink);border-radius:50%;background:var(--yellow);font-size:14px} +.learn[open]>summary::before{content:'−'} +.learn>*:not(summary){margin-left:22px;margin-right:22px} +.learn>.gapgrid{margin-bottom:18px} +.learn .fignote{font-family:var(--mono);font-size:11px;color:var(--soft);line-height:1.5} +.onewrap{display:grid;grid-template-columns:3fr 2fr;gap:22px;align-items:center} +.onemuted{display:block;margin-top:8px;font-size:12.5px;color:var(--muted)} +.onenote{margin:0;font-size:14.5px;color:var(--soft);line-height:1.55} +@media (max-width:760px){.onewrap{grid-template-columns:1fr}} +.onechart{margin:0;min-width:0;background:#F3F0E8;border:1.5px solid var(--line);border-radius:12px;padding:10px 12px 4px}.onechart svg{width:100%;height:auto;display:block} +.twin2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.twin2 figure{margin:0;min-width:0;background:#F3F0E8;border:1.5px solid var(--line);border-radius:12px;padding:10px 12px 4px}.twin2 svg{width:100%;height:auto;display:block} +.gch{font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--soft);margin-bottom:6px} +.twinnote{margin-top:8px!important;font-size:11.5px!important} +@media (max-width:900px){.twin2{grid-template-columns:1fr}} +.learn .lh{font-size:16px;margin:22px 22px 8px} +#learn{scroll-margin-top:52px} +@media (max-width:640px){.learn>*:not(summary){margin-left:10px;margin-right:10px}.learn .lh{margin:18px 10px 8px}.learn>summary{padding:12px 12px}.learn .gapgrid figure{padding:6px 4px 4px}} +.linkbtn{font-family:var(--mono);font-size:12px;background:none;border:0;border-bottom:2px solid var(--yellow);padding:0;cursor:pointer;color:var(--ink)} +.linkbtn:hover{background:var(--yellow)} +#gapcap:empty{display:none} +.vsbase{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:22px;align-items:start;margin-top:18px;border-top:1px solid var(--line);padding-top:16px} +.vsbase.one{grid-template-columns:1fr} +.vsbase h3{margin:0;font-size:17px} +.vsbase .fignote{font-family:var(--mono);font-size:10.5px;color:var(--soft);margin:4px 0 0;line-height:1.45} +.vsbase .bname{font-family:var(--mono);font-size:12px;color:var(--soft);margin:2px 0 10px} +.vsbase figure{margin:0;min-width:0}.vsbase svg{width:100%;height:auto;display:block} +.btab{display:grid;grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,.8fr));gap:5px 10px;font-family:var(--mono);font-size:12.5px;align-items:baseline} +.btab span:nth-child(-n+4){font-size:10.5px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em} +.btab span:nth-child(4n+1){font-family:var(--body);font-size:14px} +.btab>*:not(:nth-child(4n+1)){text-align:right} +.btab b{font-weight:600} +.v3model .verdict{color:var(--ink);font-size:14.5px} +.mini li{grid-template-columns:18px minmax(0,1fr) 70px 46px} +.mini .mbar{overflow:visible}.mini .mbar>i{border-radius:3px 0 0 3px} +@media (max-width:640px){.switch button{padding:6px 11px;white-space:nowrap;font-size:11.5px}.switch{letter-spacing:.02em}} +@media (max-width:900px){.steps{grid-template-columns:1fr}.vsbase{grid-template-columns:1fr}} +@media (max-width:520px){.vsbase figure{display:none}} +.ownbox{border:2px solid var(--ink);border-radius:12px;background:var(--surface);margin:0 0 12px;box-shadow:3px 3px 0 var(--ink)}.ownbox>summary{cursor:pointer;list-style:none;display:flex;justify-content:space-between;gap:10px;padding:9px 14px;font-family:var(--mono);font-size:12px;align-items:center}.ownbox>summary::-webkit-details-marker{display:none}.ownbox .osum{min-width:0}.ownbox .ohint{color:var(--soft);white-space:nowrap}.ownbox[open] .ohint{display:none} +.ogrid{display:grid;grid-template-columns:1fr 1fr;gap:6px 28px;padding:4px 14px 6px}.oh{font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--soft);margin:2px 0 4px} +.osl{display:grid;grid-template-columns:minmax(0,190px) minmax(0,1fr) 42px;gap:10px;align-items:center;font-size:13px;padding:2px 0}.osl input{width:100%;accent-color:var(--ink)}.osl .ov{font-family:var(--mono);font-size:12px;text-align:right;font-weight:500} +.ofoot{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:6px 14px 10px;font-size:12px;color:var(--soft)}.ownreset{font-family:var(--mono);font-size:12px;border:2px solid var(--ink);border-radius:999px;background:#fff;padding:4px 12px;cursor:pointer;box-shadow:2px 2px 0 var(--ink);color:var(--ink)} +@media (max-width:640px){.ogrid{grid-template-columns:1fr}.osl{grid-template-columns:minmax(0,130px) minmax(0,1fr) 38px;font-size:12px}.ofoot{flex-direction:column;align-items:flex-start}} +.kgap{display:inline-block;width:14px;height:10px;border-radius:2px;vertical-align:middle;margin-right:2px}.kgap-over{background:repeating-linear-gradient(135deg,rgba(143,139,130,.6) 0 2px,rgba(143,139,130,.14) 2px 4.5px);border:1.5px solid var(--ink)}.kgap-under{border:1.5px dashed #8F8B82} +@media (max-width:640px){.areabar{flex-wrap:nowrap;overflow-x:auto}.areabar .achip{flex:none}} @@ -375,7 +539,7 @@ const fmt=n=>Number(n||0).toLocaleString(); const pct=n=>n==null?'—':(n*100).toFixed(1)+'%'; const ms=n=>n==null?'—':n>=1000?(n/1000).toFixed(2)+' s':Math.round(n)+' ms'; const size=n=>n==null?'—':n>=1e9?(n/1e9).toFixed(n>=1e10?0:1)+'B':n>=1e6?(n/1e6).toFixed(0)+'M':String(n); -const one=n=>n==null?'—':Number(n).toFixed(1); +const one=n=>{if(n==null)return '—';const t=Number(n).toFixed(1);return t==='-0.0'?'0.0':t}; const ARCH={'autoregressive':'a-ar','diffusion':'a-diff','encoder':'a-enc','GLi family':'a-gli'}; const ARCHC={'a-ar':'#3B7CF6','a-diff':'#A855F7','a-enc':'#3E8E5E','a-gli':'#FF9D00','a-other':'#bbbbbb','a-jev':'#232323'}; const KINDC={'inference technique':'k-tech','full fine-tune':'k-full','fine-tune':'k-full','LoRA':'k-lora','LoRA + head':'k-lora','head / adapter':'k-head','pre-trained':'k-pre'}; @@ -383,9 +547,10 @@ const SERIES=['#3B7CF6','#FF9D00','#A855F7']; const SIZE_STOPS=[3.5e8,7e8,3e9,1e10,Infinity]; const SIZE_TICKS=['<350M','350M–700M','700M–3B','3B–10B','10B+']; const HAS_SIZE=/\d+(?:\.\d+)?\s*[BM](?![a-z])/i; -const PARETO={size:false,cal:false,lat:false}; +const PARETO={size:false,cal:false,lat:false,vsize:false,vcal:false,vspeed:false}; const U=1000,RMIN=0,RMAX=3.5e10,SK=[0,1e9,5e9,1e10,2e10,3.5e10],SF=[0,.2,.4,.6,.8,1]; -const state={range:[RMIN,RMAX],areas:new Set(),sortKey:'score',sortDir:'desc',expanded:new Set(),benchArea:'',benchIndexOnly:false,showAll:false}; +const GAPATTR=r=>''; +const state={pub:false,own:false,range:[RMIN,RMAX],areas:new Set(),sortKey:'score',sortDir:'desc',expanded:new Set(),benchArea:'',benchIndexOnly:false,showAll:false}; const TABLE_GATE=15; const tableFiltered=()=>!allBands()||state.areas.size>0||state.sortKey!=='score'||state.sortDir!=='desc'; const avg=xs=>xs.length?xs.reduce((a,b)=>a+b,0)/xs.length:null; @@ -394,13 +559,31 @@ const AK=()=>HK()==='balanced_skill'?'skill':'raw'; const CHANCE=()=>HK()==='balanced_skill'; const IDX_CUT=()=>CHANCE()?42:55; const LAT_CUT=()=>100; -const areaVal=(r,id)=>{const c=r.m&&r.m.categories&&r.m.categories.find(x=>x.id===id);return c&&c[AK()]!=null?c[AK()]*100:null}; -const scoreOf=r=>{if(!state.areas.size)return r.raw;const v=[...state.areas].map(id=>areaVal(r,id)).filter(x=>x!=null);return v.length?avg(v):null}; +const ownEqS=x=>OWN.eq.mB+OWN.eq.sB*(x-OWN.eq.mS)/OWN.eq.sS; +const ownBy=e=>{if(!OWN)return null;if(!OWN._by)OWN._by=Object.fromEntries(OWN.models.map(m=>[m.e,m]));return OWN._by[e]||null}; +const catV=(c,m)=>{if(typeof V3==='undefined'||!V3||state.pub)return c[AK()];if(state.own&&OWN&&OWNW){const o=ownBy(m&&m.engine||'jev'),v=o&&o.a[c.id],p=OWNW.p,t=p.public+p.same_skills;if(v&&v[1]&&v[3]&&t)return Math.max(0,(p.public*v[0]/v[1]+p.same_skills*ownEqS(v[2]/v[3]))/t/100)}return c.combined!=null?c.combined:c[AK()]}; +const areaVal=(r,id)=>{const c=r.m&&r.m.categories&&r.m.categories.find(x=>x.id===id);return c&&catV(c,r.m)!=null?catV(c,r.m)*100:null}; +const IDXNAME=()=>V3?(state.own?'Your own':state.pub?'Public only':'Full score'):'Decision Index'; +const dispScore=m=>state.own&&OWNS&&OWNS[m.engine||'jev']!=null?OWNS[m.engine||'jev']:state.pub&&m.scores.public_skill!=null?m.scores.public_skill:m.scores[HK()]; +const scoreOf=r=>{if(!state.areas.size){if(state.own&&OWNS)return OWNS[r.engine]??null;return state.pub&&r.pub!=null?r.pub:r.v}const v=[...state.areas].map(id=>areaVal(r,id)).filter(x=>x!=null);return v.length?avg(v):null}; const shortArea=c=>c.label.split(/\s*&\s*|\s+/)[0]; -const customLabel=()=>state.areas.size?`Your index · ${AREAS().filter(c=>state.areas.has(c.id)).map(c=>shortArea(c)).join(' + ')}`:'Decision Index'; -let D=null,ROWS=[]; -const EDITION=()=>{const s=(D&&D.suite)||{};const label=s.label||'Decision Index 0.1';return {id:s.edition||'release-v1',label,num:(label.match(/\d+(?:\.\d+)+/)||['0.1'])[0],note:s.note||'',base:s.base_edition||null}}; -function applyEdition(){const E=EDITION();document.title=E.label;const og=document.querySelector('meta[property="og:title"]');if(og)og.content=E.label;const ds=document.querySelector('meta[name="description"]');if(ds&&D.suite&&D.suite.requests)ds.content=`Every open reproduction of TypeSafe's Jev, scored on the same frozen ${fmt(D.suite.requests)}-decision suite as Jev itself. One Decision Index, five capability categories, per-model breakdowns.`} +const customLabel=()=>state.areas.size?`Your index · ${AREAS().filter(c=>state.areas.has(c.id)).map(c=>shortArea(c)).join(' + ')}`:IDXNAME(); +let D=null,ROWS=[],OWN=null,OWNS=null,OWNRK={},OWNOPEN=null; +const ownDef=()=>({p:{public:20,same_skills:50,new_domains:30},a:Object.fromEntries(OWN.areas.map(a=>[a.id,a.w*100]))}); +let OWNW=null; +function ownCompute(){if(!OWN)return;const w=OWNW,q=(x,m,sd)=>OWN.eq.mB+OWN.eq.sB*(x-m)/sd,tot=w.p.public+w.p.same_skills+w.p.new_domains,o={}; + for(const m of OWN.models){let nB=0,dB=0,nS=0,dS=0;for(const ar of OWN.areas){const k=w.a[ar.id],v=m.a[ar.id];if(!v||!k)continue;nB+=k*v[0];dB+=k*v[1];nS+=k*v[2];dS+=k*v[3]} + const B=dB?nB/dB:null,S=dS?nS/dS:null;o[m.e]=!tot||B==null||S==null||m.o==null?null:Math.max(0,(w.p.public*B+w.p.same_skills*q(S,OWN.eq.mS,OWN.eq.sS)+w.p.new_domains*q(m.o,OWN.eq.mO,OWN.eq.sO))/tot)} + OWNS=o;OWNRK={};Object.keys(o).filter(k=>o[k]!=null).sort((a,b)=>o[b]-o[a]).forEach((k,i)=>OWNRK[k]=i+1)} +const ownIsDef=()=>{const d=ownDef();return Object.keys(d.p).every(k=>Math.abs(d.p[k]-OWNW.p[k])<1e-9)&&Object.keys(d.a).every(k=>Math.abs(d.a[k]-OWNW.a[k])<1e-9)}; +function ownHash(){try{if(!state.own){if(location.hash.startsWith('#own'))history.replaceState(history.state,'',location.pathname+location.search);return} + const r=x=>Math.round(x*100)/100,h='own'+(ownIsDef()?'':'='+['p',OWNW.p.public,OWNW.p.same_skills,OWNW.p.new_domains].map(x=>typeof x==='number'?r(x):x).join(',')+';'+OWN.areas.map(a=>a.id+':'+r(OWNW.a[a.id])).join(',')); + history.replaceState(history.state,'',location.pathname+location.search+'#'+h)}catch(e){}} +function ownFromHash(){const h=decodeURIComponent(location.hash.slice(1));if(!OWN||!h.startsWith('own'))return false;OWNW=ownDef(); + const m=h.match(/^own=p,([\d.]+),([\d.]+),([\d.]+);(.*)$/);if(m){OWNW.p={public:+m[1],same_skills:+m[2],new_domains:+m[3]};m[4].split(',').forEach(x=>{const [k,v]=x.split(':');if(k in OWNW.a&&isFinite(+v))OWNW.a[k]=+v})} + return true} +const EDITION=()=>{const s=(D&&D.suite)||{};const label=V3?V3.label:(s.label||'Decision Index 0.1');return {id:s.edition||'release-v1',label,num:(label.match(/\d+(?:\.\d+)+/)||['0.1'])[0],note:s.note||'',base:s.base_edition||null}}; +function applyEdition(){const E=EDITION();document.title=E.label;const og=document.querySelector('meta[property="og:title"]');if(og)og.content=E.label;const ds=document.querySelector('meta[name="description"]');if(!V3&&ds&&D.suite&&D.suite.requests)ds.content=`Every open reproduction of TypeSafe's Jev, scored on the same frozen ${fmt(D.suite.requests)}-decision suite as Jev itself. One Decision Index, five capability categories, per-model breakdowns.`} const isNew=r=>!!(r&&r.m&&r.m.new_in_edition); const archOf=r=>r.jev?'a-jev':(ARCH[r.meta?.technique]||'a-other'); @@ -416,10 +599,16 @@ const toPos=n=>{n=Math.min(RMAX,Math.max(0,n));let i=1;while(iSK const fromPos=p=>{const f=Math.min(1,Math.max(0,p/U));let i=1;while(iSF[i])i++;return SK[i-1]+(SK[i]-SK[i-1])*(f-SF[i-1])/(SF[i]-SF[i-1])}; function sizePasses(r){if(r.jev)return true;if(r.size==null)return allBands();return (state.range[0]<=RMIN||r.size>=state.range[0])&&(state.range[1]>=RMAX||r.sizer.long_name||(r.m&&r.m.long_name)||r.name; -const label=r=>{const n=dname(r);return (!r.size||HAS_SIZE.test(n))?n:`${n} (${size(r.size)})`}; +const orgOf=r=>{const m=r&&(r.m||r);return (m&&m.meta&&m.meta.org)||(m&&m.org)||null}; +const orgImg=(r,cls)=>{const o=orgOf(r);return o?`${esc(o.name)}`:''}; +const wnote=r=>{let m=r&&(r.m||r);if(m&&!m.meta&&m.engine&&D)m=D.models.find(x=>x.engine===m.engine)||m;return (m&&m.meta&&m.meta.weights_note)||null}; +const star=r=>wnote(r)?' ⓘ':''; +const wnSup=r=>wnote(r)?`${esc(wnote(r))}`:''; +const wnFoot=()=>''; +const label=r=>{const n=dname(r);return ((!r.size||HAS_SIZE.test(n))?n:`${n} (${size(r.size)})`)+star(r)}; const cat=id=>D.categories.find(c=>c.id===id); const AREAS=()=>D.categories.filter(c=>!c.jev_only); -const areasFor=subject=>subject.engine==='jev'?D.categories:AREAS(); +const areasFor=subject=>V3?AREAS():(subject.engine==='jev'?D.categories:AREAS()); const WORDS=['zero','one','two','three','four','five','six','seven','eight']; const bench=id=>D.benchmarks[String(id)]||{id,dataset:'#'+id,short:'#'+id,baseline:{}}; const jevResult=id=>D.jev.results[String(id)]; @@ -430,10 +619,10 @@ const adjusted=(m,id)=>{const r=modelResult(m,id);if(!r||r.score==null)return nu function buildRows(){ const rows=D.models.map(m=>({engine:m.engine,name:m.name,long_name:m.long_name,variant:m.variant,ece:m.calibration?m.calibration.ece*100:null,meta:m.meta,size:m.meta.served_params, coverage:D.suite.requests?(m.counts.ok||0)/D.suite.requests:null,latency:m.latency.median, - raw:m.scores[HK()],acc:m.scores.balanced_raw,skill:m.scores.balanced_skill,breadth:m.scores.breadth_skill, + raw:m.scores[HK()],v:m.scores[HK()],pub:m.scores.public_skill,v3:m.v03,acc:m.scores.balanced_raw,skill:m.scores.balanced_skill,breadth:m.scores.breadth_skill, mmlu:modelResult(m,24)?.score??null,gpqa:modelResult(m,25)?.score??null,bfcl:modelResult(m,1)?.score??null,m})); rows.push({engine:'jev',jev:true,name:'Jev',variant:null,meta:null,size:null,coverage:1,latency:D.jev.latency.median,ece:D.jev.calibration?D.jev.calibration.ece*100:null, - raw:D.jev.scores[HK()],acc:D.jev.scores.balanced_raw,skill:D.jev.scores.balanced_skill,breadth:D.jev.scores.breadth_skill, + raw:D.jev.scores[HK()],v:D.jev.scores[HK()],pub:D.jev.scores.public_skill,v3:D.jev.v03,acc:D.jev.scores.balanced_raw,skill:D.jev.scores.balanced_skill,breadth:D.jev.scores.breadth_skill, mmlu:jevResult(24)?.score??null,gpqa:jevResult(25)?.score??null,bfcl:jevResult(1)?.score??null,m:D.jev}); return rows; } @@ -447,8 +636,8 @@ function sorted(rows){ return dir*(x-y)}); } const TIE=0.25; -const rankOf=()=>{const r=ROWS.map(x=>({e:x.engine,s:scoreOf(x)})).filter(x=>x.s!=null).sort((a,b)=>b.s-a.s);const o={};let start=0; - r.forEach((x,i)=>{if(i>0&&r[i-1].s-x.s>TIE)start=i;o[x.e]=start+1}); +const rankOf=()=>{const lead=!!(V3&&V3.formula),T=lead?V3.formula.tie_band:TIE;const r=ROWS.map(x=>({e:x.engine,s:scoreOf(x)})).filter(x=>x.s!=null).sort((a,b)=>b.s-a.s);const o={};let start=0; + r.forEach((x,i)=>{if(i>0&&Math.round((lead?r[start].s:r[i-1].s)*100)/100-Math.round(x.s*100)/100>T+1e-9)start=i;o[x.e]=start+1}); const counts={};Object.values(o).forEach(v=>counts[v]=(counts[v]||0)+1); for(const e in o)o[e]={n:o[e],tied:counts[o[e]]>1};return o}; const rankText=(rk,long)=>rk?(rk.tied?(long?`${rk.n} (tied)`:`=${rk.n}`):String(rk.n)):'—'; @@ -460,10 +649,12 @@ function radarSVG(axes,series,opts={}){ let g=''; [0.25,0.5,0.75,1].forEach(r=>{g+=``}); axes.forEach((_,i)=>{const[x,y]=pt(i,1);g+=``}); + const defs=''; + if(defs)g+=`${defs}`; series.forEach(s=>{g+=`${esc(s.name)}`}); - series.forEach(s=>{if(s.dash)return;s.vals.forEach((v,i)=>{if(v==null)return;const[x,y]=pt(i,Math.max(0,Math.min(1,v)));g+=`${esc(s.name)} · ${esc(axes[i].label)} · ${pct(v)}`})}); + series.forEach(s=>{if(s.dash)return;s.vals.forEach((v,i)=>{if(v==null)return;const[x,y]=pt(i,Math.max(0,Math.min(1,v)));g+=`${esc(s.name)} · ${esc(axes[i].label)} · ${pct(v)}${s.private&&s.private[i]!=null?`\n${TWIN_LINE}`:''}`})}); const ext=[]; - axes.forEach((a,i)=>{const[x,y]=pt(i,LR/R);const lab=n>7?(SPOKE_ABBR[a.label]||a.label):a.label,w=lab.length*fs*0.62,anc=xc+6?'start':'middle';ext.push([anc==='end'?x-w:anc==='start'?x:x-w/2,y-fs*0.6,anc==='end'?x:anc==='start'?x+w:x+w/2,y+fs*0.6]); + axes.forEach((a,i)=>{const[x,y]=pt(i,LR/R);const plus=/\+$/.test(a.label)&&a.id!=null,base0=plus?a.label.slice(0,-1):a.label,lab=(n>7?(SPOKE_ABBR[base0]||base0):base0)+(plus?'+':''),w=lab.length*fs*0.62,anc=xc+6?'start':'middle';ext.push([anc==='end'?x-w:anc==='start'?x:x-w/2,y-fs*0.6,anc==='end'?x:anc==='start'?x+w:x+w/2,y+fs*0.6]); g+=`${esc(lab)}`}); let vb=`-46 -18 ${S+92} ${S+36}`; if(big){const x0=Math.min(c-R,...ext.map(e=>e[0]))-6,y0=Math.min(c-R,...ext.map(e=>e[1]))-6,x1=Math.max(c+R,...ext.map(e=>e[2]))+6,y1=Math.max(c+R,...ext.map(e=>e[3]))+6;vb=`${x0} ${y0} ${x1-x0} ${y1-y0}`} @@ -485,6 +676,9 @@ function lollipopSVG(axes,series){ return `${g}`; } +const TWIN_LINE='Combined score: the public benchmark plus a private benchmark that measures the same competency.'; +const combVal=(m,id)=>{const b=m&&m.benchmarks&&m.benchmarks[String(id)];if(!b||b.combined==null)return null;if(state.own&&OWN&&OWNW&&b.private_eq!=null&&b.skill!=null){const p=OWNW.p,t=p.public+p.same_skills,r=b.random||0,tn=r<1?(b.private_eq-r)/(1-r):b.private_eq;if(t)return Math.max(0,(p.public*b.skill*100+p.same_skills*ownEqS(tn*100))/t/100)}return b.combined}; +const headVal=(m,id)=>{const c=state.pub?null:combVal(m,id);return c!=null?c:idxVal(m,id)}; const RADAR_SKIP=new Set([31]); const SPOKE_ABBR={'GPQA Diamond':'GPQA','iSarcasmEval':'iSarcasm','Home appliances':'Home app.','Amazon ESCI':'ESCI','ForecastBench':'Forecast','SATA-Bench':'SATA','WinoGrande':'Wino'}; function categoryAxes(c){ @@ -497,30 +691,30 @@ function categoryAxes(c){ const idxVal=(m,id)=>{const b=m.benchmarks&&m.benchmarks[String(id)];return b&&b[AK()]!=null?b[AK()]:null}; function overviewCard(){ const areas=AREAS(),axes=areas.map(c=>({label:shortArea(c),area:c.id})); - const val=(m,c)=>{const x=(m.categories||[]).find(y=>y.id===c.id);return x&&x[AK()]!=null?x[AK()]:null}; - const top=D.models.filter(m=>m.scores[HK()]!=null).sort((a,b)=>b.scores[HK()]-a.scores[HK()]).slice(0,3); + const val=(m,c)=>{const x=(m.categories||[]).find(y=>y.id===c.id);return x&&catV(x,m)!=null?catV(x,m):null}; + const top=D.models.filter(m=>dispScore(m)!=null).sort((a,b)=>dispScore(b)-dispScore(a)).slice(0,3); const series=[{name:'Jev',color:'#232323',fill:'rgba(35,35,35,.10)',width:3,vals:areas.map(c=>val(D.jev,c))}] .concat(top.map((m,i)=>({name:m.long_name||m.name,color:SERIES[i],width:2.25,vals:areas.map(c=>val(m,c))}))); - const legend=[`Jev${one(D.jev.scores[HK()])} · reference`] - .concat(top.map((m,i)=>`${i+1}${esc(m.long_name||m.name)}${one(m.scores[HK()])}`)); - return `

All five areas

Decision Index · Jev and the top 3 open models
-
${radarSVG(axes,series,{aria:'Area scores radar',big:true})}
${legend.join('')}

5 spokes · one per area, each the area score; the Decision Index is their mean

`; + const legend=[`Jev${one(dispScore(D.jev))} · reference`] + .concat(top.map((m,i)=>`${i+1}${esc(m.long_name||m.name)}${wnSup(m)}${one(dispScore(m))}`)); + return `

All five areas

${IDXNAME()} · Jev and the top 3 models
+
${radarSVG(axes,series,{aria:'Area scores radar',big:true})}
${legend.join('')}

${state.pub?'5 spokes · one per area, each the area score on the public benchmarks only':`5 spokes · one per area: its public benchmarks and their private tests combined on one scale${state.own?', with your part weights':', weighted as in the Full score'}. Private tasks from new domains belong to no area, so they are not in the spokes`}

`; } function categoryCard(c){ const ids=categoryAxes(c); - const axes=ids.map(id=>({label:bench(id).short,id})); + const axes=ids.map(id=>({label:bench(id).short+(bench(id).private&&!state.pub?'+':''),id})); const inIdx=ids.every(id=>idxVal(D.jev,id)!=null); - const top=D.models.map(m=>({m,s:m.categories.find(x=>x.id===c.id)})).filter(x=>x.s).sort((a,b)=>b.s[AK()]-a.s[AK()]).slice(0,3); + const top=D.models.map(m=>({m,s:m.categories.find(x=>x.id===c.id)})).filter(x=>x.s).sort((a,b)=>catV(b.s,b.m)-catV(a.s,a.m)).slice(0,3); const jc=D.jev.categories.find(x=>x.id===c.id); const series=[]; if(!(inIdx&&CHANCE())&&ids.some(id=>bench(id).baseline.value!=null))series.push({name:'Random baseline',color:'#8C8C8C',dash:'4 3',width:1.5,vals:ids.map(id=>inIdx&&bench(id).lower?0:bench(id).baseline.value)}); - series.push({name:'Jev',color:'#232323',fill:'rgba(35,35,35,.10)',width:3,vals:ids.map(id=>inIdx?idxVal(D.jev,id):jevResult(id)?.score??null)}); - top.forEach((t,i)=>series.push({name:t.m.long_name||t.m.name,color:SERIES[i],width:2.25,vals:ids.map(id=>inIdx?idxVal(t.m,id):adjusted(t.m,id))})); + series.push({name:'Jev',color:'#232323',fill:'rgba(35,35,35,.10)',width:3,vals:ids.map(id=>inIdx?headVal(D.jev,id):jevResult(id)?.score??null),private:inIdx&&!state.pub?ids.map(id=>combVal(D.jev,id)):null}); + top.forEach((t,i)=>series.push({name:t.m.long_name||t.m.name,color:SERIES[i],width:2.25,vals:ids.map(id=>inIdx?headVal(t.m,id):adjusted(t.m,id)),private:inIdx&&!state.pub?ids.map(id=>combVal(t.m,id)):null})); const chart=ids.length>=3?radarSVG(axes,series,{aria:c.label+' radar',big:true}):lollipopSVG(axes,series); - const legend=[`Jev${one(jc[AK()]*100)} · reference`] - .concat(top.map((t,i)=>`${i+1}${esc(t.m.long_name||t.m.name)}${one(t.s[AK()]*100)}`)); - const note=ids.length>=3?(inIdx?`${ids.length} spokes · the area's index benchmarks as the index scores them: ${CHANCE()?'chance-corrected (0 = random guessing), ':''}unanswered requests count as wrong${ids.some(id=>bench(id).lower)?', ForecastBench against its baseline':''}; their mean is the area score`:`${ids.length} spokes · each spoke is that task's own metric, unanswered requests count as wrong`):ids.length===1?`${bench(ids[0]).dataset} is the only static task here; the interactive games in this area sit outside this edition of the index`:`${ids.length} tasks in this area, too few for a radar · each bar is that task's own metric, unanswered requests count as wrong`; - return `

${icon(c)}${esc(c.label)}

category score · Jev and the top 3 open models
+ const legend=[`Jev${one(catV(jc,D.jev)*100)} · reference`] + .concat(top.map((t,i)=>`${i+1}${esc(t.m.long_name||t.m.name)}${wnSup(t.m)}${one(catV(t.s,t.m)*100)}`)); + const note=ids.length>=3?(inIdx?`${ids.length} spokes · the area's index benchmarks as the index scores them: ${CHANCE()?'chance-corrected (0 = random guessing), ':''}unanswered requests count as wrong${ids.some(id=>bench(id).lower)?', ForecastBench against its baseline':''}; their mean is the area score${ids.some(id=>bench(id).private)&&!state.pub?'. A + marks a task whose public score and its private test are combined on one scale, weighted as in '+(state.own?'your own mix':'the Full score'):''}`:`${ids.length} spokes · each spoke is that task's own metric, unanswered requests count as wrong`):ids.length===1?`${bench(ids[0]).dataset} is the only static task here; the interactive games in this area sit outside this edition of the index`:`${ids.length} tasks in this area, too few for a radar · each bar is that task's own metric, unanswered requests count as wrong`; + return `

${icon(c)}${esc(c.label)}

category score · Jev and the top 3 models
${chart}
${legend.join('')}

${esc(note)}

`; } const icon=c=>c.icon?``:''; @@ -586,7 +780,7 @@ function drawCharts(rows){ const cw=$('#scatter')?.clientWidth||900,narrow=cw<640; const W=narrow?520:900,H=narrow?520:330,L=narrow?40:52,R=narrow?14:16,T=18,B=narrow?50:44; const lat=pts.filter(r=>r.latency!=null); - const xs=lat.map(r=>r.latency),ys=pts.map(r=>r.raw); + const xs=lat.map(r=>r.latency),ys=pts.map(r=>r.raw).concat(state.areas.size?[]:pts.map(r=>Math.max(r.v||0,r.pub||0))); const xmin=Math.min(...xs)*0.88,xmax=Math.max(...xs)*1.12,ymax=Math.max(...ys)*1.08; const lx=v=>Math.log10(Math.max(v,1)); const px=v=>L+(lx(v)-lx(xmin))/(lx(xmax)-lx(xmin)||1)*(W-L-R); @@ -602,36 +796,46 @@ function drawCharts(rows){ if(lon)g+=paretoPath(lfront,r=>[px(r.latency),py(r.raw)],'x'); for(const r of lat.slice().sort((a,b)=>b.raw-a.raw)){ const cx=px(r.latency),cy=py(r.raw); - g+=``; + g+=``; items.push({cx,cy,r:(narrow?7:6)+(lfs.has(r)?2:0),lab:narrow?r.name:label(r),raw:r.raw,size:r.size,skip:lon&&!lfs.has(r)}); } const labs=placeLabels(items,{W,H,L,R,T,B},bandBox.concat(lon?segRects(paretoSegs(lfront,r=>[px(r.latency),py(r.raw)],'x')):[]),lon?{far:true,prefer:'upleft'}:{max:20}); - $('#scatter').innerHTML=`${g}${labs}median latency on ${esc(D.suite.hardware)} · log scale${narrow?' · tap a dot for details':''}Decision Index`; + $('#scatter').innerHTML=`${g}${labs}median latency on ${esc(D.suite.hardware)} · log scale${narrow?' · tap a dot for details':''}${esc(IDXNAME())}`; const bar=pts.slice().sort((a,b)=>b.raw-a.raw); - const BW=Math.max(900,bar.length*42),bh=400,step=(BW-L-R)/bar.length,TB=66; + const CW=(($('#bars')&&$('#bars').clientWidth)||900)-76,LX0=Math.max(...bar.slice(0,3).map((r,i)=>Math.min(34,label(r).length)*5.3*0.5+(isNew(r)?28:0)-i*42)),PPB=Math.max(innerWidth>700?28:42,(CW-L-R-Math.max(10,LX0-L+6))/20),BW=Math.max(900,Math.round(L+R+bar.length*PPB)),bh=400,step=(BW-L-R)/bar.length,TB=66; const pyb=v=>bh-B-v/(ymax||1)*(bh-TB-B); let b2=''; for(const v of yticks)b2+=`${v}`; const rk=rankOf(); - const attrs=r=>`data-engine="${esc(r.engine)}" data-name="${esc(dname(r))}" data-rank="${rankText(rk[r.engine],true)}" data-raw="${one(r.raw)}" data-lat="${r.latency!=null?Math.round(r.latency):''}" data-size="${esc(r.size?size(r.size):'')}" data-tech="${esc(r.meta?.technique||'')}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'hosted API · HTTP round trip, not a local GPU run':''}" data-new="${isNew(r)?1:''}"`; - bar.forEach((r,i)=>{const x=L+i*step+step*0.15,w=step*0.7,y=pyb(r.raw); - b2+=``; - b2+=`${one(r.raw)}`; - const t=label(r),nw=isNew(r),tw=24;b2+=`${esc(t.length>34?t.slice(0,33)+'…':t)}${nw?`NEW`:''}`}); + const attrs=r=>`data-engine="${esc(r.engine)}" data-name="${esc(dname(r)+star(r))}" data-rank="${rankText(rk[r.engine],true)}" data-raw="${one(r.raw)}" data-lat="${r.latency!=null?Math.round(r.latency):''}" data-size="${esc(r.size?size(r.size):'')}" data-tech="${esc(r.meta?.technique||'')}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'hosted API · HTTP round trip, not a local GPU run':''}" data-new="${isNew(r)?1:''}"${GAPATTR(r)}`; + const othOf=r=>(V3&&(state.pub||state.own)&&!state.areas.size&&r.v3&&r.v!=null&&r.pub!=null)?r.v:null; + const ytOf=r=>{const o=othOf(r);return o==null?pyb(r.raw):Math.min(pyb(r.raw),pyb(o))}; + bar.forEach((r,i)=>{const x=L+i*step+step*0.15,w=step*0.7,y=pyb(r.raw),o=othOf(r),yt=ytOf(r); + const gc='#8F8B82'; + if(o!=null&&o>r.raw){const yo=pyb(o);b2+=``} + b2+=``; + {const og=orgOf(r),k=BW>900?1:((($('#bars')&&$('#bars').clientWidth)||BW)/(BW+10)),sz=19/k,ring=1.6/k;if(og&&w*k>=22&&bh-B-y>sz+12/k){const cx=x+w/2,cy=bh-B-sz/2-6/k;b2+=``}} + if(o!=null&&o`} + if(o!=null){const yo=pyb(o);b2+=o>r.raw?``:``} + b2+=`${one(r.raw)}`; + if((state.pub||state.own)&&!state.areas.size&&r.v3&&(!state.own||OWNRK[r.engine])){const ch=r.v3.rank_v-(state.own?OWNRK[r.engine]:r.v3.rank_pub);b2+=`${ch>0?'▲'+ch:ch<0?'▼'+(-ch):'–'}`} + const t=label(r),nw=isNew(r),tw=24;b2+=`${wnote(r)?`${esc(wnote(r))}`:''}${esc(wnote(r)?(t.length>36?t.slice(0,-2).slice(0,31)+'…'+star(r):t):(t.length>34?t.slice(0,33)+'…':t))}${nw?`NEW`:''}`}); let gi=0;while(gigi){const x1=L+gi*step+step*0.15,x2=L+gj*step+step*0.15+step*0.7,top=Math.min(...bar.slice(gi,gj+1).map(r=>pyb(r.raw)))-25; - const lab='tied',pw=lab.length*6.4+14,cx=(x1+x2)/2; + const off=(state.pub||state.own)&&!state.areas.size?37:25,rn=rk[bar[gi].engine]?rk[bar[gi].engine].n:null; + if(gj===gi&&rn!=null){const r=bar[gi],cx=L+gi*step+step*0.5,top=ytOf(r)-off+8,lab='#'+rn,pw=Math.min(step-2,lab.length*5.6+8);b2+=`${lab}`} + if(gj>gi){const x1=L+gi*step+step*0.15,x2=L+gj*step+step*0.15+step*0.7,top=Math.min(...bar.slice(gi,gj+1).map(r=>ytOf(r)))-off; + const lab=(rn!=null?'#'+rn+' · ':'')+'tied',pw=lab.length*6.4+14,cx=(x1+x2)/2; b2+=``; b2+=`${lab}`} gi=gj+1} const labH=Math.ceil(Math.max(...bar.map(r=>Math.min(34,label(r).length)*5.3+(isNew(r)?28:0)))*Math.sin(Math.PI/3))+16; - $('#bars').innerHTML=`
${b2}
`; + const VXB=Math.max(10,Math.ceil(Math.max(...bar.map((r,i)=>Math.min(34,label(r).length)*5.3*0.5+(isNew(r)?28:0)-(L+(i+.5)*step)+6))));$('#bars').innerHTML=`
${b2}
`; wireScrollHint('#bars .scroll'); } function areabar(){ const all=!state.areas.size; - return `
Rank by${AREAS().map(c=>``).join('')}${all?'':`✦ your own mix · mean of the picked areas`}
`; + return `
${V3?'Rank by area':'Rank by'}${V3?'':``}${AREAS().map(c=>``).join('')}${all?'':`✦ your own mix · mean of the picked areas`}
`; } function tableHTML(rows){ const rank=rankOf(); @@ -641,15 +845,15 @@ function tableHTML(rows){ const th=(k,l,cls='')=>`${l}`; const areaTh=AREAS().map(c=>th('area:'+c.id,esc(shortArea(c)),'r'+(state.areas.has(c.id)?' on':''))).join(''); const body=rows.map(r=>` - ${rankText(rank[r.engine])} -
${esc(r.name)}${contamInfo(r.m)}
${r.variant?`${esc(r.variant)}`:''}
${pills(r)}
+ ${rankText(rank[r.engine])} +
${orgImg(r)}${esc(r.name)}${wnSup(r)}${contamInfo(r.m)}
${r.variant?`${esc(r.variant)}`:''}
${pills(r)}
${one(r.score)} ${AREAS().map(c=>`${one(areaVal(r,c.id))}`).join('')} ${r.ece==null?'—':r.ece.toFixed(1)} ${sizeCell(r)} ${pct(r.coverage)}${gapLine(r.m,2)?info(gapLine(r.m,2)):''} ${ms(r.latency)}`).join(''); - return `${areabar()}
${th('name','model')}${th('score',esc(state.areas.size?'Your index ✦':'Decision Index'),'r')}${areaTh}${th('ece','calibration','r')}${th('size','size','r')}${th('coverage','answered','r')}${th('latency','median latency','r')}${body||''}
#
No models in this size range.
${hidden?`
`:''}`; + return `${areabar()}
${th('name','model')}${th('score',esc(state.areas.size?'Your index ✦':IDXNAME()),'r')}${areaTh}${th('ece','calibration','r')}${th('size','size','r')}${th('coverage','answered','r')}${th('latency','latency','r')}${body||''}
#
No models in this size range.
${hidden?`
`:''}`; } let MEASURE=null; function textW(t){if(!MEASURE){MEASURE=document.createElement('canvas').getContext('2d');MEASURE.font=`11.5px ${getComputedStyle(document.body).getPropertyValue('--body')||'sans-serif'}`}return MEASURE.measureText(t).width*1.06+3} @@ -701,10 +905,10 @@ function drawIdxCal(rows){ const px=v=>L+(v-xmin)/(xmax-xmin||1)*(W-L-R),py=v=>T+v/(ymax||1)*(H-T-B); let g=`calibration error under 10`; const CUT=IDX_CUT(); - if(xmax>CUT)g+=`Decision Index ${CUT}+`; + if(xmax>CUT)g+=`${esc(IDXNAME())} ${CUT}+`; for(const v of [0,10,20,30,40,50,60].filter(v=>v<=ymax))g+=`${v}`; for(const v of [10,20,30,40,50,60].filter(v=>v>=xmin&&v<=xmax))g+=`${v}`; - const attrs=r=>{const c=r.m.calibration;return `data-engine="${esc(r.engine)}" data-name="${esc(dname(r))}" data-raw="${one(r.raw)}" data-acc="${pct(c.acc)}" data-conf="${pct(c.conf)}" data-ece="${(c.ece*100).toFixed(1)}" data-over="${pct(c.over95)}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'probabilities as returned by the hosted API, rounded to two decimals':''}"`}; + const attrs=r=>{const c=r.m.calibration;return `data-engine="${esc(r.engine)}" data-name="${esc(dname(r)+star(r))}" data-raw="${one(r.raw)}" data-acc="${pct(c.acc)}" data-conf="${pct(c.conf)}" data-ece="${(c.ece*100).toFixed(1)}" data-over="${pct(c.over95)}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'probabilities as returned by the hosted API, rounded to two decimals':''}"`}; const items=[],con=PARETO.cal,cfront=con?pareto(pts,r=>r.m.calibration.ece):[],cfs=new Set(cfront); if(con)g+=paretoPath(cfront,r=>[px(r.raw),py(r.m.calibration.ece*100)],'y'); for(const r of pts.slice().sort((a,b)=>(b.jev?1:0)-(a.jev?1:0)||b.raw-a.raw)){ @@ -713,7 +917,7 @@ function drawIdxCal(rows){ items.push({cx,cy,r:rr,lab:r.name,raw:r.raw,size:r.size,skip:con&&!cfs.has(r)}); } const labels=placeLabels(items,{W,H,L,R,T,B},[{x1:L,y1:T,x2:L+180,y2:T+16},{x1:W-R-130,y1:H-B-20,x2:W-R,y2:H-B}].concat(con?segRects(paretoSegs(cfront,r=>[px(r.raw),py(r.m.calibration.ece*100)],'y')):[]),con?{far:true,prefer:'upright'}:{max:20}); - host.innerHTML=`${g}${labels}Decision Index · up and right is the corner you wantcalibration error, points (lower is better)`; + host.innerHTML=`${g}${labels}${esc(IDXNAME())} · up and right is the corner you wantcalibration error, points (lower is better)`; } const paretoBtn=k=>``; function pareto(pts,cost){ @@ -751,26 +955,50 @@ function drawSize(rows){ if(on)g+=paretoPath(front,r=>[px(r.size),py(r.raw)],'x'); for(const r of pts.slice().sort((a,b)=>b.raw-a.raw)){ const cx=px(r.size),cy=py(r.raw); - g+=``; + g+=``; items.push({cx,cy,r:fs.has(r)?8:6,lab:r.name,raw:r.raw,size:r.size,skip:on&&!fs.has(r)}); } const labs=placeLabels(items,{W,H,L,R,T,B},(jev?[{x1:L,y1:py(jev.raw)-20,x2:L+220,y2:py(jev.raw)+3}]:[]).concat(on?segRects(paretoSegs(front,r=>[px(r.size),py(r.raw)],'x')):[]),on?{far:true,prefer:'upleft'}:{max:20}); - host.innerHTML=`${g}${labs}parameters served · log scaleDecision Index${note}`; + host.innerHTML=`${g}${labs}parameters served · log scale${esc(IDXNAME())}${note}`; +} +function ownStrip(){const h=$('#ownctl');if(!h)return;if(!state.own||!OWN||state.areas.size){h.innerHTML='';return} + if(OWNOPEN==null)OWNOPEN=innerWidth>640; + const tot=OWNW.p.public+OWNW.p.same_skills+OWNW.p.new_domains||1,at=Object.values(OWNW.a).reduce((x,y)=>x+y,0)||1,pc=x=>Math.round(x*100)+'%'; + const P=[['public','Public benchmarks'],['same_skills','Private tests, same skills'],['new_domains','Private tasks from new domains']]; + const sl=(k,id,lab,v,eff)=>``; + if(!h.firstChild){h.innerHTML=`
set your weights
Parts
${P.map(([k,l])=>sl('p',k,l,OWNW.p[k],pc(OWNW.p[k]/tot))).join('')}
Areas
${OWN.areas.map(a=>sl('a',a.id,esc(a.label),OWNW.a[a.id],pc(OWNW.a[a.id]/at))).join('')}
Each area weight applies to its public benchmarks and to their private tests. Private tasks from new domains count as one block.
`} + h.querySelectorAll('input[data-own]').forEach(i=>{const v=OWNW[i.dataset.own][i.dataset.id];if(document.activeElement!==i)i.value=v}); + h.querySelectorAll('[data-ov]').forEach(b=>{const [k,id]=b.dataset.ov.split(':');b.textContent=pc(OWNW[k][id]/(k==='p'?tot:at))}); + h.querySelector('.osum').textContent=`Your own · ${pc(OWNW.p.public/tot)} public · ${pc(OWNW.p.same_skills/tot)} same-skill private · ${pc(OWNW.p.new_domains/tot)} new domains${ownIsDef()?' (the Full score mix)':''}`} +let ownRaf=0; +document.addEventListener('input',e=>{const i=e.target.closest&&e.target.closest('input[data-own]');if(!i)return;OWNW[i.dataset.own][i.dataset.id]=+i.value;ownCompute();ownStrip();cancelAnimationFrame(ownRaf);ownRaf=requestAnimationFrame(()=>{drawOverview();ownHash()})}); +document.addEventListener('click',e=>{if(e.target.closest('[data-ownreset]')){e.preventDefault();OWNW=ownDef();ownCompute();const h=$('#ownctl');if(h)h.innerHTML='';drawOverview();ownHash()}}); +document.addEventListener('toggle',e=>{if(e.target.classList&&e.target.classList.contains('ownbox'))OWNOPEN=e.target.open},true); +function paintSwitch(){const cur=state.own&&MODE()!=='vision'?'own':state.pub?'pub':'v';document.querySelectorAll('button[data-pubmode]').forEach(b=>{const on=b.dataset.pubmode===cur;b.classList.toggle('on',on);b.setAttribute('aria-pressed',String(on))})} +function paintToggle(){ + paintSwitch(); + ownStrip(); + const k=$('#barkey'),n=$('#barnote');if(!k)return; + if(state.own&&!state.areas.size){k.innerHTML='Full scoreyour mix above FullFull above your mix▲▼ places moved vs the Full score';if(n)n.innerHTML='Your own weights, scored the same way as the Full score. ▲▼ shows how many places each model moves compared with the published Full score, and the dashed mark is its Full score.';return} + if(state.areas.size){k.innerHTML='';if(n)n.textContent=`Showing the mean of the chosen areas, ${state.pub?'public benchmarks only':state.own?'public and private combined with your part weights':'public and private combined as in the Full score'}.`;return} + k.innerHTML=state.pub?'Full scorepublic-only leadFull above public▲▼ places moved vs the Full score':''; + if(n)n.innerHTML=state.pub?'The public benchmarks alone. ▲▼ shows how many places each model moves compared with the Full score, and the dashed mark is its Full score.':`The Full score: ${pctW('public')} public benchmarks, ${pctW('same_skills')} private tests of the same skills and ${pctW('new_domains')} private tasks from new domains, on one scale. Hover or tap any bar for its parts. How it works →`; } function drawOverview(){ const rows=sorted(ROWS.map(r=>({...r,score:scoreOf(r),raw:scoreOf(r)}))).filter(sizePasses); drawCharts(rows); + if(V3){paintToggle();const cg=$('.cats');if(cg)cg.innerHTML=overviewCard()+AREAS().map(categoryCard).join('')} drawSize(rows); drawIdxCal(rows); $('#table').innerHTML=tableHTML(rows); - const cap=$('#barcap'),cap2=$('#scattercap');if(cap)cap.textContent=customLabel();if(cap2)cap2.textContent='Median latency vs '+customLabel();const c3=$('#sizecap'),c4=$('#idxcalcap');if(c3)c3.textContent='Model size vs '+customLabel();if(c4)c4.textContent='Calibration error vs '+customLabel(); + const cap=$('#barcap'),cap2=$('#scattercap');if(cap){cap.textContent=customLabel();cap.hidden=!!V3&&!state.areas.size}if(cap2)cap2.textContent='Median latency vs '+customLabel();const c3=$('#sizecap'),c4=$('#idxcalcap');if(c3)c3.textContent='Model size vs '+customLabel();if(c4)c4.textContent='Calibration error vs '+customLabel(); } function benchRows(id){ const b=bench(id),lower=b.lower; const rows=D.models.map(m=>{const r=modelResult(m,id);if(!r||r.score==null)return null;const cov=coverageOf(m,id); - return {engine:m.engine,name:m.long_name||m.name,m,meta:m.meta,score:r.score,adj:lower?r.score:r.score*cov,cov,jev:r.jev,lat:r.median_ms,tracks:r.tracks}}).filter(Boolean); - const j=jevResult(id);if(j&&j.score!=null)rows.push({engine:'jev',name:'Jev',isJev:true,m:D.jev,meta:null,score:j.score,adj:j.score,cov:1,lat:j.median_ms}); + const bm=m.benchmarks&&m.benchmarks[String(id)];return {engine:m.engine,name:m.long_name||m.name,m,meta:m.meta,priv:bm&&bm.private_eq!=null?bm.private_eq:null,score:r.score,adj:lower?r.score:r.score*cov,cov,jev:r.jev,lat:r.median_ms,tracks:r.tracks}}).filter(Boolean); + const j=jevResult(id),jb=D.jev.benchmarks&&D.jev.benchmarks[String(id)];if(j&&j.score!=null)rows.push({engine:'jev',name:'Jev',isJev:true,m:D.jev,priv:jb&&jb.private_eq!=null?jb.private_eq:null,meta:null,score:j.score,adj:j.score,cov:1,lat:j.median_ms}); rows.sort((x,y)=>lower?x.adj-y.adj:y.adj-x.adj); return rows; } @@ -780,9 +1008,10 @@ function benchCard(id){ const inIndex=D.categories.some(x=>x.panel.includes(+id)); const jevAt=rows.findIndex(r=>r.isJev); const shown=rows.slice(0,5);if(jevAt>=5)shown.push(rows[jevAt]); - const li=(r,i)=>`
  • ${i+1}${esc(r.name)}${pct(r.adj)}
  • `; - return `

    ${esc(b.dataset)}${goldMark(b)}${inIndex?'✦ in the index':noIndex(b)}

    ${esc(b.metric||'')}${b.baseline.value!=null?` · random ${pct(b.baseline.value)}`:''}
    -
      ${shown.map((r,i)=>li(r,rows.indexOf(r))).join('')}
    + const li=(r,i)=>`
  • ${i+1}${esc(r.name)}${wnSup(r)}${pct(r.adj)}${b.private?`${r.priv!=null?pct(r.priv):'—'}`:''}
  • `; + return `

    ${esc(b.dataset)}${b.private?'+':''}${goldMark(b)}${inIndex?'✦ in the index':noIndex(b)}

    ${esc(b.metric||'')}${b.baseline.value!=null?` · random ${pct(b.baseline.value)}`:''}
    + ${b.private?'
    publicprivate
    ':''}
      ${shown.map((r,i)=>li(r,rows.indexOf(r))).join('')}
    + ${b.private?`

    + also assessed on a private benchmark of the same competency; its score is in the second column.

    `:''} Full ranking · ${rows.length} models
    `; } const refLabel=r=>{const u=r.url,m=u.match(/arxiv\.org\/abs\/([0-9.]+)/);if(r.kind==='paper')return m?`paper · arXiv ${m[1]}`:/aclanthology/.test(u)?'paper · ACL Anthology':'paper';return `${r.kind} · ${u.replace(/^https?:\/\/(www\.)?/,'').replace(/\/(tree|blob)\/.*$/,'').replace(/\/$/,'')}`}; @@ -790,27 +1019,29 @@ const refLinks=b=>(b.references||[]).length?`
    ${b.reference function benchModalHTML(id){ const b=bench(id),rows=benchRows(id),c=D.categories.find(x=>x.id===b.group)||{}; const inIndex=D.categories.some(x=>x.panel.includes(+id)); - const W=880,H=300,L=44,R=12,T=16,B=104,step=(W-L-R)/Math.max(rows.length,1); + const LCH=6.4,W=880,L=44,R=12,T=16,B=Math.ceil(Math.max(...rows.map(r=>r.name.length))*LCH*Math.sin(Math.PI/3))+20,H=196+B,step=(W-L-R)/Math.max(rows.length,1),VX=Math.min(-8,Math.floor(Math.min(...rows.map((r,i)=>L+i*step+step*.5-r.name.length*LCH*.5))-6)); + const showJev=rows.filter(r=>!r.isJev&&r.jev!=null).length>rows.length/2; const py=v=>H-B-Math.max(0,Math.min(1,v))*(H-T-B); let g='';[0,.25,.5,.75,1].forEach(v=>{g+=`${Math.round(v*100)}%`}); if(b.baseline.value!=null)g+=``; rows.forEach((r,i)=>{const x=L+i*step+step*.15,w=step*.7,y=py(r.adj); g+=`${esc(r.name)} · ${pct(r.adj)}`; - const t=r.name.length>18?r.name.slice(0,17)+'…':r.name;g+=`${esc(t)}`}); + const t=r.name;g+=`${esc(t)}`}); const tr=rows.map((r,i)=>`${i+1} -
    ${esc(r.name)}${r.m&&!r.isJev&&modelResult(r.m,id)?.contamination?info(esc(modelResult(r.m,id).contamination)):''}
    - ${pct(r.adj)}${!r.isJev&&r.cov<0.999?`${pct(r.score)} on answered`:''} - ${r.isJev?'—':`${pct(r.jev)}`} +
    ${esc(r.name)}${wnSup(r)}${r.m&&!r.isJev&&modelResult(r.m,id)?.contamination?info(esc(modelResult(r.m,id).contamination)):''}
    + ${pct(r.adj)}${!r.isJev&&r.cov<0.999?`${pct(r.score)} on answered`:''}${b.private?`${r.priv!=null?pct(r.priv):'—'}`:''} + ${showJev?(r.isJev?'—':`${pct(r.jev)}`):''} + ${pct(r.cov)}${ms(r.lat)}`).join(''); - return `
    ${esc(c.label||'')} ${inIndex?'in the index':`shown, not in the index${b.index_note?info(esc(b.index_note)):''}`}

    ${esc(b.dataset)} ${goldMark(b)}

    -

    ${esc(b.explainer||'')}

    ${refLinks(b)} + return `
    ${esc(c.label||'')} ${inIndex?'in the index':`shown, not in the index${b.index_note?info(esc(b.index_note)):''}`}

    ${esc(b.dataset)}${b.private?'+':''} ${goldMark(b)}

    +

    ${esc(b.explainer||'')}

    ${b.private?`

    + also assessed on a private benchmark of the same competency; the private column shows each model's score there in raw accuracy, the same units as the public column.

    `:''}${refLinks(b)}
    ${esc(b.metric||'')}${b.baseline.value!=null?` · random baseline ${pct(b.baseline.value)} (${esc(b.baseline.label||'')})`:''}${b.cases?` · ${fmt(b.cases)} cases`:''}${b.lower?' · lower is better':''}
    -
    ${g}
    -
    ${tr}
    #modelscorejev · same casesansweredmedian
    +
    ${g}
    +
    ${b.private?'':''}${showJev?'':''}${tr}
    #modelscoreprivatejev · same casesansweredmedian

    Ranked on the coverage-adjusted score: a request the model could not answer counts as wrong, so the number above matches what feeds the index. Where the model answered everything the two are identical.

    `; } function openBench(id,push){ - if(!D||!D.benchmarks[String(id)])return; + if(!D||!D.benchmarks[String(id)]||(IDX.size&&!IDX.has(+id)))return; let dlg=$('#benchdlg'); if(!dlg){dlg=document.createElement('dialog');dlg.id='benchdlg';document.body.appendChild(dlg); dlg.addEventListener('click',e=>{if(e.target===dlg||e.target.closest('.dlg-close'))closeBench(true)}); @@ -830,7 +1061,7 @@ function starburst(){ return ``; } function whatsNew(){ - const items=D.suite.changes||[]; + const items=V3?[`The main ranking is the Full score: ${pctW('public')} public benchmarks, ${pctW('same_skills')} private tests of the same skills and ${pctW('new_domains')} private tasks from new domains.`,`Private tests and new-domain private tasks are put on the public scale using ${V3.formula.equating.bases} untuned stock models, so every part counts in the same units.`,'Most of the score comes from tests nobody can train on, so a public-only advantage counts for little.',`Models within ${V3.formula.tie_band} points of the first model in their group share a rank: a gap that small could come from which questions happened to be sampled.`,`The public index is rebuilt: ${V3.public_index_note}; WinoGrande now counts under Knowledge & Reasoning.`,'The Vision board is live: switch to Vision at the top of the page.']:(D.suite.changes||[]); return `

    New in ${esc(EDITION().label)}

      ${items.map(x=>`
    • ${esc(x)}
    • `).join('')}
    Full changelog →
    `; } function wireWhatsNew(){ @@ -851,18 +1082,20 @@ function renderOverview(){ const arch=new Set(D.models.map(m=>m.meta.technique).filter(Boolean)); $('#app').innerHTML=`

    Decision Index ${esc(E.num)}${E.base?whatsNew():''}

    -

    ${D.models.length} open reproductions of TypeSafe Jev's "Decision Model" (zero-shot classification) on the same benchmark suite, requesting ${Math.round(D.suite.requests/1000)}K decisions per model across ${D.suite.benchmarks} benchmarks.

    -
    suite v${esc(E.num)} · Jev ${esc(D.suite.jev_version||'')} · reproductions run on ${esc(D.suite.hardware)} · updated ${esc((D.generated_utc||'').slice(0,10))}
    - -
    ${sizebar()}
    -
    Decision Index
    + ${V3?v3Hero():`

    ${D.models.length} open reproductions of TypeSafe Jev's "Decision Model" (zero-shot classification) on the same benchmark suite, requesting ${Math.round(D.suite.requests/1000)}K decisions per model across ${D.suite.benchmarks} benchmarks.

    `} + ${modeSwitch()} +
    ${V3?`v${esc(E.num)} · ${V3.models.length} models`:`suite v${esc(E.num)}`} · Jev ${esc(D.suite.jev_version||'')} · reproductions run on ${esc(D.suite.hardware)} · updated ${esc(((V3&&V3.generated_utc)||D.generated_utc||'').slice(0,10))}
    + +
    ${sizebar()}
    ${V3?'
    '+(OWN?'':'')+'
    ':''}
    +
    Decision Index
    ${V3?'

    ':''}${wnFoot()}
    ${paretoBtn('size')}
    Model size vs Decision Index
    ${paretoBtn('cal')}
    Calibration error vs Decision Index
    ${paretoBtn('lat')}
    Median latency vs Decision Index
    -

    Head to head

    Jev against the three strongest open models in each capability area. Every spoke is one benchmark.

    + ${V3?v3GapSection():''} +

    Head to head

    Jev against the three strongest models in each capability area. Every spoke is one benchmark.

    ${overviewCard()}${AREAS().map(categoryCard).join('')}

    Full results

    Click a model for its complete benchmark-by-benchmark page. Sort any column.

    -
    ${sizebar()}
    +
    ${sizebar()}${V3?`
    ${OWN?``:''}
    `:''}

    Answered is the share of the ${fmt(D.suite.requests)} requests the model produced a valid typed answer for; unsupported requests count as wrong in every index. Calibration is the expected calibration error in points, lower is better. MMLU, GPQA and BFCL show each model's own accuracy on the cases it answered. Jev's latency is a hosted HTTP round trip and is not a controlled comparison with local GPU runs.

    Calibration: confidence vs reality

    Every answer comes with a probability. Left: how sure each model says it is against how often it is right. Right: the average gap between the two, lower is better.

    stated confidence vs accuracy
    calibration ladder · expected calibration error
    @@ -870,9 +1103,10 @@ function renderOverview(){

    All benchmarks

    Every task in the suite with its own ranking. Click one for the full table and what the task asks.

    + ${V3?v3Teasers():''}

    How the index is computed

    One number per model, from the same ${D.suite.panel}-benchmark panel. Weights are fixed; nothing is tuned to the entrants. Full methodology →

    -

    Decision Index

    100 × mean of the ${WORDS[AREAS().length]||AREAS().length} area scores

    ${CHANCE()?'Each benchmark is chance-corrected first: 0 is random guessing, 100 is perfect. ':''}Each capability area is the mean of its benchmarks' primary metrics, so every area counts the same however many tasks it holds.${(D.suite.lower_rules||[]).map(x=>` ${esc(x.name)} counts against its baseline: ${esc(x.baseline_label)} scores zero.`).join('')}

    +

    ${V3?'Full score':'Decision Index'}

    ${V3?`${V3.weights.public.toFixed(2)} × public + ${V3.weights.same_skills.toFixed(2)} × same-skill private + ${V3.weights.new_domains.toFixed(2)} × new domains`:`100 × mean of the ${WORDS[AREAS().length]||AREAS().length} area scores`}${V3?'

    The public part is 100 × the weighted mean of the area scores, with GSM8K rebuilt and ForecastBench retired. The private parts come from tests of the same skills and from new-domain private tasks; only totals are shown. Both are put on the public scale using untuned stock models before weighting. How it works →

    ':'

    '}${CHANCE()?'Each benchmark is chance-corrected first: 0 is random guessing, 100 is perfect. ':''}${V3?'Each capability area is the mean of its benchmarks\' primary metrics, and the areas are combined with fixed weights.':'Each capability area is the mean of its benchmarks\' primary metrics, so every area counts the same however many tasks it holds.'}${(D.suite.lower_rules||[]).map(x=>` ${esc(x.name)} counts against its baseline: ${esc(x.baseline_label)} scores zero.`).join('')}

    Coverage counts

    unanswered = wrong

    Every model faces the same ${fmt(D.suite.requests)} requests. A request the model cannot take, refuses or errors on scores zero, so nobody climbs by skipping the hard cases.

    Same cases as Jev

    frozen suite · frozen answers

    Jev's own results were recorded once and never re-run. On every model page each result sits beside Jev's answer on exactly the same cases.

    @@ -888,7 +1122,7 @@ function renderOverview(){ function drawCalibration(){ const host=$('#calscatter'),lad=$('#calladder');if(!host||!lad)return; const rows=ROWS.filter(r=>r.m&&r.m.calibration); - const attrs=r=>{const c=r.m.calibration;return `data-engine="${esc(r.engine)}" data-name="${esc(dname(r))}" data-raw="${one(r.raw)}" data-acc="${pct(c.acc)}" data-conf="${pct(c.conf)}" data-ece="${(c.ece*100).toFixed(1)}" data-over="${pct(c.over95)}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'probabilities as returned by the hosted API, rounded to two decimals':''}"`}; + const attrs=r=>{const c=r.m.calibration;return `data-engine="${esc(r.engine)}" data-name="${esc(dname(r)+star(r))}" data-raw="${one(r.raw)}" data-acc="${pct(c.acc)}" data-conf="${pct(c.conf)}" data-ece="${(c.ece*100).toFixed(1)}" data-over="${pct(c.over95)}" data-kind="${esc(r.meta?.kind||'')}" data-base="${esc(r.meta?.base_model||'')}" data-note="${r.jev?'probabilities as returned by the hosted API, rounded to two decimals':''}"`}; const W=560,H=520,L=46,R=14,T=14,B=44,x0=0.4,y0=0.2; const px=v=>L+(v-x0)/(1-x0)*(W-L-R),py=v=>H-B-(v-y0)/(1-y0)*(H-T-B); let g=``; @@ -913,14 +1147,23 @@ function drawCalibration(){ byece.forEach((r,i)=>{const c=r.m.calibration,y=LT+i*RH,e=c.ece*100; l+=``; l+=`${e.toFixed(1)}`; - const nm=r.name.length>24?r.name.slice(0,23)+'…':r.name;l+=`${esc(nm)}`; + const nm=(r.name.length>24?r.name.slice(0,23)+'…':r.name)+star(r),wt=wnote(r)?`${esc(wnote(r))}`:'';l+=`${wt}${esc(nm)}`; const ox=lx(c.over95*100);l+=``}); - lad.innerHTML=`
    ${l}expected calibration error, points · ◆ confident-and-wrong share
    `; + lad.innerHTML=`
    ${l}calibration error, points · ◆ confident and wrong
    `; wireScrollHint('#calladder .vscroll',true); } +let IDX=new Set(); +function pruneToIndex(){ + IDX=new Set(Object.values(D.suite.areas||{}).flat()); + if(!IDX.size)return; + const keep=id=>IDX.has(id)||!D.benchmarks[String(id)]; + D.categories.forEach(c=>['suite','group','priority'].forEach(k=>{if(c[k])c[k]=c[k].filter(keep)})); + D.categories.forEach(c=>{if(c.panel&&c.panel.length&&c.priority)c.priority=c.priority.filter(id=>c.panel.includes(id))}); + D.suite.benchmarks=IDX.size;D.suite.jev_benchmarks=IDX.size; +} function drawBenchGrid(){ const bar=$('#benchbar'),grid=$('#bgrid');if(!bar||!grid)return; - bar.innerHTML=`Area${AREAS().map(c=>``).join('')}`; + bar.innerHTML=`Area${AREAS().map(c=>``).join('')}`; const ids=AREAS().filter(c=>!state.benchArea||c.id===state.benchArea).flatMap(c=>c.suite.filter(id=>!state.benchIndexOnly||c.panel.includes(id))); grid.innerHTML=ids.map(id=>benchCard(id)).join('')||'

    No benchmarks match.

    '; } @@ -935,8 +1178,9 @@ function railHTML(v,base,jev,lower){ const ticks=(b0!=null?``:'')+(jev!=null?``:''); return `
    ${inner}${ticks}
    `; } +const jevSame=subject=>subject.engine!=='jev'&&Object.values(subject.results||{}).some(r=>r&&r.jev!=null); function benchRow(subject,id){ - const b=bench(id);const isJev=subject.engine==='jev'; + const b=bench(id);const isJev=subject.engine==='jev',sj=jevSame(subject); const r=isJev?jevResult(id):modelResult(subject,id); if(!r)return ''; const v=r.score,base=b.baseline.value,jev=isJev?null:r.jev; @@ -945,7 +1189,7 @@ function benchRow(subject,id){ const vsJev=(!isJev&&v!=null&&jev!=null)?(b.lower?jev-v:v-jev)*100:null; return `
    ${esc(b.dataset)}${goldMark(b)}${noIndex(b)}
    ${esc(b.explainer||'')}
    ${pct(v)}${r.contamination?info(esc(r.contamination)):''}${esc(r.metric||b.metric||'')}${railHTML(v,base,jev,b.lower)}${gain!=null?`${gain>=0?'+':''}${gain.toFixed(1)} pp vs random`:''}${r.tracks&&r.tracks.length?`${r.tracks.filter(t=>!t.headline).map(t=>`${esc(t.track)} ${pct(t.score)}`).join(' · ')}`:''} - ${isJev?'':`${pct(jev)}${vsJev!=null?`${vsJev>=0?'+':''}${vsJev.toFixed(1)} pp`:''}`} + ${isJev||!sj?'':`${pct(jev)}${vsJev!=null?`${vsJev>=0?'+':''}${vsJev.toFixed(1)} pp`:''}`} ${base==null?'—':pct(base)}${esc(b.baseline.label||'')} ${isJev?fmt(r.cases):fmt(r.requests)}${isJev?'cases':pct(cov)+' answered'}${r.median_ms!=null?`${ms(r.median_ms)} median${isJev&&r.p95_ms!=null?` · p95 ${ms(r.p95_ms)}`:''}`:''}`; } @@ -960,15 +1204,15 @@ function modelCategory(subject,c){ const series=[]; if(axesIds.some(id=>bench(id).baseline.value!=null))series.push({name:'Random baseline',color:'#8C8C8C',dash:'4 3',width:1.5,vals:axesIds.map(id=>bench(id).baseline.value)}); if(isJev)series.push({name:'Jev',color:'#232323',fill:'rgba(35,35,35,.12)',width:3,vals:axesIds.map(id=>jevResult(id)?.score??null)}); - else{series.push({name:'Jev on the same cases',color:'#232323',width:2.5,dash:'',vals:axesIds.map(id=>modelResult(subject,id)?.jev??null)}); + else{if(jevSame(subject))series.push({name:'Jev on the same cases',color:'#232323',width:2.5,dash:'',vals:axesIds.map(id=>modelResult(subject,id)?.jev??null)}); series.push({name:subject.long_name||subject.name,color:colorOf({meta:subject.meta}),fill:colorOf({meta:subject.meta})+'24',width:3,vals:axesIds.map(id=>modelResult(subject,id)?.score??null)});} const cs=(isJev?D.jev:subject).categories.find(x=>x.id===c.id)||null; const jc=D.jev.categories.find(x=>x.id===c.id)||null; const chart=axes.length>=3?radarSVG(axes,series,{aria:c.label}):(axes.length?lollipopSVG(axes,series):'

    No static benchmark in this category.

    '); return `
    -

    ${esc(c.label)}

    ${ordered.length} benchmarks${cs?` · index area score ${one(cs[AK()]*100)}`:' · outside the index'}${isJev||!jc?'':` · Jev ${one(jc[AK()]*100)}`}
    +

    ${esc(c.label)}

    ${ordered.length} benchmarks${cs?` · area score ${one(catV(cs,isJev?D.jev:subject)*100)} (${V3?(state.pub?'public only':state.own?'your own mix':'public and private'):'public'})`:' · outside the index'}${isJev||!jc?'':` · Jev ${one(catV(jc,D.jev)*100)}`}

    ${esc(c.description||'')}

    -
    ${isJev?'':''}${shown.map(id=>benchRow(subject,id)).join('')}
    benchmark${isJev?'jev result':'result'}jev · same casesrandom baseline${isJev?'cases · latency':'requests · latency'}
    +
    ${isJev||!jevSame(subject)?'':''}${shown.map(id=>benchRow(subject,id)).join('')}
    benchmark${isJev?'jev result':'result'}jev · same casesrandom baseline${isJev?'cases · latency':'requests · latency'}
    ${ordered.length>5?`
    `:''}

    highlighted tasks

    ${chart}
    ${series.slice().reverse().map(s=>`${esc(s.name)}`).join('')}
    @@ -995,8 +1239,9 @@ const noIndex=b=>b&&b.index_note?`not in the index$ const info=text=>`${text}`; function gapLine(m,n=2){const g=m&&m.gaps;if(!g||g.share<0.05||!g.reasons?.length)return '';return g.reasons.slice(0,n).map(r=>`${esc(r.reason)} (${pct(r.share)})`).join(' · ')} function standingsHTML(engine){ + if(V3){const o=v3Order();return ``} const order=ROWS.slice().sort((a,b)=>b.raw-a.raw),rank=rankOf(); - return ``; + return ``; } function wideCategory(subject,c){ const isJev=subject.engine==='jev'; @@ -1010,8 +1255,8 @@ function renderModel(engine){ const isJev=engine==='jev'; const subject=isJev?D.jev:D.models.find(m=>m.engine===engine); if(!subject){$('#app').innerHTML=`

    No model called “${esc(engine)}” in this build.

    `;return} - const rank=rankOf();const order=ROWS.slice().sort((a,b)=>b.raw-a.raw); - const i=order.findIndex(r=>r.engine===engine),prev=order[i-1],next=order[i+1]; + const rank=rankOf();const order=V3?v3Order():ROWS.slice().sort((a,b)=>b.raw-a.raw); + const i=order.findIndex(r=>r.engine===engine),prev=order[i-1],next=order[i+1];const V=v3Row(engine); const row=ROWS.find(r=>r.engine===engine); const s=subject.scores,J=D.jev.scores; const cov=isJev?1:(subject.counts.ok||0)/D.suite.requests; @@ -1024,18 +1269,19 @@ function renderModel(engine){ ].join(''); const tile=(v,l,ref,key)=>`
    ${v}${l}${ref!=null?`${ref}`:''}
    `; const html=` - +
    -
    ${isJev?'':''}

    ${isJev?'Jev benchmark':`${esc(subject.long_name||subject.name)}`}

    -

    ${isJev?`${D.suite.jev_benchmarks} static benchmarks and six interactive environments, scored in a comparable manner against the random baseline. This is the reference every reproduction is measured against.`:`Rank #${rankText(rank[engine],true)} of ${ROWS.length} on the Decision Index. Scored on the same frozen ${fmt(D.suite.requests)}-decision suite as Jev, with Jev's answers on exactly the same cases beside each result.`}

    +
    ${isJev?'':''}

    ${isJev?'Jev benchmark':`${orgImg(subject,'ohero')}${esc(subject.long_name||subject.name)}${wnSup(subject)}`}

    +

    ${isJev?(V3?`Scored like every reproduction: the ${D.suite.panel} public benchmarks in ${AREAS().length} areas, the private tests of the same skills and the private tasks from new domains. This is the reference every reproduction is measured against.`:`${D.suite.jev_benchmarks} static benchmarks and six interactive environments, scored in a comparable manner against the random baseline. This is the reference every reproduction is measured against.`):`${V?`Rank #${rankText(v3Rank(engine),true)} of ${V3.models.length} on the Full score.`:`Rank #${rankText(rank[engine],true)} of ${ROWS.length} on the Decision Index.`} Scored on the same frozen ${fmt(D.suite.requests)}-decision suite as Jev${jevSame(subject)?", with Jev's answers on exactly the same cases beside each result":''}.`}

    ${who}
    ${isJev?'':``}
    - ${tile(one(s[HK()]),'Decision Index',[isJev?null:`Jev ${one(J[HK()])}`,CHANCE()?`raw accuracy ${one(s.balanced_raw)} (not chance-corrected)`:null].filter(Boolean).join(' · ')||null,true)} - ${tile(isJev?'ref':'#'+(rank[engine]?rank[engine].n:'—'),isJev?'reference':'rank of '+ROWS.length+(rank[engine]?.tied?' · tied':''),isJev?'the model every row is measured against':(prev?`${esc(dname(prev))} is #${rankText(rank[prev.engine],true)}`:'top of the index'))} + ${tile(one(s[HK()]),V?'Full score':'Decision Index',[isJev?null:`Jev ${one(J[HK()])}`,V?`public ${one(s.public_skill)}`:null,CHANCE()?`raw accuracy ${one(s.balanced_raw)} (not chance-corrected)`:null].filter(Boolean).join(' · ')||null,true)} + ${V?tile((t=>t.startsWith('=')?t:'#'+t)(String(rankText(v3Rank(engine)))),'rank of '+V3.models.length+' · Full score'+(V.tied?' · tied':''),isJev?'the model every row is measured against':(prev?`${esc(prev.name)} is ${(t=>t.startsWith('=')?t:'#'+t)(String(rankText(v3Rank(prev.engine))))}`:'top of the board')):tile(isJev?'ref':'#'+(rank[engine]?rank[engine].n:'—'),isJev?'reference':'rank of '+ROWS.length+(rank[engine]?.tied?' · tied':''),isJev?'the model every row is measured against':(prev?`${esc(dname(prev))} is #${rankText(rank[prev.engine],true)}`:'top of the index'))} ${tile(pct(cov),'requests answered',isJev?`${fmt(D.suite.requests)} requests`:`${fmt(subject.counts.ok||0)} of ${fmt(D.suite.requests)}${gapLine(subject)?info('Why not all of them? '+gapLine(subject)):''}`)} ${tile(ms(subject.latency.median),'median latency',isJev?'HTTP round trip':`p95 ${ms(subject.latency.p95)} · ${esc(D.suite.hardware)}`)}
    ${standingsHTML(engine)}
    + ${v3Block(engine)}

    Where it is strong

    Mean of each area's primary metric over every benchmark ${isJev?'in the suite':'this model ran, beside Jev on the same cases'}. The index itself uses a fixed ${D.suite.panel}-task subset.

    ${areasFor(subject).map(c=>{const w=wideCategory(subject,c);if(!w.n)return ''; return `

    ${esc(c.label)}

    ${w.n} benchmark${w.n===1?'':'s'}${isJev?'':` · ${pct(w.cov)} answered`}
    @@ -1043,13 +1289,13 @@ function renderModel(engine){
    ${one(w.v*100)}${w.j==null?'':`Jev ${one(w.j*100)}`}
    `}).join('')}

    Benchmark results

    ${esc((WORDS[areasFor(subject).length]||'').replace(/^./,ch=>ch.toUpperCase()))} capability areas. Each opens with five highlighted tasks; expand an area for every result.

    ${areasFor(subject).map(c=>modelCategory(subject,c)).join('')}
    -

    Each benchmark reports its own primary metric, so scores are not comparable across rows. The solid tick on each bar is that task's random baseline${isJev?'':', the dashed tick is Jev on the very same cases'}, and the gap above random is the comparable figure. Brier loss is lower-is-better and its gap is signed accordingly.

    +

    Each benchmark reports its own primary metric, so scores are not comparable across rows. The solid tick on each bar is that task's random baseline${isJev||!jevSame(subject)?'':', the dashed tick is Jev on the very same cases'}, and the gap above random is the comparable figure. Brier loss is lower-is-better and its gap is signed accordingly.

    ${isJev?frontierHTML():''} ${isJev&&D.jev.summary_notes?.length?`

    Notes from the run

    ${D.jev.summary_notes.map(n=>`

    ${esc(n)}

    `).join('')}`:''} `; $('#app').innerHTML=html; const list=$('.st-list'),cur=$('.st-row.cur'); - if(list&&cur)list.scrollTop=cur.offsetTop-list.clientHeight/2+cur.offsetHeight/2; + if(list&&cur){const go2=()=>{list.scrollTop=cur.offsetTop-list.clientHeight/2+cur.offsetHeight/2};go2();requestAnimationFrame(go2)} } function currentEngine(){ @@ -1067,8 +1313,8 @@ function route(keep,restoreY){ if(!D)return; const y=window.scrollY; const e=currentEngine(); - const key=e||'__overview__'; - const render=()=>{if(e)renderModel(e);else renderOverview();baseKey=key}; + const md=MODE(),key=e||('__overview__'+md); + const render=()=>{if(e)renderModel(e);else if(md==='vision')renderVision();else renderOverview();baseKey=key}; if(key!==baseKey){render();window.scrollTo({top:restoreY!=null?restoreY:(keep?y:0)})} else if(!keep){render();window.scrollTo({top:restoreY!=null?restoreY:0})} const bid=currentBench(); @@ -1076,15 +1322,15 @@ function route(keep,restoreY){ } document.addEventListener('click',e=>{ const pb=e.target.closest('button[data-pareto]'); - if(pb){const k=pb.dataset.pareto;PARETO[k]=!PARETO[k];pb.setAttribute('aria-pressed',PARETO[k]);drawOverview();return} + if(pb){const k=pb.dataset.pareto;PARETO[k]=!PARETO[k];pb.setAttribute('aria-pressed',PARETO[k]);if(MODE()==='vision'&&!currentEngine())drawVCharts();else drawOverview();return} const al=e.target.closest('text.axlab[data-area-lab]'); if(al){state.areas=new Set([al.dataset.areaLab]);if(state.sortKey.startsWith('area:'))state.sortKey='score';gtip().hidden=true;drawOverview();const fr=$('#fullresults');if(fr)fr.scrollIntoView({behavior:'smooth'});return} const bl=e.target.closest('a[href^="?bench="],text.axlab[data-bench]'); if(bl&&!e.metaKey&&!e.ctrlKey){e.preventDefault();const id=bl.dataset.bench||new URL(bl.getAttribute('href'),location.href).searchParams.get('bench');if(id)openBench(id,true);return} + const inf=e.target.closest('button.info'); + if(inf){e.preventDefault();inf.classList.toggle('open');fitTip(inf);return} const nav=e.target.closest('a[href^="?model="],a[data-home]'); if(nav&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey){e.preventDefault();const dlg=$('#benchdlg');if(dlg&&dlg.open)dlg.close();go(nav.dataset.home!=null?null:new URL(nav.href,location.href).searchParams.get('model'));return} - const inf=e.target.closest('button.info'); - if(inf){inf.classList.toggle('open');fitTip(inf);return} if(e.target.closest('.infowrap'))return; document.querySelectorAll('button.info.open').forEach(b=>b.classList.remove('open')); const ba=e.target.closest('button.achip[data-barea],button.achip[data-bindex]'); @@ -1103,16 +1349,17 @@ document.addEventListener('click',e=>{ if(n){go(n.c.dataset.engine);return}} else if(HOT)hideScatTip(); const bar=e.target.closest('rect.bar[data-engine],circle.pt[data-engine]'); - if(bar){go(bar.dataset.engine);return} + if(bar){if(lastPointer==='touch'&&bar.closest('#bars')&&BARHOT!==bar.dataset.engine){BARHOT=bar.dataset.engine;tipHandler({target:bar});return}go(bar.dataset.engine);return} + BARHOT=null;document.querySelectorAll('#bars .tip').forEach(t=>t.hidden=true); const tr=e.target.closest('tbody tr[data-engine]'); if(tr&&!e.target.closest('a')){go(tr.dataset.engine)} }); -document.addEventListener('mouseover',e=>{const a=e.target.closest&&e.target.closest('text.axlab[data-area-lab]');if(a){const tip=gtip();tip.innerHTML=areaTip(a.dataset.areaLab);tip.hidden=false;place(tip,e);return}const t=e.target.closest&&e.target.closest('text.axlab[data-bench]');const tip=gtip();if(!t){tip.hidden=true;return}const b=bench(t.dataset.bench);tip.innerHTML=`${esc(b.dataset)}
    ${esc(b.explainer||'')}
    ${esc(b.metric||'')} · click for the ranking
    `;tip.hidden=false;place(tip,e)}); +document.addEventListener('mouseover',e=>{const a=e.target.closest&&e.target.closest('text.axlab[data-area-lab]');if(a){const tip=gtip();tip.innerHTML=areaTip(a.dataset.areaLab);tip.hidden=false;place(tip,e);return}const t=e.target.closest&&e.target.closest('text.axlab[data-bench]');const tip=gtip();if(!t){tip.hidden=true;return}const b=bench(t.dataset.bench);tip.innerHTML=`${esc(b.dataset)}
    ${esc(b.explainer||'')}
    ${esc(b.metric||'')} · click for the ranking
    ${b.private?`
    ${TWIN_LINE}
    `:''}`;tip.hidden=false;place(tip,e)}); document.addEventListener('mousemove',e=>{const tip=$('#gtip');if(tip&&!tip.hidden)place(tip,e)}); function fitTip(b){const t=b.nextElementSibling;if(!t)return;t.style.left='';t.style.right='';t.style.top='';t.style.bottom='';const r=t.getBoundingClientRect();if(!r.width)return;if(r.right>innerWidth-8){t.style.left='auto';t.style.right='0'}else if(r.left<8){t.style.left='0';t.style.right='auto'}const sc=b.closest('.table-scroll');if(sc&&r.bottom>sc.getBoundingClientRect().bottom-4){t.style.top='auto';t.style.bottom='24px'}} document.addEventListener('mouseover',e=>{const b=e.target.closest&&e.target.closest('button.info');if(b)fitTip(b)}); function areaTip(id){ - const c=cat(id)||{},v=m=>{const x=(m.categories||[]).find(y=>y.id===id);return x&&x[AK()]!=null?x[AK()]*100:null}; + const c=cat(id)||{},v=m=>{const x=(m.categories||[]).find(y=>y.id===id);return x&&catV(x,m)!=null?catV(x,m)*100:null}; const top=D.models.map(m=>({m,s:v(m)})).filter(x=>x.s!=null).sort((a,b)=>b.s-a.s).slice(0,3); return `${esc(c.label||id)}
    ${esc(c.description||'')}
    Jev${one(v(D.jev))}
    ${top.map((t,i)=>`
    ${i+1}. ${esc(t.m.long_name||t.m.name)}${one(t.s)}
    `).join('')}
    area score${CHANCE()?', chance-corrected':''} · click to rank every model by this area
    `; } @@ -1120,21 +1367,48 @@ function gtip(){let t=$('#gtip');if(!t){t=document.createElement('div');t.id='gt function place(tip,e){const w=tip.offsetWidth,h=tip.offsetHeight;let x=e.clientX+14,y=e.clientY+14;if(x+w>innerWidth-8)x=e.clientX-w-14;if(y+h>innerHeight-8)y=e.clientY-h-14;tip.style.left=x+'px';tip.style.top=y+'px'} document.addEventListener('mouseover',tipHandler);document.addEventListener('mousemove',tipHandler); document.addEventListener('mouseout',e=>{const sel='circle.pt,rect.bar[data-name]';if(e.target.closest&&e.target.closest(sel)&&!(e.relatedTarget&&e.relatedTarget.closest&&e.relatedTarget.closest(sel))){document.querySelectorAll('#bars .tip,#calladder .tip').forEach(t=>t.hidden=true)}}); +function dotStrip(P,S,O,F){ + const W=280,LC=84,R=10,TOP=20,LH=22,vals=[P,S,O,F];let lo=Math.min(...vals),hi=Math.max(...vals),sp=hi-lo; + if(sp<8){const c=(lo+hi)/2;lo=c-4;hi=c+4;sp=8}const m=sp*0.1;lo-=m;hi+=m; + const x=v=>LC+(v-lo)/(hi-lo)*(W-LC-R),H=TOP+LH*3+2; + const lanes=[['Public',P,'#E8740C',0],['Same skills',S,'#232323',0],['New domains',O,'#9A958C',1]]; + let g='';lanes.forEach(([l,v,c],i)=>{const y=TOP+LH*i+LH/2+4;g+=`${l}`}); + const yP=TOP+LH/2+4,yS=TOP+LH*1.5+4,yO=TOP+LH*2.5+4,gap=Math.abs(P-S)>=2&&P>S; + g+=``; + const fx=x(F),fl='Full '+one(F),fw=fl.length*6.1,lx=Math.max(LC,Math.min(W-fw,fx-fw/2)); + g+=`${fl}`; + const fx0=x(F),fl0='Full '+one(F),fw0=fl0.length*6.1,fL=Math.max(LC,Math.min(W-fw0,fx0-fw0/2)); + [[P,yP,'#C2600A'],[S,yS,'#232323'],[O,yO,'#8C877E']].forEach(([v,y,c],i)=>{const t=one(v),tw=t.length*5.6;let cx=Math.max(LC+tw/2,Math.min(W-tw/2,x(v)));if(cx-tw/2fx0-3){cx=v>=F?fx0+3+tw/2:fx0-3-tw/2;if(cx+tw/2>W){cx=fx0-3-tw/2}if(cx-tw/2r?[xs+8,xs+8+tw]:[xs-8-tw,xs-8],hit=([l,h])=>lfx0-3||lW;if(hit(at(right)))right=!right;const [l]=at(right);g+=`${t}`;return}g+=`${t}`}); + g+=``; + return `${g}`; +} +function modelTip(d,touch){ + const r=ROWS.find(x=>x.engine===d.engine),v=r&&r.v3; + const rk=d.rank?'#'+String(d.rank):'',og=orgOf(r),by=og?`
    by ${esc(og.name)}
    `:''; + const row=(l,x)=>`
    ${l}${x}
    `; + if(!v)return `${esc(d.name)}${by}${rk?row('Rank',rk):''}${d.lat?row('Median latency',d.lat+' ms'):''}`; + const S=v.eq&&v.eq.S!=null?v.eq.S:v.same_skills,O=v.eq&&v.eq.O!=null?v.eq.O:v.new_domains,ow=state.own&&OWNS&&OWNS[d.engine]!=null?row('Your own',one(OWNS[d.engine])):'',tail=`${v.jev?'
    the reference model
    ':''}${rk?row('Rank',esc(rk)):''}${d.lat?row('Median latency',esc(d.lat)+' ms'):''}${d.note?`
    ${esc(d.note)}
    `:''}
    ${touch?'tap again':'click'} for the model page
    `; + if(state.pub&&!state.areas.size){const r1=x=>Math.round(x*10)/10,P=v.pub,g=r1(r1(P)-r1(S)),lvl=Math.abs(g)<2; + const head=`Public ${one(P)} · same skills ${one(S)} — ${lvl?'about level':g>0?`${one(g)} higher on public`:`${one(-g)} higher on the private tests`}`; + return `
    ${esc(d.name)}${by}
    ${head}
    ${dotStrip(P,S,O,v.v)}
    New domains ${one(O)} — tasks outside these skills, not a check on the public ones.
    ${mixLine()}
    ${tail}
    `} + return `${esc(d.name)}${by}${ow}${row('Full score',one(v.v))}${row('Public benchmarks',one(v.pub))}${row('Private tests, same skills',one(S))}${row('Private tasks from new domains',one(O))}
    ${mixLine()}
    ${tail}`; +} function tipHTML(d,touch){ - return d.ece!=null?`${esc(d.name)}
    Says it is right${esc(d.conf)}
    Actually right${esc(d.acc)}
    Calibration error${esc(d.ece)} pts
    ≥95% and wrong${esc(d.over)}
    Decision Index${esc(d.raw)}
    ${d.base?`
    ${d.kind==='inference technique'?'Runs on':/head|adapter/.test(d.kind)&&!/LoRA/.test(d.kind)?'Head on':'Fine-tuned from'}${esc(d.base)}
    `:''}${d.note?`
    ${esc(d.note)}
    `:`
    ${touch?'tap again':'click'} for the full page
    `}`:`${esc(d.name)}${d.new?'new':''}
    Decision Index${esc(d.raw)}
    ${d.rank?`
    Rank#${esc(d.rank)}
    `:''}${d.lat?`
    Median latency${esc(d.lat)} ms
    `:''}${d.size?`
    Size${esc(d.size)}
    `:''}${d.kind?`
    Technique${esc(d.kind)}
    `:''}${d.tech?`
    Family${esc(d.tech)}
    `:''}${d.base?`
    ${d.kind==='inference technique'?'Runs on':/head|adapter/.test(d.kind)&&!/LoRA/.test(d.kind)?'Head on':'Fine-tuned from'}${esc(d.base)}
    `:''}${d.note?`
    ${esc(d.note)}
    `:`
    ${touch?'tap again':'click'} for the full page
    `}`; + return d.ece!=null?`${esc(d.name)}
    Says it is right${esc(d.conf)}
    Actually right${esc(d.acc)}
    Calibration error${esc(d.ece)} pts
    ≥95% and wrong${esc(d.over)}
    Decision Index${esc(d.raw)}
    ${d.base?`
    ${d.kind==='inference technique'?'Runs on':/head|adapter/.test(d.kind)&&!/LoRA/.test(d.kind)?'Head on':'Fine-tuned from'}${esc(d.base)}
    `:''}${d.note?`
    ${esc(d.note)}
    `:`
    ${touch?'tap again':'click'} for the full page
    `}`:modelTip(d,touch); } function tipHandler(e){ const c=e.target.closest&&e.target.closest('circle.pt,rect.bar[data-name]');if(!c)return;const host=c.closest('#bars,#calladder');if(!host)return;const tip=host.querySelector('.tip');if(!tip)return; - tip.innerHTML=tipHTML(c.dataset); + tip.innerHTML=tipHTML(c.dataset,lastPointer==='touch'); tip.hidden=false; const hb=host.getBoundingClientRect(),cb=c.getBoundingClientRect(),tb=tip.getBoundingClientRect(); let left=cb.left-hb.left+cb.width+10,top=cb.top-hb.top-6; if(left+tb.width>hb.width)left=cb.left-hb.left-tb.width-10; + left=Math.max(0,Math.min(left,hb.width-tb.width)); if(top+tb.height>hb.height)top=hb.height-tb.height; tip.style.left=Math.max(0,left)+'px';tip.style.top=Math.max(0,top)+'px'; } const SCAT='#sizescatter,#scatter,#idxcal,#calscatter'; -let HOT=null,lastPointer='mouse'; +let HOT=null,lastPointer='mouse',BARHOT=null; const ptCenter=c=>{const b=c.getBoundingClientRect();return [b.left+b.width/2,b.top+b.height/2,b.width/2]}; function nearestPt(host,x,y,rad){let best=null,bd=Infinity;for(const c of host.querySelectorAll('circle.pt')){const [cx,cy,r]=ptCenter(c),d=Math.hypot(cx-x,cy-y)-r;if(d{ history.scrollRestoration='manual'; window.addEventListener('popstate',e=>route(true,e.state?e.state.y:null)); let lastNarrow=null,rsz=null; -window.addEventListener('resize',()=>{clearTimeout(rsz);rsz=setTimeout(()=>{const sc=$('#scatter');if(!sc||!D||currentEngine())return;const n=sc.clientWidth<640;if(lastNarrow!==null&&n!==lastNarrow)drawOverview();lastNarrow=n},150)}); -fetch('data/index.json?v='+Math.floor(Date.now()/6e5)).then(r=>r.json()).then(d=>{D=d;ROWS=buildRows();applyEdition(); - if(location.hash){const e=currentEngine();history.replaceState({y:0},'',e?`?model=${encodeURIComponent(e)}`:location.pathname)} - route(false)}).catch(err=>{$('#app').innerHTML=`

    Could not load data/index.json · ${esc(err.message)}

    `}); +window.addEventListener('resize',()=>{clearTimeout(rsz);rsz=setTimeout(()=>{const sc=$('#scatter');if(!sc||!D||currentEngine())return;const n=sc.clientWidth<640;if(lastNarrow!==null&&n!==lastNarrow){drawOverview()}lastNarrow=n},150)}); +let V3=null; +const v3Row=e=>V3?V3.models.find(r=>r.engine===e):null; +const v3Order=()=>V3.models.slice().sort((a,b)=>a.rank_v-b.rank_v); +const v3Rank=e=>{const r=v3Row(e);return r?{n:r.rank_tie||r.rank_v,tied:!!r.tied}:null}; +const gsign=v=>(v>0.049?'+':v<-0.049?'−':'')+Math.abs(v).toFixed(1); +const pctW=k=>Math.round(V3.weights[k]*100)+'%'; +const mixLine=()=>{if(state.own&&OWNW){const p=OWNW.p,t=(p.public+p.same_skills+p.new_domains)||1,f=x=>Math.round(x/t*100)+'%';return `Your own = public ${f(p.public)} · same skills ${f(p.same_skills)} · new domains ${f(p.new_domains)}, all on one scale.`}return `Full score = public ${pctW('public')} · same skills ${pctW('same_skills')} · new domains ${pctW('new_domains')}, all on one scale.`}; +const v3Swatch=r=>{const row=ROWS.find(x=>x.engine===r.engine);return row?colorOf(row):'#bbb'}; +function v3Hero(){ + return `

    ${D.models.length} open reproductions of TypeSafe Jev's "Decision Model", ranked by the Full score: ${D.suite.benchmarks} public benchmarks plus private tests that measure the same skills and a set of private tasks from new domains.

    `; +} +function v3Teasers(){ + const nv=VIS?VIS.entrants.length:null; + return `

    More boards

    Focused rankings beside the main board.

    +
    +
    live

    Vision board

    The same idea with images: public vision benchmarks plus private tests of the same skills, half and half. Open the Vision board →

    ${nv!=null?nv:V3.vision.entrants}vision-capable models ranked
    +
    coming in v0.3.x

    Reasoning board

    For models that can choose to think before answering the hard questions. Thinking takes longer, so these models run slower than the main board allows and get a board of their own.

    thinks when neededown board
    +
    `; +} +function v3GapSection(){ + const F=V3.formula,E=F.equating,N=D.suite.benchmarks; + return `

    How the Full score works

    Three parts, each on the same scale, added with fixed weights. Nothing is tuned to any one model.

    +
    +
    +
    1 · Public benchmarks${pctW('public')} of the Full score

    The ${N} open tasks shown on this site. Anyone can see them, and train on them.

    +
    2 · Private tests, same skills${pctW('same_skills')} of the Full score

    For each public task with a private counterpart, a test of an equivalent competence built from fresh data and never published. It carries the most weight because nobody can train on it.

    +
    3 · Private tasks from new domains${pctW('new_domains')} of the Full score

    A set of private decision tasks from new domains. Some reward broad knowledge, others reward judging when to answer yes and when to answer no.

    +
    +

    The three parts spread models out differently, so their raw points are not the same unit. Before adding the parts up, each one is put on the public scale using ${E.bases} untuned stock models as the yardstick: a model that sits one spread above the stock average on the private tests gets the score that sits one spread above the stock average on the public benchmarks. Order within each part never changes.

    +
    `; +} +function v3Block(engine,lite){ + const r=v3Row(engine);if(!r)return ''; + const tile=(v,l,sub,key)=>`
    ${v}${l}${sub?`${sub}`:''}
    `; + const w=V3.weights,p=r.parts||{},eqd=(raw,eq)=>eq!=null&&Math.abs(eq-raw)>0.05?`raw score · ${one(eq)} on the public scale`:'raw score'; + const tiles=`
    + ${tile(one(r.v),'Full score',`${w.public.toFixed(2)} × public + ${w.same_skills.toFixed(2)} × private (same skills) + ${w.new_domains.toFixed(2)} × new domains, on one scale`,true)} + ${tile(one(r.pub),'public benchmarks',`#${r.rank_pub} on the public board alone`)} + ${tile(one(r.same_skills),'private tests, same skills',eqd(r.same_skills,r.eq&&r.eq.S))} + ${tile(one(r.new_domains),'private tasks from new domains',eqd(r.new_domains,r.eq&&r.eq.O))}
    `; + const tot=(p.public||0)+(p.same_skills||0)+(p.new_domains||0)||1,seg=(k,lab,col)=>``; + const parts=p.public!=null?`
    ${seg('public','Public benchmarks','#8F8B82')}${seg('same_skills','Private tests, same skills','#232323')}${seg('new_domains','New-domain private tasks','#B8B2A6')}
    +

    Points contributed: public ${(p.public||0).toFixed(1)} · private tests ${(p.same_skills||0).toFixed(1)} · new domains ${(p.new_domains||0).toFixed(1)} = ${one(r.v)}

    `:''; + const intro=r.jev?'Jev is the reference model and is scored exactly like every reproduction.':'The private tests measure the same skills as the public benchmarks with fresh data that stays private. Only totals are shown.'; + return `

    Public and private tests

    ${intro} How it works →

    +
    ${tiles}${parts}
    `; +} + +function gaptip(){let t=$('#gaptip');if(!t){t=document.createElement('div');t.id='gaptip';t.className='gaptip';t.hidden=true;t.setAttribute('role','tooltip');document.body.appendChild(t)}return t} +let GTARGET=null; +function hideGapTip(){const t=$('#gaptip');if(t)t.hidden=true;GTARGET=null} +document.addEventListener('keydown',e=>{if(e.key==='Escape')hideGapTip()}); +window.addEventListener('scroll',hideGapTip,{passive:true}); +function ttConvert(root){ + const els=[];if(root.matches&&root.matches('[title]'))els.push(root); + if(root.querySelectorAll)root.querySelectorAll('[title]').forEach(x=>els.push(x)); + els.forEach(x=>{if(x.closest('head'))return;const t=x.getAttribute('title');x.removeAttribute('title');if(t)x.dataset.tt=t}); + if(root.querySelectorAll)root.querySelectorAll('svg title').forEach(x=>{const p=x.parentNode;if(p&&p.nodeName.toLowerCase()!=='svg'&&x.textContent)p.dataset.tt=x.textContent;x.remove()}); +} +function ttEl(){let t=$('#tt');if(!t){t=document.createElement('div');t.id='tt';t.className='gaptip tt';t.hidden=true;t.setAttribute('role','tooltip');document.body.appendChild(t)}return t} +let TTT=null,TTAT=0; +function ttShow(el,e){ + const t=ttEl();t.innerHTML=el.dataset.tt.split('\n').map(l=>`
    ${esc(l)}
    `).join('');t.hidden=false;TTT=el; + const w=t.offsetWidth,h=t.offsetHeight,r=el.getBoundingClientRect(); + let x,y;if(e&&e.clientX!=null&&lastPointer!=='touch'){x=e.clientX+14;y=e.clientY+14;if(x+w>innerWidth-8)x=e.clientX-w-14;if(y+h>innerHeight-8)y=e.clientY-h-14} + else{x=r.left+r.width/2-w/2;y=r.bottom+8;if(y+h>innerHeight-8)y=r.top-h-8} + t.style.left=Math.max(8,Math.min(innerWidth-w-8,x))+'px';t.style.top=Math.max(8,y)+'px'; +} +function ttHide(){const t=$('#tt');if(t)t.hidden=true;TTT=null} +new MutationObserver(ms=>ms.forEach(m=>m.addedNodes.forEach(n=>{if(n.nodeType===1)ttConvert(n)}))).observe(document.body,{childList:true,subtree:true}); +document.addEventListener('mouseover',e=>{if(lastPointer==='touch')return;const el=e.target.closest&&e.target.closest('[data-tt]');if(el)ttShow(el,e);else if(TTT)ttHide()}); +document.addEventListener('mousemove',e=>{if(TTT&&lastPointer!=='touch'){const el=e.target.closest&&e.target.closest('[data-tt]');if(el===TTT)ttShow(el,e)}}); +document.addEventListener('click',e=>{const el=e.target.closest&&e.target.closest('[data-tt]');if(el&&lastPointer==='touch'){if(TTT===el&&Date.now()-TTAT>400)ttHide();else{TTAT=Date.now();ttShow(el,e)}}else if(TTT&&lastPointer==='touch')ttHide()}); +document.addEventListener('keydown',e=>{if(e.key==='Escape')ttHide()}); +window.addEventListener('scroll',ttHide,{passive:true,capture:true}); +document.addEventListener('click',e=>{ + if(GTARGET&&!e.target.closest('[data-ve]'))hideGapTip(); + const m=e.target.closest('button[data-pubmode]'); + if(m){state.pub=m.dataset.pubmode==='pub';state.own=m.dataset.pubmode==='own'&&MODE()!=='vision'&&!!OWN;if(state.own){if(!OWNW)OWNW=ownDef();ownCompute()}ownHash();if(MODE()==='vision'&&!currentEngine())drawVision();else drawOverview();return} +}); +let VIS=null; +const MODE=()=>new URL(location.href).searchParams.get('mode')==='vision'&&VIS?'vision':'text'; +function modeSwitch(){const v=MODE()==='vision';const ic=d=>``; + const doc=ic(''),eye=ic(''); + return VIS?`
    `:''} +function setMode(m){const u=new URL(location.href);u.searchParams.delete('model');u.searchParams.delete('bench');if(m==='vision')u.searchParams.set('mode','vision');else u.searchParams.delete('mode');history.pushState({y:0},'',u.search||location.pathname);baseKey=null;route(false)} +const VREFNOTE='VLM = plain vision-language model, not run in Jev mode · contrastive = image–text matching only'; +const VREFC={'ref-qwen35-397b':'#232323','ref-qwen3vl-8b':'#55524B','ref-siglip2':'#8C8C8C'}; +const vColor=r=>r.ref?VREFC[r.engine]:KINDCOL[KINDC[r.kind]||'k-other']; +const vAll=()=>VIS.entrants.concat(VIS.refs); +const vRow=e=>vAll().find(r=>r.engine===e); +const vScore=r=>state.pub?r.pub:r.full; +const vName=()=>state.pub?'Public only':'Full score'; +function vTip(e){ + const r=vRow(e);if(!r)return ''; + const row=(l,x)=>`
    ${l}${x}
    `; + const rk=r.ref?'':row('Rank',`#${state.pub?r.rank_pub:r.rank_full} of ${VIS.entrants.length}`); + return `${esc(r.name)}${r.ref?' reference':''}${row('Full score',one(r.full))}${row('Public',one(r.pub))}${row('Private set for same skill',one(r.priv))}${r.base?row('Base: public / private',`${one(r.base.pub)} / ${one(r.base.priv)}`)+row('Base checkpoint',`${esc(r.base.name)}`):''}${rk}${r.ref?`
    ${esc(VREFNOTE)}
    `:''}`; +} +function vLegend(){ + const kinds=[];for(const r of VIS.entrants){const k=KINDC[r.kind]||'k-other';if(!kinds.includes(k))kinds.push(k)} + return `reference (stock)`+kinds.map(k=>`${esc(KINDNAME[k])}`).join(''); +} +function drawVBars(){ + const host=$('#vbars');if(!host)return; + const rows=vAll().slice().sort((a,b)=>vScore(b)-vScore(a)); + const L=40,R=10,B=44,TB=36,bh=360,BW=Math.max(900,rows.length*40),step=(BW-L-R)/rows.length,ymax=Math.ceil(Math.max(...rows.map(r=>Math.max(r.full,r.pub)))/10)*10; + const py=v=>bh-B-v/ymax*(bh-TB-B); + let g='';for(let v=0;v<=ymax;v+=10)g+=`${v}`; + rows.forEach((r,i)=>{const x=L+i*step+step*.15,w=step*.7,v=vScore(r),y=py(v),o=state.pub?r.full:r.pub,yo=py(o); + g+=``; + g+=`${one(v)}`; + if(state.pub&&!r.ref){const ch=r.rank_full-r.rank_pub;g+=`${ch>0?'▲'+ch:ch<0?'▼'+(-ch):'–'}`} + const t=r.name; + g+=`${esc(t)}`}); + const labH=Math.ceil(Math.max(...rows.map(r=>r.name.length*6.2))*Math.sin(Math.PI/3))+16; + host.innerHTML=`
    ${g}
    `; + wireScrollHint('#vbars .scroll'); + paintSwitch(); + const n=$('#vbarnote');if(n)n.textContent=state.pub?'The public vision benchmarks alone. ▲▼ shows places moved compared with the Full score.':'The Full score: half public vision benchmarks, half private set for same skill.'; +} +function drawVScatter(){ + const host=$('#vscatter');if(!host)return; + const rows=vAll(),nar=host.clientWidth<520,W=nar?400:600,H=nar?400:420,L=48,R=16,T=12,B=44; + const lo=0,hi=Math.ceil(Math.max(...rows.map(r=>Math.max(r.pub,r.priv)))/10)*10; + const px=v=>L+(v-lo)/(hi-lo)*(W-L-R),py=v=>T+(hi-v)/(hi-lo)*(H-T-B); + let g='';for(let v=lo;v<=hi;v+=10)g+=`${v}${v}`; + g+=`same score on both`; + const items=[]; + for(const r of rows.slice().sort((a,b)=>(a.ref?1:0)-(b.ref?1:0))){const cx=px(r.pub),cy=py(r.priv); + g+=``; + items.push({cx,cy,r:r.ref?7:5,lab:r.name,raw:r.ref?200:r.full,skip:!(r.ref||r.rank_full<=5)})} + const labels=placeLabels(items,{W,H,L,R,T,B},[],{far:true,max:12}).replace(/class="ptlab"/g,'class="ptlab halo"'); + host.innerHTML=`${g}${labels}public vision score →private set for same skill ↑`; +} +function vTable(){ + const rows=vAll().slice().sort((a,b)=>vScore(b)-vScore(a)); + const body=rows.map(r=>`${r.ref?'ref':(state.pub?r.rank_pub:r.rank_full)} +
    ${orgImg(r)}${r.url?`${esc(r.name)}`:esc(r.name)}${r.ref?'reference':''}
    ${r.ref?esc(r.kind):(r.kind?`${esc(r.kind)}`:'')}${r.base?` base ${esc(r.base.name)}`:''}
    + ${one(vScore(r))}${one(r.pub)}${one(r.priv)} + ${r.base?`${one(r.base.pub)} / ${one(r.base.priv)}`:'—'}`).join(''); + return `
    ${body}
    #model${vName()}publicprivate setbase public / private
    `; +} +const vBenchNames=()=>Object.keys(VIS.entrants[0].bench); +const vTwin=n=>VIS.private_sets.includes(n); +function vBenchRows(n){return vAll().map(r=>{const b=r.bench[n];return b?{r,pub:b.pub,private:b.private,comb:b.private!=null?(b.pub+b.private)/2:null}:null}).filter(Boolean).sort((a,b)=>b.pub-a.pub)} +function vBenchCard(n){ + const rows=vBenchRows(n),shown=rows.filter(x=>!x.r.ref).slice(0,5),ref=rows.find(x=>x.r.engine==='ref-qwen35-397b');if(ref)shown.push(ref); + return `

    ${esc(n)}${vTwin(n)?'+':''}${vTwin(n)?'':'no private set'}

    chance-corrected skill · weight ${VIS.bench_weights[n]}
    ${VIS.bench_info&&VIS.bench_info[n]?`

    ${esc(VIS.bench_info[n].what)}

    `:''} + ${vTwin(n)?'
    publicprivate
    ':''}
      ${shown.map(x=>`
    1. ${x.r.ref?'ref':rows.filter(y=>!y.r.ref).indexOf(x)+1}${orgImg(x.r)}${esc(x.r.name)}${one(x.pub)}${vTwin(n)?`${x.private!=null?one(x.private):'—'}`:''}
    2. `).join('')}
    + ${vTwin(n)?'

    + also assessed on a private benchmark of the same competency; its score is in the second column. Ranked by the public score.

    ':''}Full ranking · ${rows.filter(y=>!y.r.ref).length} models + references
    `; +} +function openVBench(n){ + let dlg=$('#benchdlg'); + if(!dlg){dlg=document.createElement('dialog');dlg.id='benchdlg';document.body.appendChild(dlg);dlg.addEventListener('click',e=>{if(e.target===dlg||e.target.closest('.dlg-close'))dlg.close()});dlg.addEventListener('cancel',e=>{e.preventDefault();dlg.close()})} + const rows=vBenchRows(n),tw=vTwin(n),LCH=6.4,W=880,L=44,R=12,T=16,B=Math.ceil(Math.max(...rows.map(x=>x.r.name.length))*LCH*Math.sin(Math.PI/3))+20,H=196+B,VX=Math.min(-8,Math.floor(Math.min(...rows.map((x,i)=>L+(i+.5)*(W-L-R)/rows.length-x.r.name.length*LCH*.5))-6)),step=(W-L-R)/rows.length,py=v=>H-B-Math.max(0,Math.min(100,v))/100*(H-T-B); + let g='';[0,25,50,75,100].forEach(v=>{g+=`${v}`}); + rows.forEach((x,i)=>{const bx=L+i*step+step*.15,w=step*.7,y=py(x.pub);g+=``; + if(x.private!=null){const yt=py(x.private);g+=``} + const t=x.r.name;g+=`${esc(t)}`}); + const ent=rows.filter(y=>!y.r.ref);const tr=rows.map((x,i)=>`${x.r.ref?'ref':ent.indexOf(x)+1}
    ${esc(x.r.name)}
    ${one(x.pub)}${tw?`${x.private!=null?one(x.private):'—'}${x.comb!=null?one(x.comb):'—'}`:''}`).join(''); + dlg.innerHTML=`
    vision ${tw?'+ private set':'no private set'}

    ${esc(n)}${tw?'+':''}

    + ${(()=>{const bi=VIS.bench_info&&VIS.bench_info[n];if(!bi)return '';return `

    ${esc(bi.what)}

    Example: ${esc(bi.example)}

    Why it matters: ${esc(bi.why)}

    `})()} +

    ${esc((VIS.bench_info&&VIS.bench_info[n]||{}).tech||'')} ${VIS.bench_rows&&VIS.bench_rows[n]?fmt(VIS.bench_rows[n].public)+' public items.':''} Scored as chance-corrected skill × 100: 0 is random guessing, 100 is perfect.${tw?' A private set tests the same skill with new items; bars show the public benchmark, the dashed mark the private benchmark of the same competency, and combined is their mean. Ranked by the public score.':''}

    +
    ${g}
    +
    ${tw?'':''}${tr}
    #modelpublicprivatecombined
    `; + if(!dlg.open)dlg.showModal();dlg.querySelector('.dlg-body').scrollTop=0; +} +const vLab=r=>r.label?` · ${r.label}`:''; +const vSize=r=>r.params?`${r.params_estimated?'~':''}${size(r.params)}${r.active?' total · '+r.active.replace(/^A/,'')+' active':''}`:'—'; +function vScat(host,o){ + if(!host)return; + const all=vAll(),pts=all.filter(r=>o.x(r)!=null),off=all.filter(r=>o.x(r)==null); + const nar=host.clientWidth<480,W=520,H=520,L=46,R=14,T=16,B=50; + const xs=pts.map(o.x),ys=pts.map(o.y); + const lx=v=>o.log?Math.log10(v):v; + const xmin=o.log?Math.min(...xs)/1.35:Math.max(0,Math.min(...xs)-2),xmax=o.log?Math.max(...xs)*1.35:Math.max(...xs)+2; + const ymin=o.ymin!=null?o.ymin:Math.max(0,Math.floor((Math.min(...ys)-4)/10)*10),ymax=o.ymax!=null?o.ymax:Math.ceil((Math.max(...ys)+4)/10)*10; + const px=v=>L+(lx(v)-lx(xmin))/(lx(xmax)-lx(xmin)||1)*(W-L-R),py=v=>o.flipY?T+(v-ymin)/(ymax-ymin||1)*(H-T-B):H-B-(v-ymin)/(ymax-ymin||1)*(H-T-B); + let g=o.band?o.band(px,py,{W,H,L,R,T,B,xmin,xmax,ymin,ymax}):''; + const on=!!PARETO[o.key],front=[];if(on){let best=-Infinity;for(const r of pts.slice().sort((a,b)=>o.x(a)-o.x(b)||o.y(b)-o.y(a)))if(o.y(r)>best){front.push(r);best=o.y(r)}}const fs=new Set(front),pos=r=>[px(o.x(r)),py(o.y(r))]; + for(let v=ymin;v<=ymax;v+=10)g+=`${v}`; + for(const v of o.xticks.filter(v=>v>=xmin&&v<=xmax))g+=`${o.xfmt(v)}`; + const items=[];if(on)g+=paretoPath(front,pos,'x'); + for(const r of pts.slice().sort((a,b)=>(a.ref?1:0)-(b.ref?1:0)||o.y(b)-o.y(a))){const cx=px(o.x(r)),cy=py(o.y(r)),rr=(r.ref?7.5:6)+(fs.has(r)?2:0); + g+=``; + items.push({cx,cy,r:rr,lab:r.ref?r.name:r.name.replace(/ \(.*\)$/,''),raw:r.ref?999:o.y(r),skip:on&&!fs.has(r)})} + const labels=placeLabels(items,{W,H,L,R,T,B},(o.reserve||[]).concat(on?segRects(paretoSegs(front,pos,'x')):[]),on?{far:true,prefer:'upleft'}:{max:nar?10:16}); + host.innerHTML=`${g}${labels}${esc(o.xcap)}${esc(o.ycap)}${o.note||off.length?`

    ${o.note?esc(o.note)+' ':''}${off.length?'Not plotted: '+off.map(r=>esc(r.name)).join(', ')+'.':''}

    `:''}`; +} +function drawVCharts(){ + const vn=vName(); + vScat($('#vsize'),{key:'vsize',x:r=>r.params,y:vScore,log:true,xticks:[1e9,3e9,1e10,3e10,1e11,3e11],xfmt:v=>size(v),xcap:'parameters (total; MoE active count in the name) · log scale',ycap:`vision ${vn}`,aria:`Model size vs vision ${vn}`,note:'MoE models are placed at their total parameter count. SigLIP 2 size is estimated from its weight file.'}); + vScat($('#vcalx'),{key:'vcal',x:r=>r.cal?r.cal.ece*100:null,y:vScore,xticks:[0,5,10,15,20,25],xfmt:v=>v,xcap:'calibration error, points (lower is better)',ycap:`vision ${vn}`,aria:`Calibration error vs vision ${vn}`,note:'Calibration uses each model\'s letter probabilities on the public vision sets. Qwen3.5-397B-A17B (API, generated letter only) and SigLIP 2 (similarity scores, not probabilities) have none.'}); + vScat($('#vspeed'),{key:'vspeed',x:r=>r.ms_row,y:vScore,log:true,xticks:[30,50,100,200,500,1000,2000],xfmt:v=>v+' ms',xcap:'GPU time per row, scoring only · log scale',ycap:`vision ${vn}`,aria:`GPU time per row vs vision ${vn}`,note:'GPU time per row = scoring GPU-hours ÷ rows on RTX PRO 6000. Intern-Decision-0.8B includes 7.4 h spent before a slow-kernel fix. The 397B reference ran through an API and SigLIP 2 logged no GPU time.'}); + ['#vsizecap','#vcalxcap','#vspeedcap'].forEach((id,i)=>{const c=$(id);if(c)c.textContent=['Model size','Calibration error','GPU time per row'][i]+' vs vision '+vn}); +} +function drawVCalibration(){ + const host=$('#vcal'),lad=$('#vladder');if(!host||!lad)return; + const rows=vAll().filter(r=>r.cal); + const W=560,H=520,L=46,R=14,T=14,B=44,x0=0.4,y0=0.4; + const px=v=>L+(v-x0)/(1-x0)*(W-L-R),py=v=>H-B-(v-y0)/(1-y0)*(H-T-B); + let g=``; + for(const v of [0.4,0.5,0.6,0.7,0.8,0.9,1]){g+=`${Math.round(v*100)}%${Math.round(v*100)}%`} + g+=`over-confidentunder-confident`; + const items=[];for(const r of rows.slice().sort((a,b)=>(a.ref?1:0)-(b.ref?1:0))){const cx=px(r.cal.conf),cy=py(r.cal.acc);g+=``;items.push({cx,cy,r:6,lab:r.ref?r.name:r.name.replace(/ \(.*\)$/,''),raw:r.full})} + host.innerHTML=`${g}${placeLabels(items,{W,H,L,R,T,B},[],{max:14})}mean confidence on the chosen optionaccuracy on those rows`; + const by=rows.slice().sort((a,b)=>a.cal.ece-b.cal.ece),LW=560,NL=170,RH=20,LT=8,LH=LT+by.length*RH+34,maxE=Math.max(...by.map(r=>r.cal.ece))*100,lx=v=>NL+v/(maxE*1.12)*(LW-NL-40); + let l='';for(const v of [0,5,10,15,20,25].filter(v=>v<=maxE*1.05))l+=`${v}`; + by.forEach((r,i)=>{const y=LT+i*RH,e=r.cal.ece*100;l+=`${e.toFixed(1)}`; + const nm=r.name.length>34?r.name.slice(0,33)+'…':r.name;l+=`${esc(nm)}`; + const ox=lx(r.cal.over95*100);l+=``}); + lad.innerHTML=`${l}calibration error, points · ◆ confident and wrong`; +} +function vRadar(){ + const top=VIS.entrants.slice().sort((a,b)=>vScore(b)-vScore(a)).slice(0,3),ref=VIS.refs.find(r=>r.engine==='ref-qwen35-397b'),names=vBenchNames(); + const short={'KIE (CORD+FUNSD)':'KIE','Moderation (Hateful Memes)':'Moderation','MMMU-Pro vision':'MMMU-Pro','InfographicVQA':'InfoVQA'}; + const val=(r,n)=>{const b=r.bench[n];if(!b)return null;return (state.pub||b.private==null?b.pub:(b.pub+b.private)/2)/100}; + const axes=names.map(n=>({label:(short[n]||n)+(vTwin(n)&&!state.pub?'+':''),id:null})); + const series=[{name:ref.name,color:'#232323',fill:'rgba(35,35,35,.10)',width:3,vals:names.map(n=>val(ref,n))}].concat(top.map((r,i)=>({name:r.name,color:SERIES[i],width:2.25,vals:names.map(n=>val(r,n))}))); + const rev={};names.forEach(n=>rev[short[n]||n]=n); + const svg=radarSVG(axes,series,{aria:'Vision benchmarks radar',big:true}).replace(/ data-bench="[^"]*"/g,'').replace(/class="axlab"([^>]*)>([^<]*)<\/text>/g,(m,a,t)=>`class="vaxlab" data-vbi="${esc(rev[t.replace(/\+$/,'')]||'')}"${a}>${t}`); + const legend=series.map((s,i)=>`${i?`${i}`:''}${esc(s.name)}${one(i?vScore(top[i-1]):vScore(ref))}${i?'':' · reference'}`).join(''); + return `

    All vision tasks

    ${vName()} · the top 3 and the largest reference
    ${svg}
    ${legend}

    ${names.length} spokes, one per vision benchmark, chance-corrected skill. ${state.pub?'Public benchmarks only.':'A + marks a task scored as the mean of public and the private set for same skill.'}

    `; +} +function renderVision(){ + const E=EDITION(),q=VIS.refs.find(r=>r.engine==='ref-qwen3vl-8b'),sg=VIS.refs.find(r=>r.engine==='ref-siglip2'),big=VIS.refs.find(r=>r.engine==='ref-qwen35-397b'); + const maxDrop=Math.max(...VIS.entrants.filter(r=>r.base).map(r=>r.pub-r.priv)); + $('#app').innerHTML=` +

    Decision Index ${esc(E.num)}

    +

    ${VIS.entrants.length} vision-capable reproductions of TypeSafe Jev's "Decision Model", ranked by the vision Full score: ${vBenchNames().length} public vision benchmarks plus a private set that measures the same skills.

    + ${modeSwitch()} +
    vision board · ${VIS.entrants.length} models + ${VIS.refs.length} references · each entrant through its own image path · updated ${esc(VIS.generated_utc.slice(0,10))}
    + +
    ${vLegend()}
    +

    ${esc(VREFNOTE)}

    +
    ${paretoBtn('vsize')}
    Model size vs vision Full score
    ${paretoBtn('vcal')}
    Calibration error vs vision Full score
    ${paretoBtn('vspeed')}
    GPU time per row vs vision Full score
    +
    Learn more: the vision private set +
    +
    The private set is harderevery model drops

    The private tasks use fresh images and are harder than their public counterparts, so every model scores lower on them, and stronger models drop more points.

    +
    A drop alone is not a red flagstock models drop too

    A stock vision-language model, ${esc(q.name)}, drops ${(q.pub-q.priv).toFixed(1)} points from public to private, more than any fine-tune with a base (largest ${maxDrop.toFixed(1)}). So a drop on its own does not mean a model was tuned to the public benchmarks.

    +
    The tasks need a VLM${esc(sg.name)}: ${one(sg.pub)} / ${one(sg.priv)}

    ${esc(sg.name)} matches images to text without a language model and scores near zero on both, so the tasks cannot be solved by image-text similarity alone.

    +
    +

    References

    +
      ${VIS.refs.map(r=>`
    • ${esc(r.name)} (${esc(r.kind)}): public ${one(r.pub)} / private ${one(r.priv)}. ${esc(r.note)}
    • `).join('')}
    +

    Run notes for individual models are in methodology.

    +
    +

    Head to head

    The strongest vision entrants against the largest reference, one spoke per benchmark.

    +
    +

    Full results

    Every vision entrant and the references. Stock bases are shown beside the fine-tunes, not as separate rows.

    +
    +

    Calibration: confidence vs reality

    Left: how sure each model says it is against how often it is right, on the public vision sets. Right: the average gap between the two, lower is better.

    +
    stated confidence vs accuracy
    calibration ladder · expected calibration error
    +

    Calibration uses the probability each model gives its chosen letter, over ten confidence bins, with every benchmark weighted equally; accuracy counts answered rows. The diamond is the share of answers given with at least 95% confidence that were wrong. Qwen3.5-397B-A17B answered through an API with a generated letter only, and SigLIP 2 gives similarity scores rather than probabilities, so neither has calibration.

    +

    All benchmarks

    Each vision task with its own ranking. A "+" marks a task that also has a private benchmark of the same competency.

    +
    ${vBenchNames().map(vBenchCard).join('')}
    +
    vision board · ${VIS.entrants.length} entrants · ${vBenchNames().length} benchmarksNot affiliated with TypeSafe AI · Methodology · news & artifacts
    `; + drawVision(); + wireScrollHint('.scrow .hscroll'); +} +function drawVision(){drawVBars();drawVCharts();drawVCalibration();const vc=$('#vcats');if(vc)vc.innerHTML=vRadar();const t=$('#vtable');if(t)t.innerHTML=vTable()} +document.addEventListener('mouseover',e=>{const el=e.target.closest&&e.target.closest('[data-ve]');if(!el||lastPointer==='touch')return;const t=gaptip();t.innerHTML=vTip(el.dataset.ve);t.hidden=false;GTARGET=el;const w=t.offsetWidth,h=t.offsetHeight;let x=e.clientX+14,y=e.clientY+14;if(x+w>innerWidth-8)x=e.clientX-w-14;if(y+h>innerHeight-8)y=e.clientY-h-14;t.style.left=Math.max(8,x)+'px';t.style.top=Math.max(8,y)+'px'}); +document.addEventListener('mouseover',e=>{const el=e.target.closest&&e.target.closest('[data-vbi]');if(!el||!el.dataset.vbi||lastPointer==='touch'||!VIS||!VIS.bench_info)return;const bi=VIS.bench_info[el.dataset.vbi];if(!bi)return;const t=gaptip();t.innerHTML=`${esc(el.dataset.vbi)}${vTwin(el.dataset.vbi)?'+':''}
    ${esc(bi.what)}
    e.g. ${esc(bi.example)}
    `;t.hidden=false;GTARGET=el;const w=t.offsetWidth,h=t.offsetHeight;let x=e.clientX+14,y=e.clientY+14;if(x+w>innerWidth-8)x=e.clientX-w-14;if(y+h>innerHeight-8)y=e.clientY-h-14;t.style.left=Math.max(8,x)+'px';t.style.top=Math.max(8,y)+'px'}); +document.addEventListener('mouseout',e=>{const el=e.target.closest&&e.target.closest('[data-vbi]');if(el&&!(e.relatedTarget&&e.relatedTarget.closest&&e.relatedTarget.closest('[data-vbi]')===el))hideGapTip()}); +document.addEventListener('mouseout',e=>{const el=e.target.closest&&e.target.closest('[data-ve]');if(el&&!(e.relatedTarget&&e.relatedTarget.closest&&e.relatedTarget.closest('[data-ve]')===el))hideGapTip()}); +document.addEventListener('click',e=>{ + const mb=e.target.closest('button[data-mode]');if(mb){setMode(mb.dataset.mode);return} + const vb=e.target.closest('[data-vbench]');if(vb){e.preventDefault();openVBench(vb.dataset.vbench);return} + const ve=e.target.closest('[data-ve]');if(ve&&!e.target.closest('a')){e.stopPropagation();const t=gaptip();t.innerHTML=vTip(ve.dataset.ve);t.hidden=false;GTARGET=ve;const r=ve.getBoundingClientRect(),w=t.offsetWidth,h=t.offsetHeight;let x=Math.min(innerWidth-w-8,Math.max(8,r.left+r.width/2-w/2)),y=r.top-h-8;if(y<8)y=r.bottom+8;t.style.left=x+'px';t.style.top=y+'px'} +},true); +Promise.all([fetch('data/index.json?v='+Math.floor(Date.now()/6e5)).then(r=>r.json()),fetch('data/v03.json?v='+Math.floor(Date.now()/6e5)).then(r=>r.ok?r.json():null).catch(()=>null),fetch('data/vision.json?v='+Math.floor(Date.now()/6e5)).then(r=>r.ok?r.json():null).catch(()=>null),fetch('data/own.json?v='+Math.floor(Date.now()/6e5)).then(r=>r.ok?r.json():null).catch(()=>null)]).then(([d,v3,vis,own])=>{D=d;V3=v3;VIS=vis;OWN=own;if(OWN&&ownFromHash()){state.own=true;ownCompute()}pruneToIndex();ROWS=buildRows();applyEdition(); + if(location.hash&&!state.own){const e=currentEngine();history.replaceState({y:0},'',e?`?model=${encodeURIComponent(e)}`:location.pathname)} + route(false)}).catch(err=>{$('#app').innerHTML=`

    Could not load the data · ${esc(err.message)}

    `});