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,179 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 9: PLSB JSON Schema Generator
4
+ *
5
+ * Generates the JSON Schema for PLSB v1.0 artifacts.
6
+ * External tools can use this to validate PLSB data.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.PLSB_SCHEMA_PATH = void 0;
43
+ exports.generatePLSBSchema = generatePLSBSchema;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const artifact_1 = require("./artifact");
47
+ exports.PLSB_SCHEMA_PATH = "benchmarks/plsb-schema.json";
48
+ function generatePLSBSchema(outputPath) {
49
+ const schema = {
50
+ $schema: "https://json-schema.org/draft/2020-12/schema",
51
+ $id: artifact_1.PLSB_SCHEMA_URI,
52
+ title: "Protocol Lifecycle Security Benchmark (PLSB) v1.0",
53
+ description: "A benchmark for protocol lifecycle vulnerabilities — missing states, " +
54
+ "missing edges, and illegal transitions that traditional SAST cannot detect. " +
55
+ "13-category taxonomy covering resource leaks, auth bypass, transaction violations, " +
56
+ "memory safety, and state consistency.",
57
+ type: "object",
58
+ required: ["$schema", "@id", "@version", "generated", "entries", "benchmark", "provenance"],
59
+ properties: {
60
+ $schema: {
61
+ type: "string",
62
+ format: "uri",
63
+ description: "JSON Schema URI for this artifact",
64
+ },
65
+ "@id": {
66
+ type: "string",
67
+ format: "uri",
68
+ description: "Permanent public reference URI for this benchmark version",
69
+ const: artifact_1.PLSB_PUBLIC_URI,
70
+ },
71
+ "@version": {
72
+ type: "string",
73
+ description: "Semantic version of this artifact",
74
+ pattern: "^\\d+\\.\\d+\\.\\d+$",
75
+ },
76
+ generated: {
77
+ type: "string",
78
+ format: "date-time",
79
+ description: "ISO 8601 timestamp of generation",
80
+ },
81
+ entries: {
82
+ type: "array",
83
+ description: "Individual benchmark cases (vulnerability sequences)",
84
+ items: {
85
+ type: "object",
86
+ required: ["id", "category", "severity", "broken", "expected", "verified", "source"],
87
+ properties: {
88
+ id: { type: "string" },
89
+ pls_id: { type: "string", pattern: "^PLS-\\d{3}$" },
90
+ category: { type: "string" },
91
+ severity: { type: "string", enum: ["critical", "high", "medium", "low"] },
92
+ broken: { type: "array", items: { type: "string" } },
93
+ expected: { type: "array", items: { type: "string" } },
94
+ verified: { type: "boolean" },
95
+ source: { type: "string" },
96
+ cve: { type: "string" },
97
+ project: { type: "string" },
98
+ notes: { type: "string" },
99
+ },
100
+ },
101
+ },
102
+ benchmark: {
103
+ type: "object",
104
+ required: ["name", "version", "taxonomy", "metadata"],
105
+ properties: {
106
+ name: { type: "string", description: "Benchmark name" },
107
+ version: { type: "string" },
108
+ taxonomy: {
109
+ type: "array",
110
+ description: "Protocol Weakness Taxonomy (13 categories)",
111
+ items: {
112
+ type: "object",
113
+ required: ["id", "name", "category", "description"],
114
+ properties: {
115
+ id: {
116
+ type: "string",
117
+ description: "Unique PLS identifier (e.g., PLS-001)",
118
+ pattern: "^PLS-\\d{3}$",
119
+ },
120
+ name: { type: "string" },
121
+ category: {
122
+ type: "string",
123
+ enum: [
124
+ "resource_leak", "use_after_free", "auth_bypass",
125
+ "session_fixation", "privilege_escalation",
126
+ "transaction_violation", "double_free",
127
+ "race_condition", "missing_validation",
128
+ ],
129
+ },
130
+ description: { type: "string" },
131
+ example_broken: {
132
+ type: "array",
133
+ items: { type: "string" },
134
+ },
135
+ example_expected: {
136
+ type: "array",
137
+ items: { type: "string" },
138
+ },
139
+ },
140
+ },
141
+ },
142
+ metadata: {
143
+ type: "object",
144
+ required: ["total", "verified", "coverage", "recall", "precision"],
145
+ properties: {
146
+ total: { type: "integer", minimum: 0 },
147
+ verified: { type: "integer", minimum: 0 },
148
+ byCategory: { type: "object" },
149
+ byPLS: { type: "object" },
150
+ coverage: { type: "number", minimum: 0, maximum: 1 },
151
+ recall: { type: "number", minimum: 0, maximum: 1 },
152
+ precision: { type: "number", minimum: 0, maximum: 1 },
153
+ },
154
+ },
155
+ },
156
+ },
157
+ provenance: {
158
+ type: "object",
159
+ required: ["source", "version", "corpusHash"],
160
+ properties: {
161
+ source: { type: "string", description: "Generator identifier" },
162
+ version: { type: "string" },
163
+ corpusHash: {
164
+ type: "string",
165
+ description: "SHA-256 hash of the benchmark corpus",
166
+ },
167
+ },
168
+ },
169
+ },
170
+ };
171
+ if (outputPath) {
172
+ const outDir = path.dirname(outputPath);
173
+ if (!fs.existsSync(outDir)) {
174
+ fs.mkdirSync(outDir, { recursive: true });
175
+ }
176
+ fs.writeFileSync(outputPath, JSON.stringify(schema, null, 2), "utf-8");
177
+ }
178
+ return schema;
179
+ }
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ /**
3
+ * PLSB-100: Protocol Lifecycle Security Benchmark v1.0
4
+ *
5
+ * The first benchmark specifically designed for protocol lifecycle
6
+ * vulnerabilities — missing states, missing edges, and illegal
7
+ * transitions that traditional SAST cannot see.
8
+ *
9
+ * Categories (Protocol Weakness Taxonomy v1):
10
+ * RESOURCE LIFECYCLE:
11
+ * PLS-001 Missing Release — Acquire→Use...no Release
12
+ * PLS-002 Double Release — Release→Release (illegal)
13
+ * PLS-003 Use After Release — Release→Use (illegal)
14
+ * AUTH LIFECYCLE:
15
+ * PLS-004 Missing Auth — Action without prior Verify
16
+ * PLS-005 Session Fixation — Session not invalidated
17
+ * PLS-006 Privilege Escalation — Lower privilege→Higher action
18
+ * TRANSACTION LIFECYCLE:
19
+ * PLS-007 Missing Commit — Begin→...no Commit|Rollback
20
+ * PLS-008 Double Commit — Commit→Commit (illegal)
21
+ * MEMORY LIFECYCLE:
22
+ * PLS-009 Missing Free — Alloc→...no Free
23
+ * PLS-010 Double Free — Free→Free (illegal)
24
+ * PLS-011 Use After Free — Free→Use (illegal)
25
+ * STATE CONSISTENCY:
26
+ * PLS-012 Race Condition — Check→Modify without lock
27
+ * PLS-013 Workflow Bypass — Skip required intermediate state
28
+ *
29
+ * This IS the defensible asset — a verified dataset that defines
30
+ * a new security category.
31
+ */
32
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ var desc = Object.getOwnPropertyDescriptor(m, k);
35
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
36
+ desc = { enumerable: true, get: function() { return m[k]; } };
37
+ }
38
+ Object.defineProperty(o, k2, desc);
39
+ }) : (function(o, m, k, k2) {
40
+ if (k2 === undefined) k2 = k;
41
+ o[k2] = m[k];
42
+ }));
43
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
44
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
45
+ }) : function(o, v) {
46
+ o["default"] = v;
47
+ });
48
+ var __importStar = (this && this.__importStar) || (function () {
49
+ var ownKeys = function(o) {
50
+ ownKeys = Object.getOwnPropertyNames || function (o) {
51
+ var ar = [];
52
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
53
+ return ar;
54
+ };
55
+ return ownKeys(o);
56
+ };
57
+ return function (mod) {
58
+ if (mod && mod.__esModule) return mod;
59
+ var result = {};
60
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
61
+ __setModuleDefault(result, mod);
62
+ return result;
63
+ };
64
+ })();
65
+ Object.defineProperty(exports, "__esModule", { value: true });
66
+ exports.PROTOCOL_WEAKNESS_TAXONOMY = void 0;
67
+ exports.buildPLSB = buildPLSB;
68
+ exports.exportPLSB = exportPLSB;
69
+ exports.printPLSBReport = printPLSBReport;
70
+ const gold_cve_1 = require("./gold-cve");
71
+ const fs = __importStar(require("fs"));
72
+ const path = __importStar(require("path"));
73
+ exports.PROTOCOL_WEAKNESS_TAXONOMY = [
74
+ {
75
+ id: "PLS-001", name: "Missing Release", category: "resource_leak",
76
+ description: "Resource acquired (Acquire) but never released. The lifecycle terminates without the required Release step.",
77
+ example_broken: ["open", "read"],
78
+ example_expected: ["open", "read", "close"],
79
+ },
80
+ {
81
+ id: "PLS-002", name: "Double Release", category: "resource_leak",
82
+ description: "Resource released twice. Second Release is an illegal transition — the resource is already freed.",
83
+ example_broken: ["open", "close", "close"],
84
+ example_expected: ["open", "close"],
85
+ },
86
+ {
87
+ id: "PLS-003", name: "Use After Release", category: "use_after_free",
88
+ description: "Resource accessed after release. The Use step occurs after the Release has already invalidated the resource state.",
89
+ example_broken: ["open", "close", "read"],
90
+ example_expected: ["open", "read", "close"],
91
+ },
92
+ {
93
+ id: "PLS-004", name: "Missing Authorization", category: "auth_bypass",
94
+ description: "Privileged action performed without prior authentication/authorization. The Verify step is absent from the lifecycle.",
95
+ example_broken: ["generate_token", "access_resource"],
96
+ example_expected: ["verify_password", "generate_token", "access_resource"],
97
+ },
98
+ {
99
+ id: "PLS-005", name: "Session Fixation", category: "session_fixation",
100
+ description: "Session not invalidated after logout. Old session tokens remain valid, enabling session hijacking.",
101
+ example_broken: ["verify_password", "create_session", "logout"],
102
+ example_expected: ["verify_password", "create_session", "invalidate_session", "logout"],
103
+ },
104
+ {
105
+ id: "PLS-006", name: "Privilege Escalation", category: "privilege_escalation",
106
+ description: "User with lower privilege performs higher-privilege action. A privilege boundary is crossed without validation.",
107
+ example_broken: ["login_as_user", "delete_all_records"],
108
+ example_expected: ["login_as_user", "verify_admin_role", "delete_all_records"],
109
+ },
110
+ {
111
+ id: "PLS-007", name: "Missing Commit", category: "transaction_violation",
112
+ description: "Transaction started (Begin) but never terminated with Commit or Rollback. Writes are lost or dangling.",
113
+ example_broken: ["begin_tx", "insert_record"],
114
+ example_expected: ["begin_tx", "insert_record", "commit_tx"],
115
+ },
116
+ {
117
+ id: "PLS-008", name: "Double Commit", category: "transaction_violation",
118
+ description: "Transaction committed twice. Second Commit is an illegal transition — the transaction is already closed.",
119
+ example_broken: ["begin_tx", "commit_tx", "commit_tx"],
120
+ example_expected: ["begin_tx", "commit_tx"],
121
+ },
122
+ {
123
+ id: "PLS-009", name: "Missing Free", category: "resource_leak",
124
+ description: "Memory allocated (Alloc) but never freed. The lifecycle terminates without the required Free step.",
125
+ example_broken: ["malloc", "use_buffer"],
126
+ example_expected: ["malloc", "use_buffer", "free"],
127
+ },
128
+ {
129
+ id: "PLS-010", name: "Double Free", category: "double_free",
130
+ description: "Memory freed twice. Second Free is an illegal transition — the allocation is already released.",
131
+ example_broken: ["malloc", "free", "free"],
132
+ example_expected: ["malloc", "free"],
133
+ },
134
+ {
135
+ id: "PLS-011", name: "Use After Free", category: "use_after_free",
136
+ description: "Memory accessed after free. The Use occurs after Free has already invalidated the allocation.",
137
+ example_broken: ["malloc", "free", "use_buffer"],
138
+ example_expected: ["malloc", "use_buffer", "free"],
139
+ },
140
+ {
141
+ id: "PLS-012", name: "Race Condition", category: "race_condition",
142
+ description: "Check-then-act without proper synchronization. State changes between Check and Act steps.",
143
+ example_broken: ["check_file_exists", "open_file"],
144
+ example_expected: ["check_file_exists", "acquire_lock", "open_file", "release_lock"],
145
+ },
146
+ {
147
+ id: "PLS-013", name: "Workflow Bypass", category: "missing_validation",
148
+ description: "Required intermediate validation step skipped. The workflow jumps directly from start to privileged action.",
149
+ example_broken: ["receive_request", "execute_query"],
150
+ example_expected: ["receive_request", "validate_input", "authorize_action", "execute_query"],
151
+ },
152
+ ];
153
+ function buildPLSB() {
154
+ const entries = [];
155
+ // Source 1: Curated gold (20 cases)
156
+ const curated = (0, gold_cve_1.loadGoldDataset)().cases;
157
+ for (const c of curated) {
158
+ entries.push({
159
+ id: c.id,
160
+ category: c.category,
161
+ severity: c.severity,
162
+ broken: c.broken,
163
+ expected: c.expected,
164
+ verified: true,
165
+ source: "curated",
166
+ notes: c.notes,
167
+ pls_id: c.plsId,
168
+ });
169
+ }
170
+ // Source 2: Diff-based gold from gold-seed.json
171
+ try {
172
+ const seedPath = path.resolve(__dirname, "..", "benchmarks", "gold-seed.json");
173
+ if (fs.existsSync(seedPath)) {
174
+ const seed = JSON.parse(fs.readFileSync(seedPath, "utf-8"));
175
+ for (const c of seed) {
176
+ entries.push({
177
+ id: `GOLD-${c.cve}`,
178
+ category: c.category,
179
+ severity: c.severity || "high",
180
+ broken: c.before,
181
+ expected: c.after,
182
+ verified: true,
183
+ source: "git_diff",
184
+ cve: c.cve,
185
+ project: c.project,
186
+ notes: c.notes,
187
+ });
188
+ }
189
+ }
190
+ }
191
+ catch { }
192
+ // Map entries to PLS taxonomy IDs
193
+ const catToPLS = {
194
+ resource_leak: "PLS-001",
195
+ auth_bypass: "PLS-004",
196
+ use_after_free: "PLS-011",
197
+ double_free: "PLS-010",
198
+ race_condition: "PLS-012",
199
+ data_corruption: "PLS-007",
200
+ transaction_violation: "PLS-007",
201
+ session_fixation: "PLS-005",
202
+ privilege_escalation: "PLS-006",
203
+ missing_validation: "PLS-013",
204
+ };
205
+ for (const e of entries) {
206
+ e.pls_id = e.pls_id || catToPLS[e.category] || undefined;
207
+ }
208
+ // Build metadata
209
+ const byCategory = {};
210
+ const byPLS = {};
211
+ let verified = 0;
212
+ for (const e of entries) {
213
+ byCategory[e.category] = (byCategory[e.category] || 0) + 1;
214
+ if (e.pls_id)
215
+ byPLS[e.pls_id] = (byPLS[e.pls_id] || 0) + 1;
216
+ if (e.verified)
217
+ verified++;
218
+ }
219
+ const allPLS = exports.PROTOCOL_WEAKNESS_TAXONOMY.map(t => t.id);
220
+ const coveredPLS = [...new Set(entries.filter(e => e.pls_id).map(e => e.pls_id))];
221
+ const uncoveredPLS = allPLS.filter(id => !coveredPLS.includes(id));
222
+ const coverage = {
223
+ totalCategories: allPLS.length,
224
+ covered: coveredPLS.length,
225
+ uncovered: uncoveredPLS,
226
+ };
227
+ return {
228
+ name: "Protocol Lifecycle Security Benchmark",
229
+ version: "1.0.0",
230
+ taxonomy: exports.PROTOCOL_WEAKNESS_TAXONOMY,
231
+ entries,
232
+ metadata: {
233
+ total: entries.length,
234
+ verified,
235
+ byCategory,
236
+ byPLS,
237
+ coverage,
238
+ },
239
+ };
240
+ }
241
+ function exportPLSB(benchmark, filepath) {
242
+ fs.writeFileSync(filepath, JSON.stringify(benchmark, null, 2));
243
+ console.log(`\n PLSB exported: ${benchmark.metadata.total} entries → ${filepath}`);
244
+ console.log(` Verified: ${benchmark.metadata.verified}/${benchmark.metadata.total}`);
245
+ console.log(` Coverage: ${benchmark.metadata.coverage.covered}/${benchmark.metadata.coverage.totalCategories} PLS categories`);
246
+ if (benchmark.metadata.coverage.uncovered.length > 0) {
247
+ console.log(` Uncovered: ${benchmark.metadata.coverage.uncovered.join(", ")}`);
248
+ }
249
+ }
250
+ function printPLSBReport(benchmark) {
251
+ console.log(`\n╔════════════════════════════════════════════════════╗`);
252
+ console.log(`║ ${benchmark.name}`);
253
+ console.log(`║ Version ${benchmark.version} — ${benchmark.metadata.total} entries`);
254
+ console.log(`╚════════════════════════════════════════════════════╝\n`);
255
+ console.log(` Taxonomy: ${benchmark.taxonomy.length} weakness types`);
256
+ console.log(` Verified entries: ${benchmark.metadata.verified}/${benchmark.metadata.total}`);
257
+ console.log(` Coverage: ${benchmark.metadata.coverage.covered}/${benchmark.metadata.coverage.totalCategories}`);
258
+ console.log();
259
+ console.log(` ── Per PLS Category ──`);
260
+ console.log(` ${'PLS'.padEnd(8)} ${'Name'.padEnd(28)} ${'Count'.padEnd(6)}`);
261
+ console.log(` ${'─'.repeat(44)}`);
262
+ for (const t of benchmark.taxonomy) {
263
+ const count = benchmark.metadata.byPLS[t.id] || 0;
264
+ const icon = count > 0 ? "✅" : "🆕";
265
+ console.log(` ${icon} ${t.id.padEnd(6)} ${t.name.padEnd(28)} ${String(count).padEnd(6)}`);
266
+ }
267
+ console.log();
268
+ // Run detector benchmark against this dataset
269
+ console.log(` ── Detector Performance ──`);
270
+ const goldDataset = {
271
+ cases: benchmark.entries.filter(e => e.verified).map(e => ({
272
+ id: e.id, category: e.category, severity: e.severity,
273
+ broken: e.broken, expected: e.expected,
274
+ verifiedBy: e.source, notes: e.notes,
275
+ })),
276
+ metadata: { total: benchmark.metadata.verified, byCategory: {}, verifiedBy: {} },
277
+ };
278
+ if (goldDataset.cases.length > 0) {
279
+ const result = (0, gold_cve_1.runGoldBenchmark)(goldDataset);
280
+ console.log(` Verified recall: ${(result.recall * 100).toFixed(0)}%`);
281
+ console.log(` Verified precision: ${(result.precision * 100).toFixed(0)}%`);
282
+ }
283
+ console.log(`\n Open: benchmarks/plsb.json\n`);
284
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * PLSB-100: Protocol Lifecycle Security Benchmark Tests
38
+ */
39
+ const vitest_1 = require("vitest");
40
+ const plsb_benchmark_1 = require("./plsb-benchmark");
41
+ const gold_cve_1 = require("./gold-cve");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ (0, vitest_1.describe)("PLSB-100 Benchmark", () => {
45
+ (0, vitest_1.it)("taxonomy has 13 weakness types with valid structure", () => {
46
+ (0, vitest_1.expect)(plsb_benchmark_1.PROTOCOL_WEAKNESS_TAXONOMY.length).toBe(13);
47
+ const ids = new Set();
48
+ for (const w of plsb_benchmark_1.PROTOCOL_WEAKNESS_TAXONOMY) {
49
+ (0, vitest_1.expect)(w.id).toMatch(/^PLS-\d{3}$/);
50
+ (0, vitest_1.expect)(w.name).toBeTruthy();
51
+ (0, vitest_1.expect)(w.category).toBeTruthy();
52
+ (0, vitest_1.expect)(w.description.length).toBeGreaterThan(20);
53
+ (0, vitest_1.expect)(w.example_broken.length).toBeGreaterThan(0);
54
+ (0, vitest_1.expect)(w.example_expected.length).toBeGreaterThan(0);
55
+ (0, vitest_1.expect)(ids.has(w.id)).toBe(false); // no duplicates
56
+ ids.add(w.id);
57
+ }
58
+ });
59
+ (0, vitest_1.it)("builds benchmark with at least 25 verified entries", () => {
60
+ const b = (0, plsb_benchmark_1.buildPLSB)();
61
+ (0, vitest_1.expect)(b.entries.length).toBeGreaterThanOrEqual(25);
62
+ (0, vitest_1.expect)(b.metadata.verified).toBeGreaterThanOrEqual(25);
63
+ (0, vitest_1.expect)(b.taxonomy).toBe(plsb_benchmark_1.PROTOCOL_WEAKNESS_TAXONOMY);
64
+ });
65
+ (0, vitest_1.it)("exports and re-imports PLSB benchmark faithfully", () => {
66
+ const b = (0, plsb_benchmark_1.buildPLSB)();
67
+ const tmpPath = path.resolve(__dirname, "..", "benchmarks", "plsb-test-tmp.json");
68
+ (0, plsb_benchmark_1.exportPLSB)(b, tmpPath);
69
+ const reloaded = JSON.parse(fs.readFileSync(tmpPath, "utf-8"));
70
+ (0, vitest_1.expect)(reloaded.entries.length).toBe(b.entries.length);
71
+ (0, vitest_1.expect)(reloaded.taxonomy.length).toBe(b.taxonomy.length);
72
+ (0, vitest_1.expect)(reloaded.metadata.verified).toBe(b.metadata.verified);
73
+ fs.unlinkSync(tmpPath);
74
+ });
75
+ (0, vitest_1.it)("every verified entry has valid broken/expected arrays", () => {
76
+ const b = (0, plsb_benchmark_1.buildPLSB)();
77
+ const verified = b.entries.filter(e => e.verified);
78
+ (0, vitest_1.expect)(verified.length).toBeGreaterThan(0);
79
+ for (const e of verified) {
80
+ (0, vitest_1.expect)(e.broken.length).toBeGreaterThan(0);
81
+ (0, vitest_1.expect)(e.expected.length).toBeGreaterThan(0);
82
+ (0, vitest_1.expect)(e.category).toBeTruthy();
83
+ (0, vitest_1.expect)(e.source).toBeTruthy();
84
+ }
85
+ });
86
+ (0, vitest_1.it)("verified recall exceeds 85%", () => {
87
+ const b = (0, plsb_benchmark_1.buildPLSB)();
88
+ const verified = b.entries.filter(e => e.verified);
89
+ if (verified.length === 0)
90
+ return;
91
+ const goldDataset = {
92
+ cases: verified.map(e => ({
93
+ id: e.id, category: e.category, severity: e.severity,
94
+ broken: e.broken, expected: e.expected,
95
+ verifiedBy: e.source, notes: e.notes,
96
+ })),
97
+ metadata: { total: verified.length, byCategory: {}, verifiedBy: {} },
98
+ };
99
+ const result = (0, gold_cve_1.runGoldBenchmark)(goldDataset);
100
+ (0, vitest_1.expect)(result.recall).toBeGreaterThan(0.85);
101
+ });
102
+ (0, vitest_1.it)("at least 5 PLS categories are covered", () => {
103
+ const b = (0, plsb_benchmark_1.buildPLSB)();
104
+ (0, vitest_1.expect)(b.metadata.coverage.covered).toBeGreaterThanOrEqual(5);
105
+ });
106
+ (0, vitest_1.it)("all entries map to valid PLS IDs or none", () => {
107
+ const b = (0, plsb_benchmark_1.buildPLSB)();
108
+ const validPLS = new Set(plsb_benchmark_1.PROTOCOL_WEAKNESS_TAXONOMY.map(t => t.id));
109
+ for (const e of b.entries) {
110
+ if (e.pls_id) {
111
+ (0, vitest_1.expect)(validPLS.has(e.pls_id)).toBe(true);
112
+ }
113
+ }
114
+ });
115
+ (0, vitest_1.it)("prints report without throwing", () => {
116
+ const b = (0, plsb_benchmark_1.buildPLSB)();
117
+ (0, vitest_1.expect)(() => (0, plsb_benchmark_1.printPLSBReport)(b)).not.toThrow();
118
+ });
119
+ });