auditor-lambda 0.2.8 → 0.2.9

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 (98) hide show
  1. package/README.md +6 -0
  2. package/audit-code-wrapper-lib.mjs +1 -1
  3. package/dist/adapters/eslint.js +9 -5
  4. package/dist/cli.d.ts +42 -1
  5. package/dist/cli.js +114 -64
  6. package/dist/extractors/bucketing.d.ts +4 -0
  7. package/dist/extractors/bucketing.js +6 -2
  8. package/dist/extractors/disposition.d.ts +4 -0
  9. package/dist/extractors/disposition.js +6 -2
  10. package/dist/extractors/fileInventory.js +24 -28
  11. package/dist/extractors/flows.d.ts +5 -0
  12. package/dist/extractors/flows.js +18 -38
  13. package/dist/extractors/pathPatterns.d.ts +10 -3
  14. package/dist/extractors/pathPatterns.js +109 -61
  15. package/dist/extractors/surfaces.d.ts +4 -0
  16. package/dist/extractors/surfaces.js +11 -11
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +2 -1
  19. package/dist/io/artifacts.d.ts +55 -40
  20. package/dist/io/artifacts.js +73 -110
  21. package/dist/io/json.js +52 -21
  22. package/dist/io/runArtifacts.d.ts +1 -1
  23. package/dist/io/runArtifacts.js +26 -3
  24. package/dist/orchestrator/advance.js +83 -62
  25. package/dist/orchestrator/flowCoverage.js +11 -5
  26. package/dist/orchestrator/flowPlanning.d.ts +7 -2
  27. package/dist/orchestrator/flowPlanning.js +46 -21
  28. package/dist/orchestrator/flowRequeue.js +28 -8
  29. package/dist/orchestrator/internalExecutors.js +12 -8
  30. package/dist/orchestrator/planning.js +25 -3
  31. package/dist/orchestrator/requeue.js +11 -1
  32. package/dist/orchestrator/taskBuilder.d.ts +4 -2
  33. package/dist/orchestrator/taskBuilder.js +153 -52
  34. package/dist/orchestrator/unitBuilder.d.ts +3 -1
  35. package/dist/orchestrator/unitBuilder.js +24 -16
  36. package/dist/prompts/renderWorkerPrompt.d.ts +1 -1
  37. package/dist/prompts/renderWorkerPrompt.js +16 -8
  38. package/dist/providers/claudeCodeProvider.d.ts +4 -1
  39. package/dist/providers/claudeCodeProvider.js +8 -5
  40. package/dist/providers/localSubprocessProvider.d.ts +4 -0
  41. package/dist/providers/localSubprocessProvider.js +7 -2
  42. package/dist/providers/spawnLoggedCommand.d.ts +9 -1
  43. package/dist/providers/spawnLoggedCommand.js +77 -29
  44. package/dist/reporting/synthesis.d.ts +2 -0
  45. package/dist/reporting/synthesis.js +12 -9
  46. package/dist/supervisor/operatorHandoff.js +48 -18
  47. package/dist/supervisor/runLedger.d.ts +1 -1
  48. package/dist/supervisor/runLedger.js +112 -5
  49. package/dist/supervisor/sessionConfig.js +10 -10
  50. package/dist/types/externalAnalyzer.d.ts +3 -0
  51. package/dist/types/flowCoverage.d.ts +5 -1
  52. package/dist/types/flowCoverage.js +5 -1
  53. package/dist/types/flows.d.ts +5 -1
  54. package/dist/types/flows.js +1 -1
  55. package/dist/types/runLedger.d.ts +5 -1
  56. package/dist/types/runLedger.js +6 -1
  57. package/dist/types/runtimeValidation.d.ts +12 -3
  58. package/dist/types/runtimeValidation.js +16 -1
  59. package/dist/types/sessionConfig.d.ts +15 -2
  60. package/dist/types/sessionConfig.js +15 -1
  61. package/dist/types/surfaces.d.ts +4 -1
  62. package/dist/types/surfaces.js +1 -1
  63. package/dist/types/workerSession.d.ts +9 -0
  64. package/dist/types/workerSession.js +5 -1
  65. package/dist/validation/artifacts.d.ts +1 -1
  66. package/dist/validation/artifacts.js +33 -20
  67. package/dist/validation/auditResults.d.ts +2 -2
  68. package/dist/validation/auditResults.js +7 -15
  69. package/dist/validation/basic.d.ts +9 -1
  70. package/dist/validation/basic.js +40 -3
  71. package/dist/validation/sessionConfig.d.ts +4 -2
  72. package/dist/validation/sessionConfig.js +62 -15
  73. package/docs/agent-integrations.md +29 -9
  74. package/docs/next-steps.md +21 -4
  75. package/docs/packaging.md +14 -0
  76. package/docs/product-direction.md +22 -0
  77. package/docs/production-launch-bar.md +2 -0
  78. package/docs/releasing.md +17 -0
  79. package/docs/remediation-baseline.md +75 -0
  80. package/docs/run-flow.md +23 -11
  81. package/docs/session-config.md +50 -5
  82. package/docs/supervisor.md +7 -0
  83. package/docs/workflow-refactor-brief.md +177 -0
  84. package/package.json +1 -1
  85. package/schemas/audit_result.schema.json +4 -1
  86. package/schemas/audit_task.schema.json +3 -1
  87. package/schemas/coverage_matrix.schema.json +3 -3
  88. package/schemas/critical_flows.schema.json +6 -2
  89. package/schemas/file_disposition.schema.json +2 -2
  90. package/schemas/finding.schema.json +9 -4
  91. package/schemas/flow_coverage.schema.json +2 -2
  92. package/schemas/repo_manifest.schema.json +4 -4
  93. package/schemas/risk_register.schema.json +2 -2
  94. package/schemas/runtime_validation_report.schema.json +2 -2
  95. package/schemas/runtime_validation_tasks.schema.json +8 -2
  96. package/schemas/surface_manifest.schema.json +6 -3
  97. package/schemas/unit_manifest.schema.json +3 -2
  98. package/skills/audit-code/SKILL.md +5 -0
@@ -0,0 +1,177 @@
1
+ # Workflow Refactor Brief
2
+
3
+ This document is the handoff for the next context window.
4
+
5
+ Use it as the source of truth for the workflow refactor before running a fresh audit again.
6
+
7
+ ## Why this refactor is needed
8
+
9
+ The current implementation still advances deterministic audit state correctly, but the semantic-review phase has drifted away from the intended product behavior.
10
+
11
+ The key symptom is that the backend can currently treat `provider` selection as the owner of review work, which is how the recent rerun ended up trying to use `claude-code` from `.audit-artifacts/session-config.json`.
12
+
13
+ That is not the intended workflow.
14
+
15
+ ## Intended workflow
16
+
17
+ The intended `/audit-code` workflow is:
18
+
19
+ 1. The active conversation agent owns semantic review work.
20
+ 2. Deterministic planning computes which files need which lenses.
21
+ 3. Pending review is partitioned into non-overlapping review blocks, preferably grouped by lens.
22
+ 4. One dispatched review task should correspond to one review block.
23
+ 5. `agent_task_batch_size` should stay `1` by default.
24
+ 6. If the active conversation agent can delegate to subagents in parallel, that fan-out belongs to the host agent runtime, not to the backend session config.
25
+ 7. Backend provider adapters are fallback compatibility bridges only. They should not be the default review owner.
26
+
27
+ ## Current implementation drift
28
+
29
+ The current code differs from that model in several important ways.
30
+
31
+ ### 1. Review ownership is provider-mediated
32
+
33
+ Today, the `agent` executor in the backend fallback path is still routed through `createFreshSessionProvider()` and may spawn an external CLI such as `claude` or `opencode`.
34
+
35
+ Relevant files:
36
+
37
+ - [src/cli.ts](/C:/Code/auditor-lambda/src/cli.ts:771)
38
+ - [src/providers/index.ts](/C:/Code/auditor-lambda/src/providers/index.ts:37)
39
+ - [src/providers/claudeCodeProvider.ts](/C:/Code/auditor-lambda/src/providers/claudeCodeProvider.ts:12)
40
+ - [src/providers/opencodeProvider.ts](/C:/Code/auditor-lambda/src/providers/opencodeProvider.ts)
41
+ - [src/providers/spawnLoggedCommand.ts](/C:/Code/auditor-lambda/src/providers/spawnLoggedCommand.ts:24)
42
+
43
+ ### 2. Task planning is unit-first, not lens-first
44
+
45
+ `buildChunkedAuditTasks()` currently creates tasks as `unit x lens`, then optionally splits oversized files into separate per-lens tasks.
46
+
47
+ Relevant files:
48
+
49
+ - [src/orchestrator/taskBuilder.ts](/C:/Code/auditor-lambda/src/orchestrator/taskBuilder.ts:101)
50
+ - [src/orchestrator/unitBuilder.ts](/C:/Code/auditor-lambda/src/orchestrator/unitBuilder.ts:130)
51
+
52
+ ### 3. Required lenses are unioned at the unit level
53
+
54
+ The planner derives `required_lenses` for a unit, then applies that whole union to every file in the unit.
55
+
56
+ That means the task count grows with `units x required_lenses`, not with a deliberately partitioned set of file/lens review blocks.
57
+
58
+ Relevant files:
59
+
60
+ - [src/orchestrator/unitBuilder.ts](/C:/Code/auditor-lambda/src/orchestrator/unitBuilder.ts:153)
61
+ - [src/orchestrator/planning.ts](/C:/Code/auditor-lambda/src/orchestrator/planning.ts:63)
62
+ - [src/coverage.ts](/C:/Code/auditor-lambda/src/coverage.ts:29)
63
+
64
+ ### 4. Flow augmentation adds overlapping review tasks
65
+
66
+ After the base unit tasks are built, the planner adds extra flow-aware tasks rather than repartitioning the pending review set into one global non-overlapping dispatch plan.
67
+
68
+ Relevant file:
69
+
70
+ - [src/orchestrator/flowPlanning.ts](/C:/Code/auditor-lambda/src/orchestrator/flowPlanning.ts:9)
71
+
72
+ ### 5. `parallel_workers` means subprocess fan-out, not agent-owned parallelism
73
+
74
+ The current `parallel_workers` setting only controls how many external provider worker runs the backend fallback CLI launches.
75
+
76
+ It does not represent, and should not limit, the active conversation agent's own ability to use subagents.
77
+
78
+ Relevant files:
79
+
80
+ - [src/cli.ts](/C:/Code/auditor-lambda/src/cli.ts:83)
81
+ - [src/cli.ts](/C:/Code/auditor-lambda/src/cli.ts:960)
82
+
83
+ ## Evidence from the current stale audit
84
+
85
+ The current stale audit run produced:
86
+
87
+ - `91` units
88
+ - average `3.26` required lenses per unit
89
+ - `333` audit tasks total
90
+ - `294` regular unit-lens tasks
91
+ - `10` large-file split tasks
92
+ - `29` flow tasks
93
+
94
+ That fan-out is consistent with the current unit-first planner, not with the intended lens-block dispatch model.
95
+
96
+ ## Refactor goals
97
+
98
+ The next implementation pass should do the following.
99
+
100
+ ### A. Make the active conversation agent the semantic-review owner
101
+
102
+ The `agent` executor should represent review work owned by the current conversation or host agent session.
103
+
104
+ Target behavior:
105
+
106
+ - normal `/audit-code` usage does not require `provider: "claude-code"` or `provider: "opencode"`
107
+ - session-config should not be the normal way to choose a second LLM for review
108
+ - backend provider bridges remain available only for explicit fallback workflows
109
+
110
+ ### B. Plan review work at the file/lens level
111
+
112
+ Coverage should still know which files require which lenses, but dispatch planning should work from unresolved `(file, lens)` obligations rather than from unit-wide lens unions.
113
+
114
+ Target behavior:
115
+
116
+ - each review block should have explicit `file_paths`
117
+ - each review block should represent one lens
118
+ - review blocks in the same dispatch wave should be file-disjoint unless overlap is intentionally justified
119
+
120
+ ### C. Partition pending review into non-overlapping blocks
121
+
122
+ Replace the current unit-first task planner with a lens-aware block planner.
123
+
124
+ Target behavior:
125
+
126
+ - no combinatorial `unit x lens` explosion unless that is genuinely the smallest valid partition
127
+ - large-file splitting may remain, but it should happen inside the lens-block planner
128
+ - critical-flow context should influence block construction without blindly adding overlapping tasks on top
129
+
130
+ ### D. Keep result ingestion deterministic
131
+
132
+ The current ingestion model is mostly sound and should be preserved.
133
+
134
+ Relevant files:
135
+
136
+ - [src/orchestrator/resultIngestion.ts](/C:/Code/auditor-lambda/src/orchestrator/resultIngestion.ts)
137
+ - [src/coverage.ts](/C:/Code/auditor-lambda/src/coverage.ts:42)
138
+
139
+ ### E. Reframe session-config as backend fallback only
140
+
141
+ `session-config.json` should continue to configure backend fallback bridges, but it should not be treated as the owner of semantic-review orchestration in the canonical workflow.
142
+
143
+ `parallel_workers` should either:
144
+
145
+ - become a legacy fallback-only knob, or
146
+ - be removed from the semantic-review mental model entirely
147
+
148
+ ## Acceptance criteria
149
+
150
+ The refactor should be treated as done only when all of the following are true.
151
+
152
+ - Starting `/audit-code` in a conversation does not rely on an external `claude-code` or `opencode` subprocess to own semantic review.
153
+ - The backend fallback still supports deterministic stages and explicit compatibility bridges.
154
+ - The default dispatch granularity for semantic review remains one review block per task.
155
+ - Pending review tasks are planned as lens-aware, non-overlapping file blocks.
156
+ - `parallel_workers` no longer defines the default semantic-review parallelism model.
157
+ - The next fresh audit can be run from a clean slate without inheriting the current stale provider-mediated task queue.
158
+
159
+ ## Suggested implementation order
160
+
161
+ 1. Refactor the review-ownership model in [src/cli.ts](/C:/Code/auditor-lambda/src/cli.ts), [src/providers/index.ts](/C:/Code/auditor-lambda/src/providers/index.ts), and related supervisor docs.
162
+ 2. Replace the current task planner in [src/orchestrator/taskBuilder.ts](/C:/Code/auditor-lambda/src/orchestrator/taskBuilder.ts) with a lens-block planner.
163
+ 3. Rework flow-aware planning in [src/orchestrator/flowPlanning.ts](/C:/Code/auditor-lambda/src/orchestrator/flowPlanning.ts) so it participates in block construction instead of layering overlapping tasks afterward.
164
+ 4. Update docs and tests.
165
+ 5. Delete the stale audit state and rerun the audit from scratch.
166
+
167
+ ## Clean rerun after refactor
168
+
169
+ Once the refactor is in place, the next context should:
170
+
171
+ 1. keep the source changes and documentation already in the worktree
172
+ 2. delete `.audit-artifacts/`
173
+ 3. delete `audit-report.md`
174
+ 4. run the workflow again from a clean state
175
+ 5. treat the new audit output as authoritative
176
+
177
+ For the remediation baseline that should survive the stale audit reset, see [docs/remediation-baseline.md](/C:/Code/auditor-lambda/docs/remediation-baseline.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auditor-lambda",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "private": false,
5
5
  "description": "Portable hybrid code-auditing framework for arbitrary repositories.",
6
6
  "type": "module",
@@ -20,7 +20,10 @@
20
20
  "task_id": { "type": "string" },
21
21
  "unit_id": { "type": "string" },
22
22
  "pass_id": { "type": "string" },
23
- "lens": { "type": "string" },
23
+ "lens": {
24
+ "type": "string",
25
+ "enum": ["correctness", "architecture", "maintainability", "security", "reliability", "performance", "data_integrity", "tests", "operability", "config_deployment"]
26
+ },
24
27
  "agent_role": { "type": "string" },
25
28
  "file_coverage": {
26
29
  "type": "array",
@@ -21,6 +21,7 @@
21
21
  },
22
22
  "file_paths": {
23
23
  "type": "array",
24
+ "minItems": 1,
24
25
  "items": { "type": "string" }
25
26
  },
26
27
  "line_ranges": {
@@ -44,7 +45,7 @@
44
45
  "mechanical_results_ref": { "type": "string" },
45
46
  "risk_register_ref": { "type": "string" }
46
47
  },
47
- "additionalProperties": true
48
+ "additionalProperties": { "type": "string" }
48
49
  },
49
50
  "rationale": { "type": "string" },
50
51
  "priority": {
@@ -53,6 +54,7 @@
53
54
  },
54
55
  "tags": {
55
56
  "type": "array",
57
+ "minItems": 1,
56
58
  "items": { "type": "string" }
57
59
  },
58
60
  "status": {
@@ -9,7 +9,7 @@
9
9
  "type": "array",
10
10
  "items": {
11
11
  "type": "object",
12
- "required": ["path", "classification_status", "audit_status"],
12
+ "required": ["path", "unit_ids", "classification_status", "audit_status", "required_lenses", "completed_lenses"],
13
13
  "properties": {
14
14
  "path": { "type": "string" },
15
15
  "unit_ids": {
@@ -39,9 +39,9 @@
39
39
  }
40
40
  }
41
41
  },
42
- "additionalProperties": true
42
+ "additionalProperties": false
43
43
  }
44
44
  }
45
45
  },
46
- "additionalProperties": true
46
+ "additionalProperties": false
47
47
  }
@@ -31,11 +31,15 @@
31
31
  "notes": {
32
32
  "type": "array",
33
33
  "items": { "type": "string" }
34
+ },
35
+ "confidence": {
36
+ "type": "string",
37
+ "enum": ["high", "low"]
34
38
  }
35
39
  },
36
- "additionalProperties": true
40
+ "additionalProperties": false
37
41
  }
38
42
  }
39
43
  },
40
- "additionalProperties": true
44
+ "additionalProperties": false
41
45
  }
@@ -25,9 +25,9 @@
25
25
  },
26
26
  "reason": { "type": "string" }
27
27
  },
28
- "additionalProperties": true
28
+ "additionalProperties": false
29
29
  }
30
30
  }
31
31
  },
32
- "additionalProperties": true
32
+ "additionalProperties": false
33
33
  }
@@ -11,7 +11,8 @@
11
11
  "confidence",
12
12
  "lens",
13
13
  "affected_files",
14
- "summary"
14
+ "summary",
15
+ "evidence"
15
16
  ],
16
17
  "properties": {
17
18
  "id": { "type": "string" },
@@ -54,13 +55,14 @@
54
55
  "summary": { "type": "string" },
55
56
  "affected_files": {
56
57
  "type": "array",
58
+ "minItems": 1,
57
59
  "items": {
58
60
  "type": "object",
59
61
  "required": ["path"],
60
62
  "properties": {
61
63
  "path": { "type": "string" },
62
- "line_start": { "type": "integer" },
63
- "line_end": { "type": "integer" },
64
+ "line_start": { "type": "integer", "minimum": 1 },
65
+ "line_end": { "type": "integer", "minimum": 1 },
64
66
  "symbol": { "type": "string" }
65
67
  },
66
68
  "additionalProperties": false
@@ -70,17 +72,20 @@
70
72
  "likelihood": { "type": "string" },
71
73
  "evidence": {
72
74
  "type": "array",
75
+ "minItems": 1,
73
76
  "items": { "type": "string" }
74
77
  },
75
78
  "reproduction": {
76
79
  "type": "array",
80
+ "minItems": 1,
77
81
  "items": { "type": "string" }
78
82
  },
79
83
  "systemic": { "type": "boolean" },
80
84
  "related_findings": {
81
85
  "type": "array",
86
+ "minItems": 1,
82
87
  "items": { "type": "string" }
83
88
  }
84
89
  },
85
- "additionalProperties": true
90
+ "additionalProperties": false
86
91
  }
@@ -45,9 +45,9 @@
45
45
  "items": { "type": "string" }
46
46
  }
47
47
  },
48
- "additionalProperties": true
48
+ "additionalProperties": false
49
49
  }
50
50
  }
51
51
  },
52
- "additionalProperties": true
52
+ "additionalProperties": false
53
53
  }
@@ -13,7 +13,7 @@
13
13
  "root": { "type": "string" },
14
14
  "default_branch": { "type": "string" }
15
15
  },
16
- "additionalProperties": true
16
+ "additionalProperties": false
17
17
  },
18
18
  "generated_at": { "type": "string" },
19
19
  "files": {
@@ -24,14 +24,14 @@
24
24
  "properties": {
25
25
  "path": { "type": "string" },
26
26
  "language": { "type": "string" },
27
- "size_bytes": { "type": "integer" },
27
+ "size_bytes": { "type": "integer", "minimum": 0 },
28
28
  "hash": { "type": "string" },
29
29
  "excluded": { "type": "boolean" },
30
30
  "exclusion_reason": { "type": "string" }
31
31
  },
32
- "additionalProperties": true
32
+ "additionalProperties": false
33
33
  }
34
34
  }
35
35
  },
36
- "additionalProperties": true
36
+ "additionalProperties": false
37
37
  }
@@ -26,9 +26,9 @@
26
26
  "items": { "type": "string" }
27
27
  }
28
28
  },
29
- "additionalProperties": true
29
+ "additionalProperties": false
30
30
  }
31
31
  }
32
32
  },
33
- "additionalProperties": true
33
+ "additionalProperties": false
34
34
  }
@@ -26,9 +26,9 @@
26
26
  "items": { "type": "string" }
27
27
  }
28
28
  },
29
- "additionalProperties": true
29
+ "additionalProperties": false
30
30
  }
31
31
  }
32
32
  },
33
- "additionalProperties": true
33
+ "additionalProperties": false
34
34
  }
@@ -18,10 +18,16 @@
18
18
  },
19
19
  "target_paths": {
20
20
  "type": "array",
21
+ "minItems": 1,
21
22
  "items": { "type": "string" }
22
23
  },
23
24
  "reason": { "type": "string" },
24
25
  "priority": { "type": "string", "enum": ["high", "medium", "low"] },
26
+ "command": {
27
+ "type": "array",
28
+ "minItems": 1,
29
+ "items": { "type": "string" }
30
+ },
25
31
  "suggested_checks": {
26
32
  "type": "array",
27
33
  "items": { "type": "string" }
@@ -31,9 +37,9 @@
31
37
  "items": { "type": "string" }
32
38
  }
33
39
  },
34
- "additionalProperties": true
40
+ "additionalProperties": false
35
41
  }
36
42
  }
37
43
  },
38
- "additionalProperties": true
44
+ "additionalProperties": false
39
45
  }
@@ -17,7 +17,10 @@
17
17
  "enum": ["interface", "background"]
18
18
  },
19
19
  "entrypoint": { "type": "string" },
20
- "exposure": { "type": "string" },
20
+ "exposure": {
21
+ "type": "string",
22
+ "enum": ["network", "local"]
23
+ },
21
24
  "methods": {
22
25
  "type": "array",
23
26
  "items": { "type": "string" }
@@ -27,9 +30,9 @@
27
30
  "items": { "type": "string" }
28
31
  }
29
32
  },
30
- "additionalProperties": true
33
+ "additionalProperties": false
31
34
  }
32
35
  }
33
36
  },
34
- "additionalProperties": true
37
+ "additionalProperties": false
35
38
  }
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "required_lenses": {
27
27
  "type": "array",
28
+ "minItems": 1,
28
29
  "items": {
29
30
  "type": "string",
30
31
  "enum": ["correctness", "architecture", "maintainability", "security", "reliability", "performance", "data_integrity", "tests", "operability", "config_deployment"]
@@ -35,9 +36,9 @@
35
36
  "items": { "type": "string" }
36
37
  }
37
38
  },
38
- "additionalProperties": true
39
+ "additionalProperties": false
39
40
  }
40
41
  }
41
42
  },
42
- "additionalProperties": true
43
+ "additionalProperties": false
43
44
  }
@@ -17,6 +17,9 @@ Normal usage should:
17
17
  - avoid manual paths, provider flags, and model-selection arguments
18
18
  - advance the audit automatically until it completes or no further automatic progress is possible
19
19
 
20
+ Semantic review should stay with the active conversation agent by default.
21
+ If the host can delegate to subagents, that fan-out belongs to the host agent runtime rather than to repo-local backend provider settings.
22
+
20
23
  Bounded steps are a backend implementation detail, not the intended user experience.
21
24
 
22
25
  ## Embedded Prompt Payload
@@ -58,6 +61,8 @@ For repo-local backend usage:
58
61
  - `provider: "auto"` is the explicit opt-in best-effort routing mode
59
62
  - explicit provider names remain available when an operator wants a specific backend
60
63
 
64
+ Those explicit provider names are backend compatibility bridges, not the intended default review owner.
65
+
61
66
  ## Development rule
62
67
 
63
68
  Prefer the skill-first conversational contract over the CLI-first backend shape.