@azure-id/orc 1.9.2 → 2.1.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 (228) hide show
  1. package/CHANGELOG.md +722 -0
  2. package/README-id.md +56 -42
  3. package/README.md +58 -41
  4. package/bin/build-agents.js +125 -29
  5. package/bin/clear-logs.js +620 -0
  6. package/bin/cli.js +1873 -180
  7. package/bin/fix.js +459 -0
  8. package/bin/gotcha-import.js +1081 -0
  9. package/bin/gotcha.js +1566 -0
  10. package/bin/graph-query.js +1 -1
  11. package/bin/graph.js +717 -717
  12. package/bin/habit.js +1538 -0
  13. package/bin/mockrun-catalog.js +284 -276
  14. package/bin/onboarding-content.js +2 -1
  15. package/bin/pricing.json +28 -21
  16. package/bin/run-undo.js +398 -0
  17. package/bin/trace-write.js +869 -0
  18. package/bin/verify-contracts.js +627 -100
  19. package/bin/verify-package.js +68 -10
  20. package/bin/webui/api.js +151 -6
  21. package/bin/webui/app.html +239 -232
  22. package/bin/webui/css/00-tokens.css +110 -92
  23. package/bin/webui/css/04-motion.css +87 -0
  24. package/bin/webui/css/06-responsive.css +203 -178
  25. package/bin/webui/css/panels/behaviour.css +205 -0
  26. package/bin/webui/css/panels/hookui.css +79 -0
  27. package/bin/webui/fixtures/behaviour.js +562 -0
  28. package/bin/webui/fixtures/extra.js +9 -9
  29. package/bin/webui/fixtures/flow.js +81 -81
  30. package/bin/webui/fixtures/hookui.js +506 -431
  31. package/bin/webui/fixtures/index.js +66 -3
  32. package/bin/webui/fixtures/knowledge.js +9 -3
  33. package/bin/webui/fixtures/maintenance.js +123 -42
  34. package/bin/webui/fixtures/rules.js +1007 -1002
  35. package/bin/webui/fixtures/settings.js +6 -7
  36. package/bin/webui/fixtures/stats.js +25 -6
  37. package/bin/webui/fixtures/wait.js +98 -97
  38. package/bin/webui/i18n/en/behaviour.json +156 -0
  39. package/bin/webui/i18n/en/hookui.json +290 -194
  40. package/bin/webui/i18n/en/maintenance.json +71 -52
  41. package/bin/webui/i18n/en/nav.json +25 -24
  42. package/bin/webui/i18n/en/settings.json +60 -60
  43. package/bin/webui/i18n/en/tour.json +37 -35
  44. package/bin/webui/i18n/id/behaviour.json +156 -0
  45. package/bin/webui/i18n/id/hookui.json +290 -194
  46. package/bin/webui/i18n/id/maintenance.json +71 -52
  47. package/bin/webui/i18n/id/nav.json +25 -24
  48. package/bin/webui/i18n/id/settings.json +60 -60
  49. package/bin/webui/i18n/id/tour.json +37 -35
  50. package/bin/webui/js/01-i18n.js +155 -154
  51. package/bin/webui/js/05-banners.js +181 -172
  52. package/bin/webui/js/06-edit.js +193 -183
  53. package/bin/webui/js/90-tour.js +498 -494
  54. package/bin/webui/js/91-shortcuts.js +126 -126
  55. package/bin/webui/js/99-boot.js +121 -118
  56. package/bin/webui/js/panels/behaviour.js +1087 -0
  57. package/bin/webui/js/panels/hookui.js +2196 -1691
  58. package/bin/webui/js/panels/maintenance.js +336 -235
  59. package/bin/webui/js/panels/settings.js +726 -719
  60. package/mock-run/INDEX.md +110 -107
  61. package/mock-run/extra-slots.md +1 -1
  62. package/mock-run/gotcha-import.md +118 -0
  63. package/mock-run/habits.md +129 -0
  64. package/mock-run/orc-aftermath.md +392 -392
  65. package/mock-run/orc-budget.md +29 -33
  66. package/mock-run/orc-cli.md +200 -200
  67. package/mock-run/orc-explain.md +86 -86
  68. package/mock-run/orc-extra.md +389 -392
  69. package/mock-run/orc-fix.md +87 -0
  70. package/mock-run/orc-pattern.md +112 -112
  71. package/mock-run/orc-quick.md +6 -1
  72. package/mock-run/orc.md +157 -157
  73. package/package.json +1 -1
  74. package/templates/agents/MODEL-MAPPING.md +37 -34
  75. package/templates/agents/orc-advisor-opus-5-xhigh.md +1 -7
  76. package/templates/agents/orc-analyze-mini-opus-5-med.md +1 -6
  77. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -5
  78. package/templates/agents/{orc-claude-writer-opus-4-8-high.md → orc-claude-writer-opus-5-low.md} +48 -53
  79. package/templates/agents/orc-context-combiner-opus-5-high.md +1 -11
  80. package/templates/agents/orc-executor-haiku-4-5.md +14 -6
  81. package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
  82. package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
  83. package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
  84. package/templates/agents/orc-executor-opus-5-high.md +14 -6
  85. package/templates/agents/orc-executor-opus-5-low.md +14 -6
  86. package/templates/agents/orc-executor-opus-5-med.md +14 -6
  87. package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
  88. package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
  89. package/templates/agents/orc-executor-sonnet-5-high.md +15 -7
  90. package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
  91. package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
  92. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
  93. package/templates/agents/orc-judge-opus-5-xhigh.md +5 -9
  94. package/templates/agents/orc-learn-writer-opus-5-low.md +1 -7
  95. package/templates/agents/orc-pattern-codifier-opus-5-med.md +1 -8
  96. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
  97. package/templates/agents/orc-planner-mini-opus-5-med.md +1 -4
  98. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -3
  99. package/templates/agents/orc-planner-opus-5-med.md +1 -4
  100. package/templates/agents/orc-recon-opus-5-low.md +1 -8
  101. package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
  102. package/templates/agents/orc-retro-opus-5-med.md +6 -8
  103. package/templates/agents/orc-retro-sonnet-5-high.md +7 -8
  104. package/templates/agents/orc-reviewer-opus-5-low.md +96 -0
  105. package/templates/agents/orc-scout-opus-5-low.md +1 -6
  106. package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
  107. package/templates/agents/orc-system-analyst-opus-5-high.md +1 -6
  108. package/templates/agents/orc-test-author-opus-5-med.md +4 -5
  109. package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
  110. package/templates/agents/orc-verifier-opus-5-med.md +16 -8
  111. package/templates/agents/{orc-wiki-scanner-opus-4-8-high.md → orc-wiki-scanner-opus-5-low.md} +74 -79
  112. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
  113. package/templates/commands/orc-analyze.md +13 -21
  114. package/templates/commands/orc-fast.md +10 -15
  115. package/templates/commands/orc-fix.md +18 -0
  116. package/templates/commands/orc-poly.md +12 -21
  117. package/templates/commands/orc-pr-driver.md +11 -30
  118. package/templates/commands/orc-pr-setup.md +10 -31
  119. package/templates/commands/orc-route.md +11 -41
  120. package/templates/commands/orc-test.md +5 -60
  121. package/templates/commands/orc-wiki.md +64 -64
  122. package/templates/hooks/README.md +109 -7
  123. package/templates/hooks/orc-session-hook.js +339 -0
  124. package/templates/hooks/orc-statusline-render.js +317 -23
  125. package/templates/hooks/orc-statusline.js +165 -50
  126. package/templates/hooks/orc-subagent-line.js +23 -5
  127. package/templates/hooks/orc-weather-fetch.js +123 -0
  128. package/templates/skills/_shared/README.md +9 -0
  129. package/templates/skills/_shared/code-graph.md +47 -55
  130. package/templates/skills/_shared/config-precedence.md +3 -1
  131. package/templates/skills/_shared/extra-dispatch.md +78 -93
  132. package/templates/skills/_shared/gotchas.md +248 -177
  133. package/templates/skills/_shared/habits.md +101 -0
  134. package/templates/skills/_shared/lane-contract.md +84 -0
  135. package/templates/skills/_shared/opus5-only.md +14 -14
  136. package/templates/skills/_shared/phases/README.md +142 -83
  137. package/templates/skills/_shared/phases/analyst-gates.md +10 -21
  138. package/templates/skills/_shared/phases/execution.md +8 -14
  139. package/templates/skills/_shared/phases/house-rules.md +27 -32
  140. package/templates/skills/_shared/phases/intake.md +127 -133
  141. package/templates/skills/_shared/phases/mock-example.md +46 -56
  142. package/templates/skills/_shared/phases/plan-handoff.md +91 -97
  143. package/templates/skills/_shared/phases/planning.md +7 -17
  144. package/templates/skills/_shared/phases/preflight.md +19 -42
  145. package/templates/skills/_shared/phases/review.md +24 -28
  146. package/templates/skills/_shared/phases/rules.md +18 -42
  147. package/templates/skills/_shared/phases/scoring.md +55 -65
  148. package/templates/skills/_shared/phases/security-checklist.md +46 -50
  149. package/templates/skills/_shared/phases/security.md +45 -55
  150. package/templates/skills/_shared/phases/ship.md +6 -15
  151. package/templates/skills/_shared/phases/stop-resume.md +2 -5
  152. package/templates/skills/_shared/phases/summary.md +73 -48
  153. package/templates/skills/_shared/phases/testgen.md +41 -51
  154. package/templates/skills/_shared/phases/trace-verbs.md +447 -0
  155. package/templates/skills/_shared/phases/trace.md +66 -297
  156. package/templates/skills/_shared/phases/verify.md +62 -70
  157. package/templates/skills/_shared/phases/wave-grouping.md +128 -133
  158. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  159. package/templates/skills/_shared/read-ladder.md +2 -55
  160. package/templates/skills/_shared/return-validation.md +17 -70
  161. package/templates/skills/_shared/review-slice.md +106 -0
  162. package/templates/skills/_shared/smoke-gate.md +46 -28
  163. package/templates/skills/_shared/wait.md +1 -0
  164. package/templates/skills/context-combiner/SKILL.md +15 -44
  165. package/templates/skills/orc/README.md +2 -2
  166. package/templates/skills/orc/SKILL.md +35 -63
  167. package/templates/skills/orc/config.md +25 -27
  168. package/templates/skills/orc/examples/full-run-mock.md +2 -1
  169. package/templates/skills/orc/references/effort-and-mode.md +17 -17
  170. package/templates/skills/orc/references/pattern-gate.md +89 -89
  171. package/templates/skills/orc/references/phases/intake.md +41 -47
  172. package/templates/skills/orc/references/phases/integration.md +13 -19
  173. package/templates/skills/orc/references/preflight-report.md +11 -12
  174. package/templates/skills/orc/references/ultra-mode.md +9 -7
  175. package/templates/skills/orc/schemas/checkpoint.md +122 -122
  176. package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
  177. package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
  178. package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
  179. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +12 -53
  180. package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
  181. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
  182. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +11 -22
  183. package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
  184. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
  185. package/templates/skills/orc-advisor/SKILL.md +56 -60
  186. package/templates/skills/orc-analyze/SKILL.md +33 -67
  187. package/templates/skills/orc-analyze/schemas/report-audit.md +2 -1
  188. package/templates/skills/orc-analyze/schemas/report-prose.md +2 -1
  189. package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
  190. package/templates/skills/orc-claude/SKILL.md +14 -14
  191. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
  192. package/templates/skills/orc-diy/README.md +31 -0
  193. package/templates/skills/orc-diy/SKILL.md +27 -78
  194. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
  195. package/templates/skills/orc-fast/SKILL.md +49 -75
  196. package/templates/skills/orc-fix/SKILL.md +110 -0
  197. package/templates/skills/orc-judge/SKILL.md +77 -82
  198. package/templates/skills/orc-mini/SKILL.md +64 -112
  199. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
  200. package/templates/skills/orc-pattern/SKILL.md +27 -48
  201. package/templates/skills/orc-poly/SKILL.md +32 -61
  202. package/templates/skills/orc-pr-driver/SKILL.md +25 -51
  203. package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
  204. package/templates/skills/orc-pr-setup/SKILL.md +20 -45
  205. package/templates/skills/orc-quick/README.md +44 -3
  206. package/templates/skills/orc-quick/SKILL.md +77 -108
  207. package/templates/skills/orc-quick/references/dispatch-gate.md +18 -6
  208. package/templates/skills/orc-quick/references/gh-mode.md +50 -1
  209. package/templates/skills/orc-quick/references/look.md +3 -1
  210. package/templates/skills/orc-retro/SKILL.md +20 -19
  211. package/templates/skills/orc-retro/examples/retro-mock.md +17 -17
  212. package/templates/skills/orc-route/SKILL.md +25 -45
  213. package/templates/skills/orc-test/SKILL.md +16 -37
  214. package/templates/skills/orc-verify/SKILL.md +14 -32
  215. package/templates/skills/orc-wait/SKILL.md +156 -163
  216. package/templates/skills/orc-wiki/README.md +325 -325
  217. package/templates/skills/orc-wiki/SKILL.md +195 -195
  218. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
  219. package/templates/skills/orc-wiki/references/extra.md +2 -2
  220. package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
  221. package/templates/skills/orc-wiki/references/phases/phase-0.md +2 -7
  222. package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
  223. package/templates/skills/orc-wiki/references/phases/phase-2.md +4 -9
  224. package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
  225. package/templates/skills/orc-wiki/references/phases/phase-3c.md +4 -8
  226. package/templates/agents/orc-claude-writer-opus-5-med.md +0 -55
  227. package/templates/agents/orc-reviewer-opus-5-med.md +0 -60
  228. package/templates/agents/orc-wiki-scanner-opus-5-med.md +0 -81
package/README-id.md CHANGED
@@ -7,13 +7,13 @@
7
7
  *Terima permintaan → pahami → rencanakan → beri nilai → kerjakan paralel → periksa → uji → kirim.*
8
8
 
9
9
  ![npm](https://img.shields.io/npm/v/%40azure-id%2Forc?style=for-the-badge&color=cb3837&logo=npm)
10
- ![Version](https://img.shields.io/badge/version-1.9.2-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-2.1.0-blue.svg?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/license-MIT-green.svg?style=for-the-badge)
12
12
  ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge)
13
13
  ![Claude Code](https://img.shields.io/badge/Claude_Code-Skills-purple.svg?style=for-the-badge)
14
14
  ![Dependencies](https://img.shields.io/badge/dependencies-zero-lightgrey.svg?style=for-the-badge)
15
15
 
16
- **Versi terbaru: v1.9.2** · diperbarui 23-09-2026 · [daftar perubahan lengkap](CHANGELOG.md)
16
+ **Versi terbaru: v2.1.0** · diperbarui 02-10-2026 · [daftar perubahan lengkap](CHANGELOG.md)
17
17
 
18
18
  **Ada di npm: [`@azure-id/orc`](https://www.npmjs.com/package/@azure-id/orc)** — `npm i -g @azure-id/orc`
19
19
 
@@ -275,6 +275,7 @@ pemakaian 5 jam, pemakaian mingguan, dan beberapa hal lain.
275
275
  | **`/orc-mini`** | Satu agen Sonnet 5, satu pemeriksaan build + tes, lalu kirim. Melewati review penuh dan pengujian. Satu baris **pembacaan kompleksitas** berisi angka menawarkan lane penuh kalau perubahannya lebih luas dari satu area. Bisa pindah ke alur penuh di tengah jalan kalau diminta. | [lihat](templates/skills/orc-mini/examples/mini-run-mock.md) |
276
276
  | **`/orc-fast`** | Lane tercepat. Butuh wiki yang masih segar **dan** pola kode yang sudah tersimpan; kalau ada, ia melewati tahap analis dan perencana sepenuhnya. Kalau salah satu syarat tidak ada, ia mundur ke `/orc-mini` — obrolan tidak pernah berhenti. | [lihat](mock-run/orc-fast.md) |
277
277
  | **`/orc-quick`** | Minta apa saja: perbaikan kecil, pertanyaan, mencari bug, menaikkan versi dependensi, komentar PR. Lihat → tanya sekali → kerjakan. **Selalu bertanya agen mana yang mau dipakai**, dan tidak ada pengaturan yang bisa mengubah itu. Satu **defect direproduksi merah dulu sebelum diperbaiki**. | [lihat](mock-run/orc-quick.md) |
278
+ | **`/orc-fix`** | Memperbaiki satu hal setelah review: isu Sonar, CI merah, atau bug yang ditemukan orang. Di dalam run yang sedang dijeda, ia hanya **mencatat** perbaikannya (satu observasi dan satu baris `FIX` di jejak run itu), jadi review yang melewatkannya ikut terhitung. Kalau tidak ada run yang terbuka, ia memperbaiki seperti `/orc-quick` dan bertanya agen mana yang dipakai. | [lihat](mock-run/orc-fix.md) |
278
279
  | **`/orc-diy`** | Lane racikan Anda sendiri, disusun di terminal dengan `orc diy` lalu dikompilasi. Kalau belum disetel atau sudah basi, ia menolak jalan dan menawarkan `/orc` biasa. | [lihat](mock-run/orc-diy.md) |
279
280
 
280
281
  ### Memikirkan apa yang mau dibuat
@@ -665,9 +666,19 @@ dipublikasikan mengubahnya jadi angka. Risiko yang dikutip memaksa nilai minimal
665
666
  model terkunci** — jadi apa yang benar-benar berjalan bisa diperiksa, bukan
666
667
  sekadar diminta lewat kalimat.
667
668
 
669
+ Tabel bawaan (sejak v2.1.0):
670
+
671
+ | Nilai | Agen | Model · effort |
672
+ |---|---|---|
673
+ | `[0,21)` | `orc-executor-sonnet-5-low` | Sonnet 5 · low |
674
+ | `[21,31)` | `orc-executor-sonnet-5-med` | Sonnet 5 · medium |
675
+ | `[31,41)` | `orc-executor-sonnet-5-high` | Sonnet 5 · high |
676
+ | `[41,90)` | `orc-executor-opus-5-low` | Opus 5.5 · low |
677
+ | `[90,100]` | `orc-executor-opus-5-med` | Opus 5.5 · medium |
678
+
668
679
  > **Aturan yang paling sering membuat orang bingung:** model sebuah subagen tidak
669
- > akan pernah lebih tinggi daripada model sesi utama Anda. Jalankan sesi Anda di
670
- > Opus 5.
680
+ > akan pernah lebih tinggi daripada model sesi utama Anda. Setiap pita mulai nilai
681
+ > 41 butuh sesi utama Opus 5.5.
671
682
 
672
683
  **Penjelasan lengkap — pita nilainya, `opus5_only`, dan penjaga tingkat yang
673
684
  dipasang `orc init`: [guides/model-selection.md](guides/model-selection.md).**
@@ -699,13 +710,13 @@ yang sama.
699
710
 
700
711
  ```
701
712
  templates/
702
- ├── skills/ 31 folder skill, 38 berkas SKILL.md (satu lane boleh membawa
713
+ ├── skills/ 34 folder skill, 41 berkas SKILL.md (satu lane boleh membawa
703
714
  │ sub-skill) — lane di atas, plus yang tidak punya perintah
704
715
  │ sendiri: context-combiner, orc-advisor, orc-judge,
705
716
  │ orc-analyze-mini, dan _shared/ (kesepakatan lintas lane)
706
- ├── commands/ 29 perintah garis miring
717
+ ├── commands/ 33 perintah garis miring
707
718
  ├── hooks/ penjaga effort (PreToolUse) · peringatan statusline · catatan jejak
708
- └── agents/ 48 subagen dengan model terkunci + MODEL-MAPPING.md
719
+ └── agents/ 50 subagen dengan model terkunci + MODEL-MAPPING.md
709
720
  bin/cli.js pemasang, penyunting pengaturan, penyusun alur, pembaca status
710
721
  pekerjaan, dan separuh pasti dari setiap lane. Setiap pembacaan
711
722
  bisa menjawab --json
@@ -786,43 +797,46 @@ Bacalah sebagai catatan putaran itu, bukan sebagai audit terkini:
786
797
  **Riwayat lengkap: [CHANGELOG.md](CHANGELOG.md)** — atau `orc changelog`, yang
787
798
  hanya mencetak yang lebih baru dari versi yang Anda punya.
788
799
 
789
- ### v1.9.2 - graf kode mendapat tab sendiri, dan Opus 5 menjadi Opus 5.5 _(23-09-2026)_
790
-
791
- **Graf kode punya tab sendiri.** `orc ui` ▸ Knowledge ▸ **Code graph**
792
- menggantikan satu kartu di tab Wiki. Tab ini menunjukkan, berurutan:
793
-
794
- - **Posisi graf Anda sekarang** — empat status (OFF · NONE · FRESH · DRIFTED)
795
- sebagai tangga. Status saat ini menyala, dan satu tindakan yang dibutuhkan
796
- ada di bawahnya.
797
- - **Cara kerja graf kode** — lima langkah beranimasi, dari file Anda sampai
798
- kartu singkat yang dibaca agent. Tiga langkah pertama gratis.
799
- - **Seperti apa graf kode** — contoh graf (bukan kode Anda). Arahkan pointer ke
800
- sebuah titik untuk melihat pemanggil dan yang dipanggilnya.
801
- - **Graf Anda, dalam angka** — file, simbol, kepadatan per bahasa, dan apa yang
802
- berubah sejak pembuatan terakhir.
803
- - **Biaya graf, dan perkiraan hematnya** — dibayar (persis) dan dihindari
804
- (perkiraan, digambar sebagai rentang) pada satu skala, dan pertanyaan yang
805
- diajukan lane.
806
- - **Arti setiap kata** — setiap istilah di tab ini, dengan kata sederhana.
807
-
808
- Temuan DRIFTED di Overview sekarang membuka tab ini. Reduced motion menghapus
809
- semua animasi.
810
-
811
- **Setiap agent Opus 5 sekarang memakai Opus 5.5.** Model id-nya
812
- `claude-opus-5-5` (sebelumnya `claude-opus-5`): executor, scout, analis,
813
- planner, reviewer, verifier, judge, dan setiap agent Opus lainnya. Opus 5.5
814
- lebih murah: $4 input, $5 cache write, $0,20 cache read, dan $20 output per
815
- sejuta token. `bin/pricing.json` punya baris baru, dan `orc budget`
816
- memakainya.
817
-
818
- **Yang harus Anda lakukan:** jalankan `orc update` untuk memasang file agent
819
- yang baru. NAMA agent tidak berubah, jadi `rubric_bands_override`,
820
- `fixed_executor` dan `opus5_only` tetap berjalan. Config yang masih menyebut
821
- `claude-opus-5` tetap valid.
800
+ ### v2.1.0 - review terhitung, tabel nilai naik, dan log lama bisa dihapus _(02-10-2026)_
801
+
802
+ - **Tabel nilai baru dengan lima pita.** Nilai 0–40 ke Sonnet 5 (low, medium,
803
+ high). Nilai 41–89 ke Opus 5.5 low, dan 90–100 ke Opus 5.5 medium. Haiku tidak
804
+ lagi ada di tabel. **Setiap pita mulai nilai 41 butuh sesi utama Opus 5.5.**
805
+ - **Sonnet 5 berjalan di `claude-sonnet-5-5`.** Tabel harga kembali benar.
806
+ - **Reviewer sekarang `orc-reviewer-opus-5-low`.** Di eval langsung, effort low
807
+ menemukan setiap cacat yang sengaja ditanam dan masih ada di diff.
808
+ - **Pemindai wiki dan penulis CLAUDE.md memakai Opus 5.5 low** (dulu Opus 4.8).
809
+ - **Review quality tidak lagi menulis "0 so far" setelah review sungguhan.** Ia
810
+ menghitung review dari jejak. Review yang bersih juga dihitung.
811
+ - **Aturan review milik proyek Anda.** Kalau CLAUDE.md atau AGENTS.md meminta
812
+ review lain (misalnya `/code-review`), lane bertanya "review ORC, review itu,
813
+ atau lewati". `orc review policy` menunjukkan apa yang ORC temukan.
814
+ - **Lane baru `/orc-fix`.** Ia mencatat perbaikan setelah review (Sonar, CI merah,
815
+ bug) dan siapa yang memasukkan bug itu. Kartu reviewer menampilkannya, dan panel
816
+ menampilkan "Fixes after review".
817
+ - **`orc clear logs`** menampilkan jejak dan folder run yang lama. `--apply`
818
+ menghapusnya. Tidak ada yang dihapus otomatis kecuali Anda menyetel
819
+ `log_retention_auto: on`.
820
+ - **Timer status line:** 1, 2, 3, 5 atau 10 detik. Di bawah 1 detik ditolak, karena
821
+ Claude Code tidak mendukungnya.
822
+ - **Perbaikan tab Behaviour:** dengan `habits: off` Anda tetap melihat Review quality
823
+ dan Gotchas, `/orc-fast` mencatat jawaban Anda, dan log jawaban menampilkan
824
+ pertanyaannya.
825
+
826
+ **Yang harus Anda lakukan:** `orc update`. Kalau Anda punya alur `orc diy` yang
827
+ sudah dikompilasi, jalankan `orc diy compile`. Kalau ada skrip yang menyebut
828
+ `orc-reviewer-opus-5-med`, ganti menjadi `orc-reviewer-opus-5-low`. Biayanya
829
+ berubah: baca CHANGELOG.
822
830
 
823
831
  <details>
824
- <summary><strong>Rilis sebelumnya</strong> — 121 rilis, hanya judulnya. Teks lengkapnya (dalam bahasa Inggris) ada di <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
825
-
832
+ <summary><strong>Rilis sebelumnya</strong> — 127 rilis, hanya judulnya. Teks lengkapnya (dalam bahasa Inggris) ada di <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
833
+
834
+ - **v2.0.4** — design the status line to the last cell · _2026-09-30_
835
+ - **v2.0.3** — the status line you designed is the status line you see · _2026-09-30_
836
+ - **v2.0.2** — the lanes record what you answered, and the reviewer always gets the card · _2026-09-28_
837
+ - **v2.0.1** — the trace keeps the gate name, and the lanes find the habits rule · _2026-09-27_
838
+ - **v2.0.0** — the coding lanes remember what you fixed and how you work · _2026-09-27_
839
+ - **v1.9.2** — the code graph gets its own tab, and Opus 5 becomes Opus 5.5 · _2026-09-23_
826
840
  - **v1.9.1** — the graph that was paid for and never asked · _2026-09-23_
827
841
  - **v1.9.0** — the lean lanes learn to look before they leap · _2026-09-21_
828
842
  - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
package/README.md CHANGED
@@ -7,14 +7,14 @@
7
7
  *Intake → analyze → plan → score → parallel subagents → review → verify → ship.*
8
8
 
9
9
  ![npm](https://img.shields.io/npm/v/%40azure-id%2Forc?style=for-the-badge&color=cb3837&logo=npm)
10
- ![Version](https://img.shields.io/badge/version-1.9.2-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-2.1.0-blue.svg?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/license-MIT-green.svg?style=for-the-badge)
12
12
  ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge)
13
13
  ![Claude Code](https://img.shields.io/badge/Claude_Code-Skills-purple.svg?style=for-the-badge)
14
14
  ![Dependencies](https://img.shields.io/badge/dependencies-zero-lightgrey.svg?style=for-the-badge)
15
15
  ![GitHub stars](https://img.shields.io/github/stars/azure-id/orc?style=for-the-badge&color=yellow)
16
16
 
17
- **Latest: v1.9.2** · updated 2026-09-23 · [full changelog](CHANGELOG.md)
17
+ **Latest: v2.1.0** · updated 02-10-2026 · [full changelog](CHANGELOG.md)
18
18
 
19
19
  **On npm: [`@azure-id/orc`](https://www.npmjs.com/package/@azure-id/orc)** — `npm i -g @azure-id/orc`
20
20
 
@@ -255,6 +255,7 @@ ORC have terminal hook to see: Context Window %, 5 Hour usage %, Weekly usage %
255
255
  | **`/orc-fast`** | The fastest lane. Needs a fresh wiki **and** a cached code pattern; then it skips the analyst and planner entirely. A missing prerequisite falls back to `/orc-mini` — the chat never stops. | [see it](mock-run/orc-fast.md) |
256
256
  | **`/orc-quick`** | Ask for anything: a fix, a question, a defect hunt, a dependency bump, PR comments. Look → ask once → do. **It always asks which agent to dispatch**, and no setting can change that. A defect is **reproduced red before it is fixed**. | [see it](mock-run/orc-quick.md) |
257
257
  | **`/orc-wait`** | Wall-clock pause without losing the run. You see the window is nearly full, type `/orc-wait 30`, and ORC hands the run back to disk, waits in detached hops that **cost zero tokens**, and picks up where it stopped. Three modes decide how much finishes first: `safe` · `soft` (forces the checkpoint) · `hard` (fastest, can lose an in-flight return). `/orc-wait block <reason>` tells it not to stop you at all. | — |
258
+ | **`/orc-fix`** | Fix one thing after a review: a Sonar issue, a red CI, a bug someone found. Inside a paused run it only **records** the fix (one observation and one `FIX` line in that run's trace), so the review that missed it is counted. With no run open, it fixes like `/orc-quick` and asks which agent to use. | [see it](mock-run/orc-fix.md) |
258
259
  | **`/orc-diy`** | Your own lane, composed in the terminal with `orc diy` and compiled. Unconfigured or stale → it refuses and offers plain `/orc`. | [see it](mock-run/orc-diy.md) |
259
260
 
260
261
  ### Work out what to build
@@ -505,7 +506,8 @@ orc ui --stop # shut this project's server down
505
506
  | Settings | every config key, grouped, each with its own control | staged edits, applied together |
506
507
  | Runs | run history as an accordion: a row opens in place into state-of-play, resume prompt, checkpoint, trace tail | — |
507
508
  | **Knowledge** | **five tabs**: the wiki's tier AND its **contents** (every doc, what it covers, how often it is read), coverage against your tracked files, the code patterns with the conflicts the codifier flagged, repair memory with a **preview-then-apply** prune, and a read-only view of the linked repos | `wiki sync`, `gotcha prune` |
508
- | Stats | lane and agent usage, downgrades, and a **Cost** tab whose stacked bar keeps cache-read visible | — |
509
+ | Stats | lane and agent usage, downgrades, questions per run, and a **Cost** tab whose stacked bar keeps cache-read visible | — |
510
+ | **Behaviour** | the learning switch (Off · Observe · Propose), your habits with their evidence, the rhythm of your runs, the gotchas and the exact card the reviewer sees, review quality per category, and the answer log | `config set habits`, `habit accept` / `decline` / `forget`, `gotcha accept` |
509
511
  | Flow | the compiled DIY flow, its gate, and a stepper of every phase in order | `diy set`, `diy compile`, presets |
510
512
  | Crosslink | **Design** (the boundary as a graph) and **Settings** (each peer's freshness) | `crosslink add` / `remove` |
511
513
  | Promises · Boundary · Self-serve | the pact ledger, the boundary cards, and the surfaces a non-developer can change | `pact check`, `pact sync`, `handoff set` |
@@ -616,8 +618,18 @@ fixed published formula turns them into a number. A cited risk forces a floor of
616
618
  70. The score maps through a published table to a **named, model-pinned agent**,
617
619
  so what ran is inspectable rather than requested in prose.
618
620
 
621
+ The default table (since v2.1.0):
622
+
623
+ | Score | Agent | Model · effort |
624
+ |---|---|---|
625
+ | `[0,21)` | `orc-executor-sonnet-5-low` | Sonnet 5 · low |
626
+ | `[21,31)` | `orc-executor-sonnet-5-med` | Sonnet 5 · medium |
627
+ | `[31,41)` | `orc-executor-sonnet-5-high` | Sonnet 5 · high |
628
+ | `[41,90)` | `orc-executor-opus-5-low` | Opus 5.5 · low |
629
+ | `[90,100]` | `orc-executor-opus-5-med` | Opus 5.5 · medium |
630
+
619
631
  > **The rule that catches everyone:** a subagent's model can never be higher than
620
- > your main session's. Run your session on Opus 5.
632
+ > your main session's. Every band from score 41 needs an Opus 5.5 main session.
621
633
 
622
634
  **Full detail — the bands, `opus5_only`, and the tier guard `orc init` installs:
623
635
  [guides/model-selection.md](guides/model-selection.md).**
@@ -648,13 +660,13 @@ clobbers. `orc ui` ▸ Settings edits the same keys through the same validators.
648
660
 
649
661
  ```
650
662
  templates/
651
- ├── skills/ 31 skill folders, 38 SKILL.md files (a lane may ship subskills) —
663
+ ├── skills/ 34 skill folders, 41 SKILL.md files (a lane may ship subskills) —
652
664
  │ the lanes above, plus the ones with no command of their own:
653
665
  │ context-combiner, orc-advisor, orc-judge, orc-analyze-mini,
654
666
  │ and _shared/ (cross-lane contract prose)
655
- ├── commands/ 29 slash commands
667
+ ├── commands/ 33 slash commands
656
668
  ├── hooks/ effort guard (PreToolUse) · statusline warning · behavior trace
657
- └── agents/ 48 model-pinned subagents + MODEL-MAPPING.md
669
+ └── agents/ 50 model-pinned subagents + MODEL-MAPPING.md
658
670
  bin/cli.js installer, config editor, flow composer, run-state reader, and
659
671
  the deterministic half of every lane. Every read speaks --json
660
672
  bin/graph*.js the code graph: store, extraction, resolution + its cache and
@@ -663,7 +675,7 @@ bin/webui/ `orc ui` — the local control panel: css/ + js/ + i18n/<lang>
663
675
  fixtures/, one file per layer and per panel. Zero deps, no build step
664
676
  bin/mockrun-catalog.js the mocked-run catalogue (derived from the files on disk)
665
677
  mock-run/ the mocked runs themselves — start at INDEX.md
666
- guides/ configuration · model selection · documents · knowledge reads · other AI models
678
+ guides/ configuration · model selection · documents · knowledge reads · other AI models · habits and gotchas
667
679
  ```
668
680
 
669
681
  The `orc` skill is a thin **spine**: it loads a reference or a subskill only when
@@ -685,6 +697,7 @@ Some lanes ship a full how-to next to the skill, in plain language:
685
697
  | [ORC-PR-DRIVER](templates/skills/orc-pr-driver/README.md) | you have a stack plan and want to build, submit and merge it |
686
698
  | [Rules](guides/rules.md) | you want the 65 anti-slop rules, the precedence ladder and the lint |
687
699
  | [Configuration](guides/configuration.md) · [Model selection](guides/model-selection.md) | you want every key, or the scoring bands |
700
+ | [Habits and gotchas](guides/habits-and-gotchas.md) | you want to know how a habit is proposed, how to import Sonar, SARIF or PR history, and how to undo |
688
701
  | [Other AI models](guides/extra-models.md) | you want part of the ladder to run somewhere other than Claude |
689
702
 
690
703
  Every skill also ships its own `SKILL.md` and `references/`. The guides above are
@@ -728,41 +741,45 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
728
741
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
729
742
  only what is newer than the version you have.
730
743
 
731
- ### v1.9.2 — the code graph gets its own tab, and Opus 5 becomes Opus 5.5 _(2026-09-23)_
732
-
733
- **The code graph has its own tab.** `orc ui` ▸ Knowledge ▸ **Code graph**
734
- replaces the one card on the Wiki tab. The tab shows, in this order:
735
-
736
- - **Where your graph is now** — the four states (OFF · NONE · FRESH · DRIFTED)
737
- as a ladder. The current state is lit, and the one action it needs is below.
738
- - **How the code graph works** — five animated steps, from your files to the
739
- short card an agent reads. The first three are free.
740
- - **What a code graph looks like** — an example graph (not your code). Put the
741
- pointer on a dot to see its callers and callees.
742
- - **Your graph, in numbers** — files, symbols, density per language, and what
743
- changed since the last build.
744
- - **What the graph cost, and what it probably saved** — paid (exact) and
745
- avoided (an estimate, drawn as a range) on one scale, and which reads lanes
746
- asked.
747
- - **What each word means** — every term on the tab, in plain words.
748
-
749
- A DRIFTED finding on Overview now opens this tab. Reduced motion removes every
750
- animation.
751
-
752
- **Every Opus 5 agent now runs Opus 5.5.** The model id is `claude-opus-5-5`
753
- (was `claude-opus-5`): executors, scouts, the analyst, the planner, the
754
- reviewer, the verifier, the judges and every other Opus agent. Opus 5.5 costs
755
- less: $4 input, $5 cache write, $0.20 cache read and $20 output per million
756
- tokens. `bin/pricing.json` has the new row, and `orc budget` uses it.
757
-
758
- **What you have to do:** run `orc update` to install the new agent files. The
759
- agent NAMES did not change, so `rubric_bands_override`, `fixed_executor` and
760
- `opus5_only` keep working. A config that still names `claude-opus-5` is still
761
- valid.
744
+ ### v2.1.0 — the review counts, the score table moves up, and old logs can go _(2026-10-02)_
745
+
746
+ - **A new score table with five bands.** Scores 0–40 go to Sonnet 5 (low,
747
+ medium, high). Scores 41–89 go to Opus 5.5 low, and 90–100 to Opus 5.5 medium.
748
+ Haiku is no longer in the table. **Every band from 41 needs an Opus 5.5 main
749
+ session.**
750
+ - **Sonnet 5 runs on `claude-sonnet-5-5`.** The price table is correct again.
751
+ - **The reviewer is `orc-reviewer-opus-5-low`.** In the live eval, low effort
752
+ found every seeded defect that was still in the diff.
753
+ - **The wiki scanner and the CLAUDE.md writer use Opus 5.5 low** (they used Opus
754
+ 4.8).
755
+ - **Review quality no longer says "0 so far" after real reviews.** It counts
756
+ reviews from the traces. A clean review counts too.
757
+ - **Your project's own review rule.** When CLAUDE.md or AGENTS.md asks for a
758
+ different review (for example `/code-review`), the lanes ask "ORC review, that
759
+ review, or skip". `orc review policy` shows what ORC found.
760
+ - **New lane `/orc-fix`.** It records a fix after a review (Sonar, a red CI, a
761
+ bug) and who added the bug. The reviewer card shows it, and the panel shows
762
+ "Fixes after review".
763
+ - **`orc clear logs`** shows old traces and run folders. `--apply` deletes them.
764
+ Nothing is deleted automatically unless you set `log_retention_auto: on`.
765
+ - **The status line timer:** 1, 2, 3, 5 or 10 seconds. Below 1 second is refused,
766
+ because Claude Code does not support it.
767
+ - **Behaviour tab fixes:** with `habits: off` you still see Review quality and
768
+ Gotchas, `/orc-fast` records your answers, and the answer log shows the question.
769
+
770
+ **What you have to do:** `orc update`. If you compiled an `orc diy` flow, run
771
+ `orc diy compile`. If a script names `orc-reviewer-opus-5-med`, change it to
772
+ `orc-reviewer-opus-5-low`. The cost changes: read the CHANGELOG.
762
773
 
763
774
  <details>
764
- <summary><strong>Earlier releases</strong> — 121 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
765
-
775
+ <summary><strong>Earlier releases</strong> — 127 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
776
+
777
+ - **v2.0.4** — design the status line to the last cell · _2026-09-30_
778
+ - **v2.0.3** — the status line you designed is the status line you see · _2026-09-30_
779
+ - **v2.0.2** — the lanes record what you answered, and the reviewer always gets the card · _2026-09-28_
780
+ - **v2.0.1** — the trace keeps the gate name, and the lanes find the habits rule · _2026-09-27_
781
+ - **v2.0.0** — the coding lanes remember what you fixed and how you work · _2026-09-27_
782
+ - **v1.9.2** — the code graph gets its own tab, and Opus 5 becomes Opus 5.5 · _2026-09-23_
766
783
  - **v1.9.1** — the graph that was paid for and never asked · _2026-09-23_
767
784
  - **v1.9.0** — the lean lanes learn to look before they leap · _2026-09-21_
768
785
  - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
@@ -1,18 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  /**
4
- * Executor-agent generator. The 6 executor agent files differ ONLY in
5
- * frontmatter (name/model/effort + score band); their body is one shared
6
- * contract. This script is the single source of truth: edit
7
- * agents-src/executor.template.md (or the VARIANTS table), run
8
- * `npm run build:agents`, and every copy is stamped out identically.
4
+ * Agent generator. Two sets, one rule: a file that differs from its siblings
5
+ * ONLY in frontmatter and the "You are … (<model>, <effort>)" line is GENERATED.
6
+ *
7
+ * 1. The 10 executors — agents-src/executor.template.md × VARIANTS
8
+ * (name/model/effort + score band).
9
+ * 2. The 8 model-twin pairs (v2.0.0 T15) — agents-src/twins/<family>.template.md
10
+ * × TWINS (name/model/effort/description + the `who` line). One body per
11
+ * family: before T15 each pair was two hand-kept copies that nothing
12
+ * checked against each other.
13
+ *
14
+ * Edit the template (or the table), run `npm run build:agents`, and every copy
15
+ * is stamped out identically. A model change is still a RENAME: a new row, not
16
+ * an edited one.
9
17
  *
10
18
  * Modes:
11
- * node bin/build-agents.js write templates/agents/orc-executor-*.md
19
+ * node bin/build-agents.js write both sets into templates/agents/
12
20
  * node bin/build-agents.js --check fail if any generated file drifted from
13
- * the template (runs in `npm run verify`
21
+ * its template (runs in `npm run verify`
14
22
  * and prepack — a hand-edit to a generated
15
- * executor file fails the build)
23
+ * agent file fails the build)
16
24
  */
17
25
  const fs = require("fs");
18
26
  const path = require("path");
@@ -26,8 +34,9 @@ const OUT_DIR = path.join(ROOT, "templates", "agents");
26
34
  // together). `effort: null` = a model with NO effort ladder (haiku): the
27
35
  // generator omits the `effort:` frontmatter line entirely.
28
36
  //
29
- // v1.0.0 W4 — the table is SIX bands, not eight, and the `opus5_only` ladder is
30
- // TWO, not three. Four of these agents are named by NO default row:
37
+ // v1.0.0 W4 — the table was SIX bands, not eight, and the `opus5_only` ladder is
38
+ // TWO, not three. v2.1.0 made the table FIVE bands (Sonnet 5 low/med/high, then
39
+ // Opus 5.5 low/med). Seven of these agents are named by NO default row:
31
40
  // names them, and they ship anyway (D14). They stay reachable through
32
41
  // `rubric_bands_override`, `orc diy` `fixed_executor` and `extra_fallback_agent`,
33
42
  // and deleting a generated file that no row happens to name today would be a
@@ -36,19 +45,76 @@ const OUT_DIR = path.join(ROOT, "templates", "agents");
36
45
  // lies is worse than one that admits it is unreachable by default.
37
46
  const VARIANTS = [
38
47
  { name: "orc-executor-opus-5-med", model: "claude-opus-5-5", effort: "medium", band: "highest-complexity [90,100]" },
39
- { name: "orc-executor-opus-5-low", model: "claude-opus-5-5", effort: "low", band: "upper-complexity [65,90)" },
40
- { name: "orc-executor-sonnet-5-high", model: "claude-sonnet-5", effort: "high", band: "mid-complexity [55,65)" },
41
- { name: "orc-executor-sonnet-4-6-high", model: "claude-sonnet-4-6", effort: "high", band: "low-mid-complexity [40,55)" },
42
- { name: "orc-executor-sonnet-4-6-med", model: "claude-sonnet-4-6", effort: "medium", band: "low-complexity [30,40)" },
43
- { name: "orc-executor-haiku-4-5", model: "claude-haiku-4-5", effort: null, band: "lowest-complexity [0,30)" },
44
- // NAMED BY NO BAND since v1.0.0 W4 (D14) — kept on disk, dispatched only when a
45
- // user names one explicitly.
46
- { name: "orc-executor-opus-5-high", model: "claude-opus-5-5", effort: "high", band: "no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent" },
47
- { name: "orc-executor-opus-4-8-high", model: "claude-opus-4-8", effort: "high", band: "no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent" },
48
- { name: "orc-executor-opus-4-7-high", model: "claude-opus-4-7", effort: "high", band: "no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent" },
49
- { name: "orc-executor-opus-4-7-med", model: "claude-opus-4-7", effort: "medium", band: "no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent" },
48
+ { name: "orc-executor-opus-5-low", model: "claude-opus-5-5", effort: "low", band: "upper-complexity [41,90)" },
49
+ { name: "orc-executor-sonnet-5-high", model: "claude-sonnet-5-5", effort: "high", band: "mid-complexity [31,41)" },
50
+ { name: "orc-executor-sonnet-5-med", model: "claude-sonnet-5-5", effort: "medium", band: "low-complexity [21,31)" },
51
+ { name: "orc-executor-sonnet-5-low", model: "claude-sonnet-5-5", effort: "low", band: "lowest-complexity [0,21)" },
52
+ // NAMED BY NO BAND since v1.0.0 W4 / v2.1.0 (D14) — kept on disk, dispatched
53
+ // only when a user names one explicitly.
54
+ { name: "orc-executor-sonnet-4-6-high", model: "claude-sonnet-4-6", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
55
+ { name: "orc-executor-sonnet-4-6-med", model: "claude-sonnet-4-6", effort: "medium", band: "none (opt-in only, see MODEL-MAPPING.md)" },
56
+ { name: "orc-executor-haiku-4-5", model: "claude-haiku-4-5", effort: null, band: "none (opt-in only, see MODEL-MAPPING.md)" },
57
+ { name: "orc-executor-opus-5-high", model: "claude-opus-5-5", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
58
+ { name: "orc-executor-opus-4-8-high", model: "claude-opus-4-8", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
59
+ { name: "orc-executor-opus-4-7-high", model: "claude-opus-4-7", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
60
+ { name: "orc-executor-opus-4-7-med", model: "claude-opus-4-7", effort: "medium", band: "none (opt-in only, see MODEL-MAPPING.md)" },
50
61
  ];
51
62
 
63
+ // v2.0.0 T15 — the model twins. Each family is one template under
64
+ // agents-src/twins/; a row fills five placeholders: {{NAME}}, {{MODEL}},
65
+ // {{EFFORT}}, {{DESC}} (the one-line frontmatter description) and {{WHO}} (the
66
+ // "(Sonnet 5, high)" part of the "You are …" line — absent for a family whose
67
+ // body never names its own model). The pair is a runtime choice (`opus5_only`,
68
+ // the recon gate, the wiki tier ladder), so both halves always ship.
69
+ const TWIN_DIR = path.join(ROOT, "agents-src", "twins");
70
+ const TWINS = [
71
+ { family: "analyze-mini", variants: [
72
+ { name: "orc-analyze-mini-sonnet-5-high", model: "claude-sonnet-5-5", effort: "high", who: "Sonnet 5, high",
73
+ desc: "ORC mini System Analyst — claude-sonnet-5-5, high effort. Dispatched by /orc-mini and /orc-analyze-mini at analysis: single pass, no deep mode, no scouts." },
74
+ { name: "orc-analyze-mini-opus-5-med", model: "claude-opus-5-5", effort: "medium", who: "Opus 5.5, medium",
75
+ desc: "ORC mini System Analyst — claude-opus-5-5, medium effort. Dispatched by /orc-mini and /orc-analyze-mini, instead of orc-analyze-mini-sonnet-5-high when `opus5_only: true`." },
76
+ ] },
77
+ { family: "planner-mini", variants: [
78
+ { name: "orc-planner-mini-sonnet-5-high", model: "claude-sonnet-5-5", effort: "high", who: "Sonnet 5, high",
79
+ desc: "ORC mini Requirement Planner — claude-sonnet-5-5, high effort. Dispatched by /orc-mini at planning." },
80
+ { name: "orc-planner-mini-opus-5-med", model: "claude-opus-5-5", effort: "medium", who: "Opus 5.5, medium",
81
+ desc: "ORC mini Requirement Planner — claude-opus-5-5, medium effort. Dispatched by /orc-mini at planning, instead of orc-planner-mini-sonnet-5-high when `opus5_only: true`." },
82
+ ] },
83
+ { family: "pattern-codifier", variants: [
84
+ { name: "orc-pattern-codifier-sonnet-5-high", model: "claude-sonnet-5-5", effort: "high",
85
+ desc: "ORC Pattern Codifier — claude-sonnet-5-5, high effort. Dispatched by orc-pattern (lazy /orc miss, eager orc-wiki, or manual /orc-pattern) for ONE language." },
86
+ { name: "orc-pattern-codifier-opus-5-med", model: "claude-opus-5-5", effort: "medium",
87
+ desc: "ORC Pattern Codifier — claude-opus-5-5, medium effort. Dispatched by orc-pattern, instead of orc-pattern-codifier-sonnet-5-high when `opus5_only: true`." },
88
+ ] },
89
+ { family: "recon", variants: [
90
+ { name: "orc-recon-sonnet-4-6-med", model: "claude-sonnet-4-6", effort: "medium", who: "Sonnet 4.6, medium",
91
+ desc: "ORC Recon — claude-sonnet-4-6, medium effort. Dispatched by /orc-quick at the dispatch gate, for a read-only question. It never edits." },
92
+ { name: "orc-recon-opus-5-low", model: "claude-opus-5-5", effort: "low", who: "Opus 5.5, low",
93
+ desc: "ORC Recon — claude-opus-5-5, low effort. Dispatched by /orc-quick at the dispatch gate, for a WIDE or SUBTLE read-only question. It never edits." },
94
+ ] },
95
+ { family: "retro", variants: [
96
+ { name: "orc-retro-sonnet-5-high", model: "claude-sonnet-5-5", effort: "high", who: "Sonnet 5, high",
97
+ desc: "ORC Retro miner — claude-sonnet-5-5, high effort. Dispatched by /orc-retro to mine the behavior traces. Read-only, report-only." },
98
+ { name: "orc-retro-opus-5-med", model: "claude-opus-5-5", effort: "medium", who: "Opus 5.5, medium",
99
+ desc: "ORC Retro miner — claude-opus-5-5, medium effort. Dispatched by /orc-retro, instead of orc-retro-sonnet-5-high when `opus5_only: true`. Read-only." },
100
+ ] },
101
+ { family: "scout", variants: [
102
+ { name: "orc-scout-sonnet-4-6-high", model: "claude-sonnet-4-6", effort: "high", who: "Sonnet 4.6, high",
103
+ desc: "ORC Code Scout — claude-sonnet-4-6, high effort. Dispatched by orc in the analyst's DEEP mode (≤max_scouts in parallel), ONE coverage area each." },
104
+ { name: "orc-scout-opus-5-low", model: "claude-opus-5-5", effort: "low", who: "Opus 5.5, low",
105
+ desc: "ORC Code Scout — claude-opus-5-5, low effort. Dispatched by orc in the analyst's DEEP mode, instead of orc-scout-sonnet-4-6-high when `opus5_only: true`." },
106
+ ] },
107
+ { family: "claude-writer", variants: [
108
+ { name: "orc-claude-writer-opus-5-low", model: "claude-opus-5-5", effort: "low", who: "Opus 5.5, low",
109
+ desc: "ORC CLAUDE.md Writer — claude-opus-5-5, low effort. Dispatched by /orc-claude to create, update or refresh the repo-root CLAUDE.md." },
110
+ ] },
111
+ { family: "wiki-scanner", variants: [
112
+ { name: "orc-wiki-scanner-opus-5-low", model: "claude-opus-5-5", effort: "low",
113
+ desc: "ORC Wiki Scanner — claude-opus-5-5, low effort. Dispatched by orc-wiki per scan-task (DEEP tier), ONE coverage area each." },
114
+ ] },
115
+ ];
116
+
117
+
52
118
  // Line endings are NOT content here: .gitattributes stores these files with LF
53
119
  // and checks them out native, so a Windows worktree is CRLF and a Linux one LF.
54
120
  // The injected frontmatter line therefore borrows the TEMPLATE's own ending, and
@@ -68,17 +134,44 @@ function render(template, v) {
68
134
  .replace(/\{\{BAND\}\}/g, v.band);
69
135
  }
70
136
 
71
- function main() {
72
- const checkMode = process.argv.includes("--check");
137
+ function renderTwin(template, v) {
138
+ return template
139
+ .replace(/\{\{NAME\}\}/g, v.name)
140
+ .replace(/\{\{MODEL\}\}/g, v.model)
141
+ .replace(/\{\{EFFORT\}\}/g, v.effort)
142
+ .replace(/\{\{DESC\}\}/g, v.desc)
143
+ .replace(/\{\{WHO\}\}/g, v.who || "");
144
+ }
145
+
146
+ // Every [template, row, renderer] the generator owns, executors first.
147
+ function jobs() {
73
148
  const template = fs.readFileSync(TEMPLATE, "utf8");
74
149
  if (/\{\{(?!NAME|MODEL|EFFORT_DESC|EFFORT_FM|BAND)\w/.test(template)) {
75
150
  console.error("❌ build-agents: unknown {{placeholder}} in executor.template.md");
76
151
  process.exit(1);
77
152
  }
153
+ const out = VARIANTS.map((v) => ({ v, out: render(template, v), src: "agents-src/executor.template.md" }));
154
+ for (const fam of TWINS) {
155
+ const src = "agents-src/twins/" + fam.family + ".template.md";
156
+ const t = fs.readFileSync(path.join(TWIN_DIR, fam.family + ".template.md"), "utf8");
157
+ if (/\{\{(?!(?:NAME|MODEL|EFFORT|DESC|WHO)\}\})\w/.test(t)) {
158
+ console.error("❌ build-agents: unknown {{placeholder}} in " + src);
159
+ process.exit(1);
160
+ }
161
+ if (/\{\{WHO\}\}/.test(t) !==fam.variants.every((v) => v.who)) {
162
+ console.error("❌ build-agents: " + src + " and its TWINS rows disagree about {{WHO}}");
163
+ process.exit(1);
164
+ }
165
+ for (const v of fam.variants) out.push({ v, out: renderTwin(t, v), src });
166
+ }
167
+ return out;
168
+ }
78
169
 
170
+ function main() {
171
+ const checkMode = process.argv.includes("--check");
172
+ const all = jobs();
79
173
  let drifted = 0;
80
- for (const v of VARIANTS) {
81
- const out = render(template, v);
174
+ for (const { v, out, src } of all) {
82
175
  const dest = path.join(OUT_DIR, v.name + ".md");
83
176
  if (checkMode) {
84
177
  const current = fs.existsSync(dest) ? fs.readFileSync(dest, "utf8") : null;
@@ -86,8 +179,8 @@ function main() {
86
179
  drifted++;
87
180
  console.error(
88
181
  `❌ generated agent drifted: templates/agents/${v.name}.md\n` +
89
- ` Executor agents are GENERATED — edit agents-src/executor.template.md\n` +
90
- ` (or bin/build-agents.js VARIANTS) and run: npm run build:agents`
182
+ ` This agent is GENERATED — edit ${src}\n` +
183
+ ` (or the VARIANTS / TWINS table in bin/build-agents.js) and run: npm run build:agents`
91
184
  );
92
185
  }
93
186
  } else {
@@ -98,12 +191,15 @@ function main() {
98
191
 
99
192
  if (checkMode) {
100
193
  if (drifted) process.exit(1);
101
- console.log(`✅ ORC executor agents OK — ${VARIANTS.length} files match the template.`);
194
+ const twins = all.length - VARIANTS.length;
195
+ console.log(
196
+ `✅ ORC executor agents OK — ${VARIANTS.length} files match the template; ${twins} model twins match agents-src/twins/.`
197
+ );
102
198
  }
103
199
  }
104
200
 
105
201
  // Required by test/payload.test.js, which checks the line-ending rule above
106
202
  // without writing to templates/agents/.
107
- module.exports = { VARIANTS, render, lf, eolOf };
203
+ module.exports = { VARIANTS, TWINS, render, renderTwin, lf, eolOf };
108
204
 
109
205
  if (require.main === module) main();