@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.
- package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +204 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +102 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +95 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +207 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +108 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +114 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +108 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +156 -0
- package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +196 -0
- package/dist/agents/skills/orkestrel-publish/scripts/compare.js +206 -0
- package/dist/agents/skills/orkestrel-publish/scripts/pins.js +93 -0
- package/dist/agents/skills/orkestrel-publish/scripts/wave.js +458 -0
- package/dist/agents/skills/orkestrel-publish/scripts/window.js +188 -0
- package/dist/agents/skills/orkestrel-scout/scripts/map.js +300 -0
- package/dist/agents/templates/brief.md +55 -0
- package/dist/bin/main.js +58 -6
- package/dist/bin/main.js.map +1 -1
- package/dist/host/AGENTS.md +77 -135
- package/dist/host/agents/orchestration.md +147 -998
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +2 -2
- package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +6 -13
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/fleet.md +5 -7
- package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +11 -22
- package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +8 -16
- package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
- package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +13 -13
- package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +61 -0
- package/dist/host/agents/skills/orkestrel-dispatch/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +25 -0
- package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +32 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +259 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +110 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +115 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +239 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +124 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +123 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +129 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +157 -0
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +42 -193
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +38 -108
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +35 -134
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +10 -14
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/hardening.md +3 -4
- package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +228 -0
- package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +15 -23
- package/dist/host/agents/skills/orkestrel-journey/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/captures.md +1 -1
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/SKILL.md +25 -33
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/references/capture-harness.md +3 -3
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +33 -20
- package/dist/host/agents/skills/orkestrel-publish/references/release.md +39 -0
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +22 -21
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +27 -14
- package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +220 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +114 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +629 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +242 -0
- package/dist/host/agents/skills/orkestrel-scout/SKILL.md +28 -0
- package/dist/host/agents/skills/orkestrel-scout/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +352 -0
- package/dist/host/agents/templates/brief.md +21 -142
- package/dist/host/agents/transports/claude-cli.md +21 -0
- package/dist/host/agents/transports/codex.md +38 -159
- package/dist/host/agents/transports/cursor.md +16 -65
- package/dist/host/claude/AGENTS.md +38 -0
- package/dist/host/claude/agents/analyst.md +14 -53
- package/dist/host/claude/agents/astra.md +26 -0
- package/dist/host/claude/agents/builder.md +14 -30
- package/dist/host/claude/agents/checker.md +13 -57
- package/dist/host/claude/agents/distiller.md +11 -26
- package/dist/host/claude/agents/grok.md +12 -35
- package/dist/host/claude/agents/opus.md +14 -30
- package/dist/host/claude/agents/orkestrel.md +4 -4
- package/dist/host/claude/agents/planner.md +10 -44
- package/dist/host/claude/agents/researcher.md +11 -30
- package/dist/host/claude/agents/reviewer.md +11 -95
- package/dist/host/claude/agents/scout.md +9 -23
- package/dist/host/claude/agents/verifier.md +15 -33
- package/dist/host/claude/rules/documentation.md +8 -2
- package/dist/host/claude/rules/portability.md +7 -1
- package/dist/host/claude/rules/quality.md +36 -96
- package/dist/host/claude/rules/styles.md +3 -0
- package/dist/host/claude/rules/tests.md +6 -3
- package/dist/host/claude/rules/workspace.md +21 -15
- package/dist/host/claude/rules/writing.md +57 -108
- package/dist/host/claude/settings.json +5 -3
- package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +1 -1
- package/dist/host/claude/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +2 -2
- package/dist/host/claude/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +2 -2
- package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +11 -0
- package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +2 -1
- package/dist/host/claude/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +2 -2
- package/dist/host/claude/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +2 -2
- package/dist/host/claude/skills/orkestrel-polish/SKILL.md +12 -0
- package/dist/host/claude/skills/orkestrel-scout/SKILL.md +11 -0
- package/dist/host/codex/agents/analyst.toml +14 -31
- package/dist/host/codex/agents/astra.toml +25 -0
- package/dist/host/codex/agents/builder.toml +13 -20
- package/dist/host/codex/agents/checker.toml +13 -27
- package/dist/host/codex/agents/distiller.toml +9 -22
- package/dist/host/codex/agents/grok.toml +11 -30
- package/dist/host/codex/agents/opus.toml +14 -22
- package/dist/host/codex/agents/orkestrel.toml +1 -1
- package/dist/host/codex/agents/planner.toml +11 -28
- package/dist/host/codex/agents/researcher.toml +10 -22
- package/dist/host/codex/agents/reviewer.toml +11 -27
- package/dist/host/codex/agents/scout.toml +11 -17
- package/dist/host/codex/agents/verifier.toml +16 -12
- package/dist/host/codex/config.toml +18 -21
- package/dist/host/cursor/mcp.json +0 -4
- package/dist/host/cursor/rules/orchestration.mdc +12 -20
- package/dist/host/dotfiles/mcp.json +0 -4
- package/dist/host/dotfiles/oxlintrc.json +7 -0
- package/dist/host/guides/probe.md +18 -14
- package/dist/host/guides/scaffold.md +147 -83
- package/dist/host/guides/test.md +442 -148
- package/dist/host/manifest.json +322 -185
- package/dist/host/scripts/codex.sh +0 -0
- package/dist/host/scripts/cursor.sh +0 -0
- package/dist/host/scripts/deps.sh +0 -0
- package/dist/host/scripts/ollama.sh +0 -0
- package/dist/host/tests/config.test.ts +86 -55
- package/dist/host/tests/policy.test.ts +1 -5
- package/dist/host/tests/setupPolicy.ts +179 -4
- package/dist/src/core/index.cjs +264 -89
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +95 -30
- package/dist/src/core/index.d.ts +95 -30
- package/dist/src/core/index.js +262 -90
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +55 -9
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +29 -4
- package/dist/src/server/index.d.ts +29 -4
- package/dist/src/server/index.js +56 -11
- package/dist/src/server/index.js.map +1 -1
- package/package.json +16 -12
- package/dist/host/CLAUDE.md +0 -61
- package/dist/host/agents/skills/orkestrel-prove-journey/agents/openai.yaml +0 -4
- package/dist/host/agents/transports/claude.md +0 -49
- package/dist/host/claude/agents/application.md +0 -36
- package/dist/host/claude/agents/sol.md +0 -61
- package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +0 -12
- package/dist/host/codex/agents/application.toml +0 -25
- package/dist/host/codex/agents/sol.toml +0 -19
- /package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/integration.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/centralization.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/contract.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/research.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/decide.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/layer.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/statechart.md +0 -0
- /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/
|
|
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/
|
|
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
|
|
518
|
-
|
|
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/
|
|
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/
|
|
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 // '
|
|
682
|
-
verdict.receipt // 'probe:
|
|
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/
|
|
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/
|
|
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/
|
|
1004
|
-
its composition in the root configuration, and a `tmp/
|
|
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/
|
|
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`
|
|
22
|
-
|
|
23
|
-
|
|
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`,
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
`
|
|
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`,
|
|
621
|
-
`configs/
|
|
622
|
-
the fact by itself. `tests/distribution.test.ts` selects nothing: the
|
|
623
|
-
target ships already decides the `distribution` project, and the file is
|
|
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
|
|
673
|
-
script. A configuration emitted by the plan or present in the target does not raise
|
|
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
|
|
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
|
|
696
|
-
|
|
697
|
-
|
|
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 `
|
|
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.
|
|
936
|
-
|
|
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
|
|
939
|
-
a gate chain. Then run `repair`; it appends the
|
|
940
|
-
|
|
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`
|
|
1076
|
-
| `orchestration` | The harness permission file, the bench scripts,
|
|
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`
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
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`
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
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
|
|
1494
|
-
under `.claude/rules/` and `.cursor/rules/`, the skills under `.agents/skills/` and
|
|
1495
|
-
the templates under `.agents/templates/`, the transport contracts under
|
|
1496
|
-
agent roles under `.claude/agents/` and `.codex/agents/`, the
|
|
1497
|
-
configuration, and the `.mcp.json` and `.cursor/mcp.json` server
|
|
1498
|
-
every one of them, and a target receives a copy only where the plan
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
bytes themselves, because the `catalog` verb refuses a target that lacks the file.
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
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
|
|
1565
|
-
does claim as well: the `AGENTS.md`
|
|
1566
|
-
|
|
1567
|
-
a fetched canon path. A fill carrying no row for a
|
|
1568
|
-
is what lets one `Host` carry live bytes beside
|
|
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
|
|
1704
|
-
`AGENTS.md` names the coding contract, the orchestration contract, the rules,
|
|
1705
|
-
resolves each against a sibling scaffold checkout or
|
|
1706
|
-
|
|
1707
|
-
into every context that loads it.
|
|
1708
|
-
|
|
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
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
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
|