# 探测矩阵：信号 → 维度 → globs → 二次扫描

step-02 据此对 `{target-root}` 逐维度**实证求值**（每条结论都要有 Grep/Glob/Read 证据），产出「生成计划表」。

## 判定优先级

`pom.xml 依赖（强）` > `代码注解/类名（强）` > `目录结构（中）` > `配置 properties（中）` > `文件后缀（弱，仅用于定 globs）`。

**任一强信号命中即生成该维度**；多信号叠加用于「提炼真实内容」的二次扫描。`detect-stack.js` 的 JSON 是加速辅助，**最终以实证为准**。

## 探测方法速查

| 信号类型 | 方法 | 示例 |
|---------|------|------|
| pom 依赖 | Read `{target-root}/pom.xml`（含父 pom），看 `<artifactId>` | 含 `zqyl-xx-job` |
| 注解/类名 | Grep | `Grep "@XxlJob" {target-root}/src` |
| 目录结构 | Glob | `Glob {target-root}/**/gateway/**` |
| 配置 | Read `{target-root}/src/main/resources/application*.properties`、`bootstrap*` | 含 `jdbc:oracle` |
| 后缀 | Glob | `Glob {target-root}/**/*.vue` |

---

## 通用维度（命中即生成，用固定 globs，主要靠裁剪+占位符注入）

### java-backend ｜ security
- **信号**：存在任意 `{target-root}/**/*.java`（Java 工程基本必中）。
- **globs**：均为 `["**/*.java"]`。
- **二次扫描**：无。security 可在检出 `ThreadPoolExecutor`/`RedissonClient` 时于正文点名引用，非必需。

### api-design
- **信号（其一）**：`**/*Controller.java`；`@RestController`/`@RequestMapping`；目录 `**/controller/**` 或 `**/interfaces/**`。
- **globs**：`["**/controller/**","**/api/**","**/*Controller.java","**/*Api.java","**/interfaces/**"]`。
- **二次扫描（轻）**：提炼本服务对外 API 上下文（`{{API_CONTEXT}}`）——优先 bootstrap/网关配置的应用名，缺则 `{{SERVICE_NAME}}-api`。

### database-oracle
- **信号（其一）**：pom 含 `zqyl-mybatis-oracle`/`ojdbc`/`oracle`；properties 含 `jdbc:oracle`；SQL/Mapper 出现 `ROWNUM`；目录 `**/oracle/**`。
- **globs**：`["**/*.sql","**/oracle/**","**/plsql/**","**/mapper/**"]`（SQL 多在 mapper xml；权威以 `glob-patterns.md` 为准）。
- **二次扫描（轻）**：`{{ORACLE_VERSION}}`（配置/依赖推断，缺填团队默认 `11.2.0.4` 并报告）。

### database-mysql
- **信号（其一）**：pom 含 `mysql-connector`/非 oracle 的 `zqyl-mybatis`；properties 含 `jdbc:mysql`。
- **globs**：`["**/*.sql","**/mapper/**","**/migration/**"]`。
- **互斥提示**：若仅检出 Oracle、无任何 MySQL 信号 → **跳过本维度**（避免产出用不到的规则）。

### gateway
- **信号（其一）**：目录 `**/gateway/**`；DTO/Req 同时含 `userId`+`companyId` 字段（中企云链网关注入强约定）；存在 `**/filter/**`、`**/interceptor/**`。
- **globs**：`["**/gateway/**","**/filter/**","**/config/**","**/interceptor/**","**/*DTO.java"]`。
- **二次扫描（轻）**：确认注入字段命名（是否有 `@JsonProperty` 变体），如有则在正文注明。

### frontend-vue ｜ frontend-js ｜ frontend-css-html（「命中前端才补」）
- **信号**：分别为存在 `**/*.vue`；存在 `**/*.{js,ts,jsx,tsx}`（**排除 node_modules/dist**）；存在 `**/*.{css,scss,less,html}`（排除 node_modules/dist）。
- **globs**：见 `glob-patterns.md`。
- **范围约束**：本 skill「后端为主」。纯后端服务（如靶子 zqyl-pj-financing）这三项应**全部跳过**。前端 baseline 含 pj-incentive 专有示例，命中生成时须在报告提示人工泛化（见 `dimension-catalog.md`）。

---

## 项目特定维度（命中才生成，无 globs，必须扫码提炼，严禁照抄样板清单）

> 所有特定维度生成后由 CLAUDE.md 索引表声明「按需主动加载」，文件首行写触发场景。提炼配方见 `extraction-recipes.md`。
>
> ⚠ 下列各维度的「靶子预期：…」仅是对**示例服务 zqyl-pj-financing** 的校准记录，**不代表对其他目标服务的预期**。对任意 `{target-root}` 一律按其真实代码实证判定（例如 pj-incentive 自身确有 async-export 与 MQ，不应据这些示例注释误判为跳过）。

### xxl-job
- **信号（其一）**：pom 含 `zqyl-xx-job`/`xxl-job-core`；`@XxlJob`；目录 `**/job/**` 或 `**/infrastructure/job/**`。
- **必扫**：`extraction-recipes.md#xxl-job` —— 列全部 Handler（类名+注解值+方法签名+Cron+锁 key），**判定 ReturnT vs XxlJobHelper 风格**并自适应模板。
- 靶子预期：3 个 Handler（`DailyMinPriceJobHandler`/`InquiryExpireJobHandler`/`QuoteExpireJobHandler`），XxlJobHelper 风格。

### feign（新增维度）
- **信号（其一）**：`@FeignClient`；pom 含 `zqyl-feign`/`spring-cloud-openfeign`。
- **必扫**：`extraction-recipes.md#feign` —— 列全部 `@FeignClient`（name/path/接口名）、对应 Gateway 防腐封装、**实测返回壳（ResultData/ResponseInfo/裸类型，禁止预设）**。
- 靶子预期：6 个 FeignClient（Data/File/Pjs/Report/UserAuth/UserCenter）+ 6 个对应 Gateway。

### file-import-export
- **信号（其一）**：类 `FileGateway`/`FileUrlHelper`/`FileDownLoadFeign`；pom 含 `zqyl-easyexcel`/`easyexcel`；`EasyExcel.`/`@ExcelProperty`。
- **必扫**：`extraction-recipes.md#file-import-export` —— 文件基础设施类清单、上传地址 properties、导入上限常量、ImportApplication 清单。
- 靶子预期：`FileGateway`/`FileUrlHelper`/`FileUrlConfig`/`MockMultipartFile` + `PriceImportDTO`/`AcceptorLevelImportErrorDTO` 等导入实体。

### async-export
- **信号（其一）**：`createManageReserveTask`/`reserveUploadFile`/`exportThreadPool`/`ThreadPoolConfig` 且与导出相关。
- **必扫**：`extraction-recipes.md#async-export` —— ExportApplication 方法、线程池 bean 名与参数、Redis 锁前缀、CreateReserveTaskDTO 字段。
- 靶子预期：**可能跳过**（未见 createManageReserveTask/exportThreadPool 强信号；如仅有同步导入则不生成 async-export）。

### mq（可选维度）
- **信号（其一）**：pom 含 `rocketmq`/`zqyl-mq`；`@RocketMQMessageListener`/`MQProducer`/`MessageListener`/`@RabbitListener`/`@KafkaListener`。
- **必扫**：`extraction-recipes.md#mq` —— 生产/消费者类、topic/tag 常量。
- 靶子预期：跳过（无 MQ 依赖/注解）。

### redis（可选维度）
- **信号（其一）**：pom 含 `zqyl-redis`/`zqyl-redisson`；`RedissonClient`/`StringRedisTemplate`。
- **必扫**：`extraction-recipes.md#redis` —— 分布式锁 key 前缀约定、缓存 key 规范。
- 说明：很多服务都引 redis，本维度优先级低，命中且团队需要时生成；默认可并入 security 不单列（由 `dimension-catalog.md` 的命中阈值控制）。

---

## extra_dimensions（团队扩展）

`customize.toml` 的 `extra_dimensions` 可追加「维度→信号→globs→recipe」条目（按 `code` 合并）。step-02 求值时把扩展条目并入本矩阵。

## 跳过即记录

任何被跳过的维度都必须在「跳过维度表」写明**原因+证据**（如「database-mysql：仅检出 Oracle 依赖，无 jdbc:mysql」），不可静默丢弃——静默会让用户误以为已覆盖。
