@orkestrel/scaffold 0.0.37 → 0.0.39

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 (33) hide show
  1. package/dist/host/CLAUDE.md +2 -0
  2. package/dist/host/agents/orchestration.md +68 -27
  3. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +7 -2
  4. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +3 -0
  5. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +6 -0
  6. package/dist/host/claude/agents/analyst.md +6 -3
  7. package/dist/host/claude/agents/checker.md +1 -1
  8. package/dist/host/claude/agents/codex.md +13 -9
  9. package/dist/host/claude/agents/grok.md +3 -2
  10. package/dist/host/claude/agents/orkestrel.md +43 -36
  11. package/dist/host/claude/agents/planner.md +2 -1
  12. package/dist/host/claude/agents/reviewer.md +15 -14
  13. package/dist/host/claude/agents/sol.md +4 -2
  14. package/dist/host/claude/rules/quality.md +2 -1
  15. package/dist/host/claude/rules/tests.md +1 -0
  16. package/dist/host/codex/agents/analyst.toml +5 -5
  17. package/dist/host/codex/agents/claude.toml +34 -0
  18. package/dist/host/codex/agents/grok.toml +3 -3
  19. package/dist/host/codex/agents/opus.toml +16 -20
  20. package/dist/host/codex/agents/planner.toml +12 -17
  21. package/dist/host/codex/agents/reviewer.toml +13 -18
  22. package/dist/host/guides/guide.md +193 -98
  23. package/dist/host/manifest.json +6 -1
  24. package/dist/host/tests/config.test.ts +10 -7
  25. package/dist/src/core/index.cjs +9 -9
  26. package/dist/src/core/index.cjs.map +1 -1
  27. package/dist/src/core/index.js +9 -9
  28. package/dist/src/core/index.js.map +1 -1
  29. package/dist/src/server/index.cjs +32 -10
  30. package/dist/src/server/index.cjs.map +1 -1
  31. package/dist/src/server/index.js +32 -10
  32. package/dist/src/server/index.js.map +1 -1
  33. package/package.json +8 -8
@@ -11,6 +11,8 @@ follows it. This file adds only what Claude Code does differently, and cannot we
11
11
  - Use the Agent tool for a single dispatch, including when later control flow depends on its result.
12
12
  - Use a Workflow for a deterministic fan-out, staged pipeline, or loop. Serialize writing nodes.
13
13
  - Recover an interrupted Workflow with `resumeFromRunId`.
14
+ - Foreground Bash is hard-capped at 10 minutes regardless of its timeout parameter. Launch anything
15
+ that can exceed it as a harness-tracked background command.
14
16
  - Never dispatch an adversarial lane with a context-inheriting subagent type such as `fork`. A lane
15
17
  must start clean, or it inherits the Orchestrator's framing and stops being independent.
16
18
 
@@ -54,15 +54,16 @@ reasoning effort.
54
54
 
55
55
  ## The adversarial pass
56
56
 
57
- Two lanes run on every design round and every audit round.
57
+ Two lanes run on every design round; an audit round runs the lanes the execution loop's step 5
58
+ names, on the same clean-context terms.
58
59
 
59
60
  | Lane | Argues |
60
61
  | -------------- | --------------------------------------------------------------------------- |
61
62
  | **Subjective** | Shape, taste, naming, ergonomics, design fit, what the API should feel like |
62
63
  | **Objective** | Correctness, constraints, and what the code and contracts actually permit |
63
64
 
64
- **Both lanes always run.** Never collapse them into one. Never let an engine's absence stand in for
65
- a lane.
65
+ **A required lane always runs.** Never collapse two required lanes into one. Never let an engine's
66
+ absence stand in for a required lane.
66
67
 
67
68
  ### Clean contexts
68
69
 
@@ -162,6 +163,9 @@ when the role file already pins it.
162
163
  job to a bench means shipping that catalog across, which costs more than the bench saves.
163
164
  - `codex` is the shared Sol transport contract, not a route. `analyst` and `sol` are the named
164
165
  bridges; both bind that contract by reference and pin only their route and sandbox.
166
+ - Mirroring is by work class, not filename. A transport contract is provider-specific:
167
+ `.claude/agents/codex.md` carries the Sol transport on the Claude side, `.codex/agents/claude.toml`
168
+ the Opus transport on the Codex side, and each side's bridges bind their own by reference.
165
169
  - Opus and Sol roles use high effort. Native cheap-tier roles use low or medium. Bridge drivers use
166
170
  the cheapest tier that can run a CLI.
167
171
  - Never route orchestration or acceptance across a bridge.
@@ -284,18 +288,23 @@ lane instead of re-dispatching against a session-start answer that no longer hol
284
288
  fully specified taste-free unit to `builder`. Never route implementation to an engine the unit's
285
289
  judgment load exceeds.
286
290
  4. **Integrate.** Evaluate each distillate against its acceptance criteria, apply shared-file
287
- patches serially, and route cross-cutting findings.
288
- 5. **Audit adversarially.** Run the two-lane adversarial pass on every nontrivial implementation:
289
- `reviewer` for the subjective lane and `analyst` for the objective lane, plus `checker` for
290
- mechanical conformance.
291
+ patches serially, and route cross-cutting findings. Integration applies exact returned patches
292
+ and mechanical conflict resolution only. A new type, mechanism, behavior, or acceptance
293
+ criterion discovered at integration is a successor brief routed to a writer, never an
294
+ integration edit.
295
+ 5. **Audit adversarially.** Audit every nontrivial implementation with at least one lane whose
296
+ engine did not write it. Run the second lane when the first returns FAIL, when the subject is a
297
+ rendered or externally driven surface, or when the unit's claims span both correctness and
298
+ shape. Dispatch `checker` when the acceptance criteria are mechanical — counts, paths, parity
299
+ rows, scope honesty. Record in the round's verdict file when a lane or the checker did not run.
291
300
  - State the audit's subject as numbered falsifiable claims and require per-claim verdicts with
292
- evidence, per the Falsification law in `.claude/rules/quality.md` and the value set the
293
- dispatch-named skill fixes.
301
+ evidence, per the Falsification law in `.claude/rules/quality.md` and the `orkestrel-falsify`
302
+ value set, unless the dispatch names a different skill that fixes another.
294
303
  - In a fix round, give the unit to an auditor engine that did not write it.
295
304
  - Run the `orkestrel-falsify` skill for multi-round audits. It owns the brief anatomy, the
296
305
  successor-brief rule, the verdict shape and its single terminal line, and the reconciliation
297
306
  discipline.
298
- - Reconcile their evidence. Drop, on the record, any finding neither engine can substantiate.
307
+ - Reconcile the lanes that ran. Drop, on the record, any finding no lane can substantiate.
299
308
  6. **Verify.** Have one independent `verifier` run the authoritative gates.
300
309
  7. **Re-baseline.** Reconcile the remaining plan against what the phase revealed, before dispatching
301
310
  the next one.
@@ -369,11 +378,18 @@ The harness bridge names the concrete mechanism for each of these.
369
378
  - Send a decision taken mid-campaign to every unit already in flight whose brief it invalidates. An
370
379
  executor cannot see a change made after it was dispatched, so it writes the state its brief
371
380
  described and the defect surfaces as its own.
372
- - Treat the `tmp/` brief and report pair as ephemeral launch copies. **Bench laws** rule 4 owns
373
- what is kept and what is swept; follow it there rather than deciding here.
381
+ - Retention is uniform for every unit, whatever engine ran it, including an Orchestrator-owned
382
+ integration, fix, probe, or capture unit: copy the brief, the returned report or distillate, the
383
+ audit verdict, the exact executed script or instrument, and the acceptance evidence into
384
+ `.orkestrel/<package>/` as the unit is dispatched and as it returns, then sweep only the `tmp/`
385
+ launch copies. A capture claim's instrument is acceptance evidence; the frames may be swept once
386
+ the record transcribes them, because the committed instrument re-produces the film. **Bench
387
+ laws** rule 4 owns journals and points here for everything durable.
374
388
  - Promote anything that must outlive the campaign into a durable artifact before the sweep — a
375
389
  commit message, a guide, a rule, a retrospective. What is only in a swept file did not survive,
376
390
  and a debrief that must quote the record verbatim has nothing to quote.
391
+ - Land a process rule stated as binding mid-campaign in the owning rule or contract file in the
392
+ same commit that states it. A campaign artifact is evidence, never a rule's home.
377
393
 
378
394
  ### Where campaign artifacts live
379
395
 
@@ -447,7 +463,8 @@ wrong is right to stop.
447
463
  fix the criterion to the property you want rather than to the number you saw.
448
464
  - Read the acceptance criteria against the off-limits list, line by line. Every criterion closes
449
465
  using owned files alone. A criterion that needs an off-limits file gets that file granted or gets
450
- struck.
466
+ struck. A file the change will break that appears in neither list is an unscoped file; grant it or
467
+ strike the criterion.
451
468
  - Give a small unrelated obligation its own unit. Ride it along in a large one and its scope error
452
469
  blocks the primary work, which is a whole unit lost to a detail.
453
470
  - Ask what the change will do to the facts you just measured. A criterion fixed to a measured set is
@@ -471,9 +488,10 @@ wrong is right to stop.
471
488
  already settled. Where a read-only lane needs executed evidence, produce it separately and hand it
472
489
  over: the Orchestrator supplies the evidence and the lane rules on it.
473
490
  - Scope a fleet-wide refactor by the files that **consume** a symbol, not by the files that declare
474
- it. A criterion to delete or rename anything closes only when every importer is owned, so a brief
475
- scoped to the declaration alone sends the unit into a typecheck break in a file it cannot edit.
476
- Count the importers before writing the owned list.
491
+ it. A criterion that removes a symbol, or that makes an existing state or fixture shape
492
+ unreachable, closes only when every consumer that exercises it is owned, so a brief scoped to the
493
+ declaration alone sends the unit into a typecheck break in a file it cannot edit. Count the
494
+ importers before writing the owned list.
477
495
 
478
496
  ### Carry every finding
479
497
 
@@ -513,8 +531,9 @@ command that outlives the turn that started it. Every law here binds all of them
513
531
  launch whose tail is the evidence.
514
532
  - Keep network-dependent work out of sandboxed bench execs. Bench sandboxes deny network, so
515
533
  lockfile generation, real installs, and live fetches belong to the Orchestrator's own tracked
516
- commands or a network-capable native agent. A bench exec hanging on `npm` until its cap fires is
517
- the signature of this misroute, not of a slow bench.
534
+ commands or to the native `implementer` or `builder` as an ordinary dispatched writing unit. A
535
+ bench exec hanging on `npm` until its cap fires is the signature of this misroute, not of a slow
536
+ bench.
518
537
  - A Workflow journals identically and dies identically, so give it the same watch — with one
519
538
  correction. A workflow journal writes only at agent start and result, so its mtime goes quiet for
520
539
  minutes during healthy work, and the liveness signal is the newest subagent transcript instead. A
@@ -546,6 +565,10 @@ nothing.
546
565
  - Kill by process id, never by pattern. `pkill -f` matches the relaunch that is already starting, so
547
566
  the pattern that cleans up the old run kills the new one and the cleanup reads as a launch
548
567
  failure.
568
+ - A killed `codex exec` is dead only when its process tree is dead: walk the children with
569
+ `ps --ppid` and confirm the `codex-code-mode-host` child is gone. Before dispatching a substitute
570
+ writer, check the owned files' modification times against the baseline — a live orphan is still
571
+ writing the tree the substitute is about to own.
549
572
  - Read a failure against what was running when it happened, not against what you believe was
550
573
  running. The check costs one command and is the only thing that separates a real failure from
551
574
  self-inflicted contention.
@@ -584,12 +607,9 @@ transport.
584
607
  running" always has a first-class answer instead of a recollection of a command.
585
608
  4. **Ephemeral streams, durable records.** A journal proves a bench is alive and recovers an
586
609
  interrupted session. Keep journals under `tmp/`, never commit them, and sweep them at acceptance
587
- after the final gate evidence is recorded. The **brief**, the returned **distillate**, the
588
- **audit verdict**, and the **acceptance evidence** are not streams. Copy each into
589
- `.orkestrel/<package>/` and commit it as its unit is dispatched and as it returns, then sweep
590
- only the `tmp/` copy. None of it is reproducible from the diff, and a debrief has no primary
591
- source without it. This rule owns retention for the whole contract; **Dispatch anatomy**
592
- points here rather than answering it.
610
+ after the final gate evidence is recorded. Durable retention brief, distillate, verdict,
611
+ instrument, acceptance evidence is owned by **Dispatch anatomy**; this rule owns only the
612
+ journal stream.
593
613
 
594
614
  ### Recovering a dark bench
595
615
 
@@ -623,9 +643,14 @@ either publishes packages nobody needed to publish or leaves a consumer pinned t
623
643
  downstream of it re-pins, re-runs its gates, bumps, and republishes, in layer order.
624
644
  - A **development** `devDependencies` bump reaches nobody. Re-pin it, prove the gates still green,
625
645
  and commit to `main`. Do not bump the version and do not publish.
626
- - A development bump that forces a change to `src` or `app` is no longer a development bump. The
627
- published types or runtime moved, so that package bumps and publishes on its own account, and
628
- its own dependents follow the runtime rule above.
646
+ - A development bump that moves the published artifact is no longer a development bump. Prove the
647
+ direction with the build, not the diff of sources: rebuild after the re-pin and compare `dist/`
648
+ against the published tarball. Compare material content only — exclude sourcemaps and ignore
649
+ whitespace-only differences; a superfluous diff (formatting, blank lines, map noise) moves
650
+ nothing and obliges nothing. A material diff — tokens, declarations, logic — means the published
651
+ surface moved — a forced `src` or `app` edit and a toolchain-changed emit both surface here — so
652
+ that package bumps and publishes on its own account, and its own dependents follow the runtime
653
+ rule above.
629
654
 
630
655
  Every package is `0.0.x`, where a caret pins one exact release. A dependent therefore sees a new
631
656
  version only after it re-pins and republishes, so the fleet publishes in topological layer order
@@ -682,6 +707,9 @@ flag is what stops the gate chain running a second time inside the five minutes.
682
707
 
683
708
  ### Reaching the approval
684
709
 
710
+ - Launch the login chain only when the user has signalled they are at the keyboard and will click
711
+ within ten minutes. An approval URL expires unclicked in about ten to fifteen minutes, and an
712
+ overnight gap expires the session credential with it.
685
713
  - Run `npm login` before any publish. `npm publish` does not open the browser flow: unauthenticated
686
714
  it returns `E404` on `PUT`, which reads as a missing package rather than a missing credential.
687
715
  - Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
@@ -691,8 +719,14 @@ flag is what stops the gate chain running a second time inside the five minutes.
691
719
  untouched.
692
720
  - Hold stdin open and write nothing to it. Use a fifo held open by a long `sleep`. EOF drops npm to
693
721
  the same legacy prompt a stray newline does.
722
+ - A login log showing the spinner and then a legacy `Username:` prompt is an expired attempt, not a
723
+ prompt to answer: kill it by process id and mint a fresh flow.
694
724
  - Run the login and every publish under `script -qfc '<command>' <log>`. npm offers the approval only
695
725
  when it sees a TTY; without one it fails `EOTP` with no way to answer.
726
+ - Git Bash on Windows ships no `script` binary, so the upload step there is operator-driven: prepare
727
+ the layer, prove the gates, surface the exact `npm publish` command, and the operator runs it in a
728
+ real terminal. Everything before and after the upload — bumps, re-pins, gates, registry reads —
729
+ stays with the Orchestrator. The fifo stdin law still binds on that host.
696
730
  - Expect two approvals. `npmjs.com/login/cli/<id>` authenticates the session; `npmjs.com/auth/cli/<id>`
697
731
  authorizes the publish and opens the five-minute window. Tell the user both are coming, or the
698
732
  second link reads as the first having failed.
@@ -729,6 +763,11 @@ flag is what stops the gate chain running a second time inside the five minutes.
729
763
  - Read the result from the registry, not from an exit code: a piped `npm publish` reports the exit
730
764
  status of the pipeline, and a CDN read straight after a publish can still serve the previous
731
765
  version.
766
+ - A first publish creates the packument and can serve 404 for minutes after success. For a package
767
+ with no prior version treat 404 as pending, not failed, and re-read on an interval before
768
+ reporting either way. A bump serving the old version is CDN lag, same rule.
769
+ - Rule on a pack-time manifest-rewriting warning by fetching the registry's copy of the manifest,
770
+ never by the warning's own text.
732
771
  - Re-read the registry before telling the user a package failed. A chain still running, a retry that
733
772
  landed, and CDN lag all produce a failure reading that the registry contradicts, and a false
734
773
  failure report costs a needless approval and a needless republish.
@@ -749,6 +788,8 @@ flag is what stops the gate chain running a second time inside the five minutes.
749
788
  implicit engines, fixed Claude model IDs, or verbose completed-work residue.
750
789
  - Evidence a claim about a rendered or externally driven surface with its capture or a real foreign
751
790
  client driving it, never with source alone. Where no such surface exists this law is inert.
791
+ - When the Orchestrator writes any part of a unit, that part is briefed, owned, and audited like any
792
+ other part, and its auditor is an engine the Orchestrator does not share.
752
793
  - Final acceptance belongs only to the Orchestrator, after independent audit and gate evidence.
753
794
  - Accept when the plan's exit criterion is met and the gates are green, not when the last engine
754
795
  runs out of appetite. Reopening an accepted criterion is the user's instruction, not an auditor's
@@ -58,8 +58,13 @@ a practice that worked so it repeats.
58
58
  src, does src carry application policy, does either duplicate a declared ecosystem
59
59
  primitive? Package promotion: what grew into a reusable mechanism that belongs in an
60
60
  existing package or justifies a new one — mapped dependency-first so promotion order
61
- is executable. Every row ends implement, repair, retain, or intentionally exclude,
62
- with evidence.
61
+ is executable. Sweep test infrastructure both ways: name every local test helper or
62
+ fixture whose semantics an installed shared-package export already covers (compare
63
+ against the declarations each repository compiles with, and adopt rather than keep),
64
+ and name every instrument two or more packages built independently (count a value set
65
+ fed through one proof loop as one implementation, whether the set sits beside the
66
+ loop or its assertions are spelled out one by one). Every row ends implement, repair,
67
+ retain, or intentionally exclude, with evidence.
63
68
  4. **Process retrospective.** Walk the campaign record for both failure and success:
64
69
  dispatches that deviated and why; recoveries that worked (codify the mechanism that
65
70
  saved them); estimates versus observed durations; audit rounds that caught real
@@ -73,3 +73,6 @@ delta from the prior round. A tier passes when its models complete the goal with
73
73
  failed calls and no out-of-band reading (no source excavation, no filesystem search —
74
74
  watch for it in the transcript; it means the surface leaked its teaching job to the
75
75
  repository).
76
+
77
+ A re-film that drives the surface with live models is a field pass: it carries the
78
+ scoreboard and each lane's journal path like any other round.
@@ -11,9 +11,15 @@ seeing the other's answer before both return:
11
11
 
12
12
  - **Subjective** (design-fit engine): coherence of the role model, charter voice, whether
13
13
  each role's job is one job, whether the skill family reads as one system.
14
+ - The subjective lenses, so the lane can state its coverage: role-job singularity;
15
+ charter voice against dispatched usage; lane-swap residue; bridge minimalism;
16
+ vocabulary drift across mirrored files; skill-family seams.
14
17
  - **Objective** (correctness engine): evidence-only sweeps of the actual files and the
15
18
  campaign record — the lanes below.
16
19
 
20
+ Each lane returns numbered findings, most severe first, and exactly one terminal line:
21
+ `INSTRAUDIT <LANE>: <n> findings`.
22
+
17
23
  Reconcile into rulings; every divergence gets a ruled row with the reason. Convergent
18
24
  findings adopt without contest; a finding neither lane can substantiate dies on the
19
25
  record.
@@ -36,7 +36,8 @@ Everything `.agents/orchestration.md`'s dispatch contract requires, plus:
36
36
  never saw. Propagate the missing file; do not restate its contents in the brief.
37
37
  - For an audit: the subject as numbered falsifiable claims, and the skill that fixes the verdict
38
38
  shape. The Falsification section of `.claude/rules/quality.md` owns the method and the evidence
39
- each verdict carries; the dispatch-named skill owns the value set and the terminal line. Point at
39
+ each verdict carries. The verdict shape defaults to `orkestrel-falsify`; a dispatch may name a
40
+ different skill that fixes another. That skill owns the value set and the terminal line. Point at
40
41
  both; restate neither.
41
42
 
42
43
  ## Launching
@@ -52,8 +53,10 @@ work-class rule. Persist the thread id the moment a response carries it.
52
53
 
53
54
  ## Return
54
55
 
55
- The brief path, the resolved command, the journal path, the session id, and once the Orchestrator
56
- reports the exec complete Sol's answer verbatim, labelled untrusted and unaccepted. Never a cap.
56
+ The brief path, the resolved command, and the journal path and nothing else. Never a cap. The
57
+ Orchestrator launches the exec and reads Sol's answer from the `--output-last-message` file itself;
58
+ you never wait for it, relay it, or endorse it. A follow-up on a finished exec is a fresh dispatch,
59
+ not a continuation.
57
60
 
58
61
  Never edit, implement, reconcile, accept, commit, push, install, read a credential, or spawn any
59
62
  agent.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: checker
3
- description: 'Mechanical conformance review — acceptance criteria, AGENTS.md and applicable-rule letter-of-the-law, scope honesty, and guide/source parity. Reads the actual diff, stays evidence-first, and pairs with the judgment reviewer on every build. Never edits.'
3
+ description: "Mechanical conformance review — acceptance criteria, AGENTS.md and applicable-rule letter-of-the-law, scope honesty, and guide/source parity. Reads the actual diff, stays evidence-first, and is dispatched when a unit's acceptance criteria are mechanically checkable. Never edits."
4
4
  tools: Read, Grep, Glob
5
5
  model: sonnet
6
6
  effort: low
@@ -62,9 +62,9 @@ never travel as shell arguments. Return the exact resolved command with a pointe
62
62
  repository, and `--output-schema <file>` when the Orchestrator supplies one.
63
63
  - The journal at `tmp/codex/<unit>.jsonl` is the live progress record and its mtime is
64
64
  the liveness signal the Orchestrator watches. Never re-print the stream into your report.
65
- - When the Orchestrator hands back a finished exec, read Sol's answer from the
66
- `--output-last-message` file rather than stdout, and record the session id (`thread_id`
67
- in the journal's opening events) in every report.
65
+ - The Orchestrator reads Sol's answer from the `--output-last-message` file rather than
66
+ stdout, and records the session id (`thread_id` in the journal's opening events)
67
+ beside the result; a follow-up on a finished exec is a fresh dispatch.
68
68
 
69
69
  ## The exec sandbox denies network
70
70
 
@@ -73,6 +73,10 @@ endpoint — lockfile generation, real installs, live fetches — belongs to the
73
73
  Orchestrator's own tracked commands or a network-capable native agent. Never put it in a
74
74
  brief. A Sol exec hanging on `npm` until its cap fires is this misroute, not a slow bench.
75
75
 
76
+ The namespace has its own loopback, so a host daemon on `127.0.0.1` is unreachable and a bind can
77
+ fail `EPERM`. It has no IPv6, so `::1` fails `EAFNOSUPPORT`. Any proof that must reach a daemon,
78
+ bind a port, or drive a built server belongs outside the exec.
79
+
76
80
  ## The exec sandbox mounts `.git` read-only
77
81
 
78
82
  A `workspace-write` exec can write the working tree and cannot write `.git`. Every command
@@ -107,9 +111,9 @@ and after. Require evidence for every claim and return unsupported claims as dro
107
111
 
108
112
  An audit brief states its subject as a numbered list of falsifiable claims rather than a
109
113
  diff to read, and requires Sol to attempt refutation. The Falsification section of
110
- `.claude/rules/quality.md` owns the method and the evidence each verdict carries. When the
111
- dispatch names a skill that fixes the verdict shape, that skill owns the value set and the
112
- terminal line. Point the brief at both; restate neither.
114
+ `.claude/rules/quality.md` owns the method and the evidence each verdict carries. The verdict shape
115
+ defaults to `orkestrel-falsify`; a dispatch may name a different skill that fixes another. That
116
+ skill owns the value set and the terminal line. Point the brief at both; restate neither.
113
117
 
114
118
  ## Implementer route
115
119
 
@@ -118,9 +122,9 @@ baseline, with owned files, off-limits files, and a deviation contract. The brie
118
122
  dependency installation, commits, pushes, publishing, credentials, destructive commands,
119
123
  shared-file edits, and tree-wide mutating gates.
120
124
 
121
- When the Orchestrator hands the finished exec back, verify the result with direct evidence
122
- (git status, diff, scoped validation) and report once, completely: touched files,
123
- diffstat, scoped validation, and deviation state, for independent integration and review.
125
+ The Orchestrator verifies the finished exec with direct evidence git status, the diff,
126
+ scoped validation and carries touched files, diffstat, and deviation state into
127
+ integration and review.
124
128
 
125
129
  ## Routing exclusion — defensive negative-test units
126
130
 
@@ -40,8 +40,9 @@ that never happened. The versioned entry has no console dependency and no such f
40
40
 
41
41
  Read an empty shim run as a launch failure until its log is checked for that trace.
42
42
 
43
- If nothing responds the bench is dark. Stop with a deviation naming the fallback: hand the
44
- reading to the Orchestrator, `planner`, or `analyst` directly. Never install or authenticate.
43
+ If nothing responds the bench is dark. Stop with a deviation naming the fallback from the root
44
+ tedious-work ladder — Luna, then Sonnet. Never hand the reading to the Orchestrator, `planner`, or
45
+ `analyst`. Never install or authenticate.
45
46
 
46
47
  Create `tmp/cursor/` first. Write any brief longer than a couple of sentences to
47
48
  `tmp/cursor/<unit>-brief.md` and make the prompt a pointer to it; briefs never travel as
@@ -36,46 +36,51 @@ so network-controlled descriptions never enter agent instruction context.
36
36
 
37
37
  | Package | Version | Layer | Runtime dependencies |
38
38
  | ----------------------- | -------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
- | `@orkestrel/abort` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
39
+ | `@orkestrel/abort` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
40
40
  | `@orkestrel/agent` | `0.0.15` | L5 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/queue` `^0.0.8`, `@orkestrel/timeout` `^0.0.6`, `@orkestrel/tool` `^0.0.10`, `@orkestrel/workflow` `^0.0.11`, `@orkestrel/workspace` `^0.0.4` |
41
+ | `@orkestrel/brief` | `0.0.2` | L4 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/interpret` `^0.0.9`, `@orkestrel/reason` `^0.0.6` |
41
42
  | `@orkestrel/browser` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/html` `^0.0.3`, `@orkestrel/websocket` `^0.0.8` |
42
- | `@orkestrel/budget` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
43
- | `@orkestrel/console` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
44
- | `@orkestrel/contract` | `0.0.11` | L0 | |
45
- | `@orkestrel/csv` | `0.0.3` | L1 | `@orkestrel/contract` `^0.0.11` |
46
- | `@orkestrel/database` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/indexeddb` `^0.0.7`, `@orkestrel/sqlite` `^0.0.7` |
47
- | `@orkestrel/emitter` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
48
- | `@orkestrel/guide` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/markdown` `^0.0.8` |
49
- | `@orkestrel/html` | `0.0.3` | L1 | `@orkestrel/contract` `^0.0.11` |
50
- | `@orkestrel/indexeddb` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.11` |
51
- | `@orkestrel/interpret` | `0.0.8` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.5`, `@orkestrel/template` `^0.0.3` |
52
- | `@orkestrel/markdown` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/html` `^0.0.3` |
53
- | `@orkestrel/mcp` | `0.0.14` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.10`, `@orkestrel/websocket` `^0.0.8` |
54
- | `@orkestrel/middleware` | `0.0.10` | L2 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/timeout` `^0.0.6` |
55
- | `@orkestrel/msg` | `0.0.6` | L0 | |
56
- | `@orkestrel/ndjson` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
43
+ | `@orkestrel/budget` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
44
+ | `@orkestrel/console` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
45
+ | `@orkestrel/contract` | `0.0.12` | L0 | |
46
+ | `@orkestrel/csv` | `0.0.4` | L1 | `@orkestrel/contract` `^0.0.12` |
47
+ | `@orkestrel/database` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/indexeddb` `^0.0.8`, `@orkestrel/sqlite` `^0.0.8` |
48
+ | `@orkestrel/emitter` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
49
+ | `@orkestrel/form` | `0.0.2` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
50
+ | `@orkestrel/guide` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/markdown` `^0.0.8` |
51
+ | `@orkestrel/html` | `0.0.4` | L1 | `@orkestrel/contract` `^0.0.12` |
52
+ | `@orkestrel/indexeddb` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.12` |
53
+ | `@orkestrel/interpret` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.6`, `@orkestrel/template` `^0.0.3` |
54
+ | `@orkestrel/markdown` | `0.0.9` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/html` `^0.0.4` |
55
+ | `@orkestrel/mcp` | `0.0.15` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.10`, `@orkestrel/websocket` `^0.0.8` |
56
+ | `@orkestrel/middleware` | `0.0.13` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/timeout` `^0.0.7` |
57
+ | `@orkestrel/msg` | `0.0.7` | L0 | |
58
+ | `@orkestrel/ndjson` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
57
59
  | `@orkestrel/ollama` | `0.0.9` | L6 | `@orkestrel/agent` `^0.0.15`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/ndjson` `^0.0.6`, `@orkestrel/timeout` `^0.0.6`, `@orkestrel/tool` `^0.0.10` |
58
- | `@orkestrel/pool` | `0.0.7` | L2 | `@orkestrel/emitter` `^0.0.6` |
59
- | `@orkestrel/program` | `0.0.7` | L4 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/qualifier` `^0.0.8`, `@orkestrel/rater` `^0.0.9`, `@orkestrel/reason` `^0.0.5` |
60
- | `@orkestrel/qualifier` | `0.0.8` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.5` |
60
+ | `@orkestrel/pool` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.7` |
61
+ | `@orkestrel/program` | `0.0.8` | L4 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/qualifier` `^0.0.9`, `@orkestrel/rater` `^0.0.10`, `@orkestrel/reason` `^0.0.6` |
62
+ | `@orkestrel/qualifier` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.6` |
61
63
  | `@orkestrel/queue` | `0.0.8` | L3 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/timeout` `^0.0.6` |
62
- | `@orkestrel/rater` | `0.0.9` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.5` |
63
- | `@orkestrel/reason` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
64
+ | `@orkestrel/rater` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/reason` `^0.0.6` |
65
+ | `@orkestrel/reason` | `0.0.7` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
64
66
  | `@orkestrel/relation` | `0.0.8` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6` |
65
- | `@orkestrel/router` | `0.0.9` | L2 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
66
- | `@orkestrel/scaffold` | `0.0.27` | L3 | `@orkestrel/console` `^0.0.5`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/markdown` `^0.0.8`, `@orkestrel/template` `^0.0.3` |
67
- | `@orkestrel/sea` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
68
- | `@orkestrel/server` | `0.0.11` | L3 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/router` `^0.0.9`, `@orkestrel/timeout` `^0.0.6` |
69
- | `@orkestrel/sqlite` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.11` |
67
+ | `@orkestrel/router` | `0.0.10` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
68
+ | `@orkestrel/scaffold` | `0.0.38` | L3 | `@orkestrel/console` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/markdown` `^0.0.8`, `@orkestrel/template` `^0.0.3` |
69
+ | `@orkestrel/sea` | `0.0.7` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
70
+ | `@orkestrel/server` | `0.0.12` | L3 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/router` `^0.0.9`, `@orkestrel/timeout` `^0.0.6` |
71
+ | `@orkestrel/sqlite` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.12` |
70
72
  | `@orkestrel/sse` | `0.0.5` | L0 | |
71
- | `@orkestrel/template` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
72
- | `@orkestrel/terminal` | `0.0.6` | L3 | `@orkestrel/console` `^0.0.5`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/sse` `^0.0.5` |
73
- | `@orkestrel/timeout` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
74
- | `@orkestrel/tool` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.11` |
75
- | `@orkestrel/toolbox` | `0.0.4` | L6 | `@orkestrel/agent` `^0.0.15`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/relation` `^0.0.8`, `@orkestrel/server` `^0.0.11`, `@orkestrel/terminal` `^0.0.6`, `@orkestrel/tool` `^0.0.10`, `@orkestrel/workflow` `^0.0.11`, `@orkestrel/workspace` `^0.0.4` |
76
- | `@orkestrel/websocket` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.6` |
73
+ | `@orkestrel/supervisor` | `0.0.1` | L5 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/workflow` `^0.0.12` |
74
+ | `@orkestrel/table` | `0.0.2` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
75
+ | `@orkestrel/template` | `0.0.4` | L2 | `@orkestrel/contract` `^0.0.12`, `@orkestrel/emitter` `^0.0.7` |
76
+ | `@orkestrel/terminal` | `0.0.9` | L3 | `@orkestrel/console` `^0.0.7`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/form` `^0.0.1`, `@orkestrel/sse` `^0.0.5` |
77
+ | `@orkestrel/test` | `0.0.6` | L0 | |
78
+ | `@orkestrel/timeout` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.12` |
79
+ | `@orkestrel/tool` | `0.0.11` | L1 | `@orkestrel/contract` `^0.0.12` |
80
+ | `@orkestrel/toolbox` | `0.0.6` | L6 | `@orkestrel/agent` `^0.0.15`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/relation` `^0.0.8`, `@orkestrel/server` `^0.0.12`, `@orkestrel/terminal` `^0.0.7`, `@orkestrel/tool` `^0.0.10`, `@orkestrel/workflow` `^0.0.11`, `@orkestrel/workspace` `^0.0.4` |
81
+ | `@orkestrel/websocket` | `0.0.9` | L2 | `@orkestrel/emitter` `^0.0.7` |
77
82
  | `@orkestrel/worker` | `0.0.7` | L4 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/pool` `^0.0.7`, `@orkestrel/queue` `^0.0.8` |
78
- | `@orkestrel/workflow` | `0.0.11` | L4 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/queue` `^0.0.8`, `@orkestrel/timeout` `^0.0.6` |
83
+ | `@orkestrel/workflow` | `0.0.12` | L4 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/queue` `^0.0.8`, `@orkestrel/timeout` `^0.0.6` |
79
84
  | `@orkestrel/workspace` | `0.0.4` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6` |
80
85
 
81
86
  <!-- /orkestrel:catalog -->
@@ -96,9 +101,11 @@ pin names an older version runs that older version, whatever the registry holds.
96
101
 
97
102
  A **development** bump obliges nothing. A `devDependencies` range reaches no consumer of
98
103
  the published package, so re-pin it, prove the gates still green, and stop. Never report a
99
- development bump as a cascade. It becomes one only if it forces a change to `src` or
100
- `app`, because then the published types or runtime moved and the package bumps on that
101
- account rather than on the dependency's.
104
+ development bump as a cascade. It becomes one only when the rebuilt `dist/` differs
105
+ materially from the published artifact after the re-pin sourcemaps excluded,
106
+ whitespace-only differences ignored meaning the published surface moved, through a
107
+ forced `src`/`app` edit or a changed toolchain emit, and the package then bumps on that
108
+ account rather than on the dependency's. A superfluous diff obliges nothing.
102
109
 
103
110
  The `Layer` column above is the publish round, derived from the runtime edges in the same
104
111
  row. `L0` depends on nothing else in the fleet and publishes first; each later layer
@@ -24,7 +24,8 @@ Return only:
24
24
  - `Alternatives`: at most two real alternatives and why the design wins.
25
25
  - `Units`: bounded work, each naming its role AND engine so the routing ledger is
26
26
  derivable, with ownership, dependencies, and acceptance criteria.
27
- - `Tensions`: subjective choices that Sol should challenge objectively.
27
+ - `Tensions`: the choices your lane made on judgment, named for the other lane to
28
+ challenge — or, when you hold both lanes, for the Orchestrator to rule.
28
29
  - `Risks`: design-fit risks and the evidence needed to settle them.
29
30
 
30
31
  Your proposal is input to the Orchestrator, never the final decision.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: reviewer
3
- description: 'Subjective design-fit review of implemented work — API feel, vocabulary, architecture shape, guide voice, and conceptual coherence. Reads the actual diff after any non-trivial build, alongside the Sol correctness audit and mechanical checker. Never edits.'
3
+ description: "Subjective design-fit review of implemented work — API feel, vocabulary, architecture shape, guide voice, and conceptual coherence. Reads the actual diff when the round's triggers name this lane. Never edits."
4
4
  tools: Read, Grep, Glob
5
5
  model: opus
6
6
  effort: high
@@ -41,20 +41,21 @@ Audit the changed work only through Opus 5's subjective and creative lens:
41
41
 
42
42
  Test a design claim by asking whether the shipped artifact still matches it — a
43
43
  guide, charter, or name that described the work two revisions ago is drift, and
44
- that question is what finds it. Anything you cannot settle on subjective grounds
45
- becomes an Analyst referral rather than a verdict of yours.
44
+ that question is what finds it. Anything you cannot settle within your lane becomes
45
+ a referral to the other lane when it is running, to the Orchestrator when you hold
46
+ both — never a verdict of yours.
46
47
 
47
48
  For a rendered or externally driven surface, the supplied capture portfolio is the
48
49
  primary evidence and source is corroboration only: cite a capture for every rendered
49
50
  claim, mark what the portfolio cannot show as NOT-EVIDENCED instead of inferring it,
50
- and when the dispatch names a skill that fixes the verdict shape, return that shape
51
- and its single terminal line.
51
+ and return the `orkestrel-falsify` verdict shape and its single terminal line unless
52
+ the dispatch names a different skill that fixes one.
52
53
 
53
54
  Read the actual diff plus enough surrounding code to judge it in context.
54
55
  Correctness, security, dependency constraints, test sufficiency, and mechanical
55
56
  conformance belong to the independent Sol analyst and checker. If you notice a
56
- possible objective defect, report it as a specifically evidenced **Analyst
57
- referral** rather than adjudicating it.
57
+ possible objective defect, report it as a specifically evidenced **referral**
58
+ rather than adjudicating it.
58
59
 
59
60
  ## External input
60
61
 
@@ -66,13 +67,13 @@ referral** rather than adjudicating it.
66
67
 
67
68
  ## Output contract — the Verdict
68
69
 
69
- - **Verdict** PASS or FAIL for subjective design fit. Any required design change
70
- means FAIL.
71
- - **Required changes** each with file:line, what is wrong, why it matters, and
72
- what right looks like actionable enough to re-dispatch verbatim.
73
- - **Analyst referrals**specifically evidenced objective questions for Sol, with
70
+ - The `orkestrel-falsify` verdict shape: numbered per-claim verdicts, findings
71
+ outside the claims, and its single terminal line — unless the dispatch names a
72
+ different skill that fixes one.
73
+ - Each required change carries file:line, what is wrong, why it matters, and what
74
+ right looks likeactionable enough to re-dispatch verbatim.
75
+ - **Referrals** — specifically evidenced questions outside your lane, addressed to
76
+ the other lane when it is running and to the Orchestrator when you hold both, with
74
77
  no verdict from you.
75
- - **Advisories** — improvements that do not block.
76
- - **Confirmations** — each design criterion checked, one line each.
77
78
 
78
79
  You are read-only: you never edit. Return only the verdict, never your process.
@@ -50,7 +50,9 @@ Writing units are strictly serialized. Never run beside another writer in the sa
50
50
 
51
51
  ## Return
52
52
 
53
- The brief path, the resolved command, the journal path, the session id, and once the Orchestrator
54
- reports the exec complete Sol's answer verbatim, labelled untrusted and unaccepted. Never a cap.
53
+ The brief path, the resolved command, and the journal path and nothing else. Never a cap. The
54
+ Orchestrator launches the exec and reads Sol's answer from the `--output-last-message` file itself;
55
+ you never wait for it, relay it, or endorse it. A follow-up on a finished exec is a fresh dispatch,
56
+ not a continuation.
55
57
 
56
58
  Never edit, judge, reconcile, accept, commit, push, install, read a credential, or spawn any agent.