feat: isolate DeepSeek role marker head token
This commit is contained in:
@@ -17,6 +17,7 @@ import rawHistoryRepro from "@/data/deepseek-v2-lite-routing-history-factorial-r
|
||||
import rawDistance from "@/data/deepseek-v2-lite-routing-history-distance-control.json";
|
||||
import rawDistanceRepro from "@/data/deepseek-v2-lite-routing-history-distance-control-repro.json";
|
||||
import rawBoundaryCompact from "@/data/deepseek-v2-lite-routing-history-boundary-token-control-compact.json";
|
||||
import rawRoleCompact from "@/data/deepseek-v2-lite-routing-role-marker-head-control-compact.json";
|
||||
|
||||
const trace = rawTrace as any;
|
||||
const repro = rawRepro as any;
|
||||
@@ -36,6 +37,7 @@ const historyRepro = rawHistoryRepro as any;
|
||||
const distance = rawDistance as any;
|
||||
const distanceRepro = rawDistanceRepro as any;
|
||||
const boundaryCompact = rawBoundaryCompact as any;
|
||||
const roleCompact = rawRoleCompact 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);
|
||||
@@ -44,6 +46,7 @@ const templateExact = JSON.stringify(template) === JSON.stringify(templateRepro)
|
||||
const historyExact = JSON.stringify(history) === JSON.stringify(historyRepro);
|
||||
const distanceExact = JSON.stringify(distance) === JSON.stringify(distanceRepro);
|
||||
const boundaryExact = boundaryCompact.source.exact;
|
||||
const roleExact = roleCompact.source.exact;
|
||||
const bytes = (value: number) => value >= 1024
|
||||
? `${(value / 1024).toFixed(2)} KiB`
|
||||
: `${value.toLocaleString()} B`;
|
||||
@@ -333,6 +336,7 @@ const distanceCompact = {
|
||||
};
|
||||
const distanceCompactJson = JSON.stringify(distanceCompact).replaceAll("<", "\\u003c");
|
||||
const boundaryCompactJson = JSON.stringify(boundaryCompact).replaceAll("<", "\\u003c");
|
||||
const roleCompactJson = JSON.stringify(roleCompact).replaceAll("<", "\\u003c");
|
||||
const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoint_tensor_bytes;
|
||||
---
|
||||
|
||||
@@ -344,7 +348,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
</div>
|
||||
<p>
|
||||
固定官方 revision、tokenizer、模型代码和 BF16 第一分片;RTX 5090 连续执行 layer 0–6,
|
||||
从 3,240 次 token 显微轨迹扩到 5,157,072 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
|
||||
从 3,240 次 token 显微轨迹扩到 7,201,296 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
|
||||
所有结论都带证据身份与停止线。
|
||||
</p>
|
||||
</header>
|
||||
@@ -384,8 +388,11 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<button type="button" role="tab" data-artifact-tab="boundary" aria-selected="false" tabindex="-1">
|
||||
<span>09</span><b>边界单词元控制</b><small>EOS ↔ x / . / ↵</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-artifact-tab="role" aria-selected="false" tabindex="-1">
|
||||
<span>10</span><b>角色词头控制</b><small>User ↔ Assistant / x</small>
|
||||
</button>
|
||||
<button type="button" role="tab" data-artifact-tab="evidence" aria-selected="false" tabindex="-1">
|
||||
<span>10</span><b>证据断面</b><small>revision · shards · rerun</small>
|
||||
<span>11</span><b>证据断面</b><small>revision · shards · rerun</small>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -1312,6 +1319,157 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="artifact-panel" data-artifact-panel="role" hidden>
|
||||
<div class="panel-lead">
|
||||
<div><span>X / ROLE-HEAD SINGLE-ID CONTROL</span><h4>只换 `User:` 的第一个 ID:直接作用不等于统一调制 system</h4></div>
|
||||
<p>
|
||||
官方 EOS、冒号、长度、目标位置、mask 与 32-row batch 全部不动;
|
||||
目标后的 generation head 另做 causal suffix 负对照。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="history-ledger role-ledger">
|
||||
<article><span>SOURCE PROMPTS</span><b>128</b><p>四个公开域各 32 条;沿用同一 cohort</p></article>
|
||||
<article><span>2×4 VARIANTS</span><b>1,024</b><p>system 0/1 × 四种词头水平</p></article>
|
||||
<article><span>INPUT TOKENS</span><b>56,784</b><p>八格逐组完全同长度</p></article>
|
||||
<article><span>REAL ROUTES</span><b>2,044,224</b><p>八格 × 前六个 MoE 层</p></article>
|
||||
<article><span>CAUSAL SUFFIX</span><b>34,488 exact</b><p>目标 layer×token×system ordered top-6</p></article>
|
||||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{roleExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 9dc0e37f…b8caf</p></article>
|
||||
</div>
|
||||
|
||||
<div class="role-protocol" aria-label="目标角色词头的单 token ID 控制">
|
||||
<div class="role-track">
|
||||
<span>FIXED HISTORY + EOS</span>
|
||||
<b data-role-target-head>User</b><i>:</i><mark>TARGET</mark>
|
||||
<span>CAUSAL SUFFIX</span>
|
||||
<b data-role-suffix-head>Assistant</b><i>:</i>
|
||||
</div>
|
||||
<div class="role-level-grid">
|
||||
<article class="official">
|
||||
<span>OFFICIAL</span><b>User … Assistant</b><code>5726 / 77398</code>
|
||||
<p>目标入口与 generation prompt 都保持官方词头。</p>
|
||||
</article>
|
||||
<article>
|
||||
<span>PRE-TARGET A</span><b>User → Assistant</b><code>5726 → 77398</code>
|
||||
<p>只改目标前词头;冒号与官方 EOS 不动。</p>
|
||||
</article>
|
||||
<article>
|
||||
<span>PRE-TARGET B</span><b>User → x</b><code>5726 → 87</code>
|
||||
<p>普通内容 token 对照;仍只改一个 ID。</p>
|
||||
</article>
|
||||
<article class="negative">
|
||||
<span>POST-TARGET CONTROL</span><b>Assistant → User</b><code>77398 → 5726</code>
|
||||
<p>发生在目标之后;目标路由必须 causal-exact。</p>
|
||||
</article>
|
||||
</div>
|
||||
<p>
|
||||
256 / 256 组同长度同目标位置;768 / 768 个反事实相对官方序列恰好一 ID。
|
||||
三个反事实都不是官方合法 chat。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="role-controls">
|
||||
<div>
|
||||
<span>MOE LAYER</span>
|
||||
<div class="layer-switch role-layer-switch" role="group" aria-label="选择角色词头控制层">
|
||||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||||
<button type="button" data-role-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>MEASUREMENT SCOPE</span>
|
||||
<div class="role-scope-switch" role="group" aria-label="选择角色词头统计范围">
|
||||
<button type="button" data-role-scope="target_content" aria-pressed="true">目标内容</button>
|
||||
<button type="button" data-role-scope="full_input" aria-pressed="false">完整输入</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>AGGREGATION</span>
|
||||
<div class="role-mode-switch" role="group" aria-label="选择角色词头聚合口径">
|
||||
<button type="button" data-role-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||||
<button type="button" data-role-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>CONTROL − OFFICIAL</span>
|
||||
<div class="role-contrast-switch" role="group" aria-label="选择角色词头对照">
|
||||
<button type="button" data-role-contrast="target_assistant_minus_official" aria-pressed="true">U→A</button>
|
||||
<button type="button" data-role-contrast="target_x_minus_official" aria-pressed="false">U→x</button>
|
||||
<button type="button" data-role-contrast="suffix_user_minus_official" aria-pressed="false">suffix A→U</button>
|
||||
</div>
|
||||
</div>
|
||||
<p data-role-note>
|
||||
目标内容:正 ΔTV 表示替换词头后 system edge 更大;direct TV 单独回答“这个 ID 本身改了多少路由”。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="role-domain-grid" data-role-domain-grid></div>
|
||||
|
||||
<div class="history-buffer-summary role-summary">
|
||||
<article><span>DIRECT U→A</span><b>.0222 / .0218</b><p>S0 / S1 mean target TV;前置词头有直接作用。</p></article>
|
||||
<article><span>DIRECT U→x</span><b>.0263 / .0253</b><p>S0 / S1;普通 token 对照同样改变后续路由。</p></article>
|
||||
<article><span>SUFFIX CONTROL</span><b>34,488 / 34,488</b><p>目标 ordered top-6 exact;direct TV / JSD 全为零。</p></article>
|
||||
<article><span>SYSTEM MODULATION</span><b>12↑12↓ / 13↑11↓</b><p>U→A / U→x 的 24 格方向混合,均值近零。</p></article>
|
||||
</div>
|
||||
|
||||
<div class="role-depth">
|
||||
<div>
|
||||
<span>DEPTH MAP / SYSTEM-EDGE CONTRAST</span>
|
||||
<h5 data-role-depth-title>User→Assistant:system-edge TV 相对官方的变化</h5>
|
||||
<p>每格用八条件共享 source-bootstrap;红色为更大、绿色为更小,跨零不冒充稳定方向。</p>
|
||||
</div>
|
||||
<div data-role-depth-map></div>
|
||||
</div>
|
||||
|
||||
<div class="role-causal-ledger">
|
||||
<article>
|
||||
<span>BEFORE TARGET</span><b>direct TV ≈ .02–.03</b>
|
||||
<p>单个角色词头 ID 足以条件化后续 token 的专家集合。</p>
|
||||
</article>
|
||||
<article class="exact">
|
||||
<span>AFTER TARGET</span><b>ordered top-6 = 100%</b>
|
||||
<p>六层 × 两个 system 水平全部 causal-exact;对齐与 mask 闸门通过。</p>
|
||||
</article>
|
||||
<article>
|
||||
<span>NOT IDENTIFIED</span><b>完整角色语义</b>
|
||||
<p>冒号仍在,且 base ≠ Chat/SFT;没有生成、准确率或安全行为。</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="role-batch-audit">
|
||||
<div>
|
||||
<span>BF16 BATCH-CONTENT AUDIT</span>
|
||||
<h5>同样 32 rows、同样 official token IDs,companion rows 改了,深层 route 仍会分化</h5>
|
||||
<p>当前 official 与上一轮 EOS 条件的 256 / 256 token-ID hashes 相同;下表是跨实验 official target route-hash exact。</p>
|
||||
</div>
|
||||
<div>
|
||||
{roleCompact.crossBatch.map((row: any) => (
|
||||
<span class={row.layer === 1 ? "exact" : ""}>
|
||||
<b>L{row.layer}</b>
|
||||
<i>{row.targetRouteHashExact} / {row.compared}</i>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="evidence-links">
|
||||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite/blob/604d5664dddd88a0433dbae533b7fe9472482de0/tokenizer_config.json" rel="noreferrer">固定官方 tokenizer_config ↗</a>
|
||||
<a href="https://huggingface.co/docs/transformers/en/chat_templating" rel="noreferrer">HF Chat Templates ↗</a>
|
||||
<a href="https://arxiv.org/abs/2305.11206" rel="noreferrer">LIMA · EOT ↗</a>
|
||||
<a href="https://proceedings.iclr.cc/paper_files/paper/2024/file/6bcbb4a501dbad0eba1b660c1a55318c-Paper-Conference.pdf" rel="noreferrer">URIAL · base formatting ↗</a>
|
||||
<a href="https://aclanthology.org/2024.tacl-1.52/" rel="noreferrer">Multi-prompt sensitivity ↗</a>
|
||||
</div>
|
||||
|
||||
<div class="artifact-boundary">
|
||||
<b>ONE ROLE-HEAD ID, NOT COMPLETE ROLE SEMANTICS</b>
|
||||
<p>
|
||||
前置词头会改变后续路由,但没有统一调制 system;后置负对照严格为零。
|
||||
下一步仍需 special-token family、完整两-token 角色块、Chat 权重与行为指标。
|
||||
</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>
|
||||
@@ -1411,7 +1569,9 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<code>experiments/deepseek/v2_lite_routing_history_distance_control.py</code> ·
|
||||
<code>research/DEEPSEEK_ROUTING_HISTORY_DISTANCE_CONTROL_AUDIT.md</code> ·
|
||||
<code>experiments/deepseek/v2_lite_routing_history_boundary_token_control.py</code> ·
|
||||
<code>research/DEEPSEEK_ROUTING_HISTORY_BOUNDARY_TOKEN_AUDIT.md</code>
|
||||
<code>research/DEEPSEEK_ROUTING_HISTORY_BOUNDARY_TOKEN_AUDIT.md</code> ·
|
||||
<code>experiments/deepseek/v2_lite_routing_role_marker_head_control.py</code> ·
|
||||
<code>research/DEEPSEEK_ROUTING_ROLE_MARKER_HEAD_AUDIT.md</code>
|
||||
</figcaption>
|
||||
|
||||
<script is:inline type="application/json" data-dsv2-trace set:html={compactJson}></script>
|
||||
@@ -1420,6 +1580,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
<script is:inline type="application/json" data-dsv2-history set:html={historyCompactJson}></script>
|
||||
<script is:inline type="application/json" data-dsv2-distance set:html={distanceCompactJson}></script>
|
||||
<script is:inline type="application/json" data-dsv2-boundary set:html={boundaryCompactJson}></script>
|
||||
<script is:inline type="application/json" data-dsv2-role set:html={roleCompactJson}></script>
|
||||
</figure>
|
||||
|
||||
<script>
|
||||
@@ -1436,6 +1597,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
const historyNode = one<HTMLScriptElement>("[data-dsv2-history]");
|
||||
const distanceNode = one<HTMLScriptElement>("[data-dsv2-distance]");
|
||||
const boundaryNode = one<HTMLScriptElement>("[data-dsv2-boundary]");
|
||||
const roleNode = one<HTMLScriptElement>("[data-dsv2-role]");
|
||||
if (
|
||||
!payloadNode?.textContent
|
||||
|| !corpusNode?.textContent
|
||||
@@ -1443,6 +1605,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
|| !historyNode?.textContent
|
||||
|| !distanceNode?.textContent
|
||||
|| !boundaryNode?.textContent
|
||||
|| !roleNode?.textContent
|
||||
) return;
|
||||
const data = JSON.parse(payloadNode.textContent);
|
||||
const corpusData = JSON.parse(corpusNode.textContent);
|
||||
@@ -1450,6 +1613,7 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
const historyData = JSON.parse(historyNode.textContent);
|
||||
const distanceData = JSON.parse(distanceNode.textContent);
|
||||
const boundaryData = JSON.parse(boundaryNode.textContent);
|
||||
const roleData = JSON.parse(roleNode.textContent);
|
||||
|
||||
const tabs = all<HTMLButtonElement>("[data-artifact-tab]");
|
||||
const panels = all<HTMLElement>("[data-artifact-panel]");
|
||||
@@ -2508,6 +2672,182 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
});
|
||||
});
|
||||
renderBoundary();
|
||||
|
||||
let roleLayerNumber = 1;
|
||||
let roleScope = "target_content";
|
||||
let roleMode = "prompt_balanced";
|
||||
let roleContrast = "target_assistant_minus_official";
|
||||
const roleContrastLabels: Record<string, string> = {
|
||||
target_assistant_minus_official: "U→A − OFFICIAL",
|
||||
target_x_minus_official: "U→X − OFFICIAL",
|
||||
suffix_user_minus_official: "SUFFIX A→U − OFFICIAL",
|
||||
};
|
||||
const roleLevelLabels: Record<string, string> = {
|
||||
official: "OFF.",
|
||||
target_assistant: "U→A",
|
||||
target_x: "U→x",
|
||||
suffix_user: "SFX",
|
||||
};
|
||||
const roleReplacement = () => roleContrast.replace("_minus_official", "");
|
||||
const renderRole = () => {
|
||||
all<HTMLButtonElement>("[data-role-layer]").forEach((button) => {
|
||||
button.classList.toggle(
|
||||
"active",
|
||||
Number(button.dataset.roleLayer) === roleLayerNumber,
|
||||
);
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-scope]").forEach((button) => {
|
||||
button.setAttribute(
|
||||
"aria-pressed",
|
||||
String(button.dataset.roleScope === roleScope),
|
||||
);
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-mode]").forEach((button) => {
|
||||
button.setAttribute(
|
||||
"aria-pressed",
|
||||
String(button.dataset.roleMode === roleMode),
|
||||
);
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-contrast]").forEach((button) => {
|
||||
button.setAttribute(
|
||||
"aria-pressed",
|
||||
String(button.dataset.roleContrast === roleContrast),
|
||||
);
|
||||
});
|
||||
set(
|
||||
"[data-role-note]",
|
||||
roleScope === "target_content"
|
||||
? "目标内容:正 ΔTV 表示替换词头后 system edge 更大;direct TV 单独回答“这个 ID 本身改了多少路由”。"
|
||||
: "完整输入:被替换词头、历史、目标、换行与 generation prompt 全部计入;suffix 自身因此不再是零。",
|
||||
);
|
||||
|
||||
const replacement = roleReplacement();
|
||||
set(
|
||||
"[data-role-target-head]",
|
||||
replacement === "target_assistant"
|
||||
? "Assistant"
|
||||
: replacement === "target_x"
|
||||
? "x"
|
||||
: "User",
|
||||
);
|
||||
set(
|
||||
"[data-role-suffix-head]",
|
||||
replacement === "suffix_user" ? "User" : "Assistant",
|
||||
);
|
||||
const currentLayer = roleData.layers.find(
|
||||
(item: any) => item.layer === roleLayerNumber,
|
||||
);
|
||||
const view = currentLayer.scopes[roleScope].modes[roleMode];
|
||||
const grid = one<HTMLElement>("[data-role-domain-grid]");
|
||||
if (grid) {
|
||||
grid.replaceChildren(...roleData.domains.map((domain: string) => {
|
||||
const data = view[domain];
|
||||
const contrast = data.contrasts[roleContrast].total_variation_delta;
|
||||
const direct = data.direct[replacement];
|
||||
const interaction = direct.s1_minus_s0.total_variation_delta;
|
||||
const alignmentS0 = currentLayer.alignment[domain][`${replacement}_at_s0`];
|
||||
const alignmentS1 = currentLayer.alignment[domain][`${replacement}_at_s1`];
|
||||
const card = document.createElement("article");
|
||||
const label = document.createElement("span");
|
||||
const ladder = document.createElement("div");
|
||||
const primary = document.createElement("strong");
|
||||
const ci = document.createElement("p");
|
||||
const stability = document.createElement("small");
|
||||
const substitution = document.createElement("em");
|
||||
const interactionLine = document.createElement("u");
|
||||
const cv = document.createElement("i");
|
||||
label.textContent = corpusLabels[domain];
|
||||
ladder.className = "role-tv-ladder";
|
||||
["official", "target_assistant", "target_x", "suffix_user"].forEach((level) => {
|
||||
const cell = document.createElement("b");
|
||||
const name = document.createElement("small");
|
||||
const value = document.createElement("strong");
|
||||
name.textContent = roleLevelLabels[level];
|
||||
value.textContent = data.distances[level].total_variation.point.toFixed(3);
|
||||
cell.classList.toggle("selected", level === replacement);
|
||||
cell.classList.toggle("official", level === "official");
|
||||
cell.classList.toggle("causal", level === "suffix_user");
|
||||
cell.append(name, value);
|
||||
ladder.append(cell);
|
||||
});
|
||||
primary.textContent = `${roleContrastLabels[roleContrast]} · ΔTV ${signed(contrast.point)}`;
|
||||
primary.className = deltaClass(contrast.ci95);
|
||||
ci.textContent = `source-paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||||
stability.textContent = `direct target top-6 set exact · S0 ${(alignmentS0.setExactRate * 100).toFixed(1)}% · S1 ${(alignmentS1.setExactRate * 100).toFixed(1)}% · J ${alignmentS0.meanJaccard.toFixed(3)} / ${alignmentS1.meanJaccard.toFixed(3)}`;
|
||||
substitution.textContent = `direct OFFICIAL↔${roleLevelLabels[replacement]} TV · S0 ${direct.at_s0.total_variation.point.toFixed(3)} · S1 ${direct.at_s1.total_variation.point.toFixed(3)}`;
|
||||
interactionLine.textContent = `direct S1−S0 ${signed(interaction.point)} · 95% ${formatSignedCi(interaction.ci95)}`;
|
||||
const cvContrast = data.cvContrasts[roleContrast];
|
||||
cv.textContent = `system-edge ΔCV ${signed(cvContrast.point)} · 95% ${formatSignedCi(cvContrast.ci95)}`;
|
||||
card.append(
|
||||
label,
|
||||
ladder,
|
||||
primary,
|
||||
ci,
|
||||
stability,
|
||||
substitution,
|
||||
interactionLine,
|
||||
cv,
|
||||
);
|
||||
return card;
|
||||
}));
|
||||
}
|
||||
|
||||
const titles: Record<string, string> = {
|
||||
target_assistant_minus_official: "User→Assistant:system-edge TV 相对官方的变化",
|
||||
target_x_minus_official: "User→x:普通 token 词头的 system-edge contrast",
|
||||
suffix_user_minus_official: "suffix Assistant→User:目标内容 causal-exact 负对照",
|
||||
};
|
||||
set("[data-role-depth-title]", titles[roleContrast]);
|
||||
const depth = one<HTMLElement>("[data-role-depth-map]");
|
||||
if (depth) {
|
||||
depth.replaceChildren(...roleData.domains.map((domain: string) => {
|
||||
const row = document.createElement("div");
|
||||
const label = document.createElement("b");
|
||||
label.textContent = corpusLabels[domain];
|
||||
row.append(label);
|
||||
roleData.layers.forEach((layer: any) => {
|
||||
const contrast = layer.scopes[roleScope].modes[roleMode]
|
||||
[domain].contrasts[roleContrast].total_variation_delta;
|
||||
const cell = document.createElement("span");
|
||||
cell.className = deltaClass(contrast.ci95);
|
||||
cell.style.setProperty(
|
||||
"--strength",
|
||||
String(Math.min(1, Math.abs(contrast.point) / 0.015)),
|
||||
);
|
||||
cell.textContent = `L${layer.layer} ${signed(contrast.point)}`;
|
||||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${roleContrastLabels[roleContrast]} Δ system-edge TV ${signed(contrast.point)} · paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||||
row.append(cell);
|
||||
});
|
||||
return row;
|
||||
}));
|
||||
}
|
||||
};
|
||||
all<HTMLButtonElement>("[data-role-layer]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
roleLayerNumber = Number(button.dataset.roleLayer);
|
||||
renderRole();
|
||||
});
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-scope]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
roleScope = button.dataset.roleScope ?? "target_content";
|
||||
renderRole();
|
||||
});
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-mode]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
roleMode = button.dataset.roleMode ?? "prompt_balanced";
|
||||
renderRole();
|
||||
});
|
||||
});
|
||||
all<HTMLButtonElement>("[data-role-contrast]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
roleContrast = button.dataset.roleContrast
|
||||
?? "target_assistant_minus_official";
|
||||
renderRole();
|
||||
});
|
||||
});
|
||||
renderRole();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -2629,7 +2969,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(10, 1fr);
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
background: var(--ink);
|
||||
}
|
||||
.artifact-tabs button {
|
||||
@@ -4286,6 +4626,316 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
font-size: .62rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.role-protocol {
|
||||
margin-top: .8rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid rgba(32,32,39,.15);
|
||||
background:
|
||||
linear-gradient(115deg, rgba(57,120,110,.08), transparent 52%),
|
||||
#fffdf8;
|
||||
}
|
||||
.role-track {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: .25rem;
|
||||
padding: .8rem;
|
||||
background: var(--ink);
|
||||
color: white;
|
||||
}
|
||||
.role-track > * {
|
||||
padding: .36rem .48rem;
|
||||
font: 650 .61rem/1 var(--font-mono);
|
||||
font-style: normal;
|
||||
}
|
||||
.role-track span {
|
||||
color: rgba(255,255,255,.48);
|
||||
font-size: .52rem;
|
||||
}
|
||||
.role-track b { background: rgba(255,255,255,.1); }
|
||||
.role-track i { color: #d5d8ef; }
|
||||
.role-track mark {
|
||||
min-width: 4.6rem;
|
||||
background: var(--amber);
|
||||
color: white;
|
||||
text-align: center;
|
||||
}
|
||||
.role-level-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
margin-top: .55rem;
|
||||
border: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.role-level-grid article {
|
||||
display: grid;
|
||||
gap: .34rem;
|
||||
padding: .75rem;
|
||||
border-right: 1px solid rgba(32,32,39,.12);
|
||||
background: #f3eee5;
|
||||
}
|
||||
.role-level-grid article:last-child { border-right: 0; }
|
||||
.role-level-grid article.official { background: rgba(57,120,110,.11); }
|
||||
.role-level-grid article.negative { background: rgba(98,105,155,.11); }
|
||||
.role-level-grid span {
|
||||
color: var(--blue);
|
||||
font: 700 .52rem/1 var(--font-mono);
|
||||
}
|
||||
.role-level-grid b { font: 760 .84rem/1.1 var(--font-display); }
|
||||
.role-level-grid code {
|
||||
width: max-content;
|
||||
padding: .22rem .3rem;
|
||||
background: rgba(32,32,39,.08);
|
||||
font-size: .57rem;
|
||||
}
|
||||
.role-level-grid p,
|
||||
.role-protocol > p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .61rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.role-protocol > p {
|
||||
margin-top: .7rem;
|
||||
text-align: center;
|
||||
}
|
||||
.role-controls {
|
||||
display: grid;
|
||||
grid-template-columns: auto .9fr .9fr 1.55fr;
|
||||
gap: .8rem;
|
||||
align-items: end;
|
||||
margin-top: .8rem;
|
||||
padding: .85rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.role-controls > div { display: grid; gap: .45rem; }
|
||||
.role-controls .layer-switch { margin: 0; }
|
||||
.role-scope-switch,
|
||||
.role-mode-switch,
|
||||
.role-contrast-switch { display: flex; }
|
||||
.role-scope-switch button,
|
||||
.role-mode-switch button,
|
||||
.role-contrast-switch button {
|
||||
padding: .58rem .66rem;
|
||||
border: 1px solid rgba(32,32,39,.22);
|
||||
background: #fffdf8;
|
||||
color: var(--ink);
|
||||
font: 650 .6rem/1 var(--font-mono);
|
||||
cursor: pointer;
|
||||
}
|
||||
.role-scope-switch button + button,
|
||||
.role-mode-switch button + button,
|
||||
.role-contrast-switch button + button { border-left: 0; }
|
||||
.role-scope-switch button[aria-pressed="true"],
|
||||
.role-mode-switch button[aria-pressed="true"],
|
||||
.role-contrast-switch button[aria-pressed="true"] {
|
||||
border-color: var(--blue);
|
||||
background: var(--blue);
|
||||
color: white;
|
||||
}
|
||||
.role-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;
|
||||
}
|
||||
.role-domain-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
margin-top: .8rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #fffdf8;
|
||||
}
|
||||
.role-domain-grid > :global(article) {
|
||||
min-width: 0;
|
||||
padding: .85rem;
|
||||
border-right: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.role-domain-grid > :global(article:last-child) { border-right: 0; }
|
||||
.role-domain-grid :global(.role-tv-ladder) {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: .18rem;
|
||||
margin-top: .55rem;
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder > b) {
|
||||
display: grid;
|
||||
gap: .18rem;
|
||||
min-width: 0;
|
||||
padding: .34rem;
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder > b.official) {
|
||||
background: rgba(57,120,110,.12);
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder > b.causal) {
|
||||
background: rgba(98,105,155,.1);
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder > b.selected) {
|
||||
outline: 1px solid var(--blue);
|
||||
outline-offset: -1px;
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder small) {
|
||||
color: rgba(32,32,39,.5);
|
||||
font: 650 .42rem/1 var(--font-mono);
|
||||
}
|
||||
.role-domain-grid :global(.role-tv-ladder strong) {
|
||||
white-space: nowrap;
|
||||
font: 720 .58rem/1 var(--font-mono);
|
||||
letter-spacing: -.025em;
|
||||
}
|
||||
.role-domain-grid > :global(article > strong) {
|
||||
display: inline-block;
|
||||
margin-top: .48rem;
|
||||
padding: .26rem .38rem;
|
||||
font: 750 .58rem/1.15 var(--font-mono);
|
||||
}
|
||||
.role-domain-grid > :global(article > strong.down),
|
||||
.role-depth :global(span.down) {
|
||||
background: rgba(57,120,110,.13);
|
||||
color: var(--teal);
|
||||
}
|
||||
.role-domain-grid > :global(article > strong.up),
|
||||
.role-depth :global(span.up) {
|
||||
background: rgba(161,77,77,.12);
|
||||
color: var(--red);
|
||||
}
|
||||
.role-domain-grid > :global(article > strong.neutral),
|
||||
.role-depth :global(span.neutral) {
|
||||
background: rgba(186,118,44,.12);
|
||||
color: var(--amber);
|
||||
}
|
||||
.role-domain-grid > :global(article > p),
|
||||
.role-domain-grid > :global(article > small),
|
||||
.role-domain-grid > :global(article > em),
|
||||
.role-domain-grid > :global(article > u),
|
||||
.role-domain-grid > :global(article > i) {
|
||||
display: block;
|
||||
margin: .38rem 0 0;
|
||||
color: rgba(32,32,39,.57);
|
||||
overflow-wrap: anywhere;
|
||||
font: .54rem/1.4 var(--font-mono);
|
||||
font-style: normal;
|
||||
text-decoration: none;
|
||||
}
|
||||
.role-domain-grid > :global(article > em),
|
||||
.role-domain-grid > :global(article > u),
|
||||
.role-domain-grid > :global(article > i) {
|
||||
padding-top: .34rem;
|
||||
border-top: 1px solid rgba(32,32,39,.1);
|
||||
}
|
||||
.role-depth {
|
||||
display: grid;
|
||||
grid-template-columns: .52fr 1.48fr;
|
||||
gap: 1rem;
|
||||
margin-top: .8rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
}
|
||||
.role-depth h5 {
|
||||
margin: .4rem 0;
|
||||
font: 720 1rem/1.15 var(--font-display);
|
||||
}
|
||||
.role-depth p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .66rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.role-depth > :global([data-role-depth-map]) {
|
||||
display: grid;
|
||||
gap: .35rem;
|
||||
}
|
||||
.role-depth :global([data-role-depth-map] > div) {
|
||||
display: grid;
|
||||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||||
gap: .25rem;
|
||||
}
|
||||
.role-depth :global([data-role-depth-map] > div > b),
|
||||
.role-depth :global([data-role-depth-map] > div > span) {
|
||||
display: grid;
|
||||
align-items: center;
|
||||
min-height: 2.2rem;
|
||||
padding: .35rem;
|
||||
font: 650 .55rem/1.2 var(--font-mono);
|
||||
}
|
||||
.role-depth :global([data-role-depth-map] > div > b) { color: var(--blue); }
|
||||
.role-depth :global([data-role-depth-map] > div > span.down) {
|
||||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||||
color: var(--ink);
|
||||
}
|
||||
.role-depth :global([data-role-depth-map] > div > span.up) {
|
||||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||||
color: var(--ink);
|
||||
}
|
||||
.role-depth :global([data-role-depth-map] > div > span.neutral) {
|
||||
background: rgba(186,118,44,.1);
|
||||
color: var(--ink);
|
||||
}
|
||||
.role-causal-ledger {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
margin-top: .8rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.role-causal-ledger article {
|
||||
padding: .9rem;
|
||||
border-right: 1px solid rgba(32,32,39,.12);
|
||||
}
|
||||
.role-causal-ledger article:last-child { border-right: 0; }
|
||||
.role-causal-ledger article.exact { background: rgba(57,120,110,.11); }
|
||||
.role-causal-ledger b {
|
||||
display: block;
|
||||
margin-top: .4rem;
|
||||
font: 730 .78rem/1.2 var(--font-display);
|
||||
}
|
||||
.role-causal-ledger p {
|
||||
margin: .4rem 0 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .62rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.role-batch-audit {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1.35fr;
|
||||
gap: .8rem;
|
||||
margin-top: .8rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid rgba(32,32,39,.14);
|
||||
background: #fffdf8;
|
||||
}
|
||||
.role-batch-audit h5 {
|
||||
margin: .45rem 0;
|
||||
font: 720 .9rem/1.15 var(--font-display);
|
||||
}
|
||||
.role-batch-audit p {
|
||||
margin: 0;
|
||||
color: rgba(32,32,39,.58);
|
||||
font-size: .62rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.role-batch-audit > div:last-child {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: .3rem;
|
||||
}
|
||||
.role-batch-audit > div:last-child span {
|
||||
display: grid;
|
||||
gap: .2rem;
|
||||
padding: .55rem;
|
||||
background: #e8e2d7;
|
||||
}
|
||||
.role-batch-audit > div:last-child span.exact {
|
||||
background: rgba(57,120,110,.14);
|
||||
}
|
||||
.role-batch-audit i {
|
||||
font: normal .55rem/1 var(--font-mono);
|
||||
}
|
||||
.observed-cache {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto 1.25fr;
|
||||
@@ -4531,7 +5181,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.distance-controls,
|
||||
.distance-depth,
|
||||
.boundary-controls,
|
||||
.boundary-depth { grid-template-columns: 1fr; }
|
||||
.boundary-depth,
|
||||
.role-controls,
|
||||
.role-depth,
|
||||
.role-batch-audit { 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; }
|
||||
@@ -4550,7 +5203,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.history-buffer-summary,
|
||||
.distance-domain-grid,
|
||||
.boundary-domain-grid,
|
||||
.boundary-token-grid { grid-template-columns: 1fr 1fr; }
|
||||
.boundary-token-grid,
|
||||
.role-domain-grid,
|
||||
.role-level-grid,
|
||||
.role-causal-ledger { grid-template-columns: 1fr 1fr; }
|
||||
.distance-interpretation,
|
||||
.boundary-interpretation { grid-template-columns: 1fr; }
|
||||
.distance-interpretation article,
|
||||
@@ -4598,7 +5254,11 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.distance-interpretation,
|
||||
.boundary-domain-grid,
|
||||
.boundary-token-grid,
|
||||
.boundary-interpretation { grid-template-columns: 1fr; }
|
||||
.boundary-interpretation,
|
||||
.role-ledger,
|
||||
.role-domain-grid,
|
||||
.role-level-grid,
|
||||
.role-causal-ledger { grid-template-columns: 1fr; }
|
||||
.route-metrics article,
|
||||
.cache-ratio article,
|
||||
.load-lessons article,
|
||||
@@ -4617,7 +5277,11 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.distance-interpretation article,
|
||||
.boundary-domain-grid > :global(article),
|
||||
.boundary-token-grid article,
|
||||
.boundary-interpretation article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
|
||||
.boundary-interpretation article,
|
||||
.role-ledger article,
|
||||
.role-domain-grid > :global(article),
|
||||
.role-level-grid article,
|
||||
.role-causal-ledger article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
|
||||
.corpus-mode-switch,
|
||||
.corpus-cohort-switch,
|
||||
.template-scope-switch,
|
||||
@@ -4630,7 +5294,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.distance-contrast-switch,
|
||||
.boundary-scope-switch,
|
||||
.boundary-mode-switch,
|
||||
.boundary-contrast-switch { display: grid; grid-template-columns: 1fr; }
|
||||
.boundary-contrast-switch,
|
||||
.role-scope-switch,
|
||||
.role-mode-switch,
|
||||
.role-contrast-switch { display: grid; grid-template-columns: 1fr; }
|
||||
.corpus-mode-switch button + button,
|
||||
.corpus-cohort-switch button + button,
|
||||
.template-scope-switch button + button,
|
||||
@@ -4643,7 +5310,10 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.distance-contrast-switch button + button,
|
||||
.boundary-scope-switch button + button,
|
||||
.boundary-mode-switch button + button,
|
||||
.boundary-contrast-switch button + button { border-left: 1px solid rgba(32,32,39,.22); border-top: 0; }
|
||||
.boundary-contrast-switch button + button,
|
||||
.role-scope-switch button + button,
|
||||
.role-mode-switch button + button,
|
||||
.role-contrast-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; }
|
||||
@@ -4665,6 +5335,8 @@ const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoi
|
||||
.history-depth > :global([data-history-depth-map]) { min-width: 620px; }
|
||||
.boundary-depth { overflow-x: auto; }
|
||||
.boundary-depth > :global([data-boundary-depth-map]) { min-width: 620px; }
|
||||
.role-depth { overflow-x: auto; }
|
||||
.role-depth > :global([data-role-depth-map]) { min-width: 620px; }
|
||||
.layer-evidence { grid-template-columns: repeat(7, 1fr); }
|
||||
.repro-gate { grid-template-columns: 1fr; }
|
||||
.repro-gate > p { grid-column: auto; }
|
||||
|
||||
Reference in New Issue
Block a user