@azure-id/orc 0.56.0 → 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/package.json CHANGED
@@ -1,39 +1,39 @@
1
- {
2
- "name": "@azure-id/orc",
3
- "version": "0.56.0",
4
- "description": "ORC — an orchestrator skill constellation for Claude Code: intake, planning, scored parallel subagents, code-pattern matching, review, verify, ship, plus a project knowledge-base wiki.",
5
- "bin": {
6
- "orc": "bin/cli.js"
7
- },
8
- "files": [
9
- "README.md",
10
- "README-id.md",
11
- "CHANGELOG.md",
12
- "bin/",
13
- "mock-run/",
14
- "templates/"
15
- ],
16
- "scripts": {
17
- "postinstall": "node -e \"try{require('fs').accessSync(require('path').join(__dirname,'bin','cli.js'));console.log('\\nORC installed. Run: orc init (or orc init --global)\\n')}catch(e){console.error('\\n[orc] WARNING: bin/cli.js missing from this install — the repo/publish was incomplete. Reinstall from a complete source.\\n')}\"",
18
- "build:agents": "node bin/build-agents.js",
19
- "test": "node --test --test-concurrency=6 test/",
20
- "verify": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js",
21
- "prepack": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js && node --test --test-concurrency=6 test/"
22
- },
23
- "keywords": [
24
- "claude",
25
- "claude-code",
26
- "orchestrator",
27
- "skills",
28
- "agents",
29
- "ai"
30
- ],
31
- "license": "MIT",
32
- "engines": {
33
- "node": ">=18"
34
- },
35
- "repository": {
36
- "type": "git",
37
- "url": "github:azure-id/orc"
38
- }
39
- }
1
+ {
2
+ "name": "@azure-id/orc",
3
+ "version": "0.56.1",
4
+ "description": "ORC — an orchestrator skill constellation for Claude Code: intake, planning, scored parallel subagents, code-pattern matching, review, verify, ship, plus a project knowledge-base wiki.",
5
+ "bin": {
6
+ "orc": "bin/cli.js"
7
+ },
8
+ "files": [
9
+ "README.md",
10
+ "README-id.md",
11
+ "CHANGELOG.md",
12
+ "bin/",
13
+ "mock-run/",
14
+ "templates/"
15
+ ],
16
+ "scripts": {
17
+ "postinstall": "node -e \"try{require('fs').accessSync(require('path').join(__dirname,'bin','cli.js'));console.log('\\nORC installed. Run: orc init (or orc init --global)\\n')}catch(e){console.error('\\n[orc] WARNING: bin/cli.js missing from this install — the repo/publish was incomplete. Reinstall from a complete source.\\n')}\"",
18
+ "build:agents": "node bin/build-agents.js",
19
+ "test": "node --test --test-concurrency=6 test/",
20
+ "verify": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js",
21
+ "prepack": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js && node --test --test-concurrency=6 test/"
22
+ },
23
+ "keywords": [
24
+ "claude",
25
+ "claude-code",
26
+ "orchestrator",
27
+ "skills",
28
+ "agents",
29
+ "ai"
30
+ ],
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "github:azure-id/orc"
38
+ }
39
+ }
@@ -978,12 +978,144 @@ supplies it pre-composed in `trace_extras[]`.
978
978
 
979
979
  ---
980
980
 
981
- ## The config surface eleven keys, and the count is still the point
981
+ ## The stalla worker that is alive and doing nothing (v0.56.1)
982
+
983
+ ### `a lane that waits out a wall clock on a worker that stopped` has broken this contract
984
+
985
+ A wall clock cannot tell a worker that is thinking hard from a worker that has
986
+ stopped. Both look like fifteen minutes of nothing. So until v0.56.1 an opencode
987
+ session that went quiet mid-task — the thing you fix by hand by typing
988
+ `continue` into its window — burned the whole `extra_timeout_s` budget and then
989
+ reported `timeout`, which is a statement about **ORC's patience** and not about
990
+ what happened. It read as a budget somebody should raise. It was a **position
991
+ somebody should resume from**.
992
+
993
+ ### What the stall clock measures
994
+
995
+ `config.extra_stall_s` (default **180**, `0` disables) is the seconds a foreign
996
+ worker may produce **nothing at all** before the dispatch is stopped. It is not
997
+ a second wall clock: it is reset by **observable progress**, in the only three
998
+ places progress can show up.
999
+
1000
+ | signal | why it counts |
1001
+ |---|---|
1002
+ | new bytes on the worker's own stream | it is talking |
1003
+ | new bytes on its stderr | it is complaining, which is still working |
1004
+ | a **declared file** changed size or mtime on disk | it just wrote something, whatever its stream is doing |
1005
+
1006
+ Any one of the three resets the clock. All three quiet for the whole budget is
1007
+ the finding. That third row is what stops the clock firing on a worker that
1008
+ thinks for four minutes and then writes a file in one go.
1009
+
1010
+ Ordered with the other three, once, in `extraTimeouts`: **stall < idle < api <
1011
+ wall**. A budget at or past the wall clock could never fire, so it is CLAMPED
1012
+ rather than honoured, and `orc extra health` reports the clamp.
1013
+
1014
+ **Engine `cli` only.** Engine `api` already has a per-request inactivity timeout
1015
+ on its own socket, and engine `claude-shim` gets one from the child's own byte
1016
+ watchdog. Adding a fourth clock to either would be three timeouts disagreeing
1017
+ about which one fires first, which is the bug `extraTimeouts` exists to prevent.
1018
+
1019
+ ### `stalled` is its own failure class, and it is RETRYABLE
1020
+
1021
+ `EXTRA_FAILURES.stalled` — *"the worker went quiet and stopped changing
1022
+ anything"*, `retry: true`. That is the whole point: a stall is retryable, so the
1023
+ recovery procedure above applies to it unchanged. `orc extra reconcile` reads the
1024
+ position out of the journal baseline; `orc extra resume-slice` composes the
1025
+ continuation carrying what is already on disk; `extra_resume` continues from
1026
+ there instead of starting over.
1027
+
1028
+ **That IS ORC's spelling of typing `continue`.** There is deliberately no key
1029
+ that nudges the child on its stdin: `opencode run` is not an interactive session,
1030
+ so a keystroke nobody reads would be a fake fix — and a fake fix here is worse
1031
+ than none, because it would look like the problem was handled.
1032
+
1033
+ ### Every outcome carries a TIMELINE
1034
+
1035
+ `timeline` rides on every engine-`cli` return, not only on a stall:
1036
+ `first_byte_ms` · `last_progress_ms` · `longest_gap_ms` · `quiet_for_ms` ·
1037
+ `stall_budget_ms` · `wall_budget_ms`. Print it. **A budget you can only see when
1038
+ it fires is a budget nobody can set before it does** — and `first_byte_ms: null`
1039
+ is the honest reading of a worker that never said anything, never `0`.
1040
+
1041
+ ### `orc extra health <profile> [--model <id>]` — does this model stall?
1042
+
1043
+ Exit **0** answered · **1** stalled or failed · **2** unknown profile.
1044
+
1045
+ It runs the live probe through **the same watchdog a dispatch uses** — not a
1046
+ second idea of the path, which is the v0.53.3 rule that a green badge must be
1047
+ earned by the path a wave actually runs. What it adds over
1048
+ `orc extra ping --live` is the timeline and the verdict: `answered` · `stalled` ·
1049
+ `timeout` · `failed` · `spawn-failed`, plus the bytes the worker produced, capped
1050
+ and rendered as text.
1051
+
1052
+ A **listed** model is not a **working** model and a working model is not a model
1053
+ that **finishes**: those are three different facts and this is the command that
1054
+ tells the third one apart. Run it before routing a band at a model you have not
1055
+ used. A CLI ping is not a cheap ping — say so.
1056
+
1057
+ ---
1058
+
1059
+ ## Who picks the task up — `extra_fallback_agent` (v0.56.1)
1060
+
1061
+ `fallback_to` has always carried the band's (or the slot's) own Claude agent.
1062
+ That is the right default and the only one ORC can compute on its own: **a
1063
+ fallback that changes tier is a re-plan nobody asked for.**
1064
+
1065
+ What it could not do is let a human choose. A stall costs real minutes before
1066
+ anybody hears about it, and by the time the wave stops the user often knows
1067
+ something ORC does not — that this slice wants more thinking than its band
1068
+ bought, or less.
1069
+
1070
+ | `extra_fallback_agent` | what the lane does |
1071
+ |---|---|
1072
+ | `band` (default) | dispatch `fallback.agent`, which is `fallback_to.agent`. Pre-v0.56.1 behaviour, unchanged. |
1073
+ | `ask` | **STOP and put `fallback.options[]` to the user.** Dispatch what they pick. |
1074
+ | any `orc-…` agent name | dispatch that one, and say it overrode the task's own agent. |
1075
+
1076
+ The return carries `fallback` beside `fallback_to`: `mode`, `agent`,
1077
+ `band_agent`, `options[]` (each with `agent`, `why`, `is_band`) and a `note` that
1078
+ is already worded — print it rather than composing a second wording.
1079
+
1080
+ Three rules hold it together.
1081
+
1082
+ 1. **Under `ask` the lane does not choose.** `fallback.agent` is `null` and the
1083
+ trace line says `→ pending (extra_fallback_agent=ask)`. A lane that picked the
1084
+ first option would be answering the one question the setting exists to ask,
1085
+ and `/orc-retro` would aggregate a decision nobody made.
1086
+ 2. **The menu is COMPUTED and the band's own agent LEADS it.** It is what
1087
+ happens if the user just presses enter. The three alternates —
1088
+ `orc-executor-opus-5-med`, `orc-executor-opus-5-low`,
1089
+ `orc-executor-sonnet-4-6-high` — are offered, and so is any installed agent
1090
+ name, because the roster is generated and a closed list here would go stale
1091
+ the next time a band moves.
1092
+ 3. **It changes WHO, never WHAT.** The score does not move, `declared_files` is
1093
+ not widened, `acceptance[]` is not touched, and a resume slice stays a resume
1094
+ slice. This is the `extra resume-slice` rule applied to the fallback.
1095
+
1096
+ **`/orc-quick` is INERT here too,** and announces it at the agent gate — beside
1097
+ `extra_enabled`, `extra_on_failure`, `extra_resume`, `opus5_only`, `fable5_*` and
1098
+ `rubric_bands_override`. That lane asks which agent before every dispatch, so a
1099
+ config that pre-answered it would be the exact failure the gate exists to
1100
+ prevent.
1101
+
1102
+ ---
1103
+
1104
+ ## The config surface — thirteen keys, and the count is still the point
982
1105
 
983
1106
  The combinatorial part — providers × models × bands **× positions** — is a
984
1107
  **ledger with a CLI and a panel** (`orc extra`), not a YAML block nobody can hold
985
1108
  in their head.
986
1109
 
1110
+ **v0.56.1 added TWO**, and both come from the same observed failure: a foreign
1111
+ worker that goes quiet mid-task. Three more were refused and are written down so
1112
+ nobody proposes them again — **a stdin nudge** (`opencode run` is not an
1113
+ interactive session, so a keystroke nobody reads is a fake fix, and a fake fix
1114
+ looks like the problem was handled), **a per-profile stall budget** (the number
1115
+ describes ORC's patience, not a provider), and **a key to disable the timeline**
1116
+ (the spend-log reasoning verbatim: a record you can switch off is off on the run
1117
+ you needed it for).
1118
+
987
1119
  **v0.55.0 added ZERO keys.** A slot row's presence is its arming, so the four
988
1120
  that were proposed were all refused: **`extra_slots_enabled`** (a second master
989
1121
  gate — `extra_enabled` is one), **per-lane on/off keys** (`extra_doc`,
@@ -1008,6 +1140,8 @@ of being a string nobody checked).
1008
1140
  | `config.extra_verify_max_days` | `7` | Past this a verification reads STALE and is re-pinged before wave 1. **A STALE profile still routes** — a stale check is not a failed one. |
1009
1141
  | `config.extra_resume` | `on` | Whether a partial or crashed foreign dispatch is RESUMED rather than re-done. **Default `on`, because `off` is what is broken.** INERT in `/orc-quick`. |
1010
1142
  | `config.extra_resume_max` | `2` | Resume attempts per task before P6 takes over. The cap STOPS with an honest report naming the Claude agent — never a silent third loop, the same shape as every other bounded repair loop in ORC. |
1143
+ | `config.extra_stall_s` | `180` | Seconds a foreign worker may produce NOTHING before the dispatch is stopped as `stalled`. Reset by observable progress — the worker's stream, its stderr, or a declared file that changed on disk — so it never fires on a worker that is merely slow. `0` disables and the wall clock is the only stop again. **Clamped below `extra_timeout_s`**, because a budget that can never fire is worse than none. Engine `cli` only. |
1144
+ | `config.extra_fallback_agent` | `band` | WHICH Claude agent picks up a task the foreign worker could not finish. `band` is the pre-v0.56.1 behaviour. `ask` STOPS and puts the menu to the user. Any installed agent name pins one. It changes WHO, never the score, the declared files or the acceptance criteria. INERT in `/orc-quick`. |
1011
1145
 
1012
1146
  **Keys deliberately NOT added, and why each one would be a trap:**
1013
1147