# DSH 平台 — 记忆(**状态层**) > **判据**:不看会不会「违规/事故」?会 ⇒ 写实体;只"更慢更绕" ⇒ 给指针。落点:规则 → `CODEBUDDY.md`(⛔不重复)|状态 → 本文件|方法论 → 技能|一次性事 → `PLAYBOOK`/当日日志。 > 📄 报障先读 `PLAYBOOK-实例与插件坑.md`(§21 浏览器侧验收**假阴性**|§23 真机取证三坑)。 > ⚠️ **上限 ≈7,800 字符**(字符 ≠ 字节,⛔ 别用 `wc -c` 算)⇒ **只减不增**;🔴 **09-26 压缩**:9,899 → 本版 ⇒ **原文存档 `MEMORY-全文-20260926.md`**(本文件写「⇒ 全文」处均指它)。 ## 一、状态速查(会变的都在这) | 项 | 状态 | |---|---| | **在途单** | 🔴 **⛔ 别凭本表做规划 —— 现查 `state.py` + 本线 `接续入口_*.md` §0 最新行**。| | **🔴 承载两分(09-26 立·治「服务节点」歧义)** | 「服务节点」=**两件事**(区 Manager 权威 + Worker 承载),⛔ 别合成一个词。**公共承载**(服务别人:须常开/可达/有特权/不占主用机/受平台管辖)⇒ ⛔ **只有服务器能当**;**主权承载**(只服务自己的租户)⇒ **桌面机 ✅**;桌面当公共承载=**把信任根从平台搬进私人设备**。⚠️ **P6 修正=推荐「B 与 A 并存」**(47 维持自研不动+106 试点 K8S)。🔴 连"所有节点和设备"须先 **F1.5**(G1 未修|G6 无机制⇒规模越大越撤不回去)。📂 `交付物/AI1NET-三类节点结构调整可行性-20260926.md` | | **🔴 IM 线三项拍板(09-23·持久)** | E2EE=**强度档**(⚠️ 三代价:棘轮须持久化/**群聊须 Megolm 化**/agent 代答须重做)· 上限预算 `2000`/`10`/`30 s` **固化**(前提=单进程自研扇出)· 连接层=**B 引 Centrifugo**(须补自建心跳)。📂 选型单 §十四。| | **🔴 D8(09-26 用户拍板)** | 「**先不开端口,后续有需要再开**」⇒ 转**主动搁置**、⛔ 不当待办;重开=要做**跨节点内容分发**时;⛔ 不影响群聊(全走 443)。🔴「设备当中继」路径已在 ⚠️ 但**中继方需"别人能连到它"=用户侧 NAT 门槛**(≠ 云安全组;同局域网零门槛)|🔴 **替代(⛔ 不需端口)=设备主动拉**。📂 `交付物/端口决策与设备中继可行性-20260926.md` | | **🔴 资源口径** | **机器可换**(09-22)⇒ ⛔ 别用单机规模限制规划。| | **并发锁** | 🔴 **域锁**:域不重叠即真并行;无 `--domains` ⇒ 退化独占。🔴 **域键算法 shell/hook 必须逐字一致**(`_ANCHOR_SEGS` ⇄ `_DOMAIN_SEGS`)否则**静默失效**。开工第 0 步 `preflight-lock.sh "<会话名>" <文件...>`(【D】未归类或【E】机制层非空 ⇒ rc=1 拒开工)。🔴 **机制层须独占**。🔴 **释放必带会话名**(不带 ⇒ fail-closed 拒绝)|⚠️ 护栏额度耗尽时 release **rc=124 卡住** ⇒ 用 `mv` 等效释放。⚠️ 非 ASCII 会话名锁目录带 `cksum` 后缀|⚠️ **验收 hook 必带 `DSH_SESSION_NAME`**(否则假绿)。| | **生产形态 / 路径** | 47 的 PG 是**本机进程**(`127.0.0.1:15432`)**非容器** ⇒ `docker exec` 全失败;需 TCP+口令(⛔ 不取凭据)。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 ⇒ 实例必崩)。nginx 归宝塔 ⇒ `is-active` inactive 属正常。| | **🔴 会话分组 / cwd** | 🔴 09-28 实测:`workspaces` 表只有 3 行 ⇒ ⛔ 非真源;用 **`sessions.cwd`/automation `cwds` 正斜杠形态**(`E:/ProgramData/AIProject/`)。错一字面即裂组,裂组会自我强化。📂 技能 `dsh-auto-handoff-chain` §0.6 | | **配置外置线(140)** | 单一秘密副本=`config/platform.env`(不入库·600);优先级=**系统 env > 文件 > 代码默认**。🔴 drop-in 必留 `DSH_PLATFORM_DIR=/opt/dsh`(删 ⇒ 目录静默搬家)|改后**必须重生成服务器 `platform.env`**|涉密复扫须 0。| | **覆盖网络线** | 入口=工作区根 `接续入口_覆盖网络线_20260916.md`(**§0 最新行+§2 首行=唯一依据**);⛔ 勿重做已完成棒。🔴 判据五条+坑清单全在该入口+`参数表_覆盖网络_20260917.md` ⇒ **⛔ 别凭记忆做**。🔴 域名唯一=`ai1net.com`;relay 候选 3 条(⛔ 别加伪多样性)|改候选链须「删 `directory.json`+二次重启控制面」才生效。🔴🔴 **中继走 443 ⇒ 功能全可用、⛔ 不用开任何端口**(`relay-direct`=443 兜底**中继入口**,⛔ 不是 P2P);**UDP `21100-21115` 只服务 P2P** ⇒ **可选优化**。| | **🔴 形态元假设(09-21 立·最易犯)** | ⛔ 默认「一个控制面」=错 ⇒ 正确=**控制面联邦**(各区 Manager 各带 Worker/节点/设备)。**全文 ⇒ 定稿 `02-架构设计/覆盖网络-顶层架构全貌.md`(唯一权威)** ⇒ ⛔ 别凭本行做设计。🔴 **必背三句**:① 两张图分离=分水岭在根是否处于数据路径 ② 跟用户走/全局唯一/区域内唯一 三分 ③ 根密钥只管授权撤回签名者。🔴 **多根=any-of-N**(任一沦陷=全网沦陷;Manager 可升格 ⇒ N 台=N 根)。🔴 **F1.5(G1 序号+G6 撤根)=一切前置**。| | **📁 文档分层** | 🔴 **过程 ≠ 成品**:`04-调整方案/`=过程|**`架构设计/`=定稿**。**冲突 ⇒ 以 `架构设计/` 为准**。⚠️ 过程档案过时结论 **⛔ 不改正文**,只加头部状态块指向定稿。机制 ⇒ 技能 `dsh-architecture-lifecycle`。| | **插件数据落点(硬标准)** | 🔴 **一插件一库 `dshs_pl_`** ⇒ ⛔ 不得拿实例本地 SQLite/文件当权威(只可缓存);内归属列 `user_id`/`room_id` 强制。⛔ `homedir()` 必错(实例 `HOME=ws`)。🔴 **47 代码根=`/opt/dshs`、106=`/opt/dshs-cluster`**(106 无 `/opt/dshs`)|`/opt/dsh`=平台数据根,三台同名|取 `DSHS_DB_URL` **只从 drop-in `cluster.conf` grep**。🔴 **装配协议=`link:`** ⇒ 待落地 4 处;软链目标须两机**同路径**。🔴 **列级 `maxBytes` 平台无强制点** ⇒ 唯一把关人=插件侧 `COLUMN_MAX_BYTES`;⚠️ **改声明后必回读 yaml 实际值**。🔴 **插件跑在「用户实例内」· IM 内核在「平台进程」⇒ 跨进程**:用户自配模型只有实例内可用 ⇒ 插件必须在实例内。📂 详见 `2026-09-23.md` | | **其他线 / 基线 / 品牌** | 其他线 ⇒ `BRIEF.md`。🔴 **D4(09-18)跨云=目标形态**,⛔ 作废「须同云」。🔑 基线/档案号 ⛔ 不写死 ⇒ 现查 `state.py`+`INDEX.md`;分叉走 `git ls-remote` 裸 sha + `merge-base --is-ancestor`。🔴 品牌=「能力网络」/`CapabilityNet`|favicon ⇒ `PLAYBOOK-品牌与标识资产.md`。🔴 共享模型=管理员逐用户授权(`users.shared_model_granted` v11 默认 0)|🔴 **用户卷在 worker 上时,写 home 必须走 `UserFs`**(直写 `fs` = 静默空操作)⇒ ⛔ 不得 `cp`/`mv`/直写 `fs` 动 home。🔴 数据库 ⇒ `数据库/DB-00…03`。| ## 二、本机铁律(⛔ 违反即事故) - 🔴🔴 **手机接入类功能 ⛔ 不得影响 WorkBuddy 本身的运行**(**2026-09-29 用户明令**:做这些功能都不能影响 workbuddy 本身的运行,要禁止这种锁死,技术实现上要严格遵循)⇒ **总则=单向依赖,fail-safe 方向=关掉自己**(崩/被杀/超时 ⇒ 只许"功能不可用",⛔ 不许"WorkBuddy 异常")。**七条技术条款 + 禁止清单 + V7 验收 ⇒ 定稿 `交付物/手机App经覆盖网络操作WorkBuddy-架构定稿v3-20260929.md` §0.5**。⚠️ 已犯过的反例:把长跑服务放进**会话后台任务** ⇒ 每轮输出唤醒宿主 ⇒ **永不空闲=用户看到"卡死"**(09-29 我违反 6 次);⛔ 也不得对**宿主正在跑的会话**做 `load`/接管、⛔ 不抢 `writer_occupied`、⛔ 不改其配置/进程、⛔ 无超时等待上游。 - 🔴🔴 **活库改动铁律** —— `workbuddy.db`=**WAL 三件套**(`.db`+`-wal`+`-shm`,app 运行中持有)。⛔ **禁文件级 `cp`/`mv`**(只换一部分 ⇒ salt 世代错位 ⇒ `file is not a database`)。⇒ ① ⛔ 仅**文件级**操作须停 app(**SQL 变更可在线**)② 备份用官方 `backup()` API(不碰三件套)③ 改数据**只走 SQL**+`busy_timeout` ④ 改完跑 `integrity_check`。🔴 **判活动库/配置目录看 `CODEBUDDY_CONFIG_DIR`**(实测 `E:\ProgramData\.workbuddy`);`~/.workbuddy/workbuddy.db`=**旧库**⛔ 不当备份。🔴 09-23 已实际发生过一次**主库头部级损坏**:头部坏+零备份 ⇒ 只剩「重建空库」⇒ **代价=数据全丢** ⇒ **影响面超本平台 = 红线门禁,⛔ 不擅自修,先报用户**。📂 过程 ⇒ 全文 §活库 - 🔴 **R10 实例起不来先查属主/EACCES,别先怀疑 OOM** —— root 跑 `dsh --profile` ⇒ 属主变 root ⇒ 崩溃循环/404。修 `find -user root -exec chown : {} +` → 重启。⚠️ 平台侧备份一律 `/opt/dsh/backups/`。报 503/「一直重启」另查 `endpoints[].streams` **恒=64** ⇒ 代理连接泄漏占满中继额度(已修 `proxy.ts`);清空=`restart dshs`。 - 🔴 **改 bwrap 参数前先看目标机 bubblewrap 版本**(47=0.4.0/106=0.11.0):`--perms` 属 0.5+ ⇒ 47 上 `Unknown option` ⇒ 沙箱起不来=**所有实例全挂**;要权限**用 `--tmpfs`**。⚠️ `smoke-isolation` 不能作 account 模式验收。 - 🔴 **集群化数据分层判据**:① 归属/租约 ⇒ 只有 Manager 能写(双写=脑裂)② 跟用户走 ⇒ 实例 home ③ 本机运维 ⇒ Worker 本地库。 - 🔴 **⛔ 别在会话里起「常驻后台长跑任务」**:⚠️ **真因=「输出/事件量」把会话对话日志推过 ~10 MiB ⇒ 宿主 `diagnostic-log:dropped` ⇒ 界面不再显示、看着像卡**(实物 `.stuck-20260929-230043`:`droppedLines:14261`);🔴 **⛔ 不是「任务挂在会话名下」**(09-30 用户反证:挂着后台任务的会话照样能发消息)⇒ 非要常驻则**必须完全静默**;🔴 **实测(09-30):"会话后台任务 + stdout 全重定向到文件"是本机唯一可行的常驻起法**(relay worker 注册成功、垫片 20090 health=200);**detached spawn 活不过工具调用边界**(日志 0 字节,`--detached` 同证)。⛔ 也**不在自动化会话里手动续聊** ⇒ 监管/投递=**常驻**(见下条 🔴🔴)。🔴🔴 **另有硬耦合:只要该会话有 `pending`/`running` 后台任务,宿主的 idle 钩子被「静默压制」**(09-30 实测被一个僵尸任务压 **6h20m**,闸门不过只重装表、**零日志**)⇒ 任何「钩子驱动的唤醒/监管」会被无声掐死 ⇒ 详见 `交付物/唤醒-idle钩子坐实-20260930.md`。⇒ 技能 `session-mechanism`(`references/forensics.md` §2g/§2h + `references/pitfalls.md` P0-2)。 - 🔴 **监管+投递 = 常驻(一直运行)**(09-29 定案 · **2026-10-01 用户再确认**:原话「**协作与投递一直运行(常驻)**」,理由「**可能不是所有队列都是钩子产生的**」+「**定时任务的方案已经废弃了**」)。🔴 **投递唯一出口=协作程序**(`collabd.py --supervise` = **投递本体 + 唤醒时钟**;`--tick` 只作投递轮);宿主钩子**只作补充**。🔴🔴 **唤醒时钟=这个常驻进程本身**(⛔ 不是自动任务/排期);⛔ **不许让唤醒会话自挂后台任务**(明令禁区)。(⚠️ 下句『唤醒轮排期名…』只在**代偿形态**下适用)🔴 **唤醒轮排期名必须带 `[协作]`** —— 否则被 `resolve_main` 认成"主会话"⇒ 通知投给**它自己**、主会话永远收不到(`[本机协作]` 里没有 `[协作]` 子串,会中招)。⚠️ **新钩子事件实时生效,⛔ 不需重启宿主**(09-30 实测:00:12 加 `PreToolUse ^Bash$` ⇒ 00:14 起 spawn)。`SessionEnd` 本机从未被投递(两日 0 次)⇒ 锚点用 `UserPromptSubmit`。⚠️ **载体(起法)=专用容器会话 + `stdout` 全重定向**(`detached spawn` 活不过工具调用边界;`schtasks` 被内置黑名单拦 ⇒ 走 PowerShell `ScheduledTasks` 模块,动作一律 `pythonw.exe`)。 > ⚠️ **2026-10-02 订正记录(本条原文三项全错)**:原文写「监管+投递都 = 钩子事件驱动/⛔ **不常驻**(常驻天生拿不到口令)/两个拨钟方:① 钩子 ② **自动任务**/⚠️ **常驻走不通**」—— > ① 常驻**拿得到**口令(09-30 实测 pid 52072 ⇒ `collabd-state.json.pw.have=true`);② 「自动任务当闹钟」2026-10-01 用户明令**废弃**;③ 常驻**走得通**(起法见上)。 - 🔴 **作用域⛔ 不许静默排除**(09-28 用户点破):`wb-result-hook.py` 现用**显式白名单** `LINE_WS`(客户端线/手机接入线/ai1net_ui)+ **本工作区标 `scope=home`**(⛔ 不当被监管线,防"监管自己看自己")+ **被丢弃必写 `skipped.jsonl` + stderr**(`status.md` 有专属面板)。⚠️ 线名按**相对 AIProject 第一段**取,⛔ 别用 `basename(cwd)`(子目录会错位)。 - 🔴 **hook 脚本必须走 `sys.stdout.buffer.write(bytes)`**(否则文案含 `⛔` ⇒ `UnicodeEncodeError` ⇒ stdout 空 ⇒ **静默放行**);判据=写日志+emit 双动作。 - 🔴 **WorkBuddy 网关(09-29 实测·源码级)**:口令=`process.env.CODEBUDDY_GATEWAY_PASSWORD`(**桥跑在 WorkBuddy 进程树内即自动可得,⛔ 不需人工取令牌**);**唯一实测可用的带法是 `x-access-token: <明文>`**,`?password=` 在受保护路径上**永远失效**(`requireAuth` 构造请求对象时写死 `query:{}`)⇒ 🔑 **401 ≠ 凭据不对,也可能只是带法不对:遇 401 先读鉴权代码再动手**。🔴 端口每次重启都变,且**本机并存多个 WorkBuddy 实例、共用同一口令** ⇒ 鉴权判据**不能区分实例**,只能靠**父链**。🔴 取证工具:`tmp/wb-phone/asar-peek.mjs`(按需读 `app.asar`,⛔ 不整包解压)+ `reflow.mjs`(压缩单行 JS 折行后 Read 才不被截断)。 - 🔴 **四条取数坑**:① `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` 把"上游失败"伪装成"无命中"。 - ⚠️ `--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` **一次即恢复**(09-22 复测);🔴 **工具调用间不共享 shell 状态 ⇒ 每条 bash 命令都要前置**。🔴 **MSYS 路径(`/e/…`)⛔ 不许交给 Windows 原生程序**(python.exe/Chromium/node)—— 按「当前盘根+相对」解释 ⇒ 落到 `E:\e\…`(曾实测长出 29 MB 影子目录)⇒ 一律传 `E:/…`;hook 已 `_norm_path()` 兜底。 - ⚠️ **四条小规矩**:行尾只信字节级(`b.count(b'\r')`)|含反引号一律 Write/Edit|引用用户口径只写原话|`python -c` 先落 `.py`|⛔ 进程替换 `diff <(a) <(b)` 不可用。 ## 三、成本与自动化(**全文 ⇒ 技能 `dsh-auto-handoff-chain`**) - 🔴 **成本** ≈ 单价 × 一轮工具调用次数 ⇒ 杠杆=压一轮次数:大输出先落盘只读关键行|限流(`head -30`)|脚本内部聚合只 print 摘要。⚠️ 无人值守 prompt 必写「本轮只做一件事,做完即停」。 - 🔴 **自动化四律**:自动化=开新会话唯一通道(钩子无此能力)|开机第 0 步=跑 `state.py`|prompt ⛔ 不抄任务细节|并行口令必带线名、抢不到锁只报告|🔴 **下一棒 id 只来自工具返回值**|🔴 **排期**=收口+5~8 分钟、**每条线只挂一个**(域不重叠可各挂一棒)|**入口只一份**(本工作区,头部写工作区)|🔴 **`cwds` 逐字同形**(现解=`E:/ProgramData/AIProject/aliyun-dsh-server` **正斜杠** —— 宿主去重键=`path.trim().toLowerCase()`,**只小写、不统一斜杠** ⇒ 斜杠/大小写不同即裂同名分组;目录改名后须同步 `cwds`+历史 `sessions.cwd`)|🔴 **判据:入口头部声明的「工作区」决定归属**(外来副本 ⇒ `state.py` 把别线当自家线)。 ## 四、仓库 / 推送 / 授权 - 📂 **全文 ⇒ `.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/`。 ## 文档库结构与命名规则 ⇒ **⛔ 动 `dsh-server-docs` 前先读库内 `CODEBUDDY.md` 同名章**(序号两位阿拉伯数字;`04-调整方案/` 号不动;`05-交接单/` 是锁根、`07-scripts/` 绑宿主 hook;动文档库**先抢锁,与工具无关**;整理类任务必须有**顶层可见变化**)。