@veraxhq/verax 0.2.0 → 0.3.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 (217) hide show
  1. package/README.md +14 -18
  2. package/bin/verax.js +7 -0
  3. package/package.json +15 -5
  4. package/src/cli/commands/baseline.js +104 -0
  5. package/src/cli/commands/default.js +323 -111
  6. package/src/cli/commands/doctor.js +36 -4
  7. package/src/cli/commands/ga.js +243 -0
  8. package/src/cli/commands/gates.js +95 -0
  9. package/src/cli/commands/inspect.js +131 -2
  10. package/src/cli/commands/release-check.js +213 -0
  11. package/src/cli/commands/run.js +498 -103
  12. package/src/cli/commands/security-check.js +211 -0
  13. package/src/cli/commands/truth.js +114 -0
  14. package/src/cli/entry.js +305 -68
  15. package/src/cli/util/angular-component-extractor.js +179 -0
  16. package/src/cli/util/angular-navigation-detector.js +141 -0
  17. package/src/cli/util/angular-network-detector.js +161 -0
  18. package/src/cli/util/angular-state-detector.js +162 -0
  19. package/src/cli/util/ast-interactive-detector.js +546 -0
  20. package/src/cli/util/ast-network-detector.js +603 -0
  21. package/src/cli/util/ast-usestate-detector.js +602 -0
  22. package/src/cli/util/bootstrap-guard.js +86 -0
  23. package/src/cli/util/detection-engine.js +4 -3
  24. package/src/cli/util/determinism-runner.js +123 -0
  25. package/src/cli/util/determinism-writer.js +129 -0
  26. package/src/cli/util/env-url.js +4 -0
  27. package/src/cli/util/events.js +76 -0
  28. package/src/cli/util/expectation-extractor.js +380 -74
  29. package/src/cli/util/findings-writer.js +126 -15
  30. package/src/cli/util/learn-writer.js +3 -1
  31. package/src/cli/util/observation-engine.js +69 -23
  32. package/src/cli/util/observe-writer.js +3 -1
  33. package/src/cli/util/paths.js +6 -14
  34. package/src/cli/util/project-discovery.js +23 -0
  35. package/src/cli/util/project-writer.js +3 -1
  36. package/src/cli/util/redact.js +2 -2
  37. package/src/cli/util/run-resolver.js +64 -0
  38. package/src/cli/util/runtime-budget.js +147 -0
  39. package/src/cli/util/source-requirement.js +55 -0
  40. package/src/cli/util/summary-writer.js +13 -1
  41. package/src/cli/util/svelte-navigation-detector.js +163 -0
  42. package/src/cli/util/svelte-network-detector.js +80 -0
  43. package/src/cli/util/svelte-sfc-extractor.js +147 -0
  44. package/src/cli/util/svelte-state-detector.js +243 -0
  45. package/src/cli/util/vue-navigation-detector.js +177 -0
  46. package/src/cli/util/vue-sfc-extractor.js +162 -0
  47. package/src/cli/util/vue-state-detector.js +215 -0
  48. package/src/types/global.d.ts +28 -0
  49. package/src/types/ts-ast.d.ts +24 -0
  50. package/src/verax/cli/doctor.js +2 -2
  51. package/src/verax/cli/finding-explainer.js +56 -3
  52. package/src/verax/cli/init.js +1 -1
  53. package/src/verax/cli/url-safety.js +12 -2
  54. package/src/verax/cli/wizard.js +13 -2
  55. package/src/verax/core/artifacts/registry.js +154 -0
  56. package/src/verax/core/artifacts/verifier.js +980 -0
  57. package/src/verax/core/baseline/baseline.enforcer.js +137 -0
  58. package/src/verax/core/baseline/baseline.snapshot.js +231 -0
  59. package/src/verax/core/budget-engine.js +1 -1
  60. package/src/verax/core/capabilities/gates.js +499 -0
  61. package/src/verax/core/capabilities/registry.js +475 -0
  62. package/src/verax/core/confidence/confidence-compute.js +137 -0
  63. package/src/verax/core/confidence/confidence-invariants.js +234 -0
  64. package/src/verax/core/confidence/confidence-report-writer.js +112 -0
  65. package/src/verax/core/confidence/confidence-weights.js +44 -0
  66. package/src/verax/core/confidence/confidence.defaults.js +65 -0
  67. package/src/verax/core/confidence/confidence.loader.js +79 -0
  68. package/src/verax/core/confidence/confidence.schema.js +94 -0
  69. package/src/verax/core/confidence-engine-refactor.js +484 -0
  70. package/src/verax/core/confidence-engine.js +486 -0
  71. package/src/verax/core/confidence-engine.js.backup +471 -0
  72. package/src/verax/core/contracts/index.js +29 -0
  73. package/src/verax/core/contracts/types.js +185 -0
  74. package/src/verax/core/contracts/validators.js +381 -0
  75. package/src/verax/core/decision-snapshot.js +31 -4
  76. package/src/verax/core/decisions/decision.trace.js +276 -0
  77. package/src/verax/core/determinism/contract-writer.js +89 -0
  78. package/src/verax/core/determinism/contract.js +139 -0
  79. package/src/verax/core/determinism/diff.js +364 -0
  80. package/src/verax/core/determinism/engine.js +221 -0
  81. package/src/verax/core/determinism/finding-identity.js +148 -0
  82. package/src/verax/core/determinism/normalize.js +438 -0
  83. package/src/verax/core/determinism/report-writer.js +92 -0
  84. package/src/verax/core/determinism/run-fingerprint.js +118 -0
  85. package/src/verax/core/determinism-model.js +35 -6
  86. package/src/verax/core/dynamic-route-intelligence.js +528 -0
  87. package/src/verax/core/evidence/evidence-capture-service.js +307 -0
  88. package/src/verax/core/evidence/evidence-intent-ledger.js +165 -0
  89. package/src/verax/core/evidence-builder.js +487 -0
  90. package/src/verax/core/execution-mode-context.js +77 -0
  91. package/src/verax/core/execution-mode-detector.js +190 -0
  92. package/src/verax/core/failures/exit-codes.js +86 -0
  93. package/src/verax/core/failures/failure-summary.js +76 -0
  94. package/src/verax/core/failures/failure.factory.js +225 -0
  95. package/src/verax/core/failures/failure.ledger.js +132 -0
  96. package/src/verax/core/failures/failure.types.js +196 -0
  97. package/src/verax/core/failures/index.js +10 -0
  98. package/src/verax/core/ga/ga-report-writer.js +43 -0
  99. package/src/verax/core/ga/ga.artifact.js +49 -0
  100. package/src/verax/core/ga/ga.contract.js +434 -0
  101. package/src/verax/core/ga/ga.enforcer.js +86 -0
  102. package/src/verax/core/guardrails/guardrails-report-writer.js +109 -0
  103. package/src/verax/core/guardrails/policy.defaults.js +210 -0
  104. package/src/verax/core/guardrails/policy.loader.js +83 -0
  105. package/src/verax/core/guardrails/policy.schema.js +110 -0
  106. package/src/verax/core/guardrails/truth-reconciliation.js +136 -0
  107. package/src/verax/core/guardrails-engine.js +505 -0
  108. package/src/verax/core/incremental-store.js +15 -7
  109. package/src/verax/core/observe/run-timeline.js +316 -0
  110. package/src/verax/core/perf/perf.contract.js +186 -0
  111. package/src/verax/core/perf/perf.display.js +65 -0
  112. package/src/verax/core/perf/perf.enforcer.js +91 -0
  113. package/src/verax/core/perf/perf.monitor.js +209 -0
  114. package/src/verax/core/perf/perf.report.js +198 -0
  115. package/src/verax/core/pipeline-tracker.js +238 -0
  116. package/src/verax/core/product-definition.js +127 -0
  117. package/src/verax/core/release/provenance.builder.js +271 -0
  118. package/src/verax/core/release/release-report-writer.js +40 -0
  119. package/src/verax/core/release/release.enforcer.js +159 -0
  120. package/src/verax/core/release/reproducibility.check.js +221 -0
  121. package/src/verax/core/release/sbom.builder.js +283 -0
  122. package/src/verax/core/replay-validator.js +4 -4
  123. package/src/verax/core/replay.js +1 -1
  124. package/src/verax/core/report/cross-index.js +192 -0
  125. package/src/verax/core/report/human-summary.js +222 -0
  126. package/src/verax/core/route-intelligence.js +419 -0
  127. package/src/verax/core/security/secrets.scan.js +326 -0
  128. package/src/verax/core/security/security-report.js +50 -0
  129. package/src/verax/core/security/security.enforcer.js +124 -0
  130. package/src/verax/core/security/supplychain.defaults.json +38 -0
  131. package/src/verax/core/security/supplychain.policy.js +326 -0
  132. package/src/verax/core/security/vuln.scan.js +265 -0
  133. package/src/verax/core/silence-impact.js +1 -1
  134. package/src/verax/core/silence-model.js +9 -7
  135. package/src/verax/core/truth/truth.certificate.js +250 -0
  136. package/src/verax/core/ui-feedback-intelligence.js +515 -0
  137. package/src/verax/detect/comparison.js +8 -3
  138. package/src/verax/detect/confidence-engine.js +645 -57
  139. package/src/verax/detect/confidence-helper.js +33 -0
  140. package/src/verax/detect/detection-engine.js +19 -2
  141. package/src/verax/detect/dynamic-route-findings.js +335 -0
  142. package/src/verax/detect/evidence-index.js +15 -65
  143. package/src/verax/detect/expectation-chain-detector.js +417 -0
  144. package/src/verax/detect/expectation-model.js +56 -3
  145. package/src/verax/detect/explanation-helpers.js +1 -1
  146. package/src/verax/detect/finding-detector.js +2 -2
  147. package/src/verax/detect/findings-writer.js +149 -20
  148. package/src/verax/detect/flow-detector.js +4 -4
  149. package/src/verax/detect/index.js +265 -15
  150. package/src/verax/detect/interactive-findings.js +3 -4
  151. package/src/verax/detect/journey-stall-detector.js +558 -0
  152. package/src/verax/detect/route-findings.js +218 -0
  153. package/src/verax/detect/signal-mapper.js +2 -2
  154. package/src/verax/detect/skip-classifier.js +4 -4
  155. package/src/verax/detect/ui-feedback-findings.js +207 -0
  156. package/src/verax/detect/verdict-engine.js +61 -9
  157. package/src/verax/detect/view-switch-correlator.js +242 -0
  158. package/src/verax/flow/flow-engine.js +3 -2
  159. package/src/verax/flow/flow-spec.js +1 -2
  160. package/src/verax/index.js +413 -33
  161. package/src/verax/intel/effect-detector.js +1 -1
  162. package/src/verax/intel/index.js +2 -2
  163. package/src/verax/intel/route-extractor.js +3 -3
  164. package/src/verax/intel/vue-navigation-extractor.js +81 -18
  165. package/src/verax/intel/vue-router-extractor.js +4 -2
  166. package/src/verax/learn/action-contract-extractor.js +684 -66
  167. package/src/verax/learn/ast-contract-extractor.js +53 -1
  168. package/src/verax/learn/index.js +36 -2
  169. package/src/verax/learn/manifest-writer.js +28 -14
  170. package/src/verax/learn/route-extractor.js +1 -1
  171. package/src/verax/learn/route-validator.js +12 -8
  172. package/src/verax/learn/state-extractor.js +1 -1
  173. package/src/verax/learn/static-extractor-navigation.js +1 -1
  174. package/src/verax/learn/static-extractor-validation.js +2 -2
  175. package/src/verax/learn/static-extractor.js +8 -7
  176. package/src/verax/learn/ts-contract-resolver.js +14 -12
  177. package/src/verax/observe/browser.js +22 -3
  178. package/src/verax/observe/console-sensor.js +2 -2
  179. package/src/verax/observe/expectation-executor.js +2 -1
  180. package/src/verax/observe/focus-sensor.js +1 -1
  181. package/src/verax/observe/human-driver.js +29 -10
  182. package/src/verax/observe/index.js +92 -844
  183. package/src/verax/observe/interaction-discovery.js +27 -15
  184. package/src/verax/observe/interaction-runner.js +31 -14
  185. package/src/verax/observe/loading-sensor.js +6 -0
  186. package/src/verax/observe/navigation-sensor.js +1 -1
  187. package/src/verax/observe/observe-context.js +205 -0
  188. package/src/verax/observe/observe-helpers.js +191 -0
  189. package/src/verax/observe/observe-runner.js +226 -0
  190. package/src/verax/observe/observers/budget-observer.js +185 -0
  191. package/src/verax/observe/observers/console-observer.js +102 -0
  192. package/src/verax/observe/observers/coverage-observer.js +107 -0
  193. package/src/verax/observe/observers/interaction-observer.js +471 -0
  194. package/src/verax/observe/observers/navigation-observer.js +132 -0
  195. package/src/verax/observe/observers/network-observer.js +87 -0
  196. package/src/verax/observe/observers/safety-observer.js +82 -0
  197. package/src/verax/observe/observers/ui-feedback-observer.js +99 -0
  198. package/src/verax/observe/settle.js +1 -0
  199. package/src/verax/observe/state-sensor.js +8 -4
  200. package/src/verax/observe/state-ui-sensor.js +7 -1
  201. package/src/verax/observe/traces-writer.js +27 -16
  202. package/src/verax/observe/ui-feedback-detector.js +742 -0
  203. package/src/verax/observe/ui-signal-sensor.js +155 -2
  204. package/src/verax/scan-summary-writer.js +46 -9
  205. package/src/verax/shared/artifact-manager.js +9 -6
  206. package/src/verax/shared/budget-profiles.js +2 -2
  207. package/src/verax/shared/caching.js +1 -1
  208. package/src/verax/shared/config-loader.js +1 -2
  209. package/src/verax/shared/css-spinner-rules.js +204 -0
  210. package/src/verax/shared/dynamic-route-utils.js +12 -6
  211. package/src/verax/shared/retry-policy.js +1 -6
  212. package/src/verax/shared/root-artifacts.js +1 -1
  213. package/src/verax/shared/view-switch-rules.js +208 -0
  214. package/src/verax/shared/zip-artifacts.js +1 -0
  215. package/src/verax/validate/context-validator.js +1 -1
  216. package/src/verax/observe/index.js.backup +0 -1
  217. package/src/verax/validate/context-validator.js.bak +0 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * PHASE 21.11 — Truth Certificate
3
+ *
4
+ * Generates a comprehensive certificate of truth for Enterprise audit.
5
+ * This is the document presented to management/audit/enterprise.
6
+ */
7
+
8
+ import { readFileSync, existsSync, writeFileSync } from 'fs';
9
+ import { resolve } from 'path';
10
+ import { loadBaselineSnapshot } from '../baseline/baseline.snapshot.js';
11
+
12
+ /**
13
+ * Load artifact JSON
14
+ */
15
+ function loadArtifact(runDir, filename) {
16
+ const path = resolve(runDir, filename);
17
+ if (!existsSync(path)) {
18
+ return null;
19
+ }
20
+ try {
21
+ return JSON.parse(readFileSync(path, 'utf-8'));
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Generate truth certificate
29
+ *
30
+ * @param {string} projectDir - Project directory
31
+ * @param {string} runId - Run ID
32
+ * @returns {Object} Truth certificate
33
+ */
34
+ export async function generateTruthCertificate(projectDir, runId) {
35
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
36
+
37
+ if (!existsSync(runDir)) {
38
+ return null;
39
+ }
40
+
41
+ // Load all relevant artifacts
42
+ const summary = loadArtifact(runDir, 'summary.json');
43
+ const findings = loadArtifact(runDir, 'findings.json');
44
+ const failureLedger = loadArtifact(runDir, 'failure.ledger.json');
45
+ const performanceReport = loadArtifact(runDir, 'performance.report.json');
46
+ const gaStatus = loadArtifact(runDir, 'ga.status.json');
47
+ const decisions = loadArtifact(runDir, 'decisions.json');
48
+
49
+ // Security reports
50
+ const releaseDir = resolve(projectDir, 'release');
51
+ const securitySecrets = loadArtifact(releaseDir, 'security.secrets.report.json');
52
+ const securityVuln = loadArtifact(releaseDir, 'security.vuln.report.json');
53
+
54
+ // Release provenance
55
+ const provenance = loadArtifact(releaseDir, 'release.provenance.json');
56
+
57
+ // Baseline snapshot
58
+ const baseline = loadBaselineSnapshot(projectDir);
59
+
60
+ // Evidence Law status
61
+ let evidenceLawStatus = 'UNKNOWN';
62
+ let evidenceLawViolated = false;
63
+
64
+ if (findings?.findings) {
65
+ for (const finding of findings.findings) {
66
+ if ((finding.severity === 'CONFIRMED' || finding.status === 'CONFIRMED') &&
67
+ finding.evidencePackage && !finding.evidencePackage.isComplete) {
68
+ evidenceLawViolated = true;
69
+ break;
70
+ }
71
+ }
72
+ }
73
+ evidenceLawStatus = evidenceLawViolated ? 'VIOLATED' : 'ENFORCED';
74
+
75
+ // Determinism verdict
76
+ let determinismVerdict = 'UNKNOWN';
77
+ if (decisions) {
78
+ try {
79
+ const { DecisionRecorder } = await import('../../core/determinism-model.js');
80
+ const recorder = DecisionRecorder.fromExport(decisions);
81
+ const { computeDeterminismVerdict } = await import('../../core/determinism/contract.js');
82
+ const verdict = computeDeterminismVerdict(recorder);
83
+ determinismVerdict = verdict.verdict;
84
+ } catch {
85
+ determinismVerdict = summary?.determinism?.verdict || 'UNKNOWN';
86
+ }
87
+ } else if (summary?.determinism) {
88
+ determinismVerdict = summary.determinism.verdict || 'UNKNOWN';
89
+ }
90
+
91
+ // Failure summary
92
+ const failureSummary = failureLedger?.summary || {
93
+ total: 0,
94
+ bySeverity: {},
95
+ byCategory: {}
96
+ };
97
+
98
+ // GA verdict
99
+ const gaVerdict = gaStatus?.gaReady === true ? 'GA-READY' : (gaStatus ? 'GA-BLOCKED' : 'UNKNOWN');
100
+ const gaBlockers = gaStatus?.blockers || [];
101
+ const gaWarnings = gaStatus?.warnings || [];
102
+
103
+ // Security verdict
104
+ const securityVerdict = {
105
+ secrets: securitySecrets?.hasSecrets ? 'BLOCKED' : (securitySecrets ? 'OK' : 'NOT_CHECKED'),
106
+ vulnerabilities: securityVuln?.blocking ? 'BLOCKED' : (securityVuln ? 'OK' : 'NOT_CHECKED'),
107
+ overall: (securitySecrets?.hasSecrets || securityVuln?.blocking) ? 'BLOCKED' :
108
+ (securitySecrets || securityVuln) ? 'OK' : 'NOT_CHECKED'
109
+ };
110
+
111
+ // Performance verdict
112
+ const performanceVerdict = performanceReport?.verdict || 'UNKNOWN';
113
+ const performanceOk = performanceReport?.ok !== false;
114
+ const performanceViolations = performanceReport?.violations || [];
115
+
116
+ // Baseline hash
117
+ const baselineHash = baseline?.baselineHash || null;
118
+
119
+ // Release provenance hash
120
+ const provenanceHash = provenance?.hashes?.dist || null;
121
+
122
+ const certificate = {
123
+ version: 1,
124
+ runId,
125
+ generatedAt: new Date().toISOString(),
126
+ url: summary?.url || null,
127
+
128
+ // Evidence Law
129
+ evidenceLaw: {
130
+ status: evidenceLawStatus,
131
+ violated: evidenceLawViolated,
132
+ statement: 'A finding cannot be marked CONFIRMED without sufficient evidence.'
133
+ },
134
+
135
+ // Determinism
136
+ determinism: {
137
+ verdict: determinismVerdict,
138
+ message: determinismVerdict === 'DETERMINISTIC'
139
+ ? 'Run was reproducible (same inputs = same outputs)'
140
+ : determinismVerdict === 'NON_DETERMINISTIC'
141
+ ? 'Run was not reproducible (adaptive events detected)'
142
+ : 'Determinism not evaluated'
143
+ },
144
+
145
+ // Failures
146
+ failures: {
147
+ total: failureSummary.total,
148
+ bySeverity: failureSummary.bySeverity || {},
149
+ byCategory: failureSummary.byCategory || {},
150
+ blocking: (failureSummary.bySeverity?.BLOCKING || 0) > 0,
151
+ degraded: (failureSummary.bySeverity?.DEGRADED || 0) > 0
152
+ },
153
+
154
+ // GA
155
+ ga: {
156
+ verdict: gaVerdict,
157
+ ready: gaStatus?.gaReady === true,
158
+ blockers: gaBlockers.length,
159
+ warnings: gaWarnings.length,
160
+ details: {
161
+ blockers: gaBlockers.map(b => ({ code: b.code, message: b.message })),
162
+ warnings: gaWarnings.map(w => ({ code: w.code, message: w.message }))
163
+ }
164
+ },
165
+
166
+ // Security
167
+ security: securityVerdict,
168
+
169
+ // Performance
170
+ performance: {
171
+ verdict: performanceVerdict,
172
+ ok: performanceOk,
173
+ violations: performanceViolations.length,
174
+ details: performanceViolations.map(v => ({
175
+ type: v.type,
176
+ actual: v.actual,
177
+ budget: v.budget
178
+ }))
179
+ },
180
+
181
+ // Baseline
182
+ baseline: {
183
+ hash: baselineHash,
184
+ frozen: baseline?.frozen || false,
185
+ version: baseline?.veraxVersion || null,
186
+ commit: baseline?.gitCommit || null
187
+ },
188
+
189
+ // Release provenance
190
+ provenance: {
191
+ hash: provenanceHash,
192
+ version: provenance?.version || null,
193
+ commit: provenance?.git?.commit || null
194
+ },
195
+
196
+ // Overall verdict
197
+ overallVerdict: {
198
+ status: (gaVerdict === 'GA-READY' &&
199
+ evidenceLawStatus === 'ENFORCED' &&
200
+ securityVerdict.overall === 'OK' &&
201
+ performanceOk) ? 'CERTIFIED' : 'NOT_CERTIFIED',
202
+ reasons: [
203
+ evidenceLawViolated ? 'Evidence Law violated' : null,
204
+ gaVerdict !== 'GA-READY' ? 'GA not ready' : null,
205
+ securityVerdict.overall !== 'OK' ? 'Security blocked' : null,
206
+ !performanceOk ? 'Performance violations' : null
207
+ ].filter(Boolean)
208
+ }
209
+ };
210
+
211
+ return certificate;
212
+ }
213
+
214
+ /**
215
+ * Write truth certificate to file
216
+ *
217
+ * @param {string} projectDir - Project directory
218
+ * @param {string} runId - Run ID
219
+ * @param {Object} certificate - Truth certificate
220
+ * @returns {string} Path to written file
221
+ */
222
+ export function writeTruthCertificate(projectDir, runId, certificate) {
223
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
224
+ const outputPath = resolve(runDir, 'truth.certificate.json');
225
+ writeFileSync(outputPath, JSON.stringify(certificate, null, 2), 'utf-8');
226
+ return outputPath;
227
+ }
228
+
229
+ /**
230
+ * Load truth certificate from file
231
+ *
232
+ * @param {string} projectDir - Project directory
233
+ * @param {string} runId - Run ID
234
+ * @returns {Object|null} Truth certificate or null
235
+ */
236
+ export function loadTruthCertificate(projectDir, runId) {
237
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
238
+ const certPath = resolve(runDir, 'truth.certificate.json');
239
+
240
+ if (!existsSync(certPath)) {
241
+ return null;
242
+ }
243
+
244
+ try {
245
+ return JSON.parse(readFileSync(certPath, 'utf-8'));
246
+ } catch {
247
+ return null;
248
+ }
249
+ }
250
+