@azure-id/orc 1.2.0 → 1.4.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.
- package/CHANGELOG.md +296 -0
- package/README-id.md +44 -0
- package/README.md +54 -78
- package/bin/cli.js +2615 -5
- package/bin/verify-contracts.js +60 -1
- package/bin/verify-package.js +588 -568
- package/bin/webui/api.js +71 -0
- package/bin/webui/app.html +213 -210
- package/bin/webui/css/06-responsive.css +28 -0
- package/bin/webui/css/panels/hookui.css +379 -0
- package/bin/webui/fixtures/hookui.js +409 -0
- package/bin/webui/fixtures/index.js +17 -0
- package/bin/webui/i18n/en/hookui.json +119 -0
- package/bin/webui/i18n/en/nav.json +22 -21
- package/bin/webui/i18n/en/overview.json +4 -1
- package/bin/webui/i18n/en/tour.json +3 -1
- package/bin/webui/i18n/id/hookui.json +119 -0
- package/bin/webui/i18n/id/nav.json +22 -21
- package/bin/webui/i18n/id/overview.json +4 -1
- package/bin/webui/i18n/id/tour.json +3 -1
- package/bin/webui/js/01-i18n.js +152 -151
- package/bin/webui/js/90-tour.js +6 -0
- package/bin/webui/js/panels/hookui.js +891 -0
- package/bin/webui/js/panels/overview.js +7 -0
- package/package.json +1 -1
- package/templates/hooks/README.md +280 -0
- package/templates/hooks/orc-statusline-render.js +921 -0
- package/templates/hooks/orc-statusline.js +1090 -87
- package/templates/hooks/orc-subagent-line.js +219 -0
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,302 @@ Format: `### v<version> — <title> _(<date>)_`.
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
### v1.4.0 - the agent panel, and the number that was missing _(2026-09-04)_
|
|
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
|
+
The second board. Claude Code renders a custom row for every subagent in the
|
|
26
|
+
agent panel, and that surface is ORC's exact domain: one row per dispatched
|
|
27
|
+
agent, live, while it runs.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
● orc-executor-opus-5-low O5/low 84K ███▎░░░░ 42% for 17m
|
|
31
|
+
✓ orc-reviewer-opus-5-med O5/med 31K █▌░░░░░░ 16% for 4m
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**AND IT ANSWERS A QUESTION v1.2.0 SAID COULD NOT BE ANSWERED.** That release
|
|
35
|
+
established that Claude Code records no token usage for a dispatched subagent —
|
|
36
|
+
`isSidechain` is never set, no sidechain message carries a usage block, verified
|
|
37
|
+
across every transcript on two machines — so `orc usage report` has reported
|
|
38
|
+
`tokens: null` for every Claude row ever since, and said why.
|
|
39
|
+
|
|
40
|
+
That is still true **of the transcript**. It is not true of the agent panel,
|
|
41
|
+
which carries `tokenCount` per task along with the resolved `model` and
|
|
42
|
+
`effort`. So the hook writes down what it is handed, and `orc usage report`
|
|
43
|
+
reads it.
|
|
44
|
+
|
|
45
|
+
- **It is a FLOOR, and it is labelled one everywhere it appears.** The hook sees
|
|
46
|
+
a task only while it is in the panel: an agent that started and finished
|
|
47
|
+
between two renders is never seen, and a count read just before an agent
|
|
48
|
+
finished is short by whatever came after. `not-seen` means exactly that and
|
|
49
|
+
is never `0`. A floor reported as a total would be the same class of lie as a
|
|
50
|
+
zero reported for an unknown.
|
|
51
|
+
- **The record is written even with the board OFF.** It is not part of the
|
|
52
|
+
display feature — it is a measurement Claude Code hands over either way, and
|
|
53
|
+
throwing it out because a display setting is off would be the wrong trade by a
|
|
54
|
+
wide margin. `orc init` and `orc update` wire `subagentStatusLine` for that
|
|
55
|
+
reason alone, and never clobber one you already have.
|
|
56
|
+
- **A count can only go up**, so a lower reading is a stale one and never
|
|
57
|
+
overwrites a higher one.
|
|
58
|
+
- **The model and effort are OBSERVED.** ORC's downgrade check has two readings
|
|
59
|
+
— one derived from the agent's name, one the agent reports about itself. This
|
|
60
|
+
is the third, and the only one nobody had to be trusted for.
|
|
61
|
+
|
|
62
|
+
**ONE COMPILER, TWO BOARDS.** The second board reuses the compiler, the render
|
|
63
|
+
program, every shape, every glyph set, the colour model, the validator and the
|
|
64
|
+
gate ladder. What differs is a component set, three filenames and a config key —
|
|
65
|
+
a table, not a fork. A test asserts there is exactly one compiler and that the
|
|
66
|
+
new hook grew no renderer of its own, because that is the cheap mistake this
|
|
67
|
+
whole design exists to avoid.
|
|
68
|
+
|
|
69
|
+
- **A component belongs to one board**, and the other refuses it by name with
|
|
70
|
+
the board it belongs to. Two catalogues would be two lists somebody has to
|
|
71
|
+
keep in step; this is one catalogue with a column.
|
|
72
|
+
- **A subagent row is one line by construction** — Claude Code renders one per
|
|
73
|
+
task — so the three-line board and its dense-prefix rule simply do not apply.
|
|
74
|
+
- **Three presets**: what the agent is and what it has cost, a watch view with
|
|
75
|
+
its own context window, and the downgrade check made visible per agent.
|
|
76
|
+
- Every gate rung falls back to **Claude Code's own row**, which is a real
|
|
77
|
+
answer and a better one than a blank. An empty render hides a task entirely,
|
|
78
|
+
which is almost never what anybody meant — so it is never emitted.
|
|
79
|
+
|
|
80
|
+
`subagent_line_custom`, default `off`. Off is Claude Code's row, unchanged.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### v1.3.0 - build your own status line _(2026-09-04)_
|
|
85
|
+
|
|
86
|
+
**Still on the unscoped `orc` package?** Do this once first — your `orc upgrade`
|
|
87
|
+
is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
|
|
88
|
+
the top of this file.
|
|
89
|
+
|
|
90
|
+
- **Step 1 — release the command from the old package:** `npm uninstall -g orc`
|
|
91
|
+
- **Step 2 — install the current package:** `npm i -g @azure-id/orc`
|
|
92
|
+
- **Step 3 — re-apply it to your project:** `orc update`
|
|
93
|
+
|
|
94
|
+
**Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
|
|
95
|
+
|
|
96
|
+
The status line becomes **yours**. Three lines, each holding one to five parts
|
|
97
|
+
from a catalogue ORC ships, each drawn through one of 35 shapes and restyled by
|
|
98
|
+
you: two colours, a colour that follows the value, its own words, its own
|
|
99
|
+
symbols, a stable width, and when it is allowed to appear at all.
|
|
100
|
+
|
|
101
|
+
**It is off by default, and off is byte-identical to what shipped.** That is a
|
|
102
|
+
test — nine states frozen glyph for glyph — not an intention.
|
|
103
|
+
|
|
104
|
+
Compose it in **`orc ui` ▸ CLI Hook Interface**. A CLI half exists so the panel
|
|
105
|
+
has something to run, and `orc statusline --help` says plainly that typing a
|
|
106
|
+
three-line layout is worse than dragging one.
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
🚀 ORC v1.3.0 · Opus 5/high · CTX ████▊░░░░░ 47% · 5h 61% main
|
|
110
|
+
◐ orc · execution · agents 7 (2 running) · Dur 34m · MTok 312K
|
|
111
|
+
cache ● ███████▊░░ 91% · $0.42 · wiki ◐ 14c
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- **THE CLI COMPILES, THE HOOK RENDERS.** The layout you author is lowered into
|
|
115
|
+
a flat render program with every colour worked out in advance; the hook walks
|
|
116
|
+
it and resolves nothing. Three reasons, any one sufficient. Claude Code
|
|
117
|
+
debounces at 300 ms and **cancels** a script still running — and on Windows a
|
|
118
|
+
bare `node` start is 285 ms of that, so the hook has **about 15 ms**, and
|
|
119
|
+
resolving themes and ramps per keystroke is the wrong trade by four orders of
|
|
120
|
+
magnitude. Two ideas of what inheritance means would otherwise sit either side
|
|
121
|
+
of the one surface where you compare them. And a hook cannot refuse; it can
|
|
122
|
+
only fail silently or paint garbage, so validation has to happen where a
|
|
123
|
+
refusal is possible.
|
|
124
|
+
- **The preview IS the bar.** `orc statusline preview` and the hook require the
|
|
125
|
+
SAME render module, so what the panel draws and what your terminal prints
|
|
126
|
+
cannot diverge — by construction, not by a test that would eventually drift.
|
|
127
|
+
All three degraded forms sit under it and are always visible: you cannot
|
|
128
|
+
design a plain-text fallback you cannot see.
|
|
129
|
+
- **The illegal drop is made impossible.** A line may hold a part only if every
|
|
130
|
+
line above it holds at least one — so line 3 renders hatched and disabled with
|
|
131
|
+
the reason ON THE ZONE while line 2 is empty. Never a message after the fact.
|
|
132
|
+
Every drag has a keyboard path and a menu; a board only reachable by mouse is
|
|
133
|
+
a board a lot of people cannot use.
|
|
134
|
+
- **A composed layout can be FASTER than the built-in one.** The compiler
|
|
135
|
+
records which readings a layout needs, and the hook reads nothing else.
|
|
136
|
+
Measured on the cold path: 346.7 ms for the built-in lines, **298.2 ms** for a
|
|
137
|
+
composed `minimal` — which is the difference between rendering and being
|
|
138
|
+
cancelled.
|
|
139
|
+
- **Eight parts are REFUSED, each with the measurement.** `git status` is 53 ms
|
|
140
|
+
against 15 ms of headroom; three wiki numbers need a git walk PER DOCUMENT.
|
|
141
|
+
Reading a value that is not stored would have rendered a confident number
|
|
142
|
+
nobody measured, forever. `unknown` renders an em dash — **never `0`**, which
|
|
143
|
+
would say the thing was free.
|
|
144
|
+
- **Three things a terminal cannot do, said plainly** rather than offered as a
|
|
145
|
+
picker that does nothing: the terminal owns the font size (bold reads bigger,
|
|
146
|
+
and a part gets visually larger by taking more cells), blinking is refused,
|
|
147
|
+
and icon-font symbols are not shipped because ORC cannot check for the font
|
|
148
|
+
and will not put an empty box on your bar.
|
|
149
|
+
- **`orc doctor` gains three findings**, and only while the feature is armed — a
|
|
150
|
+
layout you built and never enabled is a draft, not a problem. An orphaned part
|
|
151
|
+
after an upgrade is REPORTED, never auto-repaired: which part replaces a
|
|
152
|
+
retired one is your decision.
|
|
153
|
+
- **A fix that shipped with it:** the wiki freshness segment used to run
|
|
154
|
+
`git rev-list` on EVERY redraw, outside the throttle everything else rides in.
|
|
155
|
+
In a repo with a wiki that pushed the render past the cancel line, so a fast
|
|
156
|
+
typist got no status line at all while they typed.
|
|
157
|
+
|
|
158
|
+
One config key, `statusline_custom`, default `off`. No key for a colour scheme —
|
|
159
|
+
the layout carries its own — and none for the parts: those are a document, not a
|
|
160
|
+
setting.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
### v1.2.1 - the status line says what ORC is doing _(2026-09-04)_
|
|
165
|
+
|
|
166
|
+
**Still on the unscoped `orc` package?** Do this once first — your `orc upgrade`
|
|
167
|
+
is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
|
|
168
|
+
the top of this file.
|
|
169
|
+
|
|
170
|
+
- **Step 1 — release the command from the old package:** `npm uninstall -g orc`
|
|
171
|
+
- **Step 2 — install the current package:** `npm i -g @azure-id/orc`
|
|
172
|
+
- **Step 3 — re-apply it to your project:** `orc update`
|
|
173
|
+
|
|
174
|
+
**Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
|
|
175
|
+
|
|
176
|
+
v1.2.0 gave the status line a second row and it said which lanes had run. It
|
|
177
|
+
could not say what any of them was doing *now* — which is the one thing you look
|
|
178
|
+
down at a status bar to find out. This release puts the running phase in front
|
|
179
|
+
of that row, gives each kind of phase its own small animated mark (the `orc-cli`
|
|
180
|
+
lane-menu badge, keyed to the phase instead of the lane), and closes the row with
|
|
181
|
+
the two facts a terminal should always carry: what the session has cost and which
|
|
182
|
+
branch it is on.
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
🚀 ORC v1.2.1 - Opus 5/high · context (34%) · 5h 41% (2h13m) ↔ wk 12% · ucs 6% · wiki: fresh
|
|
186
|
+
▰ status: quick · Q3 DO · agents 7 (2 running) · orc-extra: on · Dur 48m · MTok 412K · main
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### The phase is computed by the CLI and rendered by the hook
|
|
190
|
+
|
|
191
|
+
`orc init` / `orc update` now stamps **`hooks/orc-lane-rails.json`** beside
|
|
192
|
+
`hooks/orc-version.json`, built from the same `LANE_PHASES` / `LANE_OWN_PHASES`
|
|
193
|
+
/ `LANE_TRACE` registries `orc lane phases` reads. The hook renders it and
|
|
194
|
+
derives nothing — the Flow-stepper rule (`orc ui` v0.43.7) on a second surface.
|
|
195
|
+
|
|
196
|
+
The hook cannot call the CLI: a status line re-renders on every keystroke, so a
|
|
197
|
+
subprocess per render is not on the table. The alternative was a phase table
|
|
198
|
+
hardcoded in the hook, which is a **second source of truth no lint could see**.
|
|
199
|
+
The manifest is a registered contract token instead, plus three goldens: every
|
|
200
|
+
phase has a label and a kind from the closed set, the rail names every traced
|
|
201
|
+
lane **and no lane it does not**, and its role families are asserted against the
|
|
202
|
+
trace hook's own `roleFamily()` **by source text** (the `OPUS5_BANDS` technique
|
|
203
|
+
— the two live in different files, so no import can tie them).
|
|
204
|
+
|
|
205
|
+
New read: **`orc lane rails [--json]`**, which prints the whole object.
|
|
206
|
+
|
|
207
|
+
#### A phase the disk cannot prove is HIDDEN
|
|
208
|
+
|
|
209
|
+
Four rungs, most recent line wins, and the floor is deterministic:
|
|
210
|
+
|
|
211
|
+
1. the active run comes from `.current` — not "the newest file", which is a
|
|
212
|
+
different and wrong answer during a lane suspend, when two traces are live;
|
|
213
|
+
2. a narrated trace verb **this lane's rail publishes** resolves the own-phase
|
|
214
|
+
(`Q3 DO`) — but only when it is later in the file than the edge below it, so
|
|
215
|
+
it can sharpen the answer and can never invent one;
|
|
216
|
+
3. the trace hook's `PHASE-EDGE <family>` resolves the shared phase
|
|
217
|
+
(`execution`) with **zero model cooperation**;
|
|
218
|
+
4. nothing, or a trace whose newest line is over 10 minutes old → **hidden**.
|
|
219
|
+
|
|
220
|
+
**The cost is stated rather than papered over.** A phase that dispatches nothing
|
|
221
|
+
and narrates nothing is invisible: `/orc-quick` `Q1 LOOK` and `Q2 ASK`, and every
|
|
222
|
+
ask-the-user gate in every lane. Covering those would mean asking 24 spines to
|
|
223
|
+
write a phase marker at phase open — the **remembered-not-dispatched** bet this
|
|
224
|
+
repo has already lost five times (v0.32.0 narration, v0.49.5 hand-back, v0.53.2
|
|
225
|
+
spend log, v0.54.0 journal, v1.0.0 W5 demotion). A `status:` that is right when
|
|
226
|
+
the model is diligent and silently wrong when it is not is worse than one that is
|
|
227
|
+
sometimes blank, because **a stale phase word gets believed** — the same
|
|
228
|
+
reasoning as *unknown is not low* and *unknown is not zero*.
|
|
229
|
+
|
|
230
|
+
Two more limits inherited and restated: a **continued** agent emits no
|
|
231
|
+
PreToolUse/SubagentStop pair, so the skeleton is a floor and never a census; and
|
|
232
|
+
`orc extra` runs its worker through Bash, so a foreign wave writes no `SPAWN` and
|
|
233
|
+
resolves only through its narrated `EXTRA` verb, or hides.
|
|
234
|
+
|
|
235
|
+
#### The animation is a liveness tell, not a progress bar
|
|
236
|
+
|
|
237
|
+
Eight motif kinds — `look` · `ask` · `plan` · `do` · `check` · `ship` · `wait` ·
|
|
238
|
+
`generic` — each one cell wide, each with an ASCII twin. A phase the kind table
|
|
239
|
+
does not name gets `generic`, the honest sweep, **not a guess**.
|
|
240
|
+
|
|
241
|
+
A status line is a **pull** surface: Claude Code re-renders it, ORC cannot. So
|
|
242
|
+
the frame is picked off the wall clock. It advances while you type and while
|
|
243
|
+
turns land, and it **freezes when the session is idle** — which is true, and is
|
|
244
|
+
why frame 0 is designed as a still frame.
|
|
245
|
+
|
|
246
|
+
- `ORC_STATUSLINE_MOTION=0` **removes** the motion rather than slowing it. A
|
|
247
|
+
frozen frame of a cycling animation is a bug that looks like a hang; the web
|
|
248
|
+
panel learned that at v0.44.0 and we are not learning it twice.
|
|
249
|
+
- `ORC_STATUSLINE_ASCII=1` swaps the glyph set.
|
|
250
|
+
|
|
251
|
+
#### `MTok` — MAIN token, and what it cannot see
|
|
252
|
+
|
|
253
|
+
The tokens **this session's own turns** consumed, summed from the session
|
|
254
|
+
transcript's `usage` blocks and read **incrementally** (only the bytes the file
|
|
255
|
+
has grown by — a transcript reaches tens of megabytes and this loop runs every
|
|
256
|
+
five seconds).
|
|
257
|
+
|
|
258
|
+
**Claude Code records no token usage for a dispatched subagent** — v1.2.0
|
|
259
|
+
verified that across every transcript on two machines — so an hour of Opus
|
|
260
|
+
executors adds almost nothing here. `MTok` is what your conversation costs, not
|
|
261
|
+
what a run costs; `orc usage report` and `/orc-budget` remain the truth for that.
|
|
262
|
+
An unreadable transcript renders **`—`, never `0`**, because a zero would say the
|
|
263
|
+
session was free.
|
|
264
|
+
|
|
265
|
+
All four kinds are summed. That is a deliberate exception to `/orc-budget`'s
|
|
266
|
+
*four kinds, never blended*, and it holds only because this is one cell on a
|
|
267
|
+
status bar and not a report: any subset ORC picked would be a weighting **ORC
|
|
268
|
+
invented**, which is worse. The ledger keeps all four apart regardless.
|
|
269
|
+
|
|
270
|
+
#### The rest of the line
|
|
271
|
+
|
|
272
|
+
- **The verdict word becomes the version, the ICON keeps the verdict.** The ⛔
|
|
273
|
+
branch still names every reason — a warning with no reason is an emoji. A
|
|
274
|
+
version ORC cannot read renders as plain `ORC`, never `ORC vnull`.
|
|
275
|
+
- `34% ctx` → **`context (34%)`**.
|
|
276
|
+
- `sess +6%` → **`ucs 6%`** (usage, current session), and it now **keeps its
|
|
277
|
+
slot at zero**: "nothing consumed yet" and "this build has no ucs segment" are
|
|
278
|
+
different facts. It is still a delta of an **account-wide** window.
|
|
279
|
+
- **`Dur 48m`** labels the duration.
|
|
280
|
+
- **The branch** comes from `.git/HEAD` with **no subprocess** — including the
|
|
281
|
+
`gitdir:` pointer file a worktree or submodule uses. Detached HEAD reads as
|
|
282
|
+
`@a1b2c3d`. Not a repository → the segment is absent, not empty.
|
|
283
|
+
- **`lanes:` is replaced by `status:`.** The running lane is its first word, and
|
|
284
|
+
`orc stats` / `orc run list` still hold the session's whole history.
|
|
285
|
+
|
|
286
|
+
#### The status line explains itself
|
|
287
|
+
|
|
288
|
+
**`.claude/hooks/README.md`** ships next to the hook and documents every segment
|
|
289
|
+
in Simplified Technical English (`bin/webui/i18n/TERMS.md` is the term list),
|
|
290
|
+
including what each **absent** segment means — because a user who cannot find a
|
|
291
|
+
segment needs to know whether it is broken or answering.
|
|
292
|
+
|
|
293
|
+
#### Deliberately absent
|
|
294
|
+
|
|
295
|
+
- **A config key.** A status line is display, and a hook cannot resolve a lane's
|
|
296
|
+
config anyway (it has no lane) — the caveat the `log_dir` and wiki segments
|
|
297
|
+
already carry. The two env seams exist for tests and terminals, and nothing in
|
|
298
|
+
ORC ever sets them.
|
|
299
|
+
- **A second throttle.** Everything new rides in v1.2.0's one 5-second scan;
|
|
300
|
+
`ORC_STATUSLINE_SCAN_MS` stays the only seam over it.
|
|
301
|
+
- **A `git` subprocess**, on a per-keystroke surface.
|
|
302
|
+
- **A token estimate for dispatched subagents.** Claude Code records none, and a
|
|
303
|
+
fake measurement would be worse than none.
|
|
304
|
+
- **An `orc ui` panel.** The statusline is not a panel surface; nothing in
|
|
305
|
+
`bin/webui/` moved.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
13
309
|
### v1.2.0 - a retry that cloned the agent, and a window you can watch empty _(2026-09-04)_
|
|
14
310
|
|
|
15
311
|
**Still on the unscoped `orc` package?** Do this once first — your `orc upgrade`
|
package/README-id.md
CHANGED
|
@@ -619,6 +619,50 @@ Bacalah sebagai catatan putaran itu, bukan sebagai audit terkini:
|
|
|
619
619
|
**Riwayat lengkap: [CHANGELOG.md](CHANGELOG.md)** — atau `orc changelog`, yang
|
|
620
620
|
hanya mencetak yang lebih baru dari versi yang Anda punya.
|
|
621
621
|
|
|
622
|
+
### v1.3.0 - bangun sendiri baris status Anda _(04-09-2026)_
|
|
623
|
+
|
|
624
|
+
**Masih memakai paket `orc` yang tanpa awalan?** Lakukan ini sekali dulu —
|
|
625
|
+
`orc upgrade` Anda adalah versi sebelum v0.56.0 dan tidak dapat memasang
|
|
626
|
+
dirinya sendiri.
|
|
627
|
+
|
|
628
|
+
- **Langkah 1 — lepaskan perintahnya dari paket lama:** `npm uninstall -g orc`
|
|
629
|
+
- **Langkah 2 — pasang paket saat ini:** `npm i -g @azure-id/orc`
|
|
630
|
+
- **Langkah 3 — terapkan lagi ke proyek Anda:** `orc update`
|
|
631
|
+
|
|
632
|
+
**Jangan pakai `npm i -g -f`.**
|
|
633
|
+
|
|
634
|
+
Baris status kini **milik Anda**. Tiga baris, tiap baris memuat satu sampai lima
|
|
635
|
+
bagian dari katalog yang dikirim ORC, tiap bagian digambar lewat salah satu dari
|
|
636
|
+
35 bentuk dan Anda beri gaya sendiri: dua warna, warna yang mengikuti nilai,
|
|
637
|
+
kata-katanya sendiri, simbolnya sendiri, lebar yang tetap, dan kapan bagian itu
|
|
638
|
+
boleh muncul.
|
|
639
|
+
|
|
640
|
+
**Fitur ini mati secara bawaan, dan saat mati hasilnya sama persis byte per byte
|
|
641
|
+
dengan sebelumnya.** Itu sebuah tes — sembilan keadaan dibekukan simbol demi
|
|
642
|
+
simbol — bukan sekadar niat.
|
|
643
|
+
|
|
644
|
+
Susun di **`orc ui` ▸ CLI Hook Interface**.
|
|
645
|
+
|
|
646
|
+
- **CLI YANG MENYUSUN, HOOK YANG MENGGAMBAR.** Tata letak Anda diturunkan jadi
|
|
647
|
+
daftar instruksi datar dengan setiap warna sudah dihitung; hook menjalankannya
|
|
648
|
+
dan tidak memutuskan apa pun. Claude Code menggambar ulang paling cepat tiap
|
|
649
|
+
300 md dan **membatalkan** skrip yang masih berjalan — di Windows memulai
|
|
650
|
+
`node` saja sudah 285 md dari jatah itu, jadi hook hanya punya sekitar 15 md.
|
|
651
|
+
- **Pratinjau ITU bilahnya.** Pratinjau dan hook memakai modul penggambar yang
|
|
652
|
+
SAMA, jadi keduanya tidak mungkin berbeda.
|
|
653
|
+
- **Peletakan yang tidak sah dibuat MUSTAHIL.** Sebuah baris hanya boleh memuat
|
|
654
|
+
bagian jika setiap baris di atasnya sudah terisi. Setiap seret juga punya
|
|
655
|
+
jalur papan tombol dan menu.
|
|
656
|
+
- **Tata letak susunan Anda bisa LEBIH CEPAT** daripada bawaan: 346,7 md untuk
|
|
657
|
+
bawaan, **298,2 md** untuk `minimal` susunan sendiri.
|
|
658
|
+
- **Delapan bagian DITOLAK**, tiap-tiap dengan hasil pengukurannya. Nilai yang
|
|
659
|
+
tidak dapat dihitung tampil sebagai tanda pisah — **bukan `0`**, yang berarti
|
|
660
|
+
gratis.
|
|
661
|
+
|
|
662
|
+
**Rincian lengkap: [`guides/status-line.md`](guides/status-line.md).**
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
622
666
|
### v1.0.0 - konfigurasi, fase, dan panggilan berhenti jadi prosa _(30-08-2026)_
|
|
623
667
|
|
|
624
668
|
**Masih memakai paket `orc` yang tanpa awalan?** Lakukan ini sekali dulu —
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|

|
|
15
15
|

|
|
16
16
|
|
|
17
|
-
**Latest: v1.
|
|
17
|
+
**Latest: v1.4.0** · updated 2026-09-04 · [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
|
|
|
@@ -575,7 +575,7 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
|
|
|
575
575
|
**Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
|
|
576
576
|
only what is newer than the version you have.
|
|
577
577
|
|
|
578
|
-
### v1.
|
|
578
|
+
### v1.4.0 - the agent panel, and the number that was missing _(2026-09-04)_
|
|
579
579
|
|
|
580
580
|
**Still on the unscoped `orc` package?** Do this once first — your `orc upgrade`
|
|
581
581
|
is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
|
|
@@ -587,86 +587,62 @@ the top of this file.
|
|
|
587
587
|
|
|
588
588
|
**Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
|
|
589
589
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
for one authorised dispatch**, all editing the same files inside a 2h04m window.
|
|
594
|
-
The trace hook had recorded every one of them. Nothing had ever read it.
|
|
595
|
-
|
|
596
|
-
- **`orc run inflight`** — the one reader of the pending sidecar the trace hook
|
|
597
|
-
has written on every `SPAWN` since v0.34. `0` clear · `1` in-flight ·
|
|
598
|
-
`2` unknown. Every lane that re-dispatches now asks it first.
|
|
599
|
-
- **A re-dispatch is refused over a live attempt.** New registered contract
|
|
600
|
-
token, `_shared/return-validation.md` **§0**, placed above every existing rule
|
|
601
|
-
because every one of them ends in "re-dispatch". The refusal names the agent,
|
|
602
|
-
the task and its age, and always offers "dispatch anyway" — never as the
|
|
603
|
-
default.
|
|
604
|
-
- **Exit 2 refuses, and it is the one place in ORC where an absent reading
|
|
605
|
-
blocks.** `orc usage check` exit 2 never stops a run; an UNCHECKABLE pact
|
|
606
|
-
never raises an exit code. It inverts here because the two errors are not the
|
|
607
|
-
same size: a wrongly-refused dispatch costs one question, a wrongly-issued one
|
|
608
|
-
costs a second Opus agent for an hour.
|
|
609
|
-
- **An interrupted turn is UNKNOWN, never FAILED.** A usage limit, an API error
|
|
610
|
-
or a `Ctrl+C` between a dispatch and its return says nothing about the agent.
|
|
611
|
-
Classifying that as a failure is what made the incident compound: it paid
|
|
612
|
-
twice, hit the limit sooner, and retried again.
|
|
613
|
-
- **Unknown is not zero.** A missing sidecar, an unreadable one, records older
|
|
614
|
-
than six hours, or a sidecar that disagrees with the trace's own SPAWN/RETURN
|
|
615
|
-
balance all read `unknown` — never `clear`.
|
|
616
|
-
- **The honest limit is stated, not papered over.** It cannot see an *ad-hoc*
|
|
617
|
-
dispatch (`/orc-quick` recon, dispatched by model+effort rather than a pinned
|
|
618
|
-
`orc-*` agent): the hook writes no `SPAWN` for one, so no record exists. Those
|
|
619
|
-
are read-only and short, and a lane must never read `clear` as proof one
|
|
620
|
-
finished.
|
|
621
|
-
|
|
622
|
-
The other half — **you can now watch the window empty**:
|
|
623
|
-
|
|
624
|
-
- **`orc usage report`** — 5-hour, 7-day and context in one place, plus the line
|
|
625
|
-
the snapshot could never give you: **"This session has consumed 59% of the
|
|
626
|
-
5-hour window and is still counting"**, with the caveat that other sessions on
|
|
627
|
-
the same account share that window.
|
|
628
|
-
- **A window reset mid-session is not a refund.** The statusline keeps a
|
|
629
|
-
per-session ledger beside `usage.json` — raw numbers only, never a computed
|
|
630
|
-
word — and banks what was spent before a reset so the running total keeps
|
|
631
|
-
counting across the boundary. A new session re-baselines.
|
|
632
|
-
- **The statusline grew a second line, and a `sess +X%` segment on the first.**
|
|
590
|
+
The second board. Claude Code renders a custom row for every subagent in the
|
|
591
|
+
agent panel, and that surface is ORC's exact domain: one row per dispatched
|
|
592
|
+
agent, live, while it runs.
|
|
633
593
|
|
|
634
594
|
```
|
|
635
|
-
|
|
636
|
-
|
|
595
|
+
● orc-executor-opus-5-low O5/low 84K ███▎░░░░ 42% for 17m
|
|
596
|
+
✓ orc-reviewer-opus-5-med O5/med 31K █▌░░░░░░ 16% for 4m
|
|
637
597
|
```
|
|
638
598
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
599
|
+
**AND IT ANSWERS A QUESTION v1.2.0 SAID COULD NOT BE ANSWERED.** That release
|
|
600
|
+
established that Claude Code records no token usage for a dispatched subagent —
|
|
601
|
+
`isSidechain` is never set, no sidechain message carries a usage block, verified
|
|
602
|
+
across every transcript on two machines — so `orc usage report` has reported
|
|
603
|
+
`tokens: null` for every Claude row ever since, and said why.
|
|
604
|
+
|
|
605
|
+
That is still true **of the transcript**. It is not true of the agent panel,
|
|
606
|
+
which carries `tokenCount` per task along with the resolved `model` and
|
|
607
|
+
`effort`. So the hook writes down what it is handed, and `orc usage report`
|
|
608
|
+
reads it.
|
|
609
|
+
|
|
610
|
+
- **It is a FLOOR, and it is labelled one everywhere it appears.** The hook sees
|
|
611
|
+
a task only while it is in the panel: an agent that started and finished
|
|
612
|
+
between two renders is never seen, and a count read just before an agent
|
|
613
|
+
finished is short by whatever came after. `not-seen` means exactly that and
|
|
614
|
+
is never `0`. A floor reported as a total would be the same class of lie as a
|
|
615
|
+
zero reported for an unknown.
|
|
616
|
+
- **The record is written even with the board OFF.** It is not part of the
|
|
617
|
+
display feature — it is a measurement Claude Code hands over either way, and
|
|
618
|
+
throwing it out because a display setting is off would be the wrong trade by a
|
|
619
|
+
wide margin. `orc init` and `orc update` wire `subagentStatusLine` for that
|
|
620
|
+
reason alone, and never clobber one you already have.
|
|
621
|
+
- **A count can only go up**, so a lower reading is a stale one and never
|
|
622
|
+
overwrites a higher one.
|
|
623
|
+
- **The model and effort are OBSERVED.** ORC's downgrade check has two readings
|
|
624
|
+
— one derived from the agent's name, one the agent reports about itself. This
|
|
625
|
+
is the third, and the only one nobody had to be trusted for.
|
|
626
|
+
|
|
627
|
+
**ONE COMPILER, TWO BOARDS.** The second board reuses the compiler, the render
|
|
628
|
+
program, every shape, every glyph set, the colour model, the validator and the
|
|
629
|
+
gate ladder. What differs is a component set, three filenames and a config key —
|
|
630
|
+
a table, not a fork. A test asserts there is exactly one compiler and that the
|
|
631
|
+
new hook grew no renderer of its own, because that is the cheap mistake this
|
|
632
|
+
whole design exists to avoid.
|
|
633
|
+
|
|
634
|
+
- **A component belongs to one board**, and the other refuses it by name with
|
|
635
|
+
the board it belongs to. Two catalogues would be two lists somebody has to
|
|
636
|
+
keep in step; this is one catalogue with a column.
|
|
637
|
+
- **A subagent row is one line by construction** — Claude Code renders one per
|
|
638
|
+
task — so the three-line board and its dense-prefix rule simply do not apply.
|
|
639
|
+
- **Three presets**: what the agent is and what it has cost, a watch view with
|
|
640
|
+
its own context window, and the downgrade check made visible per agent.
|
|
641
|
+
- Every gate rung falls back to **Claude Code's own row**, which is a real
|
|
642
|
+
answer and a better one than a blank. An empty render hides a task entirely,
|
|
643
|
+
which is almost never what anybody meant — so it is never emitted.
|
|
644
|
+
|
|
645
|
+
`subagent_line_custom`, default `off`. Off is Claude Code's row, unchanged.
|
|
670
646
|
|
|
671
647
|
---
|
|
672
648
|
|