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,322 @@
1
+ "use strict";
2
+ /**
3
+ * P6.0: Protocol Foundation Model
4
+ *
5
+ * Scales protocol extraction from manual rules to automatic,
6
+ * code-driven discovery. The Protocol VM's knowledge base
7
+ * grows organically from real code patterns.
8
+ *
9
+ * Target: Discovery Rate 43% → 70%+
10
+ *
11
+ * Improvements over basic Protocol Extractor (P5.5):
12
+ * 1. Intelligent state naming (FILE_OPEN, not STATE_OPEN)
13
+ * 2. Domain-specific clustering (group related functions)
14
+ * 3. Confidence-weighted rule merging
15
+ * 4. Direct integration with benchmark evaluation
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.inferStateName = inferStateName;
52
+ exports.inferEnhancedRules = inferEnhancedRules;
53
+ exports.extractProtocolFoundation = extractProtocolFoundation;
54
+ exports.enhancedRulesToMap = enhancedRulesToMap;
55
+ exports.measureDiscoveryImpact = measureDiscoveryImpact;
56
+ exports.printFoundationReport = printFoundationReport;
57
+ const fs = __importStar(require("fs"));
58
+ const path = __importStar(require("path"));
59
+ const protocol_extractor_1 = require("./protocol-extractor");
60
+ const repo_evaluator_1 = require("./repo-evaluator");
61
+ const protocol_coverage_1 = require("./protocol-coverage");
62
+ const evaluation_campaign_1 = require("./evaluation-campaign");
63
+ const discovery_analytics_1 = require("./discovery-analytics");
64
+ // ═══════════════════════════════════════════════════════════════
65
+ // Intelligent State Naming
66
+ // ═══════════════════════════════════════════════════════════════
67
+ const DOMAIN_KEYWORDS = {
68
+ FILE: ["file", "fopen", "fread", "fwrite", "fclose", "open", "read", "write", "close", "flush", "sync", "stat"],
69
+ DB: ["db", "connect", "query", "insert", "update", "delete", "disconnect", "sql", "transaction", "commit", "rollback"],
70
+ AUTH: ["auth", "login", "logout", "password", "token", "jwt", "session", "verify", "credential", "authenticate"],
71
+ NET: ["socket", "connect", "bind", "listen", "accept", "send", "recv", "http", "request", "response"],
72
+ MEM: ["alloc", "malloc", "free", "realloc", "mem", "memory", "buffer", "release"],
73
+ PROC: ["fork", "exec", "wait", "kill", "signal", "process", "thread", "mutex", "lock", "unlock"],
74
+ };
75
+ const STATE_SUFFIXES = {
76
+ open: "_OPEN", close: "_CLOSED", connect: "_CONNECTED", disconnect: "_CLOSED",
77
+ create: "_CREATED", destroy: "_DESTROYED", init: "_INITIALIZED", alloc: "_ALLOCATED",
78
+ free: "_FREED", lock: "_LOCKED", unlock: "_UNLOCKED", start: "_STARTED",
79
+ stop: "_STOPPED", begin: "_ACTIVE", end: "_COMPLETED", login: "_AUTHENTICATED",
80
+ logout: "_UNAUTHENTICATED", read: "_READY", write: "_DIRTY",
81
+ verify: "_VERIFIED", generate: "_ISSUED", send: "_SENT", recv: "_RECEIVED",
82
+ };
83
+ /** Infer a meaningful state name from a function name and its role. */
84
+ function inferStateName(fn, role) {
85
+ const lower = fn.toLowerCase();
86
+ // Find domain
87
+ let domain = "STATE";
88
+ for (const [dom, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
89
+ if (keywords.some(kw => lower.includes(kw))) {
90
+ domain = dom;
91
+ break;
92
+ }
93
+ }
94
+ // Find state suffix
95
+ let suffix = "";
96
+ for (const [key, val] of Object.entries(STATE_SUFFIXES)) {
97
+ if (lower.includes(key)) {
98
+ suffix = val;
99
+ break;
100
+ }
101
+ }
102
+ // Default suffixes by role
103
+ if (!suffix) {
104
+ suffix = role === "pre" ? "_REQUIRED" : role === "invalidate" ? "_INVALIDATED" : "_PRODUCED";
105
+ }
106
+ return `${domain}${suffix}`;
107
+ }
108
+ /**
109
+ * Enhanced protocol rule inference with intelligent state names.
110
+ */
111
+ function inferEnhancedRules(pairs, minFrequency = 3) {
112
+ // Count transition frequencies
113
+ const transitions = new Map();
114
+ const fnFreq = new Map();
115
+ for (const p of pairs) {
116
+ const key = `${p.from}→${p.to}`;
117
+ transitions.set(key, (transitions.get(key) || 0) + 1);
118
+ fnFreq.set(p.from, (fnFreq.get(p.from) || 0) + 1);
119
+ fnFreq.set(p.to, (fnFreq.get(p.to) || 0) + 1);
120
+ }
121
+ const maxFreq = Math.max(1, ...[...transitions.values()]);
122
+ const rules = [];
123
+ // Build per-function state maps
124
+ const fnStates = new Map();
125
+ for (const [key, freq] of transitions) {
126
+ if (freq < minFrequency)
127
+ continue;
128
+ const [fnA, fnB] = key.split("→");
129
+ const confidence = freq / maxFreq;
130
+ // Infer state name from the PRODUCER (fnA), not consumer
131
+ const stateName = inferStateName(fnA, "post");
132
+ // fnA produces it, fnB requires it
133
+ // Track for fnA
134
+ const aStates = fnStates.get(fnA) || { produced: new Set(), required: new Set(), invalidated: new Set() };
135
+ aStates.produced.add(stateName);
136
+ fnStates.set(fnA, aStates);
137
+ // Track for fnB
138
+ const bStates = fnStates.get(fnB) || { produced: new Set(), required: new Set(), invalidated: new Set() };
139
+ bStates.required.add(stateName);
140
+ fnStates.set(fnB, bStates);
141
+ }
142
+ // Second pass: detect invalidation patterns
143
+ for (const [key, freq] of transitions) {
144
+ if (freq < minFrequency)
145
+ continue;
146
+ const [fnA, fnB] = key.split("→");
147
+ // Check if fnB is a "closer" that invalidates fnA's produced state
148
+ const aStates = fnStates.get(fnA);
149
+ const bStates = fnStates.get(fnB);
150
+ if (!aStates || !bStates)
151
+ continue;
152
+ const isCloser = ["close", "disconnect", "logout", "free", "destroy", "release", "stop", "end", "finish"]
153
+ .some(kw => fnB.includes(kw));
154
+ const isOpener = ["open", "connect", "login", "create", "alloc", "init", "start", "begin"]
155
+ .some(kw => fnA.includes(kw));
156
+ if (isCloser && isOpener) {
157
+ // fnB invalidates what fnA produced
158
+ for (const state of aStates.produced) {
159
+ bStates.invalidated.add(state);
160
+ }
161
+ }
162
+ }
163
+ // Convert to rules
164
+ const maxFnFreq = Math.max(1, ...[...fnFreq.values()]);
165
+ for (const [fn, states] of fnStates) {
166
+ const freq = fnFreq.get(fn) || 1;
167
+ const confidence = Math.min(1, freq / maxFnFreq);
168
+ const domain = inferDomain(fn);
169
+ rules.push({
170
+ function: fn,
171
+ pre_states: [...states.required],
172
+ post_states: [...states.produced],
173
+ invalidate: states.invalidated.size > 0 ? [...states.invalidated] : undefined,
174
+ confidence,
175
+ evidence: freq,
176
+ domain,
177
+ stateNames: {
178
+ pre: [...states.required],
179
+ post: [...states.produced],
180
+ invalidate: [...states.invalidated],
181
+ },
182
+ });
183
+ }
184
+ return rules.sort((a, b) => b.confidence - a.confidence);
185
+ }
186
+ function inferDomain(fn) {
187
+ const lower = fn.toLowerCase();
188
+ for (const [dom, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
189
+ if (keywords.some(kw => lower.includes(kw)))
190
+ return dom;
191
+ }
192
+ return "GENERAL";
193
+ }
194
+ /**
195
+ * Extract a protocol foundation from a repository.
196
+ *
197
+ * Uses enhanced rule inference with intelligent state naming
198
+ * and frequency-based confidence scoring.
199
+ */
200
+ function extractProtocolFoundation(repoPath, protocolName, maxFiles = 200, minFrequency = 3) {
201
+ const files = (0, repo_evaluator_1.scanRepository)(repoPath, maxFiles);
202
+ const allPairs = [];
203
+ for (const fp of files) {
204
+ try {
205
+ const code = fs.readFileSync(fp, "utf-8");
206
+ allPairs.push(...(0, protocol_extractor_1.extractCallPairs)(code, fp));
207
+ }
208
+ catch { /* skip */ }
209
+ }
210
+ const rules = inferEnhancedRules(allPairs, minFrequency);
211
+ const states = new Set();
212
+ for (const r of rules) {
213
+ for (const s of r.pre_states)
214
+ states.add(s);
215
+ for (const s of r.post_states)
216
+ states.add(s);
217
+ if (r.invalidate)
218
+ for (const s of r.invalidate)
219
+ states.add(s);
220
+ }
221
+ // Compare against hand-written baseline
222
+ const defs = (0, protocol_coverage_1.loadDefaultProtocolDefinitions)();
223
+ const handWrittenFns = new Set();
224
+ for (const p of defs)
225
+ for (const fn of p.rules.keys())
226
+ handWrittenFns.add(fn);
227
+ const extractedFns = new Set(rules.map(r => r.function));
228
+ let overlap = 0;
229
+ for (const fn of extractedFns) {
230
+ if (handWrittenFns.has(fn))
231
+ overlap++;
232
+ }
233
+ const avgConf = rules.length > 0 ? rules.reduce((s, r) => s + r.confidence, 0) / rules.length : 0;
234
+ return {
235
+ protocol: protocolName || path.basename(repoPath),
236
+ rules,
237
+ states: [...states],
238
+ sourceFiles: files,
239
+ totalPairs: allPairs.length,
240
+ avgConfidence: avgConf,
241
+ handWrittenOverlap: overlap,
242
+ novelRulesCount: extractedFns.size - overlap,
243
+ };
244
+ }
245
+ /**
246
+ * Convert enhanced rules to SSG-compatible StateAnnotation map.
247
+ */
248
+ function enhancedRulesToMap(rules) {
249
+ const map = new Map();
250
+ for (const r of rules) {
251
+ map.set(r.function, {
252
+ pre_states: r.pre_states,
253
+ post_states: r.post_states,
254
+ invalidate: r.invalidate,
255
+ });
256
+ }
257
+ return map;
258
+ }
259
+ /**
260
+ * Measure the Discovery Rate impact of adding extracted protocol rules.
261
+ */
262
+ async function measureDiscoveryImpact(extractedRules) {
263
+ // Baseline: current hand-written rules
264
+ const baselineAttr = await (0, evaluation_campaign_1.runFailureAttribution)();
265
+ const baselineBudget = (0, evaluation_campaign_1.computeErrorBudget)(baselineAttr);
266
+ const baselineDiscovery = (0, discovery_analytics_1.computeDiscoveryMetrics)(baselineAttr);
267
+ // Note: full integration requires running suggestAlternatives with merged rules
268
+ // For now, compare rule coverage
269
+ const defs = (0, protocol_coverage_1.loadDefaultProtocolDefinitions)();
270
+ const handWrittenFns = new Set();
271
+ for (const p of defs)
272
+ for (const fn of p.rules.keys())
273
+ handWrittenFns.add(fn);
274
+ const newFns = [...extractedRules.keys()].filter(fn => !handWrittenFns.has(fn));
275
+ return {
276
+ baseline: {
277
+ discoveryRate: baselineDiscovery.overall,
278
+ top3Rate: baselineBudget.successRate,
279
+ missingCandidate: baselineBudget.percentages.missing_candidate || 0,
280
+ },
281
+ rulesAdded: newFns.length,
282
+ };
283
+ }
284
+ function printFoundationReport(result, impact) {
285
+ console.log("\n╔════════════════════════════════════════════════════╗");
286
+ console.log("║ P6.0 Protocol Foundation Model ║");
287
+ console.log("╚════════════════════════════════════════════════════╝\n");
288
+ console.log(`Protocol: ${result.protocol}`);
289
+ console.log(`Source Files: ${result.sourceFiles.length}`);
290
+ console.log(`Call Pairs: ${result.totalPairs}`);
291
+ console.log(`Rules Extracted: ${result.rules.length}`);
292
+ console.log(`States Inferred: ${result.states.length}`);
293
+ console.log(`Avg Confidence: ${(result.avgConfidence * 100).toFixed(0)}%`);
294
+ console.log(`Hand-written Overlap: ${result.handWrittenOverlap} functions`);
295
+ console.log(`Novel Rules: ${result.novelRulesCount}`);
296
+ console.log();
297
+ if (result.rules.length > 0) {
298
+ console.log("─── Top Extracted Rules ───");
299
+ console.log("Conf Domain Function Pre → Post Inv");
300
+ console.log("────────────────────────────────────────────────────────────────────");
301
+ for (const r of result.rules.slice(0, 15)) {
302
+ const conf = (r.confidence * 100).toFixed(0).padStart(4);
303
+ const dom = r.domain.padEnd(8);
304
+ const fn = r.function.padEnd(22);
305
+ const pre = `[${r.pre_states.join(",") || "none"}]`.padEnd(22);
306
+ const post = `[${r.post_states.join(",") || "none"}]`.padEnd(22);
307
+ const inv = r.invalidate ? `[${r.invalidate.join(",")}]` : "—";
308
+ console.log(` ${conf}% ${dom} ${fn} ${pre} → ${post} ${inv}`);
309
+ }
310
+ console.log();
311
+ }
312
+ if (impact) {
313
+ console.log("─── Discovery Impact ───");
314
+ console.log(` Baseline Discovery: ${(impact.baseline.discoveryRate * 100).toFixed(0)}%`);
315
+ console.log(` Baseline Missing Cand: ${(impact.baseline.missingCandidate * 100).toFixed(0)}%`);
316
+ console.log(` New Rules Added: ${impact.rulesAdded}`);
317
+ if (impact.rulesAdded > 0) {
318
+ console.log(` → Potential discovery improvement from ${impact.rulesAdded} new protocol functions`);
319
+ }
320
+ console.log();
321
+ }
322
+ }
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ /**
3
+ * P6.0: Protocol Foundation Model Tests
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const vitest_1 = require("vitest");
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const protocol_foundation_1 = require("./protocol-foundation");
43
+ const protocol_extractor_1 = require("./protocol-extractor");
44
+ const FOUND_DIR = path.resolve(__dirname, "..", "test-protocol-foundation");
45
+ fs.mkdirSync(FOUND_DIR, { recursive: true });
46
+ function createTestRepo() {
47
+ const srcDir = path.join(FOUND_DIR, "src");
48
+ fs.mkdirSync(srcDir, { recursive: true });
49
+ // File protocol pattern
50
+ fs.writeFileSync(path.join(srcDir, "file_ops.c"), `
51
+ void read_config(const char* path) {
52
+ FILE* f = fopen(path, "r");
53
+ char buf[1024];
54
+ fread(buf, 1, 1024, f);
55
+ fclose(f);
56
+ }
57
+ void write_config(const char* path, const char* data) {
58
+ FILE* f = fopen(path, "w");
59
+ fwrite(data, 1, strlen(data), f);
60
+ fflush(f);
61
+ fclose(f);
62
+ }
63
+ `);
64
+ // DB protocol pattern
65
+ fs.writeFileSync(path.join(srcDir, "db_ops.js"), `
66
+ function queryUsers() {
67
+ const db = db_connect("localhost");
68
+ const rows = db_query(db, "SELECT * FROM users");
69
+ db_disconnect(db);
70
+ }
71
+ function insertLog(msg) {
72
+ const db = db_connect("localhost");
73
+ db_insert(db, "logs", msg);
74
+ db_disconnect(db);
75
+ }
76
+ `);
77
+ // Auth protocol pattern
78
+ fs.writeFileSync(path.join(srcDir, "auth_flow.c"), `
79
+ int authenticate(const char* user, const char* pass) {
80
+ if (!verify_password(user, pass)) return 0;
81
+ char* token = generate_jwt(user);
82
+ session_t* sess = create_session(token);
83
+ return sess ? 1 : 0;
84
+ }
85
+ void do_logout(session_t* sess) {
86
+ logout(sess);
87
+ }
88
+ `);
89
+ return FOUND_DIR;
90
+ }
91
+ (0, vitest_1.describe)("Protocol Foundation Model", () => {
92
+ createTestRepo();
93
+ (0, vitest_1.it)("infers intelligent state names", () => {
94
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("fopen", "post")).toBe("FILE_OPEN");
95
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("fclose", "invalidate")).toBe("FILE_CLOSED");
96
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("db_connect", "post")).toBe("DB_CONNECTED");
97
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("verify_password", "post")).toBe("AUTH_VERIFIED");
98
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("generate_jwt", "post")).toBe("AUTH_ISSUED");
99
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("create_session", "post")).toBe("AUTH_CREATED");
100
+ (0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("logout", "invalidate")).toBe("AUTH_UNAUTHENTICATED");
101
+ });
102
+ (0, vitest_1.it)("infers enhanced rules with domain-specific states", () => {
103
+ const code = `
104
+ FILE* f = fopen("x", "r");
105
+ fread(buf, 1, 1024, f);
106
+ fclose(f);
107
+
108
+ DB* db = db_connect("localhost");
109
+ db_query(db, "SELECT 1");
110
+ db_disconnect(db);
111
+ `;
112
+ const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
113
+ const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
114
+ (0, vitest_1.expect)(rules.length).toBeGreaterThan(0);
115
+ // fopen should produce FILE_OPEN
116
+ const fopen = rules.find(r => r.function === "fopen");
117
+ (0, vitest_1.expect)(fopen).toBeDefined();
118
+ (0, vitest_1.expect)(fopen.domain).toBe("FILE");
119
+ (0, vitest_1.expect)(fopen.post_states).toContain("FILE_OPEN");
120
+ // fclose should invalidate FILE_OPEN
121
+ const fclose = rules.find(r => r.function === "fclose");
122
+ (0, vitest_1.expect)(fclose).toBeDefined();
123
+ (0, vitest_1.expect)(fclose.invalidate).toBeDefined();
124
+ // db_connect should produce DB_CONNECTED
125
+ const dbConn = rules.find(r => r.function === "db_connect");
126
+ (0, vitest_1.expect)(dbConn).toBeDefined();
127
+ (0, vitest_1.expect)(dbConn.domain).toBe("DB");
128
+ });
129
+ (0, vitest_1.it)("extracts protocol foundation from test repository", () => {
130
+ const result = (0, protocol_foundation_1.extractProtocolFoundation)(FOUND_DIR, "TestFoundation", 20, 1);
131
+ (0, vitest_1.expect)(result.rules.length).toBeGreaterThan(0);
132
+ (0, vitest_1.expect)(result.states.length).toBeGreaterThan(0);
133
+ (0, vitest_1.expect)(result.totalPairs).toBeGreaterThan(0);
134
+ (0, vitest_1.expect)(result.avgConfidence).toBeGreaterThan(0);
135
+ // Should have FILE states
136
+ (0, vitest_1.expect)(result.states.some(s => s.includes("FILE"))).toBe(true);
137
+ // Should have DB states
138
+ (0, vitest_1.expect)(result.states.some(s => s.includes("DB"))).toBe(true);
139
+ // Hand-written overlap: fopen/fread/fwrite/fclose match ground truth
140
+ (0, vitest_1.expect)(result.handWrittenOverlap).toBeGreaterThanOrEqual(2);
141
+ (0, protocol_foundation_1.printFoundationReport)(result);
142
+ });
143
+ (0, vitest_1.it)("converts enhanced rules to SSG-compatible map", () => {
144
+ const code = `FILE* f = fopen("x", "r"); fclose(f);`;
145
+ const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
146
+ const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
147
+ const map = (0, protocol_foundation_1.enhancedRulesToMap)(rules);
148
+ (0, vitest_1.expect)(map.size).toBeGreaterThan(0);
149
+ const fopenRule = map.get("fopen");
150
+ (0, vitest_1.expect)(fopenRule).toBeDefined();
151
+ (0, vitest_1.expect)(fopenRule.post_states.length).toBeGreaterThan(0);
152
+ });
153
+ (0, vitest_1.it)("measures discovery impact of extracted rules", async () => {
154
+ const code = `FILE* f = fopen("x", "r"); fclose(f);`;
155
+ const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
156
+ const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
157
+ const map = (0, protocol_foundation_1.enhancedRulesToMap)(rules);
158
+ const impact = await (0, protocol_foundation_1.measureDiscoveryImpact)(map);
159
+ (0, vitest_1.expect)(impact.baseline.discoveryRate).toBeGreaterThanOrEqual(0);
160
+ (0, vitest_1.expect)(impact.rulesAdded).toBeGreaterThanOrEqual(0);
161
+ (0, protocol_foundation_1.printFoundationReport)({ protocol: "test", rules, states: [], sourceFiles: [], totalPairs: pairs.length, avgConfidence: 1, handWrittenOverlap: 1, novelRulesCount: impact.rulesAdded }, impact);
162
+ }, 30000);
163
+ });