@clear-capabilities/agentic-security-scanner 0.144.0 → 0.147.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 (209) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/bin/agentic-security.js +3813 -83
  3. package/dist/1122.index.js +702 -0
  4. package/dist/{301.index.js → 1301.index.js} +2 -2
  5. package/dist/1379.index.js +591 -0
  6. package/dist/{444.index.js → 1444.index.js} +13 -4
  7. package/dist/{660.index.js → 1660.index.js} +2 -2
  8. package/dist/{700.index.js → 1700.index.js} +2 -2
  9. package/dist/{905.index.js → 1905.index.js} +3 -3
  10. package/dist/{920.index.js → 1920.index.js} +3 -3
  11. package/dist/{238.index.js → 2238.index.js} +3 -3
  12. package/dist/2271.index.js +165 -0
  13. package/dist/{985.index.js → 2376.index.js} +1260 -340
  14. package/dist/2432.index.js +793 -0
  15. package/dist/2659.index.js +93 -0
  16. package/dist/{826.index.js → 2826.index.js} +2 -2
  17. package/dist/{830.index.js → 2830.index.js} +2 -2
  18. package/dist/2923.index.js +298 -0
  19. package/dist/{1.index.js → 3001.index.js} +5 -5
  20. package/dist/{117.index.js → 3117.index.js} +3 -3
  21. package/dist/3180.index.js +307 -0
  22. package/dist/3276.index.js +117 -0
  23. package/dist/{415.index.js → 3415.index.js} +2 -2
  24. package/dist/{499.index.js → 3499.index.js} +2 -2
  25. package/dist/3518.index.js +450 -0
  26. package/dist/{526.index.js → 3526.index.js} +14 -6
  27. package/dist/{736.index.js → 3736.index.js} +4 -4
  28. package/dist/{839.index.js → 3839.index.js} +4 -4
  29. package/dist/{113.index.js → 4113.index.js} +14 -6
  30. package/dist/{265.index.js → 4265.index.js} +2 -2
  31. package/dist/{384.index.js → 4384.index.js} +3 -3
  32. package/dist/4547.index.js +268 -0
  33. package/dist/4863.index.js +422 -0
  34. package/dist/{970.index.js → 4970.index.js} +67 -3
  35. package/dist/5051.index.js +770 -0
  36. package/dist/{144.index.js → 5144.index.js} +5 -5
  37. package/dist/{333.index.js → 5333.index.js} +3 -3
  38. package/dist/5343.index.js +185 -0
  39. package/dist/5350.index.js +866 -0
  40. package/dist/5561.index.js +436 -0
  41. package/dist/{637.index.js → 5637.index.js} +29 -7
  42. package/dist/{449.index.js → 5830.index.js} +78 -14
  43. package/dist/6626.index.js +532 -0
  44. package/dist/6662.index.js +297 -0
  45. package/dist/{675.index.js → 6675.index.js} +5 -5
  46. package/dist/{730.index.js → 6730.index.js} +6 -6
  47. package/dist/6829.index.js +225 -0
  48. package/dist/6944.index.js +130 -0
  49. package/dist/{178.index.js → 7178.index.js} +26 -8
  50. package/dist/{227.index.js → 7227.index.js} +2 -2
  51. package/dist/7310.index.js +520 -0
  52. package/dist/{552.index.js → 7552.index.js} +4 -4
  53. package/dist/7709.index.js +78 -0
  54. package/dist/8218.index.js +160 -0
  55. package/dist/{476.index.js → 8476.index.js} +4 -4
  56. package/dist/{513.index.js → 8513.index.js} +5 -5
  57. package/dist/{520.index.js → 8520.index.js} +2 -2
  58. package/dist/{718.index.js → 8718.index.js} +2 -2
  59. package/dist/{752.index.js → 8752.index.js} +2 -2
  60. package/dist/8846.index.js +100 -0
  61. package/dist/{435.index.js → 9091.index.js} +580 -187
  62. package/dist/{207.index.js → 9207.index.js} +2 -2
  63. package/dist/{220.index.js → 9220.index.js} +2 -2
  64. package/dist/9390.index.js +163 -0
  65. package/dist/{503.index.js → 9503.index.js} +2 -2
  66. package/dist/{801.index.js → 9801.index.js} +2 -2
  67. package/dist/{824.index.js → 9824.index.js} +2 -2
  68. package/dist/agentic-security.mjs +16 -16
  69. package/dist/agentic-security.mjs.sha256 +1 -1
  70. package/dist/compliance-frameworks/hipaa-security-rule.json +3 -2
  71. package/package.json +23 -10
  72. package/src/compare.js +6 -1
  73. package/src/dataflow/CLAUDE.md +2 -2
  74. package/src/dataflow/catalog.js +42 -0
  75. package/src/dataflow/orm-write-catalog.js +175 -0
  76. package/src/engine.js +580 -30
  77. package/src/fix/apply-fix-service.js +1 -0
  78. package/src/history-scan.js +22 -5
  79. package/src/ir/CLAUDE.md +2 -1
  80. package/src/ir/chrome-probe.mjs +150 -0
  81. package/src/ir/parser-js.js +94 -7
  82. package/src/lineage/CLAUDE.md +1203 -0
  83. package/src/lineage/DESIGN_DESTINATION_RESOLVER.md +156 -0
  84. package/src/lineage/DESIGN_GRAPH_BUILDER.md +938 -0
  85. package/src/lineage/DESIGN_HANDLING_ANALYZER.md +355 -0
  86. package/src/lineage/DESIGN_INTRAPROCEDURAL.md +628 -0
  87. package/src/lineage/DESIGN_PATH_PROVENANCE.md +3451 -0
  88. package/src/lineage/DESIGN_QUEUE_DETAIL.md +120 -0
  89. package/src/lineage/DESIGN_REGISTRIES.md +880 -0
  90. package/src/lineage/DESIGN_STORE_DETAIL.md +143 -0
  91. package/src/lineage/DESIGN_TRANSIT_PROTECTION.md +245 -0
  92. package/src/lineage/classification.js +56 -0
  93. package/src/lineage/coverage.js +658 -0
  94. package/src/lineage/cross-repo-link.js +107 -0
  95. package/src/lineage/dataflow-graph.schema.json +184 -0
  96. package/src/lineage/decision-story.js +206 -0
  97. package/src/lineage/drift-policy.js +279 -0
  98. package/src/lineage/driver.js +135 -0
  99. package/src/lineage/engine.js +992 -0
  100. package/src/lineage/export-briefing.js +628 -0
  101. package/src/lineage/export-csv.js +62 -0
  102. package/src/lineage/export-json.js +238 -0
  103. package/src/lineage/export-privacy.js +258 -0
  104. package/src/lineage/federation-loader.js +111 -0
  105. package/src/lineage/field-identity.js +78 -0
  106. package/src/lineage/fixtures/build-flagship-fixture.mjs +272 -0
  107. package/src/lineage/fixtures/flagship-graph.json +1453 -0
  108. package/src/lineage/flow-grade.js +221 -0
  109. package/src/lineage/governance-edit.js +169 -0
  110. package/src/lineage/graph-builder.js +1114 -0
  111. package/src/lineage/graph-diff.js +431 -0
  112. package/src/lineage/graph-snapshot.js +180 -0
  113. package/src/lineage/handling-analyzer.js +168 -0
  114. package/src/lineage/ids.js +349 -0
  115. package/src/lineage/impact-assessment.js +76 -0
  116. package/src/lineage/impact-engine.js +268 -0
  117. package/src/lineage/index.js +281 -0
  118. package/src/lineage/language-coverage-tiers.js +58 -0
  119. package/src/lineage/obligation-mapping.js +126 -0
  120. package/src/lineage/obligation-predicates.js +235 -0
  121. package/src/lineage/observation-adapters.js +282 -0
  122. package/src/lineage/observation-correlation.js +622 -0
  123. package/src/lineage/observation-store.js +497 -0
  124. package/src/lineage/path-query.js +410 -0
  125. package/src/lineage/path-store.js +400 -0
  126. package/src/lineage/protection.js +53 -0
  127. package/src/lineage/recipient-profile.js +192 -0
  128. package/src/lineage/recipient-registry.js +394 -0
  129. package/src/lineage/redact-graph.js +224 -0
  130. package/src/lineage/remediation.js +417 -0
  131. package/src/lineage/resolve-destination.js +91 -0
  132. package/src/lineage/runtime-observation.js +464 -0
  133. package/src/lineage/scenario-diff.js +84 -0
  134. package/src/lineage/scenario-engine.js +251 -0
  135. package/src/lineage/scenario.js +101 -0
  136. package/src/lineage/schema.js +167 -0
  137. package/src/lineage/sink-registry.js +427 -0
  138. package/src/lineage/source-registry.js +357 -0
  139. package/src/lineage/source-seeding.js +212 -0
  140. package/src/lineage/summaries.js +590 -0
  141. package/src/lineage/transform-catalog.js +397 -0
  142. package/src/lineage/transit-protection.js +150 -0
  143. package/src/lineage/validate.js +285 -0
  144. package/src/lsp/server.js +49 -2
  145. package/src/mcp/CLAUDE.md +7 -1
  146. package/src/mcp/dataflow-tools.js +160 -0
  147. package/src/mcp/server.js +1 -1
  148. package/src/mcp/tools.js +22 -1
  149. package/src/pipeline/assurance-mode.js +64 -1
  150. package/src/pipeline/finding-schema.js +8 -1
  151. package/src/pipeline/scan-health.js +19 -1
  152. package/src/posture/CLAUDE.md +140 -0
  153. package/src/posture/accuracy-scorecard.js +60 -0
  154. package/src/posture/artifact-registry.js +76 -0
  155. package/src/posture/auditor-walkthrough.js +192 -13
  156. package/src/posture/compliance-frameworks/hipaa-security-rule.json +3 -2
  157. package/src/posture/compliance-policy.js +12 -2
  158. package/src/posture/cross-repo-memory.js +7 -2
  159. package/src/posture/fix-history.js +25 -2
  160. package/src/posture/fix-verify.js +9 -1
  161. package/src/posture/fleet.js +0 -0
  162. package/src/posture/git-history.js +13 -5
  163. package/src/posture/material-change.js +21 -2
  164. package/src/posture/mttr.js +75 -12
  165. package/src/posture/obligation-evidence-pack.js +202 -0
  166. package/src/posture/pre-incident-archaeology.js +39 -7
  167. package/src/posture/privacy-framework.js +14 -0
  168. package/src/posture/provenance/ai-authorship.js +68 -0
  169. package/src/posture/provenance/branch-entry.js +80 -0
  170. package/src/posture/provenance/cache.js +143 -0
  171. package/src/posture/provenance/confidence.js +36 -0
  172. package/src/posture/provenance/coordinator.js +786 -0
  173. package/src/posture/provenance/dag-walk.js +249 -0
  174. package/src/posture/provenance/evidence-attribution.js +59 -0
  175. package/src/posture/provenance/git-evidence.js +310 -0
  176. package/src/posture/provenance/lifecycle.js +208 -0
  177. package/src/posture/provenance/missing-control-resolver.js +137 -0
  178. package/src/posture/provenance/origin-resolver.js +342 -0
  179. package/src/posture/provenance/predicate-replay.js +133 -0
  180. package/src/posture/provenance/providers/config.js +39 -0
  181. package/src/posture/provenance/providers/github.js +62 -0
  182. package/src/posture/provenance/providers/gitlab.js +58 -0
  183. package/src/posture/provenance/repo-lineage.js +74 -0
  184. package/src/posture/provenance/sca-origin.js +139 -0
  185. package/src/posture/provenance/schema.js +255 -0
  186. package/src/posture/provenance/transitive-sca.js +147 -0
  187. package/src/posture/provenance/validate.js +30 -0
  188. package/src/posture/provenance-evidence-bundle.js +144 -0
  189. package/src/posture/remediation-ledger.js +337 -0
  190. package/src/posture/sbom-diff.js +15 -2
  191. package/src/posture/secret-history.js +10 -2
  192. package/src/posture/state-dir.js +38 -14
  193. package/src/posture/vuln-archaeology.js +8 -2
  194. package/src/pr-delta.js +25 -4
  195. package/src/report/index.js +197 -3
  196. package/src/runScan.js +34 -5
  197. package/src/sast/rate-limit.js +33 -3
  198. package/src/server/CLAUDE.md +47 -0
  199. package/src/server/graph-loader.js +141 -0
  200. package/src/server/http-server.js +325 -0
  201. package/src/server/routes.js +129 -0
  202. package/src/server/security.js +111 -0
  203. package/src/server/static-assets.js +139 -0
  204. package/src/util/git-hardening.js +128 -0
  205. package/dist/11.index.js +0 -353
  206. package/dist/259.index.js +0 -975
  207. package/dist/317.index.js +0 -300
  208. package/dist/609.index.js +0 -741
  209. package/dist/838.index.js +0 -152
@@ -0,0 +1,120 @@
1
+ # DESIGN_QUEUE_DETAIL.md — Sub-project E's binding design record (increment 3)
2
+
3
+ **Status:** landed as Milestone 2, Sub-project E, increment **3** — a
4
+ small, focused slice, per
5
+ `docs/superpowers/plans/2026-08-31-data-flow-explorer-m2-subproject-e3-plan.md`
6
+ and its own scoping document. Binding on later Sub-project E increments the
7
+ same way `DESIGN_STORE_DETAIL.md` binds increment 2 — but this record
8
+ covers its own, unrelated field: `node.queueDetail` is specific to
9
+ queue-category sink nodes (`kind: 'queue'`), never to be conflated with
10
+ `node.storeDetail` (increment 2's own field, for database-category `store`
11
+ nodes — a queue node is never a store node) or `node.destination`
12
+ (Sub-project A's own field, for external-api-category nodes).
13
+
14
+ ---
15
+
16
+ ## 1. What this increment actually is
17
+
18
+ Queue sinks were already reachable before this increment: `sink-registry.js`'s
19
+ `PRIVACY_CATEGORY_MAP` already maps the `'queues'` privacy-catalog category
20
+ to `{category: 'queue', status: 'modeled'}`, and `graph-builder.js`'s
21
+ `enumerateSinkSites` already calls `matchPrivacySink` for every statement-
22
+ call site — the same matcher call increment 1/2's ORM-write work had to
23
+ build a whole new isolated catalog to avoid touching. A queue sink node
24
+ already existed in the graph, with `kind: 'queue'`, whenever a real fixture
25
+ reached one of `dataflow/privacy-catalog.js`'s two real queue entries
26
+ (`privacy-js-queue-sendMessage`, `privacy-js-queue-publish`). This
27
+ increment adds only the missing piece: the queue's own topic/queue-name
28
+ IDENTITY, extracted where extractable and attached to the sink node as a
29
+ new field, `node.queueDetail`.
30
+
31
+ ## 2. The `queueDetail` object shape
32
+
33
+ ```
34
+ {
35
+ provider: string | null, // deferred — always null in this increment (AWS/GCP/etc. — needs config-chain resolution, Sub-project A's own still-open scope, same reasoning storeDetail's provider/host stay null)
36
+ topic: string | null, // the queue URL / topic / stream name, when extractable
37
+ operation: string | null, // one of schema.js's new QUEUE_OPERATION_VALUES, or null
38
+ }
39
+ ```
40
+
41
+ Every queue site this increment recognizes gets `operation: 'publish'` —
42
+ both real catalog entries (`sendMessage`, `publish`) are unambiguously a
43
+ WRITE/publish operation, unlike the database case's real
44
+ `create`/`update`/`upsert` spread. `QUEUE_OPERATION_VALUES = ['publish',
45
+ 'unknown']` — only two values, deliberately, the same "define the
46
+ vocabulary even if only one value is reachable today" precedent
47
+ `HANDLING_VALUES`/`STORE_OPERATION_VALUES` both already established.
48
+
49
+ ## 3. `topic` extraction — two real shapes, one honestly unsupported
50
+
51
+ ### 3.1. `privacy-js-queue-sendMessage` (SQS-shaped)
52
+
53
+ `sqs.sendMessage({QueueUrl: '...', MessageBody: ...})`: the queue identity
54
+ is a field INSIDE the call's own object-literal first argument. Directly
55
+ extractable by the same `props`-filtering shape increment 2's
56
+ `ormWriteColumns` already established (`graph-builder.js` — exclude spread
57
+ entries, exclude `'*'`-keyed computed entries), but this increment wants
58
+ the VALUE of one specific matching key, not every key name, so it is a
59
+ different, smaller function (`extractQueueDetail`), not a call to
60
+ `ormWriteColumns` itself.
61
+
62
+ A short, disclosed alias list — `['QueueUrl', 'TopicArn', 'topic',
63
+ 'queueName']`, checked in that order — names the property key to look for.
64
+ When a matching key is found AND that property's own value is itself a
65
+ `kind: 'literal'` expression (the same check shape as
66
+ `resolve-destination.js`'s `isLiteral`, replicated locally per this
67
+ package's own "small local copy over cross-module dependency" precedent,
68
+ not imported), `String(value.value)` is extracted as `topic`. When no
69
+ matching key is found, or the matching key's value isn't a literal, `topic`
70
+ stays `null` — this call site is genuinely recognized as a queue sink, just
71
+ without an extractable identity, the same honest-absence discipline
72
+ `storeDetail.table` follows when a receiver name is somehow unavailable.
73
+
74
+ ### 3.2. `privacy-js-queue-publish` (SNS/Kafka-shaped) — deferred, honestly
75
+
76
+ `topic.publish(...)` / `producer.publish(...)`: the topic identity is
77
+ typically NOT in this call's own arguments — it lives in a SEPARATE,
78
+ earlier statement that constructed the receiver (`const topic =
79
+ pubsub.topic('my-topic-name'); topic.publish(...)`). This increment does
80
+ **not** attempt a cross-statement lookup (finding the receiver identifier's
81
+ own defining assignment elsewhere in the function/file) — no primitive for
82
+ that exists anywhere in `src/lineage/` today, and building one is real,
83
+ undecided scope bigger than this increment. For this shape, `topic` stays
84
+ `null` unconditionally. This is an honest, disclosed gap, not a
85
+ half-attempt — see `test/lineage/queue-detail.test.js`'s own test comment
86
+ for the same disclosure at the point a future reader is most likely to
87
+ encounter it.
88
+
89
+ ## 4. Wiring — mirrors `storeDetail`'s own precedent exactly
90
+
91
+ `mintNode` gains an optional `queueDetail` param (default `null`).
92
+ `sinkNodeFor` passes `site.queueDetail ?? null` through — the exact wiring
93
+ point `storeDetail` already established. `queueDetail` is set once, at node
94
+ MINT time, and is deliberately **NOT** part of the node identity
95
+ discriminator (`ids.nodeId`'s inputs are unchanged) — the same disclosed
96
+ coarsening `destination`/`storeDetail` already accepted: two sites
97
+ colliding onto one registry-decision node (same
98
+ `kind`/`subtypeKey`/`coverageStatus`/`externality`) still collide onto one
99
+ node, and that node's `queueDetail` is whichever site's resolution landed
100
+ first, not a set/union of every site's own facts.
101
+
102
+ `enumerateSinkSites` applies extraction as a conditional POST-step,
103
+ immediately after a general/privacy site is pushed: `if (r.decision
104
+ .category === 'queue') { site.queueDetail = extractQueueDetail(node.args ??
105
+ []); }` — not a change to `resolveSinkAtCallSite`'s own signature, which has
106
+ no `args` parameter today and would gain one only for a fact solely the
107
+ queue category needs.
108
+
109
+ ## 5. Explicitly deferred (named, not silently skipped)
110
+
111
+ - **The cross-statement topic-name lookup** for the
112
+ `publish`-on-a-constructed-topic shape (§3.2) — real future work, no
113
+ primitive exists for it today.
114
+ - **`provider` extraction** — needs config-chain resolution, Sub-project
115
+ A's own still-open scope.
116
+ - **Any language beyond JS/TS.**
117
+ - **Any queue SDK shape beyond the two `PRIVACY_SINK_CATALOG` already
118
+ recognizes** — Redis streams, RabbitMQ, etc. are not in the catalog
119
+ today; widening queue RECOGNITION itself is real, separate scope this
120
+ increment does not attempt.