review-council 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -153,6 +153,52 @@ rcl roles show <name> # Show system prompt and details for a role
153
153
 
154
154
  ---
155
155
 
156
+ ### `rcl converge-attempt`
157
+
158
+ Machine-enforced safety guard used by the generated `rcl-converge` skill.
159
+ Each call atomically and durably consumes one per-target attempt under the
160
+ repository's common Git directory, so the budget survives sessions, linked
161
+ worktrees, and abrupt system restarts.
162
+ New targets default to seven attempts, but an explicit invocation can set any
163
+ positive cap with `--max-attempts`. Omitting the flag on resume preserves the
164
+ persisted cap. At the boundary, RCL refuses before provider calls and directs
165
+ the workflow to ask the user; an approved continuation explicitly supplies a
166
+ higher cap.
167
+
168
+ At the skill level, `--max-attempts N` controls this machine launch budget.
169
+ The pre-existing `--max-rounds N` flag retains its original meaning as a
170
+ separate evidence-round limit (1–7), so existing invocations do not silently
171
+ change behavior.
172
+
173
+ Exit code 2 means the configured cap was exhausted and explicit continuation
174
+ approval is required. Exit code 3 means attempt accounting itself failed
175
+ (state, lock, Git, filesystem, or another infrastructure error); increasing
176
+ the cap is not the remedy. With `--json`, failures are emitted as structured
177
+ JSON on stderr. If the attempt is durably recorded but final lock release
178
+ fails, the claim still succeeds with a warning so retrying cannot spend a
179
+ second slot for the same intended launch.
180
+
181
+ The short accounting mutex is fully written as a private owner file and then
182
+ published with an exclusive hard link, which cannot replace an existing file
183
+ or legacy directory. State contents and, where supported, their directory
184
+ entry are synced before a claim succeeds. A dead owner is isolated through a
185
+ token-scoped hard-link tombstone before another claimant can proceed; inode
186
+ checks make that tombstone safe to remove after reclamation. Invalid or legacy
187
+ ownerless locks fail closed, and timeout errors include the manual recovery
188
+ path. When upgrading,
189
+ an evidence ledger seeds only its highest recorded round: historical failed or
190
+ missing-report launches cannot be reconstructed, while every claim after the
191
+ machine state is created is counted exactly. The state remains a same-user
192
+ local safety mechanism, not a tamper-proof store: deliberately deleting
193
+ `.git/rcl-converge-attempts` is an explicit policy bypass.
194
+
195
+ ```bash
196
+ rcl converge-attempt --target owner-repo-123 # default/persisted cap
197
+ rcl converge-attempt --target owner-repo-123 --max-attempts 10 # explicit override
198
+ ```
199
+
200
+ ---
201
+
156
202
  ## Config File
157
203
 
158
204
  Place `.review-council.yml` in your project root (or any parent directory). All fields are optional.
@@ -225,6 +271,12 @@ spec: SPEC.md
225
271
 
226
272
  Supported config file names: `.review-council.yml`, `.review-council.yaml`, `.review-council.json`, `review-council.config.js`.
227
273
 
274
+ Before dispatch, RCL prints the expanded reviewer × chunk call count,
275
+ concurrency, wave count, timeout, and timeout-bound queue estimate. Interactive
276
+ runs update the spinner; redirected runs emit periodic heartbeat and bounded
277
+ completion lines with status counters, so a long queue is distinguishable from
278
+ a hung process.
279
+
228
280
  ---
229
281
 
230
282
  ## How Consensus Works
@@ -38,4 +38,4 @@ export declare function hasOpposingSentiment(a: Finding, b: Finding, specificOnl
38
38
  */
39
39
  export declare function conceptSimilarity(a: Finding, b: Finding): number;
40
40
  export declare function linesOverlap(a: Finding, b: Finding, window: number): boolean;
41
- export declare function deduplicateFindings(reviews: ModelReview[], jaccardThreshold?: number, lineWindow?: number): DeduplicatedGroup[];
41
+ export declare function deduplicateFindings(reviews: ModelReview[], jaccardThreshold?: number, lineWindow?: number, minConsensusScore?: number): DeduplicatedGroup[];