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.
Files changed (356) hide show
  1. package/README.md +108 -468
  2. package/dist/ablation-study.js +144 -0
  3. package/dist/ablation-study.test.js +18 -0
  4. package/dist/action-runtime.js +3 -1
  5. package/dist/active-learning.js +211 -0
  6. package/dist/analytics.js +139 -0
  7. package/dist/asset-factory.js +309 -0
  8. package/dist/asset-growth.js +244 -0
  9. package/dist/asset-promotion.js +382 -0
  10. package/dist/asset-quality.js +550 -0
  11. package/dist/audit/business-translator.js +285 -0
  12. package/dist/audit/cli.js +66 -0
  13. package/dist/audit/formatters/html.js +379 -0
  14. package/dist/audit/formatters/json.js +11 -0
  15. package/dist/audit/formatters/markdown.js +192 -0
  16. package/dist/audit/formatters/terminal.js +189 -0
  17. package/dist/audit/index.js +25 -0
  18. package/dist/audit/report-builder.js +318 -0
  19. package/dist/audit/types.js +8 -0
  20. package/dist/audit.js +3 -3
  21. package/dist/auto-benchmark-generator.js +137 -0
  22. package/dist/auto-benchmark-generator.test.js +45 -0
  23. package/dist/auto-protocol-synthesizer.js +362 -0
  24. package/dist/auto-protocol-synthesizer.test.js +82 -0
  25. package/dist/autonomous-patch.js +175 -0
  26. package/dist/autonomous-patch.test.js +128 -0
  27. package/dist/badge/badge-server.js +98 -0
  28. package/dist/behavior-miner.js +442 -0
  29. package/dist/belief-layer.js +475 -0
  30. package/dist/benchmark-count.js +5 -0
  31. package/dist/benchmark-generator.js +211 -0
  32. package/dist/benchmark-harness.js +201 -0
  33. package/dist/benchmark-pass-rate.js +7 -0
  34. package/dist/benchmark-report.js +8 -3
  35. package/dist/benchmark-save.js +14 -1
  36. package/dist/bootstrap-validation.js +197 -0
  37. package/dist/bootstrap-validation.test.js +51 -0
  38. package/dist/branch-ledger.js +1 -1
  39. package/dist/capability-gap.js +130 -0
  40. package/dist/certify-html.js +351 -0
  41. package/dist/certify.js +326 -0
  42. package/dist/check.js +4 -4
  43. package/dist/compliance-miner.js +447 -0
  44. package/dist/continuous-benchmark.js +194 -0
  45. package/dist/continuous-benchmark.test.js +116 -0
  46. package/dist/corpus-stats.js +173 -0
  47. package/dist/counterfactual-engine.js +288 -0
  48. package/dist/coverage-dashboard.js +109 -0
  49. package/dist/coverage-system.test.js +205 -0
  50. package/dist/cross-repo-precision.js +352 -0
  51. package/dist/cve-benchmark.js +180 -0
  52. package/dist/cve-benchmark.test.js +28 -0
  53. package/dist/cve-collector.js +73 -0
  54. package/dist/data-quality.js +141 -0
  55. package/dist/decision-engine.js +388 -0
  56. package/dist/derive-metadata.js +250 -0
  57. package/dist/difficulty-active.test.js +198 -0
  58. package/dist/difficulty-map.js +244 -0
  59. package/dist/discovery-analytics.js +125 -0
  60. package/dist/discovery-model.js +149 -0
  61. package/dist/discovery-optimize.test.js +199 -0
  62. package/dist/discovery-trace.js +276 -0
  63. package/dist/discovery-trace.test.js +97 -0
  64. package/dist/emitter.js +83 -1
  65. package/dist/enterprise-dashboard.js +405 -0
  66. package/dist/eval-hardening.js +297 -0
  67. package/dist/eval-hardening.test.js +85 -0
  68. package/dist/evaluation-campaign.js +359 -0
  69. package/dist/evaluation-campaign.test.js +181 -0
  70. package/dist/evidence-growth.js +143 -0
  71. package/dist/evidence-repository.js +209 -0
  72. package/dist/evidence-system.js +441 -0
  73. package/dist/execute.js +15 -7
  74. package/dist/experimental/software-physics.js +291 -0
  75. package/dist/experimental/state-inference.js +516 -0
  76. package/dist/experimental/unsupervised-physics.js +230 -0
  77. package/dist/extract-ir-python.js +54 -7
  78. package/dist/extract-ir.js +376 -12
  79. package/dist/failure-collector.js +2 -2
  80. package/dist/failure-corpus.js +322 -9
  81. package/dist/feedback.js +16 -5
  82. package/dist/feedback.test.js +49 -0
  83. package/dist/file-lock.js +1 -1
  84. package/dist/flywheel-batch.js +292 -0
  85. package/dist/frameworks/express-cli.js +237 -0
  86. package/dist/frameworks/express-detector.js +445 -0
  87. package/dist/frameworks/express-detector.test.js +206 -0
  88. package/dist/frameworks/index.js +30 -0
  89. package/dist/frameworks/nestjs-detector.js +302 -0
  90. package/dist/frameworks/trpc-detector.js +161 -0
  91. package/dist/frameworks/version-awareness.js +179 -0
  92. package/dist/function-synonyms.js +164 -0
  93. package/dist/function-synonyms.test.js +68 -0
  94. package/dist/generalization.test.js +352 -0
  95. package/dist/goal-annotator.js +113 -0
  96. package/dist/goal-planner.js +563 -0
  97. package/dist/gold-cve.js +164 -0
  98. package/dist/gold-cve.test.js +104 -0
  99. package/dist/gold-quality.js +206 -0
  100. package/dist/gold-tiers.js +241 -0
  101. package/dist/governance-dashboard.js +327 -0
  102. package/dist/graph-viz.js +240 -0
  103. package/dist/guided-frontier.js +195 -0
  104. package/dist/hierarchical-planner.js +148 -0
  105. package/dist/identifier-parser.js +260 -0
  106. package/dist/immune-metrics.js +93 -0
  107. package/dist/immune-receiver.js +158 -0
  108. package/dist/immune-reporter.js +1 -1
  109. package/dist/improvement-orchestrator.js +206 -0
  110. package/dist/inject-p0-vocabulary.js +300 -0
  111. package/dist/intent-parser.js +218 -0
  112. package/dist/invariant-algebra.js +476 -0
  113. package/dist/invariant-calculus.js +533 -0
  114. package/dist/ir-utils.js +70 -0
  115. package/dist/ir-utils.test.js +50 -0
  116. package/dist/knowledge-api.js +312 -0
  117. package/dist/knowledge-evolution.js +452 -0
  118. package/dist/knowledge-explorer.js +506 -0
  119. package/dist/knowledge-flywheel.js +274 -0
  120. package/dist/knowledge-governance.js +338 -0
  121. package/dist/knowledge-governance.test.js +150 -0
  122. package/dist/knowledge-graph.js +181 -0
  123. package/dist/knowledge-guided-synth.js +246 -0
  124. package/dist/knowledge-loop.test.js +77 -0
  125. package/dist/knowledge-object.js +316 -0
  126. package/dist/knowledge-package.js +98 -0
  127. package/dist/kpi-dashboard.js +561 -0
  128. package/dist/l3-cross-function.js +280 -0
  129. package/dist/learning-ranker.js +148 -0
  130. package/dist/learning-ranker.test.js +291 -0
  131. package/dist/ledger/accountability.js +322 -0
  132. package/dist/ledger/chain-builder.js +185 -0
  133. package/dist/ledger/cli.js +222 -0
  134. package/dist/ledger/index.js +13 -0
  135. package/dist/ledger/signatures.js +193 -0
  136. package/dist/ledger/types.js +9 -0
  137. package/dist/llm.js +74 -3
  138. package/dist/load-benchmarks.js +8 -3
  139. package/dist/logger.js +66 -0
  140. package/dist/logger.test.js +37 -0
  141. package/dist/logistic-reward.js +339 -0
  142. package/dist/logistic-reward.test.js +180 -0
  143. package/dist/macro-graph.js +193 -0
  144. package/dist/macro-repair.js +183 -0
  145. package/dist/mcp-server.mjs +1202 -483
  146. package/dist/memory-layer.js +42 -5
  147. package/dist/multi-repo-precision.js +422 -0
  148. package/dist/name-free-protocol.js +425 -0
  149. package/dist/name-free-protocol.test.js +170 -0
  150. package/dist/name-scrambling.js +138 -0
  151. package/dist/name-scrambling.test.js +16 -0
  152. package/dist/p3-observability.test.js +281 -0
  153. package/dist/p5-orchestrator.test.js +225 -0
  154. package/dist/pairwise-preference.js +294 -0
  155. package/dist/pairwise-preference.test.js +140 -0
  156. package/dist/planner-constraints.js +104 -0
  157. package/dist/planner-prompts.js +155 -0
  158. package/dist/planner-telemetry.js +415 -0
  159. package/dist/planner-trace.js +214 -0
  160. package/dist/planner.js +162 -167
  161. package/dist/plsb/artifact.js +116 -0
  162. package/dist/plsb/cli.js +71 -0
  163. package/dist/plsb/index.js +19 -0
  164. package/dist/plsb/leaderboard.js +249 -0
  165. package/dist/plsb/report-md.js +156 -0
  166. package/dist/plsb/schema.js +179 -0
  167. package/dist/plsb-benchmark.js +284 -0
  168. package/dist/plsb-benchmark.test.js +119 -0
  169. package/dist/policy/cli.js +134 -0
  170. package/dist/policy/engine.js +333 -0
  171. package/dist/policy/index.js +12 -0
  172. package/dist/policy/types.js +59 -0
  173. package/dist/policy-miner.js +505 -0
  174. package/dist/precision-analyze.js +229 -0
  175. package/dist/precision-benchmark.js +147 -0
  176. package/dist/precision-label-c.js +134 -0
  177. package/dist/precision-label.js +193 -0
  178. package/dist/precision-report-c.js +149 -0
  179. package/dist/precision-report.js +246 -0
  180. package/dist/progmune-status.js +108 -0
  181. package/dist/proof-engine.js +479 -0
  182. package/dist/proof-provenance.js +315 -0
  183. package/dist/protocol-coverage.js +294 -0
  184. package/dist/protocol-detector.js +1189 -0
  185. package/dist/protocol-embedding-expanded.js +297 -0
  186. package/dist/protocol-embedding-expanded.test.js +97 -0
  187. package/dist/protocol-embedding.js +195 -0
  188. package/dist/protocol-embedding.test.js +82 -0
  189. package/dist/protocol-extractor-v2.js +354 -0
  190. package/dist/protocol-extractor-v2.test.js +140 -0
  191. package/dist/protocol-extractor.js +310 -0
  192. package/dist/protocol-extractor.test.js +113 -0
  193. package/dist/protocol-foundation.js +322 -0
  194. package/dist/protocol-foundation.test.js +163 -0
  195. package/dist/protocol-frontier.js +243 -0
  196. package/dist/protocol-frontier.test.js +92 -0
  197. package/dist/protocol-gap-analyzer.js +228 -0
  198. package/dist/protocol-gap-analyzer.test.js +49 -0
  199. package/dist/protocol-invariants.js +276 -0
  200. package/dist/protocol-invariants.test.js +111 -0
  201. package/dist/protocol-knowledge.js +464 -0
  202. package/dist/protocol-miner.js +343 -0
  203. package/dist/protocol-mining.js +207 -0
  204. package/dist/protocol-mining.test.js +37 -0
  205. package/dist/protocol-registry.js +1 -1
  206. package/dist/protocol-security-benchmark.js +222 -0
  207. package/dist/protocol-vulnerability.js +257 -0
  208. package/dist/protocol-vulnerability.test.js +60 -0
  209. package/dist/python-benchmark.js +120 -0
  210. package/dist/python-emitter.js +163 -45
  211. package/dist/python-protocol-extractor.js +187 -0
  212. package/dist/python-protocol-extractor.test.js +116 -0
  213. package/dist/realworld-benchmark.js +646 -0
  214. package/dist/realworld-benchmark.test.js +36 -0
  215. package/dist/repair-arch.test.js +411 -0
  216. package/dist/repair-evolution.test.js +454 -0
  217. package/dist/repair-executor.js +719 -0
  218. package/dist/repair-proposal.js +4 -4
  219. package/dist/repair-ranker.js +141 -0
  220. package/dist/repair-strategies.js +419 -0
  221. package/dist/repair-taxonomy.js +234 -0
  222. package/dist/repair-types.js +12 -0
  223. package/dist/repo-evaluator.js +250 -0
  224. package/dist/repo-evaluator.test.js +128 -0
  225. package/dist/resource-abstraction.js +242 -0
  226. package/dist/resource-detector.js +211 -0
  227. package/dist/result.test.js +43 -0
  228. package/dist/reward-system.js +411 -0
  229. package/dist/reward-system.test.js +175 -0
  230. package/dist/risk-model.js +215 -0
  231. package/dist/rule-miner.js +234 -7
  232. package/dist/rule-specificity.js +254 -0
  233. package/dist/runtime-types.js +27 -0
  234. package/dist/scaffold.js +208 -0
  235. package/dist/scale-collector.test.js +101 -0
  236. package/dist/scale-trajectory-collector.js +128 -0
  237. package/dist/sdk.js +250 -0
  238. package/dist/search-planner.js +4 -41
  239. package/dist/semantic-snapshot.js +1 -1
  240. package/dist/semantic-topology.js +121 -0
  241. package/dist/semantic-trace.js +310 -317
  242. package/dist/sequence-extractor.js +343 -0
  243. package/dist/skill-library.js +245 -0
  244. package/dist/skill-planner.test.js +189 -0
  245. package/dist/software-physics.js +291 -0
  246. package/dist/software-physics.test.js +81 -0
  247. package/dist/ssg-precision.js +478 -0
  248. package/dist/ssg-validator.js +71 -21
  249. package/dist/state-inference-doubleblind.test.js +160 -0
  250. package/dist/state-inference.js +516 -0
  251. package/dist/state-inference.test.js +115 -0
  252. package/dist/state-machine-fingerprint.js +345 -0
  253. package/dist/state-machine-fingerprint.test.js +120 -0
  254. package/dist/state-miner.js +386 -0
  255. package/dist/state-name-inference.js +213 -0
  256. package/dist/state-name-inference.test.js +69 -0
  257. package/dist/strategy-planner.js +262 -96
  258. package/dist/strategy-planner.test.js +135 -0
  259. package/dist/telemetry-analytics.test.js +402 -0
  260. package/dist/terminal-format.js +68 -0
  261. package/dist/terminal-format.test.js +83 -0
  262. package/dist/topology-factory.js +196 -0
  263. package/dist/topology-representation.js +242 -0
  264. package/dist/topology-representation.test.js +27 -0
  265. package/dist/trajectory-augmentation.js +254 -0
  266. package/dist/trajectory-augmentation.test.js +63 -0
  267. package/dist/trajectory-corpus.js +440 -0
  268. package/dist/trajectory-corpus.test.js +32 -0
  269. package/dist/trajectory-feedback.test.js +116 -0
  270. package/dist/transition-synthesizer.js +286 -0
  271. package/dist/transition-synthesizer.test.js +123 -0
  272. package/dist/trust/api-semantic-mapper.js +809 -0
  273. package/dist/trust/call-graph-propagator.js +225 -0
  274. package/dist/trust/cli.js +122 -0
  275. package/dist/trust/compliance-scorer.js +283 -0
  276. package/dist/trust/confidence-calculator.js +261 -0
  277. package/dist/trust/engine.js +1145 -0
  278. package/dist/trust/explainability.js +85 -0
  279. package/dist/trust/formatters/ci.js +42 -0
  280. package/dist/trust/formatters/json.js +11 -0
  281. package/dist/trust/formatters/terminal.js +152 -0
  282. package/dist/trust/index.js +39 -0
  283. package/dist/trust/phase1-verify.js +171 -0
  284. package/dist/trust/protocol-domain-validator.js +697 -0
  285. package/dist/trust/score-calculator.js +282 -0
  286. package/dist/trust/ssg-bridge.js +641 -0
  287. package/dist/trust/ssg-bridge.test.js +269 -0
  288. package/dist/trust/types.js +67 -0
  289. package/dist/trust/violation-trace.js +335 -0
  290. package/dist/trust-api.js +179 -0
  291. package/dist/trust-calibration.js +279 -0
  292. package/dist/unknown-protocol-discovery.js +339 -0
  293. package/dist/unknown-protocol-discovery.test.js +102 -0
  294. package/dist/unsupervised-physics.js +230 -0
  295. package/dist/unsupervised-physics.test.js +95 -0
  296. package/dist/utils.test.js +37 -0
  297. package/dist/validator.js +187 -10
  298. package/dist/verification-intelligence.js +475 -0
  299. package/dist/verify-api.js +432 -0
  300. package/dist/vi-impact-report.js +293 -0
  301. package/dist/wl-fingerprint.js +162 -0
  302. package/dist/wl-fingerprint.test.js +130 -0
  303. package/dist/zeroshot-strategy.js +139 -0
  304. 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
  305. package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
  306. package/package.json +74 -7
  307. package/protocols.json +1956 -50
  308. package/.dockerignore +0 -14
  309. package/.mcp.json +0 -11
  310. package/.progmune_allowlist +0 -50
  311. package/.test_report/test_report.md +0 -87
  312. package/Dockerfile +0 -9
  313. package/FAQ.md +0 -167
  314. package/WHITEPAPER.md +0 -540
  315. package/demo-project/auth.ts +0 -55
  316. package/demo-project/tsconfig.json +0 -8
  317. package/dist/acl-breakdown.js +0 -13
  318. package/dist/all-sessions.js +0 -11
  319. package/dist/antibody-stats.js +0 -11
  320. package/dist/branch-tree-count.js +0 -14
  321. package/dist/common-fixpath.js +0 -12
  322. package/dist/constraint-types.js +0 -12
  323. package/dist/exec-metrics.js +0 -11
  324. package/dist/failure-report.js +0 -11
  325. package/dist/fast-path-hits.js +0 -13
  326. package/dist/fingerprint-list.js +0 -15
  327. package/dist/gen-history-log.js +0 -13
  328. package/dist/heatmap-data.js +0 -11
  329. package/dist/recent-session.js +0 -12
  330. package/dist/svl-distribution.js +0 -11
  331. package/dist/terminal-status.js +0 -11
  332. package/dist/token-savings.js +0 -11
  333. package/dist/total-repairs.js +0 -12
  334. package/dist/unresolved-count.js +0 -12
  335. package/dist/valid-fingerprints.js +0 -13
  336. package/dist/verify-ledgers.js +0 -11
  337. package/docs/whitepaper-style.css +0 -77
  338. package/docs/whitepaper-v2.1.md +0 -609
  339. package/docs/whitepaper-v2.2.md +0 -1064
  340. package/docs/whitepaper-v2.2.pdf +0 -0
  341. package/fly.toml +0 -31
  342. package/public/dashboard.html +0 -119
  343. package/server/hub.js +0 -116
  344. package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
  345. package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
  346. package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
  347. package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
  348. package/test/replay-golden.ts +0 -84
  349. package/test_benchmark.js +0 -165
  350. package/test_comprehensive.mjs +0 -638
  351. package/test_concurrency.js +0 -129
  352. package/test_ir_robustness.js +0 -85
  353. package/test_semantic_contracts.js +0 -269
  354. package/test_ssg_stress.js +0 -156
  355. package/test_svl3.js +0 -58
  356. 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
+ }