fix(ci): 命令归属漂移 —— 6 个脚本逐个定性后再更新计数 - #6
Conversation
CI 报 `top-level script entrypoints: expected 84, observed 90`。 ★ 没有只把 84 改成 90。实测证明那样能变绿:把计数单独改成 90 而不登记 任何归属,校验器照样 PASS —— **这条守卫只数文件个数,根本没有能力发现 「加了脚本不登记」**。所以先逐个定性,再更新计数。 先把浅克隆(只有 5 个提交)加深到 703 个,才查得出 84 是 2026-07-19 (3ad3130)记下的,以及那之后新增的正好 6 个脚本: build_recurring_prompt_analysis.py 有 __main__,CI 产出 -> write_ci_generated update_human_readable_recurring.py 有 __main__,CI 产出 -> write_ci_generated validate_human_readable_docs.py 有 __main__,只读 -> read_only validate_recurring_prompt_analysis.py 有 __main__,只读 -> read_only validate_skill_run_logs.py 有 __main__,只读 -> read_only recurring_prompt_core.py 无 __main__,是被上述脚本 import 的库模块 前 5 个进 canonical_commands(与 validate_agent_transport_compatibility 等 同类脚本的既有惯例一致);库模块按惯例不登记为命令(memory_atlas_paths / privacy_guard 等同款),仅计入总数。计数 84 -> 90,并在 inventory 里留痕 说明改了什么、为什么,以及这条守卫的已知局限。 ★ 修改用文本级插入,保持原文件「一条一行」的排版。先前用 json.dumps 回写会把整个文件重排成 432 行 diff,真实改动会被格式噪音淹没。 现在是 12 增 3 删。 实测(430 条全套,与干净 origin/main 逐条对比): 我修掉的:test_contract_and_repository_have_zero_command_drift 我引入的:无 其余 6 条(4 ERROR + 2 FAIL)在干净 main 上同样存在,均非本次引入。 破坏测试:计数改回 84 -> FAIL;能力名重复 -> FAIL;登记不存在的实现 文件 -> FAIL;只改计数不登记 -> PASS(即上文说的守卫局限,已写进契约)。 未处理:test_current_migrated_worktree_is_within_declared_bounds(仓库卫生)。 那条要 owner 拍板,材料另附,不自行选一个处置执行。
仓库卫生:复核后和任务描述里说的不是一回事原以为是「几个散落的大 zip,删掉或批准二选一」。实测是 103 条违规 / 101 个文件 / 17.86 MB,而且分成性质完全不同的两类。 分布
违规类型: 真正的根因:一次改名把批准清单整份作废了
目录被改过名:清单写的是 而审计只报违规,不检查批准清单本身是不是已经指向不存在的路径 —— 所以没人发现它失效了。 两类的性质完全不同
而且这条产品线在 95/600,每出一个人物就多一个 zip —— 逐个文件登记的方式本来就撑不住。 三种处置,后果各不相同(等你定,我不自选)A. 修批准清单,改成前缀而非逐文件
B. 只删 teleiosis 那 2 个备份
C. 什么都不动
我的判断:A + B。A 修的是被改名弄坏的既有决定,B 删的是活物的重复备份。但这是你的仓、你的资产,我不替你选。 ★ 另有一条独立建议:审计应该顺带检查批准清单里的路径是否还存在。这次就是靠人肉发现 6 条全死了 —— 一份自己烂掉却没人知道的豁免清单,比没有清单更危险。 |
没有只把 84 改成 90
先说这条,因为它是这个 PR 唯一重要的地方。
实测证明只改数字能变绿:把
top_level_script_entrypoints_current单独改成 90、不登记任何归属,校验器照样PASS。也就是说,这条守卫只数文件个数,根本没有能力发现「加了脚本不登记」。它是一条漂移绊线,不是归属登记表。这一点已写进契约的
inventory留痕字段,免得下一个人以为它管得住。先把浅克隆加深
本地只有 5 个提交(浅克隆),
git log会显示 90 个脚本"全是同一次提交加的",查不出真相。加深到 703 个提交后才看清:84是 2026-07-19(3ad3130b) 记下的OpenAIDatabase/scripts/正好新增 6 个文件逐个定性
__main__build_recurring_prompt_analysis.pywrite_ci_generatedupdate_human_readable_recurring.pywrite_ci_generatedvalidate_human_readable_docs.pyread_onlyvalidate_recurring_prompt_analysis.pyread_onlyvalidate_skill_run_logs.pyread_onlyrecurring_prompt_core.py前 5 个进
canonical_commands,与既有惯例一致(validate_agent_transport_compatibility.py→agent-transport-compatibility就是同款)。库模块不登记也是既有惯例(memory_atlas_paths.py、privacy_guard.py同款)。计数 84 → 90 放在最后做。
排版:12 增 3 删,不是 432 行
第一版我用
json.dumps(indent=2)回写,把整个文件从 264 行重排成 547 行 —— 原文件的canonical_commands是一条压一行的。432 行的格式噪音会把真实改动彻底淹没。改成文本级插入,保持原排版。现在 diff 是 12 增 3 删。
验证:与干净 main 逐条对比
跑满 430 条,和
origin/main的干净检出做失败集差集:其余 6 条(4 ERROR + 2 FAIL,分布在
memory_atlas_acceptance_audit/memory_atlas_goal_completion/repository_hygiene_audit)在干净 main 上同样存在,均非本次引入。未处理:仓库卫生那条
test_current_migrated_worktree_is_within_declared_bounds仍然红。那条的处置(删备份 / 加进批准清单)要 owner 拍板,我不自行选一个执行。但复核后发现它和任务描述里说的不是一回事 —— 详见随后的评论。