@orkestrel/scaffold 0.0.108 → 0.0.109

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 (157) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +326 -91
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +110 -14
  3. package/dist/agents/skills/orkestrel-dispatch/scripts/chain.js +280 -0
  4. package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +188 -26
  5. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +142 -43
  6. package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +240 -62
  7. package/dist/agents/skills/orkestrel-dispatch/scripts/patch.js +323 -0
  8. package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +169 -32
  9. package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +290 -69
  10. package/dist/agents/skills/orkestrel-falsify/scripts/mutate.js +560 -0
  11. package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +1052 -205
  12. package/dist/agents/skills/orkestrel-harden/scripts/measure.js +361 -0
  13. package/dist/agents/skills/orkestrel-harden/scripts/titles.js +455 -80
  14. package/dist/agents/skills/orkestrel-parallel/scripts/cases.js +327 -0
  15. package/dist/agents/skills/orkestrel-publish/scripts/compare.js +298 -51
  16. package/dist/agents/skills/orkestrel-publish/scripts/pins.js +170 -13
  17. package/dist/agents/skills/orkestrel-publish/scripts/swap.js +956 -191
  18. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +707 -112
  19. package/dist/agents/skills/orkestrel-publish/scripts/window.js +235 -41
  20. package/dist/agents/skills/orkestrel-scout/scripts/map.js +341 -54
  21. package/dist/agents/templates/brief.md +1 -1
  22. package/dist/bin/main.js +51 -46
  23. package/dist/bin/main.js.map +1 -1
  24. package/dist/host/AGENTS.md +23 -21
  25. package/dist/host/agents/orchestration.md +43 -18
  26. package/dist/host/agents/platforms/windows.md +3 -3
  27. package/dist/host/agents/skills/orkestrel-align/SKILL.md +10 -13
  28. package/dist/host/agents/skills/orkestrel-align/references/fleet.md +4 -10
  29. package/dist/host/agents/skills/orkestrel-align/references/integration.md +1 -1
  30. package/dist/host/agents/skills/orkestrel-build/SKILL.md +16 -48
  31. package/dist/host/agents/skills/orkestrel-build/agents/openai.yaml +1 -1
  32. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +19 -16
  33. package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +1 -1
  34. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +15 -28
  35. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +5 -6
  36. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +4 -6
  37. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +31 -20
  38. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +3 -4
  39. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +366 -75
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +126 -16
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/chain.ts +323 -0
  42. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +220 -31
  43. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +176 -33
  44. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +294 -59
  45. package/dist/host/agents/skills/orkestrel-dispatch/scripts/patch.ts +401 -0
  46. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +199 -34
  47. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +330 -69
  48. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +10 -8
  49. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +1 -5
  50. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  51. package/dist/host/agents/skills/orkestrel-falsify/scripts/mutate.ts +701 -0
  52. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +16 -12
  53. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +23 -81
  54. package/dist/host/agents/skills/orkestrel-harden/references/centralization.md +4 -5
  55. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -0
  56. package/dist/host/agents/skills/orkestrel-harden/references/document.md +33 -0
  57. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +6 -3
  58. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +8 -4
  59. package/dist/host/agents/skills/orkestrel-harden/references/research.md +2 -0
  60. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +1272 -279
  61. package/dist/host/agents/skills/orkestrel-harden/scripts/measure.ts +425 -0
  62. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +603 -98
  63. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +75 -98
  64. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +54 -17
  65. package/dist/host/agents/skills/orkestrel-journey/references/decide.md +1 -20
  66. package/dist/host/agents/skills/orkestrel-journey/references/layer.md +21 -31
  67. package/dist/host/agents/skills/orkestrel-journey/references/styles.md +1 -1
  68. package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +28 -24
  69. package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +15 -13
  70. package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +1 -0
  71. package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +13 -13
  72. package/dist/host/agents/skills/orkestrel-parallel/scripts/cases.ts +389 -0
  73. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +16 -20
  74. package/dist/host/agents/skills/orkestrel-polish/references/capture-harness.md +16 -26
  75. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +12 -26
  76. package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +2 -2
  77. package/dist/host/agents/skills/orkestrel-publish/references/adopt.md +23 -0
  78. package/dist/host/agents/skills/orkestrel-publish/references/release.md +4 -4
  79. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +10 -9
  80. package/dist/host/agents/skills/orkestrel-publish/references/window.md +20 -25
  81. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +348 -59
  82. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +202 -22
  83. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +1061 -191
  84. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +812 -140
  85. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +280 -38
  86. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +3 -3
  87. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +428 -70
  88. package/dist/host/agents/templates/brief.md +1 -1
  89. package/dist/host/agents/transports/claude-cli.md +3 -3
  90. package/dist/host/agents/transports/codex.md +2 -7
  91. package/dist/host/agents/transports/cursor.md +2 -3
  92. package/dist/host/claude/AGENTS.md +2 -2
  93. package/dist/host/claude/agents/analyst.md +3 -3
  94. package/dist/host/claude/agents/astra.md +3 -3
  95. package/dist/host/claude/agents/builder.md +1 -1
  96. package/dist/host/claude/agents/checker.md +1 -1
  97. package/dist/host/claude/agents/distiller.md +1 -1
  98. package/dist/host/claude/agents/grok.md +1 -1
  99. package/dist/host/claude/agents/opus.md +2 -2
  100. package/dist/host/claude/agents/orkestrel.md +57 -90
  101. package/dist/host/claude/agents/researcher.md +1 -1
  102. package/dist/host/claude/agents/reviewer.md +4 -0
  103. package/dist/host/claude/agents/scout.md +1 -1
  104. package/dist/host/claude/agents/verifier.md +1 -1
  105. package/dist/host/claude/rules/application.md +14 -21
  106. package/dist/host/claude/rules/architecture.md +34 -44
  107. package/dist/host/claude/rules/browser.md +3 -4
  108. package/dist/host/claude/rules/campaign.md +2 -2
  109. package/dist/host/claude/rules/documentation.md +25 -12
  110. package/dist/host/claude/rules/names.md +9 -4
  111. package/dist/host/claude/rules/patterns.md +6 -7
  112. package/dist/host/claude/rules/portability.md +1 -1
  113. package/dist/host/claude/rules/quality.md +4 -5
  114. package/dist/host/claude/rules/styles.md +2 -2
  115. package/dist/host/claude/rules/tests.md +57 -114
  116. package/dist/host/claude/rules/typescript.md +7 -9
  117. package/dist/host/claude/rules/workspace.md +21 -19
  118. package/dist/host/claude/rules/writing.md +2 -5
  119. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +1 -1
  120. package/dist/host/claude/skills/orkestrel-harden/SKILL.md +1 -1
  121. package/dist/host/claude/skills/orkestrel-publish/SKILL.md +1 -1
  122. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +1 -1
  123. package/dist/host/codex/agents/analyst.toml +9 -3
  124. package/dist/host/codex/agents/astra.toml +3 -4
  125. package/dist/host/codex/agents/builder.toml +1 -1
  126. package/dist/host/codex/agents/opus.toml +3 -4
  127. package/dist/host/codex/agents/orkestrel.toml +1 -1
  128. package/dist/host/codex/agents/researcher.toml +2 -2
  129. package/dist/host/codex/agents/verifier.toml +1 -1
  130. package/dist/host/configs/helpers.ts +21 -1
  131. package/dist/host/configs/policy.ts +299 -15
  132. package/dist/host/dotfiles/oxlintrc.json +137 -3
  133. package/dist/host/guides/agent.md +111 -134
  134. package/dist/host/guides/capture.md +801 -0
  135. package/dist/host/guides/probe.md +27 -8
  136. package/dist/host/guides/scaffold.md +96 -18
  137. package/dist/host/guides/study.md +534 -440
  138. package/dist/host/guides/test.md +111 -44
  139. package/dist/host/manifest.json +160 -240
  140. package/dist/host/tests/config.test.ts +971 -187
  141. package/dist/host/tests/policy.test.ts +127 -1
  142. package/dist/host/tests/setupPolicy.ts +893 -33
  143. package/dist/src/core/index.cjs +214 -86
  144. package/dist/src/core/index.cjs.map +1 -1
  145. package/dist/src/core/index.d.cts +122 -38
  146. package/dist/src/core/index.d.ts +122 -38
  147. package/dist/src/core/index.js +209 -85
  148. package/dist/src/core/index.js.map +1 -1
  149. package/dist/src/server/index.cjs +20 -27
  150. package/dist/src/server/index.cjs.map +1 -1
  151. package/dist/src/server/index.js +21 -28
  152. package/dist/src/server/index.js.map +1 -1
  153. package/package.json +11 -11
  154. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +0 -283
  155. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +0 -25
  156. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +0 -333
  157. package/dist/host/guides/supervisor.md +0 -4890
@@ -8,6 +8,8 @@ paths:
8
8
 
9
9
  # Testing rules
10
10
 
11
+ These rules govern what a test asserts and where it lives, the cross-cutting and expensive proofs, probes, shared test infrastructure, browser tests, and runner configuration. `.claude/rules/quality.md` § Instruments chooses the instrument for a question.
12
+
11
13
  ## Test contract
12
14
 
13
15
  - Mirror module/application structure:
@@ -42,30 +44,15 @@ paths:
42
44
  - Assert a runtime-chosen result as the property it must have, not as the number one run produced. Compression, timing, and buffer sizing are the runtime's choice, so pin the relationship the test depends on — that the encoded form is larger, that the second call is faster — and let the assertion fail when the input drifts out of the range where that relationship holds.
43
45
  - Measure an elapsed interval with `performance.now()`, never `Date.now()`. `Date.now()` returns whole milliseconds, so an interval built from two of its readings truncates at both ends and can under-report by a millisecond — enough to fail a boundary assertion against a timer that behaved correctly. `performance.now()` is monotonic and sub-millisecond, and it does not move when the wall clock does.
44
46
  - Give a conditional skip the mechanism that makes it inapplicable, cited, not the platform name alone. A test skipped on a platform is a test nobody re-examines; a test skipped because a named API rejects a named case is one anybody can re-check.
45
- - A regression test records the exact command and its failing count before the fix, and the same command's passing count after.
46
47
  - The revert that proves a repair reddens exactly the test that names the defect. Keep the import and collection graph valid while reverting, and confirm the named test was collected. A revert that reddens anything beyond that test broke the harness, and its count is not evidence.
47
- - Use `it.todo()` only for explicitly out-of-scope roadmap work, never to complete the current request. Every `.skip` or conditional skip has a narrow verifiable applicability reason.
48
+ - Use `it.todo()` only for explicitly out-of-scope roadmap work, never to complete the current request. Every conditional skip has a narrow verifiable applicability reason. Never commit `.only` or `.skip`; `vitest/no-focused-tests` and `vitest/no-disabled-tests` refuse both.
48
49
  - Do not create test files solely for `constants.ts`, barrels, error definitions, or `types.ts`.
49
- - Run the narrowest relevant Vitest project during development; do not run the entire suite casually.
50
50
 
51
51
  ## Cross-cutting proofs
52
52
 
53
53
  A proof that covers the workspace instead of one module has a fixed location, so no package invents
54
- its own:
55
-
56
- | Path | Proves |
57
- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
58
- | `tests/policy.test.ts` | The path- and text-shaped policy laws: mirrors, suppressions, the rule map, filenames, manifest scripts, skills, and bridges |
59
- | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them |
60
- | `tests/guides.test.ts` | Every documented API exists, every public API is documented, every compared summary, example, and pitch equals its source, and every executable fence returns what the guide says it returns |
61
- | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks |
62
- | `tests/tree.test.ts` | The laws this package states about its own real tree, such as the module closure a project may reach, that no vendored proof carries |
63
- | `tests/agents/**/*.test.ts` | Each skill script does what its `SKILL.md` states, driven as a child process against a scratch fixture from its mirrored proof; the scaffold checkout alone carries them |
64
- | `tests/studies/**/*.test.ts` | Evaluations of the workspace's consumer study code under `studies/`, run through bounded subprocesses and protocol fixtures; the `test:studies` script is their gate |
65
- | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports |
66
- | `tests/integration.test.ts` | The package's features work together end to end across environments |
67
- | `tests/setup*.test.ts` | Reusable behavior exported from sibling `tests/setup*.ts` modules works as the workspace's suites require |
68
- | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real |
54
+ its own. `.claude/rules/workspace.md` § Test project matrix lists each location with its project,
55
+ what it proves, and its gate.
69
56
 
70
57
  - Put `tests/setupBrowser.test.ts` and `tests/setupStyles.test.ts` in the browser-enabled
71
58
  `setup:browser` project. Put every other root `tests/setup*.test.ts` proof in the Node `setup`
@@ -75,7 +62,6 @@ its own:
75
62
  - Put an assertion about the package's real tree that no vendored proof carries in
76
63
  `tests/tree.test.ts`, driving the exported `tests/setup*.ts` helper that reads the tree, and keep
77
64
  that helper's own proof over fixtures in its `tests/setup*.test.ts` file.
78
- - `.claude/rules/workspace.md` names the Vitest project each location belongs to.
79
65
  - The `guides` project runs in Node with the browser disabled. Its subject is what the guide
80
66
  claims: that every documented name resolves, and that every fence asserting a value returns
81
67
  that value. A proof that renders a component and compares it against a definition is a
@@ -125,22 +111,23 @@ The kinds split by which tool has to see the probe:
125
111
  - A **runtime probe** is collected by a Vitest project, so it lives in `tmp/probes/` and runs through
126
112
  the `probe` project. `tmp/` is ignored by git, so no probe enters a commit by accident, and every
127
113
  test script names its project, so no gate runs the `probe` project.
128
- - A **bench** is read by Vitest's benchmark mode, so it lives inside a test file as a block behind
129
- the `if (import.meta.env.MODE === 'benchmark')` guard. Only the `test:bench` script collects the
130
- block, test mode fails an unguarded `bench()` call loudly, and no gate runs a bench. Call `bench`
131
- directly inside the guard. A `describe` inside it trips `vitest/no-conditional-tests`, and a suite
132
- the guard leaves unregistered fails test mode with `No test found in suite`.
114
+ - For a **bench**, write a `*.bench.ts` file under `tests/` or `tmp/probes/` and run `test:bench`.
115
+ Register a regular `test` or `it` callback with its context's `bench` fixture. With Vitest 5,
116
+ call `await bench(name, options, fn).run()` for one measurement or await `bench.compare(...)`
117
+ for a comparison. Pass options before the function. Keep benchmark files outside ordinary
118
+ `*.test.ts` includes and every gate. Use the script's explicit `--mode benchmark` when reading
119
+ `import.meta.env.MODE`; do not infer that mode from the `vitest bench` command alone.
133
120
 
134
121
  Run a probe before relying on an unverified belief about behaviour: what a function returns, what a
135
122
  configuration resolves to, whether a path is reached at all. Prefer a probe to an argument whenever
136
123
  the probe is cheap.
137
124
 
138
- When the question is whether the difference between methods is worth having, write a guarded bench
139
- block beside the probe test, run the `test:bench` script, and size its fixtures, declare its
125
+ When the question is whether the difference between methods is worth having, write a `*.bench.ts`
126
+ file beside the probe test, run the `test:bench` script, and size its fixtures, declare its
140
127
  threshold, and read its result per `.claude/rules/quality.md` § Performance. A settled difference
141
128
  that underwrites an implementation choice promotes with its test into the mirrored suite and keeps
142
- its guarded block there while that choice stands. A deterministic relationship promotes as an
143
- ordinary assertion, so delete the block. Never commit baseline output.
129
+ its benchmark file there while that choice stands. A deterministic relationship promotes as an
130
+ ordinary assertion, so delete the benchmark file. Never commit baseline output.
144
131
 
145
132
  These rules bind every probe:
146
133
 
@@ -176,6 +163,14 @@ A test that spawns a process, packs, installs, or drives a real build is a proof
176
163
  `.claude/rules/workspace.md` fixes which gate each isolated project runs from, and that placement
177
164
  differs between a publishing and a `private: true` workspace.
178
165
  - The fixed expensive-proof projects are `distribution`, `service`, and `studies`.
166
+ - Put in `studies` only the proofs the `@orkestrel/study` engine drives. A slow end-to-end proof of
167
+ the package's own features that no study engine drives, such as its built executable run against
168
+ a fixture workspace, is an integration test under § Cross-cutting proofs. Place it by the scope it
169
+ composes:
170
+ - Put a proof that crosses environments in `tests/integration.test.ts`, which the `integration`
171
+ project runs from `test`.
172
+ - Put a proof that stays within one environment in that environment's `integration.test.ts`.
173
+ - Set its budget with the suite's `timeout` option.
179
174
  - A `distribution` proof reads `import.meta.env.MODE` and fails, rather than skips, on an unreachable
180
175
  registry under `--mode release`. The publish gate invokes it that way, so a proof that skips there
181
176
  passes the gate without ever proving the artifact installs. An ordinary local run may still skip.
@@ -186,7 +181,7 @@ A test that spawns a process, packs, installs, or drives a real build is a proof
186
181
 
187
182
  Test helpers are shared infrastructure, not local test-file clutter.
188
183
 
189
- `@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`. Before declaring a helper in a `tests/setup*.ts` module, read the installed surface — `guides/test.md` § Surface in the scaffold checkout, or the package's own declaration under `node_modules` — and declare only what no export does. A setup-module export whose name or job matches an installed export is a defect, whichever file declared it first. The following shapes are the contract a workspace codes against, not source to copy.
184
+ `@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`. Before declaring a helper in a `tests/setup*.ts` module, read the installed surface — `guides/test.md` § Surface in the scaffold checkout, or the package's own declaration under `node_modules` — and declare only what no export does. A setup-module export whose name or job matches an installed export is a defect, whichever file declared it first. `guides/test.md` § Surface holds the signatures; the following sections state how to use them.
190
185
 
191
186
  - For the test modules scaffold owns, keep shared helpers within them instead of importing them
192
187
  from `@orkestrel/test`. In the vendored set (`tests/setupPolicy.ts`, `tests/policy.test.ts`, and
@@ -198,7 +193,7 @@ Test helpers are shared infrastructure, not local test-file clutter.
198
193
  - Extract a fixture, recorder, event factory, async wait, renderer, scenario/data builder, protocol fixture, or DOM builder as soon as it could serve another test.
199
194
  - Any duplicate or near-duplicate helper is a defect; consolidate it into one general form.
200
195
  - Export every reusable helper, fixture type, factory, constant, and guard from setup files.
201
- - A setup file owns everything an assertion needs and nothing an assertion is: `describe`, `it`, and `expect` never appear in a `setup*.ts`.
196
+ - A setup file owns everything an assertion needs and nothing an assertion is: `describe`, `it`, `test`, and `expect` never appear in a `setup*.ts`; lint refuses their import from `vitest` there.
202
197
  - Data tables and case matrices belong in a setup file at any size; test registration does not.
203
198
  - Test files import shared infrastructure rather than declaring local fixture factories.
204
199
  - Never reimplement a framework helper in tests or fixtures; import the real parser, signer, flattener, or other helper.
@@ -207,9 +202,9 @@ Test helpers are shared infrastructure, not local test-file clutter.
207
202
 
208
203
  Place helpers by environment:
209
204
 
210
- - `tests/setup.ts`: host-independent; no `node:*`, DOM, `window`, or Vue.
205
+ - `tests/setup.ts`: host-independent; no `node:*`, DOM, `window`, or Vue. Lint refuses a `node:` or Vue import there.
211
206
  - `tests/setupServer.ts`: Node-only helpers and `node:fs` loaders anchored to `WORKSPACE_ROOT`.
212
- - `tests/setupBrowser.ts`: DOM/Vue/browser helpers and setup CSS.
207
+ - `tests/setupBrowser.ts`: DOM/Vue/browser helpers and setup CSS. Lint refuses a `node:` import here and in `tests/setupStyles.ts`.
213
208
  - `tests/setupStyles.ts`: the CSSOM and sheet helpers `.claude/rules/styles.md` places there; a
214
209
  sheet-face project loads it after `tests/setupBrowser.ts` when the target has the file.
215
210
  - `tests/setupStudy.ts`: the harness module the study tests import and, in a study-engine package,
@@ -222,38 +217,17 @@ Place helpers by environment:
222
217
  registers one `it` per case row. Put a package-specific distribution helper in
223
218
  `tests/setupServer.ts`, because `repair` replaces every edit to the harness.
224
219
 
225
- Never rename or remove an export of `tests/setupDistribution.ts` that an emitted proof imports, an
226
- interface member that proof reads, or the `./setupDistribution.js` specifier it imports from,
227
- because no verb rewrites a proof a target holds. Add a name or member beside a frozen one instead.
228
- The proof scaffold 0.0.104 emits freezes `createDistributionSuite`, `buildDistributionCases`, and
229
- `checkDistributionBrowser`; the `start`, `read`, and `destroy` members of
230
- `DistributionSuiteInterface`; the `label` and `observe` members of `DistributionCase`; the `actual`
231
- and `expected` members of `DistributionObservation`; the `entries` member of `DistributionStage`;
232
- and the `browsable` and `subpath` members of `DistributionEntry`. When a release changes the
233
- emitted proof, add its variants under that release's key in the `DISTRIBUTION_PROOF_TEXTS` fixture
234
- of the scaffold checkout's `tests/setupServer.ts`, drive them against the harness, and never edit a
235
- released key.
220
+ In the `@orkestrel/scaffold` checkout, never rename or remove an export of
221
+ `tests/setupDistribution.ts` that an emitted proof imports, an interface member that proof reads, or
222
+ the `./setupDistribution.js` specifier it imports from, because no verb rewrites a proof a target holds. Add a name or member beside a frozen one instead.
236
223
 
237
224
  ### Recorder
238
225
 
239
- Import `createRecorder` from `@orkestrel/test` instead of a framework spy when only calls and arguments matter. It returns:
240
-
241
- ```ts
242
- interface RecorderInterface<TArgs extends readonly unknown[]> {
243
- readonly calls: readonly TArgs[]
244
- readonly count: number
245
- readonly handler: (...args: TArgs) => void
246
- clear(): void
247
- }
248
- ```
226
+ Import `createRecorder` from `@orkestrel/test` instead of a framework spy when only calls and arguments matter.
249
227
 
250
228
  ### Delay
251
229
 
252
- Import `waitForDelay` from `@orkestrel/test`; never repeat an inline timeout promise. It waits for one host timer and defaults to `0`:
253
-
254
- ```ts
255
- function waitForDelay(ms?: number): Promise<void>
256
- ```
230
+ Import `waitForDelay` from `@orkestrel/test`; never repeat an inline timeout promise.
257
231
 
258
232
  Use it to yield, never to wait for something another process produces. A fixed delay chosen to
259
233
  outlast a child's startup is a race whose loss looks like a product defect: the test measures
@@ -268,46 +242,11 @@ Import `waitForCondition`, `waitForEvent`, `waitForAbort`, and `retryUntil` from
268
242
  event in a test or a setup module is a defect: `waitForCondition` owns the poll, `waitForEvent`
269
243
  the deferred on an event, and `waitForAbort` the deferred on a signal. A guide fence transcribed
270
244
  byte for byte into `tests/guides.test.ts` is the consumer's code and stays as the guide shows it.
271
- Each timed wait takes a `description` the timeout error names and `WaitOptions` (`budget`,
272
- `interval`, `signal`):
273
-
274
- ```ts
275
- function waitForCondition(
276
- description: string,
277
- condition: () => boolean | Promise<boolean>,
278
- options?: WaitOptions,
279
- ): Promise<void>
280
- function waitForEvent<TArgs extends readonly unknown[]>(
281
- subscribe: EventSubscriber<TArgs>,
282
- description: string,
283
- options?: WaitOptions,
284
- ): Promise<TArgs>
285
- function waitForAbort(signal: AbortSignal): Promise<void>
286
- function retryUntil<T>(
287
- description: string,
288
- produce: () => T | Promise<T>,
289
- satisfied: (value: T) => boolean,
290
- options?: RetryOptions,
291
- ): Promise<T>
292
- ```
245
+ Give each timed wait a `description` the timeout error names.
293
246
 
294
247
  ### Scratch
295
248
 
296
- Import `createScratch` from `@orkestrel/test/server` when a proof needs real files. It allocates a temporary directory it owns, keeps every path inside that directory, and removes the directory on `destroy`:
297
-
298
- ```ts
299
- interface ScratchInterface {
300
- readonly path: string
301
- write(target: string, text: string): string
302
- read(target: string): string | undefined
303
- has(target: string): boolean
304
- names(target?: string): readonly string[]
305
- ensure(target: string): string
306
- link(target: string, source: string): string
307
- remove(target: string): void
308
- destroy(): void
309
- }
310
- ```
249
+ Import `createScratch` from `@orkestrel/test/server` when a proof needs real files, and call `destroy` on it.
311
250
 
312
251
  ### Style primitives
313
252
 
@@ -331,6 +270,27 @@ Use the real browser as the system under test:
331
270
  - Do not assert private state, internal timers, or framework scheduler internals.
332
271
  - Prefer real short timers and observable wakeups. Never replace the host clock.
333
272
 
273
+ ### Journey tests
274
+
275
+ A journey test drives the application as a person does, through only what a person can see and reach:
276
+
277
+ - Resolve every interactive target by its ARIA role and accessible name as rendered. Never reach into a component instance, a store, a transport, a copied credential, or a test-only hook to make a step succeed. A step the interface cannot perform is a finding about the interface.
278
+ - Assert the rendered text a person reads, which is `innerText`: a label under `text-uppercase` asserts as `TRACE` where the source says `Trace`. An entity state read can corroborate a perception assertion and never replaces it.
279
+ - Assert what the interface withholds. Assert each refusal through the resolver's exact failure voice, and distinguish an absent control from a present but unreachable one.
280
+ - Keep transport and persistence proofs in their own declared block, never in a journey. Assert every live or asynchronous fact by convergence, polling until it contains or equals, never by an identity read of one frame. A poll's predicate must be able to go false-to-true after the action it observes.
281
+ - Commit a value through an act a person performs: `pressKeys('{Enter}')` on the focused control, a Tab away, or a named button. A screen that commits on a timer, on an unpredictable event, or only after work the person cannot observe is a screen finding; never work around it in the test layer.
282
+ - Type only what a person would. Inputs no person would type belong to the transport family and the parser suites. Type keystroke by keystroke where the keystrokes are the subject, and fill in one operation where the text is only a payload the person pastes.
283
+ - Perform every interaction step unconditionally. Never gate a step on whether its control exists or is reachable, and never branch a journey on `readRefusal`: a guarded step passes whether or not the control was there.
284
+ - Import every journey verb, reader, wait, and fixture builder from `@orkestrel/test/browser`, and every host-independent wait and table type from `@orkestrel/test`. Send every key sequence through `pressKeys`, and never reach past it to the provider's keyboard function.
285
+ - Enter through the real entry: mount the shipped root component with a real store and the route a person lands on.
286
+ - Reach each screen's own controls through forward Tab traversal in at least one journey.
287
+ - Assert the state the flow must reach, never the transient path taken to it.
288
+ - Assert the negative beside the positive whenever a value replaces another: name the arriving sentence and carry the replaced one as absent.
289
+ - Assert the state a control announces beside every drive that sets it, and on an unselected sibling.
290
+ - After a confirmed destructive action, assert through trusted input that focus landed on a visible, announced location.
291
+ - Assert the page's perception never matches the vocabulary the product does not speak: engine, schema, and implementation words the interface is supposed to translate.
292
+ - Report a bare accessible name that answers for more than one reachable element on one screen as a screen finding, and target through role or region until the screen is fixed.
293
+
334
294
  ## Runner configuration
335
295
 
336
296
  Keep Vitest/provider configuration minimal:
@@ -360,22 +320,5 @@ Coverage rules:
360
320
 
361
321
  ## Discovery and adequacy audit
362
322
 
363
- For a change the size gate in `AGENTS.md` § Work loop names medium or large, run
364
- `node .agents/skills/orkestrel-harden/scripts/discovery.ts` before acceptance for the census of
365
- projects, gates, collected files, and skip markers, then:
366
-
367
- - prove every intended test file is discovered by the correct project;
368
- - prove every declared project is reachable from a gate. A project registered in the root
369
- configuration with no script, or with a script no chain runs, is a proof that never executes — and
370
- because it never executes it never fails, so the suite reports green while carrying it. Read the
371
- chain, not the exit code: run each project directly once and compare that list against what `test`
372
- actually invokes. The gate that would report this gap is the gate that is missing.
373
- - prove a declared project's include resolves to a real file. An empty project is not a passing
374
- project: Vitest exits non-zero on "no test files found", so a project aimed at a path that was
375
- never created stays invisible until something finally runs it.
376
- - inspect actual test counts and environments;
377
- - audit `.todo`, `.skip`, conditional skips, retries, and inflated timeouts;
378
- - confirm each assertion would fail for the defect it claims to catch, and that it fails rather than passes when its population is empty;
379
- - confirm helpers do not reimplement production behavior;
380
- - confirm cleanup runs after setup or assertion failure;
381
- - confirm current-scope requirements have real tests rather than placeholders.
323
+ Before accepting a change the size gate in `AGENTS.md` § Work loop names medium or large, run the
324
+ audit in the `orkestrel-harden` skill's hardening reference, § Audit the tests themselves.
@@ -12,20 +12,18 @@ The non-negotiables and design laws in `AGENTS.md` apply without exception and a
12
12
  - Tabs for indentation.
13
13
  - No semicolons unless ASI requires one.
14
14
  - Single quotes.
15
- - Named exports only, except framework-required defaults.
16
15
  - ESM imports use explicit `.js` extensions for local TypeScript modules.
17
16
  - Place `import type` declarations before value imports.
18
17
  - Do not place blank lines between consecutive imports of the same kind.
19
18
  - Narrow an accepted `unknown` with a total guard rather than a conditional access.
20
19
  - A parameter property is a constructor parameter carrying any accessibility or `readonly` modifier.
21
- The ban reaches every form, `readonly` alone included; declare the `#` field and assign it in the
22
- constructor body.
20
+ Declare the `#` field and assign it in the constructor body.
23
21
 
24
22
  ## Types
25
23
 
26
24
  - Put every reusable or public interface/type alias in the nearest authoritative `*/types.ts`.
27
25
  - Public collection properties and return types use `readonly T[]`, `ReadonlyMap<K, V>`, or `ReadonlySet<T>`.
28
- - Optional state is `T | undefined`; an optional lookup failure returns `undefined`.
26
+ - Mark every property of an interface or of a type alias's object type `readonly`. The `policy/no-mutable-property` lint rule enforces it in `src/` and `app/` and leaves an inline parameter type alone.
29
27
  - `as const` annotates a literal with its own type and never overrides the checker, so the assertion
30
28
  ban does not reach it. Use it to derive a literal union from a value and to fix a tuple's arity and
31
29
  element types. Do not write it on a value whose contract is already declared; annotate the
@@ -39,14 +37,14 @@ The non-negotiables and design laws in `AGENTS.md` apply without exception and a
39
37
  - Never mutate caller-owned inputs.
40
38
  - Use copy-on-write for internal state.
41
39
  - Return copies or readonly views; never leak a mutable internal reference.
42
- - Compute derived facts instead of persisting duplicate state.
43
40
 
44
41
  ## Bindings
45
42
 
46
43
  - **Variables.** Never write a `let` or `var` declaration, at module scope, in a function, in a loop
47
44
  head, or in a test; declare each variable with the `const` keyword. Never assign to a parameter or
48
45
  a `catch` binding, whether by `=`, by a compound operator such as `+=` or `??=`, by `++` or `--`,
49
- or as a destructuring target.
46
+ or as a destructuring target. The lint rules `no-var`, `prefer-const`, `policy/no-let`,
47
+ `no-param-reassign`, and `no-ex-assign` enforce this bullet.
50
48
  - **Derivation.** Derive a value instead of accumulating it: write the expression that produces it
51
49
  (`some`, `every`, `find`, `filter`, `map`, `reduce`, a conditional expression), or extract a
52
50
  `{verb}{Noun}` helper that returns it. Build text from its parts with `join` or a template literal,
@@ -180,6 +178,8 @@ The non-negotiables and design laws in `AGENTS.md` apply without exception and a
180
178
  | Optional missing lookup | Return `undefined` |
181
179
  | Invalid input inside a guard | Return `false`; never throw |
182
180
 
181
+ Write a refusal message or a tool description an agent reads per `.claude/rules/documentation.md` § Agent-facing surfaces.
182
+
183
183
  Use the existing outcome contract from a declared dependency or the owning environment; do not redeclare it at each call site. When no such contract exists and adding a dependency is not authorized, define this once in the owning `types.ts`:
184
184
 
185
185
  ```ts
@@ -196,8 +196,7 @@ interface Failure<E> {
196
196
  type Result<T, E = Error> = Success<T> | Failure<E>
197
197
  ```
198
198
 
199
- - When `@orkestrel/contract` is declared, inspect and use its exact installed `Result`, construction/narrowing helpers, and `attempt` behavior instead of duplicating them.
200
- - Otherwise construct and narrow through the owning environment's centralized helpers.
199
+ - Construct and narrow a locally defined `Result` through the owning environment's centralized helpers.
201
200
  - Error classes expose a machine-readable `code` and optional `context`.
202
201
  - Every public error class ships with a guard such as `isAppError` for safe `catch` narrowing.
203
202
  Make the guard return true for a value that passes the brand and member checks the following
@@ -232,7 +231,6 @@ type Result<T, E = Error> = Success<T> | Failure<E>
232
231
 
233
232
  ## Comments and API documentation
234
233
 
235
- - Comments explain why, never restate what self-explanatory code does. The Writing rules in `AGENTS.md` and `.claude/rules/writing.md` govern their prose.
236
234
  - Every public export has TSDoc, because the package guide is built from it: a one-sentence summary; `@param`, `@returns`, or a thrown-error line only where the signature leaves the meaning open; and an `@example` of typical use, as short as it can be while still showing the call and its result.
237
235
  - The first sentence states what the symbol does in the third person with an `-s` verb — `Creates`,
238
236
  `Returns`, `Checks whether` — and never repeats the symbol's name.
@@ -166,21 +166,21 @@ environment axis is one project per src/app axis × environment, plus one per ex
166
166
  The workspace-proof axis is cross-cutting. Each proof covers the whole workspace rather than
167
167
  one environment, so each is its own project:
168
168
 
169
- | Project | Files | Proves | Gate |
170
- | ------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
171
- | `policy` | `tests/policy.test.ts` | The path- and text-shaped policy laws: mirrors, suppressions, the rule map, filenames, manifest scripts, skills, and bridges | `test` |
172
- | `config` | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs | `test` |
173
- | `setup` | `tests/setup*.test.ts` other than either `setup:browser` proof | Prove root setup behavior in Node with `setup.ts`. | `test` |
174
- | `setup:browser` | `tests/setupBrowser.test.ts`, `tests/setupStyles.test.ts` | Prove browser and style setup behavior in Playwright Chromium with `setup.ts` and `setupBrowser.ts`. | `test` |
175
- | `journey:<variant>` | `tests/app/<application>/integration.test.ts` | Drive the application the Vite mode selects at the declared variant viewport in Playwright Chromium with `setup.ts` and `setupBrowser.ts`. | `test` through the journey scripts |
176
- | `guides` | `tests/guides.test.ts` | Every documented API exists, every public API is documented, every compared summary, example, and pitch equals its source, and every executable fence returns what the guide says it returns | `test` |
177
- | `conformance` | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks | `test` |
178
- | `tree` | `tests/tree.test.ts` | The laws this package states about its own real tree that no vendored proof carries | `test` |
179
- | `skills` | `tests/agents/**/*.test.ts` | Each skill script under `.agents/skills/*/scripts/` does what its `SKILL.md` states, driven as a child process against a scratch fixture from its mirrored proof; `configs/agents/tsconfig.skills.json` selects the project | `test` |
180
- | `distribution` | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports | `prepublishOnly`; absent when private |
181
- | `integration` | `tests/integration.test.ts` | The package's features work together end to end across environments | `test` |
182
- | `service` | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real | `prepublishOnly`; `test` when private |
183
- | `studies` | `tests/studies/**/*.test.ts` | The consumer study proofs: installed packages driven through bounded subprocesses and protocol fixtures | `prepublishOnly`; `test` when private |
169
+ | Project | Files | Proves | Gate |
170
+ | ------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------- |
171
+ | `policy` | `tests/policy.test.ts` | The path- and text-shaped policy laws: mirrors, suppressions, the rule map, filenames, manifest scripts, skills, bridges, and text integrity | `test` |
172
+ | `config` | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them | `test` |
173
+ | `setup` | `tests/setup*.test.ts` other than either `setup:browser` proof | Prove root setup behavior in Node with `setup.ts`. | `test` |
174
+ | `setup:browser` | `tests/setupBrowser.test.ts`, `tests/setupStyles.test.ts` | Prove browser and style setup behavior in Playwright Chromium with `setup.ts` and `setupBrowser.ts`. | `test` |
175
+ | `journey:<variant>` | `tests/app/<application>/integration.test.ts` | Drive the application the Vite mode selects at the declared variant viewport in Playwright Chromium with `setup.ts` and `setupBrowser.ts`. | `test` through the journey scripts |
176
+ | `guides` | `tests/guides.test.ts` | Every documented API exists, every public API is documented, every compared summary, example, and pitch equals its source, and every executable fence returns what the guide says it returns | `test` |
177
+ | `conformance` | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks | `test` |
178
+ | `tree` | `tests/tree.test.ts` | The laws this package states about its own real tree that no vendored proof carries | `test` |
179
+ | `skills` | `tests/agents/**/*.test.ts` | Each skill script under `.agents/skills/*/scripts/` does what its `SKILL.md` states: its mirrored proof tests its exported functions and drives its command line as a child process against a scratch fixture; the census controls hold each hit fixture of `bindings.md` to its signatures; `configs/agents/tsconfig.skills.json` selects the project | `test` |
180
+ | `distribution` | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports | `prepublishOnly`; absent when private |
181
+ | `integration` | `tests/integration.test.ts` | The package's features work together end to end across environments | `test` |
182
+ | `service` | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real | `prepublishOnly`; `test` when private |
183
+ | `studies` | `tests/studies/**/*.test.ts` | The study proofs the `@orkestrel/study` engine drives: installed packages run through bounded subprocesses and protocol fixtures; an end-to-end proof no study engine drives is an integration test | `prepublishOnly`; `test` when private |
184
184
 
185
185
  - Define the Node `setup` project when `global` selects its seeded proof or a root file matches
186
186
  `tests/setup*.test.ts`, exact-case, other than `tests/setupBrowser.test.ts` and
@@ -198,9 +198,10 @@ one environment, so each is its own project:
198
198
  module as their `globalSetup` option, and give no other project a global setup.
199
199
  - When a browser application selects the journey axis, register `journey:<variant>` projects
200
200
  through the birth-owned `configs/app/vite.journey.config.ts` wrapper. Keep the adopter's variant
201
- list there and compose each project through the root `appJourney(variant, variants, mode?)`
201
+ list there and compose each project through the root `appJourney(variant, variants, mode?, override?)`
202
202
  factory, which resolves the Vite mode to `browser` or an app-side browser extension and collects
203
- `tests/app/<application>/integration.test.ts` for that application. Exclude each collected suite
203
+ `tests/app/<application>/integration.test.ts` for that application. The factory merges its
204
+ `override` last, through `mergeOverride`, so an override replaces nothing it does not name. Exclude each collected suite
204
205
  from its application project, and run `test:journey` and one `test:journey:<framework>` per
205
206
  app-side browser extension after the application projects in `test`.
206
207
 
@@ -326,7 +327,7 @@ Build/check config alignment:
326
327
  - Node build targets derive from the package's declared supported runtime. Keep `engines`, bundler targets, scoped configs, tests, and documentation aligned; never hard-code one Node version line-wide.
327
328
  - Browser framework: the `vue` extension where selected.
328
329
 
329
- Policy instruments:
330
+ ### Policy instruments
330
331
 
331
332
  - Put every rule of the policy law in exactly one instrument. `configs/policy.ts` — the
332
333
  oxlint plugin, namespace `policy` — takes the rules a single file's AST decides. The policy sweep
@@ -360,6 +361,7 @@ Policy instruments:
360
361
  ## Text integrity
361
362
 
362
363
  - Store text as UTF-8.
363
- - Before accepting broad generated or migrated edits, scan changed text for replacement characters, mojibake, unintended control characters, and accidental trailing debris.
364
+ - The policy sweep refuses, over the authored Markdown, the files the suppression sweep reads, and the files `POLICY_TEXT_GLOB` names, a file that does not decode as UTF-8, a replacement character, a byte-order mark, and a C0 or C1 control character other than tab, line feed, and carriage return. Write such a character as a `\u` escape when a literal needs it.
365
+ - Before accepting broad generated or migrated edits, read the changed text for mojibake and accidental trailing debris, which the sweep leaves to a reader.
364
366
  - Preserve intentional Unicode punctuation and symbols; do not “clean” valid text merely because it is non-ASCII.
365
367
  - Never renormalize Unicode while rewriting a file. Retyping a line can silently fold a decomposed sequence into its precomposed form — `e` + U+0301 becoming U+00E9 — and the two render identically, so the diff reads as a no-op and review sees nothing. Where the exact code points are the subject, as in an encoding or transport proof, that fold deletes the case the test exists for while leaving it green and named. Move such a line rather than retyping it, and compare bytes with `od -c` or a code-point dump rather than by eye.
@@ -1,9 +1,6 @@
1
1
  # Writing rules
2
2
 
3
- `AGENTS.md` § Writing governs every reply. This file adds what developer prose, comments, and instruction files decide.
4
-
5
- - Write comments, TSDoc, and guide prose once, after types, tests, and implementation are final, and keep them minimal. Prose written earlier is wrong by the time the implementation settles.
6
- - Never revise, review, or gate prose while the implementation can still change.
3
+ `AGENTS.md` § Writing governs every reply, and `AGENTS.md` § Work loop orders prose after the final implementation. This file adds what developer prose, comments, and instruction files decide.
7
4
 
8
5
  ## Voice
9
6
 
@@ -100,4 +97,4 @@ Replace each term with its replacement. A code identifier, an API name, and a st
100
97
  - `policy/no-banned-term` reads comments and the prose sweep in `tests/setupPolicy.ts` reads authored Markdown; each matches the rows banned unconditionally. Rule a hit in `now`, `new`, `latest`, `once`, `since`, `above`, `below`, `master`, `hostile`, `adversarial`, `attack`, `break`, `forge`, `bypass`, `poison`, `escape`, `exploit`, or `payload` yourself by the banned sense.
101
98
  - Sweep case-insensitively and across inflections. Name the pattern and the paths behind every sweep result.
102
99
  - Write singular `they` for a person of unstated gender.
103
- - `.claude/rules/names.md` § Fixed lifecycle vocabulary owns `execute`, `abort`, `kill`, `terminate`, and `run`.
100
+ - `.claude/rules/names.md` § Fixed lifecycle vocabulary owns `abort` and `execute`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: orkestrel-dispatch
3
3
  description: >-
4
- Dispatch one unit of work to a native subagent or an external bench and bring its result back: write the brief, probe the bench, launch under a cap, watch liveness, read the report, check its citations, accept, and delete the launch copies. Use when `.agents/orchestration.md` routes work to a role, when a bench lane (Grok, Astra, or Opus through the Claude CLI) is needed, or when a command will outlive the turn that starts it.
4
+ Dispatch one unit of work to a native subagent or an external bench and bring its result back: write the brief, probe the bench, launch under a cap, watch liveness, read the report, check its citations, accept, and delete the launch copies. Use when `.agents/orchestration.md` routes work to a role, when a bench lane is needed, or when a command will outlive the turn that starts it.
5
5
  ---
6
6
 
7
7
  # Load the canonical workflow
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orkestrel-harden
3
- description: Research, audit, refactor, implement, centralize, test, document, and locally verify an individual Orkestrel TypeScript package to enterprise-grade production readiness under the repository's current AGENTS.md. Use when asked to fill missing or deferred capabilities, compare upstream or legacy implementations, salvage prior art, centralize source or test declarations, eliminate nested functions or superfluous wrappers, maximize declared @orkestrel dependencies—especially @orkestrel/contract—or add rigorous real-implementation and live-service tests. Select only the phases required by a narrow request; run the full workflow for production readiness or comprehensive hardening.
3
+ description: Research, audit, refactor, implement, centralize, test, document, and locally verify an individual Orkestrel TypeScript package to enterprise-grade production readiness under the repository's current AGENTS.md. Use when asked to fill missing or deferred capabilities, compare upstream or legacy implementations, salvage prior art, centralize source or test declarations, eliminate nested functions or superfluous wrappers, maximize declared @orkestrel dependencies—especially @orkestrel/contract—or add rigorous real-implementation and live-service tests. Select only the phases required by a narrow request; run the full workflow for production readiness or comprehensive hardening. A guide, README, or TSDoc pass on one package runs the document phase alone.
4
4
  ---
5
5
 
6
6
  # Load the canonical workflow
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orkestrel-publish
3
- description: Run an Orkestrel release from layer order to registry confirmation. Use when the user asks to publish a package, to run a fleet-wide release wave, or to recover a release that stalled at the npm approval, and follow it for the per-repository visit, the bump ruling, the layer preparation, the login approval, and the five-minute upload window.
3
+ description: Run an Orkestrel release from layer order to registry confirmation, or adopt a published scaffold release in one consumer. Use when the user asks to publish a package, to run a fleet-wide release wave, to recover a release that stalled at the npm approval, or to adopt a published scaffold release in one repository, and follow it for the per-repository visit, the bump ruling, the layer preparation, the login approval, the upload approval, and the adoption.
4
4
  ---
5
5
 
6
6
  # Load the canonical workflow
@@ -6,6 +6,6 @@ description: >-
6
6
 
7
7
  # Load the canonical workflow
8
8
 
9
- Read `.agents/skills/orkestrel-scout/SKILL.md` completely and run the script it names. Follow that canonical workflow before acting.
9
+ Read `.agents/skills/orkestrel-scout/SKILL.md` completely. Follow that canonical workflow before acting.
10
10
 
11
11
  This bridge contains no independent process. `AGENTS.md`, applicable rules, the canonical skill, and the governing guide/spec remain authoritative in that order.
@@ -17,7 +17,13 @@ confirming a claim about a proof, name the mutation that would make the proof fa
17
17
  distinguish it. Rule a claim whose only evidence is the writer's report UNRESOLVED. Mark a
18
18
  rendered-surface claim the capture cannot show NOT-EVIDENCED.
19
19
 
20
- Return the orkestrel-falsify verdict shape: numbered verdicts with evidence, findings outside the
21
- claims, tested-and-held, one terminal line. Never edit, implement, reconcile, accept, or spawn.
22
- Your final message is the verdict.
20
+ For a falsify dispatch, return the orkestrel-falsify verdict shape: numbered verdicts with
21
+ evidence, findings outside the claims, tested-and-held, one terminal line. For a design
22
+ argument, work from the brief alone, never look for or reconcile the other lane's answer, and
23
+ return Design, Alternatives, Constraints (each with file:line), Refusals (options a rule
24
+ forecloses, rule quoted), Measurements, Units, Tensions, Risks; fill the sections your lane owns
25
+ and leave the others empty. A dispatch-named skill that fixes another shape wins.
26
+
27
+ Use a clean context; never review work you wrote. Never edit, implement, reconcile, accept, or
28
+ spawn. Your final message is the verdict or the proposal.
23
29
  """
@@ -8,13 +8,12 @@ Implement one dispatched unit and spawn nothing.
8
8
 
9
9
  Read the brief, AGENTS.md, the .claude/rules files whose paths match the owned files, the named
10
10
  skill, and the guide. Follow AGENTS.md § Work loop: types first, prove the claim with the prove
11
- tool, implement, test, consolidate, document. For a defect, record the failing command and count
12
- before the fix and the same command green after.
11
+ tool, implement, test, consolidate, document.
13
12
 
14
13
  Write only the owned files; return an exact patch for a shared file. Validate read-only and scoped:
15
14
  the touched project's check: script, the touched test file, then the touched project. Never run
16
- format, lint --fix, build, or the whole suite. Delete every probe before returning; promote a
17
- probe that settled a claim into a test.
15
+ format, lint --fix, build, or the whole suite. Leave no probe behind, per
16
+ .claude/rules/tests.md § Probes.
18
17
 
19
18
  Never add a dependency, suppress a diagnostic, mock project-owned behavior, leave a TODO in scope,
20
19
  commit, push, install, read a secret, or run a destructive command. Stop only per
@@ -10,7 +10,7 @@ Read the brief, the .claude/rules files whose paths match your owned files, and
10
10
  Write only the owned files; return an exact patch for a shared file. Follow AGENTS.md § Work loop
11
11
  at the size the brief names: edit, prove or test the claim, run the touched test file, then the
12
12
  touched project when the brief names it. Validate read-only and scoped: a non-fix lint on your paths, the
13
- scoped check: script, the touched tests; never run format, lint --fix, build, or the whole suite. Delete any probe you wrote before returning.
13
+ scoped check: script, the touched tests; never run format, lint --fix, build, or the whole suite. Leave no probe behind, per .claude/rules/tests.md § Probes.
14
14
 
15
15
  A unit that leaves naming, API shape, or architecture open, or that spans packages, belongs to
16
16
  astra or opus: stop and say so. Never install, commit, push, read a secret, or run a destructive command. Stop and report
@@ -8,13 +8,12 @@ Implement one dispatched subjective unit on GPT-6 Astra and spawn nothing.
8
8
 
9
9
  Read the brief, AGENTS.md, the rules whose paths match the owned files, the named skill, and the
10
10
  guide. Follow AGENTS.md § Work loop: types first, prove the claim with the prove tool, implement,
11
- test, consolidate, document. For a defect, record the failing command and count before the fix
12
- and the same command green after.
11
+ test, consolidate, document.
13
12
 
14
13
  Write only the owned files; return an exact patch for a shared file. Validate read-only and
15
14
  scoped: the touched project's check: script, the touched test file, then the touched project.
16
- Never run format, lint --fix, build, or the whole suite. Delete every probe before returning;
17
- promote a probe that settled a claim into a test. Finish the whole unit. Stop only per
15
+ Never run format, lint --fix, build, or the whole suite. Leave no probe behind, per
16
+ .claude/rules/tests.md § Probes. Finish the whole unit. Stop only per
18
17
  .agents/orchestration.md § Deviation protocol.
19
18
 
20
19
  Never add a dependency, suppress a diagnostic, mock project-owned behavior, leave a TODO in
@@ -1,7 +1,7 @@
1
1
  name = "orkestrel"
2
2
  description = "Read-only Orkestrel ecosystem reconciler: turns the evidence the dispatch supplies — manifests, lockfiles, installed declarations, guides, and registry readings — into package maps, dependency sequencing, blast radius, and drift findings. Collects no live state itself, and never treats the embedded catalog as live state."
3
3
  model = "gpt-6.1-sol"
4
- model_reasoning_effort = "medium"
4
+ model_reasoning_effort = "low"
5
5
  sandbox_mode = "read-only"
6
6
  developer_instructions = """
7
7
  Read .agents/orchestration.md first. It owns the role set, the routing, and the
@@ -11,6 +11,6 @@ installed declaration under node_modules. Read each source; never answer from me
11
11
  fact with its URL or file:line and the shortest supporting quote that carries the fact, never a
12
12
  passage. Put anything a primary source did not settle under Unknowns.
13
13
 
14
- Return only: Question, Facts (claim, source, date, quote), Matrix when asked (each row ending
15
- implement, repair, retain, or exclude with evidence), Unknowns. Never spawn another agent.
14
+ Return only: Question, Facts (claim, source, date, quote), Matrix when asked (capability or
15
+ defect rows, each with the evidence for and against it; the Orchestrator rules on each row), Unknowns. Never spawn another agent.
16
16
  """
@@ -1,7 +1,7 @@
1
1
  name = "verifier"
2
2
  description = "Independent gate runner that runs the exact commands the dispatch names, scoped first, and reports exit-code truth with exact failure excerpts without fixing anything."
3
3
  model = "gpt-6-luna"
4
- model_reasoning_effort = "medium"
4
+ model_reasoning_effort = "low"
5
5
  sandbox_mode = "workspace-write"
6
6
  developer_instructions = """
7
7
  Run the requested gates and report their results. Write only the evidence artifacts and the declared