@azure-id/orc 1.4.0 → 1.4.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.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,235 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v1.4.2 - the panel that stops reloading, and the fields you could not read back _(2026-09-05)_
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
+ Four more defects in `orc ui` ▸ **CLI Hook Interface**, reported by the person
26
+ who uses it. Three of them turned out to be **the same defect wearing three
27
+ faces**, which is why the fix is one idea rather than four patches.
28
+
29
+ **STAGING A CHANGE RELOADED THE WHOLE PANEL, AND THAT IS WHY EDITING LOOKED
30
+ BROKEN.** Every staged op re-entered the router: the panel was thrown away, four
31
+ endpoints were refetched, and everything was rebuilt from a skeleton. Move a
32
+ chip, pick a colour, type a name - the page visibly reloaded each time. That is
33
+ bad on its own, and it produced two worse things.
34
+
35
+ The first is that **a staged change looked like an applied one.** The picture came
36
+ back looking different, so there was nothing left to tell you the write had not
37
+ happened. The second is that **the open editor went stale.** The dialog stayed on
38
+ screen while the panel behind it was replaced, so every control in it was still
39
+ showing the value from BEFORE the change you had just made. You picked a shape,
40
+ the sample did not move; you typed a name, the box did not keep it. The only
41
+ reasonable conclusion was that editing did not work.
42
+
43
+ Nothing is fetched now until something actually moves the disk - Apply, a
44
+ preset, the reset, the switch, a board change, a recompile. A staged op paints
45
+ from the cache it already has: **zero requests**, the scroll position kept by
46
+ hand. The open editor is registered for that repaint and re-finds its part by
47
+ its stable ref, so what is on screen is always the effective value - **and the
48
+ caret survives**, because an editor that rebuilds on every keystroke and drops
49
+ focus after one letter is not an editor. A name now stages per keystroke rather
50
+ than on blur, which is what made a name typed and then clicked away from race
51
+ the close and sometimes never stage at all.
52
+
53
+ **AND THE FIELDS THEMSELVES COULD NOT BE READ BACK: `--json is not a summary`,
54
+ found again.** `orc statusline show --json` emitted **twelve** of the
55
+ twenty-four fields a part can carry. So `case`, `prefix`, `suffix`, `glyphs`,
56
+ `format`, `compact`, `min_width`, `precision`, `width`, `min_cols`, `max_cols`
57
+ and `priority` were written to disk correctly by a CLI that has always accepted
58
+ them - and were then **invisible to the panel that wrote them**. Reopen the
59
+ editor and the control was blank. Colour worked; almost nothing else appeared to.
60
+ Every resolved field ships now, plus `authored` - the raw item as the user wrote
61
+ it - so a control can finally say **which values are yours** rather than
62
+ inherited from the catalogue or the colour set. A dot beside a control name is
63
+ that answer.
64
+
65
+ **SIX PARTS PER LINE, NOT FIVE**, and the cap moved in ONE place
66
+ (`SL_MAX_PER_LINE`), because a slot limit spelled out at each of its five call
67
+ sites is a limit that drifts on the first change. The limit is about reading
68
+ rather than rendering: a line is scanned at a glance, and six is where people
69
+ stopped asking for one more. A spacer, a divider and a fill still do not count -
70
+ they are not things the line SAYS.
71
+
72
+ **THE DROPDOWN NOBODY COULD READ WAS A PANEL WITH NO COLOURS AT ALL.**
73
+ `hookui.css` had been written against `--bg-sunken`, `--bg-raised`, `--fg` and
74
+ `--fg-dim`, and **none of those tokens exist** - the real names are
75
+ `--surface-2`, `--surface-3`, `--text` and `--text-dim`. Every one of those
76
+ declarations was silently dropped by the browser, which is why the "Between
77
+ parts" select had no background of its own and its open list rendered near-white
78
+ on near-white. All 34 are mapped onto real tokens, and the option list now
79
+ states BOTH halves plus `color-scheme`, because a native popup is drawn by the
80
+ platform and inherits only the half you leave to chance.
81
+
82
+ **THE PREVIEW IS DRAWN AS A TERMINAL NOW**, because that is the claim it is
83
+ making. A status line in a bare grey box is a string; the same string inside a
84
+ window of the stated width, on a terminal ground, with a **column ruler** under
85
+ it, is a picture of the thing. The bytes did not change - it is still
86
+ `templates/hooks/orc-statusline-render.js`, the hook's own engine - what changed
87
+ is that you can believe it. Each line's cell count sits under the window it
88
+ belongs to instead of in a row of chips a long way from it.
89
+
90
+ **And you can now see what you are choosing.** `orc statusline preview` takes
91
+ `--theme` and `--glyphs` as a **render-only** override: the same saved layout,
92
+ drawn under a different colour set or symbol set, **writing nothing**. The panel
93
+ uses it for one drawer - *See it in other setups* - holding the three strippings
94
+ (no colour, plain text, no motion), all four colour sets and all seven symbol
95
+ sets. Picking a colour set from its name is a guess; picking it from its picture
96
+ is a decision. The drawer is **closed by default and its rows are fetched only
97
+ when it is opened**: eleven extra renders nobody asked to see is eleven
98
+ subprocesses nobody asked to pay for.
99
+
100
+ **AND THE SIXTH PART STILL RESET THE BAR TO THE DEFAULT, BECAUSE THE CAP WAS IN
101
+ THREE PLACES.** Raising it in the validator was not enough. The hook has a cheap
102
+ shape guard of its own — it re-checks the compiled file rather than trusting it,
103
+ because a hand-edited compiled file is a file nobody validated — and that guard
104
+ held its own `5`. So a legal six-part line fell straight through to the shipped
105
+ two lines, with the reason recorded in a ledger file nobody was looking at. It
106
+ also counted **every** item, including spacers and fills, which the validator
107
+ never has: a legal five plus a fill fell back too, and always had.
108
+
109
+ A hook cannot call this CLI — a status line re-renders on every keystroke — so
110
+ the cap now travels ON the lock file (already gated on `orc_version`, so a stale
111
+ copy cannot outlive its build) and the compiler marks each structural item,
112
+ because a compiled op carries an instance id and never a component type. Both
113
+ hooks read both. One cap, one counting rule, three readers.
114
+
115
+ **AND A NAME YOU TYPED SOMETIMES WENT NOWHERE, WHICH WAS TRUE AND UNSAID.**
116
+ Seven of the thirty-five shapes draw a name: `plain`, `label-value`, `bracket`,
117
+ `angle`, `badge`, `pill`, `stack`. The other twenty-eight — every bar, every
118
+ icon, every bare value — ignore it entirely, and that is the design: a bar with
119
+ a word in front of it is a different shape. But the Name box was offered on all
120
+ thirty-five. It took the text, the CLI wrote it to disk correctly, and nothing
121
+ ever appeared on the bar or in the preview. The same was true of the number and
122
+ text settings on a bar, which lowers a width and a colour ramp and no format at
123
+ all.
124
+
125
+ Each renderer now publishes the item fields it actually **uses**, and the editor
126
+ greys out the ones this shape ignores — **keeping the slot**, with the reason and
127
+ the list of shapes that do use it, because "this shape cannot use it" and "we
128
+ forgot to offer it" must not look the same, and a value already set has to stay
129
+ readable. The sentence sits under the shape gallery too, since the shape is what
130
+ decides it. A golden test reads the compiler's own switch and fails if the two
131
+ lists disagree.
132
+
133
+ **AND IT STILL BLINKED, WITH THE NETWORK TAB EMPTY.** Removing the refetch was
134
+ half the fix. `hkPaint` still replaces every child of the panel, and the
135
+ stylesheet fades and slides each one in on a 30ms stagger — so a staged change
136
+ still read as a page reload, on every keystroke, exactly as reported. Entrance
137
+ animations are now removed from the second paint onward, and inside the part
138
+ editor on every rebuild. The transitions are untouched: hover, the drop marker
139
+ and the staged edge are about the pointer rather than about arriving.
140
+
141
+ One more honesty fix rode along: the sample in the part editor is labelled for
142
+ what it is. `previews` is a per-renderer sample the CLI drew from its own
143
+ fixture, so it shows the **shape** a part will take and never the words or the
144
+ numbers it will carry at run time. It used to say it was drawn with your changes
145
+ in it, and for a label it was not.
146
+
147
+ ---
148
+
149
+ ### v1.4.1 - the board you can actually use _(2026-09-05)_
150
+
151
+ **Still on the unscoped `orc` package?** Do this once first — your `orc upgrade`
152
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
153
+ the top of this file.
154
+
155
+ - **Step 1 — release the command from the old package:** `npm uninstall -g orc`
156
+ - **Step 2 — install the current package:** `npm i -g @azure-id/orc`
157
+ - **Step 3 — re-apply it to your project:** `orc update`
158
+
159
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
160
+
161
+ Four defects in `orc ui` ▸ **CLI Hook Interface**, and the revamp they asked
162
+ for. Reported by the person who designed it, which is the useful kind of report:
163
+ *"this is massive, what the heck is this UI, so plain and not interactive."*
164
+
165
+ **ADDING THREE PARTS PRODUCED ONE, AND THAT WAS ARITHMETIC, NOT A UI COMPLAINT.**
166
+ Every `+ line N` button in the old palette computed its write's position from the
167
+ **saved** layout rather than from the layout being staged. Three staged adds all
168
+ carried position 1 — and `orc statusline set <line> <pos>` with an item already
169
+ at that position is an **EDIT**, by design. So the second write changed the first
170
+ part's type, the third changed it again, and one part appeared where three were
171
+ asked for. The five-slot cap counted the same stale layout, so it never fired
172
+ either.
173
+
174
+ The fix is structural rather than careful. A staged change is now a **semantic op
175
+ against a stable ref** — `add` · `remove` · `move` · `set` · `sep` · `doc` — and
176
+ one function, `hkPlan`, replays them in order to produce **both** the board you
177
+ are looking at **and** the writes that produce it, deriving every position at the
178
+ moment that write will run. A second idea of where a part will land is exactly
179
+ the bug this replaces: the board drew one arrangement and the writes made
180
+ another, silently. The cap, the dense-prefix rule and the "line is full" refusal
181
+ all read that same effective board now.
182
+
183
+ **THE COLOUR SET WROTE ONE LINE AND READ THE WHOLE DOCUMENT.** The picker shelled
184
+ `orc statusline line 1 --theme`, which sets **line 1's** override, while
185
+ `statusline show --json` reports `layout.theme`. So the selected button never
186
+ moved and only a third of the bar changed colour — half working, which is worse
187
+ than not working. New command `orc statusline doc [--theme] [--glyphs] [--ansi]
188
+ [--align-columns]` writes document-level settings, and **clears the per-line
189
+ overrides that would otherwise shadow the choice** — a setting silently shadowed
190
+ is the failure this command exists to fix. One command per scope, and the panel
191
+ calls the one that matches the control.
192
+
193
+ **THE PREVIEW HAD NEVER HAD COLOUR.** `orc ui` serves under
194
+ `style-src 'self'`, which blocks a parsed `style` **attribute** outright — so
195
+ every SGR colour `ansiBlock` computed was thrown away by the browser, with the
196
+ reason only in a console nobody had open. The properties are assigned through
197
+ CSSOM now, which is not a parse and is not blocked. Loosening the policy to
198
+ `unsafe-inline` for a preview is not a trade worth making.
199
+
200
+ **AND "WHAT IS THIS THING" NOW HAS AN ANSWER ON THE PAGE.** Every part carries
201
+ its one-line description on the chip, in the picker and in the reference list;
202
+ every control in the editor carries the sentence that says what it does; the
203
+ `80 / 120 / 160` buttons say they are **terminal widths in character cells**;
204
+ and each colour set carries the CLI's own sentence about what it is for.
205
+
206
+ **The revamp itself, five changes:**
207
+
208
+ - **The board is the only place anything is applied.** The palette's three
209
+ `+ line N` buttons are gone. It is a **reference** now — what each part shows
210
+ and nothing else — because the act of building the bar belongs next to the bar.
211
+ - **Add · Change · Move · Remove are buttons on the chip**, and each opens a
212
+ **modal that says what it is about to do**. The part picker is one modal, one
213
+ search box, one click, and it is the only place a part is ever chosen — for a
214
+ new slot and for swapping an existing one.
215
+ - **Drag and drop**, with the drop edge marked on the chip it will land beside
216
+ rather than by opening a gap that shoves every other chip sideways while the
217
+ pointer is still deciding. It is the **shortcut, never the mechanism**: every
218
+ move has a button and a keyboard equivalent, and drag is switched **off for
219
+ real** below 600px, where a drop gap stops being a target.
220
+ - **The separator is a dropdown of twelve**, published by the CLI
221
+ (`separators` in `statusline components --json`) so the panel still names none
222
+ of them. A value the layout already carries that is not in the set keeps its
223
+ slot, leads the list and is disabled — the `fixed_executor` rule.
224
+ - **Motion, in `04-motion.css` and nowhere else:** a chip arrives, a chip you
225
+ just staged pulses three times so you can find it, a picker row slides in as
226
+ the list narrows under your typing. Every one is FINITE, so the reduced-motion
227
+ cap leaves each at rest rather than frozen part-way — and the drop marker,
228
+ the refusal and the staged-edge are borders, never motion.
229
+
230
+ A refusal is never a shrug: "line 3 is full, it already holds 5 parts" and
231
+ "put something on line 2 first" are two different facts and stay two sentences.
232
+ A line that cannot take a part **says so once** rather than printing the same
233
+ refusal on six identical disabled slots.
234
+
235
+ `statusline components --json` gains `separators`, `themes_about` and a
236
+ per-component `structural` flag — the panel cannot know which parts do not eat
237
+ one of the five without a second idea of the catalogue, which is the drift this
238
+ panel exists to make impossible.
239
+
240
+ ---
241
+
13
242
  ### v1.4.0 - the agent panel, and the number that was missing _(2026-09-04)_
14
243
 
15
244
  **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.0.0-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.4.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.0.0** · diperbarui 30-08-2026 · [daftar perubahan lengkap](CHANGELOG.md)
16
+ **Versi terbaru: v1.4.2** · diperbarui 05-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
 
@@ -619,6 +619,43 @@ 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.4.2 - panel yang berhenti memuat ulang, dan bidang yang tidak bisa dibaca kembali _(05-09-2026)_
623
+
624
+ Empat cacat lagi di `orc ui` ▸ **Antarmuka CLI Hook**. Tiga di antaranya adalah
625
+ cacat yang sama dengan tiga wajah berbeda.
626
+
627
+ **Menyiapkan satu perubahan memuat ulang seluruh panel** - tiap operasi yang
628
+ disiapkan masuk kembali ke router, jadi empat endpoint diambil ulang dan semua
629
+ dibangun lagi dari kerangka. Itu membuat perubahan yang baru disiapkan tampak
630
+ seperti sudah diterapkan, dan meninggalkan editor yang terbuka menampilkan nilai
631
+ sebelum perubahan yang baru saja Anda buat: Anda memilih bentuk, tidak ada yang
632
+ bergerak. Sekarang tidak ada yang diambil sampai sesuatu benar-benar mengubah
633
+ disk; satu operasi yang disiapkan menggambar ulang dari cache dengan **nol
634
+ permintaan**, menjaga posisi gulir Anda, dan editor yang terbuka ikut digambar
635
+ ulang - beserta kursornya.
636
+
637
+ **Dan bidangnya tidak bisa dibaca kembali.** `orc statusline show --json`
638
+ mengirim dua belas dari dua puluh empat bidang yang bisa dibawa sebuah bagian,
639
+ jadi `case`, `prefix`, `min_cols`, `precision` dan tujuh lainnya ditulis ke disk
640
+ dengan benar lalu tidak terlihat oleh panel yang menulisnya. Sekarang semua
641
+ bidang dikirim, ditambah `authored`, sehingga sebuah kontrol bisa menyebut
642
+ **nilai mana yang milik Anda** dan mana yang warisan.
643
+
644
+ **Enam bagian per baris, bukan lima** - dipindahkan di satu tempat, dan pemisah
645
+ tetap tidak dihitung. **Menu tarik-turun yang tidak terbaca** ternyata adalah
646
+ panel tanpa warna sama sekali: `hookui.css` ditulis memakai empat token CSS yang
647
+ tidak ada, jadi setiap deklarasi itu dibuang diam-diam oleh peramban.
648
+
649
+ **Pratinjau kini digambar sebagai terminal** - jendela selebar yang disebutkan
650
+ dengan penggaris kolom - dan `orc statusline preview` menerima `--theme` dan
651
+ `--glyphs` sebagai penimpaan **khusus gambar**, jadi laci baru menampilkan bar
652
+ yang sama di bawah keempat set warna dan ketujuh set simbol. Memilih set warna
653
+ dari namanya adalah tebakan; memilihnya dari gambarnya adalah keputusan.
654
+
655
+ Detail lengkap di [CHANGELOG.md](CHANGELOG.md).
656
+
657
+ ---
658
+
622
659
  ### v1.3.0 - bangun sendiri baris status Anda _(04-09-2026)_
623
660
 
624
661
  **Masih memakai paket `orc` yang tanpa awalan?** Lakukan ini sekali dulu —
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.2.0-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.4.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
  ![GitHub stars](https://img.shields.io/github/stars/azure-id/orc?style=for-the-badge&color=yellow)
16
16
 
17
- **Latest: v1.4.0** · updated 2026-09-04 · [full changelog](CHANGELOG.md)
17
+ **Latest: v1.4.2** · updated 2026-09-05 · [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,74 +575,64 @@ 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.4.0 - the agent panel, and the number that was missing _(2026-09-04)_
578
+ ### v1.4.2 - the panel that stops reloading, and the fields you could not read back _(2026-09-05)_
579
579
 
580
- **Still on the unscoped `orc` package?** Do this once first your `orc upgrade`
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
582
582
  the top of this file.
583
583
 
584
- - **Step 1 release the command from the old package:** `npm uninstall -g orc`
585
- - **Step 2 install the current package:** `npm i -g @azure-id/orc`
586
- - **Step 3 re-apply it to your project:** `orc update`
584
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
585
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
586
+ - **Step 3 - re-apply it to your project:** `orc update`
587
587
 
588
588
  **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
589
589
 
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.
593
-
594
- ```
595
- orc-executor-opus-5-low O5/low 84K ███▎░░░░ 42% for 17m
596
- orc-reviewer-opus-5-med O5/med 31K █▌░░░░░░ 16% for 4m
597
- ```
598
-
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.
590
+ Four more defects in `orc ui` **CLI Hook Interface**. Three were the same
591
+ defect wearing three faces.
592
+
593
+ **Staging a change reloaded the whole panel** - every staged op re-entered the
594
+ router, so four endpoints were refetched and everything was rebuilt from a
595
+ skeleton. That made a staged change look like an applied one, and it left the
596
+ open editor showing values from before the change you had just made: you picked
597
+ a shape and nothing moved. Nothing is fetched now until something actually moves
598
+ the disk; a staged op repaints from cache with **zero requests**, keeps your
599
+ scroll position, and the open editor repaints with it - caret and all.
600
+
601
+ **And the fields could not be read back.** `orc statusline show --json` emitted
602
+ twelve of the twenty-four fields a part can carry, so `case`, `prefix`,
603
+ `min_cols`, `precision` and seven more were written to disk correctly and then
604
+ were invisible to the panel that wrote them. Every field ships now, plus
605
+ `authored`, so a control can say **which values are yours** rather than
606
+ inherited. `--json is not a summary`, found again.
607
+
608
+ **Six parts per line, not five.** **The dropdown nobody could read** turned out
609
+ to be a panel with no colours at all: `hookui.css` was written against four CSS tokens that do not
610
+ exist, so every one of those declarations was silently dropped.
611
+
612
+ **The preview is drawn as a terminal now** - a window of the stated width with a
613
+ column ruler - and `orc statusline preview` takes `--theme` and `--glyphs` as a
614
+ **render-only** override, so a new drawer shows the same bar under all four
615
+ colour sets and all seven symbol sets. Picking a colour set from its name is a
616
+ guess; picking it from its picture is a decision.
617
+
618
+ **And the sixth part still reset the bar to the default**, because the cap was in
619
+ three places: the hook re-checks the compiled file with a cheap shape guard of
620
+ its own, and that guard held its own `5` — and counted spacers, which the
621
+ validator never has. The cap now travels on the lock file and the compiler marks
622
+ each structural item, so one cap and one counting rule serve all three readers.
623
+
624
+ **And a name you typed sometimes went nowhere.** Seven of the thirty-five shapes
625
+ draw a name; the other twenty-eight ignore it, which is the design a bar with a
626
+ word in front of it is a different shape. The Name box was offered on all
627
+ thirty-five anyway. Each renderer now publishes the fields it **uses**, and the
628
+ editor greys out what this shape ignores, keeping the slot and naming the shapes
629
+ that do.
630
+
631
+ **And it still blinked with the network tab empty:** `hkPaint` replaces every
632
+ child, and the stylesheet faded each one in on a stagger. Entrance animations are
633
+ off from the second paint onward.
634
+
635
+ Full detail in [CHANGELOG.md](CHANGELOG.md).
646
636
 
647
637
  ---
648
638