review-council 4.1.11 → 4.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/README.md +92 -15
  2. package/dist/config/defaults.d.ts +9 -14
  3. package/dist/config/defaults.js +8 -14
  4. package/dist/config/defaults.js.map +1 -1
  5. package/dist/config/schema.d.ts +23 -1
  6. package/dist/config/schema.js +4 -1
  7. package/dist/config/schema.js.map +1 -1
  8. package/dist/consensus/gating.d.ts +20 -6
  9. package/dist/consensus/gating.js +46 -34
  10. package/dist/consensus/gating.js.map +1 -1
  11. package/dist/consensus/types.d.ts +6 -0
  12. package/dist/consensus/verification-contract.d.ts +8 -0
  13. package/dist/consensus/verification-contract.js +95 -0
  14. package/dist/consensus/verification-contract.js.map +1 -0
  15. package/dist/converge/launch-guard.d.ts +27 -3
  16. package/dist/converge/launch-guard.js +27 -2
  17. package/dist/converge/launch-guard.js.map +1 -1
  18. package/dist/converge/run-state.js +12 -2
  19. package/dist/converge/run-state.js.map +1 -1
  20. package/dist/dispatch/adapter.d.ts +3 -0
  21. package/dist/dispatch/anthropic.js +3 -1
  22. package/dist/dispatch/anthropic.js.map +1 -1
  23. package/dist/dispatch/async-lane.d.ts +15 -1
  24. package/dist/dispatch/async-lane.js +29 -4
  25. package/dist/dispatch/async-lane.js.map +1 -1
  26. package/dist/dispatch/capture-council.d.ts +59 -0
  27. package/dist/dispatch/capture-council.js +112 -0
  28. package/dist/dispatch/capture-council.js.map +1 -0
  29. package/dist/dispatch/captured-async.d.ts +67 -0
  30. package/dist/dispatch/captured-async.js +40 -0
  31. package/dist/dispatch/captured-async.js.map +1 -0
  32. package/dist/dispatch/captured-inputs.d.ts +50 -0
  33. package/dist/dispatch/captured-inputs.js +188 -0
  34. package/dist/dispatch/captured-inputs.js.map +1 -0
  35. package/dist/dispatch/checkpoint-async-context.d.ts +25 -0
  36. package/dist/dispatch/checkpoint-async-context.js +38 -0
  37. package/dist/dispatch/checkpoint-async-context.js.map +1 -0
  38. package/dist/dispatch/checkpoint-async-store.d.ts +95 -0
  39. package/dist/dispatch/checkpoint-async-store.js +369 -0
  40. package/dist/dispatch/checkpoint-async-store.js.map +1 -0
  41. package/dist/dispatch/checkpoint-async.d.ts +198 -0
  42. package/dist/dispatch/checkpoint-async.js +208 -0
  43. package/dist/dispatch/checkpoint-async.js.map +1 -0
  44. package/dist/dispatch/checkpoint-verification-context.d.ts +15 -0
  45. package/dist/dispatch/checkpoint-verification-context.js +48 -0
  46. package/dist/dispatch/checkpoint-verification-context.js.map +1 -0
  47. package/dist/dispatch/checkpoint-verification.d.ts +189 -0
  48. package/dist/dispatch/checkpoint-verification.js +357 -0
  49. package/dist/dispatch/checkpoint-verification.js.map +1 -0
  50. package/dist/dispatch/checkpoint.d.ts +315 -0
  51. package/dist/dispatch/checkpoint.js +1374 -0
  52. package/dist/dispatch/checkpoint.js.map +1 -0
  53. package/dist/dispatch/merge.js +2 -0
  54. package/dist/dispatch/merge.js.map +1 -1
  55. package/dist/dispatch/openai.js +2 -0
  56. package/dist/dispatch/openai.js.map +1 -1
  57. package/dist/dispatch/original-launch.d.ts +36 -0
  58. package/dist/dispatch/original-launch.js +117 -0
  59. package/dist/dispatch/original-launch.js.map +1 -0
  60. package/dist/dispatch/recovery-operation.d.ts +44 -0
  61. package/dist/dispatch/recovery-operation.js +146 -0
  62. package/dist/dispatch/recovery-operation.js.map +1 -0
  63. package/dist/dispatch/reviewer-identity.d.ts +10 -0
  64. package/dist/dispatch/reviewer-identity.js +19 -0
  65. package/dist/dispatch/reviewer-identity.js.map +1 -0
  66. package/dist/dispatch/runner.d.ts +9 -5
  67. package/dist/dispatch/runner.js +21 -2
  68. package/dist/dispatch/runner.js.map +1 -1
  69. package/dist/evidence/claim-recovery/claim-index.d.ts +12 -0
  70. package/dist/evidence/claim-recovery/claim-index.js +56 -0
  71. package/dist/evidence/claim-recovery/claim-index.js.map +1 -0
  72. package/dist/evidence/claim-recovery/context.d.ts +15 -0
  73. package/dist/evidence/claim-recovery/context.js +40 -0
  74. package/dist/evidence/claim-recovery/context.js.map +1 -0
  75. package/dist/evidence/claim-recovery/validation/primitives.d.ts +11 -0
  76. package/dist/evidence/claim-recovery/validation/primitives.js +41 -0
  77. package/dist/evidence/claim-recovery/validation/primitives.js.map +1 -0
  78. package/dist/evidence/claim-recovery/validation/receipts.d.ts +37 -0
  79. package/dist/evidence/claim-recovery/validation/receipts.js +83 -0
  80. package/dist/evidence/claim-recovery/validation/receipts.js.map +1 -0
  81. package/dist/evidence/event-receipts.d.ts +16 -0
  82. package/dist/evidence/event-receipts.js +41 -0
  83. package/dist/evidence/event-receipts.js.map +1 -0
  84. package/dist/evidence/original-run/remote.js +5 -0
  85. package/dist/evidence/original-run/remote.js.map +1 -1
  86. package/dist/evidence/original-run/source.js +19 -5
  87. package/dist/evidence/original-run/source.js.map +1 -1
  88. package/dist/evidence/status.d.ts +2 -1
  89. package/dist/evidence/status.js +2 -1
  90. package/dist/evidence/status.js.map +1 -1
  91. package/dist/index.js +94 -16
  92. package/dist/index.js.map +1 -1
  93. package/dist/output/assembly-refusal.d.ts +8 -0
  94. package/dist/output/assembly-refusal.js +14 -0
  95. package/dist/output/assembly-refusal.js.map +1 -0
  96. package/dist/output/github.js +4 -0
  97. package/dist/output/github.js.map +1 -1
  98. package/dist/output/markdown.js +4 -0
  99. package/dist/output/markdown.js.map +1 -1
  100. package/dist/output/terminal.js +6 -0
  101. package/dist/output/terminal.js.map +1 -1
  102. package/dist/report/aggregation-inputs.d.ts +51 -0
  103. package/dist/report/aggregation-inputs.js +114 -0
  104. package/dist/report/aggregation-inputs.js.map +1 -0
  105. package/dist/report/assembly.js +19 -2
  106. package/dist/report/assembly.js.map +1 -1
  107. package/dist/report/blocking-health.d.ts +64 -0
  108. package/dist/report/blocking-health.js +156 -0
  109. package/dist/report/blocking-health.js.map +1 -0
  110. package/dist/report/recovery-source.d.ts +7 -0
  111. package/dist/report/recovery-source.js +7 -0
  112. package/dist/report/recovery-source.js.map +1 -0
  113. package/dist/report/run-header.d.ts +8 -0
  114. package/dist/report/run-header.js +6 -2
  115. package/dist/report/run-header.js.map +1 -1
  116. package/dist/roles/builtin.js +0 -44
  117. package/dist/roles/builtin.js.map +1 -1
  118. package/dist/roles/loader.d.ts +1 -2
  119. package/dist/roles/loader.js +3 -27
  120. package/dist/roles/loader.js.map +1 -1
  121. package/dist/telemetry/abort-signal.js +11 -1
  122. package/dist/telemetry/abort-signal.js.map +1 -1
  123. package/dist/telemetry/attested-retry.js +2 -1
  124. package/dist/telemetry/attested-retry.js.map +1 -1
  125. package/dist/telemetry/deliver.js +0 -1
  126. package/dist/telemetry/deliver.js.map +1 -1
  127. package/dist/telemetry/envelope-validation.js +20 -1
  128. package/dist/telemetry/envelope-validation.js.map +1 -1
  129. package/dist/telemetry/envelope.d.ts +2 -0
  130. package/dist/telemetry/envelope.js +3 -7
  131. package/dist/telemetry/envelope.js.map +1 -1
  132. package/dist/telemetry/events.d.ts +9 -1
  133. package/dist/telemetry/events.js +3 -0
  134. package/dist/telemetry/events.js.map +1 -1
  135. package/dist/telemetry/read-sink.d.ts +2 -0
  136. package/dist/telemetry/read-sink.js +1 -0
  137. package/dist/telemetry/read-sink.js.map +1 -1
  138. package/dist/telemetry/recovery/source.d.ts +1 -1
  139. package/dist/telemetry/recovery-request-budget.d.ts +39 -0
  140. package/dist/telemetry/recovery-request-budget.js +102 -0
  141. package/dist/telemetry/recovery-request-budget.js.map +1 -0
  142. package/dist/telemetry/sink.d.ts +22 -2
  143. package/dist/telemetry/sink.js +271 -48
  144. package/dist/telemetry/sink.js.map +1 -1
  145. package/package.json +1 -1
package/README.md CHANGED
@@ -44,8 +44,21 @@ rcl review changes.patch --ci --markdown report.md
44
44
  | 🏗️ `architecture` | Module boundaries, coupling, and architectural patterns |
45
45
  | 🐛 `bug-hunter` | Logic errors, null paths, race conditions, off-by-one |
46
46
  | ♿ `accessibility-auditor` | WCAG compliance, ARIA roles, keyboard navigation |
47
- | 📋 `project-rules` | Enforces repo conventions from `AGENTS.md`, `CLAUDE.md`, etc. |
48
47
  | 📄 `spec-compliance` | Checks implementation against a spec or plan file |
48
+ | `regression-hunter` | Changed defaults, weakened guards, and lost behavior |
49
+ | `dependency-hygiene` | Unnecessary dependencies, external requests, and privacy leaks |
50
+ | `edge-case-hunter` | Boundary values, unusual inputs, and failure paths |
51
+
52
+ `project-rules` and `dead-code` are no longer built-in reviewer roles. Repository
53
+ rules discovered in `AGENTS.md`, `CLAUDE.md`, or the other supported rules files
54
+ are supplied as shared context to the remaining reviewers. Remove the retired
55
+ names from explicit role lists; they follow the usual unknown-role warning and
56
+ skip behavior unless you define a custom role with that name.
57
+
58
+ The default Fable and Sol general reviewers plus specialist assignments schedule
59
+ 13 blocking seats, or 14 when a specification enables `spec-compliance`. Gemini
60
+ is eligible for specialist assignments only. The async general reviewer
61
+ and verifier are separate; quorum is calculated from the blocking roster.
49
62
 
50
63
  List roles in the terminal:
51
64
 
@@ -228,10 +241,20 @@ impossible under any flag). The default is a consent boundary, not a stop: at
228
241
  15 rounds the workflow asks the user, and an approved continuation supplies a
229
242
  higher `--max-rounds`.
230
243
 
231
- Full-fleet reviewer completion is not required. For the generated
232
- `rcl-converge` skill, let `N = stats.totalReviews`; a round is conclusive only
233
- when `stats.successfulReviews >= max(2, ceil(2 × N / 3))`. Every timeout or
234
- error must be disclosed, and a result below that threshold is inconclusive.
244
+ Full-fleet reviewer completion is not required. Reviewer health counts only
245
+ the report roster's blocking seats, and a seat counts only when every one of
246
+ its chunks succeeded. A round is conclusive when at least
247
+ `max(2, ceil(2 × blocking seats / 3))` blocking seats completed, or more under
248
+ a stricter configured `quorumFraction`. Each report records this as
249
+ `stats.blockingHealth` (`seats`, `successful`, `required`, `conclusive`).
250
+ Secondary, async and verification results keep their findings but never count
251
+ toward the quorum, so the aggregate `stats.successfulReviews` /
252
+ `stats.totalReviews` are informational only: 11 of 17 blocking seats plus one
253
+ async success is 12/18 in aggregate yet inconclusive, because 12 blocking
254
+ seats are required. This is the rule Harness applies to delivered evidence.
255
+ Round closure uses the same seats and policy: bonus successes never cancel
256
+ unfinished blocking reviewers. Every timeout or error must be disclosed, and a
257
+ result below the requirement is inconclusive.
235
258
 
236
259
  Exit code 2 means the configured cap was exhausted and explicit continuation
237
260
  approval is required. Exit code 3 means attempt accounting itself failed
@@ -278,6 +301,21 @@ genuinely new evidence). The same call enforces the evidence-round cap:
278
301
  default 15, `--max-rounds` accepts 2–99, and rounds past 99 are impossible. Exit
279
302
  code 2 is the cap consent boundary; exit 3 is a state failure.
280
303
 
304
+ Before reading or writing native state, `converge-report` derives blocking
305
+ reviewer health from the report's roster and rows. An inconclusive report exits
306
+ 4 (`report_health_inconclusive`) and is not admitted: its findings are not
307
+ classified or triaged. The refusal names the completed blocking seats, the
308
+ required count, every missing, failed or canceled seat, and the excluded
309
+ secondary/async successes (with `--json`, as `error.reviewerHealth`). A report
310
+ whose recorded `stats.blockingHealth` disagrees with its rows exits 4 with
311
+ `report_health_unverifiable`. The report, its attempt and all earlier rounds
312
+ stay unchanged. Continue with the same guarded review command plus
313
+ `--retry-reason`: the guard records blocking health for every new launch,
314
+ requires that explicit reason for an inconclusive one, and spends one more
315
+ attempt at the same round without resetting caps or cycle history. Retained
316
+ missing-reviewer recovery remains a separate workflow. Conclusive health does
317
+ not replace triage, and merging still requires matching enforced review and CI.
318
+
281
319
  A report key must identify one canonical identity, status and suppression reason.
282
320
  `converge-report` refuses conflicting mappings with exit 3 before writing the
283
321
  round state, even when telemetry is off. Reports without finding keys use the
@@ -1023,6 +1061,9 @@ Place `.review-council.yml` in your project root and run `rcl` from there. rcl l
1023
1061
  models:
1024
1062
  - anthropic/claude-fable-5-1
1025
1063
  - openai/gpt-6-sol
1064
+
1065
+ # Specialist assignments only; no additional general reviewer.
1066
+ secondaryModels:
1026
1067
  - google/gemini-3.8-flash
1027
1068
 
1028
1069
  # Async bonus reviewers — fired with each round, never awaited. Results that
@@ -1061,8 +1102,8 @@ thresholds:
1061
1102
  jaccardThreshold: 0.3 # weighted title+description similarity threshold for dedup
1062
1103
 
1063
1104
  # Convergence gating: which findings block convergence / CI (RCL-23).
1064
- # A finding gates when multi-model, critical, or unrefuted by a cheap
1065
- # verification pass; refuted single-model claims stay in the report but
1105
+ # A finding gates when multi-model, critical, or confirmed with source evidence by the
1106
+ # verifier; refuted or insufficient-evidence single-model claims stay visible but
1066
1107
  # stop blocking, and so does a claim the pass could not check (verdict
1067
1108
  # unavailable): verification promotes nothing it did not check. Report
1068
1109
  # JSON marks every finding with gating.reason
@@ -1070,7 +1111,8 @@ thresholds:
1070
1111
  gating:
1071
1112
  mode: verified-consensus # or all-findings (legacy: severity alone decides)
1072
1113
  minModels: 2 # distinct models for consensus gating
1073
- verificationModel: google/gemini-3.8-flash # direct-API only
1114
+ verificationModel: openai/gpt-6-astra # direct-API only
1115
+ verificationReasoningEffort: high # OpenAI verifier only; separate from reviewer effort
1074
1116
  verificationPassTimeout: 180000 # ms for the complete verification queue
1075
1117
 
1076
1118
  # Output defaults
@@ -1080,19 +1122,25 @@ output:
1080
1122
  belowThresholdAppendix: true # false drops below-threshold findings outright
1081
1123
 
1082
1124
  # Concurrency and reliability
1083
- concurrency: 6
1125
+ concurrency: 9 # maximum simultaneous blocking reviewer calls per process
1126
+ # set to 6 to retain the previous limit
1084
1127
  timeout: 540000 # ms per blocking model call (matches the current default)
1085
1128
  asyncTimeout: 900000 # ms per async-lane call (slow reasoning models get headroom; nothing waits on them)
1086
- # quorumFraction: 0.75 # round closes once this share of calls has completed; stragglers
1087
- # are canceled and recorded (core `models` are never canceled).
1088
- # Default: exactly 2/3 — leave unset for that; 1 disables.
1129
+ # quorumFraction: 0.75 # round closes once this share of blocking seats succeeds
1130
+ # on every chunk; all stragglers can be canceled, including core models.
1131
+ # Secondary successes never count; secondary calls still
1132
+ # running at closure are canceled. Also raises the report's
1133
+ # blocking-health requirement.
1134
+ # Default: exactly 2/3 — leave unset for that; 1 disables
1135
+ # closure and waits for every call.
1089
1136
  maxRetries: 3
1090
1137
 
1091
1138
  # Reasoning budget for providers that support it (currently OpenRouter).
1092
- # low | medium | high — default medium. Unbounded reasoning makes these
1139
+ # low | medium | high — default low (supported by the default Kimi K3).
1140
+ # Check the selected model's supported levels before overriding. Unbounded reasoning makes these
1093
1141
  # models spend the whole completion budget thinking before they answer;
1094
- # raise to 'high' for deeper review at the cost of latency and tokens.
1095
- reasoningEffort: medium
1142
+ # select a supported higher level when evaluation justifies deeper review.
1143
+ reasoningEffort: low
1096
1144
 
1097
1145
  # Context files to attach to every review
1098
1146
  context:
@@ -1106,6 +1154,11 @@ spec: SPEC.md
1106
1154
  # githubToken: ghp_...
1107
1155
  ```
1108
1156
 
1157
+ `concurrency` limits blocking reviewer calls within one RCL process. Separate
1158
+ RCL processes share provider capacity without sharing this limit; async reviewers
1159
+ and verification use their own scheduling. Set `concurrency: 6` in the applicable
1160
+ configuration to restore the previous limit for new reviews.
1161
+
1109
1162
  `maxRetries` limits additional adapter SDK invocations after the first attempt;
1110
1163
  all attempts share the call's `timeout` and parent cancellation signal. Supported
1111
1164
  transient connection failures and HTTP status errors may retry; cancellation,
@@ -1118,6 +1171,30 @@ exposes, not proof of total charges across retries.
1118
1171
 
1119
1172
  Supported config file names: `.review-council.yml`, `.review-council.yaml`, `.review-council.json`. Executable JS config is never discovered: rcl often runs in untrusted checkouts with provider keys in the environment.
1120
1173
 
1174
+ The verifier uses three verdicts: `confirmed`, `refuted`, and
1175
+ `insufficient_evidence`. Confirmation requires a reachable failure mechanism and
1176
+ exact code excerpts from the supplied change; citations are checked against that
1177
+ source before a claim can be promoted to `verified`. Missing context or inability
1178
+ to refute a claim is not confirmation. This checks citation provenance, not semantic
1179
+ truth: the verifier still has to reason correctly. Infrastructure failures remain
1180
+ `unavailable`. Historical `unrefuted` verdicts retain their original meaning.
1181
+
1182
+ Astra defaults to `high` effort. Set `gating.verificationReasoningEffort` to `low`,
1183
+ `medium`, `high`, `xhigh`, or `max` for an OpenAI verifier. The setting is included
1184
+ in the report header and retained verification plan. Other provider overrides
1185
+ retain their provider effort defaults and reject this OpenAI-only setting.
1186
+
1187
+ The top-level `reasoningEffort` applies only to OpenRouter reviewers. Direct
1188
+ Sol and Gemini reviewers use their provider defaults (currently `medium`).
1189
+ Fable 5.1 reviews explicitly use `high`, streaming, and a 65,536-token output
1190
+ ceiling so thinking and findings share adequate headroom. This follows
1191
+ [Anthropic's recommended starting effort](https://platform.claude.com/docs/en/build-with-claude/effort)
1192
+ while preserving RCL's whole-call timeout and rejection of incomplete output.
1193
+ OpenRouter reviewers default to `low`, a supported level for the default Kimi K3;
1194
+ explicit `reasoningEffort` overrides are preserved. Kimi K3 advertises `low`,
1195
+ `high`, and `max`, so avoid overriding it to `medium`. Effort labels are
1196
+ provider-specific and do not imply equal compute or quality across models.
1197
+
1121
1198
  Verifier calls default to the remaining whole-pass budget. Set the optional
1122
1199
  `gating.verificationTimeout` in milliseconds to impose a shorter per-call limit;
1123
1200
  every call is still capped by the remaining `verificationPassTimeout` deadline.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Core (blocking) council — every round waits for these and only these.
2
+ * Primary council — general reviewers; specialists also use secondary models.
3
3
  * Direct-API models only: the RCL-21 audit (922 rounds, 15,268 calls) found
4
4
  * the OpenRouter wing at p50 7–9.5 min per call with 19–39% dead calls,
5
5
  * last-finisher in 97.6% of rounds; the audited direct trio answered in
@@ -7,7 +7,7 @@
7
7
  * topology drops the median round from 14.4 to 2.0 min while 91% of
8
8
  * multi-model findings still surface.
9
9
  */
10
- export declare const DEFAULT_MODELS: readonly ["anthropic/claude-fable-5-1", "openai/gpt-6-sol", "google/gemini-3.8-flash"];
10
+ export declare const DEFAULT_MODELS: readonly ["anthropic/claude-fable-5-1", "openai/gpt-6-sol"];
11
11
  /**
12
12
  * Async bonus reviewers — fired with the round but never awaited; whatever
13
13
  * has arrived by the NEXT round's dedup is merged then, marked async in the
@@ -15,14 +15,8 @@ export declare const DEFAULT_MODELS: readonly ["anthropic/claude-fable-5-1", "op
15
15
  * corroboration rate (62%) but is ~6× slower than the core trio.
16
16
  */
17
17
  export declare const DEFAULT_ASYNC_MODELS: readonly ["openrouter/moonshotai/kimi-k3"];
18
- /**
19
- * Secondary models — specialized round-robin only, no general role.
20
- * Empty by default since RCL-25: qwen3.8-max, deepseek-v4-flash and grok-4.5
21
- * were removed after the audit (24–39% dead calls, worst finding-cost in the
22
- * council). Before any slow model earns a seat back, try it via its direct
23
- * provider API instead of OpenRouter and re-measure.
24
- */
25
- export declare const DEFAULT_SECONDARY_MODELS: readonly [];
18
+ /** Gemini contributes specialist reviews without adding a general-review seat. */
19
+ export declare const DEFAULT_SECONDARY_MODELS: readonly ["google/gemini-3.8-flash"];
26
20
  export declare const DEFAULT_THRESHOLDS: {
27
21
  readonly minConsensusScore: 0.4;
28
22
  readonly minConfidence: 0.2;
@@ -64,11 +58,12 @@ export declare const DEFAULT_MAX_RETRIES = 3;
64
58
  /**
65
59
  * Reasoning budget for OpenRouter-hosted models. Unbounded, they spend the
66
60
  * whole completion budget (and many minutes) thinking before emitting any
67
- * findings; 'medium' is calibrated against this repo's own diffs, where it
68
- * took the council from 10/17 to 17/17 completed reviews.
61
+ * findings. Kimi K3, the default async model, supports low/high/max, not
62
+ * medium. Use the supported low level while retaining the output/time caps;
63
+ * explicit configuration can still select another effort for other models.
69
64
  */
70
- export declare const DEFAULT_REASONING_EFFORT = "medium";
71
- export declare const DEFAULT_CONCURRENCY = 6;
65
+ export declare const DEFAULT_REASONING_EFFORT = "low";
66
+ export declare const DEFAULT_CONCURRENCY = 9;
72
67
  export declare const DEFAULT_SEVERITY_ORDER: readonly ["critical", "important", "minor", "nitpick"];
73
68
  export declare const CONFIDENCE_THRESHOLDS: {
74
69
  readonly veryHigh: 0.8;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Core (blocking) council — every round waits for these and only these.
2
+ * Primary council — general reviewers; specialists also use secondary models.
3
3
  * Direct-API models only: the RCL-21 audit (922 rounds, 15,268 calls) found
4
4
  * the OpenRouter wing at p50 7–9.5 min per call with 19–39% dead calls,
5
5
  * last-finisher in 97.6% of rounds; the audited direct trio answered in
@@ -10,7 +10,6 @@
10
10
  export const DEFAULT_MODELS = [
11
11
  'anthropic/claude-fable-5-1',
12
12
  'openai/gpt-6-sol',
13
- 'google/gemini-3.8-flash',
14
13
  ];
15
14
  /**
16
15
  * Async bonus reviewers — fired with the round but never awaited; whatever
@@ -19,14 +18,8 @@ export const DEFAULT_MODELS = [
19
18
  * corroboration rate (62%) but is ~6× slower than the core trio.
20
19
  */
21
20
  export const DEFAULT_ASYNC_MODELS = ['openrouter/moonshotai/kimi-k3'];
22
- /**
23
- * Secondary models — specialized round-robin only, no general role.
24
- * Empty by default since RCL-25: qwen3.8-max, deepseek-v4-flash and grok-4.5
25
- * were removed after the audit (24–39% dead calls, worst finding-cost in the
26
- * council). Before any slow model earns a seat back, try it via its direct
27
- * provider API instead of OpenRouter and re-measure.
28
- */
29
- export const DEFAULT_SECONDARY_MODELS = [];
21
+ /** Gemini contributes specialist reviews without adding a general-review seat. */
22
+ export const DEFAULT_SECONDARY_MODELS = ['google/gemini-3.8-flash'];
30
23
  export const DEFAULT_THRESHOLDS = {
31
24
  minConsensusScore: 0.4,
32
25
  minConfidence: 0.2,
@@ -68,11 +61,12 @@ export const DEFAULT_MAX_RETRIES = 3;
68
61
  /**
69
62
  * Reasoning budget for OpenRouter-hosted models. Unbounded, they spend the
70
63
  * whole completion budget (and many minutes) thinking before emitting any
71
- * findings; 'medium' is calibrated against this repo's own diffs, where it
72
- * took the council from 10/17 to 17/17 completed reviews.
64
+ * findings. Kimi K3, the default async model, supports low/high/max, not
65
+ * medium. Use the supported low level while retaining the output/time caps;
66
+ * explicit configuration can still select another effort for other models.
73
67
  */
74
- export const DEFAULT_REASONING_EFFORT = 'medium';
75
- export const DEFAULT_CONCURRENCY = 6;
68
+ export const DEFAULT_REASONING_EFFORT = 'low';
69
+ export const DEFAULT_CONCURRENCY = 9;
76
70
  export const DEFAULT_SEVERITY_ORDER = [
77
71
  'critical',
78
72
  'important',
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4BAA4B;IAC5B,kBAAkB;IAClB,yBAAyB;CACjB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,+BAA+B,CAAU,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAW,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,CAAC;IACnB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,WAAW;IACX,OAAO;IACP,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACA,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4BAA4B;IAC5B,kBAAkB;CACV,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,+BAA+B,CAAU,CAAC;AAE/E,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,yBAAyB,CAAU,CAAC;AAE7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,CAAC;IACnB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,WAAW;IACX,OAAO;IACP,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACA,CAAC"}
@@ -44,9 +44,17 @@ export declare const ReasoningEffortSchema: z.ZodEnum<{
44
44
  medium: "medium";
45
45
  high: "high";
46
46
  }>;
47
+ export declare const VerificationReasoningEffortSchema: z.ZodEnum<{
48
+ low: "low";
49
+ medium: "medium";
50
+ high: "high";
51
+ xhigh: "xhigh";
52
+ max: "max";
53
+ }>;
54
+ export type VerificationReasoningEffort = z.infer<typeof VerificationReasoningEffortSchema>;
47
55
  /**
48
56
  * Convergence gating (RCL-23). `verified-consensus` (default): a finding
49
- * gates only when multi-model, critical, or unrefuted by the verification
57
+ * gates only when multi-model, critical, or confirmed with evidence by the verification
50
58
  * pass. `all-findings` restores the legacy behavior where every
51
59
  * critical/important finding gates.
52
60
  */
@@ -57,6 +65,13 @@ export declare const GatingSchema: z.ZodObject<{
57
65
  }>>;
58
66
  minModels: z.ZodOptional<z.ZodNumber>;
59
67
  verificationModel: z.ZodOptional<z.ZodString>;
68
+ verificationReasoningEffort: z.ZodOptional<z.ZodEnum<{
69
+ low: "low";
70
+ medium: "medium";
71
+ high: "high";
72
+ xhigh: "xhigh";
73
+ max: "max";
74
+ }>>;
60
75
  verificationTimeout: z.ZodOptional<z.ZodNumber>;
61
76
  verificationPassTimeout: z.ZodOptional<z.ZodNumber>;
62
77
  }, z.core.$strip>;
@@ -105,6 +120,13 @@ export declare const ConfigSchema: z.ZodObject<{
105
120
  }>>;
106
121
  minModels: z.ZodOptional<z.ZodNumber>;
107
122
  verificationModel: z.ZodOptional<z.ZodString>;
123
+ verificationReasoningEffort: z.ZodOptional<z.ZodEnum<{
124
+ low: "low";
125
+ medium: "medium";
126
+ high: "high";
127
+ xhigh: "xhigh";
128
+ max: "max";
129
+ }>>;
108
130
  verificationTimeout: z.ZodOptional<z.ZodNumber>;
109
131
  verificationPassTimeout: z.ZodOptional<z.ZodNumber>;
110
132
  }, z.core.$strip>>;
@@ -41,9 +41,10 @@ export const OutputSchema = z.object({
41
41
  belowThresholdAppendix: z.boolean().optional(),
42
42
  });
43
43
  export const ReasoningEffortSchema = z.enum(['low', 'medium', 'high']);
44
+ export const VerificationReasoningEffortSchema = z.enum(['low', 'medium', 'high', 'xhigh', 'max']);
44
45
  /**
45
46
  * Convergence gating (RCL-23). `verified-consensus` (default): a finding
46
- * gates only when multi-model, critical, or unrefuted by the verification
47
+ * gates only when multi-model, critical, or confirmed with evidence by the verification
47
48
  * pass. `all-findings` restores the legacy behavior where every
48
49
  * critical/important finding gates.
49
50
  */
@@ -53,6 +54,8 @@ export const GatingSchema = z.object({
53
54
  minModels: z.number().int().min(2).optional(),
54
55
  /** Direct-API model for the refutation pass (openrouter/ is rejected). */
55
56
  verificationModel: z.string().optional(),
57
+ /** OpenAI verifier effort, independent of reviewer reasoning effort. */
58
+ verificationReasoningEffort: VerificationReasoningEffortSchema.optional(),
56
59
  /** Per-call timeout (ms) for the verification pass. */
57
60
  verificationTimeout: TimerDelaySchema.optional(),
58
61
  /** Whole-pass timeout (ms) across every verification batch. */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type VerificationReasoningEffort } from '../config/schema.js';
1
2
  import type { ConsensusFinding } from './types.js';
2
3
  import type { ModelAnswer } from '../dispatch/adapter.js';
3
4
  import type { FileChange } from '../resolver/types.js';
@@ -9,7 +10,7 @@ import type { FileChange } from '../resolver/types.js';
9
10
  * zero). A finding now gates only if it is:
10
11
  * (a) supported by ≥ minModels distinct models after dedup → 'consensus'
11
12
  * (b) critical severity → 'critical'
12
- * (c) single-model but unrefuted by a cheap verification
13
+ * (c) single-model and confirmed with source evidence by a verification
13
14
  * pass against the actual change → 'verified'
14
15
  * Everything else still lands in the report — it just stops blocking
15
16
  * convergence ('none'). This is the two-stage recall→precision split
@@ -30,14 +31,16 @@ export interface GatingVerification {
30
31
  model?: string;
31
32
  /**
32
33
  * 'refuted': the verifier showed the finding does not hold → not gating.
33
- * 'unrefuted': the verifier could not refute it → gates.
34
+ * 'confirmed': source-supported failure mechanism → gates.
35
+ * 'insufficient_evidence': insufficient source evidence → not promoted.
36
+ * 'unrefuted': historical version-one verdict, preserved on replay only.
34
37
  * 'unavailable': the verification pass failed, did not run, or did not
35
38
  * cover this finding — it is left at the tier it earned without
36
39
  * verification ('none'): a single-model claim nobody checked is reported,
37
40
  * not promoted to blocking (RCL-62). Read `note` for the cause; a
38
41
  * persistently broken verifier is a fixable infrastructure problem.
39
42
  */
40
- verdict: 'refuted' | 'unrefuted' | 'unavailable';
43
+ verdict: 'confirmed' | 'refuted' | 'insufficient_evidence' | 'unrefuted' | 'unavailable';
41
44
  note?: string;
42
45
  }
43
46
  export interface GatingInfo {
@@ -48,6 +51,7 @@ export type AskFn = (model: string, systemPrompt: string, userPrompt: string, op
48
51
  timeoutMs: number;
49
52
  maxRetries: number;
50
53
  signal?: AbortSignal;
54
+ reasoningEffort?: VerificationReasoningEffort;
51
55
  }) => Promise<ModelAnswer>;
52
56
  export interface GatingOptions {
53
57
  /** Distinct supporting models that make a finding 'consensus'. */
@@ -58,6 +62,7 @@ export interface GatingOptions {
58
62
  * and do not gate, and no content leaves the configured providers.
59
63
  */
60
64
  verificationModel: string | undefined;
65
+ verificationReasoningEffort?: VerificationReasoningEffort;
61
66
  verificationTimeoutMs: number;
62
67
  /** Whole verification-lane budget across all queued batches. */
63
68
  verificationPassTimeoutMs?: number;
@@ -86,7 +91,10 @@ export interface VerificationStats {
86
91
  model: string;
87
92
  candidates: number;
88
93
  refuted: number;
94
+ /** Historical count; new verification uses confirmed/insufficientEvidence. */
89
95
  unrefuted: number;
96
+ confirmed?: number;
97
+ insufficientEvidence?: number;
90
98
  unavailable: number;
91
99
  durationMs: number;
92
100
  }
@@ -103,6 +111,7 @@ export interface GatingConfigInput {
103
111
  mode?: 'verified-consensus' | 'all-findings';
104
112
  minModels?: number;
105
113
  verificationModel?: string;
114
+ verificationReasoningEffort?: VerificationReasoningEffort;
106
115
  verificationTimeout?: number;
107
116
  verificationPassTimeout?: number;
108
117
  }
@@ -110,13 +119,15 @@ export interface ResolvedGatingConfig {
110
119
  mode: 'verified-consensus' | 'all-findings';
111
120
  minModels: number;
112
121
  verificationModel: string | undefined;
122
+ verificationReasoningEffort?: VerificationReasoningEffort;
113
123
  verificationTimeoutMs: number;
114
124
  verificationPassTimeoutMs: number;
115
125
  }
116
126
  export declare const DEFAULT_GATING_CONFIG: {
117
127
  readonly mode: "verified-consensus";
118
128
  readonly minModels: 2;
119
- readonly verificationModel: "google/gemini-3.8-flash";
129
+ readonly verificationModel: "openai/gpt-6-astra";
130
+ readonly verificationReasoningEffort: "high";
120
131
  readonly verificationPassTimeoutMs: 180000;
121
132
  };
122
133
  /**
@@ -143,14 +154,17 @@ export interface GatingBatch {
143
154
  findingIndices: number[];
144
155
  systemPrompt: string;
145
156
  userPrompt: string;
157
+ /** Supplied source excerpts, retained for citation validation in version two. */
158
+ sourcePatches?: Record<string, string>;
146
159
  }
147
160
  /** Private deterministic work plan, not authenticated evidence or launch authority. */
148
161
  export interface GatingPlan {
149
- version: 1;
162
+ version: 1 | 2;
150
163
  findings: ConsensusFinding[];
151
164
  initialGating: Array<GatingInfo | null>;
152
165
  candidateIndices: number[];
153
166
  model: string;
167
+ verificationReasoningEffort?: VerificationReasoningEffort;
154
168
  verificationTimeoutMs: number;
155
169
  verificationPassTimeoutMs: number;
156
170
  batches: GatingBatch[];
@@ -164,7 +178,7 @@ export type GatingBatchOutcome = {
164
178
  kind: 'failure';
165
179
  reason: string;
166
180
  };
167
- type GatingPlanOptions = Pick<GatingOptions, 'minModels' | 'verificationModel' | 'verificationTimeoutMs' | 'verificationPassTimeoutMs' | 'diffFiles' | 'modelWeights'>;
181
+ type GatingPlanOptions = Pick<GatingOptions, 'minModels' | 'verificationModel' | 'verificationTimeoutMs' | 'verificationPassTimeoutMs' | 'verificationReasoningEffort' | 'diffFiles' | 'modelWeights'>;
168
182
  /** Derive every private verifier request before dispatch, without clocks, adapters or caller aliases. */
169
183
  export declare function planGating(input: ConsensusFinding[], options: GatingPlanOptions): GatingPlan;
170
184
  /**