回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复: - 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录) - tmp/(32.4 M,按接续棒命名的过程临时区) - .workbuddy/tmp/(39.5 M) - 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物) - tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留 入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与 接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、 .workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。 排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、 打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
12 KiB
12 KiB
DSH 平台 — 记忆(状态层)
判据:不看它会不会导致「违规」或「事故」?会 ⇒ 写实体;只"更慢更绕" ⇒ 只留指针。 落点:动作前必须生效的规则 → 根
CODEBUDDY.md(不在此重复)|会变的状态(在途单/版本/基线/位置)→ 本文件|方法论 → 技能|一次性事实·复盘·命令原文 →PLAYBOOK/04/<NN>|当天流水 →memory/YYYY-MM-DD.md|跨项目偏好 →~/.workbuddy/MEMORY.md。 📄 详版 =.workbuddy/memory/PLAYBOOK-实例与插件坑.md(报障第一件事就开它)。§ 速查:1 插件边界|2 GLIBC|3 插件加载失败三真因|4 铺插件陷阱|5 ETag|6 技术债|7 K8s 清理|8 兼容收口|9 实例取数四坑 + UI 分区三步定位 + 部署硬规矩|10 本机 Python 编码坑|11 去查索引|12 省积分。
一、最近闭环
- 09-16 覆盖网络线:10 份规划转正式档案 103–112(
4e3a1a4)+会合/中继拆分只读取证与改造方案(工作区根会合中继拆分_取证与改造方案_20260916.md,S0–S4)。零代码、零服务器改动。 - 09-15 T08 集群化 + 生产整体切换|档案 96 实例内存与插件开关解耦|档案 100/101 实例内「我的技能」+ 改名「能力管理」+ 页内 tab(
business-plugins0.3.22)|档案 102 语言切换搬入「用户设置」(0.3.23 +portal-entry0.5.5)|档案 93 兼容收口|档案 88 内置 dsh 安装路径探测。 - 🔑 「用户设置」= 我们自己的
@dsh-local/portal-entry(iduser-settings/ order 103 / label 存转义 unicode ⇒ 按 UTF-8 grep 搜不到);语言走官方ctx.locale;持久化 =POST /api/me/locale写用户settings.yaml。⇒07-实例UI分区登记表.md;🔧node scripts/find-ui.mjs [关键词]。 - 交互规则 4 连改(待拍板项置末 + 逐条编号 + 候选竖排成段 + 必须写优缺点)已固化进
dsh-change-workflow §5。
二、状态速查
| 项 | 状态 |
|---|---|
| 在途单 | 无在途(T01–T08 全完成归档)。T08 残留见 03-路线图 §二 🟡 |
| 生产形态(09-15 起) | 47 = Manager(cluster;控制面库 = 47 上 PG13 /var/lib/dshs-pg,单元 dshs-pg,127.0.0.1:15432)+ 本地 Worker w-47(19100);106 = Worker w-106(19000,经 SSH 反向隧道)。存量用户锚 w-47、新用户按容量落 w-106(粘性优先)。09-16 guest 已迁至 w-106(epoch 4)。⚠️ 权威库 = 47 的 PG,/var/lib/dshs/dshs.db 仅回滚用。⛔ 47 兼作 Worker 是有意设计、别当待修项。回滚 = 删 …/dshs.service.d/cluster.conf + daemon-reload + restart dshs |
| 106 节点 | 已补齐实例运行能力(dsh 0.1.5-rc.1 + /usr/local/bin/dsh + /usr/local/dsh-runtime + /var/lib/dshs/{bundled-skills,business-plugins} + users/ 权限 711 —— 原 drwx------ 会致实例必崩);ffmpeg/ffprobe 已用内网源 dnf 装好(⛔ 别再想"从 47 搬")。⏳ provisioner 未铺(新用户落 106 无人建号)。⚠️ 有旧控制面 dsh-users-platform.service(3080,早于集群化切换)⇒ 待拍板清理。方案 = 跨节点迁移与节点自举_完整流程方案_20260916.md(工作区根) |
| 集群化 | 单一来源 = 项目根 集群化改造方案_Manager-Worker_20260914.md;D1–D5 已定,⏳ 仅 D6(不阻塞);数据分层判据见 §三 |
| 实例内存(档案 96) | 与插件开关解耦:MemoryHigh=MIN=448 + MemoryMax=MAX=1024;/api/dsh/status 带 quota{...}。⚠️ MEM_TABLE 仅预估、不驱动配额 |
| 安装路径(档案 88) | ✅ 走 src/web/dsh-install.ts(env 认 DSHS_DSH_BIN / DSH_USERS_PLATFORM_DSH_BIN);导出侧待重建 |
| R2–R5 | R2 管理面就地化 / R3 标识迁移 / R5 多语言 ✅;R4 ✅ 选 (a) = 文档库并入代码仓 |
| 个人技能(用户自传) | ✅ 全链路;后端 6 路由(requireAuth);启用位 $DSH_HOME/skills / 禁用位 home/skills-library(watch 即时生效) |
| 归档编号 | 至 112(103–112 = 覆盖网络线 10 份);63 空号,勿补占 |
| 覆盖网络线 | 入口 = 工作区根 接续入口_覆盖网络线_20260916.md;零代码零服务器改动。🔑 第一件实事 = 会合/中继从 Manager 拆分(方案已出)⇒ ⏳ 唯一待拍板 = 骨干服务范围(档案 105 §七,倾向 A→B 渐进) |
| 熔断 / MCN / univer | 熔断 78:冷却 6h + 双通道告警已上线,L1 实测未做|MCN 0.3.10 已铺发,mcn-task 重复建组未解|univer = 内存探针,有意保留 ⇒ 勿以下架 |
提交基线:代码仓 4e3a1a4(未提交:scripts/*.py×3、skill-load-guard.py(新)、skills/*/SKILL.md×3、package.json、src/worker/agent.ts、bootstrap-worker.sh(新)、test/worker-provision.test.mjs(新))。均未 push(对账 git ls-remote origin refs/heads/master;本机 refs/remotes/** 写不进去)。
🗣 称谓:「本机」只能指跑 WorkBuddy 的开发机;47 / 106 一律写「远程服务器」或用 IP。
三、本机铁律(CODEBUDDY.md 未覆盖的部分)
- 🔴 R10 实例起不来先查属主 / EACCES,别先怀疑 OOM —— root 跑
dsh --profile⇒ 属主变 root ⇒ 崩溃循环 / 404。修find <home> -user root -exec chown <uid>:<uid> {} +→ 重启。⚠️ 用户 home 是 watch 域 ⇒ 读不了的文件同样致命 ⇒ 平台侧备份一律/opt/dsh/backups/。 - 🔴 改 bwrap 参数前先看目标机 bubblewrap 版本(47 = 0.4.0 / 106 = 0.11.0):
--perms属 0.5+ ⇒ 47 上Unknown option⇒ 沙箱起不来 = 所有实例全挂;要权限用--tmpfs。⚠️smoke-isolation不能作 account 模式验收。⇒交接单/T08-§10。 - 🔴 集群化数据分层判据(用户原话:「不一定 worker 不连数据库…」):① 归属/租约 ⇒ 只有 Manager 能写(双写 = 脑裂)② 跟着用户走 ⇒ 放实例 home,别塞控制面 PG ③ 本机运维用 ⇒ Worker 本地库。⇒ 设计文档 §1.3。
- 🔴 hook 脚本必须走
sys.stdout.buffer.write(bytes)—— 文本层sys.stdout.write+ 文案含⛔⇒ 宿主 stdout 非 UTF-8 ⇒UnicodeEncodeError⇒ stdout 空 ⇒ 静默放行(日志却写 deny ⇒ 表现成"判了但拦不住")。判据 = "写日志 + emit"双动作且 emit 走 buffer。PreToolUse的deny确有效;锁主力仍是三把锁 +handoff-guard.sh+ 约定,hook 是加固层。⛔ 别再写"hook 拦不住"。📂 自证日志真路径 =D:\github\dsh_shenxian\.workbuddy\lock-hook.log(跟DOCS_ROOT走)。⇒ PB §10。 - 🔔 技能加载闸门(09-16 装):钩子
dsh-server-docs/scripts/skill-load-guard.py—— 命中「决策方法 / 参考决策 / 按你的规划 / 别问我 / 自行决策 / 自主决策」⇒ 自动注入"必须先加载dsh-decision-method"(急停DSH_SKILL_GUARD_OFF=1或.workbuddy/skill-guard.disabled)。⚠️ 需完全重启才加载。 - 🔴 两条命令坑:①
pkill -f要匹配"实际 argv" ⇒ ✅ 按端口定位ss -lntpH 'sport = :PORT' | grep -oP 'pid=\K[0-9]+' | head -1。②fetch静默丢Host头(undici)⇒ 多租户验证落到"无租户"路由、假 404/200 ⇒ ✅curl -H "Host: …"、别跨用户测、判据别只看状态码。 - 🔴 「单机自用」≠「不需要互联」(09-16 用户原话:「单机用也要互联,这正是建立覆盖网络的目的」):租户维度收窄(1 个用户)与网络维度收窄(1 台机器)正交 ⇒ ⛔ 不得再用"单机自用所以没流量要互联"当前提(推演 v1 因此作废、已重写 v2)。
- 🔴 覆盖网络按异构设计:① 中继按 45% 设计、55% 留余量(⛔ 别用同构假设的 15%)② 必须补 443/TCP 兜底(否则封 UDP 的整类节点进不来)③ 有公网 IP 的节点自动升格为中继候选,但权威状态仍必须单点 Manager ④ VPN/代理类检测即降级中继,不重试 ⑤ 节点自报网络画像。
- 🔴 方案只做技术实现,合规不进方案(09-16 用户原话:「方案只考虑技术实现,跨境数据合规是谁用谁自己考虑」)⇒ ⛔ 不再把合规 / 数据主权 / 备案当前置条件、约束或上抛项。多区域就近 = 性能最优,不是合规动作。
- ⚠️ 本机执行环境:Python stdin/stdout 必须走
buffer显式 UTF-8(-E屏蔽PYTHONUTF8=1⇒ cp936 ⇒ 含中文静默炸)|改文件必用newline=""(读也要)|ESM|bash PATH 被 shim 重置 ⇒ 先export PATH=<PortableGit>/usr/bin:…:/c/Windows/System32:/c/Windows:$PATH|Python 原生 exe 不认/e/…⇒ 传参E:/…|bash 内联\被 MSYS 改写 ⇒ 含 Windows 路径的 Python 落成 .py 再跑|tar czf E:/…加--force-local|bash 的cd认中文路径、ls等被 MSYS 编码搞坏 ⇒ 先cd再用相对路径。⇒ PB §10。 - ⚠️ 行尾只信字节级(
grep -c $'\r$'会误报)⇒ Pythonb.count(b'\r')。BRIEF/README/skills/**/memory/**= 纯 LF;INDEX.md= 混合 ⇒ 改它走字节级单行插入;⛔ 别对它跑git checkout --。⚠️ 源仓refs/remotes/**写不进去(报成功但引用不存在 ⇒[gone])⇒ 对账一律git ls-remote origin refs/heads/master;git走 SSH 加GIT_SSH_COMMAND="ssh -o BatchMode=yes -o ConnectTimeout=15 -o StrictHostKeyChecking=accept-new"。 - ⚠️ 引用用户口径只写原话|含反引号的内容一律用 Write/Edit 写|进程替换
diff <(a) <(b)不可用|Edit是替换不是追加|省积分四招:批量活写脚本 / 拦大输出(bash-output-guard.py)/ 命令限流 / 切会话(唯一能归零)—— 最贵的不是第 1 轮而是"水位已高还跑 50+ 请求"的轮。⇒ PB §12。 - ⚠️ 打包与改名(
npm pack前核断言锚点、先删lib/*.bak与*.tgz、升号前确认号没用过、每包必须有.npmignore排除*.tgz;--force只准替换自己那一段;改名三件套 = SQLite.db+-wal+-shm一起改 / 压缩包内 grep-sed 够不到 ⇒ 解压→改→重压 / 改完真环境跑一次)。⇒ PB。 - 浏览器只准
agent-browser/browser-harness(CDP 9223);⛔ Playwright 全面禁止。
四、仓库 / 推送 / 授权
- 📦 09-15 文档库已并入代码仓(R4 选 a)⇒
D:\github\dsh_shenxian\dsh-server-docs\(git =D:/github/dsh_shenxian/.git)。锁脚本 =…\dsh-server-docs\scripts\handoff-guard.sh。镜像/opt/dsh/docs不变。⚠️ hooks 路径改动要完全重启才生效。 - 代码仓
D:\github\dsh_shenxian→…dsh_shenxian.git(master)|推送只能从本机;服务器改码走git bundle。文档库autocrlf=false+.gitattributes(* -text)必须保持。 - ⚠️ 技能是「三处」:本机
.workbuddy/skills/<name>/← 文档库skills/<name>/← 镜像/opt/dsh/docs/skills/。验收 = 两副本 md5 一致 + 镜像一致 +README.md/INDEX.md登记跟着改;同步前先抢全局执行锁。 - 📄 「去查」索引 = PLAYBOOK §11(权限档位 / 插件启停 / UI·univer / 个人技能 / docx /
business-plugins升级 / admin 跨用户 / 加新能力 / dsh 版本 / 开源导出)。 - 🔒 授权类:文件已全部移除(不属改造范围、不得再列为待办或上抛)。上游 MIT、不得对上游代码附加限制;对外发布前先放回那三份(
_授权归档_发布时再放回\)。