progmune-runtime 2.1.6 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +108 -468
  2. package/dist/ablation-study.js +144 -0
  3. package/dist/ablation-study.test.js +18 -0
  4. package/dist/action-runtime.js +3 -1
  5. package/dist/active-learning.js +211 -0
  6. package/dist/analytics.js +139 -0
  7. package/dist/asset-factory.js +309 -0
  8. package/dist/asset-growth.js +244 -0
  9. package/dist/asset-promotion.js +382 -0
  10. package/dist/asset-quality.js +550 -0
  11. package/dist/audit/business-translator.js +285 -0
  12. package/dist/audit/cli.js +66 -0
  13. package/dist/audit/formatters/html.js +379 -0
  14. package/dist/audit/formatters/json.js +11 -0
  15. package/dist/audit/formatters/markdown.js +192 -0
  16. package/dist/audit/formatters/terminal.js +189 -0
  17. package/dist/audit/index.js +25 -0
  18. package/dist/audit/report-builder.js +318 -0
  19. package/dist/audit/types.js +8 -0
  20. package/dist/audit.js +3 -3
  21. package/dist/auto-benchmark-generator.js +137 -0
  22. package/dist/auto-benchmark-generator.test.js +45 -0
  23. package/dist/auto-protocol-synthesizer.js +362 -0
  24. package/dist/auto-protocol-synthesizer.test.js +82 -0
  25. package/dist/autonomous-patch.js +175 -0
  26. package/dist/autonomous-patch.test.js +128 -0
  27. package/dist/badge/badge-server.js +98 -0
  28. package/dist/behavior-miner.js +442 -0
  29. package/dist/belief-layer.js +475 -0
  30. package/dist/benchmark-count.js +5 -0
  31. package/dist/benchmark-generator.js +211 -0
  32. package/dist/benchmark-harness.js +201 -0
  33. package/dist/benchmark-pass-rate.js +7 -0
  34. package/dist/benchmark-report.js +8 -3
  35. package/dist/benchmark-save.js +14 -1
  36. package/dist/bootstrap-validation.js +197 -0
  37. package/dist/bootstrap-validation.test.js +51 -0
  38. package/dist/branch-ledger.js +1 -1
  39. package/dist/capability-gap.js +130 -0
  40. package/dist/certify-html.js +351 -0
  41. package/dist/certify.js +326 -0
  42. package/dist/check.js +4 -4
  43. package/dist/compliance-miner.js +447 -0
  44. package/dist/continuous-benchmark.js +194 -0
  45. package/dist/continuous-benchmark.test.js +116 -0
  46. package/dist/corpus-stats.js +173 -0
  47. package/dist/counterfactual-engine.js +288 -0
  48. package/dist/coverage-dashboard.js +109 -0
  49. package/dist/coverage-system.test.js +205 -0
  50. package/dist/cross-repo-precision.js +352 -0
  51. package/dist/cve-benchmark.js +180 -0
  52. package/dist/cve-benchmark.test.js +28 -0
  53. package/dist/cve-collector.js +73 -0
  54. package/dist/data-quality.js +141 -0
  55. package/dist/decision-engine.js +388 -0
  56. package/dist/derive-metadata.js +250 -0
  57. package/dist/difficulty-active.test.js +198 -0
  58. package/dist/difficulty-map.js +244 -0
  59. package/dist/discovery-analytics.js +125 -0
  60. package/dist/discovery-model.js +149 -0
  61. package/dist/discovery-optimize.test.js +199 -0
  62. package/dist/discovery-trace.js +276 -0
  63. package/dist/discovery-trace.test.js +97 -0
  64. package/dist/emitter.js +83 -1
  65. package/dist/enterprise-dashboard.js +405 -0
  66. package/dist/eval-hardening.js +297 -0
  67. package/dist/eval-hardening.test.js +85 -0
  68. package/dist/evaluation-campaign.js +359 -0
  69. package/dist/evaluation-campaign.test.js +181 -0
  70. package/dist/evidence-growth.js +143 -0
  71. package/dist/evidence-repository.js +209 -0
  72. package/dist/evidence-system.js +441 -0
  73. package/dist/execute.js +15 -7
  74. package/dist/experimental/software-physics.js +291 -0
  75. package/dist/experimental/state-inference.js +516 -0
  76. package/dist/experimental/unsupervised-physics.js +230 -0
  77. package/dist/extract-ir-python.js +54 -7
  78. package/dist/extract-ir.js +376 -12
  79. package/dist/failure-collector.js +2 -2
  80. package/dist/failure-corpus.js +322 -9
  81. package/dist/feedback.js +16 -5
  82. package/dist/feedback.test.js +49 -0
  83. package/dist/file-lock.js +1 -1
  84. package/dist/flywheel-batch.js +292 -0
  85. package/dist/frameworks/express-cli.js +237 -0
  86. package/dist/frameworks/express-detector.js +445 -0
  87. package/dist/frameworks/express-detector.test.js +206 -0
  88. package/dist/frameworks/index.js +30 -0
  89. package/dist/frameworks/nestjs-detector.js +302 -0
  90. package/dist/frameworks/trpc-detector.js +161 -0
  91. package/dist/frameworks/version-awareness.js +179 -0
  92. package/dist/function-synonyms.js +164 -0
  93. package/dist/function-synonyms.test.js +68 -0
  94. package/dist/generalization.test.js +352 -0
  95. package/dist/goal-annotator.js +113 -0
  96. package/dist/goal-planner.js +563 -0
  97. package/dist/gold-cve.js +164 -0
  98. package/dist/gold-cve.test.js +104 -0
  99. package/dist/gold-quality.js +206 -0
  100. package/dist/gold-tiers.js +241 -0
  101. package/dist/governance-dashboard.js +327 -0
  102. package/dist/graph-viz.js +240 -0
  103. package/dist/guided-frontier.js +195 -0
  104. package/dist/hierarchical-planner.js +148 -0
  105. package/dist/identifier-parser.js +260 -0
  106. package/dist/immune-metrics.js +93 -0
  107. package/dist/immune-receiver.js +158 -0
  108. package/dist/immune-reporter.js +1 -1
  109. package/dist/improvement-orchestrator.js +206 -0
  110. package/dist/inject-p0-vocabulary.js +300 -0
  111. package/dist/intent-parser.js +218 -0
  112. package/dist/invariant-algebra.js +476 -0
  113. package/dist/invariant-calculus.js +533 -0
  114. package/dist/ir-utils.js +70 -0
  115. package/dist/ir-utils.test.js +50 -0
  116. package/dist/knowledge-api.js +312 -0
  117. package/dist/knowledge-evolution.js +452 -0
  118. package/dist/knowledge-explorer.js +506 -0
  119. package/dist/knowledge-flywheel.js +274 -0
  120. package/dist/knowledge-governance.js +338 -0
  121. package/dist/knowledge-governance.test.js +150 -0
  122. package/dist/knowledge-graph.js +181 -0
  123. package/dist/knowledge-guided-synth.js +246 -0
  124. package/dist/knowledge-loop.test.js +77 -0
  125. package/dist/knowledge-object.js +316 -0
  126. package/dist/knowledge-package.js +98 -0
  127. package/dist/kpi-dashboard.js +561 -0
  128. package/dist/l3-cross-function.js +280 -0
  129. package/dist/learning-ranker.js +148 -0
  130. package/dist/learning-ranker.test.js +291 -0
  131. package/dist/ledger/accountability.js +322 -0
  132. package/dist/ledger/chain-builder.js +185 -0
  133. package/dist/ledger/cli.js +222 -0
  134. package/dist/ledger/index.js +13 -0
  135. package/dist/ledger/signatures.js +193 -0
  136. package/dist/ledger/types.js +9 -0
  137. package/dist/llm.js +74 -3
  138. package/dist/load-benchmarks.js +8 -3
  139. package/dist/logger.js +66 -0
  140. package/dist/logger.test.js +37 -0
  141. package/dist/logistic-reward.js +339 -0
  142. package/dist/logistic-reward.test.js +180 -0
  143. package/dist/macro-graph.js +193 -0
  144. package/dist/macro-repair.js +183 -0
  145. package/dist/mcp-server.mjs +1202 -483
  146. package/dist/memory-layer.js +42 -5
  147. package/dist/multi-repo-precision.js +422 -0
  148. package/dist/name-free-protocol.js +425 -0
  149. package/dist/name-free-protocol.test.js +170 -0
  150. package/dist/name-scrambling.js +138 -0
  151. package/dist/name-scrambling.test.js +16 -0
  152. package/dist/p3-observability.test.js +281 -0
  153. package/dist/p5-orchestrator.test.js +225 -0
  154. package/dist/pairwise-preference.js +294 -0
  155. package/dist/pairwise-preference.test.js +140 -0
  156. package/dist/planner-constraints.js +104 -0
  157. package/dist/planner-prompts.js +155 -0
  158. package/dist/planner-telemetry.js +415 -0
  159. package/dist/planner-trace.js +214 -0
  160. package/dist/planner.js +162 -167
  161. package/dist/plsb/artifact.js +116 -0
  162. package/dist/plsb/cli.js +71 -0
  163. package/dist/plsb/index.js +19 -0
  164. package/dist/plsb/leaderboard.js +249 -0
  165. package/dist/plsb/report-md.js +156 -0
  166. package/dist/plsb/schema.js +179 -0
  167. package/dist/plsb-benchmark.js +284 -0
  168. package/dist/plsb-benchmark.test.js +119 -0
  169. package/dist/policy/cli.js +134 -0
  170. package/dist/policy/engine.js +333 -0
  171. package/dist/policy/index.js +12 -0
  172. package/dist/policy/types.js +59 -0
  173. package/dist/policy-miner.js +505 -0
  174. package/dist/precision-analyze.js +229 -0
  175. package/dist/precision-benchmark.js +147 -0
  176. package/dist/precision-label-c.js +134 -0
  177. package/dist/precision-label.js +193 -0
  178. package/dist/precision-report-c.js +149 -0
  179. package/dist/precision-report.js +246 -0
  180. package/dist/progmune-status.js +108 -0
  181. package/dist/proof-engine.js +479 -0
  182. package/dist/proof-provenance.js +315 -0
  183. package/dist/protocol-coverage.js +294 -0
  184. package/dist/protocol-detector.js +1189 -0
  185. package/dist/protocol-embedding-expanded.js +297 -0
  186. package/dist/protocol-embedding-expanded.test.js +97 -0
  187. package/dist/protocol-embedding.js +195 -0
  188. package/dist/protocol-embedding.test.js +82 -0
  189. package/dist/protocol-extractor-v2.js +354 -0
  190. package/dist/protocol-extractor-v2.test.js +140 -0
  191. package/dist/protocol-extractor.js +310 -0
  192. package/dist/protocol-extractor.test.js +113 -0
  193. package/dist/protocol-foundation.js +322 -0
  194. package/dist/protocol-foundation.test.js +163 -0
  195. package/dist/protocol-frontier.js +243 -0
  196. package/dist/protocol-frontier.test.js +92 -0
  197. package/dist/protocol-gap-analyzer.js +228 -0
  198. package/dist/protocol-gap-analyzer.test.js +49 -0
  199. package/dist/protocol-invariants.js +276 -0
  200. package/dist/protocol-invariants.test.js +111 -0
  201. package/dist/protocol-knowledge.js +464 -0
  202. package/dist/protocol-miner.js +343 -0
  203. package/dist/protocol-mining.js +207 -0
  204. package/dist/protocol-mining.test.js +37 -0
  205. package/dist/protocol-registry.js +1 -1
  206. package/dist/protocol-security-benchmark.js +222 -0
  207. package/dist/protocol-vulnerability.js +257 -0
  208. package/dist/protocol-vulnerability.test.js +60 -0
  209. package/dist/python-benchmark.js +120 -0
  210. package/dist/python-emitter.js +163 -45
  211. package/dist/python-protocol-extractor.js +187 -0
  212. package/dist/python-protocol-extractor.test.js +116 -0
  213. package/dist/realworld-benchmark.js +646 -0
  214. package/dist/realworld-benchmark.test.js +36 -0
  215. package/dist/repair-arch.test.js +411 -0
  216. package/dist/repair-evolution.test.js +454 -0
  217. package/dist/repair-executor.js +719 -0
  218. package/dist/repair-proposal.js +4 -4
  219. package/dist/repair-ranker.js +141 -0
  220. package/dist/repair-strategies.js +419 -0
  221. package/dist/repair-taxonomy.js +234 -0
  222. package/dist/repair-types.js +12 -0
  223. package/dist/repo-evaluator.js +250 -0
  224. package/dist/repo-evaluator.test.js +128 -0
  225. package/dist/resource-abstraction.js +242 -0
  226. package/dist/resource-detector.js +211 -0
  227. package/dist/result.test.js +43 -0
  228. package/dist/reward-system.js +411 -0
  229. package/dist/reward-system.test.js +175 -0
  230. package/dist/risk-model.js +215 -0
  231. package/dist/rule-miner.js +234 -7
  232. package/dist/rule-specificity.js +254 -0
  233. package/dist/runtime-types.js +27 -0
  234. package/dist/scaffold.js +208 -0
  235. package/dist/scale-collector.test.js +101 -0
  236. package/dist/scale-trajectory-collector.js +128 -0
  237. package/dist/sdk.js +250 -0
  238. package/dist/search-planner.js +4 -41
  239. package/dist/semantic-snapshot.js +1 -1
  240. package/dist/semantic-topology.js +121 -0
  241. package/dist/semantic-trace.js +310 -317
  242. package/dist/sequence-extractor.js +343 -0
  243. package/dist/skill-library.js +245 -0
  244. package/dist/skill-planner.test.js +189 -0
  245. package/dist/software-physics.js +291 -0
  246. package/dist/software-physics.test.js +81 -0
  247. package/dist/ssg-precision.js +478 -0
  248. package/dist/ssg-validator.js +71 -21
  249. package/dist/state-inference-doubleblind.test.js +160 -0
  250. package/dist/state-inference.js +516 -0
  251. package/dist/state-inference.test.js +115 -0
  252. package/dist/state-machine-fingerprint.js +345 -0
  253. package/dist/state-machine-fingerprint.test.js +120 -0
  254. package/dist/state-miner.js +386 -0
  255. package/dist/state-name-inference.js +213 -0
  256. package/dist/state-name-inference.test.js +69 -0
  257. package/dist/strategy-planner.js +262 -96
  258. package/dist/strategy-planner.test.js +135 -0
  259. package/dist/telemetry-analytics.test.js +402 -0
  260. package/dist/terminal-format.js +68 -0
  261. package/dist/terminal-format.test.js +83 -0
  262. package/dist/topology-factory.js +196 -0
  263. package/dist/topology-representation.js +242 -0
  264. package/dist/topology-representation.test.js +27 -0
  265. package/dist/trajectory-augmentation.js +254 -0
  266. package/dist/trajectory-augmentation.test.js +63 -0
  267. package/dist/trajectory-corpus.js +440 -0
  268. package/dist/trajectory-corpus.test.js +32 -0
  269. package/dist/trajectory-feedback.test.js +116 -0
  270. package/dist/transition-synthesizer.js +286 -0
  271. package/dist/transition-synthesizer.test.js +123 -0
  272. package/dist/trust/api-semantic-mapper.js +809 -0
  273. package/dist/trust/call-graph-propagator.js +225 -0
  274. package/dist/trust/cli.js +122 -0
  275. package/dist/trust/compliance-scorer.js +283 -0
  276. package/dist/trust/confidence-calculator.js +261 -0
  277. package/dist/trust/engine.js +1145 -0
  278. package/dist/trust/explainability.js +85 -0
  279. package/dist/trust/formatters/ci.js +42 -0
  280. package/dist/trust/formatters/json.js +11 -0
  281. package/dist/trust/formatters/terminal.js +152 -0
  282. package/dist/trust/index.js +39 -0
  283. package/dist/trust/phase1-verify.js +171 -0
  284. package/dist/trust/protocol-domain-validator.js +697 -0
  285. package/dist/trust/score-calculator.js +282 -0
  286. package/dist/trust/ssg-bridge.js +641 -0
  287. package/dist/trust/ssg-bridge.test.js +269 -0
  288. package/dist/trust/types.js +67 -0
  289. package/dist/trust/violation-trace.js +335 -0
  290. package/dist/trust-api.js +179 -0
  291. package/dist/trust-calibration.js +279 -0
  292. package/dist/unknown-protocol-discovery.js +339 -0
  293. package/dist/unknown-protocol-discovery.test.js +102 -0
  294. package/dist/unsupervised-physics.js +230 -0
  295. package/dist/unsupervised-physics.test.js +95 -0
  296. package/dist/utils.test.js +37 -0
  297. package/dist/validator.js +187 -10
  298. package/dist/verification-intelligence.js +475 -0
  299. package/dist/verify-api.js +432 -0
  300. package/dist/vi-impact-report.js +293 -0
  301. package/dist/wl-fingerprint.js +162 -0
  302. package/dist/wl-fingerprint.test.js +130 -0
  303. package/dist/zeroshot-strategy.js +139 -0
  304. package/docs/Progmune_/346/212/225/350/265/204/344/272/272/347/231/275/347/232/256/344/271/246_v2.0.html +576 -0
  305. package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
  306. package/package.json +74 -7
  307. package/protocols.json +1956 -50
  308. package/.dockerignore +0 -14
  309. package/.mcp.json +0 -11
  310. package/.progmune_allowlist +0 -50
  311. package/.test_report/test_report.md +0 -87
  312. package/Dockerfile +0 -9
  313. package/FAQ.md +0 -167
  314. package/WHITEPAPER.md +0 -540
  315. package/demo-project/auth.ts +0 -55
  316. package/demo-project/tsconfig.json +0 -8
  317. package/dist/acl-breakdown.js +0 -13
  318. package/dist/all-sessions.js +0 -11
  319. package/dist/antibody-stats.js +0 -11
  320. package/dist/branch-tree-count.js +0 -14
  321. package/dist/common-fixpath.js +0 -12
  322. package/dist/constraint-types.js +0 -12
  323. package/dist/exec-metrics.js +0 -11
  324. package/dist/failure-report.js +0 -11
  325. package/dist/fast-path-hits.js +0 -13
  326. package/dist/fingerprint-list.js +0 -15
  327. package/dist/gen-history-log.js +0 -13
  328. package/dist/heatmap-data.js +0 -11
  329. package/dist/recent-session.js +0 -12
  330. package/dist/svl-distribution.js +0 -11
  331. package/dist/terminal-status.js +0 -11
  332. package/dist/token-savings.js +0 -11
  333. package/dist/total-repairs.js +0 -12
  334. package/dist/unresolved-count.js +0 -12
  335. package/dist/valid-fingerprints.js +0 -13
  336. package/dist/verify-ledgers.js +0 -11
  337. package/docs/whitepaper-style.css +0 -77
  338. package/docs/whitepaper-v2.1.md +0 -609
  339. package/docs/whitepaper-v2.2.md +0 -1064
  340. package/docs/whitepaper-v2.2.pdf +0 -0
  341. package/fly.toml +0 -31
  342. package/public/dashboard.html +0 -119
  343. package/server/hub.js +0 -116
  344. package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
  345. package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
  346. package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
  347. package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
  348. package/test/replay-golden.ts +0 -84
  349. package/test_benchmark.js +0 -165
  350. package/test_comprehensive.mjs +0 -638
  351. package/test_concurrency.js +0 -129
  352. package/test_ir_robustness.js +0 -85
  353. package/test_semantic_contracts.js +0 -269
  354. package/test_ssg_stress.js +0 -156
  355. package/test_svl3.js +0 -58
  356. package/tsconfig.json +0 -17
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ /**
3
+ * P6.2: Software Physics Engine — Protocol Structure Learning
4
+ *
5
+ * Maps diverse function names to abstract protocol patterns.
6
+ * This is the bridge from "Function Memorization" to "Protocol Learning."
7
+ *
8
+ * Core insight: fopen, sqlite3_open, db_connect, socket() are all
9
+ * the SAME thing — RESOURCE_ACQUIRE. The system should learn the
10
+ * pattern, not the name.
11
+ *
12
+ * Five fundamental Software Physics patterns:
13
+ * 1. Acquire-Release (resource lifecycle)
14
+ * 2. Lock-Unlock (mutual exclusion)
15
+ * 3. Begin-Commit (transactional consistency)
16
+ * 4. Authenticate-Act (identity verification)
17
+ * 5. Allocate-Free (memory lifecycle)
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.KNOWN_REPO_SIGNATURES = void 0;
21
+ exports.canonicalize = canonicalize;
22
+ exports.canonicalizeSequence = canonicalizeSequence;
23
+ exports.isValidPhysicsSequence = isValidPhysicsSequence;
24
+ exports.analyzeRepoPhysics = analyzeRepoPhysics;
25
+ exports.compareRepoPhysics = compareRepoPhysics;
26
+ exports.analyzeCrossRepoPhysics = analyzeCrossRepoPhysics;
27
+ exports.printCrossRepoReport = printCrossRepoReport;
28
+ /**
29
+ * Keyword-based pattern recognition.
30
+ *
31
+ * Maps function name substrings to Software Physics patterns.
32
+ * This is a lightweight symbolic approach — no ML needed.
33
+ */
34
+ const PHYSICS_KEYWORDS = {
35
+ // Acquire patterns
36
+ open: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
37
+ connect: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
38
+ create: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
39
+ alloc: { pattern: "MEMORY_ALLOCATE", phase: "acquire" },
40
+ malloc: { pattern: "MEMORY_ALLOCATE", phase: "acquire" },
41
+ accept: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
42
+ begin: { pattern: "TRANSACTION_BEGIN", phase: "acquire" },
43
+ start: { pattern: "TRANSACTION_BEGIN", phase: "acquire" },
44
+ // Release patterns
45
+ close: { pattern: "RESOURCE_RELEASE", phase: "release" },
46
+ disconnect: { pattern: "RESOURCE_RELEASE", phase: "release" },
47
+ destroy: { pattern: "RESOURCE_RELEASE", phase: "release" },
48
+ free: { pattern: "MEMORY_FREE", phase: "release" },
49
+ release: { pattern: "RESOURCE_RELEASE", phase: "release" },
50
+ finalize: { pattern: "RESOURCE_RELEASE", phase: "release" },
51
+ commit: { pattern: "TRANSACTION_COMMIT", phase: "release" },
52
+ rollback: { pattern: "TRANSACTION_ROLLBACK", phase: "release" },
53
+ finish: { pattern: "TRANSACTION_COMMIT", phase: "release" },
54
+ // Use patterns
55
+ read: { pattern: "RESOURCE_USE", phase: "use" },
56
+ write: { pattern: "RESOURCE_USE", phase: "use" },
57
+ query: { pattern: "RESOURCE_USE", phase: "use" },
58
+ exec: { pattern: "RESOURCE_USE", phase: "use" },
59
+ send: { pattern: "RESOURCE_USE", phase: "use" },
60
+ recv: { pattern: "RESOURCE_USE", phase: "use" },
61
+ step: { pattern: "RESOURCE_USE", phase: "use" },
62
+ // Lock patterns
63
+ lock: { pattern: "LOCK_ACQUIRE", phase: "acquire" },
64
+ unlock: { pattern: "LOCK_RELEASE", phase: "release" },
65
+ mutex: { pattern: "LOCK_ACQUIRE", phase: "acquire" },
66
+ // Auth patterns
67
+ verify: { pattern: "AUTHENTICATE", phase: "acquire" },
68
+ auth: { pattern: "AUTHENTICATE", phase: "acquire" },
69
+ login: { pattern: "AUTHENTICATE", phase: "acquire" },
70
+ logout: { pattern: "RESOURCE_RELEASE", phase: "release" },
71
+ signin: { pattern: "AUTHENTICATE", phase: "acquire" },
72
+ signout: { pattern: "RESOURCE_RELEASE", phase: "release" },
73
+ // Transaction / savepoint patterns (P7.3 expansion)
74
+ insert: { pattern: "TRANSACTION_BEGIN", phase: "use" },
75
+ update: { pattern: "TRANSACTION_BEGIN", phase: "use" },
76
+ delete: { pattern: "TRANSACTION_BEGIN", phase: "use" },
77
+ savepoint: { pattern: "TRANSACTION_BEGIN", phase: "acquire" },
78
+ prep_two: { pattern: "TRANSACTION_COMMIT", phase: "release" },
79
+ // Conditional patterns (P7.3 expansion)
80
+ evaluate: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
81
+ grant: { pattern: "RESOURCE_USE", phase: "use" },
82
+ deny: { pattern: "RESOURCE_USE", phase: "use" },
83
+ escalate: { pattern: "RESOURCE_USE", phase: "use" },
84
+ bypass: { pattern: "RESOURCE_USE", phase: "use" },
85
+ retry: { pattern: "RESOURCE_USE", phase: "use" },
86
+ audit: { pattern: "RESOURCE_USE", phase: "use" },
87
+ log_: { pattern: "RESOURCE_USE", phase: "use" },
88
+ // Loop / iteration patterns (P7.3 expansion)
89
+ init_fetch: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
90
+ init_: { pattern: "RESOURCE_ACQUIRE", phase: "acquire" },
91
+ fetch_batch: { pattern: "RESOURCE_USE", phase: "use" },
92
+ fetch_: { pattern: "RESOURCE_USE", phase: "use" },
93
+ has_more: { pattern: "RESOURCE_USE", phase: "use" },
94
+ process: { pattern: "RESOURCE_USE", phase: "use" },
95
+ poll_: { pattern: "RESOURCE_USE", phase: "use" },
96
+ next_iter: { pattern: "RESOURCE_USE", phase: "use" },
97
+ next_: { pattern: "RESOURCE_USE", phase: "use" },
98
+ exit_loop: { pattern: "RESOURCE_RELEASE", phase: "release" },
99
+ exit_: { pattern: "RESOURCE_RELEASE", phase: "release" },
100
+ timeout_exit: { pattern: "RESOURCE_RELEASE", phase: "release" },
101
+ timeout_: { pattern: "RESOURCE_RELEASE", phase: "release" },
102
+ // Stateless / pure compute patterns (P7.3 expansion)
103
+ compute: { pattern: "UNKNOWN", phase: "other" },
104
+ validate: { pattern: "UNKNOWN", phase: "other" },
105
+ sanitize: { pattern: "UNKNOWN", phase: "other" },
106
+ encode: { pattern: "UNKNOWN", phase: "other" },
107
+ decode: { pattern: "UNKNOWN", phase: "other" },
108
+ compress: { pattern: "UNKNOWN", phase: "other" },
109
+ decompress: { pattern: "UNKNOWN", phase: "other" },
110
+ checksum: { pattern: "UNKNOWN", phase: "other" },
111
+ };
112
+ /**
113
+ * Canonicalize a function name to a Software Physics pattern.
114
+ *
115
+ * Examples:
116
+ * "fopen" → RESOURCE_ACQUIRE
117
+ * "sqlite3_open" → RESOURCE_ACQUIRE
118
+ * "db_connect" → RESOURCE_ACQUIRE
119
+ * "fclose" → RESOURCE_RELEASE
120
+ * "ngx_close_connection" → RESOURCE_RELEASE
121
+ */
122
+ function canonicalize(fnName) {
123
+ const lower = fnName.toLowerCase();
124
+ let bestMatch = { function: fnName, pattern: "UNKNOWN", confidence: 0, phase: "other" };
125
+ for (const [keyword, info] of Object.entries(PHYSICS_KEYWORDS)) {
126
+ if (lower.includes(keyword)) {
127
+ // Longer keyword match = higher confidence
128
+ // Longer keyword = higher base confidence
129
+ // Position bonus: keywords at word boundaries get +0.2
130
+ let confidence = keyword.length / lower.length;
131
+ const kwPos = lower.indexOf(keyword);
132
+ if (kwPos === 0 || (kwPos > 0 && lower[kwPos - 1] === '_'))
133
+ confidence += 0.2;
134
+ if (confidence > bestMatch.confidence) {
135
+ bestMatch = { function: fnName, pattern: info.pattern, confidence, phase: info.phase };
136
+ }
137
+ }
138
+ }
139
+ return bestMatch;
140
+ }
141
+ /**
142
+ * Canonicalize a sequence of function calls into a Physics phase sequence.
143
+ *
144
+ * Example:
145
+ * ["fopen", "fread", "fclose"] → [ACQUIRE, USE, RELEASE]
146
+ */
147
+ function canonicalizeSequence(fns) {
148
+ return fns.map(canonicalize);
149
+ }
150
+ /**
151
+ * Check if a call sequence forms a valid Software Physics pattern.
152
+ *
153
+ * A valid Acquire-Use-Release sequence: ACQUIRE → (USE*) → RELEASE
154
+ * A valid transaction: BEGIN → (USE*) → COMMIT|ROLLBACK
155
+ * A valid lock: LOCK → (USE*) → UNLOCK
156
+ */
157
+ function isValidPhysicsSequence(fns) {
158
+ if (fns.length < 2)
159
+ return { valid: false, pattern: "none", detail: "Too short" };
160
+ const seq = canonicalizeSequence(fns);
161
+ const phases = seq.map(s => s.phase);
162
+ const patterns = [...new Set(seq.map(s => s.pattern).filter(p => p !== "UNKNOWN"))];
163
+ const hasAcquire = phases.includes("acquire");
164
+ const hasRelease = phases.includes("release");
165
+ const hasUse = phases.includes("use");
166
+ const hasOther = phases.includes("other");
167
+ const lastRelease = phases.lastIndexOf("release");
168
+ const firstAcquire = phases.indexOf("acquire");
169
+ // Valid acquire-use-release pattern: acquire before release
170
+ if (hasAcquire && hasRelease && firstAcquire < lastRelease) {
171
+ return { valid: true, pattern: patterns.join("→"), detail: `${patterns.length} physics patterns in valid order` };
172
+ }
173
+ // Valid: acquire-use pattern (no explicit release) — e.g., conditional branches
174
+ if (hasAcquire && hasUse && !hasRelease) {
175
+ return { valid: true, pattern: patterns.join("→"), detail: `Acquire-use sequence (open-ended), ${patterns.length} patterns` };
176
+ }
177
+ // Valid: pure stateless computation (all "other" phase) — e.g., hash, validate, encode
178
+ if (!hasAcquire && !hasRelease && hasOther && phases.every(p => p === "other")) {
179
+ return { valid: true, pattern: "stateless", detail: `Stateless computation, ${fns.length} actions` };
180
+ }
181
+ // Valid: mixed stateless + use actions (no acquire/release required)
182
+ if (!hasAcquire && !hasRelease) {
183
+ return { valid: true, pattern: patterns.join("→") || "generic", detail: `Non-resource sequence, ${fns.length} actions` };
184
+ }
185
+ // Invalid: release without acquire, or acquire after release
186
+ return { valid: false, pattern: "incomplete", detail: "Release without preceding acquire, or invalid ordering" };
187
+ }
188
+ /**
189
+ * Analyze a repository's functions through the Software Physics lens.
190
+ *
191
+ * Maps every function name to a Physics pattern, groups by pattern,
192
+ * and computes coverage (how many functions are recognized).
193
+ */
194
+ function analyzeRepoPhysics(repoName, functions) {
195
+ const patterns = new Map();
196
+ let recognized = 0;
197
+ for (const fn of functions) {
198
+ const annotation = canonicalize(fn);
199
+ if (annotation.pattern !== "UNKNOWN") {
200
+ recognized++;
201
+ const list = patterns.get(annotation.pattern) || [];
202
+ list.push(fn);
203
+ patterns.set(annotation.pattern, list);
204
+ }
205
+ }
206
+ return {
207
+ repo: repoName,
208
+ functions,
209
+ patterns,
210
+ coverage: functions.length > 0 ? recognized / functions.length : 0,
211
+ };
212
+ }
213
+ /**
214
+ * Compare two repositories to find shared Physics patterns.
215
+ *
216
+ * Even if the function names are completely different
217
+ * (fopen vs sqlite3_open), the Physics patterns should match.
218
+ */
219
+ function compareRepoPhysics(a, b) {
220
+ const aPatterns = new Set(a.patterns.keys());
221
+ const bPatterns = new Set(b.patterns.keys());
222
+ const shared = [...aPatterns].filter(p => bPatterns.has(p) && p !== "UNKNOWN");
223
+ const totalPatterns = new Set([...aPatterns, ...bPatterns]);
224
+ const similarity = totalPatterns.size > 0 ? shared.length / totalPatterns.size : 0;
225
+ return {
226
+ sharedPatterns: shared,
227
+ similarity,
228
+ detail: shared.length > 0
229
+ ? `${shared.length} shared patterns (${shared.join(", ")})`
230
+ : "No shared physics patterns — structurally unrelated",
231
+ };
232
+ }
233
+ // ═══════════════════════════════════════════════════════════════
234
+ // Known Repository Signatures
235
+ // ═══════════════════════════════════════════════════════════════
236
+ exports.KNOWN_REPO_SIGNATURES = {
237
+ Redis: ["createClient", "sendCommand", "readReply", "closeClient", "selectDB", "getKey", "setKey"],
238
+ SQLite: ["sqlite3_open", "sqlite3_prepare", "sqlite3_step", "sqlite3_finalize", "sqlite3_exec", "sqlite3_close"],
239
+ nginx: ["ngx_accept_connection", "ngx_read_request", "ngx_process_request", "ngx_send_response", "ngx_close_connection", "ngx_parse_headers"],
240
+ PostgreSQL: ["PQconnectdb", "PQexec", "PQfinish", "begin_transaction", "execute_query", "commit_transaction"],
241
+ LevelDB: ["DB_Open", "DB_Get", "DB_Put", "DB_Close", "DB_Write", "DB_Compact"],
242
+ };
243
+ /**
244
+ * Full cross-repository physics analysis.
245
+ */
246
+ function analyzeCrossRepoPhysics() {
247
+ const analyses = [];
248
+ const pairwise = [];
249
+ const repos = Object.entries(exports.KNOWN_REPO_SIGNATURES);
250
+ for (const [name, fns] of repos) {
251
+ analyses.push(analyzeRepoPhysics(name, fns));
252
+ }
253
+ for (let i = 0; i < analyses.length; i++) {
254
+ for (let j = i + 1; j < analyses.length; j++) {
255
+ const comp = compareRepoPhysics(analyses[i], analyses[j]);
256
+ pairwise.push({ a: analyses[i].repo, b: analyses[j].repo, similarity: comp.similarity });
257
+ }
258
+ }
259
+ const avgCoverage = analyses.reduce((s, a) => s + a.coverage, 0) / analyses.length;
260
+ const avgSimilarity = pairwise.reduce((s, p) => s + p.similarity, 0) / pairwise.length;
261
+ const verdict = avgSimilarity > 0.5 ? "structure_learned" :
262
+ avgSimilarity > 0.3 ? "partial" :
263
+ "name_memorized";
264
+ return { analyses, pairwise, avgCoverage, avgSimilarity, verdict };
265
+ }
266
+ function printCrossRepoReport(report) {
267
+ console.log("\n╔════════════════════════════════════════════════════╗");
268
+ console.log("║ P6.2 Software Physics — Cross-Repo Analysis ║");
269
+ console.log("╚════════════════════════════════════════════════════╝\n");
270
+ console.log(`Repos Analyzed: ${report.analyses.length}`);
271
+ console.log(`Avg Coverage: ${(report.avgCoverage * 100).toFixed(0)}%`);
272
+ console.log(`Avg Similarity: ${(report.avgSimilarity * 100).toFixed(0)}%`);
273
+ console.log(`Verdict: ${report.verdict.toUpperCase()}`);
274
+ console.log();
275
+ console.log("─── Per-Repo Physics Coverage ───");
276
+ for (const a of report.analyses) {
277
+ const cov = (a.coverage * 100).toFixed(0).padStart(4);
278
+ const patternList = [...a.patterns.entries()]
279
+ .filter(([p]) => p !== "UNKNOWN")
280
+ .map(([p, fns]) => `${p}(${fns.length})`)
281
+ .join(", ");
282
+ console.log(` ${a.repo.padEnd(12)} ${cov}% patterns: ${patternList || "none"}`);
283
+ }
284
+ console.log();
285
+ console.log("─── Pairwise Similarity ───");
286
+ for (const p of report.pairwise) {
287
+ const sim = (p.similarity * 100).toFixed(0).padStart(4);
288
+ console.log(` ${p.a.padEnd(12)} ↔ ${p.b.padEnd(12)} ${sim}%`);
289
+ }
290
+ console.log();
291
+ }