progmune-runtime 2.1.5 → 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 +326 -59
  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,241 @@
1
+ "use strict";
2
+ /**
3
+ * P9.2e: Three-Tier Gold Data System with Annotation Benefit Scoring
4
+ *
5
+ * Tier 1 (Verified Gold): Git Diff + human verified + before/after SM
6
+ * Tier 2 (Silver Gold): Git Diff + auto-extracted + human spot-check
7
+ * Tier 3 (Raw CVE Pool): NVD / GitHub Advisory / OSS-Fuzz, auto-scored
8
+ *
9
+ * Data flywheel: Raw → assessGoldQuality() → Silver → human verify → Gold
10
+ *
11
+ * Annotation Benefit Score:
12
+ * benefit = quality × novelty × coverage_gain
13
+ *
14
+ * This prevents over-annotating already-well-covered categories
15
+ * (e.g., 30th auth_bypass) and prioritizes rare but valuable cases
16
+ * (e.g., first session_fixation, double_free).
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.computeBenefit = computeBenefit;
20
+ exports.buildTieredDataset = buildTieredDataset;
21
+ exports.getAnnotationPriorities = getAnnotationPriorities;
22
+ exports.printTieredReport = printTieredReport;
23
+ const gold_quality_1 = require("./gold-quality");
24
+ // ═══════════════════════════════════════════════════════════════
25
+ // Category registry — all known lifecycle vulnerability types
26
+ // ═══════════════════════════════════════════════════════════════
27
+ const ALL_CATEGORIES = [
28
+ "resource_leak",
29
+ "auth_bypass",
30
+ "use_after_free",
31
+ "double_free",
32
+ "race_condition",
33
+ "data_corruption",
34
+ "transaction_violation",
35
+ "session_fixation",
36
+ "privilege_escalation",
37
+ "missing_validation",
38
+ ];
39
+ // ═══════════════════════════════════════════════════════════════
40
+ // Annotation Benefit Scoring
41
+ // ═══════════════════════════════════════════════════════════════
42
+ /**
43
+ * Compute the annotation benefit score for a candidate case.
44
+ *
45
+ * benefit = quality × novelty × coverage_gain
46
+ *
47
+ * quality: how detectable is this case? (0-1, from assessGoldQuality)
48
+ * novelty: how rare is this category in the existing gold set? (0-1)
49
+ * coverage_gain: would adding this case cover a new category? (1.0 if new, 0.5 if existing)
50
+ *
51
+ * High benefit = rare category + good structural signal.
52
+ * Low benefit = already-well-covered category or weak signal.
53
+ */
54
+ function computeBenefit(quality, category, existingGoldByCategory) {
55
+ // Quality: direct from assessor
56
+ const q = Math.max(0, Math.min(1, quality));
57
+ // Novelty: inverse of how many gold cases we already have in this category
58
+ const existingCount = existingGoldByCategory[category] || 0;
59
+ const novelty = 1.0 / (1.0 + existingCount * 0.3);
60
+ // With 0 existing: novelty = 1.0
61
+ // With 10 existing: novelty = 0.25
62
+ // With 30 existing: novelty = 0.1
63
+ // Coverage gain: bonus for entirely new categories
64
+ const isNew = existingCount === 0;
65
+ const coverage = isNew ? 1.0 : 0.5;
66
+ const benefit = q * novelty * coverage;
67
+ return Math.round(benefit * 1000) / 1000;
68
+ }
69
+ // ═══════════════════════════════════════════════════════════════
70
+ // Build the tiered dataset
71
+ // ═══════════════════════════════════════════════════════════════
72
+ function buildTieredDataset() {
73
+ const cases = [];
74
+ // ── Tier 1: Verified Gold (curated + diff-based) ──
75
+ const { REAL_WORLD_DEFECTS } = require("./realworld-benchmark");
76
+ for (const d of REAL_WORLD_DEFECTS) {
77
+ const q = (0, gold_quality_1.assessGoldQuality)(d.broken, d.expected);
78
+ cases.push({
79
+ id: d.id,
80
+ tier: "gold",
81
+ category: d.category,
82
+ broken: d.broken,
83
+ expected: d.expected,
84
+ quality: q.score,
85
+ verified: true,
86
+ source: "curated",
87
+ benefit: 0, // computed after category counts are known
88
+ notes: d.description,
89
+ });
90
+ }
91
+ // Diff-based gold from gold-seed.json
92
+ try {
93
+ const fs = require("fs");
94
+ const path = require("path");
95
+ const seedPath = path.resolve(__dirname, "..", "benchmarks", "gold-seed.json");
96
+ if (fs.existsSync(seedPath)) {
97
+ const seed = JSON.parse(fs.readFileSync(seedPath, "utf-8"));
98
+ for (const c of seed) {
99
+ const q = (0, gold_quality_1.assessGoldQuality)(c.before, c.after);
100
+ cases.push({
101
+ id: `GOLD-${c.cve}`,
102
+ tier: "gold",
103
+ category: c.category,
104
+ broken: c.before,
105
+ expected: c.after,
106
+ quality: q.score,
107
+ verified: true,
108
+ source: "git_diff",
109
+ benefit: 0,
110
+ notes: c.notes,
111
+ });
112
+ }
113
+ }
114
+ }
115
+ catch { }
116
+ // ── Tier 3: Raw CVE Pool (synthetic, awaiting assessment) ──
117
+ try {
118
+ const { createProtocolForTopology, ALL_TOPOLOGIES } = require("./topology-factory");
119
+ const categories = [
120
+ "resource_leak", "auth_bypass", "data_corruption",
121
+ "use_after_free", "race_condition",
122
+ ];
123
+ let sid = 500;
124
+ for (const topo of ALL_TOPOLOGIES) {
125
+ const rules = createProtocolForTopology(topo);
126
+ const entries = [...rules.entries()];
127
+ if (entries.length < 2)
128
+ continue;
129
+ for (let v = 0; v < 3; v++) {
130
+ const path = [];
131
+ const ss = new Set(["INIT", "IDLE"]);
132
+ const s = entries[Math.floor(Math.random() * entries.length)];
133
+ path.push(s[0]);
134
+ const r = s[1];
135
+ if (r.invalidate)
136
+ r.invalidate.forEach((x) => ss.delete(x));
137
+ for (const x of r.post_states)
138
+ ss.add(x);
139
+ for (let t = 0; t < 4; t++) {
140
+ const cands = entries.filter(([, rr]) => rr.pre_states.every((x) => ss.has(x)));
141
+ if (!cands.length)
142
+ break;
143
+ const [fn, nr] = cands[Math.floor(Math.random() * cands.length)];
144
+ path.push(fn);
145
+ if (nr.invalidate)
146
+ nr.invalidate.forEach((x) => ss.delete(x));
147
+ for (const x of nr.post_states)
148
+ ss.add(x);
149
+ }
150
+ if (path.length < 3)
151
+ continue;
152
+ const cat = categories[sid % categories.length];
153
+ const broken = path.slice(0, -1);
154
+ const expected = path;
155
+ const q = (0, gold_quality_1.assessGoldQuality)(broken, expected);
156
+ cases.push({
157
+ id: `RAW-${sid++}`,
158
+ tier: q.detectable ? "silver" : "raw",
159
+ category: cat,
160
+ broken,
161
+ expected,
162
+ quality: q.score,
163
+ verified: false,
164
+ source: "synthetic",
165
+ benefit: 0,
166
+ });
167
+ }
168
+ }
169
+ }
170
+ catch { }
171
+ // ── Compute benefit scores using final category counts ──
172
+ const goldByCategory = {};
173
+ for (const c of cases) {
174
+ if (c.tier === "gold") {
175
+ goldByCategory[c.category] = (goldByCategory[c.category] || 0) + 1;
176
+ }
177
+ }
178
+ for (const c of cases) {
179
+ c.benefit = computeBenefit(c.quality, c.category, goldByCategory);
180
+ }
181
+ // ── Build metadata ──
182
+ const byTier = { gold: 0, silver: 0, raw: 0 };
183
+ const byCategory = {};
184
+ for (const c of cases) {
185
+ byTier[c.tier] = (byTier[c.tier] || 0) + 1;
186
+ byCategory[c.category] = (byCategory[c.category] || 0) + 1;
187
+ }
188
+ const coveredCategories = ALL_CATEGORIES.filter(cat => cases.some(c => c.tier === "gold" && c.category === cat));
189
+ const uncoveredCategories = ALL_CATEGORIES.filter(cat => !coveredCategories.includes(cat));
190
+ return {
191
+ cases,
192
+ metadata: {
193
+ total: cases.length,
194
+ byTier,
195
+ byCategory,
196
+ coveredCategories,
197
+ uncoveredCategories,
198
+ },
199
+ };
200
+ }
201
+ function getAnnotationPriorities(dataset) {
202
+ const priorities = [];
203
+ for (const cat of ALL_CATEGORIES) {
204
+ const goldCount = dataset.cases.filter(c => c.tier === "gold" && c.category === cat).length;
205
+ const pending = dataset.cases.filter(c => c.tier !== "gold" && c.category === cat);
206
+ const pendingCount = pending.length;
207
+ const avgBenefit = pending.length > 0
208
+ ? pending.reduce((s, c) => s + c.benefit, 0) / pending.length
209
+ : (goldCount === 0 ? 0.8 : 0); // uncovered categories get high priority
210
+ priorities.push({ category: cat, goldCount, pendingCount, avgBenefit, rank: 0 });
211
+ }
212
+ // Rank by avgBenefit descending
213
+ priorities.sort((a, b) => b.avgBenefit - a.avgBenefit);
214
+ priorities.forEach((p, i) => { p.rank = i + 1; });
215
+ return priorities;
216
+ }
217
+ // ═══════════════════════════════════════════════════════════════
218
+ // Reporting
219
+ // ═══════════════════════════════════════════════════════════════
220
+ function printTieredReport(dataset) {
221
+ console.log("\n╔════════════════════════════════════════════════════╗");
222
+ console.log("║ P9.2e Three-Tier Gold Data System ║");
223
+ console.log("╚════════════════════════════════════════════════════╝\n");
224
+ console.log(` Total cases: ${dataset.metadata.total}`);
225
+ console.log(` Tier 1 (Gold): ${dataset.metadata.byTier.gold} (verified)`);
226
+ console.log(` Tier 2 (Silver): ${dataset.metadata.byTier.silver} (auto, detectable)`);
227
+ console.log(` Tier 3 (Raw): ${dataset.metadata.byTier.raw} (auto, pending)`);
228
+ console.log();
229
+ console.log(` Covered categories: ${dataset.metadata.coveredCategories.join(", ") || "none"}`);
230
+ console.log(` Uncovered categories: ${dataset.metadata.uncoveredCategories.join(", ") || "none"}`);
231
+ console.log();
232
+ const priorities = getAnnotationPriorities(dataset);
233
+ console.log(` ── Annotation Priority ──`);
234
+ console.log(` ${'Rank'.padEnd(6)} ${'Category'.padEnd(22)} ${'Gold'.padEnd(6)} ${'Pending'.padEnd(8)} ${'Avg Benefit'}`);
235
+ console.log(` ${'─'.repeat(62)}`);
236
+ for (const p of priorities) {
237
+ const icon = p.goldCount === 0 ? "🆕" : p.goldCount < 3 ? "⚠️" : "✅";
238
+ console.log(` ${String(p.rank).padEnd(6)} ${icon} ${p.category.padEnd(20)} ${String(p.goldCount).padEnd(6)} ${String(p.pendingCount).padEnd(8)} ${p.avgBenefit.toFixed(3)}`);
239
+ }
240
+ console.log();
241
+ }
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 12: Governance Dashboard
4
+ *
5
+ * CEO/CISO-ready web dashboard for AI Code Governance.
6
+ * Shows the 4 key metrics, risk level, and recent activity.
7
+ *
8
+ * Usage:
9
+ * npx ts-node src/governance-dashboard.ts
10
+ * PROGMUNE_DASH_PORT=3200 npx ts-node src/governance-dashboard.ts
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ const http = __importStar(require("http"));
47
+ const PORT = parseInt(process.env.PROGMUNE_DASH_PORT || "3200", 10);
48
+ // ═══════════════════════════════════════════════════════════════
49
+ // Data API
50
+ // ═══════════════════════════════════════════════════════════════
51
+ function getDashboardData() {
52
+ const { getAllSessions, getAntibodyStats } = require("./failure-corpus");
53
+ const { verifyAllFingerprints } = require("./ledger-registry");
54
+ const { buildPLSB, PROTOCOL_WEAKNESS_TAXONOMY } = require("./plsb-benchmark");
55
+ const sessions = getAllSessions();
56
+ const fpSummary = verifyAllFingerprints();
57
+ const abStats = getAntibodyStats();
58
+ const benchmark = buildPLSB();
59
+ const taxonomy = PROTOCOL_WEAKNESS_TAXONOMY;
60
+ const byPLS = benchmark.metadata?.byPLS || {};
61
+ // Per-session analysis
62
+ let validated = 0;
63
+ let failed = 0;
64
+ let tampered = 0;
65
+ let totalTransitions = 0;
66
+ for (const s of sessions) {
67
+ let trans = [];
68
+ for (const a of s.attempts || [])
69
+ trans = trans.concat(a.transitions || []);
70
+ totalTransitions += trans.length;
71
+ const hasViolations = (s.attempts || []).some((a) => (a.violations || []).length > 0);
72
+ if (hasViolations)
73
+ failed++;
74
+ else
75
+ validated++;
76
+ }
77
+ tampered = fpSummary.tampered || 0;
78
+ // Risk level
79
+ const total = sessions.length;
80
+ let riskLevel = "PASS";
81
+ let riskColor = "#22c55e";
82
+ if (tampered > 0) {
83
+ riskLevel = "FAIL";
84
+ riskColor = "#ef4444";
85
+ }
86
+ else if (total > 0 && validated / total < 0.85) {
87
+ riskLevel = "WARN";
88
+ riskColor = "#f59e0b";
89
+ }
90
+ else if (failed > total * 0.1) {
91
+ riskLevel = "WARN";
92
+ riskColor = "#f59e0b";
93
+ }
94
+ // PLSB
95
+ const covered = taxonomy.filter((t) => (byPLS[t.id] || 0) > 0).length;
96
+ // Recent sessions
97
+ const recent = sessions
98
+ .filter((s) => s.attempts?.length > 0)
99
+ .slice(-10)
100
+ .reverse()
101
+ .map((s) => {
102
+ let trans = 0;
103
+ let viols = 0;
104
+ for (const a of s.attempts || []) {
105
+ trans += (a.transitions || []).length;
106
+ viols += (a.violations || []).length;
107
+ }
108
+ return {
109
+ sessionId: s.sessionId?.slice(0, 24),
110
+ intent: (s.intent || "").slice(0, 50),
111
+ transitions: trans,
112
+ violations: viols,
113
+ outcome: viols === 0 ? "pass" : "violation",
114
+ };
115
+ });
116
+ return {
117
+ timestamp: new Date().toISOString(),
118
+ risk: { level: riskLevel, color: riskColor },
119
+ assets: {
120
+ total: total,
121
+ validated: validated,
122
+ failed: failed,
123
+ tampered: tampered,
124
+ },
125
+ transitions: totalTransitions,
126
+ fingerprints: {
127
+ total: fpSummary.total || 0,
128
+ verified: fpSummary.valid || 0,
129
+ tampered: fpSummary.tampered || 0,
130
+ },
131
+ antibodies: {
132
+ totalHits: abStats.totalHits || 0,
133
+ fastPath: abStats.fastPathHits || 0,
134
+ llmSaved: abStats.totalLLMCallsSaved || 0,
135
+ tokensSaved: abStats.totalTokensSaved || 0,
136
+ },
137
+ plsb: {
138
+ version: benchmark.version || "1.0",
139
+ entries: benchmark.metadata?.total || 0,
140
+ categoriesCovered: covered,
141
+ categoriesTotal: taxonomy.length,
142
+ recall: ((benchmark.metadata?.recall || 0) * 100).toFixed(0),
143
+ },
144
+ recent,
145
+ };
146
+ }
147
+ // ═══════════════════════════════════════════════════════════════
148
+ // HTML Template
149
+ // ═══════════════════════════════════════════════════════════════
150
+ function renderHTML() {
151
+ return `<!DOCTYPE html>
152
+ <html lang="en">
153
+ <head>
154
+ <meta charset="UTF-8">
155
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
156
+ <meta http-equiv="refresh" content="30">
157
+ <title>Progmune Governance Dashboard</title>
158
+ <style>
159
+ *{margin:0;padding:0;box-sizing:border-box}
160
+ body{
161
+ font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
162
+ background:#0a0a0a;color:#d4d4d4;min-height:100vh
163
+ }
164
+ .header{
165
+ background:#111;border-bottom:1px solid #222;padding:16px 24px;
166
+ display:flex;justify-content:space-between;align-items:center
167
+ }
168
+ .header h1{font-size:18px;font-weight:600;color:#fff}
169
+ .header .sub{font-size:12px;color:#666}
170
+ .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;padding:24px;max-width:1200px;margin:0 auto}
171
+ .metric{
172
+ background:#111;border:1px solid #222;border-radius:8px;padding:20px;
173
+ text-align:center
174
+ }
175
+ .metric .value{font-size:36px;font-weight:700;line-height:1.2}
176
+ .metric .label{font-size:12px;color:#666;margin-top:4px;text-transform:uppercase;letter-spacing:0.5px}
177
+ .risk-banner{
178
+ max-width:1200px;margin:0 auto;padding:0 24px 16px;
179
+ display:flex;justify-content:center
180
+ }
181
+ .risk-badge{
182
+ padding:12px 32px;border-radius:8px;font-size:16px;font-weight:700;
183
+ text-align:center;min-width:300px
184
+ }
185
+ .section{max-width:1200px;margin:0 auto;padding:0 24px 24px}
186
+ .section h2{font-size:14px;color:#888;margin-bottom:12px;text-transform:uppercase;letter-spacing:0.5px}
187
+ .cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
188
+ .card{
189
+ background:#111;border:1px solid #222;border-radius:8px;padding:16px
190
+ }
191
+ .card .title{font-size:12px;color:#666;margin-bottom:8px;text-transform:uppercase}
192
+ .card .big{font-size:24px;font-weight:600;color:#fff}
193
+ .card .detail{font-size:12px;color:#888;margin-top:4px}
194
+ table{width:100%;border-collapse:collapse}
195
+ table th{text-align:left;font-size:11px;color:#666;padding:8px 12px;border-bottom:1px solid #222}
196
+ table td{font-size:13px;padding:8px 12px;border-bottom:1px solid #111}
197
+ table tr:hover td{background:#151515}
198
+ .tag{padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600}
199
+ .tag-pass{background:#052e16;color:#22c55e}
200
+ .tag-fail{background:#450a0a;color:#ef4444}
201
+ .footer{text-align:center;padding:24px;color:#444;font-size:11px}
202
+ .bar{height:6px;border-radius:3px;background:#222;margin-top:8px;overflow:hidden}
203
+ .bar-fill{height:100%;border-radius:3px;transition:width .3s}
204
+ </style>
205
+ </head>
206
+ <body>
207
+ <div class="header">
208
+ <div>
209
+ <h1>Progmune Governance</h1>
210
+ <div class="sub">AI Code Governance Dashboard</div>
211
+ </div>
212
+ <div class="sub" id="time">—</div>
213
+ </div>
214
+ <div id="app">Loading...</div>
215
+ <div class="footer">
216
+ Progmune Runtime — AI Generated Software Governance
217
+ &nbsp;·&nbsp;
218
+ <a href="https://github.com/shenlian19831109/progmune-runtime" style="color:#666">GitHub</a>
219
+ </div>
220
+ <script>
221
+ async function load() {
222
+ try {
223
+ const r = await fetch('/api/dashboard');
224
+ const d = await r.json();
225
+ render(d);
226
+ } catch(e) {
227
+ document.getElementById('app').innerHTML =
228
+ '<div style="text-align:center;padding:60px;color:#ef4444">⚠️ Unable to load dashboard data</div>';
229
+ }
230
+ }
231
+
232
+ function render(d) {
233
+ document.getElementById('time').textContent =
234
+ new Date(d.timestamp).toLocaleString();
235
+
236
+ const pct = d.assets.total > 0
237
+ ? Math.round(d.assets.validated / d.assets.total * 100) : 0;
238
+
239
+ const html = '<div class="risk-banner">' +
240
+ '<div class="risk-badge" style="background:'+d.risk.color+'15;color:'+d.risk.color+';border:1px solid '+d.risk.color+'40">' +
241
+ 'Risk Level: <strong>' + d.risk.level + '</strong>' +
242
+ '</div></div>' +
243
+
244
+ '<div class="grid">' +
245
+ metric(d.assets.total, 'AI Assets', '#fff', 'Total AI-generated code files tracked') +
246
+ metric(d.assets.validated, 'Verified', '#22c55e', pct+'% validation rate') +
247
+ metric(d.assets.failed, 'Failed', '#f59e0b', d.assets.failed + ' files with violations') +
248
+ metric(d.assets.tampered, 'Tampered', '#ef4444', d.assets.tampered + ' broken provenance chains') +
249
+ '</div>' +
250
+
251
+ '<div class="section"><h2>System Overview</h2><div class="cards">' +
252
+ card('Fingerprints', d.fingerprints.verified + ' / ' + d.fingerprints.total,
253
+ d.fingerprints.tampered + ' tampered',
254
+ (d.fingerprints.total > 0 ? Math.round(d.fingerprints.verified/d.fingerprints.total*100) : 0) + '%') +
255
+ card('PLSB Coverage', d.plsb.categoriesCovered + ' / ' + d.plsb.categoriesTotal,
256
+ d.plsb.entries + ' entries · recall ' + d.plsb.recall + '%',
257
+ Math.round(d.plsb.categoriesCovered/d.plsb.categoriesTotal*100) + '%') +
258
+ card('Immune System', d.antibodies.totalHits + ' hits',
259
+ d.antibodies.llmSaved + ' LLM calls · ' + (d.antibodies.tokensSaved||0).toLocaleString() + ' tokens saved',
260
+ (d.antibodies.totalHits > 0 ? Math.round(d.antibodies.fastPath/d.antibodies.totalHits*100) : 0) + '% fast-path') +
261
+ '</div></div>' +
262
+
263
+ '<div class="section"><h2>Recent Activity</h2>' +
264
+ '<table><tr><th>Session</th><th>Intent</th><th>Transitions</th><th>Status</th></tr>' +
265
+ d.recent.map(s =>
266
+ '<tr>' +
267
+ '<td style="font-family:monospace;font-size:11px">' + esc(s.sessionId) + '</td>' +
268
+ '<td>' + esc(s.intent) + '</td>' +
269
+ '<td>' + s.transitions + '</td>' +
270
+ '<td><span class="tag '+(s.outcome==='pass'?'tag-pass':'tag-fail')+'">' +
271
+ (s.outcome==='pass' ? '✓ PASS' : '✗ '+s.violations+' violations') +
272
+ '</span></td></tr>'
273
+ ).join('') +
274
+ '</table></div>';
275
+
276
+ document.getElementById('app').innerHTML = html;
277
+ }
278
+
279
+ function metric(value, label, color, detail) {
280
+ return '<div class="metric">' +
281
+ '<div class="value" style="color:'+color+'">' + value.toLocaleString() + '</div>' +
282
+ '<div class="label">' + label + '</div>' +
283
+ '<div style="font-size:11px;color:#555;margin-top:4px">' + detail + '</div>' +
284
+ '</div>';
285
+ }
286
+
287
+ function card(title, big, detail, pct) {
288
+ return '<div class="card">' +
289
+ '<div class="title">' + title + '</div>' +
290
+ '<div class="big">' + big + '</div>' +
291
+ '<div class="detail">' + detail + '</div>' +
292
+ '<div class="bar"><div class="bar-fill" style="width:'+pct+';background:#333"></div></div>' +
293
+ '</div>';
294
+ }
295
+
296
+ function esc(s) { const d=document.createElement('div');d.textContent=s||'';return d.innerHTML }
297
+
298
+ load();
299
+ </script>
300
+ </body>
301
+ </html>`;
302
+ }
303
+ // ═══════════════════════════════════════════════════════════════
304
+ // Server
305
+ // ═══════════════════════════════════════════════════════════════
306
+ const server = http.createServer((req, res) => {
307
+ const url = req.url || "/";
308
+ // API: dashboard data
309
+ if (url === "/api/dashboard") {
310
+ try {
311
+ const data = getDashboardData();
312
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
313
+ res.end(JSON.stringify(data));
314
+ }
315
+ catch (e) {
316
+ res.writeHead(500, { "Content-Type": "application/json" });
317
+ res.end(JSON.stringify({ error: e.message }));
318
+ }
319
+ return;
320
+ }
321
+ // HTML: dashboard page
322
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
323
+ res.end(renderHTML());
324
+ });
325
+ server.listen(PORT, () => {
326
+ console.error(`\n Governance Dashboard: http://localhost:${PORT}\n`);
327
+ });