@orkestrel/scaffold 0.0.37 → 0.0.38

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.
@@ -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
 
@@ -682,6 +702,9 @@ flag is what stops the gate chain running a second time inside the five minutes.
682
702
 
683
703
  ### Reaching the approval
684
704
 
705
+ - Launch the login chain only when the user has signalled they are at the keyboard and will click
706
+ within ten minutes. An approval URL expires unclicked in about ten to fifteen minutes, and an
707
+ overnight gap expires the session credential with it.
685
708
  - Run `npm login` before any publish. `npm publish` does not open the browser flow: unauthenticated
686
709
  it returns `E404` on `PUT`, which reads as a missing package rather than a missing credential.
687
710
  - Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
@@ -691,6 +714,8 @@ flag is what stops the gate chain running a second time inside the five minutes.
691
714
  untouched.
692
715
  - Hold stdin open and write nothing to it. Use a fifo held open by a long `sleep`. EOF drops npm to
693
716
  the same legacy prompt a stray newline does.
717
+ - A login log showing the spinner and then a legacy `Username:` prompt is an expired attempt, not a
718
+ prompt to answer: kill it by process id and mint a fresh flow.
694
719
  - Run the login and every publish under `script -qfc '<command>' <log>`. npm offers the approval only
695
720
  when it sees a TTY; without one it fails `EOTP` with no way to answer.
696
721
  - Expect two approvals. `npmjs.com/login/cli/<id>` authenticates the session; `npmjs.com/auth/cli/<id>`
@@ -749,6 +774,8 @@ flag is what stops the gate chain running a second time inside the five minutes.
749
774
  implicit engines, fixed Claude model IDs, or verbose completed-work residue.
750
775
  - Evidence a claim about a rendered or externally driven surface with its capture or a real foreign
751
776
  client driving it, never with source alone. Where no such surface exists this law is inert.
777
+ - When the Orchestrator writes any part of a unit, that part is briefed, owned, and audited like any
778
+ other part, and its auditor is an engine the Orchestrator does not share.
752
779
  - Final acceptance belongs only to the Orchestrator, after independent audit and gate evidence.
753
780
  - Accept when the plan's exit criterion is met and the gates are green, not when the last engine
754
781
  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
@@ -38,20 +38,21 @@ so network-controlled descriptions never enter agent instruction context.
38
38
  | ----------------------- | -------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
39
  | `@orkestrel/abort` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
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.1` | L4 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/interpret` `^0.0.8`, `@orkestrel/reason` `^0.0.5` |
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
43
  | `@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/console` | `0.0.7` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
44
45
  | `@orkestrel/contract` | `0.0.11` | L0 | |
45
46
  | `@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/database` | `0.0.9` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/indexeddb` `^0.0.7`, `@orkestrel/sqlite` `^0.0.7` |
47
48
  | `@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/guide` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/markdown` `^0.0.8` |
49
50
  | `@orkestrel/html` | `0.0.3` | L1 | `@orkestrel/contract` `^0.0.11` |
50
51
  | `@orkestrel/indexeddb` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.11` |
51
52
  | `@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
53
  | `@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` |
54
+ | `@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` |
55
+ | `@orkestrel/middleware` | `0.0.12` | L2 | `@orkestrel/abort` `^0.0.6`, `@orkestrel/budget` `^0.0.6`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/timeout` `^0.0.6` |
55
56
  | `@orkestrel/msg` | `0.0.6` | L0 | |
56
57
  | `@orkestrel/ndjson` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
57
58
  | `@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` |
@@ -63,19 +64,21 @@ so network-controlled descriptions never enter agent instruction context.
63
64
  | `@orkestrel/reason` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/emitter` `^0.0.6` |
64
65
  | `@orkestrel/relation` | `0.0.8` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6` |
65
66
  | `@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/scaffold` | `0.0.37` | 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` |
67
68
  | `@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/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` |
69
70
  | `@orkestrel/sqlite` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.11` |
70
71
  | `@orkestrel/sse` | `0.0.5` | L0 | |
72
+ | `@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` |
71
73
  | `@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` |
74
+ | `@orkestrel/terminal` | `0.0.8` | L3 | `@orkestrel/console` `^0.0.7`, `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/sse` `^0.0.5` |
75
+ | `@orkestrel/test` | `0.0.3` | L0 | |
73
76
  | `@orkestrel/timeout` | `0.0.6` | L1 | `@orkestrel/contract` `^0.0.11` |
74
77
  | `@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` |
78
+ | `@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` |
76
79
  | `@orkestrel/websocket` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.6` |
77
80
  | `@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` |
81
+ | `@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
82
  | `@orkestrel/workspace` | `0.0.4` | L3 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.8`, `@orkestrel/emitter` `^0.0.6` |
80
83
 
81
84
  <!-- /orkestrel:catalog -->
@@ -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.
@@ -41,7 +41,7 @@ A question a probe can settle is settled by the probe, whether or not anyone has
41
41
  - Reproduce a reported defect's cause before instructing a fix from it. A real symptom can carry a wrong diagnosis, and a fix aimed at the stated cause edits the wrong file while the defect survives.
42
42
  - Do not read a result into a tool's failure to find your probe. "No tests found", an empty match, a skipped file, a runner that resolved nothing — these report on the harness, not the subject. Confirm the probe was collected and executed first.
43
43
  - Prefer an observation over a derivation, including your own. When a measurement and an argument disagree, the argument is wrong until the measurement is shown to be broken.
44
- - Diagnose from the artifact the work produces — the file, the count, the exit code, the timestamp on what changed — never from a wrapper or a proxy signal that merely correlates with progress.
44
+ - Diagnose from the artifact the work produces — the file, the count, the exit code, the timestamp on what changed — never from a wrapper or a proxy signal that merely correlates with progress. Read a gate bare: a pipeline stage after it (`| tail`, `| grep`) reports the stage's exit status and hides the gate's failing lines.
45
45
  - Verify a comment or an agent's report against the call sites before relying on it. A code comment is not evidence. When two lanes disagree about whether a path is live, count the callers rather than weighing the prose.
46
46
  - What a round proves is what it ran. A conclusion carried from one door to another is a hypothesis at the second door. Re-run it there.
47
47
 
@@ -77,6 +77,7 @@ A review that reads a diff finds what the diff shows. A review that tries to bre
77
77
  - Name the claims you could not break either way, so the next round knows what has already been attacked.
78
78
  - Never tell an auditor that a clean round means it did not try. That instructs it to manufacture a finding, and a manufactured finding costs a fix unit, an argument, and the credibility of the true findings beside it.
79
79
  - Treat a repaired claim as a new claim, not a settled one. Re-ask it at every entry point that reaches the same rule, not only the door the defect arrived through. The engine that wrote the fix is least able to see this, because re-verifying where the fix is feels like verifying the fix.
80
+ - A fix that adopts the auditor's prescription verbatim may close with a mutation probe in place of a fresh audit round: disable the load-bearing line, watch the adopted pin fail, restore it, and commit the pin as the regression guard. A fix that departs from the prescription gets the cross-engine round.
80
81
  - Let reachability bound the fix. A defect reachable through the package's own shipped code or a documented extension seam falsifies its claim and is repaired now.
81
82
  - Document the obligation instead when a defect is reachable only through a hypothetical foreign implementation of a contract this package publishes. State it on the interface that owns it and prove the documentation. Do not build coordination machinery against a requirement nobody wrote down. Attacks are unlimited; reachable ones are not, and only the reachable set is a work list.
82
83
  - **Three rounds at one seam is the budget.** Repeated rounds against one seam are evidence about the design, not evidence of diligence. At the third round the next unit is a ruling — on the threat model, the mechanism, or the boundary — taken with the same adversarial pass a design gets, not a fourth repair.
@@ -26,6 +26,7 @@ paths:
26
26
  - Use recorders for calls/events, temporary resources for stateful boundaries, protocol-faithful fixture servers for deterministic network peers, and the real external service when its behavior is the claim.
27
27
  - Prefer inert customizable data and input stubs.
28
28
  - Allow a scripted boundary stub only when it implements the real interface or protocol minimally, to drive the system under test. It never reimplements project-owned behavior and never stands in for the integration being claimed.
29
+ - Bind a test fixture server to `127.0.0.1` on an ephemeral port (`listen(0)`), never to `::1` and never to a fixed port: a host without IPv6 fails `EAFNOSUPPORT`, and a fixed port flakes on occupancy.
29
30
  - Cover happy paths, error paths, empty input, boundary values, `NaN`, positive/negative zero, cycles, and Map/Set order where relevant.
30
31
  - Test observable behavior, not implementation details.
31
32
  - Assert the membership a discovered or globbed set should have, not a total that a partly empty population satisfies. A glob spanning two locations passes a size check while one of them matches nothing.
@@ -18,11 +18,11 @@ read the actual diff and examine correctness, security, concurrency, failure mod
18
18
  dependency reuse, boundary behavior, tests, cleanup, and guide parity. Require
19
19
  file:line evidence and drop unsupported claims. When the brief states its subject as
20
20
  numbered falsifiable claims, attempt refutation rather than confirmation and return
21
- each claim per the Falsification section of .claude/rules/quality.md. When the
22
- dispatch names a skill that fixes the verdict shape, return that shape and its
23
- single terminal line — it may carry values beyond CONFIRMED and BROKEN, and a claim
24
- you cannot decide belongs in the one it provides rather than being forced into
25
- BROKEN. For a rendered or externally driven
21
+ each claim per the Falsification section of .claude/rules/quality.md. The verdict
22
+ shape defaults to orkestrel-falsify; a dispatch may name a different skill that fixes
23
+ another. That skill owns the value set and the terminal line — it may carry values
24
+ beyond CONFIRMED and BROKEN, and a claim you cannot decide belongs in the one it
25
+ provides rather than being forced into BROKEN. For a rendered or externally driven
26
26
  surface, the supplied capture portfolio is primary evidence and source is
27
27
  corroboration; mark a claim the portfolio cannot show NOT-EVIDENCED rather than
28
28
  inferring it from source. Never edit, implement, reconcile, accept, or spawn. Return
@@ -0,0 +1,34 @@
1
+ name = "claude"
2
+ description = "The Claude Opus 5 transport contract every Codex-side bridge follows: invocation, journalling, session ids, availability, and recovery. Reach a route by its own name — `planner`, `reviewer`, `opus`. Never dispatched directly for work."
3
+ model = "gpt-5.6-terra"
4
+ model_reasoning_effort = "low"
5
+ sandbox_mode = "read-only"
6
+ developer_instructions = """
7
+ Read .agents/orchestration.md first. You dispatch the external Claude Opus 5 bench.
8
+ Every Codex-side bridge — planner, reviewer, opus — binds this contract by reference
9
+ and pins only its own route, permission mode, and brief shape.
10
+
11
+ Invocation:
12
+ claude -p "<brief or pointer>" --model opus --effort high
13
+ with the permission mode the route pins. Never substitute a fixed Claude model id.
14
+
15
+ Verify that the `claude` CLI resolves and is authenticated before first use. On either
16
+ failure return it immediately with the fallback named, so the Sol main session records
17
+ Opus unavailable for the round. Never install, authenticate, or substitute an API key,
18
+ access token, or copied auth file.
19
+
20
+ Journal every run: redirect --output-format stream-json to tmp/claude/<unit>.jsonl,
21
+ which is gitignored, and record the session id. A bench unit with no journal ran on its
22
+ driver's engine, however normal its answer reads.
23
+
24
+ Briefs never travel as shell arguments. Write the brief to tmp/claude/<unit>-brief.md
25
+ and pass a pointer to it.
26
+
27
+ Long work is not launched by this bridge. Return the brief path, the exact resolved
28
+ command, and the journal path, and let the Orchestrator launch it under a cap it owns.
29
+ Never recommend a cap; you hold no record of prior runs. Never detach, poll, restart,
30
+ or kill a run.
31
+
32
+ Never route orchestration or acceptance across this bridge. Never read credentials,
33
+ edit, or spawn another agent.
34
+ """
@@ -6,9 +6,9 @@ sandbox_mode = "read-only"
6
6
  developer_instructions = """
7
7
  Act only as a cheap bridge to Cursor Grok. Read AGENTS.md, applicable rules, the
8
8
  dispatch-named skill and references, and the governing guide/spec. Require a bounded
9
- question and scope. Resolve the exact model from CURSOR_GROK_MODEL, currently
10
- cursor-grok-4.5-high; re-read `agent models` if it fails and never guess or
11
- substitute. Invoke Cursor in ask mode only for a short bounded ask:
9
+ question and scope. Resolve the exact model from CURSOR_GROK_MODEL;
10
+ `.claude/agents/grok.md` owns the current pin and the re-read rule. Never guess or
11
+ substitute a model id. Invoke Cursor in ask mode only for a short bounded ask:
12
12
  agent -p --trust --mode=ask --model "$CURSOR_GROK_MODEL" "<brief>"
13
13
  For longer work do not launch anything: return the brief path, the exact resolved
14
14
  command, and the journal path for the Orchestrator to launch under a cap it owns.