@orkestrel/scaffold 0.0.90 → 0.0.92

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 (32) hide show
  1. package/dist/agents/templates/brief.md +2 -0
  2. package/dist/bin/main.js +3 -3
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/AGENTS.md +3 -3
  5. package/dist/host/agents/orchestration.md +1 -1
  6. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +3 -3
  7. package/dist/host/agents/skills/orkestrel-publish/references/window.md +3 -4
  8. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +1 -1
  9. package/dist/host/agents/templates/brief.md +2 -0
  10. package/dist/host/agents/transports/cursor.md +1 -1
  11. package/dist/host/claude/agents/analyst.md +1 -1
  12. package/dist/host/claude/agents/grok.md +1 -1
  13. package/dist/host/claude/agents/orkestrel.md +16 -16
  14. package/dist/host/claude/agents/planner.md +1 -1
  15. package/dist/host/claude/agents/researcher.md +1 -1
  16. package/dist/host/claude/agents/scout.md +1 -1
  17. package/dist/host/claude/rules/names.md +1 -1
  18. package/dist/host/claude/rules/patterns.md +1 -1
  19. package/dist/host/claude/rules/quality.md +11 -0
  20. package/dist/host/claude/rules/styles.md +3 -1
  21. package/dist/host/claude/rules/tests.md +7 -8
  22. package/dist/host/claude/rules/writing.md +2 -1
  23. package/dist/host/codex/agents/researcher.toml +2 -2
  24. package/dist/host/codex/agents/scout.toml +1 -1
  25. package/dist/host/guides/browser.md +822 -609
  26. package/dist/host/guides/pool.md +154 -58
  27. package/dist/host/manifest.json +24 -24
  28. package/dist/src/core/index.cjs +4 -3
  29. package/dist/src/core/index.cjs.map +1 -1
  30. package/dist/src/core/index.js +4 -3
  31. package/dist/src/core/index.js.map +1 -1
  32. package/package.json +3 -3
@@ -1,12 +1,13 @@
1
1
  # Pool
2
2
 
3
- > A typed resource pool with optional bounded capacity, unique ownership, FIFO settlement,
4
- > validated reuse, caller-owned cancellation, explicit cleanup failures, and a stable
5
- > event-driven teardown barrier.
3
+ > A typed resource pool with optional bounded capacity, a warm floor, bounded loss recovery,
4
+ > unique ownership, FIFO settlement, validated reuse, caller-owned cancellation, and explicit cleanup.
6
5
 
7
- The pool has no warm floor, eviction timer, acquire timeout, or polling loop. Every wait parks
8
- on a promise or a signal listener and wakes when a settlement reaches it, and the lifecycle
9
- hooks are the caller's, so the engine itself performs no I/O.
6
+ The pool supports lazy creation or a warm floor, with no eviction timer, acquire timeout,
7
+ or polling loop. Waits park on promises or signal listeners. An acquire rejects with
8
+ `cleanup` when a floor retains a record, owns `min` records, has nothing idle, and has no
9
+ refill or disposal pending, even with live leases. The lifecycle hooks are the caller's,
10
+ so the engine itself performs no I/O.
10
11
 
11
12
  ## Surface
12
13
 
@@ -44,10 +45,10 @@ try {
44
45
 
45
46
  ### Classes
46
47
 
47
- | API | Kind | Summary |
48
- | ----------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
49
- | `Pool` | class | Represents a capacity-aware resource pool whose opaque ownership records preserve FIFO settlement, cancellation, exact lease release, and deterministic teardown under concurrent hooks. |
50
- | `PoolError` | class | Represents a stable, machine-readable pool failure that retains the original thrown value as its cause without unsafe coercion, alongside structured context. |
48
+ | API | Kind | Summary |
49
+ | ----------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
+ | `Pool` | class | Represents a resource pool with optional bounded capacity and a warm floor, whose opaque ownership records preserve FIFO settlement, cancellation, exact lease release, and deterministic teardown under concurrent hooks. |
51
+ | `PoolError` | class | Represents a stable, machine-readable pool failure that retains the original thrown value as its cause without unsafe coercion, alongside structured context. |
51
52
 
52
53
  ### Guards
53
54
 
@@ -63,20 +64,20 @@ In a guard table a `Shape` cell holds the type the guard narrows to.
63
64
 
64
65
  A `Shape` cell holds an interface's data members as bare names in braces, `?` marking an optional member and `plus` introducing its call-signature members, and a type alias's own type literal with a union's arms escaped as `\|`.
65
66
 
66
- | API | Kind | Shape | Summary |
67
- | ------------------ | --------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
68
- | `PoolCode` | type | `'invalid' \| 'destroyed' \| 'create' \| 'cleanup'` | Names the machine-readable failure codes produced by `PoolError`. |
69
- | `PoolContext` | interface | `{ value?, failures? }` | Represents the structured context attached to a `PoolError`: the rejected input, or the distinct destroy-hook failures an aggregate cleanup collected. |
70
- | `PoolErrorOptions` | interface | `{ code, cause?, context? }` | Represents the construction options for `PoolError`: the stable code, an optional cause, and optional structured context. |
71
- | `PoolEventMap` | type | `{ create, acquire, release, destroy }` | Represents the observable resource lifecycle events emitted by a `PoolInterface`. |
72
- | `PoolToken` | interface | `{ value } plus release` | Represents a unique lease over one pool-owned resource record, exposing that record as a readonly `value` and returning it through an idempotent `release`. |
73
- | `PoolOptions` | interface | `{ on?, error?, create, destroy?, validate?, max? }` | Represents the resource lifecycle options for `Pool` and `createPool`: creation, destruction, validation, capacity, and observation. |
74
- | `PoolInterface` | interface | `{ emitter, size, idle, active } plus acquire, clear, destroy` | Represents a FIFO resource pool with optional bounded capacity and deterministic teardown, exposing its record counts and a typed lifecycle emitter. |
75
-
76
- `size` counts every owned record, including records being validated or destroyed. `idle`
77
- counts only immediately available records. `active` counts only leased records. An in-flight
78
- create reservation claims capacity but is not yet an owned record and therefore is not part
79
- of `size`.
67
+ | API | Kind | Shape | Summary |
68
+ | ------------------ | --------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
69
+ | `PoolCode` | type | `'invalid' \| 'destroyed' \| 'create' \| 'cleanup'` | Names the machine-readable failure codes produced by `PoolError`. |
70
+ | `PoolContext` | interface | `{ value?, failures? }` | Represents the structured context attached to a `PoolError`: the rejected input, or the distinct destroy-hook failures an aggregate cleanup collected. |
71
+ | `PoolErrorOptions` | interface | `{ code, cause?, context? }` | Represents the construction options for `PoolError`: the stable code, an optional cause, and optional structured context. |
72
+ | `PoolEventMap` | type | `{ create, acquire, release, destroy }` | Represents the observable resource lifecycle events emitted by a `PoolInterface`. |
73
+ | `PoolToken` | interface | `{ value } plus release, destroy` | Represents a unique lease over one pool-owned resource record, exposing that record as a readonly `value` and ending it through an idempotent `release` or `destroy`. |
74
+ | `PoolOptions` | interface | `{ on?, error?, create, destroy?, validate?, watch?, max?, min?, restarts? }` | Represents the resource lifecycle options for `Pool` and `createPool`: creation, destruction, validation, capacity, a bounded warm floor, and loss observation. |
75
+ | `PoolInterface` | interface | `{ emitter, size, idle, active } plus start, acquire, clear, destroy` | Represents a FIFO resource pool with optional bounded capacity, a warm floor, loss recovery, and deterministic teardown, exposing its record counts and a typed lifecycle emitter. |
76
+
77
+ `size` counts every owned record, including records being validated, destroyed, or retained
78
+ after failed cleanup under `min`. `idle` counts only immediately available records.
79
+ `active` counts only leased records. An in-flight create reservation claims capacity but is
80
+ not yet an owned record and therefore is not part of `size`.
80
81
 
81
82
  ## Methods
82
83
 
@@ -85,22 +86,107 @@ The public call-signature members of `PoolInterface` and `PoolToken`; `Pool` imp
85
86
 
86
87
  #### `PoolInterface`
87
88
 
88
- | Method | Returns | Summary |
89
- | --------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------- |
90
- | `acquire` | `Promise<PoolToken<T>>` | Queues the caller in FIFO order, validates an idle record or creates one, and settles queued acquires in that same order. |
91
- | `clear` | `Promise<void>` | Destroys the records that are idle at this call's synchronous snapshot. |
92
- | `destroy` | `Promise<void>` | Tears down the pool permanently and returns its stable completion barrier. |
89
+ | Method | Returns | Summary |
90
+ | --------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
91
+ | `start` | `Promise<void>` | Fills the warm floor and resets the strikes of a spent floor; without a floor, resolves immediately. |
92
+ | `acquire` | `Promise<PoolToken<T>>` | Queues the caller in FIFO order, validates an idle record or waits for a floor refill, and creates on demand only without a floor. |
93
+ | `clear` | `Promise<void>` | Destroys the records that are idle at this call's synchronous snapshot and restores a started floor. |
94
+ | `destroy` | `Promise<void>` | Tears down the pool permanently and returns its stable completion barrier. |
93
95
 
94
96
  #### `PoolToken`
95
97
 
96
- The lease returned by `acquire`, with the operation that returns its record.
98
+ The lease returned by `acquire`, with operations that return or dispose its exact record.
97
99
 
98
- | Method | Returns | Summary |
99
- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
100
- | `release` | `void` | Gives this exact record back to the pool once; a repeat call, and a call after teardown took ownership, are no-ops. |
100
+ | Method | Returns | Summary |
101
+ | --------- | --------------- | --------------------------------------------------------------------------------------------------------------------------- |
102
+ | `release` | `void` | Gives this exact record back to the pool once; a repeat call, and a call after loss or teardown took ownership, are no-ops. |
103
+ | `destroy` | `Promise<void>` | Destroys this exact record instead of returning it; a repeat call, and a call after release, are no-ops. |
101
104
 
102
105
  ## Contract
103
106
 
107
+ ### Warm floor and loss
108
+
109
+ Construction creates nothing. Set `min` to a positive safe integer and `restarts` to a
110
+ non-negative safe integer, then call `start()`. `max` defaults to `min`; explicit values
111
+ must equal each other. A missing restart bound, a bound without `min`, and a non-callable
112
+ `watch` are invalid. The restart bound has no default.
113
+
114
+ `start()` resolves when the pool owns `min` live records. Concurrent calls share the pending
115
+ promise. Without `min`, it resolves immediately. Under `min`, queued acquires never cause
116
+ creation, including before `start()` and during failed refills. The pool refills missing
117
+ capacity after startup and cleanup, one create attempt at a time.
118
+ Bound your `create` and `destroy` hooks. A create hook that never settles blocks every later
119
+ refill, including the attempt owed to a lost leased record. A destroy hook that never settles
120
+ keeps its record counted against `max` and blocks replacement of that record.
121
+
122
+ `watch(value, signal)` runs once for each created record. A fulfillment, rejection, or
123
+ synchronous throw declares loss while the record is live. The pool removes the record from
124
+ service, disposes it, and refills if the bound permits. Rejections and synchronous throws
125
+ reach `error(error, 'watch')` only while the record is live; a throwing error handler is
126
+ isolated. Disposal aborts the watch signal before the destroy hook runs, including disposal
127
+ through validation, clear, pool teardown, and token destruction.
128
+ The watch must release its listeners when that signal aborts. Any settlement after the signal
129
+ aborts is ignored, including rejection. A late or repeated loss cannot
130
+ dispose a record twice. A lost record cannot be handed out after validation or from a ready
131
+ result waiting behind an earlier caller. The pool disposes a lost leased record while its
132
+ holder still holds the token. The holder learns of that loss from its own `watch` or `destroy`
133
+ hook. After disposal, the token's `release()` and `destroy()` calls do nothing. During disposal,
134
+ the first `destroy()` call waits for that cleanup attempt and rejects with `cleanup` if it fails.
135
+
136
+ A failed refill adds a strike. Losing a record that has never been leased also adds a strike,
137
+ including failed validation. Granting a lease resets the strikes only when the granted record
138
+ was created after the last strike; successful creation alone does not. Granting an older healthy
139
+ record leaves the strikes unchanged. An idle never-leased record that dies, refills, and dies
140
+ again without a grant between those losses can spend the floor.
141
+ When strikes exceed `restarts`, the floor is spent. With `restarts: 1`, the first failed
142
+ create permits another attempt, and the second refuses the next attempt. `start()` rejects
143
+ with `create` and the last cause; another `start()` resets the strikes. While the floor is
144
+ spent, an acquire without an idle record rejects with `create` after pending refills and
145
+ disposal settle. If the floor retains a record and owns `min` records, that acquire rejects
146
+ with `cleanup` instead, even with live leases. A spent floor and a rejected `start()` still
147
+ serve their live records. A loss without a thrown cause leaves that cause undefined.
148
+
149
+ A record lost while leased earns one refill attempt even after the bound is spent.
150
+ The credit becomes spendable only when successful disposal removes the record; failed disposal
151
+ grants no credit. That attempt remains owed during a concurrent refill and never resets the strikes.
152
+ Its failed create adds a strike; its success alone does not reset the strikes. Granting that
153
+ replacement resets the strikes only if no strike occurred after its creation. A record that was leased
154
+ and later released adds no strike when lost. `token.destroy()` disposes the exact leased
155
+ record, waits for an existing cleanup attempt, and rejects with `cleanup` if disposal fails.
156
+ A token ends once: after `release()` or `destroy()`, the other call does nothing. Repeating
157
+ either call does nothing. A repeat `token.destroy()` after a `cleanup` rejection resolves
158
+ while the record stays retained.
159
+
160
+ Under `min`, a failed destroy hook leaves its record counted against `max` and excluded from
161
+ idle and active counts. The pool never replaces that retained record or retries its destroy
162
+ hook. The pool can run short; `start()` rejects with `cleanup` if retained records prevent
163
+ filling. An acquire rejects with `cleanup` when the floor retains a record, owns `min` records,
164
+ has nothing idle, and has no refill or disposal pending, even with live leases. The cause is
165
+ the retained record's own cleanup failure. The terminal `destroy()` barrier
166
+ reports the original cleanup failures. Without `min`, cleanup retains its lazy behavior and
167
+ frees capacity after either hook outcome.
168
+
169
+ This example warms an inert resource, explicitly loses its lease, and tears down the pool:
170
+
171
+ ```ts
172
+ import { createPool } from '@orkestrel/pool'
173
+
174
+ const pool = createPool({
175
+ create: () => new EventTarget(),
176
+ min: 1,
177
+ restarts: 1,
178
+ watch: (resource, signal) =>
179
+ new Promise<void>((resolve) => {
180
+ resource.addEventListener('loss', () => resolve(), { once: true, signal })
181
+ signal.addEventListener('abort', () => resolve(), { once: true })
182
+ }),
183
+ })
184
+ await pool.start()
185
+ const token = await pool.acquire()
186
+ await token.destroy()
187
+ await pool.destroy()
188
+ ```
189
+
104
190
  ### Capacity and FIFO
105
191
 
106
192
  Every `acquire` receives its queue position before a create or validation hook starts. The
@@ -112,15 +198,18 @@ cannot overtake an earlier slow one. Capacity obeys:
112
198
  owned records + create reservations <= max
113
199
  ```
114
200
 
115
- `max` must be a positive safe integer. Omit it for an unbounded pool; `Infinity`, fractions,
116
- zero, negative values, and unsafe integers are invalid. Construction snapshots `max` once and
117
- validates it before retention, then snapshots `on` and `error` once each.
201
+ `max` must be a positive safe integer. Omit both capacity options for an unbounded pool.
202
+ `Infinity`, fractions, zero, negative values, and unsafe integers are invalid.
203
+ Construction snapshots `max` once and validates it before retention, then snapshots `on`
204
+ and `error` once each.
118
205
 
119
206
  Record phases are disjoint:
120
207
 
121
208
  ```text
122
209
  create reservation -> ready -> leased -> available -> validating -> ready
123
210
  \-> destroying -> removed
211
+ \-> retained (failed cleanup with min)
212
+ floor refill --------------------------> available
124
213
  ```
125
214
 
126
215
  Invalid validation, whether `false` or a thrown value, claims and cleans the record before a
@@ -148,16 +237,20 @@ eventual `destroy()` barrier.
148
237
  A token captures its exact opaque record, so `release()` is correct even when multiple
149
238
  records contain the same value. Release is idempotent and removes the lease synchronously.
150
239
  With a waiter, the record is validated before handoff. Without an assignable waiter, it
151
- becomes idle and emits `release`. Release after teardown ownership transferred is a no-op.
240
+ becomes idle and emits `release`. Release after loss or teardown took ownership does nothing.
241
+ The pool disposes a lost lease while its holder still holds the token; the holder learns of
242
+ the loss through its own `watch` or `destroy` hook. After disposal, both token methods do nothing.
152
243
 
153
244
  `clear()` synchronously snapshots idle records and installs one cleanup promise per record
154
245
  before invoking the hook. Concurrent clears therefore own disjoint snapshots, and a lease
155
- released after a snapshot is taken is not part of it. Every claimed record stays in `size` until its
156
- hook attempt completes. Distinct failures are aggregated in a code-`cleanup` `PoolError`
157
- whose `context.failures` retains the original thrown values.
158
- Each claimed record's cleanup settlement independently wakes queued acquires after the
159
- destroy ledger transition, whether its cleanup hook succeeded or failed; a failed `clear()`
160
- still rejects its own aggregate cleanup barrier.
246
+ released after a snapshot is taken is not part of it. Every claimed record stays in `size` during
247
+ its hook attempt; failed cleanup under `min` retains it afterward. Distinct failures are
248
+ aggregated in a code-`cleanup` `PoolError` whose `context.failures` retains the original thrown
249
+ values.
250
+ Each claimed record's cleanup settlement wakes queued acquires after the destroy ledger
251
+ transition. A failed `clear()` rejects its own aggregate cleanup barrier; under `min`,
252
+ the pool keeps a record whose cleanup fails counted against `max`, and successful cleanup
253
+ restores a started floor.
161
254
 
162
255
  ### Destruction
163
256
 
@@ -165,7 +258,8 @@ still rejects its own aggregate cleanup barrier.
165
258
  rejects waiters, emits events, or invokes cleanup. Reentrant and repeated calls return that
166
259
  same object. Teardown invalidates idle, leased, and ready records, waits for create,
167
260
  validation, existing clear cleanup, and new cleanup activity, and disposes every late
168
- resource. Unresolved hooks keep the barrier pending without polling.
261
+ resource. A pending `start()` rejects with `destroyed`. Unresolved create, validation, and
262
+ destroy hooks keep the barrier pending without polling; aborted watches do not delay it.
169
263
 
170
264
  Cleanup already owned by an overlapping `clear()` is shared; its failure is reported to both
171
265
  the clear call and the destroy aggregate. Create failures that produced no resource do not
@@ -176,12 +270,12 @@ hook attempt, then the stable barrier resolves or rejects.
176
270
 
177
271
  `PoolError.code` is stable and lowercase:
178
272
 
179
- | Code | Owner |
180
- | ----------- | ------------------------------------------------------------------------ |
181
- | `invalid` | Invalid explicit `max`, invalid acquire signal, or an internal boundary. |
182
- | `destroyed` | Acquire or clear attempted after terminal teardown began. |
183
- | `create` | The create hook failed for its bound acquire. |
184
- | `cleanup` | Invalid-handoff, clear, or destroy cleanup failed. |
273
+ | Code | Owner |
274
+ | ----------- | ----------------------------------------------------------------------------------- |
275
+ | `invalid` | Invalid capacity, restart bound, watch hook, acquire signal, or internal boundary. |
276
+ | `destroyed` | Start, acquire, or clear attempted during terminal teardown. |
277
+ | `create` | A lazy create failed, or a floor refill bound was spent. |
278
+ | `cleanup` | Record disposal failed, including retained records blocking startup or acquisition. |
185
279
 
186
280
  The original thrown value is retained as `cause`; aggregate cleanup values are also in
187
281
  `context.failures`. Message construction and `isPoolError` avoid unsafe string coercion and
@@ -194,12 +288,12 @@ invokes listeners synchronously at each emission point. The `destroy` emission i
194
288
  one microtask after cleanup settlement so bound outcomes precede observer reentry. Events
195
289
  follow their ledger transitions:
196
290
 
197
- | Event | Emission point |
198
- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
199
- | `create` | After a fresh resource is inserted into the ownership ledger. |
200
- | `acquire` | After the waiter promise receives its token and the record is leased. |
201
- | `release` | Only when the released or orphaned-ready record remains idle. |
202
- | `destroy` | After the hook attempt and resource-ledger removal, one microtask after private cleanup settlement, while destroying ownership remains installed through the event. |
291
+ | Event | Emission point |
292
+ | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
293
+ | `create` | After a fresh resource is inserted into the ownership ledger. |
294
+ | `acquire` | After the waiter promise receives its token and the record is leased. |
295
+ | `release` | Only when a released, orphaned, or refilled record remains idle. |
296
+ | `destroy` | After the hook attempt and resource-ledger removal or retention, one microtask after private cleanup settlement, while destroying ownership remains installed through the event. |
203
297
 
204
298
  Because listeners may synchronously reenter or destroy the pool, the engine checks terminal
205
299
  and waiter state after every awaited hook and every emit.
@@ -260,7 +354,8 @@ await pool.destroy()
260
354
  hooks, create continuation, abort boundaries, abort-listener detachment, exclusive
261
355
  invalid-cleanup waiter ownership, bounded and unbounded replacement, destroy-observer
262
356
  reentry ordering, concurrent clear, stable reentrant destruction, late resources,
263
- aggregate failures, emitter ordering, and high contention.
357
+ aggregate failures, emitter ordering, high contention, warm floors, exact refill bounds,
358
+ retained cleanup failures, watch cancellation, lost-record handoff races, and owed lease refills.
264
359
  - [`tests/src/core/validators.test.ts`](../tests/src/core/validators.test.ts) — the public
265
360
  boundary guards alone: accepted and rejected maxima, and native versus hostile signals.
266
361
  - [`tests/src/core/factories.test.ts`](../tests/src/core/factories.test.ts) — factory
@@ -271,7 +366,8 @@ await pool.destroy()
271
366
  its declaration's description paragraph, the titled `Create a pool` fence against the
272
367
  `@example` block of that title (pinned so the titled pair cannot be retired silently), and the
273
368
  README pitch against this guide's tagline. It also runs the boundary-guard fence and asserts
274
- the values its comments claim.
369
+ the values its comments claim. The floor fence is checked line for line in execution order
370
+ and runs with assertions for warming, token cleanup, and watch-listener removal.
275
371
 
276
372
  ## See also
277
373
 
@@ -4,7 +4,7 @@
4
4
  "storage": "AGENTS.md",
5
5
  "destination": "AGENTS.md",
6
6
  "executable": false,
7
- "digest": "357cfbe336a026543ec68f3eb999f1094c3139d33331b0ba5f153352cef75fde"
7
+ "digest": "0f789cb1faea49ac3664d2246788ae160f7b036b42a8d5cc6f9618551442ed3b"
8
8
  },
9
9
  {
10
10
  "storage": "LICENSE",
@@ -16,7 +16,7 @@
16
16
  "storage": "agents/orchestration.md",
17
17
  "destination": ".agents/orchestration.md",
18
18
  "executable": false,
19
- "digest": "92f3b30439a037c611972fd600c88b7c7a22dbf1e12e4d601762c58915e33ec9"
19
+ "digest": "b31dfd8ec22606bf3d98ca2f32241c7f43d2537be49400c4b801028b4178bac0"
20
20
  },
21
21
  {
22
22
  "storage": "agents/skills/enterprise-bootstrap/SKILL.md",
@@ -220,7 +220,7 @@
220
220
  "storage": "agents/skills/orkestrel-falsify/SKILL.md",
221
221
  "destination": ".agents/skills/orkestrel-falsify/SKILL.md",
222
222
  "executable": false,
223
- "digest": "44c5f28bab784f2218032ffb1172b2ff7d21ce7990ae05ee75dfa73564fda46f"
223
+ "digest": "257ac6f56380decb55cb0ab7f2c2285f34474ba1a4b2944609c04218f4c9d013"
224
224
  },
225
225
  {
226
226
  "storage": "agents/skills/orkestrel-falsify/agents/openai.yaml",
@@ -376,7 +376,7 @@
376
376
  "storage": "agents/skills/orkestrel-publish/references/window.md",
377
377
  "destination": ".agents/skills/orkestrel-publish/references/window.md",
378
378
  "executable": false,
379
- "digest": "1debb388eba46e221f99a2518de5aa94ba04ffced781a855b4a305cafc7176c3"
379
+ "digest": "00c520a8a0a67b7a20813c374fee4339cdb9fb48ff3926eb87f44c8cef204e8a"
380
380
  },
381
381
  {
382
382
  "storage": "agents/skills/orkestrel-publish/scripts/compare.ts",
@@ -406,7 +406,7 @@
406
406
  "storage": "agents/skills/orkestrel-scout/SKILL.md",
407
407
  "destination": ".agents/skills/orkestrel-scout/SKILL.md",
408
408
  "executable": false,
409
- "digest": "cc3298e0b5bc22aeb72bb6fa9f9e006c6b5b8f8f9e439263900c90e9541bcfb5"
409
+ "digest": "e42e0b06a0cc647b8f13f7bf033ed6b2800e13e61298e9a0d2f2d22688e5011a"
410
410
  },
411
411
  {
412
412
  "storage": "agents/skills/orkestrel-scout/agents/openai.yaml",
@@ -424,7 +424,7 @@
424
424
  "storage": "agents/templates/brief.md",
425
425
  "destination": ".agents/templates/brief.md",
426
426
  "executable": false,
427
- "digest": "2e00bf607e3d9776e7f5dbe095201544a7479be7ae3a8e8d8c8ff62f204c42c1"
427
+ "digest": "7f479c0f2cfed85d5535a392474f6fe1a0a6de40ba1dfc37c4dc9c5e91a25ba8"
428
428
  },
429
429
  {
430
430
  "storage": "agents/transports/claude-cli.md",
@@ -442,7 +442,7 @@
442
442
  "storage": "agents/transports/cursor.md",
443
443
  "destination": ".agents/transports/cursor.md",
444
444
  "executable": false,
445
- "digest": "a49d5fe77163ee8afb17b8a407a9fa3fdb5a9365cf4130e115b4c368908b1c0b"
445
+ "digest": "2c3063adbac28be4942398dad5c004a083d6018de95042bb2ae1f48ecd4a3f35"
446
446
  },
447
447
  {
448
448
  "storage": "claude/AGENTS.md",
@@ -454,7 +454,7 @@
454
454
  "storage": "claude/agents/analyst.md",
455
455
  "destination": ".claude/agents/analyst.md",
456
456
  "executable": false,
457
- "digest": "a8a0fef71442681fb3d1d0d859dcad61e65732135431cf8cedf3d2d1d8d7cbf0"
457
+ "digest": "e1d7e4202b293ff7d8d934e95d1c499845f0f49729180077f417864dc179c84b"
458
458
  },
459
459
  {
460
460
  "storage": "claude/agents/astra.md",
@@ -484,7 +484,7 @@
484
484
  "storage": "claude/agents/grok.md",
485
485
  "destination": ".claude/agents/grok.md",
486
486
  "executable": false,
487
- "digest": "7796fe8f4488a39d7e6d45ab21bbc6a98be5d607d324961b2cae9d610cf08a2d"
487
+ "digest": "6798fabf3a71e9514d8f33d7c310b7f20647951a0b847b11eee96f4150fb3e83"
488
488
  },
489
489
  {
490
490
  "storage": "claude/agents/opus.md",
@@ -496,19 +496,19 @@
496
496
  "storage": "claude/agents/orkestrel.md",
497
497
  "destination": ".claude/agents/orkestrel.md",
498
498
  "executable": false,
499
- "digest": "565dee392dced6c3e1e632295739eeb9465ca4828d26c18d02b57f106fdc5f38"
499
+ "digest": "36afc2242e9becbb7662aeece1b0f81a12162aacfd360a48a07a3ec7eaf7d639"
500
500
  },
501
501
  {
502
502
  "storage": "claude/agents/planner.md",
503
503
  "destination": ".claude/agents/planner.md",
504
504
  "executable": false,
505
- "digest": "87407ce9ea76fed0f6d37fa153a0ea0086296b0e78c93b66cfa90e071a847773"
505
+ "digest": "86cef178ce25c8c8e002ea69c2e1bf0e21494ac77417e2376c5584fa3ae0c8b7"
506
506
  },
507
507
  {
508
508
  "storage": "claude/agents/researcher.md",
509
509
  "destination": ".claude/agents/researcher.md",
510
510
  "executable": false,
511
- "digest": "85c534e529865bec3c475c810b049ab1dd81e433b08effe098689111729eaa5d"
511
+ "digest": "e5f0686f6bb1825fbf6006933e034c1ef882501792a93f690ac4bb059132e926"
512
512
  },
513
513
  {
514
514
  "storage": "claude/agents/reviewer.md",
@@ -520,7 +520,7 @@
520
520
  "storage": "claude/agents/scout.md",
521
521
  "destination": ".claude/agents/scout.md",
522
522
  "executable": false,
523
- "digest": "29de324181e783eb73de4a8213e44621d730f43b06a361c6ba77660fbe79bf09"
523
+ "digest": "fa55e6ca6c89dae3bdf6f2faddf6beea0746b8714962a45a44999f7d8b5f7691"
524
524
  },
525
525
  {
526
526
  "storage": "claude/agents/verifier.md",
@@ -556,13 +556,13 @@
556
556
  "storage": "claude/rules/names.md",
557
557
  "destination": ".claude/rules/names.md",
558
558
  "executable": false,
559
- "digest": "6606f4f8b219c6631029235f4081f29b055952a635e76477dfd6febdbe61afe2"
559
+ "digest": "e5d0221d31ab7eed5c9b4ec4537a827103f61dd90edc58029ff5dac024a6f4ac"
560
560
  },
561
561
  {
562
562
  "storage": "claude/rules/patterns.md",
563
563
  "destination": ".claude/rules/patterns.md",
564
564
  "executable": false,
565
- "digest": "0fc0301c96b6b7ee23a4c743dc1903b06cf15a296155d9634ead0e813d61f200"
565
+ "digest": "b17a9102761262e116416d3c5a0f78b16fa2c3598ba203d35bba7b93b7ccbf1b"
566
566
  },
567
567
  {
568
568
  "storage": "claude/rules/portability.md",
@@ -574,19 +574,19 @@
574
574
  "storage": "claude/rules/quality.md",
575
575
  "destination": ".claude/rules/quality.md",
576
576
  "executable": false,
577
- "digest": "7b8b9b3a4f4ee586d96deeb0cdd4fc9da68da663742cb56c96f64b2230ba89e6"
577
+ "digest": "4a67842795882635436aa001a7ad1d0b2b6b81b9d8dd51730b8c37e65ebd367a"
578
578
  },
579
579
  {
580
580
  "storage": "claude/rules/styles.md",
581
581
  "destination": ".claude/rules/styles.md",
582
582
  "executable": false,
583
- "digest": "869f88c392b4795e47af881d668f4dc591e0c419229a843eb4105e38dfb6f831"
583
+ "digest": "ae1c97f23d71c53ef117b2cd661df6258712988ec86de6c60a1cbad4670eb996"
584
584
  },
585
585
  {
586
586
  "storage": "claude/rules/tests.md",
587
587
  "destination": ".claude/rules/tests.md",
588
588
  "executable": false,
589
- "digest": "5808e375cf559c6d51aa3a744bcea574613945629e66e304c3d2f338b2f7abc0"
589
+ "digest": "0a7cf69072de3fb89afdd580c4d3b728130862f6d6865a2ec02a4881ddb504fa"
590
590
  },
591
591
  {
592
592
  "storage": "claude/rules/typescript.md",
@@ -604,7 +604,7 @@
604
604
  "storage": "claude/rules/writing.md",
605
605
  "destination": ".claude/rules/writing.md",
606
606
  "executable": false,
607
- "digest": "f18fad032d2b02533c1e66420109af16d4b48a151069a457f4a6458e2bc54588"
607
+ "digest": "7a115369ba2a79cf6362444f474a58d9094f06a7d2fdd501b454158ceabc5d07"
608
608
  },
609
609
  {
610
610
  "storage": "claude/settings.json",
@@ -736,7 +736,7 @@
736
736
  "storage": "codex/agents/researcher.toml",
737
737
  "destination": ".codex/agents/researcher.toml",
738
738
  "executable": false,
739
- "digest": "d9f3e2e811fe3754e6d99c6d8abccc0a4b1f21dfe1986a31cdcb1b5308434a7b"
739
+ "digest": "c6d8288e49428aac8bfc253807631c6cb308cadc67ebd29a226887844c623ad7"
740
740
  },
741
741
  {
742
742
  "storage": "codex/agents/reviewer.toml",
@@ -748,7 +748,7 @@
748
748
  "storage": "codex/agents/scout.toml",
749
749
  "destination": ".codex/agents/scout.toml",
750
750
  "executable": false,
751
- "digest": "d5059678fcb3788b60c505323c2f9950ce386a4bee4f9fe355afad3079cb3bd1"
751
+ "digest": "b79ed6467954fc01d83fb66d687cb2cd7e10ba2ee061c3a3b8946a5540222298"
752
752
  },
753
753
  {
754
754
  "storage": "codex/agents/verifier.toml",
@@ -862,7 +862,7 @@
862
862
  "storage": "guides/browser.md",
863
863
  "destination": "guides/browser.md",
864
864
  "executable": false,
865
- "digest": "4dd8f7377b165d840dd3060f0af955458fff193612f833aadd04d37c34734afe"
865
+ "digest": "deec731bfc8733f880021cbf9a8cf450e51a93bc23f2f963fb3e1bf750554ba8"
866
866
  },
867
867
  {
868
868
  "storage": "guides/budget.md",
@@ -982,7 +982,7 @@
982
982
  "storage": "guides/pool.md",
983
983
  "destination": "guides/pool.md",
984
984
  "executable": false,
985
- "digest": "2154e2b25047ef0b365286fee4348c65066bb9a51e8b4c8f4461745b908a49fe"
985
+ "digest": "c49d3d2d3d5a2dc4518a8cebb94c82ba2dbcdc03222d5ad3885df13c46dfe8e2"
986
986
  },
987
987
  {
988
988
  "storage": "guides/probe.md",
@@ -2144,5 +2144,5 @@
2144
2144
  ]
2145
2145
  }
2146
2146
  ],
2147
- "digest": "551ef9dbdc726896039afd3e7edc69321303f148e28cd711a6e4ba028dba2d46"
2147
+ "digest": "09b047e9598599db3dca2e26b55b897293e600defd7c35147dbab8a771816c0b"
2148
2148
  }
@@ -4,7 +4,7 @@ let _orkestrel_template = require("@orkestrel/template");
4
4
  let _orkestrel_emitter = require("@orkestrel/emitter");
5
5
  var package_default = {
6
6
  name: "@orkestrel/scaffold",
7
- version: "0.0.90",
7
+ version: "0.0.92",
8
8
  description: "Scaffold workspaces with commands: new, audit, repair, catalog, and overwrite.",
9
9
  keywords: [
10
10
  "audit",
@@ -104,10 +104,10 @@ var package_default = {
104
104
  },
105
105
  devDependencies: {
106
106
  "@microsoft/api-extractor": "^7.59.3",
107
- "@orkestrel/browser": "^0.0.22",
107
+ "@orkestrel/browser": "^0.0.24",
108
108
  "@orkestrel/guide": "^0.0.24",
109
109
  "@orkestrel/html": "^0.0.12",
110
- "@orkestrel/probe": "^0.0.19",
110
+ "@orkestrel/probe": "^0.0.20",
111
111
  "@orkestrel/test": "^0.0.24",
112
112
  "@types/node": "^26.6.4",
113
113
  "@vitest/browser-playwright": "^4.1.11",
@@ -691,6 +691,7 @@ var BROWSE_UPSTREAM = Object.freeze([
691
691
  "@orkestrel/html",
692
692
  "@orkestrel/markdown",
693
693
  "@orkestrel/mcp",
694
+ "@orkestrel/pool",
694
695
  "@orkestrel/process",
695
696
  "@orkestrel/router",
696
697
  "@orkestrel/server",