@azure-id/orc 0.55.2 → 0.56.1

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/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-0.55.2-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-0.56.0-blue.svg?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/license-MIT-green.svg?style=for-the-badge)
12
12
  ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge)
13
13
  ![Claude Code](https://img.shields.io/badge/Claude_Code-Skills-purple.svg?style=for-the-badge)
14
14
  ![Dependencies](https://img.shields.io/badge/dependencies-zero-lightgrey.svg?style=for-the-badge)
15
15
  ![GitHub stars](https://img.shields.io/github/stars/azure-id/orc?style=for-the-badge&color=yellow)
16
16
 
17
- **Latest: v0.55.2** · updated 2026-08-27 · [full changelog](CHANGELOG.md)
17
+ **Latest: v0.56.1** · updated 2026-08-28 · [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
 
@@ -24,6 +24,38 @@
24
24
 
25
25
  ---
26
26
 
27
+ > [!CAUTION]
28
+ > **Upgrading from a version before v0.56.0? Do this once.**
29
+ >
30
+ > The package moved from the unscoped `orc` to **`@azure-id/orc`**. Both declare
31
+ > the same `orc` command, and npm will not hand that command to the new package
32
+ > while the old one still holds it — so **every** install source fails with the
33
+ > same error, and `orc upgrade` cannot fix itself:
34
+ >
35
+ > ```text
36
+ > npm error code EEXIST
37
+ > npm error File exists: C:\Users\you\AppData\Roaming\npm\orc
38
+ > ```
39
+ >
40
+ > Run these two lines once. Nothing in your `.claude/` is touched, and your
41
+ > `orc.config.yaml` survives:
42
+ >
43
+ > ```bash
44
+ > npm uninstall -g orc # release the `orc` command from the old package
45
+ > npm i -g @azure-id/orc # install the current one
46
+ > orc update # re-apply into this project (add --global for ~/.claude)
47
+ > ```
48
+ >
49
+ > **From v0.56.0 onward `orc upgrade` handles this for you** — it removes the old
50
+ > package first, then installs, and says so while it does it. `orc doctor` also
51
+ > reports the old package by name if it is still there.
52
+ >
53
+ > Do **not** reach for `npm i -g -f`. `--force` overwrites the command file and
54
+ > leaves the superseded package installed underneath, owning nothing and never
55
+ > updated again.
56
+
57
+ ---
58
+
27
59
  > [!IMPORTANT]
28
60
  > **`orc-open` is released — ORC for non-Claude agents.**
29
61
  > A provider-agnostic port of the pipeline:
@@ -178,8 +210,11 @@ You do not have to run a command to hear about it: the same notice appears
178
210
  inside Claude Code through ORC's hooks, at **zero model tokens** — hooks are
179
211
  scripts Claude Code runs, not model turns.
180
212
 
181
- If the GitHub spec fails to install (common under **NVM**), `orc upgrade` retries
182
- with a plain tarball by itself.
213
+ `orc upgrade` tries the npm registry first, then a plain tarball, then the
214
+ GitHub spec and it remembers which one worked. If the old unscoped `orc`
215
+ package is still installed, it removes that first (announced), because npm
216
+ cannot give the `orc` command to `@azure-id/orc` while another package owns it.
217
+ See the caution at the top of this README for the one-time manual version.
183
218
 
184
219
  </details>
185
220
 
@@ -324,6 +359,8 @@ orc ui --stop # shut this project's server down
324
359
  | Crosslink | **Design** (the boundary as a graph) and **Settings** (each peer's freshness) | `crosslink add` / `remove` |
325
360
  | Promises · Boundary · Self-serve | the pact ledger, the boundary cards, and the surfaces a non-developer can change | `pact check`, `pact sync`, `handoff set` |
326
361
  | **Docs** | every `/orc-doc` document as a **ribbon** — one block per section, sized by its length and coloured by its state — plus the section files with their sub-parts, the wave strip, the lint health card and the wave preview | `doc compile` · `doc migrate` |
362
+ | **Extra** | **six tabs**: the connection setup, the local tools and their state, the band ladder and the six positions, spending per profile per band, and **Recovery** — every dispatch that never reported back, with what it left on disk | `extra add` / `ping` / `route` / `role` |
363
+ | **Challenge** | every `/orc-challenge` cycle: the frozen goal, the council roster and what each lens raised, the findings with their dispositions, and whether the pass is computed or blocked | `challenge record` · `accept` · `rebut` |
327
364
  | **Mocked Skill Use** | every mocked run that ships with ORC, grouped and searchable, with a reading pane | — |
328
365
  | Learn | the `orc onboarding` walkthrough, one section at a time | — |
329
366
  | Experiment | every lane with a copy button; opens a Claude session in a terminal | — |
@@ -349,6 +386,77 @@ CSS.
349
386
 
350
387
  ---
351
388
 
389
+ ## Running part of the ladder somewhere else — `orc extra`
390
+
391
+ **The orchestrator is always Claude.** What Extra changes is *who executes a
392
+ slice*: a score band you own, or one of six named positions, can point at
393
+ DeepSeek, GLM, Kimi, MiniMax, Qwen, a local Ollama, or a coding CLI you already
394
+ have signed in (opencode, codex). Everything downstream — the smoke gate, the TDD
395
+ gate, the reviewer, the worktree-delta check — is engine-blind, so nothing learns
396
+ the work was foreign.
397
+
398
+ **Off by default, and it cannot be armed until something has actually answered.**
399
+
400
+ ```bash
401
+ orc extra providers # the shipped, dated catalog — providers, never models
402
+ orc extra tools # local CLIs: absent · outdated · unauthenticated · ready
403
+ orc extra add ds --provider deepseek --engine api --env-key DEEPSEEK_API_KEY
404
+ orc extra ping ds # the connection gate: a ladder, and nothing reads stronger than it is
405
+ orc extra models ds --test <id> # a LISTED model can still be dead upstream
406
+ orc extra health ds --model <id> # …and a working model is not one that FINISHES
407
+ orc extra route set 40-55 ds/deepseek-chat # a score band
408
+ orc extra role set doc-writer ds/deepseek-chat # or a named position
409
+ orc config set extra_enabled true
410
+ ```
411
+
412
+ - **The catalog ships providers and never models.** A shipped model id is wrong
413
+ within a quarter and wrong *silently* — a 404 mid-wave. `orc extra ping` reads
414
+ the live list and caches it; nothing invents a name. Same for price: a cost
415
+ figure ORC did not price itself is never printed, it reads as an em dash.
416
+ - **Every armed run says so before wave 1.** Routing work off Claude silently is
417
+ the failure this whole subsystem is shaped around.
418
+ - **Two hard hold-backs**: a task with a cited `risk[]` (auth, money, migration,
419
+ security, concurrency, data-integrity) stays on Claude unless you say
420
+ otherwise, and a `/orc-boundary` REFUSE area holds even in `warn`.
421
+ - **A foreign return is foreign input.** It is the only foreign class that edits
422
+ your worktree, so what it says it did is a *claim*, checked against the tree.
423
+ - **Your key never reaches a command line.** It travels on stdin into an
424
+ encrypted vault, or it stays in an environment variable, or the tool holds its
425
+ own — and the passphrase is a **deadline**, not a second factor.
426
+ - **Six positions for the lanes that pin an agent instead of scoring a task**:
427
+ `quick-executor` · `fast-executor` · `doc-writer` · `doc-checker` ·
428
+ `wiki-scanner-deep` · `wiki-scanner-light`. A position with no row keeps its
429
+ slot and reads as its pinned Claude agent — "I left the checker on Claude on
430
+ purpose" and "there is no checker" must never look the same.
431
+
432
+ **When a foreign worker fails, it is a position and not a blank page.** ORC
433
+ journals the baseline *before the first byte leaves the machine*, so a worker cut
434
+ off mid-write is **reconciled and resumed** — never re-dispatched from scratch
435
+ onto a file that is already two-thirds written.
436
+
437
+ - **`extra_stall_s` (default 180)** stops a worker that has produced nothing for
438
+ that long. It is reset by observable progress — the worker's stream, its
439
+ stderr, or a declared file that changed on disk — so it never fires on one that
440
+ is merely slow. `stalled` is retryable, which is what makes the resume ORC's
441
+ own spelling of typing `continue`.
442
+ - **`extra_fallback_agent` (default `band`)** decides who picks the task up.
443
+ `ask` stops and puts the menu to you; any installed agent name pins one. It
444
+ changes *who*, never the score, the declared files or the acceptance criteria.
445
+ - **Every dispatch writes its own spend record**, so a cost report never depends
446
+ on a run remembering to narrate what it spent. `orc extra stats` merges the
447
+ spend log, the traces and saved returns, and always says how many rows came
448
+ from each.
449
+
450
+ **`/orc-quick` is inert here** and announces it — that lane asks which agent
451
+ before every dispatch, so no setting may pre-answer it. **`/orc-challenge` never
452
+ routes foreign**: swapping a lens for a different model does not make the lane
453
+ cheaper, it changes what is being measured.
454
+
455
+ **The whole subsystem, with every command and key:
456
+ [guides/extra-models.md](guides/extra-models.md).**
457
+
458
+ ---
459
+
352
460
  ## How the model is picked
353
461
 
354
462
  Each task is scored 0–100 by **arithmetic, not judgement**: the planner reports
@@ -389,12 +497,13 @@ clobbers. `orc ui` ▸ Settings edits the same keys through the same validators.
389
497
 
390
498
  ```
391
499
  templates/
392
- ├── skills/ 29 skills the lanes above, plus the ones with no command of
393
- their own: context-combiner, orc-advisor, orc-judge,
394
- │ orc-analyze-mini, and _shared/ (cross-lane contract prose)
395
- ├── commands/ 27 slash commands
500
+ ├── skills/ 31 skill folders, 38 SKILL.md files (a lane may ship subskills)
501
+ the lanes above, plus the ones with no command of their own:
502
+ context-combiner, orc-advisor, orc-judge, orc-analyze-mini,
503
+ │ and _shared/ (cross-lane contract prose)
504
+ ├── commands/ 29 slash commands
396
505
  ├── hooks/ effort guard (PreToolUse) · statusline warning · behavior trace
397
- └── agents/ 40 model-pinned subagents + MODEL-MAPPING.md
506
+ └── agents/ 51 model-pinned subagents + MODEL-MAPPING.md
398
507
  bin/cli.js installer, config editor, flow composer, run-state reader, and
399
508
  the deterministic half of every lane. Every read speaks --json
400
509
  bin/webui/ `orc ui` — the local control panel: css/ + js/ + i18n/<lang>/ +
@@ -465,6 +574,76 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
465
574
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
466
575
  only what is newer than the version you have.
467
576
 
577
+ ### v0.56.1 - a worker that is alive and doing nothing _(2026-08-28)_
578
+
579
+ **Still on the unscoped `orc` package?** Do this once before anything else -
580
+ your `orc upgrade` is the pre-v0.56.0 one and it cannot install itself:
581
+
582
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
583
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
584
+ - **Step 3 - re-apply it to your project:** `orc update`
585
+
586
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
587
+
588
+ **An opencode dispatch that goes quiet mid-task used to burn the whole
589
+ fifteen-minute wall clock and then report `timeout`.** That word is a statement
590
+ about ORC's patience and reads as a budget somebody should raise. It was a
591
+ POSITION somebody should resume from.
592
+
593
+ - **`extra_stall_s` (default 180, `0` disables)** stops a foreign worker that
594
+ has produced NOTHING for that long. Reset by observable progress - the
595
+ worker's stream, its stderr, or a declared file that changed on disk - so it
596
+ never fires on a worker that is merely slow. Engine `cli` only.
597
+ - **`stalled` is its own failure class and it is RETRYABLE**, so
598
+ `orc extra reconcile` reads the position and `extra_resume` continues from
599
+ what is on disk instead of starting over. That is ORC's spelling of typing
600
+ `continue`. There is deliberately no stdin nudge: `opencode run` is not an
601
+ interactive session, so a keystroke nobody reads would be a fake fix.
602
+ - **Every engine-`cli` return carries a `timeline`** - first byte, last
603
+ progress, longest quiet gap, both budgets - on success as well as failure.
604
+ - **`orc extra health <profile> [--model <id>]`** answers "does this model
605
+ stall", through the SAME watchdog a dispatch uses. A listed model is not a
606
+ working model, and a working model is not a model that finishes.
607
+ - **`extra_fallback_agent` (default `band`)** decides who picks the task up.
608
+ `ask` STOPS and puts the menu to you; any installed agent name pins one. Under
609
+ `ask` the lane does not choose. It changes WHO, never the score, the declared
610
+ files or the acceptance criteria. INERT in `/orc-quick`.
611
+
612
+ ### v0.56.0 - a rename moved the command, and nobody could reach the fix _(2026-08-27)_
613
+
614
+ **READ THIS FIRST IF YOUR `orc upgrade` IS FAILING.** On a version before
615
+ v0.56.0, this release cannot install itself - your `orc upgrade` is the OLD one.
616
+ Run these three lines once, by hand:
617
+
618
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
619
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
620
+ - **Step 3 - re-apply it to your project:** `orc update` (add `--global` to also
621
+ refresh `~/.claude`)
622
+
623
+ Then `orc version` should print 0.56.0 or newer. Your `.claude/` and your
624
+ `orc.config.yaml` are untouched. **Do not use `npm i -g -f`.**
625
+
626
+ **The package moved from the unscoped `orc` to `@azure-id/orc`, and every
627
+ upgrade path in the field died at once.** Both names declare the same `orc` bin,
628
+ and npm will not link it for the new package while the old one owns it - so the
629
+ tarball, the `github:` spec and the registry all failed with the same `EEXIST`
630
+ on the command file. It is a FILE conflict, not a source problem, which is why
631
+ changing sources never helped and `npm i -g -f` was the only thing that worked.
632
+
633
+ - **`orc upgrade` evicts the legacy package BEFORE trying any source**, because
634
+ the collision fails every source identically. Announced, never silent.
635
+ Detection is by OWNERSHIP - a package that does not declare the `orc` bin is
636
+ never touched.
637
+ - **The npm registry is tried first**, then the tarball, then the `github:` spec.
638
+ `freshCliPath()` now resolves the SCOPED directory, so step 2 stops re-applying
639
+ the templates step 1 just superseded.
640
+ - **`--force` is kept for the one case it fits** - an orphaned command file no
641
+ package owns - and never for an unrelated `EEXIST`.
642
+ - **`orc doctor` reports `legacy-global-package` by name.** Not `--fix`-able on
643
+ purpose: `--fix` is scoped to this project's `.claude/`.
644
+ - **A CAUTION at the top of this README** carries the one-time manual fix, since
645
+ anyone still on the old package does not have this code yet.
646
+
468
647
  ### v0.55.2 - a gate that is never probed is a gate that is always off _(2026-08-27)_
469
648
 
470
649
  **`/orc-quick` and `/orc-fast` documented the foreign-worker option and then