feat(all): seed_step_stab 稳定化种子链与同族种子轮换、ladder/自适应 Teff/丰度轴延拓三级回退与梯级种子入库复用、热启动首末比豁免、workflow 完成翻转回退链阻塞修复、大气收敛权威统计与 M14 回填
收敛攻坚(81/400 失败点根因与实测,见 docs/failed81_cno_seed_popzer_dpsilg_2026_08_18.md): - runner: 新增 seed_step_stab 策略链——同物理族(同 Teff/logg/logHe)CNO 邻居种子 + DPSILG=3.0 λ 算子欠松弛 + POPZER=1E-10 微布居置零(联动 POPZR2/RADZER 同值 + NITZER=1),针对 20kK He 富大气 He I/II 电离前沿布居极限环 - runner: 三级链内延拓回退(主链与 nl_direct 全败后自动触发): · 固定 ladder 步进——plan_ladder_steps 按归一化间隔选轴,Δlogg≤0.25/ΔTeff≤2.5kK,≤4 步 · 自适应 Teff 延拓——步长 1250K 起、成功 ×1.5 恢复、失败二分至 25K 折叠墙,≤48 步 · C/N 丰度轴延拓——高温域(Teff>30kK)专用,严格同族种子沿 C(优先)/N 轴 0.2 dex 起步 延拓阶段 NITER 下限提至 300(慢收敛 waypoint 迭代饥饿误判修复) - runner: 稳定化多档回退(DPSILG/POPZER 三档互补,联合回收 41/65); 域门控 Teff≤30kK——高温高金属域实测旋钮致散(17 拍爆至 4e16),域外跳过 - 梯级种子持久化: 收敛中间模型登记 ladder_seeds 随上报落 server seeds 表 (任务失败也上传,合成名 _ladder 与真实网格点零冲突),簇内相邻失败点自动复用 调度与执行: - scheduler: 策略解析新增 seed_step_stab 臂——find_exact_family_seed_from_db 严格 同物理族判定(不做 global 退化,防 ladder 中间种子 ΔTeff≤5000K 误命中), 排除本点历史已用种子实现重试轮换;链在 stab 耗尽时轮换未试过同族邻居重派 - executor: seed_step_stab 补种子下载(漏列曾致 78 任务假失败,seed_nc 无 fort.8 崩溃); Teff>30kK 域外自动降级普通种子链 收敛判据: - conv_check: 热启动豁免——首拍 max_relc<1(种子已近解)时首末比 1e3 判据数学上 不可达,豁免后交五重物理硬门槛裁决(修复 nl_ladder 0.038→6e-4 物理全过被误杀); 冷启动仍受判据门控 workflow 生命周期: - workflows/tasks: 完成 flip 增加「未消费回退链」阻塞子句——failed 点策略链未耗尽 或链尾 seed_step_stab 尚有未试过同族种子时不得置 completed(修复最后活跃点 cold 失败上报抢先 flip、still_running 守卫拦截后续策略永不派发);按 failed_stage 归因 (synspec 失败行只看 synspec 链,防 stale 审计副本永久卡死)+ json_valid 脏行防护 统计与前端: - 统计新增权威口径 tlusty_converged(不按策略拆)与 seed_step_stab_converged 分项, 前端详情页色带/概览卡消费权威总数并新增稳定化青色段(修复 stab 收敛点漏计, 生产 9137/9216 差额);M14 迁移回填历史 completed 点的 tlusty_status 文档: - 新增 failed81 POPZER/DPSILG 制胜配方根因分析、Windows 节点经跳板 RDP 运维手册; failed400 增补 ladder 生产化实现与第二轮 121 残点实测矩阵
This commit is contained in:
@@ -69,6 +69,8 @@ const TOKEN_KEY = 'dcts_admin_token';
|
||||
* @property {number} failed
|
||||
* @property {number} cold_run_converged - TLUSTY 视图:冷启动收敛
|
||||
* @property {number} seed_step_converged - TLUSTY 视图:种子步进收敛
|
||||
* @property {number} [tlusty_converged] - TLUSTY 视图:大气收敛总数(权威口径,不按策略拆;2026-08-25 补)
|
||||
* @property {number} [seed_step_stab_converged] - TLUSTY 视图:稳定化种子收敛(2026-08-25 补)
|
||||
* @property {number} tlusty_failed - TLUSTY 视图:大气发散
|
||||
* @property {number} synspec_converged - SYNSPEC 视图:光谱有效
|
||||
* @property {number} synspec_failed - SYNSPEC 视图:光谱失败
|
||||
|
||||
@@ -1045,6 +1045,8 @@ body::before {
|
||||
.seg-converged { background: var(--color-success); }
|
||||
/* 种子步进段(TLUSTY 视图):紫色,与冷启动绿区分收敛策略。 */
|
||||
.seg-seed { background: var(--accent-purple); }
|
||||
/* 稳定化/waypoint 种子段(TLUSTY 视图,2026-08-25 补):青色,与普通种子步进区分。 */
|
||||
.seg-stab { background: var(--accent-teal); }
|
||||
/* 色盲友好(color-not-only):失败段在红色之上叠加斜线纹理,
|
||||
即使无法分辨红/绿也能凭纹理识别失败占比。 */
|
||||
.seg-failed {
|
||||
@@ -1439,6 +1441,7 @@ body::before {
|
||||
/* 状态配色(与 method-badge/status-badge 配色族一致) */
|
||||
.ps-cold { fill: var(--color-success); }
|
||||
.ps-seed { fill: var(--accent-purple); }
|
||||
.ps-stab { fill: var(--accent-teal); }
|
||||
.ps-synspec { fill: var(--accent-teal); }
|
||||
.ps-converged { fill: var(--color-success); }
|
||||
.ps-failed { fill: var(--color-danger); }
|
||||
@@ -1448,6 +1451,7 @@ body::before {
|
||||
/* 色带默认 fill-opacity 已定,色块需不透明 → 用 stroke 不可,故色块状态类同时设 fill */
|
||||
.ps-seg.ps-cold { fill: var(--color-success); }
|
||||
.ps-seg.ps-seed { fill: var(--accent-purple); }
|
||||
.ps-seg.ps-stab { fill: var(--accent-teal); }
|
||||
.ps-seg.ps-synspec { fill: var(--accent-teal); }
|
||||
.ps-seg.ps-converged { fill: var(--color-success); }
|
||||
.ps-seg.ps-failed { fill: var(--color-danger); }
|
||||
@@ -1469,6 +1473,7 @@ body::before {
|
||||
/* 状态轴取值标签染色 = 自带图例(与色块/色带配色一致) */
|
||||
.ps-vlabel-cold { fill: var(--color-success); font-weight: 600; }
|
||||
.ps-vlabel-seed { fill: var(--accent-purple); font-weight: 600; }
|
||||
.ps-vlabel-stab { fill: var(--accent-teal); font-weight: 600; }
|
||||
.ps-vlabel-synspec { fill: var(--accent-teal); font-weight: 600; }
|
||||
.ps-vlabel-converged { fill: var(--color-success); font-weight: 600; }
|
||||
.ps-vlabel-failed { fill: var(--color-danger); font-weight: 600; }
|
||||
|
||||
@@ -20,6 +20,7 @@ import { ICONS } from '../../utils/icons.js';
|
||||
const SEG_DEFS_TLUSTY = [
|
||||
['cold', 'seg-converged', '冷启动收敛'],
|
||||
['seed', 'seg-seed', '种子步进'],
|
||||
['stab', 'seg-stab', '稳定化种子'],
|
||||
['failed', 'seg-failed', '大气发散'],
|
||||
['running', 'seg-running', '运行'],
|
||||
['queued', 'seg-queued', '排队'],
|
||||
@@ -41,6 +42,7 @@ function segDefsFor(phase) {
|
||||
function segCount(s, key, phase) {
|
||||
if (key === 'cold') return s.cold_run_converged || 0;
|
||||
if (key === 'seed') return s.seed_step_converged || 0;
|
||||
if (key === 'stab') return s.seed_step_stab_converged || 0;
|
||||
if (key === 'converged') return s.synspec_converged || 0;
|
||||
if (key === 'failed') return phase === 'synspec' ? (s.synspec_failed || 0) : (s.tlusty_failed || 0);
|
||||
if (key === 'pending') return phase === 'synspec' ? (s.synspec_pending || 0) : (s.pending || 0);
|
||||
@@ -89,7 +91,11 @@ export function renderStrip(s, phase = 'tlusty') {
|
||||
parts.push(`${s.synspec_failed || 0} 光谱失败`);
|
||||
parts.push(`${s.synspec_pending || 0} 未运行`);
|
||||
} else {
|
||||
const conv = (s.cold_run_converged || 0) + (s.seed_step_converged || 0);
|
||||
// tlusty_converged(2026-08-25):权威总数,不按 method 拆——此前 cold+seed 之和
|
||||
// 漏计 seed_step_stab 收敛点(生产 9137/9216)。旧 server 无该字段时回退三桶之和。
|
||||
const conv = (s.tlusty_converged != null)
|
||||
? s.tlusty_converged
|
||||
: (s.cold_run_converged || 0) + (s.seed_step_converged || 0) + (s.seed_step_stab_converged || 0);
|
||||
const pct = s.total ? Math.round((conv / s.total) * 100) : 0;
|
||||
parts.push(`${conv} 大气收敛${s.total ? ` (${pct}%)` : ''}`);
|
||||
parts.push(`${s.tlusty_failed || 0} 大气发散`);
|
||||
@@ -223,11 +229,14 @@ function updateOverview(ctx, s) {
|
||||
setOvText('ov-m-failed', s.synspec_failed || 0);
|
||||
setOvText('ov-m-failed-sub', `未运行 ${s.synspec_pending || 0}`);
|
||||
} else {
|
||||
const conv = (s.cold_run_converged || 0) + (s.seed_step_converged || 0);
|
||||
// tlusty_converged 为权威总数(2026-08-25 补,见 renderStrip 同名注释),旧 server 回退三桶和。
|
||||
const conv = (s.tlusty_converged != null)
|
||||
? s.tlusty_converged
|
||||
: (s.cold_run_converged || 0) + (s.seed_step_converged || 0) + (s.seed_step_stab_converged || 0);
|
||||
const pct = s.total ? Math.round((conv / s.total) * 100) : 0;
|
||||
setOvText('ov-m-converged-title', '大气收敛');
|
||||
setOvText('ov-m-converged', conv);
|
||||
setOvText('ov-m-converged-sub', `冷启动 ${s.cold_run_converged || 0} · 种子步进 ${s.seed_step_converged || 0}(${pct}%)`);
|
||||
setOvText('ov-m-converged-sub', `冷启动 ${s.cold_run_converged || 0} · 种子 ${s.seed_step_converged || 0} · 稳定化 ${s.seed_step_stab_converged || 0}(${pct}%)`);
|
||||
setOvText('ov-m-failed-title', '大气发散');
|
||||
setOvText('ov-m-failed', s.tlusty_failed || 0);
|
||||
setOvText('ov-m-failed-sub', '收敛阈值未达标且无种子可救');
|
||||
|
||||
@@ -67,10 +67,10 @@ export function restorePsCache(ctx) {
|
||||
* cold/seed = 大气收敛(按策略拆),failed = 大气发散,running/queued/pending = 未跑完。
|
||||
* SYNSPEC 视图(光谱阶段):基于 synspec_status。
|
||||
* converged = 光谱有效,failed = 光谱坏(Balmer edge NaN 等),pending = 未运行(多因 tlusty 未收敛阻塞)。 */
|
||||
const PS_STATUS_TLUSTY = ['cold', 'seed', 'failed', 'running', 'queued', 'pending'];
|
||||
const PS_STATUS_TLUSTY = ['cold', 'seed', 'stab', 'failed', 'running', 'queued', 'pending'];
|
||||
const PS_STATUS_SYNSPEC = ['converged', 'failed', 'pending'];
|
||||
const PS_STATUS_LABEL = {
|
||||
cold: '冷启动收敛', seed: '种子步进', failed: '失败',
|
||||
cold: '冷启动收敛', seed: '种子步进', stab: '稳定化种子', failed: '失败',
|
||||
running: '运行', queued: '排队', pending: '未开始',
|
||||
converged: '光谱有效',
|
||||
};
|
||||
@@ -94,6 +94,7 @@ function psSlot(p, phase) {
|
||||
// TLUSTY 视图
|
||||
if (p.tlusty_status === 'converged') {
|
||||
if (p.tlusty_success_method === 'seed_step') return 'seed';
|
||||
if (p.tlusty_success_method === 'seed_step_stab') return 'stab';
|
||||
return 'cold'; // cold_run 或缺省归冷启动
|
||||
}
|
||||
if (p.tlusty_status === 'failed') return 'failed';
|
||||
|
||||
Reference in New Issue
Block a user