@veraxhq/verax 0.2.1 → 0.4.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 (213) hide show
  1. package/README.md +10 -6
  2. package/bin/verax.js +11 -11
  3. package/package.json +29 -8
  4. package/src/cli/commands/baseline.js +103 -0
  5. package/src/cli/commands/default.js +51 -6
  6. package/src/cli/commands/doctor.js +29 -0
  7. package/src/cli/commands/ga.js +246 -0
  8. package/src/cli/commands/gates.js +95 -0
  9. package/src/cli/commands/inspect.js +4 -2
  10. package/src/cli/commands/release-check.js +215 -0
  11. package/src/cli/commands/run.js +45 -6
  12. package/src/cli/commands/security-check.js +212 -0
  13. package/src/cli/commands/truth.js +113 -0
  14. package/src/cli/entry.js +30 -20
  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 +544 -0
  20. package/src/cli/util/ast-network-detector.js +603 -0
  21. package/src/cli/util/ast-promise-extractor.js +581 -0
  22. package/src/cli/util/ast-usestate-detector.js +602 -0
  23. package/src/cli/util/atomic-write.js +12 -1
  24. package/src/cli/util/bootstrap-guard.js +86 -0
  25. package/src/cli/util/console-reporter.js +72 -0
  26. package/src/cli/util/detection-engine.js +105 -41
  27. package/src/cli/util/determinism-runner.js +124 -0
  28. package/src/cli/util/determinism-writer.js +129 -0
  29. package/src/cli/util/digest-engine.js +359 -0
  30. package/src/cli/util/dom-diff.js +226 -0
  31. package/src/cli/util/evidence-engine.js +287 -0
  32. package/src/cli/util/expectation-extractor.js +151 -5
  33. package/src/cli/util/findings-writer.js +3 -0
  34. package/src/cli/util/framework-detector.js +572 -0
  35. package/src/cli/util/idgen.js +1 -1
  36. package/src/cli/util/interaction-planner.js +529 -0
  37. package/src/cli/util/learn-writer.js +2 -0
  38. package/src/cli/util/ledger-writer.js +110 -0
  39. package/src/cli/util/monorepo-resolver.js +162 -0
  40. package/src/cli/util/observation-engine.js +127 -278
  41. package/src/cli/util/observe-writer.js +2 -0
  42. package/src/cli/util/project-discovery.js +284 -0
  43. package/src/cli/util/project-writer.js +2 -0
  44. package/src/cli/util/run-id.js +23 -27
  45. package/src/cli/util/run-resolver.js +64 -0
  46. package/src/cli/util/run-result.js +778 -0
  47. package/src/cli/util/selector-resolver.js +235 -0
  48. package/src/cli/util/source-requirement.js +55 -0
  49. package/src/cli/util/summary-writer.js +2 -0
  50. package/src/cli/util/svelte-navigation-detector.js +163 -0
  51. package/src/cli/util/svelte-network-detector.js +80 -0
  52. package/src/cli/util/svelte-sfc-extractor.js +146 -0
  53. package/src/cli/util/svelte-state-detector.js +242 -0
  54. package/src/cli/util/trust-activation-integration.js +496 -0
  55. package/src/cli/util/trust-activation-wrapper.js +85 -0
  56. package/src/cli/util/trust-integration-hooks.js +164 -0
  57. package/src/cli/util/types.js +153 -0
  58. package/src/cli/util/url-validation.js +40 -0
  59. package/src/cli/util/vue-navigation-detector.js +178 -0
  60. package/src/cli/util/vue-sfc-extractor.js +161 -0
  61. package/src/cli/util/vue-state-detector.js +215 -0
  62. package/src/types/fs-augment.d.ts +23 -0
  63. package/src/types/global.d.ts +137 -0
  64. package/src/types/internal-types.d.ts +35 -0
  65. package/src/verax/cli/init.js +4 -18
  66. package/src/verax/core/action-classifier.js +4 -3
  67. package/src/verax/core/artifacts/registry.js +139 -0
  68. package/src/verax/core/artifacts/verifier.js +990 -0
  69. package/src/verax/core/baseline/baseline.enforcer.js +137 -0
  70. package/src/verax/core/baseline/baseline.snapshot.js +233 -0
  71. package/src/verax/core/capabilities/gates.js +505 -0
  72. package/src/verax/core/capabilities/registry.js +475 -0
  73. package/src/verax/core/confidence/confidence-compute.js +144 -0
  74. package/src/verax/core/confidence/confidence-invariants.js +234 -0
  75. package/src/verax/core/confidence/confidence-report-writer.js +112 -0
  76. package/src/verax/core/confidence/confidence-weights.js +44 -0
  77. package/src/verax/core/confidence/confidence.defaults.js +65 -0
  78. package/src/verax/core/confidence/confidence.loader.js +80 -0
  79. package/src/verax/core/confidence/confidence.schema.js +94 -0
  80. package/src/verax/core/confidence-engine-refactor.js +489 -0
  81. package/src/verax/core/confidence-engine.js +625 -0
  82. package/src/verax/core/contracts/index.js +29 -0
  83. package/src/verax/core/contracts/types.js +186 -0
  84. package/src/verax/core/contracts/validators.js +456 -0
  85. package/src/verax/core/decisions/decision.trace.js +278 -0
  86. package/src/verax/core/determinism/contract-writer.js +89 -0
  87. package/src/verax/core/determinism/contract.js +139 -0
  88. package/src/verax/core/determinism/diff.js +405 -0
  89. package/src/verax/core/determinism/engine.js +222 -0
  90. package/src/verax/core/determinism/finding-identity.js +149 -0
  91. package/src/verax/core/determinism/normalize.js +466 -0
  92. package/src/verax/core/determinism/report-writer.js +93 -0
  93. package/src/verax/core/determinism/run-fingerprint.js +123 -0
  94. package/src/verax/core/dynamic-route-intelligence.js +529 -0
  95. package/src/verax/core/evidence/evidence-capture-service.js +308 -0
  96. package/src/verax/core/evidence/evidence-intent-ledger.js +166 -0
  97. package/src/verax/core/evidence-builder.js +487 -0
  98. package/src/verax/core/execution-mode-context.js +77 -0
  99. package/src/verax/core/execution-mode-detector.js +192 -0
  100. package/src/verax/core/failures/exit-codes.js +88 -0
  101. package/src/verax/core/failures/failure-summary.js +76 -0
  102. package/src/verax/core/failures/failure.factory.js +225 -0
  103. package/src/verax/core/failures/failure.ledger.js +133 -0
  104. package/src/verax/core/failures/failure.types.js +196 -0
  105. package/src/verax/core/failures/index.js +10 -0
  106. package/src/verax/core/ga/ga-report-writer.js +43 -0
  107. package/src/verax/core/ga/ga.artifact.js +49 -0
  108. package/src/verax/core/ga/ga.contract.js +435 -0
  109. package/src/verax/core/ga/ga.enforcer.js +87 -0
  110. package/src/verax/core/guardrails/guardrails-report-writer.js +109 -0
  111. package/src/verax/core/guardrails/policy.defaults.js +210 -0
  112. package/src/verax/core/guardrails/policy.loader.js +84 -0
  113. package/src/verax/core/guardrails/policy.schema.js +110 -0
  114. package/src/verax/core/guardrails/truth-reconciliation.js +136 -0
  115. package/src/verax/core/guardrails-engine.js +505 -0
  116. package/src/verax/core/incremental-store.js +1 -0
  117. package/src/verax/core/integrity/budget.js +138 -0
  118. package/src/verax/core/integrity/determinism.js +342 -0
  119. package/src/verax/core/integrity/integrity.js +208 -0
  120. package/src/verax/core/integrity/poisoning.js +108 -0
  121. package/src/verax/core/integrity/transaction.js +140 -0
  122. package/src/verax/core/observe/run-timeline.js +318 -0
  123. package/src/verax/core/perf/perf.contract.js +186 -0
  124. package/src/verax/core/perf/perf.display.js +65 -0
  125. package/src/verax/core/perf/perf.enforcer.js +91 -0
  126. package/src/verax/core/perf/perf.monitor.js +209 -0
  127. package/src/verax/core/perf/perf.report.js +200 -0
  128. package/src/verax/core/pipeline-tracker.js +243 -0
  129. package/src/verax/core/product-definition.js +127 -0
  130. package/src/verax/core/release/provenance.builder.js +130 -0
  131. package/src/verax/core/release/release-report-writer.js +40 -0
  132. package/src/verax/core/release/release.enforcer.js +164 -0
  133. package/src/verax/core/release/reproducibility.check.js +222 -0
  134. package/src/verax/core/release/sbom.builder.js +292 -0
  135. package/src/verax/core/replay-validator.js +2 -0
  136. package/src/verax/core/replay.js +4 -0
  137. package/src/verax/core/report/cross-index.js +195 -0
  138. package/src/verax/core/report/human-summary.js +362 -0
  139. package/src/verax/core/route-intelligence.js +420 -0
  140. package/src/verax/core/run-id.js +6 -3
  141. package/src/verax/core/run-manifest.js +4 -3
  142. package/src/verax/core/security/secrets.scan.js +329 -0
  143. package/src/verax/core/security/security-report.js +50 -0
  144. package/src/verax/core/security/security.enforcer.js +128 -0
  145. package/src/verax/core/security/supplychain.defaults.json +38 -0
  146. package/src/verax/core/security/supplychain.policy.js +334 -0
  147. package/src/verax/core/security/vuln.scan.js +265 -0
  148. package/src/verax/core/truth/truth.certificate.js +252 -0
  149. package/src/verax/core/ui-feedback-intelligence.js +481 -0
  150. package/src/verax/detect/conditional-ui-silent-failure.js +84 -0
  151. package/src/verax/detect/confidence-engine.js +62 -34
  152. package/src/verax/detect/confidence-helper.js +34 -0
  153. package/src/verax/detect/dynamic-route-findings.js +338 -0
  154. package/src/verax/detect/expectation-chain-detector.js +417 -0
  155. package/src/verax/detect/expectation-model.js +2 -2
  156. package/src/verax/detect/failure-cause-inference.js +293 -0
  157. package/src/verax/detect/findings-writer.js +131 -35
  158. package/src/verax/detect/flow-detector.js +2 -2
  159. package/src/verax/detect/form-silent-failure.js +98 -0
  160. package/src/verax/detect/index.js +46 -5
  161. package/src/verax/detect/invariants-enforcer.js +147 -0
  162. package/src/verax/detect/journey-stall-detector.js +558 -0
  163. package/src/verax/detect/navigation-silent-failure.js +82 -0
  164. package/src/verax/detect/problem-aggregator.js +361 -0
  165. package/src/verax/detect/route-findings.js +219 -0
  166. package/src/verax/detect/summary-writer.js +477 -0
  167. package/src/verax/detect/test-failure-cause-inference.js +314 -0
  168. package/src/verax/detect/ui-feedback-findings.js +207 -0
  169. package/src/verax/detect/view-switch-correlator.js +242 -0
  170. package/src/verax/flow/flow-engine.js +2 -1
  171. package/src/verax/flow/flow-spec.js +0 -6
  172. package/src/verax/index.js +4 -0
  173. package/src/verax/intel/ts-program.js +1 -0
  174. package/src/verax/intel/vue-navigation-extractor.js +3 -0
  175. package/src/verax/learn/action-contract-extractor.js +3 -0
  176. package/src/verax/learn/ast-contract-extractor.js +1 -1
  177. package/src/verax/learn/flow-extractor.js +1 -0
  178. package/src/verax/learn/project-detector.js +5 -0
  179. package/src/verax/learn/react-router-extractor.js +2 -0
  180. package/src/verax/learn/source-instrumenter.js +1 -0
  181. package/src/verax/learn/state-extractor.js +2 -1
  182. package/src/verax/learn/static-extractor.js +1 -0
  183. package/src/verax/observe/coverage-gaps.js +132 -0
  184. package/src/verax/observe/expectation-handler.js +126 -0
  185. package/src/verax/observe/incremental-skip.js +46 -0
  186. package/src/verax/observe/index.js +51 -155
  187. package/src/verax/observe/interaction-executor.js +192 -0
  188. package/src/verax/observe/interaction-runner.js +782 -513
  189. package/src/verax/observe/network-firewall.js +86 -0
  190. package/src/verax/observe/observation-builder.js +169 -0
  191. package/src/verax/observe/observe-context.js +205 -0
  192. package/src/verax/observe/observe-helpers.js +192 -0
  193. package/src/verax/observe/observe-runner.js +230 -0
  194. package/src/verax/observe/observers/budget-observer.js +185 -0
  195. package/src/verax/observe/observers/console-observer.js +102 -0
  196. package/src/verax/observe/observers/coverage-observer.js +107 -0
  197. package/src/verax/observe/observers/interaction-observer.js +471 -0
  198. package/src/verax/observe/observers/navigation-observer.js +132 -0
  199. package/src/verax/observe/observers/network-observer.js +87 -0
  200. package/src/verax/observe/observers/safety-observer.js +82 -0
  201. package/src/verax/observe/observers/ui-feedback-observer.js +99 -0
  202. package/src/verax/observe/page-traversal.js +138 -0
  203. package/src/verax/observe/snapshot-ops.js +94 -0
  204. package/src/verax/observe/ui-feedback-detector.js +742 -0
  205. package/src/verax/scan-summary-writer.js +2 -0
  206. package/src/verax/shared/artifact-manager.js +25 -5
  207. package/src/verax/shared/caching.js +1 -0
  208. package/src/verax/shared/css-spinner-rules.js +204 -0
  209. package/src/verax/shared/expectation-tracker.js +1 -0
  210. package/src/verax/shared/view-switch-rules.js +208 -0
  211. package/src/verax/shared/zip-artifacts.js +6 -0
  212. package/src/verax/shared/config-loader.js +0 -169
  213. /package/src/verax/shared/{expectation-proof.js → expectation-validation.js} +0 -0
@@ -0,0 +1,252 @@
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
+ // @ts-expect-error - readFileSync with encoding returns string
22
+ return JSON.parse(readFileSync(path, 'utf-8'));
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Generate truth certificate
30
+ *
31
+ * @param {string} projectDir - Project directory
32
+ * @param {string} runId - Run ID
33
+ * @returns {Promise<Object>} Truth certificate
34
+ */
35
+ export async function generateTruthCertificate(projectDir, runId) {
36
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
37
+
38
+ if (!existsSync(runDir)) {
39
+ return null;
40
+ }
41
+
42
+ // Load all relevant artifacts
43
+ const summary = loadArtifact(runDir, 'summary.json');
44
+ const findings = loadArtifact(runDir, 'findings.json');
45
+ const failureLedger = loadArtifact(runDir, 'failure.ledger.json');
46
+ const performanceReport = loadArtifact(runDir, 'performance.report.json');
47
+ const gaStatus = loadArtifact(runDir, 'ga.status.json');
48
+ const decisions = loadArtifact(runDir, 'decisions.json');
49
+
50
+ // Security reports
51
+ const releaseDir = resolve(projectDir, 'release');
52
+ const securitySecrets = loadArtifact(releaseDir, 'security.secrets.report.json');
53
+ const securityVuln = loadArtifact(releaseDir, 'security.vuln.report.json');
54
+
55
+ // Release provenance
56
+ const provenance = loadArtifact(releaseDir, 'release.provenance.json');
57
+
58
+ // Baseline snapshot
59
+ const baseline = loadBaselineSnapshot(projectDir);
60
+
61
+ // Evidence Law status
62
+ let evidenceLawStatus = 'UNKNOWN';
63
+ let evidenceLawViolated = false;
64
+
65
+ if (findings?.findings) {
66
+ for (const finding of findings.findings) {
67
+ if ((finding.severity === 'CONFIRMED' || finding.status === 'CONFIRMED') &&
68
+ finding.evidencePackage && !finding.evidencePackage.isComplete) {
69
+ evidenceLawViolated = true;
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ evidenceLawStatus = evidenceLawViolated ? 'VIOLATED' : 'ENFORCED';
75
+
76
+ // Determinism verdict
77
+ let determinismVerdict = 'UNKNOWN';
78
+ if (decisions) {
79
+ try {
80
+ const { DecisionRecorder } = await import('../../core/determinism-model.js');
81
+ const recorder = DecisionRecorder.fromExport(decisions);
82
+ const { computeDeterminismVerdict } = await import('../../core/determinism/contract.js');
83
+ const verdict = computeDeterminismVerdict(recorder);
84
+ determinismVerdict = verdict.verdict;
85
+ } catch {
86
+ determinismVerdict = summary?.determinism?.verdict || 'UNKNOWN';
87
+ }
88
+ } else if (summary?.determinism) {
89
+ determinismVerdict = summary.determinism.verdict || 'UNKNOWN';
90
+ }
91
+
92
+ // Failure summary
93
+ const failureSummary = failureLedger?.summary || {
94
+ total: 0,
95
+ bySeverity: {},
96
+ byCategory: {}
97
+ };
98
+
99
+ // GA verdict
100
+ const gaVerdict = gaStatus?.gaReady === true ? 'GA-READY' : (gaStatus ? 'GA-BLOCKED' : 'UNKNOWN');
101
+ const gaBlockers = gaStatus?.blockers || [];
102
+ const gaWarnings = gaStatus?.warnings || [];
103
+
104
+ // Security verdict
105
+ const securityVerdict = {
106
+ secrets: securitySecrets?.hasSecrets ? 'BLOCKED' : (securitySecrets ? 'OK' : 'NOT_CHECKED'),
107
+ vulnerabilities: securityVuln?.blocking ? 'BLOCKED' : (securityVuln ? 'OK' : 'NOT_CHECKED'),
108
+ overall: (securitySecrets?.hasSecrets || securityVuln?.blocking) ? 'BLOCKED' :
109
+ (securitySecrets || securityVuln) ? 'OK' : 'NOT_CHECKED'
110
+ };
111
+
112
+ // Performance verdict
113
+ const performanceVerdict = performanceReport?.verdict || 'UNKNOWN';
114
+ const performanceOk = performanceReport?.ok !== false;
115
+ const performanceViolations = performanceReport?.violations || [];
116
+
117
+ // Baseline hash
118
+ const baselineHash = baseline?.baselineHash || null;
119
+
120
+ // Release provenance hash
121
+ const provenanceHash = provenance?.hashes?.dist || null;
122
+
123
+ const certificate = {
124
+ version: 1,
125
+ runId,
126
+ generatedAt: new Date().toISOString(),
127
+ url: summary?.url || null,
128
+
129
+ // Evidence Law
130
+ evidenceLaw: {
131
+ status: evidenceLawStatus,
132
+ violated: evidenceLawViolated,
133
+ statement: 'A finding cannot be marked CONFIRMED without sufficient evidence.'
134
+ },
135
+
136
+ // Determinism
137
+ determinism: {
138
+ verdict: determinismVerdict,
139
+ message: determinismVerdict === 'DETERMINISTIC'
140
+ ? 'Run was reproducible (same inputs = same outputs)'
141
+ : determinismVerdict === 'NON_DETERMINISTIC'
142
+ ? 'Run was not reproducible (adaptive events detected)'
143
+ : 'Determinism not evaluated'
144
+ },
145
+
146
+ // Failures
147
+ failures: {
148
+ total: failureSummary.total,
149
+ bySeverity: failureSummary.bySeverity || {},
150
+ byCategory: failureSummary.byCategory || {},
151
+ blocking: (failureSummary.bySeverity?.BLOCKING || 0) > 0,
152
+ degraded: (failureSummary.bySeverity?.DEGRADED || 0) > 0
153
+ },
154
+
155
+ // GA
156
+ ga: {
157
+ verdict: gaVerdict,
158
+ ready: gaStatus?.gaReady === true,
159
+ blockers: gaBlockers.length,
160
+ warnings: gaWarnings.length,
161
+ details: {
162
+ blockers: gaBlockers.map(b => ({ code: b.code, message: b.message })),
163
+ warnings: gaWarnings.map(w => ({ code: w.code, message: w.message }))
164
+ }
165
+ },
166
+
167
+ // Security
168
+ security: securityVerdict,
169
+
170
+ // Performance
171
+ performance: {
172
+ verdict: performanceVerdict,
173
+ ok: performanceOk,
174
+ violations: performanceViolations.length,
175
+ details: performanceViolations.map(v => ({
176
+ type: v.type,
177
+ actual: v.actual,
178
+ budget: v.budget
179
+ }))
180
+ },
181
+
182
+ // Baseline
183
+ baseline: {
184
+ hash: baselineHash,
185
+ frozen: baseline?.frozen || false,
186
+ version: baseline?.veraxVersion || null,
187
+ commit: baseline?.gitCommit || null
188
+ },
189
+
190
+ // Release provenance
191
+ provenance: {
192
+ hash: provenanceHash,
193
+ version: provenance?.version || null,
194
+ commit: provenance?.git?.commit || null
195
+ },
196
+
197
+ // Overall verdict
198
+ overallVerdict: {
199
+ status: (gaVerdict === 'GA-READY' &&
200
+ evidenceLawStatus === 'ENFORCED' &&
201
+ securityVerdict.overall === 'OK' &&
202
+ performanceOk) ? 'CERTIFIED' : 'NOT_CERTIFIED',
203
+ reasons: [
204
+ evidenceLawViolated ? 'Evidence Law violated' : null,
205
+ gaVerdict !== 'GA-READY' ? 'GA not ready' : null,
206
+ securityVerdict.overall !== 'OK' ? 'Security blocked' : null,
207
+ !performanceOk ? 'Performance violations' : null
208
+ ].filter(Boolean)
209
+ }
210
+ };
211
+
212
+ return certificate;
213
+ }
214
+
215
+ /**
216
+ * Write truth certificate to file
217
+ *
218
+ * @param {string} projectDir - Project directory
219
+ * @param {string} runId - Run ID
220
+ * @param {Object} certificate - Truth certificate
221
+ * @returns {string} Path to written file
222
+ */
223
+ export function writeTruthCertificate(projectDir, runId, certificate) {
224
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
225
+ const outputPath = resolve(runDir, 'truth.certificate.json');
226
+ writeFileSync(outputPath, JSON.stringify(certificate, null, 2), 'utf-8');
227
+ return outputPath;
228
+ }
229
+
230
+ /**
231
+ * Load truth certificate from file
232
+ *
233
+ * @param {string} projectDir - Project directory
234
+ * @param {string} runId - Run ID
235
+ * @returns {Object|null} Truth certificate or null
236
+ */
237
+ export function loadTruthCertificate(projectDir, runId) {
238
+ const runDir = resolve(projectDir, '.verax', 'runs', runId);
239
+ const certPath = resolve(runDir, 'truth.certificate.json');
240
+
241
+ if (!existsSync(certPath)) {
242
+ return null;
243
+ }
244
+
245
+ try {
246
+ // @ts-expect-error - readFileSync with encoding returns string
247
+ return JSON.parse(readFileSync(certPath, 'utf-8'));
248
+ } catch {
249
+ return null;
250
+ }
251
+ }
252
+