diff --git a/.workbuddy/memory/2026-10-10.md b/.workbuddy/memory/2026-10-10.md index ac52e0c..04b7699 100644 --- a/.workbuddy/memory/2026-10-10.md +++ b/.workbuddy/memory/2026-10-10.md @@ -322,3 +322,15 @@ ⇒ **经验:`tmp/` 里混着机制骨架目录,整目录一刀切会打断在跑的常驻。** - 另把已退出任务的 XML 备份留档在 `E:/ProgramData/AIProject/_repo-backups/bh-task-backup/`(原在 `tmp/`)。 - 收口:本工作区 `7cb3834` 已提交并推送,`git status` = 0(远端 `dsh_ai1net_server.git` 已同步)。 + +## 状态层 MEMORY.md 瘦身(用户选 B · 2026-10-10 23:33) + +- **8,296 → 7,649 字符**(上限 7,650,达标);改前备份 `E:/ProgramData/AIProject/_repo-backups/MEMORY.md.bak-瘦身前-20261010-2332`(14,982 B)。 +- **三处硬伤已修**: + ① **会话类别**改成现行口径 —— **只有三类:主会话/任务会话/检查会话**(唤醒·跟进·队列上报**已整套退役**),并注明原写的「四类 + 开工建齐唤醒/协作/跟进」是**作废口径**(这是全篇唯一会让人**做错动作**的一条)。 + ② **工作区行**:路径 `aliyun-dsh-server`(不存在)→ `ai1net-dsh-server`;origin 更新为 `ssh.alotbuy.com:admin/dsh_ai1net_server.git`(10-10 迁入,旧地址注明已弃用);另加一行记平台源码的两个安身处。 + ③ **死指针**:`tmp/wb-phone/asar-peek.mjs` 删除(文件不存在、且指向必被清的 `tmp/`)。 +- **另修**:技能总仓「25 个」→ 10-09 白名单 **6 个**;「四条小规矩」→ **五条**(名实相符);三条历史拍板行(承载两分/IM 线/D8)**合并成一行**并保留三条判据与指针。 +- **压掉的细节全部改为指向** `MEMORY-全文-20261001.md`(活库四条做法/实例起不来修法/取数四坑的完整命令/常驻三件的依据)。 +- **自检**:38 个判据关键词逐一比对**一个没丢**;改后整篇通读一遍、无明显断裂。 +- ⚠️ **只剩 1 字符余量** —— 按「只减不增」,下次要加内容必须先减。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index c72f178..9ce6a46 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -1,60 +1,59 @@ -# DSH 平台 — 记忆(**状态层**) - -> **判据**:会「违规/事故」⇒ 写实体;只"更慢更绕" ⇒ 给指针。落点:规则→`CODEBUDDY.md`(⛔不重复)|状态→本文件|方法论→技能|一次性事→`PLAYBOOK`/日志。 -> 📄 报障先读 `PLAYBOOK-实例与插件坑.md`(§21 浏览器侧验收**假阴性**|§23 真机取证三坑)。 -> ⚠️ **上限 7,650 字符**(⛔ `wc -c` 量的是字节)⇒ **只减不增**;细节 ⇒ `MEMORY-全文-20261001.md`(下文「⇒ 全文」指它)。 - -## 一、状态速查(会变的都在这) - -| 项 | 状态 | -|---|---| -| **在途单** | 🔴 **⛔ 别凭本表做规划 —— 现查 `state.py` + 本线 `接续入口_*.md` §0 最新行**。| -| **🔴 承载两分(09-26)** | 一句判据:**公共承载(服务别人)⛔ 只有服务器能当;主权承载(只服务自己租户)桌面机 ✅**。📂 全文⇒ `MEMORY-设计口径-20261001.md` §1 | -| **🔴 IM 线拍板(09-23)** | E2EE=**强度档** · 预算 `2000`/`10`/`30 s` 固化 · 连接层=**B 引 Centrifugo**(须补自建心跳)。📂 选型单 §十四 | -| **🔴 D8(09-26 用户拍板)** | 「**先不开端口,后续有需要再开**」⇒ **主动搁置**、⛔ 不当待办;重开=要做**跨节点内容分发**时。🔴 替代(⛔ 不需端口)=**设备主动拉**。⚠️ ⛔ 不影响群聊(全走 443)。📂 `交付物/端口决策…-20260926.md` | -| **并发锁** | 🔴 **域锁**:域不重叠即真并行;无 `--domains` ⇒ 退化独占。🔴 **域键算法 shell/hook 必须逐字一致**(`_ANCHOR_SEGS` ⇄ `_DOMAIN_SEGS`)否则**静默失效**。开工第 0 步 `preflight-lock.sh "<会话名>" <文件...>`(【D】未归类或【E】机制层非空 ⇒ rc=1 拒开工)。🔴 **机制层须独占**|🔴 **释放必带会话名**(不带 ⇒ fail-closed;rc=124 卡住 ⇒ 用 `mv` 等效释放)|⚠️ 非 ASCII 会话名锁目录带 `cksum` 后缀|⚠️ **验收 hook 必带 `DSH_SESSION_NAME`**(否则假绿)。| -| **生产形态 / 路径** | 47 的 PG=本机进程 `127.0.0.1:15432`(⛔ 非容器 ⇒ `docker exec` 全失败)。47=Manager(`dshs`)+Worker `w-47`(19100);106=`w-106`(19000)。🔴 **drop-in 才是唯一载体**(写 `/etc/dshs.env` = 静默压掉)|回滚=删 `cluster.conf`→`daemon-reload`→`restart dshs`。🔴 **106:`users/` 权限必须 711**(700 ⇒ 实例必崩)|🔴 **机器可换** ⇒ ⛔ 别用单机规模限制规划。| -| **🔴 会话分组 / cwd** | 🔴 `workspaces` 表 ⛔ 非真源;用 **`sessions.cwd`/automation `cwds` 正斜杠形态**(`E:/ProgramData/AIProject/`)。错一字面即裂组且**自我强化**📂 技能 `dsh-workflow`(多棒接力档 §0.6) | -| **配置外置线 / 覆盖网络线** | 两句判据:🔴 **drop-in 必留 `DSH_PLATFORM_DIR=/opt/dsh`**(删 ⇒ 目录静默搬家)|🔴🔴 **中继走 443 ⇒ 功能全可用、⛔ 不用开任何端口**(UDP `21100-21115` 只服务 P2P);单秘密副本=`config/platform.env`(不入库·600;**系统 env > 文件 > 代码默认**)。📂 **全文 ⇒ 同文件 §6/§7** + 入口 `接续入口_覆盖网络线_20260916.md`(**§0 最新行+§2 首行=唯一依据**) | -| **🔴 形态元假设(09-21·最易犯)** | 一句判据:⛔ 默认「**一个控制面**」=错 ⇒ 正确=**控制面联邦**。📂 **全文 ⇒ 同文件 §2** + 定稿 `02-架构设计/覆盖网络-顶层架构全貌.md`(唯一权威)`⇒ ⛔ 别凭本行做设计` | -| **📁 文档分层** | 🔴 **过程 ≠ 成品**:`04-调整方案/`=过程|**`架构设计/`=定稿**,冲突以定稿为准。⚠️ 过时结论⛔ 不改正文,只加头部状态块指向定稿。⇒ 技能 `dsh-knowledge`。| -| **插件数据落点(硬标准)** | 一句判据:🔴 **一插件一库 `dshs_pl_`** ⇒ ⛔ 不得拿实例本地 SQLite/文件当权威(只可缓存)|取 `DSHS_DB_URL` **只从 drop-in `cluster.conf` grep**。📂 **全文 ⇒ 同文件 §3** | -| **其他线 / 基线 / 品牌** | 一句判据:🔴 **D4(09-18)跨云=目标形态**(⛔ 作废「须同云」)|🔴 **用户卷在 worker 上时写 home 必须走 `UserFs`**(直写 `fs` = 静默空操作)。📂 **全文 ⇒ 同文件 §4** | -| **🔴 协作·会话类别(10-01)** | 🔴 **四类**:**① 主会话(只管目标/方向)② 协作会话 ③ 唤醒会话 ④ 队列上报的跟进会话** ⇒ **同工作区**、靠**标题两级前缀**区分。🔴 **「接续会话」=形态、⛔ 非类别**(撞阈值时产生、**继承角色**)。🔴🔴 **开工第 0 步=建齐三类**(唤醒/协作/跟进,**每类别一条**;少一类即断:**没人推/没人干/没人收**)。🔴 读数=`sessions` 表,⛔不读 `automations`;判「都空闲」必**排除自己**;**自动化只能开新会话**。📂 细则 ⇒ `MEMORY-设计口径-20261001.md` §8 + 技能 `session-mechanism` §2.3.0b~0e | -| **🔴 接续阈值(10-01 改值)** | 一句判据:**三条任一命中 ⇒ 开接续会话** —— 上下文 ≥ **220,000** tok|日志软 **5** / 硬 **8 MiB**(🔴 **已升主阈值**,10-01 由钩子 `session-log-guard.py` 落地并验收)|工具调用软 **200** / 硬 **250**(🔴 **尚未接线**,`stop-dialog-guard.py` 仍 80 次)。📂 实体 ⇒ `CODEBUDDY.md §G` | -| **🔴🔴 常驻三件(10-05·P0-73/74)** | ①**载体=必夹「启动器」**:任务动作 ⛔ 不许直起 `collabd.py`/`board.py`,必经 `supervise-launch.py`/`board-launch.py`(**任务动作没有 env 字段** ⇒ 变量只能进程内设)。缺它 ⇒ 读 **0 字节空库** ⇒ **检查程序静默失效**(零报错)。②**起法只许一条**:改"起法"必全文搜 `New-ScheduledTaskAction` + `.ps1`(第二条旁路走 `powershell.exe` ⇒ `conhost` ⇒ **闪黑窗**)。⚠️ **"改了主路径" ≠ "把旁路也改了"**。③**分发手动·部署≠生效**:`deploy_code.py --ws <区>`(无 watcher)**+重启常驻**;判据=心跳 **`started_h` 晚于部署时间**。🔴 **判两套程序:协作看心跳 ∧ 检查看「有没有 `检查会话:…` 分支」**。⇒ `pitfalls.md` P0-73/74 | - -## 二、本机铁律(⛔ 违反即事故) - -- 🔴🔴 **手机接入类功能 ⛔ 不得影响 WorkBuddy 本身的运行**(**09-29 用户明令**)⇒ 一句判据:**单向依赖,fail-safe 方向=关掉自己**(崩/被杀/超时 ⇒ 只许"功能不可用",⛔ 不许"WorkBuddy 异常")。⛔ 也不得对**宿主在跑的会话**做 `load`/接管、抢 `writer_occupied`、改其配置/进程,⛔ 无超时等待上游。📂 **全文(七条条款+禁止清单+V7 验收)⇒ `MEMORY-设计口径-20261001.md` §5** -- 🔴🔴 **活库改动铁律**:`workbuddy.db`=**WAL 三件套** ⇒ ⛔ **禁文件级 `cp`/`mv`**(salt 世代错位 ⇒ `file is not a database`)。① 文件级操作须**停 app**(SQL 可在线)② 备份用 `backup()` API ③ 改数据走 SQL+`busy_timeout` ④ 改完 `integrity_check`。🔴 活动库看 `CODEBUDDY_CONFIG_DIR`(实测 `E:\ProgramData\.workbuddy`);`~/.workbuddy/`=**旧库**⛔ 不当备份。🔴 09-23 已发生**主库头部级损坏**(零备份 ⇒ 数据全丢)⇒ **影响面超本平台 = 红线门禁,⛔ 不擅自修,先报用户**。⇒ 全文 -- 🔴 **实例/沙箱起不来,先查这三样(别先怀疑 OOM)**:① **属主/EACCES**(root 跑 `dsh --profile` ⇒ 属主变 root ⇒ 崩溃循环/404;修 `find -user root -exec chown : {} +` → 重启)② **bwrap 版本**(47=0.4.0/106=0.11.0;`--perms` 属 0.5+ ⇒ 47 报 `Unknown option` ⇒ **全挂**;要权限用 `--tmpfs`)③ **`endpoints[].streams` 恒=64** ⇒ 报 503/「一直重启」(清空=`restart dshs`)。⚠️ 备份一律 `/opt/dsh/backups/`|⚠️ `smoke-isolation` 不能作 account 模式验收|⇒ 全文 -- 🔴 **集群化数据分层判据**:① 归属/租约 ⇒ 只有 Manager 能写(双写=脑裂)② 跟用户走 ⇒ 实例 home ③ 本机运维 ⇒ Worker 本地库。 -- 🔴 **⛔ 别在会话里起「常驻后台长跑任务」**:**真因=输出量把会话日志推过 ~10 MiB ⇒ 宿主 `diagnostic-log:dropped` ⇒ 界面不刷新、看着像卡**。🔴 **唯一可行起法=「会话后台任务 + stdout 全重定向到文件」**(detached spawn 活不过工具调用边界)。🔴🔴 **硬耦合:该会话只要有 `pending`/`running` 后台任务,宿主 idle 钩子就被「静默压制」**(实测被僵尸任务压 **6h20m**、零日志)⇒ 一切「钩子驱动的唤醒/监管」被无声掐死。⛔ 也不在自动化会话里手动续聊。⇒ 全文 -- 🔴 **监管+投递 = 常驻(一直运行)** —— 09-29 定案 + 10-01 用户再确认(「**协作与投递一直运行(常驻)**」)。🔴 **投递唯一出口=协作程序**(`collabd.py`);⛔ **"自动任务当闹钟"已废弃**;宿主钩子只作**补充**。🔴🔴 **唤醒时钟=这个常驻进程本身**(⛔ 非排期/自动任务;⛔ 别让唤醒会话自挂后台任务=禁区);代偿形态下**唤醒轮排期名须带 `[协作]`**(否则 `resolve_main` 认成"主会话"⇒投给自己)。⚠️ 钩子事件**实时生效·⛔不重启宿主**;`SessionEnd` 从不被投递 ⇒ 锚点用 `UserPromptSubmit`|⇒ 全文 -- 🔴 **作用域⛔ 不许静默排除**(09-28 用户点破):`wb-result-hook.py` 用**显式白名单** `LINE_WS` + **本工作区标 `scope=home`**(⛔ 不当被监管线)+ **被丢弃必写 `skipped.jsonl` + stderr**。⚠️ 线名按**相对 AIProject 第一段**取,⛔ 别用 `basename(cwd)`。 -- 🔴 **出口一律声明编码**:hook 走 `sys.stdout.buffer.write(bytes)`,被重定向的脚本(常驻/后台任务)走 `reconfigure("utf-8","replace")` —— 否则含 `⛔` ⇒ GBK ⇒ 整轮 `fatal`/静默放行(判据=写日志+emit;详 P0-10)。 -- 🔴 **WorkBuddy 网关(09-29 实测·源码级)**:口令=`process.env.CODEBUDDY_GATEWAY_PASSWORD`(**桥跑在 WorkBuddy 进程树内即自动可得**);**唯一实测可用的带法是 `x-access-token: <明文>`**,`?password=` 在受保护路径上**永远失效** ⇒ 🔑 **401 ≠ 凭据不对,也可能只是带法不对:遇 401 先读鉴权代码再动手**。🔴 **本机并存多实例、共用同一口令** ⇒ 判据只能靠**父链**(取证走 `tmp/wb-phone/asar-peek.mjs`)。 -- 🔴 **四条取数坑**:① `pkill -f` 匹配实际 argv ⇒ 用 `ss -lntpH 'sport = :PORT'`;② `fetch` 静默丢 `Host` 头 ⇒ 假 404/200 ⇒ `curl -H "Host: …"`;③ 本机 `md5sum` 出 `hash *path`、远端 `hash path` ⇒ 先 `cut -d' ' -f1`;④ `journalctl --since` 不吃 `date -Is` ⇒ 用 `--since @`;⚠️ `|grep …||true` 会把"上游失败"伪装成"无命中"。🔴 **本机 curl 走 `HTTP_PROXY`(`127.0.0.1:65230`)⇒ 访回环一律加 `--noproxy '*'`**,否则 502。 -- ⚠️ `--scene all` 演练含 120 s+90 s 观察窗 ⇒ ⛔ 不许套 < ~8 min 外层超时(截断 ⇒ `restore()` 不跑 ⇒ 106 relay 停机)。 -- 🔴 `ssh '…'` 单引号里不能再有单引号 ⇒ ✅ `cat > f <<"EOF"`/`ssh host 'bash -s' < 本地脚本`。⚠️ `systemctl is-active` inactive 时退出码 3 ⇒ 读状态的远端命令一律 `|| true`。 -- 🔴 **「单机自用」≠「不需要互联」**(用户原话)。🔴 **覆盖网络按异构设计**:中继 45%/55% 余量(⛔ 别用同构 15%)· 必须补 443/TCP 兜底 · VPN/代理检测即降级。 -- 🔴 **技术讨论不谈法规**(⛔ 不引条文当论据/不主动提合规/不前置上抛)⇒ 判据见 `CODEBUDDY.md §1`。🔴 接手前人结论先做最小取证 ⇒ ⛔ 别拿旧结论当既成事实。 -- ⚠️ **本机执行环境**:⛔ 别给 PATH 前置 `/c/Windows/System32`(那里 `bash`=WSL 启动器)。⚠️ `dirname`/`ls`/`grep` 成片 not found、rc=127 ⇒ ✅ `export PATH=:$PATH` **一次即恢复**;🔴 **工具调用间不共享 shell 状态 ⇒ 每条 bash 命令都要前置**。🔴 **MSYS 路径(`/e/…`)⛔ 别交给 Windows 原生程序**(会落到 `E:\e\…`)⇒ 一律传 `E:/…`。 -- ⚠️ **四条小规矩**:行尾只信字节级(`b.count(b'\r')`)|含反引号一律 Write/Edit|引用用户口径只写原话|`python -c` 先落 `.py`|⛔ 进程替换 `diff <(a) <(b)` 不可用。 - -## 三、成本与自动化(**全文 ⇒ 技能 `dsh-workflow`**) - -- 🔴 **成本** ≈ 单价 × 一轮工具调用次数 ⇒ 杠杆=**压一轮次数**(大输出先落盘只读关键行|限流|只 print 摘要)。⚠️ 无人值守 prompt 必写「本轮只做一件事,做完即停」。 -- 🔴 **自动化四律**:自动化=开新会话唯一通道|开机第 0 步=跑 `state.py`|prompt ⛔ 不抄任务细节|**下一棒 id 只来自工具返回值**|**排期**=收口+3~4 分钟、每条线只挂一个|入口只一份|🔴 **`cwds` 逐字同形**(去重键=`path.trim().toLowerCase()`)|🔴 **入口头部声明的「工作区」决定归属**。 - -## 四、仓库 / 推送 / 授权 - -- 📂 **全文 ⇒ `.workbuddy/memory/MEMORY-仓库推送与授权.md`**(双推/文档库并入/行尾/技能三处/抢锁 R9/授权)。 -- 工作区 `E:/ProgramData/AIProject/aliyun-dsh-server` 已入 git:remote `git@work.alotbuy.com:maogeigei/dsh_shenxian_workspace.git`(master);身份**仓库级** `maogeigei`/`maogeigei@gmail.com`;`core.autocrlf=false`。 -- 入库=文档与文件(`CODEBUDDY.md`/`README.md`/`state.py`/`.gitignore`、接续入口与包、`docs/`、`交付物/`、`交接单/`、`归档/`、`.codebuddy/`、`.workbuddy/memory/`);⛔ **不入库** `tmp/`、`待清理/`、日志与缓存、`*.db*`、`*.tar.gz|*.tgz`、`.backup-*/`。⛔ **工作区不留脚本副本** ⇒ 绝对路径调文档库 `07-scripts/`。 -- 🔴 **技能总仓(10-05)**:`workbuddy_skills.git`=**25 技能总仓**(推前 `git ls-tree -d` 数一遍,⛔ 别"删库再提交")。⚠️ 自 `43b83b0` 含明文令牌 `.neodata_token`(已 `rm --cached`+补规则;**历史 blob 仍在** ⇒ 彻底清须 `push --force`+**服务端吊销**)。🔴 **入库前必扫凭据文件名+已知令牌串;核验远端必与备份比差异**。 - -## 文档库 - -⇒ **⛔ 动 `dsh-server-docs` 前先读库内 `CODEBUDDY.md` 同名章**(`04-调整方案/` 号不动;`05-交接单/` 是锁根、`07-scripts/` 绑宿主 hook;**先抢锁**;整理类任务须有**顶层可见变化**)。 +# DSH 平台 — 记忆(**状态层**) + +> **判据**:会「违规/事故」⇒ 写实体;只"更慢更绕" ⇒ 给指针。落点:规则→`CODEBUDDY.md`(⛔不重复)|状态→本文件|方法论→技能|一次性事→`PLAYBOOK`/日志。 +> 📄 报障先读 `PLAYBOOK-实例与插件坑.md`。 +> ⚠️ **上限 7,650 字符**(⛔ `wc -c` 量的是字节)⇒ **只减不增**;细节 ⇒ `MEMORY-全文-20261001.md`(下文「⇒ 全文」指它)。 + +## 一、状态速查(会变的都在这) + +| 项 | 状态 | +|---|---| +| **在途单** | 🔴 **⛔ 别凭本表做规划 —— 现查 `state.py` + 本线 `接续入口_*.md` §0 最新行**。| +| **🔴 三条线拍板** | ① **承载两分(09-26)**:**公共承载(服务别人)只有服务器能当;主权承载(只服务自己租户)桌面机 ✅**。② **IM 线(09-23)**:E2EE=**强度档** · 连接层=**B 引 Centrifugo**(须补自建心跳)。③ **D8(09-26 用户原话「先不开端口,后续有需要再开」)** ⇒ **主动搁置、⛔ 不当待办**;重开=要做**跨节点内容分发**时;替代(不需端口)=**设备主动拉**;⛔ 不影响群聊(全走 443)。📂 全文 ⇒ `MEMORY-设计口径-20261001.md` §1/选型单 §十四/`交付物/端口决策…-20260926.md` | +| **并发锁** | 🔴 **域锁**:域不重叠即真并行;无 `--domains` ⇒ 退化独占。🔴 **域键算法 shell/hook 必须逐字一致**(`_ANCHOR_SEGS` ⇄ `_DOMAIN_SEGS`)否则**静默失效**。开工第 0 步 `preflight-lock.sh "<会话名>" <文件...>`(【D】未归类/【E】机制层非空 ⇒ rc=1)。🔴 **机制层须独占**|🔴 **释放必带会话名**(不带 ⇒ fail-closed;rc=124 ⇒ 用 `mv` 等效释放)|⚠️ 非 ASCII 会话名锁目录带 `cksum` 后缀|⚠️ **验收 hook 必带 `DSH_SESSION_NAME`**(否则假绿)。| +| **生产形态 / 路径** | 47 的 PG=本机进程 `127.0.0.1:15432`(⛔ 非容器 ⇒ `docker exec` 全失败)。47=Manager(`dshs`)+Worker `w-47`(19100);106=`w-106`(19000)。🔴 **drop-in 才是唯一载体**(写 `/etc/dshs.env` = 静默压掉)|回滚=删 `cluster.conf`→`daemon-reload`→`restart dshs`。🔴 **106:`users/` 权限必须 711**(700 ⇒ 实例必崩)。| +| **🔴 会话分组 / cwd** | 🔴 `workspaces` 表 ⛔ 非真源;用 **`sessions.cwd`/automation `cwds` 正斜杠形态**(`E:/ProgramData/AIProject/`)。错一字面即裂组且**自我强化**📂 技能 `dsh-workflow`(多棒接力档 §0.6) | +| **配置外置线 / 覆盖网络线** | 🔴 **drop-in 必留 `DSH_PLATFORM_DIR=/opt/dsh`**(删 ⇒ 目录静默搬家)|🔴🔴 **中继走 443 ⇒ 功能全可用、⛔ 不用开任何端口**(UDP `21100-21115` 只服务 P2P);单秘密副本=`config/platform.env`(不入库·600;**系统 env > 文件 > 代码默认**)。📂 全文 ⇒ 同文件 §6/§7 + 入口 `接续入口_覆盖网络线_20260916.md`(**§0 最新行+§2 首行=唯一依据**) | +| **🔴 形态元假设(09-21·最易犯)** | 一句判据:⛔ 默认「**一个控制面**」=错 ⇒ 正确=**控制面联邦**。📂 **全文 ⇒ 同文件 §2** + 定稿 `02-架构设计/覆盖网络-顶层架构全貌.md`(唯一权威,⛔ 别凭本行做设计) | +| **📁 文档分层** | 🔴 **过程 ≠ 成品**:`04-调整方案/`=过程|**`架构设计/`=定稿**,冲突以定稿为准。⚠️ 过时结论⛔ 不改正文,只加头部状态块指向定稿。⇒ 技能 `dsh-knowledge`。| +| **插件数据落点(硬标准)** | 🔴 **一插件一库 `dshs_pl_`** ⇒ ⛔ 不得拿实例本地 SQLite/文件当权威(只可缓存)|取 `DSHS_DB_URL` **只从 drop-in `cluster.conf` grep**。📂 **全文 ⇒ 同文件 §3** | +| **跨云 / 用户卷** | 🔴 **D4(09-18)跨云=目标形态**(作废「须同云」)|🔴 **用户卷在 worker 上时写 home 必走 `UserFs`**(直写 `fs` = 静默空操作)。📂 **全文 ⇒ 同文件 §4** | +| **🔴 会话类别(10-05 起)** | 🔴 **只有三类:主会话/任务会话/检查会话**(唤醒·跟进·队列上报**已整套退役**;「接续会话」=形态、⛔ 非类别)。🔴 读数=`sessions` 表;判「都空闲」必**排除自己**;**自动化只能开新会话**。📂 细则 ⇒ 技能 `session-mechanism`(⚠️ 本行 2026-10-10 订正:原写「四类+开工建齐唤醒/协作/跟进」是**作废口径**) | +| **🔴 接续阈值(10-01 改值)** | 一句判据:**三条任一命中 ⇒ 开接续会话** —— 上下文 ≥ **220,000** tok|日志软 **5** / 硬 **8 MiB**(🔴 **已升主阈值**,10-01 由钩子 `session-log-guard.py` 落地并验收)|工具调用软 **200** / 硬 **250**(🔴 **尚未接线**,`stop-dialog-guard.py` 仍 80 次)。📂 实体 ⇒ `CODEBUDDY.md §G` | +| **🔴🔴 常驻三件(10-05·P0-73/74)** | ①**载体=必夹「启动器」**:任务动作必经 `supervise-launch.py`/`board-launch.py`(任务动作**没有 env 字段**,变量只能进程内设);缺它 ⇒ 读 **0 字节空库**、检查程序**静默失效**。②**起法只许一条**:改"起法"必搜 `New-ScheduledTaskAction` + `.ps1`(第二旁路走 `powershell.exe` ⇒ `conhost` ⇒ **闪黑窗**)。③**部署≠生效**:`deploy_code.py --ws <区>` + **重启常驻**;判据=心跳 **`started_h` 晚于部署时间**。🔴 **判两套:协作看心跳 ∧ 检查看有没有 `检查会话:…` 分支**。⇒ P0-73/74 | + +## 二、本机铁律(⛔ 违反即事故) + +- 🔴🔴 **手机接入类功能 ⛔ 不得影响 WorkBuddy 本身的运行**(09-29 用户明令):**单向依赖,fail-safe 方向=关掉自己**(崩/被杀/超时 ⇒ 只许"功能不可用",⛔ 不许"WorkBuddy 异常")。⛔ 也不得对**宿主在跑的会话**做 `load`/接管、抢 `writer_occupied`、改其配置/进程,⛔ 无超时等待上游。📂 **全文(七条条款+禁止清单+V7 验收)⇒ `MEMORY-设计口径-20261001.md` §5** +- 🔴🔴 **活库改动铁律**:`workbuddy.db`=**WAL 三件套** ⇒ ⛔ **禁文件级 `cp`/`mv`**(salt 世代错位 ⇒ `file is not a database`);四条做法见全文(**停 app**/`backup()` API/SQL+`busy_timeout`/`integrity_check`)。🔴 活动库看 `CODEBUDDY_CONFIG_DIR`(实测 `E:\ProgramData\.workbuddy`);`~/.workbuddy/`=**旧库**。🔴 09-23 已发生**主库头部级损坏**(零备份 ⇒ 数据全丢)⇒ **影响面超本平台 = 红线门禁,⛔ 不擅自修,先报用户**。⇒ 全文 +- 🔴 **实例/沙箱起不来,先查这三样(别先怀疑 OOM)**:① **属主/EACCES**(root 跑 `dsh --profile` ⇒ 属主变 root ⇒ 崩溃循环/404)② **bwrap 版本**(47=0.4.0/106=0.11.0;`--perms` 属 0.5+ ⇒ 47 报 `Unknown option` ⇒ **全挂**)③ **`endpoints[].streams` 恒=64** ⇒ 503/「一直重启」。修法 ⇒ 全文。⚠️ 备份一律 `/opt/dsh/backups/`|⚠️ `smoke-isolation` 不能作 account 模式验收|⇒ 全文 +- 🔴 **集群化数据分层判据**:① 归属/租约 ⇒ 只有 Manager 能写(双写=脑裂)② 跟用户走 ⇒ 实例 home ③ 本机运维 ⇒ Worker 本地库。 +- 🔴 **会话里起「常驻后台长跑任务」=禁区**:真因=输出量把会话日志推过 ~10 MiB ⇒ 宿主丢日志 ⇒ 界面看着像卡。🔴 **唯一可行起法=「会话后台任务 + stdout 全重定向到文件」**。🔴🔴 **硬耦合:该会话只要有 `pending`/`running` 后台任务,宿主 idle 钩子就被静默压制**(实测被僵尸任务压 **6h20m**)⇒ 唤醒/监管被掐死。⛔ 也不在自动化会话里手动续聊。⇒ 全文 +- 🔴 **监管+投递 = 常驻**(10-01 用户再确认「协作与投递一直运行」)。🔴 **投递唯一出口=协作程序**(`collabd.py`);**"自动任务当闹钟"已废弃**;宿主钩子只作补充。🔴🔴 **唤醒时钟=这个常驻进程本身**(⛔ 非排期/自动任务);代偿形态下唤醒轮排期名须带 `[协作]`(否则 `resolve_main` 认成主会话 ⇒ 投给自己)。⚠️ 钩子事件实时生效、⛔ 不重启宿主;锚点用 `UserPromptSubmit`(`SessionEnd` 从不被投递)。⇒ 全文 +- 🔴 **作用域不许静默排除**(09-28 用户点破):`wb-result-hook.py` 用**显式白名单** `LINE_WS` + **本工作区标 `scope=home`** + **被丢弃必写 `skipped.jsonl` + stderr**。⚠️ 线名按**相对 AIProject 第一段**取,⛔ 别用 `basename(cwd)`。 +- 🔴 **出口一律声明编码**:hook 走 `sys.stdout.buffer.write(bytes)`,被重定向的脚本走 `reconfigure("utf-8","replace")` —— 否则含 `⛔` ⇒ GBK ⇒ 整轮 `fatal`/静默放行(详 P0-10)。 +- 🔴 **WorkBuddy 网关(09-29 实测·源码级)**:口令=`process.env.CODEBUDDY_GATEWAY_PASSWORD`(**桥跑在 WorkBuddy 进程树内即自动可得**);**唯一实测可用的带法是 `x-access-token: <明文>`**,`?password=` 在受保护路径上**永远失效** ⇒ 🔑 **401 ≠ 凭据不对,也可能只是带法不对:遇 401 先读鉴权代码再动手**。🔴 **本机并存多实例、共用同一口令** ⇒ 判据只能靠**父链**。 +- 🔴 **取数四坑**:`pkill -f` 认实际 argv ⇒ 用 `ss -lntpH`|`fetch` 静默丢 `Host` 头 ⇒ `curl -H "Host: …"`|本机与远端 `md5sum` 输出格式不同 ⇒ 先 `cut -d' ' -f1`|`journalctl --since` 不吃 `date -Is` ⇒ 用 `--since @`。⚠️ `|grep …||true` 会把"上游失败"伪装成"无命中"。🔴 **本机 curl 走 `HTTP_PROXY` ⇒ 访回环一律 `--noproxy '*'`**(否则 502)。📂 全文 +- ⚠️ `--scene all` 演练含 120 s+90 s 观察窗 ⇒ ⛔ 不许套 < ~8 min 外层超时(截断 ⇒ `restore()` 不跑 ⇒ 106 relay 停机)。 +- 🔴 `ssh '…'` 单引号里不能再有单引号 ⇒ ✅ `cat > f <<"EOF"`/`ssh host 'bash -s' < 本地脚本`。⚠️ `systemctl is-active` inactive 时退出码 3 ⇒ 读状态的远端命令一律 `|| true`。 +- 🔴 **「单机自用」≠「不需要互联」**(用户原话)。🔴 **覆盖网络按异构设计**:中继 45%/55% 余量(⛔ 别用同构 15%)· 必须补 443/TCP 兜底 · VPN/代理检测即降级。 +- 🔴 **技术讨论不谈法规**(不引条文当论据/不主动提合规)⇒ 判据见 `CODEBUDDY.md §1`。🔴 接手前人结论先做最小取证,⛔ 别拿旧结论当既成事实。 +- ⚠️ **本机执行环境**:⛔ 别给 PATH 前置 `/c/Windows/System32`(那里 `bash`=WSL 启动器)。⚠️ `ls`/`grep` 成片 not found、rc=127 ⇒ `export PATH=:$PATH` **即恢复**;🔴 **工具调用间不共享 shell 状态 ⇒ 每条 bash 命令都要前置**。🔴 **MSYS 路径(`/e/…`)⛔ 别交给 Windows 原生程序**(会落到 `E:\e\…`)⇒ 一律传 `E:/…`。 +- ⚠️ **五条小规矩**:行尾只信字节级(`b.count(b'\r')`)|含反引号走 Write/Edit|引用户口径只写原话|`python -c` 先落 `.py`|⛔ 进程替换 `diff <(a) <(b)` 不可用。 + +## 三、成本与自动化(**全文 ⇒ 技能 `dsh-workflow`**) + +- 🔴 **成本** ≈ 单价 × 一轮工具调用次数 ⇒ 杠杆=**压一轮次数**(大输出先落盘只读关键行|限流|只 print 摘要)。⚠️ 无人值守 prompt 必写「本轮只做一件事,做完即停」。 +- 🔴 **自动化四律**:自动化=开新会话唯一通道|开机第 0 步=跑 `state.py`|prompt ⛔ 不抄任务细节|**下一棒 id 只来自工具返回值**|**排期**=收口+3~4 分钟、每条线只挂一个|入口只一份|🔴 **`cwds` 逐字同形**(键=`path.trim().toLowerCase()`)|🔴 **入口头部的工作区决定归属**。 + +## 四、仓库 / 推送 / 授权 + +- 📂 **全文 ⇒ `.workbuddy/memory/MEMORY-仓库推送与授权.md`**(双推/文档库并入/行尾/技能三处/抢锁 R9/授权)。 +- 工作区 `E:/ProgramData/AIProject/ai1net-dsh-server`:origin = `git@ssh.alotbuy.com:admin/dsh_ai1net_server.git`(2026-10-10 迁入;旧地址 `git@work.alotbuy.com:maogeigei/dsh_shenxian_workspace.git` 因主机密钥不符已弃用);身份 `maogeigei`/`maogeigei@gmail.com`;`core.autocrlf=false`。 +- 平台源码另存两处:`ssh.alotbuy.com:admin/dsh_shenxian.git` + 本机 `D:/github/dsh_shenxian`。 +- 入库=文档与文件(`CODEBUDDY.md`/`README.md`/`state.py`/`.gitignore`、接续入口与包、`docs/`、`交付物/`、`交接单/`、`归档/`、`.codebuddy/`、`.workbuddy/memory/`);⛔ **不入库** `tmp/`、`待清理/`、日志与缓存、`*.db*`、`*.tar.gz|*.tgz`、`.backup-*/`。⛔ **工作区不留脚本副本** ⇒ 绝对路径调文档库 `07-scripts/`。 +- 🔴 **技能总仓**:`workbuddy_skills.git`=10-09 起**白名单**收录(**6 个技能** + `改包纪律.md`,名单见 `.gitignore`;推前 `git ls-tree -d` 数一遍,⛔ 别"删库再提交")。⚠️ 历史 `43b83b0` 含明文令牌 `.neodata_token`(已 `rm --cached`,**历史 blob 仍在** ⇒ 彻底清须 `push --force`+服务端吊销)。🔴 **入库前扫凭据;核验远端与备份比差异**。 + +## 文档库 + +⇒ **⛔ 动 `dsh-server-docs` 前先读库内 `CODEBUDDY.md` 同名章**(`04-调整方案/` 号不动;`05-交接单/` 是锁根、`07-scripts/` 绑宿主 hook;**先抢锁**;整理类任务须有**顶层可见变化**)。