@@ -584,29 +584,41 @@ function renderModelRow(m) {
584584 // Per-level inline badge next to the model_type. To avoid duplicated
585585 // badges (e.g. an L3 Skip alongside an L5 XFail for the same model), we
586586 // emit at most ONE badge per row, picking the highest-level non-pass
587- // status. Higher-level failures supersede lower-level ones because the
587+ // status. Higher-level outcomes supersede lower-level ones because the
588588 // confidence column already reflects the highest attained level — the
589589 // badge calls out the most consequential outstanding issue.
590590 //
591- // Precedence (highest → lowest): L5 xfail > L4 xfail > L3 xfail/skip >
592- // L2 xfail / xfail_graph_only. Positive states (L3 parity pass, L5 e2e
593- // verified) are intentionally NOT badged: they would duplicate the
594- // Confidence column and the L1-L5 dot strip. Only exception states
595- // (xfail / skip) get inline badges, since those are the signals not
596- // otherwise distinguishable at a glance.
591+ // Precedence: walk L5 → L2 and emit the first xfail/skip encountered.
592+ // Both xfail and skip are reportable at every level (each level can be
593+ // skipped or marked xfail independently). Within a level, xfail and
594+ // skip are mutually exclusive in the data model, so we just check each.
595+ // L2 also admits "xfail_graph_only" (parse passes, full-graph build
596+ // xfails). Positive states (L3 parity pass, L5 e2e verified) are
597+ // intentionally NOT badged: they would duplicate the Confidence column
598+ // and the L1-L5 dot strip. Only exception states (xfail / skip) get
599+ // inline badges, since those are the signals not otherwise
600+ // distinguishable at a glance.
601+ const xfailBadge = (level , reason ) =>
602+ ` <span class="status-badge status-xfail" title="L${ level} known failure: ${ esc (reason || ' ' )} ">XFail</span>` ;
603+ const skipBadge = (level , reason ) =>
604+ ` <span class="status-badge status-skip" title="L${ level} skipped / not run: ${ esc (reason || ' ' )} ">Skip</span>` ;
597605 let statusBadge = ' ' ;
598- if (m .l5_status === ' xfail' ) {
599- statusBadge = ` <span class="status-badge status-xfail" title="L5 known failure: ${ esc (m .l5_reason || ' ' )} ">XFail</span>` ;
600- } else if (m .l4_status === ' xfail' ) {
601- statusBadge = ` <span class="status-badge status-xfail" title="L4 known failure: ${ esc (m .l4_reason || ' ' )} ">XFail</span>` ;
602- } else if (m .l3_status === ' xfail' ) {
603- statusBadge = ` <span class="status-badge status-xfail" title="L3 known failure: ${ esc (m .l3_reason || ' ' )} ">XFail</span>` ;
604- } else if (m .l3_status === ' skip' ) {
605- statusBadge = ` <span class="status-badge status-skip" title="L3 skipped / not run: ${ esc (m .l3_reason || ' ' )} ">Skip</span>` ;
606- } else if (m .l2_status === ' xfail' ) {
607- statusBadge = ` <span class="status-badge status-xfail" title="L2 known failure: ${ esc (m .l2_reason || ' ' )} ">XFail</span>` ;
608- } else if (m .l2_status === ' xfail_graph_only' ) {
609- statusBadge = ` <span class="status-badge status-xfail" title="L2 graph-build xfail: ${ esc (m .l2_reason || ' ' )} ">XFail</span>` ;
606+ for (const [level , status , reason ] of [
607+ [5 , m .l5_status , m .l5_reason ],
608+ [4 , m .l4_status , m .l4_reason ],
609+ [3 , m .l3_status , m .l3_reason ],
610+ [2 , m .l2_status , m .l2_reason ],
611+ ]) {
612+ if (status === ' xfail' || status === ' xfail_graph_only' ) {
613+ statusBadge = (level === 2 && status === ' xfail_graph_only' )
614+ ? ` <span class="status-badge status-xfail" title="L2 graph-build xfail: ${ esc (reason || ' ' )} ">XFail</span>`
615+ : xfailBadge (level, reason);
616+ break ;
617+ }
618+ if (status === ' skip' ) {
619+ statusBadge = skipBadge (level, reason);
620+ break ;
621+ }
610622 }
611623
612624 // min_token_match_ratio badge
0 commit comments