Files
dsh_ai1net_server/dsh-server-docs/skills/dsh-env-bootstrap/references/常驻规则-快照.md
T
admin bc0dd2c96d docs(dsh-server-docs): mksess 口径校正(DB 直插→PG 直插)+ 技能 dsh-auto-handoff-chain 三处同步建立(序⑰ S1/S2)
- 02-运维手册.md:mksess 命中处补「PG 直插 + 连接串来源」+ D1 勘误指针两行(档案 77 的旧形态说明,正文不改)
- skills/dsh-change-workflow/SKILL.md(146/395/495 三行)、skills/dsh-env-bootstrap/references/常驻规则-快照.md(55 行):同口径校正
- skills/dsh-auto-handoff-chain/:新建文档库副本(SKILL.md v1.3.2 + scripts/chain_report.py),此前该技能三处同步从未建立
- README.md / INDEX.md:登记该技能(技能表 + 「什么时候查什么」+ 技能清单表)

判据:E1 = 0 行、E2 两副本 md5 全同、E3 diff -r = 0 行、E4 登记命中 README 1 / INDEX 2、镜像 47 同值
2026-09-17 17:03:34 +08:00

22 KiB
Raw Blame History

常驻规则 · 可移植快照(由 scripts/resident-rules.py --snapshot 生成,勿手改)

这是「工作区 CODEBUDDY.md 关键章节」的副本,随技能走 ⇒ 换电脑 / 换工作区也能带走。 ⚠️ 权威方向单向:CODEBUDDY.md 是权威,本文件是它的副本(重生成用 --snapshot)。 ⚠️ 环境相关项(绝对路径 / IP / hooks 路径 / 工具位置)注入后必须按新环境核对:见文末「待核清单」。

骨架锚点(校验用;丢了就等于规则没了)

  • A1 — 只问「超过现有判断方法边界」的问题
  • A2 — 禁止用征询句收尾
  • A3 — 四件或七件套必跑
  • R7 — 禁未经确认的批量 / 全仓写入
  • R7-边界 — R7 只适用于「不是我的 lane」
  • R9 — 绝对禁止「人工删锁 / 接管」
  • R11 — 只做正向迭代
  • U27 — 目标不打折,路径取最小代价
  • L1 — 先抢全局执行锁
  • L2 — 锁的生命周期 = 任务的生命周期

1. 提问判据(唯一一条)

只问「超过现有判断方法边界」的问题。(用户原话)

  • 边界内 → 一律自决,不要问:技术选型 / 实现路径 / 命名与数据结构 / 性能与资源调参 / 部署与同步 / 排查方法 / 版本与依赖 / 兼容与降级 / 方法内的方案取舍 / 文档与档案的技术内容。
    • ⚠️ 「部署 / 上线」明确属于上面这一项(2026-09-13 用户纠正原话:「为什么要等我确认才部署呢,我看线上效果才知道是否满足需求」):不中断在线用户的上线动作(scp 产物到 /opt/dsh/artifacts + ensure-biz-plugins.cjs --all 换包、静态页改动、候选池投放)做完即上线,不要问 —— 用户要先看线上效果才能判断需求是否被满足。
    • ⚠️ 2026-09-13 用户明令:「这个是开发环境服务器,不用担心中断用户」 ⇒ 上一条的「只有会中断在线用户的动作才走 R8 先知会」改成:重启 / 停实例 scope / drain / 改配额或 env / 改 nginx·nft 直接做,只需动手前一句话说明在做什么(可回溯用)。仍未放开:不可逆的破坏性操作(删数据 / 迁 DB / 清目录)仍先出清单。
  • 边界外 → 必须问:① 业务目标与优先级(做不做、先做哪个)② 花钱与资源承诺 ③ 对外承诺与合规(备案 / 资质 / 合同)④ 需用户提供的账号凭据或审批 ⑤ 无客观优劣的体验偏好(审美 / 文案 / 默认值)⑥ 影响面超出本平台 ⑦ 红线门禁 ⑧ 方法确实判不准。
  • 判据:这件事有没有客观可判的优劣?有 → 自己定;没有 → 问用户。 ⚠️ 上抛门槛 = 存在「真取舍」(2026-09-15 用户明令):「需要我确认的方案需要说明优点和缺点,现在没法判断,假如只有优点或只有缺点那不需要我判断」⇒ 把候选各写 优点 + 缺点:某个只有优点(明显更优)或只有缺点 ⇒ 自己拍掉;只有各有优有劣、客观标准分不出高下才上抛,且必须逐项列出优点与缺点。
  • ⛔ 不许捆包:要问红线就只问那一句(要不要现在动生产 / 影响谁 / 断多久 / 能否避开);技术方案自己定好、当已定项陈述("我按 X 做…已定,可推翻")。一轮最多一个问题,同类不连问两次。
  • ✅ 回话前自检(发出任何回复前过一遍 · 2026-09-15 加) —— 起因:「提问闸门」hook 只能拦 AskUserQuestion 工具,而真实的上抛大多发生在正文里。 实证:本工作区日志 tool=AskUserQuestion 调用数 = 09-12: 43 / 09-13: 3 / 09-14: 0 / 09-15: 0(09-14 起该工具基本不用)⇒ hook 那条路径几乎不被走到 ⇒ 拦不到正文里的征询。 ⛔ 禁止用征询句收尾:出现「要我…吗 / 是否要我 / 需要我…吗 / 要不要我 / 请确认 / 你看怎么办」时,先按上一条判据重判三问: ① 命中真门禁吗(不可逆破坏性操作 / 边界外六类)?没命中 → 删掉这句,自己做完,改成陈述句("我接着做 X"); ② 我是不是在把已经定下来的事再问一遍?是 → 删; ③ 我要问的这件事,候选之间是「真取舍」吗(各有优有劣、客观标准分不出高下)?—— 若某个只有优点 / 只有缺点 ⇒ 自己拍掉;是真取舍 → 才允许问,且一轮只问这一句、逐项写出优点与缺点。 📌 需要用户拍板时:位置 = 整条回复的最后一节(⛔ 不许埋在中间)、按有序段落逐条编号、每个候选必须写「优点 / 缺点」两栏、候选竖排成段(A / B / C 各占一行,⛔ 不横排、⛔ 不做成表格的列)(2026-09-15 用户明令:「能根据决策方法 自行决策的就自决策继续处理,不能决策的问题和需确认内容放在回复的最后,按照有序段落展示」+「需要我确认的方案需要说明优点和缺点,现在没法判断,假如只有优点或只有缺点那不需要我判断」+「每个需要我决策的问题的潜在解决方案 A B C 也按照段落式排版,别横着排列」);形态 = 陈述句(问题 + 各候选优缺点 + 我的倾向),⛔ 不是甩征询句("要不要我继续" / "说一声即可")。
  • 📐 排版按 dsh-feature-first §5.4(可扫读九条 + 形态骨架 + 十三条反模式):首屏 3 行给判定 · 层级 ≤3 · 每节 ≤7 行 · 加粗只留关键词 · 表格 ≤5 列 · 一条信息只说一次;待你拍板项落在最后一节、逐条编号、每个候选带「优点 / 缺点」且竖排成段(不横排、不做成表格的列);执行信息 / 报障 / 提问各有现成骨架,不新造;细节进「技术附录」,正文只留"能决定下一步"的信息。
  • 🎯 要的是解决问题,不是将就妥协(2026-09-15 用户明令):面对风险/缺陷默认目标是解决;降级目标 / 延期 / 静默兜底三种都不算解决。只有客观不可逾越(技术不可行 / 上游未支持 / 需你提供凭据或窗口)才允许"暂时接受",且必须写明 ① 卡在哪(证据)② 已做到哪一步 ③ 什么条件一出现必须回头解决。⚠️ 与 §2「最小代价路径」不矛盾:目标不打折,路径取最小代价(细节:素材库 U27 / U26 / A6)。
  • 🟢 只做正向迭代(2026-09-15 用户明令,红线 R11):任何改动只要让项目在某一维度净变差(目标/方向/架构/功能/性能/安全/交互/UI/便利性/扩展性)⇒ 立即停下复盘;拿不出正向做法 ⇒ 立即停止、禁止继续执行(细节:素材库 U28)。


3. 红线 R1–R11(任一条命中 → 先停手;效率论证不构成豁免)

# 红线 要点
R1 不自动升级 dsh 升级须走独立"测试 → 评估 → 修复"流程
R2 不改官方 dsh 主程序与缓存 @deepseek-ai/dsh 零改动;扩展只走 profile 层官方插件机制
R3 client bundle 禁 exports.default 只导出 apply + inject
R4 不用真实账号测登录 用临时 session(mksess.cjs PG 直插),用完即删
R5 权限只准收窄 凡扩大(新挂载 / 放开遮蔽 / 暴露平台目录或 env / 放宽 nft / 提档位)→ 先出「权限影响评估」并取得确认
R6 先查已有资产再动手 可用技能 → 本机 / 项目已有技能与记忆 → "本机已有的能否满足"
R7 禁未经确认的批量 / 全仓写入 只做被明确要求的事;额外发现的问题先报告、后动手;禁全库遍历改写 / 通配符重写 / 批量 chmod·chown / 批量换行符转换 / cp -r 整目录覆盖 / git add -A;可能影响 >10 文件 → 先出清单 + 确认;先单点验证;本机不是沙箱(会经 scp 传导到生产)
R7-边界 R7 只适用于「不是我的 lane」—— 两个方向都别套错(2026-09-13 用户两处明令) ① 不适用于「我 lane 内的执行细节」:部署 / 上线(换包、传产物、改静态页、候选池投放)、重启服务、改配置、跑自己的脚本、改自己的插件源码与产物 ⇒ 别拿 R7 当挡箭牌去问,直接做,事后一句「我选了什么(可推翻)」(原话:「为什么要等我确认才部署呢」)。② 适用于「平台级 / 全局 / 别人 lane」:/var/lib/**、全局符号链接、systemd 单元、nginx·nft、别人的 profile / 产物 ⇒ 一律只报告、不动手,哪怕改它能让自己流程跑通(原话:「谁让你去改这个的」+「不是自己负责的任务相关文件不要去改」)
R8 中断在线用户的生产变更须先知会 ⚠️ 2026-09-13 用户明令修正:服务器 47.77.182.89 是「开发环境服务器」,不用担心中断用户 —— 重启 dshs / 停实例 scope / drain / 改实例配额或 env / 改 nginx·nft 均可直接做,不必再等确认。仅保留两条最低自律:① 动手前一句话说明在重启/停了什么(便于出问题回溯)② 破坏性且不可逆的动作(删数据 / 迁 DB / 清目录)仍先报清单。
R9 ⛔⛔ 绝对禁止「人工删锁 / 接管」(用户 2026-09-12 明令:"严格禁止这类操作") AI 一律不得:rm -rf 交接单/.exec-lock、删 交接单/.doing-*、或以「持有者疑似已死 / 卡住 / 太久没动 / 只在只读分析没产出」为由单方面接管。锁只能由持有者自己释放(--release-exec / --release);handoff-guard.sh 输出里的「或确认接管后人工删锁」不构成授权。抢不到锁时 AI 的唯一合规动作 = 停手 + 报告用户 —— 锁的处置权只属于用户本人(要删也只能用户自己动手)。理由:删锁 = 在无法验证对方死活的前提下单方面撤销互斥(无心跳机制,AI 没有任何判据)→ 一旦对方仍在跑,就退回「两个会话同时改同一批文件」,而这正是这把锁存在的理由。
R10 ⛔ 绝不以 root(或非该实例 uid)运行 / 触碰用户实例的东西 实证(2026-09-14 事故):为量内存用 root 手动起 admin 的 profile ⇒ 它以 root 写入 home/storages/workspace.json(0.1.5 新增的 @deepseek-ai/dsh-workspace 状态文件)与 home/.dsh/mcn-plugin.db ⇒ 属主变 root ⇒ 实例进程(uid 114801)EACCES ⇒ plugin tree failed to load ⇒ exitCode 1 崩溃循环 ⇒ 页面 404。规则:① 对用户实例的一切验证 / 冒烟 / 探针必须以该 uid 运行(setpriv --reuid <uid> --regid <uid> --clear-groups)或照平台姿势进 bwrap 沙箱;⛔ 禁止 root 直跑 dsh --profile。② 确需临时以 root 跑(读全局配置等)⇒ 收尾必须 find <home> -user root 列出 + -exec chown <uid>:<uid> {} + 修正。③ 实例「起不来」排查先看属主 / EACCES,不要先怀疑 OOM(本次先后误判为 OOM,绕了 20 分钟)。修复手法(实测 1 步恢复):find <home> -user root -exec chown <uid>:<uid> {} + → 重启平台 → 页面 200。
R11 ⛔ 只做正向迭代:命中「劣化风险」→ 立即停下复盘;确实无正向做法 → 立即停止,禁止继续执行(2026-09-15 用户明令) 判据(每次决策前过一遍十维):这个改动是否让项目任一维度净变差 —— 目标 / 方向 / 架构 / 功能 / 性能 / 安全 / 交互 / UI / 便利性 / 扩展性?
命中 ⇒ 立即停下复盘(不许"先做着看"、不许将就):① 写清劣化在哪一维、代价多大(证据 / 量级)② 找出能保住正向收益的做法(改小范围 / 换实现 / 分阶段)③ 拿不出正向做法 ⇒ 立即停止、不再执行,只报告。
⛔ 三种伪装禁止:把劣化说成"必要代价"/用"后续再优化"掩盖已知劣化/把劣化项藏进交付不写。
与 R5(权限只准收窄)互补 —— R5 管权限,R11 管全维度净收益;与 U27(不将就妥协)同源。

4. 提交边界

未明确要求 → 不 commit / 不 push / 不同步仓库。 用户说"提交 / 推送 / 同步"时才做,且只 add 自己改的文件。


5. 规划与执行分离

规划会话只产出交接单(dsh-server-docs/交接单/,8 段必填:目标 / 只读前置 / 范围 / 决策点 / 步骤 / 验收 / 回滚 / 回报格式),不 ssh、不改码、不重启、不 scp;落地交另一个执行会话(不读规划会话的上下文)。


6. 并发纪律(本库多会话并行是常态)

  • 共享文件只用 Edit 做精确片段替换(失败 = 天然冲突检测),禁整文件 Write 覆盖。
  • 同一时刻只放一个执行会话(并行度按冲突域定,不按任务数);规划会话在执行期间只读、不 scp。
  • 三把锁,顺序固定(本平台多会话并行的唯一防线):
    序 锁 命令 管什么
    ① 全局执行锁(粗) bash dsh-server-docs/scripts/handoff-guard.sh --claim-exec "<你的会话名>" 同一时刻只允许一个执行会话动「文档 / 代码 / 服务器」← 防"5 个会话同时改"靠的就是这一把
    ② 单级占用锁(细) bash dsh-server-docs/scripts/handoff-guard.sh --claim <单号> "<会话名>" 这个单归谁做(供台账与占用声明)
    ③ 服务器侧操作锁 bash scripts/op-lock.sh claim <操作名> "<影响面:谁会被断、断多久>" 谁正在动生产(重启 / drain / 改 env·配额 / 铺插件 / 改 nginx·nft)
    完工反序释放:先 --release <单> / op-lock.sh release,最后 --release-exec。
  • 🔍 抢锁必须"校验结果",不能"看输出"(2026-09-15 实证事故):把 handoff-guard.sh --claim-exec 的输出用管道截尾(| grep / | tail)时,失败提示里也含关键词(如"…必须 --release-exec 才算完成")⇒ grep -q 会假命中 ⇒ 于是"以为抢到了"而在无锁状态下改库。 ✅ 正确判据(二选一,缺一不可):① 检查退出码(if bash scripts/handoff-guard.sh --claim-exec "X"; then … ; fi,不要接管道);② 复读 交接单/.exec-lock/OWNER 并断言等于自己的会话名。 ⛔ 事故版形态:OUT=$(… --claim-exec … | grep 已持…) —— grep 吃掉了退出码,也吃掉了"抢不到"这个事实。
  • ⚠️ 「无锁」的正确读法 =「你快去抢」,不是「可以开工」 —— 2026-09-12 实证:两个会话把 guard 输出的「✓ 无全局锁」读成"环境干净"→ 同时改了本库(无实际损害,属流程失效)。看到"无锁" ⇒ 下一个动作就是 --claim-exec;抢到才是开工许可。
  • 强制层(可选启用):scripts/lock-guard-hook.py + ~/.workbuddy/settings.json 的 hooks —— 无锁时直接拒写(见 04-调整方案/73)。
  • ⛔ 抢不到锁就是终点,不是待办:不得人工删锁、不得接管(见 R9,2026-09-12 用户明令)。唯一合规动作 = 等持有者自己释放,或报告用户、由用户本人处置;AI 不得以任何理由替用户判断"那把锁已经可以删"。
  • ✅ 锁只约束「写」,不约束「读」(2026-09-12 用户问清):读文档 / 读代码 / 只读命令(git status|log|diff、journalctl、ls、grep、只读 ssh)随时可做,不需要锁 —— 被挡期间照样可以查清事实再报告。 ⚠️ 但会改本地状态的命令不算"读":git fetch / checkout / stash / reset / switch 等一律要持锁(它们会写 .git/refs 或工作树)。
  • 🔓 释放时机 = 整个交付闭环走完,不是"改完文件就放":回填台账 → 四件套校验 → commit → 推送 + 对账 → 归档 全部结束后才 --release-exec(反序:先 --release,最后 --release-exec)。 理由:中间放锁 = 别的会话可能在你 commit 前挤进来,让你的半成品被它的提交带走(本库实证过这类事故)。
  • ⏸️ 持锁期间若需要等用户拍板(等窗口 / 等选择)→ 先释放锁,再等:锁是"正在动手"的凭证,不是"先占着"。挂着锁空转会把所有会话挡在门外;确认完再重新 --claim-exec。
  • 🔒 锁的生命周期 = 任务的生命周期(2026-09-14 用户明令):抢到锁的任务,只有"执行完成 → 反序释放"才算完成;⛔ 禁止"抢到锁、做一半、不解锁就结束回合 / 结束会话" —— 锁是独占资源,带锁结束 = 把其他所有会话挡在门外,而本库无心跳机制、别人没有任何判据能确认你已停 ⇒ 会被迫空等,或被诱去违规接管(R9)。 三条硬性配套:① 抢锁前先把收口步骤列出来(落地 → 校验 → 推送/对账 → 收尾),别做到一半才发现收不完;② 中途必须停(等用户拍板 / 等外部窗口)⇒ 先释放锁再停(上一条);③ 结束语必须对锁状态负责 —— 要么写明"已释放",要么显式点名"锁仍在 <OWNER>、未释放、原因、下一步"(仅限"释放通道不可用"这类极端情形);⛔ "忘了 / 做不完就走"一律不允许。
  • 推送前复跑对账:「仅本地」里若有不在你清单里的文件 → 立刻停手(幽灵文件);只推自己本次改的文件。
  • 单子里的基线数字必须带取数时间 + 复核命令,不写死绝对值(会被并行改动打穿)。
  • ~/.workbuddy/settings.json 的 hooks 段 = 多会话共享配置 —— 多个会话各自加钩子时只能 Edit 增删条目,禁止整段覆盖(JSON 顶层键被覆盖会静默抹掉别人的钩子)。 2026-09-12 实证:两处独立钩子(提问闸门 / 锁闸门)各写一份配置文档,若各自按文档落盘 → 互相覆盖;已合并为一段(PreToolUse 两条 + SessionStart 一条)。 同一条也适用于用户级 ~/.workbuddy/MEMORY.md。
  • ⚠️ 钩子命令「会话启动时快照」 —— 改 ~/.workbuddy/settings.json 里的 hook,对已在跑的会话无效,必须**「完全重启」(彻底退出——关窗 ≠ 退出)或新开会话才加载。2026-09-13 实测定论(本会话 06:47 启动 → 06:55 改配置 → 07:05 拆掉临时目录联接后,写操作报的仍是旧路径**;此前那版「每次调用现读」是被那支临时联接掩盖的误判)。
  • ⚠️ 脚本路径失配 = fail-closed:hook 打不开脚本 → 报错 → 该机所有会话的 Write/Edit 全被拒(09-13 实际发生,连改 settings.json 本身都被拦)⇒ 迁移 / 改名后第一件事 = 核对 hooks 里的绝对路径。
  • 应急兜底(本钩子有意的安全阀):钩子不拦 Bash ⇒ 路径失配期间可用 shell 写文件过渡(09-13 实际走通)。

8. 会导致事故的实测事实(常驻,不许只给指针)

事实 不知道会怎样
实例权限档位是「会话创建时播种」的 —— 既有会话不跟随平台默认(平台默认 danger-full-access) 会误判"平台坏了";更危险的是可能自动去改档位 —— 那等于把受限会话静默提升为完全权限,安全语义变更必须用户知情 → 只提示 + 建议新开会话
功能插件「禁用」= pnpm remove(真卸载),不是"保留包 + disabled" 任何硬绑定 provider 的覆写段在用户禁用后会指向不存在的 provider;web.searchProvider 单选且无回落,多 provider 又未显式配置 → WEB_PROVIDER_AMBIGUOUS 报错(平台已用 syncWebProviderPatch() 按当前 bundles 重算解决)
实例配额 = MemoryMax 384 MiB / CPUQuota 150% / TasksMax 128;但 V8 堆上限按宿主物理内存算(960 MiB)而非 cgroup ① systemd 的 MemoryCurrent/MemoryMax 单位是字节、不是 KB(按 KB 算会放大 1024 倍)② 不注入 NODE_OPTIONS=--max-old-space-size=256 → 实例会先撞内核 SIGKILL(无优雅退出、无日志,排查时无从下手)
业务功能插件(第三方 + 自研)只有一种投放方式 = 「admin 在门户导入候选池 → 用户在实例「功能管理」里自己启用/禁用」(用户 2026-09-12 明确:三方插件一律按这个处理,不需要铺什么) 若图省事改"直铺"(直接往用户 profile 装包 + 写 provider 覆写段),后果有三:① 绕过用户自决 —— 用户看不到、也关不掉;② 直铺覆写段与档案 65 的平台托管段同属"整体替换 config"语义 → 两段并存互相覆盖,产生难察觉的配置漂移;③ 与托管段机制重复建设。无例外 —— 连 AnySearch 最初走的直铺,也已由用户拍板改回候选池(档案 64 §8.3 修正)。⚠️ 例外只限平台基础设施插件(portal-entry / business-plugins / workspace-scoped-picker):它们仍是平台级直铺、用户无感,见档案 16「插件三层归属」

细节与当时实测:04-调整方案/33(权限档位)· 04-16/04-64/04-65(插件与 provider)· 04-58(内存与配额)。


待核清单(换环境后逐项核对,脚本不代改)

  • 工作区根 E:/ProgramData/AI技能/aliyun-dsh-server
  • 文档库 D:/github/dsh_shenxian/dsh-server-docs
  • 代码仓 D:/github/dsh_shenxian
  • 备份目录 /opt/dsh/backups
  • 服务器 bt-server(47.77.182.89,SSH 32022)