- 变更规模:新增 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/ 知识文件,按口径入库)
173 lines
17 KiB
Plaintext
173 lines
17 KiB
Plaintext
==================================================================
|
||
协作机制 · 回归自测(每改一次必跑) 测试工作区:E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest
|
||
协作机制 · 回归自测(每改一次必跑) 测试工作区:E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest
|
||
==================================================================
|
||
✓ 命名:两级前缀解析(合规 / 缺级 / 接续会话 / 主控前缀) (9 项)
|
||
✓ 命名:看板与常驻程序**同一套角色判据**(⛔ 防两处漂移 —— 漂了就没人能发现换主会话) (8 项)
|
||
✓ 目标:无目标 ⇒ 拒绝启动 rc=3 (2 项)
|
||
✓ 目标:有待确认 ⇒ 拒绝启动 rc=4;--propose/--confirm 能走通 (2 项)
|
||
✓ 目标三态:『没有判据』⛔ 不等于『全过』(防『读不到被当成已完成』) (7 项)
|
||
✓ 验收判据认**真源的中文写法**(⛔ 别只喂英文 `pass` —— 那等于判据恒绿) (41 项)
|
||
✓ 两类检查会话是**两件事**:prompt 必须不同 + 闸④「本项目无待执行排期」 (18 项)
|
||
✓ 🔴🔴 闸⑥ 同类检查冷却期:两种情况 × 每类最多一条 ⇒ 不堆积(用户「不该有任何堆积」) (4 项)
|
||
✓ 检查会话的 prompt:**引用的命令必须真存在**(⛔ 引用不存在的命令 ⇒ 静默当成功) (7 项)
|
||
✓ 台账四态:running → blocked(带原因) → 解除后原因清掉 (3 项)
|
||
✓ 已停总闸:goal.run=paused ⇒ --once 只写一行、⛔ 不产告警(防『人为停掉被读成机制坏了』) (6 项)
|
||
✓ 投递:常驻程序(--once / --report)**零投递** (1 项)
|
||
✓ 投递:目标会话(**跟进会话**)在跑 ⇒ 必须延后(target-busy) (2 项)
|
||
✓ 投递:错名修复 —— `why` 透传(有候选但不活 ⇒ follow-not-live,⛔ 不再记 no-follow-session) (4 项)
|
||
✓ 投递:粗判第一条候选已哑、同类别另有活候选 ⇒ ⛔ 不许终局判 target-deaf(修『走不到精确重算』) (2 项)
|
||
✓ 投递:跨进程互斥锁存在且会被释放 (2 项)
|
||
✓ 投递:锁被**别的进程**持有时 ⇒ ⛔ 不投(`locked`) (1 项)
|
||
✓ 哑会话:诊断日志 ≥ 9.5 MiB ⇒ _deaf_sids() 判哑(只读 · 判据=读数、含边界) (4 项)
|
||
✓ 哑会话:投递命中已哑目标 ⇒ skipped=target-deaf(⛔ 不投 + 喊用户;⛔ 不记假绿) (2 项)
|
||
✓ 哑会话:**只认最新一天** —— 昨天撞过上限、今天已正常轮转 ⇒ ⛔ 不判哑(修『永久判哑』) (5 项)
|
||
✓ 投递(新):纯投影 --once ⛔ 不消费队列 (3 项)
|
||
✓ 投递(新):投不出去(no-token)⇒ ⛔ 不消费队列(防静默丢件) (4 项)
|
||
✓ 宿主卡住探针:只读尾部、测试环境零命中、⛔ 不误报 (6 项)
|
||
✓ 投递消费回查:投出去 ≠ 跑起来了 ⇒ 未消费必须升级为 NEED-USER (4 项)
|
||
✓ need_user:同句节流(⛔ 不每轮刷时间戳)+ 人写的「## 解除条件」两路都必须原样保留 (4 项)
|
||
✓ 投递忙判据:读宿主状态机日志的 busy=(⛔ 不再用 `status=='working'` 那档恒真的判据) (17 项)
|
||
✓ 🔴 `--tick` 已删:参数表/分支/钩子调用**三处皆无**,且投递段仍真删 (7 项)
|
||
✓ 对账:僵尸(台账 running 但没人跑)⇒ 标 blocked (1 项)
|
||
✓ 对账:幂等(连跑两次结论一致) (2 项)
|
||
✓ CLI:未知参数 ⇒ rc=2 且**不落常驻** (2 项)
|
||
✓ CLI:--where / --reqs 可跑且 rc=0 (2 项)
|
||
✓ 结构:关键名字/设施在位(防『误删常量』重演) (1 项)
|
||
✓ 结构:所有 subprocess 调用都带 creationflags(不显窗) (1 项)
|
||
✓ 结构:fatal 不再 exit 0(防『假绿』) (2 项)
|
||
✓ 结构:投递段**已真删**(⛔ 旧「投递方唯一」判据已于 2026-10-03 退役) (6 项)
|
||
✓ 主会话:**解析出来的**(不只是读登记)+ ⛔ 拒绝盲投(防『投错窗口』回潮) (26 项)
|
||
✓ 主会话:看板与投递**同一套判据**(⛔ 防两处漂移 —— 漂了就没人能发现换主会话) (2 项)
|
||
✓ 主会话:**退役角色不许当候选** —— 行为级(真造宿主库 + 真跑扫描,⛔ 不只测那个小函数) (5 项)
|
||
✓ 主会话:登记为 main 但**已哑** ⇒ ⛔ 不认它 + `--declare main` 是**换**不是「加」 (6 项)
|
||
✓ 结构:守护生命周期(优雅退出设施在位) (3 项)
|
||
✓ 归属判据:看板 ≡ 收尾确认(⛔ 防两处漂移;⛔ 不按 cwd 推断) (2 项)
|
||
✓ 看板:风格系统(三风格令牌在位 + 组件里零硬编码色) (2 项)
|
||
✓ 看板:验收摘要行 ⛔ 不许把『一条判据都没有』说成『无』(同族红线) (4 项)
|
||
✓ 看板:『未归类』不许被静默丢掉(同族红线:读到了就要说) (4 项)
|
||
✓ 看板:**同工作区但没归入本项目**的会话不许静默丢(⛔ 也不许把它算进本项目) (4 项)
|
||
✓ 归属:两处 `in_project` 判据**逐样本对账**(⛔ 漂了就静默漏管) (6 项)
|
||
✓ 会话退场:过期会话**收起但不删除**,且 ⛔ 不吃掉在跑的棒与主会话 (13 项)
|
||
✓ 看板:任务类别**来源**必须说得出口(declared / fallback) (6 项)
|
||
✓ 看板:多目标 tab(一格一个目标 ⇒ ⛔ 不是各画一份叠着) (28 项)
|
||
✓ 动手层:三条开工动作在位 + **判据不许恒红**(⛔ 恒红 = 没有判据) (10 项)
|
||
========================================================================
|
||
判据元体检 · E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest\judge_probe.py
|
||
========================================================================
|
||
⚠️ 命中 2 处(⛔ 这些是**可疑写法**,⛔ 不等于一定是错):
|
||
|
||
🔴 self-recompute [self] 行 [1]
|
||
↳ 判据里用 `lambda` **自己重算**被检的算法 ⇒ 改被检对象它照样绿(今天 V4)
|
||
|
||
🔴 anchor-text-only [weak] 行 [2]
|
||
↳ 锚在「源码/文本里出现过某词」⇒ ⛔ 证明不了行为(今天 V6;判据元规则之一)
|
||
|
||
处置:逐条改判据(⛔ 别改规则表消警告 —— 那是把体温计砸了)
|
||
ⓘ 确认是误报就加进 `FALSE_POSITIVE`(⛔ 但要写清为什么,⛔ 不许默默加)
|
||
✓ 判据元体检工具在位 + 它的**元规则**也不是摆设(⛔ 防「靠记得」) (10 项)
|
||
✓ 红线 S:⛔ 严禁把「被监控对象所在工作区」当成「目标归属工作区」+ 归属核对进 env_check (13 项)
|
||
✓ 红线:⛔ 严禁用「排期/自动任务」当常驻载体 + 环境检查必须查工作区部署 (11 项)
|
||
✓ 沉淀纪律:**经验不许写成流水账**(体量有上限 + 判据要点不许丢) (5 项)
|
||
✓ 看板:版面纪律(小字描述只进 ?;指定删除的三处不得回来) (3 项)
|
||
✓ 技能侧零项目串(「技能就是技能,谁用产生的文件放在他自己那里」) (4 项)
|
||
✓ 常驻:存活判据=『pid 活 ∧ 心跳新鲜』+ 自愈接线在 + ⛔ 两条不起闸 (11 项)
|
||
✓ 元:本测试不碰生产(判据=**测试独有的痕迹**,⛔ 不拿「文件被写过」当证据) (2 项)
|
||
✓ 闸②:判『所有会话都结束』=与看板同款(status=='working')+排除观察者自己 (6 项)
|
||
✓ 检查会话:排期名**按两级前缀**(⛔ 否则看板认不出它是任务会话)+ 看板有『检查程序在跑』读数 (6 项)
|
||
✓ 检查会话:board ⇄ collabd 两侧解析**逐样本对账**(⛔ 这两侧已漂过三次) (6 项)
|
||
✓ 检查会话 prompt:⛔ 指向真源 + 给只读边界(否则被判『重复执行』白跑) (14 项)
|
||
⛔ 拒收:`--state done` **必须**带 `--artifact <产物文档>`。
|
||
理由:任务会话完成时**要写文档**,台账里要有该文档的说明 ——
|
||
否则检查会话读到 `done` 却**不知道去哪核实**(用户 2026-10-03:「避免检查会话到处找信息」)。
|
||
正确写法:--artifact "目标-未命名目标-35279e/S13_xxx_20261003.md"
|
||
(🔴 **必须落在目标目录里** —— 合同见 `DOC_CONTRACT_ROWS`;
|
||
⛔ 不许写回 `交付物/`、`docs/`、工作区根 ⇒ 那正是「到处找信息」的由来)
|
||
降级写法:若本轮确实没产出文档,**别报 done**,报 `--state blocked --reason "文档未写"`。
|
||
⛔ 拒收:`--state blocked` **必须**带 `--reason <卡在哪、卡在谁>`。
|
||
理由:不写"卡了"不说卡在哪 ⇒ 台账里的受阻**没法据此派活**。
|
||
正确写法:--reason "等 <谁> 回答 <什么>"
|
||
⚠️ 提醒:`--artifact` **不在目标目录内**(应在 `目标-未命名目标-35279e/` 下;合同:执行产物一律落目标目录,⛔ 否则下一个会话又要到处找)
|
||
OK 已上报:T3 (新) -> done
|
||
⛔ 拒收:`--state done` 的 `--artifact` **文件读不到**。
|
||
判据:`artifact_state()`(唯一事实源)⇒ state=gone
|
||
原因:**文件不存在**(试过:C:\Users\Administrator\AppData\Local\Temp\dsh-selftest-tasks-j1eyqyy_\x\没有这个.md/C:\Users\Administrator\AppData\Local\Temp\dsh-selftest-tasks-j1eyqyy_\x\没有这个.md)
|
||
试过的路径:C:\Users\Administrator\AppData\Local\Temp\dsh-selftest-tasks-j1eyqyy_\x\没有这个.md
|
||
✅ 正确做法:**先把文档写出来**,再用**相对工作区**的路径报它,例如
|
||
--artifact "目标-未命名目标-35279e/S13_xxx_20261003.md"
|
||
⛔ 别报一个「打算写」或「写错目录」的路径 —— 下一个会话照它读会读空。
|
||
⚠️ 若确实写不了文档 ⇒ `--state blocked --reason "文档未写"`。
|
||
OK 已上报:T4 (新) -> blocked
|
||
✓ 台账纪律:`done` 必须带产物文档 + `blocked` 必须带原因(否则检查会话只能去翻) (6 项)
|
||
✓ 目标执行状态文档:字段在位 + 文件真存在 + 检查会话照它判(⛔ 不许再去翻) (10 项)
|
||
✓ 🔴 artifact 合同:产物要**真读得到** + 落点提示 + 机制侧预挑不可核实件 (10 项)
|
||
✓ 目标文件夹机制:按目标算目录 + 文档同源 + 派棒产物落点 + CLI 幂等 (10 项)
|
||
✓ 常驻程序在线判据:读**常驻心跳**(⛔ 不是退役旧戳)+ 四态文案 + pid 判据复用 (9 项)
|
||
✓ 闸④:排除**已过期的一次性**排期(⛔ 否则它永远卡住闸=自己锁死自己) (5 项)
|
||
✓ 看板 tab:**跨工作区**并列查看(⛔ 原本只认一个 INBOX,天生看不见别的目录) (12 项)
|
||
✓ 跨工作区 peer 格:⛔ **不得吃本工作区数据**(吃了=把本区执行情况挂到别人名下=说假话) (5 项)
|
||
✗ 跨工作区 tab:**有差异的字段必须逐个被视图取到**(⛔ 漏一个 ⇒ 静默沿用本区 ⇒ 几个 tab 看起来一样)
|
||
✗ 两块有差异的字段 12 个,**视图必须逐个取到**(⛔ 漏了会静默沿用本区):⛔ 漏了 ['ws_name']
|
||
✓ 每个 hook 都能真正跑起来(⛔ 不许一导入就崩) (9 项)
|
||
✓ 架构图:每条线的**两端都落在真实框上**(⛔ 不许线头悬空) (10 项)
|
||
✓ 目标完成 ⇒ 真的收工(⛔ 不许只改状态不关进程);阻碍 ⇒ 不关 (6 项)
|
||
✓ 跨区自愈:**只补进行中的区**(⛔ 已完成/阻碍/已收工的一律不拉) (9 项)
|
||
✓ 初始化脚本:**指向本区副本**(⛔ 不许再让用户跑技能目录那份) (5 项)
|
||
✓ 自指型判据:**必须被排除**(⛔ 否则 `goal_state()` 只能自己满足自己,永远锁死) (17 项)
|
||
✓ **单包自包含**(⛔ 只复制这一个技能到别的机器,排版/提报用户/去 AI 味都要能用) (9 项)
|
||
✓ 搬入的两块**不许被删掉/漂移**(⛔ 自决策口径 + 任务会话六阶段) (28 项)
|
||
✓ 包体卫生:**不许长回备份/缓存/零引用文件**,且**没有版本控制兜底**(⛔ 删了就是真删) (7 项)
|
||
✓ 告警文案:**必须说清后果**(⛔ 不许只说「缺了 A」) (3 项)
|
||
✗ 产物落点:**每个目标一个独立文件夹**(⛔ 代码与其他路径除外)|**报告型**
|
||
✓ 目标文件夹存在:目标-本机协作-c8154d(独立进程按 `goal.json` 算出,INBOX=E:\ProgramData\AIProject\ai1net-dsh-server\tmp\supervise-inbox)
|
||
✗ 产物型 md 都落在「目标-*/交付物」内(⛔ 代码/规则/归档除外);已在目标文件夹或交付物=130,散在别处=22 → ['接续入口_官方账号登录_20260927.md', '接续入口_手机接入_20260928.md', '接续包_IM与插件接入_20260924.md', '接续包_IM反向通道实现_20260926.md', '接续包_IM接入面收尾与插件对接答复_20260926.md']
|
||
ⓘ 报告型 ⇒ ⛔ 不计入 --verify 成败(存量问题,⛔ 与安装无关)
|
||
✓ 🔴🔴 `ensure_supervise` spawn 孙进程**必须传 `COLLABD_CONFIG`**(否则起后即退) (5 项)
|
||
✓ 🔴 钩子真接上了:工作区从 stdin.payload.cwd 取(⛔ 不是 DSH_WS_ROOT) (10 项)
|
||
✓ 🔴 T 表 §1.6:起不来先报错(10-04 用户原话「必须首先启动好在执行」) (6 项)
|
||
✓ 🔴 T 表:状态 → 我该做什么(2026-10-04 用户口述 · ⛔ 不许 AI 推断) (36 项)
|
||
✓ 📇 文档索引:改流程/改机制前**必读三篇**在第一屏 + 文档四条规则在位 (18 项)
|
||
✓ 🔴 红线:⛔ 说「会怎样」前必须取证那个后果(10-03 立 · ⛔ 10-04 又犯) (7 项)
|
||
✓ 🔴 常驻「活多久」的判据:**存活时长 = 发起会话的存活时长**(⛔ 禁编造「活不过当轮」当后果) (9 项)
|
||
① 已备份 ⇒ E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest\mirror_fixture\ws\交付物\session-mechanism-副本备份-20261005-120934
|
||
② 删残留 r_stale.py
|
||
③ 覆盖 1 |补入 1
|
||
⑤ 复核:应共享 4,逐字不一致 = 0 ✅
|
||
副本额外 = (无)✅
|
||
|
||
✅ 同步完成。⛔ 还没完 —— **必须**接着跑:
|
||
1. 副本 selftest(须 FAIL 0):python <副本>/scripts/selftest.py
|
||
2. env_check(看 deploy 段):python <副本>/scripts/hooks/_env.py <工作区>
|
||
✅ 无漂移,⛔ 什么也不做(幂等)
|
||
① 已备份 ⇒ E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest\mirror_fixture2\ws\交付物\session-mechanism-副本备份-20261005-120935
|
||
③ 覆盖 1 |补入 0
|
||
⑤ 复核:应共享 4,逐字不一致 = 0 ✅
|
||
副本额外 = (无)✅
|
||
|
||
✅ 同步完成。⛔ 还没完 —— **必须**接着跑:
|
||
1. 副本 selftest(须 FAIL 0):python <副本>/scripts/selftest.py
|
||
2. env_check(看 deploy 段):python <副本>/scripts/hooks/_env.py <工作区>
|
||
⛔ **白名单缺失**(副本历史里有过,现在没了):roots.env(⛔ `roots.env` 丢 ⇒ 副本会按位置推导去读写**别的仓库**)
|
||
① 已备份 ⇒ E:\ProgramData\AIProject\ai1net-dsh-server\tmp\selftest\mirror_fixture2\ws\交付物\session-mechanism-副本备份-20261005-120935_2
|
||
↺ 白名单兜底源=**历史备份** session-mechanism-副本备份-20261005-120935
|
||
③ 覆盖 0 |补入 0
|
||
④ 白名单兜底恢复 roots.env
|
||
⑤ 复核:应共享 4,逐字不一致 = 0 ✅
|
||
副本额外 = (无)✅
|
||
|
||
✅ 同步完成。⛔ 还没完 —— **必须**接着跑:
|
||
1. 副本 selftest(须 FAIL 0):python <副本>/scripts/selftest.py
|
||
2. env_check(看 deploy 段):python <副本>/scripts/hooks/_env.py <工作区>
|
||
✓ 副本同步:**残留/待补/待更新三类漂移都抓得到**,且白名单不被动(P0-51 的正解) (21 项)
|
||
✓ 副本同步:`roots.env` 白名单**只按文件名**判(⛔ 换副本不许靠「我记得跳过哪个」) (5 项)
|
||
✓ 🔴 各工作区自我建立常驻:**副本里也得找得到载体模板**(⛔ 写死包根=每区必红) (5 项)
|
||
✓ 🔴 看板渲染:**真跑 `renderProject()`**(⛔ 不是查字符串 —— 实发过 `acc is not defined`) (12 项)
|
||
✓ 🔴🔴 peer(跨工作区)格**也要认主会话**(⛔ 不许只看本看板的 `WS`) (5 项)
|
||
✓ 🔴 建目标时**顺手登记主会话**(用户原话:⛔ 不用每次会话都去声明) (8 项)
|
||
✓ 🔴🔴 keeper 生成 ps1 时 `--script` 必须填**本区发布物**(⛔ 不许照着当前这份抄) (5 项)
|
||
✓ 🔴🔴 常驻**自我繁殖**必须断:续命只许起**本区发布物**(用户「越创建越多」的真因) (6 项)
|
||
✓ 🔴🔴 一个工作区只能有一个常驻:**启动前必判 + 身份核验**(pid 会复用) (9 项)
|
||
------------------------------------------------------------------
|
||
合计:PASS 96 / FAIL 1(另有 1 条报告型,⛔ 不计入)
|
||
==================================================================
|