--- alwaysApply: false paths: ["**/*.ts", "**/*.cjs", "**/*.mjs"] --- # 服务器侧改码:流程与门禁 ## 哪一层要重启(**R8 判据**) | 改什么 | 是否需 build + 重启 | 是否中断在线用户 | |---|---|---| | `src/**`(TS,编排器) | ✅ `npm run build` + 重启 `dshs` | ✅(开发环境)**直接做** —— 动手前一句话说明即可,⛔ **不必等确认**(R8 · 2026-09-13 用户明令「这个是开发环境服务器,不用担心中断用户」;2026-09-16 收口) | | `web/*.html`(门户静态页) | ❌ 即时生效 | ❌ 否 | | profile 层(cordis patch / bundles) | 重启该用户实例 | 仅该用户 —— 同样**直接做**,一句话说明即可 | **改 `web/*.html` 千万不要重启服务** —— 那是**无谓的中断**(R8 的"不必等确认"**不等于**"可以无谓重启":按 **R11 只做正向迭代**,无收益的重启仍是劣化)。 ## 部署前 1. **校验改前基线**:`ssh bt-server 'git hash-object '` vs 本机 `git rev-parse HEAD:` —— **比 md5 可靠**(不受 CRLF / 编码影响;md5 已误判过一次)。 2. 备份:`cp .bak-`,回滚命令写进档案。 ## 插件安装(`ensure-*.cjs` / `pnpm`) - **必须走 pnpm**:`pnpm add file:`;lockfile 才是账本,手放 `node_modules` 无效。 - **同名同版本 tgz 改了内容必须升版本号** —— pnpm 会复用旧包(已踩)。 - 装完若需实例生效 → 重启该用户实例 → 属 R8,**动手前一句话说明影响即可,⛔ 不必等确认**。 ## 验证 - API 链路**必须同时覆盖"有请求体"与"无请求体"** —— 只测 POST 会整条漏掉 GET/SSE。 - 浏览器验证**只允许 `browser-harness` 一件**(⛔ `agent-browser` 与 Playwright 全面禁用 —— 2026-09-25 用户明令「改为 browser-harness,只允许使用这个」), **铁律:动手前先 `list_tabs()`**,确认附着的不是用户正在用的 Chrome。调用姿势 ⇒ 技能 `dsh-change-workflow` 的 `references/08-浏览器验证栈详解.md`。