@quickchatai/pi-quickreview 1.2.0 → 1.3.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.
Files changed (231) hide show
  1. package/README.md +79 -27
  2. package/assets/config.example.toml +25 -7
  3. package/assets/prompts/onboarding.md +8 -7
  4. package/assets/schemas/review-result.v1.json +60 -0
  5. package/dist/extensions/quickreview.d.ts +17 -5
  6. package/dist/extensions/quickreview.d.ts.map +1 -1
  7. package/dist/extensions/quickreview.js +79 -26
  8. package/dist/extensions/quickreview.js.map +1 -1
  9. package/dist/src/engine/auth.d.ts +4 -0
  10. package/dist/src/engine/auth.d.ts.map +1 -1
  11. package/dist/src/engine/auth.js +11 -2
  12. package/dist/src/engine/auth.js.map +1 -1
  13. package/dist/src/engine/lens/activity.d.ts +45 -0
  14. package/dist/src/engine/lens/activity.d.ts.map +1 -0
  15. package/dist/src/engine/lens/activity.js +118 -0
  16. package/dist/src/engine/lens/activity.js.map +1 -0
  17. package/dist/src/engine/lens/runlens.d.ts +7 -0
  18. package/dist/src/engine/lens/runlens.d.ts.map +1 -1
  19. package/dist/src/engine/lens/runlens.js +30 -1
  20. package/dist/src/engine/lens/runlens.js.map +1 -1
  21. package/dist/src/engine/lens/tool.d.ts +7 -0
  22. package/dist/src/engine/lens/tool.d.ts.map +1 -1
  23. package/dist/src/engine/lens/tool.js +101 -18
  24. package/dist/src/engine/lens/tool.js.map +1 -1
  25. package/dist/src/engine/lens/wave.d.ts +6 -0
  26. package/dist/src/engine/lens/wave.d.ts.map +1 -1
  27. package/dist/src/engine/lens/wave.js +16 -0
  28. package/dist/src/engine/lens/wave.js.map +1 -1
  29. package/dist/src/homes.js +1 -1
  30. package/dist/src/homes.js.map +1 -1
  31. package/dist/src/live/events.d.ts +3 -0
  32. package/dist/src/live/events.d.ts.map +1 -1
  33. package/dist/src/live/events.js.map +1 -1
  34. package/dist/src/live/lensline.d.ts +20 -0
  35. package/dist/src/live/lensline.d.ts.map +1 -0
  36. package/dist/src/live/lensline.js +70 -0
  37. package/dist/src/live/lensline.js.map +1 -0
  38. package/dist/src/live/projection.d.ts +55 -0
  39. package/dist/src/live/projection.d.ts.map +1 -0
  40. package/dist/src/live/projection.js +465 -0
  41. package/dist/src/live/projection.js.map +1 -0
  42. package/dist/src/live/read.d.ts +24 -0
  43. package/dist/src/live/read.d.ts.map +1 -0
  44. package/dist/src/live/read.js +60 -0
  45. package/dist/src/live/read.js.map +1 -0
  46. package/dist/src/live/writer.d.ts +3 -0
  47. package/dist/src/live/writer.d.ts.map +1 -1
  48. package/dist/src/live/writer.js +6 -1
  49. package/dist/src/live/writer.js.map +1 -1
  50. package/dist/src/localreview.d.ts +18 -8
  51. package/dist/src/localreview.d.ts.map +1 -1
  52. package/dist/src/localreview.js +103 -43
  53. package/dist/src/localreview.js.map +1 -1
  54. package/dist/src/modelroute.d.ts +4 -0
  55. package/dist/src/modelroute.d.ts.map +1 -1
  56. package/dist/src/modelroute.js +21 -0
  57. package/dist/src/modelroute.js.map +1 -1
  58. package/dist/src/plugin/args.d.ts +38 -7
  59. package/dist/src/plugin/args.d.ts.map +1 -1
  60. package/dist/src/plugin/args.js +134 -37
  61. package/dist/src/plugin/args.js.map +1 -1
  62. package/dist/src/plugin/index.d.ts.map +1 -1
  63. package/dist/src/plugin/index.js +5 -1
  64. package/dist/src/plugin/index.js.map +1 -1
  65. package/dist/src/plugin/login.d.ts +8 -4
  66. package/dist/src/plugin/login.d.ts.map +1 -1
  67. package/dist/src/plugin/login.js +25 -32
  68. package/dist/src/plugin/login.js.map +1 -1
  69. package/dist/src/plugin/messages.d.ts +7 -0
  70. package/dist/src/plugin/messages.d.ts.map +1 -0
  71. package/dist/src/plugin/messages.js +13 -0
  72. package/dist/src/plugin/messages.js.map +1 -0
  73. package/dist/src/plugin/peers.d.ts +17 -0
  74. package/dist/src/plugin/peers.d.ts.map +1 -0
  75. package/dist/src/plugin/peers.js +55 -0
  76. package/dist/src/plugin/peers.js.map +1 -0
  77. package/dist/src/plugin/review.d.ts +52 -6
  78. package/dist/src/plugin/review.d.ts.map +1 -1
  79. package/dist/src/plugin/review.js +261 -95
  80. package/dist/src/plugin/review.js.map +1 -1
  81. package/dist/src/plugin/scan.d.ts +80 -44
  82. package/dist/src/plugin/scan.d.ts.map +1 -1
  83. package/dist/src/plugin/scan.js +450 -233
  84. package/dist/src/plugin/scan.js.map +1 -1
  85. package/dist/src/plugin/scancases.d.ts +33 -0
  86. package/dist/src/plugin/scancases.d.ts.map +1 -0
  87. package/dist/src/plugin/scancases.js +153 -0
  88. package/dist/src/plugin/scancases.js.map +1 -0
  89. package/dist/src/plugin/settings.d.ts +18 -0
  90. package/dist/src/plugin/settings.d.ts.map +1 -0
  91. package/dist/src/plugin/settings.js +47 -0
  92. package/dist/src/plugin/settings.js.map +1 -0
  93. package/dist/src/plugin/setup.d.ts +35 -12
  94. package/dist/src/plugin/setup.d.ts.map +1 -1
  95. package/dist/src/plugin/setup.js +258 -118
  96. package/dist/src/plugin/setup.js.map +1 -1
  97. package/dist/src/plugin/versiongate.d.ts +3 -0
  98. package/dist/src/plugin/versiongate.d.ts.map +1 -1
  99. package/dist/src/plugin/versiongate.js +9 -4
  100. package/dist/src/plugin/versiongate.js.map +1 -1
  101. package/dist/src/profileoverrides.d.ts +3 -0
  102. package/dist/src/profileoverrides.d.ts.map +1 -1
  103. package/dist/src/profileoverrides.js +9 -2
  104. package/dist/src/profileoverrides.js.map +1 -1
  105. package/dist/src/reviewapi.d.ts +22 -31
  106. package/dist/src/reviewapi.d.ts.map +1 -1
  107. package/dist/src/reviewapi.js +90 -66
  108. package/dist/src/reviewapi.js.map +1 -1
  109. package/dist/src/reviewdest.d.ts +1 -1
  110. package/dist/src/reviewdest.d.ts.map +1 -1
  111. package/dist/src/reviewdest.js +4 -3
  112. package/dist/src/reviewdest.js.map +1 -1
  113. package/dist/src/reviewtarget.d.ts +36 -0
  114. package/dist/src/reviewtarget.d.ts.map +1 -0
  115. package/dist/src/reviewtarget.js +6 -0
  116. package/dist/src/reviewtarget.js.map +1 -0
  117. package/dist/src/round-progress.d.ts +5 -0
  118. package/dist/src/round-progress.d.ts.map +1 -1
  119. package/dist/src/round-progress.js.map +1 -1
  120. package/dist/src/round-stage-deadlines.d.ts +26 -1
  121. package/dist/src/round-stage-deadlines.d.ts.map +1 -1
  122. package/dist/src/round-stage-deadlines.js +45 -2
  123. package/dist/src/round-stage-deadlines.js.map +1 -1
  124. package/dist/src/savedpost.d.ts +65 -0
  125. package/dist/src/savedpost.d.ts.map +1 -0
  126. package/dist/src/savedpost.js +131 -0
  127. package/dist/src/savedpost.js.map +1 -0
  128. package/dist/src/scan/caseread.d.ts +84 -0
  129. package/dist/src/scan/caseread.d.ts.map +1 -0
  130. package/dist/src/scan/caseread.js +263 -0
  131. package/dist/src/scan/caseread.js.map +1 -0
  132. package/dist/src/scan/channelfs.d.ts +6 -0
  133. package/dist/src/scan/channelfs.d.ts.map +1 -0
  134. package/dist/src/scan/channelfs.js +27 -0
  135. package/dist/src/scan/channelfs.js.map +1 -0
  136. package/dist/src/scan/cutrender.d.ts +13 -0
  137. package/dist/src/scan/cutrender.d.ts.map +1 -0
  138. package/dist/src/scan/cutrender.js +51 -0
  139. package/dist/src/scan/cutrender.js.map +1 -0
  140. package/dist/src/scan/facts.d.ts +72 -0
  141. package/dist/src/scan/facts.d.ts.map +1 -0
  142. package/dist/src/scan/facts.js +593 -0
  143. package/dist/src/scan/facts.js.map +1 -0
  144. package/dist/src/scan/findings.d.ts +320 -0
  145. package/dist/src/scan/findings.d.ts.map +1 -0
  146. package/dist/src/scan/findings.js +948 -0
  147. package/dist/src/scan/findings.js.map +1 -0
  148. package/dist/src/scan/ledger.d.ts +116 -0
  149. package/dist/src/scan/ledger.d.ts.map +1 -0
  150. package/dist/src/scan/ledger.js +207 -0
  151. package/dist/src/scan/ledger.js.map +1 -0
  152. package/dist/src/scan/presentation.d.ts +19 -0
  153. package/dist/src/scan/presentation.d.ts.map +1 -0
  154. package/dist/src/scan/presentation.js +9 -0
  155. package/dist/src/scan/presentation.js.map +1 -0
  156. package/dist/src/scan/scan.d.ts +354 -0
  157. package/dist/src/scan/scan.d.ts.map +1 -0
  158. package/dist/src/scan/scan.js +725 -0
  159. package/dist/src/scan/scan.js.map +1 -0
  160. package/dist/src/scan/scanagents.d.ts +23 -0
  161. package/dist/src/scan/scanagents.d.ts.map +1 -0
  162. package/dist/src/scan/scanagents.js +99 -0
  163. package/dist/src/scan/scanagents.js.map +1 -0
  164. package/dist/src/scan/scanassemble.d.ts +65 -0
  165. package/dist/src/scan/scanassemble.d.ts.map +1 -0
  166. package/dist/src/scan/scanassemble.js +93 -0
  167. package/dist/src/scan/scanassemble.js.map +1 -0
  168. package/dist/src/scan/scanfs.d.ts +26 -0
  169. package/dist/src/scan/scanfs.d.ts.map +1 -0
  170. package/dist/src/scan/scanfs.js +229 -0
  171. package/dist/src/scan/scanfs.js.map +1 -0
  172. package/dist/src/scan/scanlease.d.ts +50 -0
  173. package/dist/src/scan/scanlease.d.ts.map +1 -0
  174. package/dist/src/scan/scanlease.js +251 -0
  175. package/dist/src/scan/scanlease.js.map +1 -0
  176. package/dist/src/scan/scanleaves.d.ts +55 -0
  177. package/dist/src/scan/scanleaves.d.ts.map +1 -0
  178. package/dist/src/scan/scanleaves.js +258 -0
  179. package/dist/src/scan/scanleaves.js.map +1 -0
  180. package/dist/src/scan/scanports.d.ts +79 -0
  181. package/dist/src/scan/scanports.d.ts.map +1 -0
  182. package/dist/src/scan/scanports.js +8 -0
  183. package/dist/src/scan/scanports.js.map +1 -0
  184. package/dist/src/scan/scanrender.d.ts +128 -0
  185. package/dist/src/scan/scanrender.d.ts.map +1 -0
  186. package/dist/src/scan/scanrender.js +527 -0
  187. package/dist/src/scan/scanrender.js.map +1 -0
  188. package/dist/src/scan/scanreport.d.ts +126 -0
  189. package/dist/src/scan/scanreport.d.ts.map +1 -0
  190. package/dist/src/scan/scanreport.js +289 -0
  191. package/dist/src/scan/scanreport.js.map +1 -0
  192. package/dist/src/scan/scanrun.d.ts +472 -0
  193. package/dist/src/scan/scanrun.d.ts.map +1 -0
  194. package/dist/src/scan/scanrun.js +1733 -0
  195. package/dist/src/scan/scanrun.js.map +1 -0
  196. package/dist/src/scan/scantree.d.ts +21 -0
  197. package/dist/src/scan/scantree.d.ts.map +1 -0
  198. package/dist/src/scan/scantree.js +297 -0
  199. package/dist/src/scan/scantree.js.map +1 -0
  200. package/dist/src/scan/scanverbs.d.ts +208 -0
  201. package/dist/src/scan/scanverbs.d.ts.map +1 -0
  202. package/dist/src/scan/scanverbs.js +689 -0
  203. package/dist/src/scan/scanverbs.js.map +1 -0
  204. package/dist/src/scan/stage2.d.ts +221 -0
  205. package/dist/src/scan/stage2.d.ts.map +1 -0
  206. package/dist/src/scan/stage2.js +617 -0
  207. package/dist/src/scan/stage2.js.map +1 -0
  208. package/dist/src/scan/stage2request.d.ts +125 -0
  209. package/dist/src/scan/stage2request.d.ts.map +1 -0
  210. package/dist/src/scan/stage2request.js +259 -0
  211. package/dist/src/scan/stage2request.js.map +1 -0
  212. package/dist/src/scan/textsniff.d.ts +14 -0
  213. package/dist/src/scan/textsniff.d.ts.map +1 -0
  214. package/dist/src/scan/textsniff.js +88 -0
  215. package/dist/src/scan/textsniff.js.map +1 -0
  216. package/dist/src/scan/unitcut.d.ts +135 -0
  217. package/dist/src/scan/unitcut.d.ts.map +1 -0
  218. package/dist/src/scan/unitcut.js +437 -0
  219. package/dist/src/scan/unitcut.js.map +1 -0
  220. package/dist/src/scan/unitcutstore.d.ts +155 -0
  221. package/dist/src/scan/unitcutstore.d.ts.map +1 -0
  222. package/dist/src/scan/unitcutstore.js +381 -0
  223. package/dist/src/scan/unitcutstore.js.map +1 -0
  224. package/dist/src/setupchecklist.d.ts +240 -0
  225. package/dist/src/setupchecklist.d.ts.map +1 -0
  226. package/dist/src/setupchecklist.js +407 -0
  227. package/dist/src/setupchecklist.js.map +1 -0
  228. package/package.json +7 -3
  229. package/skills/qcr-review/SKILL.md +24 -0
  230. package/skills/qcr-scan/SKILL.md +23 -0
  231. package/skills/qcr-setup/SKILL.md +18 -0
@@ -0,0 +1,320 @@
1
+ import type { StateFs } from "./scanports.js";
2
+ import { type LedgerEntry } from "./ledger.js";
3
+ import { type ScanSeverity } from "./scan.js";
4
+ import type { Reachability } from "../severity.js";
5
+ import { FINDING_STATES, FINDINGS_FILE, FINDINGS_VERSION, dismissedLookalike, lookalikeRank, type Validity, type ValidityView } from "./scanreport.js";
6
+ export { FINDINGS_FILE, FINDINGS_VERSION, dismissedLookalike, lookalikeRank };
7
+ export type { Validity, ValidityView };
8
+ export { FINDING_STATES };
9
+ export type FindingState = (typeof FINDING_STATES)[number];
10
+ export interface Sighting {
11
+ run: string;
12
+ sha: string;
13
+ at: string;
14
+ }
15
+ /** Where a finding stopped being reported, and what it was before. */
16
+ export interface FixedMark extends Sighting {
17
+ from: Exclude<FindingState, "fixed">;
18
+ }
19
+ export interface ScanFinding {
20
+ /** sha256 hex — the identity. */
21
+ fingerprint: string;
22
+ unit: string;
23
+ path: string;
24
+ /** The file's content hash at the last sighting (absent on legacy
25
+ * findings). */
26
+ blob?: string | null;
27
+ /** The anchored lines at the last sighting (1-based, inclusive). */
28
+ start: number;
29
+ end: number;
30
+ lens: string;
31
+ kind: string;
32
+ severity: ScanSeverity;
33
+ confidence: number | null;
34
+ /** The lens's reachability (null: it wrote none, read as routine). Absent
35
+ * on legacy findings. */
36
+ reachability?: Reachability | null;
37
+ /** What the lens said before the reachability cap lowered `severity`. */
38
+ capped_from?: ScanSeverity | null;
39
+ /** Whether `evidence` quotes the anchored code (`evidenceQuotesAnchor`) —
40
+ * false marks a finding whose lines may not be the defect's. */
41
+ anchor_quoted?: boolean;
42
+ claim: string;
43
+ evidence: string | null;
44
+ fix: string | null;
45
+ detail: string | null;
46
+ state: FindingState;
47
+ /** A validator looked at it (survived, or doubted). */
48
+ validated: boolean;
49
+ /** "May not be valid": the validator's doubt word and reason — and, from
50
+ * the scan skeptic, the false-positive class it matched (a
51
+ * SCAN_FALSE_POSITIVE_CLASSES slug; null or absent when none). */
52
+ doubt: FindingDoubt | null;
53
+ /** The skeptic's tier. Null or absent: no skeptic judged it — UNKNOWN. */
54
+ validity?: Validity | null;
55
+ /** The skeptic's scenario for a confirmed or likely finding: the traced
56
+ * path from an entry point (confirmed), or what it could and could not
57
+ * trace (likely). */
58
+ scenario?: string | null;
59
+ first_seen: Sighting;
60
+ last_seen: Sighting;
61
+ /** Scans that reported it. */
62
+ seen: number;
63
+ /** Set while (and only while) the state is `fixed`. */
64
+ fixed?: FixedMark | null;
65
+ /** A DISMISSED finding a re-scan settled as no longer reported (its file
66
+ * re-read at other content, or gone, and nothing paired it): where — the
67
+ * audit of what would otherwise have been `fixed`. The state stays
68
+ * `dismissed` (the operator's triage is never overwritten by a scan);
69
+ * cleared when a scan reports it again. Absent: never so settled. */
70
+ unreported?: Sighting | null;
71
+ /** Re-reads of the unchanged content it was last seen at that did not
72
+ * report it again — the latest, and how many since its last sighting.
73
+ * The finding stays open; cleared when a scan reports it again. */
74
+ not_reproduced?: NotReproduced | null;
75
+ /** Fingerprints this finding carried before the companion matched it to
76
+ * a moved or reworded sighting, and those of near-duplicates collapsed
77
+ * into it — a ticket stamped with one still finds it. */
78
+ aliases?: string[];
79
+ /** Every lens that raised it, its own first — set once a near-duplicate
80
+ * from another report was collapsed into it (absent: just `lens`). */
81
+ lenses?: string[];
82
+ /** The near-duplicate sightings collapsed into it, as last reported. */
83
+ merged?: MergedSighting[];
84
+ /** Its OWN fingerprint's latest severity, kept once near-duplicates
85
+ * collapsed into it (`severity` is then the highest of this and each
86
+ * merged sighting's) — so the aggregate is recomputed from the latest
87
+ * reports whichever sighting reports last. */
88
+ own_severity?: ScanSeverity;
89
+ /** Its own latest judgement, before aggregating merged sightings. */
90
+ own_judgement?: Judgement;
91
+ /** Why the operator dismissed it; kept after a later promote. */
92
+ dismissal?: Dismissal | null;
93
+ /** Where it was filed when promoted. */
94
+ ticket?: FindingTicket | null;
95
+ /** It resembles (`nearDuplicate`) a finding the operator DISMISSED: that
96
+ * finding and its dismissal's reason. A flag only — it stays
97
+ * `new` for the operator to triage; read through `dismissedLookalike`.
98
+ * Absent or null: it resembles none. */
99
+ resembles_dismissed?: ResemblesDismissed | null;
100
+ }
101
+ export interface ResemblesDismissed {
102
+ fingerprint: string;
103
+ reason: string;
104
+ }
105
+ export interface FindingDoubt {
106
+ word: string;
107
+ reason: string;
108
+ class?: string | null;
109
+ }
110
+ export interface NotReproduced extends Sighting {
111
+ count: number;
112
+ }
113
+ type Judgement = Pick<ScanFinding, "validated" | "doubt" | "validity" | "scenario">;
114
+ export interface MergedSighting extends Partial<Judgement> {
115
+ fingerprint: string;
116
+ lens: string;
117
+ start: number;
118
+ end: number;
119
+ severity: ScanSeverity;
120
+ claim: string;
121
+ }
122
+ export interface Dismissal {
123
+ reason: string;
124
+ at: string;
125
+ /** The unpinned memory note: written, or why not (a later dismiss retries). */
126
+ memory: "written" | {
127
+ problem: string;
128
+ };
129
+ }
130
+ export interface FindingTicket {
131
+ /** Which sink filed it — a close goes back through the same kind. */
132
+ sink: string;
133
+ /** The sink's reference: `FT-NNNN`, or the markdown file's path. */
134
+ ref: string;
135
+ effort: string;
136
+ filed_at: string;
137
+ /** Set once the ticket was closed because a re-scan found it fixed. */
138
+ closed?: {
139
+ at: string;
140
+ sha: string;
141
+ run: string;
142
+ } | null;
143
+ }
144
+ /** What a scan reports — a finding before the store gives it a history. */
145
+ export type ReportedFinding = Omit<ScanFinding, "state" | "first_seen" | "last_seen" | "seen" | "fixed" | "unreported" | "not_reproduced" | "aliases" | "lenses" | "merged" | "own_severity" | "own_judgement" | "dismissal" | "ticket" | "resembles_dismissed">;
146
+ /** How far apart (lines between the two ranges) two sightings of one defect
147
+ * may be anchored — one real pair sat 81 lines apart. */
148
+ export declare const NEAR_LINES = 100;
149
+ /** The stemmed-token Jaccard two claims must reach to be one defect. */
150
+ export declare const CLAIM_SIMILARITY = 0.4;
151
+ /**
152
+ * Are `a` and `b` the same defect reported twice? Same file, same kind,
153
+ * ranges overlapping or at most NEAR_LINES apart, the same subject (first
154
+ * content stem — "Inline-comment reads…" and "Issue-comment reads…" are one
155
+ * pattern in two places, not one defect) and claims whose stemmed tokens
156
+ * overlap at CLAIM_SIMILARITY or more. Pure; symmetric.
157
+ */
158
+ export declare function nearDuplicate(a: Pick<ScanFinding, "path" | "kind" | "start" | "end" | "claim">, b: Pick<ScanFinding, "path" | "kind" | "start" | "end" | "claim">): boolean;
159
+ /** The companion's pending sameness call: stored findings a re-scan no
160
+ * longer reports exactly, and the fresh findings any of them might be. */
161
+ export interface MatchQuestion {
162
+ /** Moves whenever the question does; an answer must quote it. */
163
+ key: string;
164
+ /** The latest run that fed the question — a finding left unpaired is
165
+ * fixed as of this sighting. */
166
+ run: string;
167
+ sha: string;
168
+ at: string;
169
+ unreported: string[];
170
+ fresh: string[];
171
+ }
172
+ export interface FindingsFile {
173
+ version: number;
174
+ findings: ScanFinding[];
175
+ /** At most one pending match question. */
176
+ question?: MatchQuestion | null;
177
+ }
178
+ export interface FindingsFilter {
179
+ state?: FindingState;
180
+ lens?: string;
181
+ unit?: string;
182
+ severity?: ScanSeverity;
183
+ /** true: only "may not be valid"; false: only the rest. */
184
+ doubted?: boolean;
185
+ /** Only this tier (`unknown`: the findings no skeptic judged). */
186
+ validity?: ValidityView;
187
+ }
188
+ export interface ReconcileResult {
189
+ /** Findings fixed outright: nothing fresh could be them. */
190
+ fixed: number;
191
+ /** Unreported findings waiting on the companion's match. */
192
+ pending: number;
193
+ /** Open findings a re-read of their UNCHANGED content did not report
194
+ * again — kept open, stamped `not_reproduced`, never fixed. */
195
+ not_reproduced: number;
196
+ /** Dismissed findings settled as no longer reported: they stay
197
+ * `dismissed`, stamped `unreported` for audit — never counted as fixed. */
198
+ dismissed_unreported: number;
199
+ }
200
+ export interface MatchPair {
201
+ /** A fingerprint from the question's `unreported`. */
202
+ old: string;
203
+ /** A fingerprint from the question's `fresh`. */
204
+ new: string;
205
+ }
206
+ export type MatchResult = {
207
+ ok: true;
208
+ matched: number;
209
+ fixed: number;
210
+ new: number;
211
+ dismissed_unreported: number;
212
+ } | {
213
+ ok: false;
214
+ errors: string[];
215
+ };
216
+ /** The question, both sides expanded, for the companion to judge. */
217
+ export interface MatchQuestionView {
218
+ key: string;
219
+ run: string;
220
+ sha: string;
221
+ unreported: ScanFinding[];
222
+ fresh: ScanFinding[];
223
+ }
224
+ export { goneDismissal } from "./scanreport.js";
225
+ /** Is `f` already settled — fixed, or a gone dismissal? A settled finding is
226
+ * out of play until a scan reports it again. */
227
+ export declare const settled: (f: ScanFinding) => boolean;
228
+ export declare class FindingsStore {
229
+ private readonly state;
230
+ constructor(state: StateFs);
231
+ private loadFile;
232
+ private write;
233
+ load(): {
234
+ findings: ScanFinding[];
235
+ error: string | null;
236
+ };
237
+ /**
238
+ * Record what one case reported. Exact fingerprint match first: a known
239
+ * finding keeps its state and first sighting; an unknown one is `new`.
240
+ * A known finding the pending match question held as unreported has been
241
+ * reported again, so it leaves the question. An unknown one that is a
242
+ * near-duplicate of a stored live finding is collapsed into it
243
+ * (`nearDuplicate`). Returns how many were new, how many matched (by
244
+ * fingerprint or alias) and how many were collapsed. Throws when the stored file cannot be read — never
245
+ * writes over it.
246
+ */
247
+ report(reported: readonly ReportedFinding[], seen: Sighting): {
248
+ added: number;
249
+ matched: number;
250
+ merged: number;
251
+ };
252
+ /**
253
+ * After a run: find the stored findings a re-scan no longer reports and
254
+ * settle what an exact rule can. A finding is UNREPORTED when its file is
255
+ * gone from the run's tree, or when the ledger's newest row for its lens
256
+ * and file is a later run's reading of other content — so a run the
257
+ * companion never finished is still counted by the next one. Unreported
258
+ * findings with no possible fresh counterpart are fixed now; the rest join
259
+ * the one pending match question, with the fresh findings (first seen by
260
+ * the runs that re-read those files) that might be them.
261
+ */
262
+ reconcile(args: {
263
+ rows: readonly LedgerEntry[];
264
+ tree: ReadonlySet<string>;
265
+ /** The run's tree's content hash per path: when given, only a reading
266
+ * of THAT content settles a finding — a newer reading of other content
267
+ * says nothing about a tree that has since gone back. */
268
+ blobs?: ReadonlyMap<string, string>;
269
+ run: Sighting;
270
+ }): ReconcileResult;
271
+ /** The pending match question with both sides expanded, or null. */
272
+ question(): {
273
+ question: MatchQuestionView | null;
274
+ error: string | null;
275
+ };
276
+ /**
277
+ * The companion's answer to the pending question, whole: `pairs` are the
278
+ * same finding (one-to-one, a lens in common); every unreported finding it does
279
+ * not pair is fixed; every fresh one it does not pair stays new. Refused —
280
+ * all of it — on a stale key, an unknown fingerprint, a reused one, a
281
+ * lens mismatch, or a pair whose two sides carry different tickets.
282
+ */
283
+ match(args: {
284
+ key?: unknown;
285
+ pairs?: unknown;
286
+ }): MatchResult;
287
+ /** The stored findings the filter keeps, most severe first — a finding
288
+ * flagged as resembling a dismissed one below the rest of its severity —
289
+ * then by file. */
290
+ list(filter?: FindingsFilter): {
291
+ findings: ScanFinding[];
292
+ error: string | null;
293
+ };
294
+ /**
295
+ * The one stored finding `ref` names: a full fingerprint, an alias (a
296
+ * fingerprint it carried before a match), or an unambiguous prefix of at
297
+ * least 12 hex characters — what `scan_findings` shows.
298
+ */
299
+ find(ref: string): {
300
+ ok: true;
301
+ finding: ScanFinding;
302
+ } | {
303
+ ok: false;
304
+ errors: string[];
305
+ };
306
+ /**
307
+ * Rewrite ONE finding, by its current fingerprint, under a fresh load —
308
+ * refused (nothing written) when the store cannot be read or the finding
309
+ * is gone (a match renamed it since the caller looked). `change` returns
310
+ * the new record, or an error string to refuse.
311
+ */
312
+ update(fingerprint: string, change: (f: ScanFinding) => ScanFinding | string): {
313
+ ok: true;
314
+ finding: ScanFinding;
315
+ } | {
316
+ ok: false;
317
+ errors: string[];
318
+ };
319
+ }
320
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../src/scan/findings.ts"],"names":[],"mappings":"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"}