@clear-capabilities/agentic-security-scanner 0.145.0 → 0.147.5

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 (195) hide show
  1. package/CHANGELOG.md +266 -0
  2. package/bin/agentic-security.js +3508 -69
  3. package/dist/1122.index.js +779 -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} +2 -2
  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/{271.index.js → 2271.index.js} +2 -2
  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 +379 -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} +5 -5
  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} +5 -5
  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} +2 -2
  35. package/dist/5051.index.js +841 -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} +3 -3
  42. package/dist/{449.index.js → 5830.index.js} +2 -2
  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} +3 -3
  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} +560 -189
  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/dist/frontend/index.html +21 -0
  72. package/dist/frontend/src/app.js +176 -0
  73. package/dist/frontend/src/components/evidence-inspector.js +141 -0
  74. package/dist/frontend/src/components/filter-rail.js +119 -0
  75. package/dist/frontend/src/components/query-bar.js +126 -0
  76. package/dist/frontend/src/data/flagship-graph.js +1460 -0
  77. package/dist/frontend/src/export-entry.js +36 -0
  78. package/dist/frontend/src/lib/api-client.js +92 -0
  79. package/dist/frontend/src/lib/contrast.js +34 -0
  80. package/dist/frontend/src/lib/dom.js +24 -0
  81. package/dist/frontend/src/lib/escape-html.js +16 -0
  82. package/dist/frontend/src/lib/flow-path.js +40 -0
  83. package/dist/frontend/src/lib/focus-controls.js +149 -0
  84. package/dist/frontend/src/lib/protection-visual.js +46 -0
  85. package/dist/frontend/src/lib/query-language.js +240 -0
  86. package/dist/frontend/src/lib/row-filters.js +43 -0
  87. package/dist/frontend/src/lib/state.js +84 -0
  88. package/dist/frontend/src/main.js +83 -0
  89. package/dist/frontend/src/shell.js +184 -0
  90. package/dist/frontend/src/views/architecture-view.js +798 -0
  91. package/dist/frontend/src/views/inventory-view.js +292 -0
  92. package/dist/frontend/src/views/privacy-view.js +172 -0
  93. package/dist/frontend/src/views/trace-view.js +206 -0
  94. package/dist/frontend/styles/architecture-view.css +93 -0
  95. package/dist/frontend/styles/filter-rail.css +34 -0
  96. package/dist/frontend/styles/inspector.css +69 -0
  97. package/dist/frontend/styles/inventory-view.css +74 -0
  98. package/dist/frontend/styles/privacy-view.css +86 -0
  99. package/dist/frontend/styles/query-bar.css +107 -0
  100. package/dist/frontend/styles/shell.css +155 -0
  101. package/dist/frontend/styles/tokens.css +128 -0
  102. package/dist/frontend/styles/trace-view.css +95 -0
  103. package/package.json +13 -6
  104. package/src/dataflow/CLAUDE.md +1 -1
  105. package/src/dataflow/catalog.js +42 -0
  106. package/src/dataflow/orm-write-catalog.js +175 -0
  107. package/src/engine.js +92 -1
  108. package/src/ir/CLAUDE.md +1 -0
  109. package/src/ir/chrome-probe.mjs +150 -0
  110. package/src/ir/parser-js.js +94 -7
  111. package/src/lineage/CLAUDE.md +1203 -0
  112. package/src/lineage/DESIGN_DESTINATION_RESOLVER.md +156 -0
  113. package/src/lineage/DESIGN_GRAPH_BUILDER.md +938 -0
  114. package/src/lineage/DESIGN_HANDLING_ANALYZER.md +355 -0
  115. package/src/lineage/DESIGN_INTRAPROCEDURAL.md +628 -0
  116. package/src/lineage/DESIGN_PATH_PROVENANCE.md +3451 -0
  117. package/src/lineage/DESIGN_QUEUE_DETAIL.md +120 -0
  118. package/src/lineage/DESIGN_REGISTRIES.md +880 -0
  119. package/src/lineage/DESIGN_STORE_DETAIL.md +143 -0
  120. package/src/lineage/DESIGN_TRANSIT_PROTECTION.md +245 -0
  121. package/src/lineage/classification.js +56 -0
  122. package/src/lineage/coverage.js +658 -0
  123. package/src/lineage/cross-repo-link.js +107 -0
  124. package/src/lineage/dataflow-graph.schema.json +184 -0
  125. package/src/lineage/decision-story.js +206 -0
  126. package/src/lineage/drift-policy.js +279 -0
  127. package/src/lineage/driver.js +135 -0
  128. package/src/lineage/engine.js +992 -0
  129. package/src/lineage/export-briefing.js +628 -0
  130. package/src/lineage/export-csv.js +62 -0
  131. package/src/lineage/export-json.js +238 -0
  132. package/src/lineage/export-privacy.js +258 -0
  133. package/src/lineage/federation-loader.js +111 -0
  134. package/src/lineage/field-identity.js +78 -0
  135. package/src/lineage/fixtures/build-flagship-fixture.mjs +272 -0
  136. package/src/lineage/fixtures/flagship-graph.json +1453 -0
  137. package/src/lineage/flow-grade.js +221 -0
  138. package/src/lineage/governance-edit.js +169 -0
  139. package/src/lineage/graph-builder.js +1114 -0
  140. package/src/lineage/graph-diff.js +431 -0
  141. package/src/lineage/graph-snapshot.js +180 -0
  142. package/src/lineage/handling-analyzer.js +168 -0
  143. package/src/lineage/ids.js +349 -0
  144. package/src/lineage/impact-assessment.js +76 -0
  145. package/src/lineage/impact-engine.js +268 -0
  146. package/src/lineage/index.js +281 -0
  147. package/src/lineage/language-coverage-tiers.js +58 -0
  148. package/src/lineage/obligation-mapping.js +126 -0
  149. package/src/lineage/obligation-predicates.js +235 -0
  150. package/src/lineage/observation-adapters.js +282 -0
  151. package/src/lineage/observation-correlation.js +622 -0
  152. package/src/lineage/observation-store.js +497 -0
  153. package/src/lineage/path-query.js +410 -0
  154. package/src/lineage/path-store.js +400 -0
  155. package/src/lineage/protection.js +53 -0
  156. package/src/lineage/recipient-profile.js +192 -0
  157. package/src/lineage/recipient-registry.js +394 -0
  158. package/src/lineage/redact-graph.js +224 -0
  159. package/src/lineage/remediation.js +417 -0
  160. package/src/lineage/resolve-destination.js +91 -0
  161. package/src/lineage/runtime-observation.js +464 -0
  162. package/src/lineage/scenario-diff.js +84 -0
  163. package/src/lineage/scenario-engine.js +251 -0
  164. package/src/lineage/scenario.js +101 -0
  165. package/src/lineage/schema.js +167 -0
  166. package/src/lineage/sink-registry.js +427 -0
  167. package/src/lineage/source-registry.js +357 -0
  168. package/src/lineage/source-seeding.js +212 -0
  169. package/src/lineage/summaries.js +590 -0
  170. package/src/lineage/transform-catalog.js +397 -0
  171. package/src/lineage/transit-protection.js +150 -0
  172. package/src/lineage/validate.js +285 -0
  173. package/src/mcp/CLAUDE.md +7 -1
  174. package/src/mcp/dataflow-tools.js +160 -0
  175. package/src/mcp/server.js +1 -1
  176. package/src/mcp/tools.js +2 -1
  177. package/src/pipeline/scan-health.js +19 -1
  178. package/src/posture/CLAUDE.md +19 -0
  179. package/src/posture/artifact-registry.js +52 -0
  180. package/src/posture/auditor-walkthrough.js +76 -0
  181. package/src/posture/compliance-frameworks/hipaa-security-rule.json +3 -2
  182. package/src/posture/obligation-evidence-pack.js +202 -0
  183. package/src/posture/remediation-ledger.js +337 -0
  184. package/src/server/CLAUDE.md +47 -0
  185. package/src/server/graph-loader.js +141 -0
  186. package/src/server/http-server.js +325 -0
  187. package/src/server/routes.js +129 -0
  188. package/src/server/security.js +111 -0
  189. package/src/server/static-assets.js +144 -0
  190. package/src/shared/frontend-root.js +52 -0
  191. package/dist/11.index.js +0 -353
  192. package/dist/259.index.js +0 -975
  193. package/dist/317.index.js +0 -300
  194. package/dist/609.index.js +0 -741
  195. package/dist/838.index.js +0 -152
package/CHANGELOG.md CHANGED
@@ -11,6 +11,272 @@
11
11
 
12
12
 
13
13
 
14
+ ## 0.147.5 — Fix: `bench:provenance:check`'s cold-memory sample size was unreliable on GitHub Actions
15
+
16
+ `v0.147.4`'s tag was pushed but its hosted release-gate run failed before
17
+ reaching `npm publish` — the `dataflow-watch` fix held (the full test suite
18
+ passed cleanly), but `bench/provenance/runner.mjs`'s `bench:provenance:check`
19
+ failed: "only 8/20 iterations produced a usable sample (need >= 10)" for
20
+ `cold.memOverheadRatio`. This is the SAME failure `v0.147.3`'s release run
21
+ also hit (7/20 that time) — two consecutive, reproducible failures on
22
+ GitHub's runners specifically, while this bench passes cleanly (~20/20)
23
+ every time locally, so this is a real platform gap, not one-off noise.
24
+
25
+ Root cause: `cold.memOverheadRatio` is a per-iteration ratio against the
26
+ without-provenance arm's own peak-RSS delta, and `measure()` skips the
27
+ ratio entirely for an iteration where that delta is `0`
28
+ (`if (without.rssDeltaBytes > 0) { ... }`) — the without-provenance scan is
29
+ only ~40-60ms, short enough that the 10ms-interval peak-RSS poller can
30
+ genuinely observe no net growth for it, especially under a shared runner's
31
+ different GC pacing. `BASELINE.json` itself already records this as
32
+ expected (`memOverheadRatio.n: 19`, one dropped iteration out of 20 even on
33
+ the machine that captured it) — GitHub Actions just drops far more of them
34
+ (a ~35-40% survival rate against RELIABLE_N=10 at N=20 leaves no margin).
35
+
36
+ Raises `N` from 20 to 60 in `bench/provenance/runner.mjs` — the same
37
+ already-established remedy this exact file used once before for a related
38
+ small-sample fragility (doubling 10→20), extended further given the new,
39
+ worse-than-expected survival rate. `RELIABLE_N` (10) and the regression
40
+ thresholds are unchanged; `BASELINE.json`'s reference values were not
41
+ touched (the measured overhead is well within budget — this was purely a
42
+ sample-count reliability failure, not a regression). Verified locally:
43
+ passes with real margin (cold memory p95 11.42x vs a 24.38x limit), at a
44
+ real but bounded cost — this one bench step now takes ~2:23 instead of
45
+ ~40-60s, a release-time-only cost. `v0.147.4` was never published to any
46
+ registry (confirmed via `npm view`). Carries the identical fixes from
47
+ 0.147.1-0.147.4 forward.
48
+
49
+ ## 0.147.4 — Fix: close a real fs.watch startup race in `dataflow watch` (test-only; no product behavior change)
50
+
51
+ `v0.147.3`'s tag was pushed but its hosted release-gate run failed before
52
+ reaching `npm publish` — again `cli/dataflow-watch-2`, but this time raising
53
+ the wait timeout (0.147.3's own fix) did NOT help: it timed out at the
54
+ *full* 90000ms budget with zero rescan output, which the real rescan
55
+ pipeline (~1-2s once triggered) rules out as "merely slow." Root cause: `bin/
56
+ agentic-security.js`'s `cmdDataflowWatch` prints its "watching ... Ctrl-C to
57
+ stop" banner — the exact string these tests poll for as the "watcher is
58
+ live" signal — *before* calling `watchProject()`, which is where
59
+ `fs.watch()` actually arms its (possibly recursive, whole-tree-walking on
60
+ Linux) inotify descriptors. A test file-write landing in that gap produces
61
+ an event inotify never delivers at all — a permanent miss, not a delay —
62
+ which a longer timeout cannot fix by construction.
63
+
64
+ Fixed with a 1000ms settle delay in the test, inserted between seeing the
65
+ startup banner and writing the trigger file, in both `dataflow-watch-1` and
66
+ `dataflow-watch-2` (`test/cli/dataflow-watch.test.js`). No product code
67
+ changed — `cmdDataflowWatch`'s banner-before-watchProject ordering is real,
68
+ pre-existing behavior, unrelated to anything in 0.147.1-0.147.3, and left
69
+ alone here rather than reordered under release time pressure without full
70
+ confidence in every caller depending on today's ordering. `v0.147.3` was
71
+ never published to any registry (confirmed via `npm view`). Carries the
72
+ identical fixes from 0.147.1-0.147.3 forward.
73
+
74
+ ## 0.147.3 — CI fix: raise dataflow-watch's live-subprocess wait timeout (no functional change from 0.147.2)
75
+
76
+ Same story as 0.147.2, different test: `v0.147.2`'s hosted release-gate run
77
+ also failed before reaching `npm publish` — `test/cli/dataflow-watch.test.js`'s
78
+ `cli/dataflow-watch-2` polls a real subprocess's live stderr for a
79
+ `DRIFT POLICY VIOLATION` line after triggering a file-watch-driven rescan,
80
+ with a 30000ms budget. That step completes in ~1.4s on a normal machine (a
81
+ ~20x margin) but still timed out on this run — this repo's watch mode uses
82
+ Node's native `fs.watch(..., { recursive: true })`
83
+ (`src/posture/watch-mode.js`), documented as slower/less reliable under
84
+ Linux CI runners' inotify handling than on a dev machine. `v0.147.2` was
85
+ never published to any registry (confirmed via `npm view`).
86
+
87
+ Raises the wait budget from 30000ms to a shared `WAIT_TIMEOUT_MS = 90000`
88
+ across both real-subprocess tests in that file (the ones that depend on the
89
+ file-watch path — an unrelated fast-fail test in the same file was left
90
+ untouched). No product code changed; this carries the identical fixes from
91
+ 0.147.1 and 0.147.2 forward.
92
+
93
+ ## 0.147.2 — CI fix: raise the headless-Chrome render timeout (no functional change from 0.147.1)
94
+
95
+ `v0.147.1`'s tag was pushed but its hosted release-gate run failed before
96
+ ever reaching `npm publish` — `scripts/export-image.mjs`'s `exportPng` test
97
+ hit its own hardcoded 15000ms Chrome render timeout on a slower draw of the
98
+ GitHub Actions runner (the same render took 7983ms on the immediately
99
+ preceding v0.147.0 release run — a ~2x runner-speed swing well within
100
+ normal CI variance, not a regression). `v0.147.1` was never published to
101
+ any registry; this release carries the identical `explore`/`dataflow
102
+ export --format html` fix described below under 0.147.1, plus this one
103
+ timeout change: `RENDER_TIMEOUT_MS` default raised from 15000ms to 30000ms
104
+ in `scripts/export-image.mjs`, giving roughly 4x headroom over the observed
105
+ good-case render time. No other code changed.
106
+
107
+ ## 0.147.1 — Fix: `explore` and `dataflow export --format html` were broken for every real npm/npx install
108
+
109
+ Both commands located the Data Flow Explorer frontend (`frontend/`, a
110
+ repo-root sibling of `scanner/` in this monorepo) via a fixed relative path
111
+ computed from each module's own `import.meta.url`
112
+ (`path.resolve(HERE, '../../../frontend')` in `static-assets.js`,
113
+ `'../../frontend'` in `generate-html-report.mjs`). That math was correct
114
+ only for the unbundled dev checkout. Once `npm run build` (ncc) split those
115
+ modules into their own `dist/*.index.js` chunks, `import.meta.url` inside
116
+ them reflected `dist/`'s own, shallower location, and the same fixed
117
+ relative math resolved *outside the installed package entirely* — and
118
+ `frontend/` was never part of the published npm tarball to begin with. The
119
+ practical effect: `agentic-security explore .` 404'd on `GET /` for every
120
+ real `npx`/`npm install` user (`{"error":"not found"}`, never an
121
+ index.html), and `dataflow export . --format html` failed outright
122
+ (`ENOENT: no such file or directory, scandir '.../frontend/styles'`). Both
123
+ only ever worked when run from a full monorepo clone.
124
+
125
+ Fixed by shipping the frontend's servable files inside the published
126
+ package: `scanner/scripts/copy-frontend.mjs` (new) copies `frontend/`'s
127
+ allowlisted files (`index.html`, `src/**/*.js`, top-level `styles/*.css` —
128
+ the exact same allowlist `static-assets.js` already enforced for serving)
129
+ into `scanner/dist/frontend/` as part of `npm run build`; a new shared
130
+ resolver, `scanner/src/shared/frontend-root.js`, replaces both hardcoded
131
+ relative paths with a search-upward strategy that finds the frontend
132
+ correctly regardless of bundling depth. Verified by packing a real tarball
133
+ (`npm pack`) and installing it into an isolated directory with no monorepo
134
+ present: `explore`'s `GET /` now returns 200 with the real `index.html`
135
+ (previously 404), static JS/CSS assets and the token-authenticated
136
+ `/api/v1/graph` endpoint both 200, and `dataflow export --format html`
137
+ exits 0 and writes a real self-contained report (previously exited 2).
138
+ `dpia`/`ropa` export formats were already unaffected (a separate,
139
+ already-self-contained code path) and are unchanged.
140
+
141
+ ## 0.147.0 — Documentation overhaul: a cohesive assurance-platform story, verified against the shipped code
142
+
143
+ The 0.144.0 Assurance Hardening release shipped a real 3-state ship verdict,
144
+ a model-egress policy gate, risk-dollar scenario disclosure, and per-artifact
145
+ retention/encryption — but the docs describing it, and the README's whole
146
+ front-door story, hadn't caught up. This release rewrites both, built
147
+ exclusively from real, re-verified source rather than the original
148
+ documentation brief's assumptions (which turned out to contain several
149
+ fabricated CLI flags and vocabularies — a `scan --assurance` flag that
150
+ doesn't exist, `--assurance` is `ci`-only; a fictional `--explain-health`
151
+ flag; nine invented verify-verdict strings; a fictional unified compliance
152
+ state model where three separate, differently-cased vocabularies actually
153
+ exist).
154
+
155
+ **README** rewritten around a 5-capability story (Find It / Prove It / Fix
156
+ It Safely / Govern It / Explain It), a corrected 5-minute quickstart, the
157
+ real 3-state ship verdict as a running example, and persona-based
158
+ navigation (Developer / AppSec / Privacy / Compliance / Platform
159
+ Engineering).
160
+
161
+ **16 new docs**: `docs/walkthroughs/{assurance-modes,scan-health,
162
+ finding-evidence,verified-remediation,privacy-data-flow,model-egress}.md`;
163
+ `docs/architecture/finding-lifecycle.md`; `docs/concepts.md`
164
+ (evidence-before-severity, deterministic-vs-model-assisted);
165
+ `docs/governance/state-and-retention.md`; `docs/guides/risk-dollars.md`;
166
+ `docs/examples/README.md` (a 13-entry gallery); `docs/reference/
167
+ {output-schema,glossary}.md`; `docs/troubleshooting/scan-health.md`; and two
168
+ real, captured Data Flow Explorer browser screenshots at `docs/assets/`.
169
+
170
+ **A new doc-testing tool**, `scripts/verify-doc-examples.mjs`: parses the
171
+ real CLI dispatch table out of `bin/agentic-security.js` at runtime (so it
172
+ can't drift out of sync with the CLI the way a hand-maintained list would)
173
+ to catch fabricated commands and the specific `<subcommand> --help`
174
+ landmine (passing `--help` to a subcommand silently runs the real command
175
+ instead of printing help — only bare `agentic-security help` is valid),
176
+ plus JSON-block and Mermaid-syntax sanity checks. Deliberately not wired
177
+ into any gate — a standalone `npm run docs:verify-examples`.
178
+
179
+ **Existing docs corrected**, not just extended: `docs/guides/
180
+ {quickstart,scanning,compliance,ci-setup,finding-provenance}.md`,
181
+ `docs/reference/{cli,configuration}.md`, `docs/ARCHITECTURE.md`,
182
+ `docs/README.md`, and several `commands/`/`skills/` files carried stale
183
+ claims — the most consequential being that `scan` was documented as
184
+ defaulting finding-provenance ON, when it actually defaults OFF (`ci`
185
+ defaults it ON; this asymmetry exists because plain provenance resolution
186
+ cost a measured 4.5s→45s regression on a 207-file tree, the same
187
+ measurement behind this project's own TTFF benchmark).
188
+
189
+ ## 0.146.0 — Data Flow Explorer: trace sensitive data through your architecture, not just through one finding
190
+
191
+ Every prior release answers "is this line of code dangerous?" This one adds a
192
+ different question: "where does this piece of sensitive data actually go, and
193
+ what protects it along the way?" `agentic-security dataflow` builds a
194
+ `DataFlowGraph` from a real scan — sources, sinks, the data elements that
195
+ flow between them, and a verdict per hop on transit/at-rest/handling
196
+ protection — and a new local, read-only, loopback-only server
197
+ (`agentic-security explore`) serves it to a clickable UI. Six milestones,
198
+ built in dependency order over this release cycle:
199
+
200
+ **The graph itself (Milestones 0-2).** A stable-ID'd, schema-versioned graph
201
+ contract; an interprocedural field-identity taint engine purpose-built for
202
+ this graph (deliberately separate from the SAST engine's own taint
203
+ analysis — different state shape, different precision goals) with
204
+ context-sensitive summaries and a compact path-provenance DAG that tracks
205
+ *why* a field reached a sink, not just *that* it did; source/sink/
206
+ transformation registries reclassifying this project's existing detection
207
+ catalogs into the graph's own vocabulary; and protection-verdict analyzers
208
+ for transit (TLS presence and validity), at-rest (encryption-before-store),
209
+ and handling (masking/hashing/tokenization — never treated as synonyms).
210
+
211
+ **A local server and reference UI (Milestone 3).** `agentic-security explore`
212
+ — the first HTTP server anywhere in this codebase (the MCP and LSP servers
213
+ are both stdio) — serves the signed, already-scanned graph read-only,
214
+ loopback-only, to a zero-build-step frontend prototype with architecture,
215
+ privacy-lifecycle, and evidence-trace views.
216
+
217
+ **Export and decision-intelligence surfaces (Milestone 4).** JSON/CSV/HTML/
218
+ PNG/PDF/SVG export; a Regulatory Obligation Overlay mapping graph facts
219
+ against bundled compliance frameworks (never claiming "compliant" from a
220
+ single mapping); an Executive Risk Story mode ranking flows on nine
221
+ transparent, disclosed factors — never a blended, uncalibrated score; a
222
+ Data-Flow Time Machine (`dataflow diff`) comparing two scans with real
223
+ drift-policy alerting on newly-introduced disclosures; and Third-Party and
224
+ Cross-Border Intelligence, keeping legal/jurisdiction facts honestly
225
+ `unknown` rather than inferred from brand recognition.
226
+
227
+ **Simulation, corroboration, and cross-repo linkage (Milestone 5).** A
228
+ What-If Architecture Simulator (`dataflow scenario apply`) that clones and
229
+ overrides a graph to test a hypothetical fix, never mutating the real scan,
230
+ with every simulated verdict marked `HYPOTHETICAL` and `assumed`-graded so
231
+ it can never be mistaken for a real one; Blast-Radius Impact Assessment and
232
+ a Remediation Command Center with a hash-chained ledger enforcing that
233
+ closing an item requires either a clean rescan or an explicit, permitted
234
+ manual attestation — and that a later regression reopens it automatically;
235
+ a Runtime-Corroborated Digital Twin (`dataflow observations import`) that
236
+ layers operator-supplied runtime telemetry onto the static graph through a
237
+ closed-world contract that rejects, not merely redacts, any field capable
238
+ of carrying a payload value; per-language coverage-tier disclosure so a
239
+ partially-supported language is labeled as such rather than silently
240
+ under-reported; and `federate declare` — an operator-declared edge between
241
+ two independently-scanned repositories' own graphs, with each graph staying
242
+ its own separate, unmodified artifact.
243
+
244
+ **New top-level commands:** `explore`, `dataflow`, `governance`,
245
+ `remediation`, `federate` — the latter three write operator-declared
246
+ config through the same reviewable contract (preview, version guard,
247
+ backup, audit event) established for exactly this class of write.
248
+
249
+ **On rigor, again.** As with 0.145.0's own provenance work, a dedicated
250
+ final-review pass — after every task-level review and a green test
251
+ suite — found real Blocking or Important bugs in nearly every one of
252
+ these sub-projects: a remediation item that could be marked verified from
253
+ a snapshot chronologically *older* than the incident it was supposed to
254
+ fix; a runtime-observation payload-refusal grammar that closed single-value
255
+ smuggling but missed the same payload split across array elements; a
256
+ cross-repo link's own self-consistency digest compared against the wrong
257
+ half of a redacted export, so an untampered file permanently read as
258
+ tampered; and — found only in this release's own post-completion
259
+ re-audit, prompted by checking every named acceptance criterion's text
260
+ against the actual shipped code rather than trusting a summary — one
261
+ acceptance criterion (`AC-26`, on the What-If Simulator) that had never
262
+ been checked against its own literal wording by any prior document, and
263
+ was quietly unmet until this audit closed it. Every one of these was
264
+ found, fixed, and independently re-verified — including personally
265
+ reproducing the bug and its fix live, not just re-reading a diff — before
266
+ this release.
267
+
268
+ **Disclosed, not built.** Full graph-merge across repositories (only
269
+ declared, single-edge cross-repo links ship); synthetic node/edge
270
+ insertion for the What-If Simulator (every node/edge today derives from a
271
+ real registry decision or call site — inventing one has no precedent yet);
272
+ automatic destination/schema correlation for cross-repo edges (needs
273
+ prerequisite work — schema-derived edges, fuller destination resolution —
274
+ that isn't built); an HTML-table stress-test pass for the largest graphs;
275
+ config-declared (as opposed to runtime-observed) corroboration for the
276
+ Digital Twin, folded into already-scoped backlog rather than duplicated.
277
+ None of these block the acceptance criteria this release's milestones are
278
+ gated on.
279
+
14
280
  ## 0.145.0 — Finding Provenance ships, and two audits find what the first one missed
15
281
 
16
282
  Every finding now carries a `findingProvenance` record answering "when did this