@orkestrel/scaffold 0.0.108 → 0.0.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +326 -91
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +110 -14
  3. package/dist/agents/skills/orkestrel-dispatch/scripts/chain.js +280 -0
  4. package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +188 -26
  5. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +142 -43
  6. package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +240 -62
  7. package/dist/agents/skills/orkestrel-dispatch/scripts/patch.js +323 -0
  8. package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +169 -32
  9. package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +290 -69
  10. package/dist/agents/skills/orkestrel-falsify/scripts/mutate.js +560 -0
  11. package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +1052 -205
  12. package/dist/agents/skills/orkestrel-harden/scripts/measure.js +361 -0
  13. package/dist/agents/skills/orkestrel-harden/scripts/titles.js +455 -80
  14. package/dist/agents/skills/orkestrel-parallel/scripts/cases.js +327 -0
  15. package/dist/agents/skills/orkestrel-publish/scripts/compare.js +298 -51
  16. package/dist/agents/skills/orkestrel-publish/scripts/pins.js +170 -13
  17. package/dist/agents/skills/orkestrel-publish/scripts/swap.js +956 -191
  18. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +707 -112
  19. package/dist/agents/skills/orkestrel-publish/scripts/window.js +235 -41
  20. package/dist/agents/skills/orkestrel-scout/scripts/map.js +341 -54
  21. package/dist/agents/templates/brief.md +1 -1
  22. package/dist/bin/main.js +51 -46
  23. package/dist/bin/main.js.map +1 -1
  24. package/dist/host/AGENTS.md +23 -21
  25. package/dist/host/agents/orchestration.md +43 -18
  26. package/dist/host/agents/platforms/windows.md +3 -3
  27. package/dist/host/agents/skills/orkestrel-align/SKILL.md +10 -13
  28. package/dist/host/agents/skills/orkestrel-align/references/fleet.md +4 -10
  29. package/dist/host/agents/skills/orkestrel-align/references/integration.md +1 -1
  30. package/dist/host/agents/skills/orkestrel-build/SKILL.md +16 -48
  31. package/dist/host/agents/skills/orkestrel-build/agents/openai.yaml +1 -1
  32. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +19 -16
  33. package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +1 -1
  34. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +15 -28
  35. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +5 -6
  36. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +4 -6
  37. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +31 -20
  38. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +3 -4
  39. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +366 -75
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +126 -16
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/chain.ts +323 -0
  42. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +220 -31
  43. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +176 -33
  44. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +294 -59
  45. package/dist/host/agents/skills/orkestrel-dispatch/scripts/patch.ts +401 -0
  46. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +199 -34
  47. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +330 -69
  48. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +10 -8
  49. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +1 -5
  50. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  51. package/dist/host/agents/skills/orkestrel-falsify/scripts/mutate.ts +701 -0
  52. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +16 -12
  53. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +23 -81
  54. package/dist/host/agents/skills/orkestrel-harden/references/centralization.md +4 -5
  55. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -0
  56. package/dist/host/agents/skills/orkestrel-harden/references/document.md +33 -0
  57. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +6 -3
  58. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +8 -4
  59. package/dist/host/agents/skills/orkestrel-harden/references/research.md +2 -0
  60. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +1272 -279
  61. package/dist/host/agents/skills/orkestrel-harden/scripts/measure.ts +425 -0
  62. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +603 -98
  63. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +75 -98
  64. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +54 -17
  65. package/dist/host/agents/skills/orkestrel-journey/references/decide.md +1 -20
  66. package/dist/host/agents/skills/orkestrel-journey/references/layer.md +21 -31
  67. package/dist/host/agents/skills/orkestrel-journey/references/styles.md +1 -1
  68. package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +28 -24
  69. package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +15 -13
  70. package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +1 -0
  71. package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +13 -13
  72. package/dist/host/agents/skills/orkestrel-parallel/scripts/cases.ts +389 -0
  73. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +16 -20
  74. package/dist/host/agents/skills/orkestrel-polish/references/capture-harness.md +16 -26
  75. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +12 -26
  76. package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +2 -2
  77. package/dist/host/agents/skills/orkestrel-publish/references/adopt.md +23 -0
  78. package/dist/host/agents/skills/orkestrel-publish/references/release.md +4 -4
  79. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +10 -9
  80. package/dist/host/agents/skills/orkestrel-publish/references/window.md +20 -25
  81. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +348 -59
  82. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +202 -22
  83. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +1061 -191
  84. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +812 -140
  85. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +280 -38
  86. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +3 -3
  87. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +428 -70
  88. package/dist/host/agents/templates/brief.md +1 -1
  89. package/dist/host/agents/transports/claude-cli.md +3 -3
  90. package/dist/host/agents/transports/codex.md +2 -7
  91. package/dist/host/agents/transports/cursor.md +2 -3
  92. package/dist/host/claude/AGENTS.md +2 -2
  93. package/dist/host/claude/agents/analyst.md +3 -3
  94. package/dist/host/claude/agents/astra.md +3 -3
  95. package/dist/host/claude/agents/builder.md +1 -1
  96. package/dist/host/claude/agents/checker.md +1 -1
  97. package/dist/host/claude/agents/distiller.md +1 -1
  98. package/dist/host/claude/agents/grok.md +1 -1
  99. package/dist/host/claude/agents/opus.md +2 -2
  100. package/dist/host/claude/agents/orkestrel.md +57 -90
  101. package/dist/host/claude/agents/researcher.md +1 -1
  102. package/dist/host/claude/agents/reviewer.md +4 -0
  103. package/dist/host/claude/agents/scout.md +1 -1
  104. package/dist/host/claude/agents/verifier.md +1 -1
  105. package/dist/host/claude/rules/application.md +14 -21
  106. package/dist/host/claude/rules/architecture.md +34 -44
  107. package/dist/host/claude/rules/browser.md +3 -4
  108. package/dist/host/claude/rules/campaign.md +2 -2
  109. package/dist/host/claude/rules/documentation.md +25 -12
  110. package/dist/host/claude/rules/names.md +9 -4
  111. package/dist/host/claude/rules/patterns.md +6 -7
  112. package/dist/host/claude/rules/portability.md +1 -1
  113. package/dist/host/claude/rules/quality.md +4 -5
  114. package/dist/host/claude/rules/styles.md +2 -2
  115. package/dist/host/claude/rules/tests.md +57 -114
  116. package/dist/host/claude/rules/typescript.md +7 -9
  117. package/dist/host/claude/rules/workspace.md +21 -19
  118. package/dist/host/claude/rules/writing.md +2 -5
  119. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +1 -1
  120. package/dist/host/claude/skills/orkestrel-harden/SKILL.md +1 -1
  121. package/dist/host/claude/skills/orkestrel-publish/SKILL.md +1 -1
  122. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +1 -1
  123. package/dist/host/codex/agents/analyst.toml +9 -3
  124. package/dist/host/codex/agents/astra.toml +3 -4
  125. package/dist/host/codex/agents/builder.toml +1 -1
  126. package/dist/host/codex/agents/opus.toml +3 -4
  127. package/dist/host/codex/agents/orkestrel.toml +1 -1
  128. package/dist/host/codex/agents/researcher.toml +2 -2
  129. package/dist/host/codex/agents/verifier.toml +1 -1
  130. package/dist/host/configs/helpers.ts +21 -1
  131. package/dist/host/configs/policy.ts +299 -15
  132. package/dist/host/dotfiles/oxlintrc.json +137 -3
  133. package/dist/host/guides/agent.md +111 -134
  134. package/dist/host/guides/capture.md +801 -0
  135. package/dist/host/guides/probe.md +27 -8
  136. package/dist/host/guides/scaffold.md +96 -18
  137. package/dist/host/guides/study.md +534 -440
  138. package/dist/host/guides/test.md +111 -44
  139. package/dist/host/manifest.json +160 -240
  140. package/dist/host/tests/config.test.ts +971 -187
  141. package/dist/host/tests/policy.test.ts +127 -1
  142. package/dist/host/tests/setupPolicy.ts +893 -33
  143. package/dist/src/core/index.cjs +214 -86
  144. package/dist/src/core/index.cjs.map +1 -1
  145. package/dist/src/core/index.d.cts +122 -38
  146. package/dist/src/core/index.d.ts +122 -38
  147. package/dist/src/core/index.js +209 -85
  148. package/dist/src/core/index.js.map +1 -1
  149. package/dist/src/server/index.cjs +20 -27
  150. package/dist/src/server/index.cjs.map +1 -1
  151. package/dist/src/server/index.js +21 -28
  152. package/dist/src/server/index.js.map +1 -1
  153. package/package.json +11 -11
  154. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +0 -283
  155. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +0 -25
  156. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +0 -333
  157. package/dist/host/guides/supervisor.md +0 -4890
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orkestrel-publish
3
- description: Run an Orkestrel release from layer order to registry confirmation. Use when the user asks to publish a package, to run a fleet-wide release wave, or to recover a release that stalled at the npm approval, and follow it for the per-repository visit, the bump ruling, the layer preparation, the login approval, and the five-minute upload window.
3
+ description: Run an Orkestrel release from layer order to registry confirmation, or adopt a published scaffold release in one consumer. Use when the user asks to publish a package, to run a fleet-wide release wave, to recover a release that stalled at the npm approval, or to adopt a published scaffold release in one repository, and follow it for the per-repository visit, the bump ruling, the layer preparation, the login approval, the upload approval, and the adoption.
4
4
  ---
5
5
 
6
6
  # Publish an Orkestrel release
@@ -14,9 +14,10 @@ description: Run an Orkestrel release from layer order to registry confirmation.
14
14
  here.
15
15
  2. The reference the moment needs: [wave.md](references/wave.md) before visiting a repository,
16
16
  ruling on a bump, or preparing a layer; [window.md](references/window.md) before running
17
- `npm login` or any upload.
17
+ `npm login` or any upload; [adopt.md](references/adopt.md) before one consumer adopts a
18
+ published scaffold release outside a wave.
18
19
  3. The live evidence: the registry's packument for every package in the round, each target's
19
- manifest, and the catalog table the contract names as the layer order.
20
+ manifest, and the catalog table `references/release.md` names as the layer order.
20
21
 
21
22
  ## Scripts
22
23
 
@@ -26,35 +27,20 @@ description: Run an Orkestrel release from layer order to registry confirmation.
26
27
  | `scripts/pins.ts` | `--version PRIOR [--range PRIOR_RANGE ...] [--paths src,tests] [--json]`, run from the package root: lists every line under the paths carrying the prior version literal or a prior range literal, once per line, sweeping a one-comparator range such as `^8.3.0` for its bare version in any form. Exit 0 with no hits, 3 with hits, 64 on usage (no literal, or a flag with no value). |
27
28
  | `scripts/swap.ts` | One mode per run, from any directory: `--pin --consumer DIR --source DIR [--source DIR ...] [--override NAME ...] [--no-build] [--dry-run] [--json]` refuses a source whose packed manifest names a local dependency spec in any dependency field (a `file:` or `link:` prefix, a path start of `.`, `~/`, `/`, `\`, or a drive letter, or a protocol-free archive name ending in `.tgz`, `.tar.gz`, or `.tar` that is not a `user/repo` shorthand), builds and packs each source into `<consumer>/tmp/tarballs/` under a name carrying its SHA-256, records each replaced range in the ledger `pins.json` there, the record of which build the consumer runs, writes each tarball's absolute `file:` spec and each `--override` (repeatable, like `--source`) where oxfmt sorts it, installs, and proves that every pinned source, an override-only one included, is installed with the source's bytes; `--restore --consumer DIR [--package NAME ...] [--json]` puts back each recorded range and override, keeps an `overrides` block that existed before the pin, installs, proves the restored copy, and lists the re-pin arguments, and refuses with 64, before it writes anything, a ledger whose package or override keys are not package names or whose removal would leave `node_modules`; `--status --consumer DIR [--json]` writes nothing and reports drift between the ledger, the manifest, the tarballs, the installed bytes, and the source commits, a manifest spec holding its tarball only when it names the ledger archive's location. `--pin` and `--restore` write a receipt under `tmp/units/`. Exit 0 on success, 1 when a command or a proof failed, 3 when `--status` reports drift, 64 on usage. |
28
29
  | `scripts/wave.ts` | `--visit [--target DIR] [--offline] [--regenerate] [--from STEP] [--to STEP] [--prior VERSION] [--dry-run] [--json] [--out FILE]` runs one repository's visit in the order [wave.md](references/wave.md) § Visit a repository fixes (pin, commit, overwrite, verify, install, pins, format, record, gates, compare), stops at the first failing step, journals each executed step's full output under the target's `tmp/units/wave/` when the work tree ignores `tmp/` and names the journal in its row, and prints each step's exit (a failed step names the `code: message` refusal or the `note` a JSON verb writes on stdout, else the last stderr lines), the bump ruling (the rebuilt dist against the published tarball, and the final runtime dependency set against the published manifest), and a row for `.orkestrel/release.md`; `--prior` names the version a pre-ruled bump replaced so the self-pin sweep finds it; `--plan` prints the packages by layer from the catalog table. An install that fails `ERESOLVE` names the rerun command, and `--regenerate` replaces the lockfile and `node_modules` from the manifest under the refusals and proof [wave.md](references/wave.md) § Regenerate a lock the install cannot move states; `record` commits the overwrite's writes as `Overwrite with scaffold VERSION`. Exit 0 when every step passed, 1 when one failed, 2 when a reading failed, 64 on usage, including `--regenerate` with `--plan`. |
29
- | `scripts/window.ts` | `--whoami [--wait SECONDS]` reads or polls `npm whoami`; `--login` prints the operator's login command and polls `whoami` until it answers; `--publish DIR... --otp CODE` refuses a batch whose nearest `.git` entry is a file, including ancestor entries, with exit 3 before contacting npm; it names a linked worktree's primary clone or identifies a submodule, then uploads back to back with `npm publish --ignore-scripts --otp`, journals each upload under `tmp/units/`, stops at the first refusal naming where to resume, and confirms each accepted version against the registry; `--confirm NAME@VERSION...` re-reads the registry until it serves the version. Exit 0 on success, 3 when not. |
30
+ | `scripts/window.ts` | `--whoami [--wait SECONDS]` reads or polls `npm whoami`; `--login` prints the operator's login command and polls `whoami` until it answers; `--publish DIR... --otp CODE` refuses a batch whose nearest `.git` entry is a file, including ancestor entries, with exit 3 before contacting npm; it names a linked worktree's primary clone or identifies a submodule, then uploads back to back with `npm publish --ignore-scripts --otp`, journals each upload under `tmp/units/`, stops at the first refusal naming where to resume, and confirms each accepted version against the registry; `--confirm NAME@VERSION...` re-reads the registry until it serves the version. Exit 0 on success, 3 when not, 64 on usage. |
30
31
 
31
- The user's current instruction wins. `references/release.md` owns the credential
32
- and authorization law; nothing here weakens it.
33
-
34
- ## The boundary with the contract
35
-
36
- `references/release.md` binds every release, and this skill does not
37
- repeat it. Read that section for the credential and approval law, the long-running-command
38
- binding, the serialization of uploads, the tarball swap that serves a consumer whose dependency
39
- has not published, what a bump obliges downstream, and where the layer order comes from.
40
-
41
- This skill carries what an operator needs while a release is running: the per-repository visit,
42
- the bump ruling, the preparation order, the login and approval mechanics, and the window.
43
-
44
- Where the skill and the contract disagree, the contract wins. Report the drift instead of
45
- following the skill.
32
+ The user's current instruction wins. `references/release.md` binds every release: the credential and authorization law, the upload serialization, the tarball swap, what a bump obliges downstream, and the layer order. Nothing here weakens it. Where this skill disagrees with it, report the drift instead of following the skill.
46
33
 
47
34
  ## Run the release
48
35
 
49
36
  1. **Name the round.** List the packages the release covers, and group them into layers with
50
- `node .agents/skills/orkestrel-publish/scripts/wave.ts --plan`, which reads the contract's
51
- layer order from the catalog table.
37
+ `node .agents/skills/orkestrel-publish/scripts/wave.ts --plan`, which reads the layer order
38
+ from the catalog table.
52
39
  2. **Take the registry evidence.** Read what the registry serves for every package in the round.
53
40
  Derive each pin from that reading, never from a local manifest.
54
41
  3. **Visit each repository.** Run `node .agents/skills/orkestrel-publish/scripts/wave.ts --visit --target <repository>`,
55
42
  which runs the visit in [wave.md](references/wave.md) in its stated order and stops at the first
56
- failing step; repair that step by hand and re-run from it with `--from`; for an `ERESOLVE`, follow [wave.md](references/wave.md) § Regenerate a lock the install cannot move. Run visits in parallel
57
- slices of disjoint repositories, each slice serial inside itself.
43
+ failing step; repair that step by hand and re-run from it with `--from`; for an `ERESOLVE`, follow [wave.md](references/wave.md) § Regenerate a lock the install cannot move.
58
44
  4. **Rule on each package's bump.** Take the visit's comparison and range reading; repeat `compare.ts` only after the artifact changes or an unanswered result. Apply the triggers in [wave.md](references/wave.md) § Rule on
59
45
  the bump; `references/release.md` § What a bump obliges owns the blast radius.
60
46
  5. **Prepare the whole layer before authenticating**, in the order [wave.md](references/wave.md)
@@ -69,8 +55,8 @@ following the skill.
69
55
  8. **Close the layer from the registry, then prepare the next**, per [wave.md](references/wave.md)
70
56
  § Prepare a layer.
71
57
 
72
- Run that sequence for every layer, from the registry reading to the registry close. Refresh the
73
- registry evidence between layers rather than carrying the previous round's reading forward.
58
+ Run that sequence for every layer, from the registry reading to the registry close;
59
+ [wave.md](references/wave.md) § Refresh the registry between layers owns the refresh.
74
60
 
75
61
  ## Accept the release
76
62
 
@@ -81,7 +67,7 @@ Completion requires:
81
67
  - every obligation `references/release.md` § What a bump obliges places on a published package's dependents has closed as
82
68
  that section requires;
83
69
  - every tarball swap is restored per `references/release.md` § Fix a dependency before it publishes, and no target
84
- repository is left holding an uncommitted bump or an unpushed commit;
70
+ repository is left holding an uncommitted bump or an unpushed commit the user has not held;
85
71
  - every gate that proved a package ran outside the window and against the artifact that shipped;
86
72
  - every gate red at a package's baseline for a cause `ROADMAP.md` already carries is recorded as a
87
73
  standing reading beside the package's row with its carrier, and the release report names it. A
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: 'Publish Orkestrel Release'
3
- short_description: 'Run a release in layer order through the npm approval window'
4
- default_prompt: 'Use $orkestrel-publish to run the release - layer order, per-repository visit, bump ruling, layer preparation, login approval, upload window, and registry confirmation.'
3
+ short_description: 'Run a release in layer order through the npm approval, or adopt a scaffold release in one consumer'
4
+ default_prompt: 'Use $orkestrel-publish to run the release - layer order, per-repository visit, bump ruling, layer preparation, login approval, upload approval, and registry confirmation - or to adopt a published scaffold release in one consumer.'
@@ -0,0 +1,23 @@
1
+ # Adopt a published scaffold release in one consumer
2
+
3
+ This file governs one consumer taking a published `@orkestrel/scaffold` release outside a release wave. [wave.md](wave.md) § Visit a repository owns the visit a wave runs; [release.md](release.md) § The scaffold surface owns what a vendored-only release obliges.
4
+
5
+ Every verb and flag below is in `guides/scaffold.md` § Command line. `audit` writes nothing; `repair` writes each planned path the target is missing or has let drift, and reconciles the declared `@orkestrel/*` ranges and the script region on every run, whatever `--groups` names.
6
+
7
+ ## Steps
8
+
9
+ 1. **Restore pins.** Restore every tarball pin the consumer holds with `scripts/swap.ts --restore`, per [release.md](release.md) § Fix a dependency before it publishes, so the adoption reads registry ranges.
10
+ 2. **Re-pin.** Read the registry's `@orkestrel/scaffold` version, set the consumer's range to the caret of that release, and commit nothing yet.
11
+ 3. **Install against the registry.** Run `npm install` with `npm_config_prefer_online=true`, per [wave.md](wave.md) § Refresh the registry between layers. A cached packument answers `notarget` for a version the registry already serves.
12
+ 4. **Read the drift.** Run `scaffold audit` from the consumer, and add `--groups <list>` to scope it to the groups the consumer takes. Read its questions and findings before writing.
13
+ 5. **Repair.** Run `scaffold repair --groups <list>` over the groups the consumer takes, named per `guides/scaffold.md` § Groups. Omit `--offline`: it writes the distributed floors, not the registry's.
14
+ 6. **Restore held ranges.** `repair` rewrites the declared `@orkestrel/*` ranges and the showcase pair on every run (`guides/scaffold.md` § Dependency floors), so diff the manifest against `HEAD` and put back every range the consumer holds on purpose. The consumer's plan or ledger names each hold.
15
+ 7. **Reinstall.** Run the install of step 3 again; the restored manifest no longer matches the lockfile the first install wrote.
16
+ 8. **Run the gates.** Run the gate chain the consumer's manifest declares. `scaffold audit` exits `0` when the target matches its plan, `1` on drift, and `2` on a usage error. A drift a held range causes is expected; name it.
17
+ 9. **Rebuild committed artifacts.** Rebuild every artifact the consumer's plan names as committed (a generated registry, a snapshot, a mirror) with the consumer's own script, and read the diff.
18
+ 10. **Commit** by explicit paths, with the scaffold version in the message. A push to the remote waits for the user's go-ahead.
19
+
20
+ ## Refuse
21
+
22
+ - Never run `repair` against the `@orkestrel/scaffold` checkout; the verb refuses it with the `TARGET` code.
23
+ - Never edit a vendored file in the consumer to quiet `audit`; change it in the scaffold repository and release, per [release.md](release.md) § The scaffold surface.
@@ -1,11 +1,11 @@
1
1
  # Release laws
2
2
 
3
- `orkestrel-publish/SKILL.md` names this file. It carries the fleet release rules that bind an executor who is publishing or preparing a package to publish.
3
+ The `orkestrel-publish` skill names this file. It carries the fleet release rules that bind an executor who is publishing or preparing a package to publish.
4
4
 
5
5
  ## Publishing is the user's
6
6
 
7
7
  - Publishing is the user's decision and the user's credential. Prepare, surface the approval, and run the publishes the user asked for. Never substitute an API key, an access token, a copied auth file, or another login flow, and never ask the user to paste a token into the conversation.
8
- - A publish chain is a long-running command: write it as a TypeScript file and launch it through the `orkestrel-dispatch` skill's `scripts/launch.ts`; confirm the previous chain is dead by process id before starting another. Publish serially; concurrent publishes collide on the authentication handshake.
8
+ - A publish chain is a long-running command: write it as a plan for the `orkestrel-dispatch` skill's `scripts/chain.ts` and launch the chain through that skill's `scripts/launch.ts`; confirm the previous chain is dead by process id before starting another. Publish serially; concurrent publishes collide on the authentication handshake.
9
9
  - A wave over unpublished tips derives its order per run from the dependency graph and records only the round each package landed in.
10
10
 
11
11
  ## Fix a dependency before it publishes
@@ -29,8 +29,8 @@ When a consumer needs a dependency's unpublished source, to meet a defect that l
29
29
  - A runtime `dependencies` bump reaches every consumer: each package downstream re-pins, re-runs its gates, bumps, and republishes in layer order.
30
30
  - A development `devDependencies` bump reaches nobody: re-pin, prove the gates green, commit to `main`; do not bump or publish.
31
31
  - A development bump that moves the published artifact is a runtime bump. Prove the direction with the build: rebuild after the re-pin and run `node .agents/skills/orkestrel-publish/scripts/compare.ts`, which compares `dist/` against the published tarball on material content only. Exit 3 bumps and publishes that package, and its dependents follow the runtime rule.
32
- - Every package is `0.0.x`, where a caret pins one exact release, so the fleet publishes in topological layer order derived from runtime `dependencies` and `peerDependencies` edges, never from a development edge.
33
- - Read the order from the catalog table in `.claude/agents/orkestrel.md`, regenerated with `scaffold catalog` before sequencing a cascade. Never write a second order elsewhere.
32
+ - A `0.0.x` caret pins one exact release, so the fleet publishes in topological layer order derived from runtime `dependencies` and `peerDependencies` edges, never from a development edge.
33
+ - Read each package's version and layer from the catalog table in `.claude/agents/orkestrel.md`, regenerated with `scaffold catalog` before sequencing a cascade. Never write a second order elsewhere.
34
34
 
35
35
  ## The scaffold surface
36
36
 
@@ -23,10 +23,14 @@ overwrite receipts are written only where the work tree ignores `tmp/`.
23
23
  rewrite a peer range only when its name shares an audited release reading. For example, with
24
24
  peer-only `@orkestrel/peer-only: ^0.0.1`, leave that peer unchanged; with a planned tool whose
25
25
  registry serves `8.3.4`, apply `vite: ~8.2.0 -> ^8.3.4` even though the tilde excludes `8.3.4`.
26
+ Keep a wave within each declared major. For a workspace whose selected framework activates a
27
+ `TOOLCHAIN_HOLDS` row, keep the tool within that range's major; read the audit question for its reason. Prove
28
+ that framework on the later major before lifting its hold.
26
29
  2. Commit the manifest and the lockfile as the preparation commit. `scaffold overwrite` refuses a
27
30
  tree carrying uncommitted changes, and the install left both dirty.
28
- 3. Run `scaffold overwrite`. One run repairs the `AGENTS.md` and `CLAUDE.md` pointers and deletes
29
- every tracked copy the target still holds at an instruction-canon path. Prove the sweep with a
31
+ 3. Run `scaffold overwrite`. One run repairs the `AGENTS.md` pointer and the skill pointer set and
32
+ deletes every tracked copy the target still holds at an instruction-canon path, a `CLAUDE.md`
33
+ included; the plan ships no `CLAUDE.md`. Prove the sweep with a
30
34
  second `scaffold audit` that exits `0`.
31
35
  - Where the target's `.claude/agents/orkestrel.md` carries a body outside the marker-bounded
32
36
  table that differs from the floor copy the installed scaffold stages, delete the file and
@@ -144,11 +148,9 @@ registry copy over any staged tip, so every consumer stays red until that tip is
144
148
  - When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor.
145
149
  - When a package still carries `.github/workflows/ci.yml`, delete it in that visit; the ecosystem runs no hosted CI.
146
150
  - Before the release, rule the package's guide and source comments against `.claude/rules/writing.md` § Substitutions and reword each hit its rows name; identifiers stay.
147
- - Compare release packs between hosts by paths, sizes, and content hashes, and report executable-mode differences separately; a pack made on Windows records `0644` for an entry git tracks as `100755`.
151
+ - Compare release packs between hosts by paths, sizes, and content hashes, and report executable-mode differences separately (`.agents/platforms/windows.md` § Release packs and terminals).
148
152
 
149
- An unpublished package's first version is `0.0.1`. Do not bump it before that first publish. The
150
- registry has nothing to serve, so there is no version to move away from, and bumping produces a
151
- package whose history starts at a number nothing explains.
153
+ An unpublished package's first version is `0.0.1`. Do not bump it before that first publish.
152
154
 
153
155
  Prepare a published package's layer in this order, after the visit has ruled the package's bump:
154
156
 
@@ -175,9 +177,8 @@ Prepare the next layer only after this one is on the registry. A dependent's new
175
177
  install until the version it names exists, so preparation and publication interleave and cannot be
176
178
  batched ahead.
177
179
 
178
- The window is for uploads. Every gate, build, install, and commit happens outside it, which is
179
- what makes `--ignore-scripts` the right flag at publish time: the artifact was already proved, and
180
- the flag is what stops the gate chain running a second time inside the five minutes.
180
+ The window is for uploads. Every gate, build, install, and commit happens outside it; publish with
181
+ `--ignore-scripts` so the gate chain does not run a second time on the proved artifact.
181
182
 
182
183
  ## Sweep the self-pins
183
184
 
@@ -13,16 +13,18 @@ rest of the layer either fits inside it or takes another approval.
13
13
 
14
14
  - Read the session with `node .agents/skills/orkestrel-publish/scripts/window.ts --whoami`; `--login` prints the command the operator runs in a real terminal and polls `whoami` until it answers. No child of a script holds the TTY npm needs, so the login itself is the operator's.
15
15
 
16
- - Run the login and every browser-authorized publish under `script -qfc '<command>' <log>`. npm
17
- offers the browser approval only when it sees a TTY; without one it fails `EOTP` with no way to
18
- answer. The one-time-code path runs under captured pipes instead, per § Authorize the upload.
16
+ - Run the login and every browser-authorized publish in a real terminal: npm offers the browser
17
+ approval only when it sees a TTY, and without one it fails `EOTP` with no way to answer. A POSIX
18
+ Orchestrator gives npm one with `script -qfc '<command>' <log>`; on Windows the operator runs the
19
+ command (`.agents/platforms/windows.md` § Release packs and terminals). The one-time-code path
20
+ runs under captured pipes instead, per § Authorize the upload.
19
21
  - Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
20
22
  `Press ENTER to open in the browser...` and blocks. Never answer that prompt with a newline: the
21
23
  web flow consumes the newline on a later read, drops to a legacy `Username:` prompt, and exits
22
24
  **zero** without authenticating. With the flag npm prints the URL and polls, and stdin stays
23
25
  untouched.
24
- - Hold stdin open and write nothing to it. Use a fifo held open by a long `sleep`. EOF drops npm
25
- to the same legacy prompt a stray newline does.
26
+ - Write nothing to npm's stdin and never close it: EOF drops npm to the same legacy prompt a
27
+ stray newline does.
26
28
  - Run `npm login` before any publish. The `npm publish` command does not open the browser flow:
27
29
  unauthenticated it returns `E404` on `PUT`, which reads as a missing package rather than as a
28
30
  missing credential.
@@ -33,14 +35,12 @@ rest of the layer either fits inside it or takes another approval.
33
35
  - Read a login log that shows the spinner and then a legacy `Username:` prompt as a dead attempt
34
36
  rather than as a prompt to answer: expired, or refused on its first poll per § Read a `403` on the
35
37
  poll. Kill it by the process id recorded at its launch, per the `orkestrel-dispatch` skill's launch
36
- reference § Kill and relaunch. Every browser-authorized publish here runs under the same `script -qfc` form, so
37
- a pattern over the process list reaches a live upload as readily as the dead login.
38
- - On a Windows host, Git Bash ships no `script` binary, so a browser-authorized upload is
38
+ reference § Kill and relaunch.
39
+ - Where the Orchestrator has no TTY to give npm, a browser-authorized upload is
39
40
  operator-driven: prepare the layer, prove the gates, surface the exact `npm publish` command, and
40
41
  the operator runs it in a real terminal. Everything before and after the upload — bumps, re-pins,
41
42
  gates, registry reads — stays with the Orchestrator, and the one-time-code path in § Authorize the
42
- upload runs through `window.ts` on every host. The fifo stdin law still binds a browser-authorized
43
- upload on that host.
43
+ upload runs through `window.ts` on every host.
44
44
 
45
45
  ## Reach the approval
46
46
 
@@ -53,8 +53,7 @@ rest of the layer either fits inside it or takes another approval.
53
53
  prints `https://www.npmjs.com/auth/cli/<id>`.
54
54
  - Never shorten, redirect-strip, or otherwise improve a minted URL. The bare
55
55
  `https://www.npmjs.com/login/cli/<id>` target the login URL names is not a page: opened in a
56
- browser it answers `{"message":"Unauthorized"}`. The user then reads a broken chain where the
57
- chain is healthy, and the operator diagnoses the wrong failure.
56
+ browser it answers `{"message":"Unauthorized"}`.
58
57
  - Expect an unclicked session to die about 45 seconds after it is minted. Measured on 2026-08-27
59
58
  against `registry.npmjs.org` with `npm` 10.9.7 and `node` 22.22.2: npm polls `GET /-/v1/done`
60
59
  every few seconds and takes `202` while the session waits, and the registry answers `403` at
@@ -78,8 +77,7 @@ rest of the layer either fits inside it or takes another approval.
78
77
  - Read the URL out of the journal in the foreground and surface it before arming any watcher. A
79
78
  watcher-based relay can fail silently, and its silence is indistinguishable from a chain that
80
79
  has not reached the URL yet.
81
- - Relay the URL as plain text. A decorated link did not render for the operator, who then had
82
- nothing to click while the window ran down.
80
+ - Relay the URL as plain text; a decorated link did not render for the operator.
83
81
  - Re-read the log before treating an approval as failed. The chain is sometimes still alive on a
84
82
  later URL, so surface that one rather than starting the chain again.
85
83
  - Read a `404` on an approval URL as a publish that already succeeded and consumed it. Read the
@@ -92,9 +90,8 @@ rest of the layer either fits inside it or takes another approval.
92
90
  - Take the account's one-time code where the account has one. The
93
91
  `npm publish --ignore-scripts --otp=<code>` command uploads with no browser authorization and no
94
92
  poll. The code has its own life: measured on 2026-09-04 against `registry.npmjs.org`, one code
95
- carried every upload of a layer started within about a minute of its first use, console at
96
- 20:25:02 through router at 20:25:58, and the upload started at 20:25:58 was refused `EOTP` at
97
- 20:26:00; a code read before its layer was ready was refused at its first upload.
93
+ carried every upload of a layer started within about a minute of its first use, and a code read
94
+ before its layer was ready was refused at its first upload.
98
95
  - Prepare the whole layer, then ask for one code at the moment the layer's first upload starts, and
99
96
  chase the layer's uploads back-to-back inside that code's life with no gate between them. A code
100
97
  read minutes earlier is already spent.
@@ -103,12 +100,11 @@ rest of the layer either fits inside it or takes another approval.
103
100
  from that package on a fresh code. Never retry the refused upload on the same code.
104
101
  - Ask for the code and nothing else. Never ask for a password, an access token, or an auth file.
105
102
  `release.md` § Publishing is the user's owns that law.
106
- - A one-time-code upload needs no terminal arming: `window.ts --publish` holds the upload under
107
- captured pipes, where npm's non-TTY guard rethrows an authentication refusal instead of prompting,
108
- so a spent code is refused `EOTP` with no prompt and no browser flow, which is the stop the runner
109
- reads. The runner passes `--browser=false` and re-reads `whoami` immediately before the first
110
- upload. Never run a one-time-code upload on a TTY: there npm answers a refused code with a prompt
111
- the chain cannot see.
103
+ - A one-time-code upload needs no terminal arming: `window.ts --publish` runs it under captured
104
+ pipes, where a spent code is refused `EOTP` with no prompt and no browser flow, which is the stop
105
+ the runner reads. The runner passes `--browser=false` and re-reads `whoami` immediately before the
106
+ first upload. Never run a one-time-code upload on a TTY: there npm answers a refused code with a
107
+ prompt the chain cannot see.
112
108
  - Fall back to the browser authorization where the account answers with no code. That path mints
113
109
  the `auth/cli/<id>` URL, needs the click inside the session's life, and opens the five-minute
114
110
  window.
@@ -184,5 +180,4 @@ the same status. Rule from the evidence, never from which cause reads likelier.
184
180
  - Rule on a pack-time manifest-rewriting warning by fetching the registry's copy of the manifest,
185
181
  never by the warning's own text.
186
182
  - Re-read the registry before telling the user a package failed. A chain still running, a retry
187
- that landed, and CDN lag all produce a failure reading that the registry contradicts, and a
188
- false failure report costs a needless approval and a needless republish.
183
+ that landed, and CDN lag all produce a failure reading that the registry contradicts.