回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复: - 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录) - tmp/(32.4 M,按接续棒命名的过程临时区) - .workbuddy/tmp/(39.5 M) - 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物) - tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留 入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与 接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、 .workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。 排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、 打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
48 KiB
工作日志 · 2026-09(第 3 片)
⚠️ 本目录日志已按【月】分片(2026-09-15 用户定,单文件 ≤50 KB):同月续片
2026-09.md/2026-09-下.md/2026-09-下2.md/2026-09-下3.md/2026-09-下4.md/2026-09-下5.md/2026-09-下6.md/2026-09-下7.md/2026-09-下8.md/2026-09-下9.md/2026-09-下10.md/2026-09-下11.md/2026-09-下12.md/2026-09-下13.md/2026-09-下14.md/2026-09-下15.md/2026-09-下16.md/2026-09-下17.md/2026-09-下18.md/2026-09-下19.md/2026-09-下20.md/2026-09-下21.md/2026-09-下22.md/2026-09-下23.md写入约定:一律 append 到当月最后一片;该片超 50 KB ⇒ 新建2026-09-下N.md;⛔ 不要再按日新建2026-09-DD.md。 覆盖来源:2026-09-11.md、2026-09-12.md 上一片:2026-09-下.md下一片:2026-09-下3.md
档案 53:文档库质量审查与精简(22:04-22:25)
用户问:所有文档是否清晰简明无歧义?是否需要精简优化?
方法:新建可复跑检查器 dsh-server-docs/scripts/docs-audit.py(只读,9 类判定:①编号冲突 ②标题号≠文件名号 ③.bak残留 ④术语/事实漂移 ⑤体量分布 ⑥引用有效性 ⑦疑似重复(含"子集包含"识别)⑧元信息规范 ⑨非md清单;编号冲突/悬空引用 → 退出码 1,可接 CI)。
P0 发现(真问题):
档案 37/38各被 2 份档案占用,且其中 2 份标题号与文件名号不符(37-guest会话取证标题写 36;38-实例软件安装共享与网络安边界核查标题写 37)→ 「档案 37/38」无法唯一指向,被引用 18 处(靠并行会话各自编号造成)。→ 待用户裁定,建议字母后缀方案(37a/37b/38a/38b + 修正 18 处引用)- README(入口文档)最陈旧:域名仍写
dsh.alotbuy.com、本机路径写成D://AI技能//aliyun-work-space//...、"下一号 = 17"(实际 53)、"档案 01-26"。 - README 与 INDEX 各维护一份全量档案清单 → 已实际漂移(两边都自称"单一来源",互相矛盾);INDEX 复制 1200 字待办摘录 → 已与 03-路线图 漂移(03 有"熔断实测/源码安装",INDEX 无)。
已修复 9 项(零风险,已同步 90/90 + 推送 a6043fb):README 域名/路径/下一号/范围纠错 + 新增「阅读约定」5 条(两套编号体系、单一来源=INDEX、术语以档案 38 为准、域名以 alotbuy 为准、档案头部格式)+ 从 04 表移除根级 06 + 「单一来源」订正;INDEX 待办摘录→指针;02-运维手册 附录 C 重排 C.1→C.8(原顺序 8,7,1,2,3,6,5,4)+ 加「历史 vs 现行」分界(正文为 09-08/09 轨迹,冲突一律以附录与 DEPLOY 为准)。
判定不改(防过度精简):历史档案的旧域名(19 份)/旧术语(4 份)不回改(保留当时事实);archive/ 与 04-调整方案/01~04(⊂ archive 全文的子集摘录,非重复)保留;02(336 行)/06(276 行) 手册规范类长文不拆。
待裁定 4 组(档案 53 §四):① 37/38 编号冲突 ② 02 正文过时章节(六/八/十二/十四/十五)是否加「历史」前缀或迁 archive ③ 19 份档案缺「状态」行 ④ SKILL.md 885 行是否拆分。
经验(值得复用):scp+mv 同步后必须跑 docs-sync-check.sh;写完新档案立刻复跑 docs-audit.py——本轮它当场抓出我新引入的"档案 53 悬空引用"(已在建档后归零)。
档案 54:文档信息架构优化(BRIEF 现状卡 + 机读清单)(22:10-22:35)
用户问:文档内容和数量是否太多?是否要归档部分便于 AI 快速读到最关键最新信息?或有别的优化方式?
实测数据(脚本量出,非估算):
- 全库 88 文件 / 747 KB / 492,285 字符 ≈ 34.5 万 tokens(AI 无法整体读)
- 分类:档案(04-调整方案,54 份)234,091 字符 47.6%|根级长期文档(14)~21.7%|archive(4)13.1%|skills(1,SKILL.md)11.9%|scripts+ops(10)5.7%
- 入口集 7 份 = 78,838 字符 ≈ 5.5 万 tokens,其中
INDEX.md独大 23,813 字符(导航文件比任何档案都大:它兼做场景表+全量表+变化追踪+归档残留) - 按"被引用次数"分层 54 份档案:hot 23(≥8 次)/ warm 27(1–7)/ cold 仅 4(0 次)(cold = 04 删除用户功能、06 登录直达会话窗口、31 插件管理页双Tab、43 root 污染属主自愈)
结论(重要,纠正直觉):不需要大规模归档 —— 仅 4 份零引用,而 19 被引 24 次、16 被引 17 次、17/18 各 16 次仍在被持续引用。真正瓶颈是缺摘要层 + 缺机读层。
已实施(零风险,已同步 94/94 + 推送 3adb836):
BRIEF.md现状卡(AI/人首读层)—— 实测 3,124 字符 / 67 行 ≈ 2.2K tokens:一句话定位 + 现行事实表(入口/服务/运行时/隔离/可见面/清理阈值/定时/证书/红线,每行注明单一来源)+ 待办 top5 + 高频问题→档案映射 + 4 步读取顺序 + 默认不读清单(archive/scripts/ops/bak/poc)scripts/docs-manifest.py→docs-manifest.json(19 KB):每份文档 编号/标题/状态/日期/字符/行数/被引用次数/tier(hot|warm|cold|doc) → 支持jq先筛后读- README 模块一览把 BRIEF 标「先看这份」+ 阅读约定新增第 0 条;INDEX 头部加「首读 BRIEF」并登记 54
- 收益:回答"现在是什么状态/该读哪篇"由 ≈5.5 万 tokens → ≈2–3 千
待裁定(档案 54 §四):A. INDEX.md 瘦身(全量表交给 manifest,目标 ≤10K 字符;另一会话在用 INDEX,建议先对齐)B. 23 份 hot 档案补 3 行 TL;DR(人工约 30 分钟)C/D. 4 份 cold 移入 archive(收益小,建议顺手做)、README 明确 archive/skills 默认不读。
工具沉淀:scripts/docs-audit.py(歧义/编号/引用/重复/体量,退出码非 0 即可接 CI)+ scripts/docs-manifest.py(机读清单)。两者已入库并在 BRIEF §6/README 引用。
档案 54 第二批:TL;DR + INDEX 摘要层 + 默认不读(22:17-22:40)
用户:按照你的建议优化。(我给的顺序:先按现状态用 → A 需对齐 → B 可随时 → C/D 不急)
已执行:
- B|23 份 hot 档案各插入 3 行 TL;DR(
> **TL;DR**|结论 / 关键 / 状态,紧接头部):覆盖被引最多的 19(24 次)/16(17)/18(17)/20(16)/10(14)/11·37·38(12–13)等。11 份因插入位置紧邻##需补空行(已修)。效果 = 读第一屏即可判断是否读全文。 - A(安全版)|INDEX §二 顶部新增「状态摘要(30 秒视图)」:按状态计数 + 分层(hot/warm/cold)+ 指向
docs-manifest.json;大表标题改「全量清单(明细层 · 按需读)」。刻意不删原文(逐行描述系另一会话撰写、且其仍在用 INDEX;删除风险 > 收益)。完整版(压缩描述、明细全交 manifest)仍待裁定。 - D|README 阅读约定加第 5 条"AI 默认不读":
archive/、scripts/ops/、*.bak*、04-调整方案/poc/(约定 6 → 7 条)。 - C|不立项:4 份 cold 移入 archive/ 收益小(且 31/43 后续可能被引)→ 留待下次大改顺手做。
数字自洽处理:TL;DR 自身新增了档案间引用 → 复算分层 hot 24 / warm 26 / cold 5(原 23/27/4);已把 INDEX 摘要与档案 54 的数字改为**实测值 + "复跑 manifest 即刷新"**说明,避免又造一处漂移源(INDEX 摘要里 55 份 = ✅40+🔄4+🔧1+🧪1+未标记 9,已自洽)。
第二批后读取成本:BRIEF 2.2K tokens → INDEX 摘要 ≈0.5K → 命中档案 TL;DR ≈0.2K → 需要才读全文(典型问题合计 ≈5K)。
踩坑(老坑复发,务必记住):
git diff --name-only在中文文件名下会输出带引号的八进制转义 → 必须加-c core.quotepath=false,否则按该清单 scp 只同步到 3 个 ASCII 文件;- python 写的
/tmp/xxx与 MSYS tar 的/tmp不是同一目录 → 清单/tar 一律放工作区内相对路径(tar czf x.tgz -T list.txt在仓库目录内执行);27 个文件逐个 scp 会超时被 SIGTERM,应单包 tar 传输。
提交:8912bfc(文档库,含 27 文件改动)→ 双端 94/94 一致 ✅
档案 55:guest 最新会话取证(22:33-23:05)
用户要求:分析 guest 的最新对话记录,看有哪些问题需要优化。
取证对象:guest 主会话 session-b83ae69b(09-10 21:29 创建,5 turn / 2674 事件 / 13 条用户消息,末事件 09-11 22:18);对照 5 个会话(含 2 个子代理、2 个 09-11 新会话)。
根因(决定性,对比 6 个会话的 preset):
- 权限档位是"会话创建时播种"的:09-11 创建的新会话 =
danger-full-access✅;09-10 创建的会话 =workspace-write(b83ae69b / bd54c7cc) - 本机沙箱后端不可用(内核 5.10 无 Landlock、bwrap 在平台合成根内探测失败)→ dsh fail-closed 拒绝任何 shell → 实测 11 次「no sandbox backend is usable」+ 4 次写策略拒绝
- 同一会话 22:16:29 用户手动切
danger-full-access→ 22:16:36 立即PLAIN-BASH-WORKS,此后 0 次沙箱拒绝 ⇒ 平台侧DSH_PERMISSION_MODE注入正确,唯一缺口是"既有会话不更新" - ⚠️ 纠正一个常见误判:平台没坏;用户撞墙是因为他在用一天前创建的会话(我此前也以为"老会话"只是感受问题)
其它真问题:
- 平台"零技能":
bundled-skills与 guesthome/skills均为空 → agent 三次撞skill "cordis-plugin-development" is unknown - 无能力清单 → agent 在 16:48 / 18:21 / 22:14 三轮重复现场探测,每次撞同样 4 类墙(
/etc白名单(/etc/hostnamenot found)/web_fetch("127.0.0.1")被 SSRF 拒 / skill 不存在 / 写工作区外被拒);用户随之三次追问"能力是否有变化"(16:58 / 18:20 / 22:14) - 审批摩擦:
approval/asked13 次(ask策略下每次 bash 都要点)→ 切never后才顺畅 - 子代理自述"继承上下文为空(无先前轮次与工具输出)"+ 子代理 preset 空(继承主会话当时的 workspace-write)→ 与"是否和本地 dsh 一致"相关,待核
已确认修好(本轮实测):python3 MISSING(16:50) → Python 3.12.14(18:22)(档案 42 的共享运行时 17:19 落地);宿主复测 bwrap 合成根 SANDBOX-SHELL-OK(档案 23 修复仍有效)。
产出:
- 档案
55-guest最新会话取证与优化项.md(证据表 + 用户体感链条 + 4 项优化建议;明确不建议自动改写既有会话档位——安全语义变更需用户知情) - 4 个可复用取证脚本入库
scripts/sess-{probe-schema,analyze,classify-tools,list-presets}.mjs - 03 路线图新增 3 条待办(P1 老会话档位对齐(检测+提示)、P1 实例能力清单、P2 技能投放现状);并写入档案 05 三项 PoC-2 待办的复核结论(①不建议做 ②已实现=共享 Cookie+CORS ③作废=被档案 39 封 loopback);BRIEF §3 同步
关键技术点(会话取证必知):会话文件是多帧 zstd 拼接(本次 1583 帧)→ 必须按 magic 28 b5 2f fd 切分逐帧解压;首帧 session 含 cwd/createdAt,permission/preset 帧即该会话档位;tool/call→tool/result 用 callId/toolCallId 配对。
提交:文档库 1e7bbe9 → 双端 99/99 一致 ✅
档案 56:实例助手(我的文件/能力清单/档位提示)+ 文件下载端点(22:45-23:20)
用户:① "按照建议处理"(= 做档案 55 §四.1 档位提示 + §四.2 能力清单)② 追加新问题「AI 生成的文件看不到、下不了,本机地址浏览器打不开」→ 我诊断为同一类可用性缺口,三项一起做。
③ 的根因(新发现):平台根本没有读取/下载端点 —— desktop.ts 只有 tree/mkdir/upload/create;且实例内禁 loopback(档案 39)→ AI 给出的 /var/lib/... 绝对路径与 127.0.0.1:<port> 链接用户都打不开。
实现(commit ebe8075):
- 档位提示:新增
src/supervisor/session-preset.ts(解析会话文件的多帧 zstd → 取最后一条permission/preset,跨工作区取最近修改的会话)+GET /api/dsh/session-permission;实例页 stale 时顶部提示条(不自动改档位:安全语义变更需用户知情) - 能力清单(人机同源):新增
scripts/gen-capabilities.cjs→/opt/dsh/state/capabilities.json+bundled-skills/platform-capabilities/SKILL.md(平台首个共享技能);GET /api/capabilities;cron 每日 05:05;内容含网络边界(写明 127.0.0.1 不可达)与「文件交付约定」(给用户用相对路径 + 提示点右下角「我的文件」) - 文件下载:
UserFs.readFile(Local 实现;k8s 显式抛 unsupported,不假装支持未验证路径)+GET /api/fs/download;实例页右下 📁 我的文件 面板(浏览 + 一键下载) - 注入复用档案 50 的
proxy.ts injectRecovery,新脚本__dshAssist与原__dshRecover并存
验证(实测):CI typecheck+build+42 单测(新增 4 项 readFile 安全测试)通过;端到端:session-permission → stale=true;capabilities → 200(工具 10 项、python3=3.12.14);fs/download → 200 text/markdown;越界 ../../etc/passwd → 400 bad_path;目录 → not_a_file;实例首页 35KB 含 __dshAssist 与 __dshRecover。
关键技术细节(复用价值高):
- 会话文件是多帧 zstd 拼接 → 按 magic
28 b5 2f fd切分逐帧解压(session-preset.ts与 docs 的sess-*.mjs同一套路) - 不要用 undici/fetch 覆盖
Host头(禁用头,会被静默丢弃)→ 验证子域路由必须用curl -H 'Host: ...' - 实例首页取 HTML:
?token=会 303 →/并下发dsh-auth-*,必须curl -L -c/-b jar跟随;另需Accept-Encoding: identity,否则 gzip 会导致注入被跳过(档案 50 老坑) - 铸造临时 session 做端到端验证:
sha256(token)入sessions(token_hash,user_id,created_at,expires_at,ip,user_agent),用完即删(本轮已用过 3 次,均清理)
提交:代码 ebe8075(推送 3b82d31..ebe8075);文档 43e4ae9(1e7bbe9..43e4ae9)→ 双端 100/100 一致。
待用户:硬刷新会话页即可看到右下角两个入口与(如触发)档位提示条;门户 #/files 的下载按钮列为 P3。
核查:每用户实例的资源配额(23:44-23:58)
用户问「每个用户进程资源给的多少」。纯只读取证(systemctl show + 源码 + free/df),未改任何文件。
单实例 cgroup 配额(来自 src/supervisor/orchestrator.ts#spawnAsUser 的 systemd-run --scope,服务器实测生效值):
| 项 | 值 | 证据 |
|---|---|---|
| MemoryMax | 512 MiB(536870912) | systemctl show dsh-*.scope -p MemoryMax |
| CPUQuota | 150%(1.5 核;CPUQuotaPerSecUSec=1.500000s) | 同上 |
| TasksMax | 128 | 同上 |
| 磁盘配额 | 无(ext4 无 prjquota、fstab 无 quota、quotaon / 未启用) |
mount / df / fstab |
| 磁盘 IO / DevicePolicy | 未设(IOWeight=none、DevicePolicy=auto) | 同上 |
| 全局默认 | MemoryMax=infinity、DefaultTasksMax=11716、DefaultCPUAccounting=no → 限额只来自 scope 参数 | systemctl show -p Default* |
- 宿主:2 vCPU / 1870 MiB RAM / 1024 MiB swap / 40 GiB ext4(用 9.8G、可用 28G);平台编排器自身 133 MiB
ISOLATION_MODE=account已确认;每实例 =bwrap(合成根)+setpriv(独立 uid)+ 独立 scope;role为main/watchdog时各自一个 scope = 各自 512 MiB(不共享)- 当前 2 个实例:212 MiB(Tasks 13)/ 329 MiB(Tasks 13);
available785 MiB - 并发上限:内存 1870/512 ≈ 3.6 → 再起 1 个余 273 MiB,第 4 个必 OOM;CPU 是更早瓶颈(150%×2 = 300% > 200%,2 个活跃实例即占满 2 核)
- 内核 OOM 近 30 天 = 0 次(日志里 8 条命中是
crash-loop-circuit-open熔断与漏扫请求,非内存问题)
新发现(文档未记载,值得归档):宿主 node -e 实测 heap_size_limit = 960 MiB,而 cgroup 只有 512 MiB → V8 按物理内存(1871 MiB)推算堆上限,感知不到 cgroup 硬限 → 实例内 dsh 不会在 512 MiB 附近提前 GC,会一路涨到内核 OOM kill(SIGKILL,无优雅退出、无日志)。建议给实例注入 NODE_OPTIONS=--max-old-space-size=384 一类参数(未实施,待裁定)。
其余参数均已记载于 档案 16 / 38 / 41、BRIEF.md、01-规划与架构.md、DEPLOY-本部署.md。
档案 57:设置面板「用户管理」入口(改名/移位/全员安装)(23:44-00:05)
用户要求:把设置里的「平台管理」改名「用户管理」,放到「功能插件」下面;普通用户也要有该入口,里面只有退出按钮。
根因(关键):提供该分区的 @dsh-local/portal-entry 只装在 admin 的 profile(dsh.profile.bundles)→ 普通用户设置面板里根本没有这个分区 → "没入口就不能退出登录"。故需求 3 不是改显隐条件能解决的,必须同时解决插件分发。「功能插件」名称无需改(business-plugins 的 label 自 v0.2.0 起即是,档案 38 已做术语统一)。
改动:
- 插件 v0.5.1(源码在文档库
04-调整方案/poc/portal-entry/):sectionid: platform→user-management、label: 平台管理→用户管理、order: 100→102(功能插件=101;官方 models=10 / plugins=15,故 102 排最后);内容按角色分支(admin=门户地址+「打开管理台」+「退出登录」,其余=仅「退出登录」),角色取自门户GET /api/auth/me(跨子域 CORS 实测 200 + 带role),探测失败 fail-closed 降级为非管理员。保持"只导出 apply+inject"(红线 R3)与配色硬编码(v0.4.3 结论:暗色设置面板里var()fallback 永不生效)。 - 新装器
scripts/ensure-portal-entry.cjs:幂等(已装版本 + dep spec + 是否在 bundles 三判据);姿势沿用 picker 修复版(.dsh-stage暂存 +chmod 444+setpriv+ workspace 加-w);store 位置自适应(见坑 1)。 - 接入
/usr/local/bin/provision-new-users.sh(并首次把该脚本入库scripts/provision-new-users.sh)+/etc/cron.d/dsh-maintenance加04:15每日兜底。 - 未改 TS → 无需 build、无需重启平台(新 bundle 只在实例重启后加载)。
三个坑(都值得记):
ERR_PNPM_UNEXPECTED_STORE:存量node_modules由 ws 内旧 store 链接(<userRoot>/ws/.local/share/pnpm/store/v3,HOME=<ws>时代的产物,.modules.yaml记着它),脚本若用<home>/.pnpm-store会被 pnpm 直接拒绝(需pnpm install重建全量依赖)。→ 装器改为读.modules.yaml的 storeDir 并沿用,只有全新 profile 才用<home>/.pnpm-store。⚠️ensure-workspace-picker.cjs仍有同一隐患(无条件用 home store)→ 下次 picker 升级必失败,已列入档案 57 §五.1。- 首版 tgz 漏
lib/index.js→ 全实例ERR_MODULE_NOT_FOUND ... /portal-entry/lib/index.js→ 崩溃循环 → 熔断。坏包已隔离/opt/dsh/backups/portal-entry-0.5.0-BAD-missing-index.tgz。教训:构建包一律cp -r <源>/. <构建>/整目录复制,打包后强制diff清单校验。 - pnpm 同版本缓存:同名同版本 tgz 即使内容变了也复用旧包 → 修复必须升版本号(0.5.0→0.5.1)。
验证:两用户 ✓ v0.5.1(bundles=5,含本插件=true);实例重启后正常打印 launch token;首页 client bundle 清单含 @dsh-local/portal-entry/client.js(新 rev=8989…);/api/auth/me 跨子域 200 + allow-credentials;DB admin=admin / guest=active;provision-new-users.sh 跑通且幂等 skip。未做浏览器渲染验证(本机无 Chromium,装它 ~500MB 成本不成比例)→ 待用户硬刷新确认位置与按钮。
顺带清理:24 个 .bak-* 堆积 → 移入 /opt/dsh/backups/repo-bak-20260912/;确认 grep -c $'\r' 在 MSYS 下是假阳性(报"36 行含 CR"而两端 md5 完全相同)→ 判行尾要用 od -c / file。
产出:档案 04-调整方案/57-设置面板用户管理入口与全员安装.md + INDEX 登记(双端 md5 一致;docs-audit.py 复跑无新增问题)。未提交(用户未要求 commit/push)。
规划/执行分离:建立「交接单」机制 + 首批两单(23:55-00:30)
用户口径:「执行任务时间太久 → 这个会话做任务规划,另一个会话执行」。经确认四项参数:①本会话定位=纯规划(不 ssh、不改码、不重启)②交接载体=文档库文件(dsh-server-docs/交接单/)③首批任务=档案 16 阶段 3/4 + 文档库收尾(实例内存治理与 MCN 改造不在本批)④身份档案按默认落定(我叫「小 D」,用户记作 maogeigei)。
产出(本地写入,纯规划会话不 scp、不 commit):
交接单/README.md(1,867 字符)—— 单子必填 8 段(目标/只读前置/范围/决策点/步骤/验收/回滚/回报格式)+ 执行会话硬要求 7 条 + 规划会话边界 3 条 + 「为什么这样分」(附今日两次并行踩坑证据)交接单/T01-档案16阶段3-4-实例内我的技能.md(5,448 字符)—— 实例内「我的技能」section 的完整施工单交接单/T02-文档库收尾-编号消歧与INDEX瘦身.md(7,150 字符)- 登记落位:
README 模块一览加「交接单/」一行;INDEX §六加第 8 条落位规则
规划阶段抓到的两个关键点(执行会话会踩的坑):
- T01:档案 16 §六 阶段 4 原文写的验收口径是「按 uid
--dump-config复核」,但该口径已被档案 18 v3 证伪(--dump-config不反映 bundle/profile patch 层)→ 单子里改为「加载标记(journald)+ 实例页 UI 实测」,并顺带把 B5(给两个 bundle 加加载标记)纳入本单"顺手做"。 - T02:字母后缀消歧(37a/37b/38a/38b)必须同时改两个脚本的 6 处正则 —— 否则
37a-…不匹配^(\d+)-,docs-manifest.py会把 4 份档案判成tier=doc/num=null,档案份数与 hot/warm 分层全部失真;另需去掉引用正则的\b(否则「档案 37a」匹配不到),并把num_map键由 int 改字符串。
规划会话实测基线(回填进单子,替换档案 53/54 的估算):
INDEX.md= 25,581 字符 / 181 行(档案 54 记的 23,813/169 是第二批前的值)- 旧编号引用 = 25 处 / 12 个文件(档案 53 估 18 处偏少);
docs-audit.py当前:总 103 文件(md 74 / 其他 29)、37 与 38 各 2 份、2 份标题号不符、无悬空引用 - 交接单自身已过 audit:【6】无悬空(注意:T02 改名后,残留的"裸旧号"会变成悬空引用,含归档后的单子自身 —— 已写入单子)
待用户:开 T01 前确认一句「扩展 business-plugins 注册第二个 section(建议 A / 复用现有铺开+探活链路)」还是「新建 @dsh-local/my-skills」。
2026-09-12 工作日志
交接单目录:补「待执行清单」+ 冲突域判定(00:05)
用户问:「待执行的任务是不是应该专门找个文件夹存放」。
答复与落地(延续 2026-09-11 的规划/执行分离):
- 确认已有专用位置:
dsh-server-docs/交接单/(待执行)+archive/交接单-已完成/(完成后git mv过去,首次完成时创建)。放文档库内的理由:执行会话同机可读、随文档库一起 scp 到/opt/dsh/docs、进 git 历史留痕。 交接单/README.md新增 §一 待执行清单(唯一来源 = 本表):T01 / T02 的状态、一句话、冲突域、依赖;原 §一~§四 顺延为 §二~§五。文件 1,867 → 2,806 字符。- 新判定(重要):
T01与T02冲突域重叠(都要改README.md/INDEX.md/03-路线图与待办.md)→ 按skills/dsh-change-workflow「多任务并行调度协议」,两单必须串行、不可同时开两个执行会话;建议顺序 = 先 T02(纯文档零风险)→ 再 T01(动码 + 重启实例)。 - 补防双源漂移分工:
03-路线图管「还没规划的事」,交接单/README §一管「已规划待执行的事」;同一事项两边都出现时状态以本表为准,路线图那行只留指针。
自检:docs-audit.py → 【6】无悬空引用(exit=1 仍来自既有的 37/38 编号冲突,属 T02 范围)。交接单三件:README 2,806 / T01 5,448 / T02 7,428 字符。
未做:未 scp、未 commit(延续纯规划边界;服务器镜像落后一格,由执行会话收尾时一并同步)。
交接单同步到服务器:核验完成 + T02 基线刷新(07:15-07:25)
用户要求:「服务器上没有 /opt/dsh/docs/交接单,这个需要同步到服务器」(= 明确要求,本次打破"纯规划不 scp"的自我边界,仅做被要求的这一件事)。
核查发现(重要):到服务器时 /opt/dsh/docs/交接单/ 已存在,3 个文件已在位且 mtime = 07:16:41 —— 即另一个并行会话刚同步过(就在用户发消息前后)。→ 没有重复覆盖,改为逐文件 md5 核验:三份全部逐字一致(3f2496e1… / 18461408… / 458430a1…)。
顺手抓到的两件事:
- T02 基线已过期:并行会话新增档案 57-60(57 设置面板用户管理入口 / 58 实例内存优化与配额下调 / 59 重连反馈加载动画 / 60 分区改名功能管理),均已登记进 INDEX → 复测:INDEX 25,581 → 28,805 字符(181 → 185 行)、旧编号引用 25 → 27 处 / 13 文件、audit 总文件 103 → 107(md 78)。已把 T02 内 5 处旧数字刷新,并加「基线刷新记录」块 + 「开跑前必须重新取基线,勿沿用旧数字」。
- 再次印证冲突域:T01/T02 与并行通道都改
INDEX.md/README.md/03-路线图→ 必须串行(已写进 T02)。
推送与验收:只重传 交接单/T02-…md 一个文件(scp 绝对本地路径)→ 服务器 md5 与新本机一致 6bdfd884…;权限沿用既有(T01/T02 = 600,README = 644,目录 755)。
bash scripts/docs-sync-check.sh → 一致 107 / 差异 0 / 双端一致 ✅;docs-audit.py → 无悬空引用(exit 1 仍仅来自 37/38 编号冲突,属 T02 范围)。
待用户/后续:① 交接单目录权限是否统一到「归档口径」(目录 700 + 三份全 600,与 04-调整方案/ 一致)—— 未擅自改;② 未 commit/push(按红线)。
规划 T03(7 插件整合)+ 并发冲突处置(08:20-08:55)
用户:① 「规划 D:\dshworkspace\plugin_package 整合成一个插件,可打包后由 admin 整体上传、用户启用即可用」(我先误看了 dsh-plugin-dev,用户纠正为 plugin_package);② 「两个会话同时执行造成冲突,如何解决比较好」。
① T03 单子已产出(交接单/T03-plugin_package整合为单插件并投放.md,9,969 字符)
普查结论(7 包 = 1 宿主壳 + 6 功能页):dsh-plugin-mcn 是宿主(client 3045 + host 3095 + 9 模块;注册 25+ 条 /mcn/api/* 路由、inject=["slots","sessions"]、sidebar.footer.action 入口;提供全局扩展点 window.__mcnEntries(功能页注册表)与 window.__mcnNav(open/openView/back));douyin 三件 + mcn-schedule + social-workbench + voxemw 全靠往 __mcnEntries 注册,其中 douyin 三件 host 面只有 9 行空壳(注释原文"数据复用 mcn 的 /mcn/api/*")→ 拆开逐个启用本身就违背设计。mcn 无 defineTool/tools.register(不给 agent 注册工具)。7 包全无 scripts/build/tgz → 打包链路要新建。
P0 清单(6 项,实测定位):① homedir()/.dsh 硬编码(mcn/config.js:6,28,68、mcn/index.js 14 处、mcn-schedule/index.js:11,27,84)→ 平台须用 $DSH_HOME;② 技能路径硬编码 ~/.dsh/skills/mcn-short-video/subskills/*(12+ 处)→ 只报技能名;③ spawn("powershell")(mcn/index.js:919)Windows-only → Linux 化;④ MCP spawn(npx -y myai-mcp) 每次拉包 → 预装;⑤ lib/*.bak-20260906 ×2 → 打包剔除;⑥ 整包需 dry-run 上传扫描(P0 须为 0)。
头号风险 = 新旧包并存 → 重复注册/duplicate loader entry id 崩溃循环(档案 25 前例)→ 写全四道防线(全新 loader id / 候选池下架旧包 / 先禁旧再启新 / host 面检测旧 id 拒绝启动)。决策点 5 个待用户拍板(social-workbench 实测是 Windows 本地服务(EASEL_DIR、.venv/Scripts/easel.exe、探 127.0.0.1:7860)→ 平台必然不可用,建议不进包)。
② T02 被并行执行会话完成(我转为核验)
- 4 文件已
git mv→ 37a/37b/38a/38b;脚本正则实改 8 处(比单子列的 6 处多,因键类型连带);INDEX 28,809 → 7,468 字符;单子已归档archive/交接单-已完成/。 - 我补修:归档副本里残留 3 处「
档案 3[78]」示例文本(新正则把档案 3[78]匹配成裸旧号3→ 永久悬空;执行会话修了 2 处、漏了 3 处)→ 改为不带档案前缀的写法。结果:docs-audit.py首次结论:无 P0 级问题、退出码 0;双端 108/108 一致 ✅。 - ⚠️ 我犯的错并已还原:用截断到 200 字符的
grep输出当old_string去 Edit 长行 → 误替换掉执行会话的记录行首;已按原文精确还原(Read核对)。教训:长行 Edit 前必须先用 Read 取全文,禁止用截断内容做锚点。
③ 并发冲突:根因与规则(用户提问的直接答复)
三次实证:a) T02 基线数字(INDEX 25,581)被并行新增的档案 57-60 打穿;b) 我把已被对方归档移走的 T02 又推回服务器("幽灵文件",靠对方同步才清);c) 交接单/README.md 与 T01 均被两会话先后编辑。
根因:「谁在占用」只写在文档里,没有机械信号;且本库长期不 commit → 没有 pull/merge 式冲突检测。
已落进 交接单/README.md(执行会话加了 §三 第 0 条:mtime/Edit 失败即冲突/改完 commit;我补两块):① 占用声明 —— 「占用者 / 开始」两列 + mkdir 交接单/.doing-<单号> 原子占位(存在=有人在做,停手);② §三 ⑤⑥ —— 推前必复跑 sync-check,报「仅本地」却不是我的改动 = 停手(幽灵文件);只推自己本次改的文件。
评审「三层方案」+ 落地 scripts/handoff-guard.sh(08:50-09:15)
用户:附上一份分析(根因=并行写无互斥;① §三 第 0 条 ② 文件归属分工表 ③ git commit 常态化;一条经验=用 Edit 不用 Write),问「是否最佳,是否还有更好的方式」。
我的评审(3 处修正 + 3 个缺口)
- 修正①:② 分工表没做到"每文件单一写者"(
交接单/README.md仍是双写)→ 原则应重画为「每个文件只有一个写者」,共享文件只允许单行 Edit 改自己那一行。 - 修正②:③「改完立即 commit」漏了限定 → 必须只 add 自己改的文件(禁
git add -A,与既有红线一致)。实测本库此刻有 26 个别人的未提交文件,-A会把它们一起提交 = 等同"顺手重放别人的文件"。 - 修正③:锁防"同时",commit 防"丢失/可回溯" —— commit 拦不住并发,不能替代锁;提案把 ③ 当主线,主线其实是 lock。
- 缺口④:"迟到的推送"(把已被别人归档/移走的文件又推回服务器 —— 我今天亲身犯过)提案的三层都拦不住;唯一有效判据 = 推前复跑对账 + 看「仅本地」清单里有没有不在你推送清单里的文件。
- 缺口⑤(最大):服务器侧完全无锁 —— 重启/drain/改 env/铺插件/改 nginx 都是共享资源,影响在线用户(档案 58/59 已两次引发报障),而
systemctl不会告诉你 10 分钟前谁重启过 → 只能靠显式锁。已写成交接单/README.md §六(提案,待用户拍板)。 - 缺口⑥:会话生命周期 —— 一个会话干一整天会把过期事实带进判断(我今天就拿着 INDEX=25,581 的旧断言)→ 单子完成即关会话。
已落地:scripts/handoff-guard.sh(只读预检,110 行)
--claim T03 "exec-session-A"/--release T03:锁的占位与释放(mkdir原子;已存在则报出占用者并退出码 1)。- 开工检查:
MINE="<文件...>" bash scripts/handoff-guard.sh T03;推送前:再加PUSH=1。 - 关键设计(测试中修正两次):mtime 只作提示、不作判定(分不清谁改的);硬判定只有两处 —— ① 别人的占用锁;④ 「仅本地(待推送)」里含未声明文件(= 幽灵文件信号)。② 越界改动只提示(本库长期脏,作判定就永远红)。
- 四场景实测通过:重复占位 → 拒绝并报占用者(exit 1)|新占位+释放 ✓|锁冲突 → exit 1 并列出原因|幽灵探针文件(
交接单/_guard-test.md)→ exit 1 并点名|清理后PUSH=1→ 放行(双端 110/110 一致)。测试探针已删,无残留锁。
同步:交接单/README.md + scripts/handoff-guard.sh 双端 md5 一致;docs-audit.py → 无 P0 级问题(exit 0);双端 110/110 一致。
期间观察:并行会话又新增 档案 61(插件管理页官方插件列表加高与底部留白)→ 该库处于活跃写入中,任何写操作前都该跑 guard。
待办盘点(09:05,只读核查)
两处文档漂移(建议由执行会话顺手修):
BRIEF.md:20仍写scope(512M / 150% / TasksMax 128),而档案 58 已把MemoryMax512 → 384 MiB(实测dsh-114801-*.scope MemoryMax=384 MiB)→ BRIEF 是"AI/人首读层",这处漂移会直接误导判断;另需补NODE_OPTIONS=--max-old-space-size=256与NODE_COMPILE_CACHE。03-路线图与待办.md头部仍是 09-11 21:20 合并版,档案 57-61 完全未登记;BRIEF §3 待办仍是旧 6 条 → 待办层滞后(与 T02 修的是同一类问题)。
当前待办口径(本次答复依据):交接单 T01 / T03 待执行(各带决策点,冲突域重叠须串行);03-路线图 §二:平台技能投放(P2)/ 门户 #/files 下载(P3)/ MCN 平台化(暂缓)/ Cookie 域(暂缓)/ 档案 21 后续(暂缓)/ dsh 升级回归 + 会话 GC(触发式)/ B5 加载标记(顺手做);待用户拍板:本机 commit 授权、服务器侧第二把锁(§六)、交接单目录权限统一。
A/B/C/D 决定落地 + T04 建档 + T03 技能随包设计(09:20-09:50)
用户角色再确认:「你是方案规划 不是执行」→ 我把 A/B/C/D 全部落成规划产物(决定写进单子与约定),落地交执行会话。同时用户给出一条推翻我建议的新要求:
业务技能要打包进插件里一起安装使用,不要分开管理。
T03 重设计:技能随插件包投放(§4.1 新增,约 60 行)
- 可行性依据:技能发现位在实例内(
dsh discoverRoot只扫$DSH_HOME/skills;档案 41 §B 实测 rename 即时生效),而插件 host 面就跑在实例内、以用户 uid 运行 → 插件能自己把技能装到位,不需要平台技能管理面。 - 机制:包内
skills/+.manifest.json(名称/版本/文件数/sha256);host 面启动时ensureSkills():读 manifest → 与$DSH_HOME/skills/<name>/.installed.json比版本 → 幂等(一致则跳过)→ 版本不同全量替换(档案 11 同语义)→ 不覆盖用户自建同名技能(跳过+日志+UI 提示)→ 写加载标记。备选软链方案(升插件即升技能、零对账)但须先实测 dsh 扫描是否认软链。 - 技能取舍(实测
mcn-short-video= 11 MB / 711 文件,其中 9.7 MB 在subskills/):✅ 投主技能 + 4 个业务子技能(≈1.5–2 MB);❌ 不投browser-harness(平台无浏览器,档案 38a 实测装不起来)、参考skills/上游全文、nuwa-skill-main/examples/、970 KB 客户样例长图(标了"若你要留,回一句即改");⚠️scripts/mcp-config.json实测含MYAI_FEISHU_APP_ID=cli_a84d0a47f93e1013+ 私域 URLmaiya-trans.youmanvideo.com→ 新增 P0#7「技能原文凭据/情报审查」。 - 互斥:走插件内投后不得再投平台共享技能层(同名 rank 抢)。
- 决策 1–5 全部记为用户 2026-09-12 拍板;
T01决策点 1(扩展现有 business-plugins)已由并行会话按用户原话写好(我这边 Edit 失败=检测到它改过,转为只读核对)。
T04 新建:并发治理落地(A 组)
交接单/T04-并发治理落地-commit常态化与服务器侧锁.md:① 文档库 git 基线提交(⚠️ 需"静态窗口",且逐条 add、禁 -A、不 push)+ 此后只提自己文件;② 服务器侧第二把锁 /opt/dsh/state/.op-lock/(scripts/op-lock.sh claim/release/status,接入 guard);③ 交接单目录 700/600。建议顺序改为 T04 → T03 → T01(T04 越早做未提交内容越少越干净)。
本轮又踩同一个坑(第 3 次):字面量 档案+字符类
docs-audit.py 的引用正则会把我写的示例 档案+3[78]/档案+6[01] 读成裸旧号(3/6)→ 悬空、退出码非 0。连"警告这条坑的说明本身"都踩了一次。已写入 交接单/README §二 的「写引用/数字两个坑」,并改为不自伤的写法(档案 + 3[78] 分离写)。
产物:T03(更新,加入 §4.1 技能随包)、T04(新建)、交接单/README(§一 加 T04 行 + 顺序改为 T04→T03→T01 + §二 两个坑)。docs-audit.py 无 P0 级问题;三份文件双端 md5 一致。
技能裁剪:从"看着像资料"改为「引用驱动」(09:30-09:45)
用户:「参考资料是不需要」→ 我照办前先做了引用扫描,结果推翻了"参考资料"这个判断:三类"像资料"的其实是被引用的功能件。
| 块 | 体积 | 引用实测 | 定稿 |
|---|---|---|---|
mcn-video-prompt/参考skills/(上游技能全文) |
2.0 MB | 0 引用 | ❌ 剔 ✓(用户所指"参考资料"正是这块) |
browser-harness/ |
2.3 MB | 多篇 feature 要求**"浏览器优先"**(01_获取账号信息.md:12、02_获取视频.md:10) |
❌ 剔目录,但必须同步改文档(写"平台无浏览器 → 改走 X"),否则死引用 + agent 反复撞墙(档案 55 现象) |
nuwa-skill-main/ 主体(去 examples) |
104 KB / 11 文件 | 被引为"主方法论"(03_提炼账号设定.md:81、人设卡生成方法.md:186) |
✅ 保留 |
nuwa-skill-main/examples/ |
≈2.4 MB | 引了 examples/mrbeast-perspective/,未引 trump |
❌ 只剔 trump-perspective/;要连 mrbeast 剔就须同改那两行引用 |
references/样例/(svg 19 KB + 长图 994 KB) |
992 KB | 06_生成账号设定卡片.md:67 写"动手前必须先读" |
✅ 保留(用户说的"参考资料不需要"不覆盖它 —— 它是功能件) |
裁剪后:11 MB → ≈3 MB。新增机械校验(防"剔完留死引用"):grep -rIn -E "参考skills|browser-harness|nuwa-skill-main/examples/trump|参考_旧梦留声机" <包>/skills/ | grep -v -E "已移除|无浏览器|不再使用" → 期望只剩说明行。已写入 T03 §4.1 + §6.1 验证 + §八 验收 N/O 三项。
方法论沉淀(可复用):删任何东西之前先扫引用 —— "看起来像参考资料"与"实际被引用"是两件事;这次若按字面执行,会同时打断「生成账号设定卡」与「人设卡生成方法论」两条功能链。
技能完整性核查:6 个技能名 → 5 个找到、1 个缺失(09:28-09:35)
用户问:「skill 是否和插件整合到一起,找到对应 skill 了吗」→ 做了一次插件↔技能引用完整性核查(只读)。
插件侧引用枚举(7 个包全扫):prompt 里出现的 skills/xxx 形态共 6 个技能名:
| 技能名 | 期望形态 | 源是否找到 |
|---|---|---|
mcn-short-video |
主技能(独立技能目录) | ✅ C:\Users\Administrator\.dsh\skills\mcn-short-video(11 MB / 711 文件) |
mcn-dou-analysis / mcn-script-review / mcn-video-prompt / mcn-data-insight |
主技能内 subskills/ |
✅ 4 个都在(随主技能目录一并投放,不需要单独投) |
douyin-top-account |
期望在 subskills/ |
❌ 全盘未找到:~/.dsh/skills/mcn-short-video/subskills/ 下只有 5 个(browser-harness + 上述 4 个),D:\dshworkspace/D:\github/D:\AI技能 亦无 |
引用位置(活的,非注释):mcn/lib/index.js:3085、3086(账号日榜/周报抓取流程,--period day)、mcn/lib/workshop.js:9,22(榜单落盘口径 + 赛道白名单同源)。
含义:即便技能随包投放,插件的「榜单更新」能力仍会失败(agent 找不到 subskills/douyin-top-account)。→ 已立为 T03 §五#8(P0)+ 写进 §六 步骤 2「未确认前不要打包」,三个选项:① 补进包(推荐)② 已废弃 → 改写 index.js:3085-3086 与 workshop.js 的 prompt 去掉榜单任务 ③ 走 MCP 兜底。
低优先待核:技能 变更日志.md 提到 lieflat-charts 子技能,磁盘上同样不存在 —— 但该文件属历史记录,不构成活引用(若要严格,可在打包前顺手核一次)。
⚠️ 更正:douyin-top-account 并未缺失 —— 是我搜索深度不够(09:35-09:45)
用户指出技能完整、在 C:\Users\Administrator\.dsh\skills\mcn-short-video → 复核确认用户对:
douyin-top-account 真实路径 = subskills/mcn-data-insight/subskills/douyin-top-account/(含 SKILL.md / README.md / README.en.md)。
我上一轮的 find -name "*douyin-top*" -maxdepth 5(相对 .dsh)差一层 → 误判"缺失"。教训:技能树是多层的,核层级不能用浅 find(已写进 T03 §4.1 提示 + §6.1 验证)。
真实技能树(实测):mcn-short-video = 11 MB / 711 文件 / 36 个 SKILL.md
- 主技能 1(
SKILL.md+references/+references-add/+scripts/) - 一级子技能 5:
mcn-dou-analysis(内含subskills/nuwa-skill-main)、mcn-script-review、mcn-video-prompt、mcn-data-insight、browser-harness mcn-data-insight(869 KB)本身是"技能集索引",下挂 12 个二级子技能(全部带 SKILL.md):douyin-top-account140K /douyin-account-diagnosis136K /douyin-rise-ranking76K /douyin-hot-trend72K /douyin-ai-feed/douyin-prohibited-word/playlet-douyin-feed/douyin-weekly-surge/douyin-works-crawler/douyin-content-surge/douyin-daily-hot/douyin-search- ⇒ 插件 prompt 写
subskills/douyin-top-account少一层(真路径多mcn-data-insight/)→ 并入 P0#2「只报技能名」一起修(不是缺文件)。 - 裁剪后体积更正:11 MB → ≈4.3 MB(剔
参考skills2.0 +browser-harness2.3 +nuwa/examples2.4)。
技能落地方式与撞名规则(T03 §4.2 新增,用户提问定稿)
Q1 装到 $DSH_HOME/skills/ 还是"就在插件内目录使用"?
关键事实:dsh 技能扫描根是固定集合(~/.dsh/skills rank300 / .dsh/skills rank100 / .agents/skills rank200 / 平台 bundledSkillDir),插件包目录不在其中 ⇒ "就用插件内目录"= agent 无法按技能名加载,只能靠 prompt 给绝对路径。
三方案:A 复制(能按名加载;每用户 4.3 MB + 版本对账)|B 软链(能按名加载、零副本、升级即生效;须先实测 dsh 是否跟随 symlink;用户删/禁会断链)|C 不落扫描根 + prompt 给包内绝对路径(零冲突,但用不了 skill 名、用户不可见)。
→ 定稿:B 优先(一条实测命令即可确认)→ 退回 A → C 仅兜底。
Q2 同名技能怎么办(三层):① 插件 ↔ 用户自建 → 让位(不覆盖 + 日志 + UI 提示,档案 41 有同名 409 先例)② 插件 ↔ 平台共享层 → 互斥(本单不投共享层;共享层 rank 更高会压住)③ 插件 ↔ 别的插件 → owner 标记 + 先到先得 + 冲突报错:.installed.json 记 owner: <包名>@<版本> / skillVersion / sha256;无标记=用户自建→让位、owner=自己→按版本对账、owner=别的包→拒绝写并报出 owner。不建议给技能名加命名空间前缀(要改所有 prompt 且用户看着怪)。
T03 现状:18,851 字符 / 263 行;docs-audit.py 无 P0;双端 md5 一致。§五#8 不再构成开工阻塞(降级为"并入 P0#2 修")。
11:46 状态核查:任务进度 + 冲突治理是否闭环
用户问:刚才几个任务执行了吗?多任务并行文档冲突是否已解决?→ 只读实测(不凭记忆):
| 单 | 状态 | 证据 |
|---|---|---|
| T02 | ✅ 完成 + 已归档 | archive/交接单-已完成/T02-…md |
| T03 | 🔄 执行中 | 交接单/.doing-T03 锁(10:16)OWNER =「exec-session-B(当前会话,接管自 exec-session-A)」;T03 文件仍是我 09:36 的版本 |
| T04 | ⏳ 未开工,但 ①已被并行会话实质完成 | 文档库 HEAD 43e4ae9 → b06f7dd,09:06–09:28 5 次提交(96f8ef8 基线含档案 57-61 + T02 收尾 → be42155 档案 62 → b06f7dd manifest);未提交 26+ → 13。②③ 未做:/opt/dsh/state/.op-lock 不存在;交接单 目录仍 755、README.md 644、T04 644(T01/T03 已 600;对照 04-调整方案=600) |
| T01 | ⏳ 未开工 | 无 .doing-T01;文件 mtime 07:22 未变 |
并行冲突治理:已缓解、未闭环(四层证据)
- 机制 ✅(占用锁 / 写者归属 / guard / 收尾四件套 / 会话生命周期,均已写入
交接单/README)。 - git 检测能力 ✅ 已恢复(昨天"长期不提交"的根因已被解决)。
- 实测正证 ✅:这两小时并行新增 4 份档案(62/64/65/66)+ 2 个新技能目录(
skills/dsh-decision-method/、skills/dsh-feature-first/),无内容丢失;我这边 2 次 Edit 被拦截(= 检测生效而非丢失)。 - ❌ 未闭环:① 服务器侧锁未做(重启/drain 仍无互斥,最高危)② 权限未统一 ③ 新发现:服务器
/opt/dshs有 13 项未提交(orchestrator.ts/proxy.ts/portal.html/ensure-biz-plugins.cjs/新增ensure-anysearch-*.cjs…,HEAD 仍ebe8075)→ 代码侧没有 git 路标,2 小时成果只在服务器工作区 ④ 文档库仍 13 项未提交。
发现他方一处问题(未越界修):04-调整方案/64-接入AnySearch搜索provider.md 引用了不存在的档案号 63(跳号)→ docs-audit.py 退出码非 0。按写者归属(04-调整方案/ = 执行会话 lane)我没动,只在回报里指出。
T04 已更新为与现实一致:新增 §〇 执行进度表(①✅ 已由并行会话完成 + ②③❌ + ④ 新缺口:平台代码库提交)、新增 §五 5.1「平台代码库提交」(服务器 commit → bundle → 本机 merge,push 需用户明示)。单子范围收窄为 ②③④,顺序 ④ → ② → ③(代码未提交是当前最高风险)。T04 双端 md5 一致。