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:
fmq
2026-09-02 19:37:25 +08:00
parent b058e66722
commit f2700031ce
30 changed files with 3045 additions and 49 deletions
+2
View File
@@ -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 视图:光谱失败
+5
View File
@@ -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; }
+12 -3
View File
@@ -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_converged2026-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', '收敛阈值未达标且无种子可救');
+3 -2
View File
@@ -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';