Files
dsh_ai1net_server/执行会话/目标-本机协作-c8154d/selftest-V5-过程读数-修前-20261005.out
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

173 lines
17 KiB
Plaintext
Raw Permalink 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.
==================================================================
协作机制 · 回归自测(每改一次必跑) 测试工作区: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-fkzbiiaf\x\没有这个.md/C:\Users\Administrator\AppData\Local\Temp\dsh-selftest-tasks-fkzbiiaf\x\没有这个.md)
试过的路径:C:\Users\Administrator\AppData\Local\Temp\dsh-selftest-tasks-fkzbiiaf\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 看起来一样)
✗ 两块有差异的字段 14 个,**视图必须逐个取到**(⛔ 漏了会静默沿用本区):⛔ 漏了 ['tab_hot', 'tab_i', '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-120639
② 删残留 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-120639
③ 覆盖 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-120639_2
↺ 白名单兜底源=**历史备份** session-mechanism-副本备份-20261005-120639
③ 覆盖 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 条报告型,⛔ 不计入)
==================================================================