AGENTS.md · git:20260924.ff6b9ee · 2026-09-24 · sha256 d3c5f43a854bb70e

AGENTS.md git:20260924.ff6b9eeA

Immutable. This exact content never changes and is served at /api/v1/blob/d3c5f43a854bb70e.

# AGENTS.md — 装配式装修技能开发

> 本文件是跨对话协作的入口锚点(核心 C1)。**它不定义规则,只告诉你规则在哪**:
> 变更定级与审批的唯一事实源是 `_专题_技能合集策划/change-governance.md`,本文件与其冲突时以该文件为准。

## 项目定位

装配式装修技能合集的**开发与治理主仓**(L1 开发源)。技能本体发布到 Qoder 运行时,本仓持有策划稿、治理文件、备份镜像与全过程记录。

- 远端:`https://github.com/eiway112/prefab-interior-skills.git`(`origin/master`)
- 2026-08-30 自 `D:\QoderWork-Files\_项目工作\` 迁入本工作区顶层,`.git` 随迁、历史完整(94 提交)

## 目录结构

```
装配式装修技能开发/
├── AGENTS.md                ← 本文件(C1)
├── .gitignore               ← C5
├── README.md / CHANGELOG.md / LICENSE
├── _专题_技能合集策划/       ← 治理文件 L1 开发源(8 份 shared 治理文件在此,含 `data-classification.md`)
├── _专题_隔墙技能策划/ _专题_墙面技能策划/
├── _专题_吊顶技能策划/ _专题_楼地面技能策划/ _专题_ACE开发/
│                            ← 各子技能策划稿、QA 基线与红线草案
├── 技能仓备份/              ← 运行时技能的仓内镜像(sync_skill_backup.py 产物,勿手改)
├── 程序文件/                ← C2:校验器 `validate_governance.py` + 各检查的门禁测试 + 同步器(见下表)
├── 成果/ 文档/ 记录/        ← C3:交付物 / 方案文档 / 执行记录(件数随批浮动,不钉数字)
└── 素材/                    ← 空占位
```

## 三层结构(必须理解后再动手)

| 层 | 位置 | 性质 |
|---|---|---|
| L1 开发源 | 本仓 `_专题_技能合集策划/` | 可编辑 |
| L2 运行时 SOT | `~/.qoder/skills/` | 技能实际被加载处,唯一事实源 |
| L3 只读镜像 | `~/.qoder/skills/shared/` | 治理文件镜像 |

同步流程与验收步骤见运行时技能 `prefab-governance-sync`;**定级(S/A/B/C)与审批看 `change-governance.md`,不看该技能**。

## 改任何共享治理文件前

1. 读 `change-governance.md` §一定义表 + §二流程,**先查先例再定级**(环境路径/BOM/换行类修正属 C 级,可由发起人直接执行并登记)
2. 改完必须:`技能仓备份/` 同步 → 三份 `change-governance.md` 镜像哈希一致 → 登记 CG 编号
3. 历史 CG 行与 `记录/`、`CHANGELOG.md` 中的旧路径**不改写**(属当时事实快照)

## 验收门禁(改完必须实跑,不接受"应该没问题")

| 命令 | 当前基线 |
|---|---|
| `python -B 程序文件/validate_governance.py` | **【活基线:CG-20260919-001 起 225、CG-20260920-004 起 234、CG-20260920-005 起 236、CG-20260921-005 起 237、CG-20260923-001 起 241(系该批**提交前**发布时刻读数;commit 后随单源件两副本进入检查 6 (C) 实际比对浮至 243,差额属提交动作机械后果,见该批执行记录 §九),当前本体版本 v1.15.0】**总评 PASS,通过 **241** / 失败 0 / 警告 3,exit 0。警告 3 的构成=检查 3 的「38 条无有效核验日期」聚合 1 条+检查 10 的 `A_VERIFY_DATE` 2 条(`acoustic-calculation-engine/reference.md:708`/`:709` 两行 A 类登记缺核验日期,沿检查 3 语义不视作标准失效、不填推定日期,取真须走 T-5 官方核验另线)。**硬判据是「失败 0 + exit 0」**;通过/警告计数随本体内容浮动,不得按固定数字判回归。**236→237 系 v1.14.0 在检查 7 内新增一条「§九 双口径取数一致」断言(CG-20260921-005,B 级,承接 PL-036)产出 1 条 [OK]**(本批 clean 态实测两口径各 116 个 CG 编号且相等即绿;键闭合走逐行口径(`collect_cg_log_ids` 取首列)、任何表级消费方走 `iter_md_tables`,两口径一旦不等即说明 §九 表块内起了断块件(表块内空行或跨物理行断行)且**表级侧静默漏行**,故本断言 FAIL 计 `fail_count`;口径=判两口径集合相等,不判「§九 内不得有空行」这一绝对规范(表块外空行与台账前后空行不报红);全额归因本条,非检测口径放松)**234→236 系 v1.13.0 新增检查 9「技能件跨层内容一致性」(CG-20260920-005,B 级,承接母项 PL-010)产出 2 条 [OK]**(本批 clean 态实测该小节 [OK] 行恰为 2=D 比对集自洽+运行时↔镜像 纳入判据字节全等,全额归因,非口径放松;覆盖面=`SKILL_DIRS` 15 技能目录内容件,纳入判据现测 62 件=运行时∪镜像 120 件中经 `git check-ignore` 排除 gitignored 58 件后余量,三态读数漂移 0/单层缺失 0;排除面取 gitignore 结构判据、零文件白名单,哈希 `sha256(原始字节)` 不做 eol 归一、沿检查 6 口径;本检查只判 `SKILL_DIRS` 内技能件运行时↔镜像字节全等,声明表治理文件(设立时 7 件)的跨层一致仍由检查 6 承担。**225→234 系 v1.12.0 新增检查 8「技能侧索引序号引用一致性」(CG-20260920-004,B 级,承接 PL-029)产出 9 条 [OK]**(本批 clean 态实测该小节 [OK] 行恰为 9=真值表四前置 A1—A4+索引派生表键一致 B0+取数面自洽 D1+三载体各一条 ①②③,全额归因,非口径放松;判定单元现测 97=① 含表行内 ①′ 38/② 35/③ 24,三载体各自真漂 0,NO-ANCHOR 10 值/4 位置,EXEMPT E3 4+E2 11+E6 1;豁免全取结构判据、零白名单、零通用编号正则、不判序号单调性)。(v1.10.0→v1.11.0 系 CG-20260919-005 把 `md_cells` 切格改为转义感知,对通过数 **no-op**——225 仍归属其设立者 CG-20260919-001,本批不增检查项故不改通过数。194→196 系 CG-20260918-001 将 SRE 静态体检块的 T-A1 名称差分 13 处清零(转「SRE 硬编码名称与索引主表名称零冲突」OK)与 T-A5Ⅱ 升档标注归入同块 [OK],两条原 WARN 信号转 PASS,不是检测口径放松。**196→210 系 v1.9.0 新增检查 7「遗留存活性台账」(CG-20260918-005,B 级)产出 14 条 [OK]**(实测该节 OK 行恰为 14,全额归因,非口径放松)。**210→225 系 v1.10.0 检查 6 增列第三条断言 (C)「git 可见副本 ↔ `HEAD` 前像行尾形态一致」(CG-20260919-001,B 级,承接 PL-020)产出 15 条 [OK]**(本批 clean 态实测 (C) 比对 15 项=声明表 7 件治理文件在 L1+`技能仓备份/` 两层的 git 可见副本数,全额归因,非口径放松)。检查 7 读 §十一 的 `PL-nnn` 台账表:**结构性违法=FAIL 档并计 `fail_count`**(台账表或必需 7 列缺失、行列数与表头不符、编号非法或重复、状态出三值枚举、日期不可解析、待处置行缺到期日、登记日期晚于到期日、已闭合/已裁定不做行缺处置依据、来源登记为空、来源与处置列引用的 CG 编号不在 §九 内=键闭合)——同机字面比对、无外部真值依赖,故与检查 6 同理首轮即 FAIL 档;**单纯到期=聚合一条 WARN+逐条 INFO,不计 `fail_count`**(沿检查 3/CG-20260917-009「不因单纯到期增加失败」口径),另有 30 天内到期预警 INFO 与待处置行 TTL 超 180 天上限 WARN。**键闭合真值源=「§九 逐行取第一列 CG 编号」,不用表级解析**:CG-20260918-005 设立检查 7 时 §九 有一历史行跨物理行断行,`iter_md_tables` 在断点处把其后各行判为「无表头块」整块丢弃(登记时点实测表级读法只见 **72** 个、止于 `CG-20260916-008`,逐行读法 **88** 个),故任何以表级解析消费 §九 的检查都会**静默漏行**;该断行登记为 **PL-016** 并自设前置「修历史行字节须另批裁定」。**该前置由 CG-20260919-002 承接**(同批另订正 PL-019 的根因与定性),订正后实测表级可见 **95** 个、与逐行读法 **95** 归一——两口径自该批起一致;逐行取数口径与合成文本守卫 `test_wrapped_history_row_does_not_hide_later_ids`(不依赖真实文件仍断行)作为**免疫性设计**保留。常量 `LEDGER_TTL_DEFAULT=90`/`LEDGER_TTL_EVENT=180`/`LEDGER_SOON_DAYS=30` 与 §11.1 散文字面由测试**双向守卫**同值(散文改了常量没改即复红)。**反向覆盖未机算**:只做「台账 → §九」方向键闭合,不反查 CG 行散文声明的遗留(散文字面无稳定形态,正则会产假信号),故「新遗留漏登记进台账」仍靠人工,§11.3 第 3 条已显式披露。警告一处:仅剩检查 3 的 38 条无有效核验日期聚合 WARN(CG-20260918-009 向 §二 官方核验记录表补登序号 68 后由 41→40,CG-20260918-010 向 §二 推荐性标准抽查核验记录表补登序号 15/18 两行后再降为 38,档内分布=强制性国标 3/其余 35);不计 `fail_count`,不因单纯到期增加 WARN。**T-A1 名称差分已清零(CG-20260918-001),并自 v1.8.0 起升 FAIL 档(CG-20260918-002,§6.3.3 ③(b) 代码级半步收口)**:差分非空即 FAIL 计 `fail_count`,clean 态读数不变;反向注入自证(`--runtime-dir` 临时副本注入 1 名称值)实测 T-A1 FAIL+exit 1、检查 6 注入态保持 [OK];其余信号 T-A2—T-A5 仍首轮 WARN,升档时点各自依其前置。**检查 3 当前口径以索引 §1.1A 为准**:按表头分类、列名读取核验日期与状态;日期到期按 92/183 天严格大于现算,显式「到期需复核」任务也须披露,二者报 INFO;无记录/无效或未来日期仍报依据链未确认 WARN,**缺日期不等于已超期或标准失效**。并列编号只按全角 `/` 切分,半角 `/` 属编号本体。运行时 `sre_reasoner.py` v1.7 的 `_verification_confirmed()` 将可复用的既有依据与维护提醒分离:已确认者仅因到期不降级,提醒写入 applicability;未确认者仍 inferred+§1.1A degradation,补真实依据或接受降级为等价出口。已废止另有 inferred+TA-3 提示,GB 50118 既有部分替代警告保持;自动替代/暂停能力边界见 rules §4.3。**IC-10 item 字段、枚举与适用集成员不变**,deterministic 不代表本轮重新核实最新状态或工程合规放行。v1.6.0 新增**检查 6「治理文件跨层一致性」**,**首轮即 FAIL 档且计入 `fail_count`**(与检查 5 不同:同机字面哈希比对,无外部真值依赖)——三条断言各自指向修复命令:**(A) L1→下游副本全等** 报红 → 由 `prefab-governance-sync` 按 L1→下游带平(抓 -004⑧(b)/-005(a)/-006 那类跨批落后);**(B) 运行时↔`技能仓备份/` 同层全等** 报红 → 重跑 `程序文件/sync_skill_backup.py`(抓 sync 漏跑/半跑);**(C) git 可见副本 ↔ `git cat-file HEAD:<path>` 前像的行尾形态一致** 报红 → 该副本工作区行尾五类形态(无行尾分隔符/纯 LF/纯 CRLF/仅 CR 无 LF/混合行尾)相对 HEAD 前像漂了,指向登记面写入脚本的换行翻译(Windows 文本模式 `Path.write_text` 把 `\n` 译作 `\r\n`)。其真值源=HEAD 对象,在三层互等闭环之外,故抓得到「三层被同一脚本同时写坏、互等仍成立」这一 (A)(B) 结构性盲区(CG-20260918-010 ⑩ 的 `git diff --stat` 831/831 伪差异即该失效模式)。口径四条:比对集是**逐文件声明**的常量表(设立时 7 件,CG-20260923-001 起 8 件;不 glob,故 `*_pre*` 回退件与 `.bak` 不入),基准**不读** `同步说明.md` 的哈希清单(那是被测工具自产,属自指),哈希取 `sha256(原始字节)` 不做 eol 归一(跨机 `core.autocrlf=true` 克隆会把 `技能仓备份/` 层转 CRLF 而**产假红**,本机 autocrlf=false),运行时层不可达时按检查 5 同口径**降级 WARN 且逐项列出被跳过的 (文件@层)**,而 L1/仓内属固定面缺失仍判 FAIL。(C) 三条口径:只比**形态**不比字节数与内容(故真实内容编辑不报红,而行尾形态订正会如实报红、须与所属批的改判同批入库);HEAD 无该路径对象(新增未提交件,git 的 `does not exist in 'HEAD'` 与 `exists on disk, but not in 'HEAD'` 两式)→ INFO 不判红;git 不可达或仓无提交 → 聚合一条 WARN 且逐项列出被跳过副本,不静默放过。其不覆盖面(运行时两层无 git 面故只经 (A)(B) 字节全等传递、真值源是 HEAD 而非规范值故提交后转绿、只比形态钉不住「行尾应为 LF」这类绝对规范)由 `change-governance.md` §11.3 第 6 条**显式披露而非机算**。`platform-adapter-reference.md` 无 L1 归属,不入 (A) 链、只比同层。覆盖面**只含声明表内的治理文件**(设立时 7 件,CG-20260923-001 起 8 件),技能目录内约 114 件(SKILL.md/reference.md/examples.md/scripts)与机器本地 `sre_regression_report.json` 不经本检查(F-02 遗留)。**自 v1.12.0 起须区分两件事**:其中「技能侧对索引序号/编号的引用一致性」这一子面改由**检查 8** 承担(覆盖面=15 技能目录活 `.md` 现测 47 件,CG-20260920-004 承接 PL-029);但**检查 6 的覆盖面并未因此扩大**——它仍只比声明表治理文件(现 8 件),其余约 114 件与机器本地产物(`sre_regression_report.json`)经不漏检地**不经**检查 6,故检查 8 单凭自身不闭合 PL-010(见 `change-governance.md` §11.3 第 7 条)。**自 v1.13.0 起「各件跨层内容一致」这一剩余面改由新增检查 9「技能件跨层内容一致性」(运行时 ↔ `技能仓备份/` 镜像字节全等,CG-20260920-005)承担**:覆盖面=`SKILL_DIRS` 15 技能目录内容件、纳入判据现测 62 件,机器本地产物经 `git check-ignore` 结构判据显式排除(不建文件白名单),故 **PL-010 由 CG-20260920-005 转已闭合**(其不覆盖面=运行时两层无独立 git 面、只经字节全等传递,见 §11.3 第 8 条)。声明集与 `sync_skill_backup.py` 的 `ROOT_FILES`+`SHARED_FILES` 做 AST 现读**双向互查**:声明而不属脚本 → FAIL「声明表越界」;属脚本而未声明 → FAIL「漏配」 |
| `python -B 程序文件/verification_policy_test.py` | Ran 6 tests,OK;检查 3 专项:两档严格边界、到期 INFO 且 WARN/PASS 集稳定、显式复查任务、缺记录/异常日期 WARN、实际状态漂移 FAIL。改核验维护规则时与四项既有门禁一并运行。CG-20260918-010 起「到期 INFO+全局 WARN 集稳定」那组的钟点由 `latest_verify_date()` **从索引核验记录表现读**(取最新核验日期),不再是硬编码日——硬编码钟点会把该组的跨时点全局集比对隐式耦合到索引最新日期,向核验表补录较新日期即复红(属测试件缺陷,非数据错误)。 |
| `python -B 程序文件/ace_regression_test.py` | **Ran 135 tests,OK**,exit 0。90→105 系 CG-20260923-003 新增 `TestFloorF01Boundary`(FL-F01 收窄守卫,15 项;该批执行记录实读 105,本行旧读数 90 属登记滞后);105→116 系 CG-20260924-004 新增 `TestFloorF02F03Boundary`(11 项:FL-F02/F03 参数表待定态字面、汇总表「ΔLw 估算」「L'nT,w 达标可行性」禁列名回流、撤回短语计数、选型行口径;clean 态 OK、改前原像重注入 failures=6/exit 1 自证非恒真,见 `记录/2026-09-24_CG-20260924-004_组4FL构造与预测整改执行记录.md` §三);**116→126 系 CG-20260924-005 新增 `TestM2CoincidenceDocConsistency`**(10 项:ACE+PW 两件吻合频率文档一致性——fc 范围表 10 行 ±1Hz 包络复算、搭配表 4 行标称∈域∈包络且判定-Δfc 自洽、绝对结论收窄非单调三点、修正因子说明「3-8%」须消失且 70%/29.8%/2961→883/2.6% 须在场、Δfc 非单调;5 常态+4 负向注入+1 控制例,clean 态 OK、`ACE_SKILL_DIR`+`PW_SKILL_DIR` 指向改前原像复注入 failures=6/exit 1 自证非恒真,见 `记录/2026-09-24_CG-20260924-005_组5M2吻合频率整改执行记录.md` §三);**126→135 系 CG-20260924-007 新增 `TestM6GapBoundary`**(9 项:M6 缝隙整改守卫——ACE 末档边界行「> 1.5%/> 12 dB」在场、PW 封顶式「−10·lg(S_缝)」随面积比变化非定值 20 dB 在场、PW 分层表四档复算链 0.4/3.0/10.4/12.0 dB 吻合、两件单值代入口径声明在场;负向注入=ACE 旧边界回流、PW 旧「定值 20 dB」封顶回流、PW 档值漂移、口径声明撤除各复红;1 良性控制例证无关编辑不误伤;clean 态 OK、`ACE_SKILL_DIR`+`PW_SKILL_DIR` 指向改前原像复注入 failures=6/exit 1 自证非恒真,见 `记录/2026-09-24_CG-20260924-007_组7M6缝隙整改执行记录.md` §三)。ACE 原有用例与参考函数逐字不变。 |
| `python -B ~/.qoder/skills/prefab-standards-reviewer/sre_regression_test.py` | **【活基线,更新至 CG-20260917-009】Ran 66 tests,`OK`**(既无 expected failures 亦无 unexpected successes),exit 0,缺口信号 0 条、跨轮指纹 `4f53cda18c2baa0c`(连击计数属机器本地状态,不钉数字);IC-10 v1.9.0(零新字段、零新枚举)、reasoner v1.7、rules v1.2.6、测试模块 v1.9。59→66 为维护/依据解耦守卫:GB 55037 第 92/93 天保持完整 item 和确定性、响应内提醒、显式复查任务、缺记录/未确认/异常日期保护,以及未知/已废止/GB 50118 部分替代的独立保护;原分档边界、矩阵成员、契约及防空跑断言继续执行。已确认的确定性对称面排除未知和已废止,废止由专用断言验证。独立验收与故障注入见 CHANGELOG v1.12.15。下方为 CG-20260916-009 历史快照,其版本与计数不作当前基线。 ‖历史快照(-009 时代,不改写)‖ Ran 37 tests,`OK`(**既无 expected failures 亦无 unexpected successes**),exit 0,缺口信号 0 条、跨轮指纹 `4f53cda18c2baa0c`。全文 `^\s*@unittest\.expectedFailure` 现 **0 处**——行为组 T-B1—T-B7 七项已全部转为正向常态断言(T-B1/T-B7 随 CG-20260916-003、T-B2 全条与 T-B4 含 `conversion` 半条随 **CG-20260916-004**、T-B3/T-B5/T-B6 随 **CG-20260916-005** 摘档)。用例数 30→32 系 -005 按 §6.2「摘档须升级为有约束力断言」新增两条收紧用例:`test_TB5_empty_family_negative_path`(合成注入无映射域,因矩阵正例在数据面修净后会恒真空跑)与 `test_TB6_national_and_local_coexist`(逐地点正向期望集,期望值从 `DOMAINS` 现读)。**32→37 随 -009(A 级)**:`test_standard_item_schema` 的 `角色` 断言从「只跑 `reason("住宅","分户墙")` 一组」扩为全 34 组激活对 × 7 地点矩阵遍历(带 `visited`/`checked` 漏组与空跑判据),合法值域从 `~/.qoder/skills/shared/interface-contracts.md` 的 IC-10 `角色` 枚举**现读**;另新增 5 例(图集号命中、索引 §二 编号不降级含 `ZZ 9999-1999` 负向半条、GB 18580-2025 落 `mandatory_check`、08J931 落 `construction_guide`、M4 兜底合成注入),并按「修净后的守卫须仍能失败」做反向注入自证(逐项回退复红 1/2/2、三项合并 6)。测试侧共享 helper `_table()` 已修:数据行必须在首个非表格行截断,否则同小节第二张表(索引 §二 的「官方核验记录」)会被并入首表、其表头单元被当成编号(-009 F-02)。**运行时 `sre_reasoner.py` 版本头自本批起为 v1.3**(-005 遗留 (c) 闭合)。T-B2/T-B4 的前置仍是 IC-10 `时间状态` 枚举由四值扩为与 IC-07 同源的六值(契约 **v1.8.0**)并新增可选 `状态注记`,二者判据现从 `~/.qoder/skills/shared/interface-contracts.md` **现读枚举**,故该契约文件不得落后于运行时消费端。实跑产物 `sre_regression_report.json`(已被 `.gitignore` 收录,机器本地)。历史:7 例挂档见 CG-20260916-002、5 例见 -003、3 例见 -004 |
| `python -B ~/.qoder/skills/prefab-standards-reviewer/sr_ic07_compliance_test.py` | Ran 20 tests,OK。**计数硬编码**(`SR_REDLINE_COUNT`、`REGISTRY_TOTAL_COUNT`),红线注册类变更须回扫 |
| `python -B 程序文件/pending_ledger_test.py` | **【第六门禁,CG-20260918-005 新增】Ran 43 tests,OK**,exit 0。检查 7 专项:负向注入以**合成文本直调** `check_pending_ledger`,不落盘、不改任何治理件;覆盖 19 类结构违法**逐类**注入自证(缺节/缺表/缺表头/缺列、编号形制与非 `PL` 前缀、编号重复、状态出枚举、登记日期与到期日不可解析、非法历法日 `2026-02-30`、待处置缺到期日、登记晚于到期、已闭合/已裁定不做缺依据、来源登记为空、来源与依据列悬空 CG 编号、行列数与表头不符、§九 无真值源)、TTL 边界(到期日=今天不超期/前一日超期/30 天预警窗口内外各一例)、**到期只 WARN 不计 `fail_count`**、已闭合行过期不计、真实治理件 clean 态断言(`test_real_repo_ledger_is_clean`)、常量↔§11.1 散文字面同值双守卫、PL-016 断行免疫守卫、§九 外 CG 编号不入真值源。**36→39 系 CG-20260919-005(B 级,闭合 PL-021)新增类 `TestEscapeAwareParsing` 三例**:`md_cells` 转义感知的正向断言(含转义竖线的单元解析为 7 列且值内含字面竖线)、台账写转义竖线形不报「行列数」、以及同单元改写未转义裸竖线仍报「行列数」不符 FAIL(证守卫非恒真)。**39→43 系 CG-20260921-005(B 级,闭合 PL-036)新增类 `TestDualCaliberConsistency` 四例**:§九 表块内空行注入复红、跨物理行断行注入复红、clean 态双口径 [OK]、**表块外空行控制例复绿**(证守卫判的是「两口径相等」而非「不得有空行」,非恒真);同批把 PL-016 断行免疫守卫按新判据改写为「键闭合取数仍见全量+断块本身复红」两半。改 TTL 口径、状态枚举、键闭合规则、双口径一致断言或 `md_cells` 切格算法时须与其余六道门禁一并运行。 |
| `python -B 程序文件/cross_layer_eol_test.py` | **【第七门禁,CG-20260919-001 新增】Ran 25 tests,OK**,exit 0。检查 6 (C) 专项:①行尾形态判据本身——五类各一例+「单行 CRLF 注入」+「整文件 LF→CRLF」+**真实内容编辑不得改形态**+「无行尾分隔符与空文件同类」+枚举闭守卫;②`git_head_blob` 三态(ok/no_head 认 git 两式字面/git_unavailable 含零提交仓)与真实 HEAD 对象读取;③临时 git 仓端到端——核心例 `test_same_drift_across_layers_still_fails` 复现 CG-20260918-010 ⑩ 事故本体(各副本字节全等故 (A)(B) 结构上必绿、集体偏离 HEAD 时 (C) 仍逐项报红),另含部分漂移只报漂移件、无 HEAD 件只披露不判红、git 不可达走 WARN 分支;④真实仓 clean 态断言(零 FAIL 零 WARN,且**判定项数不钉固定值**=改按状态判据「被判定数 == 声明副本数 − 按『新增未提交』逐处披露数」,另加「判定数 > 0」下限防空跑。形制数仍钉值并随覆盖面变动:`test_shape_matches_declaration` 设立时 15,CG-20260923-001 把 `data-classification.md` 纳入声明表后为 17)+防空跑断言(取真实 `change-governance.md` 的 HEAD 前像做 `\n`→`\r\n` 整文件翻转后必红)。临时仓建在与本仓同级的 `_tmp-scripts\` 临时面(不落 C 盘、不进运行时技能目录,免被 sync 当新增件带进镜像),跑后自清。改行尾判据、五类形态口径或 git 取物三态分类时与其余六道门禁一并运行。 |
| `python -B 程序文件/index_ref_consistency_test.py` | **【第八门禁,CG-20260920-004 新增】Ran 26 tests,OK**,exit 0。检查 8「技能侧索引序号引用一致性」专项:负向注入以**内存内直调** `check_index_ref_consistency`(合成 `FakeFile` 与 `truth_override`/`sync_text_override`),不落盘、不改任何治理件;含真实仓 clean 态基线断言(47 件活 `.md`/判定单元 97=① 含 ①′ 38/② 35/③ 24/三载体各自真漂 0/NO-ANCHOR 10 值 4 位置/EXEMPT e3 4·e2 11·e6 1,9 条 [OK])+**三载体各注入 1 错号复红**(散文/表列/内联)+**真值表四前置各破坏 1 项复红**(A1 主表空/A2 重号/A3 空号不连续/A4 非哨兵非单射)+派生表 B0 不符复红+取数面 D1 两侧不等报「漏配/越界」;**控制例 C1—C6 全通过**证豁免规则不恒真(C1 `(?<!原)` 只免注记形态、C2 E3 由窗口字面非行号驱动、C3 E1 只免词典零命中、C4 成员判据不因锚集扩大恒真、C5 D1 须能失败、C6 F8 多值展开有牙且 E6 刹车不误伤)。改检查 8 判据、载体提取规则、豁免结构判据或声明串展开规则时与其余七道门禁一并运行。 |
| `python -B 程序文件/skill_cross_layer_test.py` | **【第九门禁,CG-20260920-005 新增】Ran 21 tests,OK**,exit 0。检查 9「技能件跨层内容一致性」专项:负向注入以临时目录两镜像层+内存内 `ignored_override` 直调 `check_skill_cross_layer`(不对临时面建 git 仓、不落治理件、不改运行时技能件);含真实仓 clean 态断言([OK] 恰 2 条=D 自洽+字节全等/纳入判据 62 件/漂移 0/单层缺失 0)+字节漂移复红+单层缺失双向(镜像独有→运行时缺/运行时独有→sync 漏跑)复红+双向互查(漏配/越界,`shared/` 显式豁免不判越界)+降级四分型(运行时不可达 WARN/镜像目录缺失 FAIL/`SKILL_DIRS` 读空 WARN/git 不可达与非工作树各 WARN 不判红)+空跑守卫(内容全被忽略→纳入判据 0 件复红,且此时不产出字节全等 [OK]);**控制例 C1—C5 全通过**证排除面(C1 把某件移出忽略集即复红)、双向互查(C2 shared 不误判越界)、降级分支与空跑守卫非恒真。临时层落与本仓同级的 `_tmp-scripts\` 临时面(不落 C 盘、不进运行时技能目录,免被 sync 当新增件带进镜像)。改检查 9 判据、排除面口径或双向互查规则时与其余八道门禁一并运行。 |
| `python -B 程序文件/data_class_consistency_test.py` | **【第十门禁,CG-20260923-001 新增】Ran 70 tests,OK**,exit 0。检查 10「数据分类与来源一致性」专项,四组:`DataClassTest`(B/C 类来源列命中 S1 档标签或标准编号族 → `BC_SOURCE_LABEL` FAIL;检测方法列的标准号不误伤;A 类缺核验日期 → `A_VERIFY_DATE` **WARN 不 FAIL**,与检查 3 同口径;日期不可解析/未来日/数字型各报 WARN)、`FrozenBaselineTest`(迁移存量按单元内容哈希冻结,命中 baseline 即豁免、该单元字节一变即 `STALE_BASELINE` 复红,禁「批量默认 N 骗绿」)、`UnitIdGranularityTest`(判定单元 id=`sha256(json([路径,块类型,上下文,本单元引用到的链接定义,单元正文]))`+同件同指纹出现序,改粒度即复红)、`SelfProducedScopeTest`(扫描面自产件豁免由 `sync_skill_backup.py` 的 AST 现读推出,非文件名白名单;脚本改名或停止写盘即失效,自产名与治理声明重叠须报冲突而非静默豁免)。**登记记录载体=L1 `_专题_技能合集策划/数据分类复核清单.json`**(`records` 已判定单元/`baseline` 待迁移存量,段区间须从 0 连续无重叠覆盖单元全文,否则 `SEGMENT_COVERAGE` FAIL)。**本门禁与 `validate_governance.py` 的 `--data-*` 参数读同一清单**:编辑 `change-governance.md`/`data-classification.md` 等在册件会使单元 id 变化,故**同批**须跑 `_tmp-scripts` 侧残量登记脚本补登新单元,否则复红属预期而非缺陷。改检查 10 判据、类别枚举、baseline 语义或自产件豁免推出方式时与其余九道一并运行。 |
| `python -B 程序文件/storage_anchor_guard_test.py` | **【第十一门禁,CG-20260923-005 新增】Ran 19 tests,OK**,exit 0。收纳锚固承载面收窄专项守卫(PL-061):R1—R5 五规则守卫运行时 `prefab-storage-system/` reference.md(§1.2 壁挂式柜体表+§3.1 接口表)、SKILL.md(§2.2 承载力行+Step 2)、examples.md(示例 2 固定件行)——① 撤出的 6 项无条件承载数值(单点≥50kg/≥30kg/≤20kg 每点/安全系数≥2.0/≥1.5 倍额定荷载/锚栓直径档)**不得复现**;② `FORBIDDEN_COLUMNS=('承载力参考',)` 列名不得回流(现名=承载确定方式);③ 11 条正向锚点(结构验算收窄出口、七参数锚固核查入口、承载结论纪律、JGJ 145-2013 未收录于合集标准索引仅作方向性指引)须在场;④ 控制例证守卫非恒真;⑤ 真实件端到端注入自证(旧表注入失败、修后与控制例通过)。改收纳锚固面判据、禁止列名或正向锚点集时与其余十道门禁一并运行。 |
| `python -B 程序文件/wetzone_construction_guard_test.py` | **【第十二门禁,CG-20260924-001 新增】Ran 15 tests,OK**,exit 0。厨卫湿区构造层序与工序专项守卫(PL-062):R1—R4 四规则守卫运行时 `prefab-bathroom-kitchen-system/` reference.md(§2.2 干法层序图+§3.2 地漏节点行+§5.2 工序)、SKILL.md(验证执行清单 □4/□9)、examples.md(示例 1 适用性注)——① **R1** 地面层序块五层锚(饰面板/保护层/防水层/找坡层/结构楼板)须按物理序出现,锚取**结构匹配**(行首 `[层名`)而非子串首命中(找坡行的条件从句含「结构楼板」字面,子串法会假绿);② **R2** 工序覆盖序 `embed<wp<bt<prot<fin<grate`(预埋本体/法兰→防水层→闭水→保护层→饰面→末端篦子);③ **R3** 闭水试验须晚于地漏预埋(防回归到「闭水早于地漏」的宣称验收未形成接口态);④ **R4** 预埋本体与末端附件分列+节点行须含「先于防水层」与「饰面完成后」;⑤ 正向锚 P1—P6(体系边界三字面/覆盖口径「不得宣称已验」/SMC 适用性注/闭水时点字面/§5.2 标题字面/**数值本体字面**——坡度≥1%、淋浴区≥1.5%、蓄水≥20mm、≥24h 任一撤除即 P-MISS 复红);⑥ 控制例 5 组证守卫非恒真(SMC 与 §5.3 块不入 R2/R3 判据、墙面无序块不误伤、清空任一目标件必报红);⑦ 端到端自证:`--runtime-dir <改前原像目录>` 实跑 **exit 1/failures=2**(`test_real_runtime_files_pass`+`test_copy_is_clean`),改后 clean 态 exit 0。层序块取**全部**围栏块(`_fenced_all`)而非首块,故追加式注入不漏判。改湿区层序/工序判据、正向锚点或数值本体字面守卫时与其余十一道门禁一并运行。 |
| `python -B 程序文件/sync_skill_backup.py` | 把 `~/.qoder/skills/` 运行时技能回写 `技能仓备份/` 镜像。**基线已验证**(CG-20260916-006 ④ 实跑):清掉两层 `__pycache__` 后为「范围 122|一致 122|新增 0|更新 0|移除 0」,`同步说明.md` 哈希清单随之刷新(CG-20260829-001 ⑤ 的「失准、待重跑」已闭合)。**本行判据是「范围 73 + 新增 0 + 移除 0」**(范围数自 CG-20260921-004 起为 72,CG-20260923-001 把 `shared/data-classification.md` 纳入 `SHARED_FILES` 后为 **73**;原值 122 系 `walk_files` 留痕判据失效(字面 `"_pre_"` 对实际命名 `_pre<日期>CG<序号>` 命中 0)而虚高,含 50 件 CG 留痕件,见 PL-035。本行以下所有「范围 122」历史读数按快照纪律**不改写**,读作判据订正前态);一致/更新两数随批浮动(改了哪几件就更新几件),不得按固定数字判回归。**CG-20260917-009** 首跑「范围 122|一致 116|新增 0|更新 6|移除 0」,末次同步与只读检查见 CHANGELOG v1.12.15;使用 `python -B` 避免新生 `.pyc`,同步前检查范围与差异,出现未知新增/移除须停。以下为历史读数(CG-20260917-006)**首跑**为「范围 122|一致 119|新增 0|更新 3|移除 0」,更新件=`sre_reasoner.py`/`sre_regression_test.py`/机器本地 `sre_regression_report.json`(=本批三件运行时改动带平);**收尾复跑**为「范围 122|一致 121|新增 0|更新 1|移除 0」,唯一更新件=机器本地 `sre_regression_report.json`(前三件已一致,report.json 因复跑门禁被重写)——两次读数差即「本批改了哪几件」,正是本行不得钉固定数字的原因。**排除面缺口已机算收口(CG-20260919-004,C 级,闭合 PL-011)**:v1.4 起 `walk_files` 源侧收集加跳 `.pyc`/`__pycache__`,目标侧扫描故意不跳以便镜像清理删除历史遗留的孤儿 `.pyc`(自愈),故「跑前须先手工删两层 `.pyc`」这一人工步骤自此由脚本承担;`--check` 实测对 clean 态为 no-op(当前两层 0 个 `.pyc`,范围 122/新增 0/移除 0)。**反向缺口(-009 实测)**:范围是固定的「15 个技能目录 + 根治理文件 + shared 7 文件」,落在 `技能仓备份/` 内但不属于该范围的件会被当差异**移除**——本批放在 `技能仓备份/shared/` 的 `_pre20260916CG009` 备份首跑即被删(读数「移除 1」)。故仓内镜像侧**不是** `_pre*` 备份件的留存位置,回退判据取 `git show HEAD:<path>` 前像,运行时侧备份件仅机器本地保险。**CG-20260921-004(v1.5,闭合 PL-035)订正该判据**:留痕跳过由字面 `"_pre_"` 改为结构文法 `_pre_?\d{8}`(`TRACE_ARTIFACT_RE`)并扩至路径任一段,范围由 122 降为 **72**;源侧与目标侧共用该分支,故镜像层既有 50 件留痕件两侧皆不可见——**既不被带平也不被判孤儿删除**(实测「范围 72|一致 72|新增 0|移除 0」),-009 那条「放在镜像侧即被移除」的行为对留痕命名件自此不再发生;该 50 件系 gitignored 未跟踪件,删除不可逆,本批不删、清理须另批裁定。检查 9 自枚举取数、不经 `walk_files`,其纳入判据读数不受本批影响(120/58/62 不变)。**CG-20260921-005 处置该 50 件镜像层留痕件**(发起人裁定「先仓外归档再删」):先按 `技能仓备份/` 相对路径整体归档至与本仓同级的仓外归档目录 `_archive-20260921-traces\`(源↔归档 sha256 集合全等自证+逐件 `MANIFEST.txt`),删除前无唯一内容审计=50 件在运行时层 `~/.qoder/skills/` 均有字节全等副本、其中 42 件内容同存于 git 历史 blob、唯一内容 0,审计通过后才删原件;删后镜像层该文法残留 0、`技能仓备份/` 文件数 123→73、`--check` 复跑仍「范围 72|新增 0|移除 0」,该清理面补登台账 PL-037 并同批闭合) |

> **SRE 门禁转红时的正确动作(设计方案 §6.2,不是故障)**:若 `sre_regression_test.py` 报 `FAILED (unexpected successes=N)` 并 exit 1,说明对应缺陷已被真实修复——须摘掉该用例的 `@unittest.expectedFailure` 装饰器、把断言转为正向常态断言,**禁止回退或注释 `sre_reasoner.py` 的修复来让用例重新"预期失败"**。

`validate_governance.py` 从本体算数不硬编码计数;`sr_ic07_compliance_test.py` 等硬编码计数的脚本是盲区,红线注册类变更须回扫。