@orkestrel/scaffold 0.0.60 → 0.0.62

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 (61) hide show
  1. package/README.md +13 -10
  2. package/dist/bin/main.js +632 -320
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/CLAUDE.md +5 -1
  5. package/dist/host/agents/orchestration.md +44 -19
  6. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +5 -5
  7. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -2
  8. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +10 -9
  9. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +21 -11
  10. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +20 -2
  11. package/dist/host/agents/skills/orkestrel-harden-package/SKILL.md +1 -1
  12. package/dist/host/agents/skills/orkestrel-harden-package/references/hardening.md +1 -1
  13. package/dist/host/agents/skills/orkestrel-harden-package/references/research.md +1 -1
  14. package/dist/host/agents/templates/brief.md +16 -7
  15. package/dist/host/agents/transports/claude.md +4 -2
  16. package/dist/host/agents/transports/codex.md +4 -1
  17. package/dist/host/claude/agents/analyst.md +3 -1
  18. package/dist/host/claude/agents/application.md +1 -1
  19. package/dist/host/claude/agents/builder.md +3 -3
  20. package/dist/host/claude/agents/checker.md +5 -0
  21. package/dist/host/claude/agents/grok.md +15 -5
  22. package/dist/host/claude/agents/implementer.md +1 -1
  23. package/dist/host/claude/agents/orkestrel.md +2 -2
  24. package/dist/host/claude/agents/planner.md +10 -0
  25. package/dist/host/claude/agents/reviewer.md +14 -8
  26. package/dist/host/claude/agents/sol.md +3 -1
  27. package/dist/host/claude/agents/verifier.md +2 -4
  28. package/dist/host/claude/rules/architecture.md +7 -5
  29. package/dist/host/claude/rules/documentation.md +1 -0
  30. package/dist/host/claude/rules/names.md +23 -5
  31. package/dist/host/claude/rules/patterns.md +1 -0
  32. package/dist/host/claude/rules/quality.md +1 -1
  33. package/dist/host/claude/rules/tests.md +3 -3
  34. package/dist/host/claude/rules/typescript.md +4 -1
  35. package/dist/host/claude/rules/writing.md +2 -2
  36. package/dist/host/codex/agents/builder.toml +6 -6
  37. package/dist/host/codex/agents/checker.toml +2 -1
  38. package/dist/host/codex/agents/grok.toml +12 -5
  39. package/dist/host/codex/agents/implementer.toml +2 -2
  40. package/dist/host/codex/agents/opus.toml +6 -1
  41. package/dist/host/codex/agents/planner.toml +11 -6
  42. package/dist/host/codex/agents/reviewer.toml +8 -6
  43. package/dist/host/guides/scaffold.md +39 -14
  44. package/dist/host/manifest.json +41 -41
  45. package/dist/host/scripts/codex.sh +0 -0
  46. package/dist/host/scripts/cursor.sh +0 -0
  47. package/dist/host/scripts/deps.sh +0 -0
  48. package/dist/host/scripts/ollama.sh +0 -0
  49. package/dist/src/core/index.cjs +429 -287
  50. package/dist/src/core/index.cjs.map +1 -1
  51. package/dist/src/core/index.d.cts +361 -220
  52. package/dist/src/core/index.d.ts +361 -220
  53. package/dist/src/core/index.js +426 -288
  54. package/dist/src/core/index.js.map +1 -1
  55. package/dist/src/server/index.cjs +208 -170
  56. package/dist/src/server/index.cjs.map +1 -1
  57. package/dist/src/server/index.d.cts +276 -152
  58. package/dist/src/server/index.d.ts +276 -152
  59. package/dist/src/server/index.js +200 -172
  60. package/dist/src/server/index.js.map +1 -1
  61. package/package.json +13 -12
@@ -9,7 +9,8 @@ follows it. This file adds only what Claude Code does differently, and cannot we
9
9
  ## Dispatch mechanism
10
10
 
11
11
  - Use the Agent tool for a single dispatch, including when later control flow depends on its result.
12
- - Use a Workflow for a deterministic fan-out, staged pipeline, or loop. Serialize writing nodes.
12
+ - Use a Workflow for a deterministic fan-out, staged pipeline, or loop. Serialize writing nodes, and
13
+ name each node's model alias per § Models.
13
14
  - Recover an interrupted Workflow with `resumeFromRunId`.
14
15
  - Foreground Bash is hard-capped at 10 minutes regardless of its timeout parameter. Launch anything
15
16
  that can exceed it as a harness-tracked background command.
@@ -20,6 +21,9 @@ follows it. This file adds only what Claude Code does differently, and cannot we
20
21
 
21
22
  - Use the aliases `opus` and `sonnet`. Never use a fixed Claude model ID and never use `inherit`.
22
23
  - Never set `CLAUDE_CODE_SUBAGENT_MODEL`. It flattens the engine split.
24
+ - Every Workflow `agent()` node names its model alias explicitly. The Workflow custom-agent path
25
+ does not apply a role file's `model:` pin, so a node that omits the alias runs on the session
26
+ model and the lane reads normal on the wrong engine.
23
27
  - Run the main session on `opus` at high effort, set by `/model opus` or `"model": "opus"`. Opus 5
24
28
  is the Orchestrator in this harness. Its Orchestrator duties are unchanged if it is configured
25
29
  otherwise.
@@ -35,8 +35,7 @@ One workflow runs across all providers. Each engine has one job and never takes
35
35
  - Route each nontrivial implementation unit to Opus or Sol. Objective, constraint-heavy,
36
36
  mechanical-precision work goes to Sol. API-shape, naming, and documentation-voice work goes to
37
37
  Opus. Cursor Composer is not an implementation route, and no `composer` role exists.
38
- - Design runs the adversarial pass. An audit runs the lanes its round names, with at least one whose
39
- engine did not write the work.
38
+ - Design runs the adversarial pass. § Execution loop's audit step fixes which lanes an audit runs.
40
39
 
41
40
  ## Orchestration by harness
42
41
 
@@ -64,12 +63,15 @@ the execution loop's audit step names, on the same clean-context terms.
64
63
 
65
64
  | Lane | Argues |
66
65
  | -------------- | --------------------------------------------------------------------------- |
67
- | **Subjective** | Shape, taste, naming, ergonomics, design fit, what the API should feel like |
66
+ | **Subjective** | Shape, taste, naming, ergonomics, design fit, the feel the API must present |
68
67
  | **Objective** | Correctness, constraints, and what the code and contracts actually permit |
69
68
 
70
69
  **A required lane always runs.** Never collapse required lanes into one. Never let an engine's
71
70
  absence stand in for a required lane.
72
71
 
72
+ Call a lane the round did not dispatch **not run**. `dark` names a bench that cannot round-trip and
73
+ names nothing else, so never write it of a lane. A verdict file's recorded reason uses those words.
74
+
73
75
  ### Clean contexts
74
76
 
75
77
  - Dispatch each lane as a fresh subagent. Never run a lane inside the Orchestrator's own context.
@@ -134,6 +136,9 @@ Fall back in this order and record the substitution:
134
136
  nothing, and returns the required distillate.
135
137
  - Work directly on a typo, a one-line fix, or a single lookup. Orchestrate when isolation,
136
138
  parallelism, independent review, or substantial context justifies it.
139
+ - Dispatch staging, packing, gate-chain invocation, and instrument authorship as units — `builder`
140
+ for a fully specified script, `verifier` for its evidence — each with a brief and an audit like
141
+ any other unit. Only the commit and the push stay with the Orchestrator.
137
142
 
138
143
  ## Roles
139
144
 
@@ -196,8 +201,8 @@ Every role honours this floor. No dispatch may widen it.
196
201
  those roles cannot inspect the tree by writing to it, the Orchestrator supplies the actual diff
197
202
  and status evidence in every review dispatch.
198
203
  - `verifier` has no edit or write tools and never fixes a failure.
199
- - Run writing roles in the main checkout, strictly serialized: one writer at a time, dispatched
200
- from a clean committed baseline, each owning disjoint files.
204
+ - Run one writing role per checkout, on disjoint checkouts, each dispatched from a clean committed
205
+ baseline and each owning disjoint files. In a single checkout that is one writer at a time.
201
206
  - Treat every shared file as report-only.
202
207
  - No role commits, pushes, tags, publishes, installs dependencies, or runs a destructive command.
203
208
  - No role runs `git checkout`, `git restore`, `git stash`, `git reset`, or `git clean`. Each discards
@@ -249,8 +254,8 @@ Every role honours this floor. No dispatch may widen it.
249
254
  Concurrent executors share a filesystem unless isolated. Follow these rules to prevent clobbered
250
255
  edits, formatter and build races, cache phantoms, and validation cross-talk.
251
256
 
252
- 1. Serialize writing executors in the main checkout. Commit a checkpoint before each writing
253
- dispatch so git is the rollback mechanism.
257
+ 1. Serialize writers as § Permission floor states: one per checkout, checkouts disjoint. Commit a
258
+ checkpoint before each writing dispatch so git is the rollback mechanism.
254
259
  2. Assign disjoint owned files plus explicit shared and off-limits files.
255
260
  3. Keep shared files report-only. Executors return exact patches for serial integration.
256
261
  4. Restrict concurrent executors to read-only, scoped validation. A tree-wide result may contain a
@@ -272,8 +277,8 @@ edits, formatter and build races, cache phantoms, and validation cross-talk.
272
277
  and a flake makes that look like it worked. Refuse the failed row, name it, and re-run it alone
273
278
  before deciding what it was.
274
279
  9. Run a fleet pass in slices that report as they finish, never as one block. A block hides its first
275
- failure behind every target that follows, so the failure surfaces after the work it should have
276
- stopped. A slice hands control back while most of the fleet is still unstarted.
280
+ failure behind every target that follows, so the failure surfaces after the work it exists to
281
+ stop. A slice hands control back while most of the fleet is still unstarted.
277
282
  10. Re-run a timing or resource failure alone before believing it. Concurrent slices, builds, and
278
283
  suites make a container miss deadlines it meets when idle, so a red result under load is a
279
284
  question rather than an answer. A unit re-running the file alone is not alone: its own exec,
@@ -326,21 +331,21 @@ longer holds.
326
331
  ends the campaign, each to end implemented, repaired, retained, or intentionally excluded on
327
332
  evidence. A plan that names work but not its end can only be abandoned, never finished.
328
333
  3. **Implement.** Route each nontrivial objective unit to the Sol `implementer` and each nontrivial
329
- subjective unit to the Opus `implementer`, in the main checkout, one writer at a time. Route a
330
- fully specified taste-free unit to `builder`. Never route implementation to an engine the unit's
331
- judgment load exceeds.
334
+ subjective unit to the Opus `implementer`, in the checkout the unit writes, one writer per
335
+ checkout. Route a fully specified taste-free unit to `builder`. Never route implementation to an
336
+ engine the unit's judgment load exceeds.
332
337
  4. **Integrate.** Evaluate each distillate against its acceptance criteria, apply shared-file
333
338
  patches serially, and route cross-cutting findings. Integration applies exact returned patches
334
339
  and mechanical conflict resolution only. A new type, mechanism, behavior, or acceptance
335
340
  criterion discovered at integration is a successor brief routed to a writer, never an
336
341
  integration edit.
337
- 5. **Audit adversarially.** Audit every nontrivial implementation with at least one lane whose
338
- engine did not write it: `reviewer` for the subjective lane and `analyst` for the objective lane,
339
- the way step 2 names its lanes. Run the second lane when the first returns FAIL, when the subject
340
- is a rendered or externally driven surface, or when the unit's claims span both correctness and
341
- shape. Dispatch `checker` in addition when the acceptance criteria are mechanical — counts,
342
- paths, parity rows, scope honesty — never in place of a lane. Record in the round's verdict file
343
- when a lane or the checker did not run.
342
+ 5. **Audit adversarially.** Audit every nontrivial implementation with the objective lane and the
343
+ subjective lane — `analyst` and `reviewer`, the way the design step names its lanes — at least
344
+ one of them on an engine that did not write the work. Dispatch `checker` in addition when the
345
+ acceptance criteria are mechanical — counts, paths, parity rows, scope honesty — never in place
346
+ of a lane. A round that runs fewer lanes than its brief names, or omits the checker its criteria
347
+ call for, records the deviation in its verdict file with that round's own reason, never a
348
+ template sentence.
344
349
  - State the audit's subject as numbered falsifiable claims and require per-claim verdicts with
345
350
  evidence, per the Falsification law in `.claude/rules/quality.md` and the `orkestrel-falsify`
346
351
  value set, unless the dispatch names a different skill that fixes another.
@@ -447,6 +452,8 @@ The harness bridge names the concrete mechanism for each of these.
447
452
  the record transcribes them, because the committed instrument re-produces the film. The **Bench
448
453
  laws** rule "Ephemeral streams, durable records" owns journals and points here for everything
449
454
  durable.
455
+ - Name a retained log with the `<unit>.log.txt` pattern, never with a bare `.log` suffix, which the
456
+ root `.gitignore` file ignores.
450
457
  - Promote anything that must outlive the campaign into a durable artifact before the sweep — a
451
458
  commit message, a guide, a rule, a retrospective. What is only in a swept file did not survive,
452
459
  and a debrief that must quote the record verbatim has nothing to quote.
@@ -461,6 +468,11 @@ The harness bridge names the concrete mechanism for each of these.
461
468
  wave's plan, routing ledger, and verdicts sit together rather than split across the packages they
462
469
  rule on.
463
470
  - Never put them in the package they are about. A published package's tree is its product.
471
+ - Where the orchestrator's repository is itself a subject package, keep `.orkestrel/` as the
472
+ artifact home and stage every landing chain by path, never with `git add -A`. Run that
473
+ checkout's own CLI through the built `node dist/bin/main.js` entry, never through the `npx`
474
+ launcher, and record its audit reading beside the landing instead of gating the landing on it.
475
+ Commit the records before the landing's commit step, never during it.
464
476
  - Claim nothing outside `.orkestrel/` unless Orkestrel scaffold mandates it. Everything Orkestrel
465
477
  owns in a consumer's tree lives beneath that folder, so a convention can be settled there without
466
478
  colliding with a convention that is not Orkestrel's.
@@ -537,6 +549,9 @@ each check. Then run this checklist against what you filled.
537
549
  derived from it, and a template change with the materialized copy the package generates from it.
538
550
  - Read each criterion against the off-limits list, line by line. Grant the file a criterion needs or
539
551
  strike that criterion. A file the change will break that appears in neither list is unscoped.
552
+ - Where a scope line names the `tests/**` or `src/**` glob, name the paths the `scaffold repair`
553
+ command restores as off-limits in the same sentence. Bound a criterion wider than its Sites by
554
+ the brief's scope.
540
555
  - Scope a unit that changes a mechanism to own the prose describing it. Where a brief scopes that
541
556
  prose out, name the carrier and dispatch it before the change ships.
542
557
  - Give a small unrelated obligation its own unit.
@@ -747,6 +762,8 @@ transport.
747
762
 
748
763
  ### Recovering a dark bench
749
764
 
765
+ - A probe that finds no bench binary records the bench dark and, in the same turn, names to the user
766
+ the install command and the bench it unblocks. Re-probe when the user answers.
750
767
  - A probe that finds a bench binary present but authentication unavailable starts recovery in the
751
768
  same turn. Do not record the bench dark and wait.
752
769
  - Background the login command with its output captured under `tmp/<bench>/`, surface the
@@ -775,6 +792,9 @@ five-minute upload window in `references/window.md`. Load the skill when the use
775
792
  release, and follow it there rather than reconstructing the procedure here. What remains in this
776
793
  section binds an executor who is not publishing.
777
794
 
795
+ A wave over unpublished tips derives its order per run from the graph and records only the round
796
+ each package landed in, never the order itself.
797
+
778
798
  ### Fixing a dependency before it publishes
779
799
 
780
800
  A defect a consumer meets sometimes lives in a package the consumer only has from the registry.
@@ -793,6 +813,11 @@ Build the dependency from source, pack it, and **install the tarball** into the
793
813
  - **Rebuild and repack whenever the source moves.** A stale tarball is the same defect as a stale
794
814
  `dist/`, and it is worse for being invisible: the consumer's gates go green against a fix that no
795
815
  longer exists in the dependency's tree.
816
+ - **Run one unit per checkout, at that checkout's catalog layer.** Give a checkout with no rows an
817
+ adopt unit only when its typecheck against the staged closure reddens.
818
+ - **Fetch and merge the dependency's default branch before packing it**, wherever another session
819
+ can move that branch. A pack from a stale tip ships the consumer a dependency the dependency's own
820
+ repository no longer has.
796
821
  - **Restore the registry copy before any gate that must prove the published artifact, and before
797
822
  publishing anything.** A distribution proof run against a local tarball proves the local tarball.
798
823
  The release still follows layer order: the dependency publishes first, then the consumer re-pins to
@@ -625,7 +625,7 @@ Real switchable tab panels (JS-driven — buttons, not scroll anchors):
625
625
  </div>
626
626
  ```
627
627
 
628
- **Responsive offcanvas** — the canonical sidebar-that-becomes-a-drawer: replace `.offcanvas` with `.offcanvas-{sm|md|lg|xl|xxl}`. Content renders **inline above** that breakpoint and as an **offcanvas below** it. Close buttons inside a responsive offcanvas need an explicit `data-bs-target`. Always set `aria-labelledby` (it is conceptually a dialog; `role="dialog"` is added by JS). Width/height via `--bs-offcanvas-width` (400px) / `--bs-offcanvas-height` (30vh). Full app-shell pattern: [bootstrap-reference.md](bootstrap-reference.md) → App shell.
628
+ **Responsive offcanvas** — the canonical sidebar-that-becomes-a-drawer: replace `.offcanvas` with `.offcanvas-{sm|md|lg|xl|xxl}`. Content renders **inline above** that breakpoint and as an **offcanvas below** it. Close buttons inside a responsive offcanvas need an explicit `data-bs-target`. Always set `aria-labelledby` (it is conceptually a dialog; `role="dialog"` is added by JS). Width/height through `--bs-offcanvas-width` (400px) / `--bs-offcanvas-height` (30vh). Full app-shell pattern: [bootstrap-reference.md](bootstrap-reference.md) → App shell.
629
629
 
630
630
  ### Pagination
631
631
 
@@ -802,7 +802,7 @@ Popovers are **opt-in**: they do nothing until initialized in JS (see [JavaScrip
802
802
  </div>
803
803
  ```
804
804
 
805
- Gotcha: the spied element must be a scroll container (height/overflow, or focusable via `tabindex="0"`), and heading IDs must match the nav `href`s exactly. Scrollspy highlights position in one long page — it is not a substitute for real tabs.
805
+ Gotcha: the spied element must be a scroll container (height/overflow, or focusable through `tabindex="0"`), and heading IDs must match the nav `href`s exactly. Scrollspy highlights position in one long page — it is not a substitute for real tabs.
806
806
 
807
807
  ### Spinners
808
808
 
@@ -899,7 +899,7 @@ Modifiers (combine freely):
899
899
  </div>
900
900
  ```
901
901
 
902
- Toasts are **opt-in** — hidden until `.show()` is called (or shown via a trigger). Keep the container in the DOM before showing so the live region announces. Use `role="status"`/`aria-live="polite"` for confirmations; reserve `role="alert"`/`assertive` for urgent messages. Errors requiring action are never toasts — see [bootstrap-reference.md](bootstrap-reference.md) → Feedback discipline.
902
+ Toasts are **opt-in** — hidden until `.show()` is called (or shown through a trigger). Keep the container in the DOM before showing so the live region announces. Use `role="status"`/`aria-live="polite"` for confirmations; reserve `role="alert"`/`assertive` for urgent messages. Errors requiring action are never toasts — see [bootstrap-reference.md](bootstrap-reference.md) → Feedback discipline.
903
903
 
904
904
  ### Tooltip (Requires Popper.js)
905
905
 
@@ -926,7 +926,7 @@ Toasts are **opt-in** — hidden until `.show()` is called (or shown via a trigg
926
926
  </button>
927
927
  ```
928
928
 
929
- Tooltips are **opt-in** (JS init required, below). Only attach to focusable elements so keyboard users can trigger them; never put essential information _only_ in a tooltip, and never report form errors via tooltip. `data-bs-html` with untrusted content is an XSS vector.
929
+ Tooltips are **opt-in** (JS init required, below). Only attach to focusable elements so keyboard users can trigger them; never put essential information _only_ in a tooltip, and never report form errors through a tooltip. `data-bs-html` with untrusted content is an XSS vector.
930
930
 
931
931
  ## JavaScript Initialization
932
932
 
@@ -949,7 +949,7 @@ const myToast = bootstrap.Toast.getOrCreateInstance('#myToast')
949
949
  myToast.show()
950
950
  ```
951
951
 
952
- Constructors accept elements or CSS selector strings. Full lifecycle — `getInstance`, `dispose()` on unmount, event pairs (`show.bs.*` / `shown.bs.*`), async behavior, and why SPAs should prefer framework wrappers: [bootstrap-reference.md](bootstrap-reference.md) → JavaScript lifecycle.
952
+ Constructors accept elements or CSS selector strings. Full lifecycle — `getInstance`, `dispose()` on unmount, event pairs (`show.bs.*` / `shown.bs.*`), async behavior, and why an SPA prefers a framework wrapper: [bootstrap-reference.md](bootstrap-reference.md) → JavaScript lifecycle.
953
953
 
954
954
  ## Icons
955
955
 
@@ -71,8 +71,8 @@ a practice that worked so it repeats.
71
71
  4. **Process retrospective.** Walk the campaign record for both failure and success:
72
72
  dispatches that deviated and why; recoveries that worked (codify the mechanism that
73
73
  saved them); estimates versus observed durations; audit rounds that caught real
74
- defects versus rounds that churned; anything the orchestrator absorbed that should
75
- have been dispatched or dispatched that it should have owned.
74
+ defects versus rounds that churned; anything the orchestrator absorbed that a dispatch
75
+ owned, or dispatched that the orchestrator owned.
76
76
  5. **Instruction-set audit.** Audit the agents, rules, skills, and orchestration
77
77
  contract themselves against the campaign record, using the adversarial method in
78
78
  [instruction-audit.md](references/instruction-audit.md). What confused an executor is
@@ -7,11 +7,12 @@ evidence-first treatment as any surface.
7
7
  ## Blind passes, one brief
8
8
 
9
9
  Run the subjective lane and the objective lane on the SAME brief, in parallel, neither
10
- seeing the other's answer before both return. `reviewer` holds the subjective lane and
11
- `analyst` holds the objective lane.
10
+ seeing the other's answer before both return. `.agents/orchestration.md` § Engine
11
+ assignment decides which engine and which role holds each lane, including under a dark
12
+ bench; read the assignment there and name it in the dispatch.
12
13
 
13
14
  Each lane returns numbered findings, most severe first, and exactly one terminal line:
14
- `INSTRAUDIT <LANE>: <n> findings`. Each charter defaults to the `orkestrel-falsify`
15
+ `INSTRAUDIT <LANE>: <finding ids, or none>`. Each charter defaults to the `orkestrel-falsify`
15
16
  verdict shape and takes a different shape the dispatch names, so name `orkestrel-debrief`
16
17
  in the dispatch and this shape binds.
17
18
 
@@ -25,9 +26,9 @@ record.
25
26
 
26
27
  ## The subjective lens list
27
28
 
28
- Held by `reviewer`. It judges coherence of the role model, charter voice, whether each
29
- role's job is one job, and whether the skill family reads as one system. This section is
30
- the lens list's only normative home, and the lane states its coverage against it.
29
+ Held by the subjective lane. It judges coherence of the role model, charter voice, whether
30
+ each role's job is one job, and whether the skill family reads as one system. This section
31
+ is the lens list's only normative home, and the lane states its coverage against it.
31
32
 
32
33
  - **Role-job singularity.** Is each charter's work cohesive? A charter describing bundled
33
34
  jobs is either a role to split or a bundle no dispatch sends whole.
@@ -48,9 +49,9 @@ the lens list's only normative home, and the lane states its coverage against it
48
49
 
49
50
  ## The objective lens list
50
51
 
51
- Held by `analyst`. It runs evidence-only sweeps of the actual files and the campaign
52
- record. This section is the lens list's only normative home, and the lane states its coverage
53
- against it.
52
+ Held by the objective lane. It runs evidence-only sweeps of the actual files and the
53
+ campaign record. This section is the lens list's only normative home, and the lane states
54
+ its coverage against it.
54
55
 
55
56
  - **Duplication diff.** Whole-line and obligation-level comparison across charters, rules,
56
57
  and skills. A charter that restates a rule drifts from it; a rule restated elsewhere has
@@ -72,13 +72,15 @@ nobody claimed.
72
72
  brief that points at a rule file, section, or guide the executor cannot find delivers nothing while
73
73
  looking like authority — and it fails silently, because an auditor does not report a heading it
74
74
  never saw. Check before dispatch; propagate the missing file rather than restating its contents in
75
- the brief. This is the reason restatement felt necessary, and it is the wrong cure.
75
+ the brief. This is the reason restatement felt necessary, and it is the wrong cure. Where the
76
+ executor's tree carries a superseded vendored copy of an authority, take the stale-authority
77
+ branch in `references/brief.md` § "What not to put in a brief".
76
78
  - Run the **adversarial pass** on one identical brief: a subjective lane and an objective
77
79
  lane, each a fresh subagent with a clean context, blind to each other. Reconcile them yourself.
78
80
  `.agents/orchestration.md` owns lane definitions, engine assignment, and what happens when an
79
81
  engine is dark; do not restate them here.
80
- - A round run with one lane is a deviation. Record it rather than glossing it. If an engine is
81
- unavailable, the remaining engine runs every lane — it never drops one.
82
+ - `.agents/orchestration.md` § Execution loop owns which lanes a round runs and the deviation a
83
+ short round records; § Engine assignment owns the substitution.
82
84
  - **Pair every finder with an independent refuter when the round fans out past the subjective and
83
85
  objective lanes.** The
84
86
  refuter receives one slice's findings, never that finder's work, and is briefed to BREAK them
@@ -135,27 +137,35 @@ comparable; a round that invents its own cannot be read against the last one.
135
137
  | --------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
136
138
  | `CONFIRMED` | attacked and it held | as the Falsification law requires |
137
139
  | `BROKEN` | falsified | as the Falsification law requires — note it says _input, **state, or interleaving**_, so a concurrency claim is falsified by an interleaving, not by an input |
138
- | `UNRESOLVED` | cannot be decided from the evidence available | what would settle it |
140
+ | `UNRESOLVED` | cannot be decided from the evidence available | what would settle it; a claim whose only evidence is the writer's own report takes this value |
139
141
  | `NOT-EVIDENCED` | a claim about a rendered or externally driven surface the supplied capture cannot show | which capture is missing |
140
142
 
141
143
  `CONFIRMED` and `BROKEN` defer; only `UNRESOLVED` and `NOT-EVIDENCED` are this skill's, because
142
144
  the law does not name them. `BROKEN` and `UNRESOLVED` are **separate**: a claim nobody could
143
145
  decide has not been falsified, and it cannot supply the fields falsification requires.
144
- `NOT-EVIDENCED` is the token the `analyst` and `reviewer` charters already require; it is kept,
145
- not re-invented.
146
+ `NOT-EVIDENCED` is the auditing lanes' own token; it is kept, not re-invented.
146
147
 
147
148
  2. **Findings fitting no claim**, if any, each substantiated to the same standard as `BROKEN`.
148
149
 
149
- 3. **One terminal line**, and only one:
150
+ 3. **Attacked and held**: the claims this round attacked and could not break, each with the attack
151
+ that failed, and the adjacent behaviour that looks like the defect and is correct. This is where
152
+ the next round reads what has already been tried, so a claim listed here without its attack is
153
+ worth nothing to it. A claim's own `CONFIRMED` line already carries the evidence that convinced
154
+ the auditor, so list here only the attacks no verdict line carries and the adjacent behaviour.
155
+
156
+ 4. **One terminal line**, and only one:
150
157
 
151
158
  ```text
152
- VERDICT: PASS — <m> of <m> confirmed, no findings outside the claims
153
- VERDICT: FAIL — <n> broken, <u> unresolved, <e> not-evidenced, <x> findings outside the claims
159
+ VERDICT: PASS
160
+ VERDICT: FAIL <claim numbers>; outside the claims: <finding ids>
154
161
  ```
155
162
 
156
- **`PASS` requires every one of these to be true**: every claim `CONFIRMED`, nothing `UNRESOLVED`, nothing
163
+ The claim numbers are every claim that is not `CONFIRMED`. Write `none` in a slot the round
164
+ leaves empty, so a `FAIL` driven only by a finding outside the claims still names both.
165
+
166
+ **`PASS` requires all of this**: every claim `CONFIRMED`, nothing `UNRESOLVED`, nothing
157
167
  `NOT-EVIDENCED`, and no substantiated finding outside the claims. A single substantiated finding
158
- forces `FAIL` no matter how the numbered claims landed — otherwise a round can report a real
168
+ forces `FAIL` however the numbered claims landed — otherwise a round can report a real
159
169
  defect and still emit the word that authorises the release.
160
170
 
161
171
  No process diary. No summary of what was read.
@@ -36,6 +36,21 @@ an executor inventing an answer and building on it silently.
36
36
  **The threshold.** State that a finding is worth more than a clean pass, and why: the alternative is
37
37
  a consumer finding it after publication, when the version is already spent.
38
38
 
39
+ ## The read-only audit lane's brief
40
+
41
+ An audit lane writes nothing and runs nothing, so its brief carries fewer rows than a writing
42
+ unit's. Give a lane every row § Anatomy names — the subject with the evidence
43
+ § "Evidence, by subject type" requires of each row it occupies, what the round decides, already
44
+ established, the numbered falsifiable claims, the unknowns, and the threshold — plus its own
45
+ **Role and lane** row (the role, its engine, and which lane it holds) and **Output** row (the
46
+ verdict shape and its single terminal line). Review evidence folds into the subject.
47
+
48
+ Omit the rows a writer needs and a lane cannot use: owned, shared, and off-limits files; the
49
+ Execution line's writer form, keeping the sentence that the lane performs the assignment directly
50
+ and spawns nothing; and acceptance criteria stated as gate commands. A lane that holds no shell
51
+ cannot close a gate criterion, so a brief handing it one is asking for a ruling on the writer's
52
+ report.
53
+
39
54
  ## The successor rule
40
55
 
41
56
  A re-run **amends**; it never restates. Rewriting a brief from scratch loses the shape of what has
@@ -71,7 +86,7 @@ repair to carry the next defect; a round that finds them is converging, not fail
71
86
  accumulated damage no single diff shows.
72
87
  - **"The self-declared sound-and-unchanged verdicts are sound."** A writer's table saying a site
73
88
  needed no change is a claim like any other, made by the party least able to test it. Require the
74
- auditor to pick the ones it considers most likely wrong and actually attack them, and say how many.
89
+ auditor to pick the ones it considers most likely wrong and actually attack them.
75
90
 
76
91
  ## Instructions that change auditor behaviour
77
92
 
@@ -92,7 +107,10 @@ the brief, by the orchestrator.
92
107
  ## What not to put in a brief
93
108
 
94
109
  - Laws already binding from `AGENTS.md` and the rule files. Reference them; restating invites drift
95
- between the copy and the original.
110
+ between the copy and the original. Where the executor's tree carries a vendored copy of an
111
+ authority the canon has since superseded, quote the landed text with its canonical path and mark
112
+ the quotation as superseding the vendored copy, because a bare reference resolves to the stale
113
+ copy the executor holds.
96
114
  - Any hint of what the other auditor is finding, or has found.
97
115
  - Your own hypothesis about where the defect is, beyond what the claims state. An auditor handed a
98
116
  suspect investigates the suspect and stops.
@@ -47,7 +47,7 @@ Load [hardening.md](references/hardening.md) for the hardening lane and for any
47
47
  6. **Prove each defect before repairing it.** A repair begins with a test that fails for that defect: record the exact command and its failing count before the fix and the same command's passing count after. A repair with no red-then-green record is unproven.
48
48
  7. **Consolidate.** Run the complete centralization and wrapper sweep. Update all call sites to the real symbol rather than leaving aliases or 1:1 delegates.
49
49
  8. **Challenge seams.** Add deterministic tests for invariants, boundaries, failures, lifecycle, cleanup, cancellation, concurrency, hostile input, and resource pressure as applicable, under the test rules' real-implementation law.
50
- 9. **Use live services deliberately.** Put real external services/models in their dedicated project, require readiness, and make each request minimally sufficient, robust, and behaviorally meaningful. When the claim is that a foreign client can use this package, drive one representative real client end to end.
50
+ 9. **Use live services deliberately.** Put real external services/models in their dedicated project, require readiness, and make each request minimally sufficient, stable across the service's nondeterminism, and behaviorally meaningful. When the claim is that a foreign client can use this package, drive one representative real client end to end.
51
51
  10. **Document the final behavior.** Update the governing guide, examples, method tables, limitations, and parity coverage. Document architectural limits honestly.
52
52
  11. **Audit completion.** Inspect test discovery, `.todo`/`.skip`/conditional skip use, source/test helper duplication, exports, environment isolation, unexpected text corruption, and the entire diff.
53
53
  12. **Verify.** Run the repository-prescribed gates in order and inspect the generated outputs relevant to the request.
@@ -50,7 +50,7 @@ Keep live tests in a dedicated project with explicit readiness, setup, timeout,
50
50
  - For model tests, constrain temperature/seed/options when the real API supports it, but do not claim determinism the provider does not promise.
51
51
  - Increase context or workload incrementally only when the scenario requires it.
52
52
  - Test instruction precedence, long-context behavior, summarization, tool calls, scopes, and state transitions through observable outcomes.
53
- - Avoid redundant expensive calls; one request should prove one primary claim.
53
+ - Avoid redundant expensive calls; one request proves one primary claim.
54
54
 
55
55
  Keep live projects outside the fast default suite when repository policy requires it, while making their explicit command authoritative for the campaign.
56
56
 
@@ -35,7 +35,7 @@ Include:
35
35
 
36
36
  - public and internal behavior needed by real consumers;
37
37
  - official upstream capabilities that fit the requested scope;
38
- - architectural limitations that cannot or should not be copied;
38
+ - architectural limitations that cannot or must not be copied;
39
39
  - legacy features worth salvaging;
40
40
  - every `TODO`, deferred branch, placeholder, or documented omission in scope.
41
41
 
@@ -10,6 +10,10 @@ copy `# Unit UNIT_ID — SHORT_SUBJECT`. Delete each italic reminder as you fill
10
10
  under, and leave no row blank: fill a row you cannot close with a named unknown label, and
11
11
  describe that label under § Unknowns with how the unit reports back on it.
12
12
 
13
+ For a read-only audit lane, fill the rows
14
+ `.agents/skills/orkestrel-falsify/references/brief.md` § "The read-only audit lane's brief" names
15
+ and delete the rest of this template.
16
+
13
17
  ## Role and engine
14
18
 
15
19
  ROLE_NAME on ENGINE_NAME, reached as TRANSPORT.
@@ -73,7 +77,7 @@ answer around._
73
77
  _Grant a behaviour with the tests that pin it, a constant with every fixture and expectation derived
74
78
  from it, a template with the materialized copy the package generates from it, and a mechanism with
75
79
  the prose describing it: the comment beside the code it edits and the guide passage stating the
76
- behaviour it moves._
80
+ behaviour it moves. A unit that moves a published symbol owns the package `README.md`._
77
81
 
78
82
  **Shared (report-only).** SHARED_FILES
79
83
 
@@ -84,21 +88,25 @@ edits nothing in this row._
84
88
 
85
89
  _Name each file the unit must not touch, and read every acceptance criterion against this row line by
86
90
  line. Grant the file a criterion needs, or strike that criterion. A file the change breaks that
87
- appears in no row of this section is unscoped._
91
+ appears in no row of this section is unscoped. Never list `tmp/probe/` off-limits: it is the unit's
92
+ probe home, and `.claude/rules/tests.md` puts every runtime probe there._
88
93
 
89
94
  **What asserts the state this change ends.** FILES_THE_RESULT_MAKES_FALSE
90
95
 
91
96
  _List every file the result makes false rather than every file that declares the thing changing: the
92
97
  test asserting the reversed behaviour, the fixture carrying the raised value, the golden digest over
93
98
  generated output, the consumer script naming the removed union member. Derive the list by running the
94
- suite; where you cannot run it, name the search's bound so the unit re-derives the list. End each
95
- entry in Owned, in Shared, or with a named carrier dispatched before this change ships._
99
+ suite; where you cannot run it, name the search's bound so the unit re-derives the list. A rename's
100
+ search bound is a word-boundary sweep over the old name followed by a case-insensitive sweep over
101
+ its `-s`, `-ed`, and `-ing` inflections. End each entry in Owned, in Shared, or with a named carrier
102
+ dispatched before this change ships._
96
103
 
97
104
  **Tools and limits.** ALLOWED_TOOLS, PERMISSION_LIMITS
98
105
 
99
106
  _Check the § Output mechanism and every acceptance criterion's verification method against this
100
107
  allowlist. A read-only lane writes no report file and runs no probe, so hand it the rendered evidence
101
- instead._
108
+ instead. A rename moves the file with the shell's `mv`, never `git mv`; `git add -N` is permitted
109
+ only to render diff evidence._
102
110
 
103
111
  ## Execution
104
112
 
@@ -138,8 +146,9 @@ criterion behind it. Where the change edits a file the repository vendors or dig
138
146
  regeneration step ahead of every gate that reads the generated artifact. Ask what the change does
139
147
  to every fact you measured, and fix each criterion to the state the unit finishes in. Close each
140
148
  criterion with owned files alone, and name the property the unit must change; record a consequence
141
- you expect to follow as an observation, never as a criterion. A scoped run over the unit's own
142
- owned files stays a legitimate criterion._
149
+ you expect to follow as an observation, never as a criterion. A criterion that closes on an
150
+ instrument's reading names that instrument's negative control and the class the control proves the
151
+ instrument can see. A scoped run over the unit's own owned files stays a legitimate criterion._
143
152
 
144
153
  **Observations, not criteria.** TIMING_SENSITIVE_OR_WHOLE_SUITE_GATES
145
154
 
@@ -21,8 +21,10 @@ with the permission mode the route pins. Never substitute a fixed Claude model i
21
21
 
22
22
  Verify that the `claude` CLI resolves and is authenticated before first use. On either
23
23
  failure return it immediately with the fallback named, so the Sol main session records
24
- Opus unavailable for the round. Never install, authenticate, or substitute an API key,
25
- access token, or copied auth file.
24
+ Opus unavailable for the round. Where the binary is absent, that report names the install
25
+ command for the `claude` CLI, so the Orchestrator can put it to the user in the same turn
26
+ it records the bench dark and re-probe when the user answers. Never install, authenticate,
27
+ or substitute an API key, access token, or copied auth file.
26
28
 
27
29
  Journal every run: redirect --output-format stream-json to tmp/claude/<unit>.jsonl,
28
30
  which is gitignored, and record the session id. A bench unit with no journal ran on its
@@ -119,7 +119,7 @@ skill owns the value set and the terminal line. Point the brief at both; restate
119
119
 
120
120
  ## Implementer route
121
121
 
122
- Sandbox `workspace-write`, main checkout, sole serial writer from a clean committed
122
+ Sandbox `workspace-write`, the checkout the route writes in, its sole serial writer from a clean committed
123
123
  baseline, with owned files, off-limits files, and a deviation contract. The brief forbids
124
124
  dependency installation, commits, pushes, publishing, credentials, destructive commands,
125
125
  shared-file edits, and tree-wide mutating gates.
@@ -147,6 +147,9 @@ negative tests is unaffected.
147
147
 
148
148
  - Verify `codex --version` before first use. On Windows `codex` resolves in Bash through
149
149
  the extensionless npm shim; if it does not, invoke `codex.cmd`.
150
+ - Binary absent: report it so the Orchestrator can record the bench dark and, in the same turn,
151
+ name to the user the install command for `@openai/codex` and the bench it unblocks. The
152
+ Orchestrator re-probes when the user answers. Never install it yourself.
150
153
  - Binary present but authentication unavailable: report it so the Orchestrator can start
151
154
  device-auth recovery in the same turn. It backgrounds `codex login --device-auth` with
152
155
  output captured to `tmp/codex/login.log`, surfaces the verification URL and one-time code
@@ -34,7 +34,9 @@ Everything `.agents/orchestration.md`'s dispatch contract requires, plus:
34
34
  - **Every authority the brief references must exist in the tree the exec is rooted in.** Check
35
35
  before dispatch. A brief citing a rule file or section the executor cannot find delivers nothing
36
36
  while looking like authority, and it fails silently — an auditor does not report a heading it
37
- never saw. Propagate the missing file; do not restate its contents in the brief.
37
+ never saw. Propagate the missing file rather than restating its contents in the brief, and take
38
+ the stale-authority branch in `.agents/skills/orkestrel-falsify/references/brief.md` § "What not
39
+ to put in a brief" where the executor's tree carries a superseded vendored copy.
38
40
  - For an audit: the subject as numbered falsifiable claims, and the skill that fixes the verdict
39
41
  shape. The Falsification section of `.claude/rules/quality.md` owns the method and the evidence
40
42
  each verdict carries. The verdict shape defaults to `orkestrel-falsify`; a dispatch may name a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: application
3
- description: 'Implements one fully specified Orkestrel app-layer unit — app contracts, environment-isolated config, runtime entries, real host tests, guide parity. Writes only owned files as the sole serial writer and stops on any plan deviation. Nontrivial app design belongs to GPT-5.6 Sol or Opus 5.'
3
+ description: 'Implements one fully specified Orkestrel app-layer unit — app contracts, environment-isolated config, runtime entries, real host tests, guide parity. Writes only owned files in the checkout the unit writes as the sole serial writer and stops on any plan deviation. Nontrivial app design belongs to GPT-5.6 Sol or Opus 5.'
4
4
  tools: Read, Grep, Glob, Edit, Write, Bash
5
5
  model: sonnet
6
6
  effort: low
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: builder
3
- description: 'Implements one small, fully specified, taste-free unit exactly as dispatched. Writes only owned files in the main checkout as the sole serial writer, validates narrowly, and stops on any plan deviation. Nontrivial implementation belongs to GPT-5.6 Sol or Opus 5.'
3
+ description: 'Implements one small, fully specified, taste-free unit exactly as dispatched. Writes only owned files in the checkout the unit writes as the sole serial writer, validates narrowly, and stops on any plan deviation. Nontrivial implementation belongs to GPT-5.6 Sol or Opus 5.'
4
4
  tools: Read, Grep, Glob, Edit, Write, Bash
5
5
  model: sonnet
6
6
  effort: low
@@ -19,8 +19,8 @@ dispatch contract.
19
19
 
20
20
  - Before writing, read **AGENTS.md**, every applicable `.claude/rules/*.md`, the
21
21
  dispatch-named skill and required references, and the governing guide/spec. All bind you
22
- as written there, and this charter restates none of them. An app-layer unit additionally
23
- binds `.claude/rules/application.md` and `.claude/rules/workspace.md`.
22
+ as written there, and this charter restates none of them.
23
+ - An app-layer unit belongs to `application`: stop and say so.
24
24
  - Write ONLY the owned files named in your dispatch. Shared or off-limits files are
25
25
  report-only: if one needs a change, RETURN the exact patch — never edit it.
26
26
  - NO tree-wide or mutating commands: never `format`, lint `--fix`, or `build`.
@@ -37,6 +37,11 @@ No judgment calls: a question that needs one becomes a **referral** — specific
37
37
  evidenced, addressed to the subjective lane when it is running and to the
38
38
  Orchestrator when it is not — never a guess and never a verdict of yours.
39
39
 
40
+ Rule a claim whose only evidence is the writer's report `UNRESOLVED`, never
41
+ `CONFIRMED`, whatever the brief says. A quoted command and exit code inside a
42
+ report is the writer quoting itself, so it evidences nothing until a lane that ran
43
+ the command supplies the reading.
44
+
40
45
  ## Output contract
41
46
 
42
47
  Return the shape fixed by the dispatch.