@event4u/agent-config 14.20.0 → 14.22.0

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 (242) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +441 -0
  5. package/CREDITS.md +37 -0
  6. package/README.md +1 -1
  7. package/agents/templates/.ai-council.yml.example +10 -0
  8. package/dist/agent-src/commands/analyze/inbox.md +381 -6
  9. package/dist/agent-src/commands/analyze/{reference-repo.md → repo.md} +251 -34
  10. package/dist/agent-src/commands/analyze/roadmap-repos.md +129 -0
  11. package/dist/agent-src/commands/analyze.md +12 -7
  12. package/dist/agent-src/commands/feature/plan.md +55 -16
  13. package/dist/agent-src/commands/feature/refactor.md +8 -3
  14. package/dist/agent-src/commands/humanize.md +48 -4
  15. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +69 -0
  16. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -5
  17. package/dist/agent-src/contexts/execution/contract-decision-sheet.md +22 -1
  18. package/dist/agent-src/contexts/execution/host-capability-manifest.md +4 -1
  19. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +35 -2
  20. package/dist/agent-src/contexts/execution/terminal-states.md +4 -1
  21. package/dist/agent-src/rules/evaluator-independence.md +4 -4
  22. package/dist/agent-src/rules/external-code-graph-interop.md +19 -14
  23. package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
  24. package/dist/agent-src/rules/token-efficiency.md +26 -3
  25. package/dist/agent-src/scripts/_cli_entry.ts +51 -0
  26. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +14 -23
  27. package/dist/agent-src/scripts/roadmap_gates.ts +4 -20
  28. package/dist/agent-src/scripts/roadmap_set_step.ts +5 -2
  29. package/dist/agent-src/scripts/stubs_due.ts +4 -18
  30. package/dist/agent-src/scripts/update_roadmap_progress.ts +7 -24
  31. package/dist/agent-src/skills/code-intelligence/SKILL.md +25 -0
  32. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  33. package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +27 -11
  34. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +1 -1
  35. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  36. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  37. package/dist/agent-src/skills/roadmap-writing/SKILL.md +17 -0
  38. package/dist/agent-src/skills/technical-specification/SKILL.md +4 -0
  39. package/dist/agent-src/templates/agent-settings.md +0 -1
  40. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  41. package/dist/agent-src/templates/features.md +5 -0
  42. package/dist/agent-src/templates/roadmaps.md +15 -0
  43. package/dist/cli-delegate/_cli_entry.js +8 -0
  44. package/dist/cli-delegate/_lib/pin_resolver.js +170 -0
  45. package/dist/cli-delegate/archival_sweep.js +8 -0
  46. package/dist/cli-delegate/archive_completed_roadmaps.js +494 -0
  47. package/dist/cli-delegate/check_update_banner.js +923 -0
  48. package/dist/cli-delegate/{chunk-KPBWFOPZ.js → chunk-2FTMENJL.js} +194 -37
  49. package/dist/cli-delegate/{chunk-PI2GU3DP.js → chunk-2TAQ2K4V.js} +4 -1
  50. package/dist/cli-delegate/chunk-5EK5WQN6.js +28 -0
  51. package/dist/cli-delegate/chunk-7XGD2OEU.js +96 -0
  52. package/dist/cli-delegate/{chunk-C6IPZRDA.js → chunk-BIXEDQPZ.js} +7 -1
  53. package/dist/cli-delegate/chunk-DBH4AHDK.js +155 -0
  54. package/dist/cli-delegate/{chunk-NUMQHLS5.js → chunk-J3RFNKG4.js} +21 -2
  55. package/dist/cli-delegate/chunk-JO25G5H7.js +20 -0
  56. package/dist/cli-delegate/chunk-LTYVIY76.js +7961 -0
  57. package/dist/cli-delegate/chunk-QAJS5YWY.js +999 -0
  58. package/dist/cli-delegate/{chunk-ZVBOHSVF.js → chunk-TGIPZBCW.js} +1 -1
  59. package/dist/cli-delegate/{chunk-YS6XTLEK.js → chunk-TYSY33MD.js} +56 -6
  60. package/dist/cli-delegate/chunk-ULET4BYS.js +328 -0
  61. package/dist/cli-delegate/chunk-YDQSHTD7.js +187 -0
  62. package/dist/cli-delegate/chunk-YWVXLR44.js +48 -0
  63. package/dist/cli-delegate/chunk-ZZQBUHFK.js +273 -0
  64. package/dist/cli-delegate/cmd_conformance.js +19 -5
  65. package/dist/cli-delegate/cmd_doctor.js +3 -3
  66. package/dist/cli-delegate/cmd_export.js +2 -2
  67. package/dist/cli-delegate/cmd_handoff.js +27 -3
  68. package/dist/cli-delegate/cmd_prune.js +2 -2
  69. package/dist/cli-delegate/cmd_session_recycle.js +2 -2
  70. package/dist/cli-delegate/cmd_settings_migrate.js +2 -2
  71. package/dist/cli-delegate/cmd_sync.js +2 -2
  72. package/dist/cli-delegate/cmd_uninstall.js +2 -2
  73. package/dist/cli-delegate/cmd_validate.js +2 -2
  74. package/dist/cli-delegate/dashboard_mode.js +16 -0
  75. package/dist/cli-delegate/gate_budget.js +24 -0
  76. package/dist/cli-delegate/gate_execute.js +25 -0
  77. package/dist/cli-delegate/guarded_baseline.js +18 -0
  78. package/dist/cli-delegate/resume_probe.js +22 -0
  79. package/dist/cli-delegate/roadmap_gates.js +638 -0
  80. package/dist/cli-delegate/roadmap_set_step.js +173 -0
  81. package/dist/cli-delegate/stub_queue.js +47 -0
  82. package/dist/cli-delegate/stubs_due.js +38 -0
  83. package/dist/cli-delegate/ticket_bundles.js +59 -0
  84. package/dist/cli-delegate/update_roadmap_progress.js +60 -0
  85. package/dist/discovery/deprecation-report.md +1 -1
  86. package/dist/discovery/discovery-manifest.json +60 -29
  87. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  88. package/dist/discovery/discovery-manifest.summary.md +3 -3
  89. package/dist/discovery/dormancy-report.md +1 -1
  90. package/dist/discovery/orphan-report.md +1 -1
  91. package/dist/discovery/packs.json +7 -6
  92. package/dist/discovery/trust-report.md +2 -2
  93. package/dist/discovery/workspaces.json +6 -5
  94. package/dist/hooks/dispatch.js +1522 -1008
  95. package/dist/install/claudeLayerCarriage.js +237 -0
  96. package/dist/install/claudePathsPlan.js +79 -0
  97. package/dist/install/hostLayerFingerprint.js +1 -1
  98. package/dist/install/install.mjs +10 -1
  99. package/dist/install/partitionEligibility.js +231 -117
  100. package/dist/install/ruleLayerPartition.js +10 -7
  101. package/dist/mcp/registry-manifest.json +3 -3
  102. package/dist/mcp/server.json +2 -2
  103. package/dist/mcp/server.mjs +39376 -38902
  104. package/dist/scripts/ai_council/content_ceiling.js +63 -0
  105. package/dist/scripts/ai_council/seat_policy.js +106 -0
  106. package/dist/scripts/ai_council/transport_resolver.js +21 -0
  107. package/dist/scripts/condense.js +32 -25
  108. package/docs/MIGRATION.md +49 -1
  109. package/docs/contracts/settings-classes.md +1 -1
  110. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +73 -0
  111. package/llms.txt +14 -14
  112. package/package.json +7 -4
  113. package/src/agent-src/scripts/_cli_entry.ts +51 -0
  114. package/src/agent-src/scripts/archive_completed_roadmaps.ts +14 -23
  115. package/src/agent-src/scripts/roadmap_gates.ts +4 -20
  116. package/src/agent-src/scripts/roadmap_set_step.ts +5 -2
  117. package/src/agent-src/scripts/stubs_due.ts +4 -18
  118. package/src/agent-src/scripts/update_roadmap_progress.ts +7 -24
  119. package/src/config/continuity-surface.json +509 -0
  120. package/src/config/estate-count-budget.json +1 -1
  121. package/src/config/gate-coverage.yml +29 -8
  122. package/src/config/gate-violation-baselines.json +8 -8
  123. package/src/config/gitignore-block.txt +19 -0
  124. package/src/config/host-injection-effect.json +73 -0
  125. package/src/config/packed-binary-manifest.json +33 -0
  126. package/src/config/preamble-payload-budget.json +112 -105
  127. package/src/config/publish-surface.json +4 -2
  128. package/src/config/release-gate-locality.yml +4 -3
  129. package/src/install/claudeLayerCarriage.ts +273 -0
  130. package/src/install/claudePathsPlan.ts +76 -0
  131. package/src/install/hostLayerFingerprint.ts +1 -1
  132. package/src/install/partitionEligibility.ts +261 -127
  133. package/src/install/ruleLayerPartition.ts +19 -23
  134. package/src/scripts/_dispatch.bash +77 -27
  135. package/src/scripts/_lib/auto_dispatch.ts +2 -2
  136. package/src/scripts/_lib/blocked_by_marker.ts +189 -0
  137. package/src/scripts/_lib/catalogue_layer_parity.ts +146 -0
  138. package/src/scripts/_lib/continuity_surface.ts +296 -0
  139. package/src/scripts/_lib/corpus_manifest.ts +26 -9
  140. package/src/scripts/_lib/hook_settings.ts +1 -1
  141. package/src/scripts/_lib/host_capability.ts +38 -1
  142. package/src/scripts/_lib/injection_effect.ts +151 -0
  143. package/src/scripts/_lib/layer_overlap_notice.ts +50 -6
  144. package/src/scripts/_lib/packed_binary_predicate.ts +225 -0
  145. package/src/scripts/_lib/pin_resolver.ts +13 -0
  146. package/src/scripts/_lib/regression_neighbourhood.ts +1 -1
  147. package/src/scripts/_lib/release_highlights.ts +19 -211
  148. package/src/scripts/_lib/release_material.ts +27 -77
  149. package/src/scripts/_lib/retired_status.ts +74 -0
  150. package/src/scripts/_lib/skill_catalogue.ts +156 -21
  151. package/src/scripts/_lib/structured_ask.ts +117 -0
  152. package/src/scripts/_lib/subagent_capsule.ts +117 -8
  153. package/src/scripts/_lib/tty_prompt.ts +76 -0
  154. package/src/scripts/ai_council/api_transport.ts +168 -0
  155. package/src/scripts/ai_council/clients.ts +58 -63
  156. package/src/scripts/ai_council/config.ts +13 -0
  157. package/src/scripts/ai_council/content_ceiling.ts +79 -0
  158. package/src/scripts/ai_council/deliberation_metrics.ts +353 -0
  159. package/src/scripts/ai_council/jury_aggregate.ts +178 -0
  160. package/src/scripts/ai_council/prompts.ts +9 -0
  161. package/src/scripts/ai_council/seat_policy.ts +137 -0
  162. package/src/scripts/ai_council/status_surface.ts +79 -0
  163. package/src/scripts/ai_council/synthesis_disagreement.ts +206 -0
  164. package/src/scripts/ai_council/transport_resolver.ts +59 -1
  165. package/src/scripts/ai_tells_rules.ts +446 -5
  166. package/src/scripts/ask_block_census.ts +499 -0
  167. package/src/scripts/bench_humanizer_eval.ts +264 -40
  168. package/src/scripts/bench_prose_tells_fp.ts +198 -0
  169. package/src/scripts/capture_skill_catalogue.ts +24 -11
  170. package/src/scripts/check_branch_work_committed.ts +234 -0
  171. package/src/scripts/check_candidate_lines.ts +499 -0
  172. package/src/scripts/check_continuity_surface.ts +475 -0
  173. package/src/scripts/check_dependency_floors.ts +13 -6
  174. package/src/scripts/check_estate_count.ts +40 -79
  175. package/src/scripts/check_pack_size.ts +263 -24
  176. package/src/scripts/check_release_highlights.ts +0 -157
  177. package/src/scripts/check_roadmap_trackable.ts +19 -16
  178. package/src/scripts/check_rule_layer_partition.ts +54 -34
  179. package/src/scripts/check_single_delivery.ts +97 -31
  180. package/src/scripts/check_update_banner.ts +13 -0
  181. package/src/scripts/code_graph/build.ts +138 -15
  182. package/src/scripts/code_graph/cli.ts +76 -8
  183. package/src/scripts/code_graph/extract.ts +11 -0
  184. package/src/scripts/code_graph/grammar_probe.ts +43 -0
  185. package/src/scripts/code_graph/loader.ts +88 -14
  186. package/src/scripts/code_graph/query.ts +121 -11
  187. package/src/scripts/code_graph/resolution_tiers.ts +238 -0
  188. package/src/scripts/code_graph/sqlite_store.ts +247 -6
  189. package/src/scripts/code_graph/types.ts +66 -1
  190. package/src/scripts/code_graph/validate.ts +23 -0
  191. package/src/scripts/condense.ts +34 -22
  192. package/src/scripts/corpus_manifest.ts +5 -5
  193. package/src/scripts/council_cli.ts +29 -39
  194. package/src/scripts/count_intent_disagreement.ts +426 -0
  195. package/src/scripts/detect_ai_tells.ts +142 -20
  196. package/src/scripts/handoff_context_hook.ts +79 -0
  197. package/src/scripts/harvest_reference_tokens.ts +698 -0
  198. package/src/scripts/hook_effect_doctor.ts +82 -1
  199. package/src/scripts/hook_manifest.json +1 -1
  200. package/src/scripts/hook_manifest.yaml +94 -12
  201. package/src/scripts/hooks/chain_nudge_hook.ts +282 -0
  202. package/src/scripts/hooks/code_graph_context_hook.ts +212 -0
  203. package/src/scripts/hooks/concern_registry.ts +6 -2
  204. package/src/scripts/hooks/delegation_nudge_hook.ts +45 -1
  205. package/src/scripts/hooks/host_semantics.ts +1 -1
  206. package/src/scripts/hooks/one_question_per_ask_hook.ts +191 -0
  207. package/src/scripts/hooks/orchestration_record_hook.ts +2 -2
  208. package/src/scripts/hooks/rule_inject_hook.ts +1 -1
  209. package/src/scripts/hooks/skill_route_hook.ts +11 -4
  210. package/src/scripts/inbox_source_census.ts +322 -0
  211. package/src/scripts/install-hooks.sh +134 -0
  212. package/src/scripts/{lint_carrier_integrity.ts → lint_deferral_integrity.ts} +60 -214
  213. package/src/scripts/lint_plan_risk_register.ts +13 -17
  214. package/src/scripts/lint_roadmap_blockers.ts +51 -1
  215. package/src/scripts/mcp_server/suggest_skill.ts +72 -0
  216. package/src/scripts/mcp_server/tools.ts +2 -56
  217. package/src/scripts/media/lib/adapter-contract.md +7 -2
  218. package/src/scripts/media/lib/fixtures/flux/asset-0001.png +0 -0
  219. package/src/scripts/media/lib/fixtures/gemini-image/asset-0001.png +0 -0
  220. package/src/scripts/media/lib/fixtures/ideogram/asset-0001.png +0 -0
  221. package/src/scripts/migrate_command_suggestions.ts +1 -1
  222. package/src/scripts/probe_unblocked_ask.ts +135 -2
  223. package/src/scripts/rdp_candidates_delta.ts +276 -0
  224. package/src/scripts/rdp_quality_eval.ts +217 -19
  225. package/src/scripts/release.ts +26 -71
  226. package/src/scripts/release_drill.ts +6 -10
  227. package/src/scripts/release_env.ts +1 -0
  228. package/src/scripts/release_mix_taxonomy.json +3 -2
  229. package/src/scripts/release_publication.ts +34 -29
  230. package/src/scripts/report_host_injection_effect.ts +189 -0
  231. package/src/scripts/report_layer_overlap.ts +41 -0
  232. package/src/scripts/report_skill_menu_census.ts +341 -0
  233. package/src/scripts/self_review_gate.ts +409 -15
  234. package/src/scripts/skill_tools/score_skill_relevance.ts +70 -6
  235. package/src/scripts/skill_tools/suggest_skill_for_task.ts +37 -3
  236. package/src/vendor/grammars/README.md +61 -0
  237. package/src/vendor/grammars/tree-sitter-javascript.wasm +0 -0
  238. package/src/vendor/grammars/tree-sitter-php.wasm +0 -0
  239. package/src/vendor/grammars/tree-sitter-typescript.wasm +0 -0
  240. package/src/scripts/_lib/carrier_status.ts +0 -118
  241. package/src/scripts/_lib/estate_carrier_cases.ts +0 -72
  242. package/src/scripts/hooks/code_graph_nudge_hook.ts +0 -191
@@ -1,13 +1,20 @@
1
1
  ---
2
2
  model_tier: high
3
- name: analyze-reference-repo
3
+ name: analyze-repo
4
4
  pack: analysis-workbench
5
5
  visibility: internal
6
- sub: reference-repo
6
+ sub: repo
7
7
  cluster: analyze
8
+ replaces: [analyze-reference-repo, analyze:reference-repo]
8
9
  skills: [project-analyzer, learning-to-rule-or-skill]
9
10
  description: Analyze an external reference repository (competitor, inspiration, peer) and produce a structured comparison + adoption plan for this project.
10
- argument-hint: "<repo-url | owner/repo | archive-url> [--focus=<area>] [--deep] [--no-roadmap]"
11
+ argument-hint: "<repo-url|owner/repo|archive> [--mode=plan|execute] [--loops=N] [--focus=<area>] [--deep] [--refresh] [--no-roadmap]"
12
+ limits:
13
+ mode_default: plan
14
+ max_iterations: 3
15
+ hard_ceiling: 5
16
+ no_gain_stop: 2
17
+ target_metric: required
11
18
  suggestion:
12
19
  eligible: false
13
20
  rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
@@ -17,7 +24,7 @@ packs:
17
24
  - meta
18
25
  ---
19
26
 
20
- # analyze-reference-repo
27
+ # analyze-repo
21
28
 
22
29
  Analyze a **different** repository (a competitor, a reference implementation, or
23
30
  a project the user admires) and produce a structured document that anchors on
@@ -35,26 +42,83 @@ The user provides a repository URL — a full GitHub URL
35
42
 
36
43
  Optional arguments:
37
44
 
45
+ - `--mode=plan|execute` — `plan` is the **default** (§ Enforced limits).
46
+ - `--loops=N` — refinement-loop budget. **Default: 3**; hard ceiling 5.
38
47
  - `--focus=<area>` — restrict analysis to one axis (e.g. `installer`,
39
48
  `skills`, `mcp`, `governance`, `ci`). Default: full-surface.
49
+ - `--refresh` — re-resolve the reference's head revision (§ 2a). Without it a
50
+ re-run reads the revision already pinned in the local manifest.
40
51
  - `--deep` — bounded deep-verification tier (§ 2b). Read-only clone at a pinned
41
52
  SHA, never executed. Requires a non-empty anchor table.
42
53
  - `--no-roadmap` — skip the roadmap-draft step.
43
54
 
55
+ ## Enforced limits
56
+
57
+ The frontmatter `limits:` block is the machine-readable pin
58
+ (`tests/scripts/analyze_repo_limits.test.ts` fails when flow and pin drift);
59
+ the steps below are the enforcement — each limit is a step the run MUST
60
+ execute, not advice.
61
+
62
+ ### Execution mode — plan-only default (`mode_default: plan`)
63
+
64
+ `--mode=plan` is the **default**: run §§ 1-6 — pin, fetch, extract, probe,
65
+ compare, classify, converge, write the local artifacts — then present the
66
+ result and STOP. No roadmap landing, no ledger rows, no tracked write of any
67
+ kind. `--mode=execute` must be **explicitly present in the invocation** to
68
+ reach §§ 7-8; treat its absence as plan mode even when conversation momentum
69
+ suggests otherwise. Execute mode does not remove the per-write confirmations in
70
+ §§ 7-8 — it only makes them reachable.
71
+
72
+ ### Pre-registered target metric — required before loop 1 (`target_metric: required`)
73
+
74
+ Before loop 1 may run, the analysis document MUST carry a `Target metric` line
75
+ naming the metric of § 5c, its **measured baseline** taken from the seed pass,
76
+ and the predicted direction. No baseline → REFUSE to enter loop 1 with:
77
+ `target metric not pre-registered — record the seed-pass baseline first`. The
78
+ metric named before loop 1 is the metric every loop is scored against; loops
79
+ never move the goalposts.
80
+
81
+ ### Loop budget (`max_iterations: 3`, `hard_ceiling: 5`)
82
+
83
+ `--loops=N` caps the refinement loops. **Default: 3** — one loop per lens
84
+ (§ 5b), which is what makes three the budget rather than a round number.
85
+ Hard ceiling: 5 — a larger `--loops` value is clamped to 5 with a warning.
86
+
87
+ **Halt-on-spin tripwire (`no_gain_stop: 2`), checked after every loop and
88
+ overriding the budget:**
89
+
90
+ - **Two consecutive zero-delta loops → STOP** before the next lens runs, and
91
+ say which two loops produced no delta and on which metric. Spinning without
92
+ gain is the failure the metric exists to catch.
93
+ - A verdict table still contested at the ceiling stops the run with a
94
+ maintainer question (§ 5b) — never silently.
95
+ - A single zero-delta loop **never** cancels the remaining lenses. It is a
96
+ signal about that lens, not a prediction about the next one.
97
+
98
+ ### Read ceiling per loop
99
+
100
+ Loop *n* cannot read deeper than the seed pass without a local clone, so
101
+ `--deep` (§ 2b) becomes the **default whenever the loop runs**. The three-part
102
+ read ceiling of § 2b applies per loop, and the loop that hits it logs one
103
+ read-ceiling line naming the bound that fired.
104
+
44
105
  ## Steps
45
106
 
46
- ### 1. Confirm scope
107
+ ### 1. Resolve scope from the invocation — do not ask
47
108
 
48
- Before touching anything, ask:
109
+ Scope comes from the arguments, never from a prompt. A bare repository argument
110
+ means **full scope**; `--focus=<area>` means focused. **Ask nothing before the
111
+ first fetch.** The four-option menu this step used to open with cost one prompt
112
+ per repository in a batch, which is a prompt the invocation had already
113
+ answered.
49
114
 
50
- > Found reference: `<owner/repo>`.
51
- >
52
- > 1. Full comparison — all axes (default)
53
- > 2. Focused — one axis (I'll ask which)
54
- > 3. Quick scan — README + top-level layout only
55
- > 4. Cancel
115
+ The one question that survives is an **unresolvable repository identity** — the
116
+ argument matches no repository, or matches more than one. That is a genuine
117
+ ambiguity the invocation did not settle, and it halts before any fetch.
56
118
 
57
- Wait for the user's choice.
119
+ Everything the menu's "Cancel" option protected is protected elsewhere: the
120
+ write-acts of §§ 7-8 keep their own confirmations, and plan mode (§ Enforced
121
+ limits) is the default, so a run that is never confirmed writes nothing tracked.
58
122
 
59
123
  ### 1b. Anchor table first
60
124
 
@@ -81,6 +145,26 @@ Use `web-fetch` for rendered files, GitHub REST (`/repos/{o}/{r}/contents/{p}`)
81
145
  for listings. **Max 40 fetches** — if more is needed, ask which subtree to
82
146
  expand.
83
147
 
148
+ ### 2a. Pin the upstream revision — once, before any reasoning
149
+
150
+ The **seed pass** resolves the reference's head revision exactly once and
151
+ records it in the local manifest (§ 6). Every loop of § 5b reads **that same
152
+ revision**. Only `--refresh` re-resolves it.
153
+
154
+ Why once: a loop that re-resolves is comparing two different repositories and
155
+ calling the difference a finding. Convergence over a moving target is not
156
+ convergence, and a delta produced by an upstream commit that landed between
157
+ loop 1 and loop 2 is upstream's news, not this analysis's.
158
+
159
+ Record in the iteration record, once per pass: `revision: <sha>` — the **same**
160
+ value on every pass of a run. A pass whose recorded revision differs from the
161
+ seed pass's is a defect in the run, not a finding about the reference.
162
+
163
+ Because loop *n* cannot read deeper than the seed pass without a local clone,
164
+ `--deep` (§ 2b) is the default whenever the loop runs. Each loop that hits the
165
+ § 2b three-part read ceiling logs **one** read-ceiling line naming the bound
166
+ that fired and the loop it fired in.
167
+
84
168
  ### 2b. Deep verification tier — `--deep`, opt-in
85
169
 
86
170
  Forty top-level fetches cannot reach a fact buried in an implementation file, so
@@ -170,8 +254,10 @@ exceptions; unanchored discoveries stay allowed but land in the
170
254
 
171
255
  **Bound-claim collision gate.** For every ADOPT/ADAPT row, extract the
172
256
  **concrete surface identifier** it would touch — file path, config key, schema
173
- field, settings key — and match it against the `consequence` field of every
174
- `docs/CLAIMS.md` entry. On a hit the row cites the claim id and either routes
257
+ field, settings key — and match it against the `claim` and `non_inference`
258
+ fields of every `docs/CLAIMS.md` entry; the ledger's entry schema has no
259
+ `consequence` field, so a probe looking for one finds nothing and reports no
260
+ collision. On a hit the row cites the claim id and either routes
175
261
  through that claim's own reopen / amendment clause, saying so, or is
176
262
  reclassified REJECT. A shared topic word is **not** a collision: matching
177
263
  identifiers rather than prose is what stops this firing on every row that
@@ -179,38 +265,111 @@ mentions a ledger word — a check that mostly fires wrongly gets waved through.
179
265
  A **checklist obligation**, not a CI gate: `check_claims` guards the ledger's
180
266
  integrity, never a proposal against it.
181
267
 
182
- ### 5b. Converge the verdict table
268
+ ### 5b. Three loops, three different questions
269
+
270
+ One pass is a draft, not an analysis — but three passes asking the same
271
+ question are three rewordings, which costs three times the fetches and produces
272
+ prose churn. So the loops are **not** repetitions of one critique. Each has its
273
+ own lens, and the lens is what makes the loop worth its cost:
274
+
275
+ | Loop | Lens | The question it asks, and only it |
276
+ |---|---|---|
277
+ | 1 | **Coverage** | What was missed? What was wrongly marked absent? Which rows rest on a weak anchor — no `file:line`, or one that no longer resolves? |
278
+ | 2 | **Adversary** | Was the *form* copied instead of the principle? Is this only *different* rather than *better*? Does this package already solve it elsewhere? What does it cost in tokens, surface and maintenance? |
279
+ | 3 | **Convergence** | Resolve contradictions between the first two. Fold duplicates. Cut the speculative. Bind every remaining line to evidence on **both** sides. |
280
+
281
+ Each loop takes as input **both** the previous analysis **and** the previous
282
+ roadmap draft — a finding that changed the analysis but not the roadmap is a
283
+ finding the run has not finished acting on.
284
+
285
+ Each loop appends its own **delta block** to `## Iteration record`, naming its
286
+ lens, with one row per change and a reason per row:
287
+
288
+ ```markdown
289
+ ### Loop {n} — {Coverage | Adversary | Convergence} · revision: {sha}
290
+
291
+ | Change | Row | From → To | Reason |
292
+ |---|---|---|---|
293
+ | added / removed / flipped / folded | … | … | … |
294
+ ```
183
295
 
184
- One pass is a draft, not an analysis. Critique the verdict table at least
185
- **twice**: pass 2 applies solution-minimalism and the § 5 bound-claim gate to
186
- pass 1's ADOPT rows, using the § 3b probe findings as input. Record every flip
187
- with its reason in `## Iteration record`. **DONE** = a pass produces **zero**
188
- verdict changes. Cap at four passes; a table still flipping at four is itself
189
- the finding — mark it `contested — needs maintainer judgement`, never stop
296
+ **A loop whose delta block has no added, removed, flipped or folded entry is
297
+ recorded as a zero-delta loop, never omitted.** An omitted block is
298
+ indistinguishable from a loop that never ran, and the halt rule below counts
299
+ zero-delta loops — so omitting one silently disarms the tripwire.
300
+
301
+ A verdict table still contested at the ceiling is itself the finding — mark it
302
+ `contested — needs maintainer judgement` and stop with the question, never
190
303
  silently.
191
304
 
305
+ ### 5c. The target metric is a decision-quality measure
306
+
307
+ The metric is:
308
+
309
+ > the count of ADOPT/ADAPT rows carrying a concrete `file:line` on **both** the
310
+ > reference side and this package's side.
311
+
312
+ Not the number of rows, not the length of the document, not the count of
313
+ findings. An output-volume metric rewards a loop for saying more, which is
314
+ precisely the churn the three lenses exist to prevent; this metric only moves
315
+ when a verdict became *decidable* — someone can now go and look at both ends.
316
+
317
+ Its baseline is measured on the seed pass and pre-registered before loop 1
318
+ (§ Enforced limits). The halt rules that read it:
319
+
320
+ - **Two consecutive zero-delta loops → STOP** before the next lens runs, naming
321
+ the two loops and the metric. Spin, not convergence.
322
+ - **A single zero-delta loop never cancels the remaining lenses.** Loop 1
323
+ finding nothing to add on Coverage says nothing about whether the Adversary
324
+ lens will find something to remove — the lenses ask different questions, so
325
+ one lens's silence is not evidence about the next.
326
+ - A contested table stops the run with a maintainer question (§ 5b).
327
+
192
328
  A contested table is a **published finding, not an adoption proposal**: the
193
329
  reference surface holds elements this repo cannot mechanically classify, and no
194
330
  automation converts that into an ADOPT decision. Convergence is an analyst
195
331
  obligation with a recorded trail — **never an LLM-as-judge gate**, never a
196
332
  script.
197
333
 
198
- ### 6. Write the analysis document
334
+ ### 6. Write the analysis document — under the opaque id, in the local area
335
+
336
+ **Target: `agents/.harvest-local/repo/<opaque-id>/analysis.md`.** Every pass and
337
+ loop artifact of a run lives under that one directory, and the run writes
338
+ nothing under `agents/evidence/analysis/`.
339
+
340
+ The old target was `agents/evidence/analysis/compare-<slug>.md` with
341
+ `<slug>` = `<owner>-<repo>`, which put the reference's identity into a path.
342
+ `.gitignore` covers `compare-*.md` under the evidence directory but nothing
343
+ else there, so any other filename in that directory would have been unprotected
344
+ by construction — the protection was a glob, not a boundary.
345
+ `agents/.harvest-local/` is a whole gitignored directory, so the boundary is the
346
+ directory rather than a pattern one rename defeats.
347
+
348
+ **The opaque id.** Derived by
349
+ `./scripts-run src/scripts/harvest_reference_tokens` from the canonical
350
+ repository identity **and** the pinned revision of § 2a: `sha256(identity +
351
+ "@" + revision)`, first 16 hex characters. Two consequences that are the point
352
+ of including the revision: the id is **stable** across two runs at the same
353
+ revision, so a resumed or repeated run lands in the same directory; and it
354
+ **differs** across revisions, so one repository at two historical pins is two
355
+ pieces of evidence rather than one overwriting the other.
356
+
357
+ **The plaintext lives in exactly one place** — `identity` in the local
358
+ manifest, `agents/.harvest-local/manifest.jsonl`, inside the same gitignored
359
+ directory. Nothing else in the run resolves an opaque id back to a name.
199
360
 
200
- Target: `agents/evidence/analysis/compare-<slug>.md` (create the directory if
201
- missing, with `.gitkeep` — same convention as `project-analyzer`). Slug rule:
202
- `<owner>-<repo>` lowercased, non-alphanumeric → `-`, collapse runs. Structure:
361
+ Structure:
203
362
 
204
363
  ```markdown
205
364
  # Reference analysis: {owner}/{repo}
206
365
 
207
366
  > One-sentence framing of why this reference matters.
208
367
 
209
- - **Source:** https://github.com/{owner}/{repo}
368
+ - **Source:** `opaque:{opaque-id}` — resolvable only via the local manifest
210
369
  - **Fetched commit:** {sha} ({date})
211
370
  - **Own-tree SHA:** {sha}
212
371
  - **Focus:** {full | area} · **Depth:** {surface | deep}
213
- - **Analyst:** agent via `/analyze-reference-repo`
372
+ - **Analyst:** agent via `/analyze-repo`
214
373
 
215
374
  ## Anchor table
216
375
 
@@ -231,9 +390,31 @@ missing, with `.gitkeep` — same convention as `project-analyzer`). Slug rule:
231
390
  | Artifact | Our consumer (file:line) | Discovered? | Validates? | Exact failing axes or error |
232
391
  |---|---|---|---|---|
233
392
 
393
+ ## Target metric
394
+
395
+ - **Metric:** ADOPT/ADAPT rows with a `file:line` on both sides (§ 5c)
396
+ - **Seed-pass baseline:** {n} · **Predicted direction:** up
397
+
234
398
  ## Iteration record
235
399
 
236
- | Pass | Row | From → To | Reason |
400
+ `revision: {sha}` — the § 2a pin, identical on every pass below.
401
+
402
+ One delta block per loop, in order, each naming its lens. A zero-delta loop
403
+ keeps its block and records the zero (§ 5b).
404
+
405
+ ### Loop 1 — Coverage · revision: {sha}
406
+
407
+ | Change | Row | From → To | Reason |
408
+ |---|---|---|---|
409
+
410
+ ### Loop 2 — Adversary · revision: {sha}
411
+
412
+ | Change | Row | From → To | Reason |
413
+ |---|---|---|---|
414
+
415
+ ### Loop 3 — Convergence · revision: {sha}
416
+
417
+ | Change | Row | From → To | Reason |
237
418
  |---|---|---|---|
238
419
 
239
420
  ## Findings
@@ -270,6 +451,9 @@ omit the section entirely when every row extends something that exists.}
270
451
  does not fit — a seed that skipped this line is not ready to hand over}
271
452
 
272
453
  ## Open questions for the maintainer
454
+ {Each line is a question to ask the maintainer directly, one at a time, when
455
+ this report is handed over — the section records what is owed, it does not
456
+ discharge it.}
273
457
  ```
274
458
 
275
459
  The `## Seeds` section is the handoff shape
@@ -282,19 +466,52 @@ it makes the four-surface overlap scan that
282
466
  requires visible at handoff time, when the analysis is still open, instead of
283
467
  re-derived later by whoever picks the seed up.
284
468
 
285
- ### 7. Offer next steps
469
+ ### 7. Offer next steps — execute mode only
286
470
 
287
- After writing the file, present:
471
+ **Plan mode stops here** (§ Enforced limits). `--mode=execute` makes this step
472
+ reachable; it does not make it automatic.
288
473
 
289
- > Analysis written to `agents/evidence/analysis/compare-{slug}.md`.
474
+ > Analysis written to `agents/.harvest-local/repo/{opaque-id}/analysis.md`.
290
475
  >
291
- > 1. Draft roadmap from ADOPT/ADAPT — `agents/roadmaps/adopt-{slug}.md`
476
+ > 1. Draft roadmap from ADOPT/ADAPT — `agents/roadmaps/road-to-{defect}.md`
292
477
  > 2. Merge findings into an existing roadmap — say which
293
478
  > 3. Stop here
294
479
  > 4. Deep-dive on one axis — say which
295
480
 
296
481
  Never create the roadmap without explicit confirmation.
297
482
 
483
+ #### The landed roadmap is named after the defect, never after the source
484
+
485
+ A tracked filename is a published string. `adopt-{owner}-{repo}.md` publishes
486
+ the reference's identity in the one surface no `.gitignore` can retract, and it
487
+ also names the wrong thing: the roadmap exists because **this package has a
488
+ gap**, not because some other project exists.
489
+
490
+ - **Filename:** derived from the capability gap —
491
+ `agents/roadmaps/road-to-<the-thing-we-lack>.md`. It contains neither the
492
+ owner nor the repository name. If the only name you can think of is the
493
+ reference's, the finding is not yet understood well enough to land.
494
+ - **Header:** carries a provenance block with an **encrypted token**
495
+ (`ENC1:` via `src/scripts/_lib/link_crypto.ts`), never the plaintext URL —
496
+ the form
497
+ [`source-confidentiality`](../../../../rules/source-confidentiality.md)
498
+ requires of a tracked roadmap that cites a source. Sources are referenced as
499
+ *Source A / B / C* in the prose.
500
+ - **Verified by:** `./scripts-run src/scripts/check_no_external_sources`, which
501
+ is the deterministic backstop rather than the discipline itself.
502
+
503
+ #### Never hand a subagent a plaintext URL
504
+
505
+ Under the harvester (`/analyze:roadmap-repos`) the orchestrator passes the
506
+ subagent **the opaque id and nothing else**. The subagent reads the URL from the
507
+ local manifest itself, so the plaintext never appears in a dispatch argument.
508
+
509
+ The cost is one indirection, and it is taken **on precaution**: whether a given
510
+ host retains a subagent's arguments in a transcript or audit log is
511
+ host-dependent and was not verifiable from this tree. That is stated rather than
512
+ asserted away — the indirection is cheap enough not to need a proven threat, and
513
+ claiming a proven one would be a claim this package cannot support.
514
+
298
515
  ### 8. Close the loop — offer the ledger rows
299
516
 
300
517
  **Only after a roadmap draft is accepted** (option 1 or 2 above). This step
@@ -313,7 +530,7 @@ One row per **anchored ADOPT or ADAPT** finding, and nothing else:
313
530
  |---|---|
314
531
  | `harvest_id` | a kebab-case slug for the mechanism |
315
532
  | `stated_in` | the roadmap file the user just accepted |
316
- | `source_ref` | the reference's `<url>@<sha>` — the § 2 pin, already recorded in the document header |
533
+ | `source_ref` | `opaque:<id>` or an `ENC1:` token — never the plaintext URL; the § 2a pin is inside the id |
317
534
  | `evidence_locator` | the reference-side `file:line` from that row of the comparison matrix |
318
535
  | `harvested_at` | today |
319
536
  | `verdict` | `adopt` or `adapt` |
@@ -0,0 +1,129 @@
1
+ ---
2
+ model_tier: medium
3
+ name: analyze-roadmap-repos
4
+ pack: analysis-workbench
5
+ visibility: internal
6
+ sub: roadmap-repos
7
+ cluster: analyze
8
+ type: orchestrator
9
+ replaces: []
10
+ skills: [subagent-orchestration]
11
+ description: Walk the roadmap estate's encrypted reference tokens and feed each unique repository through analyze-repo, one subagent at a time, without producing one roadmap per repository.
12
+ argument-hint: "[--limit=N] [--resume] [--refresh] [--mode=plan|execute]"
13
+ suggestion:
14
+ eligible: false
15
+ rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
16
+ workspaces:
17
+ - agent-config-maintainer
18
+ packs:
19
+ - meta
20
+ ---
21
+
22
+ # analyze-roadmap-repos
23
+
24
+ The thin harvester in front of [`analyze-repo`](repo.md). It walks the roadmap
25
+ estate's encrypted reference tokens, resolves each to a repository identity, and
26
+ feeds the unique ones through the analysis command one at a time.
27
+
28
+ **This command contains no analysis instruction and never will.** It resolves,
29
+ dispatches, and folds. Every judgement about a reference — what to fetch, what
30
+ to compare, what to adopt, how to converge — belongs to `analyze-repo`, which
31
+ owns the loop contract and its limits. A second copy of that reasoning here
32
+ would be a second implementation to keep in step with the first, which is the
33
+ condition step 1.1 of its roadmap removed.
34
+
35
+ ## Steps
36
+
37
+ ### 1. Discovery — run the script, read the manifest
38
+
39
+ ```bash
40
+ ./scripts-run src/scripts/harvest_reference_tokens --dry-run # census only
41
+ ./scripts-run src/scripts/harvest_reference_tokens --resume --limit=N # write the manifest
42
+ ```
43
+
44
+ The script is the only discovery mechanism: it extracts the `ENC1:` tokens
45
+ across the five estate levels, decrypts them, classifies each resolved URL,
46
+ canonicalizes the repositories, deduplicates on identity plus pinned revision,
47
+ and writes `agents/.harvest-local/manifest.jsonl`.
48
+
49
+ It **refuses without a link-encryption key** rather than reporting a short
50
+ census — a classification of zero repositories that actually means "nobody could
51
+ look" is the failure mode this whole pass exists to avoid.
52
+
53
+ Read the manifest. Do not re-derive any of it here.
54
+
55
+ ### 2. Dispatch — one subagent per repository, sequential
56
+
57
+ For each manifest entry with status `pending`, in manifest order, up to the
58
+ batch limit:
59
+
60
+ - Spawn **one subagent** and have it run `/analyze:repo` for that entry.
61
+ - Pass the subagent **the opaque id only** — never a resolved URL. The subagent
62
+ reads the URL from `agents/.harvest-local/manifest.jsonl` itself. One
63
+ indirection, taken on precaution (`analyze-repo` § 7).
64
+ - **Sequential, never a fan-out.** Over a hundred identities at four passes each
65
+ cannot share one session, and every external fetch is spent deliberately. The
66
+ manifest is the only shared state between subagents.
67
+ - Write the entry's status back as the run progresses: `running`, then `done` or
68
+ `failed`. A batch interrupted mid-flight resumes from those statuses.
69
+
70
+ Default batch limit is **small**. A harvester that walks the whole estate in one
71
+ invocation spends a hundred repositories' worth of fetches on a decision nobody
72
+ took.
73
+
74
+ ### 3. Ownership fold — one gap, one roadmap
75
+
76
+ After the batch, and never during it, run the fold pass of
77
+ [`analyze-repo`](repo.md) § 7 across the batch's findings as a set. Consult
78
+ `src/scripts/roadmap_context.ts` and the run's own candidate registry, then pick
79
+ exactly one disposition per repository:
80
+
81
+ | Disposition | When |
82
+ |---|---|
83
+ | no action | the finding is REJECT or ALREADY throughout |
84
+ | already planned | an active roadmap already owns the gap |
85
+ | extend an existing roadmap | the gap belongs to an owner that exists |
86
+ | create a follow-up | the gap belongs under an owner but is out of its scope |
87
+ | create new | no owner exists |
88
+ | contested | two owners claim it — stop and ask |
89
+
90
+ **Three repositories showing the same gap strengthen the evidence on one owning
91
+ roadmap. They never create three.** That is the whole reason this command exists
92
+ rather than a loop that invokes `analyze-repo` and keeps whatever it returns.
93
+
94
+ ### 4. Landing — local-only
95
+
96
+ The batch's consolidated result is written to `agents/.harvest-local/` and
97
+ nowhere else. **No per-run consolidate roadmap takes an active top-level estate
98
+ slot** — decided 2026-09-06 under the maintainer's standing delegation, recorded
99
+ in `road-to-bounded-reference-harvest-loop` § Blockers. A recurring process that
100
+ takes a slot per run converts the estate ratchet's allowance into a standing
101
+ exemption, which removes the pressure the ratchet exists to apply.
102
+
103
+ Accepted consequence, stated rather than hidden: **no batch is visible in the
104
+ roadmap dashboard.** Any roadmap the fold pass does land is an ordinary estate
105
+ entry landed for a named capability gap, and is subject to the estate gate like
106
+ any other.
107
+
108
+ ## Safety
109
+
110
+ - Read-only on every reference. The no-execute invariant of `analyze-repo`
111
+ § Safety binds every subagent this command spawns.
112
+ - No plaintext repository URL is ever passed as a dispatch argument.
113
+ - Nothing tracked is written by this command itself.
114
+ - Hard-Floor actions stay this-turn gated. A batch authorizes fetches, never a
115
+ commit, a push or a merge.
116
+
117
+ ## When **not** to use
118
+
119
+ - One known reference → [`analyze-repo`](repo.md) directly. The harvester's only
120
+ job is the estate walk.
121
+ - Analyzing this repository → `/project-analyze`.
122
+ - A dropped local artifact → [`/analyze:inbox`](inbox.md).
123
+
124
+ ## Related
125
+
126
+ - Command: [`analyze-repo`](repo.md) — the analysis engine this dispatches to.
127
+ - Script: `src/scripts/harvest_reference_tokens.ts` — discovery, the only one.
128
+ - Rule: [`source-confidentiality`](../../../../rules/source-confidentiality.md)
129
+ — why the identities stay in the gitignored area.
@@ -2,13 +2,13 @@
2
2
  model_tier: medium
3
3
  name: analyze
4
4
  disable-model-invocation: true
5
- argument-hint: "[postmortem|premortem|decision|near-miss|incident|reference-repo|inbox] [subject]"
5
+ argument-hint: "[postmortem|premortem|decision|near-miss|incident|repo|roadmap-repos|inbox] [subject]"
6
6
  pack: analysis-workbench
7
7
  intent: "Analysis dispatcher — classify input by keywords, propose a weighted framework path, let the user pick"
8
- routes_to: [analyze-postmortem, analyze-premortem, analyze-decision, analyze-near-miss, analyze-incident, analyze-reference-repo, analyze-inbox, analyze-conformance]
8
+ routes_to: [analyze-postmortem, analyze-premortem, analyze-decision, analyze-near-miss, analyze-incident, analyze-repo, analyze-roadmap-repos, analyze-inbox, analyze-conformance]
9
9
  replaces: []
10
10
  visibility: advanced
11
- description: Analysis orchestrator — confidence-weighted suggester that routes to postmortem, premortem, decision-review, near-miss, incident, reference-repo, or inbox-artifact analysis.
11
+ description: Analysis orchestrator — confidence-weighted suggester that routes to postmortem, premortem, decision-review, near-miss, incident, repo, or inbox-artifact analysis.
12
12
  cluster: analyze
13
13
  type: orchestrator
14
14
  suggestion:
@@ -37,7 +37,8 @@ to the chosen sub-command. Never auto-selects silently.
37
37
  | `/analyze:decision` | `analyze/decision/command.md` | Audit a past architectural decision (did it hold?) |
38
38
  | `/analyze:near-miss` | `analyze/near-miss/command.md` | Post-mortem for a near-miss (same flow, lighter severity framing) |
39
39
  | `/analyze:incident` | `analyze/incident/command.md` | Full incident flow: commander → RCA → post-mortem → memory candidate |
40
- | `/analyze:reference-repo` | `analyze/reference-repo/command.md` | Deep-dive an external reference repo (competitor, inspiration, peer) → structured comparison + adoption plan |
40
+ | `/analyze:repo` | `analyze/repo/command.md` | Deep-dive an external reference repo (competitor, inspiration, peer) → structured comparison + adoption plan |
41
+ | `/analyze:roadmap-repos` | `analyze/roadmap-repos/command.md` | Walk the estate's encrypted reference tokens and feed each unique repo through `repo`, one subagent at a time |
41
42
  | `/analyze:inbox` | `analyze/inbox/command.md` | Deep-dive a LOCAL artifact dropped in `agents/tmp/` (review, prompt, spec, transcript) → claim verification + step reproduction against the current tree + artefact mapping + roadmap |
42
43
  | `/analyze:conformance` | `analyze/conformance/command.md` | Audit recent local sessions for rule violations → deterministic scan + subagent passes, root-caused per class, and a roadmap for what is mechanisable |
43
44
 
@@ -63,7 +64,7 @@ match:
63
64
  | "pre-mortem", "what could go wrong", "imagine failure", "vor dem Start" | `premortem` |
64
65
  | "decision review", "ADR", "did this hold up", "rückblick Architektur" | `decision` |
65
66
  | "production is down", "active incident", "Vorfall", "Prod ist down" | `incident` |
66
- | external repo URL / `owner/repo`, "how does X do this", "compare with that repo", "competitor" | `reference-repo` |
67
+ | external repo URL / `owner/repo`, "how does X do this", "compare with that repo", "competitor" | `repo` |
67
68
 
68
69
  Assign a confidence level (high / medium / low) per framework based on
69
70
  signal count. A framework with zero signals gets `low`.
@@ -81,7 +82,7 @@ escape:
81
82
  > 3. [low] Pre-mortem (`/analyze:premortem`) — imagined-failure analysis before committing
82
83
  > 4. [low] Decision review (`/analyze:decision`) — did a past architectural decision hold up?
83
84
  > 5. [low] Incident (`/analyze:incident`) — full live-incident coordination + RCA + post-mortem
84
- > 6. [low] Reference repo (`/analyze:reference-repo`) — deep-dive an external repo → comparison + adoption plan
85
+ > 6. [low] Reference repo (`/analyze:repo`) — deep-dive an external repo → comparison + adoption plan
85
86
  > 7. Describe in your own words — I'll re-classify
86
87
 
87
88
  **Empfehlung:** 1
@@ -113,7 +114,11 @@ and ask which one was intended. One question, no guessing.
113
114
  this turn.
114
115
  - **Do NOT commit, push, or open a PR** unless a sub-command
115
116
  explicitly authorizes it.
116
- - **Do NOT chain sub-commands.** One `/analyze <sub>` per turn.
117
+ - **Do NOT chain sub-commands.** One `/analyze <sub>` per turn. **Exactly one
118
+ exception:** `roadmap-repos` invokes `repo` once per repository, each in its
119
+ own subagent, sequentially — never in the orchestrator's own turn and never as
120
+ a fan-out. It is the only sub-command permitted to invoke another, and it may
121
+ invoke only `repo`.
117
122
  - **Memory loop applies** — every sub-command that produces an
118
123
  analysis output MUST draft a memory candidate via
119
124
  `/memory propose` per