secondpair 0.1.4 → 0.1.6

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.
@@ -1,4 +1,5 @@
1
1
  import { collectIdsFromBodies, embedFindingId, parseFindingId } from "../finding-id.js";
2
+ import { embedReviewState, parseReviewState } from "../review-state.js";
2
3
  import { collectWontFixIds } from "../suppress-signals.js";
3
4
  // Reference-link definition, not an HTML comment: some renderers (Bitbucket)
4
5
  // HTML-escape raw comments instead of hiding them, leaving `<!-- -->` visible
@@ -28,7 +29,7 @@ export function formatCommentBody(f) {
28
29
  body = embedFindingId(body, f.id);
29
30
  return body;
30
31
  }
31
- export function formatReviewBody(result, failed) {
32
+ export function formatReviewBody(result, failed, headSha) {
32
33
  const counts = countBySeverity(result.findings);
33
34
  const countLine = result.findings.length === 0
34
35
  ? "No findings."
@@ -42,7 +43,7 @@ export function formatReviewBody(result, failed) {
42
43
  const reconLine = recon
43
44
  ? `\n_Lifecycle:_ ${recon.new.length} new · ${recon.persistent.length} persistent · ${recon.resolved.length} resolved · ${recon.suppressed.length} suppressed`
44
45
  : "";
45
- return [
46
+ let body = [
46
47
  `## PR Review Agent`,
47
48
  "",
48
49
  result.summary.trim(),
@@ -53,6 +54,24 @@ export function formatReviewBody(result, failed) {
53
54
  failed ? "\n❌ **Check failed**: findings at or above the configured severity threshold." : "",
54
55
  AGENT_MARKER,
55
56
  ].join("\n");
57
+ if (headSha)
58
+ body = embedReviewState(body, { headSha, findings: result.findings });
59
+ return body;
60
+ }
61
+ /**
62
+ * Recover the full review state (head sha + every active finding) embedded
63
+ * in the agent's most recent PR review body — the source of truth for
64
+ * soft-match reconciliation and incremental (changed-files-only) re-review.
65
+ */
66
+ export async function getReviewState(octokit, pr) {
67
+ const reviews = await octokit.paginate(octokit.pulls.listReviews, { ...pr, per_page: 100 });
68
+ const mine = reviews.filter((r) => r.body?.includes(AGENT_MARKER));
69
+ for (let i = mine.length - 1; i >= 0; i--) {
70
+ const state = parseReviewState(mine[i].body ?? "");
71
+ if (state)
72
+ return state;
73
+ }
74
+ return null;
56
75
  }
57
76
  function countBySeverity(findings) {
58
77
  const counts = {};
@@ -164,7 +183,7 @@ export async function postReview(opts) {
164
183
  }
165
184
  if (skipped)
166
185
  log(`Skipping ${skipped} comment(s) already posted (same finding id).`);
167
- const body = formatReviewBody(result, opts.failed);
186
+ const body = formatReviewBody(result, opts.failed, opts.headSha);
168
187
  try {
169
188
  await octokit.pulls.createReview({
170
189
  ...pr,
@@ -1 +1 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/github/comments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/github/comments.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type ReviewState } from "../review-state.js";
1
2
  import type { ReviewResult } from "../types.js";
2
3
  import { type GlRef } from "./auth.js";
3
4
  export interface GlDiffRefs {
@@ -20,6 +21,14 @@ interface GlNote {
20
21
  }
21
22
  export declare function listGlNotes(ref: GlRef): Promise<GlNote[]>;
22
23
  export declare function listGlFindingIds(ref: GlRef): Promise<Set<string>>;
24
+ /**
25
+ * Recover the full review state (head sha + every active finding) embedded
26
+ * in the most recent summary note — the source of truth for soft-match
27
+ * reconciliation and incremental (changed-files-only) re-review.
28
+ */
29
+ export declare function getGlReviewState(ref: GlRef): Promise<ReviewState | null>;
30
+ /** Paths changed between two commits in a GitLab project. */
31
+ export declare function listGlChangedFiles(ref: GlRef, from: string, to: string): Promise<Set<string>>;
23
32
  export declare function listGlWontFixFindingIds(ref: GlRef): Promise<Set<string>>;
24
33
  /** Resolve unresolved MR discussions whose notes contain one of the finding ids. */
25
34
  export declare function resolveGlDiscussionsForIds(ref: GlRef, ids: Iterable<string>, log?: (msg: string) => void): Promise<number>;
@@ -1,6 +1,7 @@
1
1
  import { formatBbCommentBody, formatBbSummaryBody } from "../bitbucket/comments.js";
2
2
  import { collectIdsFromBodies, parseFindingId } from "../finding-id.js";
3
3
  import { AGENT_MARKER, SEVERITY_EMOJI } from "../github/comments.js";
4
+ import { parseReviewState } from "../review-state.js";
4
5
  import { collectWontFixIds } from "../suppress-signals.js";
5
6
  import { resolveGlToken } from "./auth.js";
6
7
  function glApi(ref) {
@@ -53,6 +54,34 @@ export async function listGlFindingIds(ref) {
53
54
  const notes = await listGlNotes(ref);
54
55
  return collectIdsFromBodies(notes.filter((n) => n.body?.includes(AGENT_MARKER)).map((n) => n.body ?? ""));
55
56
  }
57
+ /**
58
+ * Recover the full review state (head sha + every active finding) embedded
59
+ * in the most recent summary note — the source of truth for soft-match
60
+ * reconciliation and incremental (changed-files-only) re-review.
61
+ */
62
+ export async function getGlReviewState(ref) {
63
+ const notes = await listGlNotes(ref);
64
+ const summaries = notes.filter((n) => n.body?.includes(AGENT_MARKER) && n.type == null);
65
+ for (let i = summaries.length - 1; i >= 0; i--) {
66
+ const state = parseReviewState(summaries[i].body ?? "");
67
+ if (state)
68
+ return state;
69
+ }
70
+ return null;
71
+ }
72
+ /** Paths changed between two commits in a GitLab project. */
73
+ export async function listGlChangedFiles(ref, from, to) {
74
+ const res = await glFetch(`${ref.serverUrl}/api/v4/projects/${ref.projectId}/repository/compare?from=${from}&to=${to}`);
75
+ const data = (await res.json());
76
+ const paths = new Set();
77
+ for (const d of data.diffs ?? []) {
78
+ if (d.new_path)
79
+ paths.add(d.new_path);
80
+ if (d.old_path)
81
+ paths.add(d.old_path);
82
+ }
83
+ return paths;
84
+ }
56
85
  export async function listGlWontFixFindingIds(ref) {
57
86
  const notes = await listGlNotes(ref);
58
87
  const byId = new Map(notes.flatMap((note) => (note.id == null ? [] : [[note.id, note]])));
@@ -134,13 +163,10 @@ export async function postGlReview(opts) {
134
163
  const notes = await listGlNotes(ref);
135
164
  const mine = notes.filter((n) => n.body?.includes(AGENT_MARKER));
136
165
  const existingIds = collectIdsFromBodies(mine.map((n) => n.body ?? ""));
137
- const alreadySummarized = mine.some((n) => n.type == null);
138
- if (!alreadySummarized || result.findings.length === 0) {
139
- await glFetch(`${glApi(ref)}/notes`, {
140
- method: "POST",
141
- body: JSON.stringify({ body: formatBbSummaryBody(result, opts.failed) }),
142
- });
143
- }
166
+ await glFetch(`${glApi(ref)}/notes`, {
167
+ method: "POST",
168
+ body: JSON.stringify({ body: formatBbSummaryBody(result, opts.failed, diffRefs.head_sha) }),
169
+ });
144
170
  const toPost = result.findingsToPost ?? result.findings;
145
171
  let posted = 0;
146
172
  let skipped = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/gitlab/comments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/gitlab/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAoB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAc,MAAM,WAAW,CAAC;AAQvD,SAAS,KAAK,CAAC,GAAU;IACvB,OAAO,GAAG,GAAG,CAAC,SAAS,oBAAoB,GAAG,CAAC,SAAS,mBAAmB,GAAG,CAAC,KAAK,EAAE,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,OAAoB,EAAE;IACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,IAAI;QACP,OAAO,EAAE;YACP,eAAe,EAAE,cAAc,EAAE;YACjC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,GAAG,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAU;IAEV,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAS7B,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjE,OAAO,gBAAgB,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,QAAQ,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAChE,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAU;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAa,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,MAAM;QACjB,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAU;IAC/C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,oBAAoB,CACzB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAU;IAC/C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IACxF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAU,EAAE,IAAY,EAAE,EAAU;IAC3E,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,GAAG,GAAG,CAAC,SAAS,oBAAoB,GAAG,CAAC,SAAS,4BAA4B,IAAI,OAAO,EAAE,EAAE,CAC7F,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2D,CAAC;IAC1F,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAU;IACtD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE;YAAE,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,iBAAiB,CACtB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YACpC,aAAa,EAAE,IAAI,CAAC,aAAa;gBAC/B,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI;gBACpD,CAAC,CAAC,IAAI;SACT,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAWD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAU,EACV,GAAqB,EACrB,MAA6B,GAAG,EAAE,GAAE,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,SAAS,CAAC;YACR,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;YACjF,WAAW,CAAC,IAAI,CAAC,GAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,MAAM;YACjB,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,4CAA6C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7C,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CACtC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAC9D,CAAC;QACF,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU;YAAE,SAAS;QAEtC,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE;gBAC1D,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACzC,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,6CAA6C,UAAU,CAAC,EAAE,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;KAC5F,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,QAAQ,CAAC;IACxD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,YAAY,GAAc,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;oBAC5B,QAAQ,EAAE;wBACR,aAAa,EAAE,MAAM;wBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,QAAQ,EAAE,CAAC,CAAC,IAAI;wBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG;YACX,8CAA8C;YAC9C,GAAG,YAAY,CAAC,GAAG,CACjB,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACvJ;YACD,EAAE;YACF,YAAY;SACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,GAAG,CACD,kBAAkB,MAAM,uBAAuB;QAC7C,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CACN,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,QAAQ,IAAI,EAAE,CAAC;IAC1D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,QAAQ;YAAE,GAAG,CAAC,oBAAoB,QAAQ,oCAAoC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
@@ -16,6 +16,21 @@ export declare function buildCritiqueUserPrompt(input: {
16
16
  }[];
17
17
  changeDescription: string;
18
18
  }): string;
19
+ export declare const DEDUP_SYSTEM_PROMPT = "You are comparing NEW pull-request review findings against PRIOR findings already posted as comments on the same PR. Findings can be worded very differently (different title, different body) yet describe the exact same underlying issue in the exact same code.\n\nRules:\n1. Match a new finding to a prior one ONLY when they are in the same file and describe the same root cause \u2014 not merely the same category or nearby lines.\n2. A new finding about a genuinely different problem in the same file/lines is NOT a duplicate, even if related.\n3. Return only the pairs you are confident are duplicates.";
20
+ export declare function buildDedupUserPrompt(input: {
21
+ newFindings: {
22
+ id?: string;
23
+ file: string;
24
+ start_line: number;
25
+ title: string;
26
+ body: string;
27
+ }[];
28
+ priorFindings: {
29
+ id?: string;
30
+ file: string;
31
+ title: string;
32
+ }[];
33
+ }): string;
19
34
  export interface ReviewPromptInput {
20
35
  files: FileDiff[];
21
36
  /** Rendered repository context from the codemap; empty when no index exists. */
@@ -72,6 +72,21 @@ export function buildCritiqueUserPrompt(input) {
72
72
  .join("\n");
73
73
  return `Change under review: ${input.changeDescription}\n\n# FINDINGS\n${list}\n\nReturn the ids to keep.`;
74
74
  }
75
+ export const DEDUP_SYSTEM_PROMPT = `You are comparing NEW pull-request review findings against PRIOR findings already posted as comments on the same PR. Findings can be worded very differently (different title, different body) yet describe the exact same underlying issue in the exact same code.
76
+
77
+ Rules:
78
+ 1. Match a new finding to a prior one ONLY when they are in the same file and describe the same root cause — not merely the same category or nearby lines.
79
+ 2. A new finding about a genuinely different problem in the same file/lines is NOT a duplicate, even if related.
80
+ 3. Return only the pairs you are confident are duplicates.`;
81
+ export function buildDedupUserPrompt(input) {
82
+ const prior = input.priorFindings
83
+ .map((f) => `- id: ${f.id}\n file: ${f.file}\n title: ${f.title}`)
84
+ .join("\n");
85
+ const news = input.newFindings
86
+ .map((f) => `- id: ${f.id}\n location: ${f.file}:${f.start_line}\n title: ${f.title}\n body: ${f.body}`)
87
+ .join("\n");
88
+ return `# PRIOR FINDINGS (already posted on this PR)\n${prior}\n\n# NEW FINDINGS (candidates to post)\n${news}\n\nReturn the new_id/prior_id pairs that are duplicates.`;
89
+ }
75
90
  export function buildReviewUserPrompt(input) {
76
91
  const parts = [];
77
92
  parts.push(`Reviewing: ${input.changeDescription}`);
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/llm/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;8aAsB0Y,CAAC;AAE/a,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;yIAQiG,CAAC;AAE1I,MAAM,YAAY,GAAG;;;;;;;;;;;;yIAYoH,CAAC;AAE1I,MAAM,CAAC,MAAM,2BAA2B,GAAG;;EAEzC,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;EAK5C,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;EAMxC,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;2CAKK,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,KAGvC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ;SACxB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,IAAI,EAAE,CACjH;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,wBAAwB,KAAK,CAAC,iBAAiB,mBAAmB,IAAI,6BAA6B,CAAC;AAC7G,CAAC;AAaD,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,uDAAuD,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,uJAAuJ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,4LAA4L,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CACnN,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,mGAAmG,KAAK,EAAE,CAAC,CAAC;IAEvH,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/llm/prompt.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,6 @@ export declare function reconcileFindings(findings: Finding[], opts?: {
17
17
  previousIds?: Iterable<string>;
18
18
  previousFindings?: PreviousFinding[];
19
19
  suppressedIds?: Iterable<string>;
20
+ /** Prior ids still active but absent from this LLM pass (e.g. carry-forward on unchanged files). */
21
+ retainedIds?: Iterable<string>;
20
22
  }): ReconcileResult;
package/dist/reconcile.js CHANGED
@@ -11,6 +11,7 @@ export function reconcileFindings(findings, opts = {}) {
11
11
  previous.add(pf.id.toLowerCase());
12
12
  }
13
13
  const suppressed = new Set([...(opts.suppressedIds ?? [])].map((id) => id.toLowerCase()));
14
+ const retained = new Set([...(opts.retainedIds ?? [])].map((id) => id.toLowerCase()));
14
15
  const previousFindings = [...(opts.previousFindings ?? [])].filter((p) => p.id);
15
16
  const reconciliation = {
16
17
  new: [],
@@ -61,7 +62,7 @@ export function reconcileFindings(findings, opts = {}) {
61
62
  }
62
63
  }
63
64
  for (const id of previous) {
64
- if (!currentIds.has(id) && !suppressed.has(id)) {
65
+ if (!currentIds.has(id) && !suppressed.has(id) && !retained.has(id)) {
65
66
  reconciliation.resolved.push(id);
66
67
  }
67
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,10 @@ export function formatReport(result) {
23
23
  }
24
24
  if (result.findings.length === 0) {
25
25
  lines.push(pc.green("✓ No findings."));
26
+ if (result.reconciliation) {
27
+ const r = result.reconciliation;
28
+ lines.push(pc.dim(`lifecycle: ${r.new.length} new · ${r.persistent.length} persistent · ${r.resolved.length} resolved · ${r.suppressed.length} suppressed`));
29
+ }
26
30
  return lines.join("\n");
27
31
  }
28
32
  const byFile = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/report/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/report/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Finding } from "./types.js";
2
+ /**
3
+ * Full review state (head sha + every active finding) embedded in the
4
+ * summary comment, so the next CI run — a fresh checkout with no local
5
+ * report file — can recover exactly what was found last time without
6
+ * scraping/re-parsing individual inline comments. Same encoding on every
7
+ * platform: only "fetch the latest agent summary comment" differs.
8
+ */
9
+ export interface ReviewState {
10
+ headSha: string;
11
+ findings: Finding[];
12
+ }
13
+ /** Append (or replace) the hidden state blob at the end of a summary comment body. */
14
+ export declare function embedReviewState(body: string, state: ReviewState): string;
15
+ /** Recover the previously embedded state, or null if absent/corrupt. */
16
+ export declare function parseReviewState(body: string): ReviewState | null;
@@ -0,0 +1,24 @@
1
+ const STATE_MARKER_PREFIX = "[secondpair-state]: # (";
2
+ const STATE_RE = /\[secondpair-state\]:\s*#\s*\(([A-Za-z0-9+/=]+)\)/;
3
+ /** Append (or replace) the hidden state blob at the end of a summary comment body. */
4
+ export function embedReviewState(body, state) {
5
+ const encoded = Buffer.from(JSON.stringify(state), "utf8").toString("base64");
6
+ const stripped = body.replace(STATE_RE, "").trimEnd();
7
+ return `${stripped}\n\n${STATE_MARKER_PREFIX}${encoded})`;
8
+ }
9
+ /** Recover the previously embedded state, or null if absent/corrupt. */
10
+ export function parseReviewState(body) {
11
+ const m = STATE_RE.exec(body);
12
+ if (!m)
13
+ return null;
14
+ try {
15
+ const parsed = JSON.parse(Buffer.from(m[1], "base64").toString("utf8"));
16
+ if (typeof parsed?.headSha === "string" && Array.isArray(parsed.findings))
17
+ return parsed;
18
+ return null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ //# sourceMappingURL=review-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-state.js","sourceRoot":"","sources":["../src/review-state.ts"],"names":[],"mappings":"AAcA,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AACtD,MAAM,QAAQ,GAAG,mDAAmD,CAAC;AAErE,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAkB;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,OAAO,GAAG,QAAQ,OAAO,mBAAmB,GAAG,OAAO,GAAG,CAAC;AAC5D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO,MAAM,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/dist/review.d.ts CHANGED
@@ -13,6 +13,19 @@ export interface RunReviewOptions {
13
13
  previousFindings?: import("./reconcile.js").PreviousFinding[];
14
14
  /** Ids listed in `.pr-review-suppressions.yml`. */
15
15
  suppressedIds?: Iterable<string>;
16
+ /**
17
+ * Paths changed since the last reviewed commit. When set, only these
18
+ * files are sent to the LLM — everything else in the diff is assumed
19
+ * untouched since the last review and skipped entirely (see
20
+ * `carryForwardFindings`). Undefined means a full review of every file.
21
+ */
22
+ changedFiles?: Set<string>;
23
+ /**
24
+ * Findings from files NOT in `changedFiles` (untouched since the last
25
+ * review) — merged straight into the result as persistent, without any
26
+ * LLM call, since nothing about them could have changed.
27
+ */
28
+ carryForwardFindings?: Finding[];
16
29
  log?: (msg: string) => void;
17
30
  }
18
31
  export interface RunReviewOutput extends ReviewResult {
package/dist/review.js CHANGED
@@ -5,7 +5,7 @@ import { detectSignals, estimateTokens, getModel, loadIndex, selectContext, stru
5
5
  import { isIgnored } from "./config.js";
6
6
  import { parseDiff } from "./diff/parse.js";
7
7
  import { withFindingId } from "./finding-id.js";
8
- import { CRITIQUE_SYSTEM_PROMPT, HIGH_LEVEL_SYSTEM_PROMPT, REVIEW_SYSTEM_PROMPT, buildCritiqueUserPrompt, buildReviewUserPrompt, } from "./llm/prompt.js";
8
+ import { CRITIQUE_SYSTEM_PROMPT, DEDUP_SYSTEM_PROMPT, HIGH_LEVEL_SYSTEM_PROMPT, REVIEW_SYSTEM_PROMPT, buildCritiqueUserPrompt, buildDedupUserPrompt, buildReviewUserPrompt, } from "./llm/prompt.js";
9
9
  import { reviewOutputSchema, validateFindings } from "./llm/schema.js";
10
10
  import { reconcileFindings } from "./reconcile.js";
11
11
  import { compileRedactPatterns, redactSecrets } from "./redact.js";
@@ -62,8 +62,17 @@ export async function runReview(opts) {
62
62
  reviewBrief: { files: [], blastRadius: [], signals: [], totalTokens: 0 },
63
63
  };
64
64
  }
65
- log(`Reviewing ${files.length} changed file(s).`);
66
- const highLevelReview = opts.config.huge_pr_token_threshold != null && totalDiffTokens(files) > opts.config.huge_pr_token_threshold;
65
+ const filesToAnalyze = opts.changedFiles
66
+ ? files.filter((f) => opts.changedFiles.has(f.path))
67
+ : files;
68
+ if (opts.changedFiles) {
69
+ log(`Reviewing ${filesToAnalyze.length} changed file(s); ${files.length - filesToAnalyze.length} unchanged since the last review are carried forward.`);
70
+ }
71
+ else {
72
+ log(`Reviewing ${files.length} changed file(s).`);
73
+ }
74
+ const highLevelReview = opts.config.huge_pr_token_threshold != null &&
75
+ totalDiffTokens(filesToAnalyze) > opts.config.huge_pr_token_threshold;
67
76
  if (highLevelReview) {
68
77
  log(`Diff exceeds huge_pr_token_threshold (${opts.config.huge_pr_token_threshold} tokens) — running a critical/high-only, split-recommending review.`);
69
78
  }
@@ -94,7 +103,7 @@ export async function runReview(opts) {
94
103
  signals,
95
104
  totalTokens: totalDiffTokens(files),
96
105
  };
97
- const chunks = chunkFiles(files);
106
+ const chunks = chunkFiles(filesToAnalyze);
98
107
  if (chunks.length > 1)
99
108
  log(`Large diff — splitting into ${chunks.length} review calls.`);
100
109
  const runParallel = opts.config.parallel_agents && !highLevelReview;
@@ -150,7 +159,7 @@ export async function runReview(opts) {
150
159
  summary: outputs.map((o) => o.summary).join(" "),
151
160
  findings: outputs.flatMap((o) => o.findings),
152
161
  };
153
- const validated = validateFindings(merged, files, opts.config);
162
+ const validated = validateFindings(merged, filesToAnalyze, opts.config);
154
163
  stats.droppedValidation = validated.dropped.length;
155
164
  if (validated.dropped.length > 0) {
156
165
  log(`Dropped ${validated.dropped.length} finding(s) failing validation (outside diff, low confidence, or disabled category).`);
@@ -192,21 +201,96 @@ export async function runReview(opts) {
192
201
  log(`Self-critique dropped ${droppedCritique.length} finding(s) it would not defend.`);
193
202
  }
194
203
  }
195
- const { active, toPost, reconciliation } = reconcileFindings(identified, {
204
+ // Carry-forward only applies to files we did not re-analyze. Findings on
205
+ // changed files belong in previousFindings — if the LLM no longer reports
206
+ // them they are resolved, not carried forward.
207
+ const carryForwardRaw = opts.carryForwardFindings ?? [];
208
+ const carryForward = carryForwardRaw.filter((f) => !opts.changedFiles || !opts.changedFiles.has(f.file));
209
+ if (carryForwardRaw.length > carryForward.length) {
210
+ log(`Dropped ${carryForwardRaw.length - carryForward.length} carry-forward finding(s) on re-analyzed file(s).`);
211
+ }
212
+ const carryForwardIds = carryForward.map((f) => f.id).filter((id) => !!id);
213
+ const { active, toPost: toPostRaw, reconciliation: reconciliationRaw } = reconcileFindings(identified, {
196
214
  previousIds: opts.previousIds,
197
215
  previousFindings: opts.previousFindings,
198
216
  suppressedIds: opts.suppressedIds,
217
+ retainedIds: carryForwardIds,
199
218
  });
200
- log(`Reconciliation: ${reconciliation.new.length} new, ${reconciliation.persistent.length} persistent, ${reconciliation.resolved.length} resolved, ${reconciliation.suppressed.length} suppressed.`);
201
- for (const f of active)
219
+ // Exact-id and soft-match reconciliation can both miss a reworded finding
220
+ // (same issue, different title/body) — catch those with an LLM comparison
221
+ // against everything already posted, so we don't post a second comment for
222
+ // an issue someone edited around without fixing.
223
+ let dedupMatched = new Set();
224
+ if (opts.config.semantic_dedup && reconciliationRaw.new.length > 0) {
225
+ const newFindings = active.filter((f) => f.id && reconciliationRaw.new.includes(f.id));
226
+ const newFiles = new Set(newFindings.map((f) => f.file));
227
+ // DEDUP_SYSTEM_PROMPT only ever matches within the same file, so prior
228
+ // findings from files the new candidates don't touch can't match —
229
+ // sending them just burns tokens (and on a PR where the touched files
230
+ // never had prior findings, this empties the pool and skips the call).
231
+ const priorPool = [...(opts.previousFindings ?? []), ...(opts.carryForwardFindings ?? [])].filter((f) => newFiles.has(f.file));
232
+ if (priorPool.length > 0 && newFindings.length > 0) {
233
+ const dedupSchema = z.object({
234
+ duplicates: z
235
+ .array(z.object({ new_id: z.string(), prior_id: z.string() }))
236
+ .describe("New finding ids that describe the same issue as a prior finding"),
237
+ });
238
+ const dedup = await withRetry(() => structuredCall({
239
+ system: DEDUP_SYSTEM_PROMPT,
240
+ user: buildDedupUserPrompt({
241
+ newFindings: newFindings.map((f) => ({
242
+ id: f.id,
243
+ file: f.file,
244
+ start_line: f.start_line,
245
+ title: f.title,
246
+ body: f.body,
247
+ })),
248
+ priorFindings: priorPool.map((f) => ({ id: f.id, file: f.file, title: f.title })),
249
+ }),
250
+ schema: dedupSchema,
251
+ schemaName: "dedup_output",
252
+ temperature,
253
+ onUsage,
254
+ }));
255
+ stats.llmCalls += 1;
256
+ dedupMatched = new Set(dedup.duplicates.map((d) => d.new_id));
257
+ if (dedupMatched.size > 0) {
258
+ log(`Semantic dedup: ${dedupMatched.size} "new" finding(s) already covered by an existing comment.`);
259
+ }
260
+ }
261
+ }
262
+ const reconciliation = dedupMatched.size > 0
263
+ ? {
264
+ ...reconciliationRaw,
265
+ new: reconciliationRaw.new.filter((id) => !dedupMatched.has(id)),
266
+ persistent: [...reconciliationRaw.persistent, ...reconciliationRaw.new.filter((id) => dedupMatched.has(id))],
267
+ }
268
+ : reconciliationRaw;
269
+ const toPost = toPostRaw.filter((f) => !(f.id && dedupMatched.has(f.id)));
270
+ // Files untouched since the last review were never re-analyzed — their
271
+ // prior findings carry forward as persistent without going through
272
+ // reconciliation (nothing could have been "resolved" in code nobody edited).
273
+ if (carryForward.length > 0) {
274
+ log(`Carrying forward ${carryForward.length} finding(s) from unchanged file(s) (no re-analysis).`);
275
+ }
276
+ const finalActive = [...active, ...carryForward];
277
+ const finalReconciliation = {
278
+ ...reconciliation,
279
+ persistent: [...reconciliation.persistent, ...carryForwardIds],
280
+ };
281
+ log(`Reconciliation: ${finalReconciliation.new.length} new, ${finalReconciliation.persistent.length} persistent, ${finalReconciliation.resolved.length} resolved, ${finalReconciliation.suppressed.length} suppressed.`);
282
+ for (const f of finalActive)
202
283
  stats.findingsBySeverity[f.severity] += 1;
203
284
  stats.suppressed = reconciliation.suppressed.length;
204
- stats.persistent = reconciliation.persistent.length;
285
+ stats.persistent = finalReconciliation.persistent.length;
286
+ const summary = filesToAnalyze.length === 0 && carryForward.length > 0
287
+ ? `No changes since the last review. ${carryForward.length} previous finding(s) carried forward.`
288
+ : validated.summary;
205
289
  return {
206
- findings: active,
207
- summary: validated.summary,
290
+ findings: finalActive,
291
+ summary,
208
292
  dropped: [...validated.dropped, ...capped, ...duplicates, ...droppedCritique],
209
- reconciliation,
293
+ reconciliation: finalReconciliation,
210
294
  findingsToPost: toPost,
211
295
  files,
212
296
  usedContext,