@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
@@ -1,25 +1,16 @@
1
1
  ---
2
- name: orkestrel-polish-surface
3
- description: Drive a rendered or externally driven surface to shipped quality through capture-evidence verdict rounds. Use when asked to polish an interface, bring a rendered surface to enterprise grade, judge what actually renders rather than what the source claims, reconcile design, state-truth, and inventory findings into fix units, or converge repeated review rounds on captured proof. Run one round for a narrow request; run the full campaign for a polish or production-readiness request.
2
+ name: orkestrel-polish
3
+ description: Drive a rendered or externally driven surface to shipped quality through one capture-evidence verdict round and its fix units. Use when asked to polish an interface, bring a rendered surface to enterprise grade, judge what actually renders rather than what the source claims, or reconcile design, state-truth, and inventory findings into fix units on captured proof. Run a verdict alone for a narrow request; run the round with its fix units for a polish or production-readiness request.
4
4
  ---
5
5
 
6
6
  # Polish a rendered surface
7
7
 
8
- ## Load authority
8
+ ## Read
9
9
 
10
- Read the current files in this order:
11
-
12
- 1. `AGENTS.md`.
13
- 2. Every applicable `.claude/rules/*.md`. The style, browser, test, and documentation
14
- laws bind every fix unit; this skill adds only the campaign.
15
- 3. [capture-harness.md](references/capture-harness.md) before building, eyeballing, or
16
- trusting a portfolio.
17
- 4. `guides/README.md`, the governing guide for the surface, and `ROADMAP.md` when present.
18
- 5. The authoritative `*/types.ts` for the surface, its components and partials, and the
19
- shipped resolved cascade of every stylesheet the surface actually loads.
20
-
21
- Treat the current user instruction as authoritative. Treat repository rules as the coding
22
- contract and this skill as the workflow. Preserve dirty and user-owned work.
10
+ `AGENTS.md` § Authority and loading names the files every unit reads. This skill adds
11
+ [capture-harness.md](references/capture-harness.md) before building, eyeballing, or trusting a
12
+ portfolio, the authoritative `*/types.ts` for the surface, its components and partials, and the
13
+ shipped resolved cascade of every stylesheet the surface loads. Preserve dirty and user-owned work.
23
14
 
24
15
  ## Judge the rendering, not the source
25
16
 
@@ -41,14 +32,14 @@ supposed to produce it. Source-reading review passes a component that renders no
41
32
  Choose the smallest scope that satisfies the request:
42
33
 
43
34
  - **Verdict:** one portfolio, one lane, no fixes.
44
- - **Round:** portfolio → independent verdicts → reconciliation → fix units →
45
- recapture.
46
- - **Campaign:** rounds repeated until one terminal converged line, then independent gates.
35
+ - **Round:** portfolio → independent verdicts → reconciliation → fix units → recapture → one
36
+ re-verdict on the repaired items → independent gates.
47
37
 
48
38
  A narrow verdict request does not authorize fixes. A polish request authorizes fixing every
49
- confirmed finding in scope and rebuilding the harness gaps the verdicts expose.
39
+ confirmed finding in scope and rebuilding the harness gaps the verdicts expose. A second round
40
+ over the same surface needs an instruction from the user.
50
41
 
51
- ## Execute the campaign
42
+ ## Execute the round
52
43
 
53
44
  1. **Build the portfolio.** Produce the full evidence set with the harness reference, then
54
45
  eyeball every artifact yourself before spending a verdict round on it. An unexamined
@@ -60,9 +51,10 @@ confirmed finding in scope and rebuilding the harness gaps the verdicts expose.
60
51
  § "Return the fixed verdict shape" fixes. The
61
52
  lanes are subjective design fit; objective state truth; and mechanical inventory of
62
53
  copy, classes, icons, and accessibility attributes. This is the surface variant of the
63
- adversarial pass in `.agents/orchestration.md`, so its rules bind: each lane is a fresh
64
- subagent with a clean context, run in parallel, blind to the others until all have
65
- returned, and no lane is dropped because an engine is dark.
54
+ review in `.agents/orchestration.md` § Size gate, so its rules bind: each lane is a fresh
55
+ subagent with a clean context, blind to the others until reconciliation, run once, and no
56
+ lane is dropped because an engine is dark. A narrow verdict request runs the selected lane once
57
+ and stops.
66
58
  4. **Reconcile.** Confirmed findings get carriers; refuted findings die on the record with
67
59
  the evidence that killed them; conflicts get a dated ruling. Then walk the reconciled
68
60
  list once and name the fix-brief item carrying each finding — a finding with no carrier
@@ -71,14 +63,14 @@ confirmed finding in scope and rebuilding the harness gaps the verdicts expose.
71
63
  truth the subjective lane reads. Each unit records the failing proof before the
72
64
  repair — the exact command and its red count — and the same command's green count
73
65
  after. Commit each accepted unit before dispatching the next.
74
- 6. **Cross-audit.** A fix unit's auditor is an engine that did not write it. Same-engine
75
- re-review returns the author's own blind spot.
76
- 7. **Recapture,** repairing every harness gap the verdicts exposed, and re-verdict against
77
- the new portfolio, not the old one.
78
- 8. **Iterate to the terminal line.** Repeat rounds until every lane returns converged. The item
79
- inventory is fixed at the first judged portfolio; later rounds add only regressions of an item
80
- already in it and gaps an earlier portfolio could not show. A fresh preference about an item
81
- already converged is recorded for the next campaign, not made this one's blocker.
66
+ 6. **Defer each fix unit's review to the re-verdict.** No separate cross-audit runs; a fix that
67
+ adopted the verdict's prescription verbatim closes with the recapture alone.
68
+ 7. **Recapture,** repairing every harness gap the verdicts exposed. The re-verdict reads the
69
+ recaptured portfolio, never the old one.
70
+ 8. **Re-verdict the repaired items once.** Point the lanes at the recaptured portfolio and only at
71
+ the items the fix units repaired, plus regressions of an item already in the inventory. A
72
+ fresh preference about an item already converged is recorded for the user, not made this
73
+ round's blocker. An item still open after the re-verdict is reported open; the round ends.
82
74
  9. **Verify independently.** An independent runner executes the repository-prescribed
83
75
  gates; a fixer's own report never establishes green.
84
76
 
@@ -115,7 +107,7 @@ line, or a green claim from the engine that wrote the code. Completion requires:
115
107
  - every confirmed finding fixed or explicitly ruled out of scope on the record;
116
108
  - a final portfolio whose captures show the accepted state;
117
109
  - red-then-green evidence for every defect unit;
118
- - every lane converged in one round against that final portfolio;
110
+ - every repaired item converged in the re-verdict against that final portfolio, and every open item named;
119
111
  - independent gate evidence.
120
112
 
121
113
  Report what changed, which capture proves each change, the exact test and gate results, and
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: 'Polish Rendered Surface'
3
3
  short_description: 'Drive a rendered surface to shipped quality on captured evidence'
4
- default_prompt: 'Use $orkestrel-polish-surface to bring this rendered surface to shipped quality on captured evidence.'
4
+ default_prompt: 'Use $orkestrel-polish to bring this rendered surface to shipped quality on captured evidence.'
@@ -6,7 +6,7 @@ project can host — a served page, a foreign client, a process the runner canno
6
6
  Choose one source per surface, and never judge a round against a portfolio that is part
7
7
  journey-generated and part spawned.
8
8
 
9
- - Read the `orkestrel-prove-journey` skill for how the journey run generates a portfolio. This file
9
+ - Read the `orkestrel-journey` skill for how the journey run generates a portfolio. This file
10
10
  adds only what the review requires of a portfolio and how a spawned harness produces one.
11
11
  - Own the spawned harness as the campaign owner. Never let a verdict lane write or edit it.
12
12
  - Treat the spawned harness as a throwaway instrument: written for this surface, rebuilt or deleted
@@ -31,7 +31,7 @@ Apply this section to a spawned harness only.
31
31
  ## Validate the seed before capturing
32
32
 
33
33
  Apply this section to a spawned harness only. In the journey run the acceptance journey is the seed,
34
- and `orkestrel-prove-journey` fixes how it enters and what it may reach past.
34
+ and `orkestrel-journey` fixes how it enters and what it may reach past.
35
35
 
36
36
  - Build seed payloads from the surface's own published contract, never from memory of it; a
37
37
  near-miss field name renders an empty screen that reads as a product defect.
@@ -60,7 +60,7 @@ itself.
60
60
  row only where the surface declares none.
61
61
  - Read the journey run's per-variant written artifact for the accessibility snapshot and the logs,
62
62
  and cite the statechart harness by its deep link where a lane must watch the widget move rather
63
- than read a still of it. `orkestrel-prove-journey` fixes what each holds and what each is named
63
+ than read a still of it. `orkestrel-journey` fixes what each holds and what each is named
64
64
  for.
65
65
  - Shoot the whole surface before selecting or focusing anything inside it. A capture taken after a
66
66
  selection reports a duplicate or highlighted artifact that does not exist.
@@ -5,26 +5,34 @@ description: Run an Orkestrel release from layer order to registry confirmation.
5
5
 
6
6
  # Publish an Orkestrel release
7
7
 
8
- ## Load authority
8
+ ## Read
9
9
 
10
- Read the current files in this order:
10
+ `AGENTS.md` § Authority and loading names the files every unit reads. This skill adds, in this order:
11
11
 
12
- 1. `AGENTS.md` and every applicable `.claude/rules/*.md` file.
13
- 2. `.agents/orchestration.md` § Publishing the fleet, § Long-running commands, § Orchestrator and
14
- executor, § Writing concurrency, and § Dispatch anatomy. Each named section binds every step
12
+ 1. `references/release.md`, the `orkestrel-dispatch` skill and the launch reference it names, and `.agents/orchestration.md` § Routing,
13
+ § Parallelism, and § Dispatch. Each named section binds every step
15
14
  here.
16
- 3. The reference the moment needs: [wave.md](references/wave.md) before visiting a repository,
15
+ 2. The reference the moment needs: [wave.md](references/wave.md) before visiting a repository,
17
16
  ruling on a bump, or preparing a layer; [window.md](references/window.md) before running
18
17
  `npm login` or any upload.
19
- 4. The live evidence: the registry's packument for every package in the round, each target's
18
+ 3. The live evidence: the registry's packument for every package in the round, each target's
20
19
  manifest, and the catalog table the contract names as the layer order.
21
20
 
22
- The user's current instruction wins. The contract's § Publishing the fleet owns the credential
21
+ ## Scripts
22
+
23
+ | Script | Does |
24
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
25
+ | `scripts/compare.ts` | `[--package NAME] [--version V] [--tarball PATH] [--dist dist] [--json]`, run from the package root after its build: fetches the published tarball and lists the material differences from the rebuilt `dist/` (sourcemaps excluded, whitespace-only differences ignored). Exit 0 when nothing differs, 3 when something does, 2 when the tarball cannot be read, 64 on usage (no package name, no `dist/`, or `--tarball` with no path). |
26
+ | `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
+ | `scripts/wave.ts` | `--visit [--target DIR] [--offline] [--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, gates, compare), stops at the first failing step, and prints each step's exit, 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. Exit 0 when every step passed, 1 when one failed, 2 when a reading failed, 64 on usage. |
28
+ | `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` 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. |
29
+
30
+ The user's current instruction wins. `references/release.md` owns the credential
23
31
  and authorization law; nothing here weakens it.
24
32
 
25
33
  ## The boundary with the contract
26
34
 
27
- `.agents/orchestration.md` § Publishing the fleet binds every release, and this skill does not
35
+ `references/release.md` binds every release, and this skill does not
28
36
  repeat it. Read that section for the credential and approval law, the long-running-command
29
37
  binding, the serialization of uploads, the tarball swap that serves a consumer whose dependency
30
38
  has not published, what a bump obliges downstream, and where the layer order comes from.
@@ -37,20 +45,25 @@ following the skill.
37
45
 
38
46
  ## Run the release
39
47
 
40
- 1. **Name the round.** List the packages the release covers, and group them into layers by the
41
- contract's layer order.
48
+ 1. **Name the round.** List the packages the release covers, and group them into layers with
49
+ `node .agents/skills/orkestrel-publish/scripts/wave.ts --plan`, which reads the contract's
50
+ layer order from the catalog table.
42
51
  2. **Take the registry evidence.** Read what the registry serves for every package in the round.
43
52
  Derive each pin from that reading, never from a local manifest.
44
- 3. **Visit each repository.** Run the visit in [wave.md](references/wave.md) in its stated order,
45
- in parallel slices of disjoint repositories, each slice serial inside itself.
46
- 4. **Rule on each package's bump.** Apply the triggers in [wave.md](references/wave.md) § Rule on
47
- the bump; the contract's § What a bump obliges owns the blast radius.
53
+ 3. **Visit each repository.** Run `node .agents/skills/orkestrel-publish/scripts/wave.ts --visit --target <repository>`,
54
+ which runs the visit in [wave.md](references/wave.md) in its stated order and stops at the first
55
+ failing step; repair that step by hand and re-run from it with `--from`. Run visits in parallel
56
+ slices of disjoint repositories, each slice serial inside itself.
57
+ 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
58
+ the bump; `references/release.md` § What a bump obliges owns the blast radius.
48
59
  5. **Prepare the whole layer before authenticating**, in the order [wave.md](references/wave.md)
49
60
  § Prepare a layer fixes. Every one of those steps happens outside the window.
50
- 6. **Reach the approval.** Follow [window.md](references/window.md), and launch the login chain
51
- only after the user signals they are at the keyboard.
61
+ 6. **Reach the approval.** Follow [window.md](references/window.md): run
62
+ `node .agents/skills/orkestrel-publish/scripts/window.ts --login` only after the user signals
63
+ they are at the keyboard, and read its `whoami` answer as the session.
52
64
  7. **Authorize and upload.** Follow [window.md](references/window.md). Take the account's one-time
53
- code where it has one; § Authorize the upload there fixes that code's life and the layer it
65
+ code where it has one and run
66
+ `node .agents/skills/orkestrel-publish/scripts/window.ts --publish <layer directories> --otp <code>`; § Authorize the upload there fixes that code's life and the layer it
54
67
  carries. Where the account answers with no code, follow § Spend the window there.
55
68
  8. **Close the layer from the registry, then prepare the next**, per [wave.md](references/wave.md)
56
69
  § Prepare a layer.
@@ -64,9 +77,9 @@ Completion requires:
64
77
 
65
78
  - every package the round named has ended published at a registry-confirmed version, published on
66
79
  a later round with the reason recorded, or ruled as no bump with the evidence that ruled it;
67
- - every obligation § What a bump obliges places on a published package's dependents has closed as
80
+ - every obligation `references/release.md` § What a bump obliges places on a published package's dependents has closed as
68
81
  that section requires;
69
- - every tarball swap is restored per § Fixing a dependency before it publishes, and no target
82
+ - every tarball swap is restored per `references/release.md` § Fix a dependency before it publishes, and no target
70
83
  repository is left holding an uncommitted bump or an unpushed commit;
71
84
  - every gate that proved a package ran outside the window and against the artifact that shipped;
72
85
  - every gate red at a package's baseline for a cause `ROADMAP.md` already carries is recorded as a
@@ -0,0 +1,39 @@
1
+ # Release laws
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.
4
+
5
+ ## Publishing is the user's
6
+
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.
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
+
11
+ ## Fix a dependency before it publishes
12
+
13
+ When a consumer meets a defect that lives in a package it only has from the registry, build the dependency from source, pack it, and install the tarball into the consumer. Do not wait for the release and do not work around it in the consumer.
14
+
15
+ - Install the tarball; never link it. A link skips packing, the `files` list, and the exports map.
16
+ - Write the build, pack, and install to a script and run the file.
17
+ - Record the range you replaced in the same step that replaces it.
18
+ - Rebuild and repack whenever the dependency's source moves; a stale tarball is a stale `dist/`.
19
+ - Delete the consumer's `node_modules/.vite` directory after every tarball install, or install into a fresh worktree; Vite keys its pre-bundle on the installed version.
20
+ - Run one unit per checkout, at that checkout's catalog layer.
21
+ - Fetch and merge the dependency's default branch before packing it.
22
+ - Restore the registry copy before any gate that must prove the published artifact, and before publishing anything. The release still follows layer order: the dependency publishes first, then the consumer re-pins and re-runs its gates.
23
+ - Keep tarballs under `tmp/`; sweep them at acceptance; never commit them.
24
+
25
+ ## What a bump obliges
26
+
27
+ - A runtime `dependencies` bump reaches every consumer: each package downstream re-pins, re-runs its gates, bumps, and republishes in layer order.
28
+ - A development `devDependencies` bump reaches nobody: re-pin, prove the gates green, commit to `main`; do not bump or publish.
29
+ - 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.
30
+ - 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.
31
+ - 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
+
33
+ ## The scaffold surface
34
+
35
+ - `scaffold` is a development dependency of every package, so it publishes on its own and propagates as files, never as a cascade. Each package builds against the published `scaffold`.
36
+ - `scaffold` ships `dist/host`, the vendored file set every target receives through `repair`. Bump and publish `scaffold` when any vendored byte or the set of vendored paths changes.
37
+ - After a vendored-only release, re-pin `@orkestrel/scaffold` in each target, run `repair` there, and prove that target's gates still green. A target bumps only when its own published surface moved.
38
+ - Keep a target's own Claude permissions in `.claude/settings.local.json`; `repair` restores the vendored `.claude/settings.json`.
39
+ - Never edit a vendored file inside a target; `repair` restores it and `scaffold audit` reports the drift. Change the vendored file in the scaffold repository and release.
@@ -7,8 +7,9 @@ prepare the next.
7
7
 
8
8
  ## Visit a repository
9
9
 
10
- Run the visit in this order. A step that reads generated or installed state is invalid before the
11
- step that writes it.
10
+ `scripts/wave.ts --visit` runs these steps in this order and stops at the first one that fails; a
11
+ step that reads generated or installed state is invalid before the step that writes it. Run a step
12
+ by hand only to repair it, then resume with `--from <step>`.
12
13
 
13
14
  1. Re-pin every `@orkestrel` range to the registry caret (peer ranges included) and install, so
14
15
  the overwrite runs the current vendored host.
@@ -39,18 +40,18 @@ step that writes it.
39
40
  6. Sweep the self-pins, per § Sweep the self-pins: the re-pin moves the snapshot class.
40
41
  7. Run the mutating `format` script to converge generated writes.
41
42
  8. Run the quality gates.
42
- 9. Fetch the published tarball, then compare the rebuilt `dist/` against it for material content.
43
- An absent baseline is an unanswered comparison, never a moved dist: fetch and re-run rather than
44
- ruling a bump owed.
43
+ 9. Run `node .agents/skills/orkestrel-publish/scripts/compare.ts` to compare the rebuilt `dist/`
44
+ against the published tarball for material content. An exit of 2 is an unanswered comparison,
45
+ never a moved dist: fetch and re-run rather than ruling a bump owed.
45
46
 
46
47
  Restore any unpublished tarball the target is holding before the quality gates run, per
47
- `.agents/orchestration.md` § Fixing a dependency before it publishes. A distribution proof run
48
+ `release.md` § Fix a dependency before it publishes. A distribution proof run
48
49
  against a local tarball proves the local tarball. Stage an unpublished tarball with
49
50
  `npm install --no-save`, because a `file:` pin refuses the blueprint and the manifest keeps a
50
51
  registry range.
51
52
 
52
- Where a visit runs before scaffold itself publishes, run `scaffold overwrite --offline` and prove
53
- the sweep with `scaffold audit --offline`. The online verbs read vendored bytes from the published
53
+ Where a visit runs before scaffold itself publishes, run the visit with `--offline`; the runner
54
+ performs the offline overwrite and proves the sweep with `scaffold audit --offline`. The online verbs read vendored bytes from the published
54
55
  package, so an unpublished scaffold's visit otherwise writes the registry's older floor, and an
55
56
  online audit reports the floor-restored files as stale until the release. The `--offline` overwrite
56
57
  skips the catalog step and exits `1` with a note naming that refusal, so run the full
@@ -61,15 +62,15 @@ reporting per target. Refuse a failed target, name it, repair it, and re-run it
61
62
 
62
63
  ## Rule on the bump
63
64
 
64
- Bump on either trigger: the rebuilt dist differs materially from the published tarball, or the
65
- final runtime dependency set differs from the published packument.
65
+ Bump on either trigger: `scripts/compare.ts` exits 3 (the rebuilt dist differs materially from the
66
+ published tarball), or the final runtime dependency set differs from the published packument.
66
67
 
67
68
  - Test the final dependency set against the packument, never "did my step move a pin". The
68
69
  `declare` step inside `scaffold overwrite` re-pins before any later check, so the step-local
69
70
  reading reports nothing moved while the manifest surface did.
70
71
  - Treat a re-pinned runtime range as published surface. Without the bump a consumer installs
71
72
  duplicate copies of the moved dependency.
72
- - Compare material content only, as `.agents/orchestration.md` § What a bump obliges defines it,
73
+ - Compare material content only, as `release.md` § What a bump obliges defines it,
73
74
  and take the blast radius of a bump from that section rather than deciding it here.
74
75
  - Ship a dist built before the version bump wherever the bump edits no emitted byte. Check that
75
76
  per package rather than assuming it: a package that imports its own `package.json` version into
@@ -77,7 +78,7 @@ final runtime dependency set differs from the published packument.
77
78
  Rebuild after the bump there and pack from the rebuilt tree. The `npm publish --ignore-scripts`
78
79
  command skips `prepack`, so that rebuild is the operator's step rather than the publish's. The
79
80
  same holds for a package that writes its declared ranges into published output: its `dist/`
80
- moves on a development re-pin, and `.agents/orchestration.md` § What a bump obliges rules that
81
+ moves on a development re-pin, and `release.md` § What a bump obliges rules that
81
82
  re-pin a release.
82
83
 
83
84
  One trigger orders rather than bumps. A package the fleet consumes as a development dependency,
@@ -105,8 +106,9 @@ Prepare a published package's layer in this order, after the visit has ruled the
105
106
  5. **Write the release commit and push before the window opens.** The preparation commit inside
106
107
  the visit is a different commit at a different moment.
107
108
 
108
- Where an inventory taken before the round already ruled every dist moved, the bump rides the
109
- visit's first step and these steps fold into the visit, whose comparison then confirms the ruling.
109
+ Where an inventory taken before the round already ruled every dist moved, apply the bump before
110
+ the visit, pass the replaced version through `--prior` so the self-pin sweep finds it, and complete
111
+ the remaining steps of this section after the visit, whose comparison confirms the ruling.
110
112
 
111
113
  Prepare the next layer only after this one is on the registry. A dependent's new pin cannot
112
114
  install until the version it names exists, so preparation and publication interleave and cannot be
@@ -123,13 +125,12 @@ every one of them. A snapshot of generated output carries the ranges the package
123
125
  its own version, and any re-pin, a development one included, falsifies it. Run this sweep after the
124
126
  re-pin install, not after the manifest edit.
125
127
 
126
- - Search `tests/` and `src/` in the publishing package for the prior version literal, and rule on
127
- every hit. A canned packument in a fixture and a looked-up version in a CLI suite carry the
128
- version with no tripwire comment beside them, so they surface as a red gate after the bump
129
- rather than as a planned edit before it.
130
- - Search `tests/` for the prior range of every re-pinned dependency, and move each snapshot the
131
- search hits with the re-pin. A generated-manifest fixture never carries the package's own prior
132
- version, so the version sweep cannot reach it.
128
+ - Run `node .agents/skills/orkestrel-publish/scripts/pins.ts --version <prior> --range <prior range> ...`
129
+ with the prior version and the prior range of every re-pinned dependency, rule on every hit, and
130
+ move every generated-manifest snapshot hit with its re-pin.
131
+ A canned packument in a fixture and a looked-up version in a CLI suite carry the version with no
132
+ tripwire comment beside them, and a generated-manifest fixture carries the ranges and never the
133
+ package's own version, so one run names both classes.
133
134
  - Move a documented tripwire — a golden digest over generated output — in the same change as the
134
135
  version bump. That is what the tripwire is for.
135
136
  - Re-take a generated artifact's digest after the install, because the generated bytes can derive
@@ -9,8 +9,11 @@ rest of the layer either fits inside it or takes another approval.
9
9
 
10
10
  ## Arm the terminal
11
11
 
12
- - Run the login and every publish under `script -qfc '<command>' <log>`. npm offers the approval
13
- only when it sees a TTY; without one it fails `EOTP` with no way to answer.
12
+ - 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.
13
+
14
+ - Run the login and every browser-authorized publish under `script -qfc '<command>' <log>`. npm
15
+ offers the browser approval only when it sees a TTY; without one it fails `EOTP` with no way to
16
+ answer. The one-time-code path runs under captured pipes instead, per § Authorize the upload.
14
17
  - Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
15
18
  `Press ENTER to open in the browser...` and blocks. Never answer that prompt with a newline: the
16
19
  web flow consumes the newline on a later read, drops to a legacy `Username:` prompt, and exits
@@ -27,13 +30,15 @@ rest of the layer either fits inside it or takes another approval.
27
30
  and an overnight gap expires it, so a session-start answer does not hold.
28
31
  - Read a login log that shows the spinner and then a legacy `Username:` prompt as a dead attempt
29
32
  rather than as a prompt to answer: expired, or refused on its first poll per § Read a `403` on the
30
- poll. Kill it by the process id recorded at its launch, per `.agents/orchestration.md` § Confirm
31
- dead before relaunching. Every publish here runs under the same `script -qfc` form, so a pattern
32
- over the process list reaches a live upload as readily as the dead login.
33
- - On a Windows host, Git Bash ships no `script` binary, so the upload step is operator-driven:
34
- prepare the layer, prove the gates, surface the exact `npm publish` command, and the operator
35
- runs it in a real terminal. Everything before and after the upload — bumps, re-pins, gates,
36
- registry reads — stays with the Orchestrator. The fifo stdin law still binds on that host.
33
+ poll. Kill it by the process id recorded at its launch, per the `orkestrel-dispatch` skill's launch
34
+ reference § Kill and relaunch. Every browser-authorized publish here runs under the same `script -qfc` form, so
35
+ a pattern over the process list reaches a live upload as readily as the dead login.
36
+ - On a Windows host, Git Bash ships no `script` binary, so a browser-authorized upload is
37
+ operator-driven: prepare the layer, prove the gates, surface the exact `npm publish` command, and
38
+ the operator runs it in a real terminal. Everything before and after the upload — bumps, re-pins,
39
+ gates, registry reads — stays with the Orchestrator, and the one-time-code path in § Authorize the
40
+ upload runs through `window.ts` on every host. The fifo stdin law still binds a browser-authorized
41
+ upload on that host.
37
42
 
38
43
  ## Reach the approval
39
44
 
@@ -80,6 +85,8 @@ rest of the layer either fits inside it or takes another approval.
80
85
 
81
86
  ## Authorize the upload
82
87
 
88
+ - Where the account answers with a one-time code, run `node .agents/skills/orkestrel-publish/scripts/window.ts --publish <layer directories> --otp <code>`: it uploads back to back, journals each upload under `tmp/units/`, stops at the first refusal naming the package to resume from on a fresh code, and confirms each accepted version against the registry. The browser path stays the operator's.
89
+
83
90
  - Take the account's one-time code where the account has one. The
84
91
  `npm publish --ignore-scripts --otp=<code>` command uploads with no browser authorization and no
85
92
  poll. The code has its own life: measured on 2026-09-04 against `registry.npmjs.org`, one code
@@ -93,12 +100,16 @@ rest of the layer either fits inside it or takes another approval.
93
100
  describes for the browser path: the chain stops at the refused package, and the layer resumes
94
101
  from that package on a fresh code. Never retry the refused upload on the same code.
95
102
  - Ask for the code and nothing else. Never ask for a password, an access token, or an auth file.
96
- `.agents/orchestration.md` § Publishing the fleet owns that law.
97
- - Arm a one-time-code upload the way § Arm the terminal arms every other publish.
103
+ `release.md` § Publishing is the user's owns that law.
104
+ - A one-time-code upload needs no terminal arming: `window.ts --publish` holds the upload under
105
+ captured pipes, where npm's non-TTY guard rethrows an authentication refusal instead of prompting,
106
+ so a spent code is refused `EOTP` with no prompt and no browser flow, which is the stop the runner
107
+ reads. The runner passes `--browser=false` and re-reads `whoami` immediately before the first
108
+ upload. Never run a one-time-code upload on a TTY: there npm answers a refused code with a prompt
109
+ the chain cannot see.
98
110
  - Fall back to the browser authorization where the account answers with no code. That path mints
99
111
  the `auth/cli/<id>` URL, needs the click inside the session's life, and opens the five-minute
100
- window. In the `@orkestrel/scaffold` 0.0.56 run on 2026-08-27 that authorization failed on the
101
- 45-second abandon and the one-time code uploaded the package with no retry.
112
+ window.
102
113
  - Tell the user that approving an `auth/cli/<id>` URL opens a five-minute window covering the rest
103
114
  of the layer.
104
115
 
@@ -130,7 +141,7 @@ rest of the layer either fits inside it or takes another approval.
130
141
  - Expect a large layer to outlast one window. Size batches to what uploads in five minutes and
131
142
  name each planned approval point to the user, rather than discovering them mid-run.
132
143
  - The contract's serialization law binds every upload in the window, and
133
- `.agents/orchestration.md` § Long-running commands binds the chain that runs them.
144
+ the `orkestrel-dispatch` skill binds the chain that runs them.
134
145
 
135
146
  ## Read a `403` on the poll
136
147
 
@@ -155,6 +166,8 @@ the same status. Rule from the evidence, never from which cause reads likelier.
155
166
 
156
167
  ## Read the verdict from the registry
157
168
 
169
+ - Confirm a layer with `node .agents/skills/orkestrel-publish/scripts/window.ts --confirm <name@version>...`, which re-reads the registry until it serves each version or the wait ends.
170
+
158
171
  - Read `+ @orkestrel/<name>@<version>` in the upload's own journal as the accepted verdict, and
159
172
  advance the chain on it. The registry's read lags its processing by minutes, which the
160
173
  `Your package is being processed and may take a few minutes to become available.` notice beside