401 lines
45 KiB
Markdown
401 lines
45 KiB
Markdown
# 工作日志 · 2026-09(第 17 片)
|
||||
|
|
|
|||
|
|
> ⚠️ **本目录日志已按【月】分片**(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-13.md
|
|||
|
|
> **上一片**:`2026-09-下15.md` **下一片**:`2026-09-下17.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
## 17:09–17:2x · 用户「改造完成验证通过后改造文档全部删除;先继续完成后续任务并验证」
|
|||
|
|
|
|||
|
|
### 用户新指令(记住)
|
|||
|
|
- 🔴 **全部改造完成且验证通过后 → 改造文档全部删除**(`dsh-server-docs` 整个删)。**现在不做**,等收尾时执行。
|
|||
|
|
- 先继续完成后续任务并验证。
|
|||
|
|
|
|||
|
|
### ⛔ 阻塞:全局执行锁被 `univer-worker-socket-fix` 占(16:37 起)
|
|||
|
|
- 取证:锁 32 分钟、**近 25 分钟内被改的文件只有我自己的**(`03-路线图` + 我的记忆)⇒ **疑似僵尸锁**;但 R9 规定锁的处置权只属于用户 ⇒ **我未擅动**,需用户一句话。
|
|||
|
|
- 受影响:一切需写文档/代码/服务器的任务(T03 的 D/J/P·Q、T01、R2、R5 全部开不了工)。
|
|||
|
|
|
|||
|
|
### 本轮做掉的(纯只读,不需要锁)—— T03 未验 6 项中的 3 项
|
|||
|
|
包:`D:\dshworkspace\plugin_package\dist\dsh-plugin-mcn-suite-0.3.9.tgz`(md5 `2ff1a2fa775891085949d50452394fa0` = 与池内一致 ✓)
|
|||
|
|
|
|||
|
|
- **L 凭据扫描 ✅ 通过**:`ak_`+32hex **0**、`sk-` **0**、`app_id=` **0**、`*.alotbuy.com` **0**;125 处命中全是**变量名/文档说明**;唯一 1 处 32+hex 是 `skills/.manifest.json` 的**文件哈希**(非密钥)。
|
|||
|
|
- **O 包体积与技能树 ✅ 通过(口径澄清)**:**SKILL.md = 18 个**,而 §八 期望「36 个」是**笔误** —— 实测结构 = 主 1 + 一级 4 + `mcn-data-insight` 下二级 13 = **18**,与 §八 的文字描述**完全吻合** ⇒ **不是漏裁**。包总 4.27 MB / skills 3.55 MB。
|
|||
|
|
- **N 死引用 ⚠️ 未能定判(我的自动判据过严)**:脚本扫出 63 处「包内路径对不上」,但**抽样 8 个里 5 个是误报**(文件其实在,只是引用省略了 `references/`、`references/知识库/` 前缀);**真正存疑的是 4 个 md 文件名**(`05_故事选题.md` / `06_短视频框架.md` / `07_短视频大纲.md` / `失误与规避记录.md`)。**客观事实:内容基本齐全**(16 个 `scripts/` 目录、**27 个 `.py`**、263 个 `.md`、references 知识库 12 类齐全)⇒ **不能判为不合格**,需人工逐条读约 63 条才能定性。⚠️ 教训:路径引用完整性**不能只看「文件是否存在」**(还有「省略前缀」「跨目录相对路径」两种正常形态)。
|
|||
|
|
|
|||
|
|
### 仍在等的(需锁)
|
|||
|
|
- T03:**D**(启用→重启→入口逐个点开)、**J**(agent 按技能名加载)、**P·Q**(软链落地 + 三种撞名场景)—— 需实例 + 浏览器
|
|||
|
|
- T01(实例内「我的技能」)、R2(原生弹窗管理面)、R5(i18n)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17:2x · 澄清 + 记录:`univer-worker-socket-fix` 锁**是活的**,写完本段即释放
|
|||
|
|
|
|||
|
|
### ⚠️ 给后续会话的澄清(重要,防止误判)
|
|||
|
|
上文「阻塞:全局执行锁被 `univer-worker-socket-fix` 占(16:37 起)→ 疑似僵尸锁」—— **不是僵尸锁**:那正是**另一会话(univer 修复会话)在实做**,16:37 抢锁、**17:2x 已 `--release-exec`**。
|
|||
|
|
教训(R9 得到正面验证):**「没产出文件」≠「锁死了」** —— 该会话大量时间花在**只读复现**(起独立 gateway、给 worker 插探针、跑假网关),不写受保护根 ⇒ 从外面看就像"锁着不动"。**判据只能是用户**,AI 不得据此接管(本次两边都守住了)。
|
|||
|
|
|
|||
|
|
### 该会话做完的事:guest univer 插件 → `dsh-univer-office` 0.2.24(已上线并验收)
|
|||
|
|
- **现象**:guest 会话 `session-21ba73b0`(16:12–16:23)`univer_execute` / `univer_inspect` 全线 `COLLABORATION_UNAVAILABLE`。
|
|||
|
|
- **根因 1(真因·插件侧)**:worker 三个 unix-socket 垫片**全被废掉** —— `entry.ts` 顶层 `await main()` 排在模块级 `const` 之前,打包器把它降级成 `var` 提升 ⇒ 垫片运行时 `SOCKET_ORIGIN === undefined` ⇒ `startsWith(undefined)` 恒 false ⇒ **静默回落真 fetch** → 拨号主机名 `unix`。**0.2.16–0.2.23 全中**。
|
|||
|
|
修:三处 install 提到顶层 await 之前 **+** 垫片内改用函数内字面量(双保险);`http.request` 垫片补认 URL 对象形态;`ws` 取不到时**出声报错**(原来静默吞)。
|
|||
|
|
- **根因 2(环境侧,修完 1 才暴露)**:`@univerjs-pro/engine-formula-rust-binding` 的 linux-x64-gnu 要 **glibc ≥ 2.35**,本机 Alibaba Cloud Linux 3 = **glibc 2.32** ⇒ 建投影时 uncaught 崩。
|
|||
|
|
修:新增 `src/workers/unit-content/rust-formula-engine-host-compat.ts` + `scripts/build.mjs` 的 `rustFormulaEngineHostCompat()`(**只作用于 worker**;绑定可用则原样交上游 ⇒ **宿主升级 glibc 后自动恢复 Rust**)。
|
|||
|
|
- **投放**:`0.2.24`(tgz md5 `c1a12688ca70c51a321d75ad7a8aefbd`)→ admin 接口 `POST /api/plugins/business` 重新登记(`compat=ok`,**未用 trust override**)→ `POST /api/plugins/mine/apply`。
|
|||
|
|
⚠️ **apply 对「已启用」插件是 noop**(`toEnable` 只算「新选中且不在 bundles」的项)⇒ **更新已启用插件必须「停用 → 启用」两步**(平台缺口,已记档 §四 遗留 3)。
|
|||
|
|
- **验收**:实装 worker md5 与构建产物**逐字节一致**(`b74584db…`);以 **tenant uid 100002 + unix socket** 跑**实装产物**:doc / sheet `execute` 均 `ok:true`(真读到 `Sheet1`)。
|
|||
|
|
- **落档**:`04-调整方案/76-…unix-socket与同源代理.md` §追加(根因 / 修复 / 投放 / 验收 / **复现配方** / 回滚);四件套 rc=0;**双端 141/141 一致**;镜像属主已修 `root:root 600`。
|
|||
|
|
- **遗留**:`univer_screenshot` 仍缺 Chromium;`ws` 仅是上游 devDependency(靠 `.pnpm/node_modules` 提升才解析得到,脆弱);apply 接口不重装已启用插件。
|
|||
|
|
- **清理**:测试 gateway 进程 / `/tmp/uvfix` / 4 条 `poc-curl2` 临时会话 均已清;未 commit(用户未要求)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17:33–17:4x · 解锁后收口 + T03 继续推进
|
|||
|
|
|
|||
|
|
### 收口(已提交 `28be519` 并推送,双端 141/141)
|
|||
|
|
- **对端 `univer-worker-socket-fix` 的成果已并入**:档案 76 追加「真因定位 + 修复 + 已投放并验收」74 行(含复现配方)⇒ **档案 76 的 🔴 P1(`/univer-api/state` 生产 400)已闭环**。
|
|||
|
|
- **本会话独立复核 P1 确已修好**:近 2 小时 400 **= 0**;近 30 分钟 6 次 `/univer-api/state` 请求**无 400**;实例 env `UNIVER_DSH_GATEWAY_SOCKET=auto` 已生效。
|
|||
|
|
- 我把 03-路线图 的 P1 行标为「已修复并验收」,并修正 R3 行(原被改名脚本写成 `dshs`→`dshs`)。
|
|||
|
|
|
|||
|
|
### T03 未验 6 项 → 又清 1 项(累计 L/O/P 三项已过)
|
|||
|
|
- **P 技能落地形态 ✅ 走 A(复制)路径**:admin 实例 `skills/mcn-short-video` = **实体目录**(18 个 SKILL.md / 4.6 MB),非软链 ⇒ 符合 §4.2「软链不通则用复制」的兜底 ✓。guest 侧 `home/skills/` 尚未生成(未启用,符合预期)。
|
|||
|
|
- **容量阻塞已解除**:`PLUGIN_MEM_MB = { univer-office: 512, mcn-suite: 128 }`;guest 当前 `MemoryMax` = **672 MiB**(160+512);**启用 mcn-suite 后自动 → 800 MiB** ⇒ 原来的「装不下」不再成立(R1 动态配额已取代写死档位)。
|
|||
|
|
|
|||
|
|
### ⛔ 剩余 D / J / Q 的硬依赖:需要 **guest 自己的登录态**
|
|||
|
|
- 启用走 **`POST /api/plugins/mine/apply`**(`requireAuth`,cookie `sid`)⇒ 必须用**该用户**登录;admin 代不了,因为 `/api/plugins/mine` 是「我的」语义。
|
|||
|
|
- 平台 CLI 只有 `start` / `bootstrap-admin` / `file-service`,**没有启停插件命令**;文档里**没有**测试账号口令记载 ⇒ **我拿不到凭据**。
|
|||
|
|
- 备选路径(未采用,待用户定):① 用户点两下启用(2 秒);② 给我 guest 口令;③ 我用 `bootstrap-admin` 建一个**临时 admin**、启用后验 D/J/P·Q、验完删掉(会动生产 auth,所以先问)。
|
|||
|
|
- 我已**释放锁与 .doing-T03**(不空占,避免又出现僵尸锁)。
|
|||
|
|
|
|||
|
|
### 教训入库(本轮)
|
|||
|
|
- 路径引用完整性**不能只看「文件是否存在」**:省略前缀、跨目录相对路径都属正常形态(T03 的 N 项我第一版判据因此误报 5/8)。
|
|||
|
|
- 文档库里**抢锁要单独一条命令并当场看 OWNER 文件**(guard 会同时打印成功与失败两段文案,容易误判)。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17:42–18:0x · R2 落地:插件新增原生「平台管理」只读分区(档案 82)
|
|||
|
|
|
|||
|
|
### 用户澄清的问题
|
|||
|
|
- 「**多租户改造完成了吗**」→ **早完成了**(09-08 架构切换:`dshs` + account 硬隔离 + 每用户子域 + 每用户实例)。**R0–R5 不是多租户改造**,而是在这个**已上线的多租户平台上做架构重构与优化**(档案 81)。
|
|||
|
|
- 「R2 未做」→ 属实;且它的两个门禁**都已过**(形态用户已拍板 §9.2b、R5 权限影响评估已出 §9.2)⇒ 本轮**开工**。
|
|||
|
|
|
|||
|
|
### R2 已落地的部分(代码 + 产物)
|
|||
|
|
| 项 | 结果 |
|
|||
|
|
|---|---|
|
|||
|
|
| `poc/business-plugins/lib/client.js` | **895 → 1083 行**:zh/en 词典各 **+29** 个 `pa.*` 键 + `PaCard` + `PlatformAdminSection` + 新的 `settings.section` 注册(`id=platform-admin`, `order=102`) |
|
|||
|
|
| 形态 | **原生渲染**(复用 `--dsw-*` token 与 06 规范字号),**非 iframe** ✓ 符合 §9.2b |
|
|||
|
|
| 只读子集 | 实例/熔断(`/api/dsh/status`)、用户(`/api/admin/users`)、存储(`/api/admin/storage`)、候选池(`/api/plugins/business`)、运行时(`/api/admin/runtime`);**角色门禁**走 `/api/auth/me` |
|
|||
|
|
| 写操作 | **回跳平台管理台**(`window.open(portalHost() + 门户页路径)`)—— 不复制门户写 UI |
|
|||
|
|
| 可见性 | **仅 admin**(非 admin 只渲染一行说明) |
|
|||
|
|
| 验证 | `node --check` ✅ | 包结构 ✅(顶层仅 `package/`、4 条目、无 `.tgz`/`node_modules`/`.bak`) |
|
|||
|
|
| 产物 | `dsh-local-business-plugins-0.2.9.tgz`(16,712 B);版本 0.2.8→**0.2.9** |
|
|||
|
|
| 档案 | **新建 `04-调整方案/82-R2管理面就地化-原生平台管理分区.md`**(占号 82,原子占号→写完释放) |
|
|||
|
|
| 提交 | 文档库 **`91fcbca`**(双端 **142/142** 一致)|代码仓 **`8d5597b`**;锁已释放 |
|
|||
|
|
|
|||
|
|
### ⛔ R2 仍未完成(两部分)
|
|||
|
|
1. **投放 + 启用 + 浏览器验收** —— 投放走 `POST /api/plugins/business`(**requireAdmin**)⇒ **需要 admin 登录态**;CLI 无投放命令、文档无测试口令。**这是本轮唯一卡点,且与 T03 的 guest 启用是同一个卡点。**
|
|||
|
|
2. **R2 的另一半**:`/admin` 路由族 + 删 3 个跳转桩页(`desktop/plugins/skills.html`,247–265 B)+ **必须同时加 301**(否则书签断)+ 静态页断言 9→6;以及注入层 CSS 类统一 `.dshs-*`。
|
|||
|
|
|
|||
|
|
### 本轮方法论教训(可复用)
|
|||
|
|
- **动笔前先读目标文件的既有风格**(token / locale / slot 注册 / 组件写法),新代码才能与之同源;本次读了 5 段才动笔,一次写成、`node --check` 一次过。
|
|||
|
|
- 用 python 做**带 assert 锚点**的多处插入:锚点不中就抛异常且**不写文件** ⇒ 天然原子,比 sed 安全。
|
|||
|
|
- 路径里出现**中文 + 空格**时,tar/scp 的清单要用 tar 的 `-T 清单文件`,不要拼字符串。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17:5x · 第二轮:guest 自测暴露「写入假错误」⇒ 真因在 **gateway 侧**,已修并投放 **0.2.25**
|
|||
|
|
|
|||
|
|
**背景**:用户让我复看 guest 最新会话 ⇒ guest **自己在同一会话复测**(17:34–17:37):内容读写层**已恢复**(Sheet 值/公式/重算、Doc、Base、Board、Slide 读取全通过,数据真落盘)。
|
|||
|
|
但它同时报了两件事,第一件是我的修复不完整:
|
|||
|
|
|
|||
|
|
- **① 写操作常报 `Collaboration HTTP request failed`,但数据其实已落盘**(有「报错就重试 → 重复写入」风险)。
|
|||
|
|
我组件级复现(租户 uid + socket + 实装产物 + 写入型 execute)⇒ **真因:gateway 在提交 changeset 时也要建 workbook 投影** ⇒ 撞同一个 **glibc 2.32 < 2.35** 崩溃 ⇒ **网关整进程死**(日志 `Failed to load native formula engine binding`)⇒ 客户端读到连接被重置 ⇒ 假错误;数据在崩前已落盘。
|
|||
|
|
⛔ 即:我上一轮「网关只读快照、不建投影、不用打补丁」的判断**是错的**。
|
|||
|
|
**修**:① `build.mjs` 把 `rustFormulaEngineHostCompat()` **也挂到 gateway 构建**;② 修跨产物差异 —— CJS 产物里 esbuild 把 `import.meta` 降级成空对象 ⇒ `createRequire(import.meta.url)` 抛 `ERR_INVALID_ARG_VALUE`(**网关启动即崩**)⇒ (a) 垫片内改 `typeof __filename === 'string' ? __filename : import.meta.url`;(b) 插件在 **CJS 产物**下把垫片自身 import 显式指向该包 **CJS 入口**(`lib/cjs/index.cjs`)。
|
|||
|
|
**验收**:实装产物 + 租户 uid + socket:写入返回 `ok:true, committed:true, revision:4`;socket 失败 0、网关存活、崩溃 0、数据落盘 ✅。
|
|||
|
|
- **② 导入导出(xlsx/csv/docx/pptx)仍不可用**:`@univerjs-pro/exchange-node` 的 loader **只试** `exchange-node-binding`(**无 JS 回退、无 env 覆盖**,与公式引擎不同)⇒ 本机 glibc 2.32 必失败。渲染类(svg/lint/screenshot/pdf)缺 Chromium。**两者都超出插件能修的范围 = 宿主/镜像决策。**
|
|||
|
|
|
|||
|
|
**投放**:`[email protected]`(md5 `01f0f3828a09b3fc4fa4269e519378ba`)→ admin `POST /api/plugins/business` 重登记 → `mine/apply` **停用→启用**(task 终态 `success`,不是 `done`,轮询别只判 done)。实装 gateway.cjs md5 `81e468a5343832ce1da4cc0852c08477` = 本地构建,**逐字节一致**。
|
|||
|
|
**落档**:档案 76 §追加(第二轮:真因/修/验收/两条环境级遗留)→ 四件套 rc=0 → **双端 142/142 一致**。
|
|||
|
|
**清理**:测试 gateway、`/tmp/uvfix2`、4 条 `poc-curl2` 临时会话 已清。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18:0x–18:1x · 用户给 guest 凭据 + 禁用 Playwright(已写进规则)
|
|||
|
|
|
|||
|
|
### ✅ T03 的 guest 启用**成功了**(长期阻塞项解除)
|
|||
|
|
- 用 guest 凭据以无头浏览器登录 `alotbuy.com`:`guest` / `role=active` ✓
|
|||
|
|
- 启用前候选池:`dsh-plugin-mcn-suite=off`、`dsh-univer-office=ON`
|
|||
|
|
- `POST /api/plugins/mine/apply` `{plugins:[{id:'dsh-plugin-mcn-suite',enabled:true}]}` → `taskId=c20739a6dbe8975c`
|
|||
|
|
- 任务轮询 → **`status=success`, `stage=完成`, `restarted=true`** ✓;启用后 `dsh-plugin-mcn-suite=ON` ✓
|
|||
|
|
- 最终 bundles:`@deepseek-ai/dsh-base`、`dsh-web-app`、`@dsh-local/{business-plugins,portal-entry,workspace-scoped-picker}`、`dsh-univer-office`、**`dsh-plugin-mcn-suite`** ✓
|
|||
|
|
- ⚠️ 平台是**单活跃会话 last-wins**:我这次登录**顶掉了 guest 此前所有会话**(用户给的凭据,按此执行)。
|
|||
|
|
|
|||
|
|
### 🔴 规则变更:**Playwright 全面禁止**(用户 2026-09-13 明令「playwright 禁止使用,加到规则中」)
|
|||
|
|
- 已写进技能 `dsh-change-workflow`(**两处**,此前**自相矛盾**:第 73 行把 `playwright-core` 写成「只读验收默认路径」,第 103 行却写「禁 Playwright」)⇒ 已统一为**禁止**,并明确:
|
|||
|
|
- 允许的工具**只有两件**:**`agent-browser`(本项目默认,独立浏览器不碰用户环境)** / `browser-harness`(CDP 9223,附着用户 Chrome,**必须先 `list_tabs()`**);
|
|||
|
|
- 静态页与 API 取数优先 `curl` / WebFetch。
|
|||
|
|
- **我的选择 = `agent-browser`**(理由:独立浏览器,无覆盖用户 cookie 的风险;`browser-harness` 的 9223 当前也没开)。
|
|||
|
|
- 已删除我用 playwright 写的临时脚本;技能归档副本已同步(md5 一致);文档库提交 **`3b19a34`** 并推送;双端 **142/142** 一致。
|
|||
|
|
- ⚠️ 技能里仍保留 2 处 playwright 的**历史记录**(行 217 的「对照」、行 660 的「未做」)—— **不是指令,是史实**,未删。
|
|||
|
|
|
|||
|
|
### ⚠️ 我自己的重复错误(第 3 次同类)
|
|||
|
|
- 用 python 写文件时,把**中文/英文双引号**直接嵌进 python 双引号字符串 ⇒ `SyntaxError`,**本轮连犯 2 次**(`_m10.py`、`_fixbrowser.py`)。
|
|||
|
|
- **对策(已固化到习惯)**:python 字符串里**一律用「」**,或 `Q = chr(34)`;**禁止**在字符串里直接写 `"`。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18:0x · 能力澄清(用户确认真实用法):不是「Univer 导出」,而是「AI 直接生成文件 + Univer 在线看」
|
|||
|
|
|
|||
|
|
用户口径:**用法 = 和 AI 对话 → AI 生成 md/doc/excel 等文件 → Univer 在线看 → 下载的就是 AI 生成的那个文件**。
|
|||
|
|
|
|||
|
|
据此核对实例现状(只读):
|
|||
|
|
- 实例 Python 只有 `requests/urllib3/idna/certifi/charset_normalizer` ⇒ **无 openpyxl / python-docx / python-pptx**(egress 受限,pip 装不了)。
|
|||
|
|
- Node 侧 **`.pnpm/node_modules/xlsx`(SheetJS)存在** —— 但那是**业务插件顺带带的依赖**(档案 16/79 的 mcn-suite 补 `xlsx`),不是基础镜像自带 ⇒ **不能当稳定能力**,业务插件卸载后可能消失。
|
|||
|
|
- 其它 office 类 JS 库(docx/pptx)**没有**。
|
|||
|
|
|
|||
|
|
⇒ 结论(写进了给用户的答复):「AI 生成文件 + 下载」这条路**不碰 univer 原生绑定**,现在就能用(md/csv/json 任意;xlsx 靠 SheetJS)。
|
|||
|
|
真正受 glibc 2.32 影响的只剩两件事:① **把外部 xlsx/docx 导入 Univer 在线看**;② **把 .univer 导出成 Office 格式**。
|
|||
|
|
而「AI 直接用 univer 工具写 .univer」这条(`univer_new/unit/execute`)**已修好**,所以「在线看」这一环**根本不需要导入**。
|
|||
|
|
⇒ 给用户的默认建议 = **零改动**:要看 → AI 直接生成/编辑 `.univer`;要交付 → AI 另存一份 md/csv/xlsx。只有「必须 Excel/Word 打开」或「外部 xlsx 要进 Univer」才需要动宿主 glibc(方案 A)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18:0x–18:1x · T03 正式收尾并归档(用户问「这个事情不是已经验证通过了吗」)
|
|||
|
|
|
|||
|
|
- 用户是对的:**T03 单子自己的结论(原文)**就是「**主体已通过(8 项实证)**;未验的 6 项 D/J/L/N/P·Q 属『需浏览器或需造场景』,**不阻塞投放**」。
|
|||
|
|
- 我此前说的「剩 D/J/Q」= 单子自己划为**不阻塞**的锦上添花项,**不是没做完**。但**流程上确实没收尾**(台账仍写「🔄 进行中」+ 两个**已解除**的前置;单子未归档)⇒ 本轮补上:
|
|||
|
|
- 单子状态改 ✅ + 追加 **§十 收尾记录**(guest 启用成功 / 容量前置解除 / L·O·P 三项新通过 / N 未定判 / D·J·Q 未验)
|
|||
|
|
- `git mv` → **`archive/交接单-已完成/`**(与 T02/T04/T05 并列)
|
|||
|
|
- **三处台账同步**:`INDEX.md §四` / `交接单/README.md §一` / `03-路线图与待办.md §二`
|
|||
|
|
- 镜像同步**含删除服务器旧路径**(`交接单/T03-...md` 删掉、`交接单/` 空目录 rmdir)⇒ 双端 **142/142 一致**、仅服务器 0
|
|||
|
|
- 提交 **`2773689`** 并推送
|
|||
|
|
- 📌 **待执行单现在只剩 `T01`(实例内「我的技能」)** —— 决策点已定(扩展 `business-plugins`)、无阻塞、可开工。
|
|||
|
|
- **T03 遗留(可选,不阻塞)**:D(实例内入口逐个点开)/ J(agent 按技能名加载)/ Q(三种撞名场景)/ N(死引用 63 处需人工逐条判,抽样 5/8 为误报)。
|
|||
|
|
- ⚠️ 归档后**代码仓无改动**(本轮只动文档库);锁已释放。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18:0x–18:2x · 「可以加入」→ 自裁后落地 **office-file-generation 技能**(随 univer 插件投放,0.2.26)
|
|||
|
|
|
|||
|
|
**背景**:用户「可以加入」。我先发起一次提问,被**提问闸门拦下**(属技术项,须自决)⇒ 按 8 条裁决顺序自答后定案:
|
|||
|
|
- ❌ 不动宿主 glibc(「保真 Office 交付」才值得的基础设施决策,留给用户)
|
|||
|
|
- ❌ 不改平台 profile 基础依赖(影响面扩到全体用户,不对称)
|
|||
|
|
- ✅ **最小落点 = 随包技能**:univer 插件的 `skills/` 本就是「随包投放 + 实例 AI 真能加载」的既有机制(guest 会话里 `skill{name:'univer-sheet'}` 成功过)
|
|||
|
|
|
|||
|
|
**实现**
|
|||
|
|
- 新增 `skills/office-file-generation/`:`SKILL.md`(触发词含 docx/xlsx/pptx/Word/Excel/PPT/报告/周报/榜单/汇报,并**明确写清「不要」用它处理 Univer 导入导出**)+ `scripts/office_gen.py`(**零依赖**,stdlib `zipfile` 手写 OOXML;docx/xlsx/pptx + `csv2xlsx` 四种入口)。
|
|||
|
|
- ⚠️⚠️ **易踩点**:技能是**显式清单**注册的(`src/host/skills/plugin.ts` 的 `DEFINITIONS`),**不是扫目录** ⇒ 只丢文件进去**不会生效**,必须同时改清单 + `node scripts/build.mjs lib`。
|
|||
|
|
- 能力:标题层级/段落/项目符号/表格/多 sheet/列宽/加粗表头/**真公式**/多页幻灯片;缺图片、图表、页眉页脚、目录、自动编号。
|
|||
|
|
|
|||
|
|
**验证(三层)**
|
|||
|
|
1. 结构:zip + 全 XML 可解析;
|
|||
|
|
2. **严格解析器**(隔离 venv 装 python-docx / openpyxl / python-pptx 读回):docx 段落与样式、表格 3×3、xlsx 公式 =SUM()/表头加粗/列宽、pptx 多页文本 —— **并因此抓到真缺陷:w:tbl 缺必需子元素 w:tblGrid**(已修);
|
|||
|
|
3. 平台侧:服务器 python3.12 实跑 + **租户 uid 100002** 用**实装脚本**生成三种文件全部成功。
|
|||
|
|
|
|||
|
|
**投放**:`[email protected]`(md5 `4bfdf89bed52dc87b420a520caa7176a`)→ admin `POST /api/plugins/business` 重登记 → `mine/apply` **停用→启用** → 技能确认入包(`$PKG/skills/office-file-generation/{SKILL.md,scripts/office_gen.py}`)。
|
|||
|
|
|
|||
|
|
**未完成(下次接手先做)**
|
|||
|
|
- ⛔ **档案 76 的第三轮追加没写成**:抢全局执行锁时**被别的会话持有** ⇒ 按 R9 停手(不抢不接管)。要点即本段,**等锁释放后补进 `04-调整方案/76` §追加**(用户口径、自裁依据、技能落点与易踩点、三层验证、0.2.26 投放、与导入导出的边界)。
|
|||
|
|
- 顺带观察:`mine/apply` 返回的 enabled 列表里已出现 `dsh-plugin-mcn-suite` ⇒ **T03 会话已给 guest 启用 mcn-suite**。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18:12–18:35 · R2 部署 + 删桩页 + 🔴 修掉一个「改名事故」遗留的真回归
|
|||
|
|
|
|||
|
|
### ✅ R2 部署完成(用户给了 admin 凭据 `Dsh@Admin2026!`)
|
|||
|
|
- 关键发现:**`@dsh-local/business-plugins` 不走候选池**,而由 **`ensure-biz-plugins.cjs`** 铺发 —— 它从 **`/opt/dsh/artifacts/`** 取**版本号最大**的 `business-plugins-*.tgz`(`--all` 含 admin、`--restart` 让 bundle 生效)。
|
|||
|
|
- 执行:丢入 `business-plugins-0.2.9.tgz` → `node scripts/ensure-biz-plugins.cjs --all --restart` ⇒ **admin 与 guest 的 profile 均 0.2.8 → 0.2.9**、`bundles` 均含该包 ✓;磁盘新代码特征「平台管理」×5 ✓;两实例已重启并 running。
|
|||
|
|
- 三段式验收(`06-工作台UI规范 §7.3`):**只做到第①段(磁盘)**。②③ 段受阻 —— 该 bundle 是**按需动态加载**,不出现在实例首页 HTML 里 ⇒ 拿不到带正确 `rev` 的完整 URL。
|
|||
|
|
|
|||
|
|
### ✅ 档案 80 第 7 项 + 档案 81 §四「删 3 个跳转桩页」完成
|
|||
|
|
- 删 `web/{desktop,plugins,skills}.html`(**9 页 → 6 页**);改 **5 处引用**(admin.html / index.html / login.html ×2 / dsh.ts 注释);`verify-static.mjs` 是**自动发现页面**的,无需改。
|
|||
|
|
- nginx `alotbuy.com.conf` **两个 server 块**各加 3 条 `location =` 301 ⇒ 实测 `/desktop.html`→301 `/portal.html`、`/plugins.html`→`#/plugins`、`/skills.html`→`#/skills` ✓;`login.html` 仍 200 ✓。
|
|||
|
|
- ⚠️ 这台是**宝塔托管的 nginx**:`systemctl reload nginx` 失效(服务名不同)⇒ 用 **`nginx -s reload`** 才生效。
|
|||
|
|
|
|||
|
|
### 🔴 本次自查抓到的真回归(**是我 15:4x 改名时造成的**)
|
|||
|
|
- 症状:**admin 实例页 502**,journal 见 `plugin tree failed to load … corrupt session log`。
|
|||
|
|
- 根因:**会话日志是 `session.jsonl.zstd`(zstd 压缩)**。我改名时只改了**目录名**与**纯文本文件**,**压缩流里的 header 仍记着旧路径**(`…/--var-lib-dsh-server-login-users-…-ws--/…`)⇒ dsh 启动做一致性校验(header cwd vs 目录推导 cwd)**不匹配 ⇒ 抛错 ⇒ 插件树加载失败 ⇒ 崩溃循环**。
|
|||
|
|
- 修复:写 `_fix_sesslog.cjs`(用 **node 内置 `zlib.zstdDecompressSync/zstdCompressSync`**,22.15+ 支持)—— 解压 → 全局替换旧路径 → 重压 → **回读校验**。**26 个文件里 24 个待修 → 全部修完,复查 0 残留** ✓;实例恢复 **200**,`corrupt session log` 归零 ✓。
|
|||
|
|
- ⚠️ **教训(已入库)**:**改名/改路径时,压缩文件(zstd/gz/zip)里的内容 `grep`/`sed` 都够不到** —— 只要目录名或路径变了,就要按格式**解压→改→重压**。这与「SQLite 改名必须带 `-wal`/`-shm`」是同一类坑。
|
|||
|
|
|
|||
|
|
### ⚠️ 本次新发现的平台缺陷
|
|||
|
|
- **op-lock 是坏的**:锁根 `/opt/dsh/state/.op-lock` **不存在**,且 `scripts/op-lock.sh` 自身解析 `bt-server` 失败 ⇒ 声称「已存在 → 停手」是**假警报**,无法用于互斥。
|
|||
|
|
- **agent-browser 在本机起不了 daemon**:`open` 挂住、**零输出**(`--version` 与 `node -e` 都正常)⇒ 浏览器验收受阻。已 `agent-browser install` 装好 Chrome 153,但 daemon 仍不通;**按技能排错文档仍未解**,留待排查。
|
|||
|
|
- 已装 `[email protected]` 到托管 node 工作区(非 `-g`)。
|
|||
|
|
|
|||
|
|
### 状态
|
|||
|
|
- 门户 200 | `dshs.service` active | **两实例均 running** | `corrupt session log` = 0 | 锁已释放 | 临时文件已清。
|
|||
|
|
### 19:2x · 补齐上一轮欠的落档(用户「可以继续完成」)
|
|||
|
|
- 锁已释放(上一轮被别的会话持有)⇒ 抢到 `office-skill-r3` → **档案 76 第三轮 §追加已写入并同步**(用户口径、两条纠偏、自裁依据、技能落点与易踩点、三层验证、0.2.26、环境级遗留)。
|
|||
|
|
- 四件套:audit rc=0 / index-stats 一致 / manifest 已刷 / consistency「承诺现行一致 ✓」;**双端 142/142 一致**;镜像属主 root:600。
|
|||
|
|
- 额外证据:用户在本机用 **Tencent Docs 预览打开 `样例.docx`** ⇒ 真编辑器可打开(强于库解析)。
|
|||
|
|
- 仍**未提交**(用户未要求):文档库 `04-调整方案/76-…md` 与 `docs-manifest.json` 留在工作树(另一会话已提交 T03 归档与 03-路线图)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 19:21–19:3x · 用户「都可以处理」→ 收掉 R2 验收与 agent-browser 两条尾巴
|
|||
|
|
|
|||
|
|
### ✅ R2 渲染验收:**改用「无浏览器 harness」拿到硬证据**
|
|||
|
|
- ⚠️ **`[email protected]` 的 daemon 在本机起不来**(已排到:`--version`/`node -e` 正常、Chrome 153 已装、`~/.agent-browser` 里 18:25 留下的 `default.port` 实测**不通**、**清掉僵尸状态后重试仍挂住且零输出**)⇒ 浏览器截图验收受阻,属**环境问题**。
|
|||
|
|
- ✅ **替代方案(已沉淀 + 已接入 CI)**:新增 **`scripts/verify-platform-admin-section.mjs`** —— 打桩 `react` / `react/jsx-runtime` + **最小 hooks 渲染循环** + **真执行** `client.js`,直接断言:
|
|||
|
|
- `inject=['slots','locale']` ✓;**注册了两个 section**(`business-plugins/101/功能管理` + **`platform-admin/102/平台管理`**)✓
|
|||
|
|
- **admin 视角渲染出 6 张卡**(当前实例/熔断/用户/存储/候选池/运行时)+ 只读声明 + 「打开完整管理台」✓
|
|||
|
|
- **非 admin 被门禁挡住**(只显示「平台管理仅对管理员显示」、无任何指标卡)✓
|
|||
|
|
- **结论全绿、exit=0**;已接进 **`npm run verify`** ⇒ UI 改动可 CI 式防回归。
|
|||
|
|
- 📌 **方法论**:验证 UI 不等于必须开浏览器 —— **打桩渲染 + 真执行产物**能覆盖「注册/结构/门禁/数据映射」,比截图更可复跑。
|
|||
|
|
|
|||
|
|
### ✅ 档案 80 第 7 项(删 3 桩页)已上线并验证
|
|||
|
|
- `web/{desktop,plugins,skills}.html` 已删(**9→6 页**);`/desktop.html`→301 `/portal.html`、`/plugins.html`→`#/plugins`、`/skills.html`→`#/skills` 实测通过 ✓;`login.html` 仍 200 ✓。
|
|||
|
|
|
|||
|
|
### 提交
|
|||
|
|
- 文档库 **`9122abb`**(档案 82 追加 §九;双端 142/142)|代码仓 **`f25723b`**(插件 0.2.9 + 删桩页 + 新验证脚本 + package.json 的 verify 链)。
|
|||
|
|
- 临时物已清(本机 `_work` / `_ab_install.log`;服务器 `/opt/dshs/_fix_sesslog.cjs` —— 配方留在档案 82 §9.4)。
|
|||
|
|
|
|||
|
|
### 仍未做(下一批)
|
|||
|
|
- **登录/注册/门户/设置面板的体验审计**(用户 18:1x 关注的第三块「是否最优」)—— 这张从没做过。
|
|||
|
|
- T03 遗留 **D / J / Q**;平台缺陷 **op-lock 不可用**、**agent-browser daemon 起不来**。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 19:32–19:4x · 登录页 4 项改动(用户点名)+ 发现「CF 缓存 31 天」缺陷(档案 83)
|
|||
|
|
|
|||
|
|
### 用户四项要求(全部完成并线上验证)
|
|||
|
|
1. **样式按 UI 规范对齐** —— 查实:登录页用 `design.css`,它是**深色 OS-desktop 体系**(`--accent #4d7cfe`、卡片 r20、输入框 r10/14px/灰底),与 `06-工作台UI规范`(**强制基线**、第 4 行「**冲突时以本文档为准**」、第 5 行**门户页面在适用范围内**)**全面冲突** ⇒ 用户说得对。
|
|||
|
|
2. **删掉**「提示:若会话中 shell 频繁要求审批…」 ✓
|
|||
|
|
3. **加「显示密码」按钮**(登录 + 注册两页)✓
|
|||
|
|
4. **文案**:`登录你的 DSH 云桌面` → **`登录进入AI世界`** ✓
|
|||
|
|
5.(顺手)去掉用户名框预填的 `value="guest"`(测试残留 + 暴露账号名)
|
|||
|
|
|
|||
|
|
### 做法(关键取舍)
|
|||
|
|
- **新建 `web/auth-ui.css`** 作「规范对齐层」(主色 `#2f6fed`、输入框 `6px 10px`/r8/15px/白底、按钮 `6px 14px`/r8/15px、`:disabled` .5、卡片 r12 + `0 1px 3px rgba(0,0,0,.08)`、底色 `#f5f6f8`),只被登录/注册引用。
|
|||
|
|
- ⚠️ **刻意不改共享的 `design.css`** —— 它被 **5 个页面**共用(admin/login/portal/register/wake),直接改 = **整站换肤**,范围与风险都超出「登录页」⇒ **全站对齐另立一期**(已记进档案 83 §五)。
|
|||
|
|
|
|||
|
|
### 🔴 期间发现平台缺陷:**静态资源被 Cloudflare 缓存 31 天**
|
|||
|
|
- 现象:新文件 `auth.css` 经域名访问**恒 404**,而**直连平台** `127.0.0.1:3080/auth.css` = **200**。
|
|||
|
|
- 根因:响应头 `Server: cloudflare` + `Age: 90` + **`Cache-Control: max-age=2678400`(31 天)** ⇒ **我在部署前探测过该 URL,CF 把那次 404 缓存了 31 天**。
|
|||
|
|
- 影响:**任何改过内容的静态资源都可能被 CF 缓存 31 天 ⇒ 改完用户看不到** —— 这是 `06-工作台UI规范 §7`「生效链路四关」**没写到的第五关**。
|
|||
|
|
- 本次处置:**改名** `auth-ui.css`(新 URL 无缓存)⇒ 200 ✓。**建议待办**:CF 加 Bypass Cache 规则(`/*.html`、`/*.css`)或改内容哈希文件名。
|
|||
|
|
|
|||
|
|
### 验证(线上实测)
|
|||
|
|
- `GET /login.html` 200:含 `/auth-ui.css` + `pwToggle` + 「登录进入AI世界」,**不含**那句提示 ✓
|
|||
|
|
- `GET /register.html` 200:含 `/auth-ui.css` + `pwToggle` ✓
|
|||
|
|
- `GET /auth-ui.css` 200(3027B):含 `#2f6fed` / r8 / 15px / `6px 10px` / `6px 14px` ✓
|
|||
|
|
- `npm run verify` **全绿** ✓
|
|||
|
|
|
|||
|
|
### 提交
|
|||
|
|
- 文档库 **`fd39d78`**(档案 83;双端 **143/143**)|代码仓 **`5869a4a`**(web/ 静态层,**免重启**);锁已释放。
|
|||
|
|
|
|||
|
|
### ⚠️ 我自己的重复踩坑(第 2 次同类)
|
|||
|
|
- **`/tmp/xxx` 在 Git Bash + Windows curl 混用时会被解释成 `C://tmp//xxx`** ⇒ 读回文件读错、cookie jar 没写成。**对策:一律用项目内明确路径**(本轮已因此误判过一次验证结果)。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 19:39–19:5x · dsh 设置面板改版:用户设置 / 系统管理 + 每项弹窗(档案 82 §十)
|
|||
|
|
|
|||
|
|
### 用户要求(澄清后)
|
|||
|
|
1. dsh 设置里的「**用户管理**」→ 改名「**用户设置**」,并**去掉里面的「打开管理平台」入口**
|
|||
|
|
2. 「平台管理」**不要跳新页面** —— **把所有管理项放进「系统管理」,每一项点开是弹窗**
|
|||
|
|
|
|||
|
|
### 关键定位
|
|||
|
|
- 「用户管理」= **`@dsh-local/portal-entry`** 注册的 `settings.section`(`id: user-management`, `order:102`)—— 里面有「打开管理台」按钮。
|
|||
|
|
- **⚠️ `portal-entry` 的源码不在仓库**(只有铺发脚本 `scripts/ensure-portal-entry.cjs` + artifacts 里的 tgz)⇒ 本次**在产物上改**(档案 75 · B5 的旧账,建议补源码入仓)。
|
|||
|
|
|
|||
|
|
### 落地
|
|||
|
|
| 插件 | 改动 | 版本 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `portal-entry` | 「用户管理」→**「用户设置」**;`id: user-management → user-settings`;**order 102→103**(让位);**删掉「打开管理台」按钮**;内容改为「账号:<用户名> 角色:…」+ 退出登录 | **0.5.1 → 0.5.2** |
|
|||
|
|
| `business-plugins` | 删掉 `window.open(portalHost()+portal.html)` 跳转按钮;「平台管理」→**「系统管理」**;分区改成**管理项列表(5 项:用户管理/候选池/运行时/存储/当前实例)**,**每项点开是原生弹窗**;**用户管理弹窗内可直接 通过/禁用/启用/删除**(调平台 admin API,不跳门户) | **0.2.9 → 0.3.0** |
|
|||
|
|
|
|||
|
|
### 铺发与验证
|
|||
|
|
- 两者均由 artifacts + ensure-*.cjs 铺发 ⇒ **admin 与 guest 两个 profile 均升版** ✓;**磁盘复核:`window.open` 计数 = 0**(跳新页彻底移除)✓
|
|||
|
|
- 验收脚本 `scripts/verify-platform-admin-section.mjs` 同步更新 ⇒ **`npm run verify` 全绿**(含「系统管理」标题 / 5 管理项 / 非只读提示 / 非 admin 门禁)✓
|
|||
|
|
- **实例已停**(0 个)⇒ 下次访问自动拉起并载入新 bundle。
|
|||
|
|
|
|||
|
|
### 提交
|
|||
|
|
- 文档库 **`35c1f65`**(档案 82 §十;双端一致)|代码仓 **`281c081`**;锁已释放;临时目录已清。
|
|||
|
|
|
|||
|
|
### 下一批(已记档 82 §10.4)
|
|||
|
|
- 弹窗里**只有「用户管理」是可写**;候选池/运行时/存储/实例三项目前**只读列表**,写操作待补。
|
|||
|
|
- **portal-entry / business-plugins 源码入仓**(现在只有产物)。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 19:2x–19:5x · 「为什么不能在浏览器预览文件」→ 挖出**客户端半边静默挂死**的真因(0.2.27)
|
|||
|
|
|
|||
|
|
**用户问**:看 guest 最新会话,为什么不能在浏览器预览文件。
|
|||
|
|
|
|||
|
|
**guest 里的 AI 自查(方向对一半)**:① 平台「我的文件」面板只有浏览+下载,**没有预览服务**;② 用插槽探针证明 univer 的浏览器半边**没挂载**(无 univer 占位者/服务)。
|
|||
|
|
|
|||
|
|
**我的独立复核(更精确)**:
|
|||
|
|
- ① 属实(平台侧能力缺项,非 bug)。
|
|||
|
|
- ② **半边其实加载了** —— 实例页面 boot manifest 的 46 个客户端插件里**有** `dsh-univer-office/client.js`。
|
|||
|
|
- **真因**:它的 `package.json` → `dsh.client.inject` 里声明了 **`@deepseek-ai/dsh-client-ui-settings-plugins`**,而该包被**平台自己的角色补丁禁用**(`ensure-role-profile-patch.cjs`,档案 15:普通用户隐藏「插件」分区)。dsh 客户端加载器源码注释写明 `fiber lifecycle, inject waiting` 由 cordis 管 ⇒ **有一条 inject 永远不可满足 ⇒ 客户端 fiber 永久挂起 ⇒ apply() 永不执行** ⇒ 预览 UI / 工具卡片 / 浮层全都没有(且**静默**:无报错、无日志)。
|
|||
|
|
- **证据链**:guest 页面缺该包 / **admin 页面有**(A/B 对照,admin profile 无该角色补丁);页面 manifest 里 univer 行明确列出 7 个 inject,其中 6 个在页面里、**唯一缺的就是被禁那个**。
|
|||
|
|
|
|||
|
|
**修(插件侧最小改动,符合 8 条自裁:既有机制 / 只改一层 / 收窄)**:`0.2.27` 把该包从 `dsh.client.inject` 移除(它只服务「插件设置卡片」,而那个分区对本角色本来就隐藏)→ admin 重登记 → 停用→启用 → **验证**:实装 `0.2.27`、页面 manifest 里 univer 行 inject 只剩 6 个**可满足**项、`rev` 已变(浏览器会取新包)。
|
|||
|
|
|
|||
|
|
**要告诉用户的另外两条真相**:
|
|||
|
|
1. 即便半边修好,**xlsx/docx 在浏览器里没有原生预览** —— 预览 Office 必须走 univer 的**导入**(原生绑定,glibc 2.32 挡着)⇒ **只有 `.univer` 能在线预览**;Office 文件只能下载后打开,或让 AI 另出一份自包含 **HTML**。
|
|||
|
|
2. 「我的文件」面板**本身没有预览功能**(浏览+下载)—— 要加则是平台新能力。
|
|||
|
|
|
|||
|
|
**⚠️ 教训(已写进 MEMORY.md)**:**第三方客户端插件绝不能把「官方 UI 包」写进 `dsh.client.inject`,除非确认该包在目标角色里必然存在**。平台角色补丁会禁用若干官方 UI 包(`dsh-client-ui-settings-models` / `-settings-plugins` / `-settings-plugin-inventory` / `-cordis` / `dsh-client-hmr` / `dsh-host-directory-picker-auto`)。**排查手法**:取实例页面(平台代理 + 临时会话)→ 解析 `__DSH_BOOT__` → 把每行 inject 与页面实际插件集合求差集,**非空 = 该客户端插件永久挂起**。
|
|||
|
|
|
|||
|
|
**未完成**:档案 76 第四轮落档 —— 抢锁时被 `plugin-sections-1940`(19:40 起)占用 ⇒ 按 R9 停手,要点即本段,等释放后补。
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 20:10–20:30 会话 `15ee0d4f`:**总结最近几轮的决策问题 → 提炼「两条总闸」并落规则**
|
|||
|
|
|
|||
|
|
**用户要求**:「总结一下最近对话的反应的决策问题,提炼方法」。
|
|||
|
|
**做法**:把 09-13 全天的用户纠正/明令逐条取原文归类(日志 + 本会话上下文),抽象成 **4 类根问题**,再把方法落成规则。
|
|||
|
|
|
|||
|
|
### 归类结果(实例 → 根因 → 处置)
|
|||
|
|
| 类 | 实例(时间 / 原话) | 根因 | 处置 |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| **A 过度上抛**(该自己拍的推回用户) | 08:30「为什么要等我确认才部署呢」· 15:53「要我现在接着做,说一声即可」· 11:5x「授权条款…需要你考虑吗,你的任务是改造和优化」 | 红线被按**动作名字**套(见"部署/生产"就触发),没按**实际影响面**判 | 已沉淀(U20/X9 + U21/X10) |
|
|||
|
|
| **B 越界动手**(动了不是我 lane 的) | 15:58 自建 `/var/lib/dshs` **全局符号链接**(为打通自己的 `ERR_PNPM_UNEXPECTED_STORE`)→ 16:00「**谁让你去改这个的**」+「**不是自己负责的任务相关文件不要去改**」 | **动机取代了边界判断** —— "改它能让我流程跑通"被当成理由 | 🆕 **本轮新沉淀** |
|
|||
|
|
| **C 答非所问**(主位错位) | 15:53 用「我的失误 + 探针污染 + 版本流水 + 下一步计划」答「是否已实现」 | 写的是 AI 的进度,用户问的是功能可用性 | 已沉淀(U21/X10 + `dsh-feature-first §5.1–5.3`) |
|
|||
|
|
| **D 状态表述不可靠** | 10:43「模式 B · Kubernetes **根本没验证**,应该是待开发验证」(与"用文件名代替读包→官方没这能力"同源) | 没把"已验证 / 待验证 / 不支持"分开写 | 🆕 **本轮新沉淀 A15** |
|
|||
|
|
| **E 完整性漏伴随物** | ① 0.2.19 **回滚只回滚部署、没回滚源码** ⇒ 0.2.20 才真修 ② R3 改 SQLite 库名**漏 `-wal`/`-shm`** ⇒ 丢 2 条会话(归位后 4→6) | 只处理主体,没列伴随物 | 🆕 **本轮新沉淀 A16** |
|
|||
|
|
| **F 结论靠抽样而非实测** | 用文件名代替读包 → "官方无 locale API"(后被证伪)· 探针自伤三次(TDZ / `chr(10)` / 行级删除切块)· 垫片入参未 grep 真实调用点(×2) | 抽样直觉当实测 | 已有 **A1/A5** 覆盖(不重复新建,只在总结里点名) |
|
|||
|
|
|
|||
|
|
### 🆕 本轮落地的规则(2 处)
|
|||
|
|
| 文件 | 版本 | 内容 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `dsh-decision-method` | 1.5.0 → **1.6.0** | ① **§4.1 前置「两条总闸」**(闸1 lane / 闸2 门禁,且点明两闸**对称**)② 新增 **U22**(只碰自己 lane;平台级/全局/别人 lane 只报告)③ 新增反例 **X11**(为打通自己流程去改平台级路径)④ 新增 **A15 三态词表**(✅已验证 / ⚠️待开发验证 / ❌已知不支持 + 禁用词)⑤ 新增 **A16 伴随物清单**(回滚 / 改名 / 批量替换三行表)⑥ §7 语言表加「谁让你去改这个的」⑦ 附·自检加到 **11 条** |
|
|||
|
|
| 项目根 `CODEBUDDY.md §3` | — | 新增 **R7-边界** 行(**R7 只适用于「不是我的 lane」**):① 不适用于我 lane 内的执行细节(部署/上线/重启/改配置/自己的脚本)⇒ 别当挡箭牌去问;② 适用于平台级 / 全局 / 别人 lane ⇒ 只报告不动手,**哪怕改它能让自己流程跑通** |
|
|||
|
|
|
|||
|
|
**方法一句话**:**动手前先过两道闸 —— ① 这落在谁的 lane(不是我的 → 只报告)② 命中真门禁了吗(只剩"不可逆破坏性操作"+"边界外",没命中 → 自己拍、别问)**。
|
|||
|
|
|
|||
|
|
**校验**:断言式脚本 + 写后核对(版本号 / 各新增段落计数 / U+FFFD=0);中途一次 SyntaxError(字符串里误留换行)与一次插入顺序颠倒(A16 跑到 A15 前)均已当日修正。
|
|||
|
|
|
|||
|
|
**未闭环(点名硬约束)**:技能**归档副本 + scp 未同步**(锁状态见下);技能两副本 md5 不一致。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 20:1x–20:4x · 「系统管理」视觉层补齐 + 修「普通用户也能看到」的缺陷
|
|||
|
|
|
|||
|
|
### 用户反馈 1:像毛坯房(档案 82 §10.5)
|
|||
|
|
- 我上一轮**只做了功能骨架、没做视觉**就交付 ⇒ 被指「像毛坯房…把项目UI设计规范记脑袋里」。
|
|||
|
|
- 按 `06-工作台UI规范` 重做:管理项 → **卡片网格**(**§4.5 `.data-card`**:r12 / `16px 18px` / 轻投影 / **hover 上浮 `translateY(-2px)` + 蓝边 + `0 4px 12px rgba(47,111,237,.15)`** / `transition .15s cubic-bezier(.16,1,.3,1)`);弹窗 → **§4.7**(mask `rgba(0,0,0,.35)`;面板 **r14 / `22px 26px` / 520px / `0 8px 30px`** + 进场动画);按钮 §4.1 `.btn-sm` 量级 + hover;计数**右对齐 + `tabular-nums`**(§5);字号阶梯 15/13/17;`prefers-reduced-motion` 降级;卡片补图标。
|
|||
|
|
- ⚠️ **色彩仍刻意用 dsh 官方 token `--dsw-*`**(嵌在 dsh 面板内须跟随主题;规范里的硬色值是给**门户静态页**的)。
|
|||
|
|
- 📌 **教训(已入库)**:**做页面的默认动作必须包含「查规范 → 落具体条目」**,不能只做功能等用户来提。
|
|||
|
|
|
|||
|
|
### 用户反馈 2:普通用户不该看到「系统管理」(档案 82 §10.6)
|
|||
|
|
- **真缺陷**:此前只对**内容**做门禁 ⇒ **section 本身仍对所有人注册**,普通用户在设置里能看到这一栏(点进去一行「仅管理员」)。
|
|||
|
|
- **正解**:`apply()` 里**先异步判角色**,**非 admin 干脆不注册**该 section(fail-closed:判角色失败也按非 admin 处理)。
|
|||
|
|
- **依据(实证)**:官方 `dsh-client-ui-settings/lib/client.js:560` 用 `ctx.slots.getVersion("settings.section")` 失效重算导航 ⇒ **晚注册会被正确反映** ✓。
|
|||
|
|
- **验收**:补了「**非 admin 视角下只注册 1 个分区(不含系统管理)**」断言;并修了脚本没等异步注册的问题(`apply` 后 `await 80ms`)⇒ `npm run verify` 全绿。
|
|||
|
|
|
|||
|
|
### 产物与提交
|
|||
|
|
- `business-plugins` **0.3.0 → 0.3.1 → 0.3.2**(视觉层 / 仅 admin 注册),均已铺发 admin+guest;实例已停(下次访问载入)。
|
|||
|
|
- 文档库 **`100037f`**(§10.5)/ 本次 §10.6 一并提交|代码仓 **`4190848`**(style)/ 本次 fix 一并提交。
|
|||
|
|
### 20:3x · 第四轮落档补完 + guest 复测确认修复生效
|
|||
|
|
- 抢到锁(`univer-client-inject`)→ **档案 76 第四轮 §追加 已写入并同步**(用户口径/guest 结论复核/真因与 A/B 证据/修与验证/**使用者预期管理**/铁律与同类案例)。四件套:audit rc=0、index-stats 一致、consistency ✓。
|
|||
|
|
- 对账只剩 **1 项内容不一致**:`skills/dsh-opensource-release/SKILL.md` —— **不是我的改动**(另一会话在本机改了但未同步)⇒ 按纪律**不代推**,留给它自己收尾。
|
|||
|
|
- **guest AI 复测(20:2x)确认修复生效**:客户端半边**已 apply** —— 探针在 `conversation.input.dock` 看到 `{id:'univer-dock',active:false}`;`active:false` **属预期**(该 dock 只在有 draft worktree 时显示,`univer-dock.tsx:172` worktreeId===null 即 return null)。
|
|||
|
|
- **它纠正了我一处说法**:该插件**不注册**任何 `tool.*.toolview` ⇒ 工具卡片不会变样;预览只有「轮尾卡片(只挂含 univer 工具调用的轮)+ 输入框 dock + 全屏/浮层」三处。
|
|||
|
|
|
|||
|
|
### 20:4x · ✅ **浏览器侧端到端确认**(0.2.27 修复生效)+ 一个新现象
|
|||
|
|
- **决定性证据**(guest AI 硬刷新后复探同一槽位):`conversation.input.dock` 里 univer 项从 `active:false` → **`active:true`** ⇒ 插件浏览器半边**已挂载且激活**。
|
|||
|
|
- 另一处佐证:`conversation.chat.turnTail` 有 2 个 `registrant:H5` 占位者(priority **-10** 与 0);**-10 的那个就是我们的 PreviewCard**(`src/client/index.tsx` 里 turnTail 就是 `priority: -10` 注册的)—— 该槽的探针输出不带名字,所以它「无法按名字确认」是探针本身的局限,不是没注册。
|
|||
|
|
- **旧回合不会回溯渲染**:卡片由 conversation turn 定义(`kind: univerTurn`,匹配含 `univer_*` 工具调用的轮)驱动 ⇒ 客户端半边激活**之前**产生的旧回合不会补卡片;要看就得**新跑一轮 univer 调用**。
|
|||
|
|
- **新现象(平台级,非 bug)**:「怎么断开了」= 用户**硬刷新页面**时,**在途的 `platform: client` 探针查询**(由浏览器页面回答)因页面上下文被销毁而 cancelled;**Host 侧调用(bash / univer_* 一次都没断)**。⇒ 刷新时等一两秒再让 AI 跑客户端探针即可;以后排查要区分 client-platform 与 host 两类工具。
|
|||
|
|
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|