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

19 KiB
Raw Blame History

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;动文档库先抢锁,与工具无关;整理类任务必须有顶层可见变化)。