@azure-id/orc 1.9.0 → 1.9.2

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 (134) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README-id.md +57 -59
  3. package/README.md +53 -54
  4. package/bin/build-agents.js +109 -109
  5. package/bin/cli.js +262 -58
  6. package/bin/graph-audit.js +235 -0
  7. package/bin/graph-extract.js +308 -3
  8. package/bin/graph-gain.js +23 -3
  9. package/bin/graph-map.js +9 -1
  10. package/bin/graph-query.js +152 -10
  11. package/bin/graph-shard.js +6 -1
  12. package/bin/graph-signals.js +287 -4
  13. package/bin/graph.js +717 -658
  14. package/bin/onboarding-content.js +4 -4
  15. package/bin/pricing.json +207 -200
  16. package/bin/verify-contracts.js +117 -2
  17. package/bin/verify-package.js +11 -7
  18. package/bin/webui/css/04-motion.css +162 -152
  19. package/bin/webui/css/panels/knowledge.css +563 -116
  20. package/bin/webui/fixtures/extra.js +2036 -2036
  21. package/bin/webui/fixtures/hookui.js +5 -5
  22. package/bin/webui/fixtures/knowledge.js +21 -4
  23. package/bin/webui/fixtures/settings.js +305 -305
  24. package/bin/webui/i18n/en/knowledge.json +122 -4
  25. package/bin/webui/i18n/id/knowledge.json +122 -4
  26. package/bin/webui/js/panels/knowledge.js +573 -9
  27. package/bin/webui/js/panels/overview.js +13 -4
  28. package/mock-run/context-combiner.md +100 -100
  29. package/mock-run/orc-budget.md +534 -534
  30. package/mock-run/orc-challenge-council.md +262 -262
  31. package/mock-run/orc-ultra.md +103 -103
  32. package/package.json +1 -1
  33. package/templates/agents/MODEL-MAPPING.md +43 -43
  34. package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -56
  35. package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -60
  36. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -58
  37. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -75
  38. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -110
  39. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -114
  40. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -112
  41. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -132
  42. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -109
  43. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -109
  44. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -90
  45. package/templates/agents/orc-claude-writer-opus-5-med.md +55 -55
  46. package/templates/agents/orc-context-combiner-opus-5-high.md +88 -88
  47. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -108
  48. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -134
  49. package/templates/agents/orc-executor-haiku-4-5.md +2 -1
  50. package/templates/agents/orc-executor-opus-4-7-high.md +2 -1
  51. package/templates/agents/orc-executor-opus-4-7-med.md +2 -1
  52. package/templates/agents/orc-executor-opus-4-8-high.md +2 -1
  53. package/templates/agents/orc-executor-opus-5-high.md +4 -3
  54. package/templates/agents/orc-executor-opus-5-low.md +4 -3
  55. package/templates/agents/orc-executor-opus-5-med.md +4 -3
  56. package/templates/agents/orc-executor-sonnet-4-6-high.md +2 -1
  57. package/templates/agents/orc-executor-sonnet-4-6-med.md +2 -1
  58. package/templates/agents/orc-executor-sonnet-5-high.md +2 -1
  59. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -1
  60. package/templates/agents/orc-judge-opus-5-xhigh.md +85 -85
  61. package/templates/agents/orc-learn-writer-opus-5-low.md +73 -73
  62. package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -65
  63. package/templates/agents/orc-planner-mini-opus-5-med.md +4 -4
  64. package/templates/agents/orc-planner-mini-sonnet-5-high.md +1 -1
  65. package/templates/agents/orc-planner-opus-5-med.md +160 -160
  66. package/templates/agents/orc-recon-opus-5-low.md +18 -8
  67. package/templates/agents/orc-recon-sonnet-4-6-med.md +15 -5
  68. package/templates/agents/orc-retro-opus-5-med.md +3 -3
  69. package/templates/agents/orc-reviewer-opus-5-med.md +60 -60
  70. package/templates/agents/orc-scout-opus-5-low.md +40 -40
  71. package/templates/agents/orc-system-analyst-opus-5-high.md +120 -120
  72. package/templates/agents/orc-test-author-opus-5-med.md +71 -71
  73. package/templates/agents/orc-test-designer-opus-5-high.md +158 -158
  74. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -130
  75. package/templates/agents/orc-verifier-opus-5-med.md +69 -69
  76. package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -81
  77. package/templates/commands/orc-ultra.md +17 -17
  78. package/templates/commands/orc-verify.md +11 -11
  79. package/templates/hooks/README.md +13 -3
  80. package/templates/hooks/orc-effort-guard.js +178 -178
  81. package/templates/hooks/orc-graph-hook.js +53 -7
  82. package/templates/hooks/orc-statusline.js +6 -6
  83. package/templates/skills/_shared/code-graph.md +57 -18
  84. package/templates/skills/_shared/config-precedence.md +198 -198
  85. package/templates/skills/_shared/extra-dispatch.md +1346 -1346
  86. package/templates/skills/_shared/opus5-only.md +8 -8
  87. package/templates/skills/_shared/phases/analyst-gates.md +136 -136
  88. package/templates/skills/_shared/phases/execution.md +4 -4
  89. package/templates/skills/_shared/phases/planning.md +3 -3
  90. package/templates/skills/_shared/phases/preflight.md +1 -1
  91. package/templates/skills/_shared/phases/review.md +4 -2
  92. package/templates/skills/_shared/phases/ship.md +1 -1
  93. package/templates/skills/_shared/phases/trace.md +3 -2
  94. package/templates/skills/_shared/read-ladder.md +14 -1
  95. package/templates/skills/_shared/return-validation.md +1 -1
  96. package/templates/skills/context-combiner/SKILL.md +1 -1
  97. package/templates/skills/context-combiner/schemas/combined-report.md +78 -78
  98. package/templates/skills/orc/README.md +2 -2
  99. package/templates/skills/orc/SKILL.md +8 -8
  100. package/templates/skills/orc/config.md +9 -9
  101. package/templates/skills/orc/examples/full-run-mock.md +73 -73
  102. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  103. package/templates/skills/orc/references/preflight-report.md +2 -2
  104. package/templates/skills/orc/references/ultra-mode.md +3 -3
  105. package/templates/skills/orc/subskills/orc-planner/SKILL.md +2 -2
  106. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -121
  107. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -76
  108. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -45
  109. package/templates/skills/orc-analyze/SKILL.md +2 -2
  110. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -42
  111. package/templates/skills/orc-analyze/schemas/report-audit.md +83 -83
  112. package/templates/skills/orc-analyze/schemas/report-prose.md +63 -63
  113. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -78
  114. package/templates/skills/orc-challenge/README.md +142 -142
  115. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -273
  116. package/templates/skills/orc-challenge/references/council.md +315 -315
  117. package/templates/skills/orc-challenge/references/intake.md +171 -171
  118. package/templates/skills/orc-claude/SKILL.md +14 -14
  119. package/templates/skills/orc-diy/README.md +143 -143
  120. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  121. package/templates/skills/orc-doc/README.md +229 -229
  122. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -325
  123. package/templates/skills/orc-doc/references/chunking.md +527 -527
  124. package/templates/skills/orc-fast/SKILL.md +4 -4
  125. package/templates/skills/orc-learn/SKILL.md +14 -14
  126. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -61
  127. package/templates/skills/orc-mini/SKILL.md +16 -20
  128. package/templates/skills/orc-mini/references/complexity.md +25 -11
  129. package/templates/skills/orc-quick/SKILL.md +12 -13
  130. package/templates/skills/orc-quick/references/gh-mode.md +1 -1
  131. package/templates/skills/orc-quick/references/look.md +5 -5
  132. package/templates/skills/orc-verify/SKILL.md +15 -15
  133. package/templates/skills/orc-verify/examples/verify-mock.md +33 -33
  134. package/templates/skills/orc-wiki/references/extra.md +1 -1
@@ -22,11 +22,11 @@ mixed-model table:
22
22
  | `[90,100]` | `orc-executor-opus-5-med` |
23
23
 
24
24
  Two bands, sharing the 90 edge with the default table's top two rows. Since
25
- v1.0.0 the default table's high end is ALREADY Opus 5 with effort as the dial,
25
+ v1.0.0 the default table's high end is ALREADY Opus 5.5 with effort as the dial,
26
26
  so this mode differs from it only below 65 — a third band here would be a
27
27
  distinction the default table stopped making.
28
28
 
29
- **Fixed roles** — dispatch the Opus 5 variant **instead of** the default role
29
+ **Fixed roles** — dispatch the Opus 5.5 variant **instead of** the default role
30
30
  agent: same task slice, same return contract, same phase.
31
31
 
32
32
  | Role | Default agent | Opus-5-only variant |
@@ -41,14 +41,14 @@ agent: same task slice, same return contract, same phase.
41
41
  | claude write | `orc-claude-writer-opus-4-8-high` | `orc-claude-writer-opus-5-med` |
42
42
  | retro mine | `orc-retro-sonnet-5-high` | `orc-retro-opus-5-med` |
43
43
 
44
- The nine roles already pinned to `claude-opus-5` — analyst, planner, reviewer,
44
+ The nine roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
45
45
  verifier, test-author, combiner, learn-writer, advisor, judge — are already
46
46
  compliant and dispatch unchanged (their efforts are NOT rewritten by this mode).
47
47
 
48
48
  **The wiki scan tier ladder (v0.46.0) adds NO row here, and needs no new pair.**
49
49
  Off, the ladder picks deep or light per delta. ON, this mode already forces the
50
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 scanner
51
+ one shipped agent** and the ladder simply stops applying. A cheaper Opus 5.5 scanner
52
52
  variant for the light tier does not exist and must never be added: a pair for a
53
53
  tier that cannot occur while the flag is on is exactly the phantom this table
54
54
  exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
@@ -58,7 +58,7 @@ exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
58
58
  - **`orc-trace-writer-haiku-4-5` stays Haiku 4.5.** It transcribes a packet the
59
59
  orchestrator hands it — no reasoning, no source reads. It is never in the
60
60
  roster.
61
- - **`orc-graph-noter-sonnet-4-6-med` is not dispatched at all.** It has no Opus 5
61
+ - **`orc-graph-noter-sonnet-4-6-med` is not dispatched at all.** It has no Opus 5.5
62
62
  variant: under the mode a code lane skips graph notes and prints
63
63
  `graph notes: skipped (opus5_only)` (`code-graph.md` §6). The graph's structure
64
64
  layer costs no model, so nothing else about the graph changes.
@@ -73,7 +73,7 @@ exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
73
73
  the lane SAYS so at the gate (`orc-quick ignores opus5_only — both options are
74
74
  live`), because a shadowed setting must never be silent in either direction.
75
75
  - **`/orc-challenge` — UNAFFECTED, not exempt.** All three of its agents are
76
- already `claude-opus-5` (judge high, advisor medium, reader low), so the mode
76
+ already `claude-opus-5-5` (judge high, advisor medium, reader low), so the mode
77
77
  has nothing to force: zero new pairs, no rename churn, no roster row. The
78
78
  reader's `low` effort is a MEASUREMENT choice, not a cost one — a
79
79
  harder-thinking cold reader reasons around exactly the gaps D4 exists to find
@@ -102,7 +102,7 @@ mode is neither shadowed nor shadowing — it is simply **NOT CONSULTED** for th
102
102
  work extra took:
103
103
 
104
104
  - **a scored task** — an extra route row covering that score outranks the mode;
105
- every score no row covers still resolves on the Opus 5 ladder.
105
+ every score no row covers still resolves on the Opus 5.5 ladder.
106
106
  - **a POSITION** (v0.55.0 — `quick-executor`, `fast-executor`, `doc-writer`,
107
107
  `doc-checker`, `wiki-scanner-deep`, `wiki-scanner-light`) — an extra slot row
108
108
  holding that position outranks the mode's variant of that slot's agent; **a
@@ -121,7 +121,7 @@ POSITION, not the model.
121
121
  ## Tier honesty
122
122
 
123
123
  A subagent can never outrank the main session. With the mode ON, EVERY dispatch
124
- needs an Opus 5 main session — not just the top executor band. On a lower
124
+ needs an Opus 5.5 main session — not just the top executor band. On a lower
125
125
  session every role silently falls back to the session model and the tier-honesty
126
126
  rule (`return-validation.md`) reports a downgrade on **every** return. That is
127
127
  correct behavior, not a bug: hooks cannot block on model, only on effort, so the
@@ -1,136 +1,136 @@
1
- # Phase — Analyst & plan gates (id: `analyst-gates`)
2
-
3
- > **Library file.** Canonical since v1.0.0 W12; it was under the `orc` skill's
4
- > private `references/`, and other lanes already reached across into it. Read
5
- > by `orc`, `orc-analyze`, `orc-mini`. Layers declared: `core` only — single-
6
- > layer because these are the orchestrator-side gates on a returned analysis
7
- > or plan, and a trimmed lane runs fewer of them rather than different ones.
8
- > `orc lane phases <lane> --json` names the file and the layers to read.
9
-
10
- <!-- orc:layer core -->
11
- ## Reference — Analyst, Combiner & Plan Gates (orchestrator side)
12
-
13
- The orchestrator's deterministic gates around the analyst, the
14
- context-combiner, and the planner. The roles themselves are defined in
15
- `../../orc-analyze/SKILL.md`, `../../context-combiner/SKILL.md`, and
16
- `../../orc/subskills/orc-planner/SKILL.md` — this file is what YOU do around their
17
- dispatches and returns. Load at Phase 0 (analyst dispatch) and Phase 1
18
- (planner return). Emit a `GATE` trace line (pass|bounce) per check when
19
- logging.
20
-
21
- ## Deep-mode scout dispatch (yours)
22
-
23
- When the analyst runs in deep mode it returns a `scout_plan` (pass 1). You then
24
- dispatch ≤ `config.max_scouts` (default 3) parallel
25
- `orc-scout-sonnet-4-6-high` agents (`orc-scout-opus-5-low` when `opus5_only`
26
- — `../../_shared/opus5-only.md`; scouts fan out in PARALLEL, so this is the
27
- mode's largest single cost multiplier) — one coverage area each, read-only — and
28
- re-dispatch the analyst WITH their evidence bundles for pass 2. Same "return a
29
- request → you re-slice → re-dispatch" shape as `needs_context`. You never
30
- analyze; you only dispatch and relay.
31
-
32
- ## Analyst-return gates (deterministic, before any build option)
33
-
34
- 1. **Evidence spot-check:** Glob every `files[]` path in the spec +
35
- Grep-verify the quoted snippet on **EVERY quote-anchored ref, whatever its
36
- `status`** (v0.34.6). It used to check only `exists|conflict` — but the two
37
- statuses a GOOD audit most often produces are `resolved` (a challenged row
38
- the user decided) and `buildable` (the actual work), so a correctly-triaged
39
- analysis was the one the gate barely checked: a real spec had zero
40
- `exists|conflict` rows, so the mandated verification covered 0 of 5 refs and
41
- a `file:5` citing a quote that lives at `file:4` went through. It is one
42
- Grep per ref, and it is the ONLY mechanical defence against a wrong line
43
- number reaching the planner. Note the causal shape: that ref started as a
44
- line RANGE with no quote (auto-UNVERIFIED per hard rule 2); narrowing it to
45
- one line + quote was the CORRECT fix and is what introduced the off-by-one —
46
- tightening evidence granularity is itself an error surface, so the gate has
47
- to be what catches it.
48
- 2. **Derivation lint:** R# ids, statuses, and context-anchor set must match
49
- between report.md and requirement-spec.md.
50
-
51
- Any miss → bounce to the analyst with the miss list (one retry, then escalate
52
- to the user). Refuse take-into-build when the spec has open `UNVERIFIED` or
53
- lacks `scope_closed: true` (a one-Grep check).
54
-
55
- ## Combiner tracking (yours; full lane only)
56
-
57
- `context-combiner` (`orc-context-combiner-opus-5-high` — Opus 5 high, v0.34.0)
58
- merges 2+ RELATED, already-confirmed
59
- analyses from the same run into ONE combined requirement-spec before build.
60
-
61
- - **Track the analysis set:** hold the confirmed spec paths of every analysis
62
- this run in run state (survives checkpoint/resume).
63
- - When the user picks "pass to context-combiner" at orc-analyze's Phase F
64
- branch menu (offered only once 2+ analyses exist), dispatch
65
- `orc-context-combiner-opus-5-high` with that list.
66
- - The return carries `combined_spec_path` + `coverage_pct` (conservation
67
- proof — every source requirement accounted for; must be 100) + `dropped[]` +
68
- `stale_evidence[]` + `handoff_ready` — or `combined: false` if the user chose
69
- keep-separate at the combiner's relatedness challenge (then fall back to
70
- per-analysis stop/build).
71
- - Offer the build option ONLY when `handoff_ready` is true (the combiner sets
72
- it false when `coverage_pct` < 100 OR a conflict is open). On build, continue
73
- at Phase 1 with the combined spec exactly like a single requirement-spec.
74
-
75
- You never combine; you only track, dispatch, and relay.
76
-
77
- ## Spec staleness valve (Phase 1, before dispatching the planner)
78
-
79
- If the requirement-spec's `git_head` ≠ current HEAD (analysis and build in
80
- different sessions), re-run the analyst evidence spot-check (paths + quotes)
81
- BEFORE dispatching the planner; on misses offer re-analyze vs
82
- proceed-with-flagged.
83
-
84
- ## Phase 1 exit gate (deterministic, before scoring)
85
-
86
- 1. **Grounding spot-check:** Glob every path the plan marks
87
- `disposition: exists`. A task whose declared paths lack `grounding[]`
88
- entries counts as a miss.
89
- 2. **Coverage check:** recompute the planner's coverage echo — every in-scope
90
- spec R# / intent-spec DoD line must appear in ≥ 1 task's `requirements[]`;
91
- an `orphan` requirement is a miss (the user may explicitly descope instead).
92
- 3. **Graph checks:** cycle detection over `depends_on` + same-file collision
93
- over `declared_files` (two tasks sharing a file need a serializing dep or a
94
- merge). Both trivial at ≤ 20 tasks — never trust the planner's self-check
95
- alone.
96
- 4. **TDD/test-task collision (v0.34.4):** a `tdd_spec` entry whose target file
97
- is in the `declared_files` of a task whose `facets.test_surface` is
98
- `new-tests` is a miss. The paired TDD task materializes `tdd_spec` BEFORE the
99
- task it guards, so that task's planned work is already on disk and
100
- green by the time its wave opens — leaving only bad options (dispatch a
101
- no-op, silently drop promised coverage, or re-slice mid-run). The planner
102
- authored both mechanisms and folds them together itself: extend the
103
- materialized file, never re-author it.
104
- 5. **TDD disposition gate (v0.41.0)** — this gate is what lets TDD be skipped
105
- safely. Skipping a test is cheap to claim and expensive to get wrong, so
106
- every skip must be checkable, and it is checked in BOTH directions: a rule
107
- that only ever prevents tests is a rule that deletes coverage.
108
- - `disposition` outside the closed set
109
- `new-surface | behavior-change | covered-by-existing | no-behavior | no-runner`
110
- → miss. (Absent on a pre-v0.41.0 plan → derive from `kind`; never bounce an
111
- old plan — see the legacy exception below.)
112
- - `covered-by-existing` **without a resolvable `covered_by`** → miss. Glob the
113
- cited `path` exactly as check 1 does for `disposition: exists`. "A test
114
- already covers this" is the one claim that, if false, silently removes
115
- coverage the run promised.
116
- - `no-behavior` whose task has `facets.test_surface != none` → miss
117
- (self-contradiction: the planner said the surface is testable and that it
118
- isn't).
119
- - **Safety floor:** any entry that is `covered-by-existing` or `no-behavior`
120
- on a task with non-empty `facets.risk[]` → miss, no exceptions. Auth,
121
- money, migration, security, concurrency and data-integrity requirements do
122
- not ride on another test's coincidence.
123
- - `new-surface` / `behavior-change` missing `skeleton` or `given_when_then`
124
- → miss.
125
- - A disposition that DEVIATES from the derivation table in
126
- `../../orc/schemas/planning-output.md` without a `reason` → miss. The derivation
127
- is the default; departing from it is the thing that needs justifying.
128
-
129
- Any miss → the plan is malformed: bounce it back to the planner WITH the miss
130
- list (one retry), then escalate to the user. **Legacy exception:** a
131
- pre-v0.7.0 plan resumed from an old checkpoint has no `grounding[]`
132
- (pre-v0.9.0: no `requirements[]`/`spec_invariants[]`; pre-v0.41.0: no
133
- `disposition`) — resume it without the
134
- missing checks; never bounce an old plan.
135
-
136
- <!-- /orc:layer -->
1
+ # Phase — Analyst & plan gates (id: `analyst-gates`)
2
+
3
+ > **Library file.** Canonical since v1.0.0 W12; it was under the `orc` skill's
4
+ > private `references/`, and other lanes already reached across into it. Read
5
+ > by `orc`, `orc-analyze`, `orc-mini`. Layers declared: `core` only — single-
6
+ > layer because these are the orchestrator-side gates on a returned analysis
7
+ > or plan, and a trimmed lane runs fewer of them rather than different ones.
8
+ > `orc lane phases <lane> --json` names the file and the layers to read.
9
+
10
+ <!-- orc:layer core -->
11
+ ## Reference — Analyst, Combiner & Plan Gates (orchestrator side)
12
+
13
+ The orchestrator's deterministic gates around the analyst, the
14
+ context-combiner, and the planner. The roles themselves are defined in
15
+ `../../orc-analyze/SKILL.md`, `../../context-combiner/SKILL.md`, and
16
+ `../../orc/subskills/orc-planner/SKILL.md` — this file is what YOU do around their
17
+ dispatches and returns. Load at Phase 0 (analyst dispatch) and Phase 1
18
+ (planner return). Emit a `GATE` trace line (pass|bounce) per check when
19
+ logging.
20
+
21
+ ## Deep-mode scout dispatch (yours)
22
+
23
+ When the analyst runs in deep mode it returns a `scout_plan` (pass 1). You then
24
+ dispatch ≤ `config.max_scouts` (default 3) parallel
25
+ `orc-scout-sonnet-4-6-high` agents (`orc-scout-opus-5-low` when `opus5_only`
26
+ — `../../_shared/opus5-only.md`; scouts fan out in PARALLEL, so this is the
27
+ mode's largest single cost multiplier) — one coverage area each, read-only — and
28
+ re-dispatch the analyst WITH their evidence bundles for pass 2. Same "return a
29
+ request → you re-slice → re-dispatch" shape as `needs_context`. You never
30
+ analyze; you only dispatch and relay.
31
+
32
+ ## Analyst-return gates (deterministic, before any build option)
33
+
34
+ 1. **Evidence spot-check:** Glob every `files[]` path in the spec +
35
+ Grep-verify the quoted snippet on **EVERY quote-anchored ref, whatever its
36
+ `status`** (v0.34.6). It used to check only `exists|conflict` — but the two
37
+ statuses a GOOD audit most often produces are `resolved` (a challenged row
38
+ the user decided) and `buildable` (the actual work), so a correctly-triaged
39
+ analysis was the one the gate barely checked: a real spec had zero
40
+ `exists|conflict` rows, so the mandated verification covered 0 of 5 refs and
41
+ a `file:5` citing a quote that lives at `file:4` went through. It is one
42
+ Grep per ref, and it is the ONLY mechanical defence against a wrong line
43
+ number reaching the planner. Note the causal shape: that ref started as a
44
+ line RANGE with no quote (auto-UNVERIFIED per hard rule 2); narrowing it to
45
+ one line + quote was the CORRECT fix and is what introduced the off-by-one —
46
+ tightening evidence granularity is itself an error surface, so the gate has
47
+ to be what catches it.
48
+ 2. **Derivation lint:** R# ids, statuses, and context-anchor set must match
49
+ between report.md and requirement-spec.md.
50
+
51
+ Any miss → bounce to the analyst with the miss list (one retry, then escalate
52
+ to the user). Refuse take-into-build when the spec has open `UNVERIFIED` or
53
+ lacks `scope_closed: true` (a one-Grep check).
54
+
55
+ ## Combiner tracking (yours; full lane only)
56
+
57
+ `context-combiner` (`orc-context-combiner-opus-5-high` — Opus 5.5 high, v0.34.0)
58
+ merges 2+ RELATED, already-confirmed
59
+ analyses from the same run into ONE combined requirement-spec before build.
60
+
61
+ - **Track the analysis set:** hold the confirmed spec paths of every analysis
62
+ this run in run state (survives checkpoint/resume).
63
+ - When the user picks "pass to context-combiner" at orc-analyze's Phase F
64
+ branch menu (offered only once 2+ analyses exist), dispatch
65
+ `orc-context-combiner-opus-5-high` with that list.
66
+ - The return carries `combined_spec_path` + `coverage_pct` (conservation
67
+ proof — every source requirement accounted for; must be 100) + `dropped[]` +
68
+ `stale_evidence[]` + `handoff_ready` — or `combined: false` if the user chose
69
+ keep-separate at the combiner's relatedness challenge (then fall back to
70
+ per-analysis stop/build).
71
+ - Offer the build option ONLY when `handoff_ready` is true (the combiner sets
72
+ it false when `coverage_pct` < 100 OR a conflict is open). On build, continue
73
+ at Phase 1 with the combined spec exactly like a single requirement-spec.
74
+
75
+ You never combine; you only track, dispatch, and relay.
76
+
77
+ ## Spec staleness valve (Phase 1, before dispatching the planner)
78
+
79
+ If the requirement-spec's `git_head` ≠ current HEAD (analysis and build in
80
+ different sessions), re-run the analyst evidence spot-check (paths + quotes)
81
+ BEFORE dispatching the planner; on misses offer re-analyze vs
82
+ proceed-with-flagged.
83
+
84
+ ## Phase 1 exit gate (deterministic, before scoring)
85
+
86
+ 1. **Grounding spot-check:** Glob every path the plan marks
87
+ `disposition: exists`. A task whose declared paths lack `grounding[]`
88
+ entries counts as a miss.
89
+ 2. **Coverage check:** recompute the planner's coverage echo — every in-scope
90
+ spec R# / intent-spec DoD line must appear in ≥ 1 task's `requirements[]`;
91
+ an `orphan` requirement is a miss (the user may explicitly descope instead).
92
+ 3. **Graph checks:** cycle detection over `depends_on` + same-file collision
93
+ over `declared_files` (two tasks sharing a file need a serializing dep or a
94
+ merge). Both trivial at ≤ 20 tasks — never trust the planner's self-check
95
+ alone.
96
+ 4. **TDD/test-task collision (v0.34.4):** a `tdd_spec` entry whose target file
97
+ is in the `declared_files` of a task whose `facets.test_surface` is
98
+ `new-tests` is a miss. The paired TDD task materializes `tdd_spec` BEFORE the
99
+ task it guards, so that task's planned work is already on disk and
100
+ green by the time its wave opens — leaving only bad options (dispatch a
101
+ no-op, silently drop promised coverage, or re-slice mid-run). The planner
102
+ authored both mechanisms and folds them together itself: extend the
103
+ materialized file, never re-author it.
104
+ 5. **TDD disposition gate (v0.41.0)** — this gate is what lets TDD be skipped
105
+ safely. Skipping a test is cheap to claim and expensive to get wrong, so
106
+ every skip must be checkable, and it is checked in BOTH directions: a rule
107
+ that only ever prevents tests is a rule that deletes coverage.
108
+ - `disposition` outside the closed set
109
+ `new-surface | behavior-change | covered-by-existing | no-behavior | no-runner`
110
+ → miss. (Absent on a pre-v0.41.0 plan → derive from `kind`; never bounce an
111
+ old plan — see the legacy exception below.)
112
+ - `covered-by-existing` **without a resolvable `covered_by`** → miss. Glob the
113
+ cited `path` exactly as check 1 does for `disposition: exists`. "A test
114
+ already covers this" is the one claim that, if false, silently removes
115
+ coverage the run promised.
116
+ - `no-behavior` whose task has `facets.test_surface != none` → miss
117
+ (self-contradiction: the planner said the surface is testable and that it
118
+ isn't).
119
+ - **Safety floor:** any entry that is `covered-by-existing` or `no-behavior`
120
+ on a task with non-empty `facets.risk[]` → miss, no exceptions. Auth,
121
+ money, migration, security, concurrency and data-integrity requirements do
122
+ not ride on another test's coincidence.
123
+ - `new-surface` / `behavior-change` missing `skeleton` or `given_when_then`
124
+ → miss.
125
+ - A disposition that DEVIATES from the derivation table in
126
+ `../../orc/schemas/planning-output.md` without a `reason` → miss. The derivation
127
+ is the default; departing from it is the thing that needs justifying.
128
+
129
+ Any miss → the plan is malformed: bounce it back to the planner WITH the miss
130
+ list (one retry), then escalate to the user. **Legacy exception:** a
131
+ pre-v0.7.0 plan resumed from an old checkpoint has no `grounding[]`
132
+ (pre-v0.9.0: no `requirements[]`/`spec_invariants[]`; pre-v0.41.0: no
133
+ `disposition`) — resume it without the
134
+ missing checks; never bounce an old plan.
135
+
136
+ <!-- /orc:layer -->
@@ -37,7 +37,7 @@ the codifier); hold resolved patterns in run state.
37
37
  1. Dispatch EVERY task as a spawned subagent (emit `DISPATCH <agent> :: <task>
38
38
  expect=<model>/<effort>` BEFORE the Task call; subagent wrapper framing + the
39
39
  task's INPUT SLICE per orc-execution/core.md + its scored model). Every
40
- slice carries ONE `orc graph ctx --for-slice <the task's declared_files> --if-enabled --json`
40
+ slice carries ONE `orc graph ctx --for-slice <the task's declared_files> --if-enabled --json --brief`
41
41
  `card` as its `graph` block (`../code-graph.md` §7; exit 3 = off → no block) —
42
42
  the OUTSIDE view only, because the executor reads each declared file in full
43
43
  itself,
@@ -78,7 +78,7 @@ the codifier); hold resolved patterns in run state.
78
78
  4. **Post-wave worktree audit (GATE, `_shared/return-validation.md` §6):** diff `git status --short` before/after the wave — a changed path in NO task's `declared_files`, INCLUDING one that became less modified (the revert signature), blocks the close until named and decided.
79
79
  Overlap → `failure_reason: "file-collision:<file> with <agent>"`, requeue later wave.
80
80
  4a. **Code graph (`../code-graph.md` §5–§6):** after the audit, ONE call —
81
- `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json`
81
+ `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json --brief`
82
82
  (emit `GRAPH-UPDATE`; the answer's `notes_pending` is the notes half):
83
83
  `notes_pending.exit` 0 → dispatch `orc-graph-noter-sonnet-4-6-med` (slice = paths only) in the
84
84
  SAME tool block as the next wave's first dispatch; 3 or 5 → nothing, the
@@ -146,9 +146,9 @@ outside `declared_files` (a revert included) gates the wave close.
146
146
 
147
147
  <!-- diy:when code_graph=on -->
148
148
  Code graph cache (never skipped): each slice gets ONE `orc graph ctx --for-slice <the task's
149
- declared_files> --if-enabled --json` `card` as its `graph` block, and the return
149
+ declared_files> --if-enabled --json --brief` `card` as its `graph` block, and the return
150
150
  carries `graph_used`. After each wave's worktree audit run ONE call —
151
- `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json`
151
+ `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json --brief`
152
152
  (copy its `trace` verbatim); `notes_pending.exit` 0 → dispatch `orc-graph-noter-sonnet-4-6-med` paired
153
153
  with the next wave's first dispatch, exit 3 or 5 → nothing. Canonical:
154
154
  `.claude/skills/_shared/code-graph.md`.
@@ -31,16 +31,16 @@ only pre-built needs/cache, never peer source live). **Gotchas (repair memory,
31
31
  config `gotchas`):** probe ONCE with `orc gotcha status` (exit 0 = entries exist,
32
32
  1 = none — never a `find`); canonical `_shared/gotchas.md`.
33
33
  **Code graph (`../code-graph.md` §3b and §7):** with the graph on, run
34
- `orc graph map --focus <every file or symbol the request NAMES> --if-enabled --json`
34
+ `orc graph map --focus <every file or symbol the request NAMES> --if-enabled --json --brief`
35
35
  **FIRST, once** — before any Glob and before `impact`. It ranks the repository
36
36
  around the request and names the files worth reading, which is the question
37
37
  `impact` cannot answer because `impact` needs the files already chosen. Print its
38
38
  `line` and emit `GRAPH-MAP`. Rank is a HINT about where to look first, never
39
39
  proof a file matters — and never a reason to skip reading a range you will edit.
40
40
  Exit 1 or 3 → orient exactly as before. Then run
41
- `orc graph impact <candidate declared_files> --if-enabled --json` and hand its
41
+ `orc graph impact <candidate declared_files> --if-enabled --json --brief` and hand its
42
42
  callers to the planner — they sharpen `declared_files` and the `fan` and risk
43
- facets. Also run `orc graph cochange <each candidate file> --if-enabled --json`:
43
+ facets. Also run `orc graph cochange <each candidate file> --if-enabled --json --brief`:
44
44
  it answers "what else will I have to touch" from HISTORY, which a static edge
45
45
  cannot see. Co-change is a HINT about people, never a dependency — exit 4 means
46
46
  this file changes alone, which is an answer. Exit 3 or 4 → plan exactly as before.
@@ -100,7 +100,7 @@ that the line is printed and when.
100
100
  ## The graph line (v1.8.0) — code-changing lanes only
101
101
 
102
102
  `/orc`, `/orc-ultra`, `/orc-diy`, `/orc-mini`, `/orc-fast` and `/orc-quick` run
103
- `orc graph status --if-enabled --heal --json` in step 3, BEFORE the first
103
+ `orc graph status --if-enabled --heal --json --brief` in step 3, BEFORE the first
104
104
  dispatch — never skipped. `--heal` builds a missing graph and updates a drifted
105
105
  one in the same call (it is free), so there is no second call to forget. Print
106
106
  its `line` (`off` included) and put its `trace` (`GRAPH-CONSULT …`) in the next
@@ -17,13 +17,15 @@
17
17
  ## Review (load ../../orc/subskills/orc-review-verify/, spawned)
18
18
 
19
19
  Emit `PHASE review start`. Superpowers path: its review skill incl. tests
20
- (Sonnet 4.6 medium). OpenSpec/self path: review worker (Opus 5 medium). Pass the resolved
20
+ (Sonnet 4.6 medium). OpenSpec/self path: review worker (Opus 5.5 medium). Pass the resolved
21
21
  `code_pattern` + its invariants + gate lines for the re-check
22
22
  (pattern-gate.md); no resolved pattern → FIRST ask for one (paste/md/none).
23
23
  FE tasks in run → pass `fe_rules[]` from `../../orc-pattern/references/` fe-a11y
24
24
  + fe-perf. **Code graph (`../code-graph.md` §7):** with the graph on, also pass
25
25
  `orc graph changes --if-enabled --json` — the symbols THIS diff's hunks overlap,
26
- each with its callers, its tests and a risk word that carries its own reason. It
26
+ each with its callers, its tests and a risk word that carries its own reason.
27
+ **This one read keeps its rows: no `--brief` here**, because the reviewer is
28
+ handed `symbols[].caller_files` and reads them. It
27
29
  replaces a whole-file `orc graph impact` here: a file card reports every symbol in
28
30
  a touched file, and a symbol nobody edited is not a finding. An unchanged caller of
29
31
  a changed signature is a finding candidate, anchored like any other. Findings arrive on the **P0–P3 ladder** (invariant violation or
@@ -54,7 +54,7 @@ subagent). The user must always know what the run cost. **Code graph
54
54
  fix rounds move code — and emit `GRAPH-UPDATE`; then run `orc graph notes pending
55
55
  --files <every path the run changed> --at end --if-enabled` — exit 0 → one noter
56
56
  dispatch, exit 3 or 5 → nothing. Then ONE line, once, copied VERBATIM from
57
- `orc graph gain --run <this run's trace name> --if-enabled --json` (emit
57
+ `orc graph gain --run <this run's trace name> --if-enabled --json --brief` (emit
58
58
  `GRAPH-GAIN`): what the graph put in, and an ESTIMATE of the retrieval it kept
59
59
  out. Exit 1 or 3 → no line. **Never restate it as one number** — the range and
60
60
  the word "estimate" are the claim. Finally emit
@@ -231,10 +231,11 @@ supplies the fact in a packet, the writer writes the line. `SPAWN`, `RETURN` and
231
231
  | `CONFIG <key=value …>` | orc → writer | Phase 1 — the resolved config values this run will consume (ALWAYS `opus5_only` — it selects the executor table AND every fixed role, so retro can segment outcomes by dispatch mode). Runtime proof that the run honored the config; `/orc-retro` audits it against behavior |
232
232
  | `WIKI-CONSULT <tier> :: docs=<list>` | orc → writer | project wiki consulted for grounding (full/mini at planning; fast at slice-build) — tier ∈ `fresh` \| `aging` \| `stale` \| `absent` \| `empty`; `docs=` the pages pulled/handed to the executor (comma list) or `none`. Records whether the run grounded in the wiki and whether it was stale (surfaces grounding + staleness for later audit) |
233
233
  | `CROSSLINK <state> :: boundaries=<n> peers=<names>` | orc → writer | cross-repo peer-knowledge state at the consult point — state ∈ `cached` (peer cache present) \| `configured-no-cache` (crosslink configured but the cache is not built) \| `none`. Per-task `CROSSLINK inject task=<id> :: <boundary>` when a slice receives a linked contract. Records whether peer contracts were injected this run (full orc consumes only the pre-built crosslink cache — it never reads peer source live; mechanism in `wiki-consult.md`) |
234
- | `GRAPH-CONSULT <state> :: files=<n> symbols=<n>` | orc → writer | the code graph's preflight state (`code-graph.md` §4) — state ∈ `fresh` \| `updated` \| `built` \| `drifted` \| `none` \| `off`. Copied VERBATIM from the `trace` field of `orc graph status --heal --json`; a `GATE` line that describes the graph in other words does not replace it. Plus `GRAPH-CONSULT card task=<id> :: targets=<…>` (the `trace` of `orc graph ctx --json`, with `task=` added) when a slice receives cards |
234
+ | `GRAPH-CONSULT <state> :: files=<n> symbols=<n>[ density=<n>[ thin=1]]` | orc → writer | the code graph's preflight state (`code-graph.md` §4) — state ∈ `fresh` \| `updated` \| `built` \| `drifted` \| `none` \| `off`. Copied VERBATIM from the `trace` field of `orc graph status --heal --json --brief`; `density=` is the named symbols per file and `thin=1` means most files hold none, so most questions asked of the graph will not find one (v1.9.1); a `GATE` line that describes the graph in other words does not replace it. Plus `GRAPH-CONSULT card task=<id> :: targets=<…>` (the `trace` of `orc graph ctx --json`, with `task=` added) when a slice receives cards |
235
235
  | `GRAPH-UPDATE <state> :: parsed=<n> reused=<n> deleted=<n> gen=<n> route=<n> ms=<n>` | orc → writer | one graph update at a wave close, a green smoke gate, a code-writing `/orc-quick` request, or ship — the `trace` field of `orc graph update --json`, verbatim. The graph HOOK writes its own `GRAPH-UPDATE … :: by=hook …` lines directly; never copy one of those, it is already in the file |
236
236
  | `GRAPH-MAP <repo|focused> :: files=<shown>/<total> [focus=<a,b>] gen=<n>` | orc → writer | ONE line at the START of planning (and at a `/orc-quick` Q1 look that had no file to name) — the `trace` field of `orc graph map --json`, verbatim. `files=` is how many the budget SHOWED over how many the repository has, so a short map can be told from a small repository. `focused` means `--focus` re-ranked the repository around what the request named. RANK is a hint about where to look first and the trace never says more than that |
237
237
  | `GRAPH-CHANGES <found\|none> :: symbols=<n> high=<n> medium=<n> low=<n> gen=<n>` | orc → writer | one line at review — the `trace` field of `orc graph changes --json`, verbatim. `high` counts symbols that are exported, have three or more callers and NO test reaching them |
238
+ | `GRAPH-COMPLEXITY <mini-ok\|recommend-orc> :: files=<n> callers=<n> caller_files=<n> maybe=<n> tests=<n> risk=<n> cochange=<n> gen=<n>` | orc → writer | one line per `/orc-mini` run — the `trace` field of `orc graph impact … --complexity --json`, verbatim. The CLI computes the verdict from the four thresholds in `bin/graph-signals.js`; `maybe` is reported and never trips one. Mini's own `GATE complexity :: <the line>` is separate: it records what the USER chose after the offer |
238
239
  | `GRAPH-COCHANGE <found\|none> :: rows=<n> commits=<n>` | orc → writer | one line per planning batch, not per file — the `trace` field of `orc graph cochange --json` for the file that produced the widest answer |
239
240
  | `GRAPH-HINT injected=<n> subagent_start=<n> read_notes=<n> updates=<n>` | orc → writer | ONE line per phase close, not one per hint — the counters `orc-graph-hook.js` keeps in `<log_dir>/<run>.graph-hook.json`. Omitted when the file does not exist (the hook is off, or it never had anything to say) |
240
241
  | `GRAPH-GAIN paid=<n> low=<n> high=<n> calls=<n>` | orc → writer | ONE line per run, at ship — the `trace` field of `orc graph gain --run <trace name> --json`, verbatim. `paid` is exact (the tokens the graph put in); `low`/`high` are an ESTIMATE of the retrieval it kept out, and they are never collapsed into one number. Omitted when the ledger is empty or the graph is off |
@@ -313,7 +314,7 @@ For each spawn the orchestrator:
313
314
  ## Announce-on-spawn
314
315
 
315
316
  When dispatching, announce the model to the user, derived from the agent NAME
316
- (e.g. "Spawning orc-executor-opus-5-low → claude-opus-5 / low"). Derive it
317
+ (e.g. "Spawning orc-executor-opus-5-low → claude-opus-5-5 / low"). Derive it
317
318
  from the name — do NOT pass the coarse `sonnet|opus|haiku` dispatch arg, which
318
319
  cannot express 4-7 vs 4-8 and would override the frontmatter pin.
319
320
 
@@ -26,7 +26,7 @@ Escalate one step at a time. Stop at the step that answers the question.
26
26
 
27
27
  ## Step 0 — ask the graph (always first; the CLI decides if it is on)
28
28
 
29
- Before step 1, run `orc graph ctx <symbol|file[:line]> --if-enabled --json`
29
+ Before step 1, run `orc graph ctx <symbol|file[:line]> --if-enabled --json --brief`
30
30
  yourself. You do not need to know whether the graph is on. Exit 0 → the card
31
31
  answers step 1 and step 2 together: where the symbol is, its line range, who
32
32
  calls or uses it, what it calls, and which effects it has. Then continue at
@@ -40,6 +40,19 @@ footer says how many lines it cut. Use it for the CALLER'S range, the callee's,
40
40
  the neighbour you will not touch. **It never replaces exception 1**: a file you
41
41
  will EDIT is read IN FULL with `Read` first, because an `old_string` rebuilt
42
42
  from a printed range is the same corruption bug as one rebuilt from an outline.
43
+ **`--callers-source` adds six lines around each confident call site (≤ 5)**
44
+ (v1.9.1), charged against the same `--budget` after everything else. A file you
45
+ will EDIT is still read in full with `Read` first — this is for the callers you
46
+ will not touch.
47
+
48
+ **Ask a language server when the card cannot be exact** (v1.9.1). If the card
49
+ answers `AMBIGUOUS (n)` for a callee, or `← maybe <n>` for callers, and an `LSP`
50
+ tool is available in this session, run `LSP findReferences` (callers) or
51
+ `goToDefinition` (a callee) at the card's `lsp_at` — file, line, character —
52
+ before any Grep. A language server's answer is EXACT; the card's `AMBIGUOUS` is a
53
+ list of candidates. Without an LSP tool, or with `lsp_at: null`, the ladder
54
+ continues as before.
55
+
43
56
  Exit 3 (off) → skip step 0 for the rest of the task. Exit 1 (no index) or 4 (not
44
57
  in the graph) → step 1 as before. Name the card targets you used in
45
58
  `graph_used`. Both exceptions below apply unchanged.
@@ -16,7 +16,7 @@ agent. It does not.
16
16
 
17
17
  What that costs, measured: one graded `/orc-quick` entry put THREE
18
18
  `orc-executor-opus-5-low` agents on the SAME task — 50m19s, 115m22s and
19
- 100m53s, **266 minutes of Opus 5 for one authorised dispatch**, all editing the
19
+ 100m53s, **266 minutes of Opus 5.5 for one authorised dispatch**, all editing the
20
20
  same files, inside a 2h04m window. The second was dispatched 4m19s after the
21
21
  first, while the first was still working. The hook had recorded all three; no
22
22
  lane had ever read that record.
@@ -31,7 +31,7 @@ it were a single analysis — with PROOF that no source requirement was lost.
31
31
  ## Hard rules
32
32
 
33
33
  1. **Dispatched, not self-run.** The orchestrator coordinates; the Combiner
34
- subagent (Opus 5 high) reads the specs and reconciles them against each
34
+ subagent (Opus 5.5 high) reads the specs and reconciles them against each
35
35
  other. The combiner NEVER builds and NEVER spawns subagents.
36
36
  2. **Related only — verify + challenge.** The user asserted relatedness at the
37
37
  Phase F gate, but the combiner MUST verify real overlap (shared files,