@azure-id/orc 1.8.2 → 1.9.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 (42) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/README-id.md +69 -51
  3. package/README.md +62 -45
  4. package/bin/cli.js +76 -16
  5. package/bin/verify-contracts.js +163 -62
  6. package/bin/verify-package.js +15 -1
  7. package/mock-run/orc-quick.md +141 -113
  8. package/package.json +1 -1
  9. package/templates/agents/MODEL-MAPPING.md +15 -5
  10. package/templates/agents/orc-executor-haiku-4-5.md +17 -0
  11. package/templates/agents/orc-executor-opus-4-7-high.md +17 -0
  12. package/templates/agents/orc-executor-opus-4-7-med.md +17 -0
  13. package/templates/agents/orc-executor-opus-4-8-high.md +17 -0
  14. package/templates/agents/orc-executor-opus-5-high.md +17 -0
  15. package/templates/agents/orc-executor-opus-5-low.md +17 -0
  16. package/templates/agents/orc-executor-opus-5-med.md +17 -0
  17. package/templates/agents/orc-executor-sonnet-4-6-high.md +17 -0
  18. package/templates/agents/orc-executor-sonnet-4-6-med.md +17 -0
  19. package/templates/agents/orc-executor-sonnet-5-high.md +17 -0
  20. package/templates/agents/orc-planner-mini-opus-5-med.md +75 -69
  21. package/templates/agents/orc-planner-mini-sonnet-5-high.md +73 -67
  22. package/templates/agents/orc-recon-opus-5-low.md +99 -0
  23. package/templates/agents/orc-recon-sonnet-4-6-med.md +99 -0
  24. package/templates/commands/orc-mini.md +10 -12
  25. package/templates/commands/orc-quick.md +20 -33
  26. package/templates/hooks/orc-trace.js +476 -471
  27. package/templates/skills/_shared/phases/rules.md +172 -159
  28. package/templates/skills/_shared/phases/trace.md +2 -1
  29. package/templates/skills/_shared/phases/wiki-consult.md +9 -5
  30. package/templates/skills/_shared/return-validation.md +22 -0
  31. package/templates/skills/context-combiner/SKILL.md +13 -13
  32. package/templates/skills/orc/subskills/orc-execution/core.md +171 -159
  33. package/templates/skills/orc-mini/SKILL.md +148 -136
  34. package/templates/skills/orc-mini/examples/mini-run-mock.md +64 -50
  35. package/templates/skills/orc-mini/references/complexity.md +105 -0
  36. package/templates/skills/orc-quick/README.md +495 -423
  37. package/templates/skills/orc-quick/SKILL.md +157 -211
  38. package/templates/skills/orc-quick/references/context-doc.md +145 -114
  39. package/templates/skills/orc-quick/references/defect.md +101 -0
  40. package/templates/skills/orc-quick/references/dispatch-gate.md +55 -24
  41. package/templates/skills/orc-quick/references/gh-mode.md +148 -127
  42. package/templates/skills/orc-quick/references/look.md +107 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,172 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v1.9.0 — the lean lanes learn to look before they leap _(2026-09-21)_
14
+
15
+ **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
16
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
17
+ the top of this file.
18
+
19
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
20
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
21
+ - **Step 3 - re-apply it to your project:** `orc update`
22
+
23
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
24
+
25
+ `/orc-quick` and `/orc-mini` are the two lanes people reach for most, and both
26
+ were working half blind. The code graph could tell them WHERE a symbol is, and
27
+ was forbidden from telling them WHAT BREAKS. A bug fix was never shown failing
28
+ before it was fixed. Read-only work was dispatched by model name, so nothing in
29
+ ORC could see it. This release fixes those three things and trims what the two
30
+ lanes cost to load.
31
+
32
+ **Nothing you have to do.** No new config key. No new prerequisite. If the code
33
+ graph is off, every new call says so in one line and the lanes work as before.
34
+
35
+ **A bug is now shown RED before it is fixed.**
36
+
37
+ - A request like *"the orders page returns 500, find it and fix it"* is sorted
38
+ as a **defect**, and the slice carries a `repro` field. The executor writes
39
+ the reproduction FIRST — a failing test in your own framework, or a command —
40
+ runs it, captures the red run, implements, and runs it again for the green.
41
+ - Both runs are printed, and the trace carries `REPRO red :: <cmd> exit=1` and
42
+ `REPRO green :: <cmd> exit=0`. `/orc-retro` counts them apart from a TDD
43
+ cycle, because a reproduction is not a `tdd_spec`.
44
+ - **A reproduction that cannot be written is `repro: none` with a reason**, and
45
+ the entry says *not reproduced* — repeated at the commit offer, so a fix
46
+ nobody has seen work is never quietly shipped as one. It is never faked.
47
+ - A `done` return whose `before` run was green, or whose `after` run is still
48
+ red, is a malformed return and is treated as a failure.
49
+
50
+ Why: without the red run, a fix is proven against your test suite — which was
51
+ green before and is green after. With it, the fix is proven against the bug you
52
+ reported. It costs one extra run of one command.
53
+
54
+ **The two lanes may now ask what breaks.**
55
+
56
+ - `/orc-quick` gained `orc graph map`, `changes` and `coverage`; `/orc-mini`
57
+ gained `map`, `impact`, `changes` and `cochange`. Until now both could ask
58
+ only `ctx`.
59
+ - **Affected tests run first.** After a dispatch that wrote code, `orc graph
60
+ changes` names the tests that reach the change — a test that arrives through
61
+ a URL included — and those run before the suite. A runner that takes no file
62
+ list says so in one line and runs the suite.
63
+ - **Every entry carries a blast-radius line:** `3 symbols touched · callers 7 in
64
+ 4 files · tests reach 2 · risk high: <symbol> (exported, fan-in 4, no test
65
+ reaches it)`. A `risk` word never appears without its reason. Nothing indexed
66
+ means it says that instead of a number.
67
+ - **A request that names no file** starts with `orc graph map --focus`, so
68
+ *"where is the retry logic?"* no longer begins with a guess at a filename.
69
+
70
+ **`/orc-mini`'s complexity read now carries numbers.**
71
+
72
+ It used to be a sentence of judgment. It is now one line with counts behind it,
73
+ and four thresholds that each carry their reason:
74
+
75
+ ```
76
+ complexity: recommend /orc — 6 files · callers 27 in 9 files · risk auth (src/routes/orders.js:12) · cochange src/auth.js x3 not in plan
77
+ ```
78
+
79
+ Confident callers in 4 or more files outside the plan · 8 or more confident
80
+ callers · any cited risk class · a file that history says is always touched
81
+ alongside one of yours. `AMBIGUOUS` callers are counted and printed as
82
+ `maybe <n>`; they never trip a threshold alone. **It is an offer, never a
83
+ switch**, and continuing writes the NUMBERS into the decision log so a later
84
+ `/orc-retro` can move a threshold instead of anyone arguing about it. With the
85
+ graph off it says `(graph off)` and decides from the cited risk classes alone —
86
+ it never invents a number.
87
+
88
+ The mini planner is dispatched WITH those facts (`graph_facts`), so it grounds
89
+ its own file list on them. A file that history says belongs in the change, and
90
+ that the plan does not name, becomes an open question — never a file the planner
91
+ adds in silence.
92
+
93
+ **Read-only work is a real agent now.**
94
+
95
+ - `/orc-quick`'s recon is a pinned pair — `orc-recon-sonnet-4-6-med` and
96
+ `orc-recon-opus-5-low` — with one return contract: a short answer (12 lines at
97
+ most), evidence with `file:line`, what it searched, what it did NOT find and
98
+ the queries that prove it, and `graph_used`.
99
+ - They are **traced**. The hook writes `SPAWN` and `RETURN` for them, they show
100
+ up in `orc run inflight` while they run, and `/orc-retro` can count them. Each
101
+ is dispatched through the same gate as everything else — the gate still asks
102
+ every time.
103
+ - A blast-radius answer keeps four kinds of caller APART — a direct caller, one
104
+ that reaches through a URL, one through an alias, one through a base class —
105
+ and when a list rests on the map alone it carries the sentence that says so:
106
+ *A card lists every caller that NAMES the symbol. A card's silence is not
107
+ proof of absence.*
108
+ - **`other — name a model` stays** as the escape hatch, and it now names a MODEL
109
+ only. The Agent tool has no per-call effort knob, so the old "effort" option
110
+ was a setting that did not exist.
111
+
112
+ **The gate can now recommend, and it still never chooses.**
113
+
114
+ A menu line may carry an arrow marked `suggested` WITH its reason from the dig —
115
+ 8 or more callers, a visible risk class, or more than three files changing. It
116
+ is a recommendation printed beside the option, never a pre-selection, and every
117
+ menu still ends with `Your choice — nothing runs until you answer.`
118
+
119
+ **Both lanes cost less to load.**
120
+
121
+ - The two skill descriptions load into **every** session. `/orc-quick`'s went
122
+ 619 to 326 characters and `/orc-mini`'s 493 to 294, with every trigger phrase
123
+ kept word for word and a test that holds them there. Across all 33 skills that
124
+ is 492 characters off what every session pays before it does anything.
125
+ - The anti-slop rules card in a `/orc-quick` slice is now a **compact** form:
126
+ about 1,460 tokens instead of about 3,469, on every dispatch and re-sent every
127
+ executor turn. Every HARD rule keeps its id, its title and its instruction and
128
+ loses only the worked examples, the pack file is named beside it, and the JSON
129
+ says `compact: true` — a reader that cannot tell a short card from a stripped
130
+ one cannot trust either.
131
+ - `/orc-quick`'s spine went 379 to 325 lines and gained a budget it never had;
132
+ `/orc-mini`'s went 268 to 280 against a pin raised 270 to 280 with its reason
133
+ written into the guard. What left both spines is stated once, in the file that
134
+ owns it.
135
+
136
+ **Smaller things.**
137
+
138
+ - `orc graph update --notes-pending` replaces two calls with one in both lanes.
139
+ - One `orc graph gain` line at the close of a code-writing request, copied word
140
+ for word: what the map put in (recorded) and an estimate, always a range, of
141
+ what it kept out.
142
+ - `/orc-mini` passes wiki **paths**, not page bodies, to its planner and its
143
+ executor — the orchestrator's own context is the surface that fills up first.
144
+ - `wiki_used: none` and `graph_used: none` are recorded rather than dropped. Two
145
+ runs in a row of `wiki_used: none` on fresh pages prints one line suggesting
146
+ you check those pages' TL;DRs.
147
+ - `/orc-quick`'s `gh` probe is lazy — it runs on the first PR request, not at
148
+ every preflight.
149
+ - Each `/orc-quick` trace packet is built from a running record with the time
150
+ each event actually happened, instead of one timestamp for the whole packet.
151
+
152
+ **What this release does NOT promise.** It does not lower your bill. ORC
153
+ measured that in v1.8.2 and the answer has not changed: search results are a
154
+ fraction of one percent of what a session adds to its context. The claim here is
155
+ correctness, traceability and fewer round trips — a bug proven fixed, a dig that
156
+ shows up in the trace, and the affected tests run before the suite.
157
+
158
+ **Limits, with the numbers.**
159
+
160
+ - **The live-session evaluation in `eval/` did not run for this release.** The
161
+ deterministic half is covered by the suite — the shipped trace hook is driven
162
+ with a real recon dispatch and asserted to emit `SPAWN` and the `PHASE-EDGE`,
163
+ the `repro` contract is asserted across all ten executor agents, and the
164
+ compact rules card is asserted to keep every HARD rule id. What is NOT
165
+ measured is the part that needs a person driving a lane: whether a defect run
166
+ shows red then green three times out of three, whether recon's recall on
167
+ URL-reached callers beats the graph-off run, and whether a request with no
168
+ filename finds its files in fewer reads than the v1.8.2 baseline. Those are
169
+ the gates in the plan, and they are unmet, not passed.
170
+ - **`/orc-quick` still cannot call `orc graph impact`.** It has no planner and
171
+ no declared-file set before the gate, so the two planning reads stay out of
172
+ its catalogue. Its recon agent calls them instead.
173
+ - The complexity thresholds (4 files · 8 callers · any risk · 3 co-commits) are
174
+ a starting point chosen with reasons, not measured ones. They are printed in
175
+ the `GATE complexity` trace line precisely so a retro can move them.
176
+
177
+ ---
178
+
13
179
  ### v1.8.2 — the map that finds what a grep cannot _(2026-09-21)_
14
180
 
15
181
  **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
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.8.2-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.9.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.8.2** · diperbarui 21-09-2026 · [daftar perubahan lengkap](CHANGELOG.md)
16
+ **Versi terbaru: v1.9.0** · diperbarui 21-09-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
 
@@ -272,9 +272,9 @@ pemakaian 5 jam, pemakaian mingguan, dan beberapa hal lain.
272
272
  |---|---|---|
273
273
  | **`/orc`** | Alur penuh: terima → rencana → gelombang paralel bernilai → periksa → uji → kirim. Rajin menyimpan titik simpan; bisa dilanjutkan di sesi baru. | [lihat](mock-run/orc.md) |
274
274
  | **`/orc-ultra`** | Sama, ditambah penasihat Opus 5 **xhigh** dan tiga gerbang penilaian. Analisis dalam, pola kode, tes, dan keamanan dipaksa menyala. Memang mahal. | [lihat](mock-run/orc-ultra.md) |
275
- | **`/orc-mini`** | Satu agen Sonnet 5, satu pemeriksaan build + tes, lalu kirim. Melewati review penuh dan pengujian. Bisa pindah ke alur penuh di tengah jalan kalau diminta. | [lihat](templates/skills/orc-mini/examples/mini-run-mock.md) |
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
- | **`/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. | [lihat](mock-run/orc-quick.md) |
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
278
  | **`/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
279
 
280
280
  ### Memikirkan apa yang mau dibuat
@@ -465,6 +465,14 @@ orc graph gain # apa yang dimasukkan peta, dan perkiraan
465
465
  membangunnya di preflight dan memperbaruinya setelah setiap perubahan. Lane
466
466
  lain tidak pernah memanggilnya. **Tidak ada yang berjalan dengan pewaktu dan
467
467
  tidak ada yang berjalan di latar belakang.**
468
+ - **Setiap lane hanya boleh menanyakan pertanyaan yang disebut katalognya
469
+ sendiri** (`orc lane calls <lane>`), dan v1.9.0 melebarkan itu untuk dua lane
470
+ ramping. `/orc-quick` sekarang boleh menanyakan `map`, `changes` dan
471
+ `coverage`, jadi ia bisa menyebut apa yang tersentuh satu perubahan dan
472
+ menjalankan test yang terdampak lebih dulu; `/orc-mini` boleh menanyakan
473
+ `map`, `impact`, `changes` dan `cochange`, yang menjadi angka di balik baris
474
+ kompleksitasnya. Sebelum ini keduanya hanya boleh menanyakan di mana satu
475
+ simbol berada.
468
476
  - **Hook itu juga memberi pekerja titik acuan yang tadinya harus dicari sendiri**
469
477
  — untuk Grep, Glob, dan pencarian lewat shell (`grep`, `rg`, `git grep`,
470
478
  `findstr`) — dan semua yang diberikannya ditandai sebagai data repositori,
@@ -760,56 +768,66 @@ Bacalah sebagai catatan putaran itu, bukan sebagai audit terkini:
760
768
  **Riwayat lengkap: [CHANGELOG.md](CHANGELOG.md)** — atau `orc changelog`, yang
761
769
  hanya mencetak yang lebih baru dari versi yang Anda punya.
762
770
 
763
- ### v1.8.2 - peta yang menemukan apa yang tidak bisa ditemukan grep _(21-09-2026)_
764
-
765
- v1.8.0 merilis graf kode dengan satu lubang yang sudah diketahui: kartu hanya
766
- menulis pemanggil yang MENYEBUT nama simbolnya, jadi test yang sampai ke satu
767
- route lewat URL bukan pemanggil dan kartunya diam soal itu. **Sekarang URL
768
- adalah satu tautan** — begitu juga alias instance
769
- (`const svc = new OrderService(); svc.run()`), method warisan, dan nama yang
770
- di-re-export lewat barrel. Panggilan tanpa penerima tidak lagi diarahkan ke
771
- satu-satunya method di repositori yang namanya sama; tebakan itu adalah tautan
772
- karangan dan sudah dihapus. Di django, tautan yang pasti naik dari 65.379 ke
773
- 72.955 dan tebakan `UNIQUE` turun dari 23.866 ke 6.442.
774
-
775
- **Lima bahasa baru** — Ruby, Rust, Kotlin, C / C++ dan blok `<script>` komponen
776
- Vue atau Svelte. **Parser pinjaman** jika proyek Anda sudah punya alatnya:
777
- `node_modules/typescript` milik Anda dan `go` di PATH bergabung dengan `ast`
778
- milik Python. ORC sendiri tetap tanpa dependency.
779
-
780
- **Lebih sedikit bolak-balik.** `ctx --source [N]` menambahkan baris target ke
781
- kartunya. `ctx --for-slice` hanya mencetak tampak luar satu berkas yang memang
782
- akan dibaca penuh oleh agent — 30–51% lebih kecil dari kartu yang digantikannya.
783
- `update --notes-pending` menjawab keduanya dalam satu panggilan. Hook sekarang
784
- juga menjawab pencarian lewat shell, dan `code_graph_hooks on,read` menyebut
785
- enam simbol paling banyak dijangkau di satu berkas besar supaya pembacaan
786
- berikutnya bisa meminta satu rentang saja.
787
-
788
- **`orc graph map`** memberi peringkat repositori sebelum Anda tahu nama
789
- berkasnya, di dalam satu batas token, dengan `--focus`. Peringkat adalah
790
- petunjuk tentang di mana harus melihat lebih dulu, bukan bukti. **Kartu satu
791
- simbol kira-kira dua kali lebih cepat** — cache resolusinya sekarang dipecah
792
- menjadi shard, jadi django turun dari 881 ke 480 ms, dan shard menjawab persis
793
- sama dengan indeks penuh atau menolak menjawab (577 kartu dibandingkan, 0
794
- berbeda).
795
-
796
- **`orc graph gain`** melaporkan apa yang dimasukkan peta — tercatat — dan
797
- perkiraan, selalu sebagai rentang, tentang apa yang ditahannya. Angka tunggal
798
- tidak pernah dicetak, dan penghematan yang tidak bisa dibuktikan tidak pernah
799
- diklaim.
800
-
801
- **`code_graph_ignore`** adalah kunci baru: glob tambahan yang tidak pernah
802
- diindeks graf.
803
-
804
- Dua gate di rilis ini tidak tercapai, dan CHANGELOG menyebutkannya lengkap
805
- dengan angkanya: parser pinjaman tetap dirilis atas keputusan pemelihara
806
- walaupun gate tingkat kepastian mengukur +1,0 / −0,3 / −0,3, dan `orc graph map`
807
- hanya dihubungkan ke perencanaan karena pengukuran ulang transkrip mendapat 0,39
808
- panggilan perencanaan yang bisa dijawab per run, terhadap gate tiga.
771
+ ### v1.9.0 - lane ramping belajar melihat dulu sebelum melompat _(21-09-2026)_
772
+
773
+ `/orc-quick` dan `/orc-mini` adalah dua lane yang paling sering dipakai orang,
774
+ dan keduanya bekerja setengah buta. Graf kode bisa memberi tahu mereka DI MANA
775
+ satu simbol berada, dan dilarang memberi tahu APA YANG RUSAK. Perbaikan bug
776
+ tidak pernah ditunjukkan gagal lebih dulu. Pekerjaan baca-saja dikirim lewat
777
+ nama model, jadi tidak ada satu pun bagian ORC yang bisa melihatnya.
778
+
779
+ **Sekarang bug ditunjukkan MERAH dulu sebelum diperbaiki.** Permintaan seperti
780
+ *"halaman orders mengembalikan 500, cari dan perbaiki"* digolongkan sebagai
781
+ **defect**, dan agen eksekutor menulis reproduksinya LEBIH DULU — satu test yang
782
+ gagal dalam framework Anda sendiri, atau satu perintah — menjalankannya sampai
783
+ merah, memperbaikinya, lalu menjalankannya lagi sampai hijau. Kedua jalannya
784
+ dicetak dan keduanya masuk ke jejak. Reproduksi yang tidak bisa ditulis menjadi
785
+ `repro: none` beserta alasannya, dan catatannya berbunyi **tidak tereproduksi** —
786
+ diulang lagi saat penawaran commit. Itu tidak pernah dikarang. Tanpa jalan merah,
787
+ perbaikan hanya terbukti terhadap test suite Anda, yang sudah hijau sebelum dan
788
+ sesudahnya; dengan jalan merah, perbaikan terbukti terhadap bug yang Anda
789
+ laporkan.
790
+
791
+ **Kedua lane sekarang boleh bertanya apa yang rusak.** `/orc-quick` mendapat
792
+ `map`, `changes` dan `coverage`; `/orc-mini` mendapat `map`, `impact`, `changes`
793
+ dan `cochange`. **Test yang terdampak dijalankan lebih dulu** — termasuk test
794
+ yang sampai ke perubahan lewat URL — dan setiap catatan membawa satu baris
795
+ radius dampak, tempat kata `risk` tidak pernah muncul tanpa alasannya.
796
+ Permintaan yang tidak menyebut satu berkas pun sekarang dimulai dengan
797
+ `orc graph map --focus`, bukan dengan tebakan nama berkas.
798
+
799
+ **Pembacaan kompleksitas `/orc-mini` membawa angka.** Dulu itu satu kalimat
800
+ penilaian; sekarang satu baris berisi hitungan dan empat ambang yang
801
+ masing-masing menyebut kenapa angkanya segitu: pemanggil di 4 berkas atau lebih
802
+ di luar rencana, 8 pemanggil atau lebih, kelas risiko apa pun yang dikutip, atau
803
+ satu berkas yang menurut riwayat selalu ikut tersentuh. Itu **tawaran, bukan
804
+ perpindahan**, dan kalau Anda tetap lanjut, angkanya ditulis ke catatan
805
+ keputusan supaya `/orc-retro` nanti bisa menggeser ambangnya.
806
+
807
+ **Pekerjaan baca-saja sekarang agen sungguhan.** Recon adalah sepasang agen
808
+ tetap — `orc-recon-sonnet-4-6-med` dan `orc-recon-opus-5-low` — dengan kontrak
809
+ pengembalian, terlihat di jejak dan di `orc run inflight`. Pilihan
810
+ `other — sebut satu model` tetap ada sebagai jalan keluar. Gerbangnya sekarang
811
+ boleh mencetak `suggested` di samping satu baris BESERTA alasannya, dan ia tetap
812
+ tidak pernah memilih: setiap menu berakhir dengan *pilihan Anda — tidak ada yang
813
+ berjalan sampai Anda menjawab*.
814
+
815
+ **Kedua lane lebih murah untuk dimuat.** Dua deskripsi yang dibayar setiap sesi
816
+ turun dari 619 ke 326 dan dari 493 ke 294 karakter, dengan setiap frasa pemicu
817
+ tetap utuh. Kartu aturan dalam potongan `/orc-quick` sekarang berbentuk ringkas —
818
+ sekitar 1.460 token, bukan 3.469 — yang menjaga id, judul dan instruksi setiap
819
+ aturan HARD, dan hanya melepas contoh-contohnya.
820
+
821
+ **Rilis ini tidak menurunkan tagihan Anda**, dan tidak mengklaim begitu.
822
+ Klaimnya adalah kebenaran, keterlacakan, dan lebih sedikit bolak-balik.
823
+ **Evaluasi sesi langsung tidak dijalankan** — setengah bagian deterministiknya
824
+ ada di test suite, tetapi tiga gate yang butuh orang menjalankan lane tidak
825
+ tercapai, bukan lulus. CHANGELOG menyebutkan satu per satu.
809
826
 
810
827
  <details>
811
- <summary><strong>Rilis sebelumnya</strong> — 118 rilis, hanya judulnya. Teks lengkapnya (dalam bahasa Inggris) ada di <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
828
+ <summary><strong>Rilis sebelumnya</strong> — 119 rilis, hanya judulnya. Teks lengkapnya (dalam bahasa Inggris) ada di <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
812
829
 
830
+ - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
813
831
  - **v1.8.1** — the guard that only failed on Windows · _2026-09-16_
814
832
  - **v1.8.0** — the code graph: a map of the code that stays fresh · _2026-09-16_
815
833
  - **v1.7.1** — the rules card now reaches the agent · _2026-09-14_
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.8.2-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.9.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.8.2** · updated 2026-09-21 · [full changelog](CHANGELOG.md)
17
+ **Latest: v1.9.0** · updated 2026-09-21 · [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
 
@@ -251,9 +251,9 @@ ORC have terminal hook to see: Context Window %, 5 Hour usage %, Weekly usage %
251
251
  |---|---|---|
252
252
  | **`/orc`** | The full pipeline: intake → plan → scored parallel waves → review → verify → ship. Checkpoints eagerly; resumes in a fresh session. | [see it](mock-run/orc.md) |
253
253
  | **`/orc-ultra`** | The same, plus an Opus 5 **xhigh** advisor and three judgment gates. Deep analysis, patterns, tests and security forced on. Costly by design. | [see it](mock-run/orc-ultra.md) |
254
- | **`/orc-mini`** | One Sonnet 5 executor, a build + test smoke gate, ship. Skips full review and verify. Switches to the full flow mid-run on request. | [see it](templates/skills/orc-mini/examples/mini-run-mock.md) |
254
+ | **`/orc-mini`** | One Sonnet 5 executor, a build + test smoke gate, ship. Skips full review and verify. A one-line **complexity read** with counts behind it offers the full lane when the change is wider than one area. Switches to the full flow mid-run on request. | [see it](templates/skills/orc-mini/examples/mini-run-mock.md) |
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
- | **`/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. | [see it](mock-run/orc-quick.md) |
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
258
  | **`/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
259
 
@@ -435,6 +435,12 @@ orc graph gain # what the map put in, and an estimate of
435
435
  — `/orc`, `/orc-ultra`, `/orc-diy`, `/orc-mini`, `/orc-fast`, `/orc-quick` —
436
436
  still builds it at preflight and updates it after each change. Other lanes
437
437
  never call it. **Nothing runs on a timer and nothing runs in the background.**
438
+ - **Each lane may ask only the questions its own catalogue names** (`orc lane
439
+ calls <lane>`), and v1.9.0 widened that for the two lean lanes. `/orc-quick`
440
+ can now ask `map`, `changes` and `coverage`, so it can say what a change
441
+ touches and run the affected tests first; `/orc-mini` can ask `map`, `impact`,
442
+ `changes` and `cochange`, which are the counts behind its complexity line.
443
+ Until now both could ask only where a symbol is.
438
444
  - **The hook also hands a worker the anchors it would otherwise search for** —
439
445
  for a Grep, a Glob and a shell search (`grep`, `rg`, `git grep`, `findstr`) —
440
446
  and everything it hands over is labelled repository data, never an instruction.
@@ -706,50 +712,61 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
706
712
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
707
713
  only what is newer than the version you have.
708
714
 
709
- ### v1.8.2 — the map that finds what a grep cannot _(2026-09-21)_
710
-
711
- v1.8.0 shipped the code graph with a known hole: a card listed every caller that
712
- NAMES a symbol, so a test reaching a route by its URL was not a caller and the
713
- card was silent about it. **A URL is now an edge** — and so is an instance alias
714
- (`const svc = new OrderService(); svc.run()`), an inherited method and a name
715
- re-exported through a barrel. A bare call no longer resolves to the only method
716
- in the repository with that name; that guess was an invented edge and it is gone.
717
- On django, confident edges went 65,379 → 72,955 and `UNIQUE` guesses 23,866 →
718
- 6,442.
719
-
720
- **Five more languages** — Ruby, Rust, Kotlin, C / C++ and the `<script>` block of
721
- a Vue or Svelte component. **Borrowed parsers** where your project already has
722
- the tool: your own `node_modules/typescript` and the `go` on PATH join Python's
723
- `ast`. ORC still has zero dependencies.
724
-
725
- **Fewer round trips.** `ctx --source [N]` adds the target's lines to the card.
726
- `ctx --for-slice` prints only the outside view of a file an agent is about to
727
- read in full, 30–51% smaller than the card it replaces. `update --notes-pending`
728
- answers both in one call. The hook now answers a shell search too, and
729
- `code_graph_hooks on,read` names a wide file's six most reached symbols so the
730
- next read can ask for a range.
731
-
732
- **`orc graph map`** ranks the repository before you know a file name, inside a
733
- budget, with `--focus`. Rank is a hint about where to look first, never proof.
734
- **A one-symbol card is about twice as fast** — the resolution cache is sharded,
735
- so django goes 881 → 480 ms, and the shards answer exactly what the full index
736
- answers or they decline (577 cards compared, 0 different).
737
-
738
- **`orc graph gain`** reports what the map put in — recorded — and an estimate,
739
- always a range, of what it kept out. It never prints one number and never claims
740
- a saving it cannot show.
741
-
742
- **`code_graph_ignore`** is a new key: extra globs the graph never indexes.
743
-
744
- Two gates in this release were missed and the CHANGELOG says so with the
745
- numbers: the borrowed parsers ship on the maintainer's call although the
746
- confident-rate gate measured +1.0 / −0.3 / −0.3, and `orc graph map` is wired to
747
- planning only because the replay measured 0.39 answerable planning calls per run
748
- against a gate of three.
715
+ ### v1.9.0 — the lean lanes learn to look before they leap _(2026-09-21)_
716
+
717
+ `/orc-quick` and `/orc-mini` are the two lanes people reach for most, and both
718
+ were working half blind. The code graph could tell them WHERE a symbol is and
719
+ was forbidden from telling them WHAT BREAKS. A bug fix was never shown failing
720
+ before it was fixed. Read-only work was dispatched by model name, so nothing in
721
+ ORC could see it.
722
+
723
+ **A bug is now shown RED before it is fixed.** A request like *"the orders page
724
+ returns 500, find it and fix it"* is sorted as a **defect**, and the executor
725
+ writes the reproduction FIRST — a failing test in your own framework, or a
726
+ command — runs it red, implements, and runs it green. Both runs are printed and
727
+ both reach the trace. A reproduction that cannot be written is `repro: none`
728
+ with its reason, and the entry says **not reproduced** — repeated at the commit
729
+ offer. It is never faked. Without the red run a fix is proven against your test
730
+ suite, which was green before and after; with it, the fix is proven against the
731
+ bug you reported.
732
+
733
+ **Both lanes may now ask what breaks.** `/orc-quick` gained `map`, `changes` and
734
+ `coverage`; `/orc-mini` gained `map`, `impact`, `changes` and `cochange`. The
735
+ **affected tests run first** — a test that reaches the change through a URL
736
+ included — and every entry carries a blast-radius line where a `risk` word never
737
+ appears without its reason. A request that names no file now starts with
738
+ `orc graph map --focus` instead of a guess at a filename.
739
+
740
+ **`/orc-mini`'s complexity read carries numbers.** It was a sentence of
741
+ judgment; it is now one line with counts and four thresholds that each state why
742
+ that number: callers in 4 or more files outside the plan, 8 or more callers, any
743
+ cited risk class, or a file history says is always touched alongside yours. It
744
+ is an **offer, never a switch**, and continuing writes the numbers into the
745
+ decision log so a later `/orc-retro` can move a threshold.
746
+
747
+ **Read-only work is a real agent.** Recon is a pinned pair —
748
+ `orc-recon-sonnet-4-6-med` and `orc-recon-opus-5-low` — with a return contract,
749
+ visible in the trace and in `orc run inflight`. `other — name a model` stays as
750
+ the escape hatch. The gate may now print `suggested` beside one line WITH its
751
+ reason, and it still never chooses: every menu ends with *your choice — nothing
752
+ runs until you answer*.
753
+
754
+ **Both lanes cost less to load.** The two descriptions, which every session
755
+ pays for, went 619 → 326 and 493 → 294 characters with every trigger phrase
756
+ kept. The rules card in a `/orc-quick` slice is now a compact form — about 1,460
757
+ tokens instead of 3,469 — that keeps every HARD rule's id, title and instruction
758
+ and loses only the worked examples.
759
+
760
+ **It does not lower your bill**, and this release does not claim it does. The
761
+ claim is correctness, traceability and fewer round trips. **The live-session
762
+ evaluation did not run** — the deterministic half is in the test suite, but the
763
+ three gates that need a person driving a lane are unmet, not passed. The
764
+ CHANGELOG names each one.
749
765
 
750
766
  <details>
751
- <summary><strong>Earlier releases</strong> — 118 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
767
+ <summary><strong>Earlier releases</strong> — 119 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
752
768
 
769
+ - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
753
770
  - **v1.8.1** — the guard that only failed on Windows · _2026-09-16_
754
771
  - **v1.8.0** — the code graph: a map of the code that stays fresh · _2026-09-16_
755
772
  - **v1.7.1** — the rules card now reaches the agent · _2026-09-14_