@azure-id/orc 1.8.1 → 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 (69) hide show
  1. package/CHANGELOG.md +386 -0
  2. package/README-id.md +110 -73
  3. package/README.md +96 -33
  4. package/bin/cli.js +45520 -44867
  5. package/bin/graph-extract.js +2409 -120
  6. package/bin/graph-gain.js +404 -0
  7. package/bin/graph-map.js +232 -0
  8. package/bin/graph-notes.js +49 -8
  9. package/bin/graph-query.js +1770 -808
  10. package/bin/graph-resolve.js +93 -16
  11. package/bin/graph-shard.js +325 -0
  12. package/bin/graph.js +658 -605
  13. package/bin/verify-contracts.js +297 -56
  14. package/bin/verify-package.js +29 -1
  15. package/bin/webui/api.js +6 -0
  16. package/bin/webui/fixtures/index.js +6 -1
  17. package/bin/webui/fixtures/knowledge.js +41 -1
  18. package/bin/webui/fixtures/stats.js +107 -104
  19. package/bin/webui/i18n/en/knowledge.json +16 -1
  20. package/bin/webui/i18n/id/knowledge.json +16 -1
  21. package/bin/webui/js/panels/knowledge.js +68 -3
  22. package/mock-run/orc-quick.md +141 -113
  23. package/package.json +1 -1
  24. package/templates/agents/MODEL-MAPPING.md +15 -5
  25. package/templates/agents/orc-executor-haiku-4-5.md +25 -13
  26. package/templates/agents/orc-executor-opus-4-7-high.md +25 -13
  27. package/templates/agents/orc-executor-opus-4-7-med.md +25 -13
  28. package/templates/agents/orc-executor-opus-4-8-high.md +25 -13
  29. package/templates/agents/orc-executor-opus-5-high.md +25 -13
  30. package/templates/agents/orc-executor-opus-5-low.md +25 -13
  31. package/templates/agents/orc-executor-opus-5-med.md +25 -13
  32. package/templates/agents/orc-executor-sonnet-4-6-high.md +25 -13
  33. package/templates/agents/orc-executor-sonnet-4-6-med.md +25 -13
  34. package/templates/agents/orc-executor-sonnet-5-high.md +25 -13
  35. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +15 -12
  36. package/templates/agents/orc-planner-mini-opus-5-med.md +75 -69
  37. package/templates/agents/orc-planner-mini-sonnet-5-high.md +73 -67
  38. package/templates/agents/orc-recon-opus-5-low.md +99 -0
  39. package/templates/agents/orc-recon-sonnet-4-6-med.md +99 -0
  40. package/templates/commands/orc-mini.md +10 -12
  41. package/templates/commands/orc-quick.md +20 -33
  42. package/templates/hooks/README.md +13 -3
  43. package/templates/hooks/orc-graph-hook.js +148 -13
  44. package/templates/hooks/orc-trace.js +476 -471
  45. package/templates/skills/_shared/code-graph.md +148 -20
  46. package/templates/skills/_shared/phases/execution.md +13 -11
  47. package/templates/skills/_shared/phases/planning.md +8 -1
  48. package/templates/skills/_shared/phases/rules.md +172 -159
  49. package/templates/skills/_shared/phases/ship.md +5 -1
  50. package/templates/skills/_shared/phases/trace.md +4 -1
  51. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  52. package/templates/skills/_shared/read-ladder.md +10 -2
  53. package/templates/skills/_shared/return-validation.md +22 -0
  54. package/templates/skills/context-combiner/SKILL.md +13 -13
  55. package/templates/skills/orc/SKILL.md +1 -1
  56. package/templates/skills/orc/subskills/orc-execution/core.md +171 -159
  57. package/templates/skills/orc-analyze/SKILL.md +13 -13
  58. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  59. package/templates/skills/orc-mini/SKILL.md +148 -136
  60. package/templates/skills/orc-mini/examples/mini-run-mock.md +64 -50
  61. package/templates/skills/orc-mini/references/complexity.md +105 -0
  62. package/templates/skills/orc-quick/README.md +495 -423
  63. package/templates/skills/orc-quick/SKILL.md +157 -211
  64. package/templates/skills/orc-quick/references/context-doc.md +145 -114
  65. package/templates/skills/orc-quick/references/defect.md +101 -0
  66. package/templates/skills/orc-quick/references/dispatch-gate.md +55 -24
  67. package/templates/skills/orc-quick/references/gh-mode.md +148 -127
  68. package/templates/skills/orc-quick/references/look.md +107 -0
  69. package/templates/skills/orc-wiki/references/staleness.md +1 -1
@@ -1,114 +1,145 @@
1
- # The quick context doc — shape and rules
2
-
3
- This is the file orc-quick writes after every request. It is written for a
4
- HUMAN to read later, in this session or a different one.
5
-
6
- ## Where it goes
7
-
8
- ```
9
- <projectRoot>/orc-quick/<slug>/quick-context.md
10
- ```
11
-
12
- - `<slug>` is the slug of the **first** request in the thread. No date in the
13
- folder name.
14
- - **One file per folder. Never make a second `.md` file.** No `review.md`, no
15
- `diff.md`, no per-request files.
16
- - It sits at the project root, next to folders like `test-generator/` and
17
- `learning-docs/` — never inside `.claude/`.
18
-
19
- ## Rules
20
-
21
- 1. **Write it BEFORE the offers** (test / review / commit). If the user walks
22
- away, the entry is still complete.
23
- 2. **Every request gets an entry** — even a read-only dig. There, the answer IS
24
- the result.
25
- 3. **Never read the body of this file.** Only two exceptions:
26
- - the TOC block, when you re-open a thread;
27
- - the user asks you to read it.
28
- 4. **Never commit it.** It is not staged, ever. Do not edit `.gitignore`.
29
- 5. One entry can hold **several dispatches**. A dig that turns into a fix is ONE
30
- entry with two rows in its table.
31
-
32
- ## The TOC block
33
-
34
- The top of the file has a short list between markers:
35
-
36
- ```markdown
37
- <!-- orc-quick:toc -->
38
- 1. Change json payload A → B 05-08-2026 14:23:10 ✅ committed a1b2c3d
39
- 2. How does tenant scoping work? 05-08-2026 15:47:02 ℹ answered
40
- 3. Why does /orders 500? — found & fixed 10-08-2026 09:15:44 ✅ committed 7f2e1a9
41
- <!-- /orc-quick:toc -->
42
- ```
43
-
44
- **Why the markers matter.** When you open a thread again, you need to know the
45
- next number. You read ONLY this block — it is small and cheap. You do not read
46
- the entries below it. That is how "never read the doc" and "keep counting" can
47
- both be true.
48
-
49
- Inside one session, the count is also kept in
50
- `.claude/orc/run/<run-slug>/quick-checkpoint.md`. That file is run state, not
51
- the deliverable, so you may read it freely.
52
-
53
- **If the TOC is broken or missing:** rebuild it by scanning ONLY the lines that
54
- start with `## <number>.`. Do not read the text under them. Then write the block
55
- back between the markers. Never start a second thread because of a broken TOC.
56
-
57
- ## Entry shape
58
-
59
- Use as many of these as apply. Leave out what does not fit.
60
-
61
- ```markdown
62
- ## <n>. <short title>
63
- **asked** DD-MM-YYYY HH:MM:SS
64
- > the user's request, word for word
65
-
66
- **kind** code-change | context-dig | investigate → code-change | pr-comments | …
67
- **resolved intent** one or two sentences: what you actually decided to do.
68
-
69
- **clarified**
70
- - <question> → **Y**: <what won> · X was <what the user first said> ·
71
- Z was <the other idea, and why it lost>
72
-
73
- **knowledge** wiki FRESH · docs=<paths> · pattern express@v3
74
-
75
- **dispatches**
76
- | # | kind | agent / model | expect | actual | result |
77
- |---|---|---|---|---|---|
78
- | 1 | recon | claude-sonnet-4-6 / medium *(ad-hoc, untraced-by-hook)* | sonnet-4-6/medium | sonnet-4-6/medium ✅ | what it found |
79
- | 2 | executor | `orc-executor-sonnet-4-6-med` | sonnet-4-6/medium | sonnet-4-6/medium ✅ | 3 files |
80
-
81
- **files changed** path · path · path
82
-
83
- **how it was resolved** a short, plain explanation of the fix and WHY this way.
84
- Say what you did not do, and why. This is the most useful part later.
85
-
86
- **build** GREEN · **tests** 41 passed
87
- **unmet** things you did not do, on purpose or not
88
-
89
- **follow-through** tests · review result · commit hash · pushed or not
90
- ```
91
-
92
- For PR work, also add:
93
-
94
- ```markdown
95
- **pr** #142 "title" · branch · url
96
-
97
- **threads taken** 2 of 3
98
- | # | reviewer | anchor | comment |
99
- |---|---|---|---|
100
- | 1 | @dana | src/routes/export.js:34 | the comment text |
101
-
102
- **github writes** NONE — no reply, no resolve, no review.
103
- ```
104
-
105
- ## Writing style for entries
106
-
107
- Write for a person who comes back in three weeks and forgot everything.
108
-
109
- - Use plain words. Short sentences.
110
- - Always name real files and line numbers.
111
- - Say **why** you chose one option and not the other. A rejected idea with its
112
- reason saves the next person from trying it again.
113
- - Record what you did NOT do. "Backfill not done — user asked to leave it" is
114
- more useful than silence.
1
+ # The quick context doc — shape and rules
2
+
3
+ This is the file orc-quick writes after every request. It is written for a
4
+ HUMAN to read later, in this session or a different one.
5
+
6
+ ## Where it goes
7
+
8
+ ```
9
+ <projectRoot>/orc-quick/<slug>/quick-context.md
10
+ ```
11
+
12
+ - `<slug>` is the slug of the **first** request in the thread. No date in the
13
+ folder name.
14
+ - **One file per folder. Never make a second `.md` file.** No `review.md`, no
15
+ `diff.md`, no per-request files.
16
+ - It sits at the project root, next to folders like `test-generator/` and
17
+ `learning-docs/` — never inside `.claude/`.
18
+
19
+ ## Rules
20
+
21
+ 1. **Write it BEFORE the offers** (test / review / commit). If the user walks
22
+ away, the entry is still complete.
23
+ 2. **Every request gets an entry** — even a read-only dig. There, the answer IS
24
+ the result.
25
+ 3. **Never read the body of this file.** Only two exceptions:
26
+ - the TOC block, when you re-open a thread;
27
+ - the user asks you to read it.
28
+ 4. **Never commit it.** It is not staged, ever. Do not edit `.gitignore`.
29
+ 5. One entry can hold **several dispatches**. A dig that turns into a fix is ONE
30
+ entry with two rows in its table.
31
+
32
+ ## The TOC block
33
+
34
+ The top of the file has a short list between markers:
35
+
36
+ ```markdown
37
+ <!-- orc-quick:toc -->
38
+ 1. Change json payload A → B 05-08-2026 14:23:10 ✅ committed a1b2c3d
39
+ 2. How does tenant scoping work? 05-08-2026 15:47:02 ℹ answered
40
+ 3. Why does /orders 500? — found & fixed 10-08-2026 09:15:44 ✅ committed 7f2e1a9
41
+ <!-- /orc-quick:toc -->
42
+ ```
43
+
44
+ **Why the markers matter.** When you open a thread again, you need to know the
45
+ next number. You read ONLY this block — it is small and cheap. You do not read
46
+ the entries below it. That is how "never read the doc" and "keep counting" can
47
+ both be true.
48
+
49
+ Inside one session, the count is also kept in
50
+ `.claude/orc/run/<run-slug>/quick-checkpoint.md`. That file is run state, not
51
+ the deliverable, so you may read it freely.
52
+
53
+ **If the TOC is broken or missing:** rebuild it by scanning ONLY the lines that
54
+ start with `## <number>.`. Do not read the text under them. Then write the block
55
+ back between the markers. Never start a second thread because of a broken TOC.
56
+
57
+ ## Entry shape
58
+
59
+ Use as many of these as apply. Leave out what does not fit.
60
+
61
+ ```markdown
62
+ ## <n>. <short title>
63
+ **asked** DD-MM-YYYY HH:MM:SS
64
+ > the user's request, word for word
65
+
66
+ **kind** code-change | context-dig | investigate → code-change | pr-comments | …
67
+ **resolved intent** one or two sentences: what you actually decided to do.
68
+
69
+ **clarified**
70
+ - <question> → **Y**: <what won> · X was <what the user first said> ·
71
+ Z was <the other idea, and why it lost>
72
+
73
+ **knowledge** wiki FRESH · docs=<paths> · pattern express@v3
74
+
75
+ **dispatches**
76
+ | # | kind | agent / model | expect | actual | result |
77
+ |---|---|---|---|---|---|
78
+ | 1 | recon | `orc-recon-sonnet-4-6-med` | sonnet-4-6/medium | sonnet-4-6/medium ✅ | what it found |
79
+ | 2 | executor | `orc-executor-sonnet-4-6-med` | sonnet-4-6/medium | sonnet-4-6/medium ✅ | 3 files |
80
+
81
+ Only an **other** dispatch keeps the `*(ad-hoc, untraced-by-hook)*` mark. A
82
+ dispatch of either pinned recon agent is a normal row with the agent's name.
83
+
84
+ **files changed** path · path · path
85
+
86
+ **repro** red → green · `npm test -- tests/orders.search.test.js` (before: exit 1 · after: exit 0)
87
+ **blast radius** 3 symbols · callers 7 in 4 files · tests reach 2 · risk high: searchByItemPrefix (exported, fan-in 4, no test reaches it)
88
+ **tests** reached 12 passed · suite 41 passed
89
+ **graph** gen 42 · cards 2 · <the `orc graph gain` line, word for word>
90
+
91
+ **how it was resolved** a short, plain explanation of the fix and WHY this way.
92
+ Say what you did not do, and why. This is the most useful part later.
93
+
94
+ **build** GREEN · **tests** 41 passed
95
+ **unmet** things you did not do, on purpose or not
96
+
97
+ **follow-through** tests · review result · commit hash · pushed or not
98
+ ```
99
+
100
+ For PR work, also add:
101
+
102
+ ```markdown
103
+ **pr** #142 "title" · branch · url
104
+
105
+ **threads taken** 2 of 3
106
+ | # | reviewer | anchor | comment |
107
+ |---|---|---|---|
108
+ | 1 | @dana | src/routes/export.js:34 | the comment text |
109
+
110
+ **github writes** NONE — no reply, no resolve, no review.
111
+ ```
112
+
113
+ These four lines are optional and go in that order, after `**files changed**`.
114
+ Leave out the ones that do not apply:
115
+
116
+ - **`repro`** — only on a defect entry. `repro: none` writes
117
+ `**repro** not reproduced — <the reason>` instead. Never leave it out to keep
118
+ the entry tidy: an unreproduced fix is the thing the reader most needs to know.
119
+ - **`blast radius`** — a `risk` word NEVER appears without its `why`. Nothing in
120
+ the graph → `none indexed (<n> files not in the graph)`.
121
+ - **`graph`** — the gain line is an estimate with a range. Copy it; never turn
122
+ it into a saving.
123
+
124
+ ## A read-only entry
125
+
126
+ A dig has no files, no build and no tests. It still gets a full entry:
127
+
128
+ - **`how it was resolved`** holds the recon `answer`.
129
+ - **`unmet`** holds the recon `unresolved[]`.
130
+ - A blast-radius dig lists the four caller classes apart — `direct`, `route`
131
+ (reached through a URL), `via_alias`, `inherited` — and, when any list rests
132
+ on the graph alone, the sentence the agent returned, word for word:
133
+ *A card lists every caller that NAMES the symbol. A card's silence is not
134
+ proof of absence.*
135
+
136
+ ## Writing style for entries
137
+
138
+ Write for a person who comes back in three weeks and forgot everything.
139
+
140
+ - Use plain words. Short sentences.
141
+ - Always name real files and line numbers.
142
+ - Say **why** you chose one option and not the other. A rejected idea with its
143
+ reason saves the next person from trying it again.
144
+ - Record what you did NOT do. "Backfill not done — user asked to leave it" is
145
+ more useful than silence.
@@ -0,0 +1,101 @@
1
+ # A defect entry shows the bug RED first
2
+
3
+ ## 1. When this applies
4
+
5
+ Q1 sorted the request as **`kind: defect`**. The user described a behaviour that
6
+ is wrong:
7
+
8
+ - *"the orders page returns 500"*
9
+ - *"it shows the wrong total"*
10
+ - *"find it and fix it"*
11
+ - *"this used to work last week"*
12
+
13
+ A request to ADD something is not a defect. A request to clean something up is
14
+ not a defect. Only a behaviour the user says is wrong.
15
+
16
+ ## 2. Why red first
17
+
18
+ Without a reproduction, the fix is proven against the **test suite**. With one,
19
+ the fix is proven against the **bug**.
20
+
21
+ Those are not the same thing. A suite that was green before the fix is still
22
+ green after a fix that changed nothing the user cares about. A reproduction that
23
+ goes from red to green is the only cheap proof that the thing the user reported
24
+ is the thing that got fixed.
25
+
26
+ It costs one extra run of one command. It is the cheapest correctness step in
27
+ this lane.
28
+
29
+ ## 3. What goes in the slice
30
+
31
+ ```yaml
32
+ repro:
33
+ required: true
34
+ kind: test | command
35
+ hint: "GET /orders/search?item=blue returns 500 — see src/routes/orders.js:16"
36
+ ```
37
+
38
+ - **`kind: test`** when the project has a test runner. The executor writes a
39
+ failing test in the project's own framework.
40
+ - **`kind: command`** when it has none. The executor writes a command that shows
41
+ the fault — a `curl`, a script, a one-line node call.
42
+
43
+ **A good `hint` is specific.** Give the exact input the user described and the
44
+ `file:line` your dig found:
45
+
46
+ | Weak | Good |
47
+ |---|---|
48
+ | "search is broken" | `GET /orders/search?item=blue` returns 500 — `src/routes/orders.js:16` |
49
+ | "the total is wrong" | cart with 2 × 4.99 shows 9.99, not 9.98 — `src/cart/total.js:22` |
50
+
51
+ ## 4. Who writes it
52
+
53
+ **The executor writes the reproduction, in the SAME slice as the fix. Never
54
+ you.**
55
+
56
+ A reproduction written by the orchestrator and handed over is a sketch the
57
+ executor has to trust. One written by the executor is a thing it ran and
58
+ watched fail. The second is worth something; the first is a longer slice.
59
+
60
+ ## 5. What comes back
61
+
62
+ ```yaml
63
+ repro:
64
+ command: "npm test -- tests/orders.search.test.js"
65
+ before: { exit_code: 1, tail: "…" }
66
+ after: { exit_code: 0, tail: "…" }
67
+ ```
68
+
69
+ Two of these are malformed returns, and both are treated as a failure
70
+ (`../../_shared/return-validation.md` §5d):
71
+
72
+ - `status: done` with `before.exit_code` of 0 — it was never red, so nothing was
73
+ reproduced.
74
+ - `status: done` with `after.exit_code` not 0 — it is still red, so nothing was
75
+ fixed.
76
+
77
+ Print both runs, two lines, and emit `REPRO red :: <cmd> exit=<n>` and
78
+ `REPRO green :: <cmd> exit=0` into the record.
79
+
80
+ ## 6. When it cannot be reproduced
81
+
82
+ Sometimes there is no runner and no reachable entry point. Sometimes the fault
83
+ needs production data.
84
+
85
+ ```yaml
86
+ repro: none
87
+ reason: "no test runner, and the failing path needs a live Stripe webhook"
88
+ ```
89
+
90
+ **That is an honest return, not a failure.** But it changes what the user is
91
+ told. The entry says **not reproduced** with the reason, and the commit offer
92
+ shows it on its own line:
93
+
94
+ ```
95
+ commit? — 2 files changed
96
+ ⚠ not reproduced: no test runner, and the failing path needs a live Stripe webhook
97
+ ```
98
+
99
+ A user who knows the fix was never seen to work can decide to test it by hand.
100
+ A user who was not told cannot. **Never invent a reproduction to fill the
101
+ field.**
@@ -11,7 +11,7 @@ what is about to be spent, before it is spent.
11
11
  | Kind | Offer | Traced by the hook | Downgrade check |
12
12
  |------|-------|--------------------|-----------------|
13
13
  | Writes code | `orc-executor-sonnet-4-6-med` · `orc-executor-opus-5-low` · **a third option when a `quick-executor` position is held** | yes | yes (a foreign return has no `actual_model` — §2b) |
14
- | Read only (recon) | ad-hoc **model + effort** | no | yes (self-report) |
14
+ | Read only (recon) | `orc-recon-sonnet-4-6-med` · `orc-recon-opus-5-low` · **other — name a model** | yes · yes · no | yes |
15
15
  | Review | `orc-reviewer-opus-5-med` · or ad-hoc | yes / no | yes |
16
16
  | Build repair, round 1–2 | *reused — not asked* | yes | yes |
17
17
  | Build repair, round 3 | asked again | yes | yes |
@@ -22,7 +22,9 @@ what is about to be spent, before it is spent.
22
22
  Which executor for entry 2 — "add retry header"?
23
23
 
24
24
  1. orc-executor-sonnet-4-6-med cheap, fits a 3-file change
25
- 2. orc-executor-opus-5-low thinks harder, about 3× the cost
25
+ 2. orc-executor-opus-5-low thinks harder, about 3× the cost → suggested: callers 9 in 5 files
26
+
27
+ Your choice — nothing runs until you answer.
26
28
  ```
27
29
 
28
30
  Give a short reason next to each one, based on what the dig found. The user
@@ -73,34 +75,63 @@ answers.
73
75
 
74
76
  ### Read-only work (recon)
75
77
 
76
- Suggest a model and an effort. Let the user change either one.
78
+ Recon is a **pinned pair**. Both agents answer ONE question with `file:line`
79
+ evidence and return the same fields, so the user is choosing a model, nothing
80
+ else.
77
81
 
78
82
  ```
79
- Entry 3 is a context dig. What should look into it?
83
+ Entry 3 is a context dig. Which agent should look?
80
84
 
81
- model claude-sonnet-4-6 (suggested — finding things, not deciding)
82
- effort medium (suggested)
85
+ 1. orc-recon-sonnet-4-6-med finding things, not deciding → suggested
86
+ 2. orc-recon-opus-5-low a wide or subtle question
87
+ 3. other — name a model (effort follows your session; not traced by the hook)
83
88
 
84
- accept / change / cancel
89
+ Your choice — nothing runs until you answer.
85
90
  ```
86
91
 
87
- This is an **ad-hoc** dispatch: you name the model and effort directly instead
88
- of using an agent file. That is on purpose — recon is cheap and varied, and a
89
- new agent file for every combination is not worth it.
90
-
91
- **The cost of ad-hoc, and what you do about it.** The trace hook only sees
92
- agents whose name starts with `orc-`. So it writes no `SPAWN` or `RETURN` line
93
- for an ad-hoc dispatch. Two of the three signals still work, because YOU write
94
- them, not the hook:
95
-
96
- - You still emit `DISPATCH model=… effort=… adhoc=true` and `VERIFY` into the
97
- trace packet.
98
- - The downgrade check still works, because the slice tells the agent to report
99
- its own `actual_model` and `actual_effort`.
100
-
101
- What is truly lost: `/orc-retro` cannot count these runs. That is fine —
102
- orc-quick has no score bands to tune. Mark the row
103
- `*(ad-hoc, untraced-by-hook)*` in the doc so a human can see the gap.
92
+ **Why a pair and not an ad-hoc model.** Ad-hoc was cheap and varied, and the
93
+ price was measured: the trace hook only sees an agent whose name starts with
94
+ `orc-`, so an ad-hoc recon wrote no `SPAWN` or `RETURN` line, `orc run inflight`
95
+ could not see it in flight, and `/orc-retro` could not count it. The pair fixes
96
+ all three at once and gives recon a return contract the gate can check.
97
+
98
+ **Line 3 is the escape hatch, and it names a MODEL only.** The Agent tool takes
99
+ a per-call model and has no per-call effort knob, so an "effort" option there
100
+ was a setting that did not exist; effort follows your session. An `other`
101
+ dispatch is still untraced by the hook, and two of the three signals still work
102
+ because YOU write them:
103
+
104
+ - You still emit `DISPATCH model=… adhoc=true` and `VERIFY` into the trace packet.
105
+ - The downgrade check still works: the slice tells the agent to report its own
106
+ `actual_model` and `actual_effort`.
107
+
108
+ What is truly lost is `/orc-retro` aggregation. Mark the row
109
+ `*(ad-hoc, untraced-by-hook)*` in the doc so a human can see the gap. A dispatch
110
+ of either pinned agent is a normal row with the agent's name.
111
+
112
+ ## The suggestion
113
+
114
+ One line on a menu MAY carry `→ suggested`. It is a recommendation with its
115
+ reason attached, the same shape every ORC question uses
116
+ (`../../_shared/interview.md`). **It is never a pre-selection and never a
117
+ default**, and the menu still ends with
118
+ `Your choice — nothing runs until you answer.`
119
+
120
+ The reason comes from the dig, never from a feeling. Suggest
121
+ `orc-executor-opus-5-low` when ANY of these holds:
122
+
123
+ | Suggest the stronger executor when | Because |
124
+ |---|---|
125
+ | confident callers of the files to change ≥ 8 (from the dig, or from `orc graph changes`) | the change is felt in more places than a cheap pass checks |
126
+ | a risk class is visible: auth · money · migration · security · concurrency · data-integrity | the same six classes the full lane's planner floors to 70 |
127
+ | more than 3 files will really change | the cheap executor's sweet spot is a 1–3 file change |
128
+ | **otherwise** → `orc-executor-sonnet-4-6-med` | the boring choice for a mechanical edit |
129
+
130
+ **Always print the reason beside the marker.** A marker with no reason is a
131
+ default wearing a recommendation's clothes, and rule 1 forbids it.
132
+
133
+ For recon, the suggestion is simpler: `orc-recon-sonnet-4-6-med` finds things;
134
+ `orc-recon-opus-5-low` is for a wide or a subtle question.
104
135
 
105
136
  ## Rules
106
137