@azure-id/orc 1.8.2 → 1.9.0

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 (42) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/README-id.md +69 -51
  3. package/README.md +62 -45
  4. package/bin/cli.js +76 -16
  5. package/bin/verify-contracts.js +163 -62
  6. package/bin/verify-package.js +15 -1
  7. package/mock-run/orc-quick.md +141 -113
  8. package/package.json +1 -1
  9. package/templates/agents/MODEL-MAPPING.md +15 -5
  10. package/templates/agents/orc-executor-haiku-4-5.md +17 -0
  11. package/templates/agents/orc-executor-opus-4-7-high.md +17 -0
  12. package/templates/agents/orc-executor-opus-4-7-med.md +17 -0
  13. package/templates/agents/orc-executor-opus-4-8-high.md +17 -0
  14. package/templates/agents/orc-executor-opus-5-high.md +17 -0
  15. package/templates/agents/orc-executor-opus-5-low.md +17 -0
  16. package/templates/agents/orc-executor-opus-5-med.md +17 -0
  17. package/templates/agents/orc-executor-sonnet-4-6-high.md +17 -0
  18. package/templates/agents/orc-executor-sonnet-4-6-med.md +17 -0
  19. package/templates/agents/orc-executor-sonnet-5-high.md +17 -0
  20. package/templates/agents/orc-planner-mini-opus-5-med.md +75 -69
  21. package/templates/agents/orc-planner-mini-sonnet-5-high.md +73 -67
  22. package/templates/agents/orc-recon-opus-5-low.md +99 -0
  23. package/templates/agents/orc-recon-sonnet-4-6-med.md +99 -0
  24. package/templates/commands/orc-mini.md +10 -12
  25. package/templates/commands/orc-quick.md +20 -33
  26. package/templates/hooks/orc-trace.js +476 -471
  27. package/templates/skills/_shared/phases/rules.md +172 -159
  28. package/templates/skills/_shared/phases/trace.md +2 -1
  29. package/templates/skills/_shared/phases/wiki-consult.md +9 -5
  30. package/templates/skills/_shared/return-validation.md +22 -0
  31. package/templates/skills/context-combiner/SKILL.md +13 -13
  32. package/templates/skills/orc/subskills/orc-execution/core.md +171 -159
  33. package/templates/skills/orc-mini/SKILL.md +148 -136
  34. package/templates/skills/orc-mini/examples/mini-run-mock.md +64 -50
  35. package/templates/skills/orc-mini/references/complexity.md +105 -0
  36. package/templates/skills/orc-quick/README.md +495 -423
  37. package/templates/skills/orc-quick/SKILL.md +157 -211
  38. package/templates/skills/orc-quick/references/context-doc.md +145 -114
  39. package/templates/skills/orc-quick/references/defect.md +101 -0
  40. package/templates/skills/orc-quick/references/dispatch-gate.md +55 -24
  41. package/templates/skills/orc-quick/references/gh-mode.md +148 -127
  42. package/templates/skills/orc-quick/references/look.md +107 -0
@@ -1,159 +1,172 @@
1
- # Phase — Rules (id: `rules`)
2
-
3
- > **Library file.** New at v1.7.0 W5. Layers declared: `core` only — single-layer
4
- > for the same reason `house-rules.md` is: it is a standing card injected
5
- > VERBATIM into a slice, and a layered card would be a different card. What
6
- > varies between lanes is DATA (which packs, whether a task is front-end), not
7
- > prose. `orc lane phases <lane> --json` names the file and the layers to read.
8
- >
9
- > **What is NOT here:** the rules. They are `../rules/` — four packs, read-only,
10
- > shipped. This file is the SHAPE: who assembles the card, where it sits in a
11
- > slice, what comes back, and what the phase must never do.
12
- >
13
- > **`/orc-doc` does not run this phase.** That lane has its own ledger
14
- > (`orc doc rules`) and its own frozen-per-document mechanic. Excluded means
15
- > excluded, and `orc rules slice --lane orc-doc` refuses by name.
16
-
17
- <!-- orc:layer core -->
18
-
19
- ## One assembler, and it is not you
20
-
21
- ```
22
- orc rules slice --lane <lane> [--pack ui] [--json]
23
- ```
24
-
25
- That command is the **only** thing that builds this card. A lane never
26
- concatenates the packs itself, never re-orders them, never summarises a rule and
27
- never drops one it judges irrelevant.
28
-
29
- Two reasons, and both have cost this repo money elsewhere:
30
-
31
- 1. **Drift.** A card assembled in twenty-eight spines is twenty-eight ideas of
32
- the precedence order. The same argument as `orc lane phases`: *a second idea
33
- of the pipeline is the drift this exists to make impossible.*
34
- 2. **Cost.** This card rides on **every spawn**. One assembler is the only place
35
- its token weight can be measured, and therefore the only place it can be cut.
36
-
37
- Print the command's `line` VERBATIM at preflight. Never compute it:
38
-
39
- ```
40
- rules: ORC 65 (W 23 · C 22 · D 10 · U 10) · yours 9 lines (P0 4 · P1 2 · P2 3) · 1 override
41
- rules: ORC 65 (W 23 · C 22 · D 10 · U 10) · yours none
42
- ```
43
-
44
- **Both spellings are mandatory in their state.** `yours none` is an ANSWER — it
45
- says the project has not written its own rules, which is a different fact from
46
- the CLI failing to look.
47
-
48
- ## Where it sits in a slice — the order IS the contract
49
-
50
- ```
51
- 1 HOUSE RULES ./house-rules.md, injected verbatim
52
- 2 YOUR PROJECT'S RULES from the slice, P0 then P1 then P2, verbatim
53
- 3 ORC RULES from the slice, the packs this lane carries
54
- 4 the task the lane's own dispatch contract
55
- ```
56
-
57
- Nothing goes above 1. Nothing goes between 2 and 3. The assembler emits 2 and 3
58
- as one block in that order, so the lane's job is to place that block directly
59
- under the house card and before the task.
60
-
61
- **The slice field is `rules_card`, and it is the `text` field — not the `line`.**
62
- Run the command at DISPATCH, not only at preflight. The `line` tells the user
63
- which rules are in force; the `text` is what the agent reads. A lane that prints
64
- the line and injects only the house card has reported rules that no agent got.
65
-
66
- ## Precedence, and the one sentence that gets it wrong
67
-
68
- ```
69
- house rules > your rules > ORC rules
70
- ```
71
-
72
- **The house card is CODE and BEHAVIOUR only.** It governs how a change is made:
73
- surgical, simple, honest, in-slice. It says nothing about the words an agent
74
- writes, so it never overrules a writing rule — *it does not speak about prose at
75
- all.* A lane that presents the house card as beating `OSW-*` has misread it.
76
-
77
- **A project rule beats an ORC rule outright.** Not a waiver and not a
78
- negotiation: the ORC rule is removed from the slice, and the removal is stated
79
- inside it. The assembler does that. The lane does not decide it.
80
-
81
- Where a lane's preflight prints a report rather than a bare line, the report
82
- **names** each override. An override the user cannot see is an override they
83
- cannot audit.
84
-
85
- ## The `ui` pack rides per TASK, never per lane
86
-
87
- `ui` is in no lane's default set. Add it to a single slice, at dispatch time:
88
-
89
- > If a task's **declared files** are front-end — `.css`, `.scss`, `.html`,
90
- > `.jsx`, `.tsx`, `.vue`, `.svelte`, or a directory the wiki or the cached
91
- > pattern identifies as the UI layer — assemble that task's card with
92
- > `--pack ui`. Otherwise do not.
93
-
94
- A UI rule in a backend slice is tokens paid on every spawn for a rule that
95
- cannot apply. A lane that dispatches no tasks never passes `--pack ui` at all.
96
-
97
- ## What comes back
98
-
99
- Every return from a slice that carried this card gains three fields
100
- (`../return-validation.md`):
101
-
102
- | Field | What it holds |
103
- |---|---|
104
- | `rules_applied[]` | the ids the agent acted on |
105
- | `rules_conflicts[]` | two rules that disagree. **A gap, never a silent choice** |
106
- | `rules_overridden[]` | an ORC id a project rule replaced |
107
-
108
- A `rules_conflicts[]` entry is relayed to the user as a gap through the lane's
109
- own gap channel. Resolving it quietly is the failure the field exists to prevent.
110
-
111
- ## The boundary — declared, never validated
112
-
113
- Rules govern **what is written and how it reads**, and **what shape of code is
114
- acceptable**. They can never change how a lane **runs**: the scoring, the wave
115
- order, the gates, the dispatch contract, the ship rules, or any lane's
116
- structural and safety rules.
117
-
118
- A rule that asks for one of those comes back as `unsupported_request` and is
119
- relayed as a gap. **Never a guessed compromise.**
120
-
121
- **Do not build a detector for this.** The CLI declares the boundary and does not
122
- pretend to enforce it, for the reason `orc doc rules` already settled: a
123
- validator that sometimes works is worse than none, because a clean pass then
124
- means nothing. The agent is the only reader that can tell a content rule from a
125
- structural one, so the agent is where the answer comes from.
126
-
127
- ## The free lint
128
-
129
- ```
130
- orc rules lint <path…|--staged|--diff> [--pack w,c,d,u] [--json]
131
- ```
132
-
133
- Deterministic, zero tokens. Exit `0` clean · `1` findings · `2` nothing to lint.
134
-
135
- It checks only the rules a string match can prove, and it prints — in every
136
- mode — how many it did not check. **Relay that coverage line whenever you relay
137
- a lint result.** A clean exit allowed to stand in for a review nobody did is the
138
- whole failure that line prevents.
139
-
140
- Findings are ADVISORY. This phase adds no gate: a style preference that fails a
141
- build gets switched off within a week, and then nothing is enforced at all.
142
-
143
- An exemption is never silent either. The lint skips the rules packs themselves
144
- (a rule that bans a word has to print that word to define it) and any file
145
- marked `orc-rules-ignore-file`, and it reports the count of both.
146
-
147
- ## Cost, and where to cut it
148
-
149
- Measured at v1.7.0: roughly **3 600 tokens** per build-lane slice, **4 300** with
150
- the UI pack, **2 200** for a prose-only lane. The card already carries HARD rules
151
- in full and PURPOSE/LOCK rules as one line plus the file to open when one
152
- applies.
153
-
154
- If it must come down, the lever is the worked examples inside the HARD bodies,
155
- and the only place to pull it is `rulesSlice()` in `bin/cli.js`. **Never by a
156
- lane deciding to trim its own card** — that is the drift this phase exists to
157
- prevent, arriving disguised as a saving.
158
-
159
- <!-- /orc:layer -->
1
+ # Phase — Rules (id: `rules`)
2
+
3
+ > **Library file.** New at v1.7.0 W5. Layers declared: `core` only — single-layer
4
+ > for the same reason `house-rules.md` is: it is a standing card injected
5
+ > VERBATIM into a slice, and a layered card would be a different card. What
6
+ > varies between lanes is DATA (which packs, whether a task is front-end), not
7
+ > prose. `orc lane phases <lane> --json` names the file and the layers to read.
8
+ >
9
+ > **What is NOT here:** the rules. They are `../rules/` — four packs, read-only,
10
+ > shipped. This file is the SHAPE: who assembles the card, where it sits in a
11
+ > slice, what comes back, and what the phase must never do.
12
+ >
13
+ > **`/orc-doc` does not run this phase.** That lane has its own ledger
14
+ > (`orc doc rules`) and its own frozen-per-document mechanic. Excluded means
15
+ > excluded, and `orc rules slice --lane orc-doc` refuses by name.
16
+
17
+ <!-- orc:layer core -->
18
+
19
+ ## One assembler, and it is not you
20
+
21
+ ```
22
+ orc rules slice --lane <lane> [--pack ui] [--json]
23
+ ```
24
+
25
+ That command is the **only** thing that builds this card. A lane never
26
+ concatenates the packs itself, never re-orders them, never summarises a rule and
27
+ never drops one it judges irrelevant.
28
+
29
+ Two reasons, and both have cost this repo money elsewhere:
30
+
31
+ 1. **Drift.** A card assembled in twenty-eight spines is twenty-eight ideas of
32
+ the precedence order. The same argument as `orc lane phases`: *a second idea
33
+ of the pipeline is the drift this exists to make impossible.*
34
+ 2. **Cost.** This card rides on **every spawn**. One assembler is the only place
35
+ its token weight can be measured, and therefore the only place it can be cut.
36
+
37
+ Print the command's `line` VERBATIM at preflight. Never compute it:
38
+
39
+ ```
40
+ rules: ORC 65 (W 23 · C 22 · D 10 · U 10) · yours 9 lines (P0 4 · P1 2 · P2 3) · 1 override
41
+ rules: ORC 65 (W 23 · C 22 · D 10 · U 10) · yours none
42
+ ```
43
+
44
+ **Both spellings are mandatory in their state.** `yours none` is an ANSWER — it
45
+ says the project has not written its own rules, which is a different fact from
46
+ the CLI failing to look.
47
+
48
+ ## Where it sits in a slice — the order IS the contract
49
+
50
+ ```
51
+ 1 HOUSE RULES ./house-rules.md, injected verbatim
52
+ 2 YOUR PROJECT'S RULES from the slice, P0 then P1 then P2, verbatim
53
+ 3 ORC RULES from the slice, the packs this lane carries
54
+ 4 the task the lane's own dispatch contract
55
+ ```
56
+
57
+ Nothing goes above 1. Nothing goes between 2 and 3. The assembler emits 2 and 3
58
+ as one block in that order, so the lane's job is to place that block directly
59
+ under the house card and before the task.
60
+
61
+ **The slice field is `rules_card`, and it is the `text` field — not the `line`.**
62
+ Run the command at DISPATCH, not only at preflight. The `line` tells the user
63
+ which rules are in force; the `text` is what the agent reads. A lane that prints
64
+ the line and injects only the house card has reported rules that no agent got.
65
+
66
+ ## Precedence, and the one sentence that gets it wrong
67
+
68
+ ```
69
+ house rules > your rules > ORC rules
70
+ ```
71
+
72
+ **The house card is CODE and BEHAVIOUR only.** It governs how a change is made:
73
+ surgical, simple, honest, in-slice. It says nothing about the words an agent
74
+ writes, so it never overrules a writing rule — *it does not speak about prose at
75
+ all.* A lane that presents the house card as beating `OSW-*` has misread it.
76
+
77
+ **A project rule beats an ORC rule outright.** Not a waiver and not a
78
+ negotiation: the ORC rule is removed from the slice, and the removal is stated
79
+ inside it. The assembler does that. The lane does not decide it.
80
+
81
+ Where a lane's preflight prints a report rather than a bare line, the report
82
+ **names** each override. An override the user cannot see is an override they
83
+ cannot audit.
84
+
85
+ ## The `ui` pack rides per TASK, never per lane
86
+
87
+ `ui` is in no lane's default set. Add it to a single slice, at dispatch time:
88
+
89
+ > If a task's **declared files** are front-end — `.css`, `.scss`, `.html`,
90
+ > `.jsx`, `.tsx`, `.vue`, `.svelte`, or a directory the wiki or the cached
91
+ > pattern identifies as the UI layer — assemble that task's card with
92
+ > `--pack ui`. Otherwise do not.
93
+
94
+ A UI rule in a backend slice is tokens paid on every spawn for a rule that
95
+ cannot apply. A lane that dispatches no tasks never passes `--pack ui` at all.
96
+
97
+ ## What comes back
98
+
99
+ Every return from a slice that carried this card gains three fields
100
+ (`../return-validation.md`):
101
+
102
+ | Field | What it holds |
103
+ |---|---|
104
+ | `rules_applied[]` | the ids the agent acted on |
105
+ | `rules_conflicts[]` | two rules that disagree. **A gap, never a silent choice** |
106
+ | `rules_overridden[]` | an ORC id a project rule replaced |
107
+
108
+ A `rules_conflicts[]` entry is relayed to the user as a gap through the lane's
109
+ own gap channel. Resolving it quietly is the failure the field exists to prevent.
110
+
111
+ ## The boundary — declared, never validated
112
+
113
+ Rules govern **what is written and how it reads**, and **what shape of code is
114
+ acceptable**. They can never change how a lane **runs**: the scoring, the wave
115
+ order, the gates, the dispatch contract, the ship rules, or any lane's
116
+ structural and safety rules.
117
+
118
+ A rule that asks for one of those comes back as `unsupported_request` and is
119
+ relayed as a gap. **Never a guessed compromise.**
120
+
121
+ **Do not build a detector for this.** The CLI declares the boundary and does not
122
+ pretend to enforce it, for the reason `orc doc rules` already settled: a
123
+ validator that sometimes works is worse than none, because a clean pass then
124
+ means nothing. The agent is the only reader that can tell a content rule from a
125
+ structural one, so the agent is where the answer comes from.
126
+
127
+ ## The free lint
128
+
129
+ ```
130
+ orc rules lint <path…|--staged|--diff> [--pack w,c,d,u] [--json]
131
+ ```
132
+
133
+ Deterministic, zero tokens. Exit `0` clean · `1` findings · `2` nothing to lint.
134
+
135
+ It checks only the rules a string match can prove, and it prints — in every
136
+ mode — how many it did not check. **Relay that coverage line whenever you relay
137
+ a lint result.** A clean exit allowed to stand in for a review nobody did is the
138
+ whole failure that line prevents.
139
+
140
+ Findings are ADVISORY. This phase adds no gate: a style preference that fails a
141
+ build gets switched off within a week, and then nothing is enforced at all.
142
+
143
+ An exemption is never silent either. The lint skips the rules packs themselves
144
+ (a rule that bans a word has to print that word to define it) and any file
145
+ marked `orc-rules-ignore-file`, and it reports the count of both.
146
+
147
+ ## Cost, and where to cut it
148
+
149
+ Measured at v1.7.0: roughly **3 600 tokens** per build-lane slice, **4 300** with
150
+ the UI pack, **2 200** for a prose-only lane. The card already carries HARD rules
151
+ in full and PURPOSE/LOCK rules as one line plus the file to open when one
152
+ applies.
153
+
154
+ If it must come down, the lever is the worked examples inside the HARD bodies,
155
+ and the only place to pull it is `rulesSlice()` in `bin/cli.js`. **Never by a
156
+ lane deciding to trim its own card** — that is the drift this phase exists to
157
+ prevent, arriving disguised as a saving.
158
+
159
+ **v1.9.0 — the COMPACT form, and the CLI decides which lanes get it.** The
160
+ lever above is now pulled for **`orc-quick`** and for no one else: every HARD
161
+ rule keeps its id, its title and its first line — the instruction — and the
162
+ worked examples come out, with the pack file named beside them. Measured
163
+ **13 874 → 5 838 chars** (~3 470 → ~1 460 tokens) with every HARD id still
164
+ present. The lane that gets it is the lane with the smallest tasks under the
165
+ largest fixed card, and the card is re-sent on every executor turn.
166
+
167
+ The answer says which form it is: `compact: true` in the JSON. A reader that
168
+ cannot tell a short card from a stripped one cannot trust either. `line` is
169
+ IDENTICAL in both forms — it counts the rules in force, and compacting changes
170
+ how a rule is written, never whether it applies.
171
+
172
+ <!-- /orc:layer -->
@@ -227,7 +227,7 @@ supplies the fact in a packet, the writer writes the line. `SPAWN`, `RETURN` and
227
227
  | Verb | Emitted by | Meaning |
228
228
  |------|-----------|---------|
229
229
  | `PHASE <name> start\|end` | orc → writer | phase transition |
230
- | `PHASE-EDGE <role-family> :: first=<agent>` | hook | **deterministic phase inference.** ORC agent names encode their role, so when a SPAWN's role family differs from the previous SPAWN's, the hook segments the run itself — families: `analyst\|scout → analysis`, `planner → planning`, `executor → execution`, `reviewer → review`, `verifier → verify`, `test-author → testgen`, `advisor\|judge → ultra-gate` (the trace writer never opens an edge). Zero model dependence: even a run where every writer dispatch was forgotten still reads planning → execution → review → verify, and `/orc-retro` computes NARRATION COVERAGE from edges with vs without a writer `SPAWN` between them |
230
+ | `PHASE-EDGE <role-family> :: first=<agent>` | hook | **deterministic phase inference.** ORC agent names encode their role, so when a SPAWN's role family differs from the previous SPAWN's, the hook segments the run itself — families: `recon → recon` (v1.9.0 — /orc-quick's read-only half; a question answered for a person is not an analysis), `analyst\|scout → analysis`, `planner → planning`, `executor → execution`, `reviewer → review`, `verifier → verify`, `test-author → testgen`, `advisor\|judge → ultra-gate` (the trace writer never opens an edge). Zero model dependence: even a run where every writer dispatch was forgotten still reads planning → execution → review → verify, and `/orc-retro` computes NARRATION COVERAGE from edges with vs without a writer `SPAWN` between them |
231
231
  | `CONFIG <key=value …>` | orc → writer | Phase 1 — the resolved config values this run will consume (ALWAYS `opus5_only` — it selects the executor table AND every fixed role, so retro can segment outcomes by dispatch mode). Runtime proof that the run honored the config; `/orc-retro` audits it against behavior |
232
232
  | `WIKI-CONSULT <tier> :: docs=<list>` | orc → writer | project wiki consulted for grounding (full/mini at planning; fast at slice-build) — tier ∈ `fresh` \| `aging` \| `stale` \| `absent` \| `empty`; `docs=` the pages pulled/handed to the executor (comma list) or `none`. Records whether the run grounded in the wiki and whether it was stale (surfaces grounding + staleness for later audit) |
233
233
  | `CROSSLINK <state> :: boundaries=<n> peers=<names>` | orc → writer | cross-repo peer-knowledge state at the consult point — state ∈ `cached` (peer cache present) \| `configured-no-cache` (crosslink configured but the cache is not built) \| `none`. Per-task `CROSSLINK inject task=<id> :: <boundary>` when a slice receives a linked contract. Records whether peer contracts were injected this run (full orc consumes only the pre-built crosslink cache — it never reads peer source live; mechanism in `wiki-consult.md`) |
@@ -256,6 +256,7 @@ supplies the fact in a packet, the writer writes the line. `SPAWN`, `RETURN` and
256
256
  | `DRIFT loop=<n> :: <user description, compressed>` | orc → writer | mock-example drift-recovery loop opened (`PHASE mock-example`; canonical `_shared/drift-recovery.md`; hard cap 2 loops) |
257
257
  | `TDD-RED task=<id> iter=<n> :: <failing tests>` | executor→orc → writer | TDD repair-loop iteration — the plan's acceptance tests still red (cap `tdd_loop_max`; a paired TDD task's red proof also emits iter=0) |
258
258
  | `TDD-GREEN task=<id> iter=<n>` | executor→orc → writer | the task's TDD acceptance tests pass (the non-exempt definition-of-done) |
259
+ | `REPRO red\|green :: <cmd> exit=<n>` | executor→orc → writer | a DEFECT task's reproduction, before and after the fix (`_shared/return-validation.md` §5d). TWO lines per reproduced defect, in this order: the `before` run must be RED and the `after` run GREEN, or the return was malformed. `REPRO none :: <reason>` when no reproduction could be written — an honest answer, never a missing line. A reproduction is NOT a plan-time acceptance test, so it never reuses `TDD-RED`/`TDD-GREEN`: `/orc-retro` counts "we proved the bug first" apart from "we drove the plan's acceptance tests" |
259
260
  | `NOTE :: <decisions>` | writer | the packet's `decisions` field — the WHY layer (scoring rationale, user answers verbatim, what was rejected). One line per packet, only when `decisions` is non-empty |
260
261
  | `STATS lane=<l> slug=<s> dispatches=<n> waves=<n> tasks=<n> bands=<h:n,m:n,l:n> downgrades=<n> duration_ms=<n>` | orc → writer | ONE deterministic summary line per run, in the `FINISH` packet, immediately BEFORE the `FINISH` line. This is what `orc stats` reads — one line per file, never a parse of the whole trace. Omit a field you genuinely do not have (a lane with no waves omits `waves=`); never guess one. Every trace-owning lane emits it, not just `orc` |
261
262
  | `PACT <state> :: <ids>` | orc → writer | invariant-ledger state at the Phase-1 probe (`pact_gate`), and `PACT inject task=<id> :: <PACT-id>` when a DRIFTED/BROKEN promise is appended to a task's `constraints[]`. `PACT recheck pass\|fail :: <ids>` at Phase 6. Records whether last month's decisions constrained this month's plan |
@@ -74,12 +74,16 @@ in play.
74
74
  whenever the request uses project jargon, `orc-reference-config-env` for
75
75
  config/env work.
76
76
 
77
- **Lane delta — orc-fast passes POINTERS, not content:** fast selects 1–3 page
78
- PATHS from `wiki/INDEX.md` and puts the paths in the executor slice with the
77
+ **Lane delta — orc-fast and orc-mini pass POINTERS, not content:** each selects
78
+ 1–3 page PATHS from `wiki/INDEX.md` and puts the paths in its slices with the
79
79
  instruction to READ them first (TL;DR for orientation, `Contracts & shapes` for
80
- specifics). Fast never pastes wiki bodies into a slice (a Sonnet-medium
81
- orchestrator curating wiki prose defeats the lane). Full/mini read the content
82
- themselves at planning time.
80
+ specifics). Neither pastes a wiki body into a slice, and neither reads one into
81
+ its OWN context — for fast, a Sonnet-medium orchestrator curating wiki prose
82
+ defeats the lane; for mini (v1.9.0), the orchestrator's context is the surface
83
+ that fills up first, and the planner and the executor can read a page far more
84
+ cheaply than it can carry one. The FULL lane still reads the content itself at
85
+ planning time, because it has a reviewer and a verifier to spend that context
86
+ on.
83
87
 
84
88
  ## Step 3 — Precedence (everywhere the wiki is consumed)
85
89
 
@@ -231,6 +231,28 @@ A rule the slice could not honour because this lane structurally cannot do it
231
231
  comes back as `unsupported_request`, relayed as a gap. **Never a guessed
232
232
  compromise.**
233
233
 
234
+ ## 5d. Reproduce-first attestation (when a `repro` was requested — v1.9.0)
235
+
236
+ A slice that carried `repro: {required: true, kind, hint}` must come back with a
237
+ `repro` field. Either both runs, quoted verbatim, or an honest `none`:
238
+
239
+ ```
240
+ repro: { command, before: {exit_code, tail}, after: {exit_code, tail} }
241
+ repro: none — <one line of reason>
242
+ ```
243
+
244
+ Two malformed shapes, and they are the whole point of the field. **`status=done`
245
+ with `before.exit_code` 0** means the "reproduction" never failed, so it proved
246
+ nothing; **`status=done` with a non-zero `after.exit_code`** means the bug is
247
+ still there. Either one is a failure of the return, not a finding about the
248
+ code. A `repro: none` is a valid answer — a defect with no reachable entry point
249
+ and no runner cannot be shown red — and the lane says **not reproduced** out
250
+ loud rather than letting a green suite imply a fixed bug.
251
+
252
+ `repro` is required ONLY when the slice carried `repro.required: true`. A slice
253
+ that asked for none gets none back, exactly like `tdd_spec`, `wiki_used` and
254
+ `graph_used`.
255
+
234
256
  ## 6. Worktree delta (post-wave, every lane that dispatches executors)
235
257
 
236
258
  Compare `git status --short` before and after each dispatch. A path that
@@ -11,10 +11,10 @@ description: >
11
11
  collapsed, conflicts, ordering) one issue at a time; proves NOTHING WAS LOST
12
12
  via a source coverage matrix and a 100% coverage gate before handoff;
13
13
  spot-checks inherited evidence and marks stale anchors; writes
14
- combined-report.md + combined-requirement-spec.md (the merged spec reuses the
15
- requirement-spec schema, so the planner/build pipeline is unchanged). Full
16
- lane only (Opus 5 high). The orchestrator DISPATCHES this to a subagent —
17
- it never combines itself, and the combiner never builds or spawns subagents.
14
+ combined-report.md + combined-requirement-spec.md, which reuse the
15
+ requirement-spec schema, so the planner/build pipeline is unchanged. Full
16
+ lane only. The orchestrator DISPATCHES this to a subagent — it never
17
+ combines itself, and the combiner never spawns subagents.
18
18
  ---
19
19
 
20
20
  # CONTEXT-COMBINER
@@ -211,12 +211,12 @@ exit code, and never re-derive a state word — the CLI's state words are the on
211
211
  state words, and **an exit code is an ANSWER wherever that contract says so, not
212
212
  a failure**. A call the answer does not name is a call this lane does not make.
213
213
  Exit ≠ 0 from the catalogue itself → say the CLI is unavailable and name the
214
- command you are about to run, out loud, before running it.
215
-
216
- ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
217
-
218
- `orc rules slice --lane context-combiner --json` is the ONLY assembler; never build
219
- the card here. It rides under the house rules and above the task —
220
- **house rules > your project's rules > ORC's own packs** — and its `line` prints
221
- VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
222
- never a silent choice) and `rules_overridden[]`.
214
+ command you are about to run, out loud, before running it.
215
+
216
+ ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
217
+
218
+ `orc rules slice --lane context-combiner --json` is the ONLY assembler; never build
219
+ the card here. It rides under the house rules and above the task —
220
+ **house rules > your project's rules > ORC's own packs** — and its `line` prints
221
+ VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
222
+ never a silent choice) and `rules_overridden[]`.