audit-tools 0.42.0 → 0.43.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 (261) hide show
  1. package/dispatch/merge-results.mjs +229 -140
  2. package/dispatch/validate-result.mjs +98 -40
  3. package/dist/audit/cli/conceptualDispatch.d.ts.map +1 -1
  4. package/dist/audit/cli/conceptualDispatch.js +35 -3
  5. package/dist/audit/cli/conceptualDispatch.js.map +1 -1
  6. package/dist/audit/cli/dispatch/hostHandoff.d.ts +9 -1
  7. package/dist/audit/cli/dispatch/hostHandoff.d.ts.map +1 -1
  8. package/dist/audit/cli/dispatch/hostHandoff.js +94 -38
  9. package/dist/audit/cli/dispatch/hostHandoff.js.map +1 -1
  10. package/dist/audit/cli/nextStepCommand.d.ts +64 -0
  11. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  12. package/dist/audit/cli/nextStepCommand.js +877 -783
  13. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  14. package/dist/audit/cli/nextStepHelpers.d.ts +12 -0
  15. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  16. package/dist/audit/cli/nextStepHelpers.js +34 -1
  17. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  18. package/dist/audit/cli/steps.d.ts +2 -2
  19. package/dist/audit/extractors/graph.d.ts +28 -2
  20. package/dist/audit/extractors/graph.d.ts.map +1 -1
  21. package/dist/audit/extractors/graph.js +122 -11
  22. package/dist/audit/extractors/graph.js.map +1 -1
  23. package/dist/audit/extractors/graphRoutes.d.ts +8 -0
  24. package/dist/audit/extractors/graphRoutes.d.ts.map +1 -1
  25. package/dist/audit/extractors/graphRoutes.js +71 -4
  26. package/dist/audit/extractors/graphRoutes.js.map +1 -1
  27. package/dist/audit/io/artifacts.d.ts +55 -0
  28. package/dist/audit/io/artifacts.d.ts.map +1 -1
  29. package/dist/audit/io/artifacts.js +189 -12
  30. package/dist/audit/io/artifacts.js.map +1 -1
  31. package/dist/audit/io/toolingManifest.d.ts +11 -0
  32. package/dist/audit/io/toolingManifest.d.ts.map +1 -1
  33. package/dist/audit/io/toolingManifest.js +13 -3
  34. package/dist/audit/io/toolingManifest.js.map +1 -1
  35. package/dist/audit/orchestrator/advance.d.ts +64 -0
  36. package/dist/audit/orchestrator/advance.d.ts.map +1 -1
  37. package/dist/audit/orchestrator/advance.js +191 -57
  38. package/dist/audit/orchestrator/advance.js.map +1 -1
  39. package/dist/audit/orchestrator/charterClarificationExecutor.d.ts.map +1 -1
  40. package/dist/audit/orchestrator/charterClarificationExecutor.js +55 -21
  41. package/dist/audit/orchestrator/charterClarificationExecutor.js.map +1 -1
  42. package/dist/audit/orchestrator/flowCoverage.d.ts.map +1 -1
  43. package/dist/audit/orchestrator/flowCoverage.js +7 -10
  44. package/dist/audit/orchestrator/flowCoverage.js.map +1 -1
  45. package/dist/audit/orchestrator/flowPlanning.d.ts +54 -1
  46. package/dist/audit/orchestrator/flowPlanning.d.ts.map +1 -1
  47. package/dist/audit/orchestrator/flowPlanning.js +77 -18
  48. package/dist/audit/orchestrator/flowPlanning.js.map +1 -1
  49. package/dist/audit/orchestrator/flowRequeue.d.ts.map +1 -1
  50. package/dist/audit/orchestrator/flowRequeue.js +6 -10
  51. package/dist/audit/orchestrator/flowRequeue.js.map +1 -1
  52. package/dist/audit/orchestrator/partitionTaskGraph.d.ts.map +1 -1
  53. package/dist/audit/orchestrator/partitionTaskGraph.js +2 -2
  54. package/dist/audit/orchestrator/partitionTaskGraph.js.map +1 -1
  55. package/dist/audit/orchestrator/requeueFold.d.ts.map +1 -1
  56. package/dist/audit/orchestrator/requeueFold.js +18 -5
  57. package/dist/audit/orchestrator/requeueFold.js.map +1 -1
  58. package/dist/audit/orchestrator/staleness.d.ts +24 -1
  59. package/dist/audit/orchestrator/staleness.d.ts.map +1 -1
  60. package/dist/audit/orchestrator/staleness.js +147 -16
  61. package/dist/audit/orchestrator/staleness.js.map +1 -1
  62. package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts +26 -0
  63. package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts.map +1 -1
  64. package/dist/audit/orchestrator/syntaxResolutionExecutor.js +97 -12
  65. package/dist/audit/orchestrator/syntaxResolutionExecutor.js.map +1 -1
  66. package/dist/audit/orchestrator/taskBuilder.d.ts.map +1 -1
  67. package/dist/audit/orchestrator/taskBuilder.js +111 -21
  68. package/dist/audit/orchestrator/taskBuilder.js.map +1 -1
  69. package/dist/audit/orchestrator/trivialAudit.d.ts +17 -1
  70. package/dist/audit/orchestrator/trivialAudit.d.ts.map +1 -1
  71. package/dist/audit/orchestrator/trivialAudit.js +31 -4
  72. package/dist/audit/orchestrator/trivialAudit.js.map +1 -1
  73. package/dist/audit/reporting/synthesis.d.ts.map +1 -1
  74. package/dist/audit/reporting/synthesis.js +2 -3
  75. package/dist/audit/reporting/synthesis.js.map +1 -1
  76. package/dist/audit/reporting/workBlocks.d.ts.map +1 -1
  77. package/dist/audit/reporting/workBlocks.js +4 -38
  78. package/dist/audit/reporting/workBlocks.js.map +1 -1
  79. package/dist/audit/types/analyzerCapability.d.ts +6 -6
  80. package/dist/audit/types/charterRegister.d.ts +30 -12
  81. package/dist/audit/types/charterRegister.d.ts.map +1 -1
  82. package/dist/audit/types/charterRegister.js +22 -9
  83. package/dist/audit/types/charterRegister.js.map +1 -1
  84. package/dist/audit/validation/anchorGrounding.d.ts.map +1 -1
  85. package/dist/audit/validation/anchorGrounding.js +17 -0
  86. package/dist/audit/validation/anchorGrounding.js.map +1 -1
  87. package/dist/audit/validation/auditResults.d.ts +17 -0
  88. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  89. package/dist/audit/validation/auditResults.js +50 -17
  90. package/dist/audit/validation/auditResults.js.map +1 -1
  91. package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts +48 -0
  92. package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts.map +1 -1
  93. package/dist/remediate/contractPipeline/cyclicSeamResolution.js +128 -0
  94. package/dist/remediate/contractPipeline/cyclicSeamResolution.js.map +1 -1
  95. package/dist/remediate/contractPipeline/derive.d.ts +8 -5
  96. package/dist/remediate/contractPipeline/derive.d.ts.map +1 -1
  97. package/dist/remediate/contractPipeline/derive.js +8 -16
  98. package/dist/remediate/contractPipeline/derive.js.map +1 -1
  99. package/dist/remediate/index.d.ts.map +1 -1
  100. package/dist/remediate/index.js +43 -2
  101. package/dist/remediate/index.js.map +1 -1
  102. package/dist/remediate/intent/intentOrdering.d.ts +13 -5
  103. package/dist/remediate/intent/intentOrdering.d.ts.map +1 -1
  104. package/dist/remediate/intent/intentOrdering.js +56 -25
  105. package/dist/remediate/intent/intentOrdering.js.map +1 -1
  106. package/dist/remediate/phases/close.d.ts +57 -2
  107. package/dist/remediate/phases/close.d.ts.map +1 -1
  108. package/dist/remediate/phases/close.js +260 -36
  109. package/dist/remediate/phases/close.js.map +1 -1
  110. package/dist/remediate/state/disposition.d.ts +26 -4
  111. package/dist/remediate/state/disposition.d.ts.map +1 -1
  112. package/dist/remediate/state/itemStatus.d.ts +33 -6
  113. package/dist/remediate/state/itemStatus.d.ts.map +1 -1
  114. package/dist/remediate/state/itemStatus.js +154 -39
  115. package/dist/remediate/state/itemStatus.js.map +1 -1
  116. package/dist/remediate/state/types.d.ts +41 -2
  117. package/dist/remediate/state/types.d.ts.map +1 -1
  118. package/dist/remediate/state/types.js.map +1 -1
  119. package/dist/remediate/steps/contractPipeline.d.ts +287 -15
  120. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  121. package/dist/remediate/steps/contractPipeline.js +1664 -987
  122. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  123. package/dist/remediate/steps/contractPipelinePrompts.js +1 -1
  124. package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
  125. package/dist/remediate/steps/dispatch/hostHandoff.d.ts +137 -2
  126. package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
  127. package/dist/remediate/steps/dispatch/hostHandoff.js +713 -59
  128. package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
  129. package/dist/remediate/steps/finalGate.d.ts +136 -37
  130. package/dist/remediate/steps/finalGate.d.ts.map +1 -1
  131. package/dist/remediate/steps/finalGate.js +120 -86
  132. package/dist/remediate/steps/finalGate.js.map +1 -1
  133. package/dist/remediate/steps/gateCommands.d.ts +8 -0
  134. package/dist/remediate/steps/gateCommands.d.ts.map +1 -1
  135. package/dist/remediate/steps/gateCommands.js +40 -11
  136. package/dist/remediate/steps/gateCommands.js.map +1 -1
  137. package/dist/remediate/steps/nextStep.d.ts +96 -5
  138. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  139. package/dist/remediate/steps/nextStep.js +668 -147
  140. package/dist/remediate/steps/nextStep.js.map +1 -1
  141. package/dist/remediate/steps/types.d.ts +4 -1
  142. package/dist/remediate/steps/types.d.ts.map +1 -1
  143. package/dist/remediate/steps/types.js +10 -0
  144. package/dist/remediate/steps/types.js.map +1 -1
  145. package/dist/remediate/validation/artifacts.d.ts +20 -0
  146. package/dist/remediate/validation/artifacts.d.ts.map +1 -1
  147. package/dist/remediate/validation/artifacts.js +239 -13
  148. package/dist/remediate/validation/artifacts.js.map +1 -1
  149. package/dist/remediate/validation/contractPipelineGates.d.ts +58 -0
  150. package/dist/remediate/validation/contractPipelineGates.d.ts.map +1 -1
  151. package/dist/remediate/validation/contractPipelineGates.js +167 -43
  152. package/dist/remediate/validation/contractPipelineGates.js.map +1 -1
  153. package/dist/shared/analyzers/acquisitionEngine.d.ts +72 -25
  154. package/dist/shared/analyzers/acquisitionEngine.d.ts.map +1 -1
  155. package/dist/shared/analyzers/acquisitionEngine.js +149 -15
  156. package/dist/shared/analyzers/acquisitionEngine.js.map +1 -1
  157. package/dist/shared/analyzers/binaryAcquisition.d.ts +27 -2
  158. package/dist/shared/analyzers/binaryAcquisition.d.ts.map +1 -1
  159. package/dist/shared/analyzers/binaryAcquisition.js +149 -43
  160. package/dist/shared/analyzers/binaryAcquisition.js.map +1 -1
  161. package/dist/shared/analyzers/candidates.d.ts +9 -8
  162. package/dist/shared/analyzers/candidates.d.ts.map +1 -1
  163. package/dist/shared/analyzers/candidates.js +96 -64
  164. package/dist/shared/analyzers/candidates.js.map +1 -1
  165. package/dist/shared/analyzers/normalizeExternal.d.ts +40 -12
  166. package/dist/shared/analyzers/normalizeExternal.d.ts.map +1 -1
  167. package/dist/shared/analyzers/normalizeExternal.js +74 -18
  168. package/dist/shared/analyzers/normalizeExternal.js.map +1 -1
  169. package/dist/shared/analyzers/rubocop.d.ts +14 -13
  170. package/dist/shared/analyzers/rubocop.d.ts.map +1 -1
  171. package/dist/shared/analyzers/rubocop.js +29 -6
  172. package/dist/shared/analyzers/rubocop.js.map +1 -1
  173. package/dist/shared/analyzers/types.d.ts +196 -13
  174. package/dist/shared/analyzers/types.d.ts.map +1 -1
  175. package/dist/shared/analyzers/types.js +122 -9
  176. package/dist/shared/analyzers/types.js.map +1 -1
  177. package/dist/shared/decompose/charterClarification.d.ts +12 -1
  178. package/dist/shared/decompose/charterClarification.d.ts.map +1 -1
  179. package/dist/shared/decompose/charterClarification.js +11 -4
  180. package/dist/shared/decompose/charterClarification.js.map +1 -1
  181. package/dist/shared/decompose/charterExtraction.d.ts +20 -10
  182. package/dist/shared/decompose/charterExtraction.d.ts.map +1 -1
  183. package/dist/shared/decompose/charterExtraction.js +52 -23
  184. package/dist/shared/decompose/charterExtraction.js.map +1 -1
  185. package/dist/shared/decompose/contentCoherence.d.ts +43 -2
  186. package/dist/shared/decompose/contentCoherence.d.ts.map +1 -1
  187. package/dist/shared/decompose/contentCoherence.js +109 -5
  188. package/dist/shared/decompose/contentCoherence.js.map +1 -1
  189. package/dist/shared/decompose/modularity.d.ts +17 -0
  190. package/dist/shared/decompose/modularity.d.ts.map +1 -1
  191. package/dist/shared/decompose/modularity.js +78 -3
  192. package/dist/shared/decompose/modularity.js.map +1 -1
  193. package/dist/shared/decompose/workBlockSeams.d.ts +45 -0
  194. package/dist/shared/decompose/workBlockSeams.d.ts.map +1 -0
  195. package/dist/shared/decompose/workBlockSeams.js +82 -0
  196. package/dist/shared/decompose/workBlockSeams.js.map +1 -0
  197. package/dist/shared/index.d.ts +4 -3
  198. package/dist/shared/index.d.ts.map +1 -1
  199. package/dist/shared/index.js +4 -2
  200. package/dist/shared/index.js.map +1 -1
  201. package/dist/shared/intent/freeFormIntentInterpreter.d.ts +12 -2
  202. package/dist/shared/intent/freeFormIntentInterpreter.d.ts.map +1 -1
  203. package/dist/shared/intent/freeFormIntentInterpreter.js +27 -22
  204. package/dist/shared/intent/freeFormIntentInterpreter.js.map +1 -1
  205. package/dist/shared/intent/pathScope.d.ts +12 -1
  206. package/dist/shared/intent/pathScope.d.ts.map +1 -1
  207. package/dist/shared/intent/pathScope.js +56 -19
  208. package/dist/shared/intent/pathScope.js.map +1 -1
  209. package/dist/shared/intent/sharedIntentData.d.ts +19 -1
  210. package/dist/shared/intent/sharedIntentData.d.ts.map +1 -1
  211. package/dist/shared/intent/sharedIntentData.js +33 -8
  212. package/dist/shared/intent/sharedIntentData.js.map +1 -1
  213. package/dist/shared/io/fileLock.d.ts +12 -0
  214. package/dist/shared/io/fileLock.d.ts.map +1 -1
  215. package/dist/shared/io/fileLock.js +48 -5
  216. package/dist/shared/io/fileLock.js.map +1 -1
  217. package/dist/shared/io/json.d.ts +13 -0
  218. package/dist/shared/io/json.d.ts.map +1 -1
  219. package/dist/shared/io/json.js +19 -1
  220. package/dist/shared/io/json.js.map +1 -1
  221. package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -1
  222. package/dist/shared/reporting/auditDeliverable.js +8 -3
  223. package/dist/shared/reporting/auditDeliverable.js.map +1 -1
  224. package/dist/shared/steps/stepEmissionScaffold.d.ts +69 -0
  225. package/dist/shared/steps/stepEmissionScaffold.d.ts.map +1 -0
  226. package/dist/shared/steps/stepEmissionScaffold.js +83 -0
  227. package/dist/shared/steps/stepEmissionScaffold.js.map +1 -0
  228. package/dist/shared/submission/handRecovery.d.ts.map +1 -1
  229. package/dist/shared/submission/handRecovery.js +69 -4
  230. package/dist/shared/submission/handRecovery.js.map +1 -1
  231. package/dist/shared/submission/submissionIdentity.d.ts +10 -1
  232. package/dist/shared/submission/submissionIdentity.d.ts.map +1 -1
  233. package/dist/shared/submission/submissionIdentity.js +12 -3
  234. package/dist/shared/submission/submissionIdentity.js.map +1 -1
  235. package/dist/shared/submission/submissionLedger.d.ts +43 -2
  236. package/dist/shared/submission/submissionLedger.d.ts.map +1 -1
  237. package/dist/shared/submission/submissionLedger.js +50 -7
  238. package/dist/shared/submission/submissionLedger.js.map +1 -1
  239. package/dist/shared/tooling/allowlistedExec.d.ts +9 -0
  240. package/dist/shared/tooling/allowlistedExec.d.ts.map +1 -1
  241. package/dist/shared/tooling/allowlistedExec.js +19 -2
  242. package/dist/shared/tooling/allowlistedExec.js.map +1 -1
  243. package/dist/shared/types/charter.d.ts +24 -0
  244. package/dist/shared/types/charter.d.ts.map +1 -1
  245. package/dist/shared/types/charter.js +9 -0
  246. package/dist/shared/types/charter.js.map +1 -1
  247. package/dist/shared/types/finding.d.ts +105 -53
  248. package/dist/shared/types/finding.d.ts.map +1 -1
  249. package/dist/shared/types/finding.js +38 -11
  250. package/dist/shared/types/finding.js.map +1 -1
  251. package/dist/shared/types/remediationOutcome.d.ts +282 -9
  252. package/dist/shared/types/remediationOutcome.d.ts.map +1 -1
  253. package/dist/shared/types/remediationOutcome.js +174 -1
  254. package/dist/shared/types/remediationOutcome.js.map +1 -1
  255. package/dist/shared/validation/findingsReport.d.ts.map +1 -1
  256. package/dist/shared/validation/findingsReport.js +19 -1
  257. package/dist/shared/validation/findingsReport.js.map +1 -1
  258. package/package.json +2 -1
  259. package/remediate-code.mjs +15 -0
  260. package/wrapper/remediate-code-wrapper-install-hosts.mjs +45 -4
  261. package/wrapper/remediate-code-wrapper-install-renderers.mjs +12 -2
@@ -1,4 +1,5 @@
1
1
  import { hashAnalyzerSnippet, } from "./provenance.js";
2
+ import { normalizeRepoPath } from "../validation/findingGrounding.js";
2
3
  function normalizeExternalSeverity(value) {
3
4
  switch (value?.toLowerCase()) {
4
5
  case "critical": return "critical";
@@ -14,9 +15,51 @@ function normalizeExternalSeverity(value) {
14
15
  default: return "info";
15
16
  }
16
17
  }
18
+ /**
19
+ * Separator-normalized, `./`-stripped form. This is `normalizeRepoPath` WITHOUT the
20
+ * case fold — the fold is correct for membership matching and wrong for a path that
21
+ * will be persisted and later re-read from a case-sensitive filesystem.
22
+ */
23
+ function posixify(path) {
24
+ return path.trim().replace(/\\/g, "/").replace(/^\.\//, "");
25
+ }
26
+ /**
27
+ * Repo-relative form of an analyzer-reported path, case PRESERVED.
28
+ *
29
+ * Seven of the twelve candidates hand their tool the ABSOLUTE repository root as a
30
+ * positional target, so those tools echo absolute paths back. Persisting one makes
31
+ * the lead machine-specific, un-joinable against every repo-relative consumer, and
32
+ * unreadable by the provenance reader (`join(root, "/abs/path")` names nothing).
33
+ * Containment is decided with the shared {@link normalizeRepoPath} (case- and
34
+ * separator-folded, so win32 drive-letter and case drift still match); the returned
35
+ * value is sliced out of the ORIGINAL string so on-disk case survives.
36
+ *
37
+ * A path outside the repository root is left as-is: it is not repo-relative, and
38
+ * silently rewriting it would invent an identity the tool never reported.
39
+ */
40
+ export function toRepoRelativeAnalyzerPath(repoRoot, rawPath) {
41
+ const path = posixify(rawPath);
42
+ if (!repoRoot || path.length === 0)
43
+ return path;
44
+ const root = posixify(repoRoot).replace(/\/+$/, "");
45
+ if (root.length === 0)
46
+ return path;
47
+ const foldedRoot = normalizeRepoPath(root);
48
+ const foldedPath = normalizeRepoPath(path);
49
+ if (foldedPath === foldedRoot)
50
+ return "";
51
+ if (!foldedPath.startsWith(`${foldedRoot}/`))
52
+ return path;
53
+ return path.slice(root.length + 1);
54
+ }
17
55
  export function normalizeGenericExternalResults(tool, items, options = {}) {
18
- const valid = items.filter((item) => item.path && item.summary);
19
- const dropped = items.length - valid.length;
56
+ // Repo-relative FIRST: every downstream step validity, provenance read, and the
57
+ // persisted `path` must see the same normalized identity.
58
+ const normalizedItems = items.map((item) => typeof item?.path === "string"
59
+ ? { ...item, path: toRepoRelativeAnalyzerPath(options.repoRoot, item.path) }
60
+ : item);
61
+ const valid = normalizedItems.filter((item) => item.path && item.summary);
62
+ const dropped = normalizedItems.length - valid.length;
20
63
  if (dropped > 0) {
21
64
  process.stderr.write(JSON.stringify({
22
65
  event: "normalizer_findings_dropped",
@@ -34,12 +77,20 @@ export function normalizeGenericExternalResults(tool, items, options = {}) {
34
77
  sourceCache.set(path, options.readSource(path));
35
78
  return sourceCache.get(path);
36
79
  };
80
+ // An item with BOTH a path and a line number is anchorable; if its source cannot
81
+ // be read, provenance is lost for a reason the operator can act on. An item with
82
+ // no line number simply has no anchor — a different, benign state. Counting only
83
+ // the first keeps the two apart (they are byte-identical in the results array).
84
+ let sourceReadFailures = 0;
37
85
  const provenanceFor = (item) => {
38
86
  if (!item.path || item.line_start === undefined)
39
87
  return undefined;
40
88
  const source = readCached(item.path);
41
- if (source === undefined)
89
+ if (source === undefined) {
90
+ if (options.readSource)
91
+ sourceReadFailures += 1;
42
92
  return undefined;
93
+ }
43
94
  const snippet_hash = hashAnalyzerSnippet(source, item.line_start, item.line_end);
44
95
  if (snippet_hash === undefined)
45
96
  return undefined;
@@ -50,24 +101,29 @@ export function normalizeGenericExternalResults(tool, items, options = {}) {
50
101
  snippet_hash,
51
102
  };
52
103
  };
104
+ const results = valid.map((item, index) => {
105
+ const provenance = provenanceFor(item);
106
+ return {
107
+ id: item.id ?? `${tool}-${index + 1}`,
108
+ category: item.category ?? "unknown",
109
+ severity: normalizeExternalSeverity(item.severity),
110
+ path: item.path,
111
+ line_start: item.line_start,
112
+ line_end: item.line_end,
113
+ summary: item.summary,
114
+ rule: item.rule,
115
+ raw: item.raw,
116
+ ...(provenance !== undefined ? { provenance } : {}),
117
+ };
118
+ });
119
+ options.onDiagnostics?.({
120
+ dropped_items: dropped,
121
+ source_read_failures: sourceReadFailures,
122
+ });
53
123
  return {
54
124
  tool,
55
125
  generated_at: new Date().toISOString(),
56
- results: valid.map((item, index) => {
57
- const provenance = provenanceFor(item);
58
- return {
59
- id: item.id ?? `${tool}-${index + 1}`,
60
- category: item.category ?? "unknown",
61
- severity: normalizeExternalSeverity(item.severity),
62
- path: item.path,
63
- line_start: item.line_start,
64
- line_end: item.line_end,
65
- summary: item.summary,
66
- rule: item.rule,
67
- raw: item.raw,
68
- ...(provenance !== undefined ? { provenance } : {}),
69
- };
70
- }),
126
+ results,
71
127
  };
72
128
  }
73
129
  function clampUnitInterval(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeExternal.js","sourceRoot":"","sources":["../../../src/shared/analyzers/normalizeExternal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalizeExternal.js","sourceRoot":"","sources":["../../../src/shared/analyzers/normalizeExternal.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,19 @@
1
- import type { ExternalAnalyzerResults } from "./types.js";
1
+ import type { ExternalAnalyzerParsedItem, ExternalAnalyzerParseReport, ExternalAnalyzerResults } from "./types.js";
2
2
  /**
3
- * Parse rubocop's `--format json` stdout into the generic item shape. Degrades
4
- * to `[]` on empty/malformed input or a missing `files` array.
3
+ * Parse rubocop's `--format json` stdout, REPORTING a degradation rather than
4
+ * swallowing it: unparsable JSON or a payload with no `files` array comes back as
5
+ * `parse_failed`, which the acquisition engine classifies `parse_error`. Before
6
+ * this, a rubocop invocation that crashed or printed a non-JSON banner produced the
7
+ * same `{results: []}` as a genuinely clean Ruby tree — the one signal the status
8
+ * contract was designed to carry was unreachable from this adapter.
5
9
  */
6
- export declare function parseRubocop(stdout: string): Array<{
7
- id?: string;
8
- category?: string;
9
- severity?: string;
10
- path?: string;
11
- line_start?: number;
12
- line_end?: number;
13
- summary?: string;
14
- rule?: string;
15
- }>;
10
+ export declare function parseRubocopOutcome(stdout: string): ExternalAnalyzerParseReport;
11
+ /**
12
+ * The item-list view of {@link parseRubocopOutcome}, for the audit/adapters
13
+ * normalization seam, which consumes items and reports coverage elsewhere. One
14
+ * implementation, two views — never two parsers that can drift.
15
+ */
16
+ export declare function parseRubocop(stdout: string): ExternalAnalyzerParsedItem[];
16
17
  /**
17
18
  * Dedicated severity adapter: route rubocop's parsed items through the shared
18
19
  * generic normalizer so its output matches the exact ExternalAnalyzerResults
@@ -1 +1 @@
1
- {"version":3,"file":"rubocop.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/rubocop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgD1D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAsDD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAE5E"}
1
+ {"version":3,"file":"rubocop.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/rubocop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAgDpB;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CAwD/E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,0BAA0B,EAAE,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAE5E"}
@@ -11,18 +11,33 @@ function mapRubocopSeverity(severity) {
11
11
  }
12
12
  }
13
13
  /**
14
- * Parse rubocop's `--format json` stdout into the generic item shape. Degrades
15
- * to `[]` on empty/malformed input or a missing `files` array.
14
+ * Parse rubocop's `--format json` stdout, REPORTING a degradation rather than
15
+ * swallowing it: unparsable JSON or a payload with no `files` array comes back as
16
+ * `parse_failed`, which the acquisition engine classifies `parse_error`. Before
17
+ * this, a rubocop invocation that crashed or printed a non-JSON banner produced the
18
+ * same `{results: []}` as a genuinely clean Ruby tree — the one signal the status
19
+ * contract was designed to carry was unreachable from this adapter.
16
20
  */
17
- export function parseRubocop(stdout) {
21
+ export function parseRubocopOutcome(stdout) {
18
22
  let payload;
19
23
  try {
20
24
  payload = JSON.parse(stdout || "{}");
21
25
  }
22
26
  catch {
23
- return [];
27
+ return {
28
+ items: [],
29
+ parse_failed: true,
30
+ note: "rubocop: output is not valid JSON",
31
+ };
32
+ }
33
+ if (!payload || typeof payload !== "object" || !Array.isArray(payload.files)) {
34
+ return {
35
+ items: [],
36
+ parse_failed: true,
37
+ note: "rubocop: output has no `files` array",
38
+ };
24
39
  }
25
- const files = Array.isArray(payload.files) ? payload.files : [];
40
+ const files = payload.files;
26
41
  const items = [];
27
42
  for (const file of files) {
28
43
  if (!file || typeof file !== "object")
@@ -59,7 +74,15 @@ export function parseRubocop(stdout) {
59
74
  });
60
75
  }
61
76
  }
62
- return items;
77
+ return { items };
78
+ }
79
+ /**
80
+ * The item-list view of {@link parseRubocopOutcome}, for the audit/adapters
81
+ * normalization seam, which consumes items and reports coverage elsewhere. One
82
+ * implementation, two views — never two parsers that can drift.
83
+ */
84
+ export function parseRubocop(stdout) {
85
+ return parseRubocopOutcome(stdout).items;
63
86
  }
64
87
  /**
65
88
  * Dedicated severity adapter: route rubocop's parsed items through the shared
@@ -1 +1 @@
1
- {"version":3,"file":"rubocop.js","sourceRoot":"","sources":["../../../src/shared/analyzers/rubocop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rubocop.js","sourceRoot":"","sources":["../../../src/shared/analyzers/rubocop.ts"],"names":[],"mappings":"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"}
@@ -111,17 +111,93 @@ export declare const ExternalAnalyzerOwnershipRootSchema: z.ZodObject<{
111
111
  confidence?: number | undefined;
112
112
  kind?: string | undefined;
113
113
  }>;
114
+ /**
115
+ * The analyzer status vocabulary, single-sourced (artifact:analyzer-status-vocabulary).
116
+ * The zod enum below is BUILT from this tuple, so there is exactly one place a member
117
+ * is added — and {@link EXTERNAL_ANALYZER_STATUS_CLASSIFICATION} below is an exhaustive
118
+ * `Record` over it, so widening the tuple without classifying the new member is a
119
+ * COMPILE error rather than a silent fall-through to "the run was fine".
120
+ */
121
+ export declare const EXTERNAL_ANALYZER_TOOL_STATUSES: readonly ["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed", "checksum_mismatch"];
122
+ export type ExternalAnalyzerToolStatusValue = (typeof EXTERNAL_ANALYZER_TOOL_STATUSES)[number];
123
+ /**
124
+ * What each status says about COVERAGE — the question every consumer of a status
125
+ * record is really asking. `clean` is the ONLY value that may be read as "this tool
126
+ * ran and found nothing"; `degraded` means the tool ran but its output cannot be
127
+ * trusted as coverage; `not_run` means no coverage was produced at all.
128
+ *
129
+ * Exhaustive by construction: adding a member to
130
+ * {@link EXTERNAL_ANALYZER_TOOL_STATUSES} without adding its row here fails
131
+ * `npm run check`, so a new status can never default into `clean`.
132
+ */
133
+ /**
134
+ * What a status says about coverage. Named as a type so the vocabulary has ONE
135
+ * home and every consumer of the classification speaks it by name.
136
+ */
137
+ export type ExternalAnalyzerCoverage = "clean" | "findings" | "degraded" | "not_run";
138
+ /**
139
+ * True when a coverage class means NO trustworthy coverage was produced — the
140
+ * single member-level answer. Both consumers ask it here rather than each
141
+ * re-typing `=== "degraded" || === "not_run"`, so widening the coverage
142
+ * vocabulary is one edit guarded by a compile error, never a silent divergence
143
+ * between two copies of the same comparison.
144
+ */
145
+ export declare function isNonCleanAnalyzerCoverage(coverage: ExternalAnalyzerCoverage): boolean;
146
+ export declare const EXTERNAL_ANALYZER_STATUS_CLASSIFICATION: Record<ExternalAnalyzerToolStatusValue, ExternalAnalyzerCoverage>;
147
+ /**
148
+ * True when a RECORD means "this tool did not produce trustworthy coverage".
149
+ *
150
+ * The status member alone cannot answer this, because degradation is not always
151
+ * terminal: a run can exit non-zero, fail to parse, or drop rows and STILL surface
152
+ * some items, which lands it on `findings` — an affirmative member describing a
153
+ * partially-crashed run. Asking the member in isolation reports such a run as
154
+ * trustworthy, which is the same success-shaped-empty mistake one level up.
155
+ *
156
+ * So the question is asked of the whole record: degraded when the member says so, OR
157
+ * when the record carries a marker that findings were LOST —
158
+ * - a non-zero exit, or a NULL exit (killed by a signal, never exited on its own);
159
+ * - `dropped_rows` (parser rows plus normalizer items the run failed to report).
160
+ *
161
+ * `source_read_failures` is deliberately NOT in that set. Provenance is optional
162
+ * everywhere on this contract: an item whose anchor could not be resolved is still a
163
+ * fully reported lead, so an unresolved anchor is a weaker join key, not lost
164
+ * coverage. It stays on the record because it is worth surfacing; it just does not
165
+ * make the run untrustworthy.
166
+ *
167
+ * {@link EXTERNAL_ANALYZER_STATUS_CLASSIFICATION} remains the status-MEMBER map and
168
+ * the compile gate; this is the consumer-facing answer.
169
+ */
170
+ export declare function isDegradedExternalAnalyzerStatus(record: Pick<ExternalAnalyzerToolStatus, "status" | "exit_code" | "dropped_rows">): boolean;
114
171
  export declare const ExternalAnalyzerToolStatusSchema: z.ZodObject<{
115
172
  tool: z.ZodString;
116
173
  command: z.ZodOptional<z.ZodString>;
117
174
  resolved: z.ZodBoolean;
118
- status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed"]>;
175
+ status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed", "checksum_mismatch"]>;
119
176
  exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
120
177
  error: z.ZodOptional<z.ZodString>;
121
178
  output_snippet: z.ZodOptional<z.ZodString>;
179
+ /**
180
+ * The tool's own stderr, bounded. Present whenever stderr carried text — it is
181
+ * the only post-run evidence of WHY a non-zero exit or a stderr-only run failed.
182
+ */
183
+ stderr_snippet: z.ZodOptional<z.ZodString>;
184
+ /**
185
+ * Everything this run failed to report, as ONE count: rows the parser understood
186
+ * the shape of but could not use (malformed CSV/JSON rows), PLUS items the
187
+ * normalizer discarded for a missing path or summary. The engine merges the two
188
+ * because they are the same question to a consumer — how much did this run lose?
189
+ * A non-zero count means the run under-reports; it is never a clean scan.
190
+ */
191
+ dropped_rows: z.ZodOptional<z.ZodNumber>;
192
+ /**
193
+ * Items that named a path + line but whose source could not be read, so their
194
+ * content-anchored provenance was dropped. Distinguishes a broken read seam from
195
+ * a tool that legitimately reports no line numbers.
196
+ */
197
+ source_read_failures: z.ZodOptional<z.ZodNumber>;
122
198
  duration_ms: z.ZodOptional<z.ZodNumber>;
123
199
  }, "strict", z.ZodTypeAny, {
124
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
200
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
125
201
  resolved: boolean;
126
202
  tool: string;
127
203
  error?: string | undefined;
@@ -129,8 +205,11 @@ export declare const ExternalAnalyzerToolStatusSchema: z.ZodObject<{
129
205
  duration_ms?: number | undefined;
130
206
  exit_code?: number | null | undefined;
131
207
  output_snippet?: string | undefined;
208
+ stderr_snippet?: string | undefined;
209
+ dropped_rows?: number | undefined;
210
+ source_read_failures?: number | undefined;
132
211
  }, {
133
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
212
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
134
213
  resolved: boolean;
135
214
  tool: string;
136
215
  error?: string | undefined;
@@ -138,8 +217,50 @@ export declare const ExternalAnalyzerToolStatusSchema: z.ZodObject<{
138
217
  duration_ms?: number | undefined;
139
218
  exit_code?: number | null | undefined;
140
219
  output_snippet?: string | undefined;
220
+ stderr_snippet?: string | undefined;
221
+ dropped_rows?: number | undefined;
222
+ source_read_failures?: number | undefined;
141
223
  }>;
142
224
  export type ExternalAnalyzerToolStatus = z.infer<typeof ExternalAnalyzerToolStatusSchema>;
225
+ /**
226
+ * The generic pre-normalization item shape every analyzer parser emits. `from`/`to`
227
+ * are the optional dataflow-edge endpoints `normalizeGenericExternalEdges` reads.
228
+ */
229
+ export interface ExternalAnalyzerParsedItem {
230
+ id?: string;
231
+ category?: string;
232
+ severity?: string;
233
+ path?: string;
234
+ line_start?: number;
235
+ line_end?: number;
236
+ summary?: string;
237
+ rule?: string;
238
+ raw?: unknown;
239
+ from?: unknown;
240
+ to?: unknown;
241
+ }
242
+ /**
243
+ * A parse that can SAY it degraded. A bare `[]` cannot distinguish "the tool found
244
+ * nothing" from "the payload was unparseable" or "half the rows were malformed", and
245
+ * that ambiguity is what makes a broken analyzer read as a clean scan downstream.
246
+ */
247
+ export interface ExternalAnalyzerParseReport {
248
+ items: ExternalAnalyzerParsedItem[];
249
+ /** The payload could not be parsed at all (bad JSON/CSV, or the wrong top-level shape). */
250
+ parse_failed?: boolean;
251
+ /** Rows recognised but unusable — counted, never silently dropped. */
252
+ dropped_rows?: number;
253
+ /** Human-readable cause, carried onto the status record. */
254
+ note?: string;
255
+ }
256
+ /**
257
+ * What `ExternalAnalyzerCandidate.parse` returns. A plain array is the "nothing to
258
+ * report beyond the items" form; the report form is how a parser reports degradation.
259
+ * Read both through {@link readParseOutcome} so no consumer has to branch.
260
+ */
261
+ export type ExternalAnalyzerParseOutcome = ExternalAnalyzerParsedItem[] | ExternalAnalyzerParseReport;
262
+ /** Normalize either parse-outcome form into the report form. */
263
+ export declare function readParseOutcome(outcome: ExternalAnalyzerParseOutcome | undefined | null): Required<Pick<ExternalAnalyzerParseReport, "items">> & Omit<ExternalAnalyzerParseReport, "items">;
143
264
  /** Imported analyzer output captured at a single generation time. */
144
265
  export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
145
266
  tool: z.ZodString;
@@ -190,13 +311,32 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
190
311
  tool: z.ZodString;
191
312
  command: z.ZodOptional<z.ZodString>;
192
313
  resolved: z.ZodBoolean;
193
- status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed"]>;
314
+ status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed", "checksum_mismatch"]>;
194
315
  exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
195
316
  error: z.ZodOptional<z.ZodString>;
196
317
  output_snippet: z.ZodOptional<z.ZodString>;
318
+ /**
319
+ * The tool's own stderr, bounded. Present whenever stderr carried text — it is
320
+ * the only post-run evidence of WHY a non-zero exit or a stderr-only run failed.
321
+ */
322
+ stderr_snippet: z.ZodOptional<z.ZodString>;
323
+ /**
324
+ * Everything this run failed to report, as ONE count: rows the parser understood
325
+ * the shape of but could not use (malformed CSV/JSON rows), PLUS items the
326
+ * normalizer discarded for a missing path or summary. The engine merges the two
327
+ * because they are the same question to a consumer — how much did this run lose?
328
+ * A non-zero count means the run under-reports; it is never a clean scan.
329
+ */
330
+ dropped_rows: z.ZodOptional<z.ZodNumber>;
331
+ /**
332
+ * Items that named a path + line but whose source could not be read, so their
333
+ * content-anchored provenance was dropped. Distinguishes a broken read seam from
334
+ * a tool that legitimately reports no line numbers.
335
+ */
336
+ source_read_failures: z.ZodOptional<z.ZodNumber>;
197
337
  duration_ms: z.ZodOptional<z.ZodNumber>;
198
338
  }, "strict", z.ZodTypeAny, {
199
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
339
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
200
340
  resolved: boolean;
201
341
  tool: string;
202
342
  error?: string | undefined;
@@ -204,8 +344,11 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
204
344
  duration_ms?: number | undefined;
205
345
  exit_code?: number | null | undefined;
206
346
  output_snippet?: string | undefined;
347
+ stderr_snippet?: string | undefined;
348
+ dropped_rows?: number | undefined;
349
+ source_read_failures?: number | undefined;
207
350
  }, {
208
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
351
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
209
352
  resolved: boolean;
210
353
  tool: string;
211
354
  error?: string | undefined;
@@ -213,6 +356,9 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
213
356
  duration_ms?: number | undefined;
214
357
  exit_code?: number | null | undefined;
215
358
  output_snippet?: string | undefined;
359
+ stderr_snippet?: string | undefined;
360
+ dropped_rows?: number | undefined;
361
+ source_read_failures?: number | undefined;
216
362
  }>, "many">>;
217
363
  results: z.ZodArray<z.ZodObject<{
218
364
  id: z.ZodString;
@@ -310,7 +456,7 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
310
456
  kind?: string | undefined;
311
457
  }[] | undefined;
312
458
  tool_statuses?: {
313
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
459
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
314
460
  resolved: boolean;
315
461
  tool: string;
316
462
  error?: string | undefined;
@@ -318,6 +464,9 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
318
464
  duration_ms?: number | undefined;
319
465
  exit_code?: number | null | undefined;
320
466
  output_snippet?: string | undefined;
467
+ stderr_snippet?: string | undefined;
468
+ dropped_rows?: number | undefined;
469
+ source_read_failures?: number | undefined;
321
470
  }[] | undefined;
322
471
  }, {
323
472
  tool: string;
@@ -354,7 +503,7 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
354
503
  kind?: string | undefined;
355
504
  }[] | undefined;
356
505
  tool_statuses?: {
357
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
506
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
358
507
  resolved: boolean;
359
508
  tool: string;
360
509
  error?: string | undefined;
@@ -362,6 +511,9 @@ export declare const ExternalAnalyzerResultsSchema: z.ZodObject<{
362
511
  duration_ms?: number | undefined;
363
512
  exit_code?: number | null | undefined;
364
513
  output_snippet?: string | undefined;
514
+ stderr_snippet?: string | undefined;
515
+ dropped_rows?: number | undefined;
516
+ source_read_failures?: number | undefined;
365
517
  }[] | undefined;
366
518
  }>;
367
519
  export type ExternalAnalyzerResults = z.infer<typeof ExternalAnalyzerResultsSchema>;
@@ -384,13 +536,32 @@ export declare const ExternalAnalyzerAcquisitionMarkerSchema: z.ZodObject<{
384
536
  tool: z.ZodString;
385
537
  command: z.ZodOptional<z.ZodString>;
386
538
  resolved: z.ZodBoolean;
387
- status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed"]>;
539
+ status: z.ZodEnum<["skipped", "success", "findings", "not_resolved", "spawn_error", "parse_error", "failed", "checksum_mismatch"]>;
388
540
  exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
389
541
  error: z.ZodOptional<z.ZodString>;
390
542
  output_snippet: z.ZodOptional<z.ZodString>;
543
+ /**
544
+ * The tool's own stderr, bounded. Present whenever stderr carried text — it is
545
+ * the only post-run evidence of WHY a non-zero exit or a stderr-only run failed.
546
+ */
547
+ stderr_snippet: z.ZodOptional<z.ZodString>;
548
+ /**
549
+ * Everything this run failed to report, as ONE count: rows the parser understood
550
+ * the shape of but could not use (malformed CSV/JSON rows), PLUS items the
551
+ * normalizer discarded for a missing path or summary. The engine merges the two
552
+ * because they are the same question to a consumer — how much did this run lose?
553
+ * A non-zero count means the run under-reports; it is never a clean scan.
554
+ */
555
+ dropped_rows: z.ZodOptional<z.ZodNumber>;
556
+ /**
557
+ * Items that named a path + line but whose source could not be read, so their
558
+ * content-anchored provenance was dropped. Distinguishes a broken read seam from
559
+ * a tool that legitimately reports no line numbers.
560
+ */
561
+ source_read_failures: z.ZodOptional<z.ZodNumber>;
391
562
  duration_ms: z.ZodOptional<z.ZodNumber>;
392
563
  }, "strict", z.ZodTypeAny, {
393
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
564
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
394
565
  resolved: boolean;
395
566
  tool: string;
396
567
  error?: string | undefined;
@@ -398,8 +569,11 @@ export declare const ExternalAnalyzerAcquisitionMarkerSchema: z.ZodObject<{
398
569
  duration_ms?: number | undefined;
399
570
  exit_code?: number | null | undefined;
400
571
  output_snippet?: string | undefined;
572
+ stderr_snippet?: string | undefined;
573
+ dropped_rows?: number | undefined;
574
+ source_read_failures?: number | undefined;
401
575
  }, {
402
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
576
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
403
577
  resolved: boolean;
404
578
  tool: string;
405
579
  error?: string | undefined;
@@ -407,11 +581,14 @@ export declare const ExternalAnalyzerAcquisitionMarkerSchema: z.ZodObject<{
407
581
  duration_ms?: number | undefined;
408
582
  exit_code?: number | null | undefined;
409
583
  output_snippet?: string | undefined;
584
+ stderr_snippet?: string | undefined;
585
+ dropped_rows?: number | undefined;
586
+ source_read_failures?: number | undefined;
410
587
  }>, "many">;
411
588
  }, "strict", z.ZodTypeAny, {
412
589
  enabled: boolean;
413
590
  tool_statuses: {
414
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
591
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
415
592
  resolved: boolean;
416
593
  tool: string;
417
594
  error?: string | undefined;
@@ -419,12 +596,15 @@ export declare const ExternalAnalyzerAcquisitionMarkerSchema: z.ZodObject<{
419
596
  duration_ms?: number | undefined;
420
597
  exit_code?: number | null | undefined;
421
598
  output_snippet?: string | undefined;
599
+ stderr_snippet?: string | undefined;
600
+ dropped_rows?: number | undefined;
601
+ source_read_failures?: number | undefined;
422
602
  }[];
423
603
  generated_at?: string | undefined;
424
604
  }, {
425
605
  enabled: boolean;
426
606
  tool_statuses: {
427
- status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error";
607
+ status: "failed" | "findings" | "skipped" | "spawn_error" | "success" | "not_resolved" | "parse_error" | "checksum_mismatch";
428
608
  resolved: boolean;
429
609
  tool: string;
430
610
  error?: string | undefined;
@@ -432,6 +612,9 @@ export declare const ExternalAnalyzerAcquisitionMarkerSchema: z.ZodObject<{
432
612
  duration_ms?: number | undefined;
433
613
  exit_code?: number | null | undefined;
434
614
  output_snippet?: string | undefined;
615
+ stderr_snippet?: string | undefined;
616
+ dropped_rows?: number | undefined;
617
+ source_read_failures?: number | undefined;
435
618
  }[];
436
619
  generated_at?: string | undefined;
437
620
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,sFAAsF;AACtF,eAAO,MAAM,gCAAgC;;;;;;;;;IAUzC,iFAAiF;;IAEjF,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlE,CAAC;AACZ,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,gCAAgC,CACxC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;EAQjC,CAAC;AACZ,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;EAQrC,CAAC;AAEZ,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBlC,CAAC;AACZ,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,gCAAgC,CACxC,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;IAKtC;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA5EH,iFAAiF;;QAEjF,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+ElE,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,6BAA6B,CACrC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMzC,CAAC;AACZ,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CACrD,OAAO,uCAAuC,CAC/C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,SAAS,EAC/C,QAAQ,EAAE,uBAAuB,GAChC,uBAAuB,EAAE,CAI3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/types.ts"],"names":[],"mappings":"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"}