feat: add bootstrapped DeepSeek routing corpus
This commit is contained in:
@@ -3,12 +3,17 @@ import rawTrace from "@/data/deepseek-v2-lite-trace.json";
|
||||
import rawRepro from "@/data/deepseek-v2-lite-trace-repro.json";
|
||||
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";
|
||||
|
||||
const trace = rawTrace as any;
|
||||
const repro = rawRepro as any;
|
||||
const absorb = rawAbsorb as any;
|
||||
const absorbRepro = rawAbsorbRepro as any;
|
||||
const corpus = rawCorpus as any;
|
||||
const corpusRepro = rawCorpusRepro as any;
|
||||
const absorbExact = JSON.stringify(absorb) === JSON.stringify(absorbRepro);
|
||||
const corpusExact = JSON.stringify(corpus) === JSON.stringify(corpusRepro);
|
||||
const bytes = (value: number) => value >= 1024
|
||||
? `${(value / 1024).toFixed(2)} KiB`
|
||||
: `${value.toLocaleString()} B`;
|
||||
@@ -44,6 +49,19 @@ 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) => ({
|
||||
layer: layer.layer,
|
||||
routes: layer.routes,
|
||||
modes: layer.statistics,
|
||||
})),
|
||||
};
|
||||
const corpusCompactJson = JSON.stringify(corpusCompact).replaceAll("<", "\\u003c");
|
||||
const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoint_tensor_bytes;
|
||||
---
|
||||
|
||||
@@ -55,7 +73,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
</div>
|
||||
<p>
|
||||
固定官方 revision、tokenizer、模型代码和 BF16 第一分片;RTX 5090 连续执行 layer 0–6,
|
||||
捕获 3,240 次真实路由,并让 layer-1 权重继续走入官方吸收式 cache。所有结论都带证据身份与停止线。
|
||||
从 3,240 次 token 显微轨迹扩到 304,560 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
|
||||
所有结论都带证据身份与停止线。
|
||||
</p>
|
||||
</header>
|
||||
|
||||
@@ -79,8 +98,11 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<button type="button" role="tab" data-artifact-tab="absorb" aria-selected="false" tabindex="-1">
|
||||
<span>04</span><b>吸收式执行</b><small>real cache · SM120</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-artifact-tab="corpus" aria-selected="false" tabindex="-1">
|
||||
<span>05</span><b>128 样本区间</b><small>4 domains · bootstrap</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-artifact-tab="evidence" aria-selected="false" tabindex="-1">
|
||||
<span>05</span><b>证据断面</b><small>revision · shards · rerun</small>
|
||||
<span>06</span><b>证据断面</b><small>revision · shards · rerun</small>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -366,6 +388,94 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<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>
|
||||
<p>
|
||||
WikiText-2、TNEWS、HumanEval、GSM8K 各取 32 条;固定哈希选样、最多 96 tokens。
|
||||
每个区间都重采样 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>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>
|
||||
</div>
|
||||
|
||||
<div class="corpus-controls">
|
||||
<div>
|
||||
<span>MOE LAYER</span>
|
||||
<div class="layer-switch corpus-layer-switch" role="group" aria-label="选择公开语料路由层">
|
||||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||||
<button type="button" data-corpus-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>AGGREGATION</span>
|
||||
<div class="corpus-mode-switch" role="group" aria-label="选择公开语料聚合口径">
|
||||
<button type="button" data-corpus-mode="prompt_balanced" aria-pressed="true">每条 prompt 等权</button>
|
||||
<button type="button" data-corpus-mode="token_weighted" aria-pressed="false">按 token 加权</button>
|
||||
</div>
|
||||
</div>
|
||||
<p data-corpus-mode-note>
|
||||
先把每条 prompt 的 64 维路由分布归一,再平均;短中文标题与长代码 prompt 各有一票。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="corpus-domain-table" role="table" aria-label="四域专家负载与 bootstrap 区间">
|
||||
<div class="head" role="row">
|
||||
<b role="columnheader">DOMAIN / TOKENS</b>
|
||||
<b role="columnheader">CV · 95% CI</b>
|
||||
<b role="columnheader">EFFECTIVE · 95% CI</b>
|
||||
<b role="columnheader">TOP EXPERT · SHARE</b>
|
||||
</div>
|
||||
<div data-corpus-domain-rows></div>
|
||||
</div>
|
||||
|
||||
<div class="corpus-heat-head">
|
||||
<div><span>64 EXPERT SHARES</span><b data-corpus-heat-title>layer 1 · 每条 prompt 等权</b></div>
|
||||
<p>每一行独立着色;悬停查看 expert ID、份额与 95% 区间。同号 expert 只在当前层内有意义。</p>
|
||||
</div>
|
||||
<div class="corpus-heat-scroll">
|
||||
<div class="corpus-heatmap" data-corpus-heatmap aria-label="四个语料域的 64 专家份额热图"></div>
|
||||
</div>
|
||||
|
||||
<div class="corpus-comparison">
|
||||
<div>
|
||||
<span>PAIRWISE DISTANCE / JENSEN–SHANNON · NATS</span>
|
||||
<h5>同层四域分布距离</h5>
|
||||
<p>0 表示两条分布相同,理论上界 ln(2)≈0.693;这里展示点估计与 prompt bootstrap 区间。</p>
|
||||
</div>
|
||||
<div class="corpus-jsd" data-corpus-jsd role="table" aria-label="四域 Jensen-Shannon divergence 矩阵"></div>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="evidence-links">
|
||||
<a href="https://huggingface.co/datasets/Salesforce/wikitext" rel="noreferrer">WikiText-2 数据卡 ↗</a>
|
||||
<a href="https://github.com/CLUEbenchmark/CLUE" rel="noreferrer">CLUE / TNEWS ↗</a>
|
||||
<a href="https://github.com/openai/human-eval" rel="noreferrer">OpenAI HumanEval ↗</a>
|
||||
<a href="https://github.com/openai/grade-school-math" rel="noreferrer">OpenAI GSM8K ↗</a>
|
||||
</div>
|
||||
|
||||
<div class="artifact-boundary">
|
||||
<b>DESCRIPTIVE, NOT SEMANTICS</b>
|
||||
<p>
|
||||
这是固定 128 条公开 prompt 上的前六个 MoE 层,不是训练分布或线上流量。
|
||||
bootstrap 区间描述本探针换 prompt 的稳定性,不是零差异假设检验;没有多重比较校正,
|
||||
也不能把 E29、E48 等参数索引命名成“中文专家”或“代码专家”。
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="artifact-panel" data-artifact-panel="evidence" hidden>
|
||||
<div class="panel-lead">
|
||||
<div><span>O + X / EVIDENCE SLICE</span><h4>为什么执行到 layer 6 就停,而不是把“部分下载”写成“完整复现”</h4></div>
|
||||
@@ -455,11 +565,12 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<span>可复现入口</span>
|
||||
<code>experiments/deepseek/v2_lite_trace.py</code> ·
|
||||
<code>experiments/deepseek/v2_lite_absorb_probe.py</code> ·
|
||||
<code>src/data/deepseek-v2-lite-trace.json</code> ·
|
||||
<code>research/DEEPSEEK_MLA_ABSORB_AUDIT.md</code>
|
||||
<code>experiments/deepseek/v2_lite_routing_corpus.py</code> ·
|
||||
<code>research/DEEPSEEK_ROUTING_CORPUS_AUDIT.md</code>
|
||||
</figcaption>
|
||||
|
||||
<script is:inline type="application/json" data-dsv2-trace set:html={compactJson}></script>
|
||||
<script is:inline type="application/json" data-dsv2-corpus set:html={corpusCompactJson}></script>
|
||||
</figure>
|
||||
|
||||
<script>
|
||||
@@ -471,8 +582,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
if (node) node.textContent = value;
|
||||
};
|
||||
const payloadNode = one<HTMLScriptElement>("[data-dsv2-trace]");
|
||||
if (!payloadNode?.textContent) return;
|
||||
const corpusNode = one<HTMLScriptElement>("[data-dsv2-corpus]");
|
||||
if (!payloadNode?.textContent || !corpusNode?.textContent) return;
|
||||
const data = JSON.parse(payloadNode.textContent);
|
||||
const corpusData = JSON.parse(corpusNode.textContent);
|
||||
|
||||
const tabs = all<HTMLButtonElement>("[data-artifact-tab]");
|
||||
const panels = all<HTMLElement>("[data-artifact-panel]");
|
||||
@@ -659,6 +772,173 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
control.addEventListener("change", renderCache);
|
||||
});
|
||||
renderCache();
|
||||
|
||||
const corpusLabels: Record<string, string> = {
|
||||
english: "英文百科",
|
||||
chinese: "中文新闻",
|
||||
code: "Python 代码",
|
||||
math: "小学数学",
|
||||
};
|
||||
const corpusLayer = (layer: number) => corpusData.layers.find((item: any) => item.layer === layer);
|
||||
let corpusLayerNumber = 1;
|
||||
let corpusMode = "prompt_balanced";
|
||||
const formatCi = (ci: number[], digits = 3) => `[${ci[0].toFixed(digits)}, ${ci[1].toFixed(digits)}]`;
|
||||
const renderCorpus = () => {
|
||||
const layer = corpusLayer(corpusLayerNumber);
|
||||
const mode = layer.modes[corpusMode];
|
||||
all<HTMLButtonElement>("[data-corpus-layer]").forEach((button) => {
|
||||
button.classList.toggle("active", Number(button.dataset.corpusLayer) === corpusLayerNumber);
|
||||
});
|
||||
all<HTMLButtonElement>("[data-corpus-mode]").forEach((button) => {
|
||||
button.setAttribute("aria-pressed", String(button.dataset.corpusMode === corpusMode));
|
||||
});
|
||||
set(
|
||||
"[data-corpus-mode-note]",
|
||||
corpusMode === "prompt_balanced"
|
||||
? "先把每条 prompt 的 64 维路由分布归一,再平均;短中文标题与长代码 prompt 各有一票。"
|
||||
: "直接汇总全部 token 的路由计数;长 prompt 权重更高,适合回答“本批 token 实际流向哪里”。",
|
||||
);
|
||||
set(
|
||||
"[data-corpus-heat-title]",
|
||||
`layer ${corpusLayerNumber} · ${corpusMode === "prompt_balanced" ? "每条 prompt 等权" : "按 token 加权"}`,
|
||||
);
|
||||
|
||||
const rows = one<HTMLElement>("[data-corpus-domain-rows]");
|
||||
if (rows) {
|
||||
rows.replaceChildren(...corpusData.domains.map((domain: string) => {
|
||||
const result = mode.domains[domain];
|
||||
const metrics = result.metrics;
|
||||
const top = result.top_experts[0];
|
||||
const row = document.createElement("div");
|
||||
row.setAttribute("role", "row");
|
||||
|
||||
const identity = document.createElement("span");
|
||||
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`;
|
||||
identity.append(identityLabel, identityMeta);
|
||||
|
||||
const cv = document.createElement("span");
|
||||
const cvPoint = document.createElement("b");
|
||||
const cvCi = document.createElement("small");
|
||||
cvPoint.textContent = metrics.cv.point.toFixed(3);
|
||||
cvCi.textContent = formatCi(metrics.cv.ci95);
|
||||
cv.append(cvPoint, cvCi);
|
||||
|
||||
const effective = document.createElement("span");
|
||||
const effectivePoint = document.createElement("b");
|
||||
const effectiveCi = document.createElement("small");
|
||||
effectivePoint.textContent = metrics.effective_experts.point.toFixed(1);
|
||||
effectiveCi.textContent = formatCi(metrics.effective_experts.ci95, 1);
|
||||
effective.append(effectivePoint, effectiveCi);
|
||||
|
||||
const topExpert = document.createElement("span");
|
||||
const topLabel = document.createElement("b");
|
||||
const topCi = document.createElement("small");
|
||||
topLabel.textContent = `E${top.expert} · ${(top.share * 100).toFixed(2)}%`;
|
||||
topCi.textContent = `${(top.ci95[0] * 100).toFixed(2)}–${(top.ci95[1] * 100).toFixed(2)}%`;
|
||||
topExpert.append(topLabel, topCi);
|
||||
row.append(identity, cv, effective, topExpert);
|
||||
return row;
|
||||
}));
|
||||
}
|
||||
|
||||
const heatmap = one<HTMLElement>("[data-corpus-heatmap]");
|
||||
if (heatmap) {
|
||||
heatmap.replaceChildren(...corpusData.domains.map((domain: string) => {
|
||||
const result = mode.domains[domain];
|
||||
const max = Math.max(...result.distribution);
|
||||
const row = document.createElement("div");
|
||||
const label = document.createElement("b");
|
||||
label.textContent = corpusLabels[domain];
|
||||
row.append(label);
|
||||
result.distribution.forEach((share: number, expert: number) => {
|
||||
const cell = document.createElement("span");
|
||||
const ci = result.expert_share_ci95[expert];
|
||||
cell.style.setProperty("--share", String(share / max));
|
||||
cell.title = `${corpusLabels[domain]} · L${corpusLayerNumber} · E${expert} · ${(share * 100).toFixed(2)}% · 95% CI ${(ci[0] * 100).toFixed(2)}–${(ci[1] * 100).toFixed(2)}%`;
|
||||
cell.setAttribute("aria-label", cell.title);
|
||||
row.append(cell);
|
||||
});
|
||||
return row;
|
||||
}));
|
||||
}
|
||||
|
||||
const jsd = one<HTMLElement>("[data-corpus-jsd]");
|
||||
const pairFor = (left: string, right: string) => mode.pairs.find((pair: any) =>
|
||||
(pair.left === left && pair.right === right) || (pair.left === right && pair.right === left)
|
||||
);
|
||||
if (jsd) {
|
||||
const cells: HTMLElement[] = [];
|
||||
const corner = document.createElement("b");
|
||||
corner.textContent = "DOMAIN";
|
||||
cells.push(corner);
|
||||
corpusData.domains.forEach((domain: string) => {
|
||||
const header = document.createElement("b");
|
||||
header.textContent = corpusLabels[domain];
|
||||
cells.push(header);
|
||||
});
|
||||
corpusData.domains.forEach((left: string) => {
|
||||
const header = document.createElement("b");
|
||||
header.textContent = corpusLabels[left];
|
||||
cells.push(header);
|
||||
corpusData.domains.forEach((right: string) => {
|
||||
const cell = document.createElement("span");
|
||||
if (left === right) {
|
||||
cell.className = "diagonal";
|
||||
cell.textContent = "0";
|
||||
} else {
|
||||
const result = pairFor(left, right).js_divergence;
|
||||
const point = document.createElement("b");
|
||||
const ci = document.createElement("small");
|
||||
point.textContent = result.point.toFixed(3);
|
||||
ci.textContent = formatCi(result.ci95);
|
||||
cell.append(point, ci);
|
||||
}
|
||||
cells.push(cell);
|
||||
});
|
||||
});
|
||||
jsd.replaceChildren(...cells);
|
||||
}
|
||||
|
||||
const highest = corpusData.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]
|
||||
.sort((left: any, right: any) =>
|
||||
right.js_divergence.point - left.js_divergence.point
|
||||
)[0];
|
||||
set(
|
||||
"[data-corpus-highest-cv]",
|
||||
`${corpusLabels[highest.domain]} · ${highest.value.point.toFixed(3)}`,
|
||||
);
|
||||
set(
|
||||
"[data-corpus-highest-cv-ci]",
|
||||
`95% CI ${formatCi(highest.value.ci95)} · L${corpusLayerNumber}`,
|
||||
);
|
||||
set(
|
||||
"[data-corpus-largest-jsd]",
|
||||
`${corpusLabels[largest.left]} ↔ ${corpusLabels[largest.right]} · ${largest.js_divergence.point.toFixed(3)}`,
|
||||
);
|
||||
set(
|
||||
"[data-corpus-largest-jsd-ci]",
|
||||
`95% CI ${formatCi(largest.js_divergence.ci95)} · nats`,
|
||||
);
|
||||
};
|
||||
all<HTMLButtonElement>("[data-corpus-layer]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
corpusLayerNumber = Number(button.dataset.corpusLayer);
|
||||
renderCorpus();
|
||||
});
|
||||
});
|
||||
all<HTMLButtonElement>("[data-corpus-mode]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
corpusMode = button.dataset.corpusMode ?? "prompt_balanced";
|
||||
renderCorpus();
|
||||
});
|
||||
});
|
||||
renderCorpus();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -702,7 +982,12 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.execution-split span,
|
||||
.repro-gate span,
|
||||
.dependency-split span,
|
||||
.checksum-grid span {
|
||||
.checksum-grid span,
|
||||
.corpus-ledger span,
|
||||
.corpus-controls > div > span,
|
||||
.corpus-heat-head span,
|
||||
.corpus-comparison span,
|
||||
.corpus-findings span {
|
||||
margin: 0;
|
||||
color: var(--blue);
|
||||
font: 700 .69rem/1.3 var(--font-mono);
|
||||
@@ -756,7 +1041,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.artifact-status b { color: var(--ink); font-size: .72rem; }
|
||||
.artifact-tabs {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
background: var(--ink);
|
||||
}
|
||||
.artifact-tabs button {
|
||||
@@ -1052,6 +1337,212 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.jaccard-block :global([data-load-jaccard] article b) { font: 700 .62rem/1 var(--font-mono); text-align: right; }
|
||||
.load-lessons { grid-template-columns: repeat(3, 1fr); }
|
||||
.load-lessons b { display: block; margin-top: .35rem; font-size: .77rem; }
|
||||
.corpus-ledger {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
}
|
||||
.corpus-ledger article {
|
||||
padding: .85rem;
|
||||
border-right: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.corpus-ledger article:last-child { border-right: 0; }
|
||||
.corpus-ledger article.exact { background: rgba(57,120,110,.1); }
|
||||
.corpus-ledger b {
|
||||
display: block;
|
||||
margin-top: .4rem;
|
||||
font: 750 1.2rem/1 var(--font-display);
|
||||
}
|
||||
.corpus-ledger p {
|
||||
margin: .3rem 0 0;
|
||||
color: rgba(32,32,39,.56);
|
||||
font-size: .63rem;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.corpus-controls {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1.1fr minmax(15rem, 1.3fr);
|
||||
gap: 1rem;
|
||||
align-items: end;
|
||||
margin-top: .8rem;
|
||||
padding: .85rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.corpus-controls > div { display: grid; gap: .45rem; }
|
||||
.corpus-controls .layer-switch { margin: 0; }
|
||||
.corpus-mode-switch { display: flex; }
|
||||
.corpus-mode-switch button {
|
||||
padding: .58rem .75rem;
|
||||
border: 1px solid rgba(32,32,39,.22);
|
||||
background: #fffdf8;
|
||||
color: var(--ink);
|
||||
font: 650 .67rem/1 var(--font-mono);
|
||||
cursor: pointer;
|
||||
}
|
||||
.corpus-mode-switch button + button { border-left: 0; }
|
||||
.corpus-mode-switch button[aria-pressed="true"] {
|
||||
border-color: var(--blue);
|
||||
background: var(--blue);
|
||||
color: white;
|
||||
}
|
||||
.corpus-controls > p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.62);
|
||||
font-size: .69rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.corpus-domain-table {
|
||||
margin-top: .8rem;
|
||||
border: 1px solid rgba(32,32,39,.15);
|
||||
overflow-x: auto;
|
||||
background: #fffdf8;
|
||||
}
|
||||
.corpus-domain-table .head,
|
||||
.corpus-domain-table :global([data-corpus-domain-rows] > div) {
|
||||
display: grid;
|
||||
grid-template-columns: 1.25fr repeat(3, 1fr);
|
||||
min-width: 680px;
|
||||
}
|
||||
.corpus-domain-table .head { background: var(--ink); color: white; }
|
||||
.corpus-domain-table .head b,
|
||||
.corpus-domain-table :global([data-corpus-domain-rows] > div > span) {
|
||||
display: grid;
|
||||
gap: .25rem;
|
||||
padding: .7rem;
|
||||
border-right: 1px solid rgba(32,32,39,.1);
|
||||
border-bottom: 1px solid rgba(32,32,39,.1);
|
||||
}
|
||||
.corpus-domain-table .head b {
|
||||
font: 650 .62rem/1.2 var(--font-mono);
|
||||
border-color: rgba(255,255,255,.12);
|
||||
}
|
||||
.corpus-domain-table :global([data-corpus-domain-rows] b) {
|
||||
font: 720 .76rem/1.2 var(--font-mono);
|
||||
}
|
||||
.corpus-domain-table :global([data-corpus-domain-rows] small) {
|
||||
color: rgba(32,32,39,.52);
|
||||
font: .61rem/1.25 var(--font-mono);
|
||||
}
|
||||
.corpus-heat-head {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1.4fr;
|
||||
gap: 1rem;
|
||||
align-items: end;
|
||||
margin: 1rem 0 .55rem;
|
||||
}
|
||||
.corpus-heat-head > div { display: grid; gap: .25rem; }
|
||||
.corpus-heat-head b { font-size: .78rem; }
|
||||
.corpus-heat-head p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .67rem;
|
||||
line-height: 1.45;
|
||||
text-align: right;
|
||||
}
|
||||
.corpus-heat-scroll {
|
||||
overflow-x: auto;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #ddd6ca;
|
||||
}
|
||||
.corpus-heatmap { min-width: 880px; }
|
||||
.corpus-heatmap > :global(div) {
|
||||
display: grid;
|
||||
grid-template-columns: 6.5rem repeat(64, minmax(8px, 1fr));
|
||||
gap: 2px;
|
||||
padding: 3px;
|
||||
border-bottom: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.corpus-heatmap > :global(div:last-child) { border-bottom: 0; }
|
||||
.corpus-heatmap > :global(div > b) {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
display: grid;
|
||||
align-items: center;
|
||||
padding: .45rem;
|
||||
background: #eee8de;
|
||||
font: 700 .61rem/1.1 var(--font-mono);
|
||||
}
|
||||
.corpus-heatmap > :global(div > span) {
|
||||
min-height: 1.55rem;
|
||||
background: color-mix(in srgb, var(--blue) calc(var(--share) * 88%), #f2ede4);
|
||||
cursor: help;
|
||||
}
|
||||
.corpus-heatmap > :global(div > span:hover) {
|
||||
outline: 2px solid var(--amber);
|
||||
z-index: 2;
|
||||
}
|
||||
.corpus-comparison {
|
||||
display: grid;
|
||||
grid-template-columns: .65fr 1.35fr;
|
||||
gap: 1rem;
|
||||
margin-top: .8rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.corpus-comparison h5 {
|
||||
margin: .4rem 0;
|
||||
font: 720 1rem/1.15 var(--font-display);
|
||||
}
|
||||
.corpus-comparison p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .68rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.corpus-jsd {
|
||||
display: grid;
|
||||
grid-template-columns: 6rem repeat(4, minmax(5.5rem, 1fr));
|
||||
overflow-x: auto;
|
||||
border: 1px solid rgba(32,32,39,.13);
|
||||
background: #fffdf8;
|
||||
}
|
||||
.corpus-jsd > :global(b),
|
||||
.corpus-jsd > :global(span) {
|
||||
display: grid;
|
||||
align-content: center;
|
||||
gap: .2rem;
|
||||
min-height: 3.1rem;
|
||||
padding: .45rem;
|
||||
border-right: 1px solid rgba(32,32,39,.1);
|
||||
border-bottom: 1px solid rgba(32,32,39,.1);
|
||||
font: 650 .59rem/1.2 var(--font-mono);
|
||||
}
|
||||
.corpus-jsd > :global(b) { background: var(--ink); color: white; }
|
||||
.corpus-jsd > :global(span > b) { font-size: .72rem; }
|
||||
.corpus-jsd > :global(span > small) {
|
||||
color: rgba(32,32,39,.48);
|
||||
font-size: .52rem;
|
||||
}
|
||||
.corpus-jsd > :global(span.diagonal) {
|
||||
place-items: center;
|
||||
background: rgba(57,120,110,.08);
|
||||
color: var(--teal);
|
||||
}
|
||||
.corpus-findings {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
margin-top: .8rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
}
|
||||
.corpus-findings article {
|
||||
padding: .85rem;
|
||||
border-right: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.corpus-findings article:last-child { border-right: 0; }
|
||||
.corpus-findings b {
|
||||
display: block;
|
||||
margin-top: .4rem;
|
||||
font-size: .78rem;
|
||||
}
|
||||
.corpus-findings p {
|
||||
margin: .3rem 0 0;
|
||||
color: rgba(32,32,39,.56);
|
||||
font-size: .65rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.observed-cache {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto 1.25fr;
|
||||
@@ -1283,7 +1774,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.heat-head,
|
||||
.aggregate-card,
|
||||
.jaccard-block,
|
||||
.kernel-contract { grid-template-columns: 1fr; }
|
||||
.kernel-contract,
|
||||
.corpus-controls,
|
||||
.corpus-heat-head,
|
||||
.corpus-comparison { 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; }
|
||||
@@ -1294,6 +1788,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.route-metrics,
|
||||
.checksum-grid,
|
||||
.absorb-metrics { grid-template-columns: 1fr 1fr; }
|
||||
.corpus-ledger { grid-template-columns: repeat(3, 1fr); }
|
||||
.corpus-heat-head p { text-align: left; }
|
||||
.layer-evidence { grid-template-columns: repeat(9, 1fr); }
|
||||
.repro-gate { grid-template-columns: 1fr 1fr; }
|
||||
.repro-gate > p { grid-column: 1 / -1; padding: .8rem 0 0; border-left: 0; border-top: 1px solid rgba(255,255,255,.18); }
|
||||
@@ -1319,13 +1815,19 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.absorb-metrics,
|
||||
.artifact-identity,
|
||||
.checksum-grid,
|
||||
.cache-ledger { grid-template-columns: 1fr; }
|
||||
.cache-ledger,
|
||||
.corpus-ledger,
|
||||
.corpus-findings { grid-template-columns: 1fr; }
|
||||
.route-metrics article,
|
||||
.cache-ratio article,
|
||||
.load-lessons article,
|
||||
.absorb-metrics article,
|
||||
.artifact-identity article,
|
||||
.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; }
|
||||
.artifact-boundary { grid-template-columns: 1fr; }
|
||||
.load-dials { grid-template-columns: 1fr; }
|
||||
.observed-cache,
|
||||
|
||||
Reference in New Issue
Block a user