@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/CHANGELOG.md +2218 -2139
- package/README-id.md +153 -5
- package/README.md +115 -6
- package/bin/cli.js +29855 -29236
- package/package.json +39 -39
- package/templates/skills/_shared/extra-dispatch.md +135 -1
- package/templates/skills/orc-quick/SKILL.md +313 -313
- package/templates/skills/orc-quick/references/dispatch-gate.md +10 -1
package/package.json
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@azure-id/orc",
|
|
3
|
-
"version": "0.56.
|
|
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
|
|
981
|
+
## The stall — a 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
|
|