@orkestrel/scaffold 0.0.107 → 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 (164) 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 +368 -27
  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 +26 -20
  25. package/dist/host/agents/orchestration.md +98 -58
  26. package/dist/host/agents/platforms/posix.md +15 -0
  27. package/dist/host/agents/platforms/windows.md +37 -0
  28. package/dist/host/agents/skills/orkestrel-align/SKILL.md +10 -13
  29. package/dist/host/agents/skills/orkestrel-align/references/fleet.md +4 -10
  30. package/dist/host/agents/skills/orkestrel-align/references/integration.md +1 -1
  31. package/dist/host/agents/skills/orkestrel-build/SKILL.md +16 -48
  32. package/dist/host/agents/skills/orkestrel-build/agents/openai.yaml +1 -1
  33. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +19 -16
  34. package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +1 -1
  35. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +15 -28
  36. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +5 -6
  37. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +12 -14
  38. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +36 -24
  39. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +14 -11
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +366 -75
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +126 -16
  42. package/dist/host/agents/skills/orkestrel-dispatch/scripts/chain.ts +323 -0
  43. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +220 -31
  44. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +176 -33
  45. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +294 -59
  46. package/dist/host/agents/skills/orkestrel-dispatch/scripts/patch.ts +401 -0
  47. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +199 -34
  48. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +428 -27
  49. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +10 -8
  50. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +1 -5
  51. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  52. package/dist/host/agents/skills/orkestrel-falsify/scripts/mutate.ts +701 -0
  53. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +16 -12
  54. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +23 -81
  55. package/dist/host/agents/skills/orkestrel-harden/references/centralization.md +4 -5
  56. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -0
  57. package/dist/host/agents/skills/orkestrel-harden/references/document.md +33 -0
  58. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +6 -3
  59. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +8 -4
  60. package/dist/host/agents/skills/orkestrel-harden/references/research.md +2 -0
  61. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +1272 -279
  62. package/dist/host/agents/skills/orkestrel-harden/scripts/measure.ts +425 -0
  63. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +603 -98
  64. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +75 -98
  65. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +54 -17
  66. package/dist/host/agents/skills/orkestrel-journey/references/decide.md +1 -20
  67. package/dist/host/agents/skills/orkestrel-journey/references/layer.md +21 -31
  68. package/dist/host/agents/skills/orkestrel-journey/references/styles.md +1 -1
  69. package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +91 -30
  70. package/dist/host/agents/skills/orkestrel-parallel/agents/openai.yaml +2 -2
  71. package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +34 -0
  72. package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +29 -0
  73. package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +29 -0
  74. package/dist/host/agents/skills/orkestrel-parallel/references/t3.md +31 -0
  75. package/dist/host/agents/skills/orkestrel-parallel/scripts/cases.ts +389 -0
  76. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +16 -20
  77. package/dist/host/agents/skills/orkestrel-polish/references/capture-harness.md +16 -26
  78. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +12 -26
  79. package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +2 -2
  80. package/dist/host/agents/skills/orkestrel-publish/references/adopt.md +23 -0
  81. package/dist/host/agents/skills/orkestrel-publish/references/release.md +4 -4
  82. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +12 -10
  83. package/dist/host/agents/skills/orkestrel-publish/references/window.md +20 -25
  84. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +348 -59
  85. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +202 -22
  86. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +1061 -191
  87. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +812 -140
  88. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +280 -38
  89. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +3 -3
  90. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +428 -70
  91. package/dist/host/agents/templates/brief.md +1 -1
  92. package/dist/host/agents/transports/claude-cli.md +3 -3
  93. package/dist/host/agents/transports/codex.md +3 -8
  94. package/dist/host/agents/transports/cursor.md +2 -3
  95. package/dist/host/claude/AGENTS.md +7 -10
  96. package/dist/host/claude/agents/analyst.md +3 -3
  97. package/dist/host/claude/agents/astra.md +3 -3
  98. package/dist/host/claude/agents/builder.md +1 -1
  99. package/dist/host/claude/agents/checker.md +1 -1
  100. package/dist/host/claude/agents/distiller.md +1 -1
  101. package/dist/host/claude/agents/grok.md +1 -1
  102. package/dist/host/claude/agents/opus.md +2 -2
  103. package/dist/host/claude/agents/orkestrel.md +57 -90
  104. package/dist/host/claude/agents/researcher.md +1 -1
  105. package/dist/host/claude/agents/reviewer.md +4 -0
  106. package/dist/host/claude/agents/scout.md +1 -1
  107. package/dist/host/claude/agents/verifier.md +1 -1
  108. package/dist/host/claude/rules/application.md +14 -21
  109. package/dist/host/claude/rules/architecture.md +34 -44
  110. package/dist/host/claude/rules/browser.md +3 -4
  111. package/dist/host/claude/rules/campaign.md +55 -0
  112. package/dist/host/claude/rules/documentation.md +26 -11
  113. package/dist/host/claude/rules/names.md +9 -4
  114. package/dist/host/claude/rules/patterns.md +6 -7
  115. package/dist/host/claude/rules/portability.md +2 -3
  116. package/dist/host/claude/rules/quality.md +4 -5
  117. package/dist/host/claude/rules/styles.md +2 -2
  118. package/dist/host/claude/rules/tests.md +57 -114
  119. package/dist/host/claude/rules/typescript.md +8 -10
  120. package/dist/host/claude/rules/workspace.md +21 -19
  121. package/dist/host/claude/rules/writing.md +3 -3
  122. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +1 -1
  123. package/dist/host/claude/skills/orkestrel-harden/SKILL.md +1 -1
  124. package/dist/host/claude/skills/orkestrel-parallel/SKILL.md +1 -1
  125. package/dist/host/claude/skills/orkestrel-publish/SKILL.md +1 -1
  126. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +1 -1
  127. package/dist/host/codex/agents/analyst.toml +9 -3
  128. package/dist/host/codex/agents/astra.toml +3 -4
  129. package/dist/host/codex/agents/builder.toml +1 -1
  130. package/dist/host/codex/agents/opus.toml +3 -4
  131. package/dist/host/codex/agents/orkestrel.toml +1 -1
  132. package/dist/host/codex/agents/researcher.toml +2 -2
  133. package/dist/host/codex/agents/verifier.toml +1 -1
  134. package/dist/host/codex/config.toml +3 -3
  135. package/dist/host/configs/helpers.ts +21 -1
  136. package/dist/host/configs/policy.ts +405 -16
  137. package/dist/host/cursor/rules/orchestration.mdc +1 -0
  138. package/dist/host/dotfiles/oxlintrc.json +141 -5
  139. package/dist/host/guides/agent.md +111 -134
  140. package/dist/host/guides/capture.md +801 -0
  141. package/dist/host/guides/probe.md +27 -8
  142. package/dist/host/guides/scaffold.md +152 -19
  143. package/dist/host/guides/study.md +534 -440
  144. package/dist/host/guides/test.md +111 -44
  145. package/dist/host/manifest.json +199 -242
  146. package/dist/host/tests/config.test.ts +1558 -219
  147. package/dist/host/tests/policy.test.ts +127 -1
  148. package/dist/host/tests/setupPolicy.ts +1389 -39
  149. package/dist/src/core/index.cjs +239 -87
  150. package/dist/src/core/index.cjs.map +1 -1
  151. package/dist/src/core/index.d.cts +123 -39
  152. package/dist/src/core/index.d.ts +123 -39
  153. package/dist/src/core/index.js +234 -86
  154. package/dist/src/core/index.js.map +1 -1
  155. package/dist/src/server/index.cjs +20 -27
  156. package/dist/src/server/index.cjs.map +1 -1
  157. package/dist/src/server/index.js +21 -28
  158. package/dist/src/server/index.js.map +1 -1
  159. package/package.json +11 -11
  160. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +0 -283
  161. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +0 -25
  162. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +0 -333
  163. package/dist/host/agents/skills/orkestrel-parallel/references/harnesses.md +0 -19
  164. package/dist/host/guides/supervisor.md +0 -4890
@@ -165,7 +165,7 @@ A `Shape` cell holds an interface's data members as bare names in braces, `?` ma
165
165
  `StageInterface.progress` is the seam a foreign coordinator reads to decide whose budget an expiry
166
166
  belongs to, and this is the proof behind it.
167
167
  [`RuntimeStage.test.ts`](../tests/src/server/stages/RuntimeStage.test.ts) proves the gauge boundary
168
- deterministically: it holds one inspection at the results cache with a FIFO, reads `progress`
168
+ deterministically on Vitest 4: it holds one inspection at the results cache with a FIFO, reads `progress`
169
169
  elevated while the caller's run is in flight, and reads it level with its pre-inspection value while
170
170
  the stage evicts.
171
171
  [`LintStage.test.ts`](../tests/src/server/stages/LintStage.test.ts) reads the same boundary at the
@@ -552,12 +552,31 @@ and proof waits for type readiness and the boot controls. See [Lifecycle](#lifec
552
552
  the gate only while probe and the gate read one installed copy of each tool.
553
553
 
554
554
  Declare `@orkestrel/probe` as a development dependency of the workspace it inspects. Its
555
- `typescript` and `vitest` tools are optional peers; probe resolves them and `oxlint` from that
556
- workspace when a direct probe is constructed or a server begins onset. The `oxlint`
557
- package carries no peer range because npm also resolves the peers of an optional peer: `oxlint`
558
- declares an optional `vite-plus` peer, `vite-plus` 1.0.0 depends on `vitest` 5, and npm 11.19.0
559
- refuses that conflict with the `vitest` peer range when it installs probe into an empty project
560
- (measured 2026-09-29).
555
+ `typescript` and `vitest` tools are optional peers, with ranges `^6.0.3 || ^7.0.2` and
556
+ `^4.1.12 || ^5.0.5`. Probe resolves them and `oxlint` from that workspace when a direct probe is
557
+ constructed or a server begins onset. Starting refuses TypeScript majors outside 6 and 7 before
558
+ a stage starts. Vue workspaces can retain TypeScript 6 while other workspaces use TypeScript 7.
559
+
560
+ The type stage resolves `tsc` through `typescript/package.json` and its `bin` field. It requires
561
+ neither an in-process compiler API nor an exported `typescript/bin/tsc` subpath. Printed diagnostics
562
+ decide its result, so the differing TypeScript 6 and 7 exit codes do not change a verdict. The
563
+ runtime stage uses the mode-first `createVitest` overload: Vitest 4.1.12 requires that form, and
564
+ Vitest 5.0.5 retains it as a deprecated overload. The `oxlint` package carries no peer range.
565
+
566
+ TypeScript 7's `--showConfig` can succeed with partial JSON for a malformed project. Before
567
+ returning a project's identity, the type stage therefore validates it with `--noEmit` unless
568
+ warming or an earlier unoverlaid check already validated it. Configuration diagnostics name the
569
+ caller’s project rather than the generated scratch configuration.
570
+
571
+ Runtime eviction removes the generated file from Vitest 4's results cache. Vitest 5 exposes no
572
+ per-file cache eviction API, so the stage calls its public `clearCache()` method after each run.
573
+ That call clears results, dependencies, and filesystem module caches. The per-file FIFO cleanup
574
+ instrument applies only to Vitest 4; the runner-retention test checks both versions for generated
575
+ specifications left in the results cache.
576
+
577
+ Vitest 4 installs its termination handlers synchronously; Vitest 5 installs them after resolving
578
+ configuration. Probe removes handlers registered within the factory's async context before signal
579
+ delivery and preserves handlers the host registers outside that context, including during warming.
561
580
 
562
581
  ## Registering the server
563
582
 
@@ -746,7 +765,7 @@ const claim: Claim = {
746
765
  const probe = new Probe({ workspace: process.cwd() })
747
766
  const verdict = await probe.prove(claim)
748
767
  verdict.digest // 'bdf03e5dfd6bd413ead671c7a2940fcf'
749
- verdict.receipt // 'probe:bdf03e5dfd6bd413ead671c7a2940fcf:type:typescript@6.0.3:oxlint@1.89.0:vitest@4.1.12:configs/src/tsconfig.core.json@434f59254d58cf2683d453a26bd0d837'
768
+ verdict.receipt?.startsWith(`probe:${verdict.digest}:type:`) // true
750
769
  await probe.destroy()
751
770
  ```
752
771
 
@@ -108,9 +108,10 @@ Exported from `@orkestrel/scaffold`, and reachable from
108
108
  | `Plan` | interface | Holds the compiled, ordered artifact list and the selection it covers. |
109
109
  | `PlanSummary` | interface | Represents the tally of one plan by artifact origin. |
110
110
  | `Question` | interface | Represents one validation issue raised against a blueprint or a plan. |
111
- | `Scaffolding` | interface | Represents the replayable outcome of one compile. |
111
+ | `CompileResult` | interface | Represents the replayable outcome of one compile. |
112
112
  | `SrcDefinition` | interface | Describes the build and export settings one published `src` environment contributes. |
113
113
  | `StylesExtension` | interface | Represents a named sheet face under `src/<name>`. |
114
+ | `ToolchainHold` | interface | Represents one foreign tool range required by a browser framework. |
114
115
  | `ViteMachinery` | interface | Names which host-specific pipelines a generated root Vite configuration carries. |
115
116
 
116
117
  #### Constants
@@ -123,16 +124,18 @@ Exported from `@orkestrel/scaffold`, and reachable from
123
124
  | `APP_SERVER_DEV_DEPENDENCIES` | const | Lists the development dependencies a private server application adds. |
124
125
  | `ARTIFACT_TEMPLATES` | const | Holds formatter-stable template text for source, test, document, guide, and service artifacts. |
125
126
  | `AXES` | const | Lists the axes a browser extension may occupy, frozen. |
126
- | `BASE_DEV_DEPENDENCIES` | const | Holds the tooling versions scaffold and every generated workspace share. |
127
+ | `BASE_DEV_DEPENDENCIES` | const | Holds the baseline tooling versions, before framework holds apply. |
127
128
  | `BIN_CONFIGS` | const | Lists the configuration files a workspace that ships its own executable adds, frozen. |
128
129
  | `BIN_ENTRY_PATH` | const | Names the executable entry whose presence makes a workspace `bin`. |
129
130
  | `BIN_OUTPUT_PATH` | const | Names the built executable a bin workspace's manifest command runs. |
130
131
  | `BROWSE_DEV_DEPENDENCIES` | const | Names the development dependency a browser or styles surface adds. |
131
132
  | `BROWSE_UPSTREAM` | const | Lists the packages `@orkestrel/browser` depends on at runtime, directly or transitively, frozen. |
133
+ | `CAPTURE_DEV_DEPENDENCIES` | const | Names the development dependency a browser application's journey axis adds. |
134
+ | `CAPTURE_UPSTREAM` | const | Lists the capture package and its fleet runtime dependency closure, frozen. |
132
135
  | `CANON_PATHS` | const | Lists the instruction-canon paths staged for reading rather than for a target, frozen. |
133
136
  | `CATALOG_AGENT_PATH` | const | Names the agent file whose marker-bounded package table the catalog verb alone owns. |
134
- | `CATALOG_CLOSING_MARKER` | const | Names the marker closing the package table inside `CATALOG_AGENT_PATH`. |
135
- | `CATALOG_OPENING_MARKER` | const | Names the marker opening the package table inside `CATALOG_AGENT_PATH`. |
137
+ | `CATALOG_END_MARKER` | const | Names the marker closing the package table inside `CATALOG_AGENT_PATH`. |
138
+ | `CATALOG_START_MARKER` | const | Names the marker opening the package table inside `CATALOG_AGENT_PATH`. |
136
139
  | `CONFIG_TEMPLATES` | const | Holds formatter-stable template text for every configuration artifact. |
137
140
  | `CONFORMANCE_TEST_PATH` | const | Names the official-tooling drift proof whose presence makes a workspace `conformance`. |
138
141
  | `CONTROL_CHARACTER_PATTERN` | const | Matches the Unicode controls, formatting controls, and line and paragraph separators rejected in text. |
@@ -203,6 +206,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
203
206
  | `TARGET_SKILL_NAMES` | const | Lists the package-facing skills a target receives pointers for, frozen and alphabetical. |
204
207
  | `THEMES_BARREL_PATH` | const | Names the themes stylesheet marker. |
205
208
  | `THEMES_ENTRY_PATH` | const | Names the themes build entry marker. |
209
+ | `TOOLCHAIN_HOLDS` | const | Holds foreign tool ranges required by selected browser frameworks, frozen. |
206
210
  | `TREE_TEST_PATH` | const | Names the real-tree proof whose presence makes a workspace `tree`. |
207
211
  | `VERSION_PATTERN` | const | Matches the exact `major.minor.patch` version syntax a blueprint declares. |
208
212
  | `WORKSPACE_DEV_ENGINES` | const | Holds the `devEngines` record every generated manifest carries. |
@@ -298,6 +302,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
298
302
  | `artifactsToQuestions` | function | Measures a drafted artifact list against the laws a whole plan decides. |
299
303
  | `blueprintToConfigArtifacts` | function | Compiles every artifact in the `configs` group. |
300
304
  | `blueprintToDevDependencies` | function | Projects a blueprint into the development dependencies its manifest declares. |
305
+ | `blueprintToToolchainHolds` | function | Projects a blueprint into the toolchain holds its browser frameworks require. |
301
306
  | `blueprintToDocumentArtifacts` | function | Compiles the generated workspace's root documentation. |
302
307
  | `blueprintToExports` | function | Projects published environments and sheets into the manifest export map. |
303
308
  | `blueprintToFaces` | function | Projects a blueprint into browser extensions restricted to occupied browser axes. |
@@ -661,7 +666,8 @@ answers a read and grant no verb write authority that it did not already have.
661
666
  `new --app browser` command selects the journey axis, creates its birth-owned wrapper, defines
662
667
  `appJourney` in the root configuration, and excludes the browser integration suite from
663
668
  `app:browser`. Its manifest declares `test:journey` and invokes it after `npm run test:app` in
664
- `test`. A selection without a browser application emits no journey axis. `--styles`, `--themes`,
669
+ `test`. It also declares `journey: capture journey` and `capture: capture frames` for explicit
670
+ scoped selections. A selection without a browser application emits no journey axis. `--styles`, `--themes`,
665
671
  `--showcase`, and `--extend` select the structural facts and the extensions, and Surfaces and extensions
666
672
  states what each emits and what each refuses. Creation leaves `setup` empty, and the remaining
667
673
  structural facts take no creation option. Add a root `tests/setup*.test.ts` proof for `setup`,
@@ -778,6 +784,15 @@ manifest and planned `vite.config.ts` conflict, and the option to exclude `confi
778
784
  A selection that excludes `configs` proceeds. An advisory alone does not make an aligned target
779
785
  drift.
780
786
 
787
+ The probe workbench separates ordinary probes from benchmarks by filename. `test:probe` collects
788
+ `tmp/probes/**/*.test.ts`. `test:bench` collects `tmp/probes/**/*.bench.ts` and `tests/**/*.bench.ts`
789
+ with the explicit `--mode benchmark` option. Neither script belongs to a gate. In a benchmark file,
790
+ register a regular `it` or `test` callback that receives the context's `bench` fixture. Await
791
+ `bench(name, options, fn).run()` or `bench.compare(...)`; options precede the benchmark function.
792
+ The filename keeps the benchmark out of ordinary test runs, so no mode guard is required. The
793
+ script supplies the `import.meta.env.MODE` marker explicitly rather than relying on the command's
794
+ default mode. See the [Vitest benchmark guide](https://vitest.dev/guide/benchmarking).
795
+
781
796
  A gate chain also reaches a sheet or framework face through `vitest run --config <wrapper>` when
782
797
  the wrapper path belongs to that face in the planned configuration; a build invocation does not.
783
798
 
@@ -809,6 +824,12 @@ section. A name carrying no colon has no family, and a family the section declar
809
824
  nothing to follow, so each of those is appended after the last declared script instead. `catalog`
810
825
  writes no script region; it names the ranges alone.
811
826
 
827
+ The browser application's journey axis adds `journey` and `capture`. Their generated commands,
828
+ `capture journey` and `capture frames`, have no predecessor forms in the accepted set. Missing
829
+ commands append; generated values remain writable; `replaceManifestScripts` preserves customized
830
+ values while repairing siblings independently, so a selected or wrapped `journey` command survives
831
+ repair. Neither scoped command replaces `test:journey` in the gate chain.
832
+
812
833
  The range region and the script region are not groups. `package.json` is birth-owned, so the
813
834
  `manifest` group creates it when a workspace is first materialized and never rewrites it afterwards,
814
835
  and `--groups` narrows the plan rather than the regions. `repair` and `overwrite` therefore
@@ -1109,7 +1130,10 @@ writes a suite, and a suite may drive a service the skeleton does not start.
1109
1130
  `studies` says the workspace holds at least one exact-case `*.test.ts` file beneath `tests/studies`,
1110
1131
  nested or direct, outside any `node_modules` or `.git` directory, which Vitest's default exclude
1111
1132
  never collects, and it alone registers the `studies` Vitest project over that directory and its
1112
- `test:studies` script. The project loads `tests/setup.ts` alone. The tests import
1133
+ `test:studies` script. The project holds only proofs the `@orkestrel/study` engine drives. An
1134
+ end-to-end proof that no study engine drives is an integration test instead. It goes in
1135
+ `tests/integration.test.ts` when it crosses environments.
1136
+ The project loads `tests/setup.ts` alone. The tests import
1113
1137
  `tests/setupStudy.ts`, a harness module the package owns, so scaffold plans no such file and no
1114
1138
  project loads it as a setup file. A publishing workspace invokes the project from `prepublishOnly`,
1115
1139
  after `npm test` and before the release proof; a `private: true` workspace invokes it from `test`,
@@ -1162,6 +1186,17 @@ reads `process.env.CAPTURE === '1'` for that boolean. The generated `test:journe
1162
1186
  `test` chain runs it after the application projects. With the journey axis off, the ordinary
1163
1187
  browser project retains its integration suite.
1164
1188
 
1189
+ The same axis adds `journey: capture journey` and `capture: capture frames`, using the executable
1190
+ from `node_modules/@orkestrel/capture`. Run `npm run journey -- <selector>` for behavior with
1191
+ capture off and `npm run capture -- <selector>` for frames with `CAPTURE=1`. A selector is `all`
1192
+ or a colon-delimited owner path declared by the wrapper. Narrow with `--variant <name>` and
1193
+ `--case <exact-full-name>`; frames also accept `--state <name>`. Replace the selector with
1194
+ `--changed <ref>` and inspect `--plan` before executing the changed set. The package refuses
1195
+ shared changes that cannot be narrowed and prints the explicit whole-suite command.
1196
+ The application wires the wrapper's discovery, tags, portfolios, registry, selection request,
1197
+ and final-case records to the capture protocol before running these commands. Scaffold seeds
1198
+ the dependency and scripts; it defines no application owner or state registry.
1199
+
1165
1200
  The generated browser resolver and gate cover Chromium alone. The emitted `configs/browsers.ts` doc
1166
1201
  block states the condition that reopens engine selection, and is that condition's one home.
1167
1202
 
@@ -1378,10 +1413,13 @@ digest in lowercase hexadecimal. Stamping a stamped page returns it unchanged. `
1378
1413
  page carrying a repeated or malformed stamp, and a page whose head does not close on its own line.
1379
1414
 
1380
1415
  The journey follows the same modes. The birth-owned `configs/app/vite.journey.config.ts` wrapper
1381
- keeps your variant list and passes the Vite mode to the root `appJourney(variant, variants, mode?)`
1382
- factory, which selects the application through `resolveApplication` as well. Each variant project
1383
- collects `tests/app/<application>/integration.test.ts` alone, sets the variant viewport, and
1384
- provides `variant`, `variants`, and `capture`. The manifest runs `test:journey` for the base
1416
+ keeps your variant list and passes the Vite mode to the root
1417
+ `appJourney(variant, variants, mode?, override?)` factory, which selects the application through
1418
+ `resolveApplication` as well. Each variant project collects
1419
+ `tests/app/<application>/integration.test.ts` alone, sets the variant viewport, and provides
1420
+ `variant`, `variants`, and `capture`. The factory merges an optional `UserConfig` override last,
1421
+ through `mergeOverride`, so a wrapper changes only the fields it names and the project keeps its
1422
+ include and exclude replacement, viewport, commands, and plugin rules. The manifest runs `test:journey` for the base
1385
1423
  application and `test:journey:<framework>`, the same command with `--mode <framework>`, for each
1386
1424
  app-side browser extension, after `npm run test:app` in `test`.
1387
1425
 
@@ -1416,6 +1454,15 @@ executable, installs it, runs its checks, builds, projects, journey modes, showc
1416
1454
  export consumption, and proves that `repair` restores a deleted wrapper byte for byte and that
1417
1455
  `audit` reports a stale one.
1418
1456
 
1457
+ The default `appServer` build emits the single `dist/app/server/main.cjs` that a single-executable
1458
+ embed takes; its dynamic import evaluates only when it runs. The factory defaults `codeSplitting`
1459
+ to `false` on outputs that omit it. An override keeps its output members and explicit splitting
1460
+ values, so an overridden build can emit several files. The vendored `tests/config.test.ts` builds a
1461
+ scratch entry through the real wrapper in each target that holds `app/server`, requires one chunk,
1462
+ and splits it under a control. Scaffold's `tests/src/core/templates.test.ts` runs the emitted file in a staged
1463
+ server root, builds explicit output lists through the factory parameter, and runs the vendored case
1464
+ in staged server targets under a mutation of the factory and of the control.
1465
+
1419
1466
  ### The migration guard
1420
1467
 
1421
1468
  Vue code belongs to the `vue` extension's faces. `repair` and `overwrite` refuse a target whose
@@ -1469,7 +1516,7 @@ scaffolding.stages // one CompileRecord per stage that ran
1469
1516
  compiler.destroy()
1470
1517
  ```
1471
1518
 
1472
- One rule decides the outcome: a `Scaffolding` carries a plan exactly when no question blocks. A
1519
+ One rule decides the outcome: a `CompileResult` carries a plan exactly when no question blocks. A
1473
1520
  refused blueprint is answered rather than raised, so a caller reads the refusal from the value it
1474
1521
  asked for. Each stage records its input and its output, a failed stage records the coded reason
1475
1522
  beside them, and the stages after a failed one never run.
@@ -1623,6 +1670,52 @@ fetched bytes rather than prose this workspace wrote, and it reports a top-level
1623
1670
  neither this package's own, nor `guides/README.md`, nor a catalog row, so an exclusion always
1624
1671
  carries its evidence.
1625
1672
 
1673
+ The Vue override populations enable `policy/no-cross-vue-face` for `cjs`, `cts`, `js`, `jsx`,
1674
+ `mjs`, `mts`, `ts`, `tsx`, and Vue single-file components. The import-free `configs/policy.ts`
1675
+ leaf uses these local exports:
1676
+
1677
+ | Export | Behaviour |
1678
+ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1679
+ | `computePolicyTarget` | Computes a lexical destination from the native importer's absolute filename and cwd, consuming relative parents against its actual directory. |
1680
+ | `reportVueImport` | Checks a literal source against complete permitted face roots, refusing unclassifiable locations and traversal above the workspace. |
1681
+ | `VUE_IMPORT_RULE` | Visits parser-admitted static imports, source-bearing named and star exports, their type-only forms, and string-literal dynamic imports through Oxlint's native parser. |
1682
+ | `VUE_SOURCE_ROOTS`, `VUE_APPLICATION_ROOTS` | Hold the frozen destination roots checked before the retained independent restrictions. |
1683
+
1684
+ Native grammar applies before policy visitors. In the canonical fixtures on both Vue faces, `.cjs` static
1685
+ value imports, named and star exports at both importer depths, and the source-less export receive
1686
+ native parser errors. The coverage keeps all original input identities and extensions in a disjoint
1687
+ partition: those seven inputs per face have explicit parser-refusal expectations on both Vue faces;
1688
+ the remaining inputs retain strict rule and collection checks. The `.cjs` literal dynamic imports
1689
+ and nonliteral import controls stay in that parsed population. No `.cts` or other extension inherits
1690
+ a refusal from the `.cjs` observation; each must establish its own native parsing and collection.
1691
+
1692
+ Otherwise-permitted relative imports within `src/vue` or `app/vue` work at arbitrary nesting
1693
+ depth. A nested `../print/index.js` can stay inside Vue while the same text at the face root
1694
+ reaches a forbidden sibling. Application Vue retains relative access to `app/core`, `app/browser`,
1695
+ `src/core`, `src/browser`, and `src/vue`; published Vue retains its independent alias requirements
1696
+ for core and browser. Query and fragment suffixes are excluded from destination calculation
1697
+ without decoding their text. Thus application Vue's `../browser?x` reaches an allowed face, while
1698
+ published Vue's matching relative import still requires the browser alias.
1699
+
1700
+ The existing alias, Node, server, absolute-path, URL, backslash, dot-segment, traversal-spelling,
1701
+ and compiler-API restrictions keep their original specifier matching. Consequently a same-face
1702
+ directory named `server` can still be refused, as can a published Vue directory named `core` or
1703
+ `browser`. Computed imports remain admitted by this boundary rule. Template-literal targets,
1704
+ `TSImportType`, CommonJS resolution, symlinks, URI decoding, and custom resolver remapping are
1705
+ outside its destination claim. POSIX, drive-letter, and UNC helper cases assert lexical behaviour;
1706
+ they do not establish a binary run on another operating system.
1707
+
1708
+ The exact direct folder `app/vue/composables` joins the function-domain register. Its camelCase
1709
+ modules require one named exported function matching the filename. Nested folders, published Vue
1710
+ composables, look-alike names, and the existing structural filename exclusions gain no registration.
1711
+ Every parser-admitted Vue case in `tests/config.test.ts` requires a debugger collection sentinel;
1712
+ a valid composable keeps that sentinel inside its exported function. Parser-refused inputs retain
1713
+ their original text, but require an exact native message, error severity, normalized filename, and
1714
+ source-token label instead of claiming debugger or policy visitation. Both contracts use the same
1715
+ native-linter acquisition helper in `tests/setupPolicy.ts`; the rule reader still refuses missing
1716
+ rule codes or filenames. Scratch controls suppress only the new report, restore only the removed
1717
+ relative regex alternatives, or remove only the Vue composable row.
1718
+
1626
1719
  The skill sweep reads named value and type imports from `@orkestrel/*` in every Markdown fence
1627
1720
  in `SKILL.md` and its named references, including fences inside lists and blockquotes. It resolves
1628
1721
  each entry through that package's exports map — the workspace's own manifest for the package the
@@ -1893,8 +1986,9 @@ version. The real npm resolver accepts the preserved range. Its narrowed-range c
1893
1986
 
1894
1987
  The floors live in scaffold's own `package.json`. `BASE_DEV_DEPENDENCIES` and the tables beside it
1895
1988
  derive each row scaffold installs from that manifest, and the self-pin from its `version` field, so
1896
- the toolchain a generated workspace receives is the toolchain scaffold runs. The rows scaffold does
1897
- not install are seeds — `@vitejs/plugin-vue`, `vue`, `vue-tsc`, `vite-plugin-singlefile`, and the
1989
+ the baseline toolchain a generated workspace receives is the toolchain scaffold declares. A selected
1990
+ browser framework can override a floor through `TOOLCHAIN_HOLDS`. The rows scaffold does
1991
+ not install are seeds — `@orkestrel/capture`, `@vitejs/plugin-vue`, `vue`, `vue-tsc`, `vite-plugin-singlefile`, and the
1898
1992
  application-server fleet packages — and each carries the highest triple its supported major served
1899
1993
  when it was written.
1900
1994
  [`tests/src/core/constants.test.ts`](../tests/src/core/constants.test.ts) names that seeded set, so a
@@ -1902,10 +1996,48 @@ row entering or leaving the manifest moves a test rather than passing unnoticed.
1902
1996
  of `STYLES_DEV_DEPENDENCIES`, is a seed as well: it carries the `^1.105.1` range the
1903
1997
  `@orkestrel/veneer` checkout declared on 2026-09-30, and that test names it in the seeded set.
1904
1998
 
1999
+ `CAPTURE_DEV_DEPENDENCIES` seeds `@orkestrel/capture` at `^0.0.1` only when the blueprint's
2000
+ `journey` axis is enabled and its `app` includes `browser`. `CAPTURE_UPSTREAM` withholds that
2001
+ seed from capture itself and its fleet runtime closure: `@orkestrel/contract`,
2002
+ `@orkestrel/emitter`, `@orkestrel/process`, and `@orkestrel/timeout`. The frozen, sorted list
2003
+ follows dependencies and peers from capture's installed manifests and moves with the capture
2004
+ pin. Scaffold does not install capture; planning proofs cover every listed exclusion and an
2005
+ unlisted journey workspace. The installed closure-equality proof lands when scaffold installs
2006
+ capture. A browser source, styles surface, or browser setup without that journey application
2007
+ receives no capture seed. A runtime declaration remains in its existing section instead of
2008
+ being duplicated as a development dependency.
2009
+
1905
2010
  Outside the selected showcase pair, a newer major is never crossed for you. `audit` reports one as a non-blocking `dependencies`
1906
- question, and a person decides whether the generated toolchain supports it. Inside the declared
1907
- major the verbs raise the floor themselves, which is what makes the caret's own width beside the
1908
- point: `^0.64.0` admits no `0.65.0`, and `repair` rewrites the range to `^0.65.0` rather than
2011
+ question, and a person decides whether the generated toolchain supports it.
2012
+
2013
+ `TOOLCHAIN_HOLDS` records framework-specific ranges. `blueprintToToolchainHolds` selects those
2014
+ rows from the blueprint's occupied browser framework faces. A `src/vue` or `app/vue` face selects
2015
+ TypeScript `^6.0.3`: no stable `vue-tsc` runs on TypeScript 7, `@volar/typescript@2.4.30` declares
2016
+ the peer range `typescript <7`, and the TypeScript 7.0 announcement directs Vue projects to stay
2017
+ on TypeScript 6.0. Every workspace without that extension receives TypeScript `^7.0.2`.
2018
+ For a selected hold, `audit` reports the hold and its reason in place of the newer-major question
2019
+ and reports a declaration past the hold. A non-Vue workspace on TypeScript 7 raises no hold
2020
+ question. The constants proof ties each hold to its framework's planned range and scaffold's
2021
+ manifest baseline. Prove the framework on the later major before lifting its hold.
2022
+
2023
+ The dependency tables select these floors:
2024
+
2025
+ | Tool | Range | Scope |
2026
+ | ---------------------------- | ---------- | -------------------------------------------------------------- |
2027
+ | TypeScript | `^7.0.2` | Baseline without a Vue extension |
2028
+ | TypeScript | `^6.0.3` | A selected `src/vue` or `app/vue` face |
2029
+ | Vitest | `^5.0.5` | Every workspace |
2030
+ | `@vitest/browser-playwright` | `^5.0.5` | Browser tooling |
2031
+ | `oxlint` | `^1.90.0` | Every workspace |
2032
+ | `oxfmt` | `^0.75.0` | Every workspace |
2033
+ | `@microsoft/api-extractor` | `^7.60.0` | Declaration builds; uses its bundled TypeScript 6.0.3 engine |
2034
+ | `playwright` | `^1.64.1` | Browser tooling |
2035
+ | Vite | `^8.3.5` | Every workspace |
2036
+ | `@types/node` | `^24.19.2` | Every workspace; generated workspaces support Node `>=22.18.0` |
2037
+
2038
+ Node 26 types admit APIs that the supported runtime lacks. Inside the declared major the verbs
2039
+ raise the floor themselves, which is what makes the caret's own width beside the point:
2040
+ `^0.64.0` admits no `0.65.0`, and `repair` rewrites the range to `^0.65.0` rather than
1909
2041
  widening it.
1910
2042
 
1911
2043
  Compatibility and staleness are separate questions, so they are read by separate helpers.
@@ -2004,7 +2136,7 @@ succeed without making requests; remote hooks run setup. Claude Code Cloud conti
2004
2136
  the `.claude/AGENTS.md` Claude Code bridge, the `.agents/orchestration.md` agent-operation contract,
2005
2137
  the rules under `.claude/rules/` and `.cursor/rules/`, the skills under `.agents/skills/` and
2006
2138
  `.claude/skills/`, the templates under `.agents/templates/`, the transport contracts under
2007
- `.agents/transports/`, the agent roles under `.claude/agents/` and `.codex/agents/`, the
2139
+ `.agents/transports/`, the platform pages under `.agents/platforms/`, the agent roles under `.claude/agents/` and `.codex/agents/`, the
2008
2140
  `.codex/config.toml` bench configuration, and the `.mcp.json` and `.cursor/mcp.json` server
2009
2141
  registrations. A release stages every one of them, and a target receives a copy only where the plan
2010
2142
  claims the path. At the `AGENTS.md` destination it receives the pointer: different content at the
@@ -2560,7 +2692,7 @@ and the regenerated root configuration registers no project for it. Restore the
2560
2692
  hand, then run `repair`.
2561
2693
 
2562
2694
  **A fleet target holding Vue code under `app/browser` cannot repair.** On 2026-09-30 the
2563
- `elements`, `mailbox`, `roughnotes`, and `supervisor` checkouts each held `.vue` files under
2695
+ `elements`, `mailbox`, and `roughnotes` checkouts each held `.vue` files under
2564
2696
  `app/browser`, read by a recursive count in each local checkout. The migration guard refuses
2565
2697
  `repair` and `overwrite` in each of them until its components move to `app/vue`, so each moves them
2566
2698
  in its own change before it adopts the release that carries the guard.
@@ -2804,7 +2936,8 @@ The generated guide index lists each occupied Vue face with its source, tests, a
2804
2936
  - [`tests/src/bin/main.test.ts`](../tests/src/bin/main.test.ts) — the process entry point.
2805
2937
  - [`tests/policy.test.ts`](../tests/policy.test.ts) — the path- and text-shaped policy laws:
2806
2938
  mirrors, the root setup mirror, suppressions, the rule map, filenames, manifest scripts, skills,
2807
- bridges, and the prose sweep over every authored Markdown file. The syntax-shaped laws are the
2939
+ bridges, the prose sweep over every authored Markdown file, and the text-integrity sweep over the
2940
+ authored and source text. The syntax-shaped laws are the
2808
2941
  rules of the vendored oxlint plugin `configs/policy.ts`, proven in `tests/config.test.ts`.
2809
2942
  - [`tests/config.test.ts`](../tests/config.test.ts) — the root configuration's aliases, projects,
2810
2943
  and outputs, every plugin rule against a case pair drawn from inside and outside its membership