Files
dsh_ai1net_server/.workbuddy/memory/MEMORY-全文-20261001.md
T
admin c1b5e4d966 chore(工作区): 全量入库 + 补齐 .gitignore(以工作区为准)
- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次)
- .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…),
  目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪
- .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/)
- .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*)
- .gitignore 补:备份件(*.bak-*)
- 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
2026-10-10 23:13:22 +08:00

66 lines
19 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`(§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/<line>`)。错一字面即裂组,裂组会自我强化。📂 技能 `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_<pluginId>`** ⇒ ⛔ 不得拿实例本地 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 <home> -user root -exec chown <uid>:<uid> {} +` → 重启。⚠️ 平台侧备份一律 `/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 @<epoch>`,且"查询失败"与"确无该行"必须可分;⚠️ `|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=<PortableGit 1.2.0 的 usr/bin:bin>:$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 `[email protected]:maogeigei/dsh_shenxian_workspace.git`(master);身份**仓库级** `maogeigei`/`[email protected]`;`core.autocrlf=false`。
- 入库=文档与文件(`CODEBUDDY.md`/`README.md`/`state.py`/`.gitignore`、接续入口与包、`docs/`、`交付物/`、`交接单/`、`归档/`、`.codebuddy/`、`.workbuddy/memory/`);⛔ **不入库** `tmp/`、`待清理/`、运行态日志与缓存、`*.db*`、`*.tar.gz|*.tgz`、`.backup-*/`。
- ⛔ **工作区不留脚本副本** ⇒ 一律绝对路径调文档库 `07-scripts/<name>`。
## 文档库结构与命名规则
⇒ **⛔ 动 `dsh-server-docs` 前先读库内 `CODEBUDDY.md` 同名章**(序号两位阿拉伯数字;`04-调整方案/` 号不动;`05-交接单/` 是锁根、`07-scripts/` 绑宿主 hook;动文档库**先抢锁,与工具无关**;整理类任务必须有**顶层可见变化**)。