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,315 @@
1
+ "use strict";
2
+ /**
3
+ * Progmune V7 — Proof Provenance System
4
+ * ======================================
5
+ * 把每一个不变量变成可追溯的证明对象。
6
+ *
7
+ * 核心原则:
8
+ * Proof ≠ Belief — 两者永远分离。
9
+ *
10
+ * Proof: 形式逻辑对象。回答"这个结论能否从前提推导出来?"
11
+ * 没有概率,只有有效/无效。每一层推导都精确记录来源。
12
+ *
13
+ * Belief: 工程决策对象。回答"我们有多相信这个结论?"
14
+ * 融合运行时数据、Git 历史、业务文档、人工确认。
15
+ * 这是 V8 的事。
16
+ *
17
+ * 三层架构:
18
+ * L1 Recovery: Code → AST → State Machine → Protocol
19
+ * L2 Reasoning: Protocol → Proof Tree → Counterexample → Retain/Discard
20
+ * L3 Belief: Proof + Runtime + Docs + Human → Belief Score (V8)
21
+ *
22
+ * V7 完成 L1+L2。Proof 层不出现任何概率数字。
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || (function () {
41
+ var ownKeys = function(o) {
42
+ ownKeys = Object.getOwnPropertyNames || function (o) {
43
+ var ar = [];
44
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
45
+ return ar;
46
+ };
47
+ return ownKeys(o);
48
+ };
49
+ return function (mod) {
50
+ if (mod && mod.__esModule) return mod;
51
+ var result = {};
52
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
53
+ __setModuleDefault(result, mod);
54
+ return result;
55
+ };
56
+ })();
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ exports.buildProofProvenance = buildProofProvenance;
59
+ const fs = __importStar(require("fs"));
60
+ const path = __importStar(require("path"));
61
+ // ══════════════════════════════════════════════
62
+ // L1: RECOVERY — Build derivation from code artifacts
63
+ // ══════════════════════════════════════════════
64
+ /**
65
+ * Build a derivation node for an OBSERVATION — something directly read from code.
66
+ * This is the leaf of every proof tree. No inference. Just extraction.
67
+ */
68
+ function observationNode(id, conclusion, sourceFile, sourceLine, extractionMethod) {
69
+ return {
70
+ id,
71
+ conclusion,
72
+ rule: "OBSERVATION",
73
+ children: [],
74
+ provenance: {
75
+ sourceFile,
76
+ sourceLine,
77
+ sourceArtifact: conclusion,
78
+ extractionMethod,
79
+ transformationChain: [extractionMethod],
80
+ },
81
+ depth: 0,
82
+ };
83
+ }
84
+ /**
85
+ * Extend an observation through a transformation.
86
+ * e.g. OBSERVATION("status: ['pending','paid','shipped']")
87
+ * → STATE_MACHINE("order_suppliers: pending → paid → shipped → completed")
88
+ */
89
+ function transformNode(id, conclusion, childId, rule, transformStep) {
90
+ return {
91
+ id,
92
+ conclusion,
93
+ rule,
94
+ children: [childId],
95
+ provenance: {
96
+ sourceFile: "", // Filled by combining child provenances
97
+ sourceLine: 0,
98
+ sourceArtifact: conclusion,
99
+ extractionMethod: transformStep,
100
+ transformationChain: [transformStep],
101
+ },
102
+ depth: 1,
103
+ };
104
+ }
105
+ // ══════════════════════════════════════════════
106
+ // L2: REASONING — Build the full proof provenance graph
107
+ // ══════════════════════════════════════════════
108
+ /**
109
+ * Build a complete Provenance Report from the pipeline outputs.
110
+ *
111
+ * Every invariant gets:
112
+ * 1. A full derivation tree tracing back to OBSERVATION leaves
113
+ * 2. A refutation record if V6 found a counterexample
114
+ * 3. No probability — only provenance
115
+ */
116
+ function buildProvenance(protocols, stateMachines, proofEngine) {
117
+ const invariants = [];
118
+ const refutations = [];
119
+ let nodeCounter = 1000;
120
+ // ── Build derivation trees from protocol invariants ──
121
+ for (const proto of protocols) {
122
+ for (const inv of proto.invariants || []) {
123
+ const id = inv.id;
124
+ const predicate = inv.predicate || inv.rawPredicate || "";
125
+ const sources = inv.sources || [];
126
+ const domain = inv.domain || proto.domain || "unknown";
127
+ // Determine logic type from the predicate
128
+ let logicType = "REQUIRES";
129
+ if (predicate.includes("¬(") && predicate.includes("→"))
130
+ logicType = "FORBIDS";
131
+ else if (predicate.includes("¬∃"))
132
+ logicType = "TERMINAL";
133
+ else if (predicate.includes("≤ 1") || predicate.includes("unique"))
134
+ logicType = "UNIQUE";
135
+ else if (predicate.includes("initial_state"))
136
+ logicType = "INITIAL";
137
+ // Find the corresponding state machine
138
+ const machine = stateMachines.find((m) => m.entity === domain || domain.includes(m.entity) || m.entity.includes(domain));
139
+ // Build the OBSERVATION leaf
140
+ const sourceFile = sources[0] || "unknown";
141
+ const obsNode = observationNode(`OBS-${nodeCounter++}`, sources[0] || predicate, sourceFile.includes("State transition") ? "state-miner output" : sourceFile, 0, sourceFile.includes("Domain:") ? "domain_template" : "state_transition_recovery");
142
+ // Build the STATE_MACHINE intermediate node (if machine exists)
143
+ let derivation;
144
+ if (machine) {
145
+ const smNode = transformNode(`SM-${nodeCounter++}`, `${machine.entity}: ${(machine.states || []).join(" → ")}`, obsNode.id, "STATE_MACHINE", "state_transition_recovery → state_machine");
146
+ smNode.depth = 1;
147
+ // Build the top-level PROTOCOL node
148
+ derivation = {
149
+ id: `PR-${nodeCounter++}`,
150
+ conclusion: predicate,
151
+ rule: inv.id.startsWith("INV-TMPL") ? "PROTOCOL_TEMPLATE" : "STATE_MACHINE",
152
+ children: [smNode.id],
153
+ provenance: {
154
+ sourceFile: sourceFile,
155
+ sourceLine: 0,
156
+ sourceArtifact: predicate,
157
+ extractionMethod: smNode.provenance.extractionMethod,
158
+ transformationChain: [...smNode.provenance.transformationChain, "state_machine → protocol_invariant"],
159
+ },
160
+ depth: 2,
161
+ };
162
+ // Attach all nodes for serialization
163
+ derivation._obsNode = obsNode;
164
+ derivation._smNode = smNode;
165
+ }
166
+ else {
167
+ // No state machine — direct OBSERVATION → invariant
168
+ derivation = {
169
+ id: `PR-${nodeCounter++}`,
170
+ conclusion: predicate,
171
+ rule: "PROTOCOL_TEMPLATE",
172
+ children: [obsNode.id],
173
+ provenance: {
174
+ sourceFile: sourceFile,
175
+ sourceLine: 0,
176
+ sourceArtifact: predicate,
177
+ extractionMethod: obsNode.provenance.extractionMethod,
178
+ transformationChain: [...obsNode.provenance.transformationChain, "template → invariant"],
179
+ },
180
+ depth: 1,
181
+ };
182
+ derivation._obsNode = obsNode;
183
+ }
184
+ // Check refutation from V6 — match by PREDICATE TEXT, not ID
185
+ // (IDs collide across protocols: each has its own INV-3)
186
+ const v6Counterexamples = proofEngine?.counterexamples || [];
187
+ const ce = v6Counterexamples.find((c) => c.invariantStatement === predicate);
188
+ const isRefuted = !!ce;
189
+ if (ce) {
190
+ refutations.push({
191
+ invariantId: id,
192
+ invariantPredicate: predicate,
193
+ counterexamplePath: ce.path || [],
194
+ explanation: ce.explanation || "",
195
+ refutationRule: "BFS_SHORTCUT",
196
+ });
197
+ }
198
+ invariants.push({
199
+ id,
200
+ predicate,
201
+ domain,
202
+ logicType,
203
+ derivation,
204
+ derivationDepth: derivation.depth,
205
+ isRefuted,
206
+ counterexamplePath: ce?.path,
207
+ counterexampleExplanation: ce?.explanation,
208
+ });
209
+ }
210
+ }
211
+ // ── Check inferred invariants from V6 ──
212
+ for (const inf of proofEngine?.inferred || []) {
213
+ const pred = inf.deducedPredicate;
214
+ const premises = inf.premises || [];
215
+ const proofTree = inf.proofTree;
216
+ // Build TRANSITIVITY node with premises as children
217
+ const derivation = {
218
+ id: `INF-${nodeCounter++}`,
219
+ conclusion: pred,
220
+ rule: "TRANSITIVITY",
221
+ children: premises.map((p) => p.id),
222
+ provenance: {
223
+ sourceFile: "",
224
+ sourceLine: 0,
225
+ sourceArtifact: pred,
226
+ extractionMethod: "transitive_closure",
227
+ transformationChain: ["premise_a ⇒ premise_b", "premise_b ⇒ premise_c", "transitivity ⇒ conclusion"],
228
+ },
229
+ depth: 2,
230
+ };
231
+ invariants.push({
232
+ id: proofTree?.id || `INF-${nodeCounter}`,
233
+ predicate: pred,
234
+ domain: "inferred",
235
+ logicType: "REQUIRES",
236
+ derivation,
237
+ derivationDepth: 2,
238
+ isRefuted: false,
239
+ });
240
+ }
241
+ // Compute summary
242
+ const observations = invariants.filter(i => i.derivationDepth === 0 || i.derivation.rule === "OBSERVATION");
243
+ const derived = invariants.filter(i => !i.isRefuted && i.derivationDepth > 0);
244
+ const refuted = invariants.filter(i => i.isRefuted);
245
+ const retained = invariants.filter(i => !i.isRefuted);
246
+ const depths = invariants.map(i => i.derivationDepth);
247
+ const report = {
248
+ timestamp: new Date().toISOString(),
249
+ invariants,
250
+ refutations,
251
+ summary: {
252
+ totalInvariants: invariants.length,
253
+ observations: observations.length,
254
+ derived: derived.length,
255
+ refuted: refuted.length,
256
+ retained: retained.length,
257
+ proofDepth: {
258
+ min: depths.length > 0 ? Math.min(...depths) : 0,
259
+ max: depths.length > 0 ? Math.max(...depths) : 0,
260
+ avg: depths.length > 0 ? Math.round(depths.reduce((a, b) => a + b, 0) / depths.length) : 0,
261
+ },
262
+ },
263
+ };
264
+ return report;
265
+ }
266
+ // ══════════════════════════════════════════════
267
+ // MAIN
268
+ // ══════════════════════════════════════════════
269
+ function buildProofProvenance(projectPath) {
270
+ console.log("🔬 Progmune Proof Provenance System — V7");
271
+ const protoPath = path.join(projectPath, ".progmune_protocols.json");
272
+ const statePath = path.join(projectPath, ".progmune_state_machines.json");
273
+ const proofPath = path.join(projectPath, ".progmune_proofs.json");
274
+ const protocols = fs.existsSync(protoPath) ? JSON.parse(fs.readFileSync(protoPath, "utf-8")).protocols || [] : [];
275
+ const stateMachines = fs.existsSync(statePath) ? JSON.parse(fs.readFileSync(statePath, "utf-8")).machines || [] : [];
276
+ const proofEngine = fs.existsSync(proofPath) ? JSON.parse(fs.readFileSync(proofPath, "utf-8")) : {};
277
+ console.log(` Input: ${protocols.length} protocols, ${stateMachines.length} state machines`);
278
+ console.log(` V6 data: ${proofEngine.summary?.totalInvariants || 0} invariants, ${proofEngine.summary?.counterexamples || 0} counterexamples`);
279
+ const report = buildProvenance(protocols, stateMachines, proofEngine);
280
+ // Print the proof provenance for refuted invariants
281
+ console.log(`\n ${report.summary.totalInvariants} invariants with full provenance`);
282
+ console.log(` ${report.summary.refuted} refuted (counterexample found)`);
283
+ console.log(` ${report.summary.retained} retained`);
284
+ if (report.refutations.length > 0) {
285
+ console.log("\n ── Refutations ──");
286
+ for (const ref of report.refutations) {
287
+ console.log(` ❌ ${ref.invariantPredicate}`);
288
+ console.log(` Rule: ${ref.refutationRule}`);
289
+ console.log(` Path: ${ref.counterexamplePath.join(" → ")}`);
290
+ }
291
+ }
292
+ return report;
293
+ }
294
+ // ══════════════════════════════════════════════
295
+ // CLI
296
+ // ══════════════════════════════════════════════
297
+ if (require.main === module) {
298
+ const targetProject = process.argv[2];
299
+ if (!targetProject) {
300
+ console.error("Usage: npx ts-node src/proof-provenance.ts <project-path>");
301
+ process.exit(1);
302
+ }
303
+ const report = buildProofProvenance(targetProject);
304
+ const outputPath = path.join(targetProject, ".progmune_provenance.json");
305
+ fs.writeFileSync(outputPath, JSON.stringify(report, null, 2));
306
+ console.log(`\n✅ Provenance report saved to: ${outputPath}`);
307
+ console.log("\n═══ Proof Provenance Summary ═══");
308
+ console.log(` Total: ${report.summary.totalInvariants}`);
309
+ console.log(` Observations: ${report.summary.observations}`);
310
+ console.log(` Derived: ${report.summary.derived}`);
311
+ console.log(` Refuted: ${report.summary.refuted}`);
312
+ console.log(` Retained: ${report.summary.retained}`);
313
+ console.log(` Proof Depth: min=${report.summary.proofDepth.min} max=${report.summary.proofDepth.max} avg=${report.summary.proofDepth.avg}`);
314
+ console.log();
315
+ }
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ /**
3
+ * P3.6: Protocol Coverage Engine
4
+ *
5
+ * Analyzes Trajectory Corpus against Protocol Definitions to determine
6
+ * which states and transitions have been observed in real execution data.
7
+ *
8
+ * Core question: "What does the system NOT know yet?"
9
+ *
10
+ * Coverage gaps drive:
11
+ * 1. Benchmark generation (targeted test cases)
12
+ * 2. Data acquisition priorities (where to collect more feedback)
13
+ * 3. Risk assessment (which protocols are under-observed)
14
+ *
15
+ * Architecture:
16
+ * Protocol definitions → All possible states + transitions
17
+ * Trajectory records → Observed states + transitions
18
+ * Coverage engine → Gap analysis + risk ranking
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.parseProtocolDefinition = parseProtocolDefinition;
55
+ exports.analyzeCoverage = analyzeCoverage;
56
+ exports.analyzeAllCoverage = analyzeAllCoverage;
57
+ exports.loadDefaultProtocolDefinitions = loadDefaultProtocolDefinitions;
58
+ // ═══════════════════════════════════════════════════════════════
59
+ // Protocol Parser
60
+ // ═══════════════════════════════════════════════════════════════
61
+ function parseTransitions(rules) {
62
+ const transitions = [];
63
+ for (const [fn, rule] of rules) {
64
+ // Acquire transitions: pre_states (or INIT) → post_states
65
+ const pres = rule.pre_states.length > 0 ? rule.pre_states : ["INIT"];
66
+ for (const pre of pres) {
67
+ for (const post of rule.post_states) {
68
+ transitions.push({ from: pre, to: post, rule: fn, type: "acquire" });
69
+ }
70
+ }
71
+ // Invalidation transitions: state → ∅
72
+ if (rule.invalidate) {
73
+ for (const inv of rule.invalidate) {
74
+ transitions.push({ from: inv, to: "∅", rule: fn, type: "invalidate" });
75
+ }
76
+ }
77
+ }
78
+ return transitions;
79
+ }
80
+ function allStatesFromRules(rules, initialState) {
81
+ const states = new Set();
82
+ states.add(initialState);
83
+ states.add("INIT");
84
+ for (const rule of rules.values()) {
85
+ for (const s of rule.pre_states)
86
+ states.add(s);
87
+ for (const s of rule.post_states)
88
+ states.add(s);
89
+ if (rule.invalidate)
90
+ for (const s of rule.invalidate)
91
+ states.add(s);
92
+ }
93
+ return [...states].sort();
94
+ }
95
+ /** Parse a protocol definition from its rules. */
96
+ function parseProtocolDefinition(name, rules, initialState) {
97
+ return {
98
+ name,
99
+ states: allStatesFromRules(rules, initialState),
100
+ initialState,
101
+ transitions: parseTransitions(rules),
102
+ rules,
103
+ };
104
+ }
105
+ // ═══════════════════════════════════════════════════════════════
106
+ // Coverage Analyzer
107
+ // ═══════════════════════════════════════════════════════════════
108
+ /** Extract observed states from a trajectory. */
109
+ function extractVisitedStates(trajectory, rules, initial) {
110
+ const visited = new Set();
111
+ if (initial)
112
+ visited.add(initial);
113
+ let current = new Set();
114
+ if (initial)
115
+ current.add(initial);
116
+ for (const fn of trajectory) {
117
+ const rule = rules.get(fn);
118
+ if (!rule)
119
+ continue;
120
+ for (const pre of rule.pre_states)
121
+ visited.add(pre);
122
+ for (const post of rule.post_states) {
123
+ visited.add(post);
124
+ current.add(post);
125
+ }
126
+ if (rule.invalidate)
127
+ rule.invalidate.forEach(s => { visited.add(s); current.delete(s); });
128
+ }
129
+ return visited;
130
+ }
131
+ /** Extract observed transitions from a trajectory. */
132
+ function extractVisitedTransitions(trajectory, rules, initial) {
133
+ const visited = new Set();
134
+ let current = new Set();
135
+ if (initial)
136
+ current.add(initial);
137
+ for (const fn of trajectory) {
138
+ const rule = rules.get(fn);
139
+ if (!rule)
140
+ continue;
141
+ for (const pre of rule.pre_states) {
142
+ for (const post of rule.post_states) {
143
+ visited.add(`${pre}→${post}`);
144
+ }
145
+ }
146
+ if (rule.invalidate) {
147
+ for (const inv of rule.invalidate) {
148
+ visited.add(`${inv}→∅`);
149
+ }
150
+ }
151
+ // Advance state
152
+ if (rule.invalidate)
153
+ rule.invalidate.forEach(s => current.delete(s));
154
+ for (const post of rule.post_states)
155
+ current.add(post);
156
+ }
157
+ return visited;
158
+ }
159
+ /**
160
+ * Compute coverage for a single protocol from trajectory data.
161
+ */
162
+ function analyzeCoverage(protocol, trajectories) {
163
+ // Filter trajectories relevant to this protocol
164
+ const relevant = trajectories.filter(t => t.protocol === protocol.name || t.protocol === "_global");
165
+ // Aggregate visited states + transitions
166
+ const visitedStates = new Set();
167
+ const visitedTransitions = new Set();
168
+ for (const t of relevant) {
169
+ const initialState = t.initialState?.length > 0 ? t.initialState[0] : undefined;
170
+ for (const s of extractVisitedStates(t.trajectory, protocol.rules, initialState))
171
+ visitedStates.add(s);
172
+ for (const tr of extractVisitedTransitions(t.trajectory, protocol.rules, initialState))
173
+ visitedTransitions.add(tr);
174
+ }
175
+ const totalStates = protocol.states.length;
176
+ const visitedStateCount = [...visitedStates].filter(s => protocol.states.includes(s)).length;
177
+ const totalTransitions = protocol.transitions.length;
178
+ const visitedTransitionKeys = new Set(protocol.transitions.filter(t => visitedTransitions.has(`${t.from}→${t.to}`)).map(t => `${t.from}→${t.to}`));
179
+ const missingStates = protocol.states.filter(s => !visitedStates.has(s));
180
+ const missingTransitions = protocol.transitions
181
+ .filter(t => !visitedTransitions.has(`${t.from}→${t.to}`))
182
+ .map(t => ({ from: t.from, to: t.to, rule: t.rule }));
183
+ return {
184
+ protocol: protocol.name,
185
+ stateCoverage: {
186
+ protocol: protocol.name,
187
+ totalStates,
188
+ visitedStates: visitedStateCount,
189
+ stateCoverage: totalStates > 0 ? visitedStateCount / totalStates : 0,
190
+ missingStates,
191
+ },
192
+ transitionCoverage: {
193
+ protocol: protocol.name,
194
+ totalTransitions,
195
+ visitedTransitions: visitedTransitionKeys.size,
196
+ transitionCoverage: totalTransitions > 0 ? visitedTransitionKeys.size / totalTransitions : 0,
197
+ missingTransitions,
198
+ },
199
+ trajectoryCount: relevant.length,
200
+ };
201
+ }
202
+ /**
203
+ * Analyze coverage across all protocols.
204
+ */
205
+ function analyzeAllCoverage(protocols, trajectories) {
206
+ return protocols.map(p => analyzeCoverage(p, trajectories));
207
+ }
208
+ // ═══════════════════════════════════════════════════════════════
209
+ // Default protocol definitions (from protocols.json)
210
+ // ═══════════════════════════════════════════════════════════════
211
+ const fs = __importStar(require("fs"));
212
+ const path = __importStar(require("path"));
213
+ const ssg_validator_1 = require("./ssg-validator");
214
+ let _cachedProtocols = null;
215
+ function loadDefaultProtocolDefinitions() {
216
+ if (_cachedProtocols)
217
+ return _cachedProtocols;
218
+ const protoDef = JSON.parse(fs.readFileSync(path.resolve(__dirname, "..", "protocols.json"), "utf-8"));
219
+ const fns = (0, ssg_validator_1.parseProtocolsFromJSON)(protoDef);
220
+ const rules = new Map();
221
+ for (const p of fns)
222
+ rules.set(p.function, p.protocol);
223
+ // Split rules into logical protocol groups by state namespace
224
+ const protocolGroups = [
225
+ {
226
+ name: "FileProtocol",
227
+ ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("FILE")) || rule.post_states.some(s => s.includes("FILE")) || (rule.invalidate || []).some(s => s.includes("FILE")),
228
+ initialState: "INIT",
229
+ },
230
+ {
231
+ name: "AuthProtocol",
232
+ ruleFilter: (_fn, rule) => rule.pre_states.some(s => ["UNAUTHENTICATED", "PASSWORD_VERIFIED", "TOKEN_ISSUED", "SESSION_ACTIVE"].includes(s)) ||
233
+ rule.post_states.some(s => ["UNAUTHENTICATED", "PASSWORD_VERIFIED", "TOKEN_ISSUED", "SESSION_ACTIVE"].includes(s)),
234
+ initialState: "UNAUTHENTICATED",
235
+ },
236
+ {
237
+ name: "DBProtocol",
238
+ ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("DB")) || rule.post_states.some(s => s.includes("DB")) || (rule.invalidate || []).some(s => s.includes("DB")),
239
+ initialState: "INIT",
240
+ },
241
+ {
242
+ name: "IRProtocol",
243
+ ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("IR_") || s.includes("ACTION_") || s.includes("SEQUENCE_") || s.includes("CODE_") || s.includes("SESSION_")) ||
244
+ rule.post_states.some(s => s.includes("IR_") || s.includes("ACTION_") || s.includes("SEQUENCE_") || s.includes("CODE_") || s.includes("SESSION_")),
245
+ initialState: "IR_STALE",
246
+ },
247
+ {
248
+ name: "StatelessProtocol",
249
+ ruleFilter: (_fn, rule) => rule.namespace === "stateless" ||
250
+ (rule.pre_states.length === 0 && rule.post_states.length === 0),
251
+ initialState: "IDLE",
252
+ },
253
+ {
254
+ name: "TransactionProtocol",
255
+ ruleFilter: (_fn, rule) => rule.namespace === "transaction" ||
256
+ rule.pre_states.some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD") ||
257
+ rule.post_states.some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD") ||
258
+ (rule.invalidate || []).some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD"),
259
+ initialState: "TX_IDLE",
260
+ },
261
+ {
262
+ name: "ConditionalProtocol",
263
+ ruleFilter: (_fn, rule) => rule.namespace === "conditional" ||
264
+ rule.pre_states.some(s => s.startsWith("COND_")) ||
265
+ rule.post_states.some(s => s.startsWith("COND_")) ||
266
+ (rule.invalidate || []).some(s => s.startsWith("COND_")),
267
+ initialState: "COND_IDLE",
268
+ },
269
+ {
270
+ name: "LoopProtocol",
271
+ ruleFilter: (_fn, rule) => rule.namespace === "loop" ||
272
+ rule.pre_states.some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING") ||
273
+ rule.post_states.some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING") ||
274
+ (rule.invalidate || []).some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING"),
275
+ initialState: "LOOP_IDLE",
276
+ },
277
+ {
278
+ name: "CrossProtocol",
279
+ ruleFilter: (_fn, rule) => rule.namespace === "cross" ||
280
+ rule.pre_states.some(s => s.includes("AUTH_FILE_GATE") || s.includes("AUTH_DB_GATE")) ||
281
+ rule.post_states.some(s => s.includes("AUTH_FILE_GATE") || s.includes("AUTH_DB_GATE")),
282
+ initialState: "UNAUTHENTICATED",
283
+ },
284
+ ];
285
+ _cachedProtocols = protocolGroups.map(g => {
286
+ const groupRules = new Map();
287
+ for (const [fn, rule] of rules) {
288
+ if (g.ruleFilter(fn, rule))
289
+ groupRules.set(fn, rule);
290
+ }
291
+ return parseProtocolDefinition(g.name, groupRules, g.initialState);
292
+ });
293
+ return _cachedProtocols;
294
+ }