@azure-id/orc 1.8.1 → 1.8.2

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 (46) hide show
  1. package/CHANGELOG.md +220 -0
  2. package/README-id.md +90 -71
  3. package/README.md +77 -31
  4. package/bin/cli.js +45460 -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 +140 -0
  14. package/bin/verify-package.js +14 -0
  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/package.json +1 -1
  23. package/templates/agents/orc-executor-haiku-4-5.md +8 -13
  24. package/templates/agents/orc-executor-opus-4-7-high.md +8 -13
  25. package/templates/agents/orc-executor-opus-4-7-med.md +8 -13
  26. package/templates/agents/orc-executor-opus-4-8-high.md +8 -13
  27. package/templates/agents/orc-executor-opus-5-high.md +8 -13
  28. package/templates/agents/orc-executor-opus-5-low.md +8 -13
  29. package/templates/agents/orc-executor-opus-5-med.md +8 -13
  30. package/templates/agents/orc-executor-sonnet-4-6-high.md +8 -13
  31. package/templates/agents/orc-executor-sonnet-4-6-med.md +8 -13
  32. package/templates/agents/orc-executor-sonnet-5-high.md +8 -13
  33. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +15 -12
  34. package/templates/hooks/README.md +13 -3
  35. package/templates/hooks/orc-graph-hook.js +148 -13
  36. package/templates/skills/_shared/code-graph.md +148 -20
  37. package/templates/skills/_shared/phases/execution.md +13 -11
  38. package/templates/skills/_shared/phases/planning.md +8 -1
  39. package/templates/skills/_shared/phases/ship.md +5 -1
  40. package/templates/skills/_shared/phases/trace.md +2 -0
  41. package/templates/skills/_shared/phases/wiki-consult.md +1 -1
  42. package/templates/skills/_shared/read-ladder.md +10 -2
  43. package/templates/skills/orc/SKILL.md +1 -1
  44. package/templates/skills/orc-analyze/SKILL.md +13 -13
  45. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  46. package/templates/skills/orc-wiki/references/staleness.md +1 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,226 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v1.8.2 — the map that finds what a grep cannot _(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
+ v1.8.0 shipped the code graph with a known hole. A card listed every caller that
26
+ NAMES a symbol, so a test that reaches a route by its URL was not a caller, and
27
+ the card was silent about it. On one real question the graph declared eleven
28
+ route-level tests absent. This release closes that hole and four more like it,
29
+ adds five languages, and makes the map answer faster than it could before.
30
+
31
+ **Nothing you have to do.** The index upgrades itself. Engine `graph@5` re-reads
32
+ every record the first time you run `orc graph update` after this release; a
33
+ Django-sized repository takes about 14 s once, and every update after that is
34
+ small again. The graph is still **off by default**: `orc config set code_graph on`.
35
+
36
+ **A URL is now an edge.**
37
+
38
+ - `request(app).get("/orders/search")`, `client.post("/api/orders/")` and
39
+ `httptest.NewRequest("GET", "/p")` reach the route they resolve to. The card
40
+ prints `← reached via GET /orders/search tests/orders.test.js:27 ROUTE`,
41
+ `orc graph impact` follows it, `orc graph changes` counts it, and the `tests`
42
+ line names the test file.
43
+ - A decorated handler keeps its own symbol and gains a `<METHOD> <path>` alias,
44
+ with the class or router prefix folded in — `@Controller("orders")` plus
45
+ `@Get(":id")` is `GET /orders/:id`. A mount from another file (`app.use`,
46
+ `include_router`, `register_blueprint`, Django `include`) is applied when the
47
+ card is read. `ctx "GET /orders/:id"` and `ctx OrdersController.find` both
48
+ answer.
49
+ - A URL whose prefix is built at run time (`BASE + "/p"`) matches by its tail.
50
+ Two routes that match one URL are `AMBIGUOUS`, with both listed. **The graph
51
+ still never guesses.** `ROUTE` is a new state word beside `LOCAL`, `IMPORT`
52
+ and `UNIQUE`.
53
+
54
+ **Four more ways the map used to lose a caller.**
55
+
56
+ - **An instance alias.** `const svc = new OrderService(); svc.run()` now links to
57
+ `OrderService.run`. An alias head is a class name, so `router.get` with
58
+ `router = Router()` is `UNRESOLVED (external)` — not a list of every `get` in
59
+ the repository.
60
+ - **An inherited member.** `this.ok()` in a subclass finds `Base.ok`, and
61
+ `super.m()` skips the class's own `m`. The edge carries the state the base
62
+ class resolved with, plus `inherited`.
63
+ - **A barrel re-export.** An import searches the file it names first, then the
64
+ files that file re-exports, three deep. A barrel that defines the name itself
65
+ wins over one that passes it on.
66
+ - **A guess we removed.** A bare call with no receiver (`get("/p")`) no longer
67
+ resolves to the only method in the repository with that name. In v1.8.1 every
68
+ supertest `.get(...)` was recorded as a caller of some class method. That was
69
+ an invented edge, and it is gone.
70
+
71
+ Measured on two real repositories, v1.8.1 to v1.8.2:
72
+
73
+ | | django/django | nestjs/nest |
74
+ |---|---|---|
75
+ | confident edges | 65,379 → **72,955** | 7,288 → **9,426** |
76
+ | `UNIQUE` guesses | 23,866 → **6,442** | 1,957 → **275** |
77
+ | `AMBIGUOUS` hints | — | 81,485 → **33,906** |
78
+ | routes found | **656** | **344** |
79
+ | first build | 12.5 → 13.7 s | 3.1 → 4.0 s |
80
+
81
+ **Five more languages.** Ruby, Rust, Kotlin, Vue and Svelte single file
82
+ components (the `<script>` block, at the file's own line numbers) and C / C++.
83
+ The measurement that matters is how much of a real repository the parser could
84
+ not finish: rubocop **2.4%**, tokio **0.3%**, ktor **1.4%**, primevue **0.5%**,
85
+ sveltejs/svelte **0%**, abseil-cpp **1.7%**, redis **4.5%**.
86
+
87
+ **Borrowed parsers, where your project already has the tool.** Python already
88
+ used the `ast` of a Python on PATH. TypeScript and JavaScript now use your own
89
+ `node_modules/typescript`, and Go uses the `go` on PATH. ORC still has zero
90
+ dependencies, the record names the rung that read it (`extractor:
91
+ typescript@5.9.3`), and a failure falls back file by file. `ORC_GRAPH_NO_BORROW=1`
92
+ forces the heuristic everywhere.
93
+
94
+ > **This one missed its gate and ships anyway, on the maintainer's call.** The
95
+ > gate was a 10-point rise in the share of calls resolved with confidence. It
96
+ > measured **+1.0** on nestjs/nest, **−0.3** on vuejs/core and **−0.3** on hugo.
97
+ > The gate measured the wrong thing: that share is held down by calls into
98
+ > packages outside the repository, which no parser can resolve. What did move is
99
+ > INVENTED edges — `UNIQUE` guesses fell 36–40% and `IMPORT` facts rose. The
100
+ > borrow is more correct, not more complete. It costs +0.24 s (TypeScript) and
101
+ > +0.70 s (Go) on a one-file update. There is no new config key, on purpose.
102
+
103
+ **Fewer round trips.**
104
+
105
+ - **`orc graph ctx … --source [N]`** appends the target's own lines to the card
106
+ (80 by default, 200 at most), charged to the same budget. The card and the
107
+ range arrive in one call.
108
+ - **`orc graph ctx --for-slice <files…>`** prints only the OUTSIDE view of each
109
+ declared file: who calls into it and from which line, who imports it without
110
+ calling, which routes it answers, which tests cover it. No symbol table. An
111
+ executor reads its own files in full anyway, so a file card repeated what it
112
+ was about to read — on every later turn of that agent. The outside view is
113
+ 30–51% smaller than the card it replaces.
114
+ - **`orc graph update --notes-pending`** answers the update and the notes batch
115
+ in one process and one lock.
116
+ - **A card prints one-letter states with a legend only when that is smaller**
117
+ than the words. A three-row card keeps the words. Always-short made small
118
+ cards bigger, which is the opposite of the point.
119
+ - **A card that hid nothing prints no footer.**
120
+
121
+ **The hook learned two more moments.** A shell search (`grep`, `rg`, `git grep`,
122
+ `findstr`, `Select-String`, `ag`, `ack`) is the same question as a Grep, and now
123
+ gets the same answer. And with `orc config set code_graph_hooks on,read`, a
124
+ whole-file read of a file with many symbols gets one line naming its six most
125
+ reached symbols and their ranges, so the NEXT read can ask for a range. **The
126
+ read always runs.** The hook never blocks a tool call and never rewrites one.
127
+
128
+ **Doc notes — the author's own sentence, for free.** The parser now takes the
129
+ first sentence of a docstring, a JSDoc block, a `///` run or a `#` block and
130
+ prints it on the card as `doc <sentence> (parser · current)`. It costs no model
131
+ tokens, and it is re-extracted with the body, so it cannot go stale on its own.
132
+ A comment can still lie, so a CURRENT model note outranks it: the order is
133
+ current note → doc → stale note.
134
+
135
+ > **We expected this to cover most of a repository. It does not.** The plan said
136
+ > more than 60% of symbols would carry a doc. Measured: **19.9%** on django
137
+ > (30.6% of non-test source), **7.1%** on nest (9.0%). The extractor is right —
138
+ > the comments are simply not there. The number in this file is the measured
139
+ > one.
140
+
141
+ **`orc graph gain` — what the map put in, and an estimate of what it kept out.**
142
+ Every read appends one line to a local ledger. The command adds them up and
143
+ keeps three kinds of knowing apart, because merging them produces a number
144
+ nobody can check:
145
+
146
+ - **paid** — the tokens the graph put into a context. Recorded, exact.
147
+ - **avoided** — what searching would have cost for the same question. **An
148
+ estimate**, always a range, never one number.
149
+ - **measured** — `--measured` reads your own runs with the graph on against your
150
+ runs with it off, and prints nothing until there are three of each.
151
+
152
+ It never prints a percent of a session, it never blocks a read, and `orc stats`
153
+ reports `graph: null` when there is no ledger — never a confident zero.
154
+
155
+ **`orc graph map` — the question you ask before you know a file name.** It ranks
156
+ every indexed file by how much of the repository's own call and import traffic
157
+ flows through it, and prints the top files with their most important symbols and
158
+ line ranges, inside a token budget. `--focus src/orders/service.js,createOrder`
159
+ re-ranks the whole repository around those files or names; it never filters it.
160
+ A test file ranks lower (by ten), a file whose every symbol is private ranks
161
+ lower (by half), and an edge is weighted by the square root of its call count, so
162
+ one import used in a loop does not outrank ten separate callers. **Rank is a hint
163
+ about where to look first, never proof that a file matters to this change** — the
164
+ card says so itself.
165
+
166
+ > **`map` is wired to PLANNING only, and that was a measurement, not a
167
+ > preference.** The gate was three answerable planning calls per run. Replaying
168
+ > real transcripts measured **0.39** (16 sweeps over 41 main windows), so the
169
+ > plan's own fallback applied and the analyst and `/orc-quick` wiring was
170
+ > removed again. The honest caveat: those transcripts drive lanes over a
171
+ > fourteen-file toy app, where a planner has nothing to sweep. It will be
172
+ > re-measured on a real repository.
173
+
174
+ **A one-symbol card is about twice as fast.** Working out who calls a symbol used
175
+ to mean parsing the whole index. The resolution cache is now also written as
176
+ shards, one file per name prefix, and a one-symbol `ctx` reads only the shards it
177
+ needs. On django: **881 → 480 ms** for the whole command, **361 → 50 ms** for the
178
+ work inside the process. The floor is Node's own start-up, about 300 ms on the
179
+ test machine.
180
+
181
+ The shards answer exactly what the full index answers, **or they decline**. 577
182
+ cards on django and nest were compared with and without them: **0 different.**
183
+ The fast path steps aside for a path, a URL, a `file:line`, a name that is not
184
+ exactly one symbol, `--for-slice`, a file card and any multi-target call, and
185
+ every answer says which path produced it. The cost is disk: django's shards are
186
+ **30 MB**, taking `.claude/orc/graph` from about 87 MB to about 117 MB. The
187
+ update pays nothing measurable.
188
+
189
+ **Also in this release**
190
+
191
+ - **`code_graph_ignore`** — extra paths the graph never indexes, as a
192
+ comma-separated list of globs (`vendor/**,*.gen.ts`). The engine already
193
+ skipped `node_modules`, root `dist/` and `build/`, caches, bundles, `.d.ts`
194
+ and generated files; this adds to that list. A skipped file is reported
195
+ `excluded` by `orc graph coverage`, never in silence.
196
+ - `code_graph_hooks` gains the value `on,read` (see the hook above). `on` and
197
+ `off` behave as before.
198
+ - `orc graph gain` also appears on the `orc ui` Knowledge panel and in one ship
199
+ line, marked an estimate in both places.
200
+
201
+ **Limits we know about**
202
+
203
+ - **Fixed since v1.8.1, with its new limit stated:** a caller that reaches a
204
+ symbol through a URL is now an edge. A caller that reaches it through a job
205
+ runner, a string dispatch, reflection, or a URL assembled at run time from
206
+ parts the parser cannot see is still not an edge and never will be. The file
207
+ still reads as fully parsed, and the card is still silent. **A card's silence
208
+ is not proof of absence.**
209
+ - TypeScript and Go are exact only where the project has the tool. Everything
210
+ else is a heuristic, which is why a card can say `coverage partial`.
211
+ - Java, PHP, Swift, Scala and Dart have no borrowed parser. Ruby's own parser
212
+ (`Prism`) was gated on the heuristic missing more than 5% of a real
213
+ repository. It missed 2.4%, so it was not built.
214
+ - The status line component compares HEAD with the index. Only
215
+ `orc graph status` sees uncommitted edits.
216
+ - The graph hook's delivery on `SubagentStart` is confirmed in a live session.
217
+ The other delivery events are still unconfirmed, and the hook stays silent and
218
+ free if they never are.
219
+ - **It is still NOT a token optimisation, and that is still measured, not
220
+ guessed.** `Grep` and `Glob` results are 0.06% of what a session adds to its
221
+ context, and a perfect locator would save 0.1% of a run. Turn the map on for
222
+ the cards: what calls what, what a change would touch, where the parser could
223
+ not finish. `orc graph gain` reports an estimate and says the word "estimate"
224
+ every time.
225
+
226
+ **How to check it.** `orc config set code_graph on`, then `orc graph update`,
227
+ then `orc graph map` to see the repository ranked, and
228
+ `orc graph ctx <a route or a function>` to see a card. Run `orc update` in your
229
+ project to get the lane changes.
230
+
231
+ ---
232
+
13
233
  ### v1.8.1 — the guard that only failed on Windows _(2026-09-16)_
14
234
 
15
235
  **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.0-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.8.2-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.8.2** · 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
 
@@ -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,11 @@ 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
+ - **Hook itu juga memberi pekerja titik acuan yang tadinya harus dicari sendiri**
469
+ — untuk Grep, Glob, dan pencarian lewat shell (`grep`, `rg`, `git grep`,
470
+ `findstr`) — dan semua yang diberikannya ditandai sebagai data repositori,
471
+ bukan perintah. Matikan dengan `orc config set code_graph_hooks off`; petanya
472
+ tetap bekerja.
450
473
 
451
474
  Kontraknya: `templates/skills/_shared/code-graph.md`. Hook-nya:
452
475
  `templates/hooks/README.md`.
@@ -457,7 +480,11 @@ Kontraknya: `templates/skills/_shared/code-graph.md`. Hook-nya:
457
480
  > Pencari sempurna — setiap pembacaan berkas penuh menjadi pembacaan rentang —
458
481
  > akan menghemat **0,1% dari satu sesi**. Nyalakan peta ini karena Anda ingin
459
482
  > kartunya: apa memanggil apa, apa yang akan tersentuh oleh satu perubahan, di
460
- > mana parser tidak selesai. Bukan demi angka.
483
+ > mana parser tidak selesai. Bukan demi angka. `orc graph gain` memakai kejujuran
484
+ > yang sama: apa yang DIMASUKKAN peta itu tercatat, apa yang ditahannya adalah
485
+ > **perkiraan** yang dicetak sebagai rentang, dan angka terukur baru muncul jika
486
+ > proyek Anda sendiri sudah punya tiga run dengan peta menyala dan tiga dengan
487
+ > peta mati.
461
488
 
462
489
  ## `orc ui` — panel kendali
463
490
 
@@ -656,7 +683,8 @@ templates/
656
683
  bin/cli.js pemasang, penyunting pengaturan, penyusun alur, pembaca status
657
684
  pekerjaan, dan separuh pasti dari setiap lane. Setiap pembacaan
658
685
  bisa menjawab --json
659
- bin/graph*.js graf kode: penyimpanan, ekstraksi, resolusi saat dibaca, catatan
686
+ bin/graph*.js graf kode: penyimpanan, ekstraksi, resolusi + cache dan shard-nya,
687
+ sinyal, catatan, peta berperingkat, pengukur gain
660
688
  bin/webui/ `orc ui` — panel kendali lokal: css/ + js/ + i18n/<bahasa>/ +
661
689
  fixtures/, satu berkas per lapisan dan per panel. Nol dependensi
662
690
  bin/mockrun-catalog.js katalog contoh jalannya (diturunkan dari berkas di disk)
@@ -732,67 +760,58 @@ Bacalah sebagai catatan putaran itu, bukan sebagai audit terkini:
732
760
  **Riwayat lengkap: [CHANGELOG.md](CHANGELOG.md)** — atau `orc changelog`, yang
733
761
  hanya mencetak yang lebih baru dari versi yang Anda punya.
734
762
 
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.
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.
792
809
 
793
810
  <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>
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>
795
812
 
813
+ - **v1.8.1** — the guard that only failed on Windows · _2026-09-16_
814
+ - **v1.8.0** — the code graph: a map of the code that stays fresh · _2026-09-16_
796
815
  - **v1.7.1** — the rules card now reaches the agent · _2026-09-14_
797
816
  - **v1.7.0** — the rules that keep the slop out · _2026-09-13_
798
817
  - **v1.6.0** — the rule that can finally say no · _2026-09-07_