@orkestrel/scaffold 0.0.77 → 0.0.79

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 (158) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +204 -0
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +102 -0
  3. package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +95 -0
  4. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +207 -0
  5. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +108 -0
  6. package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +114 -0
  7. package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +108 -0
  8. package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +156 -0
  9. package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +196 -0
  10. package/dist/agents/skills/orkestrel-publish/scripts/compare.js +206 -0
  11. package/dist/agents/skills/orkestrel-publish/scripts/pins.js +93 -0
  12. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +458 -0
  13. package/dist/agents/skills/orkestrel-publish/scripts/window.js +188 -0
  14. package/dist/agents/skills/orkestrel-scout/scripts/map.js +300 -0
  15. package/dist/agents/templates/brief.md +55 -0
  16. package/dist/bin/main.js +58 -6
  17. package/dist/bin/main.js.map +1 -1
  18. package/dist/host/AGENTS.md +77 -135
  19. package/dist/host/agents/orchestration.md +147 -998
  20. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +2 -2
  21. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
  22. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +6 -13
  23. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/agents/openai.yaml +1 -1
  24. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/fleet.md +5 -7
  25. package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +11 -22
  26. package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/agents/openai.yaml +1 -1
  27. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +8 -16
  28. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
  29. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +13 -13
  30. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +61 -0
  31. package/dist/host/agents/skills/orkestrel-dispatch/agents/openai.yaml +4 -0
  32. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +25 -0
  33. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +32 -0
  34. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +259 -0
  35. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +110 -0
  36. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +115 -0
  37. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +239 -0
  38. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +124 -0
  39. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +123 -0
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +129 -0
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +157 -0
  42. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +42 -193
  43. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +38 -108
  44. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +35 -134
  45. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +10 -14
  46. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/agents/openai.yaml +1 -1
  47. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/hardening.md +3 -4
  48. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +228 -0
  49. package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +15 -23
  50. package/dist/host/agents/skills/orkestrel-journey/agents/openai.yaml +4 -0
  51. package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/captures.md +1 -1
  52. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/SKILL.md +25 -33
  53. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/agents/openai.yaml +1 -1
  54. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/references/capture-harness.md +3 -3
  55. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +33 -20
  56. package/dist/host/agents/skills/orkestrel-publish/references/release.md +39 -0
  57. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +22 -21
  58. package/dist/host/agents/skills/orkestrel-publish/references/window.md +27 -14
  59. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +220 -0
  60. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +114 -0
  61. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +629 -0
  62. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +242 -0
  63. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +28 -0
  64. package/dist/host/agents/skills/orkestrel-scout/agents/openai.yaml +4 -0
  65. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +352 -0
  66. package/dist/host/agents/templates/brief.md +21 -142
  67. package/dist/host/agents/transports/claude-cli.md +21 -0
  68. package/dist/host/agents/transports/codex.md +38 -159
  69. package/dist/host/agents/transports/cursor.md +16 -65
  70. package/dist/host/claude/AGENTS.md +38 -0
  71. package/dist/host/claude/agents/analyst.md +14 -53
  72. package/dist/host/claude/agents/astra.md +26 -0
  73. package/dist/host/claude/agents/builder.md +14 -30
  74. package/dist/host/claude/agents/checker.md +13 -57
  75. package/dist/host/claude/agents/distiller.md +11 -26
  76. package/dist/host/claude/agents/grok.md +12 -35
  77. package/dist/host/claude/agents/opus.md +14 -30
  78. package/dist/host/claude/agents/orkestrel.md +4 -4
  79. package/dist/host/claude/agents/planner.md +10 -44
  80. package/dist/host/claude/agents/researcher.md +11 -30
  81. package/dist/host/claude/agents/reviewer.md +11 -95
  82. package/dist/host/claude/agents/scout.md +9 -23
  83. package/dist/host/claude/agents/verifier.md +15 -33
  84. package/dist/host/claude/rules/documentation.md +8 -2
  85. package/dist/host/claude/rules/portability.md +7 -1
  86. package/dist/host/claude/rules/quality.md +36 -96
  87. package/dist/host/claude/rules/styles.md +3 -0
  88. package/dist/host/claude/rules/tests.md +6 -3
  89. package/dist/host/claude/rules/workspace.md +21 -15
  90. package/dist/host/claude/rules/writing.md +57 -108
  91. package/dist/host/claude/settings.json +5 -3
  92. package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +1 -1
  93. package/dist/host/claude/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +2 -2
  94. package/dist/host/claude/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +2 -2
  95. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +11 -0
  96. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +2 -1
  97. package/dist/host/claude/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +2 -2
  98. package/dist/host/claude/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +2 -2
  99. package/dist/host/claude/skills/orkestrel-polish/SKILL.md +12 -0
  100. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +11 -0
  101. package/dist/host/codex/agents/analyst.toml +14 -31
  102. package/dist/host/codex/agents/astra.toml +25 -0
  103. package/dist/host/codex/agents/builder.toml +13 -20
  104. package/dist/host/codex/agents/checker.toml +13 -27
  105. package/dist/host/codex/agents/distiller.toml +9 -22
  106. package/dist/host/codex/agents/grok.toml +11 -30
  107. package/dist/host/codex/agents/opus.toml +14 -22
  108. package/dist/host/codex/agents/orkestrel.toml +1 -1
  109. package/dist/host/codex/agents/planner.toml +11 -28
  110. package/dist/host/codex/agents/researcher.toml +10 -22
  111. package/dist/host/codex/agents/reviewer.toml +11 -27
  112. package/dist/host/codex/agents/scout.toml +11 -17
  113. package/dist/host/codex/agents/verifier.toml +16 -12
  114. package/dist/host/codex/config.toml +18 -21
  115. package/dist/host/cursor/mcp.json +0 -4
  116. package/dist/host/cursor/rules/orchestration.mdc +12 -20
  117. package/dist/host/dotfiles/mcp.json +0 -4
  118. package/dist/host/dotfiles/oxlintrc.json +7 -0
  119. package/dist/host/guides/probe.md +18 -14
  120. package/dist/host/guides/scaffold.md +147 -83
  121. package/dist/host/guides/test.md +442 -148
  122. package/dist/host/manifest.json +322 -185
  123. package/dist/host/scripts/codex.sh +0 -0
  124. package/dist/host/scripts/cursor.sh +0 -0
  125. package/dist/host/scripts/deps.sh +0 -0
  126. package/dist/host/scripts/ollama.sh +0 -0
  127. package/dist/host/tests/config.test.ts +86 -55
  128. package/dist/host/tests/policy.test.ts +1 -5
  129. package/dist/host/tests/setupPolicy.ts +179 -4
  130. package/dist/src/core/index.cjs +264 -89
  131. package/dist/src/core/index.cjs.map +1 -1
  132. package/dist/src/core/index.d.cts +95 -30
  133. package/dist/src/core/index.d.ts +95 -30
  134. package/dist/src/core/index.js +262 -90
  135. package/dist/src/core/index.js.map +1 -1
  136. package/dist/src/server/index.cjs +55 -9
  137. package/dist/src/server/index.cjs.map +1 -1
  138. package/dist/src/server/index.d.cts +29 -4
  139. package/dist/src/server/index.d.ts +29 -4
  140. package/dist/src/server/index.js +56 -11
  141. package/dist/src/server/index.js.map +1 -1
  142. package/package.json +16 -12
  143. package/dist/host/CLAUDE.md +0 -61
  144. package/dist/host/agents/skills/orkestrel-prove-journey/agents/openai.yaml +0 -4
  145. package/dist/host/agents/transports/claude.md +0 -49
  146. package/dist/host/claude/agents/application.md +0 -36
  147. package/dist/host/claude/agents/sol.md +0 -61
  148. package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +0 -12
  149. package/dist/host/codex/agents/application.toml +0 -25
  150. package/dist/host/codex/agents/sol.toml +0 -19
  151. /package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/integration.md +0 -0
  152. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/centralization.md +0 -0
  153. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/contract.md +0 -0
  154. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/research.md +0 -0
  155. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/decide.md +0 -0
  156. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/layer.md +0 -0
  157. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/statechart.md +0 -0
  158. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/styles.md +0 -0
@@ -476,7 +476,7 @@ make a claim. A direct `Probe` runs its boot controls at construction. `ProbeSer
476
476
  independent of the workspace toolchain and runs those controls when an admitted `prove` call
477
477
  constructs the real probe.
478
478
 
479
- - **A Vitest project whose name the test's path infers.** A test under `tmp/probe/` names the
479
+ - **A Vitest project whose name the test's path infers.** A test under `tmp/probes/` names the
480
480
  `probe` project, and a test under `tests/src/<environment>/` names `src:<environment>`. Any other
481
481
  path infers no project, and the runtime stage throws `origin: 'claimant'`, `code: 'missing'`, and
482
482
  the declared path in `context` rather than reporting an issue:
@@ -495,7 +495,7 @@ constructs the real probe.
495
495
  for the file it wrote, so a project whose glob matches nothing still serves a claim.
496
496
  - **The directory the declared test path names can be created.** The runtime stage writes a real
497
497
  file beside the declared test and creates that file's directory first, recursively, so a claim
498
- naming a directory the workspace does not hold still runs. A fresh clone holds no `tmp/probe/`,
498
+ naming a directory the workspace does not hold still runs. A fresh clone holds no `tmp/probes/`,
499
499
  because `tmp` is ignored by version control, and a claim declaring a test there creates it. A
500
500
  directory the host refuses to create — a file already occupies the path, or its parent denies
501
501
  writing — reports an `origin: 'workspace'` issue:
@@ -514,9 +514,13 @@ constructs the real probe.
514
514
  own dependencies, and reports the resolved versions on `Verdict.toolchain`. A verdict predicts
515
515
  the gate only while probe and the gate read one installed copy of each tool.
516
516
 
517
- Declare `@orkestrel/probe` as a development dependency of the workspace it inspects. Its tools are
518
- optional peers, resolved from that workspace when a direct probe is constructed or a server admits
519
- a `prove` call.
517
+ Declare `@orkestrel/probe` as a development dependency of the workspace it inspects. Its
518
+ `typescript` and `vitest` tools are optional peers; probe resolves them and `oxlint` from that
519
+ workspace when a direct probe is constructed or a server admits a `prove` call. The `oxlint`
520
+ package carries no peer range because npm also resolves the peers of an optional peer: `oxlint`
521
+ declares an optional `vite-plus` peer, `vite-plus` 1.0.0 depends on `vitest` 5, and npm 11.19.0
522
+ refuses that conflict with the `vitest` peer range when it installs probe into an empty project
523
+ (measured 2026-09-29).
520
524
 
521
525
  ## Registering the server
522
526
 
@@ -656,7 +660,7 @@ const claim: Claim = {
656
660
  },
657
661
  ],
658
662
  test: {
659
- path: 'tmp/probe/greeting.test.ts',
663
+ path: 'tmp/probes/greeting.test.ts',
660
664
  text: "import { expect, test } from 'vitest'\nimport { createGreeting } from '../../src/core/factories.js'\ntest('greets', () => expect(createGreeting()).toBe('hi'))\n",
661
665
  },
662
666
  },
@@ -668,7 +672,7 @@ const claim: Claim = {
668
672
  },
669
673
  ],
670
674
  test: {
671
- path: 'tmp/probe/greeting.test.ts',
675
+ path: 'tmp/probes/greeting.test.ts',
672
676
  text: "import { expect, test } from 'vitest'\nimport { createGreeting } from '../../src/core/factories.js'\ntest('greets', () => expect(createGreeting()).toBe('hi'))\n",
673
677
  },
674
678
  stage: 'type',
@@ -678,8 +682,8 @@ const claim: Claim = {
678
682
 
679
683
  const probe = new Probe({ workspace: process.cwd() })
680
684
  const verdict = await probe.prove(claim)
681
- verdict.digest // 'fcb88a2dee987b8673c1fc7107979470'
682
- verdict.receipt // 'probe:fcb88a2dee987b8673c1fc7107979470:type:typescript@6.0.3:oxlint@1.83.0:vitest@4.1.11:configs/src/tsconfig.core.json@434f59254d58cf2683d453a26bd0d837'
685
+ verdict.digest // 'bdf03e5dfd6bd413ead671c7a2940fcf'
686
+ verdict.receipt // 'probe:bdf03e5dfd6bd413ead671c7a2940fcf:type:typescript@6.0.3:oxlint@1.86.0:vitest@4.1.11:configs/src/tsconfig.core.json@434f59254d58cf2683d453a26bd0d837'
683
687
  await probe.destroy()
684
688
  ```
685
689
 
@@ -895,10 +899,10 @@ already supply test code the runtime stage runs.
895
899
  for.** Oxlint's language server honours `.gitignore`, and it does so for text supplied from memory
896
900
  exactly as it does for a file on disk. The stage reports a clean check, not a skipped one.
897
901
 
898
- This reaches the flagship claim stated earlier: its test lives at `tmp/probe/greeting.test.ts`, and
902
+ This reaches the flagship claim stated earlier: its test lives at `tmp/probes/greeting.test.ts`, and
899
903
  `tmp` is ignored in this workspace, so the lint stage inspects the candidate `src/core/factories.ts`
900
904
  and reports nothing about the test. Measured on 2026-08-20: the same three-line text carrying an
901
- unused binding and a `debugger` statement returns 0 issues at `tmp/probe/lint-ignored.test.ts` and 2
905
+ unused binding and a `debugger` statement returns 0 issues at `tmp/probes/lint-ignored.test.ts` and 2
902
906
  issues at `tests/src/core/lint-tracked.test.ts`.
903
907
 
904
908
  `.gitignore` alone causes this: `tmp` appears there and in no other ignore file this workspace
@@ -1000,8 +1004,8 @@ than the probe's — it decides which process reads the stdio, not when the stag
1000
1004
  `error` instead, carrying the arming refusal as the attempt raises it, so a host waiting on `arm`
1001
1005
  reads the refusal rather than an event that never arrives. The attempt is still retained for
1002
1006
  retry, so each attempt surfaces its own `error` and no `prove` reports one refusal twice. The
1003
- controls run under `tmp/probe/` against the root `tsconfig.json`, which is why the Vitest project,
1004
- its composition in the root configuration, and a `tmp/probe/` the host lets it create gate the
1007
+ controls run under `tmp/probes/` against the root `tsconfig.json`, which is why the Vitest project,
1008
+ its composition in the root configuration, and a `tmp/probes/` the host lets it create gate the
1005
1009
  boot rather than a claim.
1006
1010
  - **Freshness.** Every `prove` revalidates before it answers. The runtime stage re-reads each
1007
1011
  workspace module and invalidates the ones whose contents moved; the type stage refreshes its
@@ -1113,7 +1117,7 @@ than the probe's — it decides which process reads the stdio, not when the stag
1113
1117
  closes the file with the marker `// @orkestrel/probe generated specification <pid>-<uuid>`, and
1114
1118
  the sweep requires that marker to name the same revision the file name does. The boot
1115
1119
  dependencies carry the same marker, so nothing is attributed by its path and nothing under
1116
- `tmp/probe/` is deleted for sitting there. A file of yours that happens to carry the same name
1120
+ `tmp/probes/` is deleted for sitting there. A file of yours that happens to carry the same name
1117
1121
  shape is left where it is, wherever it sits, and so is a live neighbour's specification.
1118
1122
  - **What the type stage leaves.** Its mirror is one directory under `TYPE_MIRROR`, named for the
1119
1123
  writing host's process id and a fresh UUID, carrying that same marker at `.probe/mirror.txt`.
@@ -18,9 +18,11 @@ the verbs write and compare.
18
18
  `CANON_PATHS` names the instruction canon — the coding and orchestration contracts, the rules, the
19
19
  skills, the templates, the transport contracts, the agent roles, the bench configuration, and the
20
20
  MCP registrations — which stays in one place and is published for reading. A target carries the
21
- `AGENTS.md` and `CLAUDE.md` pointers that name where a reader finds it, and the catalog agent file
22
- the `catalog` verb rewrites. It carries nothing else at a canon path: a file found at one is a
23
- superseded copy, and `overwrite` deletes it.
21
+ `AGENTS.md` pointer that names where a reader finds it, the catalog agent file the `catalog` verb
22
+ rewrites, and the skill pointer set for each package-facing skill `TARGET_SKILL_NAMES` lists: the
23
+ Claude bridge, the Codex sidecar, and a `SKILL.md` pointer that names the canonical skill. It
24
+ carries nothing else at a canon path: a file found at one is a superseded copy, and `overwrite`
25
+ deletes it.
24
26
  `REFERENCE_PATHS` names the `guides` directory — a mirror of every published `@orkestrel` guide
25
27
  beside this package's own — which is staged for reading at `dist/host/guides/` and claims nothing in
26
28
  a target on its own. The `SEED_GUIDE_PATHS` constant names the mirrors the compiler claims, so
@@ -169,9 +171,11 @@ Exported from `@orkestrel/scaffold`, and reachable from
169
171
  | `SERVICE_TEST_INCLUDE` | const | Names the include the live-service project covers, which is a directory rather than one proof. |
170
172
  | `SHOWCASE_CONFIG_PATH` | const | Names the Vite wrapper whose presence makes a workspace `showcase`. |
171
173
  | `SHOWCASE_DEV_DEPENDENCIES` | const | Names the development dependency used only by the optional single-file showcase build. |
174
+ | `SKILLS_CONFIG_PATH` | const | Names the TypeScript wrapper whose presence makes a workspace `skills`. |
172
175
  | `SOURCE_BROWSER_DEV_DEPENDENCIES` | const | Lists the development dependencies a published browser `src` environment adds. |
173
176
  | `SRC_MATRIX` | const | Holds the build and export settings each published `src` environment contributes, frozen. |
174
177
  | `TAB_WIDTH` | const | Sets the columns one tab occupies when the formatter measures a line, matching `tabWidth`. |
178
+ | `TARGET_SKILL_NAMES` | const | Lists the package-facing skills a target receives pointers for, frozen and alphabetical. |
175
179
  | `VERSION_PATTERN` | const | Matches the exact `major.minor.patch` version syntax a blueprint declares. |
176
180
  | `WORKSPACE_DEV_ENGINES` | const | Holds the `devEngines` record every generated manifest carries. |
177
181
  | `WORKSPACE_OWNED_PATHS` | const | Lists the vendored paths whose present bytes belong to each workspace, frozen. |
@@ -243,6 +247,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
243
247
  | `matchesRange` | function | Tests whether a declared range already admits a published version. |
244
248
  | `nameToGuide` | function | Derives the guide mirror path a package name answers for. |
245
249
  | `planToSummary` | function | Projects a plan into its tally by artifact origin. |
250
+ | `renderSkillPointer` | function | Renders the `SKILL.md` pointer a target carries in place of a canonical skill. |
246
251
  | `selectGroups` | function | Selects the groups a compile covers, in plan order. |
247
252
  | `selectHostPaths` | function | Selects the host paths a named workspace vendors. |
248
253
  | `serializeTypeScriptString` | function | Serializes one string as a single-quoted TypeScript literal. |
@@ -399,6 +404,7 @@ The inventory contracts carry these data members.
399
404
  | `computeDigest` | function | Computes the SHA-256 digest of text. |
400
405
  | `computeFileDigest` | function | Computes the SHA-256 digest of one file's exact bytes. |
401
406
  | `computeManifestDigest` | function | Computes the digest of a vendored host's declared membership. |
407
+ | `decodeHexText` | function | Decodes exact bytes stated in hexadecimal as strict UTF-8 text. |
402
408
  | `filesToHost` | function | Assembles a whole vendored host from live files and the installed floor. |
403
409
  | `hexToDigest` | function | Projects exact bytes stated in hexadecimal to their SHA-256 digest. |
404
410
  | `isExactCaseFile` | function | Tests whether a path is a physical file with exact on-disk casing. |
@@ -597,8 +603,9 @@ answers a read and grant no verb write authority that it did not already have.
597
603
  empty. The other structural facts do not need creation flags. Add a root `tests/setup*.test.ts` proof for
598
604
  `setup`, `tests/guides.test.ts` for `guides`, `tests/integration.test.ts` for `integration`,
599
605
  `tests/conformance.test.ts` for `conformance`, `tests/setupService.ts` for `service`,
600
- `tests/setupGlobal.ts` for `global`, `configs/app/vite.showcase.config.ts` for `showcase`, and
601
- `configs/app/vite.journey.config.ts` for `journey`;
606
+ `tests/setupGlobal.ts` for `global`, `configs/app/vite.showcase.config.ts` for `showcase`,
607
+ `configs/app/vite.journey.config.ts` for `journey`, and `configs/agents/tsconfig.skills.json` for
608
+ `skills`;
602
609
  reading verbs detect each exact-case file and register its fixed machinery. An explicitly supplied
603
610
  plan with `vendors` owns and protects the birth-owned `scripts/service.sh` inventory skeleton.
604
611
  Reading verbs do not infer its vendor list from edited text and cannot preserve an arbitrary present
@@ -611,16 +618,17 @@ Limits states what makes that one proof generable when the others are not.
611
618
  ### Reading a target
612
619
 
613
620
  `audit`, `repair`, `catalog`, and `overwrite` derive the blueprint from the target itself. The name
614
- and the declared `@orkestrel/*` packages come from `package.json`. The environment axes come
615
- from the directories the target actually ships, because a directory is the fact and a declaration
616
- beside it could disagree. The remaining facts come from exact-case files: `src/bin/main.ts` selects
617
- `bin`, each root `tests/setup*.test.ts` match selects `setup`, `tests/guides.test.ts` selects
618
- `guides`, `tests/integration.test.ts` selects `integration`, `tests/conformance.test.ts` selects
621
+ and the declared `@orkestrel/*` packages come from `package.json`. The environment axes come from
622
+ the directories the target actually ships, because a directory is the fact and a declaration beside
623
+ it could disagree. The remaining facts come from exact-case files: `src/bin/main.ts` selects `bin`,
624
+ each root `tests/setup*.test.ts` match selects `setup`, `tests/guides.test.ts` selects `guides`,
625
+ `tests/integration.test.ts` selects `integration`, `tests/conformance.test.ts` selects
619
626
  `conformance`, `tests/setupService.ts` selects `service`, `tests/setupGlobal.ts` selects `global`,
620
- `configs/app/vite.showcase.config.ts` selects `showcase`, and
621
- `configs/app/vite.journey.config.ts` selects `journey`. A containing directory does not select
622
- the fact by itself. `tests/distribution.test.ts` selects nothing: the published `src` axis the
623
- target ships already decides the `distribution` project, and the file is planned from that.
627
+ `configs/app/vite.showcase.config.ts` selects `showcase`, `configs/app/vite.journey.config.ts`
628
+ selects `journey`, and `configs/agents/tsconfig.skills.json` selects `skills`. A containing
629
+ directory does not select the fact by itself. `tests/distribution.test.ts` selects nothing: the
630
+ published `src` axis the target ships already decides the `distribution` project, and the file is
631
+ planned from that.
624
632
 
625
633
  `vendors` is not reconstructed. Its artifact, `scripts/service.sh`, is a birth-owned inventory
626
634
  skeleton rather than a working installer, so edited script text is not a trustworthy declaration of
@@ -641,6 +649,12 @@ fresh workspace therefore carries no guides project or script. When a developer
641
649
  writable script region. That region accepts the prior generated Vitest-only value and preserves a
642
650
  customized command. The rest of the manifest remains birth-owned.
643
651
 
652
+ The `skills` fact follows the same rule. The exact-case `configs/agents/tsconfig.skills.json`
653
+ wrapper selects it; the root configuration then defines and registers the `skills` project over
654
+ `tests/agents/**/*.test.ts`, and the manifest gains `test:skills` in the `test` chain and
655
+ `check:skills` in the `check` chain. The scaffold checkout carries that wrapper because it ships the
656
+ skill scripts under `.agents/skills/*/scripts/` with their mirrored proofs.
657
+
644
658
  The plan-reading verbs compare the Vitest project set named by the target manifest with the
645
659
  project set the planned root configuration registers. Every planned proof project must also be
646
660
  reachable from the manifest's `test` chain. A target whose manifest does not set `private: true` may
@@ -669,9 +683,9 @@ path. Its remedy asks you to add the configuration, or remove the script that na
669
683
  invocation from the `test` chain. When the plan emits `test:journey` and no chain from `test` reaches
670
684
  `npm run test:journey` through literal `npm run` calls, that question asks you to insert the invocation
671
685
  after `npm run test:app`. These advisories belong to `configs`
672
- and remain report-only during `repair`: the command preserves the `test` chain and an unplanned
673
- script. A configuration emitted by the plan or present in the target does not raise the absent
674
- configuration advisory.
686
+ and remain report-only during `repair`: the command preserves a `test` chain the package owns and
687
+ an unplanned script. A configuration emitted by the plan or present in the target does not raise
688
+ the absent configuration advisory.
675
689
 
676
690
  `audit` still completes the comparison and reports one non-blocking `projects` question when its
677
691
  selection includes `configs`. It reports the earliest of the facts it finds; settling that fact and
@@ -684,7 +698,8 @@ region still leaves the project ungated. Its remedy reads the manifest on disk r
684
698
  projection, so it states what the developer's own file holds: a script the manifest declares leaves
685
699
  the gate as the only repair, and a script only the projection supplies is named as missing beside
686
700
  the gate. When `configs` is selected, `repair` and `overwrite` refuse
687
- an unregistered or ungated project before writing. Their refusal names the `configs` group, the
701
+ an unregistered or ungated project before writing, and a project the planned `test` chain they
702
+ write reaches is not ungated. Their refusal names the `configs` group, the
688
703
  manifest and planned `vite.config.ts` conflict, and the option to exclude `configs` from `--groups`.
689
704
  A selection that excludes `configs` proceeds. An advisory alone does not make an aligned target
690
705
  drift.
@@ -692,9 +707,18 @@ drift.
692
707
  Scaffold writes one part of the manifest rather than advising on it: the writable script region.
693
708
  `repair` and `overwrite` write every direct `test:<project>` script the blueprint computes,
694
709
  `test:probe`, and `test:bench`. A publishing workspace also receives `test:distribution`, `prepack`,
695
- and `prepublishOnly`. The `test`, `check`, `build`, `dev`, `serve`, `show`, `format`, `lint`, `clean`,
696
- and `copy` gate chains stay maintainer-owned. A declared value is overwritten only when it is already
697
- the value being written or is a recognized generated predecessor. The overwrite happens in place,
710
+ and `prepublishOnly`. The `test` chain joins the region only as a generated predecessor: when it
711
+ runs fewer steps than the planned chain and every step it runs is a planned step in the planned
712
+ order, `repair` and `overwrite` write the planned chain in its place. That write lands only when
713
+ every step the planned chain adds runs a script the manifest declares or the region writes. The
714
+ `test:src` and `test:app` aggregates sit outside the region, so a chain whose planned form adds an
715
+ aggregate the manifest lacks stays with the package, and the `projects` question keeps its remedy.
716
+ `audit` reports this chain write only through the `projects` question, so a planned step that
717
+ registers no Vitest project, such as `npm run test:guides`, lands on the next `repair` without an
718
+ earlier advisory. A `test` chain running any other step or order stays maintainer-owned, as do the
719
+ `check`, `build`, `dev`, `serve`, `show`, `format`, `lint`, `clean`, and `copy` gate chains. A
720
+ declared value is overwritten only when it is already the value being written or is a recognized
721
+ generated predecessor. The overwrite happens in place,
698
722
  so every byte outside the replaced ranges survives. A target's descriptions, keywords, extra
699
723
  scripts, and manifest key order survive byte-for-byte. A script the manifest does not declare is
700
724
  appended after the last declared script of its own key family, copying that section's indentation:
@@ -906,7 +930,7 @@ because the shape is chosen once and read afterwards: `new` refuses the advisory
906
930
  caller creating a workspace holds the same refusal, and the Compile section states it.
907
931
 
908
932
  `bin`, `setup`, `guides`, `integration`, `conformance`, `service`, `vendors`, `global`, `showcase`,
909
- and `journey` are structural facts. Reading verbs set each only when the workspace physically ships the directory
933
+ `journey`, and `skills` are structural facts. Reading verbs set each only when the workspace physically ships the directory
910
934
  or exact-case file that defines it, never because of the workspace's name and never because a
911
935
  sibling fact is set.
912
936
 
@@ -921,6 +945,11 @@ only that browser proof and loads `tests/setup.ts` and `tests/setupBrowser.ts` t
921
945
  Chromium. The generated manifest emits the selected `test:setup` and `test:setup:browser` scripts
922
946
  and invokes them from `test`. Scaffold generates no setup proof for an empty setup seed.
923
947
 
948
+ A `global` workspace gives `setup:browser` the `tests/setupGlobal.ts` module as its Vitest global
949
+ setup, as it gives `src:browser` and `integration`. A browser proof cannot start a Node fixture from
950
+ inside the browser, so it reads what that module provides through the Vitest `inject` function.
951
+ The Node `setup` project takes no global setup.
952
+
924
953
  When the `app` axis selects `browser`, the browser setup project also applies the Vue
925
954
  single-file-component transform. Your `tests/setupBrowser.ts` module and its paired proof can
926
955
  import and render application Vue components. A browser setup proof without `app/browser` keeps
@@ -932,12 +961,15 @@ generated before that file existed and still registers no `integration` project,
932
961
  fails with `integration has no project factory or configuration` until a plan-writing verb
933
962
  regenerates it.
934
963
 
935
- `repair` closes the direct-script half through the writable manifest region. It still refuses to
936
- register a project that the maintainer-owned gate chains do not reach.
964
+ `repair` closes the direct-script half through the writable manifest region. Over a generated
965
+ predecessor `test` chain it writes the planned chain too, so it registers the project in one run. It
966
+ still refuses to register a project that a maintainer-owned gate chain does not reach.
937
967
 
938
- When you add a structural proof, write the file and invoke its planned `test:<project>` script from
939
- a gate chain. Then run `repair`; it appends the direct script, regenerates the root configuration,
940
- and registers the project. `audit` reports whichever piece is still outstanding at each step.
968
+ When you add a structural proof to a workspace whose `test` chain the package owns, write the file
969
+ and invoke its planned `test:<project>` script from a gate chain. Then run `repair`; it appends the
970
+ direct script, regenerates the root configuration, and registers the project. Over a generated
971
+ predecessor `test` chain, write the file and run `repair`. `audit` reports whichever piece is still
972
+ outstanding at each step.
941
973
 
942
974
  `distribution` is not a field at all. A published `src` environment is its whole condition, read
943
975
  from the `src` axis the blueprint already carries. The proof packs and installs the published
@@ -1065,24 +1097,26 @@ than a silent no-op.
1065
1097
  A plan selects over the following groups, and a compile that names none covers all of them. Their
1066
1098
  order is the order a plan lists its artifacts in.
1067
1099
 
1068
- | Group | Holds |
1069
- | --------------- | -------------------------------------------------------------------------- |
1070
- | `manifest` | `package.json` |
1071
- | `configs` | The root and per-target build configuration, and the root dotfiles |
1072
- | `source` | The selected environment barrels and entries |
1073
- | `tests` | The shared setup modules, the entry tests, and the policy sweep |
1074
- | `guides` | The guide index and the vendored guide mirrors |
1075
- | `docs` | `README.md` beside the `AGENTS.md` and `CLAUDE.md` pointers |
1076
- | `orchestration` | The harness permission file, the bench scripts, and the catalog agent file |
1100
+ | Group | Holds |
1101
+ | --------------- | ------------------------------------------------------------------------------------------------- |
1102
+ | `manifest` | `package.json` |
1103
+ | `configs` | The root and per-target build configuration, and the root dotfiles |
1104
+ | `source` | The selected environment barrels and entries |
1105
+ | `tests` | The shared setup modules, the entry tests, and the policy sweep |
1106
+ | `guides` | The guide index and the vendored guide mirrors |
1107
+ | `docs` | `README.md` beside the `AGENTS.md` pointer |
1108
+ | `orchestration` | The harness permission file, the bench scripts, the catalog agent file, and the skill pointer set |
1077
1109
 
1078
1110
  The plan claims paths inside the instruction canon deliberately, and each has a reason. The `docs`
1079
- group carries the `AGENTS.md` and `CLAUDE.md` pointers that name where each contract is read,
1080
- planned at those canon destinations as this package's own template content. The `orchestration`
1081
- group carries `CATALOG_AGENT_PATH`, the host-origin artifact at a canon path, because the `catalog`
1082
- verb refuses a target that lacks the file. Every other canon path is staged for reading, so no group
1083
- selection copies a contract into a target, and a copy a target holds at one of them is foreign drift
1084
- in the group `inferGroup` gives it. A scoped audit reads the canon through that same selection, so a
1085
- run excluding a group reports nothing there.
1111
+ group carries the `AGENTS.md` pointer that names where each contract is read, planned at those canon
1112
+ destinations as this package's own template content. The `orchestration` group carries
1113
+ `CATALOG_AGENT_PATH`, a host-origin artifact at a canon path, because the `catalog` verb refuses a
1114
+ target that lacks the file. It also carries the skill pointer set, three host-origin artifacts for
1115
+ each name in `TARGET_SKILL_NAMES`, so every harness in a target discovers the package-facing skills
1116
+ while their bodies, references, and scripts stay in the installed package. Every other canon path is
1117
+ staged for reading, so no group selection copies a contract into a target, and a copy a target holds
1118
+ at one of them is foreign drift in the group `inferGroup` gives it. A scoped audit reads the canon
1119
+ through that same selection, so a run excluding a group reports nothing there.
1086
1120
 
1087
1121
  ## Ownership and drift
1088
1122
 
@@ -1121,11 +1155,18 @@ turns each path scaffold owns the bytes of into a content-owned artifact, leavin
1121
1155
  workspace-owned paths and the mirror pointers the preceding rows name. What a verb claims at a
1122
1156
  vendored path is the hydrated ownership, and `HostArtifact` carries the same narrowing on the type.
1123
1157
 
1124
- The `AGENTS.md` and `CLAUDE.md` pointers sit outside that row. Their bytes come from a frozen
1125
- template rather than from the data root, so the pure core face already claims them content-owned and
1126
- hydration leaves them alone. `repair` and `overwrite` restore a missing pointer and replace a drifted
1127
- one, in every face, which is what keeps a target's resolution instructions in agreement with the
1128
- release it installed.
1158
+ The `AGENTS.md` pointer sits outside that row. Its bytes come from a frozen template rather than
1159
+ from the data root, so the pure core face already claims them content-owned and hydration leaves
1160
+ them alone. `repair` and `overwrite` restore a missing pointer and replace a drifted one, in every
1161
+ face, which is what keeps a target's resolution instructions in agreement with the release it
1162
+ installed.
1163
+
1164
+ A skill pointer takes the other route. Its `HostArtifact` sets `pointer`, so hydration reads the
1165
+ staged canonical `SKILL.md` and derives the target's bytes with `renderSkillPointer` rather than
1166
+ copying them, and the hydrated artifact is computed, content-owned text. `repair` and `overwrite`
1167
+ restore a missing pointer and replace a hand-edited one with the derived bytes. A staged canonical
1168
+ skill that does not open with a frontmatter block is a broken host, and hydration refuses it with a
1169
+ `TARGET` error naming the staged file and the pointer path.
1129
1170
 
1130
1171
  Birth ownership is what makes a generated workspace the consumer's. `materialize` writes a
1131
1172
  birth-owned path into a vacant target. A later `repair` or `overwrite` call treats that path as
@@ -1490,18 +1531,23 @@ succeed without making requests; remote hooks run setup. Claude Code Cloud conti
1490
1531
  `scripts/ollama.sh`.
1491
1532
 
1492
1533
  `CANON_PATHS` is the instruction canon, staged for reading instead: the `AGENTS.md` coding contract,
1493
- the `CLAUDE.md` harness bridge, the `.agents/orchestration.md` agent-operation contract, the rules
1494
- under `.claude/rules/` and `.cursor/rules/`, the skills under `.agents/skills/` and `.claude/skills/`,
1495
- the templates under `.agents/templates/`, the transport contracts under `.agents/transports/`, the
1496
- agent roles under `.claude/agents/` and `.codex/agents/`, the `.codex/config.toml` bench
1497
- configuration, and the `.mcp.json` and `.cursor/mcp.json` server registrations. A release stages
1498
- every one of them, and a target receives a copy only where the plan claims the path. At the
1499
- `AGENTS.md` and `CLAUDE.md` destinations it receives the pointers: different content at the same
1500
- paths, planned as this package's own template content. At `CATALOG_AGENT_PATH` it receives the staged
1501
- bytes themselves, because the `catalog` verb refuses a target that lacks the file. Everywhere else in
1502
- the canon a target holds nothing, and a reader reaches the contracts from a scaffold checkout sitting
1503
- beside the repository, or from the `node_modules/@orkestrel/scaffold/dist/host/` root inside the
1504
- installed package, which is what the `AGENTS.md` pointer scaffold plans into a target names.
1534
+ the `.claude/AGENTS.md` Claude Code bridge, the `.agents/orchestration.md` agent-operation contract,
1535
+ the rules under `.claude/rules/` and `.cursor/rules/`, the skills under `.agents/skills/` and
1536
+ `.claude/skills/`, the templates under `.agents/templates/`, the transport contracts under
1537
+ `.agents/transports/`, the agent roles under `.claude/agents/` and `.codex/agents/`, the
1538
+ `.codex/config.toml` bench configuration, and the `.mcp.json` and `.cursor/mcp.json` server
1539
+ registrations. A release stages every one of them, and a target receives a copy only where the plan
1540
+ claims the path. At the `AGENTS.md` destination it receives the pointer: different content at the
1541
+ same path, planned as this package's own template content. At `CATALOG_AGENT_PATH` it receives the
1542
+ staged bytes themselves, because the `catalog` verb refuses a target that lacks the file. For each
1543
+ name in `TARGET_SKILL_NAMES` it receives the skill pointer set: the `.claude/skills/<name>/SKILL.md`
1544
+ bridge and the `.agents/skills/<name>/agents/openai.yaml` sidecar as staged bytes, and at
1545
+ `.agents/skills/<name>/SKILL.md` a pointer that hydration derives from the staged canonical skill. A
1546
+ blueprint carrying the `skills` fact ships its own skill canon and receives no pointer set.
1547
+ Everywhere else in the canon a target holds nothing, and a reader reaches the contracts from a
1548
+ scaffold checkout sitting beside the repository, or from the
1549
+ `node_modules/@orkestrel/scaffold/dist/host/` root inside the installed package, which is what the
1550
+ `AGENTS.md` pointer scaffold plans into a target names.
1505
1551
 
1506
1552
  `REFERENCE_PATHS` is the fleet's guides, staged for reading like the canon and owned like neither
1507
1553
  of the other lists. It holds the `guides` directory, so a release stages this repository's mirror of
@@ -1561,12 +1607,12 @@ a commit is a property of the content host. Scaffold neither creates that lag no
1561
1607
  response as fresher than the host served it.
1562
1608
 
1563
1609
  A canon destination costs no request. The fetch list drops every canon destination and `filesToHost`
1564
- keeps the installed floor bytes for each one, claimed or not. The rule covers the destinations a plan
1565
- does claim as well: the `AGENTS.md` and `CLAUDE.md` pointers are written from this package's own
1566
- templates, and the catalog agent file is claimed by presence, so no byte a target holds is taken from
1567
- a fetched canon path. A fill carrying no row for a canon path is complete rather than spoiled, which
1568
- is what lets one `Host` carry live bytes beside floor bytes without mixing baselines within a
1569
- surface.
1610
+ keeps the installed floor bytes for each one, claimed or not. The rule covers the destinations a
1611
+ plan does claim as well: the `AGENTS.md` pointer is written from this package's own templates, the
1612
+ catalog agent file is claimed by presence, and the skill pointer set reads the installed floor
1613
+ bytes, so no byte a target holds is taken from a fetched canon path. A fill carrying no row for a
1614
+ canon path is complete rather than spoiled, which is what lets one `Host` carry live bytes beside
1615
+ floor bytes without mixing baselines within a surface.
1570
1616
 
1571
1617
  `.claude/settings.json` is in that set, and the artifact planned for it is content-owned. `repair`
1572
1618
  and `overwrite` restore its bytes, so an edit made to it inside a target is reverted at the next
@@ -1700,14 +1746,23 @@ except the manifest.
1700
1746
  `configs/browsers.ts` resolution, serves the bundle over a loopback server, and drives it in
1701
1747
  Playwright Chromium.
1702
1748
  - One template artifact each for `README.md` and `guides/README.md`.
1703
- - One template artifact each for `AGENTS.md` and `CLAUDE.md`. They are pointers rather than contracts:
1704
- `AGENTS.md` names the coding contract, the orchestration contract, the rules, and the skills, and
1705
- resolves each against a sibling scaffold checkout or the installed package; `CLAUDE.md` names the
1706
- `AGENTS.md` file beside it and imports nothing, because an `@path` import inlines the imported file
1707
- into every context that loads it. Scaffold owns their bytes, so a release that moves the wording
1708
- moves every target's copy at its next `repair`.
1749
+ - One template artifact for `AGENTS.md`. It is a pointer rather than a contract:
1750
+ `AGENTS.md` names the coding contract, the orchestration contract, the rules, the skills, and the
1751
+ `.claude/AGENTS.md` Claude Code bridge, and resolves each against a sibling scaffold checkout or
1752
+ the installed package. It imports nothing, because an `@path` import inlines the imported file
1753
+ into every context that loads it. No `CLAUDE.md` is planned: Claude Code reads `AGENTS.md`
1754
+ directly, and a `CLAUDE.md` beside it stops that reading, so the path stays canon with no
1755
+ claimant, a copy a target still holds reports `foreign`, and `overwrite` deletes it. Scaffold
1756
+ owns the pointer's bytes, so a release that moves the wording moves every target's copy at its
1757
+ next `repair`.
1709
1758
  - One host artifact per vendored path the workspace selects. A vendored directory is one planned
1710
1759
  path that expands into the files the data root stores beneath it.
1760
+ - Three host artifacts for each name in `TARGET_SKILL_NAMES`, unless the blueprint carries the
1761
+ `skills` fact: the Claude bridge and the Codex sidecar as copies of the staged bytes, and the
1762
+ `SKILL.md` pointer, which carries the canonical frontmatter over a body that names the canonical
1763
+ skill and how to run its scripts from the installed package. A script runs from its built `.js`
1764
+ twin under `node_modules/@orkestrel/scaffold/dist/agents/skills/<skill>/scripts/`, because Node
1765
+ refuses to strip types for a file under `node_modules`.
1711
1766
 
1712
1767
  Every generated manifest declares the toolchain it is gated on. The `engines.node` field carries
1713
1768
  the blueprint's `engines` value, which defaults to the `>=22.18.0` range. The
@@ -1925,17 +1980,22 @@ tree carrying no uncommitted work. An untracked copy is left standing, and a git
1925
1980
  outside the dirty reading as well, so a target can carry its own file at a canon path through every
1926
1981
  visit. The audit reads canon membership by path, so such a copy stays a `foreign` finding and that
1927
1982
  target exits `1` on every run. `repair` never closes it either: that verb writes the planned paths a
1928
- target is missing or has let drift and deletes nothing, so it restores the `AGENTS.md` and
1929
- `CLAUDE.md` pointers and leaves every other copy where it is. A maintainer who wants a local MCP
1930
- server registration keeps it outside the repository, in the harness's own local or user scope, rather
1931
- than at `.mcp.json`, where the file is drift whoever wrote it.
1932
-
1933
- **A target holds no dispatchable role beyond the catalog agent.** The canon is staged for reading, so
1934
- a target receives the `AGENTS.md` and `CLAUDE.md` pointers and `.claude/agents/orkestrel.md`, and
1935
- nothing else a harness reads: no other agent role, no bench configuration, and no MCP registration. A
1936
- harness running in a target loads none of those from `node_modules` either, so a role, a bench, or a
1937
- server that target needs is defined in the harness's own local or user scope — the seam the preceding
1938
- registration entry already names. Fleet targets are not orchestration hosts. A session that
1983
+ target is missing or has let drift and deletes nothing, so it restores the `AGENTS.md` pointer and
1984
+ the skill pointer set and leaves every other copy where it is; a `CLAUDE.md` a target still holds is
1985
+ a `foreign` finding the same way, and `overwrite` deletes it. A maintainer who wants a local MCP
1986
+ server registration keeps it outside the repository, in the harness's own local or user scope,
1987
+ rather than at `.mcp.json`, where the file is drift whoever wrote it.
1988
+
1989
+ **A target holds no dispatchable role beyond the catalog agent.** The canon is staged for reading,
1990
+ so a target receives the `AGENTS.md` pointer, `.claude/agents/orkestrel.md`, and the skill pointer
1991
+ set for each package-facing skill `TARGET_SKILL_NAMES` lists: the Claude bridge, the Codex sidecar,
1992
+ and a pointer that names the canonical skill, all content-owned and restored by `repair`. It
1993
+ receives no other agent role, no bench configuration, and no MCP registration. A harness running in
1994
+ a target loads none of those from `node_modules` either, so a role, a bench, or a server that target
1995
+ needs is defined in the harness's own local or user scope — the seam the preceding registration
1996
+ entry already names. Fleet targets are not orchestration hosts: `TARGET_SKILL_NAMES` leaves out the
1997
+ dispatch, publish, scout, and align skills, which run from a scaffold checkout, and a blueprint
1998
+ carrying the `skills` fact ships its own skill canon and receives no pointer set. A session that
1939
1999
  dispatches roles starts on scaffold, where `.agents/orchestration.md` and the role files sit, and
1940
2000
  attaches the target it is working on.
1941
2001
 
@@ -2115,6 +2175,10 @@ you for asking for the generated proof back.
2115
2175
  The generated distribution proof takes its release contract from the outside. The generated
2116
2176
  `prepublishOnly` invokes it as `npm run test:distribution -- --mode release`, and the proof reads
2117
2177
  `import.meta.env.MODE === 'release'` and **fails** on an unreachable registry rather than skipping.
2178
+ The project factories the root configuration registers receive the invocation record, and each of
2179
+ their projects runs in the invocation's mode. Vitest runs a project whose factory returns no mode in
2180
+ Vitest's own `test` mode, where the proof skips. A journey project is such a project: its
2181
+ birth-owned wrapper drops the record, so it runs in `test` whatever mode the run names.
2118
2182
  An ordinary local run skips that case, because a developer offline is not a defect; a release run
2119
2183
  does not, because skipping there passes the publish gate without ever proving the artifact installs.
2120
2184
  A workspace that replaces the generated proof takes that contract with it: presence ownership leaves