@azure-id/orc 1.8.1 → 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 (69) hide show
  1. package/CHANGELOG.md +386 -0
  2. package/README-id.md +110 -73
  3. package/README.md +96 -33
  4. package/bin/cli.js +45520 -44867
  5. package/bin/graph-extract.js +2409 -120
  6. package/bin/graph-gain.js +404 -0
  7. package/bin/graph-map.js +232 -0
  8. package/bin/graph-notes.js +49 -8
  9. package/bin/graph-query.js +1770 -808
  10. package/bin/graph-resolve.js +93 -16
  11. package/bin/graph-shard.js +325 -0
  12. package/bin/graph.js +658 -605
  13. package/bin/verify-contracts.js +297 -56
  14. package/bin/verify-package.js +29 -1
  15. package/bin/webui/api.js +6 -0
  16. package/bin/webui/fixtures/index.js +6 -1
  17. package/bin/webui/fixtures/knowledge.js +41 -1
  18. package/bin/webui/fixtures/stats.js +107 -104
  19. package/bin/webui/i18n/en/knowledge.json +16 -1
  20. package/bin/webui/i18n/id/knowledge.json +16 -1
  21. package/bin/webui/js/panels/knowledge.js +68 -3
  22. package/mock-run/orc-quick.md +141 -113
  23. package/package.json +1 -1
  24. package/templates/agents/MODEL-MAPPING.md +15 -5
  25. package/templates/agents/orc-executor-haiku-4-5.md +25 -13
  26. package/templates/agents/orc-executor-opus-4-7-high.md +25 -13
  27. package/templates/agents/orc-executor-opus-4-7-med.md +25 -13
  28. package/templates/agents/orc-executor-opus-4-8-high.md +25 -13
  29. package/templates/agents/orc-executor-opus-5-high.md +25 -13
  30. package/templates/agents/orc-executor-opus-5-low.md +25 -13
  31. package/templates/agents/orc-executor-opus-5-med.md +25 -13
  32. package/templates/agents/orc-executor-sonnet-4-6-high.md +25 -13
  33. package/templates/agents/orc-executor-sonnet-4-6-med.md +25 -13
  34. package/templates/agents/orc-executor-sonnet-5-high.md +25 -13
  35. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +15 -12
  36. package/templates/agents/orc-planner-mini-opus-5-med.md +75 -69
  37. package/templates/agents/orc-planner-mini-sonnet-5-high.md +73 -67
  38. package/templates/agents/orc-recon-opus-5-low.md +99 -0
  39. package/templates/agents/orc-recon-sonnet-4-6-med.md +99 -0
  40. package/templates/commands/orc-mini.md +10 -12
  41. package/templates/commands/orc-quick.md +20 -33
  42. package/templates/hooks/README.md +13 -3
  43. package/templates/hooks/orc-graph-hook.js +148 -13
  44. package/templates/hooks/orc-trace.js +476 -471
  45. package/templates/skills/_shared/code-graph.md +148 -20
  46. package/templates/skills/_shared/phases/execution.md +13 -11
  47. package/templates/skills/_shared/phases/planning.md +8 -1
  48. package/templates/skills/_shared/phases/rules.md +172 -159
  49. package/templates/skills/_shared/phases/ship.md +5 -1
  50. package/templates/skills/_shared/phases/trace.md +4 -1
  51. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  52. package/templates/skills/_shared/read-ladder.md +10 -2
  53. package/templates/skills/_shared/return-validation.md +22 -0
  54. package/templates/skills/context-combiner/SKILL.md +13 -13
  55. package/templates/skills/orc/SKILL.md +1 -1
  56. package/templates/skills/orc/subskills/orc-execution/core.md +171 -159
  57. package/templates/skills/orc-analyze/SKILL.md +13 -13
  58. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  59. package/templates/skills/orc-mini/SKILL.md +148 -136
  60. package/templates/skills/orc-mini/examples/mini-run-mock.md +64 -50
  61. package/templates/skills/orc-mini/references/complexity.md +105 -0
  62. package/templates/skills/orc-quick/README.md +495 -423
  63. package/templates/skills/orc-quick/SKILL.md +157 -211
  64. package/templates/skills/orc-quick/references/context-doc.md +145 -114
  65. package/templates/skills/orc-quick/references/defect.md +101 -0
  66. package/templates/skills/orc-quick/references/dispatch-gate.md +55 -24
  67. package/templates/skills/orc-quick/references/gh-mode.md +148 -127
  68. package/templates/skills/orc-quick/references/look.md +107 -0
  69. package/templates/skills/orc-wiki/references/staleness.md +1 -1
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.0-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.0** · diperbarui 16-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
@@ -411,30 +411,51 @@ Peta lokal tentang bagaimana kode Anda saling terhubung. **Default-nya mati.**
411
411
  ```bash
412
412
  orc config set code_graph on # lane kode membuat dan memakai peta (gratis)
413
413
  orc config set code_graph_notes wave # opsional: catatan satu kalimat (memakai token)
414
+ orc graph map # peringkat repositori, sebelum Anda tahu nama berkasnya
414
415
  orc graph ctx OrderService.create # kartu: pemanggil, yang dipanggil, efek SQL/HTTP/env
416
+ orc graph ctx "GET /orders/:id" # route juga satu simbol
415
417
  orc graph changes # apa yang diubah diff INI, dan seberapa berisiko
416
418
  orc graph cochange src/orders.js # apa yang biasanya berubah bersama berkas ini
417
419
  orc graph coverage src/orders.js # berapa banyak yang benar-benar dibaca parser
420
+ orc graph gain # apa yang dimasukkan peta, dan perkiraan apa yang ditahannya
418
421
  ```
419
422
 
420
423
  - **Strukturnya gratis.** CLI mem-parse kodenya. Tanpa model, tanpa dependency.
421
424
  Fungsi, method, class dan handler route (`GET /orders/:id`); middleware yang
422
425
  dikirim lewat nama menjadi tautan `used by`.
426
+ - **Bahasanya:** JavaScript, TypeScript, Python, Go, Java, C#, PHP, Ruby, Rust,
427
+ Kotlin, C / C++, dan blok `<script>` komponen Vue atau Svelte. Jika proyek
428
+ Anda sudah punya alatnya, ORC meminjamnya dan hasil parse-nya tepat — `ast`
429
+ milik Python, `node_modules/typescript` milik Anda, dan `go` di PATH. ORC
430
+ sendiri tetap tanpa dependency. `ORC_GRAPH_NO_BORROW=1` mematikannya.
431
+ - **URL adalah satu tautan.** Test yang memanggil
432
+ `request(app).get("/orders/search")` adalah pemanggil route itu, dan kartunya
433
+ menyebutkannya. Begitu juga alias instance
434
+ (`const svc = new OrderService(); svc.run()`), method warisan (`this.ok()` →
435
+ `Base.ok`), dan nama yang di-re-export lewat berkas barrel.
423
436
  - **Update-nya kecil.** Git sudah menghitung hash setiap file. Hanya file yang
424
437
  hash-nya berubah yang di-parse ulang — perubahan dari teman satu tim diperbaiki
425
438
  sendiri di preflight berikutnya.
426
439
  - **Setiap tautan menyebut seberapa yakin:** `LOCAL`, `IMPORT`, `UNIQUE`,
427
- `AMBIGUOUS` (semua kandidat ditulis) atau `UNRESOLVED`. Graf tidak pernah menebak.
440
+ `ROUTE`, `AMBIGUOUS` (semua kandidat ditulis) atau `UNRESOLVED`. Graf tidak
441
+ pernah menebak.
428
442
  - **Kartu punya batas token.** Kartu tidak pernah melewatinya, dan menyebut apa
429
- yang disembunyikan. `--format tree` menulis nama kolom satu kali saja, bukan di
430
- setiap baris, dan kembali ke bentuk biasa jika kartunya terlalu kecil.
443
+ yang disembunyikan. `--source [N]` menambahkan baris milik targetnya ke
444
+ panggilan yang sama. `--for-slice` hanya mencetak tampak LUAR satu berkas yang
445
+ memang akan dibaca penuh oleh agent. `--format tree` menulis nama kolom satu
446
+ kali saja, bukan di setiap baris.
447
+ - **`orc graph map` menjawab "berkas mana yang penting di sini"** sebelum Anda
448
+ tahu nama berkasnya, di dalam satu batas token. `--focus` menyusun ulang
449
+ peringkat seluruh repositori di sekitar berkas atau nama yang sudah disebut
450
+ permintaan Anda. **Peringkat adalah petunjuk tentang di mana harus melihat
451
+ lebih dulu**, bukan bukti bahwa satu berkas penting untuk perubahan ini.
431
452
  - **Graf menunjukkan letak kode. Graf tidak menggantikan membaca kode.** Agent
432
453
  tetap membaca rentang barisnya sebelum bertindak. Kepala kartu menulis
433
454
  `coverage partial 327-466` jika parser tidak selesai membaca satu berkas —
434
455
  **tidak adanya celah yang tercatat bukan bukti bahwa semuanya lengkap.** Kartu
435
- juga hanya menulis pemanggil yang MENYEBUT nama simbolnya: pemanggil yang
436
- sampai lewat route HTTP atau dispatch lewat string bukan tautan, jadi
437
- **diamnya satu kartu bukan bukti bahwa tidak ada apa-apa.**
456
+ menulis pemanggil yang MENYEBUT nama simbolnya atau yang sampai lewat URL:
457
+ pemanggil yang sampai lewat job runner atau dispatch lewat string bukan
458
+ tautan, jadi **diamnya satu kartu bukan bukti bahwa tidak ada apa-apa.**
438
459
  - **Setiap jawaban membawa `generation`** — angka yang naik setiap kali peta
439
460
  berubah. Kartu yang dikutip lagi nanti tetap bisa ditempatkan pada waktunya.
440
461
  - **Peta tetap segar lewat tiga jalan, dan hanya satu yang perlu diingat orang.**
@@ -444,9 +465,19 @@ orc graph coverage src/orders.js # berapa banyak yang benar-benar dibaca pa
444
465
  membangunnya di preflight dan memperbaruinya setelah setiap perubahan. Lane
445
466
  lain tidak pernah memanggilnya. **Tidak ada yang berjalan dengan pewaktu dan
446
467
  tidak ada yang berjalan di latar belakang.**
447
- - **Hook itu juga memberi pekerja titik acuan yang tadinya harus dicari sendiri**,
448
- dan semua yang diberikannya ditandai sebagai data repositori, bukan perintah.
449
- Matikan dengan `orc config set code_graph_hooks off`; petanya tetap bekerja.
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.
476
+ - **Hook itu juga memberi pekerja titik acuan yang tadinya harus dicari sendiri**
477
+ — untuk Grep, Glob, dan pencarian lewat shell (`grep`, `rg`, `git grep`,
478
+ `findstr`) — dan semua yang diberikannya ditandai sebagai data repositori,
479
+ bukan perintah. Matikan dengan `orc config set code_graph_hooks off`; petanya
480
+ tetap bekerja.
450
481
 
451
482
  Kontraknya: `templates/skills/_shared/code-graph.md`. Hook-nya:
452
483
  `templates/hooks/README.md`.
@@ -457,7 +488,11 @@ Kontraknya: `templates/skills/_shared/code-graph.md`. Hook-nya:
457
488
  > Pencari sempurna — setiap pembacaan berkas penuh menjadi pembacaan rentang —
458
489
  > akan menghemat **0,1% dari satu sesi**. Nyalakan peta ini karena Anda ingin
459
490
  > kartunya: apa memanggil apa, apa yang akan tersentuh oleh satu perubahan, di
460
- > mana parser tidak selesai. Bukan demi angka.
491
+ > mana parser tidak selesai. Bukan demi angka. `orc graph gain` memakai kejujuran
492
+ > yang sama: apa yang DIMASUKKAN peta itu tercatat, apa yang ditahannya adalah
493
+ > **perkiraan** yang dicetak sebagai rentang, dan angka terukur baru muncul jika
494
+ > proyek Anda sendiri sudah punya tiga run dengan peta menyala dan tiga dengan
495
+ > peta mati.
461
496
 
462
497
  ## `orc ui` — panel kendali
463
498
 
@@ -656,7 +691,8 @@ templates/
656
691
  bin/cli.js pemasang, penyunting pengaturan, penyusun alur, pembaca status
657
692
  pekerjaan, dan separuh pasti dari setiap lane. Setiap pembacaan
658
693
  bisa menjawab --json
659
- bin/graph*.js graf kode: penyimpanan, ekstraksi, resolusi saat dibaca, catatan
694
+ bin/graph*.js graf kode: penyimpanan, ekstraksi, resolusi + cache dan shard-nya,
695
+ sinyal, catatan, peta berperingkat, pengukur gain
660
696
  bin/webui/ `orc ui` — panel kendali lokal: css/ + js/ + i18n/<bahasa>/ +
661
697
  fixtures/, satu berkas per lapisan dan per panel. Nol dependensi
662
698
  bin/mockrun-catalog.js katalog contoh jalannya (diturunkan dari berkas di disk)
@@ -732,67 +768,68 @@ Bacalah sebagai catatan putaran itu, bukan sebagai audit terkini:
732
768
  **Riwayat lengkap: [CHANGELOG.md](CHANGELOG.md)** — atau `orc changelog`, yang
733
769
  hanya mencetak yang lebih baru dari versi yang Anda punya.
734
770
 
735
- ### v1.8.0 - graf kode: peta kode yang selalu baru _(16-09-2026)_
736
-
737
- Lane ORC menghabiskan sebagian besar tokennya untuk mencari: Grep, baca file,
738
- Grep lagi. Agent berikutnya di wave berikutnya mencari hal yang sama lagi.
739
-
740
- **`orc graph` adalah peta lokal tentang bagaimana kode saling terhubung.**
741
- Default-nya mati: `orc config set code_graph on`.
742
-
743
- - **Strukturnya gratis.** CLI mem-parse JavaScript, TypeScript, Python, Go,
744
- Java, C# dan PHP — tanpa model. Python memakai parser `ast` miliknya sendiri
745
- jika Python 3.8+ terpasang.
746
- - **Update-nya kecil.** Hanya file yang hash git-nya berubah yang di-parse ulang.
747
- Di django/django (3.040 file sumber) build pertama 12 detik, update satu file
748
- 2,7 detik, dan satu kartu 0,46 detik.
749
- - **`orc graph ctx | impact | path`** menjawab dengan batas token dan kata status
750
- di setiap tautan. Handler route menjadi simbol, dan middleware yang dikirim
751
- lewat nama menjadi tautan `used by`. `--format tree` menulis nama kolom satu
752
- kali saja — 17–21% lebih sedikit token pada kartu berkas.
753
- - **Bagian yang mahal kini ditulis sekali.** Mencari siapa yang memanggil satu
754
- simbol memakan 437 ms di django/django, setiap kali dibaca. Sekarang dihitung
755
- saat peta di-update lalu dibaca kembali: kartu berkas 727 ms → 458 ms, dan
756
- `orc graph impact` 631 ms → 397 ms. Simpanan itu TURUNAN — hanya dipakai jika
757
- menyebut versi peta yang sekarang, dan menghapusnya hanya menghilangkan
758
- kecepatan.
759
- - **Setiap jawaban membawa `generation`**, dan setiap berkas menyebut berapa
760
- banyak yang benar-benar dibaca parser — `full`, `partial` dengan rentang
761
- barisnya, atau `skipped`. `orc graph coverage <berkas>` menanyakannya sekaligus.
762
- - **Tiga jawaban baca-saja yang baru, semuanya gratis:** `orc graph changes`
763
- (simbol yang benar-benar disentuh diff ini, dengan pemanggil, test, dan kata
764
- risiko yang membawa alasannya sendiri), `orc graph cochange <berkas>` (apa yang
765
- biasanya berubah BERSAMA berkas itu, dari riwayat git — bukan ketergantungan),
766
- dan `orc graph coverage`.
767
- - **Catatan bersifat opsional** (`code_graph_notes: wave | end`). Satu agent
768
- Sonnet 4.6 menulis satu kalimat per fungsi yang berubah. Catatan hanya
769
- ditampilkan selama isi fungsinya tidak berubah.
770
- - **Peta tetap segar lewat tiga jalan, dan hanya satu yang perlu diingat orang.**
771
- Satu pembacaan memperbaiki berkas yang akan dijawabnya. Hook yang terpasang
772
- memperbarui peta saat satu pekerja selesai, dan memberi pekerja titik acuan
773
- yang tadinya harus dicari sendiri. Dan setiap lane kode tetap membangunnya di
774
- preflight. `/orc-quick` tetap hanya membaca `log_dir`. **Tidak ada yang
775
- berjalan dengan pewaktu dan tidak ada yang berjalan di latar belakang.**
776
- - **Semua yang diterima pekerja dari graf ditandai sebagai data repositori, bukan
777
- perintah.** Nama simbol berasal dari repositori Anda, jadi ORC memperlakukannya
778
- sebagai teks. Isi berkas tidak pernah dikirimkan — hanya nama, path dan
779
- rentang baris.
780
- - **Juga:** delapan kunci pengaturan, dua temuan `orc doctor`, kartu graf kode di
781
- `orc ui`, dan komponen status line `graph`.
782
-
783
- **Batas yang kami tahu.** TypeScript dibaca dengan pencocokan pola, bukan dengan
784
- compiler TypeScript. `x = new Service(); x.run()` tampil sebagai `AMBIGUOUS`.
785
- Pemanggil yang tidak pernah menyebut nama simbolnya — tes route HTTP, penjalan
786
- job — bukan tautan, jadi baca kartu sebagai titik awal, bukan sebagai daftar
787
- lengkap yang akan terdampak.
788
- **Ini bukan optimasi token, dan itu sudah diukur.** Pencarian hanya 0,06% dari
789
- yang ditambahkan satu sesi ke konteksnya; pencari sempurna pun hanya menghemat
790
- 0,1% dari satu run. Peta ini tidak memakai token model untuk dibangun dan waktu
791
- baca di atas nyata — nyalakan demi kartunya, bukan demi penghematan.
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.
792
826
 
793
827
  <details>
794
- <summary><strong>Rilis sebelumnya</strong> — 116 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>
795
829
 
830
+ - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
831
+ - **v1.8.1** — the guard that only failed on Windows · _2026-09-16_
832
+ - **v1.8.0** — the code graph: a map of the code that stays fresh · _2026-09-16_
796
833
  - **v1.7.1** — the rules card now reaches the agent · _2026-09-14_
797
834
  - **v1.7.0** — the rules that keep the slop out · _2026-09-13_
798
835
  - **v1.6.0** — the rule that can finally say no · _2026-09-07_
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.1-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.1** · updated 2026-09-16 · [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
 
@@ -388,28 +388,45 @@ A local map of how your code is connected. It is **off by default**.
388
388
  ```bash
389
389
  orc config set code_graph on # code lanes build and use the map (free)
390
390
  orc config set code_graph_notes wave # optional: one-sentence notes (costs tokens)
391
+ orc graph map # the repository ranked, before you know a file name
391
392
  orc graph ctx OrderService.create # a card: callers, calls, SQL/HTTP/env effects
393
+ orc graph ctx "GET /orders/:id" # a route is a symbol too
392
394
  orc graph changes # what THIS diff touched, and how risky
393
395
  orc graph cochange src/orders.js # what usually changes with this file
394
396
  orc graph coverage src/orders.js # how much of it the parser really saw
397
+ orc graph gain # what the map put in, and an estimate of what it kept out
395
398
  ```
396
399
 
397
400
  - **Structure is free.** The CLI parses the code. No model, no dependency.
398
401
  Functions, methods, classes and route handlers (`GET /orders/:id`); a
399
402
  middleware passed by name is a `used by` link.
403
+ - **Languages:** JavaScript, TypeScript, Python, Go, Java, C#, PHP, Ruby, Rust,
404
+ Kotlin, C / C++, and the `<script>` block of a Vue or Svelte component. Where
405
+ your project already has the tool, ORC borrows it and the parse is exact —
406
+ Python's `ast`, your own `node_modules/typescript`, the `go` on PATH. ORC
407
+ itself still has zero dependencies. `ORC_GRAPH_NO_BORROW=1` turns that off.
408
+ - **A URL is an edge.** A test that calls `request(app).get("/orders/search")`
409
+ is a caller of that route, and the card says so. So is an instance alias
410
+ (`const svc = new OrderService(); svc.run()`), an inherited method
411
+ (`this.ok()` → `Base.ok`) and a name re-exported through a barrel file.
400
412
  - **Updates are small.** Git already hashes every file. Only the files whose hash
401
413
  changed are parsed again — a teammate's change heals at the next preflight.
402
- - **Every link says how sure it is:** `LOCAL`, `IMPORT`, `UNIQUE`, `AMBIGUOUS`
403
- (every candidate listed) or `UNRESOLVED`. The graph never guesses.
414
+ - **Every link says how sure it is:** `LOCAL`, `IMPORT`, `UNIQUE`, `ROUTE`,
415
+ `AMBIGUOUS` (every candidate listed) or `UNRESOLVED`. The graph never guesses.
404
416
  - **A card has a token budget.** It never goes over it, and it says what it hid.
405
- `--format tree` names each column once instead of on every row, and falls back
406
- to the normal shape when a card is too small to pay for the header.
417
+ `--source [N]` adds the target's own lines to the same call. `--for-slice`
418
+ prints only the OUTSIDE view of a file an agent is about to read in full.
419
+ `--format tree` names each column once instead of on every row.
420
+ - **`orc graph map` answers "which files matter here"** before you know a file
421
+ name, inside a budget. `--focus` re-ranks the whole repository around the files
422
+ or names your request already mentioned. **Rank is a hint about where to look
423
+ first**, never proof that a file matters to a change.
407
424
  - **It shows where code is. It does not replace reading it.** Agents still read
408
425
  the line range before they act. A card header says `coverage partial 327-466`
409
426
  when the parser could not finish a file — **no recorded gap is not proof of
410
- completeness**. A card also lists only the callers that NAME the symbol: one
411
- that reaches it through an HTTP route or a string dispatch is not a link, so
412
- **a card's silence is not proof of absence**.
427
+ completeness**. A card lists the callers that NAME the symbol or reach it by a
428
+ URL; one that reaches it through a job runner or a string dispatch is not a
429
+ link, so **a card's silence is not proof of absence**.
413
430
  - **Every answer carries a `generation`** — a number that goes up each time the
414
431
  map changes. A card quoted back later can be placed in time.
415
432
  - **It keeps itself current in three ways, and only one of them needs a lane to
@@ -418,8 +435,15 @@ orc graph coverage src/orders.js # how much of it the parser really saw
418
435
  — `/orc`, `/orc-ultra`, `/orc-diy`, `/orc-mini`, `/orc-fast`, `/orc-quick` —
419
436
  still builds it at preflight and updates it after each change. Other lanes
420
437
  never call it. **Nothing runs on a timer and nothing runs in the background.**
421
- - **The hook also hands a worker the anchors it would otherwise search for**, and
422
- everything it hands over is labelled repository data, never an instruction.
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.
444
+ - **The hook also hands a worker the anchors it would otherwise search for** —
445
+ for a Grep, a Glob and a shell search (`grep`, `rg`, `git grep`, `findstr`) —
446
+ and everything it hands over is labelled repository data, never an instruction.
423
447
  Switch it off with `orc config set code_graph_hooks off`; the map still works.
424
448
 
425
449
  The contract: `templates/skills/_shared/code-graph.md`. The hook:
@@ -432,6 +456,10 @@ The contract: `templates/skills/_shared/code-graph.md`. The hook:
432
456
  > a session**. Turn the map on because you want the cards: what calls what, what
433
457
  > a change would touch, where the parser could not finish. Not for a number.
434
458
  > The working is in `eval/graph-replay.js`, and it spends no tokens to re-run.
459
+ > `orc graph gain` reports the same honesty per run: what the map PUT IN is
460
+ > recorded, what it kept out is an **estimate** printed as a range, and a
461
+ > measured figure appears only when your own project has three runs with the map
462
+ > on and three with it off.
435
463
 
436
464
  ## `orc ui` — the control panel
437
465
 
@@ -613,7 +641,8 @@ templates/
613
641
  └── agents/ 48 model-pinned subagents + MODEL-MAPPING.md
614
642
  bin/cli.js installer, config editor, flow composer, run-state reader, and
615
643
  the deterministic half of every lane. Every read speaks --json
616
- bin/graph*.js the code graph: store, extraction, resolution + its cache, signals, notes
644
+ bin/graph*.js the code graph: store, extraction, resolution + its cache and
645
+ shards, signals, notes, the ranked map, the gain meter
617
646
  bin/webui/ `orc ui` — the local control panel: css/ + js/ + i18n/<lang>/ +
618
647
  fixtures/, one file per layer and per panel. Zero deps, no build step
619
648
  bin/mockrun-catalog.js the mocked-run catalogue (derived from the files on disk)
@@ -683,28 +712,62 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
683
712
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
684
713
  only what is newer than the version you have.
685
714
 
686
- ### v1.8.1 - the guard that only failed on Windows _(2026-09-16)_
687
-
688
- `npm publish` could not run on Windows. The `prepack` guard reported nine
689
- drifted executor agents, and `git status` reported no change at all.
690
-
691
- **The cause was a line ending, not content.** `.gitattributes` says
692
- `* text=auto`, so git stores the generated executor agents with LF and checks
693
- them out native — a Windows clone holds CRLF. The generator read the template
694
- as it is on disk, but injected the `effort:` frontmatter line with a hardcoded
695
- LF. `bin/build-agents.js` now takes its line ending from the template, and
696
- `--check` compares LF-normalized text, so the guard gives the same result in
697
- either worktree. A test in `test/payload.test.js` holds the rule.
698
-
699
- One test carried the same fault. `npm test` also runs on `prepack`, and the
700
- statusline graph-component test sliced a hook's source to the next `\n}\n` — a
701
- needle a CRLF checkout never contains. It now normalizes the source first.
702
-
703
- No shipped payload changed. The generated agent files are byte-identical.
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.
704
765
 
705
766
  <details>
706
- <summary><strong>Earlier releases</strong> — 117 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>
707
768
 
769
+ - **v1.8.2** — the map that finds what a grep cannot · _2026-09-21_
770
+ - **v1.8.1** — the guard that only failed on Windows · _2026-09-16_
708
771
  - **v1.8.0** — the code graph: a map of the code that stays fresh · _2026-09-16_
709
772
  - **v1.7.1** — the rules card now reaches the agent · _2026-09-14_
710
773
  - **v1.7.0** — the rules that keep the slop out · _2026-09-13_