@pzy560117/codex-harness 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +1 -1
  2. package/package-source/AGENTS.md +18 -1
  3. package/package-source/docs/codex-harness-engineering/templates/bootstrap-codex-harness.ps1 +57 -48
  4. package/package-source/docs/codex-harness-engineering/templates/config/rules/agents.md +3 -3
  5. package/package-source/docs/codex-harness-engineering/templates/docs/project-agents-template.md +8 -1
  6. package/package-source/docs/codex-harness-engineering/templates/docs/task-session-strategy.md +7 -0
  7. package/package-source/docs/codex-harness-engineering/templates/hooks/hook-stop-verify.ps1 +76 -10
  8. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/examples/ticket-filter-demo/task.json +2 -2
  9. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/project-agents-template.md +51 -1
  10. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/controller-loop.md +88 -0
  11. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/failure-triage.md +71 -0
  12. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/harness-audit.md +54 -0
  13. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/implement-one-task.md +18 -15
  14. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/repair-one-finding.md +1 -2
  15. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-one-task.md +45 -0
  16. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-stage1-spec.md +111 -0
  17. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/review-stage2-quality.md +82 -0
  18. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/visual-evaluator.md +80 -0
  19. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/backend-worker.md +41 -0
  20. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/docs-worker.md +28 -0
  21. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/frontend-worker.md +46 -0
  22. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/harness-writer.md +40 -0
  23. package/package-source/docs/codex-harness-engineering/templates/package-assets/docs/codex-harness-engineering/templates/prompts/worker-role/test-runner.md +27 -0
  24. package/package-source/docs/codex-harness-engineering/templates/package-assets/rules/agents.md +6 -3
  25. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/auto-commit/SKILL.md +1 -1
  26. package/package-source/docs/codex-harness-engineering/templates/package-assets/skills/speckit-plan/SKILL.md +1 -1
  27. package/package-source/docs/codex-harness-engineering/templates/prompts/controller-loop.md +4 -4
  28. package/package-source/docs/codex-harness-engineering/templates/prompts/failure-triage.md +1 -1
  29. package/package-source/docs/codex-harness-engineering/templates/prompts/harness-audit.md +1 -1
  30. package/package-source/docs/codex-harness-engineering/templates/prompts/implement-one-task.md +18 -15
  31. package/package-source/docs/codex-harness-engineering/templates/prompts/repair-one-finding.md +1 -2
  32. package/package-source/docs/codex-harness-engineering/templates/prompts/review-one-task.md +1 -1
  33. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage1-spec.md +1 -1
  34. package/package-source/docs/codex-harness-engineering/templates/prompts/review-stage2-quality.md +1 -1
  35. package/package-source/docs/codex-harness-engineering/templates/prompts/visual-evaluator.md +1 -1
  36. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/backend-worker.md +2 -2
  37. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/docs-worker.md +2 -2
  38. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/frontend-worker.md +2 -2
  39. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/harness-writer.md +4 -4
  40. package/package-source/docs/codex-harness-engineering/templates/prompts/worker-role/test-runner.md +1 -1
  41. package/package-source/docs/codex-harness-engineering/templates/runtime/AGENTS.md +45 -46
  42. package/package-source/docs/codex-harness-engineering/templates/runtime/doctor.ps1 +151 -42
  43. package/package-source/docs/codex-harness-engineering/templates/runtime/project-task-template.json +81 -66
  44. package/package-source/docs/codex-harness-engineering/templates/runtime/smoke-task.json +1 -1
  45. package/package-source/docs/codex-harness-engineering/templates/runtime/task.json +1 -1
  46. package/package-source/docs/codex-harness-engineering/templates/runtime/verify.ps1 +29 -12
  47. package/package-source/docs/codex-harness-engineering/templates/tools/harness/task-structure-lint.ps1 +399 -0
  48. package/package-source/install-manifest.json +1 -1
  49. package/package-source/tools/install/bootstrap-codex-harness.ps1 +23 -10
  50. package/package-source/tools/install/install-agent.ps1 +59 -18
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -106,7 +106,7 @@ harness init --plan
106
106
  ### 钉住远程版本初始化
107
107
 
108
108
  ```powershell
109
- npx @pzy560117/codex-harness init --version 0.1.7
109
+ npx @pzy560117/codex-harness init --version 0.1.9
110
110
  ```
111
111
 
112
112
  适合 release smoke 或回滚到某个已发布版本。
@@ -7,6 +7,20 @@
7
7
  - 当前仓库根目录下的活跃文档或脚本,只在它本身就是 canonical,或为了验证模板落地效果、保持当前仓库可运行时再同步修改。
8
8
  - 如果一次改动同时涉及根目录活跃文件和模板文件,优先说明哪一份是 canonical,避免只修当前仓库、不修模板源。
9
9
 
10
+ ## 任务结构硬门禁
11
+
12
+ - 未经用户明确同意,不得把标准 `task.json` 模板 phase 压缩成更少任务;正式任务队列至少保留 `ANALYSIS-001`、`TESTCASE-001`、`PLAN-001`。
13
+ - P0/P1 项目禁止跳过 `TESTCASE-001`;缺少 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`、`ACCEPTANCE_CRITERIA.md`、`TRACEABILITY_MATRIX.md`、`TEST_DATA_MATRIX.md`、`REGRESSION_PLAN.md`、`verify-matrix.md` 任一项,都不得生成最终 `task.json`。
14
+ - `feature_impl` 没有 `qa_contract` 不得进入正式任务队列;`qa_contract` 没有完整 `tdd_contract`、`development_validation`、`acceptance_validation` 不得开始实现。
15
+ - 单个 `feature_impl` 默认不得覆盖超过 3 条主需求;订单、支付、库存、RBAC 必须拆独立任务;前端和后端不得长期混在同一个 story,除非这是明确的 `release` 任务。
16
+
17
+ ## 子目录 AGENTS 规则
18
+
19
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须检查并更新最接近该目录的子目录 `AGENTS.md`。
20
+ - 目录级 `AGENTS.md` 负责承载局部职责、边界、入口、测试命令、复用模式、坑点和禁止事项;不要把这类规则长期堆在根 `AGENTS.md`。
21
+ - 自动托管区块 `AUTO-MODULE-FACTS` 只补动态事实,不等于目录规则完整;即使 facts 已自动刷新,仍需要有人维护手写的局部规则部分。
22
+ - 如果 `task.json.owned_paths`、`docs/ai/repo-map.md` 或模块边界已经明确某目录是独立模块,而该目录缺少子目录 `AGENTS.md`,应视为至少 `warn`,高风险目录应直接阻断进入正式任务队列或实现阶段。
23
+
10
24
  ## 目录级规则
11
25
 
12
26
  - 当某个目录满足以下任一条件时,应优先考虑新增或更新该目录下的 `AGENTS.md`,而不是继续扩充根入口:
@@ -25,7 +39,10 @@
25
39
 
26
40
  ## 必读索引
27
41
 
28
- 如果当前仓库是 thin install 项目,而下面列出的 `docs/harness/*` 或 `docs/knowledge/*` 不在项目根,先读取 `.codex-harness/state/config.json`,再到其中 `packageRoot` 下查同路径文件。
42
+ 如果当前仓库是 thin install 项目,而下面列出的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 不在项目根,先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:
43
+ - `docs/harness/*` -> `docs/codex-harness-engineering/templates/docs/*`
44
+ - `docs/testing/*` -> `docs/codex-harness-engineering/templates/testing/*`
45
+ - `docs/knowledge/*` -> `docs/codex-harness-engineering/templates/knowledge/*`
29
46
 
30
47
  - Harness 分层分析索引:`harness-analysis/README.md`
31
48
  - Codex Harness Engineering 总览:`docs/codex-harness-engineering/README.md`
@@ -57,7 +57,7 @@ function Resolve-TemplateRoot {
57
57
  }
58
58
 
59
59
  $agentsTemplate = Join-Path $resolved "runtime\AGENTS.md"
60
- $driverTemplate = Join-Path $resolved "runtime\codex-loop.ps1"
60
+ $driverTemplate = Join-Path $resolved "runtime\codex-loop.ps1"
61
61
  if ((Test-Path -LiteralPath $agentsTemplate) -and (Test-Path -LiteralPath $driverTemplate)) {
62
62
  return $resolved
63
63
  }
@@ -225,16 +225,28 @@ function Ensure-TaskFile {
225
225
  return Copy-ManagedFile -SourceRoot $SourceRoot -SourceRelativePath "runtime\task.json" -DestinationRoot $DestinationRoot -DestinationRelativePath "task.json" -Overwrite:$true
226
226
  }
227
227
 
228
- $taskDocument = $taskContent | ConvertFrom-Json
229
- if ($null -eq $taskDocument.runtime) {
230
- $taskDocument | Add-Member -NotePropertyName "runtime" -NotePropertyValue ([PSCustomObject]@{}) -Force
231
- }
232
-
233
- if ([string]::IsNullOrWhiteSpace($taskDocument.runtime.driver)) {
234
- $taskDocument.runtime.driver = "powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\\harness/codex-loop.ps1"
235
- $taskDocument | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $taskPath -Encoding UTF8
236
- return [PSCustomObject]@{
237
- Path = $taskPath
228
+ $taskDocument = $taskContent | ConvertFrom-Json
229
+ if ($null -eq $taskDocument.runtime) {
230
+ $taskDocument | Add-Member -NotePropertyName "runtime" -NotePropertyValue ([PSCustomObject]@{}) -Force
231
+ }
232
+
233
+ $canonicalDriver = "powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\harness\codex-loop.ps1"
234
+ $driverPattern = 'tools[\\/]+harness[\\/]+tools[\\/]+harness[\\/]+codex-loop\.ps1'
235
+
236
+ if ([string]::IsNullOrWhiteSpace($taskDocument.runtime.driver)) {
237
+ $taskDocument.runtime.driver = $canonicalDriver
238
+ $taskDocument | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $taskPath -Encoding UTF8
239
+ return [PSCustomObject]@{
240
+ Path = $taskPath
241
+ Action = "updated"
242
+ }
243
+ }
244
+
245
+ if ([string]$taskDocument.runtime.driver -match $driverPattern) {
246
+ $taskDocument.runtime.driver = $canonicalDriver
247
+ $taskDocument | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $taskPath -Encoding UTF8
248
+ return [PSCustomObject]@{
249
+ Path = $taskPath
238
250
  Action = "updated"
239
251
  }
240
252
  }
@@ -293,11 +305,25 @@ function Resolve-LockManifestSourcePath {
293
305
  return Join-Path $PackageRoot ($normalizedSource.Replace('/', '\'))
294
306
  }
295
307
 
296
- function Get-FileSha256 {
297
- param([string]$Path)
298
-
299
- return (Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()
300
- }
308
+ function Get-FileSha256 {
309
+ param([string]$Path)
310
+
311
+ $hashAlgorithm = [System.Security.Cryptography.SHA256]::Create()
312
+ try {
313
+ $stream = [System.IO.File]::OpenRead($Path)
314
+ try {
315
+ $hashBytes = $hashAlgorithm.ComputeHash($stream)
316
+ }
317
+ finally {
318
+ $stream.Dispose()
319
+ }
320
+ }
321
+ finally {
322
+ $hashAlgorithm.Dispose()
323
+ }
324
+
325
+ return ([System.BitConverter]::ToString($hashBytes)).Replace('-', '').ToLowerInvariant()
326
+ }
301
327
 
302
328
  function Add-LockManagedFile {
303
329
  param(
@@ -561,13 +587,14 @@ $results = @()
561
587
 
562
588
  $rootFiles = @(
563
589
  @{ Source = "runtime\AGENTS.md"; Destination = "AGENTS.md" },
564
- @{ Source = "tools/install/bootstrap-codex-harness.ps1"; Destination = "tools\\install/bootstrap-codex-harness.ps1" },
565
- @{ Source = "runtime\codex-loop.ps1"; Destination = "tools\\harness/codex-loop.ps1" },
566
- @{ Source = "runtime\doctor.ps1"; Destination = "tools\\harness/doctor.ps1" },
590
+ @{ Source = "bootstrap-codex-harness.ps1"; Destination = "tools\install\bootstrap-codex-harness.ps1" },
591
+ @{ Source = "runtime\codex-loop.ps1"; Destination = "tools\harness\codex-loop.ps1" },
592
+ @{ Source = "runtime\doctor.ps1"; Destination = "tools\harness\doctor.ps1" },
567
593
  @{ Source = "config\codex-config.toml"; Destination = ".codex\config.toml" },
568
594
  @{ Source = "config\codex-readme.md"; Destination = ".codex\README.md" },
569
- @{ Source = "hooks\hooks.json"; Destination = ".codex\hooks.json" },
595
+ @{ Source = "hooks\hooks.json"; Destination = ".codex\hooks.json" },
570
596
  @{ Source = "hooks\hook-stop-verify.ps1"; Destination = "tools\harness\hook-stop-verify.ps1" },
597
+ @{ Source = "scripts\harness\harness-governance-check.ps1"; Destination = "scripts\harness\harness-governance-check.ps1" },
571
598
  @{ Source = "scripts\ai-workflow\check-ai-sync-drift.ps1"; Destination = "tools\install\ai-workflow\check-ai-sync-drift.ps1" },
572
599
  @{ Source = "runtime\task-run-profile.json"; Destination = ".codex\task-run-profile.json" },
573
600
  @{ Source = "prompts\implement-one-task.md"; Destination = ".codex\prompts\implement-one-task.md" },
@@ -586,33 +613,16 @@ $rootFiles = @(
586
613
  @{ Source = "prompts\worker-role\harness-writer.md"; Destination = ".codex\prompts\worker-role\harness-writer.md" },
587
614
  @{ Source = "runtime\smoke-task.json"; Destination = "tools\harness\templates\smoke-task.json" },
588
615
  @{ Source = "runtime\project-task-template.json"; Destination = "tools\harness\templates\project-task-template.json" },
589
- @{ Source = "runtime\verify.ps1"; Destination = "tools\\harness/verify.ps1" },
590
- @{ Source = "tools\harness\spec-lint.ps1"; Destination = "tools\\harness/spec-lint.ps1" },
591
- @{ Source = "tools\harness\docs-lint.ps1"; Destination = "tools\\harness/docs-lint.ps1" },
592
- @{ Source = "tools\harness\data-lint.ps1"; Destination = "tools\\harness/data-lint.ps1" },
593
- @{ Source = "tools\harness\integration-lint.ps1"; Destination = "tools\\harness/integration-lint.ps1" },
594
- @{ Source = "tools\harness\mobile-lint.ps1"; Destination = "tools\\harness/mobile-lint.ps1" },
595
- @{ Source = "tools\harness\acceptance-lint.ps1"; Destination = "tools\\harness/acceptance-lint.ps1" },
596
- @{ Source = "tools\harness\context-lint.ps1"; Destination = "tools\\harness/context-lint.ps1" },
597
- @{ Source = "tools\harness\architecture-lint.ps1"; Destination = "tools\\harness/architecture-lint.ps1" },
598
- @{ Source = "tools\harness\directory-lint.ps1"; Destination = "tools\\harness/directory-lint.ps1" },
599
- @{ Source = "tools\harness\component-lint.ps1"; Destination = "tools\\harness/component-lint.ps1" },
600
- @{ Source = "tools\harness\business-lint.ps1"; Destination = "tools\\harness/business-lint.ps1" },
601
- @{ Source = "tools\harness\contract-lint.ps1"; Destination = "tools\\harness/contract-lint.ps1" },
602
- @{ Source = "tools\harness\state-lint.ps1"; Destination = "tools\\harness/state-lint.ps1" },
603
- @{ Source = "tools\harness\ui-lint.ps1"; Destination = "tools\\harness/ui-lint.ps1" },
604
- @{ Source = "tools\harness\backend-lint.ps1"; Destination = "tools\\harness/backend-lint.ps1" },
605
- @{ Source = "tools\harness\security-lint.ps1"; Destination = "tools\\harness/security-lint.ps1" },
606
- @{ Source = "tools\harness\testing-lint.ps1"; Destination = "tools\\harness/testing-lint.ps1" },
607
- @{ Source = "tools\harness\impact-lint.ps1"; Destination = "tools\\harness/impact-lint.ps1" },
608
- @{ Source = "tools\harness\performance-lint.ps1"; Destination = "tools\\harness/performance-lint.ps1" },
609
- @{ Source = "tools\harness\config-lint.ps1"; Destination = "tools\\harness/config-lint.ps1" },
610
- @{ Source = "tools\harness\observability-lint.ps1"; Destination = "tools\\harness/observability-lint.ps1" },
611
- @{ Source = "tools\harness\refactor-lint.ps1"; Destination = "tools\\harness/refactor-lint.ps1" },
612
- @{ Source = "tools\harness\session-lint.ps1"; Destination = "tools\\harness/session-lint.ps1" },
613
- @{ Source = "tools\harness\style-lint.ps1"; Destination = "tools\\harness/style-lint.ps1" },
614
- @{ Source = "config\tools/install/env-check.ps1"; Destination = "tools\\install/env-check.ps1" },
615
- @{ Source = "trace\docs/harness/trace.schema.json"; Destination = "docs\\harness/trace.schema.json" }
616
+ @{ Source = "tools\harness\task-structure-lint.ps1"; Destination = "tools\harness\task-structure-lint.ps1" },
617
+ @{ Source = "runtime\verify.ps1"; Destination = "tools\harness\verify.ps1" },
618
+ @{ Source = "tools\harness\docs-lint.ps1"; Destination = "tools\harness\docs-lint.ps1" },
619
+ @{ Source = "tools\harness\data-lint.ps1"; Destination = "tools\harness\data-lint.ps1" },
620
+ @{ Source = "tools\harness\integration-lint.ps1"; Destination = "tools\harness\integration-lint.ps1" },
621
+ @{ Source = "tools\harness\mobile-lint.ps1"; Destination = "tools\harness\mobile-lint.ps1" },
622
+ @{ Source = "tools\harness\acceptance-lint.ps1"; Destination = "tools\harness\acceptance-lint.ps1" },
623
+ @{ Source = "tools\harness\session-lint.ps1"; Destination = "tools\harness\session-lint.ps1" },
624
+ @{ Source = "config\env-check.ps1"; Destination = "tools\install\env-check.ps1" },
625
+ @{ Source = "trace\trace.schema.json"; Destination = "docs\harness\trace.schema.json" }
616
626
  )
617
627
 
618
628
  foreach ($file in $rootFiles) {
@@ -735,7 +745,6 @@ if ($Profile -eq "legacy" -and $IncludeDocs) {
735
745
  @{ Source = "docs\prompt-knowledge-integration.md"; Destination = "docs/harness/prompt-knowledge-integration.md" },
736
746
  @{ Source = "docs\mcp-knowledge-governance.md"; Destination = "docs/harness/mcp-knowledge-governance.md" },
737
747
  @{ Source = "docs\code-semantics-and-navigation.md"; Destination = "docs/harness/code-semantics-and-navigation.md" },
738
- @{ Source = "docs\code-style-and-naming.md"; Destination = "docs/harness/code-style-and-naming.md" },
739
748
  @{ Source = "docs\rule-governance.md"; Destination = "docs/harness/rule-governance.md" },
740
749
  @{ Source = "docs\regression-rules.md"; Destination = "docs/harness/regression-rules.md" },
741
750
  @{ Source = "docs\team-knowledge-sync.md"; Destination = "docs/harness/team-knowledge-sync.md" },
@@ -34,11 +34,11 @@ trigger: always_on
34
34
  | `contract-designer` | OpenAPI、mock、client 生成、字段和错误码契约 | `api-contract-template`, `api-design` | Contract First |
35
35
  | `backend-worker` | API、数据库、权限、异常流、后端测试 | `backend-patterns`, `database`, 项目后端技能 | 后端实现 |
36
36
  | `integration-worker` | 前后端联调、mock 切真实服务、主流程 E2E | `api-integration`, `fullstack-workflow` | Integration |
37
- | `test-planner` | 从需求阶段开始定义可测试需求、验收示例、追溯矩阵、测试数据、分层测试计划和证据路径 | `qa-e2e-planner`, `test-coverage`, `tdd` | 测试设计与测试左移 |
37
+ | `test-planner` | 从需求阶段开始定义可测试需求、验收示例、追溯矩阵、测试数据、分层测试计划、影响面和证据路径;高风险用户可见任务要明确是否需要 `e2e-plan.md` | `qa-e2e-planner`, `test-coverage`, `tdd` | 测试设计与测试左移 |
38
38
  | `test-runner` | 运行确定性验证、汇总失败、写测试报告 | `e2e-runner`, `qa-e2e-runner`, `verify` | Verify / Regression |
39
39
  | `stage1-reviewer` | 产品、设计、计划一致性审查 | `spec-based-review`, `spec-review` | Stage 1 Review |
40
40
  | `stage2-reviewer` | 代码质量、测试覆盖、回归风险审查 | `code-reviewer`, `security-reviewer` | Stage 2 Review |
41
- | `failure-triage` | 失败归因、owner 分类、Repair Queue | `build-error-resolver`, `failure-triage.md` | 测试、构建、视觉或 review 失败后 |
41
+ | `failure-triage` | 失败一级分类、owner 二级分类、Repair Queue | `build-error-resolver`, `failure-triage.md` | 测试、构建、视觉或 review 失败后 |
42
42
  | `repair-worker` | 按 finding 定点修复并复验 | 原开发 agent + `repair-one-finding.md` | 修复闭环 |
43
43
  | `docs-worker` | 文档、索引、使用指南、模板同步 | `doc-updater`, `update-docs` | 文档更新和交付归档 |
44
44
  | `security-reviewer` | 权限、认证、支付、密钥、敏感数据和 sandbox 风险 | `security-reviewer`, `security-review` | 高风险功能 |
@@ -86,7 +86,7 @@ trigger: always_on
86
86
 
87
87
  ## 子代理前置读取规则
88
88
 
89
- - 任何只读辅助子代理或 writer 子代理在开始判断前,必须先读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时改读 `.codex-harness/state/config.json` `packageRoot` 下的同路径文件)和本文件。
89
+ - 任何只读辅助子代理或 writer 子代理在开始判断前,必须先读 `AGENTS.md`、`docs/harness/task-session-strategy.md`(thin project 缺失时先读取 `.codex-harness/state/config.json`,再按文档类型改读 `packageRoot` 下模板镜像中的对应文件:`docs/harness/* -> docs/codex-harness-engineering/templates/docs/*`、`docs/testing/* -> docs/codex-harness-engineering/templates/testing/*`、`docs/knowledge/* -> docs/codex-harness-engineering/templates/knowledge/*`)和本文件。
90
90
  - 子代理必须再读取该角色对应的 `.agents/skills/*/SKILL.md`(如存在)、项目 truth source 和必要的深文档,再输出结论。
91
91
  - 如果当前轮次是被 stop hook / continuation gate 强制继续后的续跑,先重新阅读上面这些文档,再决定是否真的需要子代理。
92
92
  - 只读辅助子代理默认只读,不直接写业务代码,不修改 `task.json`、`progress.txt`、`traces/`。
@@ -8,6 +8,7 @@
8
8
  - 只写会改变 Agent 行为的项目特定信息;通用工程常识、formatter/linter 已覆盖的内容不要写。
9
9
  - 根 `AGENTS.md` 保持短入口,建议 60-120 行;细节放到 `docs/`、`rules/`、`specs/` 或测试文档,并在入口索引引用。
10
10
  - 根 `AGENTS.md` 只写全项目都成立的入口规则;目录独有的模块职责、边界、入口、测试命令、坑点和禁止事项,优先写进最接近该目录的子目录 `AGENTS.md`。
11
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须检查并更新最接近该目录的子目录 `AGENTS.md`;不要等 review 发现目录规则缺口后再补。
11
12
  - 如果项目同时维护模板源、镜像和运行时副本,先确认哪一份是 canonical;默认优先修改模板 canonical,再同步活跃副本,不要只修当前工作区现状。
12
13
  - 每条禁令必须给替代方案;不能说明替代方案的内容先写成风险或待确认项。
13
14
  - 可以自动检查的规则优先进入 lint、schema、hook、CI、verify 脚本,不只依赖文字提醒。
@@ -29,6 +30,7 @@
29
30
  | 测试入口 | test scripts、`tests/`、Playwright/Cypress/Pytest/Vitest 配置 |
30
31
  | 自动化检查 | linter、formatter、typecheck、CI、hooks |
31
32
  | 命名与业务词典 | `docs/harness/code-style-and-naming.md`、`docs/code-style.md`、接口 / 数据字典 |
33
+ | 目录级规则覆盖 | `owned_paths`、`docs/ai/repo-map.md`、现有子目录 `AGENTS.md`、模块入口文件 |
32
34
  | 私域知识 | 内部组件库、私有 API、特殊目录、历史迁移约束 |
33
35
  | Bad Case | 近期 review、bug 标签、trace、失败复盘、团队反复纠正事项 |
34
36
 
@@ -57,6 +59,7 @@
57
59
  - 真实入口:<启动、构建、测试、driver 或任务系统入口>
58
60
  - 代码地图:`<docs/ai/repo-map.md 或同类导航文件>`;需要理解模块位置时先读它,再进入具体目录。
59
61
  - 如果存在目录级 `AGENTS.md`:进入对应目录后同时遵守根规则和本地规则。
62
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须同步更新对应子目录 `AGENTS.md`。
60
63
  - 不要把 README 的业务介绍复制到这里;README 回答“项目是什么”,本文件回答“Agent 怎么改”。
61
64
 
62
65
  ## 模板与 Canonical
@@ -143,7 +146,7 @@
143
146
 
144
147
  ## 子目录 AGENTS.md 模板
145
148
 
146
- 只有 monorepo 或目录规则明显不同时才添加子目录 `AGENTS.md`。子目录规则应比根规则更具体。
149
+ 只有 monorepo 或目录规则明显不同时才添加子目录 `AGENTS.md`。一旦目录已具备独立模块职责、入口、测试命令或反复出现局部坑点,就不应继续把规则堆在根入口文件里。
147
150
 
148
151
  ````markdown
149
152
  # <path> AGENTS.md
@@ -152,6 +155,7 @@
152
155
 
153
156
  - 本文件只适用于 `<path>/` 下的改动。
154
157
  - 根 `AGENTS.md` 仍然有效;本文件只补充或收紧本目录规则。
158
+ - 如果存在 `<!-- BEGIN AUTO-MODULE-FACTS -->` 托管区块,它只维护动态事实;手写规则必须保留在托管区块外。
155
159
 
156
160
  ## 本目录约束
157
161
 
@@ -162,6 +166,7 @@
162
166
  - 修改前必须先看:<核心文件 / 规则 / 测试>
163
167
  - 测试命令:<目录级验证命令>
164
168
  - 常见复用对象:<组件 / hook / service / helper / fixture>
169
+ - 常见坑和禁止事项:<本目录专属坑点,以及对应替代方案>
165
170
 
166
171
  ## 决策表
167
172
 
@@ -204,6 +209,8 @@
204
209
  | 是否包含通用编码常识 | 删除 |
205
210
  | 是否缺少代码地图入口 | 新增 `docs/ai/repo-map.md` 或说明为什么项目太小不需要 |
206
211
  | 是否把目录级规则堆在根 AGENTS.md | 下沉到最接近适用范围的子目录 `AGENTS.md` |
212
+ | 是否新增了独立模块目录却没有子目录 `AGENTS.md` | 立即补齐,至少写职责、边界、入口、测试命令和局部禁止事项 |
213
+ | 子目录 `AGENTS.md` 是否只剩 `AUTO-MODULE-FACTS` 托管区块 | 补手写规则,不要把动态 facts 当成目录规则完成态 |
207
214
  | 是否没有说明 canonical | 补充模板源 / 活跃副本 / 运行时副本的优先级 |
208
215
  | 禁令是否没有替代方案 | 补替代方案或降级为风险 |
209
216
  | 是否引用不存在的命令或路径 | 修正或删除 |
@@ -26,12 +26,18 @@
26
26
  - 标准交接入口是 `tools/harness/templates/project-task-template.json`,首个任务固定为 `INIT-001`,用于锁定 spec 输入、任务依赖、验证矩阵、`execution.mode` 和 owned paths。
27
27
  - 如果 `task.json` 为空文件,先初始化为合法 JSON;如果仍是 smoke 模板或示例任务,先替换为当前项目真实任务。
28
28
  - 交互开发模式可以决定新增或更新哪些待办任务,但实际写入必须委派给 `harness-writer` 等匹配 writer。
29
+ - 未经用户明确同意,不得把标准模板 phase 压缩成更少任务;正式任务队列至少保留 `ANALYSIS-001`、`TESTCASE-001`、`PLAN-001`。
30
+ - 创建或重建任务队列时,必须根据 `owned_paths`、`docs/ai/repo-map.md` 和模块职责判断哪些目录需要局部规则;命中独立模块目录却缺少子目录 `AGENTS.md` 时,不得把该任务队列视为正式完成。
29
31
  - 任务进入 driver 前必须冻结交付语义:`scope`、`non_goals`、`entrypoints`、`inputs_outputs`、`failure_policy`、`rollback_strategy`、`state_surface`、`writeback_targets`。不适用字段必须写 `not_applicable`,不能留给实现会话猜。
30
32
  - 进入实现前,`docs/ai/CURRENT_TASK.md` 必须能回答本轮已完成内容、剩余问题、修改文件、测试结果、风险点和下一步,不允许只靠聊天记忆续跑。
33
+ - `ANALYSIS-001`、`TESTCASE-001`、`PLAN-001` 的 testing truth source 产物必须在生成最终 `task.json` 前补齐:`docs/testing/ACCEPTANCE_CRITERIA.md`、`docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`、`docs/testing/TRACEABILITY_MATRIX.md`、`docs/testing/TEST_DATA_MATRIX.md`、`docs/testing/REGRESSION_PLAN.md`、`docs/testing/verify-matrix.md`。缺任一项都不得进入正式任务队列。
31
34
  - 创建或重建任务队列时必须一次性补齐每个任务的完整交接字段:`requirement_ids`、`owned_paths`、`context_files`、`produces_artifacts`、`test_command`、`acceptance`、自然语言测试用例、测试数据、开发验证、最终验收验证、证据路径和 `qa_contract`。不得创建“先跑起来、后面再补测试/证据/整链路”的实现任务。
35
+ - 自动刷新出来的 `AUTO-MODULE-FACTS` 只能证明目录事实被收集,不代表目录级规则完整;如果模块目录只有托管 facts 而没有职责、边界、入口、测试或禁止事项等手写规则,应继续标记为待补齐,而不是当作完成态。
32
36
  - PRD / 需求文档完成后、进入实现前必须有自然语言测试用例阶段;每条 P0/P1 需求必须按 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md` 的需求类型覆盖矩阵满足最小用例数,并回溯到 Requirement ID、PRD 来源、Oracle、测试数据、证据路径和 TDD RED 预期失败。
33
37
  - 每个 `feature_impl` 任务必须声明两段验证:`development_validation` 用于编码过程中的 affected tests、单元 / 组件、局部 API、契约、类型检查或 lint;`acceptance_validation` 用于代码写完后从用户故事入口重新跑完整链路。
34
38
  - 每个 `feature_impl.qa_contract.tdd_contract.red.source_case_ids` 必须能回溯到 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`;缺少自然语言用例来源时不得进入实现阶段。
39
+ - 每个 `feature_impl.qa_contract.required_layers` 必须至少包含 `unit_or_component`、`contract_or_api`、`story_full_chain`、`affected_regression`;`tdd_contract` 必须同时包含 `red`、`green`、`refactor_guard`,且 `source_case_ids` 不得为空。
40
+ - 单个 `feature_impl` 默认不得覆盖超过 3 条主需求;订单、支付、库存、RBAC 必须拆成独立任务;前端和后端不得长期混在同一个 story,除非这是明确的 `release` 任务。只有用户明确批准时,才允许在任务中增加 `decomposition_exemption` 记录例外原因。
35
41
  - 不适合作为 TDD RED 的自然语言用例必须通过 `story_full_chain.source_case_ids`、`acceptance_validation.source_case_ids`、回归计划或 `verify-matrix` 进入验收链路;不得只保留在 PRD 或测试设计文档中。
36
42
  - 每个 `feature_impl` 的验收链路必须包含入口、动作、Oracle、副作用/无副作用证据、测试数据、失败态证据和 release 影响。单元测试、小范围 smoke、静态检查或 `git diff --check` 只能作为开发验证的一层,不能替代最终验收链路。
37
43
  - 后端、CLI、worker、数据同步和外部集成类 `feature_impl` 必须按 `static`、`unit`、`chain`、`failure`、`writeback` 五层声明验证;没有 UI 可见结果时,链路验证和失败验证不能省略。
@@ -121,6 +127,7 @@
121
127
  - 先收敛 truth source,再进入实现。
122
128
  - 大任务先拆成多个 `single` 任务,再交给 driver 顺序执行。
123
129
  - 当主控遇到文档、规则、任务队列、前端、后端或测试相关写入时,分别委派 `docs-worker`、`harness-writer`、`frontend-worker`、`backend-worker`、`test-runner` 等 writer 角色处理。
130
+ - 目录级规则变化优先落到最接近该目录的子目录 `AGENTS.md`;根 `AGENTS.md` 只保留全局入口规则。
124
131
  - 实现阶段可以使用子代理并行加速,但必须按 owned paths 或明确文件组拆分;如需并行写入,不允许多个角色同时写同一路径。
125
132
  - 每个 writer 子代理启动前必须声明允许修改、禁止修改、验收输出和验证命令;只读子代理只能返回结构化结论。
126
133
  - 子代理不得修改 `task.json`、`progress.txt`、`traces/` 或 Git 状态;主实现会话必须整合子代理输出并运行当前任务 `test_command`。
@@ -608,6 +608,57 @@ function Invoke-HarnessGovernanceCheck {
608
608
  }
609
609
  }
610
610
 
611
+ function Invoke-TaskStructureValidation {
612
+ param([string]$Root)
613
+
614
+ $scriptPath = Join-Path $Root "tools\harness\task-structure-lint.ps1"
615
+ if (-not (Test-Path -LiteralPath $scriptPath -PathType Leaf)) {
616
+ return [pscustomobject]@{
617
+ status = "fail"
618
+ findings = @([pscustomobject]@{
619
+ severity = "error"
620
+ code = "missing_task_structure_lint"
621
+ message = "缺少 task structure lint: tools\\harness\\task-structure-lint.ps1"
622
+ task_id = ""
623
+ field = "tools/harness/task-structure-lint.ps1"
624
+ })
625
+ }
626
+ }
627
+
628
+ try {
629
+ return (& powershell -NoProfile -ExecutionPolicy Bypass -File $scriptPath -ProjectRoot $Root -JsonOutput | ConvertFrom-Json)
630
+ }
631
+ catch {
632
+ return [pscustomobject]@{
633
+ status = "fail"
634
+ findings = @([pscustomobject]@{
635
+ severity = "error"
636
+ code = "task_structure_lint_failed"
637
+ message = "task structure lint 执行失败: $($_.Exception.Message)"
638
+ task_id = ""
639
+ field = "task.json"
640
+ })
641
+ }
642
+ }
643
+ }
644
+
645
+ function ConvertTo-TaskStructureFindingText {
646
+ param([object]$ValidationResult)
647
+
648
+ $lines = @()
649
+ foreach ($finding in @($ValidationResult.findings)) {
650
+ $taskLabel = if ([string]::IsNullOrWhiteSpace([string]$finding.task_id)) { "" } else { " task=$($finding.task_id)" }
651
+ $fieldLabel = if ([string]::IsNullOrWhiteSpace([string]$finding.field)) { "" } else { " field=$($finding.field)" }
652
+ $lines += "- [$($finding.severity)] $($finding.code)$taskLabel${fieldLabel}: $($finding.message)"
653
+ }
654
+
655
+ if ($lines.Count -eq 0) {
656
+ return "- (none)"
657
+ }
658
+
659
+ return ($lines -join "`n")
660
+ }
661
+
611
662
  function Block-WithState {
612
663
  param(
613
664
  [string]$Root,
@@ -759,16 +810,31 @@ Initialize task.json with a valid harness task queue, then rerun the driver or v
759
810
  "@
760
811
  }
761
812
 
762
- if ($tasks.Count -eq 0) {
763
- Block-WithState -Root $resolvedProjectRoot -EvidenceKey $evidenceKey -ReasonCode "task_queue_empty" -Reason @"
764
- Harness stop gate: task.json contains no tasks.
765
-
766
- Next action:
767
- Initialize a real harness task queue before ending the session.
768
- "@
769
- }
770
-
771
- $pendingCount = Get-PendingTaskCount -Tasks $tasks
813
+ if ($tasks.Count -eq 0) {
814
+ Block-WithState -Root $resolvedProjectRoot -EvidenceKey $evidenceKey -ReasonCode "task_queue_empty" -Reason @"
815
+ Harness stop gate: task.json contains no tasks.
816
+
817
+ Next action:
818
+ Initialize a real harness task queue before ending the session.
819
+ "@
820
+ }
821
+
822
+ $taskStructureResult = Invoke-TaskStructureValidation -Root $resolvedProjectRoot
823
+ if ([string]$taskStructureResult.status -eq "fail") {
824
+ $findingText = ConvertTo-TaskStructureFindingText -ValidationResult $taskStructureResult
825
+ Block-WithState -Root $resolvedProjectRoot -EvidenceKey $evidenceKey -ReasonCode "task_structure_invalid" -Reason @"
826
+ Harness stop gate: task.json 未通过结构门禁。
827
+
828
+ Findings:
829
+ $findingText
830
+
831
+ Next action:
832
+ 补齐缺失 phase、testing truth source、qa_contract、tdd_contract 或拆分过大的 feature_impl 后,再运行:
833
+ powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\harness\verify.ps1
834
+ "@
835
+ }
836
+
837
+ $pendingCount = Get-PendingTaskCount -Tasks $tasks
772
838
  if ($pendingCount -le 0) {
773
839
  Block-OnTraceEvidenceIfNeeded -Root $resolvedProjectRoot -EvidenceKey $evidenceKey -TraceInfo $latestTraceInfo
774
840
  Exit-Allow
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "runtime": {
3
- "driver": "powershell -NoProfile -ExecutionPolicy Bypass -File .\\tools\\harness\\tools/harness/codex-loop.ps1",
3
+ "driver": "powershell -NoProfile -ExecutionPolicy Bypass -File .\\tools\\harness\\codex-loop.ps1",
4
4
  "run_profile": ".codex\\task-run-profile.json"
5
5
  },
6
6
  "tasks": [
@@ -43,7 +43,7 @@
43
43
  "如有需要补齐 demo 资产",
44
44
  "运行 tools/harness/verify.ps1 验证 demo 闭环"
45
45
  ],
46
- "test_command": "powershell -NoProfile -ExecutionPolicy Bypass -File .\\tools\\harness\\tools/harness/verify.ps1",
46
+ "test_command": "powershell -NoProfile -ExecutionPolicy Bypass -File .\\tools\\harness\\verify.ps1",
47
47
  "acceptance": [
48
48
  "demo 目录同时具备 product、design、frontend architecture、dev-plan、contract、component、story、generated client",
49
49
  "tools/harness/verify.ps1 通过",
@@ -8,6 +8,7 @@
8
8
  - 只写会改变 Agent 行为的项目特定信息;通用工程常识、formatter/linter 已覆盖的内容不要写。
9
9
  - 根 `AGENTS.md` 保持短入口,建议 60-120 行;细节放到 `docs/`、`rules/`、`specs/` 或测试文档,并在入口索引引用。
10
10
  - 根 `AGENTS.md` 只写全项目都成立的入口规则;目录独有的模块职责、边界、入口、测试命令、坑点和禁止事项,优先写进最接近该目录的子目录 `AGENTS.md`。
11
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须检查并更新最接近该目录的子目录 `AGENTS.md`;不要等 review 发现目录规则缺口后再补。
11
12
  - 如果项目同时维护模板源、镜像和运行时副本,先确认哪一份是 canonical;默认优先修改模板 canonical,再同步活跃副本,不要只修当前工作区现状。
12
13
  - 每条禁令必须给替代方案;不能说明替代方案的内容先写成风险或待确认项。
13
14
  - 可以自动检查的规则优先进入 lint、schema、hook、CI、verify 脚本,不只依赖文字提醒。
@@ -28,9 +29,22 @@
28
29
  | 代码地图 | `docs/ai/repo-map.md`、`codemaps/*`、架构索引或模块清单 |
29
30
  | 测试入口 | test scripts、`tests/`、Playwright/Cypress/Pytest/Vitest 配置 |
30
31
  | 自动化检查 | linter、formatter、typecheck、CI、hooks |
32
+ | 命名与业务词典 | `docs/harness/code-style-and-naming.md`、`docs/code-style.md`、接口 / 数据字典 |
33
+ | 目录级规则覆盖 | `owned_paths`、`docs/ai/repo-map.md`、现有子目录 `AGENTS.md`、模块入口文件 |
31
34
  | 私域知识 | 内部组件库、私有 API、特殊目录、历史迁移约束 |
32
35
  | Bad Case | 近期 review、bug 标签、trace、失败复盘、团队反复纠正事项 |
33
36
 
37
+ 最小核心文档集建议至少覆盖:
38
+
39
+ - `AGENTS.md`
40
+ - `README.md`
41
+ - `docs/architecture.md`
42
+ - `docs/code-style.md`
43
+ - `docs/api-convention.md`
44
+ - `docs/component-map.md`
45
+ - `docs/test-strategy.md`
46
+ - `docs/current-task.md`
47
+
34
48
  ## 根 AGENTS.md 模板
35
49
 
36
50
  ```markdown
@@ -45,6 +59,7 @@
45
59
  - 真实入口:<启动、构建、测试、driver 或任务系统入口>
46
60
  - 代码地图:`<docs/ai/repo-map.md 或同类导航文件>`;需要理解模块位置时先读它,再进入具体目录。
47
61
  - 如果存在目录级 `AGENTS.md`:进入对应目录后同时遵守根规则和本地规则。
62
+ - 新增业务目录、模块职责变化、目录入口变化、目录级测试命令变化时,必须同步更新对应子目录 `AGENTS.md`。
48
63
  - 不要把 README 的业务介绍复制到这里;README 回答“项目是什么”,本文件回答“Agent 怎么改”。
49
64
 
50
65
  ## 模板与 Canonical
@@ -71,12 +86,40 @@
71
86
  | <例如状态管理> | `<existing-pattern>` | <不要引入的新库> |
72
87
  | <例如数据访问> | `<repository/service>` | <不要跨层调用> |
73
88
 
89
+ 常见可直接复用的规则样板:
90
+
91
+ ```text
92
+ 前端:
93
+ - 页面只负责展示和组合
94
+ - 业务逻辑放 hooks
95
+ - 接口请求放 services
96
+ - 类型放 types
97
+ - 常量放 constants
98
+ - 公共组件放 components/common
99
+
100
+ 后端:
101
+ - Controller 只处理请求和响应
102
+ - Service 处理业务逻辑
103
+ - Repository/DAO 处理数据库
104
+ - DTO 处理输入输出结构
105
+ ```
106
+
74
107
  ## 项目硬约束
75
108
 
76
109
  - <CRITICAL 规则 1>;替代方案:<明确可执行做法>。
77
110
  - <CRITICAL 规则 2>;替代方案:<明确可执行做法>。
78
111
  - <安全 / 数据 / 权限 / 迁移 / 发布红线>;替代方案:<明确可执行做法>。
79
112
 
113
+ 常见禁止事项样板:
114
+
115
+ ```text
116
+ - 禁止在页面组件中直接请求接口;替代方案:统一走 services / API client。
117
+ - 禁止重复封装 axios/fetch;替代方案:复用现有 HTTP client。
118
+ - 禁止在公共组件里写业务逻辑;替代方案:把业务逻辑下沉到 feature 或 hooks。
119
+ - 禁止绕过权限系统;替代方案:复用既有权限入口或 policy。
120
+ - 禁止新增 utils2、common2、helper2 这类目录;替代方案:放回既有模块或补目录级规则后再新增。
121
+ ```
122
+
80
123
  ## 测试与完成定义
81
124
 
82
125
  - 修改 <模块/路径> 后至少运行 `<command>`。
@@ -94,6 +137,7 @@
94
137
 
95
138
  - 架构:`<docs/architecture.md>`
96
139
  - 代码地图:`<docs/ai/repo-map.md>`
140
+ - 代码风格 / 命名:`<docs/harness/code-style-and-naming.md 或 docs/code-style.md>`
97
141
  - API / 契约:`<docs/api.md>`
98
142
  - 测试策略:`<docs/testing.md>`
99
143
  - 部署 / 运维:`<docs/deploy.md>`
@@ -102,7 +146,7 @@
102
146
 
103
147
  ## 子目录 AGENTS.md 模板
104
148
 
105
- 只有 monorepo 或目录规则明显不同时才添加子目录 `AGENTS.md`。子目录规则应比根规则更具体。
149
+ 只有 monorepo 或目录规则明显不同时才添加子目录 `AGENTS.md`。一旦目录已具备独立模块职责、入口、测试命令或反复出现局部坑点,就不应继续把规则堆在根入口文件里。
106
150
 
107
151
  ````markdown
108
152
  # <path> AGENTS.md
@@ -111,6 +155,7 @@
111
155
 
112
156
  - 本文件只适用于 `<path>/` 下的改动。
113
157
  - 根 `AGENTS.md` 仍然有效;本文件只补充或收紧本目录规则。
158
+ - 如果存在 `<!-- BEGIN AUTO-MODULE-FACTS -->` 托管区块,它只维护动态事实;手写规则必须保留在托管区块外。
114
159
 
115
160
  ## 本目录约束
116
161
 
@@ -120,12 +165,15 @@
120
165
  - 入口文件:<真实入口>
121
166
  - 修改前必须先看:<核心文件 / 规则 / 测试>
122
167
  - 测试命令:<目录级验证命令>
168
+ - 常见复用对象:<组件 / hook / service / helper / fixture>
169
+ - 常见坑和禁止事项:<本目录专属坑点,以及对应替代方案>
123
170
 
124
171
  ## 决策表
125
172
 
126
173
  | 场景 | 应使用 | 不要使用 |
127
174
  | --- | --- | --- |
128
175
  | <场景> | <本目录模式> | <禁止做法> |
176
+ | 复用同类能力 | <已有组件 / hook / service / helper> | <重复新建一套实现> |
129
177
 
130
178
  ## 代码示例
131
179
 
@@ -161,6 +209,8 @@
161
209
  | 是否包含通用编码常识 | 删除 |
162
210
  | 是否缺少代码地图入口 | 新增 `docs/ai/repo-map.md` 或说明为什么项目太小不需要 |
163
211
  | 是否把目录级规则堆在根 AGENTS.md | 下沉到最接近适用范围的子目录 `AGENTS.md` |
212
+ | 是否新增了独立模块目录却没有子目录 `AGENTS.md` | 立即补齐,至少写职责、边界、入口、测试命令和局部禁止事项 |
213
+ | 子目录 `AGENTS.md` 是否只剩 `AUTO-MODULE-FACTS` 托管区块 | 补手写规则,不要把动态 facts 当成目录规则完成态 |
164
214
  | 是否没有说明 canonical | 补充模板源 / 活跃副本 / 运行时副本的优先级 |
165
215
  | 禁令是否没有替代方案 | 补替代方案或降级为风险 |
166
216
  | 是否引用不存在的命令或路径 | 修正或删除 |