Files
dsh_ai1net_server/归档/交接单-20260924-归档/接续包_实例恢复浮层改造_20260921.md
T
admin 7bd1151c67 chore(工作区): 归档交接单 27 件 + 新增 CODEBUDDY §9 工作区卫生
交接单按归属约定(正文落文档库、工作区只放指针)归档至
归档/交接单-20260924-归档/,含逐件判定 README:
- 16 件已被文档库正式版取代(T09–T21 + 覆盖网络-24/25/26)
- 4 件主题已被覆盖网络线入口汇总
- 7 件历史接续包/规划件

CODEBUDDY §9:收口清本棒 tmp、tmp 保留期 7 天、禁「待清理」中间态、
工作区入库只放文档与文件、不保留脚本副本、>60 KB 单文件须逐个判。
2026-09-24 07:58:57 +08:00

12 KiB
Raw Blame History

接续点 · 实例恢复浮层改造(按新 ICON 样式) · 2026-09-21 06:43

🔴 07:35 追加 · 优先级最高:文末「追加节」列出的 proxy.js 回归修复必须先于本页其余一切执行 —— 现行线上 proxy.js 是未修复版本(连接泄漏修复已被回滚),服务可用性风险仍在。 另:本线还有 🟣 阶段 3 = 项目架构全景排查(见文末),排在回归修复与浮层改造之后。

✅ 08:12 进展 · 前两项已落地结案 ① proxy 回归修复:07:49 上线 47,复验(只读部署后新增日志)499=0 / 200=18,guest.ai1net.com GET / 200 · 4171B。 ② 浮层改造:08:08 上线 47,线上 md5 3f82a5d86e0a6318c0f1157f78b5e1e1(旧视觉 __dsh-orb=0 / 新标记 __dshr-grow=2), 真机截图已验收(hub 形态 + 新品牌配色)。本页「下一步」1–4 条全部完成(见文末「本棒状态」)。 ⇒ 本线剩余唯一项 = 🟣 阶段 3(项目架构全景排查),排在最后,⛔ 不要再动 proxy.js / recovery.js。

  • 来源会话: guest 实例 503 排障(档案 146)|结束原因: 水位 >30 万强制收口

  • 原目标(用户原话,未翻译): 「处理完毕后 按照项目新ICON的样式,改造重新拉起实例恢复会话的浮层动画」 ⚠️ 前置条件「处理完毕后」已满足 —— 503 排障已落地并验收(见文末「不要重做」)

  • 基线: HEAD=1242d07db0fa75fea08fa11ac3b46d3d4f72eace|远端 master=开工时自查|全局锁=无占用

  • 产物: 无(本任务尚未开工)

  • 校验命令(证明前序任务确已完成;只读、<30 s):

    cd /d/github/dsh_shenxian
    node scripts/verify-inject.cjs lib/supervisor/proxy.js | tail -1   # 期望:全部合格 ✅
    grep -c clientGone lib/supervisor/proxy.js                         # 期望:5
    grep -c streamsReclaimed lib/net/relay/server.js                   # 期望:≥3
    

    不符 ⇒ 停下只报告,⛔ 不许照文字硬做。

  • 下一步(✅ 2026-09-21 08:08 已全部完成 · 下列保留供追溯):

    1. cd /d/github/dsh_shenxian && ls -l web/*.svg && git log --oneline -12 -- web/ assets/inject/ && sed -n '1,40p' assets/inject/recovery.js —— 目的:定位「项目新 ICON」究竟指哪个资产(候选:web/favicon.svg、web/logo.svg、web/deepseek-text.svg,或 assets/inject/ 内联图标)。用 git log 看最近一次图标改动即可判定哪个是"新"。
    2. 读浮层现状全文:assets/inject/recovery.js(浮层的唯一实现处;由 src/supervisor/proxy.ts 的 loadInject 注入)。
    3. 按新 ICON 的色彩 / 形状 / 圆角 / 描边风格改造浮层的动画(进入 → 等待 → 重试 三态)。
    4. 真机验收(配方见「已知线索」第 3 条),含无痕对照。
  • 未完成: ① 定位新 ICON 资产 ② 识别浮层现有视觉与动画结构 ③ 改造动画 ④ 真机验收

  • 关键决定(防推翻重来):

    • 浮层实现 = assets/inject/recovery.js(不是别处);注入点 = src/supervisor/proxy.ts → loadInject。
    • 🔴 DOM 契约必须保留:window.__dshRecover === 1(脚本执行完毕哨兵)、#__dshRecover、#__dshRetryBtn、#__dshAssistBar —— scripts/verify-inject.cjs 与技能 dsh-instance-diagnose 的验收都依赖它们。可新增元素/类名,⛔ 不许删改既有 ID 与哨兵。
    • 改完必须走三段式验收(本机 → 部署 → 用户可见面);部署 = scp 产物到线上 + restart dshs(该脚本由平台进程读,缓存坑见 06-工作台UI规范 §7)。
  • 回滚点: 本任务尚未动任何线上文件;动手前先备份线上那份 recovery.js(/opt/dsh/backups/)。

  • ⛔ 不要重做(前序已落地、已验收):

    • src/supervisor/proxy.ts 的连接泄漏修复(4 处:clientGone / liveUpstream / WS 'close')
    • src/net/relay/server.ts 的per-port 兜底回收(10 hunk:reclaimStale / streamsReclaimed / openedAt)
    • 档案 dsh-server-docs/04-调整方案/146-实例子域503-中继per-port额度被连接泄漏占满.md(已含 §七兜底、§八遗留)
    • ⚠️ 106 relay 未同步(其产物基线落后于 47,⛔ 不许直接覆盖)—— 属另一条线,本棒不要碰。

已知线索(省掉重新探索)

  1. 浮层是什么:实例被回收 / 未就绪时平台注入的自愈浮层 —— 文案「工作区已休眠,正在唤醒…(已等待 N 秒)」+「DSH · AUTO RECOVERY」+进度条;点按钮触发 /api/dsh/enter。
  2. 注入机制:proxy.ts 的 injectRecovery() 把 assets/inject/recovery.js 插进 HTML(仅当客户端接受 HTML 且响应未被压缩时);scripts/verify-inject.cjs 是它的契约校验脚本(改完必跑)。
  3. 真机验收配方(零生产副作用,出处:技能 dsh-instance-diagnose 末节):playwright-core + channel:'chrome',拦 **/api/dsh/status* 回 {"running":false} + 把 **/api/dsh/enter* 挂住不回 ⇒ 浮层停住不下跳,可从容观测动画。 ⚠️ 四个坑:① page.route 拦不住 WebSocket(别用 offline 造断流)② probe() 有 15 s 节流(心跳会占掉窗口)③ recover() 成功后 0.7 s 内 location.replace() ⇒ 任何 ≥2 s 轮询都会踩空 ④ #__dshAssistBar 是容器,要点里面的 button。
  4. 视觉基线:dsh-server-docs/06-工作台UI规范.md(强制基线,冲突时以其实测 Token 为准);图标见其 §4.12 与「功能图标亮色映射」,Token 表见 §1。

🔴 追加节(2026-09-21 07:35)· 优先级 高于上文「下一步」

背景:上文「不要重做」里列的 proxy.ts 连接泄漏修复,06:20 上线、07:35 因引入回归被回滚。 现行线上 proxy.js = 未修复版本(判据:grep -c clientGone /opt/dshs/lib/supervisor/proxy.js → 0)。 ⇒ 服务可用性风险仍在,先修这个,再谈浮层改造。

  1. 按 dsh-server-docs/04-调整方案/146-…md §九 的「正解」重写判据: ⛔ 原写法 request.raw.on('close') 是错的(GET 请求体读完即触发 ⇒ 误判"断开" ⇒ 掐死正常请求 ⇒ 用户侧 499); ✅ 改为 reply.raw.on('close', …) + 开头 if (reply.raw.writableEnded) return;⛔ 不要用已废弃的 req.on('aborted')。
  2. 验收必须打在真实路径上(上一轮假绿的根源):⛔ 不许拿 curl 的 401 当通过判据 (401 由平台在进入 proxyHttp 之前返回,走不到被改的代码)。 ✅ 口径 = 带有效 sid 走一次真实子域请求,核对 状态码 200 + 响应字节数 > 0; 或部署后看 nginx access log 里该子域出现 200(若仍是 499 ⇒ 没修好)。
  3. 部署后立即回读 access log 复核:tail /www/wwwlogs/ai1net.com.log —— ⛔ 不许只凭内部 curl 判定。
  4. §七 的中继 per-port 兜底仍在线上、无需重做(它是当前唯一防线)。
  5. 修完并复验通过后,再回到上文「下一步」做浮层改造。

🟣 阶段 3(本线最后一步)· 项目架构全景排查与结构评估

用户原话(未翻译):「整体排查一遍,项目框架,分层结构,模块规划,功能设计,各模块调用依赖情况,要细到功能点。生成项目全景图,看看是不是由于代码结构混乱不清晰导致修改出问题,影响项目迭代效率」

目标:产出细到功能点的项目全景图(框架 / 分层 / 模块 / 调用依赖),并用证据回答一个判断题 —— 「本次修改出问题,是否由代码结构混乱导致?是否已影响迭代效率?」

方法(⛔ 不许空谈,每条结论必须带可复核证据)

  1. 先跑现成的分层守卫:cd /d/github/dsh_shenxian && npm run check:layering(该脚本已存在)—— 机器结论优先于人工目测。
  2. 量化复杂度:统计 src/ 各目录/文件的行数,以及层间实际 import 方向(web/routes → supervisor → net/relay → db 等), 与 CODEBUDDY.md 声明的分层是否一致;大文件 + 高扇入 = 迭代阻力信号,逐个记录。
  3. 功能点粒度:从 src/web/routes/*.ts 的路由表反推功能点清单,每点标注: 入口路由 → 处理层 → 依赖模块 → 涉及数据表 → 对应前端页面(web/*.html)。
  4. 可交付的图:产出单文件 HTML/SVG 全景图(分层模块图 + 关键调用链 + 依赖方向 + 功能点索引) ⛔ 不要只写文字描述 —— 用户明确要"全景图"。
  5. 回答判断题时必须区分三类成因(本任务的核心价值,⛔ 不许含糊成"结构有点乱"):
    • 结构性(分层越界 / 职责不清 / 耦合)—— 必须给出具体模块 + 行号/import 证据
    • 方法性(验收打错路径、假绿)
    • 流程性(高水位赶工) ⚠️ 已有第一手反例:档案 04-调整方案/146-…md §九 记录的那次回归,真因是判据主体选错 + 验收假绿 + 高水位赶工, 不是结构混乱。⇒ 本任务要做的是验证该结论能否推广到全局,⛔ 不要预设"结构一定有问题"(那是先射箭再画靶)。

验收:① 全景图文件可打开,含分层 + 依赖方向 + 功能点索引;② 判断题有明确结论,每条结论都带可复核证据 (脚本输出 / 文件与行号 / import 清单);③ ⛔ 不许只给主观评价或"建议重构"这类空话。

边界:本阶段只读分析,⛔ 不改任何生产代码;发现的问题写进档案与待办,不顺手修(遵守「只做被明确要求的事」)。


📌 本棒状态(2026-09-21 08:12 · automation a617498c-330d-404f-98f0-e4334d92253c)

已完成(两项,均已上线 47 并复验)

  1. proxy 连接泄漏回归修复 —— src/supervisor/proxy.ts

    • 判据主体 request.raw.on('close') → reply.raw.on('close'),且条件去掉 || reply.raw.destroyed ('close' 触发时响应流通常已 destroyed ⇒ 条件恒真 ⇒ 修复静默失效,只换主体不换条件等于白改)。
    • 部署:tsc build → verify-inject 合格 → 备份 proxy.js.pre-fix2-<ts> → scp /opt/dshs/lib/supervisor/proxy.js → restart dshs。
    • 复验:499=0 / 200=18,guest.ai1net.com GET / 200 · 4171B。
  2. 浮层改造(按新品牌 ICON) —— assets/inject/recovery.js

    • 视觉从「旋转圆环 + 轨道粒子(旧 DeepSeek 蓝紫 #58a6ff/#a371f7)」换成 hub(中心 + 三辐条 + 三外环节点);
    • 配色 = web/design.css 的 token:ink #0f1c33 底 + accent-2 #38d6d0 节点 + 白色中心节点;失败态 --danger #e5484d;
    • 三态动画:进入 = 三辐条生长 → 三节点依次点亮;等待 = 能量流动 + 呼吸;失败 = .__dsh-fail(中心转红、辐条节点熄灭);
    • DOM 契约未动:window.__dshRecover / #__dshRecover / #__dshRecoverMsg / #__dshRetryBtn 全部保留。
    • 验收:node --check + verify-inject.cjs 全部合格;Chrome headless(--virtual-time-budget)真跑浮层并截图确认 (harness 落在 E:\tmp-recovery-harness\:stub /api/dsh/status→{running:false}、挂住 /api/dsh/enter ⇒ 浮层停住不下跳)。
    • 部署:备份 /opt/dsh/backups/recovery.js.pre-hub-<ts> → scp → restart dshs;本机与线上 md5 一致 3f82a5d86e0a6318c0f1157f78b5e1e1;部署后日志 499=0 / 200=6。

⚠️ 验收已知边界:失败态(.__dsh-fail + 重试按钮)未做浏览器实测 —— 触发它需真实连续 4 次恢复失败(RECOVER_MAX=3), 当前环境造不出该时序,仅做静态审查。条件一出现(真实累积失败)必须回来补测。

下一棒(未做):🟣 阶段 3 = 项目架构全景排查(见上节,含验收口径与「结构性/方法性/流程性」三类成因要求)。

遗留待归档(本棒未做):档案 04-调整方案/146-…md §九 正文仍写「已回滚 · 必须重新落地」,该句已过期,归档时需同步。