Files
dsh_ai1net_server/.workbuddy/memory/MEMORY.md
T

60 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/<line>`)。错一字面即裂组且**自我强化**📂 技能 `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_<pluginId>`** ⇒ ⛔ 不得拿实例本地 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 @<epoch>`。⚠️ `|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=<PortableGit usr/bin:bin>:$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 = `[email protected]:admin/dsh_ai1net_server.git`(2026-10-10 迁入;旧地址 `[email protected]:maogeigei/dsh_shenxian_workspace.git` 因主机密钥不符已弃用);身份 `maogeigei`/`[email protected]`;`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/<name>`。
- 🔴 **技能总仓**:`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;**先抢锁**;整理类任务须有**顶层可见变化**)。