feat: add paired DeepSeek routing length control

This commit is contained in:
wuyang
2026-07-29 16:17:18 +08:00
parent 059458f8e3
commit 9ca08501a8
15 changed files with 318874 additions and 69 deletions
+295 -43
View File
@@ -5,6 +5,11 @@ import rawAbsorb from "@/data/deepseek-v2-lite-absorb.json";
import rawAbsorbRepro from "@/data/deepseek-v2-lite-absorb-repro.json";
import rawCorpus from "@/data/deepseek-v2-lite-routing-corpus.json";
import rawCorpusRepro from "@/data/deepseek-v2-lite-routing-corpus-repro.json";
import rawMatched16 from "@/data/deepseek-v2-lite-routing-matched16.json";
import rawMatched16Repro from "@/data/deepseek-v2-lite-routing-matched16-repro.json";
import rawMatched24 from "@/data/deepseek-v2-lite-routing-matched24.json";
import rawMatched24Repro from "@/data/deepseek-v2-lite-routing-matched24-repro.json";
import rawLengthSensitivity from "@/data/deepseek-v2-lite-routing-length-sensitivity.json";
const trace = rawTrace as any;
const repro = rawRepro as any;
@@ -12,8 +17,15 @@ const absorb = rawAbsorb as any;
const absorbRepro = rawAbsorbRepro as any;
const corpus = rawCorpus as any;
const corpusRepro = rawCorpusRepro as any;
const matched16 = rawMatched16 as any;
const matched16Repro = rawMatched16Repro as any;
const matched24 = rawMatched24 as any;
const matched24Repro = rawMatched24Repro as any;
const lengthSensitivity = rawLengthSensitivity as any;
const absorbExact = JSON.stringify(absorb) === JSON.stringify(absorbRepro);
const corpusExact = JSON.stringify(corpus) === JSON.stringify(corpusRepro);
const matched16Exact = JSON.stringify(matched16) === JSON.stringify(matched16Repro);
const matched24Exact = JSON.stringify(matched24) === JSON.stringify(matched24Repro);
const bytes = (value: number) => value >= 1024
? `${(value / 1024).toFixed(2)} KiB`
: `${value.toLocaleString()} B`;
@@ -49,17 +61,25 @@ const compact = {
},
};
const compactJson = JSON.stringify(compact).replaceAll("<", "\\u003c");
const corpusCompact = {
domains: corpus.corpus_contract.domains,
labels: corpus.corpus_contract.domain_labels,
counts: corpus.corpus_contract.counts,
inference: corpus.inference_contract,
statistics: corpus.statistical_contract,
layers: corpus.layers.slice(1).map((layer: any) => ({
const compactCorpus = (input: any) => ({
domains: input.corpus_contract.domains,
labels: input.corpus_contract.domain_labels,
counts: input.corpus_contract.counts,
inference: input.inference_contract,
statistics: input.statistical_contract,
layers: input.layers.slice(1).map((layer: any) => ({
layer: layer.layer,
routes: layer.routes,
modes: layer.statistics,
})),
});
const corpusCompact = {
cohorts: {
natural: compactCorpus(corpus),
matched16: compactCorpus(matched16),
matched24: compactCorpus(matched24),
},
lengthSensitivity,
};
const corpusCompactJson = JSON.stringify(corpusCompact).replaceAll("<", "\\u003c");
const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoint_tensor_bytes;
@@ -73,7 +93,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
</div>
<p>
固定官方 revision、tokenizer、模型代码和 BF16 第一分片;RTX 5090 连续执行 layer 0–6,
从 3,240 次 token 显微轨迹扩到 304,560 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
从 3,240 次 token 显微轨迹扩到 488,880 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
所有结论都带证据身份与停止线。
</p>
</header>
@@ -390,22 +410,35 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
<section class="artifact-panel" data-artifact-panel="corpus" hidden>
<div class="panel-lead">
<div><span>X + S / FIXED PUBLIC CORPUS</span><h4>从四条示例,走到 128 条可重建样本与区间</h4></div>
<div><span>X + S / FIXED PUBLIC CORPUS</span><h4>从自然长度,再走到同 prompt 的 16 / 24-token 对照</h4></div>
<p>
WikiText-2、TNEWS、HumanEval、GSM8K 各取 32 条;固定哈希选样、最多 96 tokens。
每个区间都重采样 prompt,而不是把同一 prompt 里的 token 假装成独立样本。
三个 cohort 都来自 WikiText-2、TNEWS、HumanEval、GSM8K;等长两档使用完全相同的
128 条源 prompt 和嵌套前缀。每个区间都重采样 prompt,不把相关 token 假装成独立样本。
</p>
</div>
<div class="corpus-ledger">
<article><span>PROMPTS</span><b>{corpus.inference_contract.total_prompts}</b><p>4 domains × 32</p></article>
<article><span>VALID TOKENS</span><b>{corpus.inference_contract.valid_tokens.toLocaleString()}</b><p>答案未使用,代码未执行</p></article>
<article><span>REAL ROUTES</span><b>{(corpus.inference_contract.routes_per_moe_layer * 6).toLocaleString()}</b><p>50,760 / layer × 6 MoE layers</p></article>
<article><span>COHORTS</span><b>3</b><p>natural ≤96 · matched 16 / 24</p></article>
<article><span>PROMPT RUNS</span><b>384</b><p>每档 4 domains × 32</p></article>
<article><span>VALID TOKENS</span><b>13,580</b><p>答案未使用,代码未执行</p></article>
<article><span>REAL ROUTES</span><b>488,880</b><p>三档 × 前六个 MoE 层</p></article>
<article><span>BOOTSTRAP</span><b>{corpus.statistical_contract.replicates.toLocaleString()}</b><p>prompt-level / domain-stratified</p></article>
<article class="exact"><span>INDEPENDENT RERUN</span><b>{corpusExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>SHA-256 4678a1d1…a09e4</p></article>
<article class="exact">
<span>INDEPENDENT RERUN</span>
<b>{corpusExact && matched16Exact && matched24Exact ? "3 / 3 EXACT" : "MISMATCH"}</b>
<p>自然长度与两个等长 cohort</p>
</article>
</div>
<div class="corpus-controls">
<div>
<span>COHORT</span>
<div class="corpus-cohort-switch" role="group" aria-label="选择公开语料长度 cohort">
<button type="button" data-corpus-cohort="natural" aria-pressed="true">自然 ≤96</button>
<button type="button" data-corpus-cohort="matched16" aria-pressed="false">同样本 16</button>
<button type="button" data-corpus-cohort="matched24" aria-pressed="false">同样本 24</button>
</div>
</div>
<div>
<span>MOE LAYER</span>
<div class="layer-switch corpus-layer-switch" role="group" aria-label="选择公开语料路由层">
@@ -422,7 +455,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
</div>
</div>
<p data-corpus-mode-note>
先把每条 prompt 的 64 维路由分布归一,再平均;短中文标题与长代码 prompt 各有一票。
自然长度 cohort:每条 prompt 先归一再等权;它保留来源长度差异,适合描述实际选中样本。
</p>
</div>
@@ -456,7 +489,38 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
<div class="corpus-findings">
<article><span>CURRENT HIGHEST CV</span><b data-corpus-highest-cv></b><p data-corpus-highest-cv-ci></p></article>
<article><span>CURRENT LARGEST JSD</span><b data-corpus-largest-jsd></b><p data-corpus-largest-jsd-ci></p></article>
<article><span>WHAT CHANGED</span><b>区间替代单点印象</b><p>看到“不同”之后,继续问 prompt 换一批时波动多大。</p></article>
<article><span>CURRENT COHORT</span><b data-corpus-cohort-title>自然长度 ≤96</b><p data-corpus-cohort-boundary>四域 token 总量不同;不能把差异全归因于内容。</p></article>
</div>
<div class="length-sensitivity">
<div class="length-sensitivity-head">
<div>
<span>PAIRED LENGTH SENSITIVITY / SAME SOURCE PROMPTS</span>
<h5>同一条 prompt:16 → 24 tokens,CV 怎样变化?</h5>
</div>
<p>
short / long 每次 bootstrap 使用同一组 prompt indices;下方 Δ = CV24 − CV16。
负值表示读入后续 8 tokens 后,64-expert 分布更平。
</p>
</div>
<div class="length-delta-grid" data-length-delta-grid></div>
<div class="length-pair-summary">
<article>
<span>中文新闻 ↔ 代码 / JSD</span>
<b data-length-jsd></b>
<p data-length-jsd-ci></p>
</article>
<article>
<span>LARGEST |CV Δ|</span>
<b data-length-largest></b>
<p data-length-largest-ci></p>
</article>
<article>
<span>READING</span>
<b>长度影响存在,但没有抹掉域差异</b>
<p>六层中文↔代码 JSD 都下降,24-token 下仍保持非零经验距离。</p>
</article>
</div>
</div>
<div class="evidence-links">
@@ -469,7 +533,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
<div class="artifact-boundary">
<b>DESCRIPTIVE, NOT SEMANTICS</b>
<p>
这是固定 128 条公开 prompt 上的前六个 MoE 层,不是训练分布或线上流量。
这是三个固定公开 cohort 上的前六个 MoE 层,不是训练分布或线上流量;matched cohort
只代表各域至少 24 tokens 的子群。
bootstrap 区间描述本探针换 prompt 的稳定性,不是零差异假设检验;没有多重比较校正,
也不能把 E29、E48 等参数索引命名成“中文专家”或“代码专家”。
</p>
@@ -566,7 +631,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
<code>experiments/deepseek/v2_lite_trace.py</code> ·
<code>experiments/deepseek/v2_lite_absorb_probe.py</code> ·
<code>experiments/deepseek/v2_lite_routing_corpus.py</code> ·
<code>research/DEEPSEEK_ROUTING_CORPUS_AUDIT.md</code>
<code>experiments/deepseek/compare_routing_length_control.py</code> ·
<code>research/DEEPSEEK_ROUTING_LENGTH_CONTROL_AUDIT.md</code>
</figcaption>
<script is:inline type="application/json" data-dsv2-trace set:html={compactJson}></script>
@@ -779,13 +845,34 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
code: "Python 代码",
math: "小学数学",
};
const corpusLayer = (layer: number) => corpusData.layers.find((item: any) => item.layer === layer);
const cohortMeta: Record<string, { title: string; boundary: string }> = {
natural: {
title: "自然长度 ≤96",
boundary: "四域 token 总量不同;不能把差异全归因于内容。",
},
matched16: {
title: "同样本 · 16 tokens",
boundary: "只读取至少 24-token 固定 cohort 的前 16 tokens。",
},
matched24: {
title: "同样本 · 24 tokens",
boundary: "与 16-token 档源 prompt 完全相同,只增加后续 8 tokens。",
},
};
let corpusCohort = "natural";
let corpusLayerNumber = 1;
let corpusMode = "prompt_balanced";
const formatCi = (ci: number[], digits = 3) => `[${ci[0].toFixed(digits)}, ${ci[1].toFixed(digits)}]`;
const signed = (value: number, digits = 3) => `${value >= 0 ? "+" : ""}${value.toFixed(digits)}`;
const formatSignedCi = (ci: number[], digits = 3) =>
`[${signed(ci[0], digits)}, ${signed(ci[1], digits)}]`;
const renderCorpus = () => {
const layer = corpusLayer(corpusLayerNumber);
const cohort = corpusData.cohorts[corpusCohort];
const layer = cohort.layers.find((item: any) => item.layer === corpusLayerNumber);
const mode = layer.modes[corpusMode];
all<HTMLButtonElement>("[data-corpus-cohort]").forEach((button) => {
button.setAttribute("aria-pressed", String(button.dataset.corpusCohort === corpusCohort));
});
all<HTMLButtonElement>("[data-corpus-layer]").forEach((button) => {
button.classList.toggle("active", Number(button.dataset.corpusLayer) === corpusLayerNumber);
});
@@ -794,18 +881,24 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
});
set(
"[data-corpus-mode-note]",
corpusMode === "prompt_balanced"
? "先把每条 prompt 的 64 维路由分布归一,再平均;短中文标题与长代码 prompt 各有一票。"
: "直接汇总全部 token 的路由计数;长 prompt 权重更高,适合回答“本批 token 实际流向哪里”。",
corpusCohort === "natural"
? corpusMode === "prompt_balanced"
? "自然长度 cohort:每条 prompt 先归一再等权;它保留来源长度差异,适合描述实际选中样本。"
: "自然长度 cohort:直接汇总 token 路由;长 prompt 权重更高,适合回答本批 token 实际流向哪里。"
: corpusMode === "prompt_balanced"
? "等长 cohort:每条 prompt 等权;16 / 24 两档使用同一批源样本,可以做 paired delta。"
: "等长 cohort 中每条 prompt 的 token 数相同,因此 token 加权与 prompt 等权理论上重合。",
);
set(
"[data-corpus-heat-title]",
`layer ${corpusLayerNumber} · ${corpusMode === "prompt_balanced" ? "每条 prompt 等权" : "按 token 加权"}`,
`${cohortMeta[corpusCohort].title} · layer ${corpusLayerNumber} · ${corpusMode === "prompt_balanced" ? "prompt 等权" : "token 加权"}`,
);
set("[data-corpus-cohort-title]", cohortMeta[corpusCohort].title);
set("[data-corpus-cohort-boundary]", cohortMeta[corpusCohort].boundary);
const rows = one<HTMLElement>("[data-corpus-domain-rows]");
if (rows) {
rows.replaceChildren(...corpusData.domains.map((domain: string) => {
rows.replaceChildren(...cohort.domains.map((domain: string) => {
const result = mode.domains[domain];
const metrics = result.metrics;
const top = result.top_experts[0];
@@ -816,7 +909,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
const identityLabel = document.createElement("b");
const identityMeta = document.createElement("small");
identityLabel.textContent = corpusLabels[domain];
identityMeta.textContent = `32 prompts · ${corpusData.counts[domain].valid_tokens.toLocaleString()} tokens`;
identityMeta.textContent = `32 prompts · ${cohort.counts[domain].valid_tokens.toLocaleString()} tokens`;
identity.append(identityLabel, identityMeta);
const cv = document.createElement("span");
@@ -846,7 +939,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
const heatmap = one<HTMLElement>("[data-corpus-heatmap]");
if (heatmap) {
heatmap.replaceChildren(...corpusData.domains.map((domain: string) => {
heatmap.replaceChildren(...cohort.domains.map((domain: string) => {
const result = mode.domains[domain];
const max = Math.max(...result.distribution);
const row = document.createElement("div");
@@ -874,16 +967,16 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
const corner = document.createElement("b");
corner.textContent = "DOMAIN";
cells.push(corner);
corpusData.domains.forEach((domain: string) => {
cohort.domains.forEach((domain: string) => {
const header = document.createElement("b");
header.textContent = corpusLabels[domain];
cells.push(header);
});
corpusData.domains.forEach((left: string) => {
cohort.domains.forEach((left: string) => {
const header = document.createElement("b");
header.textContent = corpusLabels[left];
cells.push(header);
corpusData.domains.forEach((right: string) => {
cohort.domains.forEach((right: string) => {
const cell = document.createElement("span");
if (left === right) {
cell.className = "diagonal";
@@ -902,7 +995,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
jsd.replaceChildren(...cells);
}
const highest = corpusData.domains
const highest = cohort.domains
.map((domain: string) => ({ domain, value: mode.domains[domain].metrics.cv }))
.sort((left: any, right: any) => right.value.point - left.value.point)[0];
const largest = [...mode.pairs]
@@ -925,7 +1018,63 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
"[data-corpus-largest-jsd-ci]",
`95% CI ${formatCi(largest.js_divergence.ci95)} · nats`,
);
const comparisonLayer = corpusData.lengthSensitivity.layers
.find((item: any) => item.layer === corpusLayerNumber);
const comparison = comparisonLayer.modes[corpusMode];
const deltaGrid = one<HTMLElement>("[data-length-delta-grid]");
if (deltaGrid) {
deltaGrid.replaceChildren(...cohort.domains.map((domain: string) => {
const result = comparison.domains[domain];
const cv = result.metrics.cv;
const card = document.createElement("article");
const label = document.createElement("span");
const values = document.createElement("b");
const delta = document.createElement("strong");
const detail = document.createElement("p");
label.textContent = corpusLabels[domain];
values.textContent = `${cv.short.toFixed(3)} → ${cv.long.toFixed(3)}`;
delta.textContent = `Δ ${signed(cv.delta_long_minus_short)}`;
delta.className = cv.delta_long_minus_short <= 0 ? "down" : "up";
detail.textContent = `paired 95% ${formatSignedCi(cv.delta_ci95)} · TV ${result.total_variation.point.toFixed(3)}`;
card.append(label, values, delta, detail);
return card;
}));
}
const chineseCode = comparison.pairs.find((pair: any) =>
pair.left === "chinese" && pair.right === "code"
).js_divergence;
set(
"[data-length-jsd]",
`${chineseCode.short.toFixed(3)} → ${chineseCode.long.toFixed(3)} · Δ ${signed(chineseCode.delta_long_minus_short)}`,
);
set(
"[data-length-jsd-ci]",
`paired 95% ${formatSignedCi(chineseCode.delta_ci95)} · L${corpusLayerNumber}`,
);
const largestDelta = cohort.domains
.map((domain: string) => ({
domain,
value: comparison.domains[domain].metrics.cv,
}))
.sort((left: any, right: any) =>
Math.abs(right.value.delta_long_minus_short) - Math.abs(left.value.delta_long_minus_short)
)[0];
set(
"[data-length-largest]",
`${corpusLabels[largestDelta.domain]} · Δ ${signed(largestDelta.value.delta_long_minus_short)}`,
);
set(
"[data-length-largest-ci]",
`paired 95% ${formatSignedCi(largestDelta.value.delta_ci95)} · CV24 − CV16`,
);
};
all<HTMLButtonElement>("[data-corpus-cohort]").forEach((button) => {
button.addEventListener("click", () => {
corpusCohort = button.dataset.corpusCohort ?? "natural";
renderCorpus();
});
});
all<HTMLButtonElement>("[data-corpus-layer]").forEach((button) => {
button.addEventListener("click", () => {
corpusLayerNumber = Number(button.dataset.corpusLayer);
@@ -987,7 +1136,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.corpus-controls > div > span,
.corpus-heat-head span,
.corpus-comparison span,
.corpus-findings span {
.corpus-findings span,
.length-sensitivity span {
margin: 0;
color: var(--blue);
font: 700 .69rem/1.3 var(--font-mono);
@@ -1339,7 +1489,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.load-lessons b { display: block; margin-top: .35rem; font-size: .77rem; }
.corpus-ledger {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-columns: repeat(6, 1fr);
border: 1px solid rgba(32,32,39,.14);
}
.corpus-ledger article {
@@ -1361,7 +1511,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
}
.corpus-controls {
display: grid;
grid-template-columns: auto 1.1fr minmax(15rem, 1.3fr);
grid-template-columns: 1.2fr auto 1fr;
gap: 1rem;
align-items: end;
margin-top: .8rem;
@@ -1371,8 +1521,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
}
.corpus-controls > div { display: grid; gap: .45rem; }
.corpus-controls .layer-switch { margin: 0; }
.corpus-mode-switch { display: flex; }
.corpus-mode-switch button {
.corpus-mode-switch,
.corpus-cohort-switch { display: flex; }
.corpus-mode-switch button,
.corpus-cohort-switch button {
padding: .58rem .75rem;
border: 1px solid rgba(32,32,39,.22);
background: #fffdf8;
@@ -1380,14 +1532,19 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
font: 650 .67rem/1 var(--font-mono);
cursor: pointer;
}
.corpus-mode-switch button + button { border-left: 0; }
.corpus-mode-switch button[aria-pressed="true"] {
.corpus-mode-switch button + button,
.corpus-cohort-switch button + button { border-left: 0; }
.corpus-mode-switch button[aria-pressed="true"],
.corpus-cohort-switch button[aria-pressed="true"] {
border-color: var(--blue);
background: var(--blue);
color: white;
}
.corpus-controls > p {
grid-column: 1 / -1;
margin: 0;
padding-top: .75rem;
border-top: 1px solid rgba(32,32,39,.12);
color: rgba(32,32,39,.62);
font-size: .69rem;
line-height: 1.5;
@@ -1543,6 +1700,93 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
font-size: .65rem;
line-height: 1.45;
}
.length-sensitivity {
margin-top: .8rem;
padding: 1rem;
border: 1px solid rgba(32,32,39,.15);
background:
linear-gradient(120deg, rgba(57,120,110,.11), transparent 42%),
#e8e2d7;
}
.length-sensitivity-head {
display: grid;
grid-template-columns: 1fr 1.25fr;
gap: 1.2rem;
align-items: end;
}
.length-sensitivity h5 {
margin: .4rem 0 0;
font: 720 1.08rem/1.15 var(--font-display);
}
.length-sensitivity-head > p {
margin: 0;
color: rgba(32,32,39,.62);
font-size: .69rem;
line-height: 1.55;
}
.length-delta-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
margin-top: .8rem;
border: 1px solid rgba(32,32,39,.13);
background: #fffdf8;
}
.length-delta-grid > :global(article) {
padding: .8rem;
border-right: 1px solid rgba(32,32,39,.11);
}
.length-delta-grid > :global(article:last-child) { border-right: 0; }
.length-delta-grid > :global(article > span) {
display: block;
color: var(--blue);
font: 700 .62rem/1.2 var(--font-mono);
}
.length-delta-grid > :global(article > b) {
display: block;
margin-top: .45rem;
font: 730 .88rem/1.1 var(--font-mono);
}
.length-delta-grid > :global(article > strong) {
display: inline-block;
margin-top: .35rem;
padding: .22rem .35rem;
font: 750 .7rem/1 var(--font-mono);
}
.length-delta-grid > :global(article > strong.down) {
background: rgba(57,120,110,.12);
color: var(--teal);
}
.length-delta-grid > :global(article > strong.up) {
background: rgba(186,118,44,.12);
color: var(--amber);
}
.length-delta-grid > :global(article > p) {
margin: .4rem 0 0;
color: rgba(32,32,39,.54);
font: .59rem/1.4 var(--font-mono);
}
.length-pair-summary {
display: grid;
grid-template-columns: repeat(3, 1fr);
margin-top: .65rem;
border: 1px solid rgba(32,32,39,.13);
}
.length-pair-summary article {
padding: .8rem;
border-right: 1px solid rgba(32,32,39,.11);
}
.length-pair-summary article:last-child { border-right: 0; }
.length-pair-summary b {
display: block;
margin-top: .4rem;
font-size: .77rem;
}
.length-pair-summary p {
margin: .3rem 0 0;
color: rgba(32,32,39,.55);
font-size: .63rem;
line-height: 1.45;
}
.observed-cache {
display: grid;
grid-template-columns: 1fr auto 1.25fr;
@@ -1777,7 +2021,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.kernel-contract,
.corpus-controls,
.corpus-heat-head,
.corpus-comparison { grid-template-columns: 1fr; }
.corpus-comparison,
.length-sensitivity-head { grid-template-columns: 1fr; }
.artifact-status { grid-template-columns: 1fr 1fr; }
.artifact-tabs { grid-template-columns: 1fr 1fr; }
.route-controls { grid-template-columns: 1fr 1fr; }
@@ -1789,6 +2034,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.checksum-grid,
.absorb-metrics { grid-template-columns: 1fr 1fr; }
.corpus-ledger { grid-template-columns: repeat(3, 1fr); }
.length-delta-grid { grid-template-columns: 1fr 1fr; }
.corpus-heat-head p { text-align: left; }
.layer-evidence { grid-template-columns: repeat(9, 1fr); }
.repro-gate { grid-template-columns: 1fr 1fr; }
@@ -1817,7 +2063,9 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.checksum-grid,
.cache-ledger,
.corpus-ledger,
.corpus-findings { grid-template-columns: 1fr; }
.corpus-findings,
.length-delta-grid,
.length-pair-summary { grid-template-columns: 1fr; }
.route-metrics article,
.cache-ratio article,
.load-lessons article,
@@ -1826,8 +2074,12 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
.checksum-grid article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
.corpus-ledger article,
.corpus-findings article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
.corpus-mode-switch { display: grid; grid-template-columns: 1fr; }
.corpus-mode-switch button + button { border-left: 1px solid rgba(32,32,39,.22); border-top: 0; }
.corpus-mode-switch,
.corpus-cohort-switch { display: grid; grid-template-columns: 1fr; }
.corpus-mode-switch button + button,
.corpus-cohort-switch button + button { border-left: 1px solid rgba(32,32,39,.22); border-top: 0; }
.length-delta-grid > :global(article),
.length-pair-summary article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.11); }
.artifact-boundary { grid-template-columns: 1fr; }
.load-dials { grid-template-columns: 1fr; }
.observed-cache,