@azure-id/orc 1.4.2 → 1.6.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/README.md +63 -50
  3. package/bin/cli.js +5732 -133
  4. package/bin/mockrun-catalog.js +4 -0
  5. package/bin/verify-contracts.js +4509 -4426
  6. package/bin/verify-package.js +24 -2
  7. package/bin/webui/api.js +108 -8
  8. package/bin/webui/app.html +9 -0
  9. package/bin/webui/css/06-responsive.css +14 -0
  10. package/bin/webui/css/panels/test.css +132 -0
  11. package/bin/webui/fixtures/index.js +23 -1
  12. package/bin/webui/fixtures/test.js +547 -0
  13. package/bin/webui/i18n/en/common.json +1 -0
  14. package/bin/webui/i18n/en/nav.json +1 -0
  15. package/bin/webui/i18n/en/overview.json +5 -0
  16. package/bin/webui/i18n/en/test.json +141 -0
  17. package/bin/webui/i18n/id/common.json +1 -0
  18. package/bin/webui/i18n/id/nav.json +1 -0
  19. package/bin/webui/i18n/id/overview.json +5 -0
  20. package/bin/webui/i18n/id/test.json +141 -0
  21. package/bin/webui/js/01-i18n.js +1 -0
  22. package/bin/webui/js/panels/challenge.js +8 -3
  23. package/bin/webui/js/panels/overview.js +18 -0
  24. package/bin/webui/js/panels/test.js +733 -0
  25. package/bin/webui/serve.js +572 -557
  26. package/mock-run/orc-test.md +327 -0
  27. package/package.json +1 -1
  28. package/templates/agents/MODEL-MAPPING.md +2 -0
  29. package/templates/agents/orc-test-designer-opus-5-high.md +158 -0
  30. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -0
  31. package/templates/commands/orc-test.md +66 -0
  32. package/templates/hooks/README.md +110 -1
  33. package/templates/hooks/orc-read-gate.js +279 -0
  34. package/templates/skills/_shared/extra-dispatch.md +1346 -1337
  35. package/templates/skills/_shared/live-target.md +188 -0
  36. package/templates/skills/_shared/phases/trace.md +2 -2
  37. package/templates/skills/_shared/wait.md +241 -240
  38. package/templates/skills/orc-test/SKILL.md +233 -0
@@ -1,240 +1,241 @@
1
- # Shared contract — the WAIT (`/orc-wait`, and the computed gate)
2
-
3
- Canonical file: `_shared/wait.md`. THE canonical mechanic for a lane that must
4
- **stop where it stands, wait for wall-clock time to pass, and carry on from the
5
- same place**. Load it wherever a lane can be interrupted by a wait — which,
6
- since v1.1.0, is every lane in the table below.
7
-
8
- ## Why a wait is not a suspend and not a fallback
9
-
10
- ORC already has two shapes for leaving a run. This is a third, and conflating
11
- them loses work.
12
-
13
- | | `FALLBACK-FROM` | `RETURN-TO` | **WAIT** |
14
- |---|---|---|---|
15
- | Why it leaves | it cannot proceed | another lane must settle something | **wall-clock time must pass** |
16
- | Who finishes | the receiver | the sender, after coming back | **the same lane, same run** |
17
- | Another lane runs | yes | yes | **no — nothing runs** |
18
- | Traces | one | two | **one** |
19
-
20
- A wait dispatches nothing and decides nothing. It is the only ORC mechanic
21
- whose entire purpose is that **no model is running**.
22
-
23
- ## The one rule
24
-
25
- > **`a lane that waits without a hand-back` has broken this contract.**
26
-
27
- A wait is a stop. Every stop in ORC writes its hand-back before it ends, because
28
- the thing that resumes the run may not be this session — the user can close the
29
- terminal, the machine can sleep, and the wake-up message is a Claude Code
30
- behaviour ORC cannot promise. `RESUME.md` on disk is what makes a lost wake-up
31
- cost nothing.
32
-
33
- This is `_shared/phases/stop-resume.md` applied to a stop nobody asked a
34
- question about. It does not replace that phase; it scales it.
35
-
36
- ## The three modes
37
-
38
- A wait is requested with a mode. The modes differ in ONE thing: how much the
39
- lane finishes before it stops.
40
-
41
- | Mode | Stops at | Hand-back | Dispatches | Can lose |
42
- |---|---|---|---|---|
43
- | `safe` | the next **safe point** | full stop sequence | yes (checkpoint) | nothing |
44
- | `soft` | the next **model turn** | full stop sequence, **forced** | yes (checkpoint) | an in-flight return |
45
- | `hard` | the next **model turn** | `RESUME.md` only, best effort | **no** | an in-flight return, the checkpoint, the phase's trace packet |
46
-
47
- **`soft` is forced.** On a lane the table below marks as checkpointing, `soft`
48
- does not merely attempt the hand-back: if the checkpoint write fails, **`soft`
49
- does not stop**. It reports the failure and stays in the run. That is
50
- `stop-resume.md` step 2 unchanged — *stopping without a good checkpoint is the
51
- one thing that loses work* — and it is the whole reason the mode exists.
52
-
53
- **`hard` is the dispatch-free stop.** It writes only what ORC can write with its
54
- own hand (`RESUME.md`, per stop-resume step 3b — never a dispatched agent). It
55
- is fast BECAUSE it dispatches nothing, not in spite of it. It is the one mode
56
- that can lose work, and it says so every time it runs.
57
-
58
- ### "the next model turn" is the honest promise
59
-
60
- A typed message reaches ORC at a turn boundary. `hard` therefore **cannot**
61
- interrupt a dispatch that is already in flight. What it promises is:
62
-
63
- > stop at the first moment ORC can act, and do not wait for the current wave,
64
- > phase or gate to finish.
65
-
66
- Never write "immediately". A user who reads "immediately" and sees a wave finish
67
- believes the command failed.
68
-
69
- ## Safe points
70
-
71
- A safe point is a place where the run can stop with no loss. `safe` waits for
72
- one. `soft` and `hard` do not — that is what they are for, and what they risk.
73
-
74
- **Never begin a wait at any of these, in any mode:**
75
-
76
- - between a dispatch and its validated return
77
- - inside the stop sequence itself
78
- - during a file write, a `splice`, or a wiki registration write
79
- - before the smoke gate has reported
80
-
81
- These are not a style preference. Each one leaves an artifact that no resume can
82
- reconstruct.
83
-
84
- ## Which lanes support a wait
85
-
86
- The machine-readable copy of this table is `WAIT_LANE_SHAPES` in `bin/cli.js`,
87
- rendered by `orc wait lanes`. A golden test compares the two IN BOTH DIRECTIONS
88
- — the `EXTRA_LANE_SHAPES` / `DIY_STEPS` precedent. A lane added to one and not
89
- the other fails the suite.
90
-
91
- | Lane | Checkpoint | Safe point |
92
- |---|---|---|
93
- | `/orc` | full | wave or phase edge |
94
- | `/orc-ultra` | full | wave or judge gate |
95
- | `/orc-mini` | full | after the executor returns |
96
- | `/orc-fast` | full | after the executor returns |
97
- | `/orc-diy` | full | compiled phase edge |
98
- | `/orc-doc` | full | wave edge |
99
- | `/orc-wiki` | full | scan-task boundary |
100
- | `/orc-analyze` | full | after the analyst returns |
101
- | `/orc-poly` | docset | after a per-repo plan is written |
102
- | `/orc-quick` | entry | after an entry closes |
103
- | `/orc-challenge` | cycle | after a cycle records |
104
- | `/orc-brainstorm` | snapshot | phase edge |
105
- | `/orc-grill` | snapshot | round edge |
106
- | `/orc-learn` | none | single dispatch |
107
- | `/orc-plan` | none | single dispatch |
108
- | `/orc-verify` | none | single dispatch |
109
- | `/orc-pattern` | none | single dispatch |
110
- | `/orc-claude` | none | single dispatch |
111
- | `/orc-explain` | none | read-only, seconds long |
112
- | `/orc-route` | none | read-only, seconds long |
113
- | `/orc-boundary` | none | read-only, seconds long |
114
- | `/orc-budget` | none | read-only, seconds long |
115
- | `/orc-aftermath` | none | read-only, seconds long |
116
- | `/orc-export` | none | read-only, seconds long |
117
- | `/orc-retro` | none | read-only, seconds long |
118
- | `/orc-pact` | none | read-only, seconds long |
119
-
120
- **`checkpoint: none` is an ANSWER, not a gap.** A single-dispatch lane has
121
- nothing to checkpoint, so a wait there is a plain wait and the message says so.
122
- On such a lane `safe`, `soft` and `hard` are the SAME thing, and
123
- `orc wait lanes` states that rather than pretending to a distinction. A row that
124
- reads `none` must never render like a row that is missing.
125
-
126
- ## The hop loop
127
-
128
- The lane does not sleep. A **detached** command sleeps. It costs zero tokens and
129
- no model runs during it.
130
-
131
- ```
132
- 1. Write the hand-back for the mode (above).
133
- 2. remaining = the requested time, or resets_at - now
134
- 3. hop = min(wait_hop_minutes, remaining)
135
- 4. Run a DETACHED command that waits hop seconds.
136
- 5. On wake: `orc usage check --json`
137
- 6. Exit 0, or the requested time has elapsed → continue. Else go to 3.
138
- 7. wait_max_hops reached → stop, keep the hand-back, say why.
139
- ```
140
-
141
- **A hop is short on purpose.** Each wake-up is session activity, and session
142
- activity is the only thing that makes the statusline run again — so each hop
143
- buys a fresh reading. A single long sleep wakes into a reading as stale as the
144
- sleep was long.
145
-
146
- ## After the wait — ORC does not drag a large context forward
147
-
148
- `stop-resume.md` step 6 already requires offering both continue paths. This
149
- decides which one ORC takes without asking:
150
-
151
- - **context small** → continue here, and say so in one line.
152
- - **context large** → STOP and offer both paths, recommending the fresh session.
153
-
154
- A wait longer than one hour has already expired the prompt cache, so continuing
155
- in-session re-reads the whole context at full input price — exactly when quota
156
- is lowest. Auto-continuing into a bloated context is the cost the wait existed
157
- to avoid.
158
-
159
- **ORC cannot clear its own context.** `/clear` is the user's action. The wait
160
- offers the swap; it never performs it.
161
-
162
- ## The computed gate (`usage_gate`)
163
-
164
- The same engine, triggered by the CLI instead of by a typed command. It is
165
- **`off` by default** — nothing below happens until the user turns it on.
166
-
167
- Check **before a wave, never during one**: `orc usage check --json`.
168
-
169
- | exit | state | `warn` | `stop` | `wait` |
170
- |---|---|---|---|---|
171
- | 0 | ok | continue | continue | continue |
172
- | 1 | low | print and continue | hand back and stop | hand back, hop, come back |
173
- | 2 | unknown | print and continue | print and continue | print and continue |
174
-
175
- **Exit 2 never stops a run**, in any mode. An absent reading is absent, not low:
176
- older Claude Code sends no usage headers, and a long dispatch leaves the reading
177
- stale by exactly its own length. A gate that blocks on a missing number is a
178
- gate people switch off.
179
-
180
- **The worst window decides.** `orc usage check` already resolves that; never
181
- re-derive it from one window.
182
-
183
- A computed stop offers the cheaper answers before the expensive one — a lower
184
- band for this wave, or `orc extra` if a profile is ready — because a wait is the
185
- only one of them that costs wall-clock time.
186
-
187
- **A typed `/orc-wait` is never suppressed by any of this**, and a computed wait
188
- is suppressed entirely while a block is active.
189
-
190
- ## The block — the user's veto
191
-
192
- `/orc-wait block <reason>` suppresses every COMPUTED wait for the rest of the
193
- run. It is for the case where stopping costs more than continuing: the window
194
- resets in five minutes and the task needs ten.
195
-
196
- 1. **The reason is REQUIRED.** A block with no reason is refused by name. The
197
- recorded reason is what makes the risk demonstrably the user's — the same
198
- `--reason` rule the run-close and doc-ship writers already use.
199
- 2. **Run-scoped. It NEVER writes the user's config.** The same rule the ultra
200
- lane's forced run-scoped mode already follows. A veto set today must not
201
- apply to a run started next month.
202
- 3. **It is ANNOUNCED at every gate it suppresses, with its age.** A shadowed
203
- setting must never be silent. There is no auto-expiry — ORC does not decide
204
- that a user's reason stopped being true — so the age is what keeps an old
205
- block from applying invisibly.
206
- 4. **It blocks what ORC COMPUTES, never what the user TYPES.** A typed
207
- `/orc-wait 30 hard` still waits while a block is active. `/orc-boundary`'s
208
- rule, unchanged: a gate constrains ORC's own dispatch, never an explicit
209
- instruction.
210
- 5. It survives a resume, and is re-announced on the first gate after it.
211
-
212
- `orc wait cancel` is a DIFFERENT command: it ends a wait that is already
213
- running. Block is before, cancel is during. Never conflate them in prose or in a
214
- menu.
215
-
216
- ## What a wait never does
217
-
218
- - It never dispatches an agent to do the waiting. An agent runs on the same
219
- account and consumes the same window the wait exists to protect.
220
- - It never runs another lane.
221
- - It never writes the user's config.
222
- - It never widens or narrows the work: the same tasks, the same slice, the same
223
- agent resolve after the wait as before it.
224
- - It never decides on its own that a user's block has expired.
225
-
226
- ## Trace
227
-
228
- The wait writes CLI-composed lines into the trace that is ALREADY open, and
229
- nothing when no run is active. `/orc-wait` opens no run, so it is **not a lane**
230
- in the trace enum and has no `run-<lane>-<slug>` pointer — the `/orc-explain`
231
- precedent, a stated blind spot rather than an oversight.
232
-
233
- ```
234
- WAIT mode=hard requested=30m start=18:44 end=19:14 hops=1/4 trigger=user
235
- WAIT block reason="window resets in 5m, task needs 10" by=user
236
- WAIT unblock
237
- ```
238
-
239
- A wait that leaves no line cannot be counted, and a block that leaves no line
240
- hides the fact that a run continued through a gate on the user's authority.
1
+ # Shared contract — the WAIT (`/orc-wait`, and the computed gate)
2
+
3
+ Canonical file: `_shared/wait.md`. THE canonical mechanic for a lane that must
4
+ **stop where it stands, wait for wall-clock time to pass, and carry on from the
5
+ same place**. Load it wherever a lane can be interrupted by a wait — which,
6
+ since v1.1.0, is every lane in the table below.
7
+
8
+ ## Why a wait is not a suspend and not a fallback
9
+
10
+ ORC already has two shapes for leaving a run. This is a third, and conflating
11
+ them loses work.
12
+
13
+ | | `FALLBACK-FROM` | `RETURN-TO` | **WAIT** |
14
+ |---|---|---|---|
15
+ | Why it leaves | it cannot proceed | another lane must settle something | **wall-clock time must pass** |
16
+ | Who finishes | the receiver | the sender, after coming back | **the same lane, same run** |
17
+ | Another lane runs | yes | yes | **no — nothing runs** |
18
+ | Traces | one | two | **one** |
19
+
20
+ A wait dispatches nothing and decides nothing. It is the only ORC mechanic
21
+ whose entire purpose is that **no model is running**.
22
+
23
+ ## The one rule
24
+
25
+ > **`a lane that waits without a hand-back` has broken this contract.**
26
+
27
+ A wait is a stop. Every stop in ORC writes its hand-back before it ends, because
28
+ the thing that resumes the run may not be this session — the user can close the
29
+ terminal, the machine can sleep, and the wake-up message is a Claude Code
30
+ behaviour ORC cannot promise. `RESUME.md` on disk is what makes a lost wake-up
31
+ cost nothing.
32
+
33
+ This is `_shared/phases/stop-resume.md` applied to a stop nobody asked a
34
+ question about. It does not replace that phase; it scales it.
35
+
36
+ ## The three modes
37
+
38
+ A wait is requested with a mode. The modes differ in ONE thing: how much the
39
+ lane finishes before it stops.
40
+
41
+ | Mode | Stops at | Hand-back | Dispatches | Can lose |
42
+ |---|---|---|---|---|
43
+ | `safe` | the next **safe point** | full stop sequence | yes (checkpoint) | nothing |
44
+ | `soft` | the next **model turn** | full stop sequence, **forced** | yes (checkpoint) | an in-flight return |
45
+ | `hard` | the next **model turn** | `RESUME.md` only, best effort | **no** | an in-flight return, the checkpoint, the phase's trace packet |
46
+
47
+ **`soft` is forced.** On a lane the table below marks as checkpointing, `soft`
48
+ does not merely attempt the hand-back: if the checkpoint write fails, **`soft`
49
+ does not stop**. It reports the failure and stays in the run. That is
50
+ `stop-resume.md` step 2 unchanged — *stopping without a good checkpoint is the
51
+ one thing that loses work* — and it is the whole reason the mode exists.
52
+
53
+ **`hard` is the dispatch-free stop.** It writes only what ORC can write with its
54
+ own hand (`RESUME.md`, per stop-resume step 3b — never a dispatched agent). It
55
+ is fast BECAUSE it dispatches nothing, not in spite of it. It is the one mode
56
+ that can lose work, and it says so every time it runs.
57
+
58
+ ### "the next model turn" is the honest promise
59
+
60
+ A typed message reaches ORC at a turn boundary. `hard` therefore **cannot**
61
+ interrupt a dispatch that is already in flight. What it promises is:
62
+
63
+ > stop at the first moment ORC can act, and do not wait for the current wave,
64
+ > phase or gate to finish.
65
+
66
+ Never write "immediately". A user who reads "immediately" and sees a wave finish
67
+ believes the command failed.
68
+
69
+ ## Safe points
70
+
71
+ A safe point is a place where the run can stop with no loss. `safe` waits for
72
+ one. `soft` and `hard` do not — that is what they are for, and what they risk.
73
+
74
+ **Never begin a wait at any of these, in any mode:**
75
+
76
+ - between a dispatch and its validated return
77
+ - inside the stop sequence itself
78
+ - during a file write, a `splice`, or a wiki registration write
79
+ - before the smoke gate has reported
80
+
81
+ These are not a style preference. Each one leaves an artifact that no resume can
82
+ reconstruct.
83
+
84
+ ## Which lanes support a wait
85
+
86
+ The machine-readable copy of this table is `WAIT_LANE_SHAPES` in `bin/cli.js`,
87
+ rendered by `orc wait lanes`. A golden test compares the two IN BOTH DIRECTIONS
88
+ — the `EXTRA_LANE_SHAPES` / `DIY_STEPS` precedent. A lane added to one and not
89
+ the other fails the suite.
90
+
91
+ | Lane | Checkpoint | Safe point |
92
+ |---|---|---|
93
+ | `/orc` | full | wave or phase edge |
94
+ | `/orc-ultra` | full | wave or judge gate |
95
+ | `/orc-mini` | full | after the executor returns |
96
+ | `/orc-fast` | full | after the executor returns |
97
+ | `/orc-diy` | full | compiled phase edge |
98
+ | `/orc-doc` | full | wave edge |
99
+ | `/orc-wiki` | full | scan-task boundary |
100
+ | `/orc-analyze` | full | after the analyst returns |
101
+ | `/orc-poly` | docset | after a per-repo plan is written |
102
+ | `/orc-quick` | entry | after an entry closes |
103
+ | `/orc-challenge` | cycle | after a cycle records |
104
+ | `/orc-test` | cycle | case boundary |
105
+ | `/orc-brainstorm` | snapshot | phase edge |
106
+ | `/orc-grill` | snapshot | round edge |
107
+ | `/orc-learn` | none | single dispatch |
108
+ | `/orc-plan` | none | single dispatch |
109
+ | `/orc-verify` | none | single dispatch |
110
+ | `/orc-pattern` | none | single dispatch |
111
+ | `/orc-claude` | none | single dispatch |
112
+ | `/orc-explain` | none | read-only, seconds long |
113
+ | `/orc-route` | none | read-only, seconds long |
114
+ | `/orc-boundary` | none | read-only, seconds long |
115
+ | `/orc-budget` | none | read-only, seconds long |
116
+ | `/orc-aftermath` | none | read-only, seconds long |
117
+ | `/orc-export` | none | read-only, seconds long |
118
+ | `/orc-retro` | none | read-only, seconds long |
119
+ | `/orc-pact` | none | read-only, seconds long |
120
+
121
+ **`checkpoint: none` is an ANSWER, not a gap.** A single-dispatch lane has
122
+ nothing to checkpoint, so a wait there is a plain wait and the message says so.
123
+ On such a lane `safe`, `soft` and `hard` are the SAME thing, and
124
+ `orc wait lanes` states that rather than pretending to a distinction. A row that
125
+ reads `none` must never render like a row that is missing.
126
+
127
+ ## The hop loop
128
+
129
+ The lane does not sleep. A **detached** command sleeps. It costs zero tokens and
130
+ no model runs during it.
131
+
132
+ ```
133
+ 1. Write the hand-back for the mode (above).
134
+ 2. remaining = the requested time, or resets_at - now
135
+ 3. hop = min(wait_hop_minutes, remaining)
136
+ 4. Run a DETACHED command that waits hop seconds.
137
+ 5. On wake: `orc usage check --json`
138
+ 6. Exit 0, or the requested time has elapsed → continue. Else go to 3.
139
+ 7. wait_max_hops reached → stop, keep the hand-back, say why.
140
+ ```
141
+
142
+ **A hop is short on purpose.** Each wake-up is session activity, and session
143
+ activity is the only thing that makes the statusline run again — so each hop
144
+ buys a fresh reading. A single long sleep wakes into a reading as stale as the
145
+ sleep was long.
146
+
147
+ ## After the wait — ORC does not drag a large context forward
148
+
149
+ `stop-resume.md` step 6 already requires offering both continue paths. This
150
+ decides which one ORC takes without asking:
151
+
152
+ - **context small** → continue here, and say so in one line.
153
+ - **context large** → STOP and offer both paths, recommending the fresh session.
154
+
155
+ A wait longer than one hour has already expired the prompt cache, so continuing
156
+ in-session re-reads the whole context at full input price — exactly when quota
157
+ is lowest. Auto-continuing into a bloated context is the cost the wait existed
158
+ to avoid.
159
+
160
+ **ORC cannot clear its own context.** `/clear` is the user's action. The wait
161
+ offers the swap; it never performs it.
162
+
163
+ ## The computed gate (`usage_gate`)
164
+
165
+ The same engine, triggered by the CLI instead of by a typed command. It is
166
+ **`off` by default** — nothing below happens until the user turns it on.
167
+
168
+ Check **before a wave, never during one**: `orc usage check --json`.
169
+
170
+ | exit | state | `warn` | `stop` | `wait` |
171
+ |---|---|---|---|---|
172
+ | 0 | ok | continue | continue | continue |
173
+ | 1 | low | print and continue | hand back and stop | hand back, hop, come back |
174
+ | 2 | unknown | print and continue | print and continue | print and continue |
175
+
176
+ **Exit 2 never stops a run**, in any mode. An absent reading is absent, not low:
177
+ older Claude Code sends no usage headers, and a long dispatch leaves the reading
178
+ stale by exactly its own length. A gate that blocks on a missing number is a
179
+ gate people switch off.
180
+
181
+ **The worst window decides.** `orc usage check` already resolves that; never
182
+ re-derive it from one window.
183
+
184
+ A computed stop offers the cheaper answers before the expensive one — a lower
185
+ band for this wave, or `orc extra` if a profile is ready — because a wait is the
186
+ only one of them that costs wall-clock time.
187
+
188
+ **A typed `/orc-wait` is never suppressed by any of this**, and a computed wait
189
+ is suppressed entirely while a block is active.
190
+
191
+ ## The block — the user's veto
192
+
193
+ `/orc-wait block <reason>` suppresses every COMPUTED wait for the rest of the
194
+ run. It is for the case where stopping costs more than continuing: the window
195
+ resets in five minutes and the task needs ten.
196
+
197
+ 1. **The reason is REQUIRED.** A block with no reason is refused by name. The
198
+ recorded reason is what makes the risk demonstrably the user's — the same
199
+ `--reason` rule the run-close and doc-ship writers already use.
200
+ 2. **Run-scoped. It NEVER writes the user's config.** The same rule the ultra
201
+ lane's forced run-scoped mode already follows. A veto set today must not
202
+ apply to a run started next month.
203
+ 3. **It is ANNOUNCED at every gate it suppresses, with its age.** A shadowed
204
+ setting must never be silent. There is no auto-expiry — ORC does not decide
205
+ that a user's reason stopped being true — so the age is what keeps an old
206
+ block from applying invisibly.
207
+ 4. **It blocks what ORC COMPUTES, never what the user TYPES.** A typed
208
+ `/orc-wait 30 hard` still waits while a block is active. `/orc-boundary`'s
209
+ rule, unchanged: a gate constrains ORC's own dispatch, never an explicit
210
+ instruction.
211
+ 5. It survives a resume, and is re-announced on the first gate after it.
212
+
213
+ `orc wait cancel` is a DIFFERENT command: it ends a wait that is already
214
+ running. Block is before, cancel is during. Never conflate them in prose or in a
215
+ menu.
216
+
217
+ ## What a wait never does
218
+
219
+ - It never dispatches an agent to do the waiting. An agent runs on the same
220
+ account and consumes the same window the wait exists to protect.
221
+ - It never runs another lane.
222
+ - It never writes the user's config.
223
+ - It never widens or narrows the work: the same tasks, the same slice, the same
224
+ agent resolve after the wait as before it.
225
+ - It never decides on its own that a user's block has expired.
226
+
227
+ ## Trace
228
+
229
+ The wait writes CLI-composed lines into the trace that is ALREADY open, and
230
+ nothing when no run is active. `/orc-wait` opens no run, so it is **not a lane**
231
+ in the trace enum and has no `run-<lane>-<slug>` pointer — the `/orc-explain`
232
+ precedent, a stated blind spot rather than an oversight.
233
+
234
+ ```
235
+ WAIT mode=hard requested=30m start=18:44 end=19:14 hops=1/4 trigger=user
236
+ WAIT block reason="window resets in 5m, task needs 10" by=user
237
+ WAIT unblock
238
+ ```
239
+
240
+ A wait that leaves no line cannot be counted, and a block that leaves no line
241
+ hides the fact that a run continued through a gate on the user's authority.