@orkestrel/scaffold 0.0.49 → 0.0.51

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.
@@ -13,7 +13,7 @@
13
13
  - External delegates, including Cursor and Codex models, have no exemption. Every dispatch restates the non-negotiables, applicable rules, guide or spec, and owned files. Every result receives independent review.
14
14
  - Before working, read in order:
15
15
  1. this file;
16
- 2. every applicable file in `.claude/rules/` from the rule map below;
16
+ 2. every applicable file in `.claude/rules/` from the Rule map section;
17
17
  3. every explicitly invoked or dispatch-named skill and the references it requires;
18
18
  4. `guides/README.md`, the matching guide or spec, and `ROADMAP.md` when present.
19
19
  - Rules state **how to write**. Guides and specs state **what to build** and the domain workflow. When they conflict, stop and surface the conflict.
@@ -115,7 +115,7 @@ npm run format:check → npm run lint:check → npm run check → npm run build
115
115
 
116
116
  ## Rule map
117
117
 
118
- Every file below is a normative extension of this root. Read every rule relevant to the files or concepts you touch. Path frontmatter only controls Claude's automatic loading.
118
+ Every file in the following table is a normative extension of this root. Read every rule relevant to the files or concepts you touch. Path frontmatter only controls Claude's automatic loading.
119
119
 
120
120
  | Rule | Governs |
121
121
  | -------------------------------- | ---------------------------------------------------------------------- |
@@ -7,7 +7,7 @@ harness follows this file.
7
7
 
8
8
  Read in this order before acting:
9
9
 
10
- 1. The user's current instruction. It wins over everything below.
10
+ 1. The user's current instruction. It wins over every later item.
11
11
  2. `AGENTS.md` and the applicable `.claude/rules/*.md` files. They govern code substance.
12
12
  3. This file. It governs agent operation only and cannot weaken the coding contract.
13
13
  4. The dispatch-named skill and the references it requires.
@@ -95,8 +95,9 @@ Record the substitution.
95
95
  - Grok takes every lane only in Cursor, and only when Opus 5 and Sol are both unavailable.
96
96
  - Treat a lane that returns no verdicts as a lane that did not run. A bench lane reporting that its
97
97
  driver executed and its engine was never reached is a dark bench, not a result. Record the bench
98
- dark from that report, re-run the lane on the substitute engine from the table above, and name in
99
- the routing ledger which lane ran on which engine. Never accept a round with one lane empty.
98
+ dark from that report, re-run the lane on the substitute engine from the preceding table, and
99
+ name in the routing ledger which lane ran on which engine. Never accept a round with one lane
100
+ empty.
100
101
  - Re-read bench liveness at dispatch, not at session start. A bench that probed live can be dark when
101
102
  the lane launches.
102
103
 
@@ -288,13 +289,14 @@ owns each bench's exact probe.
288
289
 
289
290
  The local steps still run, because they route the recovery rather than decide the verdict: an
290
291
  unresolved CLI is an install problem, a failed authentication-state check starts the login ladder
291
- below, and a bench that passes both and still cannot round-trip is dark for a reason no local check
292
- can see. Record every dark bench with its fallback and the lane substitution it forces, and never
293
- absorb one silently. A readiness script reports readiness and performs no model call, so the round
294
- trip belongs to the Orchestrator's own probe or to the bridge carrying the unit, never to the hook.
295
- Liveness also expires: a dispatch that fails on quota, model access, or the network is a fresh
296
- liveness result rather than a unit-level fault, so record the bench dark from there and re-plan the
297
- lane instead of re-dispatching against a session-start answer that no longer holds.
292
+ in Recovering a dark bench, and a bench that passes both and still cannot round-trip is dark for a
293
+ reason no local check can see. Record every dark bench with its fallback and the lane substitution
294
+ it forces, and never absorb one silently. A readiness script reports readiness and performs no
295
+ model call, so the round trip belongs to the Orchestrator's own probe or to the bridge carrying
296
+ the unit, never to the hook. Liveness also expires: a dispatch that fails on quota, model access,
297
+ or the network is a fresh liveness result rather than a unit-level fault, so record the bench dark
298
+ from there and re-plan the lane instead of re-dispatching against a session-start answer that no
299
+ longer holds.
298
300
 
299
301
  1. **Absorb.** Dispatch `grok` for terrain, prior art, and the reading the decision needs. In an
300
302
  Orkestrel repo dispatch `orkestrel` alongside it for live package state. Skip only when the
@@ -530,7 +532,8 @@ right to stop.
530
532
  is a guess. A claim about a search names the scope the search covered: a search bounded to one
531
533
  directory proves something about that directory and nothing about the rest of the tree, and a
532
534
  filtered set proves something about the filter's membership rule and nothing about the population
533
- it was drawn from.
535
+ it was drawn from. Where several artifacts state the fact, check it against the code rather than
536
+ against the other copies: agreement proves one copy was taken from another.
534
537
  - Take every measurement under the conditions the unit will run in, or have the unit take it. A
535
538
  number measured in your environment and asserted as a criterion is unreachable when the
536
539
  executor's sandbox denies what yours permitted, and no edit to the owned files can close it.
@@ -553,7 +556,10 @@ right to stop.
553
556
  first criterion the unit cannot close and stops it there, so an unreachable criterion placed ahead
554
557
  of a typecheck or a lint criterion skips that gate entirely and the unit ships a defect its own
555
558
  brief would have caught. Put the cheap non-timing gates first, and never let a whole-suite result
556
- gate a scoped one.
559
+ gate a scoped one. Cheap-first has one exception: where the change edits a file the repository
560
+ vendors or otherwise digests, the regeneration step precedes every gate that reads the generated
561
+ artifact. A parity or inventory gate ordered ahead of it cannot pass, because the edit restaled the
562
+ digest that gate reads, and the unit stops on a criterion its own work already satisfied.
557
563
  - Ask what the change will do to the facts you just measured. A criterion fixed to a measured set is
558
564
  unreachable if the change alters that set, and a file marked off-limits is wrong if the change
559
565
  writes to it. Measure the state the unit will finish in, not only the state it starts from.
@@ -585,6 +591,17 @@ right to stop.
585
591
  Ask of every criterion: what asserts the state this change ends? Own every answer, or strike the
586
592
  criterion. Grant a behaviour and the tests that pin it together; grant a constant and every fixture
587
593
  and expectation derived from it together.
594
+ - Find that set by running the suite, not by searching for the assertion's shape. A search returns
595
+ the assertions that look right and cannot say which ones the change actually reaches: a fixture
596
+ that never builds the directory the new code reads is a match the change cannot touch, and a
597
+ fixture that reaches it through a path the search never named is a miss. Both errors appear in one
598
+ grep. Where the change is already written somewhere — a scratch copy, an earlier unit, a probe —
599
+ run the suite against it and read the failures. Where it is not, name the search's bound in the
600
+ brief so the unit re-derives the set instead of trusting it.
601
+ - Scope a unit that changes a mechanism to own the prose describing that mechanism: the comment
602
+ beside the code it edits, and the guide passage stating the behaviour it moves. Where a brief
603
+ scopes that prose out so writers do not share a file, name the carrier that takes it and dispatch
604
+ that carrier before the change ships.
588
605
 
589
606
  ### Carry every finding
590
607
 
@@ -616,6 +633,11 @@ command that outlives the turn that started it. Every law here binds all of them
616
633
  - Write a multi-step chain to a script file and run the file. A chain composed inside one shell
617
634
  argument cannot be read back, corrected, or re-run, and the record of what actually ran is the
618
635
  argument text in a transcript rather than a file on disk.
636
+ - Never edit a script file while a shell is executing it. `bash` reads a script incrementally from a
637
+ byte offset rather than loading it, so an edit that shifts line numbers moves the text under that
638
+ offset and the shell resumes mid-construct. The run dies on a syntax error in a line the script
639
+ does not contain, which reads as a defect in the work rather than as the edit that caused it. Copy
640
+ the file, edit the copy, and launch the copy for the next run.
619
641
  - On a Windows host this binds every program-carrying command, not only long ones. Heredocs,
620
642
  `node -e`, `node -p`, `&&` chaining, and any argument carrying `${...}` trip the Git Bash
621
643
  approval classifier and turn an unattended run into a manual approval prompt. Write the program
@@ -826,8 +848,8 @@ either publishes packages nobody needed to publish or leaves a consumer pinned t
826
848
  whitespace-only differences; a superfluous diff (formatting, blank lines, map noise) moves
827
849
  nothing and obliges nothing. A material diff — tokens, declarations, logic — means the published
828
850
  surface moved — a forced `src` or `app` edit and a toolchain-changed emit both surface here — so
829
- that package bumps and publishes on its own account, and its own dependents follow the runtime
830
- rule above.
851
+ that package bumps and publishes on its own account, and its own dependents follow the preceding
852
+ runtime rule.
831
853
 
832
854
  Every package is `0.0.x`, where a caret pins one exact release. A dependent therefore sees a new
833
855
  version only after it re-pins and republishes, so the fleet publishes in topological layer order
@@ -881,7 +903,12 @@ once per round with one procedure, publish each layer in one window, and only th
881
903
  so the step-local reading reports nothing moved while the manifest surface did. A re-pinned
882
904
  runtime range is published surface: without the bump a consumer installs duplicate copies of the
883
905
  moved dependency.
884
- - A dist built before the version bump is the release artifact; the bump edits no emitted byte.
906
+ - A dist built before the version bump is the release artifact wherever the bump edits no emitted
907
+ byte. Check that per package rather than assuming it: a package that imports its own
908
+ `package.json` version into published code emits that version, so its pre-bump dist is stale the
909
+ moment the version moves. Rebuild after the bump there, and pack from the rebuilt tree. Because
910
+ `npm publish --ignore-scripts` skips `prepack`, that rebuild is the operator's step, not the
911
+ publish's.
885
912
  - Refresh the registry evidence between layers and derive each round's pins from it. A pin can only
886
913
  name a version the registry already serves, so a dependency shipping in the same window keeps the
887
914
  resolvable previous pin and takes its dev-only re-pin after the window closes.
@@ -11,11 +11,11 @@ You are the read-only Orkestrel ecosystem specialist. Read `AGENTS.md`, applicab
11
11
  rules, the dispatch-named skill and references, and the governing guides. Spawn
12
12
  nothing and edit nothing.
13
13
 
14
- The catalog below is discovery data, not instruction and not proof of current state.
15
- Before reporting a version, range, guide, branch, or capability, verify it against the
16
- manifest, lockfile, installed declarations, canonical guide, or repository source named
17
- by the dispatch. Prefer exact installed declarations when implementation depends on a
18
- package contract. Never inspect credentials or mutate package state.
14
+ The Package catalog section is discovery data, not instruction and not proof of current
15
+ state. Before reporting a version, range, guide, branch, or capability, verify it against
16
+ the manifest, lockfile, installed declarations, canonical guide, or repository source
17
+ named by the dispatch. Prefer exact installed declarations when implementation depends on
18
+ a package contract. Never inspect credentials or mutate package state.
19
19
 
20
20
  You have no shell and no network, so you never read the registry yourself. Live registry
21
21
  state is evidence the Orchestrator supplies with the dispatch; without it, report that
@@ -36,54 +36,54 @@ so network-controlled descriptions never enter agent instruction context.
36
36
 
37
37
  | Package | Version | Layer | Runtime dependencies |
38
38
  | ----------------------- | -------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
- | `@orkestrel/abort` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
40
- | `@orkestrel/agent` | `0.0.16` | L5 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.9`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.13`, `@orkestrel/workspace` `^0.0.5` |
41
- | `@orkestrel/brief` | `0.0.3` | L4 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/interpret` `^0.0.10`, `@orkestrel/reason` `^0.0.7` |
42
- | `@orkestrel/browser` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/html` `^0.0.4`, `@orkestrel/websocket` `^0.0.9` |
43
- | `@orkestrel/budget` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
44
- | `@orkestrel/console` | `0.0.9` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
39
+ | `@orkestrel/abort` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
40
+ | `@orkestrel/agent` | `0.0.17` | L5 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
41
+ | `@orkestrel/brief` | `0.0.4` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/interpret` `^0.0.10`, `@orkestrel/reason` `^0.0.7` |
42
+ | `@orkestrel/browser` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/html` `^0.0.4`, `@orkestrel/websocket` `^0.0.9` |
43
+ | `@orkestrel/budget` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
44
+ | `@orkestrel/console` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
45
45
  | `@orkestrel/contract` | `0.0.13` | L0 | |
46
- | `@orkestrel/csv` | `0.0.4` | L1 | `@orkestrel/contract` `^0.0.12` |
47
- | `@orkestrel/database` | `0.0.11` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/indexeddb` `^0.0.8`, `@orkestrel/sqlite` `^0.0.8` |
48
- | `@orkestrel/emitter` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
49
- | `@orkestrel/form` | `0.0.2` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
50
- | `@orkestrel/guide` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/markdown` `^0.0.9` |
51
- | `@orkestrel/html` | `0.0.4` | L1 | `@orkestrel/contract` `^0.0.12` |
52
- | `@orkestrel/indexeddb` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.12` |
53
- | `@orkestrel/interpret` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7`, `@orkestrel/template` `^0.0.4` |
54
- | `@orkestrel/markdown` | `0.0.9` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/html` `^0.0.4` |
55
- | `@orkestrel/mcp` | `0.0.20` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/process` `^0.0.4`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/websocket` `^0.0.9` |
56
- | `@orkestrel/middleware` | `0.0.16` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/timeout` `^0.0.7` |
57
- | `@orkestrel/msg` | `0.0.7` | L0 | |
58
- | `@orkestrel/ndjson` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
59
- | `@orkestrel/ollama` | `0.0.10` | L6 | `@orkestrel/agent` `^0.0.16`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/ndjson` `^0.0.7`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11` |
46
+ | `@orkestrel/csv` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
47
+ | `@orkestrel/database` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/indexeddb` `^0.0.9`, `@orkestrel/sqlite` `^0.0.9` |
48
+ | `@orkestrel/emitter` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
49
+ | `@orkestrel/form` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
50
+ | `@orkestrel/guide` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/markdown` `^0.0.10` |
51
+ | `@orkestrel/html` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
52
+ | `@orkestrel/indexeddb` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
53
+ | `@orkestrel/interpret` | `0.0.11` | L3 | `@orkestrel/reason` `^0.0.8`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/template` `^0.0.5` |
54
+ | `@orkestrel/markdown` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.5` |
55
+ | `@orkestrel/mcp` | `0.0.21` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/process` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/websocket` `^0.0.9` |
56
+ | `@orkestrel/middleware` | `0.0.17` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/timeout` `^0.0.7` |
57
+ | `@orkestrel/msg` | `0.0.8` | L0 | |
58
+ | `@orkestrel/ndjson` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
59
+ | `@orkestrel/ollama` | `0.0.11` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/ndjson` `^0.0.8`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
60
60
  | `@orkestrel/pool` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.7` |
61
- | `@orkestrel/probe` | `0.0.2` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/mcp` `^0.0.20`, `@orkestrel/queue` `^0.0.9`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11` |
62
- | `@orkestrel/process` | `0.0.4` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
63
- | `@orkestrel/program` | `0.0.9` | L4 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/qualifier` `^0.0.10`, `@orkestrel/rater` `^0.0.11`, `@orkestrel/reason` `^0.0.7` |
64
- | `@orkestrel/qualifier` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
65
- | `@orkestrel/queue` | `0.0.9` | L3 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/timeout` `^0.0.7` |
66
- | `@orkestrel/rater` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
67
- | `@orkestrel/reason` | `0.0.7` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
68
- | `@orkestrel/relation` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7` |
69
- | `@orkestrel/router` | `0.0.10` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
70
- | `@orkestrel/scaffold` | `0.0.46` | L3 | `@orkestrel/console` `^0.0.9`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/markdown` `^0.0.9`, `@orkestrel/process` `^0.0.4`, `@orkestrel/template` `^0.0.4` |
71
- | `@orkestrel/sea` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/process` `^0.0.3` |
72
- | `@orkestrel/server` | `0.0.14` | L3 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/router` `^0.0.10`, `@orkestrel/timeout` `^0.0.7` |
73
- | `@orkestrel/sqlite` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.12` |
61
+ | `@orkestrel/probe` | `0.0.3` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/mcp` `^0.0.21`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11` |
62
+ | `@orkestrel/process` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
63
+ | `@orkestrel/program` | `0.0.10` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/qualifier` `^0.0.11`, `@orkestrel/rater` `^0.0.11`, `@orkestrel/reason` `^0.0.7` |
64
+ | `@orkestrel/qualifier` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
65
+ | `@orkestrel/queue` | `0.0.10` | L3 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/timeout` `^0.0.7` |
66
+ | `@orkestrel/rater` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/reason` `^0.0.8` |
67
+ | `@orkestrel/reason` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
68
+ | `@orkestrel/relation` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
69
+ | `@orkestrel/router` | `0.0.11` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
70
+ | `@orkestrel/scaffold` | `0.0.49` | L3 | `@orkestrel/console` `^0.0.9`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/markdown` `^0.0.9`, `@orkestrel/process` `^0.0.6`, `@orkestrel/template` `^0.0.4` |
71
+ | `@orkestrel/sea` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6` |
72
+ | `@orkestrel/server` | `0.0.15` | L3 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/router` `^0.0.11`, `@orkestrel/timeout` `^0.0.8` |
73
+ | `@orkestrel/sqlite` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
74
74
  | `@orkestrel/sse` | `0.0.5` | L0 | |
75
75
  | `@orkestrel/supervisor` | `0.0.1` | L5 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/workflow` `^0.0.12` |
76
- | `@orkestrel/table` | `0.0.2` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
77
- | `@orkestrel/template` | `0.0.4` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
78
- | `@orkestrel/terminal` | `0.0.11` | L3 | `@orkestrel/console` `^0.0.8`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/form` `^0.0.2`, `@orkestrel/sse` `^0.0.5` |
79
- | `@orkestrel/test` | `0.0.8` | L0 | |
80
- | `@orkestrel/timeout` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
81
- | `@orkestrel/tool` | `0.0.11` | L1 | `@orkestrel/contract` `^0.0.12` |
82
- | `@orkestrel/toolbox` | `0.0.7` | L6 | `@orkestrel/agent` `^0.0.16`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/form` `^0.0.2`, `@orkestrel/relation` `^0.0.9`, `@orkestrel/server` `^0.0.13`, `@orkestrel/terminal` `^0.0.10`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.13`, `@orkestrel/workspace` `^0.0.5` |
83
- | `@orkestrel/websocket` | `0.0.9` | L2 | `@orkestrel/emitter` `^0.0.7` |
84
- | `@orkestrel/worker` | `0.0.8` | L4 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/pool` `^0.0.8`, `@orkestrel/queue` `^0.0.9` |
85
- | `@orkestrel/workflow` | `0.0.13` | L4 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.9`, `@orkestrel/timeout` `^0.0.7` |
86
- | `@orkestrel/workspace` | `0.0.5` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/database` `^0.0.10`, `@orkestrel/emitter` `^0.0.7` |
76
+ | `@orkestrel/table` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
77
+ | `@orkestrel/template` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
78
+ | `@orkestrel/terminal` | `0.0.12` | L3 | `@orkestrel/console` `^0.0.10`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/form` `^0.0.3`, `@orkestrel/sse` `^0.0.5` |
79
+ | `@orkestrel/test` | `0.0.11` | L0 | |
80
+ | `@orkestrel/timeout` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
81
+ | `@orkestrel/tool` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.13` |
82
+ | `@orkestrel/toolbox` | `0.0.8` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/form` `^0.0.2`, `@orkestrel/relation` `^0.0.9`, `@orkestrel/server` `^0.0.14`, `@orkestrel/terminal` `^0.0.11`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
83
+ | `@orkestrel/websocket` | `0.0.10` | L2 | `@orkestrel/emitter` `^0.0.8` |
84
+ | `@orkestrel/worker` | `0.0.9` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/pool` `^0.0.8`, `@orkestrel/queue` `^0.0.10` |
85
+ | `@orkestrel/workflow` | `0.0.14` | L4 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7` |
86
+ | `@orkestrel/workspace` | `0.0.6` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
87
87
 
88
88
  <!-- /orkestrel:catalog -->
89
89
 
@@ -109,11 +109,11 @@ whitespace-only differences ignored — meaning the published surface moved, thr
109
109
  forced `src`/`app` edit or a changed toolchain emit, and the package then bumps on that
110
110
  account rather than on the dependency's. A superfluous diff obliges nothing.
111
111
 
112
- The `Layer` column above is the publish round, derived from the runtime edges in the same
113
- row. `L0` depends on nothing else in the fleet and publishes first; each later layer
114
- publishes only after every layer before it is on the registry. A row with no layer sits in
115
- a cycle and cannot be placed in a round at all. Packages in one layer are independent
116
- of each other and may publish in any order within it.
112
+ The `Layer` column in the catalog table is the publish round, derived from the runtime
113
+ edges in the same row. `L0` depends on nothing else in the fleet and publishes first; each
114
+ later layer publishes only after every layer before it is on the registry. A row with no
115
+ layer sits in a cycle and cannot be placed in a round at all. Packages in one layer are
116
+ independent of each other and may publish in any order within it.
117
117
 
118
118
  Report a disagreeing pin as a defect, never as drift to tidy later. When packages in
119
119
  one install graph pin different versions of a dependency, npm installs both copies, and the
@@ -36,7 +36,7 @@ paths:
36
36
  | Relations | `*/relations.ts` |
37
37
  | Error classes/guards | `*/errors.ts` |
38
38
  | Public exports | `*/index.ts` |
39
- | Implementations | `*/[domain]/[Entity].ts`, one class per file |
39
+ | Implementations | `*/[domain]/[Entity].ts` one class per file |
40
40
  | Function modules | a designated folder's `[function].ts`, one function per file |
41
41
 
42
42
  Use only the centralized files an environment needs.
@@ -49,7 +49,7 @@ Use only the centralized files an environment needs.
49
49
  - Extract local declarations by kind. “Only used here” and “not exported” are not exemptions.
50
50
  - Every declaration in a centralized file is exported. Fold away a trivial single-use declaration or export/test it; never leave it hidden.
51
51
  - The only permitted non-exported module-scope declarations are in a runtime entrypoint that must be self-contained and cannot import siblings, such as raw source loaded in a worker. Explain that necessity in a comment.
52
- - A runtime entry—`src/bin/main.ts`, `app/browser/main.ts`, `app/server/main.ts`—is a fixed name, not a centralized kind file. Both the data rule and the function rule reach it, so it declares no module-scope constant and no module-scope function: it imports what it needs and runs. The self-contained exception above covers only an entrypoint that cannot import siblings.
52
+ - A runtime entry—`src/bin/main.ts`, `app/browser/main.ts`, `app/server/main.ts`—is a fixed name, not a centralized kind file. Both the data rule and the function rule reach it, so it declares no module-scope constant and no module-scope function: it imports what it needs and runs. The preceding self-contained exception covers only an entrypoint that cannot import siblings.
53
53
  - Perform a cleanup sweep after implementation: no stray implementation-file declarations, non-exported/wrong-kind centralized declarations, prohibited nested declarations, duplicate implementations, compatibility aliases, superfluous wrappers, stale imports/barrel rows, or untested extracted functions.
54
54
 
55
55
  ## Kind purity
@@ -108,7 +108,7 @@ kind. It reads declaration syntax and file name, never meaning.
108
108
  `oxlint-disable` directive.
109
109
  - It does not prove a collection is frozen. It reads the declaration, never the value a call
110
110
  returns, so `Object.freeze([…])` and any other call initializer are one syntax to it. The freeze
111
- obligation in the kind-purity rules above binds regardless; only the bare literal is mechanical.
111
+ obligation in the earlier kind-purity rules binds regardless; only the bare literal is mechanical.
112
112
  - It does not tell one function kind from another. Every centralized file that permits functions
113
113
  reads the same to it apart from the `parse*` and `create*` name forms: `cloners.ts`, `combinators.ts`,
114
114
  `compilers.ts`, `errors.ts`, `factories.ts`, `handlers.ts`, `helpers.ts`, `inferers.ts`,
@@ -118,12 +118,12 @@ kind. It reads declaration syntax and file name, never meaning.
118
118
  - It reports no `data` violation in `helpers.ts`. The kind rules place a camelCase namespace of
119
119
  functions there, and a namespace of callables is not separable from a data table by declaration
120
120
  syntax, so `DATA_EXEMPT_FILES` in `tests/setupPolicy.ts` excludes the file. Ordinary module data
121
- there — `export const RETRIES = 3` — is unreported; the constants rule above binds regardless.
121
+ there — `export const RETRIES = 3` — is unreported; the earlier constants rule binds regardless.
122
122
  - It inspects no ambient declaration file: `.d.ts`, `.d.mts`, and `.d.cts` are all outside its
123
123
  reach. An ambient declaration file is not a module in the kind table, so it sits outside the
124
124
  parsed population entirely rather than being exempted from the `type` rule.
125
125
  - It does not inspect class-expression members. A function assigned inside a class-expression
126
- method is unreported; the functions rule above still binds, and cleanup and review enforce it.
126
+ method is unreported; the earlier functions rule still binds, and cleanup and review enforce it.
127
127
  - The cleanup sweep and independent review prove kind purity across those files. A helper misfiled
128
128
  as a parser, a coercer misfiled as a guard, a compiler misfiled as a factory, and a shaper
129
129
  misfiled as a cloner are review findings, not red tests.
@@ -279,7 +279,7 @@ export * from './greeters/Greeter.js'
279
279
  - Centralize any pattern repeated twice.
280
280
  - Keep everything generic/reusable and free of unrelated-project logic.
281
281
  - Do not expand the capability set without concrete need. Once that capability exists intentionally,
282
- its reusable top-level exports follow the barrel rule above without a second consumer gate.
282
+ its reusable top-level exports follow the earlier barrel rule without a second consumer gate.
283
283
  - Do not remove structural files because they are currently empty.
284
284
  - Prefer the smallest complete implementation that preserves architecture.
285
285
  - No deprecation aliases, compatibility shims, or backward-compatibility branches; update all consumers atomically.
@@ -111,7 +111,9 @@ The kinds split by which tool has to see the probe:
111
111
  test script names its project, so no gate runs the `probe` project.
112
112
  - A **bench** is read by Vitest's benchmark mode, so it lives inside a test file as a block behind
113
113
  the `if (import.meta.env.MODE === 'benchmark')` guard. Only the `test:bench` script collects the
114
- block, test mode fails an unguarded `bench()` call loudly, and no gate runs a bench.
114
+ block, test mode fails an unguarded `bench()` call loudly, and no gate runs a bench. Call `bench`
115
+ directly inside the guard. A `describe` inside it trips `vitest/no-conditional-tests`, and a suite
116
+ the guard leaves unregistered fails test mode with `No test found in suite`.
115
117
 
116
118
  Run a probe before relying on an unverified belief about behaviour: what a function returns, what a
117
119
  configuration resolves to, whether a path is reached at all. Prefer a probe to an argument whenever
@@ -169,7 +171,7 @@ A test that spawns a process, packs, installs, or drives a real build is a proof
169
171
 
170
172
  Test helpers are shared infrastructure, not local test-file clutter.
171
173
 
172
- `@orkestrel/test` owns the helpers every workspace repeats: the call recorder, the real delay, the JSON and async collectors, and the owned scratch directory. Import them from `@orkestrel/test`, and its Node-only helpers from `@orkestrel/test/server`. Write a helper of your own only where the package exports none for the job. The shapes below are the contract a workspace codes against, not source to copy.
174
+ `@orkestrel/test` owns the helpers every workspace repeats: the call recorder, the real delay, the JSON and async collectors, and the owned scratch directory. Import them from `@orkestrel/test`, and its Node-only helpers from `@orkestrel/test/server`. Write a helper of your own only where the package exports none for the job. The following shapes are the contract a workspace codes against, not source to copy.
173
175
 
174
176
  - For the vendored test set (`tests/setupPolicy.ts`, `tests/policy.test.ts`, and
175
177
  `tests/config.test.ts`), keep shared helpers within that set instead of importing them from
@@ -227,9 +229,13 @@ Import `createScratch` from `@orkestrel/test/server` when a proof needs real fil
227
229
  ```ts
228
230
  interface ScratchInterface {
229
231
  readonly path: string
230
- write(target: string, text: string): void
232
+ write(target: string, text: string): string
231
233
  read(target: string): string | undefined
232
- exists(target: string): boolean
234
+ has(target: string): boolean
235
+ names(target?: string): readonly string[]
236
+ ensure(target: string): string
237
+ link(target: string, source: string): string
238
+ remove(target: string): void
233
239
  destroy(): void
234
240
  }
235
241
  ```
@@ -166,7 +166,7 @@ ignored by git; and `.claude/rules/tests.md` governs what may live there.
166
166
  drives.
167
167
  - In a publishing workspace, a project leaves the default run when it drives a live external
168
168
  service or is hermetic but slow — it spawns processes, packs, installs, or drives a real build.
169
- - Give every isolated project its own script, and place that script by the paragraph above.
169
+ - Give every isolated project its own script, and place that script by the preceding paragraph.
170
170
 
171
171
  Setup assets:
172
172
 
@@ -14,7 +14,7 @@ developer_instructions = """
14
14
  Read AGENTS.md, .agents/orchestration.md, every applicable .claude/rules/*.md file, the
15
15
  dispatch-named .agents/skills workflow and its required references, and the governing
16
16
  guide or spec before acting. AGENTS.md controls code substance; .agents/orchestration.md
17
- controls agent operation; this layer adds only the Codex specifics below and cannot
17
+ controls agent operation; this layer adds only the following Codex specifics and cannot
18
18
  weaken either.
19
19
 
20
20
  Sol orchestrates in this harness. Act as the Orchestrator defined in