@azure-id/orc 2.1.1 → 2.2.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 (145) hide show
  1. package/CHANGELOG.md +320 -0
  2. package/README.md +48 -23
  3. package/bin/build-agents.js +207 -205
  4. package/bin/cli.js +48188 -47417
  5. package/bin/fix.js +21 -18
  6. package/bin/graph-extract.js +314 -6
  7. package/bin/graph-gain.js +83 -2
  8. package/bin/graph-map.js +23 -1
  9. package/bin/graph-notes.js +1 -1
  10. package/bin/graph-query.js +1362 -37
  11. package/bin/graph-resolve.js +1 -1
  12. package/bin/graph-shard.js +29 -6
  13. package/bin/graph-signals.js +5 -3
  14. package/bin/graph.js +7 -3
  15. package/bin/habit.js +1 -1
  16. package/bin/pricing.json +8 -1
  17. package/bin/trace-write.js +40 -11
  18. package/bin/verify-contracts.js +5661 -5552
  19. package/bin/verify-package.js +716 -716
  20. package/bin/webui/api.js +8 -0
  21. package/bin/webui/fixtures/extra.js +2036 -2036
  22. package/bin/webui/fixtures/flow.js +1 -1
  23. package/bin/webui/fixtures/index.js +2 -2
  24. package/bin/webui/fixtures/knowledge.js +8 -1
  25. package/bin/webui/fixtures/pact.js +112 -111
  26. package/bin/webui/fixtures/stats.js +2 -2
  27. package/bin/webui/i18n/en/knowledge.json +2 -0
  28. package/bin/webui/i18n/id/knowledge.json +2 -0
  29. package/bin/webui/js/panels/knowledge.js +17 -0
  30. package/guides/code-graph-benefit.md +116 -0
  31. package/guides/configuration.md +150 -0
  32. package/guides/documents.md +262 -0
  33. package/guides/extra-models.md +448 -0
  34. package/guides/habits-and-gotchas.md +152 -0
  35. package/guides/knowledge-reads.md +190 -0
  36. package/guides/model-selection.md +186 -0
  37. package/guides/rules.md +305 -0
  38. package/guides/status-line.md +344 -0
  39. package/mock-run/orc-cli.md +3 -2
  40. package/mock-run/orc-doc.md +452 -448
  41. package/mock-run/orc.md +157 -157
  42. package/package.json +2 -1
  43. package/templates/agents/MODEL-MAPPING.md +176 -176
  44. package/templates/agents/{orc-executor-haiku-4-5.md → orc-executor-haiku-5-high.md} +21 -8
  45. package/templates/agents/orc-executor-opus-4-7-high.md +17 -5
  46. package/templates/agents/orc-executor-opus-4-7-med.md +17 -5
  47. package/templates/agents/orc-executor-opus-4-8-high.md +17 -5
  48. package/templates/agents/orc-executor-opus-5-high.md +17 -5
  49. package/templates/agents/orc-executor-opus-5-low.md +17 -5
  50. package/templates/agents/orc-executor-opus-5-med.md +17 -5
  51. package/templates/agents/orc-executor-sonnet-4-6-high.md +17 -5
  52. package/templates/agents/orc-executor-sonnet-5-high.md +17 -5
  53. package/templates/agents/orc-executor-sonnet-5-low.md +17 -5
  54. package/templates/agents/orc-executor-sonnet-5-med.md +17 -5
  55. package/templates/agents/{orc-graph-noter-sonnet-4-6-med.md → orc-graph-noter-haiku-5-high.md} +4 -4
  56. package/templates/agents/orc-planner-mini-opus-5-med.md +3 -1
  57. package/templates/agents/orc-planner-mini-sonnet-5-high.md +3 -1
  58. package/templates/agents/orc-planner-opus-5-med.md +3 -1
  59. package/templates/agents/{orc-trace-writer-haiku-4-5.md → orc-trace-writer-haiku-5-high.md} +4 -3
  60. package/templates/commands/orc-doc.md +128 -128
  61. package/templates/commands/orc-export.md +51 -46
  62. package/templates/hooks/README.md +8 -3
  63. package/templates/hooks/orc-effort-guard.js +105 -27
  64. package/templates/hooks/orc-graph-hook.js +252 -4
  65. package/templates/hooks/orc-statusline.js +13 -6
  66. package/templates/hooks/orc-trace.js +1 -1
  67. package/templates/skills/_shared/README.md +2 -2
  68. package/templates/skills/_shared/code-graph.md +185 -251
  69. package/templates/skills/_shared/extra-dispatch.md +1331 -1331
  70. package/templates/skills/_shared/lane-contract.md +7 -3
  71. package/templates/skills/_shared/opus5-only.md +137 -137
  72. package/templates/skills/_shared/phases/execution.md +13 -11
  73. package/templates/skills/_shared/phases/planning.md +27 -9
  74. package/templates/skills/_shared/phases/preflight.md +3 -3
  75. package/templates/skills/_shared/phases/review.md +4 -3
  76. package/templates/skills/_shared/phases/ship.md +7 -10
  77. package/templates/skills/_shared/phases/summary.md +2 -3
  78. package/templates/skills/_shared/phases/trace-verbs.md +21 -16
  79. package/templates/skills/_shared/phases/trace.md +3 -3
  80. package/templates/skills/_shared/phases/wiki-consult.md +2 -2
  81. package/templates/skills/_shared/pr-templates.md +108 -106
  82. package/templates/skills/_shared/read-ladder.md +8 -2
  83. package/templates/skills/_shared/return-validation.md +10 -6
  84. package/templates/skills/_shared/review-slice.md +1 -1
  85. package/templates/skills/_shared/stack-plan.md +135 -135
  86. package/templates/skills/_shared/wait.md +14 -2
  87. package/templates/skills/context-combiner/SKILL.md +2 -2
  88. package/templates/skills/orc/SKILL.md +227 -227
  89. package/templates/skills/orc/config.md +2 -2
  90. package/templates/skills/orc/examples/full-run-mock.md +74 -74
  91. package/templates/skills/orc/schemas/planning-output.md +3 -0
  92. package/templates/skills/orc-aftermath/SKILL.md +15 -15
  93. package/templates/skills/orc-analyze/SKILL.md +2 -2
  94. package/templates/skills/orc-analyze-mini/SKILL.md +2 -2
  95. package/templates/skills/orc-boundary/SKILL.md +15 -15
  96. package/templates/skills/orc-boundary/references/card.md +81 -78
  97. package/templates/skills/orc-boundary/references/gate.md +113 -113
  98. package/templates/skills/orc-brainstorm/SKILL.md +15 -15
  99. package/templates/skills/orc-budget/SKILL.md +15 -15
  100. package/templates/skills/orc-challenge/README.md +1 -1
  101. package/templates/skills/orc-challenge/SKILL.md +16 -16
  102. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  103. package/templates/skills/orc-claude/SKILL.md +4 -4
  104. package/templates/skills/orc-claude/examples/claude-run-mock.md +1 -1
  105. package/templates/skills/orc-diy/SKILL.md +2 -2
  106. package/templates/skills/orc-diy/references/blocks/wiki.md +26 -26
  107. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  108. package/templates/skills/orc-doc/README.md +2 -2
  109. package/templates/skills/orc-doc/SKILL.md +501 -490
  110. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +12 -1
  111. package/templates/skills/orc-doc/references/chunking.md +6 -4
  112. package/templates/skills/orc-doc/references/gates.md +311 -311
  113. package/templates/skills/orc-doc/references/resume-protocol.md +229 -228
  114. package/templates/skills/orc-explain/SKILL.md +88 -88
  115. package/templates/skills/orc-export/SKILL.md +190 -187
  116. package/templates/skills/orc-fast/SKILL.md +213 -210
  117. package/templates/skills/orc-grill/SKILL.md +245 -245
  118. package/templates/skills/orc-handoff/SKILL.md +11 -11
  119. package/templates/skills/orc-learn/SKILL.md +13 -13
  120. package/templates/skills/orc-learn/examples/learn-run-mock.md +2 -2
  121. package/templates/skills/orc-mini/SKILL.md +12 -12
  122. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -5
  123. package/templates/skills/orc-pact/SKILL.md +15 -15
  124. package/templates/skills/orc-pact/references/gate.md +70 -70
  125. package/templates/skills/orc-pattern/SKILL.md +3 -3
  126. package/templates/skills/orc-poly/SKILL.md +4 -4
  127. package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -51
  128. package/templates/skills/orc-pr-driver/SKILL.md +4 -3
  129. package/templates/skills/orc-pr-driver/references/orc-run-split.md +108 -99
  130. package/templates/skills/orc-pr-setup/SKILL.md +2 -2
  131. package/templates/skills/orc-quick/README.md +535 -536
  132. package/templates/skills/orc-quick/SKILL.md +29 -32
  133. package/templates/skills/orc-quick/references/context-doc.md +145 -145
  134. package/templates/skills/orc-quick/references/dispatch-gate.md +220 -220
  135. package/templates/skills/orc-quick/references/gh-mode.md +2 -1
  136. package/templates/skills/orc-quick/references/look.md +34 -12
  137. package/templates/skills/orc-retro/SKILL.md +2 -2
  138. package/templates/skills/orc-retro/examples/retro-mock.md +2 -2
  139. package/templates/skills/orc-route/SKILL.md +2 -2
  140. package/templates/skills/orc-test/SKILL.md +6 -3
  141. package/templates/skills/orc-verify/SKILL.md +2 -2
  142. package/templates/skills/orc-wait/SKILL.md +10 -2
  143. package/templates/skills/orc-wiki/SKILL.md +4 -4
  144. package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -19
  145. package/templates/agents/orc-executor-sonnet-4-6-med.md +0 -155
@@ -1,176 +1,176 @@
1
- # ORC Agents — Roster, Model Mapping & Verification
2
-
3
- Single-role, model-specific agents. The orchestrator dispatches BY AGENT NAME —
4
- model is pinned in frontmatter, not requested in prose. No agent is multi-role.
5
-
6
- ## Executors (score-mapped by the single 5-band table in config.md)
7
-
8
- | Score band | Agent | Model | Effort |
9
- |-----------|-------|-------|--------|
10
- | [0,21) | orc-executor-sonnet-5-low | claude-sonnet-5-5 | low |
11
- | [21,31) | orc-executor-sonnet-5-med | claude-sonnet-5-5 | medium |
12
- | [31,41) | orc-executor-sonnet-5-high | claude-sonnet-5-5 | high |
13
- | [41,90) | orc-executor-opus-5-low | claude-opus-5-5 | low |
14
- | [90,100] | orc-executor-opus-5-med | claude-opus-5-5 | medium |
15
-
16
- Score→executor mapping lives in config.md (one canonical 5-band table;
17
- `rubric_bands` is granularity only, not a preset selector).
18
-
19
- **Executors no band names — they still ship.**
20
- `orc-executor-haiku-4-5`, `orc-executor-sonnet-4-6-med`,
21
- `orc-executor-sonnet-4-6-high`, `orc-executor-opus-4-7-med`,
22
- `orc-executor-opus-4-7-high`, `orc-executor-opus-4-8-high` and
23
- `orc-executor-opus-5-high` — seven agents — are still generated
24
- and still installed. They are reachable only when a user names one
25
- explicitly: `rubric_bands_override`, `orc diy`'s `fixed_executor`, or
26
- `extra_fallback_agent`. They are not deleted because a table change is not a
27
- model change, and an agent's model change is always a RENAME.
28
-
29
- ## Fixed-role agents
30
-
31
- | Agent | Model | Effort | Role |
32
- |-------|-------|--------|------|
33
- | orc-system-analyst-opus-5-high | claude-opus-5-5 | high | doc analysis |
34
- | orc-planner-opus-5-med | claude-opus-5-5 | medium | planning |
35
- | orc-reviewer-opus-5-low | claude-opus-5-5 | low | review (medium until v2.1.0; renamed from orc-reviewer-opus-5-med) |
36
- | orc-verifier-opus-5-med | claude-opus-5-5 | medium | verify (+ /orc-verify) |
37
- | orc-test-author-opus-5-med | claude-opus-5-5 | medium | test authoring (opt-in Phase 6.5; writes tests, never runs) |
38
- | orc-analyze-mini-sonnet-5-high | claude-sonnet-5-5 | high | mini analysis |
39
- | orc-planner-mini-sonnet-5-high | claude-sonnet-5-5 | high | mini planning |
40
- | orc-scout-sonnet-4-6-high | claude-sonnet-4-6 | high | deep-analysis code scout (read-only) |
41
- | orc-recon-sonnet-5-med | claude-sonnet-5-5 | medium | answer ONE repository question with file:line evidence (/orc-quick read-only entries; never edits, never plans) |
42
- | orc-recon-opus-5-low | claude-opus-5-5 | low | the same contract for a WIDE or SUBTLE question — a blast radius across areas, a defect with no obvious anchor |
43
- | orc-context-combiner-opus-5-high | claude-opus-5-5 | high | combine 2+ related analyses (full lane) |
44
- | orc-pattern-codifier-sonnet-5-high | claude-sonnet-5-5 | high | reconcile per-language playbook vs. project files → cached code-pattern (opt-in) |
45
- | orc-retro-sonnet-5-high | claude-sonnet-5-5 | high | mine behavior traces → calibration report (/orc-retro; read-only) |
46
- | orc-wiki-scanner-opus-5-low | claude-opus-5-5 | low | scan ONE wiki coverage area → evidence-anchored doc body + crosslink tags (/orc-wiki only; read-only against the project). The DEEP half of the tier ladder: first scan · STRUCTURAL · wide delta · a new exported symbol |
47
- | orc-wiki-scanner-sonnet-5-high | claude-sonnet-5-5 | high | the LIGHT half of the same ladder — an existing doc whose covered files moved by a small, no-new-surface delta. IDENTICAL return contract; it escalates with `needs_context` rather than under-delivering. Never used for a first scan |
48
- | orc-executor-opus-5-med | claude-opus-5-5 | medium | the `[90,100]` band in BOTH tables |
49
- | orc-executor-opus-5-low | claude-opus-5-5 | low | the default table's `[41,90)`, `opus5_only`'s `[0,90)`, and the forced mini/fast executor |
50
- | orc-advisor-opus-5-xhigh | claude-opus-5-5 | xhigh | ultra Phase U0 advisory brief + rubric + clarification questions (read-only; /orc-ultra only) |
51
- | orc-judge-opus-5-xhigh | claude-opus-5-5 | xhigh | ultra judgment gates — analysis / plan / implementation (read-only; /orc-ultra only) |
52
- | orc-learn-writer-opus-5-low | claude-opus-5-5 | low | deepen ONE feature → learning-docs/<slug>/ (/orc-learn only; git-ignored output) |
53
- | orc-claude-writer-opus-5-low | claude-opus-5-5 | low | scan repo → write/refresh the local CLAUDE.md (/orc-claude only; zero questions) |
54
- | orc-challenge-judge-opus-5-high | claude-opus-5-5 | high | grade ONE finished artifact against a FROZEN goal + template (/orc-challenge only; read-only). It reports findings and can never declare a pass — `orc challenge record` computes that |
55
- | orc-challenge-advisor-opus-5-med | claude-opus-5-5 | medium | turn a FAILED verdict into a remediation strategy — root-cause groups, an order with reasons, the decisions that are not defects (/orc-challenge only; read-only, no prose, no diffs) |
56
- | orc-challenge-reader-opus-5-low | claude-opus-5-5 | low | the COLD READ: answer questions from ONE artifact with `Read` and nothing else (/orc-challenge only). LOW ON PURPOSE — a harder-thinking reader reasons around the gaps D4 exists to find, so a stronger configuration is a worse instrument |
57
- | orc-challenge-contrarian-opus-5-high | claude-opus-5-5 | high | THE COUNCIL: start from "this has a fatal flaw" and go find it — load-bearing claim, then unhappy path, then second-order (/orc-challenge only; read-only). HIGH IS THE INSTRUMENT: a shallow contrarian returns the three surface complaints the free lint already caught |
58
- | orc-challenge-outsider-opus-5-low | claude-opus-5-5 | low | THE COUNCIL: what does this page assume you already know? The TIGHTEST slice in the lane — the artifact and this protocol, `Read` only, no goal, no audience, no template (/orc-challenge only). LOW IS A MEASUREMENT, NOT A COST CHOICE: a harder-thinking outsider reasons its way around an unexplained acronym and reports the document is fine. NOTHING MAY UPGRADE IT |
59
- | orc-challenge-executor-opus-5-med | claude-opus-5-5 | medium | THE COUNCIL: can this be started on Monday, and where is the first step? Returns D6/D2 findings plus the literal `monday_morning` list — or the point at which writing it becomes impossible (/orc-challenge only; read-only, `Bash` to CHECK a prerequisite, never to change anything). Not an ORC build executor — it writes nothing |
60
- | orc-challenge-principles-opus-5-high | claude-opus-5-5 | high | THE COUNCIL: the ONLY role allowed to say the frozen goal is wrong. Returns `premise` objects — no severity, never in findings[], never near the pass gate — and its report NEVER reaches the judge (/orc-challenge only; read-only). HIGH because rebuilding a problem statement from the ground up is the deepest reasoning in the lane |
61
- | orc-challenge-expansionist-opus-5-med | claude-opus-5-5 | medium | THE COUNCIL: the only lens not looking for a defect — what is being undervalued? Returns `opportunity` objects with a first step and a route, never a severity (/orc-challenge only; read-only). MEDIUM because it is pattern work against a concrete artifact, the same class as the advisor |
62
- | orc-doc-writer-opus-5-med | claude-opus-5-5 | medium | write ONE part file of a long document from a slice of sections (/orc-doc only). It writes to `.work/<id>.md` and NEVER opens document.md — that is what makes parallel writing safe here |
63
- | orc-doc-checker-opus-5-low | claude-opus-5-5 | low | read ONE LINE RANGE of a document and report anchored findings (/orc-doc only; read-only). LOW ON PURPOSE — the same reasoning that pins the challenge cold reader: a harder-thinking checker reasons its way past a gap a real reader would trip on |
64
- | orc-test-designer-opus-5-high | claude-opus-5-5 | high | fill the GAPS the free case matrix could not derive, and author the front-end journey SCRIPT (/orc-test only). HIGH IS THE INSTRUMENT: a shallow designer returns the three obvious cases the deterministic expansion already covered, which is the one output that costs money and adds nothing |
65
- | orc-test-interpreter-opus-5-low | claude-opus-5-5 | low | read ONLY a run’s evidence files and say whether what is in them is a finding (/orc-test only; SEALED slice, `Read` and nothing else). LOW IS A MEASUREMENT CHOICE, NOT A COST ONE, and nothing may ever upgrade it: a harder-thinking interpreter reasons its way to why a leaked stack trace is probably fine in staging |
66
- | orc-trace-writer-haiku-4-5 | claude-haiku-4-5 | — (no ladder) | append one phase block of behavior-trace narration from an orchestrator packet (every trace-owning lane; append-only, never reads source) |
67
- | orc-graph-noter-sonnet-4-6-med | claude-sonnet-4-6 | medium | write ONE sentence per changed function for the local code graph (`orc graph` Layer 2). Reads line RANGES only, pipes its notes to `orc graph notes apply -` (the CLI validates and stores), returns ONE line. Dispatched by code-changing lanes only when `code_graph_notes` is on and a batch reaches its minimum |
68
-
69
- ## Opus-5-only mode agents (hard-gated; dispatched only when `opus5_only: true`)
70
-
71
- `opus5_only` FORCES every dispatched role onto `claude-opus-5-5`, with effort as
72
- the only cost dial. Each agent below replaces its default with the same slice
73
- and the same return contract. Effort is PINNED per role — no CLI rewrites
74
- these. Full mapping + precedence:
75
- `../skills/_shared/opus5-only.md`.
76
-
77
- | Agent | Model | Effort | Replaces |
78
- |-------|-------|--------|----------|
79
- | orc-executor-opus-5-low | claude-opus-5-5 | low | the `[0,90)` band · orc-mini's and orc-fast's fixed executor |
80
- | orc-executor-opus-5-med | claude-opus-5-5 | medium | the `[90,100]` band |
81
- | orc-analyze-mini-opus-5-med | claude-opus-5-5 | medium | orc-analyze-mini-sonnet-5-high |
82
- | orc-planner-mini-opus-5-med | claude-opus-5-5 | medium | orc-planner-mini-sonnet-5-high |
83
- | orc-scout-opus-5-low | claude-opus-5-5 | low | orc-scout-sonnet-4-6-high |
84
- | orc-pattern-codifier-opus-5-med | claude-opus-5-5 | medium | orc-pattern-codifier-sonnet-5-high |
85
- | orc-wiki-scanner-opus-5-low | claude-opus-5-5 | low | orc-wiki-scanner-sonnet-5-high |
86
- | orc-retro-opus-5-med | claude-opus-5-5 | medium | orc-retro-sonnet-5-high |
87
-
88
- The eleven roles already on `claude-opus-5-5` — analyst, planner, reviewer,
89
- verifier, test-author, combiner, learn-writer, advisor, judge, CLAUDE.md
90
- writer, deep wiki scanner — dispatch
91
- unchanged under this mode. **Never forced:** `orc-trace-writer-haiku-4-5` (it
92
- transcribes a packet, no reasoning) and orc-diy (its table is compile-owned).
93
- **Not dispatched at all:** `orc-graph-noter-sonnet-4-6-med` has NO Opus 5.5
94
- variant. Under this mode a lane skips graph notes and prints
95
- `graph notes: skipped (opus5_only)` — a one-sentence summary does not justify an
96
- Opus 5.5 dispatch, and the graph's structure layer costs no model at all.
97
-
98
- Mini execution reuses orc-executor-sonnet-5-high. Fast-lane (orc-fast)
99
- execution reuses orc-executor-sonnet-5-med — no dedicated agent. Under
100
- `opus5_only` both reuse orc-executor-opus-5-low.
101
-
102
- ## orc-quick — the user picks, and no config can override it
103
-
104
- `/orc-quick` has NO dedicated agent and NO score table. It asks the USER which
105
- agent to spawn before EVERY dispatch, and reuses shipped agents:
106
-
107
- | Dispatch kind | Offered | Hook-traced |
108
- |---|---|---|
109
- | writes code | orc-executor-sonnet-5-med · orc-executor-opus-5-low | yes |
110
- | read-only recon | orc-recon-sonnet-5-med · orc-recon-opus-5-low · or `other — name a model` | yes · yes · no |
111
- | review | orc-reviewer-opus-5-low · or ad-hoc | yes / no |
112
-
113
- The only dispatch it does not re-ask is build-repair rounds 1–2, which reuse the
114
- executor the user already chose for that entry; round 3 asks again.
115
-
116
- **`opus5_only` and `rubric_bands_override` are both INERT in this lane** — they would silently collapse the user's choice. It is
117
- the one exception to `opus5_only`'s otherwise flat precedence. See
118
- `skills/_shared/opus5-only.md` and `skills/orc-quick/references/dispatch-gate.md`.
119
-
120
- **Recon is a pinned PAIR; `other` is the ad-hoc escape hatch.** The
121
- pair exists because the trace hook only sees an agent whose name starts with
122
- `orc-`: an ad-hoc recon writes no SPAWN/RETURN, is invisible to
123
- `orc run inflight`, and cannot be counted by `/orc-retro`. The two files share
124
- ONE return contract, so the choice is a model choice and nothing else.
125
-
126
- The escape hatch names **a model only**. The Agent tool takes a per-call model
127
- and has no per-call effort knob, so the old "ad-hoc model + effort" menu offered
128
- a setting that did not exist; effort follows the session. An `other` dispatch is
129
- still not hook-traced — the lane writes its own `DISPATCH … adhoc=true` /
130
- `VERIFY` lines and still runs the downgrade check from the agent's self-reported
131
- `actual_model`, and only `/orc-retro` aggregation misses it.
132
-
133
- The scout is dispatched only in the System Analyst's DEEP mode: the orchestrator
134
- fans out ≤`config.max_scouts` (default 3) parallel scouts, one per coverage area
135
- from the analyst's scout plan, and feeds their evidence bundles back to the
136
- analyst for pass 2. Scouts are read-only and never analyze/plan/edit.
137
-
138
- The orchestrator (main session) is NOT an agent file.
139
-
140
- ## ⚠ VERIFY IN YOUR ENVIRONMENT
141
-
142
- Model IDs use the Platform/API dateless format (confirmed at
143
- platform.claude.com/docs/en/about-claude/models/model-ids-and-versions):
144
- claude-haiku-4-5, claude-sonnet-4-6, claude-sonnet-5-5, claude-opus-4-7,
145
- claude-opus-4-8 and claude-opus-5-5 (the top executor band + the core fixed
146
- roles). **Sonnet 5 runs on `claude-sonnet-5-5` since v2.1.0** — the agent names
147
- keep `-sonnet-5-` (a point release in one family keeps the name, as Opus did in
148
- v1.9.2), and `claude-sonnet-5` stays a valid config value.
149
-
150
- 1. **Run `/agents`** to confirm Claude Code accepts these full IDs in agent
151
- frontmatter — in particular `claude-haiku-4-5` and `claude-opus-5-5`. If it
152
- wants short aliases (opus/sonnet/haiku) or dated IDs, adjust
153
- each `model:` field. The full IDs are valid at the API level but Claude Code
154
- may normalize differently.
155
- 2. **Confirm `effort:` is a valid CLI frontmatter field.** If the CLI ignores
156
- it, effort must be conveyed in the dispatched prompt instead.
157
- 3. **Run `/doctor`** for duplicate-name or load errors after any edit.
158
-
159
- ## ⚠ COST-TIER FALLBACK (the original "wrong model" bug)
160
-
161
- A subagent's model cannot exceed the MAIN session's cost tier — request pricier
162
- and it silently falls back to the main model. **Run your main Claude Code
163
- session on Opus** or every opus-* agent downgrades to Sonnet. Every executor
164
- band from score 41 (`[41,90)` and `[90,100]`) AND every core fixed role (analyst, planner, reviewer,
165
- verifier, test author, combiner, learn writer, ultra advisor/judge) are pinned
166
- to **claude-opus-5-5** — on an Opus 4.8 session they all land on Opus 4.8. Verify by
167
- expanding a subagent's tool-call in the transcript to see the model it ran.
168
-
169
- ## How dispatch works
170
-
171
- - Score a task → config preset maps score to an executor agent → dispatch that
172
- agent BY NAME with the task slice.
173
- - Fixed roles dispatch their named agent directly (analyst/planner/reviewer/
174
- verifier, mini variants).
175
- - Every agent is single-role and self-contained (embedded procedure), so a
176
- dispatched agent needs no external skill-loading to function.
1
+ # ORC Agents — Roster, Model Mapping & Verification
2
+
3
+ Single-role, model-specific agents. The orchestrator dispatches BY AGENT NAME —
4
+ model is pinned in frontmatter, not requested in prose. No agent is multi-role.
5
+
6
+ ## Executors (score-mapped by the single 5-band table in config.md)
7
+
8
+ | Score band | Agent | Model | Effort |
9
+ |-----------|-------|-------|--------|
10
+ | [0,21) | orc-executor-sonnet-5-low | claude-sonnet-5-5 | low |
11
+ | [21,31) | orc-executor-sonnet-5-med | claude-sonnet-5-5 | medium |
12
+ | [31,41) | orc-executor-sonnet-5-high | claude-sonnet-5-5 | high |
13
+ | [41,90) | orc-executor-opus-5-low | claude-opus-5-5 | low |
14
+ | [90,100] | orc-executor-opus-5-med | claude-opus-5-5 | medium |
15
+
16
+ Score→executor mapping lives in config.md (one canonical 5-band table;
17
+ `rubric_bands` is granularity only, not a preset selector).
18
+
19
+ **Executors no band names — they still ship.**
20
+ `orc-executor-haiku-5-high`,
21
+ `orc-executor-sonnet-4-6-high`, `orc-executor-opus-4-7-med`,
22
+ `orc-executor-opus-4-7-high`, `orc-executor-opus-4-8-high` and
23
+ `orc-executor-opus-5-high` — six agents — are still generated
24
+ and still installed. They are reachable only when a user names one
25
+ explicitly: `rubric_bands_override`, `orc diy`'s `fixed_executor`, or
26
+ `extra_fallback_agent`. They are not deleted because a table change is not a
27
+ model change, and an agent's model change is always a RENAME.
28
+
29
+ ## Fixed-role agents
30
+
31
+ | Agent | Model | Effort | Role |
32
+ |-------|-------|--------|------|
33
+ | orc-system-analyst-opus-5-high | claude-opus-5-5 | high | doc analysis |
34
+ | orc-planner-opus-5-med | claude-opus-5-5 | medium | planning |
35
+ | orc-reviewer-opus-5-low | claude-opus-5-5 | low | review (medium until v2.1.0; renamed from orc-reviewer-opus-5-med) |
36
+ | orc-verifier-opus-5-med | claude-opus-5-5 | medium | verify (+ /orc-verify) |
37
+ | orc-test-author-opus-5-med | claude-opus-5-5 | medium | test authoring (opt-in Phase 6.5; writes tests, never runs) |
38
+ | orc-analyze-mini-sonnet-5-high | claude-sonnet-5-5 | high | mini analysis |
39
+ | orc-planner-mini-sonnet-5-high | claude-sonnet-5-5 | high | mini planning |
40
+ | orc-scout-sonnet-4-6-high | claude-sonnet-4-6 | high | deep-analysis code scout (read-only) |
41
+ | orc-recon-sonnet-5-med | claude-sonnet-5-5 | medium | answer ONE repository question with file:line evidence (/orc-quick read-only entries; never edits, never plans) |
42
+ | orc-recon-opus-5-low | claude-opus-5-5 | low | the same contract for a WIDE or SUBTLE question — a blast radius across areas, a defect with no obvious anchor |
43
+ | orc-context-combiner-opus-5-high | claude-opus-5-5 | high | combine 2+ related analyses (full lane) |
44
+ | orc-pattern-codifier-sonnet-5-high | claude-sonnet-5-5 | high | reconcile per-language playbook vs. project files → cached code-pattern (opt-in) |
45
+ | orc-retro-sonnet-5-high | claude-sonnet-5-5 | high | mine behavior traces → calibration report (/orc-retro; read-only) |
46
+ | orc-wiki-scanner-opus-5-low | claude-opus-5-5 | low | scan ONE wiki coverage area → evidence-anchored doc body + crosslink tags (/orc-wiki only; read-only against the project). The DEEP half of the tier ladder: first scan · STRUCTURAL · wide delta · a new exported symbol |
47
+ | orc-wiki-scanner-sonnet-5-high | claude-sonnet-5-5 | high | the LIGHT half of the same ladder — an existing doc whose covered files moved by a small, no-new-surface delta. IDENTICAL return contract; it escalates with `needs_context` rather than under-delivering. Never used for a first scan |
48
+ | orc-executor-opus-5-med | claude-opus-5-5 | medium | the `[90,100]` band in BOTH tables |
49
+ | orc-executor-opus-5-low | claude-opus-5-5 | low | the default table's `[41,90)`, `opus5_only`'s `[0,90)`, and the forced mini/fast executor |
50
+ | orc-advisor-opus-5-xhigh | claude-opus-5-5 | xhigh | ultra Phase U0 advisory brief + rubric + clarification questions (read-only; /orc-ultra only) |
51
+ | orc-judge-opus-5-xhigh | claude-opus-5-5 | xhigh | ultra judgment gates — analysis / plan / implementation (read-only; /orc-ultra only) |
52
+ | orc-learn-writer-opus-5-low | claude-opus-5-5 | low | deepen ONE feature → learning-docs/<slug>/ (/orc-learn only; git-ignored output) |
53
+ | orc-claude-writer-opus-5-low | claude-opus-5-5 | low | scan repo → write/refresh the local CLAUDE.md (/orc-claude only; zero questions) |
54
+ | orc-challenge-judge-opus-5-high | claude-opus-5-5 | high | grade ONE finished artifact against a FROZEN goal + template (/orc-challenge only; read-only). It reports findings and can never declare a pass — `orc challenge record` computes that |
55
+ | orc-challenge-advisor-opus-5-med | claude-opus-5-5 | medium | turn a FAILED verdict into a remediation strategy — root-cause groups, an order with reasons, the decisions that are not defects (/orc-challenge only; read-only, no prose, no diffs) |
56
+ | orc-challenge-reader-opus-5-low | claude-opus-5-5 | low | the COLD READ: answer questions from ONE artifact with `Read` and nothing else (/orc-challenge only). LOW ON PURPOSE — a harder-thinking reader reasons around the gaps D4 exists to find, so a stronger configuration is a worse instrument |
57
+ | orc-challenge-contrarian-opus-5-high | claude-opus-5-5 | high | THE COUNCIL: start from "this has a fatal flaw" and go find it — load-bearing claim, then unhappy path, then second-order (/orc-challenge only; read-only). HIGH IS THE INSTRUMENT: a shallow contrarian returns the three surface complaints the free lint already caught |
58
+ | orc-challenge-outsider-opus-5-low | claude-opus-5-5 | low | THE COUNCIL: what does this page assume you already know? The TIGHTEST slice in the lane — the artifact and this protocol, `Read` only, no goal, no audience, no template (/orc-challenge only). LOW IS A MEASUREMENT, NOT A COST CHOICE: a harder-thinking outsider reasons its way around an unexplained acronym and reports the document is fine. NOTHING MAY UPGRADE IT |
59
+ | orc-challenge-executor-opus-5-med | claude-opus-5-5 | medium | THE COUNCIL: can this be started on Monday, and where is the first step? Returns D6/D2 findings plus the literal `monday_morning` list — or the point at which writing it becomes impossible (/orc-challenge only; read-only, `Bash` to CHECK a prerequisite, never to change anything). Not an ORC build executor — it writes nothing |
60
+ | orc-challenge-principles-opus-5-high | claude-opus-5-5 | high | THE COUNCIL: the ONLY role allowed to say the frozen goal is wrong. Returns `premise` objects — no severity, never in findings[], never near the pass gate — and its report NEVER reaches the judge (/orc-challenge only; read-only). HIGH because rebuilding a problem statement from the ground up is the deepest reasoning in the lane |
61
+ | orc-challenge-expansionist-opus-5-med | claude-opus-5-5 | medium | THE COUNCIL: the only lens not looking for a defect — what is being undervalued? Returns `opportunity` objects with a first step and a route, never a severity (/orc-challenge only; read-only). MEDIUM because it is pattern work against a concrete artifact, the same class as the advisor |
62
+ | orc-doc-writer-opus-5-med | claude-opus-5-5 | medium | write ONE part file of a long document from a slice of sections (/orc-doc only). It writes to `.work/<id>.md` and NEVER opens document.md — that is what makes parallel writing safe here |
63
+ | orc-doc-checker-opus-5-low | claude-opus-5-5 | low | read ONE LINE RANGE of a document and report anchored findings (/orc-doc only; read-only). LOW ON PURPOSE — the same reasoning that pins the challenge cold reader: a harder-thinking checker reasons its way past a gap a real reader would trip on |
64
+ | orc-test-designer-opus-5-high | claude-opus-5-5 | high | fill the GAPS the free case matrix could not derive, and author the front-end journey SCRIPT (/orc-test only). HIGH IS THE INSTRUMENT: a shallow designer returns the three obvious cases the deterministic expansion already covered, which is the one output that costs money and adds nothing |
65
+ | orc-test-interpreter-opus-5-low | claude-opus-5-5 | low | read ONLY a run’s evidence files and say whether what is in them is a finding (/orc-test only; SEALED slice, `Read` and nothing else). LOW IS A MEASUREMENT CHOICE, NOT A COST ONE, and nothing may ever upgrade it: a harder-thinking interpreter reasons its way to why a leaked stack trace is probably fine in staging |
66
+ | orc-trace-writer-haiku-5-high | claude-haiku-5-5 | high | append one phase block of behavior-trace narration from an orchestrator packet (every trace-owning lane; append-only, never reads source) |
67
+ | orc-graph-noter-haiku-5-high | claude-haiku-5-5 | high | write ONE sentence per changed function for the local code graph (`orc graph` Layer 2). Reads line RANGES only, pipes its notes to `orc graph notes apply -` (the CLI validates and stores), returns ONE line. Dispatched by code-changing lanes only when `code_graph_notes` is on and a batch reaches its minimum |
68
+
69
+ ## Opus-5-only mode agents (hard-gated; dispatched only when `opus5_only: true`)
70
+
71
+ `opus5_only` FORCES every dispatched role onto `claude-opus-5-5`, with effort as
72
+ the only cost dial. Each agent below replaces its default with the same slice
73
+ and the same return contract. Effort is PINNED per role — no CLI rewrites
74
+ these. Full mapping + precedence:
75
+ `../skills/_shared/opus5-only.md`.
76
+
77
+ | Agent | Model | Effort | Replaces |
78
+ |-------|-------|--------|----------|
79
+ | orc-executor-opus-5-low | claude-opus-5-5 | low | the `[0,90)` band · orc-mini's and orc-fast's fixed executor |
80
+ | orc-executor-opus-5-med | claude-opus-5-5 | medium | the `[90,100]` band |
81
+ | orc-analyze-mini-opus-5-med | claude-opus-5-5 | medium | orc-analyze-mini-sonnet-5-high |
82
+ | orc-planner-mini-opus-5-med | claude-opus-5-5 | medium | orc-planner-mini-sonnet-5-high |
83
+ | orc-scout-opus-5-low | claude-opus-5-5 | low | orc-scout-sonnet-4-6-high |
84
+ | orc-pattern-codifier-opus-5-med | claude-opus-5-5 | medium | orc-pattern-codifier-sonnet-5-high |
85
+ | orc-wiki-scanner-opus-5-low | claude-opus-5-5 | low | orc-wiki-scanner-sonnet-5-high |
86
+ | orc-retro-opus-5-med | claude-opus-5-5 | medium | orc-retro-sonnet-5-high |
87
+
88
+ The eleven roles already on `claude-opus-5-5` — analyst, planner, reviewer,
89
+ verifier, test-author, combiner, learn-writer, advisor, judge, CLAUDE.md
90
+ writer, deep wiki scanner — dispatch
91
+ unchanged under this mode. **Never forced:** `orc-trace-writer-haiku-5-high` (it
92
+ transcribes a packet, no reasoning) and orc-diy (its table is compile-owned).
93
+ **Not dispatched at all:** `orc-graph-noter-haiku-5-high` has NO Opus 5.5
94
+ variant. Under this mode a lane skips graph notes and prints
95
+ `graph notes: skipped (opus5_only)` — a one-sentence summary does not justify an
96
+ Opus 5.5 dispatch, and the graph's structure layer costs no model at all.
97
+
98
+ Mini execution reuses orc-executor-sonnet-5-high. Fast-lane (orc-fast)
99
+ execution reuses orc-executor-sonnet-5-med — no dedicated agent. Under
100
+ `opus5_only` both reuse orc-executor-opus-5-low.
101
+
102
+ ## orc-quick — the user picks, and no config can override it
103
+
104
+ `/orc-quick` has NO dedicated agent and NO score table. It asks the USER which
105
+ agent to spawn before EVERY dispatch, and reuses shipped agents:
106
+
107
+ | Dispatch kind | Offered | Hook-traced |
108
+ |---|---|---|
109
+ | writes code | orc-executor-sonnet-5-med · orc-executor-opus-5-low | yes |
110
+ | read-only recon | orc-recon-sonnet-5-med · orc-recon-opus-5-low · or `other — name a model` | yes · yes · no |
111
+ | review | orc-reviewer-opus-5-low · or ad-hoc | yes / no |
112
+
113
+ The only dispatch it does not re-ask is build-repair rounds 1–2, which reuse the
114
+ executor the user already chose for that entry; round 3 asks again.
115
+
116
+ **`opus5_only` and `rubric_bands_override` are both INERT in this lane** — they would silently collapse the user's choice. It is
117
+ the one exception to `opus5_only`'s otherwise flat precedence. See
118
+ `skills/_shared/opus5-only.md` and `skills/orc-quick/references/dispatch-gate.md`.
119
+
120
+ **Recon is a pinned PAIR; `other` is the ad-hoc escape hatch.** The
121
+ pair exists because the trace hook only sees an agent whose name starts with
122
+ `orc-`: an ad-hoc recon writes no SPAWN/RETURN, is invisible to
123
+ `orc run inflight`, and cannot be counted by `/orc-retro`. The two files share
124
+ ONE return contract, so the choice is a model choice and nothing else.
125
+
126
+ The escape hatch names **a model only**. The Agent tool takes a per-call model
127
+ and has no per-call effort knob, so the old "ad-hoc model + effort" menu offered
128
+ a setting that did not exist; effort follows the session. An `other` dispatch is
129
+ still not hook-traced — the lane writes its own `DISPATCH … adhoc=true` /
130
+ `VERIFY` lines and still runs the downgrade check from the agent's self-reported
131
+ `actual_model`, and only `/orc-retro` aggregation misses it.
132
+
133
+ The scout is dispatched only in the System Analyst's DEEP mode: the orchestrator
134
+ fans out ≤`config.max_scouts` (default 3) parallel scouts, one per coverage area
135
+ from the analyst's scout plan, and feeds their evidence bundles back to the
136
+ analyst for pass 2. Scouts are read-only and never analyze/plan/edit.
137
+
138
+ The orchestrator (main session) is NOT an agent file.
139
+
140
+ ## ⚠ VERIFY IN YOUR ENVIRONMENT
141
+
142
+ Model IDs use the Platform/API dateless format (confirmed at
143
+ platform.claude.com/docs/en/about-claude/models/model-ids-and-versions):
144
+ claude-haiku-5-5, claude-sonnet-4-6, claude-sonnet-5-5, claude-opus-4-7,
145
+ claude-opus-4-8 and claude-opus-5-5 (the top executor band + the core fixed
146
+ roles). **Sonnet 5 runs on `claude-sonnet-5-5` since v2.1.0** — the agent names
147
+ keep `-sonnet-5-` (a point release in one family keeps the name, as Opus did in
148
+ v1.9.2), and `claude-sonnet-5` stays a valid config value.
149
+
150
+ 1. **Run `/agents`** to confirm Claude Code accepts these full IDs in agent
151
+ frontmatter — in particular `claude-haiku-5-5` and `claude-opus-5-5`. If it
152
+ wants short aliases (opus/sonnet/haiku) or dated IDs, adjust
153
+ each `model:` field. The full IDs are valid at the API level but Claude Code
154
+ may normalize differently.
155
+ 2. **Confirm `effort:` is a valid CLI frontmatter field.** If the CLI ignores
156
+ it, effort must be conveyed in the dispatched prompt instead.
157
+ 3. **Run `/doctor`** for duplicate-name or load errors after any edit.
158
+
159
+ ## ⚠ COST-TIER FALLBACK (the original "wrong model" bug)
160
+
161
+ A subagent's model cannot exceed the MAIN session's cost tier — request pricier
162
+ and it silently falls back to the main model. **Run your main Claude Code
163
+ session on Opus** or every opus-* agent downgrades to Sonnet. Every executor
164
+ band from score 41 (`[41,90)` and `[90,100]`) AND every core fixed role (analyst, planner, reviewer,
165
+ verifier, test author, combiner, learn writer, ultra advisor/judge) are pinned
166
+ to **claude-opus-5-5** — on an Opus 4.8 session they all land on Opus 4.8. Verify by
167
+ expanding a subagent's tool-call in the transcript to see the model it ran.
168
+
169
+ ## How dispatch works
170
+
171
+ - Score a task → config preset maps score to an executor agent → dispatch that
172
+ agent BY NAME with the task slice.
173
+ - Fixed roles dispatch their named agent directly (analyst/planner/reviewer/
174
+ verifier, mini variants).
175
+ - Every agent is single-role and self-contained (embedded procedure), so a
176
+ dispatched agent needs no external skill-loading to function.
@@ -1,8 +1,9 @@
1
1
  ---
2
- name: orc-executor-haiku-4-5
2
+ name: orc-executor-haiku-5-high
3
3
  description: >
4
- ORC executor — claude-haiku-4-5 (no effort ladder). Dispatched by the build lanes at execution for ONE task, score band none (opt-in only, see MODEL-MAPPING.md).
5
- model: claude-haiku-4-5
4
+ ORC executor — claude-haiku-5-5, high effort. Dispatched by the build lanes at execution for ONE task, score band none (opt-in only, see MODEL-MAPPING.md).
5
+ model: claude-haiku-5-5
6
+ effort: high
6
7
  tools: Read, Write, Edit, Bash, Glob, Grep
7
8
  ---
8
9
 
@@ -53,6 +54,10 @@ never spawn other agents, never work outside your task slice.
53
54
  absent. Present = you must show the bug is real BEFORE you fix it: kind `test`
54
55
  when the project has a runner, `command` when it has none. Absent = this task
55
56
  is not a defect report; never invent a reproduction nobody asked for
57
+ - graph_anchors — up to 12 `path:a-b` ranges the dig found, and one `read all:`
58
+ command, or absent; it may end with a fenced block that carries the code of
59
+ every range. Present → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. A file you will EDIT is still read in
60
+ full first (read-ladder exception 1). The inline code and the ranges are real bytes of the current blob.
56
61
  - worktree_path — work here if set, else the current tree
57
62
 
58
63
  ## Procedure (embedded — self-contained)
@@ -60,7 +65,8 @@ never spawn other agents, never work outside your task slice.
60
65
  2. Read spec_ref if provided.
61
66
  2a. Read discipline — `.claude/skills/_shared/read-ladder.md` IS the rule, its
62
67
  two exceptions are the only ones, and it holds the rest of this step.
63
- - Step 0 before any Grep: `orc graph ctx <symbol|file> --if-enabled --json --brief`;
68
+ - Step 0: the slice carries `graph_anchors` → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. Then, for a symbol the anchors do not cover, before any Grep:
69
+ `orc graph ctx <symbol|file> --if-enabled --json --brief`;
64
70
  add `--source` for the card AND the range's lines in one call. A file you
65
71
  will EDIT is still read IN FULL with Read first. Exit 3 = graph off, skip
66
72
  step 0 for the rest of the task.
@@ -89,6 +95,12 @@ never spawn other agents, never work outside your task slice.
89
95
  4. Run the proof: if the project has a runnable build/test, run it for your
90
96
  changes and capture {command, exit_code, last ~5 output lines} VERBATIM —
91
97
  never paraphrased, never predicted. No runner → no_runner_detected: true.
98
+ Coverage: when the project asks for a coverage level, run the coverage ONCE
99
+ for your own files only (`--collectCoverageFrom=<each file you changed>` and
100
+ the text reporter), read the uncovered lines from that text table, add the
101
+ tests that cover them, and run it once more. Never grep lcov or the jest
102
+ cache, and never probe the test transformer or its internals. A gap that is
103
+ still open after the second run goes in unmet[] with the file and lines.
92
104
  5. Self-check: re-read your diff against every acceptance[] line and every
93
105
  constraint. Anything you could not satisfy goes in unmet[] — a non-empty
94
106
  unmet[] means status partial (or failed), never done.
@@ -128,12 +140,13 @@ never spawn other agents, never work outside your task slice.
128
140
  did, never what you were handed. `none` is a valid, useful answer — it says
129
141
  those pages did not help; never claim a read to look thorough. Omit only when
130
142
  the slice carried no wiki material.
131
- - graph_used — REQUIRED when the slice carried `orc graph ctx` cards or you ran
132
- `orc graph ctx` yourself: `{targets, generation}` — the card targets you ACTUALLY used (or
133
- `none`) and the `generation` number the cards carry, copied from the card's own JSON. A card
143
+ - graph_used — REQUIRED when the slice carried `graph_anchors` or you ran
144
+ `orc graph ctx` yourself: `{targets, generation}` — the anchors (`path:a-b`) or the
145
+ card targets you ACTUALLY used (or `none`) and the `generation` number the slice or card
146
+ carries, copied from its own header or JSON. A card
134
147
  is a LOCATOR — read the range it names before you rely on behaviour, and trust a card whose
135
148
  header says CHANGED, or one whose header names a `coverage` gap, as a hint only. `none` is a
136
- valid answer; never claim a card helped to look thorough. Omit only when the slice carried no cards.
149
+ valid answer; never claim anchors or a card helped to look thorough. Omit only when the slice carried no anchors and you ran no `ctx`.
137
150
  - repro — REQUIRED when the slice carried `repro.required: true`; absent
138
151
  otherwise. Either {command, before: {exit_code, tail}, after: {exit_code,
139
152
  tail}} quoted VERBATIM from the two runs, or `none` + a one-line reason.
@@ -54,6 +54,10 @@ never spawn other agents, never work outside your task slice.
54
54
  absent. Present = you must show the bug is real BEFORE you fix it: kind `test`
55
55
  when the project has a runner, `command` when it has none. Absent = this task
56
56
  is not a defect report; never invent a reproduction nobody asked for
57
+ - graph_anchors — up to 12 `path:a-b` ranges the dig found, and one `read all:`
58
+ command, or absent; it may end with a fenced block that carries the code of
59
+ every range. Present → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. A file you will EDIT is still read in
60
+ full first (read-ladder exception 1). The inline code and the ranges are real bytes of the current blob.
57
61
  - worktree_path — work here if set, else the current tree
58
62
 
59
63
  ## Procedure (embedded — self-contained)
@@ -61,7 +65,8 @@ never spawn other agents, never work outside your task slice.
61
65
  2. Read spec_ref if provided.
62
66
  2a. Read discipline — `.claude/skills/_shared/read-ladder.md` IS the rule, its
63
67
  two exceptions are the only ones, and it holds the rest of this step.
64
- - Step 0 before any Grep: `orc graph ctx <symbol|file> --if-enabled --json --brief`;
68
+ - Step 0: the slice carries `graph_anchors` → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. Then, for a symbol the anchors do not cover, before any Grep:
69
+ `orc graph ctx <symbol|file> --if-enabled --json --brief`;
65
70
  add `--source` for the card AND the range's lines in one call. A file you
66
71
  will EDIT is still read IN FULL with Read first. Exit 3 = graph off, skip
67
72
  step 0 for the rest of the task.
@@ -90,6 +95,12 @@ never spawn other agents, never work outside your task slice.
90
95
  4. Run the proof: if the project has a runnable build/test, run it for your
91
96
  changes and capture {command, exit_code, last ~5 output lines} VERBATIM —
92
97
  never paraphrased, never predicted. No runner → no_runner_detected: true.
98
+ Coverage: when the project asks for a coverage level, run the coverage ONCE
99
+ for your own files only (`--collectCoverageFrom=<each file you changed>` and
100
+ the text reporter), read the uncovered lines from that text table, add the
101
+ tests that cover them, and run it once more. Never grep lcov or the jest
102
+ cache, and never probe the test transformer or its internals. A gap that is
103
+ still open after the second run goes in unmet[] with the file and lines.
93
104
  5. Self-check: re-read your diff against every acceptance[] line and every
94
105
  constraint. Anything you could not satisfy goes in unmet[] — a non-empty
95
106
  unmet[] means status partial (or failed), never done.
@@ -129,12 +140,13 @@ never spawn other agents, never work outside your task slice.
129
140
  did, never what you were handed. `none` is a valid, useful answer — it says
130
141
  those pages did not help; never claim a read to look thorough. Omit only when
131
142
  the slice carried no wiki material.
132
- - graph_used — REQUIRED when the slice carried `orc graph ctx` cards or you ran
133
- `orc graph ctx` yourself: `{targets, generation}` — the card targets you ACTUALLY used (or
134
- `none`) and the `generation` number the cards carry, copied from the card's own JSON. A card
143
+ - graph_used — REQUIRED when the slice carried `graph_anchors` or you ran
144
+ `orc graph ctx` yourself: `{targets, generation}` — the anchors (`path:a-b`) or the
145
+ card targets you ACTUALLY used (or `none`) and the `generation` number the slice or card
146
+ carries, copied from its own header or JSON. A card
135
147
  is a LOCATOR — read the range it names before you rely on behaviour, and trust a card whose
136
148
  header says CHANGED, or one whose header names a `coverage` gap, as a hint only. `none` is a
137
- valid answer; never claim a card helped to look thorough. Omit only when the slice carried no cards.
149
+ valid answer; never claim anchors or a card helped to look thorough. Omit only when the slice carried no anchors and you ran no `ctx`.
138
150
  - repro — REQUIRED when the slice carried `repro.required: true`; absent
139
151
  otherwise. Either {command, before: {exit_code, tail}, after: {exit_code,
140
152
  tail}} quoted VERBATIM from the two runs, or `none` + a one-line reason.
@@ -54,6 +54,10 @@ never spawn other agents, never work outside your task slice.
54
54
  absent. Present = you must show the bug is real BEFORE you fix it: kind `test`
55
55
  when the project has a runner, `command` when it has none. Absent = this task
56
56
  is not a defect report; never invent a reproduction nobody asked for
57
+ - graph_anchors — up to 12 `path:a-b` ranges the dig found, and one `read all:`
58
+ command, or absent; it may end with a fenced block that carries the code of
59
+ every range. Present → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. A file you will EDIT is still read in
60
+ full first (read-ladder exception 1). The inline code and the ranges are real bytes of the current blob.
57
61
  - worktree_path — work here if set, else the current tree
58
62
 
59
63
  ## Procedure (embedded — self-contained)
@@ -61,7 +65,8 @@ never spawn other agents, never work outside your task slice.
61
65
  2. Read spec_ref if provided.
62
66
  2a. Read discipline — `.claude/skills/_shared/read-ladder.md` IS the rule, its
63
67
  two exceptions are the only ones, and it holds the rest of this step.
64
- - Step 0 before any Grep: `orc graph ctx <symbol|file> --if-enabled --json --brief`;
68
+ - Step 0: the slice carries `graph_anchors` → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. Then, for a symbol the anchors do not cover, before any Grep:
69
+ `orc graph ctx <symbol|file> --if-enabled --json --brief`;
65
70
  add `--source` for the card AND the range's lines in one call. A file you
66
71
  will EDIT is still read IN FULL with Read first. Exit 3 = graph off, skip
67
72
  step 0 for the rest of the task.
@@ -90,6 +95,12 @@ never spawn other agents, never work outside your task slice.
90
95
  4. Run the proof: if the project has a runnable build/test, run it for your
91
96
  changes and capture {command, exit_code, last ~5 output lines} VERBATIM —
92
97
  never paraphrased, never predicted. No runner → no_runner_detected: true.
98
+ Coverage: when the project asks for a coverage level, run the coverage ONCE
99
+ for your own files only (`--collectCoverageFrom=<each file you changed>` and
100
+ the text reporter), read the uncovered lines from that text table, add the
101
+ tests that cover them, and run it once more. Never grep lcov or the jest
102
+ cache, and never probe the test transformer or its internals. A gap that is
103
+ still open after the second run goes in unmet[] with the file and lines.
93
104
  5. Self-check: re-read your diff against every acceptance[] line and every
94
105
  constraint. Anything you could not satisfy goes in unmet[] — a non-empty
95
106
  unmet[] means status partial (or failed), never done.
@@ -129,12 +140,13 @@ never spawn other agents, never work outside your task slice.
129
140
  did, never what you were handed. `none` is a valid, useful answer — it says
130
141
  those pages did not help; never claim a read to look thorough. Omit only when
131
142
  the slice carried no wiki material.
132
- - graph_used — REQUIRED when the slice carried `orc graph ctx` cards or you ran
133
- `orc graph ctx` yourself: `{targets, generation}` — the card targets you ACTUALLY used (or
134
- `none`) and the `generation` number the cards carry, copied from the card's own JSON. A card
143
+ - graph_used — REQUIRED when the slice carried `graph_anchors` or you ran
144
+ `orc graph ctx` yourself: `{targets, generation}` — the anchors (`path:a-b`) or the
145
+ card targets you ACTUALLY used (or `none`) and the `generation` number the slice or card
146
+ carries, copied from its own header or JSON. A card
135
147
  is a LOCATOR — read the range it names before you rely on behaviour, and trust a card whose
136
148
  header says CHANGED, or one whose header names a `coverage` gap, as a hint only. `none` is a
137
- valid answer; never claim a card helped to look thorough. Omit only when the slice carried no cards.
149
+ valid answer; never claim anchors or a card helped to look thorough. Omit only when the slice carried no anchors and you ran no `ctx`.
138
150
  - repro — REQUIRED when the slice carried `repro.required: true`; absent
139
151
  otherwise. Either {command, before: {exit_code, tail}, after: {exit_code,
140
152
  tail}} quoted VERBATIM from the two runs, or `none` + a one-line reason.
@@ -54,6 +54,10 @@ never spawn other agents, never work outside your task slice.
54
54
  absent. Present = you must show the bug is real BEFORE you fix it: kind `test`
55
55
  when the project has a runner, `command` when it has none. Absent = this task
56
56
  is not a defect report; never invent a reproduction nobody asked for
57
+ - graph_anchors — up to 12 `path:a-b` ranges the dig found, and one `read all:`
58
+ command, or absent; it may end with a fenced block that carries the code of
59
+ every range. Present → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. A file you will EDIT is still read in
60
+ full first (read-ladder exception 1). The inline code and the ranges are real bytes of the current blob.
57
61
  - worktree_path — work here if set, else the current tree
58
62
 
59
63
  ## Procedure (embedded — self-contained)
@@ -61,7 +65,8 @@ never spawn other agents, never work outside your task slice.
61
65
  2. Read spec_ref if provided.
62
66
  2a. Read discipline — `.claude/skills/_shared/read-ladder.md` IS the rule, its
63
67
  two exceptions are the only ones, and it holds the rest of this step.
64
- - Step 0 before any Grep: `orc graph ctx <symbol|file> --if-enabled --json --brief`;
68
+ - Step 0: the slice carries `graph_anchors` → `graph_anchors` may carry the code of its EDIT-SITE ranges (edit target, router, caller) inline — use it as already read; do NOT read those ranges again. Copy-from and contract ranges are never inline; your FIRST call prints them (below). With `graph_anchors`, a wiki page is OPTIONAL: read it only for a business rule that the requirement, the anchors and the code do not settle. Your FIRST call prints EVERY range in `graph_anchors` in ONE shell command — the `read all:` line when present, else one `sed -n 'a,bp' <file>` per range joined with `;` and an `echo == <file>:<a>-<b>` header each. Then read further only for what those ranges do not show; do not `cat` a whole anchored file over 150 lines. Then, for a symbol the anchors do not cover, before any Grep:
69
+ `orc graph ctx <symbol|file> --if-enabled --json --brief`;
65
70
  add `--source` for the card AND the range's lines in one call. A file you
66
71
  will EDIT is still read IN FULL with Read first. Exit 3 = graph off, skip
67
72
  step 0 for the rest of the task.
@@ -90,6 +95,12 @@ never spawn other agents, never work outside your task slice.
90
95
  4. Run the proof: if the project has a runnable build/test, run it for your
91
96
  changes and capture {command, exit_code, last ~5 output lines} VERBATIM —
92
97
  never paraphrased, never predicted. No runner → no_runner_detected: true.
98
+ Coverage: when the project asks for a coverage level, run the coverage ONCE
99
+ for your own files only (`--collectCoverageFrom=<each file you changed>` and
100
+ the text reporter), read the uncovered lines from that text table, add the
101
+ tests that cover them, and run it once more. Never grep lcov or the jest
102
+ cache, and never probe the test transformer or its internals. A gap that is
103
+ still open after the second run goes in unmet[] with the file and lines.
93
104
  5. Self-check: re-read your diff against every acceptance[] line and every
94
105
  constraint. Anything you could not satisfy goes in unmet[] — a non-empty
95
106
  unmet[] means status partial (or failed), never done.
@@ -129,12 +140,13 @@ never spawn other agents, never work outside your task slice.
129
140
  did, never what you were handed. `none` is a valid, useful answer — it says
130
141
  those pages did not help; never claim a read to look thorough. Omit only when
131
142
  the slice carried no wiki material.
132
- - graph_used — REQUIRED when the slice carried `orc graph ctx` cards or you ran
133
- `orc graph ctx` yourself: `{targets, generation}` — the card targets you ACTUALLY used (or
134
- `none`) and the `generation` number the cards carry, copied from the card's own JSON. A card
143
+ - graph_used — REQUIRED when the slice carried `graph_anchors` or you ran
144
+ `orc graph ctx` yourself: `{targets, generation}` — the anchors (`path:a-b`) or the
145
+ card targets you ACTUALLY used (or `none`) and the `generation` number the slice or card
146
+ carries, copied from its own header or JSON. A card
135
147
  is a LOCATOR — read the range it names before you rely on behaviour, and trust a card whose
136
148
  header says CHANGED, or one whose header names a `coverage` gap, as a hint only. `none` is a
137
- valid answer; never claim a card helped to look thorough. Omit only when the slice carried no cards.
149
+ valid answer; never claim anchors or a card helped to look thorough. Omit only when the slice carried no anchors and you ran no `ctx`.
138
150
  - repro — REQUIRED when the slice carried `repro.required: true`; absent
139
151
  otherwise. Either {command, before: {exit_code, tail}, after: {exit_code,
140
152
  tail}} quoted VERBATIM from the two runs, or `none` + a one-line reason.