6364 lines
257 KiB
Plaintext
6364 lines
257 KiB
Plaintext
---
|
||
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";
|
||
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";
|
||
import rawTemplate from "@/data/deepseek-v2-lite-routing-template.json";
|
||
import rawTemplateRepro from "@/data/deepseek-v2-lite-routing-template-repro.json";
|
||
import rawHistory from "@/data/deepseek-v2-lite-routing-history-factorial.json";
|
||
import rawHistoryRepro from "@/data/deepseek-v2-lite-routing-history-factorial-repro.json";
|
||
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";
|
||
import rawSpecialCompact from "@/data/deepseek-v2-lite-routing-special-token-family-control-compact.json";
|
||
import rawRoleBlockCompact from "@/data/deepseek-v2-lite-routing-role-marker-block-factorial-compact.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 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 template = rawTemplate as any;
|
||
const templateRepro = rawTemplateRepro as any;
|
||
const history = rawHistory as any;
|
||
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 specialCompact = rawSpecialCompact as any;
|
||
const roleBlockCompact = rawRoleBlockCompact 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 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 specialExact = specialCompact.source.exact;
|
||
const roleBlockExact = roleBlockCompact.source.exact;
|
||
const bytes = (value: number) => value >= 1024
|
||
? `${(value / 1024).toFixed(2)} KiB`
|
||
: `${value.toLocaleString()} B`;
|
||
const scientific = (value: number) => value.toExponential(2);
|
||
const compact = {
|
||
prompts: trace.prompts.map((prompt: any) => ({
|
||
id: prompt.id,
|
||
label: prompt.label,
|
||
text: prompt.text,
|
||
})),
|
||
layers: trace.execution.layers.slice(1).map((layer: any) => ({
|
||
layer: layer.layer,
|
||
load: layer.routing.aggregate_load,
|
||
metrics: layer.routing.aggregate_metrics,
|
||
selectedWeight: layer.routing.selected_weight_sum,
|
||
topExperts: layer.routing.top_experts,
|
||
prompts: layer.routing.per_prompt.map((prompt: any) => ({
|
||
id: prompt.id,
|
||
label: prompt.label,
|
||
tokens: prompt.tokens,
|
||
load: prompt.load,
|
||
metrics: prompt.metrics,
|
||
topExperts: prompt.top_experts,
|
||
tokenRoutes: prompt.token_routes,
|
||
})),
|
||
jaccard: layer.routing.prompt_pair_jaccard,
|
||
})),
|
||
cache: trace.cache_accounting,
|
||
execution: {
|
||
batch: trace.execution.batch,
|
||
paddedSequence: trace.execution.padded_sequence,
|
||
validTokens: trace.execution.valid_tokens,
|
||
},
|
||
};
|
||
const compactJson = JSON.stringify(compact).replaceAll("<", "\\u003c");
|
||
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 aggregateTemplateAlignment = (layer: any, domain: string) => {
|
||
const rows = layer.prompts
|
||
.filter((prompt: any) => prompt.domain === domain)
|
||
.map((prompt: any) => prompt.alignments.raw_to_user_content);
|
||
const aligned = rows.reduce((sum: number, row: any) => sum + row.aligned_tokens, 0);
|
||
const setExact = rows.reduce((sum: number, row: any) => sum + row.set_topk_exact, 0);
|
||
const orderedExact = rows.reduce((sum: number, row: any) => sum + row.ordered_topk_exact, 0);
|
||
const weightedJaccard = rows.reduce(
|
||
(sum: number, row: any) => sum + row.mean_jaccard * row.aligned_tokens,
|
||
0,
|
||
);
|
||
return {
|
||
aligned,
|
||
setExactRate: setExact / aligned,
|
||
orderedExactRate: orderedExact / aligned,
|
||
meanJaccard: weightedJaccard / aligned,
|
||
};
|
||
};
|
||
const templateCompact = {
|
||
domains: template.corpus_contract.domains,
|
||
labels: template.corpus_contract.domain_labels,
|
||
inference: template.inference_contract,
|
||
template: {
|
||
sha256: template.template_contract.chat_template_sha256,
|
||
bos: template.template_contract.bos_token_id,
|
||
},
|
||
exact: templateExact,
|
||
layers: template.layers.slice(1).map((layer: any) => ({
|
||
layer: layer.layer,
|
||
invariant: layer.causal_suffix_invariant,
|
||
alignment: Object.fromEntries(
|
||
template.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
aggregateTemplateAlignment(layer, domain),
|
||
]),
|
||
),
|
||
scopes: Object.fromEntries(
|
||
["content_only", "full_input"].map((scope) => [
|
||
scope,
|
||
{
|
||
modes: Object.fromEntries(
|
||
["prompt_balanced", "token_weighted"].map((mode) => [
|
||
mode,
|
||
{
|
||
rawToUser: layer.statistics[scope].modes[mode]
|
||
.comparisons.raw_to_user,
|
||
userToGeneration: layer.statistics[scope].modes[mode]
|
||
.comparisons.user_to_generation,
|
||
},
|
||
]),
|
||
),
|
||
},
|
||
]),
|
||
),
|
||
})),
|
||
};
|
||
const templateCompactJson = JSON.stringify(templateCompact).replaceAll("<", "\\u003c");
|
||
const historyConditions = ["s0f0", "s1f0", "s0f1", "s1f1"];
|
||
const historyEdges = ["system_at_f0", "system_at_f1", "fewshot_at_s0", "fewshot_at_s1"];
|
||
const aggregateHistoryAlignment = (layer: any, domain: string, edge: string) => {
|
||
const rows = layer.prompts
|
||
.filter((prompt: any) => prompt.domain === domain)
|
||
.map((prompt: any) => prompt.alignments[edge]);
|
||
const aligned = rows.reduce((sum: number, row: any) => sum + row.aligned_tokens, 0);
|
||
const setExact = rows.reduce((sum: number, row: any) => sum + row.set_topk_exact, 0);
|
||
const orderedExact = rows.reduce((sum: number, row: any) => sum + row.ordered_topk_exact, 0);
|
||
const weightedJaccard = rows.reduce(
|
||
(sum: number, row: any) => sum + row.mean_jaccard * row.aligned_tokens,
|
||
0,
|
||
);
|
||
return {
|
||
aligned,
|
||
setExactRate: setExact / aligned,
|
||
orderedExactRate: orderedExact / aligned,
|
||
meanJaccard: weightedJaccard / aligned,
|
||
};
|
||
};
|
||
const historyCompact = {
|
||
domains: history.corpus_contract.domains,
|
||
labels: history.corpus_contract.domain_labels,
|
||
inference: history.inference_contract,
|
||
messages: {
|
||
system: history.message_history_contract.system_message,
|
||
demoUser: history.message_history_contract.demo_user,
|
||
demoAssistant: history.message_history_contract.demo_assistant,
|
||
},
|
||
exact: historyExact,
|
||
layers: history.layers.slice(1).map((layer: any) => ({
|
||
layer: layer.layer,
|
||
alignment: Object.fromEntries(
|
||
history.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
Object.fromEntries(
|
||
historyEdges.map((edge) => [
|
||
edge,
|
||
aggregateHistoryAlignment(layer, domain, edge),
|
||
]),
|
||
),
|
||
]),
|
||
),
|
||
scopes: Object.fromEntries(
|
||
["target_content", "full_input"].map((scope) => [
|
||
scope,
|
||
{
|
||
modes: Object.fromEntries(
|
||
["prompt_balanced", "token_weighted"].map((mode) => {
|
||
const statistics = layer.statistics[scope].modes[mode];
|
||
return [
|
||
mode,
|
||
{
|
||
conditions: Object.fromEntries(
|
||
historyConditions.map((condition) => [
|
||
condition,
|
||
Object.fromEntries(
|
||
history.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
statistics.conditions[condition][domain].metrics.cv.point,
|
||
]),
|
||
),
|
||
]),
|
||
),
|
||
factorial: Object.fromEntries(
|
||
history.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
statistics.factorial[domain].metric_effects.cv,
|
||
]),
|
||
),
|
||
comparisons: Object.fromEntries(
|
||
historyEdges.map((edge) => [
|
||
edge,
|
||
Object.fromEntries(
|
||
history.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
{
|
||
cv: statistics.comparisons[edge][domain].metrics.cv,
|
||
tv: statistics.comparisons[edge][domain].total_variation,
|
||
jsd: statistics.comparisons[edge][domain].js_divergence,
|
||
},
|
||
]),
|
||
),
|
||
]),
|
||
),
|
||
},
|
||
];
|
||
}),
|
||
),
|
||
},
|
||
]),
|
||
),
|
||
})),
|
||
};
|
||
const historyCompactJson = JSON.stringify(historyCompact).replaceAll("<", "\\u003c");
|
||
const distanceEdges = [
|
||
"system_none",
|
||
"system_filler",
|
||
"system_demo",
|
||
"demo_vs_filler_s0",
|
||
"demo_vs_filler_s1",
|
||
];
|
||
const aggregateDistanceAlignment = (layer: any, domain: string, edge: string) => {
|
||
const rows = layer.prompts
|
||
.filter((prompt: any) => prompt.domain === domain)
|
||
.map((prompt: any) => prompt.alignments[edge]);
|
||
const aligned = rows.reduce((sum: number, row: any) => sum + row.aligned_tokens, 0);
|
||
const setExact = rows.reduce((sum: number, row: any) => sum + row.set_topk_exact, 0);
|
||
const orderedExact = rows.reduce((sum: number, row: any) => sum + row.ordered_topk_exact, 0);
|
||
const weightedJaccard = rows.reduce(
|
||
(sum: number, row: any) => sum + row.mean_jaccard * row.aligned_tokens,
|
||
0,
|
||
);
|
||
return {
|
||
aligned,
|
||
setExactRate: setExact / aligned,
|
||
orderedExactRate: orderedExact / aligned,
|
||
meanJaccard: weightedJaccard / aligned,
|
||
};
|
||
};
|
||
const distanceCompact = {
|
||
domains: distance.corpus_contract.domains,
|
||
labels: distance.corpus_contract.domain_labels,
|
||
inference: distance.inference_contract,
|
||
messages: {
|
||
system: distance.history_control_contract.system_message,
|
||
demoUser: distance.history_control_contract.demo_user,
|
||
demoAssistant: distance.history_control_contract.demo_assistant,
|
||
fillerUser: distance.history_control_contract.filler_user,
|
||
fillerAssistant: distance.history_control_contract.filler_assistant,
|
||
},
|
||
exact: distanceExact,
|
||
layers: distance.layers.slice(1).map((layer: any) => ({
|
||
layer: layer.layer,
|
||
alignment: Object.fromEntries(
|
||
distance.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
Object.fromEntries(
|
||
distanceEdges.map((edge) => [
|
||
edge,
|
||
aggregateDistanceAlignment(layer, domain, edge),
|
||
]),
|
||
),
|
||
]),
|
||
),
|
||
scopes: Object.fromEntries(
|
||
["target_content", "full_input"].map((scope) => [
|
||
scope,
|
||
{
|
||
modes: Object.fromEntries(
|
||
["prompt_balanced", "token_weighted"].map((mode) => {
|
||
const control = layer.statistics[scope].modes[mode].history_control;
|
||
return [
|
||
mode,
|
||
Object.fromEntries(
|
||
distance.corpus_contract.domains.map((domain: string) => [
|
||
domain,
|
||
{
|
||
distances: control[domain].system_edge_distances,
|
||
contrasts: control[domain].system_edge_distance_contrasts,
|
||
cvEdges: control[domain].metric_system_edges.cv,
|
||
cvContrasts: control[domain].metric_system_edge_contrasts.cv,
|
||
lexical: control[domain].lexical_replacement,
|
||
},
|
||
]),
|
||
),
|
||
];
|
||
}),
|
||
),
|
||
},
|
||
]),
|
||
),
|
||
})),
|
||
};
|
||
const distanceCompactJson = JSON.stringify(distanceCompact).replaceAll("<", "\\u003c");
|
||
const boundaryCompactJson = JSON.stringify(boundaryCompact).replaceAll("<", "\\u003c");
|
||
const roleCompactJson = JSON.stringify(roleCompact).replaceAll("<", "\\u003c");
|
||
const specialCompactJson = JSON.stringify(specialCompact).replaceAll("<", "\\u003c");
|
||
const roleBlockCompactJson = JSON.stringify(roleBlockCompact).replaceAll("<", "\\u003c");
|
||
const aggregateCrossBatch = (input: any) => [1, 2, 3, 4, 5, 6].map((layer) => {
|
||
const rows = input.crossBatch.filter((row: any) => row.layer === layer);
|
||
return {
|
||
layer,
|
||
compared: rows.reduce((sum: number, row: any) => sum + row.compared, 0),
|
||
targetRouteHashExact: rows.reduce(
|
||
(sum: number, row: any) => sum + row.targetRouteHashExact,
|
||
0,
|
||
),
|
||
targetLoadExact: rows.reduce(
|
||
(sum: number, row: any) => sum + row.targetLoadExact,
|
||
0,
|
||
),
|
||
};
|
||
});
|
||
const specialCrossBatch = aggregateCrossBatch(specialCompact);
|
||
const roleBlockCrossBatch = aggregateCrossBatch(roleBlockCompact);
|
||
const shardFraction = trace.provenance.shard_1_bytes / trace.provenance.checkpoint_tensor_bytes;
|
||
---
|
||
|
||
<figure class="artifact-lab" data-dsv2-lab>
|
||
<header class="artifact-head">
|
||
<div>
|
||
<p>REAL-WEIGHT LAB / DEEPSEEK-V2-LITE</p>
|
||
<h3>这一次不是调公式:让官方权重真的走过七层</h3>
|
||
</div>
|
||
<p>
|
||
固定官方 revision、tokenizer、模型代码和 BF16 第一分片;RTX 5090 连续执行 layer 0–6,
|
||
从 3,240 次 token 显微轨迹扩到 11,289,744 次公开语料路由,并让 layer-1 权重继续走入官方吸收式 cache。
|
||
所有结论都带证据身份与停止线。
|
||
</p>
|
||
</header>
|
||
|
||
<div class="artifact-status">
|
||
<span><i>X</i><b>本机执行</b>真实权重与 hidden states</span>
|
||
<span><i>O</i><b>官方工件</b>配置、代码与 checkpoint</span>
|
||
<span><i>D</i><b>确定推导</b>从 shape 计算 bytes</span>
|
||
<span><i>U</i><b>未覆盖</b>全模型、训练与生产 kernel</span>
|
||
</div>
|
||
|
||
<div class="artifact-tabs" role="tablist" aria-label="选择 DeepSeek V2-Lite 真实工件实验">
|
||
<button type="button" role="tab" data-artifact-tab="route" aria-selected="true">
|
||
<span>01</span><b>路由显微镜</b><small>token → top-6 experts</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="load" aria-selected="false" tabindex="-1">
|
||
<span>02</span><b>覆盖 ≠ 均衡</b><small>CV · Gini · entropy</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="cache" aria-selected="false" tabindex="-1">
|
||
<span>03</span><b>缓存实现账</b><small>latent vs HF eager</small>
|
||
</button>
|
||
<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="template" aria-selected="false" tabindex="-1">
|
||
<span>06</span><b>官方模板扰动</b><small>raw → user → assistant</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="history" aria-selected="false" tabindex="-1">
|
||
<span>07</span><b>消息历史 2×2</b><small>system × one-shot</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="distance" aria-selected="false" tabindex="-1">
|
||
<span>08</span><b>等长历史控制</b><small>none → filler → demo</small>
|
||
</button>
|
||
<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="special" aria-selected="false" tabindex="-1">
|
||
<span>11</span><b>特殊词元家族</b><small>EOS / BOS ↔ x / .</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="role-block" aria-selected="false" tabindex="-1">
|
||
<span>12</span><b>完整角色块</b><small>head × delimiter</small>
|
||
</button>
|
||
<button type="button" role="tab" data-artifact-tab="evidence" aria-selected="false" tabindex="-1">
|
||
<span>13</span><b>证据断面</b><small>revision · shards · rerun</small>
|
||
</button>
|
||
</div>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="route">
|
||
<div class="panel-lead">
|
||
<div><span>X / TOKEN-LEVEL ROUTES</span><h4>先选层,再选 prompt 和 token</h4></div>
|
||
<p>同一个 expert ID 只在当前层内有意义;跨层同号专家是不同参数,图中不会把它们连成“专长轨迹”。</p>
|
||
</div>
|
||
|
||
<div class="route-controls">
|
||
<label>
|
||
<span>decoder layer</span>
|
||
<select data-route-layer aria-label="选择路由层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => <option value={layer}>layer {layer}</option>)}
|
||
</select>
|
||
</label>
|
||
<label>
|
||
<span>prompt</span>
|
||
<select data-route-prompt aria-label="选择 prompt">
|
||
{trace.prompts.map((prompt: any) => <option value={prompt.id}>{prompt.label} · {prompt.token_ids.length} tokens</option>)}
|
||
</select>
|
||
</label>
|
||
<label class="token-select">
|
||
<span>token position / decoded piece</span>
|
||
<select data-route-token aria-label="选择 token"></select>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="token-context">
|
||
<span>PROMPT</span>
|
||
<p data-route-prompt-text></p>
|
||
</div>
|
||
|
||
<div class="route-stage">
|
||
<article class="token-card">
|
||
<span>TOKEN <b data-route-position>#0</b></span>
|
||
<strong data-route-piece></strong>
|
||
<small>ID <b data-route-token-id></b></small>
|
||
</article>
|
||
<i aria-hidden="true">→</i>
|
||
<div>
|
||
<span class="micro-title">ACTUAL TOP-6 / WEIGHT DESCENDING</span>
|
||
<div class="chosen-experts" data-route-experts></div>
|
||
</div>
|
||
<i aria-hidden="true">→</i>
|
||
<article class="sum-card">
|
||
<span>SELECTED WEIGHT SUM</span>
|
||
<strong data-route-weight-sum></strong>
|
||
<small>配置不把 top-6 重新归一到 1</small>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="heat-head">
|
||
<div>
|
||
<span>64 ROUTED EXPERTS / CURRENT PROMPT</span>
|
||
<b data-route-heat-title></b>
|
||
</div>
|
||
<p>颜色表示这条 prompt 在当前层的选择次数;空白表示本小样本未触达,不表示专家失效。</p>
|
||
</div>
|
||
<div class="expert-heatmap" data-route-heatmap aria-label="64 个 routed expert 负载热图"></div>
|
||
|
||
<div class="route-metrics">
|
||
<article><span>ROUTES</span><b data-route-count></b><p>tokens × top-6</p></article>
|
||
<article><span>USED / 64</span><b data-route-used></b><p>至少被选一次</p></article>
|
||
<article><span>CV</span><b data-route-cv></b><p>std ÷ mean</p></article>
|
||
<article><span>EFFECTIVE</span><b data-route-effective></b><p>exp(route entropy)</p></article>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>X / DESCRIPTIVE TRACE</b>
|
||
<p>这是 4 条固定 prompt、90 个有效 token 的前六个 MoE 层;不能据此命名专家、估计线上总体负载或判断训练均衡。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="load" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X + D / LOAD ACCOUNTING</span><h4>“64 个专家几乎都用到了”为什么仍可能不均衡</h4></div>
|
||
<p>覆盖只问是否出现过;CV、Gini 与 effective experts 才描述计数分布。这里同时展示 aggregate 与四条 prompt。</p>
|
||
</div>
|
||
|
||
<div class="layer-switch" role="group" aria-label="选择负载统计层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-load-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
|
||
<div class="aggregate-card">
|
||
<div>
|
||
<span>AGGREGATE / 90 TOKENS</span>
|
||
<strong><b data-load-used></b> / 64 used</strong>
|
||
<p><span data-load-zero></span> 个专家在本样本为零;总选择数固定为 540。</p>
|
||
</div>
|
||
<div class="load-dials">
|
||
<article><span>CV</span><b data-load-cv></b><i><em data-load-cv-bar></em></i></article>
|
||
<article><span>GINI</span><b data-load-gini></b><i><em data-load-gini-bar></em></i></article>
|
||
<article><span>EFFECTIVE</span><b data-load-effective></b><i><em data-load-effective-bar></em></i></article>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="load-table" role="table" aria-label="按 prompt 的专家负载统计">
|
||
<div class="head" role="row">
|
||
<b role="columnheader">SCOPE</b><b role="columnheader">TOKENS</b><b role="columnheader">USED</b>
|
||
<b role="columnheader">CV</b><b role="columnheader">GINI</b><b role="columnheader">TOP EXPERT</b>
|
||
</div>
|
||
<div data-load-rows></div>
|
||
</div>
|
||
|
||
<div class="jaccard-block">
|
||
<div>
|
||
<span>USED-SET OVERLAP</span>
|
||
<h5>同层 prompt 两两 Jaccard</h5>
|
||
<p>只比较“用过哪些 ID”,不比较权重、次数或语义。</p>
|
||
</div>
|
||
<div data-load-jaccard></div>
|
||
</div>
|
||
|
||
<div class="load-lessons">
|
||
<article><span>FALSE SHORTCUT</span><b>63 / 64 used → balanced</b><p>Layer 1 虽触达 63 个专家,CV 仍为 0.925,E8 被选 48 次。</p></article>
|
||
<article><span>CORRECT READING</span><b>同看覆盖、离散度和熵</b><p>Layer 2 的 64/64、CV 0.549 与 effective 55.08 才构成较完整的描述。</p></article>
|
||
<article><span>HARD BOUNDARY</span><b>ID is not semantics</b><p>Layer 4 的 E48 只是该层参数索引;不能命名成“代码专家”。</p></article>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="cache" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X + D / IMPLEMENTATION GAP</span><h4>MLA 定义了可压缩状态,不保证框架已经按压缩格式存</h4></div>
|
||
<p>上半区是本次真实 shape;下半区只把相同维度扩展到可调 batch、context、layers 和 dtype。</p>
|
||
</div>
|
||
|
||
<div class="observed-cache">
|
||
<article>
|
||
<span>X / ACTUAL PROJECTION</span>
|
||
<strong>[4, 27, <b>576</b>]</strong>
|
||
<p>512 KV latent + 64 decoupled RoPE key</p>
|
||
</article>
|
||
<i aria-hidden="true">≠</i>
|
||
<article class="expanded">
|
||
<span>X / HF EAGER CACHE</span>
|
||
<strong>K [4,16,27,<b>192</b>]</strong>
|
||
<strong>V [4,16,27,<b>128</b>]</strong>
|
||
<p>官方 eager 路径物化展开后的多头 K/V</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="cache-controls">
|
||
<label><span>batch B <output data-cache-batch-label>4</output></span><input data-cache-batch type="range" min="1" max="32" value="4" /></label>
|
||
<label><span>context T</span><select data-cache-context><option value="27">27 / 本次 trace</option><option value="4096">4K</option><option value="32768">32K</option><option value="131072">128K</option><option value="1048576">1M</option></select></label>
|
||
<label><span>layers L <output data-cache-layers-label>7</output></span><input data-cache-layers type="range" min="1" max="27" value="7" /></label>
|
||
<label><span>storage</span><select data-cache-dtype><option value="1">1 byte</option><option value="2" selected>BF16 / 2 bytes</option><option value="4">FP32 / 4 bytes</option></select></label>
|
||
</div>
|
||
|
||
<div class="cache-ledger">
|
||
<article>
|
||
<header><span>D / LATENT CONTRACT</span><b>576 elements / token / layer</b></header>
|
||
<div class="cache-bar latent"><i></i></div>
|
||
<strong data-cache-latent-bytes></strong>
|
||
<p>512 latent + 64 RoPE key;需要配套吸收与 attention kernel 才能兑现。</p>
|
||
</article>
|
||
<article>
|
||
<header><span>X→D / HF EAGER FORMAT</span><b>5,120 elements / token / layer</b></header>
|
||
<div class="cache-bar eager"><i></i></div>
|
||
<strong data-cache-eager-bytes></strong>
|
||
<p>16 × (192 key + 128 value);按真实 shape 外推,不是服务显存 benchmark。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="cache-ratio">
|
||
<article><span>EAGER / LATENT</span><b data-cache-ratio></b><p>相同 B/T/L/dtype 下的元素倍数</p></article>
|
||
<article><span>LATENT REDUCTION</span><b data-cache-reduction></b><p>相对本次 HF eager 物化口径</p></article>
|
||
<article class="warning"><span>NOT REPRODUCED</span><b>93.3%</b><p>这是 V2 报告的另一模型 / 基线 / 配置口径</p></article>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>IMPLEMENTATION CONTRACT</b>
|
||
<p>算法上“可以缓存 576 元素”与 HF eager“实际缓存 5,120 元素”同时为真;下一页继续执行官方 absorb 参考路径,生产吞吐仍需要受支持的优化 kernel 与 serving runtime。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="absorb" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X + O / WEIGHT ABSORPTION</span><h4>这一次 576 元素真的进入了缓存</h4></div>
|
||
<p>
|
||
同一组真实 V2-Lite layer-1 权重、同一条 26-token hidden-state 轨迹:
|
||
先用 V3 官方 naive 路径展开 K/V,再用官方 absorb 路径做 25-token prefill + 1-token decode。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="absorb-algebra" aria-label="MLA 权重吸收的两条代数变换">
|
||
<article>
|
||
<span>SCORE / 把 Wᴷ 搬到 query</span>
|
||
<code>qᵀ(Wᴷc) = (Wᴷᵀq)ᵀc</code>
|
||
<p>不再为每个历史 token、每个 head 存展开后的 no-RoPE key;query 先变成 512 维,再与 latent <i>c</i> 相乘。</p>
|
||
</article>
|
||
<article>
|
||
<span>VALUE / 把 Wⱽ 搬到 attention 后</span>
|
||
<code>Σ pₜ(Wⱽcₜ) = Wⱽ(Σ pₜcₜ)</code>
|
||
<p>先对 512 维 latent 做加权和,再展开成各 head 的 value。含位置的 64 维 RoPE key 不能这样吸收,必须单独缓存。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="absorb-cache-flow">
|
||
<article class="naive">
|
||
<header><span>X / V3 NAIVE · BF16</span><b>{bytes(absorb.cache_accounting.naive_active_bytes)}</b></header>
|
||
<div>
|
||
<code>K [1, 26, 16, 192]</code>
|
||
<code>V [1, 26, 16, 128]</code>
|
||
</div>
|
||
<p>26 × 5,120 元素;与 HF eager 是同一种展开状态。</p>
|
||
</article>
|
||
<i aria-hidden="true">→</i>
|
||
<article class="absorbed">
|
||
<header><span>X / V3 ABSORB · BF16</span><b>{bytes(absorb.cache_accounting.absorb_active_bytes)}</b></header>
|
||
<div>
|
||
<code>latent [1, 26, 512]</code>
|
||
<code>RoPE [1, 26, 64]</code>
|
||
</div>
|
||
<p>26 × 576 元素;两个官方 buffer 的真实 active slice。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="absorb-metrics">
|
||
<article><span>REAL CACHE RATIO</span><b>{absorb.cache_accounting.naive_over_absorb_ratio.toFixed(4)}×</b><p>展开 K/V ÷ latent + RoPE</p></article>
|
||
<article><span>BF16 MAX |Δ|</span><b>{absorb.correctness.v3_naive_vs_absorb_bfloat16.max_abs}</b><p>官方 V3 naive ↔ absorb decode</p></article>
|
||
<article><span>FP32 MAX |Δ|</span><b>{scientific(absorb.correctness.v3_naive_vs_absorb_float32.max_abs)}</b><p>同一 BF16 权重转 FP32 做代数审计</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{absorbExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 6b4c714a…e63d</p></article>
|
||
</div>
|
||
|
||
<div class="precision-lens">
|
||
<div>
|
||
<span>HF EAGER ↔ V3 NAIVE / BF16</span>
|
||
<i><em style={`--error:${absorb.correctness.hf_eager_vs_v3_naive_bfloat16.max_abs / .004}`}></em></i>
|
||
<b>max {absorb.correctness.hf_eager_vs_v3_naive_bfloat16.max_abs}</b>
|
||
</div>
|
||
<div>
|
||
<span>V3 NAIVE ↔ ABSORB / BF16</span>
|
||
<i><em style={`--error:${absorb.correctness.v3_naive_vs_absorb_bfloat16.max_abs / .004}`}></em></i>
|
||
<b>max {absorb.correctness.v3_naive_vs_absorb_bfloat16.max_abs}</b>
|
||
</div>
|
||
<div>
|
||
<span>V3 NAIVE ↔ ABSORB / FP32</span>
|
||
<i><em style={`--error:${absorb.correctness.v3_naive_vs_absorb_float32.max_abs / .004}`}></em></i>
|
||
<b>max {scientific(absorb.correctness.v3_naive_vs_absorb_float32.max_abs)}</b>
|
||
</div>
|
||
<p>
|
||
三组输出均 finite。FP32 不是新的 checkpoint 精度,而是把同一组 BF16 权重提升后,
|
||
隔离矩阵乘法顺序造成的舍入误差。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="kernel-contract">
|
||
<div>
|
||
<span>OFFICIAL FLASHMLA / PINNED {absorb.flashmla_boundary.official_revision.slice(0, 8)}</span>
|
||
<h5>算法路径已执行,不等于优化 kernel 已执行</h5>
|
||
<p>官方支持矩阵与编译目标只覆盖 SM90 / SM100;本机 RTX 5090 是 SM120。</p>
|
||
</div>
|
||
<div class="kernel-matrix" role="table" aria-label="FlashMLA 官方架构支持矩阵">
|
||
<div class="head" role="row"><b>KERNEL</b><b>SM90</b><b>SM100</b><b>LOCAL SM120</b></div>
|
||
<div role="row"><span>dense decode</span><i class="yes">支持</i><i>—</i><i class="no">未支持</i></div>
|
||
<div role="row"><span>sparse decode</span><i class="yes">支持</i><i class="yes">支持</i><i class="no">未支持</i></div>
|
||
<div role="row"><span>dense prefill</span><i>—</i><i class="yes">支持</i><i class="no">未支持</i></div>
|
||
<div role="row"><span>sparse prefill</span><i class="yes">支持</i><i class="yes">支持</i><i class="no">未支持</i></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="execution-split">
|
||
<article><span>EXECUTED</span><b>官方 V3 pure-PyTorch absorb</b><p>真实权重、真实 latent / RoPE buffers、真实 incremental decode。</p></article>
|
||
<article><span>BUILD ATTEMPTS</span><b>2 个环境,均未产出 wheel</b><p>host 编译器边界;隔离 CUDA 13 环境缺少 <code>cuda/std/utility</code>。</p></article>
|
||
<article class="blocked"><span>NOT EXECUTED</span><b>FlashMLA optimized kernel</b><p>源码只生成 <code>sm_90a</code> / <code>sm_100f</code>,dense decode 运行时还拒绝非 SM90a。</p></article>
|
||
</div>
|
||
|
||
<div class="evidence-links">
|
||
<a href="https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py" rel="noreferrer">官方 V3 absorb 参考实现 ↗</a>
|
||
<a href="https://github.com/deepseek-ai/FlashMLA" rel="noreferrer">官方 FlashMLA 支持矩阵 ↗</a>
|
||
<a href="https://arxiv.org/abs/2405.04434" rel="noreferrer">DeepSeek-V2 MLA 报告 ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>CORRECT CLAIM</b>
|
||
<p>
|
||
本实验复现的是“真实权重 + 官方参考实现中的压缩缓存与 decode 等价性”,不是 FlashMLA 性能、
|
||
生产 serving 吞吐或 V2 论文完整模型相对 MHA 的 93.3% 缓存降幅。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="corpus" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X + S / FIXED PUBLIC CORPUS</span><h4>从自然长度,再走到同 prompt 的 16 / 24-token 对照</h4></div>
|
||
<p>
|
||
三个 cohort 都来自 WikiText-2、TNEWS、HumanEval、GSM8K;等长两档使用完全相同的
|
||
128 条源 prompt 和嵌套前缀。每个区间都重采样 prompt,不把相关 token 假装成独立样本。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="corpus-ledger">
|
||
<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 && 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="选择公开语料路由层">
|
||
{[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>
|
||
自然长度 cohort:每条 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>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">
|
||
<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>
|
||
这是三个固定公开 cohort 上的前六个 MoE 层,不是训练分布或线上流量;matched cohort
|
||
只代表各域至少 24 tokens 的子群。
|
||
bootstrap 区间描述本探针换 prompt 的稳定性,不是零差异假设检验;没有多重比较校正,
|
||
也不能把 E29、E48 等参数索引命名成“中文专家”或“代码专家”。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="template" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / OFFICIAL CHAT TEMPLATE</span><h4>同一段内容,只在前面加上「User:」</h4></div>
|
||
<p>
|
||
三种输入使用同一 checkpoint、同一批 128 条 source prompt、同一 padded batch。
|
||
既比较真实整段输入,也只比较字符跨度与 token ID 都完全对齐的 2,874 个内容 token。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="template-ledger">
|
||
<article><span>SOURCE PROMPTS</span><b>128</b><p>四域 × 32 · 固定哈希选样</p></article>
|
||
<article><span>PROMPT VARIANTS</span><b>384</b><p>raw · user · generation</p></article>
|
||
<article><span>INPUT TOKENS</span><b>10,612</b><p>三种协议的真实输入总数</p></article>
|
||
<article><span>REAL ROUTES</span><b>382,032</b><p>三种协议 × 前六个 MoE 层</p></article>
|
||
<article><span>CAUSAL PREFIX</span><b>21,852 / 21,852</b><p>追加 Assistant: 后 ordered top-6 exact</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{templateExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 da1f1033…bc1b9</p></article>
|
||
</div>
|
||
|
||
<div class="template-protocol" aria-label="DeepSeek V2-Lite 三种输入协议">
|
||
<article>
|
||
<span>RAW</span>
|
||
<div><i>BOS</i><b>相同内容</b></div>
|
||
<p>每条固定 24 input tokens:1 BOS + 23 content。</p>
|
||
</article>
|
||
<i aria-hidden="true">→</i>
|
||
<article>
|
||
<span>OFFICIAL USER</span>
|
||
<div><i>BOS</i><em>User:</em><b>相同内容</b><small>↵↵</small></div>
|
||
<p><code>apply_chat_template</code> 的单轮 user 渲染。</p>
|
||
</article>
|
||
<i aria-hidden="true">→</i>
|
||
<article>
|
||
<span>GENERATION PROMPT</span>
|
||
<div><i>共享前缀</i><em>Assistant:</em></div>
|
||
<p>只在末尾追加 suffix;不能反向改变此前 token。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="template-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch template-layer-switch" role="group" aria-label="选择模板敏感性层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-template-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="template-scope-switch" role="group" aria-label="选择模板统计范围">
|
||
<button type="button" data-template-scope="content_only" aria-pressed="true">精确对齐内容</button>
|
||
<button type="button" data-template-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="template-mode-switch" role="group" aria-label="选择模板聚合口径">
|
||
<button type="button" data-template-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-template-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<p data-template-note>
|
||
精确对齐内容:三种条件只保留相同相对字符跨度与相同 token ID;wrapper 和边界重切分 token 同时剔除。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="template-domain-grid" data-template-domain-grid></div>
|
||
|
||
<div class="template-negative-control">
|
||
<article>
|
||
<span>USER → GENERATION / SHARED PREFIX</span>
|
||
<b data-template-prefix-exact></b>
|
||
<p>同一 batch 内逐 token ordered top-6;未来 suffix 不得改写过去。</p>
|
||
</article>
|
||
<article>
|
||
<span>CONTENT-ONLY DELTA</span>
|
||
<b data-template-content-zero></b>
|
||
<p>CV Δ / TV / JSD;对齐内容不包含新追加的 Assistant:。</p>
|
||
</article>
|
||
<article>
|
||
<span>FULL-INPUT TV</span>
|
||
<b data-template-suffix-tv></b>
|
||
<p>整段统计会变化,因为 generation 条件确实加入了新的 suffix token。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="template-depth">
|
||
<div>
|
||
<span>DEPTH MAP / Δ CV(USER − RAW)</span>
|
||
<h5>角色前缀没有一个跨层恒定方向</h5>
|
||
<p>每格是一层;绿色表示 USER 更平,红色表示 USER 更集中。切换 scope / aggregation 后重新计算。</p>
|
||
</div>
|
||
<div data-template-depth-map></div>
|
||
</div>
|
||
|
||
<div class="evidence-links">
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite/blob/main/tokenizer_config.json" rel="noreferrer">官方 tokenizer_config ↗</a>
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite" rel="noreferrer">官方 V2-Lite 模型卡 ↗</a>
|
||
<a href="https://arxiv.org/abs/2405.04434" rel="noreferrer">DeepSeek-V2 技术报告 ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>PROTOCOL SENSITIVITY, NOT CAPABILITY</b>
|
||
<p>
|
||
RAW→USER 的变化只描述固定 23-content-token 探针中的协议敏感性;不能命名专家,
|
||
不能推出完整 27 层或线上对话流量,也没有生成答案。USER→GENERATION 的共享前缀 exact
|
||
是 causal-mask 实现负对照,不是“Assistant: 没有作用”——新增 suffix 自己仍有路由。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="history" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / MESSAGE-HISTORY FACTORIAL</span><h4>把 system 与 one-shot 拆成四格,而不是只做两组对比</h4></div>
|
||
<p>
|
||
同一批 128 条目标内容,在官方模板中切换两个固定处理。system 每条恒增 16 tokens,
|
||
one-shot 每条恒增 17 tokens;四格同 batch,目标内容精确对齐。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-ledger">
|
||
<article><span>SOURCE PROMPTS</span><b>128</b><p>与上一模板探针逐项同 cohort</p></article>
|
||
<article><span>2×2 VARIANTS</span><b>512</b><p>S0F0 · S1F0 · S0F1 · S1F1</p></article>
|
||
<article><span>INPUT TOKENS</span><b>24,040</b><p>四格完整协议输入</p></article>
|
||
<article><span>REAL ROUTES</span><b>865,440</b><p>四格 × 前六个 MoE 层</p></article>
|
||
<article><span>ALIGNED TARGET</span><b>2,874 × 4</b><p>相同字符跨度与 token ID</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{historyExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 5765fbf8…c1fb</p></article>
|
||
</div>
|
||
|
||
<div class="history-factorial" aria-label="System 与 one-shot 的二乘二实验矩阵">
|
||
<div class="history-axis">
|
||
<span>ONE-SHOT FACTOR →</span>
|
||
<b>F0 · 无示例</b>
|
||
<b>F1 · 固定 user / assistant 示例</b>
|
||
</div>
|
||
<div class="history-row">
|
||
<strong>S0<br /><small>无 SYSTEM</small></strong>
|
||
<article>
|
||
<span>S0F0 / BASE</span>
|
||
<div><i>USER TARGET</i><em>Assistant:</em></div>
|
||
<p>每条约 30 tokens;只含目标单轮。</p>
|
||
</article>
|
||
<article>
|
||
<span>S0F1 / ONE-SHOT</span>
|
||
<div><b>USER DEMO</b><b>ASSISTANT · EOS</b><i>USER TARGET</i><em>Assistant:</em></div>
|
||
<p>相对 base 每条固定 +17 tokens。</p>
|
||
</article>
|
||
</div>
|
||
<div class="history-row">
|
||
<strong>S1<br /><small>固定 SYSTEM</small></strong>
|
||
<article>
|
||
<span>S1F0 / SYSTEM</span>
|
||
<div><u>SYSTEM</u><i>USER TARGET</i><em>Assistant:</em></div>
|
||
<p>相对 base 每条固定 +16 tokens。</p>
|
||
</article>
|
||
<article>
|
||
<span>S1F1 / COMBINED</span>
|
||
<div><u>SYSTEM</u><b>USER DEMO</b><b>ASSISTANT · EOS</b><i>USER TARGET</i><em>Assistant:</em></div>
|
||
<p>两种增量严格相加:+16 +17 tokens。</p>
|
||
</article>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="history-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch history-layer-switch" role="group" aria-label="选择消息历史层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-history-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="history-scope-switch" role="group" aria-label="选择消息历史统计范围">
|
||
<button type="button" data-history-scope="target_content" aria-pressed="true">目标内容</button>
|
||
<button type="button" data-history-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="history-mode-switch" role="group" aria-label="选择消息历史聚合口径">
|
||
<button type="button" data-history-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-history-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>DEPTH MAP EFFECT</span>
|
||
<div class="history-effect-switch" role="group" aria-label="选择消息历史因子效应">
|
||
<button type="button" data-history-effect="system_main" aria-pressed="false">System</button>
|
||
<button type="button" data-history-effect="fewshot_main" aria-pressed="false">One-shot</button>
|
||
<button type="button" data-history-effect="interaction" aria-pressed="true">Interaction</button>
|
||
</div>
|
||
</div>
|
||
<p data-history-note>
|
||
目标内容:四格只保留相同相对字符跨度与相同 token ID;下方 Δ 均为 CV 的 source-paired 2×2 效应。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-domain-grid" data-history-domain-grid></div>
|
||
|
||
<div class="history-buffer-summary">
|
||
<article><span>SYSTEM EDGE TV</span><b>24 / 24 ↓</b><p>有 one-shot 时,六层四域的 system-edge TV 全部下降。</p></article>
|
||
<article><span>MEAN TARGET TV</span><b>.073 → .019</b><p>system at F0 → system at F1,平均下降约 74%。</p></article>
|
||
<article><span>|Δ CV|</span><b>21 / 24 ↓</b><p>绝对 CV system effect 从均值 .068 降至 .016。</p></article>
|
||
<article><span>BOUNDARY</span><b>HISTORY BUFFER</b><p>不能单独归因给示例语义;距离、EOS、角色与文本共同变化。</p></article>
|
||
</div>
|
||
|
||
<div class="history-buffer">
|
||
<div>
|
||
<span>CURRENT LAYER / SYSTEM EDGE</span>
|
||
<h5>同样增加 16 tokens,先经过一轮历史后变化更小</h5>
|
||
<p>每域同时显示目标路由 TV 与逐 token top-6 set exact;左为 F0,右为 F1。</p>
|
||
</div>
|
||
<div data-history-buffer-grid></div>
|
||
</div>
|
||
|
||
<div class="history-depth">
|
||
<div>
|
||
<span>DEPTH MAP / Δ CV</span>
|
||
<h5 data-history-depth-title>Interaction:两个处理是否可以简单相加</h5>
|
||
<p>绿色为 CV 下降,红色为 CV 上升;颜色身份只表示方向,不表示能力好坏。</p>
|
||
</div>
|
||
<div data-history-depth-map></div>
|
||
</div>
|
||
|
||
<div class="evidence-links">
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite/blob/main/tokenizer_config.json" rel="noreferrer">官方 tokenizer_config ↗</a>
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite" rel="noreferrer">官方 V2-Lite 模型卡 ↗</a>
|
||
<a href="https://arxiv.org/abs/2405.04434" rel="noreferrer">DeepSeek-V2 技术报告 ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>HISTORY COMPOSITION, NOT ROLE SEMANTICS</b>
|
||
<p>
|
||
这组 2×2 同时改变固定文本、角色边界、EOS、距离与长度;“24 / 24 TV 下降”是本探针中的
|
||
历史缓冲模式,不证明 one-shot 语义本身稳定了路由,更不证明答案质量提升。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="distance" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / EQUAL-LENGTH HISTORY CONTROL</span><h4>把“历史缓冲”再拆一层:可读示例并不是唯一来源</h4></div>
|
||
<p>
|
||
system 开 / 关分别搭配无历史、17-token 重复词元 filler 与 17-token 原 one-shot。
|
||
filler / demo 的角色、EOS、目标位置与 batch 形状完全相同,只替换历史文本。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-ledger distance-ledger">
|
||
<article><span>SOURCE PROMPTS</span><b>128</b><p>四个公开域各 32 条;同一 cohort</p></article>
|
||
<article><span>2×3 VARIANTS</span><b>768</b><p>system 0/1 × none/filler/demo</p></article>
|
||
<article><span>INPUT TOKENS</span><b>38,236</b><p>六格完整官方模板输入</p></article>
|
||
<article><span>REAL ROUTES</span><b>1,376,496</b><p>六格 × 前六个 MoE 层</p></article>
|
||
<article><span>ALIGNED TARGET</span><b>2,874 × 6</b><p>相同字符跨度与 token ID</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{distanceExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 423a095d…e648e</p></article>
|
||
</div>
|
||
|
||
<div class="distance-protocol" aria-label="System 与三种消息历史的二乘三控制矩阵">
|
||
<div class="distance-row head">
|
||
<span>HISTORY →</span>
|
||
<b>NONE · 无历史</b>
|
||
<b>FILLER · 重复词元</b>
|
||
<b>DEMO · 原 one-shot</b>
|
||
</div>
|
||
<div class="distance-row">
|
||
<strong>S0<br /><small>无 SYSTEM</small></strong>
|
||
<article><span>S0 / NONE</span><div><i>USER TARGET</i><em>Assistant:</em></div><p>目标前没有已完成 turn。</p></article>
|
||
<article><span>S0 / FILLER</span><div><b>USER · x×9</b><b>ASSISTANT · x · EOS</b><i>USER TARGET</i></div><p>相对 none 固定 +17 tokens。</p></article>
|
||
<article><span>S0 / DEMO</span><div><u>USER · Reply with OK</u><u>ASSISTANT · OK · EOS</u><i>USER TARGET</i></div><p>同样固定 +17 tokens。</p></article>
|
||
</div>
|
||
<div class="distance-row">
|
||
<strong>S1<br /><small>固定 SYSTEM</small></strong>
|
||
<article><span>S1 / NONE</span><div><mark>SYSTEM</mark><i>USER TARGET</i><em>Assistant:</em></div><p>system 相对 S0 固定 +16 tokens。</p></article>
|
||
<article><span>S1 / FILLER</span><div><mark>SYSTEM</mark><b>FILLER TURN · EOS</b><i>USER TARGET</i></div><p>与 S1 demo 的目标位置相同。</p></article>
|
||
<article><span>S1 / DEMO</span><div><mark>SYSTEM</mark><u>DEMO TURN · EOS</u><i>USER TARGET</i></div><p>只把 filler 文本替换为原示例。</p></article>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="distance-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch distance-layer-switch" role="group" aria-label="选择等长历史控制层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-distance-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="distance-scope-switch" role="group" aria-label="选择等长历史统计范围">
|
||
<button type="button" data-distance-scope="target_content" aria-pressed="true">目标内容</button>
|
||
<button type="button" data-distance-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="distance-mode-switch" role="group" aria-label="选择等长历史聚合口径">
|
||
<button type="button" data-distance-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-distance-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>DEPTH MAP CONTRAST</span>
|
||
<div class="distance-contrast-switch" role="group" aria-label="选择等长历史阶梯">
|
||
<button type="button" data-distance-contrast="filler_minus_none" aria-pressed="true">Filler − None</button>
|
||
<button type="button" data-distance-contrast="demo_minus_filler" aria-pressed="false">Demo − Filler</button>
|
||
</div>
|
||
</div>
|
||
<p data-distance-note>
|
||
目标内容:六格只保留相同相对字符跨度与相同 token ID;TV 是两条真实 system edge 的分布距离。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="distance-domain-grid" data-distance-domain-grid></div>
|
||
|
||
<div class="history-buffer-summary distance-summary">
|
||
<article><span>STRUCTURE STEP</span><b>24 / 24 ↓</b><p>none → filler 的 system-edge TV 全部下降,区间也全部低于零。</p></article>
|
||
<article><span>TEXT STEP</span><b>24 / 24 ↓</b><p>filler → demo 再次全部下降,区间同样全部低于零。</p></article>
|
||
<article><span>MEAN TARGET TV</span><b>.074 → .038 → .019</b><p>重复历史复现约一半缓冲;原示例再贡献一个台阶。</p></article>
|
||
<article><span>BOUNDARY</span><b>NOT PURE DISTANCE</b><p>`x` 仍是学习过的 token;没有生成答案,也没有测能力。</p></article>
|
||
</div>
|
||
|
||
<div class="distance-depth">
|
||
<div>
|
||
<span>DEPTH MAP / Δ SYSTEM-EDGE TV</span>
|
||
<h5 data-distance-depth-title>Filler − None:等长历史结构的第一个台阶</h5>
|
||
<p>绿色表示 selected history 让 system-edge TV 下降;每格都来自六格共享 source-bootstrap。</p>
|
||
</div>
|
||
<div data-distance-depth-map></div>
|
||
</div>
|
||
|
||
<div class="distance-interpretation">
|
||
<article>
|
||
<span>WHAT FILLER CONTROLS</span>
|
||
<b>角色 · EOS · 长度 · 目标位置</b>
|
||
<p>filler 与 demo 在这些协议字段上完全相同,因此可比较固定文本替换。</p>
|
||
</article>
|
||
<article>
|
||
<span>WHAT IT DOES NOT CONTROL</span>
|
||
<b>纯距离 · token identity · repetition</b>
|
||
<p>none → filler 仍同时加入历史与重复 token,不能命名为纯位置因果效应。</p>
|
||
</article>
|
||
<article>
|
||
<span>NUMERICAL CONTRACT</span>
|
||
<b>BF16 batch shape matters</b>
|
||
<p>跨实验 token IDs 虽 exact,深层 gate hash 可因矩阵形状改变;正式结论只做六格组内比较。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="evidence-links">
|
||
<a href="https://aclanthology.org/2022.emnlp-main.759/" rel="noreferrer">Min et al. · demonstration format ↗</a>
|
||
<a href="https://arxiv.org/abs/2209.11895" rel="noreferrer">Induction Heads ↗</a>
|
||
<a href="https://aclanthology.org/2024.tacl-1.9/" rel="noreferrer">Lost in the Middle ↗</a>
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite" rel="noreferrer">官方 V2-Lite ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>HISTORY STRUCTURE + TEXT REPLACEMENT, NOT CAPABILITY</b>
|
||
<p>
|
||
filler 已说明“可读正确示例”不是缓冲出现的必要条件,但 `x` 不是无语义空气;
|
||
demo 的额外台阶也不能归因给示例正确性。下一步仍需 EOS、角色、多 filler 与行为指标控制。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="boundary" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / SINGLE-ID BOUNDARY CONTROL</span><h4>只换 assistant 后面的一个 ID:EOS 不是普通占位符</h4></div>
|
||
<p>
|
||
重复词元历史、角色标记、长度、目标绝对位置与 32-row batch 全部不动;
|
||
只把官方 EOS `100001` 分别换成单 token 的 x、句点或换行。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-ledger boundary-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 × 四种边界 ID</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>ALIGNED TARGET</span><b>2,874 × 8</b><p>相同字符跨度、位置与 token ID</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{boundaryExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 9bb93834…b9c37</p></article>
|
||
</div>
|
||
|
||
<div class="boundary-protocol" aria-label="历史 assistant 边界的单 token ID 控制">
|
||
<div class="boundary-track">
|
||
<span>FIXED PREFIX</span>
|
||
<b>Assistant:</b>
|
||
<i>x</i>
|
||
<mark data-boundary-track-token>EOS</mark>
|
||
<b>User:</b>
|
||
<i>TARGET</i>
|
||
<span>FIXED SUFFIX</span>
|
||
</div>
|
||
<div class="boundary-token-grid">
|
||
<article class="official">
|
||
<span>OFFICIAL</span><b>EOS</b><code>ID 100001</code>
|
||
<p>官方 template 自然产生;唯一的合法序列格。</p>
|
||
</article>
|
||
<article>
|
||
<span>COUNTERFACTUAL A</span><b>x</b><code>ID 87</code>
|
||
<p>普通内容 token;相对官方序列只改一个 ID。</p>
|
||
</article>
|
||
<article>
|
||
<span>COUNTERFACTUAL B</span><b>.</b><code>ID 13</code>
|
||
<p>普通标点 token;长度与后续位置完全不变。</p>
|
||
</article>
|
||
<article>
|
||
<span>COUNTERFACTUAL C</span><b>↵</b><code>ID 185</code>
|
||
<p>普通换行 token;保留紧随其后的 `User:` 标记。</p>
|
||
</article>
|
||
</div>
|
||
<p>
|
||
每个 source 在 S0 / S1 内都通过 4 / 4 同长度、4 / 4 同目标位置;768 / 768
|
||
反事实格相对官方 token 序列恰好只改一个 ID。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="boundary-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch boundary-layer-switch" role="group" aria-label="选择边界 token 控制层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-boundary-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="boundary-scope-switch" role="group" aria-label="选择边界 token 统计范围">
|
||
<button type="button" data-boundary-scope="target_content" aria-pressed="true">目标内容</button>
|
||
<button type="button" data-boundary-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="boundary-mode-switch" role="group" aria-label="选择边界 token 聚合口径">
|
||
<button type="button" data-boundary-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-boundary-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>REPLACEMENT − EOS</span>
|
||
<div class="boundary-contrast-switch" role="group" aria-label="选择 EOS 的单 token 替换">
|
||
<button type="button" data-boundary-contrast="x_minus_eos" aria-pressed="true">x − EOS</button>
|
||
<button type="button" data-boundary-contrast="period_minus_eos" aria-pressed="false">. − EOS</button>
|
||
<button type="button" data-boundary-contrast="newline_minus_eos" aria-pressed="false">↵ − EOS</button>
|
||
</div>
|
||
</div>
|
||
<p data-boundary-note>
|
||
目标内容:八格只比较完全相同的后续内容 token;正 ΔTV 表示替换 EOS 后 system edge 更大,不表示能力更差。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="boundary-domain-grid" data-boundary-domain-grid></div>
|
||
|
||
<div class="history-buffer-summary boundary-summary">
|
||
<article><span>X CONTROL</span><b>24 / 24 ↑</b><p>system-edge TV 全部高于 EOS;23 / 24 配对区间完全高于零。</p></article>
|
||
<article><span>PERIOD CONTROL</span><b>24 / 24 ↑</b><p>点估计全部高于 EOS;同样 23 / 24 区间完全高于零。</p></article>
|
||
<article><span>NEWLINE CONTROL</span><b>23 / 24 ↑</b><p>16 / 24 区间完全高于零;比另两个对照更依赖层与域。</p></article>
|
||
<article><span>MEAN TARGET TV</span><b>.037 → .054 / .055 / .049</b><p>EOS / x / 句点 / 换行;不是准确率或优劣排名。</p></article>
|
||
</div>
|
||
|
||
<div class="boundary-depth">
|
||
<div>
|
||
<span>DEPTH MAP / REPLACEMENT − EOS</span>
|
||
<h5 data-boundary-depth-title>x − EOS:只替换历史边界的一个 input ID</h5>
|
||
<p>红色为替换后 system-edge TV 更大,绿色为更小;每格使用八格共享 source-bootstrap。</p>
|
||
</div>
|
||
<div data-boundary-depth-map></div>
|
||
</div>
|
||
|
||
<div class="boundary-interpretation">
|
||
<article>
|
||
<span>WHAT IS CAUSAL</span>
|
||
<b>一个历史 input ID</b>
|
||
<p>在固定模型、目标、位置、mask 与 batch 内,EOS→control 的路由差异来自这一个输入干预。</p>
|
||
</article>
|
||
<article>
|
||
<span>WHAT REMAINS</span>
|
||
<b>`User:` 边界仍在</b>
|
||
<p>实验没有删除全部回合结构,只识别 EOS token identity;三个反事实也不是合法官方 chat。</p>
|
||
</article>
|
||
<article>
|
||
<span>CHECKPOINT BOUNDARY</span>
|
||
<b>BASE ≠ CHAT / SFT</b>
|
||
<p>不能把较小 TV 命名为“理解回合结束”;仍需 V2-Lite-Chat 与行为生成对照。</p>
|
||
</article>
|
||
</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 supervision ↗</a>
|
||
<a href="https://aclanthology.org/2020.blackboxnlp-1.26/" rel="noreferrer">EOS Decision ↗</a>
|
||
<a href="https://arxiv.org/abs/2309.16042" rel="noreferrer">Activation Patching Limits ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>SINGLE-ID ROUTING CAUSALITY, NOT TURN-SEMANTIC OR CAPABILITY PROOF</b>
|
||
<p>
|
||
EOS 条件下后续目标路由对 system 开关更稳定,但本实验既未生成答案,也未覆盖 Chat 权重;
|
||
更小 TV 不等于更正确。下一步要拆 `User:` 角色标记、special-token 家族与行为指标。
|
||
</p>
|
||
</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="special" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / COMPLETE SPECIAL INVENTORY</span><h4>EOS 与 BOS 都测了:具体身份比“是否 special”更诚实</h4></div>
|
||
<p>
|
||
固定 tokenizer 只有两个 special IDs;本轮完整枚举 EOS/BOS,再放入 `x` 与句点两个普通
|
||
单-ID 对照。四个水平同长度、同目标位置、同一个 32-row BF16 batch。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-ledger special-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 × 四个边界 ID</p></article>
|
||
<article><span>SPECIAL INVENTORY</span><b>2 / 2</b><p>BOS 与 EOS 全枚举;PAD 与 EOS 同 ID</p></article>
|
||
<article><span>REAL ROUTES</span><b>2,044,224</b><p>56,784 tokens × 前六个 MoE 层</p></article>
|
||
<article><span>EDIT CONTRACT</span><b>768 / 768</b><p>三类反事实都恰好修改一个 ID</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{specialExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 c372c1b0…4af5bf</p></article>
|
||
</div>
|
||
|
||
<div class="special-inventory">
|
||
<div>
|
||
<span>PINNED TOKENIZER INVENTORY</span>
|
||
<h5>词表约十万,不代表有十万个 special token</h5>
|
||
<p>
|
||
`all_special_ids = [100000, 100001]`;PAD 复用 EOS `100001`。
|
||
所以 BOS/EOS 是完整 special 库,但 `x`/句点只是普通库中的两个选定对照。
|
||
</p>
|
||
</div>
|
||
<div class="special-token-grid">
|
||
<article class="official"><span>OFFICIAL / SPECIAL</span><b>EOS</b><code>100001</code><p>官方 assistant 历史边界;同时承担 PAD。</p></article>
|
||
<article class="special"><span>COUNTERFACTUAL / SPECIAL</span><b>BOS</b><code>100000</code><p>完整 special inventory 中的另一个独立 ID。</p></article>
|
||
<article><span>ORDINARY CONTROL A</span><b>x</b><code>87</code><p>一个普通内容 token;不是普通词元总体样本。</p></article>
|
||
<article><span>ORDINARY CONTROL B</span><b>.</b><code>13</code><p>一个普通标点 token;不代表全部 delimiter。</p></article>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="special-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch special-layer-switch" role="group" aria-label="选择特殊词元控制层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-special-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="special-scope-switch" role="group" aria-label="选择特殊词元统计范围">
|
||
<button type="button" data-special-scope="target_content" aria-pressed="true">目标内容</button>
|
||
<button type="button" data-special-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="special-mode-switch" role="group" aria-label="选择特殊词元聚合口径">
|
||
<button type="button" data-special-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-special-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>SYSTEM-EDGE CONTRAST</span>
|
||
<div class="special-contrast-switch" role="group" aria-label="选择特殊词元对照">
|
||
<button type="button" data-special-contrast="bos_minus_eos" aria-pressed="true">BOS−EOS</button>
|
||
<button type="button" data-special-contrast="x_minus_eos" aria-pressed="false">x−EOS</button>
|
||
<button type="button" data-special-contrast="period_minus_eos" aria-pressed="false">.−EOS</button>
|
||
<button type="button" data-special-contrast="family" aria-pressed="false">2 vs 2</button>
|
||
</div>
|
||
</div>
|
||
<p data-special-note>
|
||
目标内容:正 ΔTV 表示替换边界后 system edge 更大;2-vs-2 只描述这四个 ID。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="special-domain-grid" data-special-domain-grid></div>
|
||
|
||
<div class="history-buffer-summary special-summary">
|
||
<article><span>EOS SYSTEM EDGE</span><b>.037518</b><p>24 个 layer×domain 的目标内容均值。</p></article>
|
||
<article><span>BOS − EOS</span><b>+.010500</b><p>22↑ / 2↓;19 个 paired CI 全正。</p></article>
|
||
<article><span>x / . − EOS</span><b>24↑ / 24↑</b><p>均值 +.016457 / +.017771。</p></article>
|
||
<article><span>ORDINARY − SPECIAL</span><b>+.011864</b><p>四 ID 描述性汇总;不是总体类别推断。</p></article>
|
||
</div>
|
||
|
||
<div class="special-depth">
|
||
<div>
|
||
<span>DEPTH MAP / SYSTEM-EDGE CONTRAST</span>
|
||
<h5 data-special-depth-title>BOS − EOS:同为 special,路由模式仍不同</h5>
|
||
<p>红色为更大、绿色为更小;每格保留 source-paired 95% bootstrap 区间。</p>
|
||
</div>
|
||
<div data-special-depth-map></div>
|
||
</div>
|
||
|
||
<div class="special-scope-ledger">
|
||
<article><span>TARGET CONTENT</span><b>因果主口径</b><p>只看编辑位置之后精确对齐的 23 个目标 tokens。</p></article>
|
||
<article><span>FULL INPUT</span><b>BOS−EOS = −.001735</b><p>包含被编辑 token 自身,方向可与目标内容不同。</p></article>
|
||
<article><span>BEHAVIOR</span><b>NOT MEASURED</b><p>没有生成、正确率、回合理解或安全性指标。</p></article>
|
||
</div>
|
||
|
||
<div class="role-batch-audit special-batch-audit">
|
||
<div>
|
||
<span>BF16 BATCH-CONTENT AUDIT</span>
|
||
<h5>token 合同 768 / 768 exact;companion rows 改变后,深层 gate 可分化</h5>
|
||
<p>下表合计 EOS / x / 句点三个共享水平,显示跨上一轮实验的 target route-hash exact。</p>
|
||
</div>
|
||
<div>
|
||
{specialCrossBatch.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 inventory ↗</a>
|
||
<a href="https://aclanthology.org/2024.emnlp-main.295/" rel="noreferrer">Lexical Sensitivity ↗</a>
|
||
<a href="https://aclanthology.org/2024.naacl-long.325/" rel="noreferrer">Prompt Sensitivity ↗</a>
|
||
<a href="https://aclanthology.org/2026.findings-eacl.61.pdf" rel="noreferrer">PROMPTPRISM taxonomy ↗</a>
|
||
<a href="https://proceedings.iclr.cc/paper_files/paper/2024/file/6bcbb4a501dbad0eba1b660c1a55318c-Paper-Conference.pdf" rel="noreferrer">URIAL ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>COMPLETE SPECIAL INVENTORY, INCOMPLETE ORDINARY-TOKEN POPULATION</b>
|
||
<p>
|
||
可以说 BOS 不复现 EOS,也可以描述这四个 ID 的 2-vs-2 差异;
|
||
不能说普通 token 普遍比 special token 更强,更不能把 route TV 改写成行为质量。
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="artifact-panel" data-artifact-panel="role-block" hidden>
|
||
<div class="panel-lead">
|
||
<div><span>X / FULL ROLE-BLOCK FACTORIAL</span><h4>`User:` 不是一个 token:把词头与分隔符放进同一个 2×2</h4></div>
|
||
<p>
|
||
`User:` = `[5726,25]`,`Assistant:` = `[77398,25]`。本轮独立操纵
|
||
head 与 delimiter,官方 EOS、目标、长度、位置、mask 和 generation suffix 全部固定。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="history-ledger role-block-ledger">
|
||
<article><span>SOURCE PROMPTS</span><b>128</b><p>四域各 32 条;沿用固定 cohort</p></article>
|
||
<article><span>2×2×2 VARIANTS</span><b>1,024</b><p>system × head × delimiter</p></article>
|
||
<article><span>ROLE BLOCK</span><b>2 TOKENS</b><p>两个位置都是普通 token,不是专用 role ID</p></article>
|
||
<article><span>REAL ROUTES</span><b>2,044,224</b><p>八格 × 六个 MoE 层</p></article>
|
||
<article><span>EDIT CONTRACT</span><b>256 / 512 / 256</b><p>零改动 / 单 ID / 双 ID 全 exact</p></article>
|
||
<article class="exact"><span>INDEPENDENT RERUN</span><b>{roleBlockExact ? "BYTE-EXACT" : "MISMATCH"}</b><p>完整 JSON SHA-256 a703dddb…7e82</p></article>
|
||
</div>
|
||
|
||
<div class="role-block-protocol">
|
||
<div>
|
||
<span>PRE-TARGET TWO-TOKEN BLOCK</span>
|
||
<h5>同一个 2×2 同时识别 head、delimiter 与 interaction</h5>
|
||
<p>四个块长度都为 2;`Assistant x` 相对官方 `User:` 恰好改两个 ID。</p>
|
||
</div>
|
||
<div class="role-block-matrix">
|
||
<article class="official"><span>USER × COLON</span><b>User:</b><code>[5726, 25]</code><p>官方目标入口。</p></article>
|
||
<article><span>ASSISTANT × COLON</span><b>Assistant:</b><code>[77398, 25]</code><p>只改 head。</p></article>
|
||
<article><span>USER × X</span><b>User x</b><code>[5726, 87]</code><p>只改 delimiter。</p></article>
|
||
<article><span>ASSISTANT × X</span><b>Assistant x</b><code>[77398, 87]</code><p>同时改两个位置。</p></article>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="role-block-controls">
|
||
<div>
|
||
<span>MOE LAYER</span>
|
||
<div class="layer-switch role-block-layer-switch" role="group" aria-label="选择完整角色块控制层">
|
||
{[1, 2, 3, 4, 5, 6].map((layer) => (
|
||
<button type="button" data-role-block-layer={layer} class={layer === 1 ? "active" : ""}>L{layer}</button>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>MEASUREMENT SCOPE</span>
|
||
<div class="role-block-scope-switch" role="group" aria-label="选择完整角色块统计范围">
|
||
<button type="button" data-role-block-scope="target_content" aria-pressed="true">目标内容</button>
|
||
<button type="button" data-role-block-scope="full_input" aria-pressed="false">完整输入</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>AGGREGATION</span>
|
||
<div class="role-block-mode-switch" role="group" aria-label="选择完整角色块聚合口径">
|
||
<button type="button" data-role-block-mode="prompt_balanced" aria-pressed="true">prompt 等权</button>
|
||
<button type="button" data-role-block-mode="token_weighted" aria-pressed="false">token 加权</button>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<span>FACTOR EFFECT</span>
|
||
<div class="role-block-effect-switch" role="group" aria-label="选择完整角色块因子效应">
|
||
<button type="button" data-role-block-effect="head_main" aria-pressed="true">head</button>
|
||
<button type="button" data-role-block-effect="delimiter_main" aria-pressed="false">delimiter</button>
|
||
<button type="button" data-role-block-effect="head_by_delimiter" aria-pressed="false">interaction</button>
|
||
</div>
|
||
</div>
|
||
<p data-role-block-note>
|
||
head main:平均跨过两个 delimiter,User→Assistant 对 system-edge TV 的影响。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="role-block-domain-grid" data-role-block-domain-grid></div>
|
||
|
||
<div class="history-buffer-summary role-block-summary">
|
||
<article><span>FOUR SYSTEM EDGES</span><b>.037304 → .036220</b><p>User: / Assistant: / User x / Assistant x 均值非常接近。</p></article>
|
||
<article><span>HEAD MAIN</span><b>−.000654</b><p>9↑ / 15↓;CI 3 正 / 3 负 / 18 跨零。</p></article>
|
||
<article><span>DELIMITER MAIN</span><b>−.000430</b><p>8↑ / 16↓;23 / 24 个 paired CI 跨零。</p></article>
|
||
<article><span>INTERACTION</span><b>−.000729</b><p>6↑ / 18↓;局部正负单元同时存在。</p></article>
|
||
</div>
|
||
|
||
<div class="role-block-direct">
|
||
<article><span>HEAD @ COLON</span><b>.022399 / .021933</b><p>S0 / S1 direct target TV。</p></article>
|
||
<article><span>HEAD @ x</span><b>.018726 / .019973</b><p>多数格低于 head@colon。</p></article>
|
||
<article><span>DELIMITER @ USER</span><b>.026560 / .025679</b><p>冒号→x 也会条件化后续路由。</p></article>
|
||
<article><span>DELIMITER @ ASSISTANT</span><b>.024495 / .024949</b><p>system modulation 仍跨层跨域混合。</p></article>
|
||
</div>
|
||
|
||
<div class="role-block-depth">
|
||
<div>
|
||
<span>DEPTH MAP / FACTOR EFFECT</span>
|
||
<h5 data-role-block-depth-title>head main:User→Assistant 是否统一改变 system edge</h5>
|
||
<p>每格是带符号 ΔTV;孤立的稳定单元不会被升级成全局结论。</p>
|
||
</div>
|
||
<div data-role-block-depth-map></div>
|
||
</div>
|
||
|
||
<div class="special-scope-ledger role-block-boundaries">
|
||
<article><span>DIRECT EFFECT</span><b>两个位置都非零</b><p>head 与 delimiter 都会条件化后续目标路由。</p></article>
|
||
<article><span>SYSTEM MODULATION</span><b>方向混合</b><p>直接作用不等于统一放大或削弱 system。</p></article>
|
||
<article><span>SEMANTICS</span><b>NOT IDENTIFIED</b><p>`x` 只有一个对照;base ≠ Chat,也没有生成行为。</p></article>
|
||
</div>
|
||
|
||
<div class="role-batch-audit role-block-batch-audit">
|
||
<div>
|
||
<span>BF16 BATCH-CONTENT AUDIT</span>
|
||
<h5>共享 `User:` / `Assistant:` token 合同 512 / 512 exact</h5>
|
||
<p>下表合计两个共享水平;L1 路由全 exact,深层随 companion rows 改变而逐步分化。</p>
|
||
</div>
|
||
<div>
|
||
{roleBlockCrossBatch.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">固定角色块 tokenization ↗</a>
|
||
<a href="https://huggingface.co/docs/transformers/en/chat_templating" rel="noreferrer">HF Chat Templates ↗</a>
|
||
<a href="https://aclanthology.org/2024.emnlp-main.295/" rel="noreferrer">Lexical Sensitivity ↗</a>
|
||
<a href="https://aclanthology.org/2026.findings-eacl.61.pdf" rel="noreferrer">PROMPTPRISM · delimiters ↗</a>
|
||
<a href="https://arxiv.org/abs/2305.11206" rel="noreferrer">LIMA ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>FULL TWO-TOKEN BLOCK, NOT FULL ROLE SEMANTICS</b>
|
||
<p>
|
||
可以识别固定 `User/Assistant × :/x` 的路由效应与 interaction;
|
||
不能把一个 delimiter control 泛化成标点规律,也不能把 base routing 等同于 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>
|
||
<p>第一分片完整包含 layer 0–6;layer 7 跨两个分片。停止线由 checkpoint index 决定,不由页面叙事决定。</p>
|
||
</div>
|
||
|
||
<div class="artifact-identity">
|
||
<article>
|
||
<span>OFFICIAL MODEL</span>
|
||
<b>deepseek-ai/DeepSeek-V2-Lite</b>
|
||
<code>604d5664…2482de0</code>
|
||
</article>
|
||
<article>
|
||
<span>CHECKPOINT</span>
|
||
<b>29.261 GiB · 4 shards</b>
|
||
<code>shard 1 · 8.005 GiB · {(shardFraction * 100).toFixed(1)}%</code>
|
||
</article>
|
||
<article>
|
||
<span>EXECUTION</span>
|
||
<b>RTX 5090 · BF16</b>
|
||
<code>torch 2.11.0+cu128</code>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="layer-evidence" aria-label="27 层模型的实际执行边界">
|
||
{Array.from({ length: 27 }, (_, layer) => (
|
||
<span class={layer <= 6 ? "executed" : layer === 7 ? "split" : "unloaded"} title={`layer ${layer}`}>
|
||
<b>{layer}</b><small>{layer <= 6 ? "X" : layer === 7 ? "SPLIT" : "U"}</small>
|
||
</span>
|
||
))}
|
||
</div>
|
||
<div class="layer-legend">
|
||
<span><i class="executed"></i><b>0–6</b> 完整参数 + 连续 forward</span>
|
||
<span><i class="split"></i><b>7</b> 横跨 shard 1 / 2,未执行</span>
|
||
<span><i class="unloaded"></i><b>8–26</b> 未下载 / 未执行</span>
|
||
</div>
|
||
|
||
<div class="repro-gate">
|
||
<div>
|
||
<span>INDEPENDENT RERUN</span>
|
||
<strong>{repro.exact_checks} / {repro.total_checks}</strong>
|
||
<b>EXACT</b>
|
||
</div>
|
||
<ul>
|
||
<li>provenance、configuration、tokenization</li>
|
||
<li>initial / final 与逐层 hidden hashes</li>
|
||
<li>7 层 MLA shapes</li>
|
||
<li>6 层 aggregate loads 与全部 token routes</li>
|
||
</ul>
|
||
<p><b>计时不比较:</b>kernel warm-up、频率与系统噪声不属于确定性证据。</p>
|
||
</div>
|
||
|
||
<div class="dependency-split">
|
||
<article>
|
||
<span>FAILED CURRENT STACK</span>
|
||
<b>Transformers 5.5</b>
|
||
<p>官方 2024 remote code 引用已移除的 <code>is_torch_fx_available</code>。</p>
|
||
</article>
|
||
<i aria-hidden="true">→</i>
|
||
<article>
|
||
<span>PINNED READ-ONLY STACK</span>
|
||
<b>Transformers 4.41.2</b>
|
||
<p>隔离依赖、本地 package 导入;官方模型源码不打补丁。</p>
|
||
</article>
|
||
</div>
|
||
|
||
<div class="checksum-grid">
|
||
<article><span>TRACE SHA-256</span><code>81ff4ab34d20…1f1aef</code></article>
|
||
<article><span>SHARD 1 SHA-256</span><code>0d7e9f39bde4…1f1e8da</code></article>
|
||
<article><span>MODEL CODE SHA-256</span><code>7d8e52210952…b45b9c</code></article>
|
||
<article><span>TOKENIZER SHA-256</span><code>41f3bf64213d…29f669</code></article>
|
||
</div>
|
||
|
||
<div class="evidence-links">
|
||
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite" rel="noreferrer">官方模型与 model card ↗</a>
|
||
<a href="https://github.com/deepseek-ai/DeepSeek-V2" rel="noreferrer">官方 DeepSeek-V2 仓库 ↗</a>
|
||
<a href="https://arxiv.org/abs/2405.04434" rel="noreferrer">DeepSeek-V2 技术报告 ↗</a>
|
||
</div>
|
||
|
||
<div class="artifact-boundary">
|
||
<b>U / STILL OPEN</b>
|
||
<p>完整 27 层生成、受支持硬件上的 FlashMLA 优化 kernel、生产服务、训练负载、FP8/pipeline 与 R1-like 训练 trace 仍未覆盖。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<figcaption>
|
||
<span>可复现入口</span>
|
||
<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>experiments/deepseek/compare_routing_length_control.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_LENGTH_CONTROL_AUDIT.md</code> ·
|
||
<code>experiments/deepseek/v2_lite_routing_template_probe.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_TEMPLATE_AUDIT.md</code> ·
|
||
<code>experiments/deepseek/v2_lite_routing_history_factorial_probe.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_HISTORY_FACTORIAL_AUDIT.md</code> ·
|
||
<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>experiments/deepseek/v2_lite_routing_role_marker_head_control.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_ROLE_MARKER_HEAD_AUDIT.md</code> ·
|
||
<code>experiments/deepseek/v2_lite_routing_special_token_family_control.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_SPECIAL_TOKEN_FAMILY_AUDIT.md</code> ·
|
||
<code>experiments/deepseek/v2_lite_routing_role_marker_block_factorial.py</code> ·
|
||
<code>research/DEEPSEEK_ROUTING_ROLE_MARKER_BLOCK_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>
|
||
<script is:inline type="application/json" data-dsv2-template set:html={templateCompactJson}></script>
|
||
<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>
|
||
<script is:inline type="application/json" data-dsv2-special set:html={specialCompactJson}></script>
|
||
<script is:inline type="application/json" data-dsv2-role-block set:html={roleBlockCompactJson}></script>
|
||
</figure>
|
||
|
||
<script>
|
||
document.querySelectorAll<HTMLElement>("[data-dsv2-lab]").forEach((root) => {
|
||
const one = <T extends Element>(selector: string) => root.querySelector<T>(selector);
|
||
const all = <T extends Element>(selector: string) => [...root.querySelectorAll<T>(selector)];
|
||
const set = (selector: string, value: string) => {
|
||
const node = one<HTMLElement>(selector);
|
||
if (node) node.textContent = value;
|
||
};
|
||
const payloadNode = one<HTMLScriptElement>("[data-dsv2-trace]");
|
||
const corpusNode = one<HTMLScriptElement>("[data-dsv2-corpus]");
|
||
const templateNode = one<HTMLScriptElement>("[data-dsv2-template]");
|
||
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]");
|
||
const specialNode = one<HTMLScriptElement>("[data-dsv2-special]");
|
||
const roleBlockNode = one<HTMLScriptElement>("[data-dsv2-role-block]");
|
||
if (
|
||
!payloadNode?.textContent
|
||
|| !corpusNode?.textContent
|
||
|| !templateNode?.textContent
|
||
|| !historyNode?.textContent
|
||
|| !distanceNode?.textContent
|
||
|| !boundaryNode?.textContent
|
||
|| !roleNode?.textContent
|
||
|| !specialNode?.textContent
|
||
|| !roleBlockNode?.textContent
|
||
) return;
|
||
const data = JSON.parse(payloadNode.textContent);
|
||
const corpusData = JSON.parse(corpusNode.textContent);
|
||
const templateData = JSON.parse(templateNode.textContent);
|
||
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 specialData = JSON.parse(specialNode.textContent);
|
||
const roleBlockData = JSON.parse(roleBlockNode.textContent);
|
||
|
||
const tabs = all<HTMLButtonElement>("[data-artifact-tab]");
|
||
const panels = all<HTMLElement>("[data-artifact-panel]");
|
||
const selectTab = (target: HTMLButtonElement) => {
|
||
tabs.forEach((tab) => {
|
||
const selected = tab === target;
|
||
tab.setAttribute("aria-selected", String(selected));
|
||
tab.tabIndex = selected ? 0 : -1;
|
||
});
|
||
panels.forEach((panel) => panel.hidden = panel.dataset.artifactPanel !== target.dataset.artifactTab);
|
||
};
|
||
tabs.forEach((tab, index) => {
|
||
tab.addEventListener("click", () => selectTab(tab));
|
||
tab.addEventListener("keydown", (event) => {
|
||
if (!["ArrowLeft", "ArrowRight", "Home", "End"].includes(event.key)) return;
|
||
event.preventDefault();
|
||
let next = index;
|
||
if (event.key === "ArrowRight") next = (index + 1) % tabs.length;
|
||
if (event.key === "ArrowLeft") next = (index - 1 + tabs.length) % tabs.length;
|
||
if (event.key === "Home") next = 0;
|
||
if (event.key === "End") next = tabs.length - 1;
|
||
tabs[next].focus();
|
||
selectTab(tabs[next]);
|
||
});
|
||
});
|
||
|
||
const layerById = (layer: number) => data.layers.find((item: any) => item.layer === layer);
|
||
const promptMeta = (id: string) => data.prompts.find((prompt: any) => prompt.id === id);
|
||
const formatPiece = (piece: string) => piece === "" ? "∅" : piece.replaceAll("\n", "↵").replaceAll(" ", "␠");
|
||
|
||
const routeLayer = one<HTMLSelectElement>("[data-route-layer]");
|
||
const routePrompt = one<HTMLSelectElement>("[data-route-prompt]");
|
||
const routeToken = one<HTMLSelectElement>("[data-route-token]");
|
||
const renderRoute = (resetTokens = false) => {
|
||
if (!routeLayer || !routePrompt || !routeToken) return;
|
||
const layer = layerById(Number(routeLayer.value));
|
||
const prompt = layer.prompts.find((item: any) => item.id === routePrompt.value);
|
||
const meta = promptMeta(prompt.id);
|
||
if (resetTokens || !routeToken.options.length || Number(routeToken.value) >= prompt.tokenRoutes.length) {
|
||
routeToken.replaceChildren(...prompt.tokenRoutes.map((token: any) => {
|
||
const option = document.createElement("option");
|
||
option.value = String(token.position);
|
||
option.textContent = `#${token.position} · ${formatPiece(token.decoded_piece)} · id ${token.token_id}`;
|
||
return option;
|
||
}));
|
||
}
|
||
const token = prompt.tokenRoutes[Number(routeToken.value) || 0];
|
||
set("[data-route-prompt-text]", meta.text);
|
||
set("[data-route-position]", `#${token.position}`);
|
||
set("[data-route-piece]", formatPiece(token.decoded_piece));
|
||
set("[data-route-token-id]", String(token.token_id));
|
||
set("[data-route-weight-sum]", token.selected_weight_sum.toFixed(4));
|
||
set("[data-route-heat-title]", `${prompt.label} · layer ${layer.layer}`);
|
||
set("[data-route-count]", prompt.metrics.routes.toLocaleString());
|
||
set("[data-route-used]", `${prompt.metrics.used_experts} / 64`);
|
||
set("[data-route-cv]", prompt.metrics.cv.toFixed(3));
|
||
set("[data-route-effective]", prompt.metrics.effective_experts.toFixed(2));
|
||
|
||
const experts = one<HTMLElement>("[data-route-experts]");
|
||
if (experts) {
|
||
experts.replaceChildren(...token.experts_by_weight.map((entry: any, index: number) => {
|
||
const node = document.createElement("article");
|
||
const rank = document.createElement("span");
|
||
const expert = document.createElement("b");
|
||
const weight = document.createElement("small");
|
||
rank.textContent = `#${index + 1}`;
|
||
expert.textContent = `E${entry.expert}`;
|
||
weight.textContent = entry.weight.toFixed(4);
|
||
node.append(rank, expert, weight);
|
||
return node;
|
||
}));
|
||
}
|
||
|
||
const heatmap = one<HTMLElement>("[data-route-heatmap]");
|
||
if (heatmap) {
|
||
const max = Math.max(...prompt.load, 1);
|
||
heatmap.replaceChildren(...prompt.load.map((count: number, expert: number) => {
|
||
const cell = document.createElement("span");
|
||
const label = document.createElement("b");
|
||
const value = document.createElement("small");
|
||
cell.style.setProperty("--load", String(count / max));
|
||
cell.classList.toggle("selected", token.experts_by_weight.some((entry: any) => entry.expert === expert));
|
||
cell.title = `layer ${layer.layer} · E${expert} · ${count} routes`;
|
||
label.textContent = `E${expert}`;
|
||
value.textContent = String(count);
|
||
cell.append(label, value);
|
||
return cell;
|
||
}));
|
||
}
|
||
};
|
||
routeLayer?.addEventListener("change", () => renderRoute(true));
|
||
routePrompt?.addEventListener("change", () => renderRoute(true));
|
||
routeToken?.addEventListener("change", () => renderRoute(false));
|
||
renderRoute(true);
|
||
|
||
const promptNames = Object.fromEntries(data.prompts.map((prompt: any) => [prompt.id, prompt.label]));
|
||
const renderLoad = (layerNumber: number) => {
|
||
const layer = layerById(layerNumber);
|
||
all<HTMLButtonElement>("[data-load-layer]").forEach((button) => {
|
||
button.classList.toggle("active", Number(button.dataset.loadLayer) === layerNumber);
|
||
});
|
||
set("[data-load-used]", String(layer.metrics.used_experts));
|
||
set("[data-load-zero]", String(layer.metrics.zero_experts));
|
||
set("[data-load-cv]", layer.metrics.cv.toFixed(3));
|
||
set("[data-load-gini]", layer.metrics.gini.toFixed(3));
|
||
set("[data-load-effective]", layer.metrics.effective_experts.toFixed(2));
|
||
one<HTMLElement>("[data-load-cv-bar]")?.style.setProperty("--fraction", String(Math.min(layer.metrics.cv / 1.5, 1)));
|
||
one<HTMLElement>("[data-load-gini-bar]")?.style.setProperty("--fraction", String(layer.metrics.gini));
|
||
one<HTMLElement>("[data-load-effective-bar]")?.style.setProperty("--fraction", String(layer.metrics.effective_experts / 64));
|
||
|
||
const rows = one<HTMLElement>("[data-load-rows]");
|
||
if (rows) {
|
||
const aggregate = {
|
||
label: "全部 prompt",
|
||
tokens: data.execution.validTokens,
|
||
metrics: layer.metrics,
|
||
topExperts: layer.topExperts,
|
||
};
|
||
rows.replaceChildren(...[aggregate, ...layer.prompts].map((prompt: any, index: number) => {
|
||
const row = document.createElement("div");
|
||
if (index === 0) row.className = "aggregate";
|
||
[
|
||
prompt.label,
|
||
String(prompt.tokens),
|
||
`${prompt.metrics.used_experts}/64`,
|
||
prompt.metrics.cv.toFixed(3),
|
||
prompt.metrics.gini.toFixed(3),
|
||
`E${prompt.topExperts[0].expert} · ${prompt.topExperts[0].routes}`,
|
||
].forEach((value) => {
|
||
const cell = document.createElement(index === 0 ? "b" : "span");
|
||
cell.textContent = value;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
|
||
const jaccard = one<HTMLElement>("[data-load-jaccard]");
|
||
if (jaccard) {
|
||
jaccard.replaceChildren(...layer.jaccard.map((pair: any) => {
|
||
const row = document.createElement("article");
|
||
const labels = document.createElement("span");
|
||
const track = document.createElement("i");
|
||
const fill = document.createElement("em");
|
||
const value = document.createElement("b");
|
||
labels.textContent = `${promptNames[pair.left]} ↔ ${promptNames[pair.right]}`;
|
||
fill.style.setProperty("--fraction", String(pair.used_expert_jaccard));
|
||
track.append(fill);
|
||
value.textContent = pair.used_expert_jaccard.toFixed(3);
|
||
row.append(labels, track, value);
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-load-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => renderLoad(Number(button.dataset.loadLayer)));
|
||
});
|
||
renderLoad(1);
|
||
|
||
const compactBytes = (bytes: number) => {
|
||
if (bytes >= 1024 ** 4) return `${(bytes / 1024 ** 4).toFixed(2)} TiB`;
|
||
if (bytes >= 1024 ** 3) return `${(bytes / 1024 ** 3).toFixed(2)} GiB`;
|
||
if (bytes >= 1024 ** 2) return `${(bytes / 1024 ** 2).toFixed(2)} MiB`;
|
||
if (bytes >= 1024) return `${(bytes / 1024).toFixed(2)} KiB`;
|
||
return `${bytes.toLocaleString()} B`;
|
||
};
|
||
const renderCache = () => {
|
||
const batch = Number(one<HTMLInputElement>("[data-cache-batch]")?.value ?? 4);
|
||
const context = Number(one<HTMLSelectElement>("[data-cache-context]")?.value ?? 27);
|
||
const layers = Number(one<HTMLInputElement>("[data-cache-layers]")?.value ?? 7);
|
||
const bytes = Number(one<HTMLSelectElement>("[data-cache-dtype]")?.value ?? 2);
|
||
const latent = batch * context * layers * data.cache.latent_elements_per_token_layer * bytes;
|
||
const eager = batch * context * layers * data.cache.hf_eager_elements_per_token_layer * bytes;
|
||
set("[data-cache-batch-label]", String(batch));
|
||
set("[data-cache-layers-label]", String(layers));
|
||
set("[data-cache-latent-bytes]", compactBytes(latent));
|
||
set("[data-cache-eager-bytes]", compactBytes(eager));
|
||
set("[data-cache-ratio]", `${data.cache.eager_over_latent_ratio.toFixed(2)}×`);
|
||
set("[data-cache-reduction]", `${(data.cache.latent_reduction_vs_eager * 100).toFixed(2)}%`);
|
||
};
|
||
all<HTMLInputElement | HTMLSelectElement>("[data-cache-batch], [data-cache-context], [data-cache-layers], [data-cache-dtype]")
|
||
.forEach((control) => {
|
||
control.addEventListener("input", renderCache);
|
||
control.addEventListener("change", renderCache);
|
||
});
|
||
renderCache();
|
||
|
||
const corpusLabels: Record<string, string> = {
|
||
english: "英文百科",
|
||
chinese: "中文新闻",
|
||
code: "Python 代码",
|
||
math: "小学数学",
|
||
};
|
||
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 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);
|
||
});
|
||
all<HTMLButtonElement>("[data-corpus-mode]").forEach((button) => {
|
||
button.setAttribute("aria-pressed", String(button.dataset.corpusMode === corpusMode));
|
||
});
|
||
set(
|
||
"[data-corpus-mode-note]",
|
||
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]",
|
||
`${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(...cohort.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 · ${cohort.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(...cohort.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);
|
||
cohort.domains.forEach((domain: string) => {
|
||
const header = document.createElement("b");
|
||
header.textContent = corpusLabels[domain];
|
||
cells.push(header);
|
||
});
|
||
cohort.domains.forEach((left: string) => {
|
||
const header = document.createElement("b");
|
||
header.textContent = corpusLabels[left];
|
||
cells.push(header);
|
||
cohort.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 = 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]
|
||
.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`,
|
||
);
|
||
|
||
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);
|
||
renderCorpus();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-corpus-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
corpusMode = button.dataset.corpusMode ?? "prompt_balanced";
|
||
renderCorpus();
|
||
});
|
||
});
|
||
renderCorpus();
|
||
|
||
let templateLayerNumber = 1;
|
||
let templateScope = "content_only";
|
||
let templateMode = "prompt_balanced";
|
||
const templateResult = (layerNumber: number, domain: string) => {
|
||
const layer = templateData.layers.find((item: any) => item.layer === layerNumber);
|
||
return {
|
||
layer,
|
||
comparison: layer.scopes[templateScope].modes[templateMode].rawToUser[domain],
|
||
suffix: layer.scopes.full_input.modes[templateMode].userToGeneration[domain],
|
||
contentSuffix: layer.scopes.content_only.modes[templateMode]
|
||
.userToGeneration[domain],
|
||
alignment: layer.alignment[domain],
|
||
};
|
||
};
|
||
const deltaClass = (ci: number[]) =>
|
||
ci[1] < 0 ? "down" : ci[0] > 0 ? "up" : "neutral";
|
||
const renderTemplate = () => {
|
||
all<HTMLButtonElement>("[data-template-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.templateLayer) === templateLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-template-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.templateScope === templateScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-template-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.templateMode === templateMode),
|
||
);
|
||
});
|
||
set(
|
||
"[data-template-note]",
|
||
templateScope === "content_only"
|
||
? "精确对齐内容:三种条件只保留相同相对字符跨度与相同 token ID;wrapper 和边界重切分 token 同时剔除。"
|
||
: "完整输入:BOS、User:、换行与 content 全部进入统计;它回答真实协议流量,不等同于内容本身的变化。",
|
||
);
|
||
|
||
const grid = one<HTMLElement>("[data-template-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...templateData.domains.map((domain: string) => {
|
||
const result = templateResult(templateLayerNumber, domain);
|
||
const cv = result.comparison.metrics.cv;
|
||
const card = document.createElement("article");
|
||
const label = document.createElement("span");
|
||
const values = document.createElement("b");
|
||
const delta = document.createElement("strong");
|
||
const ci = document.createElement("p");
|
||
const distance = document.createElement("small");
|
||
const stability = document.createElement("em");
|
||
label.textContent = corpusLabels[domain];
|
||
values.textContent = `${cv.before.toFixed(3)} → ${cv.after.toFixed(3)}`;
|
||
delta.textContent = `Δ ${signed(cv.delta_after_minus_before)}`;
|
||
delta.className = deltaClass(cv.delta_ci95);
|
||
ci.textContent = `paired 95% ${formatSignedCi(cv.delta_ci95)}`;
|
||
distance.textContent = `TV ${result.comparison.total_variation.point.toFixed(3)} · JSD ${result.comparison.js_divergence.point.toFixed(3)}`;
|
||
stability.textContent = `aligned ${result.alignment.aligned} · top-6 set exact ${(result.alignment.setExactRate * 100).toFixed(1)}% · J ${result.alignment.meanJaccard.toFixed(3)}`;
|
||
card.append(label, values, delta, ci, distance, stability);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const currentLayer = templateData.layers.find(
|
||
(item: any) => item.layer === templateLayerNumber,
|
||
);
|
||
set(
|
||
"[data-template-prefix-exact]",
|
||
`${currentLayer.invariant.ordered_topk_exact.toLocaleString()} / ${currentLayer.invariant.shared_prefix_tokens.toLocaleString()} EXACT · L${templateLayerNumber}`,
|
||
);
|
||
const contentSuffixZero = templateData.domains.every((domain: string) => {
|
||
const result = templateResult(templateLayerNumber, domain).contentSuffix;
|
||
return result.metrics.cv.delta_after_minus_before === 0
|
||
&& result.total_variation.point === 0
|
||
&& result.js_divergence.point === 0;
|
||
});
|
||
set(
|
||
"[data-template-content-zero]",
|
||
contentSuffixZero ? "4 / 4 DOMAINS · Δ 0" : "CHECK FAILED",
|
||
);
|
||
const suffixTv = templateData.domains.map(
|
||
(domain: string) =>
|
||
templateResult(templateLayerNumber, domain).suffix.total_variation.point,
|
||
);
|
||
set(
|
||
"[data-template-suffix-tv]",
|
||
`${Math.min(...suffixTv).toFixed(3)}–${Math.max(...suffixTv).toFixed(3)} · L${templateLayerNumber}`,
|
||
);
|
||
|
||
const depth = one<HTMLElement>("[data-template-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...templateData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
templateData.layers.forEach((layer: any) => {
|
||
const cv = layer.scopes[templateScope].modes[templateMode]
|
||
.rawToUser[domain].metrics.cv;
|
||
const cell = document.createElement("span");
|
||
cell.className = deltaClass(cv.delta_ci95);
|
||
cell.style.setProperty(
|
||
"--strength",
|
||
String(Math.min(1, Math.abs(cv.delta_after_minus_before) / 0.14)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(cv.delta_after_minus_before)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · Δ CV ${signed(cv.delta_after_minus_before)} · paired 95% ${formatSignedCi(cv.delta_ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-template-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
templateLayerNumber = Number(button.dataset.templateLayer);
|
||
renderTemplate();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-template-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
templateScope = button.dataset.templateScope ?? "content_only";
|
||
renderTemplate();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-template-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
templateMode = button.dataset.templateMode ?? "prompt_balanced";
|
||
renderTemplate();
|
||
});
|
||
});
|
||
renderTemplate();
|
||
|
||
let historyLayerNumber = 1;
|
||
let historyScope = "target_content";
|
||
let historyMode = "prompt_balanced";
|
||
let historyEffect = "interaction";
|
||
const historyEffectLabels: Record<string, string> = {
|
||
system_main: "SYSTEM MAIN",
|
||
fewshot_main: "ONE-SHOT MAIN",
|
||
interaction: "INTERACTION",
|
||
};
|
||
const historyConditionLabels: Record<string, string> = {
|
||
s0f0: "S0F0",
|
||
s1f0: "S1F0",
|
||
s0f1: "S0F1",
|
||
s1f1: "S1F1",
|
||
};
|
||
const renderHistory = () => {
|
||
all<HTMLButtonElement>("[data-history-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.historyLayer) === historyLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-history-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.historyScope === historyScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-history-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.historyMode === historyMode),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-history-effect]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.historyEffect === historyEffect),
|
||
);
|
||
});
|
||
set(
|
||
"[data-history-note]",
|
||
historyScope === "target_content"
|
||
? "目标内容:四格只保留相同相对字符跨度与相同 token ID;下方 Δ 均为 CV 的 source-paired 2×2 效应。"
|
||
: "完整输入:system、demo、EOS、目标与 Assistant: 全部进入统计;它回答协议流量,不等同于目标内容本身。",
|
||
);
|
||
|
||
const currentLayer = historyData.layers.find(
|
||
(item: any) => item.layer === historyLayerNumber,
|
||
);
|
||
const view = currentLayer.scopes[historyScope].modes[historyMode];
|
||
const grid = one<HTMLElement>("[data-history-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...historyData.domains.map((domain: string) => {
|
||
const card = document.createElement("article");
|
||
const label = document.createElement("span");
|
||
const cells = document.createElement("div");
|
||
const effect = view.factorial[domain][historyEffect];
|
||
const primary = document.createElement("strong");
|
||
const ci = document.createElement("p");
|
||
const allEffects = document.createElement("small");
|
||
const edges = document.createElement("em");
|
||
label.textContent = corpusLabels[domain];
|
||
cells.className = "history-cell-values";
|
||
["s0f0", "s1f0", "s0f1", "s1f1"].forEach((condition) => {
|
||
const cell = document.createElement("i");
|
||
const name = document.createElement("small");
|
||
const value = document.createElement("b");
|
||
name.textContent = historyConditionLabels[condition];
|
||
value.textContent = view.conditions[condition][domain].toFixed(3);
|
||
cell.append(name, value);
|
||
cells.append(cell);
|
||
});
|
||
primary.textContent = `${historyEffectLabels[historyEffect]} · Δ ${signed(effect.point)}`;
|
||
primary.className = deltaClass(effect.ci95);
|
||
ci.textContent = `source-paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
allEffects.textContent = [
|
||
`S ${signed(view.factorial[domain].system_main.point)}`,
|
||
`F ${signed(view.factorial[domain].fewshot_main.point)}`,
|
||
`I ${signed(view.factorial[domain].interaction.point)}`,
|
||
].join(" · ");
|
||
edges.textContent = [
|
||
`system TV at F0 ${view.comparisons.system_at_f0[domain].tv.point.toFixed(3)}`,
|
||
`at F1 ${view.comparisons.system_at_f1[domain].tv.point.toFixed(3)}`,
|
||
].join(" → ");
|
||
card.append(label, cells, primary, ci, allEffects, edges);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const bufferView = currentLayer.scopes.target_content
|
||
.modes.prompt_balanced;
|
||
const bufferGrid = one<HTMLElement>("[data-history-buffer-grid]");
|
||
if (bufferGrid) {
|
||
bufferGrid.replaceChildren(...historyData.domains.map((domain: string) => {
|
||
const card = document.createElement("article");
|
||
const label = document.createElement("span");
|
||
const tv = document.createElement("b");
|
||
const reduction = document.createElement("strong");
|
||
const stability = document.createElement("p");
|
||
const f0 = bufferView.comparisons.system_at_f0[domain].tv.point;
|
||
const f1 = bufferView.comparisons.system_at_f1[domain].tv.point;
|
||
const alignF0 = currentLayer.alignment[domain].system_at_f0;
|
||
const alignF1 = currentLayer.alignment[domain].system_at_f1;
|
||
label.textContent = corpusLabels[domain];
|
||
tv.textContent = `TV ${f0.toFixed(3)} → ${f1.toFixed(3)}`;
|
||
reduction.textContent = `↓ ${((1 - f1 / f0) * 100).toFixed(0)}%`;
|
||
stability.textContent = `top-6 set exact ${(alignF0.setExactRate * 100).toFixed(1)}% → ${(alignF1.setExactRate * 100).toFixed(1)}% · J ${alignF0.meanJaccard.toFixed(3)} → ${alignF1.meanJaccard.toFixed(3)}`;
|
||
card.append(label, tv, reduction, stability);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const effectTitles: Record<string, string> = {
|
||
system_main: "System main:平均两个 one-shot 水平后的 system 增量",
|
||
fewshot_main: "One-shot main:平均两个 system 水平后的示例增量",
|
||
interaction: "Interaction:两个处理是否可以简单相加",
|
||
};
|
||
set("[data-history-depth-title]", effectTitles[historyEffect]);
|
||
const depth = one<HTMLElement>("[data-history-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...historyData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
historyData.layers.forEach((layer: any) => {
|
||
const effect = layer.scopes[historyScope].modes[historyMode]
|
||
.factorial[domain][historyEffect];
|
||
const cell = document.createElement("span");
|
||
cell.className = deltaClass(effect.ci95);
|
||
cell.style.setProperty(
|
||
"--strength",
|
||
String(Math.min(1, Math.abs(effect.point) / 0.22)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(effect.point)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${historyEffectLabels[historyEffect]} Δ CV ${signed(effect.point)} · paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-history-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
historyLayerNumber = Number(button.dataset.historyLayer);
|
||
renderHistory();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-history-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
historyScope = button.dataset.historyScope ?? "target_content";
|
||
renderHistory();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-history-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
historyMode = button.dataset.historyMode ?? "prompt_balanced";
|
||
renderHistory();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-history-effect]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
historyEffect = button.dataset.historyEffect ?? "interaction";
|
||
renderHistory();
|
||
});
|
||
});
|
||
renderHistory();
|
||
|
||
let distanceLayerNumber = 1;
|
||
let distanceScope = "target_content";
|
||
let distanceMode = "prompt_balanced";
|
||
let distanceContrast = "filler_minus_none";
|
||
const distanceContrastLabels: Record<string, string> = {
|
||
filler_minus_none: "FILLER − NONE",
|
||
demo_minus_filler: "DEMO − FILLER",
|
||
};
|
||
const distanceHistoryLabels: Record<string, string> = {
|
||
none: "NONE",
|
||
filler: "FILLER",
|
||
demo: "DEMO",
|
||
};
|
||
const renderDistance = () => {
|
||
all<HTMLButtonElement>("[data-distance-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.distanceLayer) === distanceLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.distanceScope === distanceScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.distanceMode === distanceMode),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-contrast]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.distanceContrast === distanceContrast),
|
||
);
|
||
});
|
||
set(
|
||
"[data-distance-note]",
|
||
distanceScope === "target_content"
|
||
? "目标内容:六格只保留相同相对字符跨度与相同 token ID;TV 是两条真实 system edge 的分布距离。"
|
||
: "完整输入:system、filler/demo、角色、EOS、目标与 Assistant: 全部计入;它回答协议流量而非目标内容本身。",
|
||
);
|
||
|
||
const currentLayer = distanceData.layers.find(
|
||
(item: any) => item.layer === distanceLayerNumber,
|
||
);
|
||
const view = currentLayer.scopes[distanceScope].modes[distanceMode];
|
||
const grid = one<HTMLElement>("[data-distance-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...distanceData.domains.map((domain: string) => {
|
||
const data = view[domain];
|
||
const card = document.createElement("article");
|
||
const label = document.createElement("span");
|
||
const ladder = document.createElement("div");
|
||
const contrast = data.contrasts[distanceContrast].total_variation_delta;
|
||
const primary = document.createElement("strong");
|
||
const ci = document.createElement("p");
|
||
const stability = document.createElement("small");
|
||
const lexical = document.createElement("em");
|
||
const cv = document.createElement("u");
|
||
label.textContent = corpusLabels[domain];
|
||
ladder.className = "distance-tv-ladder";
|
||
["none", "filler", "demo"].forEach((history) => {
|
||
const cell = document.createElement("i");
|
||
const name = document.createElement("small");
|
||
const value = document.createElement("b");
|
||
name.textContent = distanceHistoryLabels[history];
|
||
value.textContent = data.distances[history].total_variation.point.toFixed(3);
|
||
cell.append(name, value);
|
||
ladder.append(cell);
|
||
});
|
||
primary.textContent = `${distanceContrastLabels[distanceContrast]} · ΔTV ${signed(contrast.point)}`;
|
||
primary.className = deltaClass(contrast.ci95);
|
||
ci.textContent = `source-paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||
const noneAlign = currentLayer.alignment[domain].system_none;
|
||
const fillerAlign = currentLayer.alignment[domain].system_filler;
|
||
const demoAlign = currentLayer.alignment[domain].system_demo;
|
||
stability.textContent = `target top-6 set exact ${(noneAlign.setExactRate * 100).toFixed(1)}% → ${(fillerAlign.setExactRate * 100).toFixed(1)}% → ${(demoAlign.setExactRate * 100).toFixed(1)}%`;
|
||
lexical.textContent = [
|
||
"filler↔demo TV",
|
||
`at S0 ${data.lexical.at_s0.total_variation.point.toFixed(3)}`,
|
||
`at S1 ${data.lexical.at_s1.total_variation.point.toFixed(3)}`,
|
||
].join(" · ");
|
||
cv.textContent = [
|
||
"system ΔCV",
|
||
...["none", "filler", "demo"].map(
|
||
(history) => `${distanceHistoryLabels[history]} ${signed(data.cvEdges[history].point)}`,
|
||
),
|
||
].join(" · ");
|
||
card.append(label, ladder, primary, ci, stability, lexical, cv);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const titles: Record<string, string> = {
|
||
filler_minus_none: "Filler − None:等长历史结构的第一个台阶",
|
||
demo_minus_filler: "Demo − Filler:固定协议字段后的文本替换台阶",
|
||
};
|
||
set("[data-distance-depth-title]", titles[distanceContrast]);
|
||
const depth = one<HTMLElement>("[data-distance-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...distanceData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
distanceData.layers.forEach((layer: any) => {
|
||
const contrast = layer.scopes[distanceScope].modes[distanceMode]
|
||
[domain].contrasts[distanceContrast].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.07)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(contrast.point)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${distanceContrastLabels[distanceContrast]} Δ system-edge TV ${signed(contrast.point)} · paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-distance-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
distanceLayerNumber = Number(button.dataset.distanceLayer);
|
||
renderDistance();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
distanceScope = button.dataset.distanceScope ?? "target_content";
|
||
renderDistance();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
distanceMode = button.dataset.distanceMode ?? "prompt_balanced";
|
||
renderDistance();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-distance-contrast]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
distanceContrast = button.dataset.distanceContrast ?? "filler_minus_none";
|
||
renderDistance();
|
||
});
|
||
});
|
||
renderDistance();
|
||
|
||
let boundaryLayerNumber = 1;
|
||
let boundaryScope = "target_content";
|
||
let boundaryMode = "prompt_balanced";
|
||
let boundaryContrast = "x_minus_eos";
|
||
const boundaryContrastLabels: Record<string, string> = {
|
||
x_minus_eos: "X − EOS",
|
||
period_minus_eos: "PERIOD − EOS",
|
||
newline_minus_eos: "NEWLINE − EOS",
|
||
};
|
||
const boundaryLevelLabels: Record<string, string> = {
|
||
eos: "EOS",
|
||
x: "X",
|
||
period: ".",
|
||
newline: "↵",
|
||
};
|
||
const boundaryReplacement = () => boundaryContrast.replace("_minus_eos", "");
|
||
const renderBoundary = () => {
|
||
all<HTMLButtonElement>("[data-boundary-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.boundaryLayer) === boundaryLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.boundaryScope === boundaryScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.boundaryMode === boundaryMode),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-contrast]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.boundaryContrast === boundaryContrast),
|
||
);
|
||
});
|
||
set(
|
||
"[data-boundary-note]",
|
||
boundaryScope === "target_content"
|
||
? "目标内容:八格只比较完全相同的后续内容 token;正 ΔTV 表示替换 EOS 后 system edge 更大,不表示能力更差。"
|
||
: "完整输入:system、历史、被替换边界、角色包装与目标全部计入;一个 ID 的后续效应会被整段协议流量稀释。",
|
||
);
|
||
|
||
const replacement = boundaryReplacement();
|
||
set(
|
||
"[data-boundary-track-token]",
|
||
boundaryLevelLabels[replacement],
|
||
);
|
||
const currentLayer = boundaryData.layers.find(
|
||
(item: any) => item.layer === boundaryLayerNumber,
|
||
);
|
||
const view = currentLayer.scopes[boundaryScope].modes[boundaryMode];
|
||
const grid = one<HTMLElement>("[data-boundary-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...boundaryData.domains.map((domain: string) => {
|
||
const data = view[domain];
|
||
const contrast = data.contrasts[boundaryContrast].total_variation_delta;
|
||
const direct = data.direct[replacement];
|
||
const interaction = direct.s1_minus_s0.total_variation_delta;
|
||
const eosAlignment = currentLayer.alignment[domain].system_eos;
|
||
const replacementAlignment = currentLayer.alignment[domain][`system_${replacement}`];
|
||
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 = "boundary-tv-ladder";
|
||
["eos", "x", "period", "newline"].forEach((boundary) => {
|
||
const cell = document.createElement("b");
|
||
const name = document.createElement("small");
|
||
const value = document.createElement("strong");
|
||
name.textContent = boundaryLevelLabels[boundary];
|
||
value.textContent = data.distances[boundary].total_variation.point.toFixed(3);
|
||
cell.classList.toggle("selected", boundary === replacement);
|
||
cell.classList.toggle("official", boundary === "eos");
|
||
cell.append(name, value);
|
||
ladder.append(cell);
|
||
});
|
||
primary.textContent = `${boundaryContrastLabels[boundaryContrast]} · ΔTV ${signed(contrast.point)}`;
|
||
primary.className = deltaClass(contrast.ci95);
|
||
ci.textContent = `source-paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||
stability.textContent = `system top-6 set exact EOS ${(eosAlignment.setExactRate * 100).toFixed(1)}% · ${boundaryLevelLabels[replacement]} ${(replacementAlignment.setExactRate * 100).toFixed(1)}% · J ${eosAlignment.meanJaccard.toFixed(3)} → ${replacementAlignment.meanJaccard.toFixed(3)}`;
|
||
substitution.textContent = `direct EOS↔${boundaryLevelLabels[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[boundaryContrast];
|
||
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> = {
|
||
x_minus_eos: "x − EOS:普通内容 token 替换官方边界",
|
||
period_minus_eos: "句点 − EOS:普通标点 token 替换官方边界",
|
||
newline_minus_eos: "换行 − EOS:普通格式 token 替换官方边界",
|
||
};
|
||
set("[data-boundary-depth-title]", titles[boundaryContrast]);
|
||
const depth = one<HTMLElement>("[data-boundary-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...boundaryData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
boundaryData.layers.forEach((layer: any) => {
|
||
const contrast = layer.scopes[boundaryScope].modes[boundaryMode]
|
||
[domain].contrasts[boundaryContrast].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.04)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(contrast.point)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${boundaryContrastLabels[boundaryContrast]} Δ system-edge TV ${signed(contrast.point)} · paired 95% ${formatSignedCi(contrast.ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-boundary-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
boundaryLayerNumber = Number(button.dataset.boundaryLayer);
|
||
renderBoundary();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
boundaryScope = button.dataset.boundaryScope ?? "target_content";
|
||
renderBoundary();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
boundaryMode = button.dataset.boundaryMode ?? "prompt_balanced";
|
||
renderBoundary();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-boundary-contrast]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
boundaryContrast = button.dataset.boundaryContrast ?? "x_minus_eos";
|
||
renderBoundary();
|
||
});
|
||
});
|
||
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();
|
||
|
||
let specialLayerNumber = 1;
|
||
let specialScope = "target_content";
|
||
let specialMode = "prompt_balanced";
|
||
let specialContrast = "bos_minus_eos";
|
||
const specialLevelLabels: Record<string, string> = {
|
||
eos: "EOS",
|
||
bos: "BOS",
|
||
x: "x",
|
||
period: ".",
|
||
};
|
||
const specialContrastLabels: Record<string, string> = {
|
||
bos_minus_eos: "BOS − EOS",
|
||
x_minus_eos: "x − EOS",
|
||
period_minus_eos: ". − EOS",
|
||
family: "ORDINARY − SPECIAL",
|
||
};
|
||
const specialReplacement = () => specialContrast.replace("_minus_eos", "");
|
||
const specialEffect = (view: any) => specialContrast === "family"
|
||
? view.family.total_variation.ordinary_minus_special
|
||
: view.contrasts[specialContrast].total_variation_delta;
|
||
const renderSpecial = () => {
|
||
all<HTMLButtonElement>("[data-special-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.specialLayer) === specialLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-special-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.specialScope === specialScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-special-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.specialMode === specialMode),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-special-contrast]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.specialContrast === specialContrast),
|
||
);
|
||
});
|
||
set(
|
||
"[data-special-note]",
|
||
specialScope === "target_content"
|
||
? specialContrast === "family"
|
||
? "目标内容:ordinary − special 是 mean(x, .) − mean(EOS, BOS),只描述这四个 ID,不代表普通词元总体。"
|
||
: "目标内容:正 ΔTV 表示替换边界后 system edge 更大;direct TV 另记这个单 ID 本身造成的后续路由移动。"
|
||
: "完整输入:被替换的边界 token 自身也进入聚合;它是稳健性账,不是下游因果主口径。",
|
||
);
|
||
|
||
const currentLayer = specialData.layers.find(
|
||
(item: any) => item.layer === specialLayerNumber,
|
||
);
|
||
const view = currentLayer.scopes[specialScope].modes[specialMode];
|
||
const replacement = specialReplacement();
|
||
const grid = one<HTMLElement>("[data-special-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...specialData.domains.map((domain: string) => {
|
||
const result = view[domain];
|
||
const effect = specialEffect(result);
|
||
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 detail = document.createElement("em");
|
||
const stability = document.createElement("small");
|
||
const cv = document.createElement("i");
|
||
label.textContent = corpusLabels[domain];
|
||
ladder.className = "special-tv-ladder";
|
||
["eos", "bos", "x", "period"].forEach((level) => {
|
||
const cell = document.createElement("b");
|
||
const name = document.createElement("small");
|
||
const value = document.createElement("strong");
|
||
name.textContent = specialLevelLabels[level];
|
||
value.textContent = result.distances[level].total_variation.point.toFixed(3);
|
||
cell.classList.toggle("official", level === "eos");
|
||
cell.classList.toggle(
|
||
"selected",
|
||
specialContrast === "family"
|
||
? ["bos", "x", "period"].includes(level)
|
||
: level === replacement,
|
||
);
|
||
cell.append(name, value);
|
||
ladder.append(cell);
|
||
});
|
||
primary.textContent = `${specialContrastLabels[specialContrast]} · ΔTV ${signed(effect.point)}`;
|
||
primary.className = deltaClass(effect.ci95);
|
||
ci.textContent = `source-paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
if (specialContrast === "family") {
|
||
const family = result.family.total_variation;
|
||
detail.textContent = `special mean ${family.special_mean.point.toFixed(3)} · selected ordinary mean ${family.ordinary_control_mean.point.toFixed(3)}`;
|
||
stability.textContent = "2-vs-2 descriptive family summary · complete special inventory, two selected ordinary controls";
|
||
cv.textContent = "CV family contrast 未定义;避免把两个具体 ordinary IDs 冒充总体类别。";
|
||
} else {
|
||
const direct = result.direct[replacement];
|
||
const alignS0 = currentLayer.alignment[domain][`${replacement}_at_s0`];
|
||
const alignS1 = currentLayer.alignment[domain][`${replacement}_at_s1`];
|
||
detail.textContent = `direct EOS↔${specialLevelLabels[replacement]} TV · S0 ${direct.at_s0.total_variation.point.toFixed(3)} · S1 ${direct.at_s1.total_variation.point.toFixed(3)} · Δ ${signed(direct.s1_minus_s0.total_variation_delta.point)}`;
|
||
stability.textContent = `target top-6 set exact · S0 ${(alignS0.setExactRate * 100).toFixed(1)}% · S1 ${(alignS1.setExactRate * 100).toFixed(1)}% · J ${alignS0.meanJaccard.toFixed(3)} / ${alignS1.meanJaccard.toFixed(3)}`;
|
||
const cvEffect = result.cvContrasts[specialContrast];
|
||
cv.textContent = `system-edge ΔCV ${signed(cvEffect.point)} · 95% ${formatSignedCi(cvEffect.ci95)}`;
|
||
}
|
||
card.append(label, ladder, primary, ci, detail, stability, cv);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const titles: Record<string, string> = {
|
||
bos_minus_eos: "BOS − EOS:同为 special,路由模式仍不同",
|
||
x_minus_eos: "x − EOS:选定普通内容 token 对照",
|
||
period_minus_eos: "句点 − EOS:选定普通标点 token 对照",
|
||
family: "mean(x, .) − mean(EOS, BOS):仅描述四个 ID",
|
||
};
|
||
set("[data-special-depth-title]", titles[specialContrast]);
|
||
const depth = one<HTMLElement>("[data-special-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...specialData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
specialData.layers.forEach((layer: any) => {
|
||
const result = layer.scopes[specialScope].modes[specialMode][domain];
|
||
const effect = specialEffect(result);
|
||
const cell = document.createElement("span");
|
||
cell.className = deltaClass(effect.ci95);
|
||
cell.style.setProperty(
|
||
"--strength",
|
||
String(Math.min(1, Math.abs(effect.point) / 0.04)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(effect.point)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${specialContrastLabels[specialContrast]} ΔTV ${signed(effect.point)} · paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-special-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
specialLayerNumber = Number(button.dataset.specialLayer);
|
||
renderSpecial();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-special-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
specialScope = button.dataset.specialScope ?? "target_content";
|
||
renderSpecial();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-special-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
specialMode = button.dataset.specialMode ?? "prompt_balanced";
|
||
renderSpecial();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-special-contrast]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
specialContrast = button.dataset.specialContrast ?? "bos_minus_eos";
|
||
renderSpecial();
|
||
});
|
||
});
|
||
renderSpecial();
|
||
|
||
let roleBlockLayerNumber = 1;
|
||
let roleBlockScope = "target_content";
|
||
let roleBlockMode = "prompt_balanced";
|
||
let roleBlockEffect = "head_main";
|
||
const roleBlockLevelLabels: Record<string, string> = {
|
||
user_colon: "U:",
|
||
assistant_colon: "A:",
|
||
user_x: "Ux",
|
||
assistant_x: "Ax",
|
||
};
|
||
const roleBlockEffectLabels: Record<string, string> = {
|
||
head_main: "HEAD MAIN",
|
||
delimiter_main: "DELIMITER MAIN",
|
||
head_by_delimiter: "HEAD × DELIMITER",
|
||
};
|
||
const roleBlockDirectKeys: Record<string, string[]> = {
|
||
head_main: ["head_at_colon", "head_at_x"],
|
||
delimiter_main: ["delimiter_at_user", "delimiter_at_assistant"],
|
||
};
|
||
const roleBlockDirectLabels: Record<string, string> = {
|
||
head_at_colon: "head @ colon",
|
||
head_at_x: "head @ x",
|
||
delimiter_at_user: "delimiter @ User",
|
||
delimiter_at_assistant: "delimiter @ Assistant",
|
||
};
|
||
const renderRoleBlock = () => {
|
||
all<HTMLButtonElement>("[data-role-block-layer]").forEach((button) => {
|
||
button.classList.toggle(
|
||
"active",
|
||
Number(button.dataset.roleBlockLayer) === roleBlockLayerNumber,
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-scope]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.roleBlockScope === roleBlockScope),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-mode]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.roleBlockMode === roleBlockMode),
|
||
);
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-effect]").forEach((button) => {
|
||
button.setAttribute(
|
||
"aria-pressed",
|
||
String(button.dataset.roleBlockEffect === roleBlockEffect),
|
||
);
|
||
});
|
||
const notes: Record<string, string> = {
|
||
head_main: "head main:平均跨过两个 delimiter,User→Assistant 对 system-edge TV 的影响。",
|
||
delimiter_main: "delimiter main:平均跨过两个 head,冒号→x 对 system-edge TV 的影响。",
|
||
head_by_delimiter: "interaction:(Assistant x−User x) − (Assistant:−User:);head 的作用是否依赖 delimiter。",
|
||
};
|
||
set("[data-role-block-note]", notes[roleBlockEffect]);
|
||
|
||
const currentLayer = roleBlockData.layers.find(
|
||
(item: any) => item.layer === roleBlockLayerNumber,
|
||
);
|
||
const view = currentLayer.scopes[roleBlockScope].modes[roleBlockMode];
|
||
const grid = one<HTMLElement>("[data-role-block-domain-grid]");
|
||
if (grid) {
|
||
grid.replaceChildren(...roleBlockData.domains.map((domain: string) => {
|
||
const result = view[domain];
|
||
const effect = (
|
||
result.factorial.systemEdgeDistanceEffects.total_variation
|
||
[roleBlockEffect]
|
||
);
|
||
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 direct = document.createElement("em");
|
||
const dependency = document.createElement("u");
|
||
const cv = document.createElement("i");
|
||
const stability = document.createElement("small");
|
||
label.textContent = corpusLabels[domain];
|
||
ladder.className = "role-block-tv-ladder";
|
||
["user_colon", "assistant_colon", "user_x", "assistant_x"].forEach((level) => {
|
||
const cell = document.createElement("b");
|
||
const name = document.createElement("small");
|
||
const value = document.createElement("strong");
|
||
name.textContent = roleBlockLevelLabels[level];
|
||
value.textContent = result.distances[level].total_variation.point.toFixed(3);
|
||
cell.classList.toggle("official", level === "user_colon");
|
||
cell.append(name, value);
|
||
ladder.append(cell);
|
||
});
|
||
primary.textContent = `${roleBlockEffectLabels[roleBlockEffect]} · ΔTV ${signed(effect.point)}`;
|
||
primary.className = deltaClass(effect.ci95);
|
||
ci.textContent = `source-paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
if (roleBlockEffect === "head_by_delimiter") {
|
||
const headDependency = (
|
||
result.factorial.directEffectDependencies
|
||
.delimiter_dependence_of_head_direct
|
||
);
|
||
const s0 = headDependency.at_s0.total_variation_delta;
|
||
const s1 = headDependency.at_s1.total_variation_delta;
|
||
const did = (
|
||
headDependency.s1_minus_s0
|
||
.total_variation_difference_in_differences
|
||
);
|
||
direct.textContent = `direct head@x − head@colon · S0 ${signed(s0.point)} · S1 ${signed(s1.point)}`;
|
||
dependency.textContent = `system DiD ${signed(did.point)} · 95% ${formatSignedCi(did.ci95)}`;
|
||
const align = currentLayer.alignment[domain].head_at_x_s0;
|
||
stability.textContent = `head@x target top-6 set exact ${(align.setExactRate * 100).toFixed(1)}% · J ${align.meanJaccard.toFixed(3)}`;
|
||
} else {
|
||
const [firstKey, secondKey] = roleBlockDirectKeys[roleBlockEffect];
|
||
const first = result.factorial.directFactorEdges[firstKey];
|
||
const second = result.factorial.directFactorEdges[secondKey];
|
||
direct.textContent = `${roleBlockDirectLabels[firstKey]} TV · S0 ${first.at_s0.total_variation.point.toFixed(3)} · S1 ${first.at_s1.total_variation.point.toFixed(3)}`;
|
||
dependency.textContent = `${roleBlockDirectLabels[secondKey]} TV · S0 ${second.at_s0.total_variation.point.toFixed(3)} · S1 ${second.at_s1.total_variation.point.toFixed(3)}`;
|
||
const alignmentKey = roleBlockEffect === "head_main"
|
||
? "assistant_colon_at_s0"
|
||
: "user_x_at_s0";
|
||
const align = currentLayer.alignment[domain][alignmentKey];
|
||
stability.textContent = `representative direct target top-6 set exact ${(align.setExactRate * 100).toFixed(1)}% · J ${align.meanJaccard.toFixed(3)}`;
|
||
}
|
||
const cvEffect = (
|
||
result.factorial.metricSystemEdgeEffects.cv[roleBlockEffect]
|
||
);
|
||
cv.textContent = `system-edge ΔCV ${signed(cvEffect.point)} · 95% ${formatSignedCi(cvEffect.ci95)}`;
|
||
card.append(label, ladder, primary, ci, direct, dependency, stability, cv);
|
||
return card;
|
||
}));
|
||
}
|
||
|
||
const titles: Record<string, string> = {
|
||
head_main: "head main:User→Assistant 是否统一改变 system edge",
|
||
delimiter_main: "delimiter main:冒号→x 是否统一改变 system edge",
|
||
head_by_delimiter: "interaction:head 的作用是否依赖 delimiter",
|
||
};
|
||
set("[data-role-block-depth-title]", titles[roleBlockEffect]);
|
||
const depth = one<HTMLElement>("[data-role-block-depth-map]");
|
||
if (depth) {
|
||
depth.replaceChildren(...roleBlockData.domains.map((domain: string) => {
|
||
const row = document.createElement("div");
|
||
const label = document.createElement("b");
|
||
label.textContent = corpusLabels[domain];
|
||
row.append(label);
|
||
roleBlockData.layers.forEach((layer: any) => {
|
||
const effect = (
|
||
layer.scopes[roleBlockScope].modes[roleBlockMode][domain]
|
||
.factorial.systemEdgeDistanceEffects.total_variation
|
||
[roleBlockEffect]
|
||
);
|
||
const cell = document.createElement("span");
|
||
cell.className = deltaClass(effect.ci95);
|
||
cell.style.setProperty(
|
||
"--strength",
|
||
String(Math.min(1, Math.abs(effect.point) / 0.015)),
|
||
);
|
||
cell.textContent = `L${layer.layer} ${signed(effect.point)}`;
|
||
cell.title = `${corpusLabels[domain]} · L${layer.layer} · ${roleBlockEffectLabels[roleBlockEffect]} ΔTV ${signed(effect.point)} · paired 95% ${formatSignedCi(effect.ci95)}`;
|
||
row.append(cell);
|
||
});
|
||
return row;
|
||
}));
|
||
}
|
||
};
|
||
all<HTMLButtonElement>("[data-role-block-layer]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
roleBlockLayerNumber = Number(button.dataset.roleBlockLayer);
|
||
renderRoleBlock();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-scope]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
roleBlockScope = button.dataset.roleBlockScope ?? "target_content";
|
||
renderRoleBlock();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-mode]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
roleBlockMode = button.dataset.roleBlockMode ?? "prompt_balanced";
|
||
renderRoleBlock();
|
||
});
|
||
});
|
||
all<HTMLButtonElement>("[data-role-block-effect]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
roleBlockEffect = button.dataset.roleBlockEffect ?? "head_main";
|
||
renderRoleBlock();
|
||
});
|
||
});
|
||
renderRoleBlock();
|
||
});
|
||
</script>
|
||
|
||
<style>
|
||
.artifact-lab {
|
||
--ink: #202027;
|
||
--paper: #f4f0e7;
|
||
--blue: #62699b;
|
||
--teal: #39786e;
|
||
--amber: #ba762c;
|
||
--red: #a14d4d;
|
||
margin: 2rem 0 0;
|
||
border: 1px solid rgba(32, 32, 39, .22);
|
||
background: var(--paper);
|
||
color: var(--ink);
|
||
box-shadow: 10px 12px 0 rgba(32, 32, 39, .07);
|
||
overflow: hidden;
|
||
}
|
||
.artifact-head {
|
||
display: grid;
|
||
grid-template-columns: minmax(0, 1.05fr) minmax(18rem, .95fr);
|
||
gap: 2rem;
|
||
padding: 2rem;
|
||
background:
|
||
linear-gradient(115deg, rgba(98, 105, 155, .17), transparent 45%),
|
||
repeating-linear-gradient(90deg, transparent 0 39px, rgba(32,32,39,.035) 39px 40px);
|
||
border-bottom: 1px solid rgba(32, 32, 39, .18);
|
||
}
|
||
.artifact-head > div > p,
|
||
.panel-lead span,
|
||
.micro-title,
|
||
.heat-head span,
|
||
.aggregate-card span,
|
||
.jaccard-block span,
|
||
.observed-cache span,
|
||
.artifact-identity span,
|
||
.absorb-algebra span,
|
||
.absorb-cache-flow span,
|
||
.absorb-metrics span,
|
||
.kernel-contract span,
|
||
.execution-split span,
|
||
.repro-gate span,
|
||
.dependency-split span,
|
||
.checksum-grid span,
|
||
.corpus-ledger span,
|
||
.corpus-controls > div > span,
|
||
.corpus-heat-head span,
|
||
.corpus-comparison span,
|
||
.corpus-findings span,
|
||
.length-sensitivity span,
|
||
.template-ledger span,
|
||
.template-protocol > article > span,
|
||
.template-controls > div > span,
|
||
.template-domain-grid > :global(article > span),
|
||
.template-negative-control span,
|
||
.template-depth span,
|
||
.history-ledger span,
|
||
.history-factorial span,
|
||
.history-controls > div > span,
|
||
.history-domain-grid > :global(article > span),
|
||
.history-buffer-summary span,
|
||
.history-buffer span,
|
||
.history-depth span,
|
||
.distance-protocol span,
|
||
.distance-controls > div > span,
|
||
.distance-domain-grid > :global(article > span),
|
||
.distance-depth span,
|
||
.distance-interpretation span {
|
||
margin: 0;
|
||
color: var(--blue);
|
||
font: 700 .69rem/1.3 var(--font-mono);
|
||
letter-spacing: .1em;
|
||
}
|
||
.artifact-head h3 {
|
||
margin: .55rem 0 0;
|
||
max-width: 14ch;
|
||
font: 720 clamp(1.65rem, 3.1vw, 2.8rem)/.99 var(--font-display);
|
||
letter-spacing: -.045em;
|
||
}
|
||
.artifact-head > p {
|
||
align-self: end;
|
||
margin: 0;
|
||
color: rgba(32, 32, 39, .72);
|
||
font-size: .94rem;
|
||
line-height: 1.75;
|
||
}
|
||
.artifact-status {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
border-bottom: 1px solid rgba(32, 32, 39, .16);
|
||
background: #ece6da;
|
||
}
|
||
.artifact-status span {
|
||
display: grid;
|
||
grid-template-columns: 1.75rem auto;
|
||
align-items: center;
|
||
gap: .05rem .55rem;
|
||
padding: .8rem 1rem;
|
||
border-right: 1px solid rgba(32, 32, 39, .12);
|
||
color: rgba(32,32,39,.65);
|
||
font-size: .69rem;
|
||
}
|
||
.artifact-status span:last-child { border-right: 0; }
|
||
.artifact-status i {
|
||
grid-row: 1 / 3;
|
||
display: grid;
|
||
place-items: center;
|
||
width: 1.65rem;
|
||
height: 1.65rem;
|
||
border-radius: 50%;
|
||
background: var(--ink);
|
||
color: var(--paper);
|
||
font: 800 .7rem/1 var(--font-mono);
|
||
}
|
||
.artifact-status span:nth-child(1) i { background: var(--teal); }
|
||
.artifact-status span:nth-child(2) i { background: var(--blue); }
|
||
.artifact-status span:nth-child(3) i { background: var(--amber); }
|
||
.artifact-status span:nth-child(4) i { background: var(--red); }
|
||
.artifact-status b { color: var(--ink); font-size: .72rem; }
|
||
.artifact-tabs {
|
||
display: grid;
|
||
grid-template-columns: repeat(7, 1fr);
|
||
background: var(--ink);
|
||
}
|
||
.artifact-tabs button {
|
||
display: grid;
|
||
grid-template-columns: 1.45rem minmax(0, 1fr);
|
||
gap: .08rem .45rem;
|
||
min-width: 0;
|
||
padding: .9rem .6rem;
|
||
border: 0;
|
||
border-right: 1px solid rgba(255,255,255,.13);
|
||
background: transparent;
|
||
color: rgba(255,255,255,.58);
|
||
text-align: left;
|
||
cursor: pointer;
|
||
}
|
||
.artifact-tabs button:last-child { border-right: 0; }
|
||
.artifact-tabs button[aria-selected="true"] { background: var(--blue); color: white; }
|
||
.artifact-tabs button:focus-visible { outline: 3px solid #fff; outline-offset: -4px; }
|
||
.artifact-tabs span {
|
||
grid-row: 1 / 3;
|
||
color: currentColor;
|
||
font: 700 .7rem/1 var(--font-mono);
|
||
}
|
||
.artifact-tabs b { min-width: 0; font-size: .79rem; overflow-wrap: anywhere; }
|
||
.artifact-tabs small { min-width: 0; font: .58rem/1.2 var(--font-mono); overflow-wrap: anywhere; }
|
||
.artifact-panel { padding: 1.6rem; }
|
||
.artifact-panel[hidden] { display: none; }
|
||
.panel-lead {
|
||
display: grid;
|
||
grid-template-columns: minmax(0, 1fr) minmax(18rem, .9fr);
|
||
gap: 2rem;
|
||
align-items: end;
|
||
margin-bottom: 1.35rem;
|
||
}
|
||
.panel-lead h4 {
|
||
margin: .35rem 0 0;
|
||
font: 700 clamp(1.25rem, 2vw, 1.7rem)/1.1 var(--font-display);
|
||
letter-spacing: -.025em;
|
||
}
|
||
.panel-lead p { margin: 0; color: rgba(32,32,39,.68); font-size: .83rem; line-height: 1.65; }
|
||
.route-controls,
|
||
.cache-controls {
|
||
display: grid;
|
||
grid-template-columns: .7fr 1fr 1.45fr;
|
||
border: 1px solid rgba(32,32,39,.17);
|
||
background: #fffdf8;
|
||
}
|
||
.cache-controls { grid-template-columns: repeat(4, 1fr); }
|
||
.route-controls label,
|
||
.cache-controls label {
|
||
display: grid;
|
||
gap: .45rem;
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.13);
|
||
}
|
||
.route-controls label:last-child,
|
||
.cache-controls label:last-child { border-right: 0; }
|
||
.route-controls label span,
|
||
.cache-controls label span {
|
||
color: rgba(32,32,39,.58);
|
||
font: 650 .65rem/1 var(--font-mono);
|
||
text-transform: uppercase;
|
||
}
|
||
.route-controls select,
|
||
.cache-controls select {
|
||
min-width: 0;
|
||
width: 100%;
|
||
border: 0;
|
||
border-bottom: 1px solid rgba(32,32,39,.28);
|
||
background: transparent;
|
||
color: var(--ink);
|
||
font: 650 .78rem/1.3 var(--font-mono);
|
||
}
|
||
.cache-controls input { width: 100%; accent-color: var(--blue); }
|
||
.token-context {
|
||
display: grid;
|
||
grid-template-columns: 5rem 1fr;
|
||
gap: .75rem;
|
||
margin-top: .65rem;
|
||
padding: .7rem .85rem;
|
||
background: rgba(98,105,155,.08);
|
||
}
|
||
.token-context span { color: var(--blue); font: 700 .65rem/1.5 var(--font-mono); }
|
||
.token-context p { margin: 0; font-size: .78rem; line-height: 1.5; }
|
||
.route-stage {
|
||
display: grid;
|
||
grid-template-columns: .7fr auto 2fr auto .9fr;
|
||
gap: .8rem;
|
||
align-items: center;
|
||
margin-top: 1rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
background:
|
||
radial-gradient(circle at 35% 50%, rgba(98,105,155,.12), transparent 32%),
|
||
#e8e2d7;
|
||
}
|
||
.route-stage > i { color: rgba(32,32,39,.35); font: 400 1.35rem/1 var(--font-display); }
|
||
.token-card,
|
||
.sum-card {
|
||
display: grid;
|
||
gap: .3rem;
|
||
min-width: 0;
|
||
padding: .9rem;
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.token-card span,
|
||
.sum-card span { color: rgba(255,255,255,.55); font: 650 .61rem/1 var(--font-mono); }
|
||
.token-card strong {
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
font: 750 1.35rem/1.2 var(--font-display);
|
||
}
|
||
.token-card small,
|
||
.sum-card small { color: rgba(255,255,255,.58); font: .62rem/1.35 var(--font-mono); }
|
||
.sum-card { background: var(--teal); }
|
||
.sum-card strong { font: 750 1.8rem/1 var(--font-display); }
|
||
.micro-title { display: block; margin-bottom: .45rem; }
|
||
.chosen-experts { display: grid; grid-template-columns: repeat(6, 1fr); gap: .35rem; }
|
||
.chosen-experts :global(article) {
|
||
display: grid;
|
||
justify-items: center;
|
||
gap: .2rem;
|
||
padding: .55rem .2rem;
|
||
border: 1px solid rgba(32,32,39,.17);
|
||
background: #fffdf8;
|
||
}
|
||
.chosen-experts :global(span) { color: rgba(32,32,39,.44); font: .56rem/1 var(--font-mono); }
|
||
.chosen-experts :global(b) { font: 750 .92rem/1 var(--font-mono); }
|
||
.chosen-experts :global(small) { color: var(--blue); font: 650 .57rem/1 var(--font-mono); }
|
||
.heat-head {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1.2fr;
|
||
gap: 1rem;
|
||
align-items: end;
|
||
margin: 1.2rem 0 .55rem;
|
||
}
|
||
.heat-head div { display: grid; gap: .2rem; }
|
||
.heat-head b { font-size: .8rem; }
|
||
.heat-head p { margin: 0; color: rgba(32,32,39,.6); font-size: .7rem; line-height: 1.5; text-align: right; }
|
||
.expert-heatmap {
|
||
display: grid;
|
||
grid-template-columns: repeat(16, 1fr);
|
||
gap: 3px;
|
||
}
|
||
.expert-heatmap > :global(span) {
|
||
display: grid;
|
||
justify-items: center;
|
||
gap: .15rem;
|
||
padding: .45rem .1rem;
|
||
background: color-mix(in srgb, var(--blue) calc(var(--load) * 78%), #e6dfd3);
|
||
color: color-mix(in srgb, white calc(var(--load) * 100%), var(--ink));
|
||
outline: 0 solid var(--amber);
|
||
transition: transform .15s ease;
|
||
}
|
||
.expert-heatmap > :global(span.selected) { outline-width: 2px; z-index: 1; transform: scale(1.05); }
|
||
.expert-heatmap :global(b) { font: 700 .58rem/1 var(--font-mono); }
|
||
.expert-heatmap :global(small) { font: .55rem/1 var(--font-mono); }
|
||
.route-metrics,
|
||
.cache-ratio,
|
||
.load-lessons,
|
||
.absorb-metrics,
|
||
.artifact-identity,
|
||
.checksum-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.route-metrics article,
|
||
.cache-ratio article,
|
||
.load-lessons article,
|
||
.absorb-metrics article,
|
||
.artifact-identity article,
|
||
.checksum-grid article {
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.route-metrics article:last-child,
|
||
.cache-ratio article:last-child,
|
||
.load-lessons article:last-child,
|
||
.absorb-metrics article:last-child,
|
||
.artifact-identity article:last-child,
|
||
.checksum-grid article:last-child { border-right: 0; }
|
||
.route-metrics span,
|
||
.cache-ratio span,
|
||
.load-lessons span,
|
||
.absorb-metrics span {
|
||
display: block;
|
||
color: var(--blue);
|
||
font: 700 .61rem/1 var(--font-mono);
|
||
}
|
||
.route-metrics b,
|
||
.cache-ratio b,
|
||
.absorb-metrics b { display: block; margin-top: .35rem; font: 750 1.25rem/1 var(--font-display); }
|
||
.route-metrics p,
|
||
.cache-ratio p,
|
||
.load-lessons p,
|
||
.absorb-metrics p { margin: .3rem 0 0; color: rgba(32,32,39,.56); font-size: .65rem; line-height: 1.45; }
|
||
.artifact-boundary {
|
||
display: grid;
|
||
grid-template-columns: 11rem 1fr;
|
||
gap: 1rem;
|
||
margin-top: 1rem;
|
||
padding: .85rem 1rem;
|
||
border-left: 4px solid var(--red);
|
||
background: rgba(161,77,77,.08);
|
||
}
|
||
.artifact-boundary b { color: var(--red); font: 750 .68rem/1.4 var(--font-mono); }
|
||
.artifact-boundary p { margin: 0; font-size: .74rem; line-height: 1.55; }
|
||
.layer-switch { display: flex; gap: .35rem; margin-bottom: .7rem; }
|
||
.layer-switch button {
|
||
width: 3rem;
|
||
padding: .55rem;
|
||
border: 1px solid rgba(32,32,39,.22);
|
||
background: #fffdf8;
|
||
color: var(--ink);
|
||
font: 700 .72rem/1 var(--font-mono);
|
||
cursor: pointer;
|
||
}
|
||
.layer-switch button.active { border-color: var(--blue); background: var(--blue); color: white; }
|
||
.aggregate-card {
|
||
display: grid;
|
||
grid-template-columns: .8fr 1.2fr;
|
||
gap: 1rem;
|
||
padding: 1rem;
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.aggregate-card strong { display: block; margin-top: .4rem; font: 720 1.4rem/1 var(--font-display); }
|
||
.aggregate-card strong,
|
||
.aggregate-card strong b { color: white; }
|
||
.aggregate-card p { margin: .5rem 0 0; color: rgba(255,255,255,.55); font-size: .7rem; }
|
||
.load-dials { display: grid; grid-template-columns: repeat(3, 1fr); gap: .8rem; }
|
||
.load-dials article { display: grid; gap: .35rem; }
|
||
.load-dials b { font: 700 1rem/1 var(--font-mono); }
|
||
.load-dials i,
|
||
.jaccard-block i {
|
||
display: block;
|
||
height: 5px;
|
||
background: rgba(255,255,255,.16);
|
||
overflow: hidden;
|
||
}
|
||
.load-dials em,
|
||
.jaccard-block em {
|
||
display: block;
|
||
width: calc(var(--fraction) * 100%);
|
||
height: 100%;
|
||
background: #cbc5ef;
|
||
}
|
||
.load-table { margin-top: .8rem; border: 1px solid rgba(32,32,39,.16); overflow-x: auto; }
|
||
.load-table .head,
|
||
.load-table :global([data-load-rows] > div) {
|
||
display: grid;
|
||
grid-template-columns: 1.5fr repeat(4, .62fr) .85fr;
|
||
min-width: 650px;
|
||
}
|
||
.load-table .head { background: #dfd8cb; }
|
||
.load-table .head b,
|
||
.load-table :global([data-load-rows] span),
|
||
.load-table :global([data-load-rows] b) {
|
||
padding: .6rem;
|
||
border-right: 1px solid rgba(32,32,39,.1);
|
||
border-bottom: 1px solid rgba(32,32,39,.1);
|
||
font: 650 .66rem/1.3 var(--font-mono);
|
||
}
|
||
.load-table :global([data-load-rows] > div.aggregate) { background: rgba(98,105,155,.09); }
|
||
.jaccard-block {
|
||
display: grid;
|
||
grid-template-columns: .75fr 1.25fr;
|
||
gap: 1.2rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #ebe5da;
|
||
}
|
||
.jaccard-block h5 { margin: .35rem 0; font: 700 1rem/1.1 var(--font-display); }
|
||
.jaccard-block p { margin: 0; color: rgba(32,32,39,.58); font-size: .68rem; line-height: 1.45; }
|
||
.jaccard-block :global([data-load-jaccard]) { display: grid; gap: .45rem; }
|
||
.jaccard-block :global([data-load-jaccard] article) { display: grid; grid-template-columns: 1.5fr 1fr 2.5rem; gap: .5rem; align-items: center; }
|
||
.jaccard-block :global([data-load-jaccard] article span) { color: var(--ink); letter-spacing: 0; font-size: .59rem; }
|
||
.jaccard-block :global([data-load-jaccard] i) {
|
||
display: block;
|
||
height: 5px;
|
||
overflow: hidden;
|
||
background: rgba(32,32,39,.12);
|
||
}
|
||
.jaccard-block :global([data-load-jaccard] em) {
|
||
display: block;
|
||
width: calc(var(--fraction) * 100%);
|
||
height: 100%;
|
||
background: var(--blue);
|
||
}
|
||
.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(6, 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: 1.2fr auto 1fr;
|
||
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,
|
||
.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;
|
||
color: var(--ink);
|
||
font: 650 .67rem/1 var(--font-mono);
|
||
cursor: pointer;
|
||
}
|
||
.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;
|
||
}
|
||
.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;
|
||
}
|
||
.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;
|
||
}
|
||
.template-ledger {
|
||
display: grid;
|
||
grid-template-columns: repeat(6, 1fr);
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.template-ledger article {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.template-ledger article:last-child { border-right: 0; }
|
||
.template-ledger article.exact { background: rgba(57,120,110,.1); }
|
||
.template-ledger b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 750 1.05rem/1.05 var(--font-display);
|
||
}
|
||
.template-ledger p {
|
||
margin: .3rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font-size: .61rem;
|
||
line-height: 1.4;
|
||
}
|
||
.template-protocol {
|
||
display: grid;
|
||
grid-template-columns: 1fr auto 1.3fr auto 1.15fr;
|
||
gap: .55rem;
|
||
align-items: stretch;
|
||
margin-top: .8rem;
|
||
}
|
||
.template-protocol > i {
|
||
align-self: center;
|
||
color: rgba(32,32,39,.35);
|
||
font-style: normal;
|
||
}
|
||
.template-protocol article {
|
||
padding: .9rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.template-protocol article > div {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: .22rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.template-protocol article > div > * {
|
||
padding: .35rem .45rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
font: 650 .66rem/1 var(--font-mono);
|
||
font-style: normal;
|
||
}
|
||
.template-protocol article > div > i { background: var(--ink); color: white; }
|
||
.template-protocol article > div > em { background: rgba(98,105,155,.15); color: var(--blue); }
|
||
.template-protocol article > div > b { background: rgba(57,120,110,.12); color: var(--teal); }
|
||
.template-protocol article > div > small { color: rgba(32,32,39,.58); }
|
||
.template-protocol p {
|
||
margin: .55rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .64rem;
|
||
line-height: 1.45;
|
||
}
|
||
.template-controls {
|
||
display: grid;
|
||
grid-template-columns: auto 1.15fr 1fr;
|
||
gap: 1rem;
|
||
align-items: end;
|
||
margin-top: .8rem;
|
||
padding: .85rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.template-controls > div { display: grid; gap: .45rem; }
|
||
.template-controls .layer-switch { margin: 0; }
|
||
.template-scope-switch,
|
||
.template-mode-switch { display: flex; }
|
||
.template-scope-switch button,
|
||
.template-mode-switch button {
|
||
padding: .58rem .72rem;
|
||
border: 1px solid rgba(32,32,39,.22);
|
||
background: #fffdf8;
|
||
color: var(--ink);
|
||
font: 650 .65rem/1 var(--font-mono);
|
||
cursor: pointer;
|
||
}
|
||
.template-scope-switch button + button,
|
||
.template-mode-switch button + button { border-left: 0; }
|
||
.template-scope-switch button[aria-pressed="true"],
|
||
.template-mode-switch button[aria-pressed="true"] {
|
||
border-color: var(--blue);
|
||
background: var(--blue);
|
||
color: white;
|
||
}
|
||
.template-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;
|
||
}
|
||
.template-domain-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.template-domain-grid > :global(article) {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.template-domain-grid > :global(article:last-child) { border-right: 0; }
|
||
.template-domain-grid > :global(article > b) {
|
||
display: block;
|
||
margin-top: .45rem;
|
||
font: 730 .88rem/1.1 var(--font-mono);
|
||
}
|
||
.template-domain-grid > :global(article > strong) {
|
||
display: inline-block;
|
||
margin-top: .4rem;
|
||
padding: .24rem .38rem;
|
||
font: 750 .7rem/1 var(--font-mono);
|
||
}
|
||
.template-domain-grid > :global(article > strong.down),
|
||
.template-depth :global(span.down) {
|
||
background: rgba(57,120,110,.13);
|
||
color: var(--teal);
|
||
}
|
||
.template-domain-grid > :global(article > strong.up),
|
||
.template-depth :global(span.up) {
|
||
background: rgba(161,77,77,.12);
|
||
color: var(--red);
|
||
}
|
||
.template-domain-grid > :global(article > strong.neutral),
|
||
.template-depth :global(span.neutral) {
|
||
background: rgba(186,118,44,.12);
|
||
color: var(--amber);
|
||
}
|
||
.template-domain-grid > :global(article > p) {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font: .59rem/1.4 var(--font-mono);
|
||
}
|
||
.template-domain-grid > :global(article > small),
|
||
.template-domain-grid > :global(article > em) {
|
||
display: block;
|
||
margin-top: .35rem;
|
||
color: rgba(32,32,39,.57);
|
||
font: .58rem/1.4 var(--font-mono);
|
||
font-style: normal;
|
||
}
|
||
.template-domain-grid > :global(article > em) {
|
||
padding-top: .35rem;
|
||
border-top: 1px solid rgba(32,32,39,.1);
|
||
}
|
||
.template-negative-control {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background:
|
||
linear-gradient(115deg, rgba(57,120,110,.11), transparent 48%),
|
||
#e8e2d7;
|
||
}
|
||
.template-negative-control article {
|
||
padding: .9rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.template-negative-control article:last-child { border-right: 0; }
|
||
.template-negative-control b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 730 .88rem/1.1 var(--font-mono);
|
||
}
|
||
.template-negative-control p {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .64rem;
|
||
line-height: 1.45;
|
||
}
|
||
.template-depth {
|
||
display: grid;
|
||
grid-template-columns: .55fr 1.45fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.template-depth h5 {
|
||
margin: .4rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.template-depth p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.template-depth > :global([data-template-depth-map]) {
|
||
display: grid;
|
||
gap: .35rem;
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div) {
|
||
display: grid;
|
||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||
gap: .25rem;
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div > b),
|
||
.template-depth :global([data-template-depth-map] > div > span) {
|
||
display: grid;
|
||
align-items: center;
|
||
min-height: 2.2rem;
|
||
padding: .35rem;
|
||
font: 650 .57rem/1.2 var(--font-mono);
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div > b) {
|
||
color: var(--blue);
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div > span.down) {
|
||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||
color: var(--ink);
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div > span.up) {
|
||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||
color: var(--ink);
|
||
}
|
||
.template-depth :global([data-template-depth-map] > div > span.neutral) {
|
||
background: rgba(186,118,44,.1);
|
||
color: var(--ink);
|
||
}
|
||
.history-ledger {
|
||
display: grid;
|
||
grid-template-columns: repeat(6, 1fr);
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.history-ledger article {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.history-ledger article:last-child { border-right: 0; }
|
||
.history-ledger article.exact { background: rgba(57,120,110,.1); }
|
||
.history-ledger b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 750 1.05rem/1.05 var(--font-display);
|
||
}
|
||
.history-ledger p {
|
||
margin: .3rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font-size: .61rem;
|
||
line-height: 1.4;
|
||
}
|
||
.history-factorial {
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
overflow-x: auto;
|
||
background: #fffdf8;
|
||
}
|
||
.history-axis,
|
||
.history-row {
|
||
display: grid;
|
||
grid-template-columns: 7rem 1fr 1fr;
|
||
min-width: 720px;
|
||
}
|
||
.history-axis {
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.history-axis > * {
|
||
padding: .65rem .8rem;
|
||
border-right: 1px solid rgba(255,255,255,.13);
|
||
}
|
||
.history-axis > b {
|
||
font: 650 .64rem/1.3 var(--font-mono);
|
||
}
|
||
.history-row > strong {
|
||
display: grid;
|
||
align-content: center;
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
border-bottom: 1px solid rgba(32,32,39,.12);
|
||
background: #e5ded2;
|
||
color: var(--blue);
|
||
font: 750 .8rem/1.4 var(--font-mono);
|
||
}
|
||
.history-row > strong small {
|
||
color: rgba(32,32,39,.55);
|
||
font: .56rem/1.35 var(--font-mono);
|
||
}
|
||
.history-row article {
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
border-bottom: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.history-row article > div {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: .2rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.history-row article > div > * {
|
||
padding: .34rem .4rem;
|
||
border: 1px solid rgba(32,32,39,.13);
|
||
font: 650 .56rem/1 var(--font-mono);
|
||
font-style: normal;
|
||
text-decoration: none;
|
||
}
|
||
.history-row article u { background: rgba(161,77,77,.1); color: var(--red); }
|
||
.history-row article b { background: rgba(186,118,44,.1); color: var(--amber); }
|
||
.history-row article i { background: rgba(57,120,110,.11); color: var(--teal); }
|
||
.history-row article em { background: rgba(98,105,155,.13); color: var(--blue); }
|
||
.history-row article p {
|
||
margin: .5rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font-size: .61rem;
|
||
line-height: 1.4;
|
||
}
|
||
.history-controls {
|
||
display: grid;
|
||
grid-template-columns: auto .9fr .9fr 1.35fr;
|
||
gap: .8rem;
|
||
align-items: end;
|
||
margin-top: .8rem;
|
||
padding: .85rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.history-controls > div { display: grid; gap: .45rem; }
|
||
.history-controls .layer-switch { margin: 0; }
|
||
.history-scope-switch,
|
||
.history-mode-switch,
|
||
.history-effect-switch { display: flex; }
|
||
.history-scope-switch button,
|
||
.history-mode-switch button,
|
||
.history-effect-switch button {
|
||
padding: .58rem .66rem;
|
||
border: 1px solid rgba(32,32,39,.22);
|
||
background: #fffdf8;
|
||
color: var(--ink);
|
||
font: 650 .61rem/1 var(--font-mono);
|
||
cursor: pointer;
|
||
}
|
||
.history-scope-switch button + button,
|
||
.history-mode-switch button + button,
|
||
.history-effect-switch button + button { border-left: 0; }
|
||
.history-scope-switch button[aria-pressed="true"],
|
||
.history-mode-switch button[aria-pressed="true"],
|
||
.history-effect-switch button[aria-pressed="true"] {
|
||
border-color: var(--blue);
|
||
background: var(--blue);
|
||
color: white;
|
||
}
|
||
.history-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;
|
||
}
|
||
.history-domain-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.history-domain-grid > :global(article) {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.history-domain-grid > :global(article:last-child) { border-right: 0; }
|
||
.history-domain-grid :global(.history-cell-values) {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
gap: .25rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.history-domain-grid :global(.history-cell-values > i) {
|
||
display: grid;
|
||
gap: .18rem;
|
||
padding: .4rem;
|
||
background: #e8e2d7;
|
||
font-style: normal;
|
||
}
|
||
.history-domain-grid :global(.history-cell-values small) {
|
||
color: rgba(32,32,39,.5);
|
||
font: 650 .53rem/1 var(--font-mono);
|
||
}
|
||
.history-domain-grid :global(.history-cell-values b) {
|
||
font: 720 .7rem/1 var(--font-mono);
|
||
}
|
||
.history-domain-grid > :global(article > strong) {
|
||
display: inline-block;
|
||
margin-top: .48rem;
|
||
padding: .26rem .38rem;
|
||
font: 750 .65rem/1 var(--font-mono);
|
||
}
|
||
.history-domain-grid > :global(article > strong.down),
|
||
.history-depth :global(span.down) {
|
||
background: rgba(57,120,110,.13);
|
||
color: var(--teal);
|
||
}
|
||
.history-domain-grid > :global(article > strong.up),
|
||
.history-depth :global(span.up) {
|
||
background: rgba(161,77,77,.12);
|
||
color: var(--red);
|
||
}
|
||
.history-domain-grid > :global(article > strong.neutral),
|
||
.history-depth :global(span.neutral) {
|
||
background: rgba(186,118,44,.12);
|
||
color: var(--amber);
|
||
}
|
||
.history-domain-grid > :global(article > p) {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font: .58rem/1.4 var(--font-mono);
|
||
}
|
||
.history-domain-grid > :global(article > small),
|
||
.history-domain-grid > :global(article > em) {
|
||
display: block;
|
||
margin-top: .35rem;
|
||
color: rgba(32,32,39,.57);
|
||
font: .57rem/1.4 var(--font-mono);
|
||
font-style: normal;
|
||
}
|
||
.history-domain-grid > :global(article > em) {
|
||
padding-top: .35rem;
|
||
border-top: 1px solid rgba(32,32,39,.1);
|
||
}
|
||
.history-buffer-summary {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background:
|
||
linear-gradient(115deg, rgba(57,120,110,.11), transparent 48%),
|
||
#e8e2d7;
|
||
}
|
||
.history-buffer-summary article {
|
||
padding: .9rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.history-buffer-summary article:last-child { border-right: 0; }
|
||
.history-buffer-summary b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 750 .94rem/1.05 var(--font-display);
|
||
}
|
||
.history-buffer-summary p {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .62rem;
|
||
line-height: 1.45;
|
||
}
|
||
.history-buffer,
|
||
.history-depth {
|
||
display: grid;
|
||
grid-template-columns: .52fr 1.48fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.history-buffer h5,
|
||
.history-depth h5 {
|
||
margin: .4rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.history-buffer p,
|
||
.history-depth p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.history-buffer > :global([data-history-buffer-grid]) {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
gap: .35rem;
|
||
}
|
||
.history-buffer :global([data-history-buffer-grid] article) {
|
||
padding: .65rem;
|
||
background: #fffdf8;
|
||
border: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.history-buffer :global([data-history-buffer-grid] article > *) {
|
||
display: block;
|
||
}
|
||
.history-buffer :global([data-history-buffer-grid] b) {
|
||
margin-top: .35rem;
|
||
font: 720 .74rem/1.2 var(--font-mono);
|
||
}
|
||
.history-buffer :global([data-history-buffer-grid] strong) {
|
||
margin-top: .3rem;
|
||
color: var(--teal);
|
||
font: 750 .68rem/1 var(--font-mono);
|
||
}
|
||
.history-buffer :global([data-history-buffer-grid] p) {
|
||
margin-top: .35rem;
|
||
font: .55rem/1.4 var(--font-mono);
|
||
}
|
||
.history-depth > :global([data-history-depth-map]) {
|
||
display: grid;
|
||
gap: .35rem;
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div) {
|
||
display: grid;
|
||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||
gap: .25rem;
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div > b),
|
||
.history-depth :global([data-history-depth-map] > div > span) {
|
||
display: grid;
|
||
align-items: center;
|
||
min-height: 2.2rem;
|
||
padding: .35rem;
|
||
font: 650 .57rem/1.2 var(--font-mono);
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div > b) {
|
||
color: var(--blue);
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div > span.down) {
|
||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||
color: var(--ink);
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div > span.up) {
|
||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||
color: var(--ink);
|
||
}
|
||
.history-depth :global([data-history-depth-map] > div > span.neutral) {
|
||
background: rgba(186,118,44,.1);
|
||
color: var(--ink);
|
||
}
|
||
.distance-protocol {
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
overflow-x: auto;
|
||
background: #fffdf8;
|
||
}
|
||
.distance-row {
|
||
display: grid;
|
||
grid-template-columns: 7rem repeat(3, minmax(13rem, 1fr));
|
||
min-width: 890px;
|
||
}
|
||
.distance-row.head {
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.distance-row.head > * {
|
||
padding: .65rem .8rem;
|
||
border-right: 1px solid rgba(255,255,255,.13);
|
||
}
|
||
.distance-row.head b { font: 650 .62rem/1.3 var(--font-mono); }
|
||
.distance-row > strong {
|
||
display: grid;
|
||
align-content: center;
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
border-bottom: 1px solid rgba(32,32,39,.12);
|
||
background: #e5ded2;
|
||
color: var(--blue);
|
||
font: 750 .8rem/1.4 var(--font-mono);
|
||
}
|
||
.distance-row > strong small {
|
||
color: rgba(32,32,39,.55);
|
||
font: .56rem/1.35 var(--font-mono);
|
||
}
|
||
.distance-row article {
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
border-bottom: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.distance-row article > div {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: .2rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.distance-row article > div > * {
|
||
padding: .34rem .4rem;
|
||
border: 1px solid rgba(32,32,39,.13);
|
||
font: 650 .53rem/1 var(--font-mono);
|
||
font-style: normal;
|
||
text-decoration: none;
|
||
}
|
||
.distance-row article mark { background: rgba(161,77,77,.1); color: var(--red); }
|
||
.distance-row article b { background: rgba(186,118,44,.1); color: var(--amber); }
|
||
.distance-row article u { background: rgba(98,105,155,.12); color: var(--blue); }
|
||
.distance-row article i { background: rgba(57,120,110,.11); color: var(--teal); }
|
||
.distance-row article em { background: rgba(98,105,155,.13); color: var(--blue); }
|
||
.distance-row article p {
|
||
margin: .5rem 0 0;
|
||
color: rgba(32,32,39,.56);
|
||
font-size: .61rem;
|
||
line-height: 1.4;
|
||
}
|
||
.distance-controls {
|
||
display: grid;
|
||
grid-template-columns: auto .9fr .9fr 1.45fr;
|
||
gap: .8rem;
|
||
align-items: end;
|
||
margin-top: .8rem;
|
||
padding: .85rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.distance-controls > div { display: grid; gap: .45rem; }
|
||
.distance-controls .layer-switch { margin: 0; }
|
||
.distance-scope-switch,
|
||
.distance-mode-switch,
|
||
.distance-contrast-switch { display: flex; }
|
||
.distance-scope-switch button,
|
||
.distance-mode-switch button,
|
||
.distance-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;
|
||
}
|
||
.distance-scope-switch button + button,
|
||
.distance-mode-switch button + button,
|
||
.distance-contrast-switch button + button { border-left: 0; }
|
||
.distance-scope-switch button[aria-pressed="true"],
|
||
.distance-mode-switch button[aria-pressed="true"],
|
||
.distance-contrast-switch button[aria-pressed="true"] {
|
||
border-color: var(--blue);
|
||
background: var(--blue);
|
||
color: white;
|
||
}
|
||
.distance-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;
|
||
}
|
||
.distance-domain-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.distance-domain-grid > :global(article) {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.distance-domain-grid > :global(article:last-child) { border-right: 0; }
|
||
.distance-domain-grid :global(.distance-tv-ladder) {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: .22rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.distance-domain-grid :global(.distance-tv-ladder > i) {
|
||
display: grid;
|
||
gap: .18rem;
|
||
padding: .38rem;
|
||
background: #e8e2d7;
|
||
font-style: normal;
|
||
}
|
||
.distance-domain-grid :global(.distance-tv-ladder small) {
|
||
color: rgba(32,32,39,.5);
|
||
font: 650 .49rem/1 var(--font-mono);
|
||
}
|
||
.distance-domain-grid :global(.distance-tv-ladder b) {
|
||
font: 720 .66rem/1 var(--font-mono);
|
||
}
|
||
.distance-domain-grid > :global(article > strong) {
|
||
display: inline-block;
|
||
margin-top: .48rem;
|
||
padding: .26rem .38rem;
|
||
font: 750 .62rem/1 var(--font-mono);
|
||
}
|
||
.distance-domain-grid > :global(article > strong.down),
|
||
.distance-depth :global(span.down) {
|
||
background: rgba(57,120,110,.13);
|
||
color: var(--teal);
|
||
}
|
||
.distance-domain-grid > :global(article > strong.up),
|
||
.distance-depth :global(span.up) {
|
||
background: rgba(161,77,77,.12);
|
||
color: var(--red);
|
||
}
|
||
.distance-domain-grid > :global(article > strong.neutral),
|
||
.distance-depth :global(span.neutral) {
|
||
background: rgba(186,118,44,.12);
|
||
color: var(--amber);
|
||
}
|
||
.distance-domain-grid > :global(article > p),
|
||
.distance-domain-grid > :global(article > small),
|
||
.distance-domain-grid > :global(article > em),
|
||
.distance-domain-grid > :global(article > u) {
|
||
display: block;
|
||
margin: .38rem 0 0;
|
||
color: rgba(32,32,39,.57);
|
||
font: .55rem/1.4 var(--font-mono);
|
||
font-style: normal;
|
||
text-decoration: none;
|
||
}
|
||
.distance-domain-grid > :global(article > em),
|
||
.distance-domain-grid > :global(article > u) {
|
||
padding-top: .35rem;
|
||
border-top: 1px solid rgba(32,32,39,.1);
|
||
}
|
||
.distance-depth {
|
||
display: grid;
|
||
grid-template-columns: .52fr 1.48fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.distance-depth h5 {
|
||
margin: .4rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.distance-depth p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.distance-depth > :global([data-distance-depth-map]) {
|
||
display: grid;
|
||
gap: .35rem;
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div) {
|
||
display: grid;
|
||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||
gap: .25rem;
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div > b),
|
||
.distance-depth :global([data-distance-depth-map] > div > span) {
|
||
display: grid;
|
||
align-items: center;
|
||
min-height: 2.2rem;
|
||
padding: .35rem;
|
||
font: 650 .55rem/1.2 var(--font-mono);
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div > b) {
|
||
color: var(--blue);
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div > span.down) {
|
||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||
color: var(--ink);
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div > span.up) {
|
||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||
color: var(--ink);
|
||
}
|
||
.distance-depth :global([data-distance-depth-map] > div > span.neutral) {
|
||
background: rgba(186,118,44,.1);
|
||
color: var(--ink);
|
||
}
|
||
.distance-interpretation {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.distance-interpretation article {
|
||
padding: .9rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.distance-interpretation article:last-child { border-right: 0; }
|
||
.distance-interpretation b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 730 .78rem/1.2 var(--font-display);
|
||
}
|
||
.distance-interpretation p {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .62rem;
|
||
line-height: 1.45;
|
||
}
|
||
.boundary-protocol {
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
background:
|
||
linear-gradient(115deg, rgba(98,105,155,.09), transparent 50%),
|
||
#fffdf8;
|
||
}
|
||
.boundary-track {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
flex-wrap: wrap;
|
||
gap: .25rem;
|
||
padding: .8rem;
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.boundary-track > * {
|
||
padding: .36rem .48rem;
|
||
font: 650 .61rem/1 var(--font-mono);
|
||
font-style: normal;
|
||
}
|
||
.boundary-track span {
|
||
color: rgba(255,255,255,.48);
|
||
font-size: .52rem;
|
||
}
|
||
.boundary-track b { background: rgba(255,255,255,.1); }
|
||
.boundary-track i { color: #d5d8ef; }
|
||
.boundary-track mark {
|
||
min-width: 3.6rem;
|
||
background: var(--amber);
|
||
color: white;
|
||
text-align: center;
|
||
}
|
||
.boundary-token-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .55rem;
|
||
border: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.boundary-token-grid article {
|
||
display: grid;
|
||
gap: .34rem;
|
||
padding: .75rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
background: #f3eee5;
|
||
}
|
||
.boundary-token-grid article:last-child { border-right: 0; }
|
||
.boundary-token-grid article.official {
|
||
background: rgba(57,120,110,.11);
|
||
}
|
||
.boundary-token-grid span {
|
||
color: var(--blue);
|
||
font: 700 .52rem/1 var(--font-mono);
|
||
}
|
||
.boundary-token-grid b {
|
||
font: 760 1.05rem/1 var(--font-display);
|
||
}
|
||
.boundary-token-grid code {
|
||
width: max-content;
|
||
padding: .22rem .3rem;
|
||
background: rgba(32,32,39,.08);
|
||
font-size: .57rem;
|
||
}
|
||
.boundary-token-grid p,
|
||
.boundary-protocol > p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .61rem;
|
||
line-height: 1.45;
|
||
}
|
||
.boundary-protocol > p {
|
||
margin-top: .7rem;
|
||
text-align: center;
|
||
}
|
||
.boundary-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;
|
||
}
|
||
.boundary-controls > div { display: grid; gap: .45rem; }
|
||
.boundary-controls .layer-switch { margin: 0; }
|
||
.boundary-scope-switch,
|
||
.boundary-mode-switch,
|
||
.boundary-contrast-switch { display: flex; }
|
||
.boundary-scope-switch button,
|
||
.boundary-mode-switch button,
|
||
.boundary-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;
|
||
}
|
||
.boundary-scope-switch button + button,
|
||
.boundary-mode-switch button + button,
|
||
.boundary-contrast-switch button + button { border-left: 0; }
|
||
.boundary-scope-switch button[aria-pressed="true"],
|
||
.boundary-mode-switch button[aria-pressed="true"],
|
||
.boundary-contrast-switch button[aria-pressed="true"] {
|
||
border-color: var(--blue);
|
||
background: var(--blue);
|
||
color: white;
|
||
}
|
||
.boundary-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;
|
||
}
|
||
.boundary-domain-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.boundary-domain-grid > :global(article) {
|
||
min-width: 0;
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.boundary-domain-grid > :global(article:last-child) { border-right: 0; }
|
||
.boundary-domain-grid :global(.boundary-tv-ladder) {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: .18rem;
|
||
margin-top: .55rem;
|
||
}
|
||
.boundary-domain-grid :global(.boundary-tv-ladder > b) {
|
||
display: grid;
|
||
gap: .18rem;
|
||
min-width: 0;
|
||
padding: .34rem;
|
||
background: #e8e2d7;
|
||
}
|
||
.boundary-domain-grid :global(.boundary-tv-ladder > b.official) {
|
||
background: rgba(57,120,110,.12);
|
||
}
|
||
.boundary-domain-grid :global(.boundary-tv-ladder > b.selected) {
|
||
outline: 1px solid var(--blue);
|
||
outline-offset: -1px;
|
||
}
|
||
.boundary-domain-grid :global(.boundary-tv-ladder small) {
|
||
color: rgba(32,32,39,.5);
|
||
font: 650 .46rem/1 var(--font-mono);
|
||
}
|
||
.boundary-domain-grid :global(.boundary-tv-ladder strong) {
|
||
white-space: nowrap;
|
||
font: 720 .58rem/1 var(--font-mono);
|
||
letter-spacing: -.025em;
|
||
}
|
||
.boundary-domain-grid > :global(article > strong) {
|
||
display: inline-block;
|
||
margin-top: .48rem;
|
||
padding: .26rem .38rem;
|
||
font: 750 .62rem/1 var(--font-mono);
|
||
}
|
||
.boundary-domain-grid > :global(article > strong.down),
|
||
.boundary-depth :global(span.down) {
|
||
background: rgba(57,120,110,.13);
|
||
color: var(--teal);
|
||
}
|
||
.boundary-domain-grid > :global(article > strong.up),
|
||
.boundary-depth :global(span.up) {
|
||
background: rgba(161,77,77,.12);
|
||
color: var(--red);
|
||
}
|
||
.boundary-domain-grid > :global(article > strong.neutral),
|
||
.boundary-depth :global(span.neutral) {
|
||
background: rgba(186,118,44,.12);
|
||
color: var(--amber);
|
||
}
|
||
.boundary-domain-grid > :global(article > p),
|
||
.boundary-domain-grid > :global(article > small),
|
||
.boundary-domain-grid > :global(article > em),
|
||
.boundary-domain-grid > :global(article > u),
|
||
.boundary-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;
|
||
}
|
||
.boundary-domain-grid > :global(article > em),
|
||
.boundary-domain-grid > :global(article > u),
|
||
.boundary-domain-grid > :global(article > i) {
|
||
padding-top: .34rem;
|
||
border-top: 1px solid rgba(32,32,39,.1);
|
||
}
|
||
.boundary-depth {
|
||
display: grid;
|
||
grid-template-columns: .52fr 1.48fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.boundary-depth h5 {
|
||
margin: .4rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.boundary-depth p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.boundary-depth > :global([data-boundary-depth-map]) {
|
||
display: grid;
|
||
gap: .35rem;
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div) {
|
||
display: grid;
|
||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||
gap: .25rem;
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div > b),
|
||
.boundary-depth :global([data-boundary-depth-map] > div > span) {
|
||
display: grid;
|
||
align-items: center;
|
||
min-height: 2.2rem;
|
||
padding: .35rem;
|
||
font: 650 .55rem/1.2 var(--font-mono);
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div > b) {
|
||
color: var(--blue);
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div > span.down) {
|
||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||
color: var(--ink);
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div > span.up) {
|
||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||
color: var(--ink);
|
||
}
|
||
.boundary-depth :global([data-boundary-depth-map] > div > span.neutral) {
|
||
background: rgba(186,118,44,.1);
|
||
color: var(--ink);
|
||
}
|
||
.boundary-interpretation {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.boundary-interpretation article {
|
||
padding: .9rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.boundary-interpretation article:last-child { border-right: 0; }
|
||
.boundary-interpretation b {
|
||
display: block;
|
||
margin-top: .4rem;
|
||
font: 730 .78rem/1.2 var(--font-display);
|
||
}
|
||
.boundary-interpretation p {
|
||
margin: .4rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
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);
|
||
}
|
||
.special-inventory,
|
||
.role-block-protocol {
|
||
display: grid;
|
||
grid-template-columns: .64fr 1.36fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.special-inventory > div:first-child,
|
||
.role-block-protocol > div:first-child {
|
||
align-self: center;
|
||
}
|
||
.special-inventory h5,
|
||
.role-block-protocol h5 {
|
||
margin: .45rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.special-inventory p,
|
||
.role-block-protocol p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.6);
|
||
font-size: .66rem;
|
||
line-height: 1.55;
|
||
}
|
||
.special-inventory span,
|
||
.special-controls > div > span,
|
||
.special-depth span,
|
||
.special-scope-ledger span,
|
||
.role-block-protocol span,
|
||
.role-block-controls > div > span,
|
||
.role-block-depth span,
|
||
.role-block-direct span {
|
||
color: var(--blue);
|
||
font: 700 .67rem/1.3 var(--font-mono);
|
||
letter-spacing: .08em;
|
||
}
|
||
.special-token-grid,
|
||
.role-block-matrix {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.special-token-grid article,
|
||
.role-block-matrix article {
|
||
min-width: 0;
|
||
padding: .8rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
background: #eee8dc;
|
||
}
|
||
.special-token-grid article:last-child,
|
||
.role-block-matrix article:last-child { border-right: 0; }
|
||
.special-token-grid article.official,
|
||
.role-block-matrix article.official { background: rgba(57,120,110,.13); }
|
||
.special-token-grid article.special { background: rgba(98,105,155,.12); }
|
||
.special-token-grid b,
|
||
.role-block-matrix b {
|
||
display: block;
|
||
margin-top: .35rem;
|
||
font: 760 .9rem/1.1 var(--font-display);
|
||
}
|
||
.special-token-grid code,
|
||
.role-block-matrix code {
|
||
display: block;
|
||
margin: .35rem 0;
|
||
color: var(--red);
|
||
font-size: .61rem;
|
||
overflow-wrap: anywhere;
|
||
}
|
||
.special-token-grid p,
|
||
.role-block-matrix p { font-size: .58rem; }
|
||
.special-controls,
|
||
.role-block-controls {
|
||
display: grid;
|
||
grid-template-columns: .9fr .72fr .72fr 1.35fr;
|
||
gap: .8rem;
|
||
margin-top: .8rem;
|
||
padding: .9rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.special-controls > div,
|
||
.role-block-controls > div { display: grid; gap: .45rem; }
|
||
.special-controls .layer-switch,
|
||
.role-block-controls .layer-switch { margin: 0; }
|
||
.special-scope-switch,
|
||
.special-mode-switch,
|
||
.special-contrast-switch,
|
||
.role-block-scope-switch,
|
||
.role-block-mode-switch,
|
||
.role-block-effect-switch { display: flex; }
|
||
.special-scope-switch button,
|
||
.special-mode-switch button,
|
||
.special-contrast-switch button,
|
||
.role-block-scope-switch button,
|
||
.role-block-mode-switch button,
|
||
.role-block-effect-switch button {
|
||
flex: 1;
|
||
min-width: 0;
|
||
padding: .45rem .35rem;
|
||
border: 1px solid rgba(32,32,39,.22);
|
||
background: transparent;
|
||
color: var(--ink);
|
||
font: 650 .55rem/1 var(--font-mono);
|
||
cursor: pointer;
|
||
}
|
||
.special-scope-switch button + button,
|
||
.special-mode-switch button + button,
|
||
.special-contrast-switch button + button,
|
||
.role-block-scope-switch button + button,
|
||
.role-block-mode-switch button + button,
|
||
.role-block-effect-switch button + button { border-left: 0; }
|
||
.special-scope-switch button[aria-pressed="true"],
|
||
.special-mode-switch button[aria-pressed="true"],
|
||
.special-contrast-switch button[aria-pressed="true"],
|
||
.role-block-scope-switch button[aria-pressed="true"],
|
||
.role-block-mode-switch button[aria-pressed="true"],
|
||
.role-block-effect-switch button[aria-pressed="true"] {
|
||
background: var(--blue);
|
||
color: white;
|
||
}
|
||
.special-controls > p,
|
||
.role-block-controls > p {
|
||
grid-column: 1 / -1;
|
||
margin: 0;
|
||
padding-top: .7rem;
|
||
border-top: 1px solid rgba(32,32,39,.12);
|
||
color: rgba(32,32,39,.62);
|
||
font-size: .64rem;
|
||
line-height: 1.45;
|
||
}
|
||
.special-domain-grid,
|
||
.role-block-domain-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #fffdf8;
|
||
}
|
||
.special-domain-grid > :global(article),
|
||
.role-block-domain-grid > :global(article) {
|
||
min-width: 0;
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.special-domain-grid > :global(article:last-child),
|
||
.role-block-domain-grid > :global(article:last-child) { border-right: 0; }
|
||
.special-domain-grid :global(.special-tv-ladder),
|
||
.role-block-domain-grid :global(.role-block-tv-ladder) {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: .22rem;
|
||
margin: .6rem 0;
|
||
}
|
||
.special-domain-grid :global(.special-tv-ladder > b),
|
||
.role-block-domain-grid :global(.role-block-tv-ladder > b) {
|
||
display: grid;
|
||
gap: .2rem;
|
||
min-width: 0;
|
||
padding: .4rem .2rem;
|
||
background: #e8e2d7;
|
||
text-align: center;
|
||
}
|
||
.special-domain-grid :global(.special-tv-ladder > b.official),
|
||
.role-block-domain-grid :global(.role-block-tv-ladder > b.official) {
|
||
box-shadow: inset 0 -3px var(--teal);
|
||
}
|
||
.special-domain-grid :global(.special-tv-ladder > b.selected) {
|
||
background: rgba(98,105,155,.16);
|
||
}
|
||
.special-domain-grid :global(.special-tv-ladder small),
|
||
.role-block-domain-grid :global(.role-block-tv-ladder small) {
|
||
color: rgba(32,32,39,.55);
|
||
font: 650 .48rem/1 var(--font-mono);
|
||
}
|
||
.special-domain-grid :global(.special-tv-ladder strong),
|
||
.role-block-domain-grid :global(.role-block-tv-ladder strong) {
|
||
font: 700 .68rem/1 var(--font-mono);
|
||
}
|
||
.special-domain-grid > :global(article > strong),
|
||
.role-block-domain-grid > :global(article > strong) {
|
||
display: block;
|
||
padding: .43rem;
|
||
font: 730 .68rem/1.2 var(--font-mono);
|
||
}
|
||
.special-domain-grid > :global(article > strong.down),
|
||
.special-depth :global(span.down),
|
||
.role-block-domain-grid > :global(article > strong.down),
|
||
.role-block-depth :global(span.down) {
|
||
background: rgba(57,120,110,.13);
|
||
color: var(--teal);
|
||
}
|
||
.special-domain-grid > :global(article > strong.up),
|
||
.special-depth :global(span.up),
|
||
.role-block-domain-grid > :global(article > strong.up),
|
||
.role-block-depth :global(span.up) {
|
||
background: rgba(161,77,77,.12);
|
||
color: var(--red);
|
||
}
|
||
.special-domain-grid > :global(article > strong.neutral),
|
||
.special-depth :global(span.neutral),
|
||
.role-block-domain-grid > :global(article > strong.neutral),
|
||
.role-block-depth :global(span.neutral) {
|
||
background: rgba(186,118,44,.12);
|
||
color: var(--amber);
|
||
}
|
||
.special-domain-grid > :global(article > p),
|
||
.special-domain-grid > :global(article > small),
|
||
.special-domain-grid > :global(article > em),
|
||
.special-domain-grid > :global(article > i),
|
||
.role-block-domain-grid > :global(article > p),
|
||
.role-block-domain-grid > :global(article > small),
|
||
.role-block-domain-grid > :global(article > em),
|
||
.role-block-domain-grid > :global(article > u),
|
||
.role-block-domain-grid > :global(article > i) {
|
||
display: block;
|
||
margin: .36rem 0 0;
|
||
color: rgba(32,32,39,.57);
|
||
overflow-wrap: anywhere;
|
||
font: .53rem/1.42 var(--font-mono);
|
||
font-style: normal;
|
||
text-decoration: none;
|
||
}
|
||
.special-domain-grid > :global(article > em),
|
||
.special-domain-grid > :global(article > i),
|
||
.role-block-domain-grid > :global(article > em),
|
||
.role-block-domain-grid > :global(article > u),
|
||
.role-block-domain-grid > :global(article > i) {
|
||
padding-top: .34rem;
|
||
border-top: 1px solid rgba(32,32,39,.1);
|
||
}
|
||
.special-depth,
|
||
.role-block-depth {
|
||
display: grid;
|
||
grid-template-columns: .52fr 1.48fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.special-depth h5,
|
||
.role-block-depth h5 {
|
||
margin: .4rem 0;
|
||
font: 720 1rem/1.15 var(--font-display);
|
||
}
|
||
.special-depth p,
|
||
.role-block-depth p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.special-depth > :global([data-special-depth-map]),
|
||
.role-block-depth > :global([data-role-block-depth-map]) {
|
||
display: grid;
|
||
gap: .35rem;
|
||
}
|
||
.special-depth :global([data-special-depth-map] > div),
|
||
.role-block-depth :global([data-role-block-depth-map] > div) {
|
||
display: grid;
|
||
grid-template-columns: 5.5rem repeat(6, 1fr);
|
||
gap: .25rem;
|
||
}
|
||
.special-depth :global([data-special-depth-map] > div > b),
|
||
.special-depth :global([data-special-depth-map] > div > span),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > b),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > span) {
|
||
display: grid;
|
||
align-items: center;
|
||
min-height: 2.2rem;
|
||
padding: .35rem;
|
||
font: 650 .55rem/1.2 var(--font-mono);
|
||
}
|
||
.special-depth :global([data-special-depth-map] > div > b),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > b) { color: var(--blue); }
|
||
.special-depth :global([data-special-depth-map] > div > span.down),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > span.down) {
|
||
background: color-mix(in srgb, var(--teal) calc(var(--strength) * 55%), #eef0e9);
|
||
color: var(--ink);
|
||
}
|
||
.special-depth :global([data-special-depth-map] > div > span.up),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > span.up) {
|
||
background: color-mix(in srgb, var(--red) calc(var(--strength) * 48%), #f3ebe6);
|
||
color: var(--ink);
|
||
}
|
||
.special-depth :global([data-special-depth-map] > div > span.neutral),
|
||
.role-block-depth :global([data-role-block-depth-map] > div > span.neutral) {
|
||
background: rgba(186,118,44,.1);
|
||
color: var(--ink);
|
||
}
|
||
.special-scope-ledger,
|
||
.role-block-direct {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
background: #e8e2d7;
|
||
}
|
||
.role-block-direct { grid-template-columns: repeat(4, 1fr); background: #fffdf8; }
|
||
.special-scope-ledger article,
|
||
.role-block-direct article {
|
||
padding: .85rem;
|
||
border-right: 1px solid rgba(32,32,39,.12);
|
||
}
|
||
.special-scope-ledger article:last-child,
|
||
.role-block-direct article:last-child { border-right: 0; }
|
||
.special-scope-ledger b,
|
||
.role-block-direct b {
|
||
display: block;
|
||
margin-top: .35rem;
|
||
font: 730 .78rem/1.15 var(--font-display);
|
||
}
|
||
.special-scope-ledger p,
|
||
.role-block-direct p {
|
||
margin: .35rem 0 0;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .6rem;
|
||
line-height: 1.45;
|
||
}
|
||
.observed-cache {
|
||
display: grid;
|
||
grid-template-columns: 1fr auto 1.25fr;
|
||
gap: 1rem;
|
||
align-items: center;
|
||
margin-bottom: .8rem;
|
||
}
|
||
.observed-cache > i { color: var(--red); font: 700 1.4rem/1 var(--font-display); }
|
||
.observed-cache article {
|
||
display: grid;
|
||
gap: .35rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.16);
|
||
background: rgba(57,120,110,.08);
|
||
}
|
||
.observed-cache article.expanded { background: rgba(161,77,77,.07); }
|
||
.observed-cache strong { font: 700 .93rem/1.2 var(--font-mono); }
|
||
.observed-cache p { margin: 0; color: rgba(32,32,39,.58); font-size: .68rem; }
|
||
.cache-ledger { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; margin-top: .8rem; }
|
||
.cache-ledger article { padding: 1rem; border: 1px solid rgba(32,32,39,.14); background: #fffdf8; }
|
||
.cache-ledger header { display: flex; justify-content: space-between; gap: 1rem; font: 650 .62rem/1.3 var(--font-mono); }
|
||
.cache-ledger header span { color: var(--blue); }
|
||
.cache-bar { height: 1.1rem; margin: .75rem 0; background: #ddd6cb; }
|
||
.cache-bar i { display: block; width: 11.25%; height: 100%; background: var(--teal); }
|
||
.cache-bar.eager i { width: 100%; background: var(--red); }
|
||
.cache-ledger strong { font: 750 1.35rem/1 var(--font-display); }
|
||
.cache-ledger p { margin: .35rem 0 0; color: rgba(32,32,39,.58); font-size: .68rem; line-height: 1.45; }
|
||
.cache-ratio { grid-template-columns: repeat(3, 1fr); }
|
||
.cache-ratio .warning { background: rgba(186,118,44,.09); }
|
||
.absorb-algebra {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
gap: .8rem;
|
||
}
|
||
.absorb-algebra article {
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
background: #fffdf8;
|
||
}
|
||
.absorb-algebra code {
|
||
display: block;
|
||
margin: .75rem 0;
|
||
color: var(--ink);
|
||
font: 750 clamp(.88rem, 1.7vw, 1.2rem)/1.2 var(--font-mono);
|
||
}
|
||
.absorb-algebra p,
|
||
.absorb-cache-flow p,
|
||
.kernel-contract p,
|
||
.execution-split p {
|
||
margin: 0;
|
||
color: rgba(32,32,39,.62);
|
||
font-size: .69rem;
|
||
line-height: 1.55;
|
||
}
|
||
.absorb-cache-flow {
|
||
display: grid;
|
||
grid-template-columns: 1fr auto 1fr;
|
||
gap: .8rem;
|
||
align-items: center;
|
||
margin-top: .8rem;
|
||
}
|
||
.absorb-cache-flow > i { color: var(--teal); font: 800 1.5rem/1 var(--font-display); }
|
||
.absorb-cache-flow article {
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
}
|
||
.absorb-cache-flow article.naive { background: rgba(161,77,77,.07); }
|
||
.absorb-cache-flow article.absorbed { background: rgba(57,120,110,.09); }
|
||
.absorb-cache-flow header { display: flex; justify-content: space-between; gap: 1rem; align-items: center; }
|
||
.absorb-cache-flow header b { font: 760 1.25rem/1 var(--font-display); }
|
||
.absorb-cache-flow div { display: flex; flex-wrap: wrap; gap: .4rem; margin: .75rem 0; }
|
||
.absorb-cache-flow code {
|
||
padding: .35rem .45rem;
|
||
background: rgba(32,32,39,.08);
|
||
font-size: .66rem;
|
||
}
|
||
.absorb-metrics { grid-template-columns: repeat(4, 1fr); }
|
||
.absorb-metrics article.exact { background: rgba(57,120,110,.1); }
|
||
.precision-lens {
|
||
display: grid;
|
||
gap: .55rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.precision-lens > div {
|
||
display: grid;
|
||
grid-template-columns: minmax(13rem, 1.3fr) 1fr minmax(8rem, auto);
|
||
gap: .8rem;
|
||
align-items: center;
|
||
}
|
||
.precision-lens span,
|
||
.precision-lens b { font: 650 .62rem/1.3 var(--font-mono); }
|
||
.precision-lens b { text-align: right; }
|
||
.precision-lens i { height: 7px; overflow: hidden; background: rgba(255,255,255,.13); }
|
||
.precision-lens em {
|
||
display: block;
|
||
width: max(calc(var(--error) * 100%), 2px);
|
||
max-width: 100%;
|
||
height: 100%;
|
||
background: #b7bce5;
|
||
}
|
||
.precision-lens > div:last-of-type em { background: #91cfc1; }
|
||
.precision-lens > p {
|
||
margin: .25rem 0 0;
|
||
padding-top: .7rem;
|
||
border-top: 1px solid rgba(255,255,255,.15);
|
||
color: rgba(255,255,255,.58);
|
||
font-size: .66rem;
|
||
line-height: 1.5;
|
||
}
|
||
.kernel-contract {
|
||
display: grid;
|
||
grid-template-columns: .7fr 1.3fr;
|
||
gap: 1rem;
|
||
margin-top: .8rem;
|
||
padding: 1rem;
|
||
border: 1px solid rgba(32,32,39,.15);
|
||
background: #e6dfd3;
|
||
}
|
||
.kernel-contract h5 { margin: .45rem 0; font: 720 1rem/1.15 var(--font-display); }
|
||
.kernel-matrix { overflow-x: auto; border: 1px solid rgba(32,32,39,.14); background: #fffdf8; }
|
||
.kernel-matrix > div {
|
||
display: grid;
|
||
grid-template-columns: 1.4fr repeat(3, minmax(5rem, .7fr));
|
||
min-width: 520px;
|
||
}
|
||
.kernel-matrix b,
|
||
.kernel-matrix span,
|
||
.kernel-matrix i {
|
||
padding: .55rem;
|
||
border-right: 1px solid rgba(32,32,39,.1);
|
||
border-bottom: 1px solid rgba(32,32,39,.1);
|
||
font: 650 .61rem/1.2 var(--font-mono);
|
||
}
|
||
.kernel-matrix .head { background: var(--ink); color: white; }
|
||
.kernel-matrix i { color: rgba(32,32,39,.45); font-style: normal; text-align: center; }
|
||
.kernel-matrix i.yes { color: var(--teal); background: rgba(57,120,110,.08); }
|
||
.kernel-matrix i.no { color: var(--red); background: rgba(161,77,77,.08); }
|
||
.execution-split {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
margin-top: .8rem;
|
||
border: 1px solid rgba(32,32,39,.14);
|
||
}
|
||
.execution-split article { padding: .9rem; border-right: 1px solid rgba(32,32,39,.12); }
|
||
.execution-split article:last-child { border-right: 0; }
|
||
.execution-split article.blocked { background: rgba(161,77,77,.08); }
|
||
.execution-split b { display: block; margin: .4rem 0; font-size: .77rem; }
|
||
.artifact-identity { grid-template-columns: repeat(3, 1fr); }
|
||
.artifact-identity article { display: grid; gap: .35rem; }
|
||
.artifact-identity b { font-size: .78rem; }
|
||
.artifact-identity code,
|
||
.checksum-grid code { font-size: .62rem; overflow-wrap: anywhere; }
|
||
.layer-evidence {
|
||
display: grid;
|
||
grid-template-columns: repeat(27, 1fr);
|
||
gap: 3px;
|
||
margin-top: 1rem;
|
||
}
|
||
.layer-evidence > span {
|
||
display: grid;
|
||
justify-items: center;
|
||
gap: .25rem;
|
||
min-width: 0;
|
||
padding: .55rem .05rem;
|
||
background: #ded8cc;
|
||
}
|
||
.layer-evidence > span.executed { background: var(--teal); color: white; }
|
||
.layer-evidence > span.split { background: var(--amber); color: white; }
|
||
.layer-evidence b { font: 700 .58rem/1 var(--font-mono); }
|
||
.layer-evidence small { font: 650 .43rem/1 var(--font-mono); }
|
||
.layer-legend { display: flex; flex-wrap: wrap; gap: .8rem 1.3rem; margin-top: .65rem; }
|
||
.layer-legend span { display: flex; align-items: center; gap: .35rem; color: rgba(32,32,39,.62); font-size: .68rem; }
|
||
.layer-legend i { width: .7rem; height: .7rem; background: #ded8cc; }
|
||
.layer-legend i.executed { background: var(--teal); }
|
||
.layer-legend i.split { background: var(--amber); }
|
||
.repro-gate {
|
||
display: grid;
|
||
grid-template-columns: .55fr 1fr .8fr;
|
||
gap: 1rem;
|
||
align-items: center;
|
||
margin-top: 1rem;
|
||
padding: 1rem;
|
||
background: var(--ink);
|
||
color: white;
|
||
}
|
||
.repro-gate > div { display: grid; gap: .3rem; }
|
||
.repro-gate strong { font: 760 2rem/1 var(--font-display); }
|
||
.repro-gate > div > b { color: #91cfc1; font: 750 .72rem/1 var(--font-mono); }
|
||
.repro-gate ul { margin: 0; padding-left: 1rem; color: rgba(255,255,255,.72); font-size: .68rem; line-height: 1.65; }
|
||
.repro-gate > p { margin: 0; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); color: rgba(255,255,255,.58); font-size: .68rem; line-height: 1.5; }
|
||
.dependency-split {
|
||
display: grid;
|
||
grid-template-columns: 1fr auto 1fr;
|
||
gap: .8rem;
|
||
align-items: center;
|
||
margin-top: .8rem;
|
||
}
|
||
.dependency-split > i { color: rgba(32,32,39,.38); font-style: normal; }
|
||
.dependency-split article { padding: .9rem; border: 1px solid rgba(32,32,39,.14); }
|
||
.dependency-split b { display: block; margin: .35rem 0; font-size: .8rem; }
|
||
.dependency-split p { margin: 0; color: rgba(32,32,39,.6); font-size: .68rem; line-height: 1.45; }
|
||
.checksum-grid article { display: grid; gap: .35rem; }
|
||
.evidence-links { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .8rem; }
|
||
.evidence-links a {
|
||
padding: .55rem .7rem;
|
||
border: 1px solid rgba(32,32,39,.18);
|
||
color: var(--ink);
|
||
font: 650 .66rem/1 var(--font-mono);
|
||
text-decoration: none;
|
||
}
|
||
.artifact-lab figcaption {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: .35rem;
|
||
padding: .85rem 1.6rem;
|
||
border-top: 1px solid rgba(32,32,39,.16);
|
||
background: #e7e0d4;
|
||
color: rgba(32,32,39,.58);
|
||
font-size: .64rem;
|
||
}
|
||
.artifact-lab figcaption span { color: var(--ink); font-weight: 750; }
|
||
.artifact-lab figcaption code { font-size: .61rem; }
|
||
@media (max-width: 860px) {
|
||
.artifact-head,
|
||
.panel-lead,
|
||
.heat-head,
|
||
.aggregate-card,
|
||
.jaccard-block,
|
||
.kernel-contract,
|
||
.corpus-controls,
|
||
.corpus-heat-head,
|
||
.corpus-comparison,
|
||
.length-sensitivity-head,
|
||
.template-protocol,
|
||
.template-controls,
|
||
.template-depth,
|
||
.history-controls,
|
||
.history-buffer,
|
||
.history-depth,
|
||
.distance-controls,
|
||
.distance-depth,
|
||
.boundary-controls,
|
||
.boundary-depth,
|
||
.role-controls,
|
||
.role-depth,
|
||
.role-batch-audit,
|
||
.special-inventory,
|
||
.special-controls,
|
||
.special-depth,
|
||
.role-block-protocol,
|
||
.role-block-controls,
|
||
.role-block-depth { 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; }
|
||
.route-controls .token-select { grid-column: 1 / -1; border-top: 1px solid rgba(32,32,39,.13); }
|
||
.route-stage { grid-template-columns: 1fr; }
|
||
.route-stage > i { transform: rotate(90deg); justify-self: center; }
|
||
.cache-controls { grid-template-columns: 1fr 1fr; }
|
||
.route-metrics,
|
||
.checksum-grid,
|
||
.absorb-metrics { grid-template-columns: 1fr 1fr; }
|
||
.corpus-ledger { grid-template-columns: repeat(3, 1fr); }
|
||
.template-ledger { grid-template-columns: repeat(3, 1fr); }
|
||
.template-domain-grid { grid-template-columns: 1fr 1fr; }
|
||
.history-ledger { grid-template-columns: repeat(3, 1fr); }
|
||
.history-domain-grid,
|
||
.history-buffer-summary,
|
||
.distance-domain-grid,
|
||
.boundary-domain-grid,
|
||
.boundary-token-grid,
|
||
.role-domain-grid,
|
||
.role-level-grid,
|
||
.role-causal-ledger,
|
||
.special-token-grid,
|
||
.special-domain-grid,
|
||
.role-block-matrix,
|
||
.role-block-domain-grid,
|
||
.role-block-direct { grid-template-columns: 1fr 1fr; }
|
||
.distance-interpretation,
|
||
.boundary-interpretation { grid-template-columns: 1fr; }
|
||
.distance-interpretation article,
|
||
.boundary-interpretation article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
|
||
.template-protocol > i { transform: rotate(90deg); justify-self: center; }
|
||
.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; }
|
||
.repro-gate > p { grid-column: 1 / -1; padding: .8rem 0 0; border-left: 0; border-top: 1px solid rgba(255,255,255,.18); }
|
||
}
|
||
@media (max-width: 560px) {
|
||
.artifact-head,
|
||
.artifact-panel { padding: 1rem; }
|
||
.artifact-head { gap: 1rem; }
|
||
.artifact-status { grid-template-columns: 1fr; }
|
||
.artifact-status span { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.1); }
|
||
.artifact-tabs { display: flex; overflow-x: auto; }
|
||
.artifact-tabs button { min-width: 10.5rem; flex: 1 0 auto; }
|
||
.route-controls,
|
||
.cache-controls { grid-template-columns: 1fr; }
|
||
.route-controls .token-select { grid-column: auto; }
|
||
.route-controls label,
|
||
.cache-controls label { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
|
||
.chosen-experts { grid-template-columns: repeat(3, 1fr); }
|
||
.expert-heatmap { grid-template-columns: repeat(8, 1fr); }
|
||
.route-metrics,
|
||
.cache-ratio,
|
||
.load-lessons,
|
||
.absorb-metrics,
|
||
.artifact-identity,
|
||
.checksum-grid,
|
||
.cache-ledger,
|
||
.corpus-ledger,
|
||
.corpus-findings,
|
||
.length-delta-grid,
|
||
.length-pair-summary,
|
||
.template-ledger,
|
||
.template-domain-grid,
|
||
.template-negative-control,
|
||
.history-ledger,
|
||
.history-domain-grid,
|
||
.history-buffer-summary,
|
||
.distance-domain-grid,
|
||
.distance-interpretation,
|
||
.boundary-domain-grid,
|
||
.boundary-token-grid,
|
||
.boundary-interpretation,
|
||
.special-scope-ledger,
|
||
.role-ledger,
|
||
.role-domain-grid,
|
||
.role-level-grid,
|
||
.role-causal-ledger,
|
||
.special-domain-grid,
|
||
.special-token-grid,
|
||
.role-block-domain-grid,
|
||
.role-block-matrix,
|
||
.role-block-direct { 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,
|
||
.template-ledger article,
|
||
.template-domain-grid > :global(article),
|
||
.template-negative-control article,
|
||
.history-ledger article,
|
||
.history-domain-grid > :global(article),
|
||
.history-buffer-summary article,
|
||
.distance-domain-grid > :global(article),
|
||
.distance-interpretation article,
|
||
.boundary-domain-grid > :global(article),
|
||
.boundary-token-grid article,
|
||
.boundary-interpretation article,
|
||
.role-ledger article,
|
||
.role-domain-grid > :global(article),
|
||
.role-level-grid article,
|
||
.role-causal-ledger article,
|
||
.special-domain-grid > :global(article),
|
||
.special-token-grid article,
|
||
.special-scope-ledger article,
|
||
.role-block-domain-grid > :global(article),
|
||
.role-block-matrix article,
|
||
.role-block-direct article { border-right: 0; border-bottom: 1px solid rgba(32,32,39,.12); }
|
||
.corpus-mode-switch,
|
||
.corpus-cohort-switch,
|
||
.template-scope-switch,
|
||
.template-mode-switch,
|
||
.history-scope-switch,
|
||
.history-mode-switch,
|
||
.history-effect-switch,
|
||
.distance-scope-switch,
|
||
.distance-mode-switch,
|
||
.distance-contrast-switch,
|
||
.boundary-scope-switch,
|
||
.boundary-mode-switch,
|
||
.boundary-contrast-switch,
|
||
.role-scope-switch,
|
||
.role-mode-switch,
|
||
.role-contrast-switch,
|
||
.special-scope-switch,
|
||
.special-mode-switch,
|
||
.special-contrast-switch,
|
||
.role-block-scope-switch,
|
||
.role-block-mode-switch,
|
||
.role-block-effect-switch { display: grid; grid-template-columns: 1fr; }
|
||
.corpus-mode-switch button + button,
|
||
.corpus-cohort-switch button + button,
|
||
.template-scope-switch button + button,
|
||
.template-mode-switch button + button,
|
||
.history-scope-switch button + button,
|
||
.history-mode-switch button + button,
|
||
.history-effect-switch button + button,
|
||
.distance-scope-switch button + button,
|
||
.distance-mode-switch button + button,
|
||
.distance-contrast-switch button + button,
|
||
.boundary-scope-switch button + button,
|
||
.boundary-mode-switch button + button,
|
||
.boundary-contrast-switch button + button,
|
||
.role-scope-switch button + button,
|
||
.role-mode-switch button + button,
|
||
.role-contrast-switch button + button,
|
||
.special-scope-switch button + button,
|
||
.special-mode-switch button + button,
|
||
.special-contrast-switch button + button,
|
||
.role-block-scope-switch button + button,
|
||
.role-block-mode-switch button + button,
|
||
.role-block-effect-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,
|
||
.dependency-split,
|
||
.absorb-algebra,
|
||
.absorb-cache-flow,
|
||
.execution-split { grid-template-columns: 1fr; }
|
||
.observed-cache > i,
|
||
.dependency-split > i { transform: rotate(90deg); justify-self: center; }
|
||
.absorb-cache-flow > i { transform: rotate(90deg); justify-self: center; }
|
||
.precision-lens > div { grid-template-columns: 1fr; }
|
||
.precision-lens b { text-align: left; }
|
||
.template-depth { overflow-x: auto; }
|
||
.template-depth > :global([data-template-depth-map]) { min-width: 620px; }
|
||
.history-buffer > :global([data-history-buffer-grid]) { grid-template-columns: 1fr; }
|
||
.history-depth { overflow-x: auto; }
|
||
.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; }
|
||
.special-depth,
|
||
.role-block-depth { overflow-x: auto; }
|
||
.special-depth > :global([data-special-depth-map]),
|
||
.role-block-depth > :global([data-role-block-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; }
|
||
.artifact-lab figcaption { padding: .8rem 1rem; }
|
||
}
|
||
</style>
|