@zephyrdeng/pi-review 0.6.1 → 0.7.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 (125) hide show
  1. package/README.md +110 -13
  2. package/README.zh-CN.md +64 -3
  3. package/dist/args.d.ts +8 -0
  4. package/dist/args.d.ts.map +1 -1
  5. package/dist/args.js +147 -28
  6. package/dist/args.js.map +1 -1
  7. package/dist/args.test.d.ts +2 -0
  8. package/dist/args.test.d.ts.map +1 -0
  9. package/dist/args.test.js +115 -0
  10. package/dist/args.test.js.map +1 -0
  11. package/dist/cli-exit.test.d.ts +2 -0
  12. package/dist/cli-exit.test.d.ts.map +1 -0
  13. package/dist/cli-exit.test.js +84 -0
  14. package/dist/cli-exit.test.js.map +1 -0
  15. package/dist/cli.js +16 -2
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config.d.ts +1 -0
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +1 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/extensions/review.d.ts +2 -0
  22. package/dist/extensions/review.js +22 -0
  23. package/dist/extensions/rv-prompts.d.ts +19 -0
  24. package/dist/extensions/rv-prompts.js +132 -0
  25. package/dist/index.d.ts +17 -7
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +12 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/json-events.d.ts +45 -0
  30. package/dist/json-events.d.ts.map +1 -1
  31. package/dist/json-events.js +185 -0
  32. package/dist/json-events.js.map +1 -1
  33. package/dist/json-events.test.js +64 -1
  34. package/dist/json-events.test.js.map +1 -1
  35. package/dist/loop.d.ts +36 -0
  36. package/dist/loop.d.ts.map +1 -0
  37. package/dist/loop.js +73 -0
  38. package/dist/loop.js.map +1 -0
  39. package/dist/loop.test.d.ts +2 -0
  40. package/dist/loop.test.d.ts.map +1 -0
  41. package/dist/loop.test.js +83 -0
  42. package/dist/loop.test.js.map +1 -0
  43. package/dist/matcher.d.ts +74 -0
  44. package/dist/matcher.d.ts.map +1 -0
  45. package/dist/matcher.js +202 -0
  46. package/dist/matcher.js.map +1 -0
  47. package/dist/matcher.test.d.ts +2 -0
  48. package/dist/matcher.test.d.ts.map +1 -0
  49. package/dist/matcher.test.js +161 -0
  50. package/dist/matcher.test.js.map +1 -0
  51. package/dist/meta-footer.d.ts +15 -1
  52. package/dist/meta-footer.d.ts.map +1 -1
  53. package/dist/meta-footer.js +108 -0
  54. package/dist/meta-footer.js.map +1 -1
  55. package/dist/meta-footer.test.js +43 -1
  56. package/dist/meta-footer.test.js.map +1 -1
  57. package/dist/panel-aggregate.d.ts +18 -0
  58. package/dist/panel-aggregate.d.ts.map +1 -0
  59. package/dist/panel-aggregate.js +247 -0
  60. package/dist/panel-aggregate.js.map +1 -0
  61. package/dist/panel-aggregate.test.d.ts +2 -0
  62. package/dist/panel-aggregate.test.d.ts.map +1 -0
  63. package/dist/panel-aggregate.test.js +461 -0
  64. package/dist/panel-aggregate.test.js.map +1 -0
  65. package/dist/panel-cli.test.d.ts +2 -0
  66. package/dist/panel-cli.test.d.ts.map +1 -0
  67. package/dist/panel-cli.test.js +188 -0
  68. package/dist/panel-cli.test.js.map +1 -0
  69. package/dist/panel-config.d.ts +19 -0
  70. package/dist/panel-config.d.ts.map +1 -0
  71. package/dist/panel-config.js +115 -0
  72. package/dist/panel-config.js.map +1 -0
  73. package/dist/panel-config.test.d.ts +2 -0
  74. package/dist/panel-config.test.d.ts.map +1 -0
  75. package/dist/panel-config.test.js +91 -0
  76. package/dist/panel-config.test.js.map +1 -0
  77. package/dist/panel-loop.test.d.ts +2 -0
  78. package/dist/panel-loop.test.d.ts.map +1 -0
  79. package/dist/panel-loop.test.js +118 -0
  80. package/dist/panel-loop.test.js.map +1 -0
  81. package/dist/panel.d.ts +10 -0
  82. package/dist/panel.d.ts.map +1 -0
  83. package/dist/panel.js +315 -0
  84. package/dist/panel.js.map +1 -0
  85. package/dist/presets.d.ts +2 -1
  86. package/dist/presets.d.ts.map +1 -1
  87. package/dist/presets.js +10 -0
  88. package/dist/presets.js.map +1 -1
  89. package/dist/prompt.d.ts +14 -1
  90. package/dist/prompt.d.ts.map +1 -1
  91. package/dist/prompt.js +61 -15
  92. package/dist/prompt.js.map +1 -1
  93. package/dist/prompt.test.d.ts +2 -0
  94. package/dist/prompt.test.d.ts.map +1 -0
  95. package/dist/prompt.test.js +37 -0
  96. package/dist/prompt.test.js.map +1 -0
  97. package/dist/review-result.d.ts +5 -0
  98. package/dist/review-result.d.ts.map +1 -0
  99. package/dist/review-result.js +98 -0
  100. package/dist/review-result.js.map +1 -0
  101. package/dist/review-result.test.d.ts +2 -0
  102. package/dist/review-result.test.d.ts.map +1 -0
  103. package/dist/review-result.test.js +196 -0
  104. package/dist/review-result.test.js.map +1 -0
  105. package/dist/review.d.ts +10 -4
  106. package/dist/review.d.ts.map +1 -1
  107. package/dist/review.js +82 -20
  108. package/dist/review.js.map +1 -1
  109. package/dist/review.meta.test.js +2 -2
  110. package/dist/review.meta.test.js.map +1 -1
  111. package/dist/skill-protocol.test.d.ts +2 -0
  112. package/dist/skill-protocol.test.d.ts.map +1 -0
  113. package/dist/skill-protocol.test.js +35 -0
  114. package/dist/skill-protocol.test.js.map +1 -0
  115. package/dist/types.d.ts +147 -5
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +11 -0
  118. package/dist/types.js.map +1 -1
  119. package/extensions/rv-completions.test.ts +15 -0
  120. package/extensions/rv-completions.ts +7 -1
  121. package/package.json +3 -3
  122. package/resources/panel-presets.json +21 -0
  123. package/resources/system-prompt.md +11 -1
  124. package/skills/pi-review/SKILL.md +90 -12
  125. package/skills/pi-review/references/codex-tools.md +19 -6
@@ -0,0 +1,461 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { aggregatePanel, effectiveThreshold } from "./panel-aggregate.js";
4
+ import { DeterministicMatcher, SemanticMatcher } from "./matcher.js";
5
+ function finding(summary, opts = {}) {
6
+ return {
7
+ ...(opts.id ? { id: opts.id } : {}),
8
+ ...(opts.severity ? { severity: opts.severity } : {}),
9
+ ...(opts.path ? { path: opts.path } : {}),
10
+ summary,
11
+ actionable: opts.actionable ?? true,
12
+ };
13
+ }
14
+ function review(status, findings, verdictSource = "parsed", parseError) {
15
+ const verdict = status === "clean"
16
+ ? "approve"
17
+ : status === "has_findings"
18
+ ? "request_changes"
19
+ : status === "needs_human"
20
+ ? "needs_clarification"
21
+ : "blocked";
22
+ return {
23
+ verdict,
24
+ verdictSource,
25
+ status,
26
+ findings,
27
+ actionableCount: findings.filter((f) => f.actionable).length,
28
+ ...(parseError ? { parseError } : {}),
29
+ };
30
+ }
31
+ function submission(reviewerId, result, opts = {}) {
32
+ return {
33
+ reviewerId,
34
+ ...(opts.role ? { role: opts.role } : {}),
35
+ model: opts.model ?? null,
36
+ durationMs: opts.durationMs ?? 100,
37
+ result,
38
+ };
39
+ }
40
+ /** Matcher that groups by a caller-supplied key over the source finding. */
41
+ function matcherByKey(keyFn) {
42
+ return {
43
+ async match(findings) {
44
+ const map = new Map();
45
+ for (const sf of findings) {
46
+ const key = keyFn(sf);
47
+ const group = map.get(key);
48
+ if (group)
49
+ group.push(sf.id);
50
+ else
51
+ map.set(key, [sf.id]);
52
+ }
53
+ return { groups: [...map.values()], errors: [], adjudicationUsed: false };
54
+ },
55
+ };
56
+ }
57
+ function fakeMatcher(groups, errors = []) {
58
+ return { async match() { return { groups, errors, adjudicationUsed: false }; } };
59
+ }
60
+ const bugA = (actionable = true) => finding("Off-by-one in loop", { id: "F1", path: "src/cli.ts", severity: "high", actionable });
61
+ const bugB = (actionable = true) => finding("Missing null check", { id: "F1", path: "src/util.ts", severity: "medium", actionable });
62
+ /** Three reviewers: r1+r2 report bug A, r3 reports bug B. */
63
+ function matrixFixture() {
64
+ return [
65
+ submission("r1", review("has_findings", [bugA()])),
66
+ submission("r2", review("has_findings", [bugA()])),
67
+ submission("r3", review("has_findings", [bugB()])),
68
+ ];
69
+ }
70
+ function byPathSummary() {
71
+ return matcherByKey((sf) => `${sf.finding.path ?? ""}::${sf.finding.summary}`);
72
+ }
73
+ test("corroboration: two reviewers reporting the same actionable bug confirm one cluster; a singleton stays advisory", async () => {
74
+ const result = await aggregatePanel({
75
+ reviewers: matrixFixture(),
76
+ policy: "quorum",
77
+ minAgree: 2,
78
+ configuredReviewers: 3,
79
+ matcher: byPathSummary(),
80
+ });
81
+ assert.equal(result.status, "has_findings");
82
+ assert.equal(result.confirmedClusters.length, 1);
83
+ const cluster = result.confirmedClusters[0];
84
+ assert.equal(cluster.summary, "Off-by-one in loop");
85
+ assert.equal(cluster.supportCount, 2);
86
+ assert.equal(cluster.actionableSupportCount, 2);
87
+ assert.deepEqual(cluster.supportingReviewerIds, ["r1", "r2"]);
88
+ assert.equal(result.advisories.length, 1);
89
+ assert.equal(result.advisories[0].summary, "Missing null check");
90
+ assert.equal(result.advisories[0].supportCount, 1);
91
+ assert.equal(result.advisories[0].confirmed, false);
92
+ });
93
+ test("no double-count: duplicate equivalent findings from one reviewer contribute support one", async () => {
94
+ const reviewers = [
95
+ submission("r1", review("has_findings", [bugA(), finding("Off-by-one in loop", { id: "F2", path: "src/cli.ts" })])),
96
+ submission("r2", review("clean", [])),
97
+ ];
98
+ const result = await aggregatePanel({
99
+ reviewers,
100
+ policy: "quorum",
101
+ minAgree: 2,
102
+ configuredReviewers: 2,
103
+ matcher: byPathSummary(),
104
+ });
105
+ assert.equal(result.confirmedClusters.length, 0);
106
+ assert.equal(result.advisories.length, 1);
107
+ assert.equal(result.advisories[0].supportCount, 1);
108
+ assert.deepEqual(result.advisories[0].supportingReviewerIds, ["r1"]);
109
+ assert.equal(result.advisories[0].sourceFindingIds.length, 2);
110
+ });
111
+ test("false-merge: two different bugs in the same path remain separate clusters", async () => {
112
+ const reviewers = [
113
+ submission("r1", review("has_findings", [finding("Null deref", { id: "F1", path: "src/cli.ts" })])),
114
+ submission("r2", review("has_findings", [finding("Race condition", { id: "F1", path: "src/cli.ts" })])),
115
+ ];
116
+ const result = await aggregatePanel({
117
+ reviewers,
118
+ policy: "any",
119
+ configuredReviewers: 2,
120
+ matcher: byPathSummary(),
121
+ });
122
+ assert.equal(result.confirmedClusters.length, 2);
123
+ assert.deepEqual(result.confirmedClusters.map((c) => c.summary).sort(), ["Null deref", "Race condition"]);
124
+ });
125
+ test("different-wording: semantically equivalent findings cluster when the matcher confirms equivalence", async () => {
126
+ const reviewers = [
127
+ submission("r1", review("has_findings", [finding("loop bound is wrong", { id: "F1", path: "src/cli.ts" })])),
128
+ submission("r2", review("has_findings", [finding("off-by-one iteration", { id: "F1", path: "src/cli.ts" })])),
129
+ ];
130
+ // Injected matcher simulates an adjudicator that confirmed equivalence (same path).
131
+ const result = await aggregatePanel({
132
+ reviewers,
133
+ policy: "quorum",
134
+ minAgree: 2,
135
+ configuredReviewers: 2,
136
+ matcher: matcherByKey((sf) => sf.finding.path ?? ""),
137
+ });
138
+ assert.equal(result.status, "has_findings");
139
+ assert.equal(result.confirmedClusters.length, 1);
140
+ assert.equal(result.confirmedClusters[0].supportCount, 2);
141
+ });
142
+ test("path-conflict: findings with incompatible paths are not merged even when summaries match", async () => {
143
+ const reviewers = [
144
+ submission("r1", review("has_findings", [finding("same summary", { id: "F1", path: "src/a.ts" })])),
145
+ submission("r2", review("has_findings", [finding("same summary", { id: "F1", path: "src/b.ts" })])),
146
+ ];
147
+ const result = await aggregatePanel({
148
+ reviewers,
149
+ policy: "any",
150
+ configuredReviewers: 2,
151
+ matcher: byPathSummary(),
152
+ });
153
+ assert.equal(result.confirmedClusters.length, 2);
154
+ });
155
+ test("actionability: two informational observations do not confirm; mixed support exposes both counts", async () => {
156
+ const informational = [
157
+ submission("r1", review("has_findings", [bugA(false)])),
158
+ submission("r2", review("has_findings", [bugA(false)])),
159
+ ];
160
+ const infoResult = await aggregatePanel({
161
+ reviewers: informational,
162
+ policy: "any",
163
+ configuredReviewers: 2,
164
+ matcher: byPathSummary(),
165
+ });
166
+ assert.equal(infoResult.status, "clean");
167
+ assert.equal(infoResult.confirmedClusters.length, 0);
168
+ assert.equal(infoResult.advisories.length, 1);
169
+ assert.equal(infoResult.advisories[0].actionableSupportCount, 0);
170
+ const mixed = [
171
+ submission("r1", review("has_findings", [bugA(true)])),
172
+ submission("r2", review("has_findings", [bugA(false)])),
173
+ ];
174
+ const mixedResult = await aggregatePanel({
175
+ reviewers: mixed,
176
+ policy: "quorum",
177
+ minAgree: 2,
178
+ configuredReviewers: 2,
179
+ matcher: byPathSummary(),
180
+ });
181
+ const cluster = mixedResult.advisories[0];
182
+ assert.equal(cluster.supportCount, 2);
183
+ assert.equal(cluster.actionableSupportCount, 1);
184
+ assert.equal(cluster.confirmed, false);
185
+ assert.equal(mixedResult.status, "clean");
186
+ });
187
+ test("policy matrix: the same fixture evaluates under any, quorum, majority, and unanimous", async () => {
188
+ const expected = {
189
+ any: { threshold: 1, confirmed: 2, advisories: 0, status: "has_findings" },
190
+ quorum: { threshold: 2, confirmed: 1, advisories: 1, status: "has_findings" },
191
+ majority: { threshold: 2, confirmed: 1, advisories: 1, status: "has_findings" },
192
+ unanimous: { threshold: 3, confirmed: 0, advisories: 2, status: "clean" },
193
+ };
194
+ for (const policy of ["any", "quorum", "majority", "unanimous"]) {
195
+ const want = expected[policy];
196
+ assert.equal(effectiveThreshold(policy, 3, policy === "quorum" ? 2 : undefined), want.threshold);
197
+ const result = await aggregatePanel({
198
+ reviewers: matrixFixture(),
199
+ policy,
200
+ ...(policy === "quorum" ? { minAgree: 2 } : {}),
201
+ configuredReviewers: 3,
202
+ matcher: byPathSummary(),
203
+ });
204
+ assert.equal(result.consensusThreshold, want.threshold, `${policy} threshold`);
205
+ assert.equal(result.confirmedClusters.length, want.confirmed, `${policy} confirmed`);
206
+ assert.equal(result.advisories.length, want.advisories, `${policy} advisories`);
207
+ assert.equal(result.status, want.status, `${policy} status`);
208
+ }
209
+ });
210
+ test("default matrix: one reviewer is threshold one; two and above default to quorum two", () => {
211
+ assert.equal(effectiveThreshold("quorum", 1, 1), 1);
212
+ assert.equal(effectiveThreshold("any", 1), 1);
213
+ assert.equal(effectiveThreshold("majority", 1), 1);
214
+ assert.equal(effectiveThreshold("unanimous", 1), 1);
215
+ assert.equal(effectiveThreshold("quorum", 2), 2);
216
+ assert.equal(effectiveThreshold("quorum", 5), 2);
217
+ assert.equal(effectiveThreshold("majority", 5), 3);
218
+ assert.equal(effectiveThreshold("unanimous", 5), 5);
219
+ });
220
+ test("a clean panel with no confirmed clusters is clean even with advisories", async () => {
221
+ const reviewers = [
222
+ submission("r1", review("has_findings", [bugA()])),
223
+ submission("r2", review("clean", [])),
224
+ submission("r3", review("clean", [])),
225
+ ];
226
+ const result = await aggregatePanel({
227
+ reviewers,
228
+ policy: "quorum",
229
+ minAgree: 2,
230
+ configuredReviewers: 3,
231
+ matcher: byPathSummary(),
232
+ });
233
+ assert.equal(result.status, "clean");
234
+ assert.equal(result.confirmedClusters.length, 0);
235
+ assert.equal(result.advisories.length, 1);
236
+ assert.equal(result.actionableCount, 0);
237
+ });
238
+ test("panel health: child runtime failure yields blocked, never clean", async () => {
239
+ const reviewers = [
240
+ submission("r1", review("has_findings", [bugA()])),
241
+ submission("r2", review("blocked", [bugA()], "runtime_error", "child pi exited with status 1")),
242
+ submission("r3", review("has_findings", [bugA()])),
243
+ ];
244
+ const result = await aggregatePanel({
245
+ reviewers,
246
+ policy: "quorum",
247
+ minAgree: 2,
248
+ configuredReviewers: 3,
249
+ matcher: byPathSummary(),
250
+ });
251
+ assert.equal(result.panelHealth, "blocked");
252
+ assert.equal(result.status, "blocked");
253
+ assert.equal(result.successfulReviewers, 2);
254
+ assert.equal(result.reviewers[1].contributed, false);
255
+ });
256
+ test("panel health: unstructured dirty output yields needs-human, never clean", async () => {
257
+ const reviewers = [
258
+ submission("r1", review("has_findings", [bugA()])),
259
+ submission("r2", review("needs_human", [], "fallback", "Could not parse ## Verdict as a known enum")),
260
+ ];
261
+ const result = await aggregatePanel({
262
+ reviewers,
263
+ policy: "quorum",
264
+ minAgree: 2,
265
+ configuredReviewers: 2,
266
+ matcher: byPathSummary(),
267
+ });
268
+ assert.equal(result.panelHealth, "needs_human");
269
+ assert.equal(result.status, "needs_human");
270
+ });
271
+ test("panel health: unresolved clarification yields needs-human", async () => {
272
+ const reviewers = [
273
+ submission("r1", review("has_findings", [bugA()])),
274
+ submission("r2", review("needs_human", [], "parsed")),
275
+ ];
276
+ const result = await aggregatePanel({
277
+ reviewers,
278
+ policy: "quorum",
279
+ minAgree: 2,
280
+ configuredReviewers: 2,
281
+ matcher: byPathSummary(),
282
+ });
283
+ assert.equal(result.status, "needs_human");
284
+ });
285
+ test("aggregation semantic failure (matcher errors) yields needs-human", async () => {
286
+ const reviewers = [
287
+ submission("r1", review("has_findings", [bugA()])),
288
+ submission("r2", review("has_findings", [bugA()])),
289
+ ];
290
+ const result = await aggregatePanel({
291
+ reviewers,
292
+ policy: "quorum",
293
+ minAgree: 2,
294
+ configuredReviewers: 2,
295
+ matcher: fakeMatcher([["r1#F1", "r2#F1"]], ["adjudicator invented source finding ids: r9#F1"]),
296
+ });
297
+ assert.equal(result.status, "needs_human");
298
+ assert.equal(result.panelHealth, "needs_human");
299
+ assert.ok(result.adjudicationErrors?.some((e) => /invented/.test(e)));
300
+ });
301
+ test("aggregation runtime failure (matcher throws) yields blocked", async () => {
302
+ const reviewers = [
303
+ submission("r1", review("has_findings", [bugA()])),
304
+ submission("r2", review("has_findings", [bugA()])),
305
+ ];
306
+ const throwingMatcher = { async match() { throw new Error("adjudicator child crashed"); } };
307
+ const result = await aggregatePanel({
308
+ reviewers,
309
+ policy: "quorum",
310
+ minAgree: 2,
311
+ configuredReviewers: 2,
312
+ matcher: throwingMatcher,
313
+ });
314
+ assert.equal(result.status, "blocked");
315
+ assert.equal(result.panelHealth, "blocked");
316
+ });
317
+ test("provenance: every raw finding appears exactly once; unknown source ids are rejected", async () => {
318
+ const reviewers = [
319
+ submission("r1", review("has_findings", [bugA(), finding("Typo", { id: "F2", path: "src/util.ts" })])),
320
+ submission("r2", review("has_findings", [bugA()])),
321
+ ];
322
+ const result = await aggregatePanel({
323
+ reviewers,
324
+ policy: "quorum",
325
+ minAgree: 2,
326
+ configuredReviewers: 2,
327
+ matcher: new DeterministicMatcher(),
328
+ });
329
+ const allSourceIds = result.confirmedClusters.concat(result.advisories).flatMap((c) => c.sourceFindingIds);
330
+ assert.equal(allSourceIds.length, 3);
331
+ assert.equal(new Set(allSourceIds).size, 3);
332
+ assert.deepEqual(allSourceIds.sort(), ["r1#F1", "r1#F2", "r2#F1"].sort());
333
+ assert.equal(result.confirmedClusters.length, 1);
334
+ assert.equal(result.advisories.length, 1);
335
+ });
336
+ test("provenance: a matcher that drops a finding is rejected as needs-human and preserves dropped findings as advisories", async () => {
337
+ const reviewers = [
338
+ submission("r1", review("has_findings", [bugA()])),
339
+ submission("r2", review("has_findings", [bugA()])),
340
+ ];
341
+ const result = await aggregatePanel({
342
+ reviewers,
343
+ policy: "quorum",
344
+ minAgree: 2,
345
+ configuredReviewers: 2,
346
+ matcher: fakeMatcher([["r1#F1"]]),
347
+ });
348
+ assert.equal(result.status, "needs_human");
349
+ assert.ok(result.adjudicationErrors?.some((e) => /dropped/.test(e)));
350
+ // Dropped finding content is preserved as advisories, not silently lost.
351
+ assert.equal(result.advisories.length, 2);
352
+ assert.deepEqual(result.advisories.flatMap((c) => c.sourceFindingIds).sort(), ["r1#F1", "r2#F1"]);
353
+ });
354
+ test("top-level findings contain confirmed clusters only; advisories are separate", async () => {
355
+ const result = await aggregatePanel({
356
+ reviewers: matrixFixture(),
357
+ policy: "quorum",
358
+ minAgree: 2,
359
+ configuredReviewers: 3,
360
+ matcher: byPathSummary(),
361
+ });
362
+ assert.equal(result.findings.length, result.confirmedClusters.length);
363
+ assert.equal(result.actionableCount, result.confirmedClusters.length);
364
+ for (const f of result.findings)
365
+ assert.equal(f.actionable, true);
366
+ assert.equal(result.advisories.every((c) => !c.confirmed), true);
367
+ });
368
+ test("semantic matcher integration confirms a different-wording cluster through an injected adjudicator", async () => {
369
+ const reviewers = [
370
+ submission("r1", review("has_findings", [finding("loop bound is wrong", { id: "F1", path: "src/cli.ts" })])),
371
+ submission("r2", review("has_findings", [finding("off-by-one iteration", { id: "F1", path: "src/cli.ts" })])),
372
+ ];
373
+ const adjudicator = {
374
+ async adjudicate() {
375
+ return { merges: [{ sourceFindingIds: ["r1#F1", "r2#F1"], confidence: 0.9 }] };
376
+ },
377
+ };
378
+ const result = await aggregatePanel({
379
+ reviewers,
380
+ policy: "quorum",
381
+ minAgree: 2,
382
+ configuredReviewers: 2,
383
+ matcher: new SemanticMatcher(adjudicator),
384
+ });
385
+ assert.equal(result.adjudicationUsed, true);
386
+ assert.equal(result.status, "has_findings");
387
+ assert.equal(result.confirmedClusters.length, 1);
388
+ });
389
+ test("low-confidence semantic matches remain separate advisories (no manufactured quorum)", async () => {
390
+ const reviewers = [
391
+ submission("r1", review("has_findings", [finding("loop bound is wrong", { id: "F1", path: "src/cli.ts" })])),
392
+ submission("r2", review("has_findings", [finding("off-by-one iteration", { id: "F1", path: "src/cli.ts" })])),
393
+ ];
394
+ const adjudicator = {
395
+ async adjudicate() {
396
+ return { merges: [{ sourceFindingIds: ["r1#F1", "r2#F1"], confidence: 0.3 }] };
397
+ },
398
+ };
399
+ const result = await aggregatePanel({
400
+ reviewers,
401
+ policy: "quorum",
402
+ minAgree: 2,
403
+ configuredReviewers: 2,
404
+ matcher: new SemanticMatcher(adjudicator),
405
+ });
406
+ assert.equal(result.confirmedClusters.length, 0);
407
+ assert.equal(result.advisories.length, 2);
408
+ });
409
+ test("F1: dirty verdict (request_changes) with zero parseable findings yields needs-human, never clean", async () => {
410
+ const reviewers = [
411
+ submission("r1", review("has_findings", [], "parsed")),
412
+ submission("r2", review("has_findings", [], "parsed")),
413
+ ];
414
+ const result = await aggregatePanel({
415
+ reviewers,
416
+ policy: "quorum",
417
+ minAgree: 2,
418
+ configuredReviewers: 2,
419
+ matcher: byPathSummary(),
420
+ });
421
+ assert.equal(result.status, "needs_human");
422
+ assert.equal(result.panelHealth, "needs_human");
423
+ assert.equal(result.confirmedClusters.length, 0);
424
+ });
425
+ test("F7: duplicate finding ids from one reviewer stay unique by construction and each appears once", async () => {
426
+ const reviewers = [
427
+ submission("r1", review("has_findings", [
428
+ finding("same bug", { id: "F1", path: "src/cli.ts" }),
429
+ finding("same bug", { id: "F1", path: "src/cli.ts" }),
430
+ ])),
431
+ submission("r2", review("has_findings", [finding("same bug", { id: "F1", path: "src/cli.ts" })])),
432
+ ];
433
+ const result = await aggregatePanel({
434
+ reviewers,
435
+ policy: "quorum",
436
+ minAgree: 2,
437
+ configuredReviewers: 2,
438
+ matcher: byPathSummary(),
439
+ });
440
+ // Three source findings (r1 has two with same model id, but internal ids r1#F1, r1#F2 are unique)
441
+ const allSourceIds = result.confirmedClusters.concat(result.advisories).flatMap((c) => c.sourceFindingIds);
442
+ assert.equal(allSourceIds.length, 3);
443
+ assert.equal(new Set(allSourceIds).size, 3);
444
+ assert.deepEqual(allSourceIds.sort(), ["r1#F1", "r1#F2", "r2#F1"].sort());
445
+ });
446
+ test("F7: a matcher that assigns a source id to multiple groups is rejected as needs-human", async () => {
447
+ const reviewers = [
448
+ submission("r1", review("has_findings", [bugA(), finding("Typo", { id: "F2", path: "src/util.ts" })])),
449
+ submission("r2", review("has_findings", [bugA()])),
450
+ ];
451
+ const result = await aggregatePanel({
452
+ reviewers,
453
+ policy: "quorum",
454
+ minAgree: 2,
455
+ configuredReviewers: 2,
456
+ matcher: fakeMatcher([["r1#F1", "r2#F1"], ["r1#F1", "r1#F2"]]),
457
+ });
458
+ assert.equal(result.status, "needs_human");
459
+ assert.ok(result.adjudicationErrors?.some((e) => /multiple groups/.test(e)));
460
+ });
461
+ //# sourceMappingURL=panel-aggregate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-aggregate.test.js","sourceRoot":"","sources":["../src/panel-aggregate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=panel-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-cli.test.d.ts","sourceRoot":"","sources":["../src/panel-cli.test.ts"],"names":[],"mappings":""}