progmune-runtime 2.1.6 → 3.2.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 +108 -468
- package/dist/ablation-study.js +144 -0
- package/dist/ablation-study.test.js +18 -0
- package/dist/action-runtime.js +3 -1
- package/dist/active-learning.js +211 -0
- package/dist/analytics.js +139 -0
- package/dist/asset-factory.js +309 -0
- package/dist/asset-growth.js +244 -0
- package/dist/asset-promotion.js +382 -0
- package/dist/asset-quality.js +550 -0
- package/dist/audit/business-translator.js +285 -0
- package/dist/audit/cli.js +66 -0
- package/dist/audit/formatters/html.js +379 -0
- package/dist/audit/formatters/json.js +11 -0
- package/dist/audit/formatters/markdown.js +192 -0
- package/dist/audit/formatters/terminal.js +189 -0
- package/dist/audit/index.js +25 -0
- package/dist/audit/report-builder.js +318 -0
- package/dist/audit/types.js +8 -0
- package/dist/audit.js +3 -3
- package/dist/auto-benchmark-generator.js +137 -0
- package/dist/auto-benchmark-generator.test.js +45 -0
- package/dist/auto-protocol-synthesizer.js +362 -0
- package/dist/auto-protocol-synthesizer.test.js +82 -0
- package/dist/autonomous-patch.js +175 -0
- package/dist/autonomous-patch.test.js +128 -0
- package/dist/badge/badge-server.js +98 -0
- package/dist/behavior-miner.js +442 -0
- package/dist/belief-layer.js +475 -0
- package/dist/benchmark-count.js +5 -0
- package/dist/benchmark-generator.js +211 -0
- package/dist/benchmark-harness.js +201 -0
- package/dist/benchmark-pass-rate.js +7 -0
- package/dist/benchmark-report.js +8 -3
- package/dist/benchmark-save.js +14 -1
- package/dist/bootstrap-validation.js +197 -0
- package/dist/bootstrap-validation.test.js +51 -0
- package/dist/branch-ledger.js +1 -1
- package/dist/capability-gap.js +130 -0
- package/dist/certify-html.js +351 -0
- package/dist/certify.js +326 -0
- package/dist/check.js +4 -4
- package/dist/compliance-miner.js +447 -0
- package/dist/continuous-benchmark.js +194 -0
- package/dist/continuous-benchmark.test.js +116 -0
- package/dist/corpus-stats.js +173 -0
- package/dist/counterfactual-engine.js +288 -0
- package/dist/coverage-dashboard.js +109 -0
- package/dist/coverage-system.test.js +205 -0
- package/dist/cross-repo-precision.js +352 -0
- package/dist/cve-benchmark.js +180 -0
- package/dist/cve-benchmark.test.js +28 -0
- package/dist/cve-collector.js +73 -0
- package/dist/data-quality.js +141 -0
- package/dist/decision-engine.js +388 -0
- package/dist/derive-metadata.js +250 -0
- package/dist/difficulty-active.test.js +198 -0
- package/dist/difficulty-map.js +244 -0
- package/dist/discovery-analytics.js +125 -0
- package/dist/discovery-model.js +149 -0
- package/dist/discovery-optimize.test.js +199 -0
- package/dist/discovery-trace.js +276 -0
- package/dist/discovery-trace.test.js +97 -0
- package/dist/emitter.js +83 -1
- package/dist/enterprise-dashboard.js +405 -0
- package/dist/eval-hardening.js +297 -0
- package/dist/eval-hardening.test.js +85 -0
- package/dist/evaluation-campaign.js +359 -0
- package/dist/evaluation-campaign.test.js +181 -0
- package/dist/evidence-growth.js +143 -0
- package/dist/evidence-repository.js +209 -0
- package/dist/evidence-system.js +441 -0
- package/dist/execute.js +15 -7
- package/dist/experimental/software-physics.js +291 -0
- package/dist/experimental/state-inference.js +516 -0
- package/dist/experimental/unsupervised-physics.js +230 -0
- package/dist/extract-ir-python.js +54 -7
- package/dist/extract-ir.js +376 -12
- package/dist/failure-collector.js +2 -2
- package/dist/failure-corpus.js +322 -9
- package/dist/feedback.js +16 -5
- package/dist/feedback.test.js +49 -0
- package/dist/file-lock.js +1 -1
- package/dist/flywheel-batch.js +292 -0
- package/dist/frameworks/express-cli.js +237 -0
- package/dist/frameworks/express-detector.js +445 -0
- package/dist/frameworks/express-detector.test.js +206 -0
- package/dist/frameworks/index.js +30 -0
- package/dist/frameworks/nestjs-detector.js +302 -0
- package/dist/frameworks/trpc-detector.js +161 -0
- package/dist/frameworks/version-awareness.js +179 -0
- package/dist/function-synonyms.js +164 -0
- package/dist/function-synonyms.test.js +68 -0
- package/dist/generalization.test.js +352 -0
- package/dist/goal-annotator.js +113 -0
- package/dist/goal-planner.js +563 -0
- package/dist/gold-cve.js +164 -0
- package/dist/gold-cve.test.js +104 -0
- package/dist/gold-quality.js +206 -0
- package/dist/gold-tiers.js +241 -0
- package/dist/governance-dashboard.js +327 -0
- package/dist/graph-viz.js +240 -0
- package/dist/guided-frontier.js +195 -0
- package/dist/hierarchical-planner.js +148 -0
- package/dist/identifier-parser.js +260 -0
- package/dist/immune-metrics.js +93 -0
- package/dist/immune-receiver.js +158 -0
- package/dist/immune-reporter.js +1 -1
- package/dist/improvement-orchestrator.js +206 -0
- package/dist/inject-p0-vocabulary.js +300 -0
- package/dist/intent-parser.js +218 -0
- package/dist/invariant-algebra.js +476 -0
- package/dist/invariant-calculus.js +533 -0
- package/dist/ir-utils.js +70 -0
- package/dist/ir-utils.test.js +50 -0
- package/dist/knowledge-api.js +312 -0
- package/dist/knowledge-evolution.js +452 -0
- package/dist/knowledge-explorer.js +506 -0
- package/dist/knowledge-flywheel.js +274 -0
- package/dist/knowledge-governance.js +338 -0
- package/dist/knowledge-governance.test.js +150 -0
- package/dist/knowledge-graph.js +181 -0
- package/dist/knowledge-guided-synth.js +246 -0
- package/dist/knowledge-loop.test.js +77 -0
- package/dist/knowledge-object.js +316 -0
- package/dist/knowledge-package.js +98 -0
- package/dist/kpi-dashboard.js +561 -0
- package/dist/l3-cross-function.js +280 -0
- package/dist/learning-ranker.js +148 -0
- package/dist/learning-ranker.test.js +291 -0
- package/dist/ledger/accountability.js +322 -0
- package/dist/ledger/chain-builder.js +185 -0
- package/dist/ledger/cli.js +222 -0
- package/dist/ledger/index.js +13 -0
- package/dist/ledger/signatures.js +193 -0
- package/dist/ledger/types.js +9 -0
- package/dist/llm.js +74 -3
- package/dist/load-benchmarks.js +8 -3
- package/dist/logger.js +66 -0
- package/dist/logger.test.js +37 -0
- package/dist/logistic-reward.js +339 -0
- package/dist/logistic-reward.test.js +180 -0
- package/dist/macro-graph.js +193 -0
- package/dist/macro-repair.js +183 -0
- package/dist/mcp-server.mjs +1202 -483
- package/dist/memory-layer.js +42 -5
- package/dist/multi-repo-precision.js +422 -0
- package/dist/name-free-protocol.js +425 -0
- package/dist/name-free-protocol.test.js +170 -0
- package/dist/name-scrambling.js +138 -0
- package/dist/name-scrambling.test.js +16 -0
- package/dist/p3-observability.test.js +281 -0
- package/dist/p5-orchestrator.test.js +225 -0
- package/dist/pairwise-preference.js +294 -0
- package/dist/pairwise-preference.test.js +140 -0
- package/dist/planner-constraints.js +104 -0
- package/dist/planner-prompts.js +155 -0
- package/dist/planner-telemetry.js +415 -0
- package/dist/planner-trace.js +214 -0
- package/dist/planner.js +162 -167
- package/dist/plsb/artifact.js +116 -0
- package/dist/plsb/cli.js +71 -0
- package/dist/plsb/index.js +19 -0
- package/dist/plsb/leaderboard.js +249 -0
- package/dist/plsb/report-md.js +156 -0
- package/dist/plsb/schema.js +179 -0
- package/dist/plsb-benchmark.js +284 -0
- package/dist/plsb-benchmark.test.js +119 -0
- package/dist/policy/cli.js +134 -0
- package/dist/policy/engine.js +333 -0
- package/dist/policy/index.js +12 -0
- package/dist/policy/types.js +59 -0
- package/dist/policy-miner.js +505 -0
- package/dist/precision-analyze.js +229 -0
- package/dist/precision-benchmark.js +147 -0
- package/dist/precision-label-c.js +134 -0
- package/dist/precision-label.js +193 -0
- package/dist/precision-report-c.js +149 -0
- package/dist/precision-report.js +246 -0
- package/dist/progmune-status.js +108 -0
- package/dist/proof-engine.js +479 -0
- package/dist/proof-provenance.js +315 -0
- package/dist/protocol-coverage.js +294 -0
- package/dist/protocol-detector.js +1189 -0
- package/dist/protocol-embedding-expanded.js +297 -0
- package/dist/protocol-embedding-expanded.test.js +97 -0
- package/dist/protocol-embedding.js +195 -0
- package/dist/protocol-embedding.test.js +82 -0
- package/dist/protocol-extractor-v2.js +354 -0
- package/dist/protocol-extractor-v2.test.js +140 -0
- package/dist/protocol-extractor.js +310 -0
- package/dist/protocol-extractor.test.js +113 -0
- package/dist/protocol-foundation.js +322 -0
- package/dist/protocol-foundation.test.js +163 -0
- package/dist/protocol-frontier.js +243 -0
- package/dist/protocol-frontier.test.js +92 -0
- package/dist/protocol-gap-analyzer.js +228 -0
- package/dist/protocol-gap-analyzer.test.js +49 -0
- package/dist/protocol-invariants.js +276 -0
- package/dist/protocol-invariants.test.js +111 -0
- package/dist/protocol-knowledge.js +464 -0
- package/dist/protocol-miner.js +343 -0
- package/dist/protocol-mining.js +207 -0
- package/dist/protocol-mining.test.js +37 -0
- package/dist/protocol-registry.js +1 -1
- package/dist/protocol-security-benchmark.js +222 -0
- package/dist/protocol-vulnerability.js +257 -0
- package/dist/protocol-vulnerability.test.js +60 -0
- package/dist/python-benchmark.js +120 -0
- package/dist/python-emitter.js +163 -45
- package/dist/python-protocol-extractor.js +187 -0
- package/dist/python-protocol-extractor.test.js +116 -0
- package/dist/realworld-benchmark.js +646 -0
- package/dist/realworld-benchmark.test.js +36 -0
- package/dist/repair-arch.test.js +411 -0
- package/dist/repair-evolution.test.js +454 -0
- package/dist/repair-executor.js +719 -0
- package/dist/repair-proposal.js +4 -4
- package/dist/repair-ranker.js +141 -0
- package/dist/repair-strategies.js +419 -0
- package/dist/repair-taxonomy.js +234 -0
- package/dist/repair-types.js +12 -0
- package/dist/repo-evaluator.js +250 -0
- package/dist/repo-evaluator.test.js +128 -0
- package/dist/resource-abstraction.js +242 -0
- package/dist/resource-detector.js +211 -0
- package/dist/result.test.js +43 -0
- package/dist/reward-system.js +411 -0
- package/dist/reward-system.test.js +175 -0
- package/dist/risk-model.js +215 -0
- package/dist/rule-miner.js +234 -7
- package/dist/rule-specificity.js +254 -0
- package/dist/runtime-types.js +27 -0
- package/dist/scaffold.js +208 -0
- package/dist/scale-collector.test.js +101 -0
- package/dist/scale-trajectory-collector.js +128 -0
- package/dist/sdk.js +250 -0
- package/dist/search-planner.js +4 -41
- package/dist/semantic-snapshot.js +1 -1
- package/dist/semantic-topology.js +121 -0
- package/dist/semantic-trace.js +310 -317
- package/dist/sequence-extractor.js +343 -0
- package/dist/skill-library.js +245 -0
- package/dist/skill-planner.test.js +189 -0
- package/dist/software-physics.js +291 -0
- package/dist/software-physics.test.js +81 -0
- package/dist/ssg-precision.js +478 -0
- package/dist/ssg-validator.js +71 -21
- package/dist/state-inference-doubleblind.test.js +160 -0
- package/dist/state-inference.js +516 -0
- package/dist/state-inference.test.js +115 -0
- package/dist/state-machine-fingerprint.js +345 -0
- package/dist/state-machine-fingerprint.test.js +120 -0
- package/dist/state-miner.js +386 -0
- package/dist/state-name-inference.js +213 -0
- package/dist/state-name-inference.test.js +69 -0
- package/dist/strategy-planner.js +262 -96
- package/dist/strategy-planner.test.js +135 -0
- package/dist/telemetry-analytics.test.js +402 -0
- package/dist/terminal-format.js +68 -0
- package/dist/terminal-format.test.js +83 -0
- package/dist/topology-factory.js +196 -0
- package/dist/topology-representation.js +242 -0
- package/dist/topology-representation.test.js +27 -0
- package/dist/trajectory-augmentation.js +254 -0
- package/dist/trajectory-augmentation.test.js +63 -0
- package/dist/trajectory-corpus.js +440 -0
- package/dist/trajectory-corpus.test.js +32 -0
- package/dist/trajectory-feedback.test.js +116 -0
- package/dist/transition-synthesizer.js +286 -0
- package/dist/transition-synthesizer.test.js +123 -0
- package/dist/trust/api-semantic-mapper.js +809 -0
- package/dist/trust/call-graph-propagator.js +225 -0
- package/dist/trust/cli.js +122 -0
- package/dist/trust/compliance-scorer.js +283 -0
- package/dist/trust/confidence-calculator.js +261 -0
- package/dist/trust/engine.js +1145 -0
- package/dist/trust/explainability.js +85 -0
- package/dist/trust/formatters/ci.js +42 -0
- package/dist/trust/formatters/json.js +11 -0
- package/dist/trust/formatters/terminal.js +152 -0
- package/dist/trust/index.js +39 -0
- package/dist/trust/phase1-verify.js +171 -0
- package/dist/trust/protocol-domain-validator.js +697 -0
- package/dist/trust/score-calculator.js +282 -0
- package/dist/trust/ssg-bridge.js +641 -0
- package/dist/trust/ssg-bridge.test.js +269 -0
- package/dist/trust/types.js +67 -0
- package/dist/trust/violation-trace.js +335 -0
- package/dist/trust-api.js +179 -0
- package/dist/trust-calibration.js +279 -0
- package/dist/unknown-protocol-discovery.js +339 -0
- package/dist/unknown-protocol-discovery.test.js +102 -0
- package/dist/unsupervised-physics.js +230 -0
- package/dist/unsupervised-physics.test.js +95 -0
- package/dist/utils.test.js +37 -0
- package/dist/validator.js +187 -10
- package/dist/verification-intelligence.js +475 -0
- package/dist/verify-api.js +432 -0
- package/dist/vi-impact-report.js +293 -0
- package/dist/wl-fingerprint.js +162 -0
- package/dist/wl-fingerprint.test.js +130 -0
- package/dist/zeroshot-strategy.js +139 -0
- package/docs/Progmune_/346/212/225/350/265/204/344/272/272/347/231/275/347/232/256/344/271/246_v2.0.html +576 -0
- package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
- package/package.json +74 -7
- package/protocols.json +1956 -50
- package/.dockerignore +0 -14
- package/.mcp.json +0 -11
- package/.progmune_allowlist +0 -50
- package/.test_report/test_report.md +0 -87
- package/Dockerfile +0 -9
- package/FAQ.md +0 -167
- package/WHITEPAPER.md +0 -540
- package/demo-project/auth.ts +0 -55
- package/demo-project/tsconfig.json +0 -8
- package/dist/acl-breakdown.js +0 -13
- package/dist/all-sessions.js +0 -11
- package/dist/antibody-stats.js +0 -11
- package/dist/branch-tree-count.js +0 -14
- package/dist/common-fixpath.js +0 -12
- package/dist/constraint-types.js +0 -12
- package/dist/exec-metrics.js +0 -11
- package/dist/failure-report.js +0 -11
- package/dist/fast-path-hits.js +0 -13
- package/dist/fingerprint-list.js +0 -15
- package/dist/gen-history-log.js +0 -13
- package/dist/heatmap-data.js +0 -11
- package/dist/recent-session.js +0 -12
- package/dist/svl-distribution.js +0 -11
- package/dist/terminal-status.js +0 -11
- package/dist/token-savings.js +0 -11
- package/dist/total-repairs.js +0 -12
- package/dist/unresolved-count.js +0 -12
- package/dist/valid-fingerprints.js +0 -13
- package/dist/verify-ledgers.js +0 -11
- package/docs/whitepaper-style.css +0 -77
- package/docs/whitepaper-v2.1.md +0 -609
- package/docs/whitepaper-v2.2.md +0 -1064
- package/docs/whitepaper-v2.2.pdf +0 -0
- package/fly.toml +0 -31
- package/public/dashboard.html +0 -119
- package/server/hub.js +0 -116
- package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
- package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
- package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
- package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
- package/test/replay-golden.ts +0 -84
- package/test_benchmark.js +0 -165
- package/test_comprehensive.mjs +0 -638
- package/test_concurrency.js +0 -129
- package/test_ir_robustness.js +0 -85
- package/test_semantic_contracts.js +0 -269
- package/test_ssg_stress.js +0 -156
- package/test_svl3.js +0 -58
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 1: Trust Score Calculator
|
|
4
|
+
*
|
|
5
|
+
* Pure functions implementing the weighted scoring formulas,
|
|
6
|
+
* decision mapping, and confidence determination from the
|
|
7
|
+
* AI Trust Decision Model v1 design doc.
|
|
8
|
+
*
|
|
9
|
+
* All functions are PURE — no side effects, no I/O.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.scorePolicyCompliance = scorePolicyCompliance;
|
|
13
|
+
exports.scoreProtocolSafety = scoreProtocolSafety;
|
|
14
|
+
exports.scoreVerificationCoverage = scoreVerificationCoverage;
|
|
15
|
+
exports.scoreGovernanceIntegrity = scoreGovernanceIntegrity;
|
|
16
|
+
exports.calculateOverallScore = calculateOverallScore;
|
|
17
|
+
exports.determineDecision = determineDecision;
|
|
18
|
+
exports.determineConfidence = determineConfidence;
|
|
19
|
+
exports.countViolationsBySeverity = countViolationsBySeverity;
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
// ═══════════════════════════════════════════════
|
|
22
|
+
// 1. Policy Compliance (35%)
|
|
23
|
+
// ═══════════════════════════════════════════════
|
|
24
|
+
/**
|
|
25
|
+
* Score = max(0, 100 - sum of severity deductions)
|
|
26
|
+
*
|
|
27
|
+
* Critical violation forces score ≤ DECISION_THRESHOLDS.criticalLock (59).
|
|
28
|
+
*/
|
|
29
|
+
function scorePolicyCompliance(violations, deductions) {
|
|
30
|
+
const weights = deductions || types_1.DEFAULT_SEVERITY_DEDUCTIONS;
|
|
31
|
+
let totalDeduction = 0;
|
|
32
|
+
let hasCritical = false;
|
|
33
|
+
for (const v of violations) {
|
|
34
|
+
if (v.severity === "critical") {
|
|
35
|
+
hasCritical = true;
|
|
36
|
+
}
|
|
37
|
+
totalDeduction += weights[v.severity] || 0;
|
|
38
|
+
}
|
|
39
|
+
let score = Math.max(0, 100 - totalDeduction);
|
|
40
|
+
// Hard gate: critical → lock to ≤ 59
|
|
41
|
+
if (hasCritical) {
|
|
42
|
+
score = Math.min(score, types_1.DECISION_THRESHOLDS.criticalLock);
|
|
43
|
+
}
|
|
44
|
+
return { score, hasCritical };
|
|
45
|
+
}
|
|
46
|
+
// ═══════════════════════════════════════════════
|
|
47
|
+
// 2. Protocol Safety (30%)
|
|
48
|
+
// ═══════════════════════════════════════════════
|
|
49
|
+
/**
|
|
50
|
+
* Each protocol is scored internally by severity (same deduction logic).
|
|
51
|
+
* Final score = weighted average across protocols.
|
|
52
|
+
*/
|
|
53
|
+
function scoreProtocolSafety(violations, protocolWeights) {
|
|
54
|
+
const weights = protocolWeights || types_1.DEFAULT_PROTOCOL_WEIGHTS;
|
|
55
|
+
const protocolNames = Object.keys(weights);
|
|
56
|
+
// Group violations by protocol category (rule_id prefix before "_")
|
|
57
|
+
const byProtocol = {};
|
|
58
|
+
for (const v of violations) {
|
|
59
|
+
const protocol = extractProtocol(v);
|
|
60
|
+
if (!byProtocol[protocol])
|
|
61
|
+
byProtocol[protocol] = [];
|
|
62
|
+
byProtocol[protocol].push(v);
|
|
63
|
+
}
|
|
64
|
+
// Score each protocol
|
|
65
|
+
const details = {};
|
|
66
|
+
for (const name of protocolNames) {
|
|
67
|
+
const protViolations = byProtocol[name] || [];
|
|
68
|
+
const { score: rawScore } = scorePolicyCompliance(protViolations);
|
|
69
|
+
details[name] = {
|
|
70
|
+
score: rawScore,
|
|
71
|
+
violations: protViolations.length,
|
|
72
|
+
weight: weights[name] || 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Weighted average: Σ(score × weight) / Σ(weight)
|
|
76
|
+
let weightedSum = 0;
|
|
77
|
+
let totalWeight = 0;
|
|
78
|
+
for (const [name, detail] of Object.entries(details)) {
|
|
79
|
+
weightedSum += detail.score * detail.weight;
|
|
80
|
+
totalWeight += detail.weight;
|
|
81
|
+
}
|
|
82
|
+
const score = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : 100;
|
|
83
|
+
// Determine confidence for this dimension
|
|
84
|
+
// A protocol is considered "checked" if it was evaluated (score < 100 found issues,
|
|
85
|
+
// or score = 100 with no violations means we checked and it passed clean)
|
|
86
|
+
const protocolsChecked = Object.values(details).filter((d) => d.score <= 100 // all protocols are always evaluated
|
|
87
|
+
).length;
|
|
88
|
+
const confidenceRatio = protocolNames.length > 0
|
|
89
|
+
? Math.min(1, protocolsChecked / protocolNames.length)
|
|
90
|
+
: 1;
|
|
91
|
+
const confidence = mapDimensionConfidence(confidenceRatio);
|
|
92
|
+
// Collect only protocol-related violations for evidence
|
|
93
|
+
const protocolViolations = violations.filter((v) => protocolNames.includes(extractProtocol(v)));
|
|
94
|
+
return {
|
|
95
|
+
score,
|
|
96
|
+
weight: types_1.DEFAULT_DIMENSION_WEIGHTS.protocolSafety,
|
|
97
|
+
confidence,
|
|
98
|
+
details,
|
|
99
|
+
violations: protocolViolations,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Extract protocol category from a violation's rule_id.
|
|
104
|
+
* Rules: "AUTH_*" → authentication, "AUTHZ_*" → authorization,
|
|
105
|
+
* "PAY_*" → payment, "DATA_*" → data_integrity,
|
|
106
|
+
* "LEDGER_*" → ledger
|
|
107
|
+
* Falls back to "authentication" as default.
|
|
108
|
+
*/
|
|
109
|
+
function extractProtocol(v) {
|
|
110
|
+
const prefix = v.rule_id.split("_")[0]?.toLowerCase() || "";
|
|
111
|
+
const mapping = {
|
|
112
|
+
auth: "authentication",
|
|
113
|
+
authz: "authorization",
|
|
114
|
+
pay: "payment",
|
|
115
|
+
data: "data_integrity",
|
|
116
|
+
ledger: "ledger",
|
|
117
|
+
txn: "payment",
|
|
118
|
+
integrity: "data_integrity",
|
|
119
|
+
};
|
|
120
|
+
return mapping[prefix] || "authentication";
|
|
121
|
+
}
|
|
122
|
+
// ═══════════════════════════════════════════════
|
|
123
|
+
// 3. Verification Coverage (20%)
|
|
124
|
+
// ═══════════════════════════════════════════════
|
|
125
|
+
/**
|
|
126
|
+
* Score = sum of sub-scores (max 100).
|
|
127
|
+
* Each sub-check has a max score defined in DEFAULT_COVERAGE_MAX_SCORES.
|
|
128
|
+
*/
|
|
129
|
+
function scoreVerificationCoverage(data) {
|
|
130
|
+
const maxScores = types_1.DEFAULT_COVERAGE_MAX_SCORES;
|
|
131
|
+
const details = {};
|
|
132
|
+
let totalScore = 0;
|
|
133
|
+
let hasData = 0;
|
|
134
|
+
let totalChecks = 0;
|
|
135
|
+
for (const [name, max] of Object.entries(maxScores)) {
|
|
136
|
+
const value = data[name];
|
|
137
|
+
totalChecks++;
|
|
138
|
+
if (value !== undefined && !Number.isNaN(value)) {
|
|
139
|
+
hasData++;
|
|
140
|
+
const capped = Math.min(value, max);
|
|
141
|
+
details[name] = { score: capped, max };
|
|
142
|
+
totalScore += capped;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Data unavailable → 0 for this sub-check
|
|
146
|
+
details[name] = { score: 0, max };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const confidenceRatio = totalChecks > 0 ? hasData / totalChecks : 0;
|
|
150
|
+
const confidence = mapDimensionConfidence(confidenceRatio);
|
|
151
|
+
return {
|
|
152
|
+
score: Math.min(totalScore, 100),
|
|
153
|
+
weight: types_1.DEFAULT_DIMENSION_WEIGHTS.verificationCoverage,
|
|
154
|
+
confidence,
|
|
155
|
+
details,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Score = 100 - sum of defect deductions.
|
|
160
|
+
*/
|
|
161
|
+
function scoreGovernanceIntegrity(defects, deductions) {
|
|
162
|
+
const weights = deductions || types_1.DEFAULT_GOVERNANCE_DEDUCTIONS;
|
|
163
|
+
let totalDeduction = 0;
|
|
164
|
+
for (const d of defects) {
|
|
165
|
+
totalDeduction += weights[d.type] || 0;
|
|
166
|
+
}
|
|
167
|
+
const score = Math.max(0, 100 - totalDeduction);
|
|
168
|
+
return {
|
|
169
|
+
score,
|
|
170
|
+
weight: types_1.DEFAULT_DIMENSION_WEIGHTS.governanceIntegrity,
|
|
171
|
+
confidence: "HIGH", // Governance data is always available from ledger
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Overall = Σ(score × weight) for all active dimensions.
|
|
176
|
+
* Only dimensions with weight > 0 are included.
|
|
177
|
+
*/
|
|
178
|
+
function calculateOverallScore(dimensions) {
|
|
179
|
+
let weightedSum = 0;
|
|
180
|
+
let totalWeight = 0;
|
|
181
|
+
for (const d of dimensions) {
|
|
182
|
+
const safeScore = Number.isNaN(d.score) ? 0 : d.score;
|
|
183
|
+
weightedSum += safeScore * d.weight;
|
|
184
|
+
totalWeight += d.weight;
|
|
185
|
+
}
|
|
186
|
+
if (totalWeight <= 0)
|
|
187
|
+
return 0;
|
|
188
|
+
const result = Math.round(weightedSum / totalWeight);
|
|
189
|
+
return Number.isNaN(result) ? 0 : result;
|
|
190
|
+
}
|
|
191
|
+
// ═══════════════════════════════════════════════
|
|
192
|
+
// 6. Decision Mapping
|
|
193
|
+
// ═══════════════════════════════════════════════
|
|
194
|
+
/**
|
|
195
|
+
* Maps score + gates → APPROVED / NEEDS_REVIEW / BLOCKED.
|
|
196
|
+
*
|
|
197
|
+
* Rules:
|
|
198
|
+
* - Critical violation → BLOCKED (overrides score)
|
|
199
|
+
* - Score < 60 → BLOCKED
|
|
200
|
+
* - 60 ≤ Score < 80 → NEEDS_REVIEW
|
|
201
|
+
* - Score ≥ 80 → APPROVED
|
|
202
|
+
* - Explainability UNCERTAIN → degrade one level
|
|
203
|
+
*/
|
|
204
|
+
function determineDecision(overallScore, hasCriticalViolation, explainabilityStatus) {
|
|
205
|
+
// Hard gate: critical = BLOCKED regardless of score
|
|
206
|
+
if (hasCriticalViolation) {
|
|
207
|
+
return "BLOCKED";
|
|
208
|
+
}
|
|
209
|
+
// Base decision from score
|
|
210
|
+
let decision;
|
|
211
|
+
if (overallScore >= types_1.DECISION_THRESHOLDS.approved) {
|
|
212
|
+
decision = "APPROVED";
|
|
213
|
+
}
|
|
214
|
+
else if (overallScore >= types_1.DECISION_THRESHOLDS.needsReview) {
|
|
215
|
+
decision = "NEEDS_REVIEW";
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
decision = "BLOCKED";
|
|
219
|
+
}
|
|
220
|
+
// Explainability degrade: drop one level
|
|
221
|
+
if (explainabilityStatus === "UNCERTAIN") {
|
|
222
|
+
if (decision === "APPROVED")
|
|
223
|
+
return "NEEDS_REVIEW";
|
|
224
|
+
if (decision === "NEEDS_REVIEW")
|
|
225
|
+
return "BLOCKED";
|
|
226
|
+
// Already BLOCKED, stays BLOCKED
|
|
227
|
+
}
|
|
228
|
+
return decision;
|
|
229
|
+
}
|
|
230
|
+
// ═══════════════════════════════════════════════
|
|
231
|
+
// 7. Confidence Determination
|
|
232
|
+
// ═══════════════════════════════════════════════
|
|
233
|
+
/**
|
|
234
|
+
* Maps dimension confidence levels → Overall Confidence.
|
|
235
|
+
*
|
|
236
|
+
* Rules:
|
|
237
|
+
* - Explainability UNCERTAIN → overall UNCERTAIN
|
|
238
|
+
* - Any dimension LOW → overall LOW
|
|
239
|
+
* - 2+ dimensions MEDIUM → overall MEDIUM
|
|
240
|
+
* - All HIGH → overall HIGH
|
|
241
|
+
*/
|
|
242
|
+
function determineConfidence(dimConfidences, explainabilityStatus) {
|
|
243
|
+
// Explainability gate overrides everything
|
|
244
|
+
if (explainabilityStatus === "UNCERTAIN") {
|
|
245
|
+
return "UNCERTAIN";
|
|
246
|
+
}
|
|
247
|
+
const lowCount = dimConfidences.filter((c) => c === "LOW").length;
|
|
248
|
+
const mediumCount = dimConfidences.filter((c) => c === "MEDIUM").length;
|
|
249
|
+
if (lowCount > 0)
|
|
250
|
+
return "LOW";
|
|
251
|
+
if (mediumCount >= 2)
|
|
252
|
+
return "MEDIUM";
|
|
253
|
+
if (mediumCount === 1)
|
|
254
|
+
return "MEDIUM"; // Even one medium drags confidence
|
|
255
|
+
return "HIGH";
|
|
256
|
+
}
|
|
257
|
+
// ═══════════════════════════════════════════════
|
|
258
|
+
// Helpers
|
|
259
|
+
// ═══════════════════════════════════════════════
|
|
260
|
+
/**
|
|
261
|
+
* Map a 0-1 ratio to a dimension-level confidence.
|
|
262
|
+
* ≥ 0.8 → HIGH, 0.6-0.8 → MEDIUM, < 0.6 → LOW
|
|
263
|
+
*/
|
|
264
|
+
function mapDimensionConfidence(ratio) {
|
|
265
|
+
if (ratio >= 0.8)
|
|
266
|
+
return "HIGH";
|
|
267
|
+
if (ratio >= 0.6)
|
|
268
|
+
return "MEDIUM";
|
|
269
|
+
return "LOW";
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Count violations by severity.
|
|
273
|
+
*/
|
|
274
|
+
function countViolationsBySeverity(violations) {
|
|
275
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0, total: violations.length };
|
|
276
|
+
for (const v of violations) {
|
|
277
|
+
if (v.severity in counts) {
|
|
278
|
+
counts[v.severity]++;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return counts;
|
|
282
|
+
}
|