@orkestrel/scaffold 0.0.102 → 0.0.104

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 (89) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +84 -1
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +21 -6
  3. package/dist/agents/skills/orkestrel-harden/scripts/titles.js +338 -0
  4. package/dist/agents/skills/orkestrel-publish/scripts/swap.js +3 -39
  5. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +433 -47
  6. package/dist/agents/skills/orkestrel-publish/scripts/window.js +2 -1
  7. package/dist/bin/main.js +16 -9
  8. package/dist/bin/main.js.map +1 -1
  9. package/dist/host/agents/orchestration.md +3 -3
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +2 -2
  11. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
  12. package/dist/host/agents/skills/orkestrel-build/SKILL.md +2 -2
  13. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -2
  14. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +1 -1
  15. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
  16. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +10 -10
  17. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +1 -0
  18. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +100 -1
  19. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +27 -6
  20. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +4 -4
  21. package/dist/host/agents/skills/orkestrel-falsify/agents/openai.yaml +1 -1
  22. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +8 -7
  23. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +6 -6
  24. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +6 -1
  25. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +1700 -0
  26. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -2
  27. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +48 -0
  28. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +4 -2
  29. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +425 -0
  30. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +2 -2
  31. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +9 -8
  32. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +3 -3
  33. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +2 -2
  34. package/dist/host/agents/skills/orkestrel-publish/references/release.md +1 -0
  35. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +56 -13
  36. package/dist/host/agents/skills/orkestrel-publish/references/window.md +6 -6
  37. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +5 -49
  38. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +646 -49
  39. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +2 -1
  40. package/dist/host/agents/transports/codex.md +1 -1
  41. package/dist/host/claude/agents/orkestrel.md +54 -53
  42. package/dist/host/claude/agents/reviewer.md +4 -4
  43. package/dist/host/claude/rules/documentation.md +2 -1
  44. package/dist/host/claude/rules/patterns.md +1 -1
  45. package/dist/host/claude/rules/quality.md +2 -2
  46. package/dist/host/claude/rules/styles.md +1 -1
  47. package/dist/host/claude/rules/tests.md +34 -8
  48. package/dist/host/claude/rules/typescript.md +29 -0
  49. package/dist/host/claude/rules/workspace.md +35 -28
  50. package/dist/host/claude/rules/writing.md +34 -26
  51. package/dist/host/claude/settings.json +2 -0
  52. package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +1 -1
  53. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +1 -1
  54. package/dist/host/codex/agents/analyst.toml +3 -3
  55. package/dist/host/codex/agents/reviewer.toml +4 -4
  56. package/dist/host/configs/helpers.ts +4 -16
  57. package/dist/host/configs/policy.ts +13 -2
  58. package/dist/host/dotfiles/editorconfig +0 -1
  59. package/dist/host/dotfiles/gitattributes +0 -1
  60. package/dist/host/dotfiles/gitignore +0 -1
  61. package/dist/host/dotfiles/oxlintrc.json +25 -11
  62. package/dist/host/guides/agent.md +1638 -598
  63. package/dist/host/guides/budget.md +89 -29
  64. package/dist/host/guides/form.md +477 -91
  65. package/dist/host/guides/mcp.md +14 -2
  66. package/dist/host/guides/ollama.md +97 -73
  67. package/dist/host/guides/probe.md +1 -1
  68. package/dist/host/guides/scaffold.md +158 -101
  69. package/dist/host/guides/study.md +2635 -0
  70. package/dist/host/guides/table.md +225 -15
  71. package/dist/host/guides/terminal.md +22 -20
  72. package/dist/host/guides/test.md +689 -255
  73. package/dist/host/manifest.json +88 -64
  74. package/dist/host/tests/config.test.ts +189 -146
  75. package/dist/host/tests/policy.test.ts +39 -1
  76. package/dist/host/tests/setupPolicy.ts +104 -57
  77. package/dist/src/core/index.cjs +1387 -611
  78. package/dist/src/core/index.cjs.map +1 -1
  79. package/dist/src/core/index.d.cts +35 -20
  80. package/dist/src/core/index.d.ts +35 -20
  81. package/dist/src/core/index.js +1385 -612
  82. package/dist/src/core/index.js.map +1 -1
  83. package/dist/src/server/index.cjs +12 -12
  84. package/dist/src/server/index.cjs.map +1 -1
  85. package/dist/src/server/index.d.cts +12 -12
  86. package/dist/src/server/index.d.ts +12 -12
  87. package/dist/src/server/index.js +12 -12
  88. package/dist/src/server/index.js.map +1 -1
  89. package/package.json +4 -4
@@ -126,6 +126,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
126
126
  | `BASE_DEV_DEPENDENCIES` | const | Holds the tooling versions scaffold and every generated workspace share. |
127
127
  | `BIN_CONFIGS` | const | Lists the configuration files a workspace that ships its own executable adds, frozen. |
128
128
  | `BIN_ENTRY_PATH` | const | Names the executable entry whose presence makes a workspace `bin`. |
129
+ | `BIN_OUTPUT_PATH` | const | Names the built executable a bin workspace's manifest command runs. |
129
130
  | `BROWSE_DEV_DEPENDENCIES` | const | Names the development dependency a browser or styles surface adds. |
130
131
  | `BROWSE_UPSTREAM` | const | Lists the packages `@orkestrel/browser` depends on at runtime, directly or transitively, frozen. |
131
132
  | `CANON_PATHS` | const | Lists the instruction-canon paths staged for reading rather than for a target, frozen. |
@@ -139,6 +140,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
139
140
  | `DEFAULT_ENGINES` | const | Names the `engines.node` range a workspace starts with. |
140
141
  | `DEFAULT_VERSION` | const | Names the version a workspace starts at. |
141
142
  | `DEPENDENCY_NAME_PATTERN` | const | Matches the runtime dependency name syntax: the `@orkestrel` scope and a bare name. |
143
+ | `DISTRIBUTION_SETUP_PATH` | const | Names the content-owned harness imported by the generated distribution proof. |
142
144
  | `DISTRIBUTION_TEST_PATH` | const | Names the generated packed-package proof every publishing workspace is planned at. |
143
145
  | `ENGINES_PATTERN` | const | Matches the minimum-Node engine syntax a blueprint declares. |
144
146
  | `ENVIRONMENTS` | const | Lists the `Environment` values, frozen. |
@@ -201,6 +203,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
201
203
  | `TARGET_SKILL_NAMES` | const | Lists the package-facing skills a target receives pointers for, frozen and alphabetical. |
202
204
  | `THEMES_BARREL_PATH` | const | Names the themes stylesheet marker. |
203
205
  | `THEMES_ENTRY_PATH` | const | Names the themes build entry marker. |
206
+ | `TREE_TEST_PATH` | const | Names the real-tree proof whose presence makes a workspace `tree`. |
204
207
  | `VERSION_PATTERN` | const | Matches the exact `major.minor.patch` version syntax a blueprint declares. |
205
208
  | `WORKSPACE_DEV_ENGINES` | const | Holds the `devEngines` record every generated manifest carries. |
206
209
  | `WORKSPACE_OWNED_PATHS` | const | Lists the vendored paths whose present bytes belong to each workspace, frozen. |
@@ -663,7 +666,8 @@ answers a read and grant no verb write authority that it did not already have.
663
666
  states what each emits and what each refuses. Creation leaves `setup` empty, and the remaining
664
667
  structural facts take no creation option. Add a root `tests/setup*.test.ts` proof for `setup`,
665
668
  `tests/guides.test.ts` for `guides`, `tests/integration.test.ts` for `integration`,
666
- `tests/conformance.test.ts` for `conformance`, `tests/setupService.ts` for `service`, an
669
+ `tests/conformance.test.ts` for `conformance`, `tests/tree.test.ts` for `tree`,
670
+ `tests/setupService.ts` for `service`, an
667
671
  exact-case `*.test.ts` file beneath `tests/studies`, outside any `node_modules` or `.git` directory,
668
672
  for `studies`, `tests/setupGlobal.ts` for `global`, `configs/app/vite.journey.config.ts` for `journey`, and
669
673
  `configs/agents/tsconfig.skills.json` for `skills`; reading verbs detect each exact-case file and
@@ -685,7 +689,8 @@ it could disagree. The styles surface, its themes target, the showcase, and ever
685
689
  read from the markers Surfaces and extensions lists. The remaining facts come from exact-case
686
690
  files: `src/bin/main.ts` selects `bin`, each root `tests/setup*.test.ts` match selects `setup`,
687
691
  `tests/guides.test.ts` selects `guides`, `tests/integration.test.ts` selects `integration`,
688
- `tests/conformance.test.ts` selects `conformance`, `tests/setupService.ts` selects `service`,
692
+ `tests/conformance.test.ts` selects `conformance`, `tests/tree.test.ts` selects `tree`,
693
+ `tests/setupService.ts` selects `service`,
689
694
  any exact-case `*.test.ts` file beneath `tests/studies`, nested or direct, outside any
690
695
  `node_modules` or `.git` directory, which Vitest's default exclude never collects, selects
691
696
  `studies`, `tests/setupGlobal.ts` selects `global`, `configs/app/vite.journey.config.ts` selects `journey`,
@@ -1035,8 +1040,8 @@ because the shape is chosen once and read afterwards: `new` refuses the advisory
1035
1040
  `repair` need the plan to describe and restore a target that already has that shape. A library
1036
1041
  caller creating a workspace holds the same refusal, and the Compile section states it.
1037
1042
 
1038
- `bin`, `setup`, `guides`, `integration`, `conformance`, `service`, `vendors`, `studies`, `global`,
1039
- `styles`, `themes`, `showcase`, `journey`, and `skills` are structural facts, and `extensions` lists the
1043
+ `bin`, `setup`, `guides`, `integration`, `conformance`, `tree`, `service`, `vendors`, `studies`,
1044
+ `global`, `styles`, `themes`, `showcase`, `journey`, and `skills` are structural facts, and `extensions` lists the
1040
1045
  extension faces. Reading verbs set each fact and list each extension only when the workspace
1041
1046
  physically ships the directory or exact-case file that defines it, never because of the workspace's
1042
1047
  name and never because a sibling fact is set.
@@ -1048,9 +1053,9 @@ The `setup` member is a `readonly SetupRuntime[]`, empty by default. Target infe
1048
1053
 
1049
1054
  The `node` runtime registers the Node `setup` project, which loads `tests/setup.ts` and excludes
1050
1055
  both browser proofs. The `browser` runtime registers `setup:browser`, which collects only the two
1051
- browser proofs and loads `tests/setup.ts` and `tests/setupBrowser.ts` through Playwright Chromium. A
1052
- sheet face registers `setup:browser` as well, because scaffold plans `tests/setupStyles.test.ts`
1053
- beside every sheet face. The generated manifest emits the selected `test:setup` and
1056
+ browser proofs and loads `tests/setup.ts` and `tests/setupBrowser.ts` through Playwright Chromium.
1057
+ A sheet face alone registers no setup project. A target's browser setup proof selects that project
1058
+ through the `browser` runtime. The generated manifest emits the selected `test:setup` and
1054
1059
  `test:setup:browser` scripts and invokes them from `test`. Scaffold generates no setup proof for an
1055
1060
  empty setup seed.
1056
1061
 
@@ -1087,8 +1092,9 @@ condition, read from the `src` axis and the styles surface the blueprint already
1087
1092
  packs and installs the published
1088
1093
  artifact, so a workspace publishing none has nothing for it to read and gets no project, no
1089
1094
  `test:distribution` script, and no gate entry. A workspace publishing any gets the project, the
1090
- script, the `prepublishOnly` entry, and `tests/distribution.test.ts` itself. Limits states why this
1091
- is the one proof scaffold generates from the workspace's own shape.
1095
+ script, the `prepublishOnly` entry, and `tests/distribution.test.ts` itself with its
1096
+ `tests/setupDistribution.ts` harness. Limits states why this is the one proof scaffold generates
1097
+ from the workspace's own shape.
1092
1098
 
1093
1099
  `service` says the workspace runs a live-service Vitest project over `tests/service`, and it alone
1094
1100
  registers that project, its `test:service` script, and the `tests/setupService.ts` readiness module
@@ -1113,6 +1119,15 @@ tests run, and it selects nothing. A `prepublishOnly` chain written before the f
1113
1119
  in place: the generated chain without its study step, and without both its study step and the release
1114
1120
  proof, are accepted predecessors.
1115
1121
 
1122
+ `tree` says the workspace holds the exact-case `tests/tree.test.ts` proof, and it alone registers
1123
+ the `tree` Vitest project over that file and its `test:tree` script, which `test` invokes in a
1124
+ publishing and a `private: true` workspace alike. The project runs in Node with the browser disabled
1125
+ and loads `tests/setup.ts` and `tests/setupServer.ts`, so scaffold plans the birth-owned
1126
+ `tests/setupServer.ts` seed for a `tree` workspace whatever environments it selects. The proof
1127
+ states the laws this package holds about its own real tree, and it reads that tree without a build,
1128
+ install, or service. Without the file, the workspace has no `tree` project and no `test:tree`
1129
+ script, and its `test` chain carries no step for one.
1130
+
1116
1131
  `integration` projects a cross-environment composition proof for any workspace, independently of
1117
1132
  whether it has a published `src`. Its generated seed imports every selected `src` and `app`
1118
1133
  environment through its public barrel. It starts no process and does not pack or install the
@@ -1260,9 +1275,9 @@ same seed. In the following table, `<face>` is `styles` or the extension's name:
1260
1275
  | `_index.scss` in each of `src/<face>/elements`, `components`, and `utilities` | `birth` |
1261
1276
  | `src/styles/themes/index.scss`, `_default.scss`, and `sheet.ts` | `birth` |
1262
1277
  | `tests/src/<face>/index.test.ts` and `tests/src/styles/themes/index.test.ts` | `birth` |
1263
- | `tests/setupStyles.ts` and `tests/setupStyles.test.ts` | `birth` |
1264
1278
  | `configs/src/vite.<face>.config.ts` and `configs/src/tsconfig.<face>.json` | `content` |
1265
1279
  | `configs/src/vite.themes.config.ts` | `content` |
1280
+ | `tests/setupDistribution.ts` | `content` |
1266
1281
  | `tests/distribution.test.ts` | `presence` |
1267
1282
 
1268
1283
  `sheet.ts` imports `./index.scss` and nothing else, and `index.ts` star-exports `./sheet.js`.
@@ -1293,8 +1308,9 @@ path relative to the test file. With themes, `build:src:styles`
1293
1308
  builds the themes target after the base face. The root configuration registers each face's project
1294
1309
  by its wrapper, and the wrapper composes it through the root `sheetProject` factory, which runs it
1295
1310
  in Playwright Chromium with `isolate: false` and loads `tests/setup.ts`, `tests/setupBrowser.ts`,
1296
- and `tests/setupStyles.ts`. The manifest declares `sass` from `STYLES_DEV_DEPENDENCIES` beside the
1297
- Playwright pair, and the root `tsconfig.json` aliases `@src/<face>` to the face's `index.ts`.
1311
+ and, when the target has the file, `tests/setupStyles.ts`. The manifest declares `sass` from
1312
+ `STYLES_DEV_DEPENDENCIES` beside the Playwright pair, and the root `tsconfig.json` aliases
1313
+ `@src/<face>` to the face's `index.ts`.
1298
1314
 
1299
1315
  ### The browser surface
1300
1316
 
@@ -1320,8 +1336,11 @@ The `vue` extension gives each axis it occupies a face of its own:
1320
1336
  `vue-tsc`, `build:app:vue`, `dev:vue`, and `test:app:vue`. While `app/vue` is occupied, the root
1321
1337
  `check` script typechecks the whole tree through `vue-tsc` in place of `tsc`.
1322
1338
 
1323
- The vendored `.oxlintrc.json` holds each face to the import direction `AGENTS.md` § Project model
1324
- fixes, and the vendored `tests/config.test.ts` drives those directions through Oxlint.
1339
+ The vendored `.oxlintrc.json` holds each face to the import direction `AGENTS.md` § Project model fixes, and
1340
+ refuses, from `src/browser`, `src/server`, `src/vue`, and `src/bin`, a relative path to `src/core`, to
1341
+ `src/browser` from `src/vue`, or to `src/server` from `src/bin` with a message naming the alias, because a face's
1342
+ build bundles what a relative path reaches. The vendored
1343
+ `tests/config.test.ts` drives those directions through Oxlint.
1325
1344
 
1326
1345
  Every published face's build decides its externals through `resolveExternal` from the vendored
1327
1346
  `configs/helpers.ts`. Node builtins, `@orkestrel/*` packages, declared peers with their subpaths,
@@ -1390,7 +1409,7 @@ The vendored `tests/config.test.ts` proves those files in each target that holds
1390
1409
  enumerates the sheet faces and the framework faces from the target's tree rather than from the
1391
1410
  emitted wrappers, requires a non-empty population only where a marker exists, loads every selected
1392
1411
  wrapper, and pairs each behaviour with a mutation control in a scratch copy: a deleted wrapper, a
1393
- removed `tests/setupStyles.ts` entry, a reversed themes build order, a disabled Vue import
1412
+ removed `tests/setupStyles.ts` entry when the target has that file, a reversed themes build order, a disabled Vue import
1394
1413
  restriction, and disabled declaration rewrites each fail it. Scaffold's own release gate adds a
1395
1414
  scratch adopter: `tests/distribution.test.ts` generates the complete selection through the packed
1396
1415
  executable, installs it, runs its checks, builds, projects, journey modes, showcase builds, and CSS
@@ -1413,9 +1432,9 @@ names the fleet targets that meet the refusal.
1413
1432
  Scaffold plans each setup seed that declares an export beside its sibling proof, so the module and
1414
1433
  its proof arrive together under the mirror `.claude/rules/tests.md` states:
1415
1434
 
1416
- - `tests/setupStyles.ts` exports the CSSOM instruments every sheet proof reads and arrives with
1417
- `tests/setupStyles.test.ts`. The emitted sheet proofs import `adoptSheet` and `readLayerNames`
1418
- from that module, and the sibling proof drives both against sheets it builds from text.
1435
+ - The emitted sheet proofs import `adoptSheet` and `readLayerNames` from `@orkestrel/test/browser`.
1436
+ Scaffold seeds no styles setup module or proof because those instruments belong to the package.
1437
+ A target can keep its own `tests/setupStyles.ts` module and sibling proof for its CSSOM instruments.
1419
1438
  - `tests/setupGlobal.ts` exports the Vitest global `setup` function and arrives with
1420
1439
  `tests/setupGlobal.test.ts`, which imports `setup` and runs in the Node `setup` project that
1421
1440
  `test:setup` invokes from `test`.
@@ -1424,7 +1443,10 @@ A journey workspace's `tests/setupBrowser.ts` seed declares no top-level export,
1424
1443
  without a proof. The vendored policy sweep in `tests/setupPolicy.ts` reads the same mirror in both
1425
1444
  directions: a root `tests/setup<Name>.test.ts` without its `tests/setup<Name>.ts` module fails
1426
1445
  `test:policy`, as does a root module that declares an export with neither its sibling proof nor an
1427
- import from `tests/setup.test.ts`. A module `HOST_PATHS` vendors sits outside that population.
1446
+ import from `tests/setup.test.ts`. The setup modules scaffold owns sit outside that population in
1447
+ every target: a module `HOST_PATHS` vendors, and the content-owned `tests/setupDistribution.ts`
1448
+ harness a publishing workspace receives. The harness declares exports and arrives with no sibling
1449
+ proof, because the distribution proof beside it is the test that imports it.
1428
1450
 
1429
1451
  ## Compile
1430
1452
 
@@ -1577,12 +1599,14 @@ You own `tests/setup.ts`, the selected `tests/setupBrowser.ts`, `tests/setupServ
1577
1599
  and `tests/app`, the `tests/src/bin/main.test.ts` file, and the `tests/integration.test.ts` seed.
1578
1600
  Every sheet face's seed under `src` is yours on the same terms. Scaffold writes those
1579
1601
  planned files only during materialize and leaves later edits or deletions alone. You also own the
1580
- `tests/guides.test.ts`, `tests/conformance.test.ts`, and `tests/service/**/*.test.ts` proof files,
1581
- each of which selects its project by being written. The browser commands you register in
1602
+ `tests/guides.test.ts`, `tests/conformance.test.ts`, `tests/tree.test.ts`, and
1603
+ `tests/service/**/*.test.ts` proof files, each of which selects its project by being written. The browser commands you register in
1582
1604
  `configs/commands.ts` are yours too: scaffold writes the empty seed when the file is missing and
1583
1605
  leaves the bytes you wrote alone. Scaffold content-owns `tests/setupPolicy.ts`,
1584
- `tests/policy.test.ts`, and `tests/config.test.ts`; `repair` and `overwrite` restore those files when
1585
- their bytes drift or the files are missing.
1606
+ `tests/policy.test.ts`, and `tests/config.test.ts`, and in a publishing workspace the
1607
+ `tests/setupDistribution.ts` harness; `repair` and `overwrite` restore those files when their bytes
1608
+ drift or the files are missing, and leave the presence-owned `tests/distribution.test.ts` proof beside
1609
+ the harness as it stands.
1586
1610
 
1587
1611
  `tests/policy.test.ts` proves the path- and text-shaped laws, and the vendored oxlint plugin
1588
1612
  `configs/policy.ts` carries the syntax-shaped ones: `policy/no-malformed-summary` reads the doc
@@ -1625,9 +1649,14 @@ typechecked, and ambiguous star exports aren't resolved semantically.
1625
1649
  The `surface` rule in `inspectPolicyWorkspace` compares live barrel exports and target-owned root
1626
1650
  `tests/setup*.ts` exports with the hosted guides. It matches bare names case-sensitively across
1627
1651
  environments and declaration kinds. Source names claimed by the target's own hosted guide are
1628
- grandfathered; setup exports have no grandfather, and setup paths selected by `HOST_PATHS` are
1629
- excluded. A scaffold checkout reads its own `guides/` directory and its own catalog; every other
1630
- target reads `node_modules/@orkestrel/scaffold/dist/host/guides/` and the catalog staged beside it.
1652
+ grandfathered; setup exports have no grandfather. The rule excludes the setup modules scaffold owns
1653
+ in every target: the setup paths `HOST_PATHS` selects and the `tests/setupDistribution.ts`
1654
+ harness. A scaffold checkout reads its own `guides/` directory and its own catalog; every other
1655
+ target reads `node_modules/@orkestrel/scaffold/dist/host/guides/` and the catalog staged beside it,
1656
+ or its own `guides/` directory and its own catalog where that installed host is absent. Beside the
1657
+ installed guides, the rule takes no row from the target's own catalog table: the `catalog` verb
1658
+ writes that table from the registry's organization package list, so the table can list a package
1659
+ whose guide the installed release doesn't stage.
1631
1660
  The population it compares is what the parser accounts for: each exported declaration — a variable
1632
1661
  declarator, function, class, interface, type alias, enum, or namespace — every name an export list
1633
1662
  or a re-export list names, the alias of a namespace re-export, and the names a relative star export
@@ -1714,9 +1743,21 @@ replaces it, and none ever reports it stale. Deleting the file is how you ask fo
1714
1743
  proof back; editing it is how you keep your own. Limits states what makes this proof generable when
1715
1744
  the others are not.
1716
1745
 
1746
+ The proof's machinery lives beside it in `tests/setupDistribution.ts`, a harness scaffold plans
1747
+ under the same condition and claims by content. The generated proof imports
1748
+ `createDistributionSuite` and `buildDistributionCases` from it, plus `checkDistributionBrowser`
1749
+ where it carries the browser branch. It binds the suite, starts and destroys it in its hooks, and
1750
+ registers one `it` per case row inside `describe`, and each `it` compares the `actual` and
1751
+ `expected` values its row observes. The harness registers no test and makes no assertion. A missing
1752
+ harness reports `missing` drift and an edited one reports `stale`, and `repair` or `overwrite`
1753
+ writes the planned bytes back byte for byte while leaving the proof beside it untouched, so a fix to
1754
+ the harness reaches a workspace that keeps its own proof. Because no verb rewrites that proof, no
1755
+ release renames or removes a harness export a released proof imports, a member it reads, or the
1756
+ `./setupDistribution.js` specifier; `.claude/rules/tests.md` names that frozen set.
1757
+
1717
1758
  Content ownership does not preserve an arbitrary custom Vitest project. The optional proof projects
1718
- are fixed: `guides`, `integration`, `conformance`, and `service` are selected by their defining
1719
- paths, `studies` by an exact-case `*.test.ts` file beneath `tests/studies` outside any `node_modules` or
1759
+ are fixed: `guides`, `integration`, `conformance`, `tree`, and `service` are selected by their
1760
+ defining paths, `studies` by an exact-case `*.test.ts` file beneath `tests/studies` outside any `node_modules` or
1720
1761
  `.git` directory, and `distribution` by a published `src` environment. A workspace that needs other local
1721
1762
  configuration must keep those edits outside a content-owned file; `repair` restores that file to the
1722
1763
  canonical project set.
@@ -2126,7 +2167,7 @@ against the digest in `host.json`, then verifies the inventory against its membe
2126
2167
  Transport encoding is transparent and does not enter the comparison. The path never character-
2127
2168
  decodes and re-encodes the content.
2128
2169
 
2129
- This posture supplies integrity, not authenticity. An attacker who can serve the files can also
2170
+ This posture supplies integrity, not authenticity. Anyone who can serve the files can also
2130
2171
  serve a matching inventory. The residual is direct: fetched bytes govern agent behavior in a target
2131
2172
  that has no release gate. Run `audit` to preview the change, use the `--offline` option to pin the
2132
2173
  distributed floors, and keep operator grants in `.claude/settings.local.json`; scaffold does not
@@ -2170,10 +2211,11 @@ Nothing is fixed except the manifest.
2170
2211
  `--hide-scrollbars` default argument so classic scrollbars can take layout space in every case.
2171
2212
  An empty or unset value preserves the launch defaults; any other value throws an `Error`.
2172
2213
  Pairing `classic` with `PLAYWRIGHT_WS_ENDPOINT` throws an `Error`, even with an executable
2173
- override, because the server owns the launch. An installed pinned revision returns empty options
2174
- unless `classic` is set. A pinned revision that is not installed falls through to a `chromium` alias or a
2175
- sibling `chromium-*` revision under the same browsers directory, because a managed container ships
2176
- one usable build for many Playwright versions. It is its own file rather than a block in the
2214
+ override, because the server owns the launch. Every resolved managed path names the full Chromium
2215
+ executable so headless launches retain browser permissions. A pinned revision that is not installed
2216
+ falls through to a `chromium` alias or a sibling `chromium-*` revision under the same browsers
2217
+ directory, because a managed container ships one usable build for many Playwright versions.
2218
+ It is its own file rather than a block in the
2177
2219
  vendored `configs/helpers.ts`, which every workspace receives byte-identical while only a browser
2178
2220
  selection declares the `playwright` this module imports.
2179
2221
  - One template artifact, `configs/commands.ts`, for every workspace that receives
@@ -2182,29 +2224,30 @@ Nothing is fixed except the manifest.
2182
2224
  `test.browser.commands`. `appVue` and each `journey:<variant>` project keep it through the
2183
2225
  browser configuration they spread. Scaffold claims the file by presence, so `repair` and
2184
2226
  `overwrite` write the seed into a target that lacks it and keep the commands you register.
2185
- - The root configuration bundles `configs/commands.ts` into every configuration load, builds
2186
- included, and the bundle resolves no workspace alias. A native import of `src/server/index.ts`
2187
- from a command body fails with `ERR_MODULE_NOT_FOUND` on that module's own `@src/core` import.
2188
- Import only a `node:` module or a package the manifest declares in `dependencies` or
2189
- `devDependencies` at the top of the file. Load workspace source inside the command body through
2190
- `context.project.vitest.import`, which runs on the root Vite server and its `resolve.alias`, and
2191
- narrow the module it returns as `unknown`. The following module registers a `greeting` command
2192
- that returns the `message` export of `src/server/index.ts`:
2193
-
2194
- ```ts
2195
- import type { BrowserCommandContext, BrowserConfigOptions } from 'vitest/node'
2196
- import { fileURLToPath } from 'node:url'
2197
-
2198
- const SERVER_ENTRY = fileURLToPath(new URL('../src/server/index.ts', import.meta.url))
2199
-
2200
- export const commands: Readonly<NonNullable<BrowserConfigOptions['commands']>> = Object.freeze({
2201
- greeting: async (context: BrowserCommandContext): Promise<string | undefined> => {
2202
- const loaded = await context.project.vitest.import<unknown>(SERVER_ENTRY)
2203
- if (typeof loaded !== 'object' || loaded === null || !('message' in loaded)) return undefined
2204
- return typeof loaded.message === 'string' ? loaded.message : undefined
2205
- },
2206
- })
2207
- ```
2227
+
2228
+ The root configuration bundles `configs/commands.ts` into every configuration load, builds
2229
+ included, and the bundle resolves no workspace alias. A native import of `src/server/index.ts`
2230
+ from a command body fails with `ERR_MODULE_NOT_FOUND` on that module's own `@src/core` import.
2231
+ Import only a `node:` module or a package the manifest declares in `dependencies` or
2232
+ `devDependencies` at the top of the file. Load workspace source inside the command body through
2233
+ `context.project.vitest.import`, which runs on the root Vite server and its `resolve.alias`, and
2234
+ narrow the module it returns as `unknown`. The following module registers a `greeting` command
2235
+ that returns the `message` export of `src/server/index.ts`:
2236
+
2237
+ ```ts
2238
+ import type { BrowserCommandContext, BrowserConfigOptions } from 'vitest/node'
2239
+ import { fileURLToPath } from 'node:url'
2240
+
2241
+ const SERVER_ENTRY = fileURLToPath(new URL('../src/server/index.ts', import.meta.url))
2242
+
2243
+ export const commands: Readonly<NonNullable<BrowserConfigOptions['commands']>> = Object.freeze({
2244
+ greeting: async (context: BrowserCommandContext): Promise<string | undefined> => {
2245
+ const loaded = await context.project.vitest.import<unknown>(SERVER_ENTRY)
2246
+ if (typeof loaded !== 'object' || loaded === null || !('message' in loaded)) return undefined
2247
+ return typeof loaded.message === 'string' ? loaded.message : undefined
2248
+ },
2249
+ })
2250
+ ```
2208
2251
 
2209
2252
  - One template artifact per source and test file the selection needs: an `index.ts` barrel per
2210
2253
  selected environment, `main.ts` and `index.html` for an application browser, `tests/setup.ts`
@@ -2213,18 +2256,30 @@ Nothing is fixed except the manifest.
2213
2256
  selected public barrel and records its initial empty exports for the consumer to replace with an
2214
2257
  observable cross-environment flow.
2215
2258
  - One set of template artifacts per sheet face, and one for the themes target: the birth-owned
2216
- seed, the content-owned wrappers, and the birth-owned entry proof, beside the birth-owned
2217
- `tests/setupStyles.ts` module and its proof. Surfaces and extensions lists each path.
2259
+ seed, the content-owned wrappers, and the birth-owned entry proof. Surfaces and extensions lists
2260
+ each path.
2218
2261
  - One set of template artifacts per axis the `vue` extension occupies, and one birth-owned arrival
2219
2262
  journey per application of a journey workspace. Surfaces and extensions lists each face.
2220
- - One template artifact, `tests/distribution.test.ts`, for a workspace publishing any `src`
2221
- environment or sheet face. It is the packed-package proof, and it is claimed by presence rather
2222
- than birth, so a workspace that replaces it keeps its replacement. The suite stages its consumer
2223
- during setup; listing the project creates no distribution staging directory. A published browser environment
2224
- adds the
2225
- real-browser stage to it: the stage bundles the installed package with the workspace's own
2263
+ - Two template artifacts for a workspace publishing any `src` environment or sheet face: the
2264
+ packed-package proof `tests/distribution.test.ts` and its harness `tests/setupDistribution.ts`.
2265
+ The proof is claimed by presence rather than birth, so a workspace that replaces it keeps its
2266
+ replacement. The harness is claimed by content, so `repair` restores its planned bytes. The
2267
+ harness's suite stages its consumer when the proof's `beforeAll` hook starts it; listing the
2268
+ project creates no distribution staging directory. The proof registers the harness's case table,
2269
+ including the installed source-map scan, the declaration-copy scan, and the manifest fixed point
2270
+ under `npm pkg fix`. The source-map scan reads each output's `sourceMappingURL` map, including
2271
+ inline data maps, or its sibling map when the comment is absent. Relative map references resolve
2272
+ at the output; relative sources and roots resolve at the map, and file URLs become host paths.
2273
+ The scan reports sibling sources or a map with no source of its own environment. The declaration scan reads
2274
+ top-level declared names, including unexported names, groups declaration formats by face, and
2275
+ refuses a roll-up declaring no names when its workspace source entry exports names. A built
2276
+ JavaScript output holding code requires its own readable source map. An empty publication passes each scan with
2277
+ its reason: no built face holds code, or no source entry exports names. A single declaration
2278
+ face passes the copy check after its required-content check. The manifest check runs npm on a
2279
+ scratch copy and reports each changed top-level key. A published browser environment adds the
2280
+ real-browser stage to both: the harness bundles the installed package with the workspace's own
2226
2281
  `configs/browsers.ts` resolution, serves the bundle over a loopback server, and drives it in
2227
- Playwright Chromium.
2282
+ Playwright Chromium, and the proof registers that stage through `checkDistributionBrowser`.
2228
2283
  - One template artifact each for `README.md` and `guides/README.md`.
2229
2284
  - One template artifact for `AGENTS.md`. It is a pointer rather than a contract:
2230
2285
  `AGENTS.md` names the coding contract, the orchestration contract, the rules, the skills, and the
@@ -2330,13 +2385,13 @@ When a `Materializer` uses a value `Host`, each mutating call stages the host un
2330
2385
  `#fill` root in the operating system's temporary directory and removes that root in a `finally`
2331
2386
  block. A process killed during the mutation can leave the temporary root behind.
2332
2387
 
2333
- `resolveContainedPath` refuses a lexical escape, a physical link out of the root, and a dangling
2334
- link whose raw target contains a `..` segment. It returns the lexical join of `root` and `path` — an
2335
- absolute path under `root` — after checking the namespace, not an open filesystem handle. Its
2336
- shipped example tests that answer's suffix rather than printing the whole path. Its contract
2337
- therefore excludes a concurrent rename or link swap during the check or before the caller finishes
2338
- using that path. A caller that admits hostile concurrent namespace mutation needs a handle-bound
2339
- operation instead.
2388
+ `resolveContainedPath` refuses a path whose text resolves outside the root, a physical link out of
2389
+ the root, and a dangling link whose raw target contains a `..` segment. It returns the lexical join
2390
+ of `root` and `path` — an absolute path under `root` — after checking the namespace, not an open
2391
+ filesystem handle. Its shipped example tests that answer's suffix rather than printing the whole
2392
+ path. Its contract therefore excludes a concurrent rename or link swap during the check or before
2393
+ the caller finishes using that path. A caller that admits untrusted concurrent namespace mutation
2394
+ needs a handle-bound operation instead.
2340
2395
 
2341
2396
  `resolveRealPath` answers the caller's own text collapsed lexically, then resolved through every link
2342
2397
  in what survives that collapse. A `..` the caller wrote cancels the segment before it as text, so
@@ -2527,9 +2582,9 @@ implementation that conforms to it, then export both from the barrel — the ord
2527
2582
  is what separates them, and it is the whole rule. Generating a file is not the same as writing one:
2528
2583
  scaffold also writes `tests/policy.test.ts` and `tests/config.test.ts` into a target, byte for byte
2529
2584
  from the shared file set, and the distribution proof is the one it derives from the workspace it is
2530
- writing into. A seed is not generation either: scaffold writes `tests/setupStyles.test.ts`,
2531
- `tests/setupGlobal.test.ts`, and each arrival journey at creation, as birth-owned template bytes
2532
- that prove the modules and applications it seeds beside them. After creation those files are the
2585
+ writing into. A seed is not generation either: scaffold writes `tests/setupGlobal.test.ts` and each
2586
+ arrival journey at creation, as birth-owned template bytes that prove the modules and applications
2587
+ it seeds beside them. After creation those files are the
2533
2588
  workspace's, so no verb compares or restores them.
2534
2589
 
2535
2590
  A distribution proof's every assertion derives from the artifact the workspace installs: the
@@ -2538,9 +2593,10 @@ a Node import, a CommonJS require, and a real browser hand back from that instal
2538
2593
  there has to be named, so one generated file measures every publishing workspace, and it stays true
2539
2594
  as that workspace's published surface moves.
2540
2595
 
2541
- A guide, conformance, live-service, or authored setup proof asserts something scaffold cannot read: the API a
2542
- guide fence claims, the official runner a conformance check measures against, the service a live
2543
- proof drives, and what a setup module does. That subject is what no generated file can reach, and
2596
+ A guide, conformance, real-tree, live-service, or authored setup proof asserts something scaffold
2597
+ cannot read: the API a guide fence claims, the official runner a conformance check measures against,
2598
+ the laws a package states about its own tree, the service a live proof drives, and what a setup
2599
+ module does. That subject is what no generated file can reach, and
2544
2600
  the claim here is about the subject rather than about every property those files have. A structural
2545
2601
  property of the same files can be derivable — whether each root `tests/setup*.ts` module is
2546
2602
  reachable from the root configuration is one — and a file asserting it would still leave the
@@ -2548,22 +2604,22 @@ module's behavior unmeasured. A generated file there would read as a proof while
2548
2604
  which is worse than an absent one. So the file a consumer writes is what selects each of those
2549
2605
  projects. Scaffold also seeds proofs for its own setup modules, as Root setup mirror describes.
2550
2606
 
2551
- Registration follows the same split. Scaffold registers `conformance`, `studies`, and `service` when their
2552
- structural facts are set, and registers `distribution` whenever the workspace publishes at least one
2553
- `src` environment or sheet face. In a publishing workspace, `distribution`, `studies`, and `service` run from `prepublishOnly`
2554
- and `conformance` stays in `test`. In a `private: true` workspace, `distribution` is absent,
2607
+ Registration follows the same split. Scaffold registers `conformance`, `tree`, `studies`, and
2608
+ `service` when their structural facts are set, and registers `distribution` whenever the workspace
2609
+ publishes at least one `src` environment or sheet face. In a publishing workspace, `distribution`,
2610
+ `studies`, and `service` run from `prepublishOnly`, and `conformance` and `tree` stay in `test`. In a `private: true` workspace, `distribution` is absent,
2555
2611
  `studies` and then `service` run from `test`, and there is no `prepublishOnly` at all. The `policy` project reports an exporting root setup module that lacks its sibling proof or an import from `tests/setup.test.ts`.
2556
2612
  Separately, a filled, exporting `tests/setup*.ts` module that no `tests/setup*.test.ts`
2557
2613
  proof covers raises the non-blocking `setup` question in `audit`, which names the modules and the proof to add.
2558
2614
  For setup modules the workspace authors, the workspace supplies the behavior proof; the setup modules scaffold seeds arrive with their sibling proofs.
2559
2615
 
2560
- The generated proof partitions the installed `exports` map rather than sampling it. Every published
2616
+ The harness imported by the generated proof partitions the installed `exports` map rather than sampling it. Every published
2561
2617
  subpath lands in exactly one of driven, undeclared, or excluded, and a totality assertion holds that
2562
- partition against the map's own subpath list, so a subpath the proof classifies into none of them
2618
+ partition against the map's own subpath list, so a subpath the harness classifies into none of them
2563
2619
  reddens instead of disappearing. Another assertion beside it names every driven subpath whose entry
2564
2620
  resolves no Node target and no browser target: each drive retires itself for such a subpath, so
2565
2621
  membership of the partition alone would leave one measured by nothing. Together they hold that every
2566
- published subpath is driven, or is named where the proof cannot drive it.
2622
+ published subpath is driven, or is named where the harness cannot drive it.
2567
2623
 
2568
2624
  A subpath is driven when its entry resolves a declaration, and each measurement resolves that entry
2569
2625
  under the conditions of the driver taking it rather than under one shared set. The Node ESM runtime
@@ -2604,7 +2660,7 @@ one answered first. That is what drives a `require`-only subpath declaring its t
2604
2660
  adjacent declaration TypeScript substitutes from its runtime target.
2605
2661
 
2606
2662
  An entry's published names are checked against its own declarations by the type system rather than
2607
- by a walk the proof carries. Each drive writes the runtime's own key list into a generated consumer
2663
+ by a walk the harness carries. Each drive writes the runtime's own key list into a generated consumer
2608
2664
  module as a literal and lets the workspace's compiler judge that module under the driver's own
2609
2665
  resolution, in both directions. `Record<keyof typeof entry, true>` takes the literal, so a name the
2610
2666
  declarations carry and the runtime does not lands there. `Record<keyof typeof published, true>`
@@ -2624,14 +2680,14 @@ rather than the JavaScript one, and the addon publishes names to whatever loads
2624
2680
  extension the name carries rather than a denylist of asset extensions. Reading the
2625
2681
  file name rather than the whole path is load-bearing: `./dist/bundle.js/feature` and
2626
2682
  `./dist/v1.2/index` are modules, and reading the path gets each of them wrong. What the rule
2627
- excludes is stated where the proof is emitted: an extensionless file published for a reader, such as
2683
+ excludes is stated where the harness is emitted: an extensionless file published for a reader, such as
2628
2684
  a `LICENSE` at a subpath, reports undeclared until it is given an extension or a declaration. That
2629
- is the safe direction: the proof names a subpath it cannot vouch for rather than passing one it
2685
+ is the safe direction: the harness names a subpath it cannot vouch for rather than passing one it
2630
2686
  never measured.
2631
2687
 
2632
2688
  A subpath is excluded when it resolves no declaration and names no runtime target: the
2633
2689
  `./package.json` pointer, a published stylesheet, and a WebAssembly binary are read rather than
2634
- imported, and the proof names them where it excludes them.
2690
+ imported, and the harness names them where it excludes them.
2635
2691
 
2636
2692
  Classification reads every target the entry names under every condition, and the members of a
2637
2693
  fallback list with them: Node reads an array in an exports entry as a list of fallbacks, and a
@@ -2648,29 +2704,30 @@ A `./*` subpath pattern is read as an ordinary subpath, with no expansion of the
2648
2704
  naming a runtime target reddens rather than landing in excluded. That is deliberate: excluding the
2649
2705
  pattern would account for a whole family of published subpaths and measure none of them, which is
2650
2706
  the silence this partition exists to close. Measuring the family means expanding the pattern against
2651
- the installed tree and driving each match, which this proof does not do. A maintainer meeting that
2652
- red is reading the honest answer — the proof does not measure that family — rather than a defect in
2653
- the proof.
2707
+ the installed tree and driving each match, which this harness does not do. A maintainer meeting that
2708
+ red is reading the honest answer — the harness does not measure that family — rather than a defect in
2709
+ the harness.
2654
2710
 
2655
2711
  The proof generated for a workspace publishing no browser face asserts that no browser face exists.
2656
- That variant drives a Node import and a Node require and carries no browser branch, because the
2712
+ That variant registers the harness's Node import and Node require cases and carries no browser branch, because the
2657
2713
  branch follows a published browser face on the `src` axis: the browser drive measures the packed
2658
2714
  artifact, and only a published face is packed. A workspace that selects `browser` on its `app` axis
2659
2715
  alone declares `playwright` and `@vitest/browser-playwright` and gets `configs/browsers.ts` emitted,
2660
2716
  and its proof still carries no branch: the selector reads the `src` axis, and a generated manifest
2661
- packs `dist/src`, so an application face is neither selected nor packed. The imports the branch
2717
+ packs `dist/src`, so an application face is neither selected nor packed. The imports the harness's branch
2662
2718
  needs are declared by either axis, so they do not select the branch. The `vite` import selects
2663
2719
  nothing either: every workspace declares `vite`, whatever it publishes. In a core-only workspace,
2664
2720
  those imports resolve to nothing, and emitting the branch there would fail its own `check` and
2665
- `lint:check` gates. Its Node cases retire themselves for a browser face, so a face published after
2721
+ `lint:check` gates. The harness's Node cases retire themselves for a browser face, so a face published after
2666
2722
  the file was written would leave nothing measuring it. The assertion reddens instead, and names the
2667
2723
  subpath a browser branch is owed for. The remedy it carries is to delete the file and run `repair`,
2668
2724
  which writes the variant that carries the branch — the same route presence ownership already gives
2669
2725
  you for asking for the generated proof back.
2670
2726
 
2671
2727
  The generated distribution proof takes its release contract from the outside. The generated
2672
- `prepublishOnly` invokes it as `npm run test:distribution -- --mode release`, and the proof reads
2673
- `import.meta.env.MODE === 'release'` and **fails** on an unreachable registry rather than skipping.
2728
+ `prepublishOnly` invokes it as `npm run test:distribution -- --mode release`, and the harness it
2729
+ imports reads `import.meta.env.MODE === 'release'`, so the proof **fails** on an unreachable
2730
+ registry rather than skipping.
2674
2731
  The project factories the root configuration registers receive the invocation record, and each of
2675
2732
  their projects runs in the invocation's mode. Vitest runs a project whose factory returns no mode in
2676
2733
  Vitest's own `test` mode, where the proof skips. A journey project is such a project: its
@@ -2683,8 +2740,8 @@ a replacement alone, so a replacement that ignores the flag reports green on exa
2683
2740
  matter.
2684
2741
 
2685
2742
  The consequence is one empty-project case per refused proof. A blueprint carrying `conformance` with
2686
- no `tests/conformance.test.ts` registers a project whose include resolves to nothing, and Vitest
2687
- exits non-zero on it. A blueprint carrying `service` gets `tests/setupService.ts` — the root
2743
+ no `tests/conformance.test.ts`, or `tree` with no `tests/tree.test.ts`, registers a project whose
2744
+ include resolves to nothing, and Vitest exits non-zero on it. A blueprint carrying `service` gets `tests/setupService.ts` — the root
2688
2745
  configuration names that module by path, so an absent one fails the project's load rather than its
2689
2746
  run — and still no suite beneath `tests/service`, so `test:service` reports no test files until the
2690
2747
  consumer writes the first one. A blueprint carrying `studies` has no such case, because the fact is
@@ -2716,11 +2773,11 @@ The generated guide index lists each occupied Vue face with its source, tests, a
2716
2773
  - [`tests/src/core/helpers.test.ts`](../tests/src/core/helpers.test.ts) — the pure leaves, their
2717
2774
  determinism, and their input independence.
2718
2775
  - [`tests/src/core/validators.test.ts`](../tests/src/core/validators.test.ts) — every guard against
2719
- the adversarial matrix.
2776
+ the matrix of unexpected values.
2720
2777
  - [`tests/src/core/parsers.test.ts`](../tests/src/core/parsers.test.ts) — parse and guard soundness
2721
2778
  in both directions.
2722
2779
  - [`tests/src/core/cloners.test.ts`](../tests/src/core/cloners.test.ts) — ownership of a snapshot
2723
- taken from a hostile value.
2780
+ taken from an unexpected value.
2724
2781
  - [`tests/src/core/templates.test.ts`](../tests/src/core/templates.test.ts) — the frozen template
2725
2782
  definitions and generated configurations under live Vitest. The isolated `templates` project runs
2726
2783
  through `test:templates` in `prepublishOnly`; its compiler and Chromium processes run apart from