Files
dsh_ai1net_server/.workbuddy/memory/MEMORY.md
T
admin a5b3a76cd3 chore(工作区): 撤除 scripts/ —— 两脚本皆失效,改用绝对路径调文档库 07-scripts/
_lock.sh 为一次性临时脚本(会话名写死),docs-sync-check.sh 为文档库版的
陈旧重复(2024 B vs 4516 B)。两者移入 归档/工作区-scripts-撤除-20260924/
并附理由 README。约定:工作区不保留脚本副本,避免漂移。
2026-09-24 07:52:12 +08:00

53 lines
15 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 字符** ⇒ **只减不增**(09-23 19:0x 已瘦身:8191 → **7,713**)
## 一、状态速查(会变的都在这)
| 项 | 状态 |
|---|---|
| **在途单** | 覆盖网络线 序①–㊿ 收官;**序46 在途**(步7 受阻:缺 `client-artifact-missing`)。🔴 **序47 在途**(档案 **145**;步1–7 已落并真跑,⛔ **步8–9 未做**=卡桌面线拨号载体+门户 UI)。🔵 **IM 线(档案 142)A–E 五单全部落地**;🔴 **三项拍板(09-23,见选型单 §十四)**:E2EE=**强度档**(≈55 µs/条 OK;⚠️ 三代价=棘轮须持久化/**群聊须 Megolm 化**(误用严格双棘轮⇒`O(N²)`)/agent 代答须重做)· 上限预算 `2000`/`10`/`30 s` **固化**(⚠️ 前提=单进程自研扇出)· 连接层=**B 引 Centrifugo**(⚠️ 须补发自建心跳)。**下一棒=第 12 棒动工 B 案**(automation `89e11630…`;接缝=`createImWsRuntime`;范围见入口 §2)。✅ **automation 库 09-23 18:55 已自愈(app 重建)** ⇒ **记录全丢,各线接续棒须重登**。🔴 **资源口径(09-22)**:**机器可换** ⇒ ⛔ 别用单机规模限制规划。 **唯一红 = D8 云安全组未实施**(放行**对端 `/32`** × UDP `21100/21115`;⛔ 零个 `0.0.0.0/0`)。🔴 持久禁令:⛔ 调 `RELAY_FAILOVER_DEADLINE_MS`、⛔ 动 `HB_SEC`/burst、⛔ `COOLDOWN_MS=0`。|
| **并发锁(09-22 域锁落地)** | 🔴 **域锁取代全局独占**:域不重叠即**真并行**;无 `--domains` ⇒ 退化独占。🔴 **域键算法 shell/hook 必须逐字一致**(`_ANCHOR_SEGS`⇄`_DOMAIN_SEGS`,先长后短)否则**静默失效**。开工第 0 步 = `bash scripts/preflight-lock.sh "<会话名>" <文件...>`(**【D】未归类 或【E】机制层非空 ⇒ rc=1 拒开工**)。🔴 **机制层须独占**(`config`/`crypto`/`isolation`/`index`/`scripts`/`CODEBUDDY.md`/锁本身)。⚠️ 非 ASCII 会话名的锁目录必带 `cksum` 后缀|⚠️ `trap` 单槽位|⚠️ **验收 hook 必带 `DSH_SESSION_NAME`**(否则空名走"只看 id"分支 ⇒ 假绿放行)。|
| **生产形态 / 路径 / 环境** | 47 的 PG 是**本机进程**(`127.0.0.1:15432`)**非容器** ⇒ 「`docker exec dshs-pg psql`」**全失败**;`su postgres` 无 socket、需 TCP+口令(⛔ 不取凭据)。47 = **Manager**(`dshs`;PG13 `15432`)+ 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 nginx`=inactive 属正常|`npm test` 用 Node 22|`bt-server` 别名已修 **22** 端口。|
| **🔴 会话分组 / cwd(09-23 二修·判据冻结)** | 真源 = **`workspaces.path`**(宿主自登记·全小写;`sessions.cwd` 已被污染 ⛔ 不作依据)⇒ `cwds` 逐字复制该值;新会话 cwd **逐字继承 `cwds`** ⇒ 错一字面即裂组(现 `e:`160/`E:`5/`d:`11)。🔴 **裂出的组会自我强化**(手动新会话继承所在组字面)⇒ 只改 automation 不够,须清已裂组。📂 技能 §0.6。|
| **配置外置线(140)** | 单一秘密副本 = `config/platform.env`(不入库·600);优先级 = **系统 env > 文件 > 代码默认**。🔴 drop-in 必留 `DSH_PLATFORM_DIR=/opt/dsh`(删 ⇒ 目录静默搬家)|改后**必须重生成服务器 `platform.env`**|涉密复扫须 0。|
| **覆盖网络线** | 入口 = 工作区根 `接续入口_覆盖网络线_20260916.md`(**§0 最新行+§2 首行 = 唯一依据**);⛔ 勿重做已完成棒。🔴 判据五条+坑清单 全在该入口+`参数表_覆盖网络_20260917.md`(指纹以 §10 现算为准)—— ⛔ 别凭记忆做。已落:relay 两台(只绑回环 `20080`)+切流/寻址/组密钥/jitter+打洞(D8 待验);sshd 反向隧道已下线。🔴 域名唯一 = `ai1net.com`;relay 候选 3 条(⛔ 别加伪多样性)|改候选链须「删 `directory.json`+二次重启控制面」才生效。|
| **🔴 形态元假设(09-21 立 · 最易犯)** | ⛔ 默认「一个控制面」=错(用户两次纠正)⇒ 正确 = **控制面联邦**(各区 Manager 各带 Worker/节点/设备)。**全文 ⇒ 定稿 `架构设计/覆盖网络-顶层架构全貌.md`(唯一权威)** ⇒ ⛔ 别凭本行做设计。🔴 **必背三句**(① 两张图分离=分水岭在根是否处于数据路径 ② 跟用户走/全局唯一/区域内唯一 三分 ③ 根密钥只管授权撤回签名者)。🔴 **多根=any-of-N**(任一沦陷=全网沦陷;Manager 可升格 ⇒ **N 台=N 根**)。🔴 **G1=一切前置**+ **G6 撤根无机制** ⇒ **两者一起解、先于 F2**。🔴 **未自决**:105 §3.2 骨干资格签发权|跨区可见性默认(倾向**互不可见**)。|
| **📁 文档分层(09-21 立 · 找文件先看这条)** | 🔴 **过程 ≠ 成品**:`04-调整方案/`=过程|**`架构设计/`=定稿**。**冲突 ⇒ 以 `架构设计/` 为准**。⚠️ 过程档案过时结论**⛔ 不改正文**,只加头部状态块指向定稿。机制 ⇒ 技能 `dsh-architecture-lifecycle`。|
| **插件数据落点(硬标准)** | 🔴 **一插件一库 `dshs_pl_<pluginId>`** ⇒ ⛔ 不得拿实例本地 SQLite/文件当权威(只可缓存);内归属列 `user_id`/`room_id` **强制**。⛔ `homedir()` 必错(实例 `HOME=ws`)。🔴 判版本只看 `node_modules/<pkg>/package.json`;源权威副本 = `dsh-plugin-mcn/lib/`。🔴 **47 代码根 = `/opt/dshs`、106 = `/opt/dshs-cluster`**(106 无 `/opt/dshs`)|`/opt/dsh` = 平台数据根,三台同名|取 `DSHS_DB_URL` **只从 drop-in `cluster.conf` grep**(`source /etc/dshs.env` 拿到错的 5432)。⚠️ 真机取证清理**必须写进 `catch`**。🔴 **装配协议 = `link:`**(09-23 拍板,推翻 `file:`)⇒ 待落地 4 处(含**重编译部署 47/106**);判据 = 软链、占用 ≈ **4.0 K**;⚠️ 软链目标须两机**同路径**。📂 全文 ⇒ `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`。|
## 二、本机铁律(⛔ 违反即事故)
- 🔴🔴 **活库改动铁律(09-23 血教训 · 已有结局)** —— `workbuddy.db` = **WAL 三件套**(`.db`+`-wal`+`-shm`,app 运行中持有)。⛔ **禁文件级 `cp`/`mv`**(只换一部分 ⇒ salt 世代错位 ⇒ `file is not a database`)。⇒ ① ⛔ 仅**文件级**操作须停 app(**SQL 变更可在线**·22:0x 实证)② 备份用官方 `backup()` API(不碰三件套)③ 改数据**只走 SQL** + `busy_timeout` ④ 改完跑 `integrity_check`。⚠️ 判据两条都须过:① `change counter`(off24)=`version-valid-for`(off92) ② 头部 16B=`SQLite format 3`。🔴 **`?immutable=1` 读不出 ≠ 仅 WAL 错位**(实测=**主库头部级损坏**:建报 `database disk image is malformed`/查报 `file is not a database`)。🔴 **判活动库/配置目录看 `CODEBUDDY_CONFIG_DIR`**(实测 `E:\ProgramData\.workbuddy`);`~/.workbuddy/workbuddy.db`(09-12)=**旧库**,⛔ 不当备份。🔴 **09-23 救治结论**:头部坏 + WAL 无 `page_no=1` 帧 + 零 db 备份 ⇒ 只剩「**重建空库**」;⚠️ 需停 app ⇒ **影响面超本平台 ⇒ 红线门禁,⛔ 不擅自修**。**18:55 app 自愈实测**:新库 magic 正常、旧库改名 `*.corrupt-*` 留档 ⇒ **代价=数据全丢**(automation 记录清空)。
- 🔴 **R10 实例起不来先查属主/EACCES,别先怀疑 OOM** —— root 跑 `dsh --profile` ⇒ 属主变 root ⇒ 崩溃循环/404。修 `find <home> -user root -exec chown <uid>:<uid> {} +` → 重启。⚠️ 平台侧备份一律 `/opt/dsh/backups/`。报 503/「一直重启」另查 `endpoints[].streams` **恒 = 64** ⇒ 代理连接泄漏占满中继额度(146;已修 `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 本地库。
- 🔴 **hook 脚本必须走 `sys.stdout.buffer.write(bytes)`**(否则文案含 `⛔` ⇒ `UnicodeEncodeError` ⇒ stdout 空 ⇒ 静默放行);判据 = 写日志 + emit 双动作。
- 🔴 **四条取数坑**(全文 ⇒ PB):① `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 启动器)。⚠️ `bash` 报 `dirname: command not found`(或 `ls`/`grep` 成片 not found、rc=127)⇒ ✅ `export PATH=<PortableGit 1.2.0 的 usr/bin:bin>:$PATH` **一次即恢复**(09-22 复测,PB §22.6);🔴 **工具调用间不共享 shell 状态 ⇒ 每条 bash 命令都要前置**。⚠️ 只有 export 也救不回才改走 PowerShell + 托管 python —— 该情形**至今未复现**,⛔ 别一遇 127 就跳。🔴 **MSYS 路径(`/e/…`)⛔ 不许交给 Windows 原生程序**(python.exe/Chromium/node)—— 按「当前盘根+相对」解释 ⇒ 落到 `E:\e\…`(09-22 实测长出 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分钟」+「一个会话结束时再排下一个」)= 间隔=收口 + 5~8 分钟、**每条线只挂一个**(域不重叠可各挂一棒)|**归属四律** = 入口只一份(本工作区,头部写工作区)· `cwds`=本工作区 · 参考规则用技能 · 🔴 **`cwds` 只写「与手动开会话的 cwd 逐字同形」**(判据 = 实测 `sessions.cwd`;当前正解 = `E:/ProgramData/AIProject/aliyun-dsh-server` **正斜杠** —— 宿主 `DesktopWorkspaceRepo.list()` 去重键 = `path.trim().toLowerCase()`,**只小写、不统一斜杠** ⇒ 斜杠不同即裂同名分组;目录改名后须同步 `cwds` + 历史 `sessions.cwd`)。✅ 存量已清零(09-23):aliyun 根 StoryForge 入口副本已删(备份 `归档/…removed-20260923`;权威版 `dsh-plugin-forge`)。🔴 **判据:入口文件头部声明的「工作区」决定它属于谁**,与放在哪无关 ⇒ 外来副本会让 `state.py` 把别线当自家线。
## 四、仓库 / 推送 / 授权 → 📂 全文 ⇒ `.workbuddy/memory/MEMORY-仓库推送与授权.md`(双推/文档库并入/行尾/技能三处/抢锁 R9/授权)
## 文档库结构与命名规则(2026-09-24 固化)
⛔ 动 `dsh-server-docs` 前**先读库内 `CODEBUDDY.md` 的「文档库结构与命名规则」章**。
要点:序号一律阿拉伯数字两位;`04-调整方案/` 号不动;`05-交接单/` 是锁根、`07-scripts/` 绑宿主 hook;动文档库**先抢锁,与工具无关**;整理类任务必须有**顶层可见变化**。
## 工作区 git(2026-09-24 立)
- 工作区 `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/`、`待清理/`、运行态日志与缓存(`.workbuddy/*.log`、`cache/`、`backups/`)、`*.db*` 与 `归档/db-cwd归一-备份-20260923/`、`*.tar.gz|*.tgz`、`.workbuddy/memory/.backup-*/`。
- ⛔ **工作区不保留脚本副本**:`scripts/` 已撤(两个脚本皆失效)⇒ 一律**绝对路径**调文档库 `07-scripts/<name>`,避免副本漂移。
- 2026-09-24 回收 411 MB(470 M → 58.8 M,经回收站可恢复)。