@sentry/warden 0.46.0 → 0.46.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/reporting/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,419 @@
1
+ import { z } from 'zod';
2
+ import { AuxiliaryUsageAttributionMapSchema, AuxiliaryUsageMapSchema, FindingSchema, GitHubEventTypeSchema, LocationSchema, SeverityThresholdSchema, SkillErrorSchema, SourceSnippetSchema, UsageStatsSchema, } from '../types/index.js';
3
+ import { FindingObservationSchema } from './outcomes.js';
4
+ import { generateContentHash } from '../output/dedup.js';
5
+ import { getVersion } from '../utils/version.js';
6
+ import { buildProvenanceAndDiscarded, DiscardedFindingSchema, FindingProvenanceSchema, provenanceKey, } from './provenance.js';
7
+ const FindingAttributionSchema = z.object({
8
+ skillExecutionId: z.string().optional(),
9
+ skillName: z.string(),
10
+ role: z.enum(['primary', 'corroborating']),
11
+ matchType: z.enum(['hash', 'semantic']).optional(),
12
+ });
13
+ const ExportedFindingSchema = z.object({
14
+ id: z.string(),
15
+ /** Set to the same value as `id` once dedupe/recenter matches this finding to an already-posted comment. */
16
+ reportedId: z.string().optional(),
17
+ severity: FindingSchema.shape.severity,
18
+ confidence: FindingSchema.shape.confidence,
19
+ title: z.string(),
20
+ description: z.string(),
21
+ /** Verifier's evidence trace, when a verification pass ran. */
22
+ verification: z.string().optional(),
23
+ location: LocationSchema.optional(),
24
+ additionalLocations: z.array(LocationSchema).optional(),
25
+ sourceSnippet: SourceSnippetSchema.optional(),
26
+ /** Stable cross-run key, same value `output/dedup.ts` uses for hash-based dedupe. */
27
+ contentHash: z.string().optional(),
28
+ /** Skills that independently flagged this finding, self included as `role: 'primary'`. */
29
+ reportedBy: z.array(FindingAttributionSchema).optional(),
30
+ provenance: FindingProvenanceSchema.optional(),
31
+ });
32
+ const HarnessSchema = z.object({
33
+ name: z.literal('warden'),
34
+ version: z.string(),
35
+ actionRef: z.string().optional(),
36
+ });
37
+ /**
38
+ * Action-level fallbacks every trigger falls back to when its own config
39
+ * doesn't override them. Deliberately narrower than a per-trigger
40
+ * ResolvedTrigger: model/runtime/minConfidence/verifyFindings are resolved
41
+ * per skill/trigger in this repo, not at the action level, so there's no
42
+ * single run-wide value to report for them here.
43
+ */
44
+ const ResolvedDefaultsSchema = z.object({
45
+ failOn: SeverityThresholdSchema.optional(),
46
+ reportOn: SeverityThresholdSchema.optional(),
47
+ failCheck: z.boolean().optional(),
48
+ requestChanges: z.boolean().optional(),
49
+ maxFindings: z.number().int().nonnegative().optional(),
50
+ });
51
+ export const SkippedTriggerReasonSchema = z.enum([
52
+ 'no_event_match',
53
+ 'path_filter',
54
+ 'draft_state',
55
+ 'label_mismatch',
56
+ 'no_changes',
57
+ 'pending',
58
+ /** The trigger matched and ran, but threw before producing a report. */
59
+ 'error',
60
+ ]);
61
+ const SkippedTriggerSchema = z.object({
62
+ skillName: z.string(),
63
+ triggerId: z.string().optional(),
64
+ triggerName: z.string().optional(),
65
+ reason: SkippedTriggerReasonSchema,
66
+ });
67
+ const TriggerErrorSchema = z.object({
68
+ name: z.string().optional(),
69
+ message: z.string(),
70
+ });
71
+ /** Mirrors `FindingProcessingEvent` (sdk/types.ts) so it can round-trip through the analyze/report replay artifact. */
72
+ const ReplayFindingProcessingEventSchema = z.object({
73
+ stage: z.enum(['dedupe', 'verification', 'merge', 'fix_gate']),
74
+ action: z.enum(['dropped', 'rejected', 'revised', 'merged', 'stripped_fix']),
75
+ finding: FindingSchema,
76
+ reason: z.string().optional(),
77
+ replacement: FindingSchema.optional(),
78
+ });
79
+ // Durable analyze/report replay rows join by triggerName plus configured
80
+ // skillName. `report.skill` is preserved as report identity and may differ for
81
+ // local path skills with frontmatter names.
82
+ const TriggerRunResultBaseSchema = z.object({
83
+ triggerId: z.string().optional(),
84
+ triggerName: z.string(),
85
+ skillName: z.string(),
86
+ });
87
+ const ReplaySkillReportSchema = z.object({
88
+ skill: z.string(),
89
+ summary: z.string(),
90
+ findings: z.array(FindingSchema),
91
+ durationMs: z.number().nonnegative().optional(),
92
+ usage: UsageStatsSchema.optional(),
93
+ auxiliaryUsage: AuxiliaryUsageMapSchema.optional(),
94
+ auxiliaryUsageAttribution: AuxiliaryUsageAttributionMapSchema.optional(),
95
+ model: z.string().optional(),
96
+ runtime: z.string().optional(),
97
+ });
98
+ export const TriggerRunResultSchema = z.discriminatedUnion('status', [
99
+ TriggerRunResultBaseSchema.extend({
100
+ status: z.literal('success'),
101
+ report: ReplaySkillReportSchema,
102
+ error: z.never().optional(),
103
+ /** Verification/merge/dedupe events captured during analyze mode, replayed so report mode's export still carries provenance/discardedFindings. */
104
+ findingProcessingEvents: z.array(ReplayFindingProcessingEventSchema).optional(),
105
+ /** Analyze mode's model lanes, replayed so report mode's export doesn't drop them. */
106
+ auxiliaryModel: z.string().optional(),
107
+ synthesisModel: z.string().optional(),
108
+ }),
109
+ TriggerRunResultBaseSchema.extend({
110
+ status: z.literal('error'),
111
+ report: z.never().optional(),
112
+ error: TriggerErrorSchema,
113
+ }),
114
+ ]);
115
+ export const FindingsOutputSchema = z.object({
116
+ version: z.literal('1'),
117
+ timestamp: z.string().datetime(),
118
+ runAttempt: z.string().optional(),
119
+ /** Which build of Warden produced this run. */
120
+ harness: HarnessSchema.optional(),
121
+ repository: z.object({
122
+ owner: z.string(),
123
+ name: z.string(),
124
+ fullName: z.string(),
125
+ }),
126
+ event: GitHubEventTypeSchema,
127
+ pullRequest: z.object({
128
+ number: z.number().int(),
129
+ author: z.string(),
130
+ title: z.string(),
131
+ baseBranch: z.string(),
132
+ headBranch: z.string(),
133
+ headSha: z.string(),
134
+ }).optional(),
135
+ runId: z.string(),
136
+ recalledMemories: z.array(z.object({
137
+ id: z.string().trim().min(1).max(128),
138
+ version: z.number().int().positive(),
139
+ }).strict()).max(5).optional(),
140
+ memoryRecallId: z.string().trim().min(1).max(128).optional(),
141
+ /** The model/threshold config this run resolved to at the action level. */
142
+ resolvedDefaults: ResolvedDefaultsSchema.optional(),
143
+ /** Configured triggers that never fired this run, with why. */
144
+ skippedTriggers: z.array(SkippedTriggerSchema).optional(),
145
+ summary: z.object({
146
+ totalFindings: z.number().int().nonnegative(),
147
+ findingsBySeverity: z.object({
148
+ high: z.number().int().nonnegative(),
149
+ medium: z.number().int().nonnegative(),
150
+ low: z.number().int().nonnegative(),
151
+ }),
152
+ totalSkills: z.number().int().nonnegative(),
153
+ totalSkillExecutions: z.number().int().nonnegative().optional(),
154
+ byOutcome: z.object({
155
+ posted: z.number().int().nonnegative(),
156
+ deduped: z.number().int().nonnegative(),
157
+ skipped: z.number().int().nonnegative(),
158
+ resolved: z.number().int().nonnegative(),
159
+ failed: z.number().int().nonnegative(),
160
+ }).optional(),
161
+ }),
162
+ skills: z.array(z.object({
163
+ name: z.string(),
164
+ summary: z.string(),
165
+ model: z.string().optional(),
166
+ runtime: z.string().optional(),
167
+ auxiliaryUsage: AuxiliaryUsageMapSchema.optional(),
168
+ auxiliaryUsageAttribution: AuxiliaryUsageAttributionMapSchema.optional(),
169
+ auxiliaryModel: z.string().optional(),
170
+ synthesisModel: z.string().optional(),
171
+ durationMs: z.number().nonnegative().optional(),
172
+ usage: UsageStatsSchema.optional(),
173
+ failedHunks: z.number().int().nonnegative().optional(),
174
+ failedExtractions: z.number().int().nonnegative().optional(),
175
+ error: SkillErrorSchema.optional(),
176
+ /** Stable id for this skill×trigger execution. */
177
+ skillExecutionId: z.string().optional(),
178
+ triggerId: z.string().optional(),
179
+ triggerName: z.string().optional(),
180
+ findingsBySeverity: z.object({
181
+ high: z.number().int().nonnegative(),
182
+ medium: z.number().int().nonnegative(),
183
+ low: z.number().int().nonnegative(),
184
+ }).optional(),
185
+ checkRunUrl: z.string().optional(),
186
+ checkRunId: z.number().int().positive().optional(),
187
+ /** Posting-derived; absent from analyze-mode replay and live writes. */
188
+ reviewEvent: z.enum(['APPROVE', 'REQUEST_CHANGES', 'COMMENT']).optional(),
189
+ checkConclusion: z.enum(['success', 'failure', 'neutral', 'cancelled']).optional(),
190
+ /** Schedule-mode only. */
191
+ issueNumber: z.number().int().positive().optional(),
192
+ issueUrl: z.string().optional(),
193
+ findings: z.array(ExportedFindingSchema),
194
+ })),
195
+ /** Verifier-rejected and merge-absorbed candidates that never reached `findings[]`. */
196
+ discardedFindings: z.array(DiscardedFindingSchema).optional(),
197
+ triggerResults: z.array(TriggerRunResultSchema).optional(),
198
+ findingObservations: z.array(FindingObservationSchema).default([]),
199
+ });
200
+ /** Build the action-level `resolvedDefaults` block from parsed action inputs. */
201
+ export function buildResolvedDefaults(inputs) {
202
+ return {
203
+ failOn: inputs.failOn,
204
+ reportOn: inputs.reportOn,
205
+ failCheck: inputs.failCheck,
206
+ requestChanges: inputs.requestChanges,
207
+ maxFindings: inputs.maxFindings,
208
+ };
209
+ }
210
+ /**
211
+ * Build the `actionRef`/`resolvedDefaults`/`skippedTriggers` triple every
212
+ * `writeFindingsOutput(Live)` call site needs. Centralizing this keeps a
213
+ * future field addition from requiring an edit at every individual write
214
+ * call site across `pr-workflow.ts`/`schedule.ts`.
215
+ */
216
+ export function buildBaseOutputOptions(inputs, skippedTriggers) {
217
+ return {
218
+ actionRef: inputs.actionRef,
219
+ resolvedDefaults: buildResolvedDefaults(inputs),
220
+ skippedTriggers,
221
+ };
222
+ }
223
+ function serializeTriggerError(error) {
224
+ if (error instanceof Error) {
225
+ return {
226
+ name: error.name,
227
+ message: error.message,
228
+ };
229
+ }
230
+ return { message: String(error) };
231
+ }
232
+ function serializeReplayReport(report) {
233
+ return {
234
+ skill: report.skill,
235
+ summary: report.summary,
236
+ findings: report.findings,
237
+ durationMs: report.durationMs,
238
+ usage: report.usage,
239
+ auxiliaryUsage: report.auxiliaryUsage,
240
+ auxiliaryUsageAttribution: report.auxiliaryUsageAttribution,
241
+ model: report.model,
242
+ runtime: report.runtime,
243
+ };
244
+ }
245
+ function serializeTriggerResult(result) {
246
+ if (result.report) {
247
+ return {
248
+ triggerId: result.triggerId,
249
+ triggerName: result.triggerName,
250
+ skillName: result.skillName,
251
+ status: 'success',
252
+ report: serializeReplayReport(result.report),
253
+ findingProcessingEvents: result.findingProcessingEvents,
254
+ auxiliaryModel: result.auxiliaryModel,
255
+ synthesisModel: result.synthesisModel,
256
+ };
257
+ }
258
+ return {
259
+ triggerId: result.triggerId,
260
+ triggerName: result.triggerName,
261
+ skillName: result.skillName,
262
+ status: 'error',
263
+ error: serializeTriggerError(result.error ?? 'Trigger did not produce a report'),
264
+ };
265
+ }
266
+ function severityCounts(items) {
267
+ return {
268
+ high: items.filter((i) => i.severity === 'high').length,
269
+ medium: items.filter((i) => i.severity === 'medium').length,
270
+ low: items.filter((i) => i.severity === 'low').length,
271
+ };
272
+ }
273
+ /** Build the public findings export payload. */
274
+ export function buildFindingsOutput(reports, context, findingObservations = [], options = {}) {
275
+ const allFindings = reports.flatMap((r) => r.findings);
276
+ const metaByReport = new Map((options.skillExecutions ?? []).map((meta) => [meta.report, meta]));
277
+ // Corroborating skills, grouped by the survivor finding id they were
278
+ // matched against (`dedupe.existingFindingId`) — not by re-derived
279
+ // content/location hashing, which misses semantic matches (different
280
+ // content hash than the survivor) and never lists the observing skill
281
+ // itself, only whichever skills the matched comment already attributed.
282
+ const corroborationBySurvivorId = new Map();
283
+ function addCorroborator(survivorId, skillName, matchType) {
284
+ const bySkill = corroborationBySurvivorId.get(survivorId) ?? new Map();
285
+ bySkill.set(skillName, { skillName, matchType });
286
+ corroborationBySurvivorId.set(survivorId, bySkill);
287
+ }
288
+ for (const observation of findingObservations) {
289
+ if (observation.outcome !== 'deduped')
290
+ continue;
291
+ const survivorId = observation.dedupe.existingFindingId;
292
+ if (!survivorId)
293
+ continue;
294
+ if (observation.skill) {
295
+ addCorroborator(survivorId, observation.skill, observation.dedupe.matchType);
296
+ }
297
+ for (const skillName of observation.dedupe.existingSkills ?? []) {
298
+ addCorroborator(survivorId, skillName, observation.dedupe.matchType);
299
+ }
300
+ }
301
+ const { provenanceByFindingId, discarded } = buildProvenanceAndDiscarded((options.skillExecutions ?? []).map((meta) => ({
302
+ skillExecutionId: meta.skillExecutionId,
303
+ model: meta.report.model,
304
+ verificationModel: meta.auxiliaryModel,
305
+ mergeModel: meta.synthesisModel,
306
+ events: meta.findingProcessingEvents ?? [],
307
+ })));
308
+ const byOutcome = {
309
+ posted: 0,
310
+ deduped: 0,
311
+ skipped: 0,
312
+ resolved: 0,
313
+ failed: 0,
314
+ };
315
+ for (const observation of findingObservations) {
316
+ byOutcome[observation.outcome]++;
317
+ }
318
+ const output = {
319
+ version: '1',
320
+ timestamp: options.timestamp ?? new Date().toISOString(),
321
+ runAttempt: options.runAttempt ?? process.env['GITHUB_RUN_ATTEMPT'],
322
+ harness: { name: 'warden', version: getVersion(), actionRef: options.actionRef },
323
+ repository: {
324
+ owner: context.repository.owner,
325
+ name: context.repository.name,
326
+ fullName: context.repository.fullName,
327
+ },
328
+ event: context.eventType,
329
+ ...(context.pullRequest && {
330
+ pullRequest: {
331
+ number: context.pullRequest.number,
332
+ author: context.pullRequest.author,
333
+ title: context.pullRequest.title,
334
+ baseBranch: context.pullRequest.baseBranch,
335
+ headBranch: context.pullRequest.headBranch,
336
+ headSha: context.pullRequest.headSha,
337
+ },
338
+ }),
339
+ runId: options.runId ?? process.env['GITHUB_RUN_ID'] ?? '',
340
+ ...(options.recalledMemories?.length ? { recalledMemories: [...options.recalledMemories] } : {}),
341
+ ...(options.memoryRecallId ? { memoryRecallId: options.memoryRecallId } : {}),
342
+ ...(options.resolvedDefaults && { resolvedDefaults: options.resolvedDefaults }),
343
+ ...(options.skippedTriggers && { skippedTriggers: options.skippedTriggers }),
344
+ summary: {
345
+ totalFindings: allFindings.length,
346
+ findingsBySeverity: severityCounts(allFindings),
347
+ totalSkills: reports.length,
348
+ totalSkillExecutions: reports.length,
349
+ byOutcome,
350
+ },
351
+ skills: reports.map((r) => {
352
+ const meta = metaByReport.get(r);
353
+ return {
354
+ name: r.skill,
355
+ summary: r.summary,
356
+ model: r.model,
357
+ runtime: r.runtime,
358
+ auxiliaryUsage: r.auxiliaryUsage,
359
+ auxiliaryUsageAttribution: r.auxiliaryUsageAttribution,
360
+ auxiliaryModel: meta?.auxiliaryModel,
361
+ synthesisModel: meta?.synthesisModel,
362
+ durationMs: r.durationMs,
363
+ usage: r.usage,
364
+ failedHunks: r.failedHunks,
365
+ failedExtractions: r.failedExtractions,
366
+ error: r.error,
367
+ skillExecutionId: meta?.skillExecutionId,
368
+ triggerId: meta?.triggerId,
369
+ triggerName: meta?.triggerName,
370
+ findingsBySeverity: severityCounts(r.findings),
371
+ checkRunUrl: meta?.checkRunUrl,
372
+ checkRunId: meta?.checkRunId,
373
+ reviewEvent: meta?.reviewEvent,
374
+ checkConclusion: meta?.checkConclusion,
375
+ issueNumber: meta?.issueNumber,
376
+ issueUrl: meta?.issueUrl,
377
+ findings: r.findings.map((f) => {
378
+ const contentHash = generateContentHash(f.title, f.description);
379
+ const survivorId = f.reportedId ?? f.id;
380
+ const corroborators = [...(corroborationBySurvivorId.get(survivorId)?.values() ?? [])];
381
+ const reportedBy = meta?.skillExecutionId !== undefined
382
+ ? [
383
+ { skillExecutionId: meta.skillExecutionId, skillName: r.skill, role: 'primary' },
384
+ ...corroborators
385
+ .filter((corroborator) => corroborator.skillName !== r.skill)
386
+ .map((corroborator) => ({
387
+ skillName: corroborator.skillName,
388
+ role: 'corroborating',
389
+ matchType: corroborator.matchType,
390
+ })),
391
+ ]
392
+ : undefined;
393
+ return {
394
+ id: f.id,
395
+ reportedId: f.reportedId,
396
+ severity: f.severity,
397
+ confidence: f.confidence,
398
+ title: f.title,
399
+ description: f.description,
400
+ verification: f.verification,
401
+ location: f.location,
402
+ additionalLocations: f.additionalLocations,
403
+ sourceSnippet: f.sourceSnippet,
404
+ contentHash,
405
+ reportedBy,
406
+ provenance: provenanceByFindingId.get(provenanceKey(meta?.skillExecutionId, f.id)),
407
+ };
408
+ }),
409
+ };
410
+ }),
411
+ ...(discarded.length > 0 && { discardedFindings: discarded }),
412
+ ...(options.triggerResults && {
413
+ triggerResults: options.triggerResults.map(serializeTriggerResult),
414
+ }),
415
+ findingObservations,
416
+ };
417
+ return FindingsOutputSchema.parse(output);
418
+ }
419
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/reporting/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+ import type { FindingProcessingEvent } from '../sdk/types.js';
3
+ export declare const FindingProvenanceSchema: z.ZodObject<{
4
+ originSkillExecutionId: z.ZodOptional<z.ZodString>;
5
+ originModel: z.ZodOptional<z.ZodString>;
6
+ verification: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
7
+ outcome: z.ZodLiteral<"revised">;
8
+ model: z.ZodOptional<z.ZodString>;
9
+ evidence: z.ZodOptional<z.ZodString>;
10
+ before: z.ZodObject<{
11
+ title: z.ZodString;
12
+ description: z.ZodString;
13
+ severity: z.ZodPreprocess<z.ZodEnum<{
14
+ high: "high";
15
+ low: "low";
16
+ medium: "medium";
17
+ }>>;
18
+ confidence: z.ZodOptional<z.ZodEnum<{
19
+ high: "high";
20
+ low: "low";
21
+ medium: "medium";
22
+ }>>;
23
+ }, z.core.$strip>;
24
+ }, z.core.$strip>], "outcome">>;
25
+ merge: z.ZodOptional<z.ZodObject<{
26
+ model: z.ZodOptional<z.ZodString>;
27
+ absorbedFindingIds: z.ZodArray<z.ZodString>;
28
+ }, z.core.$strip>>;
29
+ }, z.core.$strip>;
30
+ export type FindingProvenance = z.infer<typeof FindingProvenanceSchema>;
31
+ export declare const DiscardedFindingSchema: z.ZodObject<{
32
+ originSkillExecutionId: z.ZodOptional<z.ZodString>;
33
+ stage: z.ZodEnum<{
34
+ verification_rejected: "verification_rejected";
35
+ merge_absorbed: "merge_absorbed";
36
+ dedupe_dropped: "dedupe_dropped";
37
+ }>;
38
+ severity: z.ZodPreprocess<z.ZodEnum<{
39
+ high: "high";
40
+ low: "low";
41
+ medium: "medium";
42
+ }>>;
43
+ title: z.ZodString;
44
+ location: z.ZodOptional<z.ZodObject<{
45
+ path: z.ZodString;
46
+ startLine: z.ZodNumber;
47
+ endLine: z.ZodOptional<z.ZodNumber>;
48
+ }, z.core.$strip>>;
49
+ model: z.ZodOptional<z.ZodString>;
50
+ reason: z.ZodOptional<z.ZodString>;
51
+ survivorFindingId: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strip>;
53
+ export type DiscardedFinding = z.infer<typeof DiscardedFindingSchema>;
54
+ /** One skill execution's captured verification/merge events, for provenance matching. */
55
+ export interface FindingExecutionEvents {
56
+ skillExecutionId?: string;
57
+ /** Primary/analysis model, attributed as a finding's origin. */
58
+ model?: string;
59
+ /** Model that ran the verification lane; attributed to verification-stage events instead of `model`. */
60
+ verificationModel?: string;
61
+ /** Model that ran the merge/synthesis lane; attributed to merge-stage events instead of `model`. */
62
+ mergeModel?: string;
63
+ events: FindingProcessingEvent[];
64
+ }
65
+ export interface ProvenanceAndDiscarded {
66
+ /** Keyed by `provenanceKey(skillExecutionId, findingId)` — see that function for why. */
67
+ provenanceByFindingId: Map<string, FindingProvenance>;
68
+ discarded: DiscardedFinding[];
69
+ }
70
+ /**
71
+ * Same-run dedupe can recenter two different skill executions' survivor
72
+ * findings onto the same id (e.g. both matched against the same pre-existing
73
+ * comment), so `findingId` alone is not a safe map key: a second execution's
74
+ * event would silently overwrite or merge into the first's entry, and both
75
+ * exported skill rows would then read the same (wrong) provenance. Scoping
76
+ * the key to the owning execution keeps each skill row's provenance
77
+ * independent.
78
+ */
79
+ export declare function provenanceKey(skillExecutionId: string | undefined, findingId: string): string;
80
+ /**
81
+ * Build per-finding provenance and the list of discarded candidates from
82
+ * captured `FindingProcessingEvent`s. Handles `verification`/`rejected`,
83
+ * `verification`/`revised`, `merge`/`merged`, and `dedupe`/`dropped` events —
84
+ * `fix_gate` events are out of scope here (they don't remove a finding, they
85
+ * strip a proposed fix from one that's kept).
86
+ *
87
+ * `poster.ts`'s `recenterReportFindingIds` keeps this lookup valid across
88
+ * cross-run dedupe: when it recenters a survivor's `id` onto a pre-existing
89
+ * comment's id, it remaps this same finding's id inside any already-captured
90
+ * `FindingProcessingEvent`s so the id this map is keyed by (and the id
91
+ * `output.ts` looks it up by) stay in sync.
92
+ */
93
+ export declare function buildProvenanceAndDiscarded(executions: FindingExecutionEvents[]): ProvenanceAndDiscarded;
94
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/reporting/provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAuB9D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAKlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;iBASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,yFAAyF;AACzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,yFAAyF;IACzF,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACtD,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,sBAAsB,EAAE,GAAG,sBAAsB,CAkFxG"}