@orkestrel/scaffold 0.0.51 → 0.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/host/CLAUDE.md +3 -1
- package/dist/host/agents/orchestration.md +99 -266
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +12 -8
- package/dist/host/agents/skills/orkestrel-align-packages/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +15 -11
- package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +38 -12
- package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +107 -0
- package/dist/host/agents/skills/{orkestrel-human-journey → orkestrel-prove-journey}/SKILL.md +1 -1
- package/dist/host/agents/skills/{orkestrel-human-journey → orkestrel-prove-journey}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +77 -0
- package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +97 -0
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +95 -0
- package/dist/host/agents/templates/brief.md +157 -0
- package/dist/host/{codex/agents/claude.toml → agents/transports/claude.md} +16 -10
- package/dist/host/{claude/agents → agents/transports}/codex.md +13 -12
- package/dist/host/claude/agents/analyst.md +11 -10
- package/dist/host/claude/agents/application.md +6 -3
- package/dist/host/claude/agents/builder.md +11 -10
- package/dist/host/claude/agents/checker.md +20 -10
- package/dist/host/claude/agents/grok.md +8 -7
- package/dist/host/claude/agents/implementer.md +7 -4
- package/dist/host/claude/agents/orkestrel.md +22 -16
- package/dist/host/claude/agents/planner.md +13 -5
- package/dist/host/claude/agents/researcher.md +8 -7
- package/dist/host/claude/agents/reviewer.md +6 -4
- package/dist/host/claude/agents/scout.md +6 -7
- package/dist/host/claude/agents/sol.md +9 -8
- package/dist/host/claude/agents/verifier.md +6 -3
- package/dist/host/claude/rules/documentation.md +2 -0
- package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +12 -8
- package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +1 -1
- package/dist/host/claude/skills/{orkestrel-human-journey → orkestrel-prove-journey}/SKILL.md +2 -2
- package/dist/host/claude/skills/orkestrel-publish/SKILL.md +12 -0
- package/dist/host/codex/agents/analyst.toml +3 -0
- package/dist/host/codex/agents/application.toml +3 -0
- package/dist/host/codex/agents/builder.toml +10 -7
- package/dist/host/codex/agents/checker.toml +14 -3
- package/dist/host/codex/agents/grok.toml +5 -2
- package/dist/host/codex/agents/implementer.toml +3 -2
- package/dist/host/codex/agents/opus.toml +4 -3
- package/dist/host/codex/agents/orkestrel.toml +14 -9
- package/dist/host/codex/agents/planner.toml +7 -5
- package/dist/host/codex/agents/researcher.toml +6 -4
- package/dist/host/codex/agents/reviewer.toml +4 -3
- package/dist/host/codex/agents/scout.toml +4 -1
- package/dist/host/codex/agents/verifier.toml +3 -2
- package/dist/host/manifest.json +125 -77
- package/dist/src/core/index.cjs +4 -2
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.js +4 -2
- package/dist/src/core/index.js.map +1 -1
- package/package.json +2 -2
- /package/dist/host/agents/skills/{orkestrel-human-journey → orkestrel-prove-journey}/references/captures.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-human-journey → orkestrel-prove-journey}/references/layer.md +0 -0
package/dist/host/CLAUDE.md
CHANGED
|
@@ -28,7 +28,9 @@ follows it. This file adds only what Claude Code does differently, and cannot we
|
|
|
28
28
|
and confirm from its journal that it reached Sol. A bridge driver that answers from its own engine
|
|
29
29
|
collapses the round to one engine and its ruling still reads as normal.
|
|
30
30
|
- Claude role frontmatter accepts Claude models only. Reach Grok through `grok`, and Sol through
|
|
31
|
-
`analyst` and `
|
|
31
|
+
`analyst` and `sol`. Never put an external model in `model:`. Treat
|
|
32
|
+
`.agents/transports/codex.md` as the transport contract for those bridges, never as a
|
|
33
|
+
dispatchable role.
|
|
32
34
|
- Claude Code hot-reloads edits to existing role files.
|
|
33
35
|
|
|
34
36
|
## Bench wiring
|
|
@@ -16,6 +16,9 @@ Read in this order before acting:
|
|
|
16
16
|
`CLAUDE.md`, `.codex/config.toml`, and `.cursor/rules/` are bridges. Each points here and adds
|
|
17
17
|
only what its harness needs. None of them restates this file.
|
|
18
18
|
|
|
19
|
+
A line stays in this file when an executor who is not doing that thing is worse off without it. A
|
|
20
|
+
line becomes a skill when it fires on a named trigger and its reader is one agent at one moment.
|
|
21
|
+
|
|
19
22
|
Every dispatch tells its executor to read every item after the user's current instruction before
|
|
20
23
|
acting.
|
|
21
24
|
|
|
@@ -32,7 +35,8 @@ One workflow runs across all providers. Each engine has one job and never takes
|
|
|
32
35
|
- Route each nontrivial implementation unit to Opus or Sol. Objective, constraint-heavy,
|
|
33
36
|
mechanical-precision work goes to Sol. API-shape, naming, and documentation-voice work goes to
|
|
34
37
|
Opus. Cursor Composer is not an implementation route, and no `composer` role exists.
|
|
35
|
-
- Design
|
|
38
|
+
- Design runs the adversarial pass. An audit runs the lanes its round names, with at least one whose
|
|
39
|
+
engine did not write the work.
|
|
36
40
|
|
|
37
41
|
## Orchestration by harness
|
|
38
42
|
|
|
@@ -93,11 +97,11 @@ Record the substitution.
|
|
|
93
97
|
- Never assign Grok to either lane in Claude Code or Codex. If the remaining native engine is also
|
|
94
98
|
unavailable there, the pass cannot run: stop and report rather than substituting Grok.
|
|
95
99
|
- Grok takes every lane only in Cursor, and only when Opus 5 and Sol are both unavailable.
|
|
96
|
-
- Treat a lane that returns no verdicts as a lane that did not run.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
empty.
|
|
100
|
+
- Treat a lane that returns no verdicts as a lane that did not run. Re-probe the bench before ruling
|
|
101
|
+
on why, per Bench laws rule "One lane at a time per bench". A bench lane reporting that its driver
|
|
102
|
+
executed and its engine was never reached is a dark bench, not a result. Record the bench dark
|
|
103
|
+
from that report, re-run the lane on the substitute engine from the preceding table, and name in
|
|
104
|
+
the routing ledger which lane ran on which engine. Never accept a round with one lane empty.
|
|
101
105
|
- Re-read bench liveness at dispatch, not at session start. A bench that probed live can be dark when
|
|
102
106
|
the lane launches.
|
|
103
107
|
|
|
@@ -143,7 +147,7 @@ when the role file already pins it.
|
|
|
143
147
|
| Design-fit review and audit | `reviewer` | `reviewer` | Opus 5 (native / bridge) |
|
|
144
148
|
| Objective analysis and correctness audit | `analyst` | `analyst` | GPT-5.6 Sol (bridge / native) |
|
|
145
149
|
| Nontrivial implementation (objective) | `sol` | `implementer` | GPT-5.6 Sol (bridge / native) |
|
|
146
|
-
| Nontrivial implementation (subjective) | `implementer` | `
|
|
150
|
+
| Nontrivial implementation (subjective) | `implementer` | `opus` | Opus 5 (native / bridge) |
|
|
147
151
|
| Bounded primary-source research | `researcher` | `researcher` | Grok → Luna → Sonnet |
|
|
148
152
|
| Repository reconnaissance | `scout` | `scout` | Grok → Luna → Sonnet |
|
|
149
153
|
| Mechanical conformance evidence | `checker` | `checker` | Grok → Luna → Sonnet |
|
|
@@ -154,6 +158,9 @@ when the role file already pins it.
|
|
|
154
158
|
|
|
155
159
|
- A **bridge** role is a cheap driver whose only work is invoking another provider's CLI. It never
|
|
156
160
|
implements, judges, or endorses the result.
|
|
161
|
+
- `implementer` names the harness's native implementation lane, so the token means Opus in Claude
|
|
162
|
+
Code and Sol in Codex. An engine-named bridge — `sol`, `opus` — names the other engine. Read a
|
|
163
|
+
role name against the harness you are running in, and state the engine anyway.
|
|
157
164
|
- Give every role a file on both sides. The role file is where engine, effort, tools, permissions,
|
|
158
165
|
and charter are pinned, and the tool allowlist is what makes the read-only floor real. A role
|
|
159
166
|
with no file has nowhere to pin either.
|
|
@@ -163,11 +170,15 @@ when the role file already pins it.
|
|
|
163
170
|
has stepped past Grok. Record which step you are on.
|
|
164
171
|
- `orkestrel` stays native because it carries the package catalog in its own role file. Sending its
|
|
165
172
|
job to a bench means shipping that catalog across, which costs more than the bench saves.
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
`.
|
|
170
|
-
|
|
173
|
+
- A transport contract lives in `.agents/transports/`, not in an agents directory. A harness lists
|
|
174
|
+
its dispatchable agents from that directory, so a contract that is never dispatched sits outside
|
|
175
|
+
it. `.agents/transports/codex.md` is the shared Sol transport contract and
|
|
176
|
+
`.agents/transports/claude.md` the shared Opus transport contract. Neither is a route: `analyst`
|
|
177
|
+
and `sol` are the named Sol bridges, `planner`, `reviewer`, and `opus` the named Opus bridges, and
|
|
178
|
+
each binds its own contract by reference and pins only its route and sandbox.
|
|
179
|
+
- Mirroring is by work class, not filename. A transport contract is provider-specific: the Codex
|
|
180
|
+
contract carries the Sol transport the Claude-side bridges follow, the Claude contract carries the
|
|
181
|
+
Opus transport the Codex-side bridges follow, and each side's bridges bind their own.
|
|
171
182
|
- Opus and Sol roles use high effort. Native cheap-tier roles use low or medium. Bridge drivers use
|
|
172
183
|
the cheapest tier that can run a CLI.
|
|
173
184
|
- Never route orchestration or acceptance across a bridge.
|
|
@@ -321,10 +332,12 @@ longer holds.
|
|
|
321
332
|
criterion discovered at integration is a successor brief routed to a writer, never an
|
|
322
333
|
integration edit.
|
|
323
334
|
5. **Audit adversarially.** Audit every nontrivial implementation with at least one lane whose
|
|
324
|
-
engine did not write it
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
335
|
+
engine did not write it: `reviewer` for the subjective lane and `analyst` for the objective lane,
|
|
336
|
+
the way step 2 names its lanes. Run the second lane when the first returns FAIL, when the subject
|
|
337
|
+
is a rendered or externally driven surface, or when the unit's claims span both correctness and
|
|
338
|
+
shape. Dispatch `checker` in addition when the acceptance criteria are mechanical — counts,
|
|
339
|
+
paths, parity rows, scope honesty — never in place of a lane. Record in the round's verdict file
|
|
340
|
+
when a lane or the checker did not run.
|
|
328
341
|
- State the audit's subject as numbered falsifiable claims and require per-claim verdicts with
|
|
329
342
|
evidence, per the Falsification law in `.claude/rules/quality.md` and the `orkestrel-falsify`
|
|
330
343
|
value set, unless the dispatch names a different skill that fixes another.
|
|
@@ -397,7 +410,9 @@ The harness bridge names the concrete mechanism for each of these.
|
|
|
397
410
|
|
|
398
411
|
- Write the brief to a file under `tmp/`, named for its unit, before launching the unit, whatever
|
|
399
412
|
engine executes it. A brief composed only inside a launch argument cannot be corrected, resumed,
|
|
400
|
-
or re-run
|
|
413
|
+
or re-run after that call ends. A native unit's pair is `tmp/units/<unit>-brief.md` and
|
|
414
|
+
`tmp/units/<unit>-report.md`. A bench unit's pair sits under the bench directory its role file
|
|
415
|
+
names, beside the journal.
|
|
401
416
|
- Write the unit's returned report in the SAME action that commits its code, never afterwards. A
|
|
402
417
|
commit message states what changed; the report states what the unit measured, what it decided, what
|
|
403
418
|
it could not close, and which of its own claims it flagged. An auditor's subject is the report,
|
|
@@ -407,6 +422,11 @@ The harness bridge names the concrete mechanism for each of these.
|
|
|
407
422
|
- Amend a brief on re-run rather than restating it. A mid-campaign correction produces a successor
|
|
408
423
|
file recording what changed and why, and the original stays. A fix round's brief names the
|
|
409
424
|
findings it carries and where each came from.
|
|
425
|
+
- Name a corrected unit's effective brief and report and the pair they supersede before that unit
|
|
426
|
+
integrates. A unit whose correction landed as a serial patch or a direct reconciliation, with no
|
|
427
|
+
successor pair on disk, cannot be re-run from what the campaign kept.
|
|
428
|
+
- Write the round's verdict to `.orkestrel/<package>/<unit>-audit-verdict.md`. That file is where
|
|
429
|
+
the audit step records a lane or a checker that did not run.
|
|
410
430
|
- Read the copy the executor will open, not the one you wrote. A brief written in the orchestrator's
|
|
411
431
|
repository and staged into the subject's checkout so a `-C` invocation can reach it is a second
|
|
412
432
|
file, and staging can rewrite a path or drop a clause. The executor rules on what it opens, so a
|
|
@@ -435,7 +455,8 @@ The harness bridge names the concrete mechanism for each of these.
|
|
|
435
455
|
- Put every campaign artifact in the **orchestrator's** repository under `.orkestrel/<package>/`,
|
|
436
456
|
named for the package the campaign is about.
|
|
437
457
|
- Give a campaign spanning several packages one shared `.orkestrel/campaign/` folder instead, so the
|
|
438
|
-
wave's plan, ledger, and verdicts sit together rather than split across the packages they
|
|
458
|
+
wave's plan, routing ledger, and verdicts sit together rather than split across the packages they
|
|
459
|
+
rule on.
|
|
439
460
|
- Never put them in the package they are about. A published package's tree is its product.
|
|
440
461
|
- Claim nothing outside `.orkestrel/` unless Orkestrel scaffold mandates it. Everything Orkestrel
|
|
441
462
|
owns in a consumer's tree lives beneath that folder, so a convention can be settled there without
|
|
@@ -443,40 +464,14 @@ The harness bridge names the concrete mechanism for each of these.
|
|
|
443
464
|
- Keep the campaign narrative and every ruling in the durable artifact that owns it — the guide for
|
|
444
465
|
product truth, a rule or role file for process truth, the commit message for the decision itself.
|
|
445
466
|
Use `ROADMAP.md` only where the repository already keeps one.
|
|
446
|
-
- Prefer a mechanism that recomputes a fact over a document that records it. A
|
|
447
|
-
is stale from the moment it is written, and the next campaign reads it as current.
|
|
448
|
-
can be derived, derive it: the fleet's publish order lives in the catalog table
|
|
449
|
-
regenerates, not in a written order anyone has to remember to update.
|
|
450
|
-
- Prune the campaign folder in a commit at acceptance.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
Pruning is deletion, so it needs the same evidence as any other destructive step. Run these
|
|
456
|
-
checks, and prune only when every one closes.
|
|
457
|
-
|
|
458
|
-
1. **Carry check.** List every item the folder leaves open — a defect, a measurement to re-take, a
|
|
459
|
-
deferred decision, a withdrawn claim, an unmet acceptance condition. Each ends the check with a
|
|
460
|
-
carrier: a commit that closed it, a live brief that owns it, or an explicit drop on the record.
|
|
461
|
-
An item with no carrier blocks the prune. Read the register files for this — the plan, the
|
|
462
|
-
readiness grade, the carry ledger, the triage — not every brief and report in the folder.
|
|
463
|
-
2. **Promotion check.** Rule on each remaining file by what it asserts. Product truth goes to the
|
|
464
|
-
guide, where the parity gate reaches it. A process law goes to the rule or contract file that
|
|
465
|
-
owns it. A decision goes to the commit message that made it, which is where it already is.
|
|
466
|
-
Everything else is process diary and prunes.
|
|
467
|
-
3. **Measurement check.** A number the guide carries out of the folder carries the date it was
|
|
468
|
-
taken. A measurement whose date the folder does not record is re-taken or dropped, never copied.
|
|
469
|
-
4. **Orientation check.** A cross-session orientation document — a handoff, a package-root narrative
|
|
470
|
-
file, a session log — is not a further category. It duplicates the guide for product truth and
|
|
471
|
-
the contract for process truth, it is gated by nothing, and it drifts. Dissolve it into the
|
|
472
|
-
artifacts that own it and delete it.
|
|
473
|
-
|
|
474
|
-
A section recording live state — adopter republish status, installed version tables, what a sibling
|
|
475
|
-
repository was doing that week — prunes with no promotion. It was stale when it was written, and
|
|
476
|
-
promoting it publishes the staleness.
|
|
477
|
-
|
|
478
|
-
Write the prune commit's message as the promotion record: what moved, and where each part landed.
|
|
479
|
-
That message is what makes the deletion recoverable in practice rather than only in principle.
|
|
467
|
+
- Prefer a mechanism that recomputes a fact over a document that records it. A document recording
|
|
468
|
+
live state is stale from the moment it is written, and the next campaign reads it as current.
|
|
469
|
+
Where the fact can be derived, derive it: the fleet's publish order lives in the catalog table
|
|
470
|
+
`scaffold catalog` regenerates, not in a written order anyone has to remember to update.
|
|
471
|
+
- Prune the campaign folder in a commit at acceptance. Git history is the archive; the working tree
|
|
472
|
+
is the workspace. `.agents/skills/orkestrel-debrief/references/retention.md` owns the procedure —
|
|
473
|
+
the checks that close the prune, the artifact locations it sweeps, and the promotion record
|
|
474
|
+
the commit message carries. Run it before deleting anything.
|
|
480
475
|
|
|
481
476
|
### Required sections
|
|
482
477
|
|
|
@@ -518,90 +513,44 @@ That message is what makes the deletion recoverable in practice rather than only
|
|
|
518
513
|
|
|
519
514
|
### Check the brief before you send it
|
|
520
515
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
Name
|
|
552
|
-
yourself after the unit exits
|
|
553
|
-
|
|
554
|
-
owned files stays a legitimate criterion.
|
|
555
|
-
- Order the criteria so an unreachable one cannot hide the others. A deviation contract fires on the
|
|
556
|
-
first criterion the unit cannot close and stops it there, so an unreachable criterion placed ahead
|
|
557
|
-
of a typecheck or a lint criterion skips that gate entirely and the unit ships a defect its own
|
|
558
|
-
brief would have caught. Put the cheap non-timing gates first, and never let a whole-suite result
|
|
559
|
-
gate a scoped one. Cheap-first has one exception: where the change edits a file the repository
|
|
560
|
-
vendors or otherwise digests, the regeneration step precedes every gate that reads the generated
|
|
561
|
-
artifact. A parity or inventory gate ordered ahead of it cannot pass, because the edit restaled the
|
|
562
|
-
digest that gate reads, and the unit stops on a criterion its own work already satisfied.
|
|
563
|
-
- Ask what the change will do to the facts you just measured. A criterion fixed to a measured set is
|
|
564
|
-
unreachable if the change alters that set, and a file marked off-limits is wrong if the change
|
|
565
|
-
writes to it. Measure the state the unit will finish in, not only the state it starts from.
|
|
566
|
-
- Grant both halves of a template change where the package generates the configuration it runs on.
|
|
567
|
-
The template and the repository's own materialized copy of that template's output are one change:
|
|
568
|
-
adding a fixed Vitest project moves the template, `vite.config.ts`, `package.json`, and the proof
|
|
569
|
-
file that project includes. Withhold either half and no edit to the owned files can reach the
|
|
570
|
-
gates the brief requires.
|
|
571
|
-
- Name the property the unit must change, and stop. A consequence you expect to follow from it is an
|
|
572
|
-
observation for the report, not a criterion. Bundled together, the unit can satisfy neither and
|
|
573
|
-
cannot tell which half you meant.
|
|
574
|
-
- Keep the brief's control identifiers inside the brief. Label controls so the brief's own table can
|
|
575
|
-
be read, and say in the brief that a test is named for what it proves, never for the control that
|
|
576
|
-
specified it. An implementer writing one test per control otherwise takes the label as the obvious
|
|
577
|
-
name, and a private brief vocabulary becomes a permanent test name.
|
|
516
|
+
Fill `.agents/templates/brief.md`, which carries the named scope rows and the worked reason behind
|
|
517
|
+
each check. Then run this checklist against what you filled.
|
|
518
|
+
|
|
519
|
+
- Name the executor that will open the brief, and write the transport for that reader. A bridge
|
|
520
|
+
driver and the bench engine inside that driver's CLI need opposite instructions.
|
|
521
|
+
- Paste the command and its output behind every factual claim — paths, counts, registrations, file
|
|
522
|
+
existence. Name the scope any search covered, and check a fact against the code rather than
|
|
523
|
+
against another artifact that states it.
|
|
524
|
+
- Take every measurement under the conditions the unit runs in, or have the unit take it before
|
|
525
|
+
doing anything else.
|
|
526
|
+
- Ask what the change does to every fact you measured, and fix each criterion to the state the unit
|
|
527
|
+
finishes in.
|
|
528
|
+
- Scope the change by the files its result makes **false**, not by the files that declare the thing
|
|
529
|
+
changing: the test asserting the reversed behaviour, the fixture carrying the raised value, the
|
|
530
|
+
golden digest over generated output, the consumer script naming the removed union member.
|
|
531
|
+
- Derive that set by running the suite. Where you cannot run it, name the search's bound in the
|
|
532
|
+
brief so the unit re-derives the set.
|
|
533
|
+
- Grant a behaviour with the tests that pin it, a constant with every fixture and expectation
|
|
534
|
+
derived from it, and a template change with the materialized copy the package generates from it.
|
|
535
|
+
- Read each criterion against the off-limits list, line by line. Grant the file a criterion needs or
|
|
536
|
+
strike that criterion. A file the change will break that appears in neither list is unscoped.
|
|
537
|
+
- Scope a unit that changes a mechanism to own the prose describing it. Where a brief scopes that
|
|
538
|
+
prose out, name the carrier and dispatch it before the change ships.
|
|
539
|
+
- Give a small unrelated obligation its own unit.
|
|
540
|
+
- Name the property the unit must change, and stop. Record an expected consequence as an
|
|
541
|
+
observation, never as a second criterion.
|
|
542
|
+
- Order the criteria cheap-first, so an unreachable one cannot hide a typecheck or a lint criterion
|
|
543
|
+
behind it. Where the change edits a file the repository vendors or digests, the regeneration step
|
|
544
|
+
precedes every gate that reads the generated artifact.
|
|
545
|
+
- Never make a timing-sensitive or whole-suite gate result a criterion for a unit running inside its
|
|
546
|
+
own exec. Name it as an observation the unit reports with its own reading, and take the
|
|
547
|
+
authoritative run yourself after the unit exits. A scoped run over the unit's owned files stays a
|
|
548
|
+
legitimate criterion.
|
|
578
549
|
- Check the brief's output mechanism and its verification method against the executor's tool
|
|
579
|
-
allowlist. A read-only
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
needs is a `prove` verdict and the lane's allowlist omits that tool, the Orchestrator takes the
|
|
584
|
-
call outside the lane's live interval and hands over the complete rendered verdict.
|
|
585
|
-
- Scope a change by the files its result makes **false**, not by the files that declare the thing
|
|
586
|
-
changing. Counting importers finds only part of that set. A test asserting the behaviour being
|
|
587
|
-
reversed, a fixture carrying a value being raised, a golden digest over generated output, and a
|
|
588
|
-
consumer script naming a union member being removed each go false without importing anything new,
|
|
589
|
-
and a brief scoped to the declaration alone sends the unit into a failure in a file it cannot edit.
|
|
590
|
-
The unit is then right to stop, and a whole dispatch cycle produces no work.
|
|
591
|
-
Ask of every criterion: what asserts the state this change ends? Own every answer, or strike the
|
|
592
|
-
criterion. Grant a behaviour and the tests that pin it together; grant a constant and every fixture
|
|
593
|
-
and expectation derived from it together.
|
|
594
|
-
- Find that set by running the suite, not by searching for the assertion's shape. A search returns
|
|
595
|
-
the assertions that look right and cannot say which ones the change actually reaches: a fixture
|
|
596
|
-
that never builds the directory the new code reads is a match the change cannot touch, and a
|
|
597
|
-
fixture that reaches it through a path the search never named is a miss. Both errors appear in one
|
|
598
|
-
grep. Where the change is already written somewhere — a scratch copy, an earlier unit, a probe —
|
|
599
|
-
run the suite against it and read the failures. Where it is not, name the search's bound in the
|
|
600
|
-
brief so the unit re-derives the set instead of trusting it.
|
|
601
|
-
- Scope a unit that changes a mechanism to own the prose describing that mechanism: the comment
|
|
602
|
-
beside the code it edits, and the guide passage stating the behaviour it moves. Where a brief
|
|
603
|
-
scopes that prose out so writers do not share a file, name the carrier that takes it and dispatch
|
|
604
|
-
that carrier before the change ships.
|
|
550
|
+
allowlist. A read-only lane writes no report file and runs no probe, so hand it the rendered
|
|
551
|
+
evidence instead.
|
|
552
|
+
- Keep the brief's control identifiers inside the brief, and say in the brief that a test is named
|
|
553
|
+
for what it proves rather than for the control that specified it.
|
|
605
554
|
|
|
606
555
|
### Carry every finding
|
|
607
556
|
|
|
@@ -742,7 +691,12 @@ transport.
|
|
|
742
691
|
3. **Tracked, never loose.** Register every bench unit in the session task registry at launch with
|
|
743
692
|
its subject, journal path, and session id, and complete it there at acceptance. "What is
|
|
744
693
|
running" always has a first-class answer instead of a recollection of a command.
|
|
745
|
-
4. **
|
|
694
|
+
4. **One lane at a time per bench.** Launch one `grok` lane at a time and queue the rest. Lanes past
|
|
695
|
+
that starve the bench: it accepts each launch and the lanes come back empty, which reads as the
|
|
696
|
+
work failing. Re-probe before ruling on an empty lane. A probe that round-trips while the lanes
|
|
697
|
+
return empty names starvation, not darkness — cut the concurrency and re-run the lane, rather
|
|
698
|
+
than recording the bench dark and substituting an engine.
|
|
699
|
+
5. **A bench sandbox spawns a child and denies that child's child.** Under `workspace-write` a bench
|
|
746
700
|
exec runs a test suite and spawns children normally, and every operation one level deeper fails:
|
|
747
701
|
a grandchild process is denied `EPERM`, and a nested `npm install` is denied the same way. So a
|
|
748
702
|
proof needing a process tree, a tree-kill, a detached group, or an installed package cannot be
|
|
@@ -776,7 +730,7 @@ transport.
|
|
|
776
730
|
**When a brief assigns a bench unit a path outside the obvious source tree, name the write limit
|
|
777
731
|
in the brief.** If the sandbox rejects the patch, the unit stops and reports the rejection. Never
|
|
778
732
|
find another write mechanism.
|
|
779
|
-
|
|
733
|
+
6. **Ephemeral streams, durable records.** A journal proves a bench is alive and recovers an
|
|
780
734
|
interrupted session. Keep journals under `tmp/`, never commit them, and sweep them at acceptance
|
|
781
735
|
after the final gate evidence is recorded. Durable retention — brief, distillate, verdict,
|
|
782
736
|
instrument, acceptance evidence — is owned by **Dispatch anatomy**; this rule owns only the
|
|
@@ -803,7 +757,14 @@ the conversation.
|
|
|
803
757
|
|
|
804
758
|
A publish chain is a long-running command, so every law under **Long-running commands** binds it:
|
|
805
759
|
write the chain to a file, detach it with `setsid`, and confirm the previous one is dead before
|
|
806
|
-
starting another.
|
|
760
|
+
starting another. Publish serially, because concurrent publishes collide on the authentication
|
|
761
|
+
handshake and fail each other.
|
|
762
|
+
|
|
763
|
+
The release itself runs from the `orkestrel-publish` skill: the wave's per-repo visit and its bump
|
|
764
|
+
triggers in `references/wave.md`, and the preparation order, the login approval, and the
|
|
765
|
+
five-minute upload window in `references/window.md`. Load the skill when the user asks for a
|
|
766
|
+
release, and follow it there rather than reconstructing the procedure here. What remains in this
|
|
767
|
+
section binds an executor who is not publishing.
|
|
807
768
|
|
|
808
769
|
### Fixing a dependency before it publishes
|
|
809
770
|
|
|
@@ -887,134 +848,6 @@ and propagates as files rather than as a cascade.
|
|
|
887
848
|
target. Scope a fleet-wide refactor to the files each target owns, and record the vendored
|
|
888
849
|
exclusion in the brief rather than letting each unit rediscover it.
|
|
889
850
|
|
|
890
|
-
### The release wave
|
|
891
|
-
|
|
892
|
-
Close a fleet-wide "everything on latest" goal as a release wave in layer order: visit every repo
|
|
893
|
-
once per round with one procedure, publish each layer in one window, and only then prepare the next.
|
|
894
|
-
|
|
895
|
-
- The visit, in order: re-pin the target's `@orkestrel/scaffold` devDependency and install, so the
|
|
896
|
-
overwrite runs the current vendored host; `scaffold overwrite`; force-verify every `@orkestrel`
|
|
897
|
-
range against a registry sweep taken after the previous layer published; full install; mutating
|
|
898
|
-
`format` to converge generated writes; the quality gates; the material-dist comparison against the
|
|
899
|
-
published tarball.
|
|
900
|
-
- Bump on either trigger: the rebuilt dist differs materially from the published tarball, or the
|
|
901
|
-
final runtime dependency set differs from the published packument. Test the final set against the
|
|
902
|
-
packument, never "did my step move a pin" — overwrite's `declare` re-pins before any later check,
|
|
903
|
-
so the step-local reading reports nothing moved while the manifest surface did. A re-pinned
|
|
904
|
-
runtime range is published surface: without the bump a consumer installs duplicate copies of the
|
|
905
|
-
moved dependency.
|
|
906
|
-
- A dist built before the version bump is the release artifact wherever the bump edits no emitted
|
|
907
|
-
byte. Check that per package rather than assuming it: a package that imports its own
|
|
908
|
-
`package.json` version into published code emits that version, so its pre-bump dist is stale the
|
|
909
|
-
moment the version moves. Rebuild after the bump there, and pack from the rebuilt tree. Because
|
|
910
|
-
`npm publish --ignore-scripts` skips `prepack`, that rebuild is the operator's step, not the
|
|
911
|
-
publish's.
|
|
912
|
-
- Refresh the registry evidence between layers and derive each round's pins from it. A pin can only
|
|
913
|
-
name a version the registry already serves, so a dependency shipping in the same window keeps the
|
|
914
|
-
resolvable previous pin and takes its dev-only re-pin after the window closes.
|
|
915
|
-
- Run visits in parallel slices of disjoint repos, each slice strictly serial inside itself,
|
|
916
|
-
reporting per-target. Refuse a failed target, name it, repair, and re-run it alone.
|
|
917
|
-
|
|
918
|
-
### Preparing
|
|
919
|
-
|
|
920
|
-
0. **An unpublished package's first version is `0.0.1`.** Do not bump it before that first publish.
|
|
921
|
-
The registry has nothing to serve, so there is no version to move away from, and bumping produces
|
|
922
|
-
a package whose history starts at a number nothing explains.
|
|
923
|
-
1. **Bump from what the registry serves, not from the local manifest.** A repository's `version`
|
|
924
|
-
can sit a release behind what was published from another checkout, and bumping that produces a
|
|
925
|
-
version the registry already holds, which fails on upload after the whole gate chain has run.
|
|
926
|
-
Read the registry first.
|
|
927
|
-
2. **Prepare a whole layer before authenticating.** Bump each version, re-pin every `@orkestrel`
|
|
928
|
-
range to what the registry serves now, install, and run the package's own `prepublishOnly` to
|
|
929
|
-
green. Move any self-pin in source with the manifest. Commit and push before the window opens.
|
|
930
|
-
3. **Prepare the next layer only after this one is on the registry.** A dependent's new pin cannot
|
|
931
|
-
install until the version it names exists, so preparation and publication interleave and cannot
|
|
932
|
-
be batched ahead.
|
|
933
|
-
|
|
934
|
-
The window is for uploads. Every gate, build, install, and commit happens outside it, which is what
|
|
935
|
-
makes `--ignore-scripts` the right flag at publish time: the artifact was already proved, and the
|
|
936
|
-
flag is what stops the gate chain running a second time inside the five minutes.
|
|
937
|
-
|
|
938
|
-
### Reaching the approval
|
|
939
|
-
|
|
940
|
-
- Launch the login chain only when the user has signalled they are at the keyboard and will click
|
|
941
|
-
within ten minutes. An approval URL expires unclicked in about ten to fifteen minutes, and an
|
|
942
|
-
overnight gap expires the session credential with it.
|
|
943
|
-
- Run `npm login` before any publish. `npm publish` does not open the browser flow: unauthenticated
|
|
944
|
-
it returns `E404` on `PUT`, which reads as a missing package rather than a missing credential.
|
|
945
|
-
- Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
|
|
946
|
-
`Press ENTER to open in the browser...` and blocks. Never answer that prompt with a newline: the
|
|
947
|
-
web flow consumes the newline on a later read, drops to a legacy `Username:` prompt, and exits
|
|
948
|
-
**zero** without authenticating. With the flag npm prints the URL and polls, and stdin stays
|
|
949
|
-
untouched.
|
|
950
|
-
- Hold stdin open and write nothing to it. Use a fifo held open by a long `sleep`. EOF drops npm to
|
|
951
|
-
the same legacy prompt a stray newline does.
|
|
952
|
-
- A login log showing the spinner and then a legacy `Username:` prompt is an expired attempt, not a
|
|
953
|
-
prompt to answer: kill it by process id and mint a fresh flow.
|
|
954
|
-
- Run the login and every publish under `script -qfc '<command>' <log>`. npm offers the approval only
|
|
955
|
-
when it sees a TTY; without one it fails `EOTP` with no way to answer.
|
|
956
|
-
- Git Bash on Windows ships no `script` binary, so the upload step there is operator-driven: prepare
|
|
957
|
-
the layer, prove the gates, surface the exact `npm publish` command, and the operator runs it in a
|
|
958
|
-
real terminal. Everything before and after the upload — bumps, re-pins, gates, registry reads —
|
|
959
|
-
stays with the Orchestrator. The fifo stdin law still binds on that host.
|
|
960
|
-
- Expect an approval for each stage. `npmjs.com/login/cli/<id>` authenticates the session;
|
|
961
|
-
`npmjs.com/auth/cli/<id>` authorizes the publish and opens the five-minute window. Tell the user
|
|
962
|
-
both are coming, or the second link reads as the first having failed.
|
|
963
|
-
- Confirm authentication with `npm whoami`, never with an exit code. The legacy fallthrough exits
|
|
964
|
-
zero.
|
|
965
|
-
- Re-probe `whoami` immediately before opening the window. A stored credential expires mid-session,
|
|
966
|
-
so a session-start answer does not hold.
|
|
967
|
-
- Surface each approval URL the moment it appears in the log, and take the **last** one in log order.
|
|
968
|
-
npm mints a new URL whenever an attempt restarts, and the log accumulates every one, so a URL
|
|
969
|
-
chosen by sorting rather than by position is already dead when the user opens it. Read it out of
|
|
970
|
-
the journal in the foreground and surface it before arming any watcher: a watcher-based relay can
|
|
971
|
-
fail silently, and its silence is indistinguishable from a chain that has not reached the URL yet.
|
|
972
|
-
Relay the URL as plain text. A decorated link did not render for the operator, who then had nothing
|
|
973
|
-
to click while the window ran down.
|
|
974
|
-
- Re-read the log before treating an approval as failed. The chain is usually still alive on a newer
|
|
975
|
-
URL, so surface that one rather than relaunching.
|
|
976
|
-
- A `404` on an approval URL usually means the publish already succeeded and consumed it. Read the
|
|
977
|
-
registry before calling it a failure.
|
|
978
|
-
- Say that approving the publish one opens a five-minute window covering the rest of the layer.
|
|
979
|
-
|
|
980
|
-
### Spending the window
|
|
981
|
-
|
|
982
|
-
- The window opens when the user approves, not when the first publish starts. Open each layer with
|
|
983
|
-
one package: publish it alone, surface its approval URL the moment the journal shows it, and
|
|
984
|
-
confirm the upload from the registry before starting the rest. Then chase the remaining uploads
|
|
985
|
-
back-to-back in one process with no gap — an upload started within seconds of an approval
|
|
986
|
-
frequently rides that approval, and each one that does not mints its own URL. Relay every new URL
|
|
987
|
-
to the user the moment it appears, through a journal watcher, and never pause the chain to wait
|
|
988
|
-
for a click: a poll outlives the relay.
|
|
989
|
-
- A click on a superseded URL poisons the live attempt — the current poll fails
|
|
990
|
-
`403 Forbidden - GET /-/v1/done` mid-flight. Tell the user to click only the newest URL. After
|
|
991
|
-
any such 403, confirm no publish process is live, then mint one fresh attempt.
|
|
992
|
-
- Publish serially. Concurrent publishes collide on the auth handshake and fail each other.
|
|
993
|
-
- **Never retry a publish that is still waiting for its authorization.** Each `npm publish` attempt
|
|
994
|
-
mints a new `authId` and invalidates the previous one, so a retry loop makes the URL a moving
|
|
995
|
-
target the user cannot approve in time. The abandoned poll then reports
|
|
996
|
-
`403 Forbidden - GET /-/v1/done?authId=…`, which reads as a permissions problem and is the
|
|
997
|
-
abandoned attempt colliding with the live one. Publish the first package of a layer with exactly
|
|
998
|
-
one attempt.
|
|
999
|
-
- Retry only an upload that failed **inside** an already-open window. `EOTP` there is intermittent
|
|
1000
|
-
contention rather than the window closing: retry about three times, and retry a failed set once the
|
|
1001
|
-
layer ends. Packages have landed on the third attempt and on a later pass with no new approval.
|
|
1002
|
-
These are different failures wearing similar codes; a retry fixes in-window contention and causes
|
|
1003
|
-
the moving approval target.
|
|
1004
|
-
- Expect a large layer to outlast one window. Size batches to what uploads in five minutes and tell
|
|
1005
|
-
the user how many approvals to expect, rather than discovering it mid-run.
|
|
1006
|
-
- Read the result from the registry, not from an exit code: a piped `npm publish` reports the exit
|
|
1007
|
-
status of the pipeline, and a CDN read straight after a publish can still serve the previous
|
|
1008
|
-
version.
|
|
1009
|
-
- A first publish creates the packument and can serve 404 for minutes after success. For a package
|
|
1010
|
-
with no prior version treat 404 as pending, not failed, and re-read on an interval before
|
|
1011
|
-
reporting either way. A bump serving the old version is CDN lag, same rule.
|
|
1012
|
-
- Rule on a pack-time manifest-rewriting warning by fetching the registry's copy of the manifest,
|
|
1013
|
-
never by the warning's own text.
|
|
1014
|
-
- Re-read the registry before telling the user a package failed. A chain still running, a retry that
|
|
1015
|
-
landed, and CDN lag all produce a failure reading that the registry contradicts, and a false
|
|
1016
|
-
failure report costs a needless approval and a needless republish.
|
|
1017
|
-
|
|
1018
851
|
## Acceptance laws
|
|
1019
852
|
|
|
1020
853
|
- No writer's and no external engine's self-assessment is authoritative.
|
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
name: enterprise-bootstrap
|
|
3
3
|
description: >-
|
|
4
4
|
Design and build distinctive, production-grade user interfaces with Bootstrap
|
|
5
|
-
5.3 and intentional frontend craft
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
accessibility (WCAG 2.2 AA),
|
|
5
|
+
5.3 and intentional frontend craft, in any host project and on any stack. Use
|
|
6
|
+
for Bootstrap user-interface work — creating, restyling, or
|
|
7
|
+
extending pages, screens, components, layouts, app shells, dashboards, admin
|
|
8
|
+
panels, SaaS tools, data tables, filter bars, forms, wizards, navigation,
|
|
9
|
+
modals, empty/loading/error states, dark mode, marketing surfaces — whenever
|
|
10
|
+
the task touches HTML/CSS/visual design, mentions Bootstrap or its components,
|
|
11
|
+
or must look professional and avoid templated defaults. Covers aesthetics,
|
|
12
|
+
typography, color modes, design tokens, accessibility (WCAG 2.2 AA),
|
|
13
|
+
responsive layout, and enterprise app patterns. The `orkestrel-polish-surface`
|
|
14
|
+
skill owns a requested verdict, round, or campaign over a surface that already
|
|
15
|
+
renders, including a review that changes nothing. In that campaign's fix
|
|
16
|
+
units, use this skill for Bootstrap craft.
|
|
13
17
|
---
|
|
14
18
|
|
|
15
19
|
# Enterprise Bootstrap
|
|
@@ -10,8 +10,8 @@ description: Audit and improve how two or more Orkestrel packages, or their core
|
|
|
10
10
|
Read the current authority in this order:
|
|
11
11
|
|
|
12
12
|
1. `AGENTS.md` and applicable `.claude/rules/*.md`.
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
13
|
+
2. `.agents/orchestration.md` for orchestration.
|
|
14
|
+
3. The `integration.md` and `fleet.md` references selected later in this section.
|
|
15
15
|
4. Relevant package guides, `guides/scaffold.md`, and the configured Orkestrel specialist.
|
|
16
16
|
|
|
17
17
|
Explicit user scope wins.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: orkestrel-debrief
|
|
3
|
-
description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an adversarial audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the
|
|
3
|
+
description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an adversarial audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the campaign folder.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Debrief a closed campaign
|
|
@@ -11,11 +11,12 @@ Read the current files in this order:
|
|
|
11
11
|
|
|
12
12
|
1. `AGENTS.md`.
|
|
13
13
|
2. Every applicable `.claude/rules/*.md`; the documentation and quality laws bind every
|
|
14
|
-
|
|
14
|
+
finding this round records and every refinement it produces.
|
|
15
15
|
3. The references this round needs: [instruction-audit.md](references/instruction-audit.md)
|
|
16
16
|
before auditing the agent/rule/skill/process layer;
|
|
17
17
|
[field-testing.md](references/field-testing.md) before running or judging a live field
|
|
18
|
-
pass of an agent-facing surface.
|
|
18
|
+
pass of an agent-facing surface; [retention.md](references/retention.md) before
|
|
19
|
+
retiring the campaign folder.
|
|
19
20
|
4. `guides/README.md`, the governing guides for what the campaign built, and `ROADMAP.md` when
|
|
20
21
|
the repository keeps one.
|
|
21
22
|
|
|
@@ -42,9 +43,11 @@ a practice that worked so it repeats.
|
|
|
42
43
|
- **Portable versus resident.** Learnings reusable beyond the repository — process
|
|
43
44
|
doctrine, role charters, rules, skills — land in the portable canon and propagate
|
|
44
45
|
through the scaffold host inventory. Repository truth lands in the guide; forward work
|
|
45
|
-
in `ROADMAP.md`. Nothing load-bearing stays only in the
|
|
46
|
-
- **The
|
|
47
|
-
|
|
46
|
+
in `ROADMAP.md`. Nothing load-bearing stays only in the campaign folder.
|
|
47
|
+
- **The campaign folder is ephemeral.** Fold every surviving truth into its destination,
|
|
48
|
+
then retire the folder through [retention.md](references/retention.md): its checks close
|
|
49
|
+
the deletion and the owner's explicit go-ahead authorizes it, in that order. Never
|
|
50
|
+
silently, never as residue.
|
|
48
51
|
|
|
49
52
|
## Run the round
|
|
50
53
|
|
|
@@ -74,9 +77,9 @@ a practice that worked so it repeats.
|
|
|
74
77
|
contract themselves against the campaign record, using the adversarial method in
|
|
75
78
|
[instruction-audit.md](references/instruction-audit.md). What confused an executor is
|
|
76
79
|
a defect in the instruction, not the executor.
|
|
77
|
-
6. **Reconcile into the
|
|
78
|
-
every one. Where audit lanes disagree, rule each divergence on the
|
|
79
|
-
the reason.
|
|
80
|
+
6. **Reconcile into the campaign folder.** Number the findings, attach verbatim
|
|
81
|
+
evidence, bucket every one. Where audit lanes disagree, rule each divergence on the
|
|
82
|
+
record with the reason.
|
|
80
83
|
7. **Land the refinements.** Dispatch fix-now findings as bounded units under the
|
|
81
84
|
repository's engine contract; make the canon edits (charters, rules, skills,
|
|
82
85
|
orchestration contract) with the owner's direction where the root contract is
|
|
@@ -85,8 +88,9 @@ a practice that worked so it repeats.
|
|
|
85
88
|
staged, gated, and pushed — editing one project's checkout propagates nothing. Verify
|
|
86
89
|
the generated-workspace proofs stay green so new projects inherit the refined canon.
|
|
87
90
|
9. **Dispose.** Present the disposition map — finding table with carriers, the canon
|
|
88
|
-
delta, what remains open — and
|
|
89
|
-
go-ahead
|
|
91
|
+
delta, what remains open — and retire the campaign folder through
|
|
92
|
+
[retention.md](references/retention.md), which owns the checks, the go-ahead, the
|
|
93
|
+
`tmp/` sweep, and the prune commit's promotion record.
|
|
90
94
|
|
|
91
95
|
## Verdict shape
|
|
92
96
|
|