@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.
- package/README.md +14 -18
- package/bin/verax.js +7 -0
- package/package.json +15 -5
- package/src/cli/commands/baseline.js +104 -0
- package/src/cli/commands/default.js +323 -111
- package/src/cli/commands/doctor.js +36 -4
- package/src/cli/commands/ga.js +243 -0
- package/src/cli/commands/gates.js +95 -0
- package/src/cli/commands/inspect.js +131 -2
- package/src/cli/commands/release-check.js +213 -0
- package/src/cli/commands/run.js +498 -103
- package/src/cli/commands/security-check.js +211 -0
- package/src/cli/commands/truth.js +114 -0
- package/src/cli/entry.js +305 -68
- package/src/cli/util/angular-component-extractor.js +179 -0
- package/src/cli/util/angular-navigation-detector.js +141 -0
- package/src/cli/util/angular-network-detector.js +161 -0
- package/src/cli/util/angular-state-detector.js +162 -0
- package/src/cli/util/ast-interactive-detector.js +546 -0
- package/src/cli/util/ast-network-detector.js +603 -0
- package/src/cli/util/ast-usestate-detector.js +602 -0
- package/src/cli/util/bootstrap-guard.js +86 -0
- package/src/cli/util/detection-engine.js +4 -3
- package/src/cli/util/determinism-runner.js +123 -0
- package/src/cli/util/determinism-writer.js +129 -0
- package/src/cli/util/env-url.js +4 -0
- package/src/cli/util/events.js +76 -0
- package/src/cli/util/expectation-extractor.js +380 -74
- package/src/cli/util/findings-writer.js +126 -15
- package/src/cli/util/learn-writer.js +3 -1
- package/src/cli/util/observation-engine.js +69 -23
- package/src/cli/util/observe-writer.js +3 -1
- package/src/cli/util/paths.js +6 -14
- package/src/cli/util/project-discovery.js +23 -0
- package/src/cli/util/project-writer.js +3 -1
- package/src/cli/util/redact.js +2 -2
- package/src/cli/util/run-resolver.js +64 -0
- package/src/cli/util/runtime-budget.js +147 -0
- package/src/cli/util/source-requirement.js +55 -0
- package/src/cli/util/summary-writer.js +13 -1
- package/src/cli/util/svelte-navigation-detector.js +163 -0
- package/src/cli/util/svelte-network-detector.js +80 -0
- package/src/cli/util/svelte-sfc-extractor.js +147 -0
- package/src/cli/util/svelte-state-detector.js +243 -0
- package/src/cli/util/vue-navigation-detector.js +177 -0
- package/src/cli/util/vue-sfc-extractor.js +162 -0
- package/src/cli/util/vue-state-detector.js +215 -0
- package/src/types/global.d.ts +28 -0
- package/src/types/ts-ast.d.ts +24 -0
- package/src/verax/cli/doctor.js +2 -2
- package/src/verax/cli/finding-explainer.js +56 -3
- package/src/verax/cli/init.js +1 -1
- package/src/verax/cli/url-safety.js +12 -2
- package/src/verax/cli/wizard.js +13 -2
- package/src/verax/core/artifacts/registry.js +154 -0
- package/src/verax/core/artifacts/verifier.js +980 -0
- package/src/verax/core/baseline/baseline.enforcer.js +137 -0
- package/src/verax/core/baseline/baseline.snapshot.js +231 -0
- package/src/verax/core/budget-engine.js +1 -1
- package/src/verax/core/capabilities/gates.js +499 -0
- package/src/verax/core/capabilities/registry.js +475 -0
- package/src/verax/core/confidence/confidence-compute.js +137 -0
- package/src/verax/core/confidence/confidence-invariants.js +234 -0
- package/src/verax/core/confidence/confidence-report-writer.js +112 -0
- package/src/verax/core/confidence/confidence-weights.js +44 -0
- package/src/verax/core/confidence/confidence.defaults.js +65 -0
- package/src/verax/core/confidence/confidence.loader.js +79 -0
- package/src/verax/core/confidence/confidence.schema.js +94 -0
- package/src/verax/core/confidence-engine-refactor.js +484 -0
- package/src/verax/core/confidence-engine.js +486 -0
- package/src/verax/core/confidence-engine.js.backup +471 -0
- package/src/verax/core/contracts/index.js +29 -0
- package/src/verax/core/contracts/types.js +185 -0
- package/src/verax/core/contracts/validators.js +381 -0
- package/src/verax/core/decision-snapshot.js +31 -4
- package/src/verax/core/decisions/decision.trace.js +276 -0
- package/src/verax/core/determinism/contract-writer.js +89 -0
- package/src/verax/core/determinism/contract.js +139 -0
- package/src/verax/core/determinism/diff.js +364 -0
- package/src/verax/core/determinism/engine.js +221 -0
- package/src/verax/core/determinism/finding-identity.js +148 -0
- package/src/verax/core/determinism/normalize.js +438 -0
- package/src/verax/core/determinism/report-writer.js +92 -0
- package/src/verax/core/determinism/run-fingerprint.js +118 -0
- package/src/verax/core/determinism-model.js +35 -6
- package/src/verax/core/dynamic-route-intelligence.js +528 -0
- package/src/verax/core/evidence/evidence-capture-service.js +307 -0
- package/src/verax/core/evidence/evidence-intent-ledger.js +165 -0
- package/src/verax/core/evidence-builder.js +487 -0
- package/src/verax/core/execution-mode-context.js +77 -0
- package/src/verax/core/execution-mode-detector.js +190 -0
- package/src/verax/core/failures/exit-codes.js +86 -0
- package/src/verax/core/failures/failure-summary.js +76 -0
- package/src/verax/core/failures/failure.factory.js +225 -0
- package/src/verax/core/failures/failure.ledger.js +132 -0
- package/src/verax/core/failures/failure.types.js +196 -0
- package/src/verax/core/failures/index.js +10 -0
- package/src/verax/core/ga/ga-report-writer.js +43 -0
- package/src/verax/core/ga/ga.artifact.js +49 -0
- package/src/verax/core/ga/ga.contract.js +434 -0
- package/src/verax/core/ga/ga.enforcer.js +86 -0
- package/src/verax/core/guardrails/guardrails-report-writer.js +109 -0
- package/src/verax/core/guardrails/policy.defaults.js +210 -0
- package/src/verax/core/guardrails/policy.loader.js +83 -0
- package/src/verax/core/guardrails/policy.schema.js +110 -0
- package/src/verax/core/guardrails/truth-reconciliation.js +136 -0
- package/src/verax/core/guardrails-engine.js +505 -0
- package/src/verax/core/incremental-store.js +15 -7
- package/src/verax/core/observe/run-timeline.js +316 -0
- package/src/verax/core/perf/perf.contract.js +186 -0
- package/src/verax/core/perf/perf.display.js +65 -0
- package/src/verax/core/perf/perf.enforcer.js +91 -0
- package/src/verax/core/perf/perf.monitor.js +209 -0
- package/src/verax/core/perf/perf.report.js +198 -0
- package/src/verax/core/pipeline-tracker.js +238 -0
- package/src/verax/core/product-definition.js +127 -0
- package/src/verax/core/release/provenance.builder.js +271 -0
- package/src/verax/core/release/release-report-writer.js +40 -0
- package/src/verax/core/release/release.enforcer.js +159 -0
- package/src/verax/core/release/reproducibility.check.js +221 -0
- package/src/verax/core/release/sbom.builder.js +283 -0
- package/src/verax/core/replay-validator.js +4 -4
- package/src/verax/core/replay.js +1 -1
- package/src/verax/core/report/cross-index.js +192 -0
- package/src/verax/core/report/human-summary.js +222 -0
- package/src/verax/core/route-intelligence.js +419 -0
- package/src/verax/core/security/secrets.scan.js +326 -0
- package/src/verax/core/security/security-report.js +50 -0
- package/src/verax/core/security/security.enforcer.js +124 -0
- package/src/verax/core/security/supplychain.defaults.json +38 -0
- package/src/verax/core/security/supplychain.policy.js +326 -0
- package/src/verax/core/security/vuln.scan.js +265 -0
- package/src/verax/core/silence-impact.js +1 -1
- package/src/verax/core/silence-model.js +9 -7
- package/src/verax/core/truth/truth.certificate.js +250 -0
- package/src/verax/core/ui-feedback-intelligence.js +515 -0
- package/src/verax/detect/comparison.js +8 -3
- package/src/verax/detect/confidence-engine.js +645 -57
- package/src/verax/detect/confidence-helper.js +33 -0
- package/src/verax/detect/detection-engine.js +19 -2
- package/src/verax/detect/dynamic-route-findings.js +335 -0
- package/src/verax/detect/evidence-index.js +15 -65
- package/src/verax/detect/expectation-chain-detector.js +417 -0
- package/src/verax/detect/expectation-model.js +56 -3
- package/src/verax/detect/explanation-helpers.js +1 -1
- package/src/verax/detect/finding-detector.js +2 -2
- package/src/verax/detect/findings-writer.js +149 -20
- package/src/verax/detect/flow-detector.js +4 -4
- package/src/verax/detect/index.js +265 -15
- package/src/verax/detect/interactive-findings.js +3 -4
- package/src/verax/detect/journey-stall-detector.js +558 -0
- package/src/verax/detect/route-findings.js +218 -0
- package/src/verax/detect/signal-mapper.js +2 -2
- package/src/verax/detect/skip-classifier.js +4 -4
- package/src/verax/detect/ui-feedback-findings.js +207 -0
- package/src/verax/detect/verdict-engine.js +61 -9
- package/src/verax/detect/view-switch-correlator.js +242 -0
- package/src/verax/flow/flow-engine.js +3 -2
- package/src/verax/flow/flow-spec.js +1 -2
- package/src/verax/index.js +413 -33
- package/src/verax/intel/effect-detector.js +1 -1
- package/src/verax/intel/index.js +2 -2
- package/src/verax/intel/route-extractor.js +3 -3
- package/src/verax/intel/vue-navigation-extractor.js +81 -18
- package/src/verax/intel/vue-router-extractor.js +4 -2
- package/src/verax/learn/action-contract-extractor.js +684 -66
- package/src/verax/learn/ast-contract-extractor.js +53 -1
- package/src/verax/learn/index.js +36 -2
- package/src/verax/learn/manifest-writer.js +28 -14
- package/src/verax/learn/route-extractor.js +1 -1
- package/src/verax/learn/route-validator.js +12 -8
- package/src/verax/learn/state-extractor.js +1 -1
- package/src/verax/learn/static-extractor-navigation.js +1 -1
- package/src/verax/learn/static-extractor-validation.js +2 -2
- package/src/verax/learn/static-extractor.js +8 -7
- package/src/verax/learn/ts-contract-resolver.js +14 -12
- package/src/verax/observe/browser.js +22 -3
- package/src/verax/observe/console-sensor.js +2 -2
- package/src/verax/observe/expectation-executor.js +2 -1
- package/src/verax/observe/focus-sensor.js +1 -1
- package/src/verax/observe/human-driver.js +29 -10
- package/src/verax/observe/index.js +92 -844
- package/src/verax/observe/interaction-discovery.js +27 -15
- package/src/verax/observe/interaction-runner.js +31 -14
- package/src/verax/observe/loading-sensor.js +6 -0
- package/src/verax/observe/navigation-sensor.js +1 -1
- package/src/verax/observe/observe-context.js +205 -0
- package/src/verax/observe/observe-helpers.js +191 -0
- package/src/verax/observe/observe-runner.js +226 -0
- package/src/verax/observe/observers/budget-observer.js +185 -0
- package/src/verax/observe/observers/console-observer.js +102 -0
- package/src/verax/observe/observers/coverage-observer.js +107 -0
- package/src/verax/observe/observers/interaction-observer.js +471 -0
- package/src/verax/observe/observers/navigation-observer.js +132 -0
- package/src/verax/observe/observers/network-observer.js +87 -0
- package/src/verax/observe/observers/safety-observer.js +82 -0
- package/src/verax/observe/observers/ui-feedback-observer.js +99 -0
- package/src/verax/observe/settle.js +1 -0
- package/src/verax/observe/state-sensor.js +8 -4
- package/src/verax/observe/state-ui-sensor.js +7 -1
- package/src/verax/observe/traces-writer.js +27 -16
- package/src/verax/observe/ui-feedback-detector.js +742 -0
- package/src/verax/observe/ui-signal-sensor.js +155 -2
- package/src/verax/scan-summary-writer.js +46 -9
- package/src/verax/shared/artifact-manager.js +9 -6
- package/src/verax/shared/budget-profiles.js +2 -2
- package/src/verax/shared/caching.js +1 -1
- package/src/verax/shared/config-loader.js +1 -2
- package/src/verax/shared/css-spinner-rules.js +204 -0
- package/src/verax/shared/dynamic-route-utils.js +12 -6
- package/src/verax/shared/retry-policy.js +1 -6
- package/src/verax/shared/root-artifacts.js +1 -1
- package/src/verax/shared/view-switch-rules.js +208 -0
- package/src/verax/shared/zip-artifacts.js +1 -0
- package/src/verax/validate/context-validator.js +1 -1
- package/src/verax/observe/index.js.backup +0 -1
- package/src/verax/validate/context-validator.js.bak +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# 🛡️ VERAX
|
|
2
2
|
|
|
3
|
+
> **SOURCE CODE REQUIRED** — VERAX requires local access to source code. It is not a public website scanner. See [docs/README.md](docs/README.md) for the canonical product contract.
|
|
4
|
+
|
|
3
5
|
A forensic observation engine for real user outcomes
|
|
4
6
|
|
|
5
7
|
VERAX observes and reports gaps between what your code explicitly promises and what users can actually observe.
|
|
@@ -229,27 +231,21 @@ MEDIUM (60–79) — likely discrepancy with some ambiguity
|
|
|
229
231
|
|
|
230
232
|
LOW (<60) — weak or partial evidence; interpret cautiously
|
|
231
233
|
|
|
232
|
-
🧭
|
|
233
|
-
|
|
234
|
-
SaaS signup and pricing flows
|
|
235
|
-
|
|
236
|
-
React and Next.js projects
|
|
237
|
-
|
|
238
|
-
CI pipelines that need UX reality checks
|
|
239
|
-
|
|
240
|
-
Teams that value evidence over assumptions
|
|
241
|
-
|
|
242
|
-
🚫 When VERAX is NOT a good fit
|
|
243
|
-
|
|
244
|
-
Internal admin dashboards
|
|
245
|
-
|
|
246
|
-
Authentication-heavy systems
|
|
234
|
+
🧭 Supported use cases
|
|
247
235
|
|
|
248
|
-
|
|
236
|
+
- React, Next.js, or static HTML projects where you can provide local source code
|
|
237
|
+
- CI pipelines that can mount the repository so VERAX can analyze it
|
|
238
|
+
- Developer workstations that need evidence-backed silent failure detection
|
|
239
|
+
- Teams that value deterministic evidence over heuristics or AI guesses
|
|
240
|
+
- Demo projects in this repo (see [demos/](demos/))
|
|
249
241
|
|
|
250
|
-
|
|
242
|
+
🚫 Not supported
|
|
251
243
|
|
|
252
|
-
|
|
244
|
+
- URL-only scans without source code (fails fast with guidance)
|
|
245
|
+
- Production monitoring or hosted/public scanning
|
|
246
|
+
- Highly dynamic routing without static promises to analyze
|
|
247
|
+
- Closed-source third-party targets where code is unavailable
|
|
248
|
+
- Using VERAX as a drop-in QA replacement
|
|
253
249
|
|
|
254
250
|
🧪 Project status
|
|
255
251
|
|
package/bin/verax.js
CHANGED
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* VERAX CLI Shim
|
|
5
|
+
* PHASE 21.6.1: Verified entry point
|
|
5
6
|
* Delegates to src/cli/entry.js
|
|
7
|
+
*
|
|
8
|
+
* This file MUST be the only entry point for the verax CLI.
|
|
9
|
+
* package.json "bin" field points to this file.
|
|
6
10
|
*/
|
|
7
11
|
|
|
8
12
|
import('../src/cli/entry.js').catch((error) => {
|
|
9
13
|
console.error(`Failed to load CLI: ${error.message}`);
|
|
14
|
+
if (error.stack) {
|
|
15
|
+
console.error(error.stack);
|
|
16
|
+
}
|
|
10
17
|
process.exit(2);
|
|
11
18
|
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veraxhq/verax",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "VERAX - Silent failure detection for websites",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"verax": "
|
|
8
|
+
"verax": "bin/verax.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"bin/",
|
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
"LICENSE"
|
|
15
15
|
],
|
|
16
16
|
"scripts": {
|
|
17
|
-
"test": "node
|
|
18
|
-
"test:pack": "node scripts/test-pack.js"
|
|
17
|
+
"test": "node scripts/test-runner-wrapper.js",
|
|
18
|
+
"test:pack": "node scripts/test-pack.js",
|
|
19
|
+
"verify-release": "node scripts/verify-release.js",
|
|
20
|
+
"lint": "eslint . --max-warnings 0",
|
|
21
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
19
22
|
},
|
|
20
23
|
"dependencies": {
|
|
21
24
|
"glob": "^10.3.10",
|
|
@@ -30,6 +33,13 @@
|
|
|
30
33
|
"devDependencies": {
|
|
31
34
|
"@babel/parser": "^7.28.5",
|
|
32
35
|
"@babel/traverse": "^7.28.5",
|
|
33
|
-
"@
|
|
36
|
+
"@reduxjs/toolkit": "^2.11.2",
|
|
37
|
+
"@veraxhq/verax": "file:veraxhq-verax-0.3.0.tgz",
|
|
38
|
+
"eslint": "^8.57.0",
|
|
39
|
+
"next": "^16.1.1",
|
|
40
|
+
"react": "^19.2.3",
|
|
41
|
+
"react-dom": "^19.2.3",
|
|
42
|
+
"react-redux": "^9.2.0",
|
|
43
|
+
"react-router-dom": "^7.12.0"
|
|
34
44
|
}
|
|
35
45
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PHASE 21.11 — Baseline Command
|
|
3
|
+
*
|
|
4
|
+
* `verax baseline` - Shows baseline hash and drift status
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { loadBaselineSnapshot, buildBaselineSnapshot } from '../../verax/core/baseline/baseline.snapshot.js';
|
|
9
|
+
import { compareBaselines, isBaselineFrozen } from '../../verax/core/baseline/baseline.enforcer.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Baseline command
|
|
13
|
+
*
|
|
14
|
+
* @param {string} projectDir - Project directory
|
|
15
|
+
* @param {Object} options - Command options
|
|
16
|
+
*/
|
|
17
|
+
export async function baselineCommand(projectDir, options = {}) {
|
|
18
|
+
const { json = false } = options;
|
|
19
|
+
|
|
20
|
+
const frozen = loadBaselineSnapshot(projectDir);
|
|
21
|
+
const current = buildBaselineSnapshot(projectDir);
|
|
22
|
+
|
|
23
|
+
if (!frozen) {
|
|
24
|
+
if (json) {
|
|
25
|
+
console.log(JSON.stringify({
|
|
26
|
+
status: 'NO_BASELINE',
|
|
27
|
+
message: 'No baseline snapshot found (pre-GA)',
|
|
28
|
+
current: {
|
|
29
|
+
hash: current.baselineHash,
|
|
30
|
+
version: current.veraxVersion,
|
|
31
|
+
commit: current.gitCommit
|
|
32
|
+
}
|
|
33
|
+
}, null, 2));
|
|
34
|
+
} else {
|
|
35
|
+
console.log('\n=== Baseline Status ===\n');
|
|
36
|
+
console.log('Status: NO_BASELINE (pre-GA)');
|
|
37
|
+
console.log(`Current baseline hash: ${current.baselineHash}`);
|
|
38
|
+
console.log(`Version: ${current.veraxVersion}`);
|
|
39
|
+
console.log(`Commit: ${current.gitCommit}`);
|
|
40
|
+
console.log(`Dirty: ${current.gitDirty ? 'YES' : 'NO'}`);
|
|
41
|
+
console.log('\nNote: Baseline will be frozen when GA-READY is achieved.\n');
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const comparison = compareBaselines(current, frozen);
|
|
47
|
+
const frozenStatus = frozen.frozen ? 'FROZEN' : 'NOT_FROZEN';
|
|
48
|
+
|
|
49
|
+
if (json) {
|
|
50
|
+
console.log(JSON.stringify({
|
|
51
|
+
status: frozenStatus,
|
|
52
|
+
frozen: frozen.frozen,
|
|
53
|
+
drifted: comparison.drifted,
|
|
54
|
+
message: comparison.message,
|
|
55
|
+
frozenBaseline: {
|
|
56
|
+
hash: frozen.baselineHash,
|
|
57
|
+
version: frozen.veraxVersion,
|
|
58
|
+
commit: frozen.gitCommit,
|
|
59
|
+
timestamp: frozen.timestamp
|
|
60
|
+
},
|
|
61
|
+
currentBaseline: {
|
|
62
|
+
hash: current.baselineHash,
|
|
63
|
+
version: current.veraxVersion,
|
|
64
|
+
commit: current.gitCommit
|
|
65
|
+
},
|
|
66
|
+
differences: comparison.differences
|
|
67
|
+
}, null, 2));
|
|
68
|
+
} else {
|
|
69
|
+
console.log('\n=== Baseline Status ===\n');
|
|
70
|
+
console.log(`Status: ${frozenStatus}`);
|
|
71
|
+
console.log(`Frozen: ${frozen.frozen ? 'YES' : 'NO'}`);
|
|
72
|
+
console.log(`Drifted: ${comparison.drifted ? 'YES' : 'NO'}`);
|
|
73
|
+
console.log(`\nMessage: ${comparison.message}`);
|
|
74
|
+
|
|
75
|
+
console.log('\nFrozen Baseline:');
|
|
76
|
+
console.log(` Hash: ${frozen.baselineHash}`);
|
|
77
|
+
console.log(` Version: ${frozen.veraxVersion}`);
|
|
78
|
+
console.log(` Commit: ${frozen.gitCommit}`);
|
|
79
|
+
console.log(` Timestamp: ${frozen.timestamp}`);
|
|
80
|
+
|
|
81
|
+
console.log('\nCurrent Baseline:');
|
|
82
|
+
console.log(` Hash: ${current.baselineHash}`);
|
|
83
|
+
console.log(` Version: ${current.veraxVersion}`);
|
|
84
|
+
console.log(` Commit: ${current.gitCommit}`);
|
|
85
|
+
console.log(` Dirty: ${current.gitDirty ? 'YES' : 'NO'}`);
|
|
86
|
+
|
|
87
|
+
if (comparison.drifted) {
|
|
88
|
+
console.log('\n⚠️ BASELINE DRIFT DETECTED:');
|
|
89
|
+
for (const diff of comparison.differences) {
|
|
90
|
+
console.log(` - ${diff.message}`);
|
|
91
|
+
if (diff.component) {
|
|
92
|
+
console.log(` Component: ${diff.component}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log('\n⚠️ Changes to core contracts/policies after GA require:');
|
|
96
|
+
console.log(' 1. MAJOR version bump');
|
|
97
|
+
console.log(' 2. Baseline regeneration');
|
|
98
|
+
console.log(' 3. GA re-evaluation\n');
|
|
99
|
+
} else {
|
|
100
|
+
console.log('\n✓ Baseline integrity maintained\n');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|