chore(工作区): 纳入版本控制基线(回收 411 MB 过程产物)
回收 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)、记忆修复前备份。
This commit is contained in:
commit
ce8e6ceed9
396 files changed
+66045
No files matched your search
@@ -0,0 +1,109 @@
|
||||
# automation 4665b040 · 执行记忆
|
||||
|
||||
## 2026-09-21 08:20 — 浮层线 阶段 3(项目架构全景排查)
|
||||
|
||||
**任务**:接续包《实例恢复浮层改造 20260921》文末「🟣 阶段 3」,只读分析 + 单文件 HTML 全景图 + 结构判断题。
|
||||
|
||||
**结果**:✅ 完成,两项交付均产出(HTML 全景图 84,481 B / 8 章节;判断题结论+三类成因逐条证据)。
|
||||
- 指纹门禁:接续包 md5 = `b166c6f2e8585a0c3c1ffe9b5f50a6c4` 与 prompt 一致,检通过。
|
||||
- 全程只读:未改仓库内任何文件(脚本落在工作区 `tmp/`),未部署、未重启;锁已 `--release-exec`。
|
||||
- 核心机器结论:`check-layering` 违规 **5 条**且与 09-16 首跑**逐条同边**、`added=[]`;规模 58→100 文件 / 14,053→35,184 行(+150%)未新增违规 ⇒ 判定「结构未混乱」。
|
||||
- 判断题结论:本因 = 方法性 2 条(判据主体错 `request.raw`→`reply.raw`、验收假绿 401 当通过)+ 流程性 1 条(水位 >30 万赶工);结构性 0 条。效率损耗真实存在,但归因「缺 ② 领域层(0/100)+ 大文件(>700 行 11 个)+ 高扇入」,属已登记债。
|
||||
|
||||
**产出**:`交付物/DSH项目架构全景图_20260921.html`(采集脚本 `tmp/arch_panorama_build.py`,原始数据 `tmp/arch_panorama.json`)。
|
||||
|
||||
**遗留(下棒可选,均未动)**:
|
||||
1. 本线阶段 3 已收口 ⇒ 浮层线**剩余项 = 0**;档案 `04-调整方案/146-*.md` §九 那句「已回滚 · 必须重新落地」已过期,归档时需同步(两棒都记录了,仍未改)。
|
||||
2. 阶段 3 报告里的结构债(补 `src/domain/`、拆大文件)**未落地**,属架构文档 P1,行为敏感且 >10 文件 ⇒ 需先出清单。
|
||||
3. 验收边界仍在:浮层失败态(`.__dsh-fail`)未做浏览器实测。
|
||||
|
||||
**踩过的坑(下次直接用)**:
|
||||
- 静态扫描 `src/**/*.ts` 时,**路径一律用「相对仓根」**(`src/...`);用绝对路径喂层判据 ⇒ 全部落进"未归类"(本轮踩过一次,与 `check-layering.mjs` 里那条注释警告同因)。
|
||||
- TS 源码 `import './x.js'` 指向 `x.ts` ⇒ 解析必须 `.replace(/\.js$/,'.ts')`,否则 import 边全断(矩阵/扇入全 0,静默"干净")。
|
||||
- 「数据表」标注宁缺不误报:repo 方法→表 映射加了**可信度守卫**(< 20 个方法即整块弃用),否则会出现 `/api/auth/login → dsh_instances` 这类误报。
|
||||
- 本机 Bash 需首行前置 PortableGit 的 `mingw64/bin` 与 `usr/bin` 进 PATH。
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-21 09:4x–10:0x — 同会话后续(用户实时追加需求,非本 automation 的排期任务)
|
||||
|
||||
**任务**:用户"要原型的动画效果 不要这个矩形的,改一下" ⇒ 浮层换**抠底发光标记**。
|
||||
|
||||
**结果**:✅ 已上线并双向 md5 对齐。`recovery.js 142bdf1d…` / 新增 `web/mark-glow-192.png aa7dd76d…`(抠底,替代带方底的 `favicon-192.png`);
|
||||
`box-shadow` → `filter:drop-shadow`(沿 alpha 轮廓,不再画出方形光晕);标记 96→132px。`dshs = active`;取图通路 `https://ai1net.com/mark-glow-192.png` = 200 + md5 一致(子域该路径 401,故走门户根域的设计仍必需)。
|
||||
|
||||
**🔴 值得留存的判据**(详见 `PLAYBOOK-实例与插件坑.md §21`):
|
||||
`chrome --headless=new --virtual-time-budget` **冻结 CSS 动画时钟** ⇒ `currentTime` 恒 0、计算样式恒起始帧,
|
||||
**看着像"动画卡死",实为夹具假象**(差点误报成产品缺陷)。判据 = 读 `getAnimations()[0]` 的 `currentTime/playState`。
|
||||
真时钟取证 = **Node 22 自带全局 `WebSocket` 直连 CDP**(本机无 playwright/selenium),脚本 `tmp/anim_final.cjs`。
|
||||
|
||||
**遗留**:`web/favicon.svg` 无引用(未删,等拍板);本机改动未 commit(用户未要求);失败态 `.__dsh-fail` 未触发性实测。
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-21 19:3x–20:0x — 同会话后续(用户实时追加需求:**多节点方案补全**)
|
||||
|
||||
**任务**:用户指出上一棒「144 §八 判 A 档 2~3 天」的口径**默认了"所有用户都在 47 本机"**,
|
||||
要求把方案补完整:**① 其他节点上线后如何组成网(举例:本机 ubuntu 已部署一个服务)② 节点之间如何分工
|
||||
③ 其他节点的用户(服务器用户 / Windows 用户 / 移动用户)如何分发插件和连接数据库**。
|
||||
|
||||
**结果**:✅ 完成,产出**新档案 `04-调整方案/147-多节点形态下的插件投放与数据面.md`**(含用户三问逐条答 + 五条硬缺口 G1–G5 全带 `file:line` + 推进顺序 S1–S6 + 两条待拍板各写优缺点 + 未验证清单 6 条)。
|
||||
- 同步回改 **144**(头部状态行 + §8.7 加"范围修正"块,⛔ 未删原文);`INDEX.md` **字节级单行插入**(CR 5→5 / LF 271→272 已校验);`docs-manifest.py` 刷新;`docs-audit.py` **RC=0 无 P0**。
|
||||
- 🔴 **本档最硬实测**:**今天的插件投放只能装到"与 Manager 同机"的用户** ⇒ 「其他节点用户如何分发插件」答案是**没有通路**:
|
||||
`business-plugins.ts:436/444/454/473` 全本机路径/本机 uid(`:444` `lstatSync` ⇒ 异地用户 ENOENT);跨机唯一那条腿 `:649 writeHandoff` **空转**(`config.ts:405/666` `DSHS_ENABLE_PATCH` 默认 false ⇒ watchdog 不启动 ⇒ `dsh.ts:149-157` 原文"handoff.json 无人消费")。
|
||||
- 组网机制层**已完成**(`overlay-node-join.cjs` / `overlay-node-admit.cjs` / 一机一钥序③ / 443 序④ / presence 序⑲ / `overlay_devices` 序47)⇒ 缺的是「接进网」与「升格为 Worker(`bootstrap-worker.sh`+`dsh_hosts`)」的**衔接件**。
|
||||
- 「连数据库」的正确答案 = **⛔ 不开放 PG**;真缺口是 **「实例/设备 → 控制面」身份与数据 API = 0**(**145 §一** 已取证)⇒ 建议与**序47 步 6–9 合批**。
|
||||
- 移动端结论:dsh 实例需 Node 运行时 ⇒ **只能做壳 ⇒ 零分发动作**(已写死进档案)。
|
||||
- 全程只读平台代码;**未 commit / 未 push**(用户未要求);锁已 `--release-exec`。
|
||||
|
||||
**遗留(下棒可选,均未动)**:① 147 §七 两条待拍板(内容分发通道形态 · 跨用户数据承载)② 本机 Ubuntu 能否直接升格 Worker —— **未验** ③ `overlay-node-join` 的 HTTP 通道是否已在控制面开放 —— **未核实**。
|
||||
|
||||
**踩过的坑(下次直接用)**:
|
||||
- 🔴 **无人值守会话里 PATH 可能只剩壳**:首条命令即报 `dirname: command not found` + `head: command not found`,`| head` / `$(dirname …)` 全废、脚本看着像"无输出"。
|
||||
每条命令**首行**前置 `PortableGit/versions/1.2.0/{usr/bin,bin}` 即可(已入 `PLAYBOOK §21.4`)。⛔ 别前置 `/c/Windows/System32`。
|
||||
- `docs-manifest.py` / `docs-audit.py` 都能用托管 python 3.13.12 直接跑,无需额外依赖。
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-21 08:4x · 第二棒:用户纠正**元假设** ⇒ 档案 148(多 Manager / 多区域联邦)
|
||||
|
||||
**用户原话**:「假如有多个 worker 呢, 这个覆盖网络可不是只有一个骨干服务器,也许几百上千台骨干服务器 都是各自区域的 manager,背后都有 worker,节点,设备」
|
||||
|
||||
**性质**:不是补细节,是**推翻元假设** —— 144/145/147 三档**全都默认「一个控制面」且没写出来**。
|
||||
⇒ 正确形态 = **控制面联邦(网的网)**;本棒产出 **档案 `04-调整方案/148-多Manager多区域联邦形态.md`**(27,924 B · LF-only · 329 行)。
|
||||
|
||||
**核心内容(判据句,下棒直接引)**:
|
||||
- **三层权威**:根(区域名录+用户全球唯一名+联邦吊销,**只在登录时被碰一次 ⇒ 非数据面瓶颈**)/区域 Manager(本区归属·租约·资格=今天的全套)/区内 Worker·节点(执行面+本机运维库)。
|
||||
- 🔴 **判据三句**:「跟着用户走」的数据**留锚定区 ⛔ 不跨区同步**|「全局唯一」标识**只在根**|「区域内唯一」状态**只在区 Manager、根 ⛔ 不镜像**(镜像=第二权威源)。
|
||||
- 🔴 **明确不做**:⛔ 用户数据跨区同步|⛔ 区域 PG 互联/双向复制(=两个可写副本=脑裂)|⛔ 根当区域代理(=回单中心,多中心收益归零)|⛔ 区域自取区名/自行扩区。
|
||||
|
||||
**四条硬缺口(带 `file:line`,下棒别重查)**:
|
||||
- **G1** `deployMode`=`local|k8s|cluster`(`src/config.ts:20`;`:409` 默认 local;`:572-577` `toDeployMode` 只认这三个)。
|
||||
🔴 `src/web/server.ts:318-319` **`k8s` 档直接抛错**("only the single-machine backend ships");`:323-324` `cluster` 档要求 `DSHS_CLUSTER_AGENT_URL=http://127.0.0.1:9000` ⇒ **同机/同内网语义,不是跨区**。
|
||||
⇒ **联邦不是"给 deployMode 加个值"**:该字段=**后端形态**(本机 SQLite / 远端 PG),「控制面数量」是**正交新维度**。硬塞第四值会让 5 个消费点语义模糊(`config.ts` / `fs/provider.ts:32` / `supervisor/proxy.ts:648-746` / `web/server.ts:318,1039` / `admin.ts:224`)。
|
||||
- **G2** 节点注册表=**本机 JSON 文件**:`src/net/relay/registry.ts:40` `NODES_REGISTRY_VERSION = 1`;`device-grant.ts:94` + `routes/overlay-nodes.ts:53` **各自**取 `join(dataRootDir(),'overlay','nodes.json')`(**未抽公共函数**);`scripts/overlay-node-admit.cjs:92` 同源。
|
||||
⇒ 百台 Manager = 百份互不知情注册表。⚠️ **⛔ 别直接把 nodes.json 换成共享 PG 表**(会把全网节点明细汇总到根 = 写热点 + 泄漏全局拓扑)⇒ 正解=**新增一层只含"区域级条目"的区域名录**。
|
||||
- **G3** `users` 表**无 `host_id`/`region`/`network`**(`src/db/schema.ts:112-123`;`username TEXT UNIQUE` **仅单库唯一**);`userRoot()` 只由 `dataRoot`+`userId` 构成(`src/fs/workspace.ts:25-27`);归属只在 `dsh_instances.host_id`(v11,`schema.ts:321`;乐观抢租语义见 `:302-306`)。
|
||||
⇒ **"用户锚在哪个区域"=推论而非字段** ⇒ 联邦下 **① 登录路由 ② 跨区迁移 ③ 全局重名** 三处必然出问题。
|
||||
- **G4(✅ 幸存资产,必须点明)** `overlay_devices` 主键 = **`(network, host_id)`**(`schema.ts:487-502` SQLite / `:505-520` PG)+ `network TEXT NOT NULL` ⇒ **`network` 已是一等维度、「区域 ≈ 一张网」数据模型现成**;缺的只是**区名由根分配**(防两区撞名致台账串台)。且 `:482-483` 明确该表**不参与 relay 准入** ⇒ 停写即可干净回滚。
|
||||
|
||||
**105/107/119 的 10 条旧结论逐条过**:存活 6(骨干 ≤10–20 **降级为"区域内"**/节点连 1–2 骨干/游戏服放 L1**跨区下更重要**/骨架不默认征用/首屏分层拉取…)|**按区重算 1**(48.5% 中继占比 **⛔ 不能用全局平均**,某区全移动网则远高)|**降级 1**(presence 先炸 → 联邦**反而缓解**,可分区收敛)|**必须改写 2**(105 §3.2 资格签发;105 §3.1「可见」须再加**跨区可见性**一维)。
|
||||
|
||||
🔴 **唯一触碰红线处(已上抛、未自决)**:105 §3.2「**骨干资格:只能由控制面签发**」+其 §七「**⛔ 不可回滚项**」在千区域下必须改写为「**本区 Manager 签发 + 根背书**」(区域权威来自根**委派**,不是**并列** ⇒ 仍无第二权威源)。
|
||||
三案:**A** 严格照 105(根签所有骨干;缺点=根成千台级签发/吊销同步瓶颈、根挂则新区无法加入)|**B** 区签+根背书(倾向;缺点=**确实改写了 105 字面**、级联吊销链变长)|**C** 折中(骨干根签、**节点准入**下放区域;完全不动红线,但"骨干/节点"分界要在代码里显式化)。
|
||||
**A/B 差别不是"哪个更好",而是"要不要动 105 写死的红线" ⇒ 边界外 ⇒ 必须拍板。**
|
||||
第二项待拍板:**跨区可见性默认值**(**倾向默认互不可见** —— 与 105 §3.1「可见=默认最小」同源,105 已因同一理由否决过一次"默认可见")。
|
||||
|
||||
**推进顺序 F1–F7**:区域身份(区名由根分配)→ 区域名录(签名下发+本地缓存+长 TTL ⇒ 名录不可达时区域照常跑=105 验收 D)→ 用户锚点 → **F4 权威归属改写** → 跨区级联吊销(带序号防回滚)→ 跨区可见性 → **插件版本真源下沉到区域**。
|
||||
🔴 **F4 必须在 105 §五-2 之前拍板**,否则先把单 Manager 签发逻辑写完、再回头改语义 = 典型返工点。
|
||||
🔴 **联邦特有的插件约束**:`business_plugins.tgz_path` 存的是 **Manager 绝对路径**(`schema.ts:234-260`)⇒ **跨区迁移用户后指向错区文件** ⇒ 正解=**区域 tgz 池 + 根只背书"哪个版本是官方版"(签名)**,⛔ 别让根存 tgz 本体(否则根=10.8 GB bundle 分发中心,与 107 结论 3「分层拉取不推送」冲突)。
|
||||
|
||||
**产出与校验**:新档 148 + `INDEX.md` **字节级单行插入**(md5 `f52cf926…`→`389a36f0…`;59,422→62,292 B;**CR 5→5 未变、LF 272→273**)+ `docs-manifest.py` 刷新(档案 148 已登记)+ `docs-audit.py` **RC=0「无 P0 级问题」**;`.lock-148` 占号已释放、临时脚本已删。**⛔ 未 commit / 未 push**(用户未要求);执行锁起始即 FREE(无需 release)。
|
||||
|
||||
**⚠️ 本棒新踩的坑(下棒注意)**:
|
||||
- 🔴 **项目 `MEMORY.md` 注入上限 ≈7,800 字符,本轮已涨到 ≈8,340 —— 已超**。我加联邦行时**先超了上限**,随后连续压缩了「在途单」「其他线/品牌」「本机执行环境」「四条取数坑」四处才降下来,**但仍在 8,340 上下**。
|
||||
⇒ **下棒开工前必须先做一次减负**(把 §一 变长的行下沉到对应 `04/<NN>`,本文件只留判据句),⛔ 别再往上加。该提示**已写进 MEMORY.md 头部**。
|
||||
- ⚠️ Windows 上用 `python - << 'PYEOF'` 内嵌字符串做替换时,**含单引号/反斜杠的 `old` 极易 MISS**(本轮一次 MISS 导致"改了却没生效"的假象,像 bug)⇒ 批量替换优先**写 .py 文件再跑**,并**必须**校验替换后的字符数变化(本次靠它才发现 MISS)。
|
||||
|
||||
**自我批评(已写进 148 附段,下棒必读)**:我连续三档默认单控制面**且从未声明该假设** ⇒ 让用户替我做了一遍假设检查。
|
||||
**下次判据**:写任何"多节点"方案,**第一段必须先写清「控制面有几个、权威在谁手里」**,并显式声明本档假设(如「本档假设控制面数量 = 1」)。假设不写出来 = 等于没做假设检查。
|
||||
Reference in new issue
Block a user