# Step 3: 生成 rules 文件

## 强制规则

- ✅ 严格按 step-02 确认的计划生成，不擅自增删维度。
- 🛑 特定维度**必须真实扫码**：产出文件中**禁止残留** `<!-- SCAN:* -->` 占位，**禁止出现** pj-incentive 专有标识——既包括专有**类名**（`DataUpgradeJobHandler`/`FeePlanMatchJobHandler`/`PerformancePushJobHandler`/`FeePushJobHandler`/`ExportApplication`/`LedgerAdjustImportApplication`/`FinanceImportApplication`/`EndorseImportApplication`），**也包括正文代码/散文里的专有字面量**（锁前缀 `pj-incentive:export:`、模块名 `票据对接费用`、服务名/AppId `zqyl-pj-incentive`、前端接口文件 `pjIncentive.js`、表名前缀 `T_PJ_`、包路径 `com.yljr.interfaces...XxxVO` 等）。这些必须替换为 `{target-root}` 的真实值（扫不到则用 `{占位符}` 并记报告）。
- ⚠ **例外（目标即黄金样板服务）**：若 `{target-root}` 本身就是 pj-incentive（artifactId = `zqyl-pj-incentive`），则上述「专有标识」正是它的**真实值**，应按真实值保留，不要当作残留删除或占位化。
- ✅ 每写完一个文件做自检。
- 💬 文件内容用中文（`{document_output_language}`）。

## YOUR TASK

逐维度把 rules 写入 `{target-root}/.claude/rules/{dim}.md`。

## 通用维度生成（基线裁剪 + 占位符注入）

1. 读基线：`{workflow.external_baseline_path}` 非空时优先从该目录读 `{dim}.md`，否则 `{skill-root}/assets/baselines/{dim}.md`。
2. **裁剪**：删本服务不适用的小节（如服务无某特性）。整维度不适用则该文件本就不在计划内。
3. **占位符注入**：用 step-02 收集的真值替换 `{{...}}`。探测不到的占位符**保留原样**并已登记报告。
4. 写 `{target-root}/.claude/rules/{dim}.md`。
5. **自检**：frontmatter 存在、`globs` 为字符串数组、无反斜杠、与 `glob-patterns.md` 一致（或超集）；`Grep` 确认无未替换残留——双花括号 `{{...}}` 与前端单花括号 `{feModule}`/`{FeModule}` 均须替换为真值，扫不到则保留并记报告，不得静默残留。

> frontend-vue：baseline 枚举段已用中性占位 `{feModule}`（Vuex 模块）/`get{FeModule}Status`（getter）/示例枚举 key；命中前端时**扫本服务前端代码**（Vuex 模块/接口文件）把占位替换为真实命名，扫不到则保留占位并在报告「需人工补充」提示。**严禁补回 `getPjIncentiveStatus`/`pjIncentive` 等 pj-incentive 专有命名当范式**（见 `dimension-catalog.md`）。

## 特定维度生成（扫码提炼 + 套骨架）

1. 读骨架：`{skill-root}/assets/skeletons/{dim}.md`。
2. 按 `references/extraction-recipes.md#{dim}` 对 `{target-root}` 扫码（Grep/Read/Glob），得真实清单。
3. **填充** 骨架中 `<!-- SCAN:* -->` 占位与空表为真实数据。
4. **风格自适应**（xxl-job）：按 recipe 判定 ReturnT vs XxlJobHelper 风格，把正文/Checklist 中所有相关表述改写为实测风格，删 `<!-- STYLE-ADAPT -->` 注释，在「基础设施」小节注明「本项目统一 XX 风格」。
5. **提炼为空兜底**：强信号命中但扫不到实体 → 保留骨架 + 空表 + 顶部标注「⚠ 本服务暂无 XX 实例，以下为团队规范模板」，报告记「需人工补充」。
6. 写文件（**无 frontmatter**，保留首行 `> 触发说明`）。
7. **自检**：`Grep` 本文件确认无残留 `<!-- SCAN`、无 `<!-- STYLE-ADAPT`、无任何 pj-incentive 专有类名**或字面量**（`pj-incentive:export`/`票据对接费用`/`zqyl-pj-incentive`/`pjIncentive`/`T_PJ_`）——**目标即 pj-incentive 本体时除外**（见强制规则的例外条款，此时它们是真实值，应保留）；清单表与正文代码示例内均为 `{target-root}` 的真实值。

> **范式修正**：骨架正文给出的实现范式（如 async-export 同步/异步阶段步骤、判空 `countByCondition` 等）若与本服务**真实实现**不符，以扫码所得真实实现为准修正，不照搬骨架范式。

## parallel_scan（可选）

`{workflow.parallel_scan}=true` 时：对每个特定维度派一个**只读**子代理执行该维度 recipe，返回结构化清单（不写文件）；主代理汇总后统一填表、写盘（保一致性）。默认 false（串行）。

## 生成节奏

- `{workflow.interactive_generate}=true`：每维度生成后展示并等确认。
- 否则（默认）：批量生成全部维度，末尾给一次汇总（文件清单 + 自检结果），再进 step-04。

## 自检清单（每文件必过）

- [ ] 通用维度：有 `globs` frontmatter；特定维度：无 frontmatter、有首行触发说明
- [ ] 无残留 `<!-- SCAN -->` / `<!-- STYLE-ADAPT -->`
- [ ] 无 pj-incentive 专有类名**与字面量**（`pj-incentive:export`/`票据对接费用`/`zqyl-pj-incentive`/`pjIncentive`/`T_PJ_` 等；**目标即 pj-incentive 本体除外**；特定维度清单与代码示例均为本服务真实值）
- [ ] 占位符已注入或已登记报告（双花括号 `{{...}}` 与前端单花括号 `{feModule}`/`{FeModule}` 均无静默残留）
- [ ] 路径写到 `{target-root}/.claude/rules/`（不是 `{project-root}`）

## NEXT STEP

全部维度生成且自检通过后，载入 `./step-04-index-and-report.md`。
