feat: add paired DeepSeek routing length control
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user