@orkestrel/scaffold 0.0.66 → 0.0.68
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/dist/bin/main.js +67 -44
- package/dist/bin/main.js.map +1 -1
- package/dist/host/agents/templates/brief.md +9 -0
- package/dist/host/claude/agents/orkestrel.md +8 -8
- package/dist/host/claude/rules/names.md +15 -0
- package/dist/host/claude/rules/tests.md +33 -4
- package/dist/host/claude/rules/workspace.md +14 -2
- package/dist/host/dotfiles/prettierignore +3 -0
- package/dist/host/guides/README.md +65 -0
- package/dist/host/guides/abort.md +169 -0
- package/dist/host/guides/agent.md +1509 -0
- package/dist/host/guides/brief.md +1266 -0
- package/dist/host/guides/browser.md +2200 -0
- package/dist/host/guides/budget.md +196 -0
- package/dist/host/guides/codec.md +519 -0
- package/dist/host/guides/console.md +785 -0
- package/dist/host/guides/contract.md +1193 -0
- package/dist/host/guides/csv.md +541 -0
- package/dist/host/guides/database.md +2518 -0
- package/dist/host/guides/emitter.md +233 -0
- package/dist/host/guides/form.md +1791 -0
- package/dist/host/guides/html.md +717 -0
- package/dist/host/guides/indexeddb.md +505 -0
- package/dist/host/guides/interpret.md +1029 -0
- package/dist/host/guides/lsp.md +515 -0
- package/dist/host/guides/markdown.md +964 -0
- package/dist/host/guides/mcp.md +5554 -0
- package/dist/host/guides/middleware.md +927 -0
- package/dist/host/guides/msg.md +440 -0
- package/dist/host/guides/ndjson.md +120 -0
- package/dist/host/guides/ollama.md +380 -0
- package/dist/host/guides/pool.md +280 -0
- package/dist/host/guides/probe.md +1210 -0
- package/dist/host/guides/process.md +1620 -0
- package/dist/host/guides/program.md +1110 -0
- package/dist/host/guides/qualifier.md +854 -0
- package/dist/host/guides/queue.md +370 -0
- package/dist/host/guides/rater.md +330 -0
- package/dist/host/guides/reason.md +1122 -0
- package/dist/host/guides/relation.md +373 -0
- package/dist/host/guides/router.md +753 -0
- package/dist/host/guides/scaffold.md +192 -31
- package/dist/host/guides/sea.md +383 -0
- package/dist/host/guides/server.md +752 -0
- package/dist/host/guides/sqlite.md +330 -0
- package/dist/host/guides/sse.md +187 -0
- package/dist/host/guides/supervisor.md +4890 -0
- package/dist/host/guides/table.md +1556 -0
- package/dist/host/guides/template.md +280 -0
- package/dist/host/guides/terminal.md +1145 -0
- package/dist/host/guides/test.md +2969 -0
- package/dist/host/guides/timeout.md +252 -0
- package/dist/host/guides/tool.md +311 -0
- package/dist/host/guides/toolbox.md +1038 -0
- package/dist/host/guides/websocket.md +282 -0
- package/dist/host/guides/worker.md +615 -0
- package/dist/host/guides/workflow.md +1507 -0
- package/dist/host/guides/workspace.md +595 -0
- package/dist/host/manifest.json +1218 -10
- package/dist/host/tests/policy.test.ts +279 -2
- package/dist/host/tests/setupPolicy.ts +437 -6
- package/dist/src/core/index.cjs +44 -22
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +33 -9
- package/dist/src/core/index.d.ts +33 -9
- package/dist/src/core/index.js +43 -23
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +1750 -1567
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +106 -24
- package/dist/src/server/index.d.ts +106 -24
- package/dist/src/server/index.js +1751 -1570
- package/dist/src/server/index.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Budget
|
|
2
|
+
|
|
3
|
+
> The cost primitive: a cumulative consumption tally against a ceiling that exposes an
|
|
4
|
+
> `AbortSignal` firing the moment `consumed` reaches `max`.
|
|
5
|
+
|
|
6
|
+
A budget handle is what an agent loop holds to keep a whole run inside one cost limit, in place of a cost check written at every call site. Hand its `signal` to the work, race that signal against a call, or fold it into a loop's bound. You define what is spent — tokens, bytes, dollars, or calls — so the same handle covers a provider's token usage and a pipeline's byte throughput.
|
|
7
|
+
|
|
8
|
+
A budget is the substrate's third bounding signal, a peer to a cancellation signal (fires on `abort()`) and a deadline signal (fires on expiry). All three are plain `AbortSignal`s by design, so an agent loop combines them into one bound with `AbortSignal.any([abort, timeout, budget])` and reacts to whichever trips first — cancel, deadline, or cost. The primitive deliberately carries no Emitter, clock, or I/O: its native signal is the complete observation boundary. It is a functional counter with a signal bolted to its ceiling — nothing more, so the surface stays small. Source: [`src/core`](../src/core). Surfaced through the `@src/core` barrel.
|
|
9
|
+
|
|
10
|
+
## Surface
|
|
11
|
+
|
|
12
|
+
Create a cost handle, `start()` it, and charge it as the work spends:
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { createBudget } from '@orkestrel/budget'
|
|
16
|
+
|
|
17
|
+
const budget = createBudget<number>({ max: 10_000, consumer: (cost) => cost })
|
|
18
|
+
budget.start()
|
|
19
|
+
budget.signal.addEventListener('abort', () => stop()) // fires when exhausted
|
|
20
|
+
budget.consume(4_000) // remaining 6_000
|
|
21
|
+
budget.consume(7_000) // crosses 10_000 — fires `signal`
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**What happens:** `consume(value)` runs your consumer first, validates its result as a finite nonnegative charge, and atomically adds it to `consumed`; the moment cumulative `consumed` reaches `max`, `exhausted` flips `true` and `signal` fires — exactly once. A valid charge may overshoot the ceiling. A thrown consumer, invalid charge, or nonfinite cumulative overflow leaves the tally and signal unchanged. `consumed` is the lifetime spend and only ever grows after successful consumption. `start()` re-arms a fresh per-request `signal` WITHOUT resetting `consumed`, so the ceiling stays one running total across many requests; a budget already at or past `max` arms an immediately-aborted signal, bounding the next request from its first tick. `remaining` is `max - consumed` floored at zero, and `exhausted` is `consumed >= max` — both are live reads off the same counter.
|
|
25
|
+
|
|
26
|
+
**Options:** pass a parent `signal` to link an external cancel — the exposed `signal` then fires on EITHER exhaustion OR the parent aborting (through `AbortSignal.any`) and preserves the first reason. Pass a string `id` to label a handle for tracing, or omit it for a random UUID. Construction strictly requires a plain options record, a finite nonnegative `max`, a function `consumer`, and a native `AbortSignal` when `signal` is present. Invalid JavaScript-boundary input throws a structured `ContractError`. `max: 0` is derived as exhausted immediately, while its signal remains un-aborted until `start()` or `consume()` applies the ceiling.
|
|
27
|
+
|
|
28
|
+
### Factories
|
|
29
|
+
|
|
30
|
+
| API | Kind | Summary |
|
|
31
|
+
| --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
32
|
+
| `createBudget` | function | Creates a cumulative budget as a `BudgetInterface<T>` over a `max` ceiling and a `consumer`, whose native signal aborts the moment the tally reaches that ceiling. |
|
|
33
|
+
| `createTokenConsumer` | function | Creates a validated unary consumer that charges one selected `TokenUsage` field. |
|
|
34
|
+
| `createTokenBudget` | function | Creates a token budget as a `BudgetInterface<TokenUsage>` charging one validated `scope` field per provider call. |
|
|
35
|
+
|
|
36
|
+
### Validators
|
|
37
|
+
|
|
38
|
+
In a guard table a `Shape` cell holds the type the guard narrows to.
|
|
39
|
+
|
|
40
|
+
| API | Kind | Shape | Summary |
|
|
41
|
+
| ---------------- | -------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| `isBudgetAmount` | function | `number` | Determines whether a value is a finite nonnegative budget amount. |
|
|
43
|
+
| `isBudgetSignal` | function | `AbortSignal` | Determines whether a value is a genuine native `AbortSignal`, returning `false` rather than throwing on hostile input. |
|
|
44
|
+
| `isTokenScope` | function | `TokenScope` | Determines whether a value is a supported `TokenScope` field selector. |
|
|
45
|
+
| `isTokenUsage` | function | `TokenUsage` | Determines whether a value is readable token usage carrying three finite nonnegative counts, returning `false` rather than throwing. |
|
|
46
|
+
|
|
47
|
+
### Helpers
|
|
48
|
+
|
|
49
|
+
| API | Kind | Summary |
|
|
50
|
+
| ---------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `validateBudgetOptions` | function | Validates and normalizes budget construction options into a fresh copy that omits absent optional keys. |
|
|
52
|
+
| `validateTokenBudgetOptions` | function | Validates and normalizes token-budget construction options into a fresh copy that omits absent optional keys. |
|
|
53
|
+
|
|
54
|
+
### Classes
|
|
55
|
+
|
|
56
|
+
| API | Kind | Summary |
|
|
57
|
+
| -------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
58
|
+
| `Budget` | class | Implements `BudgetInterface` over a private `AbortController` the instance owns, aborting the composed signal the moment `consumed` reaches the `max` ceiling. |
|
|
59
|
+
|
|
60
|
+
### Types
|
|
61
|
+
|
|
62
|
+
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 `\|`.
|
|
63
|
+
|
|
64
|
+
| Type | Kind | Shape | Summary |
|
|
65
|
+
| -------------------- | --------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
66
|
+
| `BudgetOptions` | interface | `{ id?, max, consumer, signal? }` | Represents the options for constructing a cumulative budget, accepted by the `createBudget` function and the `Budget` constructor. |
|
|
67
|
+
| `TokenBudgetOptions` | interface | `{ id?, max, scope?, signal? }` | Represents the options for constructing a token budget, accepted by the `createTokenBudget` function. |
|
|
68
|
+
| `BudgetInterface` | interface | `{ id, signal, max, consumed, remaining, exhausted } plus start, consume, clear` | Represents the cumulative cost handle contract: a lifetime tally, its validated ceiling, and the native signal that aborts when the tally reaches that ceiling. |
|
|
69
|
+
| `TokenScope` | type | `'completion' \| 'total' \| 'prompt'` | Names the token-usage field selected as the charge for a token budget. |
|
|
70
|
+
| `TokenUsage` | interface | `{ prompt, completion, total }` | Represents the canonical LLM cost unit: the finite nonnegative token counts reported for one provider call, and the typical `T` for an agent budget. |
|
|
71
|
+
|
|
72
|
+
The `id`, `signal`, `max`, `consumed`, `remaining`, and `exhausted` members of `BudgetInterface` are `readonly` data members (the preceding Surface rows) — its call-signature methods are documented under [Methods](#methods).
|
|
73
|
+
|
|
74
|
+
## Methods
|
|
75
|
+
|
|
76
|
+
The public methods of `BudgetInterface` — every call-signature member listed (its `readonly` data members `id` / `signal` / `max` / `consumed` / `remaining` / `exhausted` stay Surface rows). `Budget` implements the interface exactly, so this doubles as the class's instance-method surface.
|
|
77
|
+
|
|
78
|
+
#### `BudgetInterface`
|
|
79
|
+
|
|
80
|
+
`start` is the begin-or-restart verb — it re-arms a fresh per-request `signal` without resetting the cumulative tally; `consume` charges the tally and trips `signal` at the ceiling; `clear` is the reset — it zeroes the tally AND re-arms a fresh `signal`.
|
|
81
|
+
|
|
82
|
+
| Method | Returns | Summary |
|
|
83
|
+
| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
84
|
+
| `start` | `void` | Re-arms a fresh per-request `signal` without resetting the cumulative tally, arming it already aborted when `consumed` has reached `max`. |
|
|
85
|
+
| `consume` | `void` | Runs the configured consumer first, then validates and atomically adds its charge, tripping `signal` the moment the tally reaches `max`; a valid charge that overshoots the ceiling is accepted. |
|
|
86
|
+
| `clear` | `void` | Resets the tally to `0` and re-arms a fresh unaborted `signal`, opening the next window from zero. |
|
|
87
|
+
|
|
88
|
+
## Contract
|
|
89
|
+
|
|
90
|
+
These invariants hold across `src/core` ↔ `budget.md`:
|
|
91
|
+
|
|
92
|
+
1. **DOC ↔ SOURCE bijection.** Every `function` / `class` / `interface` / `type` row in the `## Surface` tables is a real export of the budgets module, and every export appears as a Surface row — exhaustive, both directions.
|
|
93
|
+
2. **Atomic ceiling signal.** `consume(value)` invokes the configured consumer before state changes. A finite nonnegative charge is added atomically; the moment `consumed >= max` the handle flips `exhausted` to `true` and aborts a private controller, so `signal` fires. The trip happens exactly once per armed signal — consuming further after exhaustion never re-aborts (idempotent), and a valid overshoot is accepted and trips it once. A consumer throw retains its identity; an invalid charge or nonfinite cumulative overflow throws a range-coded `ContractError`; every failure leaves `consumed` and `signal` unchanged.
|
|
94
|
+
3. **Cumulative tally, per-request signal.** `consumed` only ever grows under `consume()` — it is the lifetime spend, never reset by `start()`. `start()` re-arms a FRESH per-request `signal` (a different `AbortSignal` from the prior run's) while leaving `consumed` untouched, so the ceiling stays the same running total across requests. `remaining` is `max - consumed` floored at `0` (never negative); `exhausted` is `consumed >= max`.
|
|
95
|
+
4. **`clear()` resets the tally.** `clear()` is the lifecycle reset — it zeroes `consumed` AND re-arms a fresh `signal`, returning the budget to its born state (`consumed === 0`, `remaining === max`, `exhausted === false`, `signal.aborted === false` for a positive `max` (absent an already-aborted parent)), so `consume()` can refill the SAME ceiling from zero. It is the resettable counterpart to `start()` (which preserves the running total): a measure-since-an-event budget consumes toward `max`, takes its ceiling action, then `clear()`s to open the next window — for example an agent loop's compact-and-continue context window.
|
|
96
|
+
5. **Re-arm guard and zero ceiling.** `start()` on a budget already at or past `max` (`consumed >= max`) arms an immediately-aborted signal — a request opened on a spent budget is bounded from the very first tick. `max: 0` is derived as exhausted at construction and after `clear()`, while the newly composed signal remains un-aborted until `start()` or `consume()` applies that ceiling. (`clear()` on a positive `max` returns both derived state and signal to the unexhausted born state.)
|
|
97
|
+
6. **Parent links through `AbortSignal.any`.** With a parent `signal`, the exposed `signal` is `AbortSignal.any([own, parent])`, so it fires on EITHER exhaustion OR the parent aborting — without re-implementing listener wiring. Exhaustion still fires when the parent never aborts; a parent abort fires `signal` independent of consumption (the budget need not be exhausted). A parent ALREADY aborted at construction makes the current `signal` born aborted, carrying the parent's reason. The composite is computed once per arm (construction + each `start()` / `clear()`) and stored, never recomputed per read — so reads do not accumulate listeners (a peer to `Abort`'s composite handling).
|
|
98
|
+
7. **Composes with abort/timeout.** Because `signal` is a plain `AbortSignal`, a `Budget` folds into a combined bound with a cancellation signal and a deadline signal through `AbortSignal.any([abort, timeout, budget])` — the combined signal fires on whichever trips first (the agent-loop pattern).
|
|
99
|
+
8. **Traceable identity.** `id` is a stable string for the handle's lifetime — caller-supplied through `options.id`, including an empty string, or a `crypto.randomUUID()` default only when `id` is omitted. `max` is the validated ceiling, exposed read-only. The abort reason on owned exhaustion is the platform default `AbortError` `DOMException`.
|
|
100
|
+
9. **Strict once-read boundaries.** `validateBudgetOptions` and `validateTokenBudgetOptions` accept the typed contracts while defending their hostile JavaScript boundary: they require a plain record, read each declared property exactly once inside a contained boundary, validate with structured `ContractError` taxonomy/context, and return a fresh normalized object that omits absent optional keys. `Budget` calls the budget helper before allocating its controller; `createTokenBudget` calls the token helper before creating its consumer and public budget.
|
|
101
|
+
10. **Validated token accounting.** `TokenScope` is the public `'completion' | 'total' | 'prompt'` selector and defaults to `completion` in `createTokenBudget`. Token factories reject unsupported scopes and malformed usage; all three `TokenUsage` fields must be finite and nonnegative before the selected charge is used.
|
|
102
|
+
11. **Total guards.** `isBudgetAmount`, `isBudgetSignal`, `isTokenScope`, and `isTokenUsage` return `false`, rather than throw, for off-shape, hostile, or revoked input.
|
|
103
|
+
12. **Signal-only observation.** This primitive has no Emitter, `EventMap`, or `on` hook. Its native `AbortSignal` is the observation mechanism.
|
|
104
|
+
13. **DOC ↔ SOURCE method bijection.** The `## Methods` table lists exactly `BudgetInterface`'s public methods — exhaustive, both directions — and `Budget` exposes the same public methods, no more.
|
|
105
|
+
|
|
106
|
+
## Patterns
|
|
107
|
+
|
|
108
|
+
### Race work against the ceiling
|
|
109
|
+
|
|
110
|
+
The dominant use: bound how much work may spend by racing it against the budget `signal`.
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { createBudget } from '@orkestrel/budget'
|
|
114
|
+
|
|
115
|
+
const budget = createBudget<number>({ max: 1_000_000, consumer: (bytes) => bytes })
|
|
116
|
+
budget.start()
|
|
117
|
+
budget.signal.addEventListener('abort', () => abortStream(), { once: true })
|
|
118
|
+
|
|
119
|
+
for await (const chunk of stream) {
|
|
120
|
+
if (budget.signal.aborted) break // the ceiling was crossed mid-stream
|
|
121
|
+
budget.consume(chunk.byteLength)
|
|
122
|
+
process(chunk)
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### A token budget folded into an agent loop's bound
|
|
127
|
+
|
|
128
|
+
The headline use the primitive exists for: a token budget consumed per provider call, its `signal` folded into the loop's abort alongside an external cancel and a deadline — `AbortSignal.any` over all three bounds, whichever trips first.
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
import { createTokenBudget } from '@orkestrel/budget'
|
|
132
|
+
|
|
133
|
+
const cancel = new AbortController() // external cancel
|
|
134
|
+
const deadline = AbortSignal.timeout(60_000) // wall-clock deadline
|
|
135
|
+
const budget = createTokenBudget({ max: 50_000, scope: 'total' }) // cost ceiling
|
|
136
|
+
|
|
137
|
+
budget.start()
|
|
138
|
+
// The agent loop's single bound — fires on cancel OR deadline OR budget.
|
|
139
|
+
const bound = AbortSignal.any([cancel.signal, deadline, budget.signal])
|
|
140
|
+
|
|
141
|
+
while (!bound.aborted) {
|
|
142
|
+
const usage = await callProvider() // → { prompt, completion, total }
|
|
143
|
+
budget.consume(usage) // fires budget.signal after the ceiling is crossed
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Re-arm per request, spend across the session
|
|
148
|
+
|
|
149
|
+
`start()` re-arms the per-request `signal` while the cumulative spend carries forward — a session-long budget that bounds each request and is born exhausted after the lifetime ceiling is reached.
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { createTokenBudget } from '@orkestrel/budget'
|
|
153
|
+
|
|
154
|
+
const budget = createTokenBudget({ max: 1_000_000, scope: 'total' })
|
|
155
|
+
for (const request of requests) {
|
|
156
|
+
budget.start() // fresh per-request signal; cumulative spend preserved
|
|
157
|
+
if (budget.signal.aborted) break // the session ceiling was already reached
|
|
158
|
+
await runWithBound(request, budget) // consume(usage) inside, race budget.signal
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Reuse a handle with `clear()`
|
|
163
|
+
|
|
164
|
+
`clear()` zeroes the tally and re-arms a fresh signal, so a spent budget can open a new window from scratch — for example an agent loop that compacts context and continues.
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { createBudget } from '@orkestrel/budget'
|
|
168
|
+
|
|
169
|
+
const budget = createBudget<number>({ max: 1_000, consumer: (n) => n })
|
|
170
|
+
budget.start()
|
|
171
|
+
budget.consume(1_000) // crosses the ceiling — signal fires, exhausted is true
|
|
172
|
+
|
|
173
|
+
budget.clear() // consumed resets to 0, remaining is max again, signal is fresh
|
|
174
|
+
budget.consume(200) // spends against the new window
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Practices
|
|
178
|
+
|
|
179
|
+
- **`start()` then race the `signal`** — re-arm the per-request signal, then race `signal` against the work to bound its spend.
|
|
180
|
+
- **`consume()` as you spend** — charge the tally with the real cost (tokens, bytes, calls) at each step; the ceiling trips `signal` automatically.
|
|
181
|
+
- **Fold into the loop's bound** — combine `budget.signal` with an abort and a timeout through `AbortSignal.any` so one bound covers cancel, deadline, and cost.
|
|
182
|
+
- **Cumulative, not per-request** — remember `consumed` is the lifetime spend; `start()` re-arms the signal, it does NOT reset the tally.
|
|
183
|
+
- **Observe the signal** — this is a functional primitive; its native `AbortSignal` is the complete observation boundary.
|
|
184
|
+
|
|
185
|
+
## Tests
|
|
186
|
+
|
|
187
|
+
- [`tests/guides.test.ts`](../tests/guides.test.ts) — the `## Surface` ↔ `src/core` bijection (value + type exports), the `BudgetInterface` ↔ `Budget` method bijection, and the equality gate: every `Summary` cell against its declaration's description paragraph, the titled `Race work against the ceiling` fence against the `@example` block of that title (pinned so the titled pair cannot be retired silently), and the README pitch against this guide's tagline. It also runs the flagship fences and asserts the values their comments claim.
|
|
188
|
+
- [`tests/src/core/Budget.test.ts`](../tests/src/core/Budget.test.ts) — strict construction, cumulative and atomic consumption, valid overshoot, thrown-consumer identity, numeric overflow, zero-ceiling semantics, lifecycle re-arming/reset, parent reason preservation, and public type shape.
|
|
189
|
+
- [`tests/src/core/factories.test.ts`](../tests/src/core/factories.test.ts) — real generic/token factory behavior plus untyped scope, usage, options, hostile, and revoked boundary failures with exact structured errors.
|
|
190
|
+
- [`tests/src/core/helpers.test.ts`](../tests/src/core/helpers.test.ts) — direct option-helper fresh-copy and optional-key omission, exactly-once property reads, hostile getter containment, generic preservation, and exact error taxonomy/context.
|
|
191
|
+
- [`tests/src/core/validators.test.ts`](../tests/src/core/validators.test.ts) — total amount, native-signal, token-scope, and token-usage guards across valid, off-shape, hostile, and revoked values.
|
|
192
|
+
|
|
193
|
+
## See also
|
|
194
|
+
|
|
195
|
+
- [`AGENTS.md`](../AGENTS.md) — the pointer to the `@orkestrel/scaffold` coding and orchestration authority.
|
|
196
|
+
- [`README.md`](README.md) — the guides index.
|