bobframes 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bobframes/__init__.py +3 -0
- bobframes/_version.py +1 -0
- bobframes/catalog.py +154 -0
- bobframes/cli.py +266 -0
- bobframes/derive_post_merge.py +365 -0
- bobframes/derives/__init__.py +0 -0
- bobframes/derives/pass_class_breakdown.py +102 -0
- bobframes/derives/texture_usage.py +121 -0
- bobframes/discovery.py +132 -0
- bobframes/global_entities.py +99 -0
- bobframes/html/__init__.py +0 -0
- bobframes/html/template.py +1056 -0
- bobframes/lint.py +114 -0
- bobframes/manifest.py +127 -0
- bobframes/parquetize.py +282 -0
- bobframes/parsers/__init__.py +0 -0
- bobframes/parsers/derive_program_transitions.py +73 -0
- bobframes/parsers/parse_init_state.py +675 -0
- bobframes/paths.py +111 -0
- bobframes/probes/__init__.py +0 -0
- bobframes/probes/whatif.py +165 -0
- bobframes/qrd_harness.py +119 -0
- bobframes/query_examples.py +222 -0
- bobframes/rdcmd.py +72 -0
- bobframes/replay/__init__.py +26 -0
- bobframes/replay/replay_main.py +2305 -0
- bobframes/reports/__init__.py +0 -0
- bobframes/reports/_dashboard.py +425 -0
- bobframes/reports/ab.py +88 -0
- bobframes/reports/base.py +114 -0
- bobframes/reports/cache.py +147 -0
- bobframes/reports/chrome.py +1306 -0
- bobframes/reports/cli.py +99 -0
- bobframes/reports/delta.py +167 -0
- bobframes/reports/discovery.py +118 -0
- bobframes/reports/draws_by_class.py +165 -0
- bobframes/reports/formatters.py +122 -0
- bobframes/reports/instancing_opportunities.py +276 -0
- bobframes/reports/orchestrator.py +59 -0
- bobframes/reports/overdraw.py +293 -0
- bobframes/reports/pass_gpu.py +190 -0
- bobframes/reports/shader_hotlist.py +240 -0
- bobframes/reports/trend_table.py +444 -0
- bobframes/resource_labels.py +162 -0
- bobframes/run.py +480 -0
- bobframes/schemas.py +426 -0
- bobframes/stable_keys.py +83 -0
- bobframes/tests/__init__.py +0 -0
- bobframes/tests/_render_util.py +84 -0
- bobframes/tests/data/golden/_reports/draws_by_class.html +323 -0
- bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html +1560 -0
- bobframes/tests/data/golden/_reports/index.html +264 -0
- bobframes/tests/data/golden/_reports/instancing_opportunities.html +266 -0
- bobframes/tests/data/golden/_reports/overdraw.html +275 -0
- bobframes/tests/data/golden/_reports/pass_gpu.html +277 -0
- bobframes/tests/data/golden/_reports/shader_hotlist.html +265 -0
- bobframes/tests/data/golden/_reports/trend_table.html +390 -0
- bobframes/tests/data/golden/index.html +1175 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet +0 -0
- bobframes/tests/make_synthetic.py +171 -0
- bobframes/tests/smoke.py +199 -0
- bobframes/tests/test_determinism.py +19 -0
- bobframes/tests/test_discovery.py +97 -0
- bobframes/tests/test_hardening.py +142 -0
- bobframes/tests/test_parity.py +22 -0
- bobframes/tests/test_perf.py +18 -0
- bobframes/tests/test_replay_drift.py +115 -0
- bobframes/tests/test_schemas.py +26 -0
- bobframes/tests/test_schemas_unit.py +55 -0
- bobframes/tests/test_stable_keys.py +61 -0
- bobframes-0.1.0.dist-info/METADATA +144 -0
- bobframes-0.1.0.dist-info/RECORD +130 -0
- bobframes-0.1.0.dist-info/WHEEL +4 -0
- bobframes-0.1.0.dist-info/entry_points.txt +2 -0
- bobframes-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>instancing opportunities</title><link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect x='2' y='3' width='12' height='2' fill='%23888'/><rect x='2' y='7' width='12' height='2' fill='%234a8'/><rect x='2' y='11' width='12' height='2' fill='%23d54'/></svg>"><style>:root{color-scheme:light dark;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-6:24px;--sp-8:32px;--sp-12:48px;--fs-display:2.25rem;--fs-h1:1.5rem;--fs-h2:1.1rem;--fs-h3:0.9rem;--fs-body:14px;--fs-mono:13px;--fs-small:11px;--motion-hover:150ms ease-out;--motion-focus:100ms ease-out;--motion-vt:200ms ease-in-out;--motion-disclosure:180ms ease-out;--bg:light-dark(oklch(97.2% 0.012 80),oklch(16.4% 0.012 260));--surface-0:var(--bg);--surface-1:light-dark(oklch(94.6% 0.018 80),oklch(19.5% 0.013 260));--surface-2:light-dark(oklch(94.6% 0.020 80),oklch(20.7% 0.014 260));--code-bg:var(--surface-2);--fg:light-dark(oklch(22.0% 0.005 80),oklch(93.6% 0.005 260));--text-1:var(--fg);--muted:light-dark(oklch(49.4% 0.005 80),oklch(67.5% 0.005 260));--text-2:var(--muted);--text-3:light-dark(oklch(60.0% 0.012 80),oklch(56.4% 0.020 280));--border:light-dark(oklch(84.0% 0.024 82),oklch(28.0% 0.014 260));--border-1:var(--border);--border-strong:light-dark(oklch(75.0% 0.030 82),oklch(35.0% 0.018 260));--border-2:var(--border-strong);--row-alt:light-dark(oklch(93.2% 0.022 82),oklch(20.5% 0.015 260));--row-hover:light-dark(oklch(90.0% 0.038 82),oklch(25.0% 0.022 260));--accent-primary:light-dark(oklch(38.0% 0.020 260),oklch(78.0% 0.015 260));--accent-data:light-dark(oklch(55.0% 0.155 230),oklch(75.0% 0.115 230));--accent:var(--accent-primary);--status-alarm:light-dark(oklch(52.0% 0.180 28),oklch(70.0% 0.155 28));--status-warn:light-dark(oklch(70.0% 0.155 85),oklch(80.0% 0.130 85));--status-ok:light-dark(oklch(55.0% 0.135 145),oklch(72.0% 0.115 145));--status-info:light-dark(oklch(55.0% 0.115 260),oklch(75.0% 0.090 260));--c-opaque:light-dark(oklch(60.5% 0.110 135),oklch(73.5% 0.115 135));--c-prepass:light-dark(oklch(64.0% 0.135 50),oklch(73.0% 0.130 50));--c-translucent:light-dark(oklch(56.0% 0.085 240),oklch(71.0% 0.080 240));--c-additive:light-dark(oklch(56.0% 0.115 305),oklch(72.0% 0.105 305));--c-decal:light-dark(oklch(60.0% 0.115 65),oklch(71.0% 0.115 65));--c-shadow:light-dark(oklch(42.0% 0.025 285),oklch(55.0% 0.020 285));--c-ui:light-dark(oklch(71.0% 0.115 90),oklch(80.0% 0.115 90));--c-postprocess:light-dark(oklch(66.0% 0.055 240),oklch(78.0% 0.055 240));--c-other:light-dark(oklch(64.0% 0.000 0),oklch(75.0% 0.000 0));--pos:var(--status-ok);--neg:var(--status-alarm);--neutral:var(--text-2)}@media (prefers-reduced-motion:reduce){:root{--motion-hover:0s;--motion-focus:0s;--motion-vt:0s;--motion-disclosure:0s}}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--surface-0);color:var(--text-1)}body{padding:var(--sp-6) var(--sp-6) var(--sp-12);font:var(--fs-body)/1.5 'Inter','Segoe UI',system-ui,sans-serif;max-width:1600px;margin:0 auto}h1{font-size:var(--fs-h1);font-weight:600;color:var(--accent);margin:0 0 var(--sp-2);padding-bottom:var(--sp-2);border-bottom:1px solid var(--border-2);letter-spacing:-0.01em}h2{font-size:var(--fs-h2);font-weight:600;color:var(--text-1);margin:var(--sp-6) 0 var(--sp-3);padding:0 0 0 var(--sp-3);border-left:3px solid var(--accent);line-height:1.4;scroll-margin-top:64px}h2:first-of-type{margin-top:0}section[id],h2[id]{scroll-margin-top:64px}h2[id]:target{color:var(--accent)}h3{font-size:var(--fs-h3);font-weight:500;color:var(--text-2);margin:var(--sp-3) 0 var(--sp-2)}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline;text-decoration-thickness:2px}a:visited{color:var(--text-2)}a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}table.report a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}table.report a:visited{color:var(--text-3)}header.strip{display:flex;flex-wrap:wrap;gap:var(--sp-3) var(--sp-6);align-items:baseline;padding-bottom:var(--sp-3);border-bottom:1px solid var(--border-2);margin:0 0 var(--sp-4)}header.strip span{color:var(--text-2);font-size:var(--fs-small)}header.strip span strong{color:var(--text-1);font-weight:600}nav.crumb{font-size:var(--fs-small);color:var(--text-2);margin:0 0 var(--sp-3);display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}nav.crumb a,nav.crumb a[data-link-kind]{display:inline-flex;align-items:center;gap:4px;color:var(--accent-primary);text-decoration:none;padding:2px 8px;border:1px solid var(--border-1);border-radius:2px;background:var(--surface-1);transition:border-color var(--motion-hover),background var(--motion-hover)}nav.crumb a:hover,nav.crumb a[data-link-kind]:hover{border-color:var(--accent-primary);background:var(--row-hover);text-decoration:none}nav.crumb a + a::before{content:''}.kpi-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--sp-3);margin:0 0 var(--sp-8)}.kpi-chip{background:var(--surface-1);border:1px solid var(--border-1);padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-1);min-height:88px}.kpi-chip .kpi-label{font:var(--fs-small) ui-monospace,monospace;color:var(--text-3);text-transform:lowercase;letter-spacing:0.04em}.kpi-chip .kpi-value{font:600 var(--fs-display)/1.05 ui-monospace,monospace;color:var(--text-1);font-variant-numeric:tabular-nums;letter-spacing:-0.02em}.kpi-chip .kpi-delta{font:var(--fs-small) ui-monospace,monospace;font-variant-numeric:tabular-nums;color:var(--text-3)}.kpi-chip.tone-pos .kpi-value,.kpi-chip.tone-pos .kpi-delta{color:var(--pos)}.kpi-chip.tone-neg .kpi-value,.kpi-chip.tone-neg .kpi-delta{color:var(--neg)}.table-wrap{overflow-x:auto;border:1px solid var(--border-1);border-radius:4px;margin:0 0 var(--sp-6)}.table-wrap > table.report{border:0;margin:0}nav.toc{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--sp-1) var(--sp-3);font:var(--fs-mono) ui-monospace,monospace;margin:0 0 var(--sp-6);padding:var(--sp-2) var(--sp-3);background:var(--surface-2);border:1px solid var(--border-1)}nav.toc a{display:inline-block;padding:2px 0}table.report{width:100%;border-collapse:collapse;font:var(--fs-mono) ui-monospace,'Cascadia Code',Consolas,monospace;margin-top:var(--sp-1)}table.report thead th{position:sticky;top:var(--hdr-offset);background:var(--surface-2);color:var(--accent);text-align:left;font-weight:600;padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border-2);white-space:nowrap;z-index:1}table.report thead th.num{text-align:right}table.report tbody td{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border-1);vertical-align:top}table.report tbody td:first-child{font-weight:600;color:var(--text-1)}table.report td.num{text-align:right;font-variant-numeric:tabular-nums}table.report tbody tr:nth-child(even) td{background:var(--surface-2)}table.report tbody tr:hover td{background:var(--row-hover)}table.report tbody td .lbl{color:var(--text-2);margin-left:6px;font-style:italic;opacity:.85}table.report tr.area-break td{border-top:2px solid var(--border-2)}table.report td.area-cell{color:var(--text-2)}.bar-row{display:grid;grid-template-columns:minmax(240px,1fr) 2fr 90px;gap:var(--sp-3);align-items:center;padding:4px 0;font:var(--fs-mono) ui-monospace,'Cascadia Code',Consolas,monospace}.bar-row .key{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;color:var(--text-1)}.bar-row .total{text-align:right;font-variant-numeric:tabular-nums;color:var(--text-2)}.bar{display:flex;height:18px;background:var(--surface-2);border:1px solid var(--border-1);overflow:hidden}.bar .seg{flex:0 0 auto;color:#fff;font-size:10px;line-height:18px;text-align:center;overflow:hidden;white-space:nowrap}.ibar{display:inline-block;width:80px;height:6px;background:var(--surface-2);border:1px solid var(--border-1);vertical-align:middle;margin-left:6px}.ibar > div{height:100%;background:var(--accent)}.delta{font-variant-numeric:tabular-nums;padding:2px var(--sp-2);text-align:right}.delta-pill{display:inline-block;padding:1px 6px;border-radius:2px;background:var(--surface-2);font:600 var(--fs-small) ui-monospace,monospace}.delta.pos,.delta-pill.pos{color:var(--pos);font-weight:600}.delta.neg,.delta-pill.neg{color:var(--neg);font-weight:600}.delta.flat,.delta-pill.flat{color:var(--text-3)}.delta.new,.delta-pill.new{color:var(--text-3);font-style:italic}.delta.alarm{border-left:3px solid var(--status-alarm);padding-left:6px}.delta-latest{border-left:2px solid var(--border-2)}.legend{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);margin:0 0 var(--sp-3);font-size:var(--fs-small);color:var(--text-2)}.legend .chip{display:inline-flex;align-items:center;gap:6px}.legend .swatch{display:inline-block;width:12px;height:12px;border-radius:2px}.device-strip{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);background:var(--surface-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-1);margin:0 0 var(--sp-4)}.ab-strip{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);background:var(--surface-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-2);margin:0 0 var(--sp-4)}.rank{display:inline-block;width:1.4em;text-align:center;font:600 var(--fs-small) ui-monospace,monospace;margin-right:var(--sp-1);color:var(--text-3)}.rank.rank-1{color:var(--accent)}.rank.rank-2{color:var(--text-1)}.rank.rank-3{color:var(--text-2)}details.matrix,details.category{margin:0 0 var(--sp-4);background:var(--surface-1);border:1px solid var(--border-1)}details.matrix > summary,details.category > summary{cursor:pointer;list-style:none;user-select:none;padding:var(--sp-3) var(--sp-4);font:600 var(--fs-body) 'Inter',system-ui,sans-serif;color:var(--accent);border-bottom:1px solid transparent;display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-3)}details.matrix[open] > summary,details.category[open] > summary{border-bottom-color:var(--border-1)}details > summary::-webkit-details-marker{display:none}details.matrix > summary::before,details.category > summary::before{content:'+';margin-right:var(--sp-2);font-family:ui-monospace,monospace;color:var(--text-3);display:inline-block;width:0.8em}details[open] > summary::before{content:'-'}details.matrix > .matrix-body,details.category > .cat-body{padding:var(--sp-4)}.cat-meta{font:var(--fs-small) ui-monospace,monospace;color:var(--text-3);font-variant-numeric:tabular-nums}.spark{display:inline-block;vertical-align:middle;color:var(--text-2)}footer.legend{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);margin-top:var(--sp-12);padding-top:var(--sp-3);border-top:1px solid var(--border-1);display:block}.note{font-size:var(--fs-small);color:var(--text-2);margin-top:var(--sp-2)}.dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:var(--sp-6);margin:0 0 var(--sp-6)}a.dash-card{border:1px solid var(--border-1);padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-3);text-decoration:none;color:inherit;transition:border-color 0.1s,background 0.1s}a.dash-card:hover{background:var(--surface-1);border-color:var(--border-2);text-decoration:none}a.dash-card:visited{color:inherit}a.dash-card h3{margin:0;color:var(--accent);font-size:var(--fs-h2);border-left:3px solid var(--accent);padding-left:var(--sp-3)}a.dash-card table.report{font-size:var(--fs-small)}a.dash-card table.report a{pointer-events:none}a[data-link-kind="primary"]{display:inline-flex;align-items:center;gap:var(--sp-2);padding:6px 12px;background:var(--surface-1);border:1px solid var(--border-2);color:var(--accent-primary);text-decoration:none;transition:background var(--motion-hover),border-color var(--motion-hover)}a[data-link-kind="primary"]:hover{background:var(--row-hover);border-color:var(--accent-primary);text-decoration:none}a[data-link-kind="primary"]:visited{color:var(--accent-primary)}a[data-link-kind="inline"]{color:var(--accent-primary);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}a[data-link-kind="inline"]:hover{text-decoration-thickness:2px}a[data-link-kind="inline"] .icon{margin-left:3px;color:var(--text-2)}a[data-link-kind="drill"]{color:var(--text-1);text-decoration:underline;text-decoration-color:var(--border-2);text-decoration-thickness:1px;text-underline-offset:2px}a[data-link-kind="drill"]:hover{color:var(--accent-primary);text-decoration-color:var(--accent-primary);text-decoration-thickness:2px}tr:has(a[data-link-kind="drill"]):hover td{background:var(--row-hover)}a[data-link-kind="copy"]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--text-2);text-decoration:none;border-radius:2px;transition:color var(--motion-hover),background var(--motion-hover)}a[data-link-kind="copy"]:hover{color:var(--accent-primary);background:var(--row-hover)}a[data-link-kind="crumb"]{color:var(--text-2);text-decoration:none}a[data-link-kind="crumb"]:hover{color:var(--accent-primary);text-decoration:underline}.icon{width:11px;height:11px;display:inline-block;vertical-align:-1px;fill:currentColor}body{--hdr-offset:120px;--crumb-h:36px}nav.crumb{position:sticky;top:0;z-index:3;background:var(--bg);padding-top:var(--sp-1);padding-bottom:var(--sp-1)}.summary-bar{position:sticky;top:var(--crumb-h);z-index:3;display:grid;grid-template-columns:minmax(140px,max-content) 1fr auto;gap:var(--sp-2) var(--sp-6);align-items:center;background:var(--surface-1);border:1px solid var(--border-1);border-top:2px solid var(--accent-data);padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4)}.summary-bar .sb-label{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);text-transform:lowercase;letter-spacing:0.04em}.summary-bar .sb-headline{font:600 var(--fs-h1)/1.15 ui-monospace,monospace;color:var(--text-1);font-variant-numeric:tabular-nums;letter-spacing:-0.01em}.summary-bar .sb-sub{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);grid-column:2;font-variant-numeric:tabular-nums}.summary-bar .sb-link{align-self:center;grid-row:1 / span 2;grid-column:3}.summary-bar.tone-alarm{border-top-color:var(--status-alarm)}.summary-bar.tone-ok{border-top-color:var(--status-ok)}.summary-bar.tone-warn{border-top-color:var(--status-warn)}.summary-bar.tone-info{border-top-color:var(--status-info)}body{container-type:inline-size;container-name:page}@container page (max-width:1100px){nav.toc{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}}@container page (max-width:860px){.dash-grid{grid-template-columns:1fr}.summary-bar{grid-template-columns:1fr auto}.summary-bar .sb-sub{grid-column:1}.summary-bar .sb-link{grid-row:auto;grid-column:2}.summary-bar .sb-headline{font-size:var(--fs-h1)}}@container page (max-width:768px){.bar-row{grid-template-columns:1fr;grid-template-rows:auto auto auto;gap:var(--sp-1)}.bar-row .total{text-align:left}.kpi-strip{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}.kpi-chip .kpi-value{font-size:var(--fs-h1)}body{padding:var(--sp-3)}.summary-bar .sb-headline{font-size:var(--fs-h2)}table.report thead th,table.report tbody td{padding:var(--sp-1) var(--sp-2)}}@media print{@page{size:A4;margin:12mm}:root{color-scheme:light}html,body{background:#fff;color:#000}body{max-width:none;padding:0}nav.crumb,.device-strip,.ab-strip,rdc-copy-button,rdc-search-cards,rdc-ab-picker{display:none}.summary-bar{position:static;background:#fff;border-color:#888;border-top-width:3px;break-inside:avoid;break-after:avoid;print-color-adjust:exact}.summary-bar .sb-headline{color:#000}.summary-bar .sb-link{display:none}h1,h2{color:#000}h2[id]{position:static;background:transparent;break-after:avoid}table.report thead th{position:static;background:#f0f0f0;color:#000;print-color-adjust:exact}table.report thead{display:table-header-group}table.report tbody tr{break-inside:avoid}.kpi-strip{break-inside:avoid;grid-template-columns:repeat(4,1fr)}.kpi-chip{background:#fff;border-color:#888}.kpi-chip .kpi-value{color:#000}.dash-grid{grid-template-columns:repeat(2,1fr)}a.dash-card{break-inside:avoid}.bar,.bar .seg,.ibar,.ibar > div,.legend .swatch,.delta.pos,.delta.neg,.delta-pill{print-color-adjust:exact;-webkit-print-color-adjust:exact}details,details > summary{display:block}details > .matrix-body,details > .cat-body{display:block}a[data-link-kind="primary"]{background:transparent;border:1px solid #888;color:#000}a[data-link-kind="inline"]{color:#000}a[data-link-kind="inline"] .icon{display:none}body[data-multi-section="true"] h2[id] ~ h2[id]{break-before:page}body[data-page-kind="drop-browser"] > *{display:none}body[data-page-kind="drop-browser"]::before{content:"Per-drop browser is not designed for print. See the cumulative reports.";display:block;padding:20mm;font:bold 1.2rem system-ui,sans-serif;color:#000}}rdc-sortable-table{display:block}rdc-sortable-table table.report thead th{cursor:pointer;user-select:none}rdc-sortable-table table.report thead th[aria-sort="ascending"]::after{content:' \25B4';color:var(--text-3)}rdc-sortable-table table.report thead th[aria-sort="descending"]::after{content:' \25BE';color:var(--text-3)}rdc-copy-button{display:inline-flex;align-items:center;justify-content:center;min-width:28px;padding:0 6px;height:22px;color:var(--text-2);cursor:pointer;border:1px solid transparent;border-radius:2px;font:var(--fs-small) ui-monospace,monospace;margin-left:4px;transition:color var(--motion-hover),background var(--motion-hover),border-color var(--motion-hover)}rdc-copy-button:hover{color:var(--accent-primary);background:var(--row-hover);border-color:var(--border-1)}rdc-copy-button:focus-visible{outline:2px solid var(--accent-primary);outline-offset:1px}rdc-copy-button::before{content:'copy'}rdc-copy-button.copied{color:var(--status-ok);border-color:var(--status-ok)}rdc-copy-button.copied::before{content:'ok'}rdc-heatmap-cell{display:inline-block;padding:1px 4px;border-radius:2px;font-variant-numeric:tabular-nums}rdc-sticky-h2{display:contents}rdc-sticky-h2 h2[aria-current="section"]{border-left-color:var(--accent-data)}rdc-row-drill{display:contents}rdc-row-drill > tr{cursor:pointer}rdc-row-drill > tr:hover td{background:var(--row-hover)}rdc-search-cards{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-4);font:var(--fs-small) ui-monospace,monospace}rdc-search-cards input[type="search"]{font:inherit;padding:6px 10px;border:1px solid var(--border-1);background:var(--surface-0);color:var(--text-1);border-radius:2px;min-width:280px}rdc-search-cards input[type="search"]:focus{outline:2px solid var(--accent-primary);outline-offset:1px}rdc-search-cards .rdc-count{color:var(--text-2);font-variant-numeric:tabular-nums}rdc-ab-picker{display:inline-flex;align-items:center;gap:var(--sp-2);margin:0 0 var(--sp-4);font:var(--fs-small) ui-monospace,monospace}rdc-ab-picker label{color:var(--text-2)}rdc-ab-picker select{font:inherit;padding:4px 8px;border:1px solid var(--border-1);background:var(--surface-0);color:var(--text-1);border-radius:2px}rdc-alarm-banner{display:contents}.chip-cluster{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-4)}.chip-cluster a[data-link-kind="primary"]{padding:4px 10px;font-size:var(--fs-small)}.pair-list{display:flex;flex-direction:column;gap:var(--sp-4);margin:0 0 var(--sp-6)}.pair-group{border:1px solid var(--border-1);padding:var(--sp-3) var(--sp-4);background:var(--surface-1)}.pair-group > h3{margin:0 0 var(--sp-3);padding:0;font:var(--fs-mono) ui-monospace,monospace;color:var(--text-2);font-weight:500;text-transform:none;letter-spacing:0}.catalog-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-2);margin:0 0 var(--sp-6)}.catalog-grid a[data-link-kind="primary"]{justify-content:flex-start}</style><script>(function(){
|
|
2
|
+
if (typeof customElements === 'undefined') return;
|
|
3
|
+
class RdcBase extends HTMLElement {
|
|
4
|
+
connectedCallback(){
|
|
5
|
+
if (this._rdcUp) return;
|
|
6
|
+
this._rdcUp = true;
|
|
7
|
+
try { this.init(); } catch(e) { console.error('rdc init error', this.tagName, e); }
|
|
8
|
+
}
|
|
9
|
+
init(){}
|
|
10
|
+
}
|
|
11
|
+
class RdcSortableTable extends RdcBase {
|
|
12
|
+
init(){
|
|
13
|
+
const table = this.querySelector('table');
|
|
14
|
+
if (!table) return;
|
|
15
|
+
this._table = table;
|
|
16
|
+
const ths = table.querySelectorAll('thead th');
|
|
17
|
+
this._ths = ths;
|
|
18
|
+
ths.forEach((th, ci) => {
|
|
19
|
+
const isNum = th.classList.contains('num');
|
|
20
|
+
th.setAttribute('aria-sort', 'none');
|
|
21
|
+
th.addEventListener('click', () => this.sort(ci, isNum));
|
|
22
|
+
});
|
|
23
|
+
const liveId = 'rdc-live-' + Math.random().toString(36).slice(2, 8);
|
|
24
|
+
const live = document.createElement('div');
|
|
25
|
+
live.id = liveId;
|
|
26
|
+
live.setAttribute('aria-live', 'polite');
|
|
27
|
+
live.setAttribute('aria-atomic', 'true');
|
|
28
|
+
live.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)';
|
|
29
|
+
this.appendChild(live);
|
|
30
|
+
this._live = live;
|
|
31
|
+
const def = this.dataset.defaultSort;
|
|
32
|
+
const dir = this.dataset.defaultDir || 'desc';
|
|
33
|
+
if (def){
|
|
34
|
+
const cols = Array.from(ths).map(th => th.textContent.trim().toLowerCase());
|
|
35
|
+
const idx = cols.indexOf(def.toLowerCase());
|
|
36
|
+
if (idx >= 0){
|
|
37
|
+
const isNum = ths[idx].classList.contains('num');
|
|
38
|
+
this._applySort(idx, isNum, dir === 'asc' ? 'ascending' : 'descending');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
sort(ci, isNum){
|
|
43
|
+
const cur = this._ths[ci].getAttribute('aria-sort') || 'none';
|
|
44
|
+
const dir = cur === 'ascending' ? 'descending' : 'ascending';
|
|
45
|
+
this._applySort(ci, isNum, dir);
|
|
46
|
+
}
|
|
47
|
+
_applySort(ci, isNum, dir){
|
|
48
|
+
const tbody = this._table.tBodies[0];
|
|
49
|
+
if (!tbody) return;
|
|
50
|
+
const rows = Array.from(tbody.rows);
|
|
51
|
+
rows.sort((a, b) => {
|
|
52
|
+
const av = (a.cells[ci] ? a.cells[ci].textContent : '').trim();
|
|
53
|
+
const bv = (b.cells[ci] ? b.cells[ci].textContent : '').trim();
|
|
54
|
+
if (isNum){
|
|
55
|
+
const an = parseFloat(av.replace(/,/g, ''));
|
|
56
|
+
const bn = parseFloat(bv.replace(/,/g, ''));
|
|
57
|
+
const aok = !isNaN(an), bok = !isNaN(bn);
|
|
58
|
+
if (!aok && !bok) return 0;
|
|
59
|
+
if (!aok) return 1;
|
|
60
|
+
if (!bok) return -1;
|
|
61
|
+
return dir === 'ascending' ? an - bn : bn - an;
|
|
62
|
+
}
|
|
63
|
+
return dir === 'ascending' ? av.localeCompare(bv) : bv.localeCompare(av);
|
|
64
|
+
});
|
|
65
|
+
rows.forEach(r => tbody.appendChild(r));
|
|
66
|
+
this._ths.forEach(th => th.setAttribute('aria-sort', 'none'));
|
|
67
|
+
this._ths[ci].setAttribute('aria-sort', dir);
|
|
68
|
+
if (this._live) {
|
|
69
|
+
const colName = (this._ths[ci].textContent || '').trim();
|
|
70
|
+
this._live.textContent = 'sorted by ' + colName + ' ' + dir;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
customElements.define('rdc-sortable-table', RdcSortableTable);
|
|
75
|
+
class RdcCopyButton extends RdcBase {
|
|
76
|
+
init(){
|
|
77
|
+
const value = this.dataset.value || '';
|
|
78
|
+
const label = this.dataset.label || ('copy ' + value);
|
|
79
|
+
this.setAttribute('role', 'button');
|
|
80
|
+
this.setAttribute('tabindex', '0');
|
|
81
|
+
this.setAttribute('aria-label', label);
|
|
82
|
+
const handler = async () => {
|
|
83
|
+
try {
|
|
84
|
+
await navigator.clipboard.writeText(value);
|
|
85
|
+
} catch (e) {
|
|
86
|
+
const ta = document.createElement('textarea');
|
|
87
|
+
ta.value = value;
|
|
88
|
+
document.body.appendChild(ta);
|
|
89
|
+
ta.select();
|
|
90
|
+
try { document.execCommand('copy'); } catch(e2){}
|
|
91
|
+
ta.remove();
|
|
92
|
+
}
|
|
93
|
+
this.classList.add('copied');
|
|
94
|
+
setTimeout(() => this.classList.remove('copied'), 1000);
|
|
95
|
+
};
|
|
96
|
+
this.addEventListener('click', handler);
|
|
97
|
+
this.addEventListener('keydown', (e) => {
|
|
98
|
+
if (e.key === 'Enter' || e.key === ' '){
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
handler();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
customElements.define('rdc-copy-button', RdcCopyButton);
|
|
106
|
+
class RdcStickyH2 extends RdcBase {
|
|
107
|
+
init(){
|
|
108
|
+
const h2 = this.querySelector('h2[id]');
|
|
109
|
+
if (!h2) return;
|
|
110
|
+
const io = new IntersectionObserver((entries) => {
|
|
111
|
+
entries.forEach(e => {
|
|
112
|
+
if (e.isIntersecting){
|
|
113
|
+
h2.setAttribute('aria-current', 'section');
|
|
114
|
+
} else {
|
|
115
|
+
h2.removeAttribute('aria-current');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}, { rootMargin: '-50% 0px -50% 0px', threshold: 0 });
|
|
119
|
+
io.observe(h2);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
customElements.define('rdc-sticky-h2', RdcStickyH2);
|
|
123
|
+
class RdcHeatmapCell extends RdcBase {
|
|
124
|
+
init(){
|
|
125
|
+
const v = parseFloat(this.dataset.value);
|
|
126
|
+
const lo = parseFloat(this.dataset.min);
|
|
127
|
+
const hi = parseFloat(this.dataset.max);
|
|
128
|
+
const dir = this.dataset.direction || 'hot';
|
|
129
|
+
if (isNaN(v) || isNaN(lo) || isNaN(hi) || hi <= lo) return;
|
|
130
|
+
let t = (v - lo) / (hi - lo);
|
|
131
|
+
if (dir === 'cold') t = 1 - t;
|
|
132
|
+
t = Math.max(0, Math.min(1, t));
|
|
133
|
+
const pct = Math.round(t * 25);
|
|
134
|
+
this.style.background = 'color-mix(in oklch, var(--accent-data) ' + pct + '%, transparent)';
|
|
135
|
+
if (t >= 0.72){
|
|
136
|
+
this.style.color = 'light-dark(black, white)';
|
|
137
|
+
}
|
|
138
|
+
this.setAttribute('aria-label', v + ' (relative ' + Math.round(t * 100) + '%)');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
customElements.define('rdc-heatmap-cell', RdcHeatmapCell);
|
|
142
|
+
class RdcRowDrill extends RdcBase {
|
|
143
|
+
init(){
|
|
144
|
+
const href = this.dataset.href;
|
|
145
|
+
if (!href) return;
|
|
146
|
+
this.setAttribute('role', 'link');
|
|
147
|
+
this.setAttribute('tabindex', '0');
|
|
148
|
+
this.style.cursor = 'pointer';
|
|
149
|
+
const go = (ev) => {
|
|
150
|
+
if (ev.target && ev.target.closest('a')) return;
|
|
151
|
+
if (ev.target && ev.target.closest('rdc-copy-button')) return;
|
|
152
|
+
window.location.href = href;
|
|
153
|
+
};
|
|
154
|
+
this.addEventListener('click', go);
|
|
155
|
+
this.addEventListener('keydown', (ev) => {
|
|
156
|
+
if (ev.key === 'Enter'){
|
|
157
|
+
ev.preventDefault();
|
|
158
|
+
window.location.href = href;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
customElements.define('rdc-row-drill', RdcRowDrill);
|
|
164
|
+
class RdcSearchCards extends RdcBase {
|
|
165
|
+
init(){
|
|
166
|
+
const target = this.dataset.target || '.dash-grid';
|
|
167
|
+
const cards = document.querySelectorAll(target + ' > *');
|
|
168
|
+
const input = this.querySelector('input');
|
|
169
|
+
if (!input || !cards.length) return;
|
|
170
|
+
const counter = this.querySelector('.rdc-count');
|
|
171
|
+
const update = () => {
|
|
172
|
+
const q = input.value.trim().toLowerCase();
|
|
173
|
+
let shown = 0;
|
|
174
|
+
cards.forEach(c => {
|
|
175
|
+
const text = (c.textContent || '').toLowerCase();
|
|
176
|
+
const match = !q || text.indexOf(q) >= 0;
|
|
177
|
+
c.style.display = match ? '' : 'none';
|
|
178
|
+
if (match) shown++;
|
|
179
|
+
});
|
|
180
|
+
if (counter) counter.textContent = shown + ' / ' + cards.length;
|
|
181
|
+
};
|
|
182
|
+
input.addEventListener('input', update);
|
|
183
|
+
update();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
customElements.define('rdc-search-cards', RdcSearchCards);
|
|
187
|
+
class RdcAlarmBanner extends RdcBase {
|
|
188
|
+
init(){
|
|
189
|
+
const sev = this.dataset.severity || 'high';
|
|
190
|
+
const role = sev === 'high' ? 'alert' : 'status';
|
|
191
|
+
this.setAttribute('role', role);
|
|
192
|
+
this.setAttribute('aria-live', sev === 'high' ? 'assertive' : 'polite');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
customElements.define('rdc-alarm-banner', RdcAlarmBanner);
|
|
196
|
+
class RdcAbPicker extends RdcBase {
|
|
197
|
+
init(){
|
|
198
|
+
const select = this.querySelector('select');
|
|
199
|
+
if (!select) return;
|
|
200
|
+
this.setAttribute('role', 'combobox');
|
|
201
|
+
select.addEventListener('change', () => {
|
|
202
|
+
const url = select.value;
|
|
203
|
+
if (url) window.location.href = url;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
customElements.define('rdc-ab-picker', RdcAbPicker);
|
|
208
|
+
function _wireRowDrill(){
|
|
209
|
+
const seen = new WeakSet();
|
|
210
|
+
document.querySelectorAll('a[data-link-kind="drill"]').forEach(a => {
|
|
211
|
+
const tr = a.closest('tr');
|
|
212
|
+
if (!tr || seen.has(tr)) return;
|
|
213
|
+
seen.add(tr);
|
|
214
|
+
tr.addEventListener('click', (ev) => {
|
|
215
|
+
if (ev.target.closest('a')) return;
|
|
216
|
+
if (ev.target.closest('rdc-copy-button')) return;
|
|
217
|
+
a.click();
|
|
218
|
+
});
|
|
219
|
+
tr.style.cursor = 'pointer';
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (document.readyState === 'loading'){
|
|
223
|
+
document.addEventListener('DOMContentLoaded', _wireRowDrill);
|
|
224
|
+
} else {
|
|
225
|
+
_wireRowDrill();
|
|
226
|
+
}
|
|
227
|
+
})();</script></head><body style="--hdr-offset: 120px">
|
|
228
|
+
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
|
|
229
|
+
<defs>
|
|
230
|
+
<symbol id="icon-link-out" viewBox="0 0 16 16">
|
|
231
|
+
<path d="M4 4h5v1H5v6h6V8h1v3.5a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-7a.5.5 0 0 1 .5-.5z"/>
|
|
232
|
+
<path d="M11 5L7.5 8.5M11 5h-3M11 5v3" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
233
|
+
</symbol>
|
|
234
|
+
<symbol id="icon-file" viewBox="0 0 16 16">
|
|
235
|
+
<path d="M4 2h5l3 3v9H4z" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
236
|
+
<path d="M9 2v3h3" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
237
|
+
</symbol>
|
|
238
|
+
<symbol id="icon-arrow-right" viewBox="0 0 16 16">
|
|
239
|
+
<path d="M4 8h8M9 5l3 3-3 3" stroke="currentColor" fill="none" stroke-width="1.5"/>
|
|
240
|
+
</symbol>
|
|
241
|
+
<symbol id="icon-copy" viewBox="0 0 16 16">
|
|
242
|
+
<path d="M5 5h7v8H5z" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
243
|
+
<path d="M3 3h7v2" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
244
|
+
</symbol>
|
|
245
|
+
<symbol id="icon-search" viewBox="0 0 16 16">
|
|
246
|
+
<circle cx="7" cy="7" r="4" stroke="currentColor" fill="none" stroke-width="1.5"/>
|
|
247
|
+
<path d="M10 10l3 3" stroke="currentColor" stroke-width="1.5"/>
|
|
248
|
+
</symbol>
|
|
249
|
+
<symbol id="icon-warn" viewBox="0 0 16 16">
|
|
250
|
+
<path d="M8 2l6 11H2L8 2zM8 7v3M8 11.5v.5" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
251
|
+
</symbol>
|
|
252
|
+
</defs>
|
|
253
|
+
</svg>
|
|
254
|
+
|
|
255
|
+
<h1>instancing opportunities</h1>
|
|
256
|
+
<header class="strip">
|
|
257
|
+
<span>built <strong><TS></strong></span>
|
|
258
|
+
<span>drops <strong>2</strong></span>
|
|
259
|
+
</header>
|
|
260
|
+
<nav class="crumb"><a href="../index.html" data-link-kind="crumb">root catalog</a><a href="../_reports/index.html" data-link-kind="crumb">dashboard</a></nav>
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
<aside class="summary-bar tone-neutral" aria-label="page summary"><div class="sb-label">top batch candidates</div><div class="sb-headline">prepass/p47/6v#7c97 (repeat 9)</div><div class="sb-sub">next: prepass/p31/132v#4193 x8, prepass/p39/30v#d294 x8</div><a class="sb-link" href="#top_meshes" data-link-kind="primary">table</a></aside>
|
|
264
|
+
<h2 id="top_meshes">top meshes by repeat</h2><div class="table-wrap"><rdc-sortable-table><table class="report"><thead><tr><th>mesh</th><th class="num">repeat@2026-05-27_r110565</th><th class="num">repeat@2026-05-28_r110600</th><th class="num delta-latest">delta</th><th>areas</th><th>dominant pass</th><th class="num">indices typical</th><th class="num">wasted indices</th></tr></thead><tbody><tr><td><span class="rank rank-1">1</span><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p47/6v#7c97</a></td><td class="num">9</td><td class="num">0</td><td class="delta pos alarm">-9</td><td>District 01</td><td>Frame 1/prepass/p47</td><td class="num">6</td><td class="num">48<div class="ibar"><div style="width: 0.53%;"></div></div></td></tr><tr><td><span class="rank rank-2">2</span><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p31/132v#4193</a></td><td class="num">8</td><td class="num">0</td><td class="delta pos alarm">-8</td><td>District 01</td><td>Frame 1/prepass/p31</td><td class="num">132</td><td class="num">924<div class="ibar"><div style="width: 10.18%;"></div></div></td></tr><tr><td><span class="rank rank-3">3</span><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p39/30v#d294</a></td><td class="num">8</td><td class="num">0</td><td class="delta pos alarm">-8</td><td>District 01</td><td>Frame 1/prepass/p39</td><td class="num">30</td><td class="num">210<div class="ibar"><div style="width: 2.31%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p21/6v#22a8</a></td><td class="num">7</td><td class="num">0</td><td class="delta pos alarm">-7</td><td>District 01</td><td>Frame 1/prepass/p21</td><td class="num">6</td><td class="num">36<div class="ibar"><div style="width: 0.40%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p5/108v#a8c9</a></td><td class="num">5</td><td class="num">0</td><td class="delta pos alarm">-5</td><td>District 01</td><td>Frame 1/shadow/p5</td><td class="num">108</td><td class="num">432<div class="ibar"><div style="width: 4.76%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p4/108v#dee4</a></td><td class="num">0</td><td class="num">5</td><td class="delta neg">+5</td><td>District 01</td><td>shadow/p4</td><td class="num">108</td><td class="num">432<div class="ibar"><div style="width: 4.76%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p56/36v#3066</a></td><td class="num">4</td><td class="num">0</td><td class="delta pos alarm">-4</td><td>District 01</td><td>Frame 1/prepass/p56</td><td class="num">36</td><td class="num">108<div class="ibar"><div style="width: 1.19%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p13/564v#9118</a></td><td class="num">2</td><td class="num">0</td><td class="delta pos alarm">-2</td><td>District 01</td><td>Frame 1/prepass/p13</td><td class="num">564</td><td class="num">564<div class="ibar"><div style="width: 6.21%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p1/9081v#182b</a></td><td class="num">0</td><td class="num">2</td><td class="delta neg">+2</td><td>District 01</td><td>shadow/p1</td><td class="num">9,081</td><td class="num">9,081<div class="ibar"><div style="width: 100.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p3/4794v#60f3</a></td><td class="num">0</td><td class="num">2</td><td class="delta neg">+2</td><td>District 01</td><td>shadow/p3</td><td class="num">4,794</td><td class="num">4,794<div class="ibar"><div style="width: 52.79%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p6/3318v#aec7</a></td><td class="num">0</td><td class="num">2</td><td class="delta neg">+2</td><td>District 01</td><td>shadow/p6</td><td class="num">3,318</td><td class="num">3,318<div class="ibar"><div style="width: 36.54%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p24/456v#1fd7</a></td><td class="num">0</td><td class="num">2</td><td class="delta neg">+2</td><td>District 01</td><td>prepass/p24</td><td class="num">456</td><td class="num">456<div class="ibar"><div style="width: 5.02%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">ui/p0/6v#ef88</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/slate/p0</td><td class="num">6</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p1/9081v#de4d</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p1</td><td class="num">9,081</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p2/2841v#c225</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p2</td><td class="num">2,841</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p3/4794v#30fe</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p3</td><td class="num">4,794</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p4/762v#63ce</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p4</td><td class="num">762</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p6/717v#f1fc</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p6</td><td class="num">717</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">shadow/p7/654v#39bb</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/shadow/p7</td><td class="num">654</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p12/720v#e6f2</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p12</td><td class="num">720</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p15/954v#b207</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p15</td><td class="num">954</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p16/564v#563d</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p16</td><td class="num">564</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p17/528v#dab3</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p17</td><td class="num">528</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p18/3v#8c66</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p18</td><td class="num">3</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p19/15v#e1f3</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p19</td><td class="num">15</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p20/6v#bcf6</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p20</td><td class="num">6</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p28/18v#4ed6</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p28</td><td class="num">18</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p29/24v#eedc</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p29</td><td class="num">24</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-27_r110565/index.html#draws" data-link-kind="drill">prepass/p30/1824v#6201</a></td><td class="num">1</td><td class="num">0</td><td class="delta pos alarm">-1</td><td>District 01</td><td>Frame 1/prepass/p30</td><td class="num">1,824</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">ui/p0/6v#4e1f</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>slate/p0</td><td class="num">6</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p2/2841v#d066</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>shadow/p2</td><td class="num">2,841</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p5/762v#225c</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>shadow/p5</td><td class="num">762</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p8/717v#6fdc</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>shadow/p8</td><td class="num">717</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">shadow/p9/654v#641c</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>shadow/p9</td><td class="num">654</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p14/168v#4bb1</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p14</td><td class="num">168</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p15/48v#8a6b</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p15</td><td class="num">48</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p16/36v#c7af</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p16</td><td class="num">36</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p17/36v#a16c</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p17</td><td class="num">36</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p18/168v#f08f</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p18</td><td class="num">168</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p19/96v#581c</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p19</td><td class="num">96</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p22/288v#ecf3</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p22</td><td class="num">288</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p23/210v#d1c3</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p23</td><td class="num">210</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p26/36v#345d</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p26</td><td class="num">36</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p27/126v#d594</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p27</td><td class="num">126</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p28/108v#67b9</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p28</td><td class="num">108</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p29/1068v#9368</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p29</td><td class="num">1,068</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p30/186v#4616</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p30</td><td class="num">186</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p31/1107v#3457</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p31</td><td class="num">1,107</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p32/114v#6619</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p32</td><td class="num">114</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr><tr><td><a href="drill/District 01/2026-05-28_r110600/index.html#draws" data-link-kind="drill">prepass/p33/1242v#632f</a></td><td class="num">0</td><td class="num">1</td><td class="delta neg">+1</td><td>District 01</td><td>prepass/p33</td><td class="num">1,242</td><td class="num">0<div class="ibar"><div style="width: 0.00%;"></div></div></td></tr></tbody></table></rdc-sortable-table></div>
|
|
265
|
+
<h2 id="batching">potential material batching</h2><div class="table-wrap"><rdc-sortable-table><table class="report"><thead><tr><th>pass</th><th>class</th><th class="num">repeat</th><th class="num">distinct meshes</th><th>drops</th></tr></thead><tbody></tbody></table></rdc-sortable-table></div>
|
|
266
|
+
</body></html>
|