@azure-id/orc 2.0.2 → 2.1.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 (121) hide show
  1. package/CHANGELOG.md +401 -0
  2. package/README-id.md +52 -23
  3. package/README.md +50 -22
  4. package/bin/build-agents.js +24 -25
  5. package/bin/clear-logs.js +620 -0
  6. package/bin/cli.js +1155 -158
  7. package/bin/fix.js +459 -0
  8. package/bin/gotcha.js +288 -8
  9. package/bin/habit.js +1538 -1453
  10. package/bin/mockrun-catalog.js +3 -0
  11. package/bin/onboarding-content.js +2 -1
  12. package/bin/pricing.json +28 -21
  13. package/bin/trace-write.js +869 -657
  14. package/bin/verify-contracts.js +108 -27
  15. package/bin/verify-package.js +17 -6
  16. package/bin/webui/api.js +125 -6
  17. package/bin/webui/css/panels/hookui.css +79 -0
  18. package/bin/webui/fixtures/behaviour.js +30 -0
  19. package/bin/webui/fixtures/extra.js +9 -9
  20. package/bin/webui/fixtures/flow.js +81 -81
  21. package/bin/webui/fixtures/hookui.js +506 -431
  22. package/bin/webui/fixtures/index.js +32 -3
  23. package/bin/webui/fixtures/knowledge.js +2 -2
  24. package/bin/webui/fixtures/maintenance.js +123 -42
  25. package/bin/webui/fixtures/rules.js +1007 -1002
  26. package/bin/webui/fixtures/settings.js +6 -7
  27. package/bin/webui/fixtures/stats.js +9 -6
  28. package/bin/webui/fixtures/wait.js +98 -97
  29. package/bin/webui/i18n/en/behaviour.json +13 -0
  30. package/bin/webui/i18n/en/hookui.json +290 -194
  31. package/bin/webui/i18n/en/maintenance.json +71 -52
  32. package/bin/webui/i18n/en/settings.json +60 -60
  33. package/bin/webui/i18n/id/behaviour.json +13 -0
  34. package/bin/webui/i18n/id/hookui.json +290 -194
  35. package/bin/webui/i18n/id/maintenance.json +71 -52
  36. package/bin/webui/i18n/id/settings.json +60 -60
  37. package/bin/webui/js/05-banners.js +181 -172
  38. package/bin/webui/js/06-edit.js +193 -183
  39. package/bin/webui/js/panels/behaviour.js +77 -12
  40. package/bin/webui/js/panels/hookui.js +2196 -1691
  41. package/bin/webui/js/panels/maintenance.js +336 -235
  42. package/bin/webui/js/panels/settings.js +726 -719
  43. package/mock-run/INDEX.md +1 -0
  44. package/mock-run/extra-slots.md +1 -1
  45. package/mock-run/habits.md +1 -1
  46. package/mock-run/orc-aftermath.md +392 -392
  47. package/mock-run/orc-budget.md +29 -33
  48. package/mock-run/orc-cli.md +200 -200
  49. package/mock-run/orc-explain.md +86 -86
  50. package/mock-run/orc-extra.md +389 -392
  51. package/mock-run/orc-fix.md +87 -0
  52. package/mock-run/orc-pattern.md +112 -112
  53. package/mock-run/orc.md +157 -157
  54. package/package.json +1 -1
  55. package/templates/agents/MODEL-MAPPING.md +32 -29
  56. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -2
  57. package/templates/agents/{orc-claude-writer-opus-5-med.md → orc-claude-writer-opus-5-low.md} +4 -4
  58. package/templates/agents/orc-executor-haiku-4-5.md +1 -1
  59. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  60. package/templates/agents/orc-executor-sonnet-4-6-high.md +1 -1
  61. package/templates/agents/orc-executor-sonnet-4-6-med.md +1 -1
  62. package/templates/agents/orc-executor-sonnet-5-high.md +2 -2
  63. package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
  64. package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
  65. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +2 -2
  66. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -2
  67. package/templates/agents/orc-retro-sonnet-5-high.md +2 -2
  68. package/templates/agents/{orc-reviewer-opus-5-med.md → orc-reviewer-opus-5-low.md} +4 -4
  69. package/templates/agents/{orc-wiki-scanner-opus-5-med.md → orc-wiki-scanner-opus-5-low.md} +3 -3
  70. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +2 -2
  71. package/templates/commands/orc-fix.md +18 -0
  72. package/templates/commands/orc-wiki.md +64 -64
  73. package/templates/hooks/README.md +75 -7
  74. package/templates/hooks/orc-session-hook.js +78 -3
  75. package/templates/hooks/orc-statusline-render.js +317 -23
  76. package/templates/hooks/orc-statusline.js +162 -49
  77. package/templates/hooks/orc-subagent-line.js +23 -5
  78. package/templates/hooks/orc-weather-fetch.js +123 -0
  79. package/templates/skills/_shared/extra-dispatch.md +5 -5
  80. package/templates/skills/_shared/gotchas.md +27 -7
  81. package/templates/skills/_shared/habits.md +2 -2
  82. package/templates/skills/_shared/opus5-only.md +14 -14
  83. package/templates/skills/_shared/phases/review.md +2 -2
  84. package/templates/skills/_shared/phases/trace-verbs.md +17 -3
  85. package/templates/skills/_shared/phases/trace.md +136 -136
  86. package/templates/skills/_shared/review-slice.md +28 -1
  87. package/templates/skills/_shared/wait.md +1 -0
  88. package/templates/skills/orc/README.md +2 -2
  89. package/templates/skills/orc/SKILL.md +1 -1
  90. package/templates/skills/orc/config.md +25 -27
  91. package/templates/skills/orc/examples/full-run-mock.md +2 -1
  92. package/templates/skills/orc/references/effort-and-mode.md +17 -17
  93. package/templates/skills/orc/references/preflight-report.md +3 -3
  94. package/templates/skills/orc/references/ultra-mode.md +1 -1
  95. package/templates/skills/orc/schemas/checkpoint.md +122 -122
  96. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +3 -3
  97. package/templates/skills/orc/subskills/orc-review-verify/core.md +1 -1
  98. package/templates/skills/orc-analyze/SKILL.md +4 -2
  99. package/templates/skills/orc-claude/SKILL.md +14 -14
  100. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
  101. package/templates/skills/orc-diy/SKILL.md +5 -5
  102. package/templates/skills/orc-fast/SKILL.md +8 -6
  103. package/templates/skills/orc-fix/SKILL.md +110 -0
  104. package/templates/skills/orc-mini/SKILL.md +4 -4
  105. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
  106. package/templates/skills/orc-quick/README.md +1 -1
  107. package/templates/skills/orc-quick/SKILL.md +2 -2
  108. package/templates/skills/orc-quick/references/dispatch-gate.md +3 -2
  109. package/templates/skills/orc-quick/references/gh-mode.md +4 -2
  110. package/templates/skills/orc-retro/SKILL.md +1 -1
  111. package/templates/skills/orc-retro/examples/retro-mock.md +16 -16
  112. package/templates/skills/orc-wiki/README.md +325 -325
  113. package/templates/skills/orc-wiki/SKILL.md +195 -195
  114. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
  115. package/templates/skills/orc-wiki/references/extra.md +2 -2
  116. package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
  117. package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -1
  118. package/templates/skills/orc-wiki/references/phases/phase-2.md +3 -3
  119. package/templates/skills/orc-wiki/references/phases/phase-3c.md +3 -2
  120. package/templates/agents/orc-claude-writer-opus-4-8-high.md +0 -48
  121. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +0 -74
@@ -13,7 +13,7 @@ is inert.
13
13
 
14
14
  ## The mapping (only when `opus5_only: true`)
15
15
 
16
- **Scored executors** — one model, EFFORT as the cost dial, replacing the 6-band
16
+ **Scored executors** — one model, EFFORT as the cost dial, replacing the 5-band
17
17
  mixed-model table:
18
18
 
19
19
  | Score | Executor agent |
@@ -23,7 +23,7 @@ mixed-model table:
23
23
 
24
24
  Two bands, sharing the 90 edge with the default table's top two rows. Since
25
25
  v1.0.0 the default table's high end is ALREADY Opus 5.5 with effort as the dial,
26
- so this mode differs from it only below 65 — a third band here would be a
26
+ so this mode differs from it only below 41 — a third band here would be a
27
27
  distinction the default table stopped making.
28
28
 
29
29
  **Fixed roles** — dispatch the Opus 5.5 variant **instead of** the default role
@@ -37,21 +37,21 @@ agent: same task slice, same return contract, same phase.
37
37
  | mini plan | `orc-planner-mini-sonnet-5-high` | `orc-planner-mini-opus-5-med` |
38
38
  | scout | `orc-scout-sonnet-4-6-high` | `orc-scout-opus-5-low` |
39
39
  | pattern codify | `orc-pattern-codifier-sonnet-5-high` | `orc-pattern-codifier-opus-5-med` |
40
- | wiki scan | `orc-wiki-scanner-opus-4-8-high` (deep) **or** `orc-wiki-scanner-sonnet-5-high` (light) | `orc-wiki-scanner-opus-5-med` |
41
- | claude write | `orc-claude-writer-opus-4-8-high` | `orc-claude-writer-opus-5-med` |
40
+ | wiki scan | `orc-wiki-scanner-sonnet-5-high` (light) | `orc-wiki-scanner-opus-5-low` |
42
41
  | retro mine | `orc-retro-sonnet-5-high` | `orc-retro-opus-5-med` |
43
42
 
44
- The nine roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
45
- verifier, test-author, combiner, learn-writer, advisor, judge — are already
43
+ The eleven roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
44
+ verifier, test-author, combiner, learn-writer, advisor, judge, CLAUDE.md writer
45
+ (`orc-claude-writer-opus-5-low`), deep wiki scanner (`orc-wiki-scanner-opus-5-low`)
46
+ — are already
46
47
  compliant and dispatch unchanged (their efforts are NOT rewritten by this mode).
47
48
 
48
- **The wiki scan tier ladder (v0.46.0) adds NO row here, and needs no new pair.**
49
- Off, the ladder picks deep or light per delta. ON, this mode already forces the
50
- wiki scanner to `orc-wiki-scanner-opus-5-med` — so **both tiers collapse onto that
51
- one shipped agent** and the ladder simply stops applying. A cheaper Opus 5.5 scanner
52
- variant for the light tier does not exist and must never be added: a pair for a
53
- tier that cannot occur while the flag is on is exactly the phantom this table
54
- exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
49
+ **The wiki scan tier ladder (v0.46.0) needs no new pair.**
50
+ Off, the ladder picks deep or light per delta. ON, this mode flips the light tier
51
+ to `orc-wiki-scanner-opus-5-low`. The deep tier is already that agent. So **both
52
+ tiers collapse onto that one shipped agent** and the ladder simply stops applying.
53
+ Do not add a second Opus 5.5 scanner variant. A pair for a tier that cannot occur
54
+ while the flag is on is exactly the phantom this table exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
55
55
 
56
56
  ## Out of scope — never forced
57
57
 
@@ -114,7 +114,7 @@ first one is true. `orc config list` and `orc config set` NAME the taken bands
114
114
  AND the taken positions for exactly that reason: a shadowed setting must never
115
115
  be silent, and neither must a partly shadowed one.
116
116
 
117
- Both wiki slots collapse onto `orc-wiki-scanner-opus-5-med` while the mode is on,
117
+ Both wiki slots collapse onto `orc-wiki-scanner-opus-5-low` while the mode is on,
118
118
  which is why the slot table adds **no agent and no pair**. A slot names the
119
119
  POSITION, not the model.
120
120
 
@@ -10,7 +10,7 @@ Emit `PHASE review start`. **Build the slice from `../review-slice.md`** — its
10
10
  §1 free check FIRST, then its §2 fields (with the graph on, `graph_changes` keeps
11
11
  its rows: no `--brief` here). Superpowers path: its review skill incl. tests
12
12
  (Sonnet 4.6 medium), then `../review-slice.md` §3 on its findings — no second
13
- dispatch. OpenSpec/self path: review worker (Opus 5.5 medium). Pass the resolved
13
+ dispatch. OpenSpec/self path: review worker (Opus 5.5 low). Pass the resolved
14
14
  `code_pattern` + its invariants + gate lines for the re-check
15
15
  (pattern-gate.md); no resolved pattern → FIRST ask for one (paste/md/none) (H `orc.phase-5.pattern-missing`).
16
16
  FE tasks in run → pass `fe_rules[]` from `../../orc-pattern/references/` fe-a11y
@@ -41,7 +41,7 @@ skipped by flow config") — never imply the work was reviewed.
41
41
  <!-- diy:when review=on -->
42
42
  Dispatch the reviewer exactly as the full lane does — follow the review half
43
43
  of `.claude/skills/orc/subskills/orc-review-verify/SKILL.md` (reviewer agent
44
- `orc-reviewer-opus-5-med`; findings ride the severity ladder from the
44
+ `orc-reviewer-opus-5-low`; findings ride the severity ladder from the
45
45
  locked rules, blocking and advisory findings both surfaced). Build its slice
46
46
  from `.claude/skills/_shared/review-slice.md` (§1 free check, §3 after-filter).
47
47
  <!-- /diy:when -->
@@ -42,7 +42,9 @@ owner is this file has its detail in "Verb detail" below.
42
42
  | `JUDGE <analysis\|plan\|implementation> <verdict> round=<n> blocking=<n> advisory=<n> downgraded=<n>` | orc → writer | ultra judgment verdict | `orc/references/ultra-mode.md` |
43
43
  | `OUTCOME task=<id> score=<n> band=<range> model=<m> retries=<n> requeues=<n> needs_context=<n> unmet=<n>` | orc → writer | task closed — links the scoring band to what it actually took | `_shared/phases/execution.md` |
44
44
  | `FINDING p0=<n> p1=<n> p2=<n> p3=<n>[ pre=<n> suppressed=<n> folded=<n>]` | reviewer→orc → writer | review outcome (P0–P3 severity ladder); the tail counts the after-filter's buckets | `_shared/phases/review.md` |
45
- | `FINDING-OUTCOME addressed=<n> disputed=<n> wontfix=<n> open=<n> pre=<n> suppressed=<n> :: <cat>:<addressed>/<total>,…` | orc → writer | ONE line at review close — what became of each finding; `orc gotcha quality` reads it | `_shared/phases/trace-verbs.md` |
45
+ | `FINDING-OUTCOME addressed=<n> disputed=<n> wontfix=<n> open=<n> pre=<n> suppressed=<n> :: <cat>:<addressed>/<total>,…` | orc → writer | ONE line at review close (a clean review too) — what became of each finding; `orc gotcha quality` counts it as a review | `_shared/phases/trace-verbs.md` |
46
+ | `REVIEW-WHICH chose=<orc\|project\|skip> name=<the review the rule names> by=<user\|ledger\|learned> :: <file:line of the rule>` | orc → writer | the answer to §0 "which review" when the project names its own review — written ALWAYS, also under habits off; the FINISH nudge reads it | `_shared/phases/trace-verbs.md` |
47
+ | `FIX source=<sonar\|ci\|defect\|pr\|review\|other> introduced_by=<orc\|ai\|human\|unknown> by=<user\|evidence> obs=<id8>[ missed_by=<run>] :: <path:lines> <rule or finding>` | cli | one fix recorded by `orc fix record` (/orc-fix) into the HOST run's trace — the CLI writes it, never a packet | `orc-fix/SKILL.md` |
46
48
  | `VERDICT pass\|fail :: <detail>` | verifier→orc → writer | verification outcome | `_shared/phases/verify.md` |
47
49
  | `DRIFT loop=<n> :: <user description, compressed>` | orc → writer | mock-example drift-recovery loop opened (hard cap 2 loops) | `_shared/drift-recovery.md` |
48
50
  | `TDD-RED task=<id> iter=<n> :: <failing tests>` | executor→orc → writer | TDD repair-loop iteration — the plan's acceptance tests still red | `_shared/phases/trace-verbs.md` |
@@ -170,6 +172,16 @@ reaches the file through a packet — you never append lines by hand.
170
172
  the user said "not a problem here" = disputed; declined with no reason = wontfix.
171
173
  `pre` and `suppressed` copy the after-filter's buckets; they never gate. The
172
174
  `FINDING` tail `pre= suppressed= folded=` is additive (the `sections=` precedent).
175
+ - **`REVIEW-WHICH`** (v2.1.0). ONE line, before ship, in every coding lane that
176
+ changed code, when the `review-policy` probe says `policy: project`
177
+ (the review slice, §0). It is written ALWAYS — habits off too — because it is a
178
+ record of what ran, not a habit. The `ASK any.review.which` line is written in
179
+ addition only when habits is on. A run that changed code under `policy:
180
+ project` with no `REVIEW-WHICH` line gets one nudge at FINISH.
181
+ - **`FIX`** (v2.1.0). Written by `orc fix record` ITSELF into the run in flight
182
+ (`/orc-fix`, a rider that opens no run). A packet that carries it is refused.
183
+ A lane never narrates it and never repeats it; `orc stats` and `/orc-retro`
184
+ read it like any other line.
173
185
  - **`DRIFT`.** `PHASE mock-example`; canonical `_shared/drift-recovery.md`.
174
186
  - **`TDD-RED` / `TDD-GREEN`.** Cap `tdd_loop_max`; a paired TDD task's red proof
175
187
  also emits iter=0. `TDD-GREEN` is the non-exempt definition-of-done.
@@ -334,8 +346,10 @@ trace and never emit `SPAWN`/`RETURN`.
334
346
 
335
347
  ### Files & lifecycle
336
348
 
337
- - Folder: `log_dir` (default `.claude/orc/logs/`). Persistent — **never deleted**
338
- (deliberate opposite of the decision log). Top level holds the run `.txt` plus
349
+ - Folder: `log_dir` (default `.claude/orc/logs/`). Persistent (deliberate
350
+ opposite of the decision log): kept until you run `orc clear logs --apply`, or
351
+ until the automatic sweep removes it (`log_retention_auto: on`, older than
352
+ `log_retention_days`). Top level holds the run `.txt` plus
339
353
  its sidecars (`.pending.json`, `.jsonl`); generated reports live in
340
354
  subfolders (`retro/`).
341
355
  - One file per run: **`run-<lane>-<slug>-<DDMMYY>-<HHMMSS>.txt`**, append-only.
@@ -1,136 +1,136 @@
1
- # Phase — Behavior trace (id: `trace`)
2
-
3
- > **Library file.** `orc lane phases <lane> --json` → `trace_grammar` gives this lane's verbs. **A verb not in `trace_grammar` → read `trace-verbs.md`** (the CLOSED set, on demand). Never invent a verb.
4
-
5
- <!-- orc:layer core -->
6
-
7
- **Behavior-trace logging is PERMANENT (always on) — there is no config toggle.**
8
- Every ORC run traces, to a **persistent** file that is NOT the decision log. The
9
- `orc-trace.js` hook bootstraps `log_dir` + the run pointer on the first ORC-agent
10
- dispatch and writes the `SPAWN`/`RETURN`/`PHASE-EDGE` skeleton itself. Only
11
- `log_dir` (default `.claude/orc/logs`) is configurable.
12
-
13
- ## Narration is WRITTEN BY THE CLI, not remembered (v2.0.0 — the core rule)
14
-
15
- > **Phase close = pipe the phase packet to `orc trace write --packet -`.**
16
- > Exit ≠ 0 → dispatch `orc-trace-writer-haiku-4-5` with the SAME packet.
17
-
18
- You supply the facts; the CLI holds the pen. You never append lines by hand.
19
-
20
- - **Pairing rule.** The write for phase N goes **in the same tool block as
21
- phase N+1's first dispatch**. A phase with no next dispatch (FINISH, an
22
- abort, a pure-question phase) writes SOLO, before its user-facing output.
23
- - **First write is solo** — before the planner/analyst goes out. It carries
24
- `run_meta`.
25
- - **Last write (run end).** The FINISH packet is written BEFORE you delete
26
- `.current`. It carries ONE `STATS` line immediately BEFORE `FINISH`.
27
-
28
- ### Phase packet (the command's stdin — small, plain YAML or JSON)
29
-
30
- ```yaml
31
- phase: execution wave 2
32
- run_meta: # FIRST packet of the run ONLY; omit thereafter
33
- lane: orc # orc | ultra | mini | fast | diy | wiki | analyze |
34
- # plan | claude | poly | learn | verify | pattern |
35
- # prsetup | prdriver | quick | grill | route |
36
- # brainstorm | pact | boundary | handoff | budget |
37
- # aftermath | export | challenge | doc | test
38
- slug: cas-multi-exchange-withdrawal
39
- trace_path: .claude/orc/logs/run-orc-cas-multi-exchange-withdrawal-240726-002352.txt
40
- events: # each {ts, verb, tail}; verb = the WHOLE head (`GATE grounding pass`), tail = detail only
41
- - {ts: "240726 00:30:39.881", verb: "VERIFY T2", tail: "actual=claude-sonnet-4-6/high ✅ MATCH"}
42
- decisions: > # free text — the WHY layer
43
- User answered "no new deps" verbatim; rejected the adapter split.
44
- ```
45
-
46
- - Build it from the phase's **actual working state as the phase closes**, never
47
- from memory later. `ts` is each event's REAL time. An absent field is omitted.
48
- - Subagent-returned markers (`QUESTION`, `FINDING`, `VERDICT`, a return's
49
- `actual_model`) are folded into the NEXT packet, never written directly.
50
-
51
- ### How many packets per lane (three tiers — EVERY trace-owning lane narrates)
52
-
53
- | Tier | Lanes | Packets |
54
- |------|-------|---------|
55
- | Build lanes | `orc` (incl. ultra), `orc-mini`, `orc-fast` | per phase — full orc ≈ 7–9 (ultra adds U0 + judge packets); orc-mini batches to 3, orc-fast to 2 |
56
- | Multi-dispatch | `orc-wiki`, `orc-pr-driver` | one per scan-batch (wiki) or LAYER (pr-driver) boundary + the end-of-run packet |
57
- | Composed | `orc-diy` | one per ENABLED phase group, **minimum 2** |
58
- | Iterative | `orc-quick`, `orc-challenge`, `orc-doc`, `orc-test` | **one per completed unit** (entry · iteration · wave · cycle — each spine names its unit) + the end-of-run `FINISH` packet. Several trace files for one cycle is CORRECT |
59
- | Single-dispatch | `orc-claude`, `orc-plan`, `orc-analyze`, `orc-analyze-mini`, `orc-pattern`, `orc-verify`, `orc-learn`, `orc-poly`, `orc-pr-setup`, `orc-grill`, `orc-route`, `orc-brainstorm`, `orc-pact`, `orc-boundary`, `orc-handoff`, `orc-budget`, `orc-aftermath`, `orc-export` | **exactly ONE mandatory end-of-run packet** |
60
-
61
- **The single-packet obligation is defined HERE, once.** That packet goes out
62
- SOLO after the main return validates and BEFORE `.current` is deleted, with
63
- `run_meta` plus the whole event list (intake decisions, the user's answers,
64
- `DISPATCH`/`VERIFY`, gate/verdict lines, `FINISH`). `context-combiner` is a
65
- PHASE of the analyze run, not a lane. `/orc-retro` writes no trace.
66
-
67
- ## Files & lifecycle
68
-
69
- - `log_dir` is **never deleted**. One append-only file per run:
70
- **`run-<lane>-<slug>-<DDMMYY>-<HHMMSS>.txt`** — `lane` from the enum above,
71
- `slug` `[a-z0-9-]`, ≤32 chars, no trailing hyphen.
72
- - Run pointer: at run start, write `log_dir/.current` containing just the trace
73
- filename **and `touch the trace file` of that name in the SAME step**. Both, or
74
- neither — a pointer to a missing file reads as dangling and splits the run.
75
- A lane that writes code also runs `orc run snapshot --run <run-slug>` in that
76
- step (what `orc undo` goes back to). Delete the pointer at run end (success or abort).
77
- - **A SUSPENDED lane re-writes its pointer on RESUME** (`_shared/lane-suspend.md`,
78
- `RETURN-TO`): the receiving lane deletes `.current` at its `FINISH`, so the
79
- suspending lane re-writes `.current` and must `touch the trace file` it names,
80
- in the SAME step.
81
-
82
- ## Write cadence — append AS THE RUN GOES, never in one batch at the end
83
-
84
- Each phase's packet goes out AT that phase's close, with that phase's events
85
- and the decisions behind them.
86
-
87
- **Self-check:** a phase that ends with
88
- `zero new trace lines is a protocol violation`.
89
- If a phase went by without its packet, write it NOW with the events'
90
- real timestamps — a block stamped "now" is a FALSE record. Never batch
91
- everything at `FINISH`. **A run with no `FINISH` counts as unfinished,
92
- permanently** — `FINISH` is mandatory even on an abort.
93
-
94
- ## Model check, announce, compaction
95
-
96
- - **Claimed vs actual.** Compare each return's `actual_model` / `actual_effort`
97
- with the pair the agent NAME implies; put a `VERIFY` line in the next packet
98
- and surface a ⛔ DOWNGRADE to the user in chat.
99
- - **Announce-on-spawn** from the agent NAME ("Spawning orc-executor-opus-5-low →
100
- claude-opus-5-5 / low"); never pass the coarse `sonnet|opus|haiku` arg.
101
- - **Compaction.** The checkpoint carries `logging_enabled` + `trace_path`; on
102
- resume, keep writing to the same file. `/orc-ultra` = `orc` + `ultra_mode: true`.
103
- - Append-only, one whole block per append. Record the ugly bits too.
104
-
105
- <!-- /orc:layer -->
106
-
107
- <!-- orc:layer composed -->
108
-
109
- ## Behavior trace (PERMANENT — always on, no flow key)
110
-
111
- Tracing is NOT composable: every ORC run traces, this one included. Follow
112
- `.claude/skills/_shared/phases/trace.md` (load it at run start) — this
113
- block is stitched into every compiled flow so a user-composed pipeline can never
114
- be the one lane that runs blind.
115
-
116
- **Run start:** create `log_dir`, write `log_dir/.current` =
117
- `run-diy-<slug>-<DDMMYY>-<HHMMSS>.txt` AND `touch the trace file` of that name
118
- in the SAME step (a pointer naming a file that does not exist reads as dangling —
119
- the hook rotates away from it and the run splits across two files), then store
120
- `trace_path` in the checkpoint and run `orc run snapshot --run <run-slug>`. The lane token is `diy`, whatever the flow is
121
- named.
122
-
123
- **Narration is written by the CLI, never remembered:** record each event with
124
- its REAL timestamp into a phase packet (`PHASE`, `DISPATCH`/`VERIFY` per spawn —
125
- `actual_model`/`actual_effort` vs expected, surface any ⛔ DOWNGRADE to the user
126
- — `SCORE`, `OUTCOME`, `GATE`, `FINDING`/`VERDICT` for whichever gates this flow
127
- enabled, `FINISH`, plus `decisions` = the WHY), then pipe it to
128
- `orc trace write --packet -` (exit ≠ 0 → `orc-trace-writer-haiku-4-5`), PAIRED
129
- with the next phase's first dispatch. **One packet per ENABLED phase group, minimum 2** — the flow shape is
130
- composed, so the packet count is too; a phase this flow turned OFF owes nothing.
131
- A phase ending with `zero new trace lines is a protocol violation`.
132
-
133
- **Run end:** write the `FINISH` packet, then delete
134
- `log_dir/.current`.
135
-
136
- <!-- /orc:layer -->
1
+ # Phase — Behavior trace (id: `trace`)
2
+
3
+ > **Library file.** `orc lane phases <lane> --json` → `trace_grammar` gives this lane's verbs. **A verb not in `trace_grammar` → read `trace-verbs.md`** (the CLOSED set, on demand). Never invent a verb.
4
+
5
+ <!-- orc:layer core -->
6
+
7
+ **Behavior-trace logging is PERMANENT (always on) — there is no config toggle.**
8
+ Every ORC run traces, to a **persistent** file that is NOT the decision log. The
9
+ `orc-trace.js` hook bootstraps `log_dir` + the run pointer on the first ORC-agent
10
+ dispatch and writes the `SPAWN`/`RETURN`/`PHASE-EDGE` skeleton itself. Only
11
+ `log_dir` (default `.claude/orc/logs`) is configurable.
12
+
13
+ ## Narration is WRITTEN BY THE CLI, not remembered (v2.0.0 — the core rule)
14
+
15
+ > **Phase close = pipe the phase packet to `orc trace write --packet -`.**
16
+ > Exit ≠ 0 → dispatch `orc-trace-writer-haiku-4-5` with the SAME packet.
17
+
18
+ You supply the facts; the CLI holds the pen. You never append lines by hand.
19
+
20
+ - **Pairing rule.** The write for phase N goes **in the same tool block as
21
+ phase N+1's first dispatch**. A phase with no next dispatch (FINISH, an
22
+ abort, a pure-question phase) writes SOLO, before its user-facing output.
23
+ - **First write is solo** — before the planner/analyst goes out. It carries
24
+ `run_meta`.
25
+ - **Last write (run end).** The FINISH packet is written BEFORE you delete
26
+ `.current`. It carries ONE `STATS` line immediately BEFORE `FINISH`.
27
+
28
+ ### Phase packet (the command's stdin — small, plain YAML or JSON)
29
+
30
+ ```yaml
31
+ phase: execution wave 2
32
+ run_meta: # FIRST packet of the run ONLY; omit thereafter
33
+ lane: orc # orc | ultra | mini | fast | diy | wiki | analyze |
34
+ # plan | claude | poly | learn | verify | pattern |
35
+ # prsetup | prdriver | quick | grill | route |
36
+ # brainstorm | pact | boundary | handoff | budget |
37
+ # aftermath | export | challenge | doc | test
38
+ slug: cas-multi-exchange-withdrawal
39
+ trace_path: .claude/orc/logs/run-orc-cas-multi-exchange-withdrawal-240726-002352.txt
40
+ events: # each {ts, verb, tail}; verb = the WHOLE head (`GATE grounding pass`), tail = detail only
41
+ - {ts: "240726 00:30:39.881", verb: "VERIFY T2", tail: "actual=claude-sonnet-4-6/high ✅ MATCH"}
42
+ decisions: > # free text — the WHY layer
43
+ User answered "no new deps" verbatim; rejected the adapter split.
44
+ ```
45
+
46
+ - Build it from the phase's **actual working state as the phase closes**, never
47
+ from memory later. `ts` is each event's REAL time. An absent field is omitted.
48
+ - Subagent-returned markers (`QUESTION`, `FINDING`, `VERDICT`, a return's
49
+ `actual_model`) are folded into the NEXT packet, never written directly.
50
+
51
+ ### How many packets per lane (three tiers — EVERY trace-owning lane narrates)
52
+
53
+ | Tier | Lanes | Packets |
54
+ |------|-------|---------|
55
+ | Build lanes | `orc` (incl. ultra), `orc-mini`, `orc-fast` | per phase — full orc ≈ 7–9 (ultra adds U0 + judge packets); orc-mini batches to 3, orc-fast to 2 |
56
+ | Multi-dispatch | `orc-wiki`, `orc-pr-driver` | one per scan-batch (wiki) or LAYER (pr-driver) boundary + the end-of-run packet |
57
+ | Composed | `orc-diy` | one per ENABLED phase group, **minimum 2** |
58
+ | Iterative | `orc-quick`, `orc-challenge`, `orc-doc`, `orc-test` | **one per completed unit** (entry · iteration · wave · cycle — each spine names its unit) + the end-of-run `FINISH` packet. Several trace files for one cycle is CORRECT |
59
+ | Single-dispatch | `orc-claude`, `orc-plan`, `orc-analyze`, `orc-analyze-mini`, `orc-pattern`, `orc-verify`, `orc-learn`, `orc-poly`, `orc-pr-setup`, `orc-grill`, `orc-route`, `orc-brainstorm`, `orc-pact`, `orc-boundary`, `orc-handoff`, `orc-budget`, `orc-aftermath`, `orc-export` | **exactly ONE mandatory end-of-run packet** |
60
+
61
+ **The single-packet obligation is defined HERE, once.** That packet goes out
62
+ SOLO after the main return validates and BEFORE `.current` is deleted, with
63
+ `run_meta` plus the whole event list (intake decisions, the user's answers,
64
+ `DISPATCH`/`VERIFY`, gate/verdict lines, `FINISH`). `context-combiner` is a
65
+ PHASE of the analyze run, not a lane. `/orc-retro` writes no trace.
66
+
67
+ ## Files & lifecycle
68
+
69
+ - `log_dir` stays until `orc clear logs --apply` or the `log_retention_auto`
70
+ sweep. One append-only file per run:
71
+ **`run-<lane>-<slug>-<DDMMYY>-<HHMMSS>.txt`** — `lane` from the enum above,
72
+ `slug` `[a-z0-9-]`, ≤32 chars, no trailing hyphen.
73
+ - Run pointer: at run start, write `log_dir/.current` containing just the trace
74
+ filename **and `touch the trace file` of that name in the SAME step**. Both, or
75
+ neither — a pointer to a missing file reads as dangling and splits the run.
76
+ A lane that writes code also runs `orc run snapshot --run <run-slug>` in that
77
+ step (what `orc undo` goes back to). Delete the pointer at run end (success or abort).
78
+ - **A SUSPENDED lane re-writes its pointer on RESUME** (`_shared/lane-suspend.md`,
79
+ `RETURN-TO`): the receiving lane deleted `.current`, so re-write it and
80
+ `touch the trace file` it names, in the SAME step.
81
+
82
+ ## Write cadence — append AS THE RUN GOES, never in one batch at the end
83
+
84
+ Each phase's packet goes out AT that phase's close, with that phase's events
85
+ and the decisions behind them.
86
+
87
+ **Self-check:** a phase that ends with
88
+ `zero new trace lines is a protocol violation`.
89
+ If a phase went by without its packet, write it NOW with the events'
90
+ real timestamps — a block stamped "now" is a FALSE record. Never batch
91
+ everything at `FINISH`. **A run with no `FINISH` counts as unfinished,
92
+ permanently** — `FINISH` is mandatory even on an abort.
93
+
94
+ ## Model check, announce, compaction
95
+
96
+ - **Claimed vs actual.** Compare each return's `actual_model` / `actual_effort`
97
+ with the pair the agent NAME implies; put a `VERIFY` line in the next packet
98
+ and surface a ⛔ DOWNGRADE to the user in chat.
99
+ - **Announce-on-spawn** from the agent NAME ("Spawning orc-executor-opus-5-low →
100
+ claude-opus-5-5 / low"); never pass the coarse `sonnet|opus|haiku` arg.
101
+ - **Compaction.** The checkpoint carries `logging_enabled` + `trace_path`; on
102
+ resume, keep writing to the same file. `/orc-ultra` = `orc` + `ultra_mode: true`.
103
+ - Append-only, one whole block per append. Record the ugly bits too.
104
+
105
+ <!-- /orc:layer -->
106
+
107
+ <!-- orc:layer composed -->
108
+
109
+ ## Behavior trace (PERMANENT — always on, no flow key)
110
+
111
+ Tracing is NOT composable: every ORC run traces, this one included. Follow
112
+ `.claude/skills/_shared/phases/trace.md` (load it at run start) — this
113
+ block is stitched into every compiled flow so a user-composed pipeline can never
114
+ be the one lane that runs blind.
115
+
116
+ **Run start:** create `log_dir`, write `log_dir/.current` =
117
+ `run-diy-<slug>-<DDMMYY>-<HHMMSS>.txt` AND `touch the trace file` of that name
118
+ in the SAME step (a pointer naming a file that does not exist reads as dangling —
119
+ the hook rotates away from it and the run splits across two files), then store
120
+ `trace_path` in the checkpoint and run `orc run snapshot --run <run-slug>`. The lane token is `diy`, whatever the flow is
121
+ named.
122
+
123
+ **Narration is written by the CLI, never remembered:** record each event with
124
+ its REAL timestamp into a phase packet (`PHASE`, `DISPATCH`/`VERIFY` per spawn —
125
+ `actual_model`/`actual_effort` vs expected, surface any ⛔ DOWNGRADE to the user
126
+ — `SCORE`, `OUTCOME`, `GATE`, `FINDING`/`VERDICT` for whichever gates this flow
127
+ enabled, `FINISH`, plus `decisions` = the WHY), then pipe it to
128
+ `orc trace write --packet -` (exit ≠ 0 → `orc-trace-writer-haiku-4-5`), PAIRED
129
+ with the next phase's first dispatch. **One packet per ENABLED phase group, minimum 2** — the flow shape is
130
+ composed, so the packet count is too; a phase this flow turned OFF owes nothing.
131
+ A phase ending with `zero new trace lines is a protocol violation`.
132
+
133
+ **Run end:** write the `FINISH` packet, then delete
134
+ `log_dir/.current`.
135
+
136
+ <!-- /orc:layer -->
@@ -5,7 +5,31 @@
5
5
  > `/orc-quick` review offer, the `/orc-mini` risk-high option, the `/orc-pr-driver`
6
6
  > per-layer gate, `/orc-ultra` gate 3). One slice, so a review in quick is the
7
7
  > same review as in `/orc`. The procedure and the return live in the agent file
8
- > (`.claude/agents/orc-reviewer-opus-5-med.md`), never here.
8
+ > (`.claude/agents/orc-reviewer-opus-5-low.md`), never here.
9
+
10
+ ## §0 Which review — only when the project names its own (v2.1.0)
11
+
12
+ When the `review-policy` probe of the lane config (or `orc review policy
13
+ --json`) says `policy: project`, a coding lane that changed code asks this ONCE
14
+ before ship — also `/orc-fast`, and `/orc-mini` without a risk-high row (DE-8).
15
+ A CLAUDE.md line never picks the reviewer: it adds an OPTION (H `any.review.which`).
16
+
17
+ ```text
18
+ Which review for this change?
19
+ 1. ORC review — orc-reviewer-opus-5-low (traced, gotcha card, Review Quality)
20
+ 2. <name> — the review <file>:<line> asks for ← recommended
21
+ 3. Skip review (not recommended: <file>:<line> asks for one)
22
+ ```
23
+
24
+ - Write `REVIEW-WHICH chose=<orc|project|skip> name=<the named review> by=user ::
25
+ <file>:<line>` ALWAYS (habits off too) — and ONLY under `policy: project`. With habits on, also the ASK line.
26
+ - **1** → this slice, as the lane already does. **2** → run the named skill or
27
+ command (the Skill tool takes both), then §3 on its findings with
28
+ `reviewer: "<name>"` on each observation — no ORC reviewer is dispatched.
29
+ **3** → no review; the summary says the project asked for one.
30
+ - An external review has no hook trace, no gotcha card and no required
31
+ `category`/`scenario`/`pre_existing`: §3 fills `category: uncategorized` where
32
+ it cannot map one, and Review Quality counts it in its own line.
9
33
 
10
34
  Slice fields: changed_files[] · diff_ranges[] · acceptance_criteria[] · constraints[] · code_pattern · invariants[] · validation_gate[] · fe_rules[] · security_checklist[] · graph_changes · tool_findings[] · gotcha_card · rules_card · previous_findings[] · mode
11
35
 
@@ -74,6 +98,9 @@ The reviewer reports EVERY finding. Then, before the ladder acts:
74
98
  5. At review close, record one observation per finding and emit the
75
99
  `FINDING-OUTCOME` line — `gotchas.md` §10 "Review close" (`/orc` Phase 7,
76
100
  `/orc-mini` after its risk option, `/orc-quick` after the review offer).
101
+ 6. In the same step, store the reviewed ranges (`diff_ranges`) with ONE
102
+ `orc gotcha observe -` call, body `{"kind": "review-scope", run, commit,
103
+ files}` (DE-13, "Review close"). The CLI computes a later fix's `miss` from it.
77
104
 
78
105
  **Superpowers path** (DE-13): after the Superpowers review skill returns, run
79
106
  this §3 on its findings too, outcomes included — never a second reviewer dispatch.
@@ -110,6 +110,7 @@ the other fails the suite.
110
110
  | `/orc-pattern` | none | single dispatch |
111
111
  | `/orc-claude` | none | single dispatch |
112
112
  | `/orc-explain` | none | read-only, seconds long |
113
+ | `/orc-fix` | none | after the record is written |
113
114
  | `/orc-route` | none | read-only, seconds long |
114
115
  | `/orc-boundary` | none | read-only, seconds long |
115
116
  | `/orc-budget` | none | read-only, seconds long |
@@ -97,8 +97,8 @@ codifier: 9 language playbooks + a11y/perf rule packs), `context-combiner`
97
97
  even for tiny tasks.** Orchestrator (Opus 4.8 high, or Opus 5.5 / Fable 5 at
98
98
  medium+) only coordinates; each task's 0–100 score (computed arithmetically
99
99
  from the planner's per-task `facets`) maps to a named executor agent via the
100
- single 6-band table in `config.md` (`rubric_bands` = report granularity only),
101
- Haiku 4.5 [0,30) → Opus 5.5 low [65,90) → Opus 5.5 medium [90,100].
100
+ single 5-band table in `config.md` (`rubric_bands` = report granularity only),
101
+ Sonnet 5 low [0,21) → Opus 5.5 low [41,90) → Opus 5.5 medium [90,100].
102
102
  - **Every executor slice carries** the intent-spec constraints, the task's
103
103
  sliced acceptance criteria, the standing
104
104
  house-rules card, and — when a code-pattern is resolved — your project's
@@ -87,7 +87,7 @@ Workers are model-pinned SUBAGENTS in `.claude/agents/` — the model is enforce
87
87
  not requested in prose. Score every task from the planner-emitted `facets` via
88
88
  the fixed arithmetic formula and SHOW the table with the facet vector + the
89
89
  arithmetic (`B+N+L+T+fan+U = raw`; an un-shown number is not scored); map the
90
- final score via the RESOLVED table in `config.md` — `opus5_only` (2-band Opus-5-only, FORCING) > `rubric_bands_override` > the default 6-band (`rubric_bands` = granularity only, never a preset); NAME it when you show scores; sibling tasks differing in ≤1 facet share a
90
+ final score via the RESOLVED table in `config.md` — `opus5_only` (2-band Opus-5-only, FORCING) > `rubric_bands_override` > the default 5-band (`rubric_bands` = granularity only, never a preset); NAME it when you show scores; sibling tasks differing in ≤1 facet share a
91
91
  band or cite the differing facet (see `references/effort-and-mode.md`). EVERY
92
92
  dispatch is scored — fix-cycle dispatches (review-fix, verify-fix, P2-batch,
93
93
  requeue) run the same formula, inherit the original task's risk floor, and never
@@ -26,32 +26,30 @@ the `announce[]` boundary and the CLI-absent floor:
26
26
  ## Score → model table (executor agent dispatched by name)
27
27
 
28
28
  The orchestrator scores each task 0–100, then maps to a model via this SINGLE
29
- canonical 6-band table, and dispatches the matching **executor agent**.
29
+ canonical 5-band table, and dispatches the matching **executor agent**.
30
30
  `rubric_bands` sets scoring granularity only — it never selects a table.
31
31
 
32
32
  | Score | Model | Effort | Executor agent |
33
33
  |-------|-------|--------|----------------|
34
- | [0,30) | claude-haiku-4-5 | — | orc-executor-haiku-4-5 |
35
- | [30,40) | claude-sonnet-4-6 | medium | orc-executor-sonnet-4-6-med |
36
- | [40,55) | claude-sonnet-4-6 | high | orc-executor-sonnet-4-6-high |
37
- | [55,65) | claude-sonnet-5 | high | orc-executor-sonnet-5-high |
38
- | [65,90) | claude-opus-5-5 | low | orc-executor-opus-5-low |
39
- | [90,100] | claude-opus-5-5 | medium | orc-executor-opus-5-med |
40
-
41
- (Haiku has no effort ladder — that agent carries no `effort:` field.) The risk
42
- floor (≥70) lands `orc-executor-opus-5-low` at minimum in THIS table. Above ~65
43
- the useful dial stopped being the model GENERATION and became the EFFORT, which
44
- is why the old four Opus rows are two. **Every band from 65 needs an Opus 5.5 MAIN
45
- session** or it silently falls back to the session model (the tier-honesty rule
46
- reports the downgrade) — two bands where it used to be one, and that is the cost
47
- of this table.
48
-
49
- **Four executors are named by NO band** — `orc-executor-opus-4-7-med`,
50
- `orc-executor-opus-4-7-high`, `orc-executor-opus-4-8-high` and
51
- `orc-executor-opus-5-high`. They still ship, reachable through
52
- `rubric_bands_override`, `orc diy`'s `fixed_executor` and `extra_fallback_agent`.
53
- Not deleted, because this is a TABLE change and not a model change — and an
54
- agent's model change is always a rename.
34
+ | [0,21) | claude-sonnet-5-5 | low | orc-executor-sonnet-5-low |
35
+ | [21,31) | claude-sonnet-5-5 | medium | orc-executor-sonnet-5-med |
36
+ | [31,41) | claude-sonnet-5-5 | high | orc-executor-sonnet-5-high |
37
+ | [41,90) | claude-opus-5-5 | low | orc-executor-opus-5-low |
38
+ | [90,100] | claude-opus-5-5 | medium | orc-executor-opus-5-med |
39
+
40
+ The risk floor (≥70) lands `orc-executor-opus-5-low` at minimum in THIS table.
41
+ Above ~65 the useful dial stopped being the model GENERATION and became the
42
+ EFFORT, which is why the old four Opus rows are two. **Every band from score 41
43
+ needs an Opus 5.5 MAIN session** or it silently falls back to the session model
44
+ (the tier-honesty rule reports the downgrade) — that is the cost of this table.
45
+
46
+ **Seven executors are named by NO band** — `orc-executor-haiku-4-5`,
47
+ `orc-executor-sonnet-4-6-med`, `orc-executor-sonnet-4-6-high`,
48
+ `orc-executor-opus-4-7-med`, `orc-executor-opus-4-7-high`,
49
+ `orc-executor-opus-4-8-high` and `orc-executor-opus-5-high`. They still ship,
50
+ reachable through `rubric_bands_override`, `orc diy`'s `fixed_executor` and
51
+ `extra_fallback_agent`. Not deleted, because this is a TABLE change and not a
52
+ model change — and an agent's model change is always a rename.
55
53
 
56
54
  ### The Opus-5-only ladder (`opus5_only`, default **false**)
57
55
 
@@ -64,10 +62,10 @@ One model, EFFORT as the cost dial. Off by default; nothing changes until set.
64
62
 
65
63
  Two bands, sharing the 90 edge with the default table's top two rows. That
66
64
  symmetry is the point: once the default table's high end is already Opus 5.5 with
67
- effort as the dial, this mode differs from it only BELOW 65, so a third band
65
+ effort as the dial, this mode differs from it only BELOW 41, so a third band
68
66
  would be a distinction the default table stopped making.
69
67
 
70
- **Tier cost:** today TWO bands in six need an Opus 5.5 main session; with this on,
68
+ **Tier cost:** today two bands in five, from score 41, need an Opus 5.5 main session; with this on,
71
69
  EVERY dispatch does, so a lower session downgrades every task (warn-only — a
72
70
  hook can gate effort, never model). **Scope:** it is NOT executor-only — it also
73
71
  forces every fixed role below, across every lane. orc-diy's table
@@ -84,7 +82,7 @@ un-shown number.
84
82
  |------|-------|
85
83
  | System Analyst | orc-system-analyst-opus-5-high |
86
84
  | Requirement Planner | orc-planner-opus-5-med |
87
- | Reviewer | orc-reviewer-opus-5-med |
85
+ | Reviewer | orc-reviewer-opus-5-low |
88
86
  | Verifier | orc-verifier-opus-5-med |
89
87
  | Mini analyst | orc-analyze-mini-sonnet-5-high |
90
88
  | Mini planner | orc-planner-mini-sonnet-5-high |
@@ -95,7 +93,7 @@ un-shown number.
95
93
 
96
94
  Under `opus5_only`, every role above that is not already `claude-opus-5-5`
97
95
  dispatches its Opus 5.5 variant instead — plus the roles owned by other lanes
98
- (scout, wiki scanner, CLAUDE.md writer, retro miner, fast executor).
96
+ (scout, wiki scanner, retro miner, fast executor).
99
97
 
100
98
  ## Where each subsystem's rule is written down
101
99
 
@@ -120,7 +118,7 @@ value participates in, and each has exactly one canonical copy.
120
118
  | Foreign dispatch | `extra_enabled` and the `extra_*` block; every armed run prints its `extra:` line at Phase 1 | `../_shared/extra-dispatch.md` |
121
119
  | Stacked PRs | the `stacked_pr*` keys gate the Phase 8 stack (full `/orc` + `/orc-ultra` only) | `../orc-pr-setup/SKILL.md` |
122
120
  | Retro | `retro_repo` is where `/orc-retro` files its report; it hard-gates on a delivery channel and does not run at all without one | `../orc-retro/SKILL.md` |
123
- | Paths | `log_dir` (traces, NEVER auto-deleted), `run_dir` (`.claude/orc/run` — outside the installer's blast radius), and the analyst/planner/report dirs | `../_shared/config-precedence.md` |
121
+ | Paths | `log_dir` (traces — kept until you run `orc clear logs --apply`, or until the automatic sweep removes them: `log_retention_auto: on`, older than `log_retention_days`), `run_dir` (`.claude/orc/run` — outside the installer's blast radius), and the analyst/planner/report dirs | `../_shared/config-precedence.md` |
124
122
  | Ultra | **no config key at all** — `/orc-ultra` forces its overrides RUN-SCOPED and never writes them to `orc.config.yaml` | `references/ultra-mode.md` |
125
123
 
126
124
  **TDD — Lane policy (fixed, not configurable).** Full orc + ultra always on ·
@@ -58,6 +58,7 @@ O: Code pattern? U: none. Findings (P0–P3 ladder, each P0–P2 anchored file:l
58
58
 
59
59
  ## Phase 7 — Summary
60
60
  O: 6 tasks/3 waves/6 spawns/1 pause/1 fresh-session resume · 1 needs_context · 1 escalation · verify fixed_then_passed · branch green. P2 fix-batch: none · Apply the 2 P3 cosmetics? U: no.
61
+ O: review close → `orc gotcha observe` ×3 (P1 addressed · 2× P3 wontfix, each with `run`) → `FINDING-OUTCOME addressed=1 disputed=0 wontfix=2 open=0 pre=0 suppressed=0 :: functional.check:1/1,evolvability.documentation:0/2`
61
62
 
62
63
  ## Phase 8 — Ship (orc-pr, reads pr.md)
63
64
  O: Branch: feat/notifications. Commit? Push? PR? U: yes all.
@@ -66,7 +67,7 @@ O: ✓ committed → pushed → run/merchant-notifications/DRP-482-add-merchant-
66
67
  Log deleted · checkpoint + dispatch log KEPT · completion dispatch report shown → "Run /usage to see your remaining limits."
67
68
 
68
69
  ## What this exercises
69
- always-spawn (even cheap tasks get a subagent) · facet-scored arithmetic · 6-band ladder ·
70
+ always-spawn (even cheap tasks get a subagent) · facet-scored arithmetic · 5-band ladder ·
70
71
  per-run folder run/merchant-notifications/ · usage reminder (no programmatic /usage) ·
71
72
  planner grounding spot-check catching a hallucinated path · executor evidence (verbatim
72
73
  build/test proof) · reviewer quote spot-check before any P0/P1 action ·