@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,196 @@
1
+ /**
2
+ * PHASE 21.5 — Unified Failure Taxonomy
3
+ *
4
+ * Every failure in VERAX must be classified using this taxonomy.
5
+ * No ad-hoc errors, no string-based exceptions.
6
+ */
7
+
8
+ /**
9
+ * Failure Categories
10
+ */
11
+ export const FAILURE_CATEGORY = {
12
+ EVIDENCE: 'EVIDENCE', // Evidence Law violations
13
+ DETERMINISM: 'DETERMINISM', // Determinism violations
14
+ OBSERVE: 'OBSERVE', // Observation phase failures
15
+ DETECT: 'DETECT', // Detection phase failures
16
+ VERIFY: 'VERIFY', // Verification failures
17
+ REPORT: 'REPORT', // Reporting failures
18
+ CONTRACT: 'CONTRACT', // Contract/invariant violations
19
+ POLICY: 'POLICY', // Policy validation failures
20
+ IO: 'IO', // File I/O failures
21
+ INTERNAL: 'INTERNAL' // Internal system errors
22
+ };
23
+
24
+ /**
25
+ * Failure Severity
26
+ */
27
+ export const FAILURE_SEVERITY = {
28
+ BLOCKING: 'BLOCKING', // Execution must stop
29
+ DEGRADED: 'DEGRADED', // Execution continues, verdict downgraded
30
+ WARNING: 'WARNING' // Execution continues, recorded only
31
+ };
32
+
33
+ /**
34
+ * Execution Phase
35
+ */
36
+ export const EXECUTION_PHASE = {
37
+ LEARN: 'LEARN',
38
+ OBSERVE: 'OBSERVE',
39
+ DETECT: 'DETECT',
40
+ WRITE: 'WRITE',
41
+ VERIFY: 'VERIFY',
42
+ VERDICT: 'VERDICT',
43
+ REPORT: 'REPORT'
44
+ };
45
+
46
+ /**
47
+ * Stable Failure Codes
48
+ *
49
+ * Each code is stable and machine-readable.
50
+ * Used for deterministic failure classification.
51
+ */
52
+ export const FAILURE_CODE = {
53
+ // Evidence Law Failures
54
+ EVIDENCE_INCOMPLETE: 'EVIDENCE_INCOMPLETE',
55
+ EVIDENCE_MISSING_REQUIRED: 'EVIDENCE_MISSING_REQUIRED',
56
+ EVIDENCE_CORRUPTED: 'EVIDENCE_CORRUPTED',
57
+ EVIDENCE_LAW_VIOLATION: 'EVIDENCE_LAW_VIOLATION',
58
+
59
+ // Determinism Failures
60
+ DETERMINISM_ADAPTIVE_DETECTED: 'DETERMINISM_ADAPTIVE_DETECTED',
61
+ DETERMINISM_NON_REPRODUCIBLE: 'DETERMINISM_NON_REPRODUCIBLE',
62
+ DETERMINISM_TRUTH_VIOLATION: 'DETERMINISM_TRUTH_VIOLATION',
63
+
64
+ // Observation Failures
65
+ OBSERVE_NAVIGATION_FAILED: 'OBSERVE_NAVIGATION_FAILED',
66
+ OBSERVE_INTERACTION_FAILED: 'OBSERVE_INTERACTION_FAILED',
67
+ OBSERVE_SENSOR_FAILED: 'OBSERVE_SENSOR_FAILED',
68
+ OBSERVE_TIMEOUT: 'OBSERVE_TIMEOUT',
69
+ OBSERVE_BUDGET_EXCEEDED: 'OBSERVE_BUDGET_EXCEEDED',
70
+ OBSERVE_BROWSER_CRASH: 'OBSERVE_BROWSER_CRASH',
71
+
72
+ // Detection Failures
73
+ DETECT_FINDING_PROCESSING_FAILED: 'DETECT_FINDING_PROCESSING_FAILED',
74
+ DETECT_CONFIDENCE_COMPUTATION_FAILED: 'DETECT_CONFIDENCE_COMPUTATION_FAILED',
75
+ DETECT_GUARDRAILS_FAILED: 'DETECT_GUARDRAILS_FAILED',
76
+ DETECT_EVIDENCE_BUILD_FAILED: 'DETECT_EVIDENCE_BUILD_FAILED',
77
+
78
+ // Verification Failures
79
+ VERIFY_ARTIFACT_CORRUPTED: 'VERIFY_ARTIFACT_CORRUPTED',
80
+ VERIFY_HASH_MISMATCH: 'VERIFY_HASH_MISMATCH',
81
+ VERIFY_INTEGRITY_VIOLATION: 'VERIFY_INTEGRITY_VIOLATION',
82
+ VERIFICATION_FAILED: 'VERIFICATION_FAILED',
83
+
84
+ // Verdict Failures
85
+ VERDICT_COMPUTATION_FAILED: 'VERDICT_COMPUTATION_FAILED',
86
+
87
+ // Observation Execution Failures
88
+ OBSERVE_EXECUTION_FAILED: 'OBSERVE_EXECUTION_FAILED',
89
+
90
+ // Reporting Failures
91
+ REPORT_WRITE_FAILED: 'REPORT_WRITE_FAILED',
92
+ REPORT_SERIALIZATION_FAILED: 'REPORT_SERIALIZATION_FAILED',
93
+
94
+ // Contract Failures
95
+ CONTRACT_INVARIANT_VIOLATION: 'CONTRACT_INVARIANT_VIOLATION',
96
+ CONTRACT_PRECONDITION_FAILED: 'CONTRACT_PRECONDITION_FAILED',
97
+ CONTRACT_POSTCONDITION_FAILED: 'CONTRACT_POSTCONDITION_FAILED',
98
+
99
+ // Policy Failures
100
+ POLICY_INVALID: 'POLICY_INVALID',
101
+ POLICY_LOAD_FAILED: 'POLICY_LOAD_FAILED',
102
+ POLICY_VALIDATION_FAILED: 'POLICY_VALIDATION_FAILED',
103
+
104
+ // I/O Failures
105
+ IO_READ_FAILED: 'IO_READ_FAILED',
106
+ IO_WRITE_FAILED: 'IO_WRITE_FAILED',
107
+ IO_FILE_NOT_FOUND: 'IO_FILE_NOT_FOUND',
108
+ IO_PERMISSION_DENIED: 'IO_PERMISSION_DENIED',
109
+
110
+ // Internal Failures
111
+ INTERNAL_UNEXPECTED_ERROR: 'INTERNAL_UNEXPECTED_ERROR',
112
+ INTERNAL_STATE_CORRUPTION: 'INTERNAL_STATE_CORRUPTION',
113
+ INTERNAL_ASSERTION_FAILED: 'INTERNAL_ASSERTION_FAILED',
114
+
115
+ // Baseline Failures (PHASE 21.11)
116
+ BASELINE_DRIFT: 'BASELINE_DRIFT'
117
+ };
118
+
119
+ /**
120
+ * Failure Object Structure
121
+ *
122
+ * @typedef {Object} Failure
123
+ * @property {string} code - Stable failure code (from FAILURE_CODE)
124
+ * @property {string} category - Failure category (from FAILURE_CATEGORY)
125
+ * @property {string} severity - Failure severity (from FAILURE_SEVERITY)
126
+ * @property {string} phase - Execution phase (from EXECUTION_PHASE)
127
+ * @property {boolean} isRecoverable - Whether failure can be recovered
128
+ * @property {string} message - Human-readable message
129
+ * @property {string} component - Component where failure occurred
130
+ * @property {number} timestamp - Timestamp of failure
131
+ * @property {Object} context - Additional context
132
+ * @property {string} [stack] - Stack trace (if internal error)
133
+ * @property {string} [recoveryAction] - Recovery action taken (if any)
134
+ * @property {string} [impact] - Impact on verdict/execution
135
+ */
136
+
137
+ /**
138
+ * Validate failure object
139
+ *
140
+ * @param {Object} failure - Failure object to validate
141
+ * @throws {Error} If failure is invalid
142
+ */
143
+ export function validateFailure(failure) {
144
+ if (!failure) {
145
+ throw new Error('Failure object is required');
146
+ }
147
+
148
+ if (!failure.code || typeof failure.code !== 'string') {
149
+ throw new Error('Failure must have a code string');
150
+ }
151
+
152
+ if (!Object.values(FAILURE_CODE).includes(failure.code)) {
153
+ throw new Error(`Invalid failure code: ${failure.code}`);
154
+ }
155
+
156
+ if (!failure.category || typeof failure.category !== 'string') {
157
+ throw new Error('Failure must have a category string');
158
+ }
159
+
160
+ if (!Object.values(FAILURE_CATEGORY).includes(failure.category)) {
161
+ throw new Error(`Invalid failure category: ${failure.category}`);
162
+ }
163
+
164
+ if (!failure.severity || typeof failure.severity !== 'string') {
165
+ throw new Error('Failure must have a severity string');
166
+ }
167
+
168
+ if (!Object.values(FAILURE_SEVERITY).includes(failure.severity)) {
169
+ throw new Error(`Invalid failure severity: ${failure.severity}`);
170
+ }
171
+
172
+ if (!failure.phase || typeof failure.phase !== 'string') {
173
+ throw new Error('Failure must have a phase string');
174
+ }
175
+
176
+ if (!Object.values(EXECUTION_PHASE).includes(failure.phase)) {
177
+ throw new Error(`Invalid execution phase: ${failure.phase}`);
178
+ }
179
+
180
+ if (typeof failure.isRecoverable !== 'boolean') {
181
+ throw new Error('Failure must have isRecoverable boolean');
182
+ }
183
+
184
+ if (!failure.message || typeof failure.message !== 'string') {
185
+ throw new Error('Failure must have a message string');
186
+ }
187
+
188
+ if (!failure.component || typeof failure.component !== 'string') {
189
+ throw new Error('Failure must have a component string');
190
+ }
191
+
192
+ if (typeof failure.timestamp !== 'number') {
193
+ throw new Error('Failure must have a timestamp number');
194
+ }
195
+ }
196
+
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Failures module exports
3
+ * Central export point for failure-related types and utilities
4
+ */
5
+
6
+ export { FAILURE_CODE, EXECUTION_PHASE, FAILURE_SEVERITY, FAILURE_CATEGORY } from './failure.types.js';
7
+ export { FailureLedger } from './failure.ledger.js';
8
+ export { errorToFailure, createIOFailure, createInternalFailure } from './failure.factory.js';
9
+ export { formatFailureSummary, getExitCodeFromLedger } from './failure-summary.js';
10
+
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ENTERPRISE READINESS — GA Report Writer
3
+ *
4
+ * Writes ga.report.json artifact with GA readiness evaluation results.
5
+ */
6
+
7
+ import { writeFileSync, mkdirSync, existsSync } from 'fs';
8
+ import { resolve } from 'path';
9
+
10
+ /**
11
+ * Write GA report
12
+ *
13
+ * @param {string} projectDir - Project directory
14
+ * @param {string} runId - Run ID
15
+ * @param {Object} gaResult - GA readiness evaluation result
16
+ * @returns {string} Path to written file
17
+ */
18
+ export function writeGAReport(projectDir, runId, gaResult) {
19
+ const outputDir = resolve(projectDir, '.verax', 'security');
20
+ if (!existsSync(outputDir)) {
21
+ mkdirSync(outputDir, { recursive: true });
22
+ }
23
+
24
+ const reportPath = resolve(outputDir, 'ga.report.json');
25
+
26
+ const report = {
27
+ contractVersion: 1,
28
+ generatedAt: new Date().toISOString(),
29
+ runId,
30
+ gaReady: gaResult.pass,
31
+ blockers: gaResult.blockers || [],
32
+ warnings: gaResult.warnings || [],
33
+ summary: gaResult.summary || {},
34
+ inputs: gaResult.inputs || {},
35
+ failureCodes: gaResult.blockers?.map(b => b.code) || [],
36
+ warningCodes: gaResult.warnings?.map(w => w.code) || []
37
+ };
38
+
39
+ writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
40
+
41
+ return reportPath;
42
+ }
43
+
@@ -0,0 +1,49 @@
1
+ /**
2
+ * PHASE 21.6 — GA Status Artifact Writer
3
+ *
4
+ * Writes GA readiness status to ga.status.json
5
+ */
6
+
7
+ import { writeFileSync, mkdirSync } from 'fs';
8
+ import { resolve, dirname as _dirname } from 'path';
9
+ import { buildBaselineSnapshot, writeBaselineSnapshot } from '../baseline/baseline.snapshot.js';
10
+
11
+ /**
12
+ * Write GA status artifact
13
+ *
14
+ * @param {string} projectDir - Project directory
15
+ * @param {string} runId - Run ID
16
+ * @param {Object} gaResult - GA readiness result
17
+ * @returns {string} Path to artifact
18
+ */
19
+ export function writeGAStatus(projectDir, runId, gaResult) {
20
+ const runsDir = resolve(projectDir, '.verax', 'runs', runId);
21
+ mkdirSync(runsDir, { recursive: true });
22
+
23
+ const artifactPath = resolve(runsDir, 'ga.status.json');
24
+
25
+ const artifact = {
26
+ gaReady: gaResult.pass,
27
+ checkedAt: gaResult.summary.checkedAt,
28
+ blockers: gaResult.blockers,
29
+ warnings: gaResult.warnings,
30
+ summary: gaResult.summary,
31
+ inputs: gaResult.inputs
32
+ };
33
+
34
+ writeFileSync(artifactPath, JSON.stringify(artifact, null, 2), 'utf-8');
35
+
36
+ // PHASE 21.11: Freeze baseline when GA-READY
37
+ if (gaResult.pass) {
38
+ try {
39
+ const baseline = buildBaselineSnapshot(projectDir);
40
+ writeBaselineSnapshot(projectDir, baseline, true); // true = GA-READY, freeze it
41
+ } catch (error) {
42
+ // Baseline freeze failure is not fatal, but should be logged
43
+ console.error(`Warning: Failed to freeze baseline: ${error.message}`);
44
+ }
45
+ }
46
+
47
+ return artifactPath;
48
+ }
49
+