@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
@@ -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
 
@@ -1478,7 +1516,7 @@ scaffolding.stages // one CompileRecord per stage that ran
1478
1516
  compiler.destroy()
1479
1517
  ```
1480
1518
 
1481
- 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
1482
1520
  refused blueprint is answered rather than raised, so a caller reads the refusal from the value it
1483
1521
  asked for. Each stage records its input and its output, a failed stage records the coded reason
1484
1522
  beside them, and the stages after a failed one never run.
@@ -1948,8 +1986,9 @@ version. The real npm resolver accepts the preserved range. Its narrowed-range c
1948
1986
 
1949
1987
  The floors live in scaffold's own `package.json`. `BASE_DEV_DEPENDENCIES` and the tables beside it
1950
1988
  derive each row scaffold installs from that manifest, and the self-pin from its `version` field, so
1951
- the toolchain a generated workspace receives is the toolchain scaffold runs. The rows scaffold does
1952
- 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
1953
1992
  application-server fleet packages — and each carries the highest triple its supported major served
1954
1993
  when it was written.
1955
1994
  [`tests/src/core/constants.test.ts`](../tests/src/core/constants.test.ts) names that seeded set, so a
@@ -1957,10 +1996,48 @@ row entering or leaving the manifest moves a test rather than passing unnoticed.
1957
1996
  of `STYLES_DEV_DEPENDENCIES`, is a seed as well: it carries the `^1.105.1` range the
1958
1997
  `@orkestrel/veneer` checkout declared on 2026-09-30, and that test names it in the seeded set.
1959
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
+
1960
2010
  Outside the selected showcase pair, a newer major is never crossed for you. `audit` reports one as a non-blocking `dependencies`
1961
- question, and a person decides whether the generated toolchain supports it. Inside the declared
1962
- major the verbs raise the floor themselves, which is what makes the caret's own width beside the
1963
- 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
1964
2041
  widening it.
1965
2042
 
1966
2043
  Compatibility and staleness are separate questions, so they are read by separate helpers.
@@ -2615,7 +2692,7 @@ and the regenerated root configuration registers no project for it. Restore the
2615
2692
  hand, then run `repair`.
2616
2693
 
2617
2694
  **A fleet target holding Vue code under `app/browser` cannot repair.** On 2026-09-30 the
2618
- `elements`, `mailbox`, `roughnotes`, and `supervisor` checkouts each held `.vue` files under
2695
+ `elements`, `mailbox`, and `roughnotes` checkouts each held `.vue` files under
2619
2696
  `app/browser`, read by a recursive count in each local checkout. The migration guard refuses
2620
2697
  `repair` and `overwrite` in each of them until its components move to `app/vue`, so each moves them
2621
2698
  in its own change before it adopts the release that carries the guard.
@@ -2859,7 +2936,8 @@ The generated guide index lists each occupied Vue face with its source, tests, a
2859
2936
  - [`tests/src/bin/main.test.ts`](../tests/src/bin/main.test.ts) — the process entry point.
2860
2937
  - [`tests/policy.test.ts`](../tests/policy.test.ts) — the path- and text-shaped policy laws:
2861
2938
  mirrors, the root setup mirror, suppressions, the rule map, filenames, manifest scripts, skills,
2862
- 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
2863
2941
  rules of the vendored oxlint plugin `configs/policy.ts`, proven in `tests/config.test.ts`.
2864
2942
  - [`tests/config.test.ts`](../tests/config.test.ts) — the root configuration's aliases, projects,
2865
2943
  and outputs, every plugin rule against a case pair drawn from inside and outside its membership