@orkestrel/scaffold 0.0.107 → 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 (164) 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 +368 -27
  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 +26 -20
  25. package/dist/host/agents/orchestration.md +98 -58
  26. package/dist/host/agents/platforms/posix.md +15 -0
  27. package/dist/host/agents/platforms/windows.md +37 -0
  28. package/dist/host/agents/skills/orkestrel-align/SKILL.md +10 -13
  29. package/dist/host/agents/skills/orkestrel-align/references/fleet.md +4 -10
  30. package/dist/host/agents/skills/orkestrel-align/references/integration.md +1 -1
  31. package/dist/host/agents/skills/orkestrel-build/SKILL.md +16 -48
  32. package/dist/host/agents/skills/orkestrel-build/agents/openai.yaml +1 -1
  33. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +19 -16
  34. package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +1 -1
  35. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +15 -28
  36. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +5 -6
  37. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +12 -14
  38. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +36 -24
  39. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +14 -11
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +366 -75
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +126 -16
  42. package/dist/host/agents/skills/orkestrel-dispatch/scripts/chain.ts +323 -0
  43. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +220 -31
  44. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +176 -33
  45. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +294 -59
  46. package/dist/host/agents/skills/orkestrel-dispatch/scripts/patch.ts +401 -0
  47. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +199 -34
  48. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +428 -27
  49. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +10 -8
  50. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +1 -5
  51. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  52. package/dist/host/agents/skills/orkestrel-falsify/scripts/mutate.ts +701 -0
  53. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +16 -12
  54. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +23 -81
  55. package/dist/host/agents/skills/orkestrel-harden/references/centralization.md +4 -5
  56. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -0
  57. package/dist/host/agents/skills/orkestrel-harden/references/document.md +33 -0
  58. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +6 -3
  59. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +8 -4
  60. package/dist/host/agents/skills/orkestrel-harden/references/research.md +2 -0
  61. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +1272 -279
  62. package/dist/host/agents/skills/orkestrel-harden/scripts/measure.ts +425 -0
  63. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +603 -98
  64. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +75 -98
  65. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +54 -17
  66. package/dist/host/agents/skills/orkestrel-journey/references/decide.md +1 -20
  67. package/dist/host/agents/skills/orkestrel-journey/references/layer.md +21 -31
  68. package/dist/host/agents/skills/orkestrel-journey/references/styles.md +1 -1
  69. package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +91 -30
  70. package/dist/host/agents/skills/orkestrel-parallel/agents/openai.yaml +2 -2
  71. package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +34 -0
  72. package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +29 -0
  73. package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +29 -0
  74. package/dist/host/agents/skills/orkestrel-parallel/references/t3.md +31 -0
  75. package/dist/host/agents/skills/orkestrel-parallel/scripts/cases.ts +389 -0
  76. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +16 -20
  77. package/dist/host/agents/skills/orkestrel-polish/references/capture-harness.md +16 -26
  78. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +12 -26
  79. package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +2 -2
  80. package/dist/host/agents/skills/orkestrel-publish/references/adopt.md +23 -0
  81. package/dist/host/agents/skills/orkestrel-publish/references/release.md +4 -4
  82. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +12 -10
  83. package/dist/host/agents/skills/orkestrel-publish/references/window.md +20 -25
  84. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +348 -59
  85. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +202 -22
  86. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +1061 -191
  87. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +812 -140
  88. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +280 -38
  89. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +3 -3
  90. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +428 -70
  91. package/dist/host/agents/templates/brief.md +1 -1
  92. package/dist/host/agents/transports/claude-cli.md +3 -3
  93. package/dist/host/agents/transports/codex.md +3 -8
  94. package/dist/host/agents/transports/cursor.md +2 -3
  95. package/dist/host/claude/AGENTS.md +7 -10
  96. package/dist/host/claude/agents/analyst.md +3 -3
  97. package/dist/host/claude/agents/astra.md +3 -3
  98. package/dist/host/claude/agents/builder.md +1 -1
  99. package/dist/host/claude/agents/checker.md +1 -1
  100. package/dist/host/claude/agents/distiller.md +1 -1
  101. package/dist/host/claude/agents/grok.md +1 -1
  102. package/dist/host/claude/agents/opus.md +2 -2
  103. package/dist/host/claude/agents/orkestrel.md +57 -90
  104. package/dist/host/claude/agents/researcher.md +1 -1
  105. package/dist/host/claude/agents/reviewer.md +4 -0
  106. package/dist/host/claude/agents/scout.md +1 -1
  107. package/dist/host/claude/agents/verifier.md +1 -1
  108. package/dist/host/claude/rules/application.md +14 -21
  109. package/dist/host/claude/rules/architecture.md +34 -44
  110. package/dist/host/claude/rules/browser.md +3 -4
  111. package/dist/host/claude/rules/campaign.md +55 -0
  112. package/dist/host/claude/rules/documentation.md +26 -11
  113. package/dist/host/claude/rules/names.md +9 -4
  114. package/dist/host/claude/rules/patterns.md +6 -7
  115. package/dist/host/claude/rules/portability.md +2 -3
  116. package/dist/host/claude/rules/quality.md +4 -5
  117. package/dist/host/claude/rules/styles.md +2 -2
  118. package/dist/host/claude/rules/tests.md +57 -114
  119. package/dist/host/claude/rules/typescript.md +8 -10
  120. package/dist/host/claude/rules/workspace.md +21 -19
  121. package/dist/host/claude/rules/writing.md +3 -3
  122. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +1 -1
  123. package/dist/host/claude/skills/orkestrel-harden/SKILL.md +1 -1
  124. package/dist/host/claude/skills/orkestrel-parallel/SKILL.md +1 -1
  125. package/dist/host/claude/skills/orkestrel-publish/SKILL.md +1 -1
  126. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +1 -1
  127. package/dist/host/codex/agents/analyst.toml +9 -3
  128. package/dist/host/codex/agents/astra.toml +3 -4
  129. package/dist/host/codex/agents/builder.toml +1 -1
  130. package/dist/host/codex/agents/opus.toml +3 -4
  131. package/dist/host/codex/agents/orkestrel.toml +1 -1
  132. package/dist/host/codex/agents/researcher.toml +2 -2
  133. package/dist/host/codex/agents/verifier.toml +1 -1
  134. package/dist/host/codex/config.toml +3 -3
  135. package/dist/host/configs/helpers.ts +21 -1
  136. package/dist/host/configs/policy.ts +405 -16
  137. package/dist/host/cursor/rules/orchestration.mdc +1 -0
  138. package/dist/host/dotfiles/oxlintrc.json +141 -5
  139. package/dist/host/guides/agent.md +111 -134
  140. package/dist/host/guides/capture.md +801 -0
  141. package/dist/host/guides/probe.md +27 -8
  142. package/dist/host/guides/scaffold.md +152 -19
  143. package/dist/host/guides/study.md +534 -440
  144. package/dist/host/guides/test.md +111 -44
  145. package/dist/host/manifest.json +199 -242
  146. package/dist/host/tests/config.test.ts +1558 -219
  147. package/dist/host/tests/policy.test.ts +127 -1
  148. package/dist/host/tests/setupPolicy.ts +1389 -39
  149. package/dist/src/core/index.cjs +239 -87
  150. package/dist/src/core/index.cjs.map +1 -1
  151. package/dist/src/core/index.d.cts +123 -39
  152. package/dist/src/core/index.d.ts +123 -39
  153. package/dist/src/core/index.js +234 -86
  154. package/dist/src/core/index.js.map +1 -1
  155. package/dist/src/server/index.cjs +20 -27
  156. package/dist/src/server/index.cjs.map +1 -1
  157. package/dist/src/server/index.js +21 -28
  158. package/dist/src/server/index.js.map +1 -1
  159. package/package.json +11 -11
  160. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +0 -283
  161. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +0 -25
  162. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +0 -333
  163. package/dist/host/agents/skills/orkestrel-parallel/references/harnesses.md +0 -19
  164. package/dist/host/guides/supervisor.md +0 -4890
@@ -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
@@ -141,13 +145,12 @@ registry copy over any staged tip, so every consumer stays red until that tip is
141
145
 
142
146
  ## Prepare a layer
143
147
 
144
- - When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor and move the package's CI floor row with it.
148
+ - When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor.
149
+ - When a package still carries `.github/workflows/ci.yml`, delete it in that visit; the ecosystem runs no hosted CI.
145
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.
146
- - 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).
147
152
 
148
- An unpublished package's first version is `0.0.1`. Do not bump it before that first publish. The
149
- registry has nothing to serve, so there is no version to move away from, and bumping produces a
150
- 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.
151
154
 
152
155
  Prepare a published package's layer in this order, after the visit has ruled the package's bump:
153
156
 
@@ -174,9 +177,8 @@ Prepare the next layer only after this one is on the registry. A dependent's new
174
177
  install until the version it names exists, so preparation and publication interleave and cannot be
175
178
  batched ahead.
176
179
 
177
- The window is for uploads. Every gate, build, install, and commit happens outside it, which is
178
- what makes `--ignore-scripts` the right flag at publish time: the artifact was already proved, and
179
- 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.
180
182
 
181
183
  ## Sweep the self-pins
182
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.