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,95 @@
1
+ "use strict";
2
+ /**
3
+ * P6.3: Unsupervised Physics Discovery Tests
4
+ *
5
+ * Verifying: does structural clustering discover Acquire/Release
6
+ * patterns WITHOUT any keyword matching or function names?
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const vitest_1 = require("vitest");
10
+ const unsupervised_physics_1 = require("./experimental/unsupervised-physics");
11
+ (0, vitest_1.describe)("Structural Fingerprint (no function names)", () => {
12
+ (0, vitest_1.it)("assigns phase 0/1/2 based on position only", () => {
13
+ const fp0 = (0, unsupervised_physics_1.fingerprint)("fopen", 0, ["fopen", "fread", "fclose"]);
14
+ (0, vitest_1.expect)(fp0.phase).toBe(0);
15
+ (0, vitest_1.expect)(fp0.isFirst).toBe(true);
16
+ (0, vitest_1.expect)(fp0.isLast).toBe(false);
17
+ const fp1 = (0, unsupervised_physics_1.fingerprint)("fread", 1, ["fopen", "fread", "fclose"]);
18
+ (0, vitest_1.expect)(fp1.phase).toBe(1);
19
+ const fp2 = (0, unsupervised_physics_1.fingerprint)("fclose", 2, ["fopen", "fread", "fclose"]);
20
+ (0, vitest_1.expect)(fp2.phase).toBe(2);
21
+ (0, vitest_1.expect)(fp2.isLast).toBe(true);
22
+ });
23
+ (0, vitest_1.it)("detects closed loops (first and last appear only once)", () => {
24
+ const fp = (0, unsupervised_physics_1.fingerprint)("fopen", 0, ["fopen", "fread", "fclose"]);
25
+ // The SEQUENCE [fopen, fread, fclose] is a closed loop
26
+ // because fopen and fclose each appear once
27
+ (0, vitest_1.expect)(fp.isClosedLoop).toBe(true);
28
+ });
29
+ (0, vitest_1.it)("does NOT consider repeated functions as closed loops", () => {
30
+ const fp = (0, unsupervised_physics_1.fingerprint)("fread", 0, ["fread", "fread", "fread"]);
31
+ (0, vitest_1.expect)(fp.isClosedLoop).toBe(false);
32
+ });
33
+ });
34
+ (0, vitest_1.describe)("Unsupervised Clustering", () => {
35
+ (0, vitest_1.it)("groups sequences by structure, not by name", () => {
36
+ // [A,B,C] and [X,Y,Z] should cluster together — same structure (length=3, closed loop)
37
+ const seqs = [
38
+ ["fopen", "fread", "fclose"],
39
+ ["sqlite3_open", "sqlite3_exec", "sqlite3_close"],
40
+ ["DB_Open", "DB_Get", "DB_Close"],
41
+ ["PQconnectdb", "PQexec", "PQfinish"],
42
+ ["ngx_accept", "ngx_process", "ngx_close"],
43
+ ];
44
+ const clusters = (0, unsupervised_physics_1.clusterByStructure)(seqs);
45
+ (0, vitest_1.expect)(clusters.length).toBeGreaterThan(0);
46
+ // All 5 sequences have length=3 and are closed-loop → same cluster
47
+ const mainCluster = clusters.find(c => c.avgLength === 3 && c.closedLoopRate === 1);
48
+ (0, vitest_1.expect)(mainCluster).toBeDefined();
49
+ (0, vitest_1.expect)(mainCluster.sequences.length).toBe(5);
50
+ });
51
+ (0, vitest_1.it)("separates Acquire-Release from Lock-Unlock by length", () => {
52
+ const seqs = [
53
+ ["open", "read", "close"], // len=3, closed → Acquire
54
+ ["connect", "query", "disconnect"], // len=3, closed → Acquire
55
+ ["lock", "unlock"], // len=2, closed → Lock
56
+ ["mutex_lock", "mutex_unlock"], // len=2, closed → Lock
57
+ ];
58
+ const clusters = (0, unsupervised_physics_1.clusterByStructure)(seqs);
59
+ (0, vitest_1.expect)(clusters.length).toBeGreaterThanOrEqual(2);
60
+ const acquireCluster = clusters.find(c => c.avgLength === 3);
61
+ (0, vitest_1.expect)(acquireCluster).toBeDefined();
62
+ (0, vitest_1.expect)(acquireCluster.inferredPattern).toBe("RESOURCE_ACQUIRE");
63
+ const lockCluster = clusters.find(c => c.avgLength === 2);
64
+ (0, vitest_1.expect)(lockCluster).toBeDefined();
65
+ (0, vitest_1.expect)(lockCluster.inferredPattern).toBe("LOCK_ACQUIRE");
66
+ });
67
+ });
68
+ (0, vitest_1.describe)("Unsupervised Discovery Evaluation", () => {
69
+ (0, vitest_1.it)("discovers physics patterns across all repos", () => {
70
+ const allSeqs = [];
71
+ for (const seqs of Object.values(unsupervised_physics_1.CROSS_REPO_SEQUENCES)) {
72
+ allSeqs.push(...seqs);
73
+ }
74
+ const eval_ = (0, unsupervised_physics_1.evaluateUnsupervisedDiscovery)(allSeqs);
75
+ (0, vitest_1.expect)(eval_.totalSequences).toBeGreaterThanOrEqual(10);
76
+ (0, vitest_1.expect)(eval_.clusters.length).toBeGreaterThan(0);
77
+ (0, vitest_1.expect)(eval_.sequenceCoverage).toBeGreaterThan(0.5);
78
+ (0, vitest_1.expect)(eval_.emergent).toBe(true);
79
+ });
80
+ (0, vitest_1.it)("each repo independently shows emergent physics", () => {
81
+ for (const [repo, seqs] of Object.entries(unsupervised_physics_1.CROSS_REPO_SEQUENCES)) {
82
+ const eval_ = (0, unsupervised_physics_1.evaluateUnsupervisedDiscovery)(seqs);
83
+ // Each repo has at least one Acquire-Use-Release sequence
84
+ (0, vitest_1.expect)(eval_.sequenceCoverage).toBeGreaterThan(0);
85
+ }
86
+ });
87
+ (0, vitest_1.it)("full unsupervised report", () => {
88
+ const report = (0, unsupervised_physics_1.runUnsupervisedDiscovery)();
89
+ (0, vitest_1.expect)(report.perRepo).toBeDefined();
90
+ (0, vitest_1.expect)(report.allSequences.clusters.length).toBeGreaterThan(0);
91
+ // At minimum, the 3-element closed-loop cluster should emerge
92
+ (0, vitest_1.expect)(report.emergent).toBe(true);
93
+ (0, unsupervised_physics_1.printUnsupervisedReport)(report);
94
+ });
95
+ });
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Unit tests for utility functions and pure-logic modules.
5
+ * Demonstrates the Vitest pattern for Progmune.
6
+ */
7
+ const vitest_1 = require("vitest");
8
+ const utils_1 = require("./utils");
9
+ // ── jaccardSimilarity ──
10
+ (0, vitest_1.describe)("jaccardSimilarity", () => {
11
+ (0, vitest_1.it)("returns 1 for identical strings", () => {
12
+ (0, vitest_1.expect)((0, utils_1.jaccardSimilarity)("hello", "hello")).toBeCloseTo(1, 1);
13
+ });
14
+ (0, vitest_1.it)("returns 0 for strings with no common characters", () => {
15
+ (0, vitest_1.expect)((0, utils_1.jaccardSimilarity)("abc", "xyz")).toBe(0);
16
+ });
17
+ (0, vitest_1.it)("returns a value between 0 and 1 for partially overlapping strings", () => {
18
+ const score = (0, utils_1.jaccardSimilarity)("loginUser", "userLogin");
19
+ (0, vitest_1.expect)(score).toBeGreaterThan(0);
20
+ (0, vitest_1.expect)(score).toBeLessThanOrEqual(1);
21
+ });
22
+ });
23
+ // ── extractKeywords ──
24
+ (0, vitest_1.describe)("extractKeywords", () => {
25
+ (0, vitest_1.it)("extracts Chinese words", () => {
26
+ const kw = (0, utils_1.extractKeywords)("验证用户密码并生成JWT令牌");
27
+ (0, vitest_1.expect)(kw.some(k => k.includes("验证") || k.includes("用户"))).toBe(true);
28
+ });
29
+ (0, vitest_1.it)("extracts English words and camelCase tokens", () => {
30
+ const kw = (0, utils_1.extractKeywords)("authenticate user and generateToken");
31
+ (0, vitest_1.expect)(kw.some(k => k.toLowerCase().includes("authenticate"))).toBe(true);
32
+ });
33
+ (0, vitest_1.it)("returns non-empty array for any input", () => {
34
+ const kw = (0, utils_1.extractKeywords)("hello world");
35
+ (0, vitest_1.expect)(kw.length).toBeGreaterThan(0);
36
+ });
37
+ });
package/dist/validator.js CHANGED
@@ -35,15 +35,12 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.validateAction = validateAction;
37
37
  exports.validateActionSequence = validateActionSequence;
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- function loadIR() {
41
- const irPath = path.resolve(__dirname, "../ir.json");
42
- if (!fs.existsSync(irPath))
43
- return [];
44
- const raw = JSON.parse(fs.readFileSync(irPath, "utf-8"));
45
- return Array.isArray(raw) ? raw : (raw.functions || []);
46
- }
38
+ exports.validateActionResult = validateActionResult;
39
+ exports.validateWithGoal = validateWithGoal;
40
+ exports.validateWithRepair = validateWithRepair;
41
+ const ir_utils_1 = require("./ir-utils");
42
+ const runtime_types_1 = require("./runtime-types");
43
+ const failure_corpus_1 = require("./failure-corpus");
47
44
  const BUILTIN_WHITELIST = new Set([
48
45
  "console.log", "setTimeout", "setInterval", "clearTimeout",
49
46
  "JSON.stringify", "JSON.parse", "fetch"
@@ -152,7 +149,7 @@ function checkVariableFlow(actions) {
152
149
  */
153
150
  /** @requires ACTION @produces VALIDATION_RESULT */
154
151
  function validateAction(action, actionIndex) {
155
- const functions = loadIR();
152
+ const functions = (0, ir_utils_1.loadIR)();
156
153
  const errors = [];
157
154
  const violations = [];
158
155
  const idx = actionIndex ?? 0;
@@ -250,5 +247,185 @@ function validateActionSequence(actions) {
250
247
  }
251
248
  }
252
249
  }
250
+ // ── P0: Trajectory auto-collection — record ALL outcomes ──
251
+ const actionNames = actions.map(a => a.function || a.kind || "?");
252
+ const ctx = {
253
+ nestingDepth: 0,
254
+ exceptionHandled: false,
255
+ insideLoop: false,
256
+ branchCount: 0,
257
+ asyncContext: false,
258
+ };
259
+ if (violations.length > 0) {
260
+ // Record violation trajectories
261
+ for (const v of violations) {
262
+ try {
263
+ (0, failure_corpus_1.recordTrajectory)({
264
+ protocol: v.namespace || "default",
265
+ initialState: v.currentStates || [],
266
+ finalState: v.requiredStates || [],
267
+ trajectory: actionNames,
268
+ result: "violation",
269
+ violationType: svlToViolationType(v.svl, v.description),
270
+ violationDesc: v.description,
271
+ failingStepIndex: v.actionIndex,
272
+ fixPath: v.fixPath,
273
+ context: ctx,
274
+ successRate: 0,
275
+ intent: v.description,
276
+ });
277
+ }
278
+ catch { /* auto-collection must never crash validation */ }
279
+ }
280
+ }
281
+ else {
282
+ // Record success trajectory — positive sample for reward learning
283
+ try {
284
+ (0, failure_corpus_1.recordSuccess)({
285
+ protocol: "default",
286
+ initialState: ["INIT"],
287
+ finalState: ["COMPLETED"],
288
+ trajectory: actionNames,
289
+ context: ctx,
290
+ source: "planner",
291
+ });
292
+ }
293
+ catch { /* auto-collection must never crash validation */ }
294
+ }
253
295
  return { valid: errors.length === 0, errors, violations };
254
296
  }
297
+ /** Map SVL level to ViolationType for auto-collection. */
298
+ function svlToViolationType(svl, desc) {
299
+ if (svl === 4)
300
+ return "protocol_violation";
301
+ if (svl === 1)
302
+ return "undefined_variable";
303
+ if (desc.includes("type"))
304
+ return "wrong_arg_type";
305
+ if (desc.includes("import") || desc.includes("module"))
306
+ return "wrong_import_path";
307
+ if (desc.includes("arg") || desc.includes("parameter"))
308
+ return "wrong_arg_count";
309
+ return "other";
310
+ }
311
+ /**
312
+ * Result-typed variant of validateActionSequence.
313
+ * Returns Ok<Action[]> on success, Err<ValidationError[]> on failure.
314
+ * Use this for new code; the legacy {valid, errors} API remains for backward compat.
315
+ */
316
+ function validateActionResult(actions) {
317
+ const legacy = validateActionSequence(actions);
318
+ if (legacy.valid)
319
+ return (0, runtime_types_1.ok)(actions);
320
+ const mapped = legacy.errors.map((msg, i) => {
321
+ const v = legacy.violations[i];
322
+ return {
323
+ message: msg,
324
+ code: v?.violatedConstraint || "unknown",
325
+ index: v?.actionIndex,
326
+ };
327
+ });
328
+ return (0, runtime_types_1.err)(mapped);
329
+ }
330
+ // ═══════════════════════════════════════════════════════════════
331
+ // P1: Validation with Goal Skeleton annotation
332
+ // ═══════════════════════════════════════════════════════════════
333
+ /**
334
+ * Validate actions with an associated goal. The goal is annotated asynchronously
335
+ * (best-effort, non-blocking) and attached to the trajectory record.
336
+ *
337
+ * This is the P1 entry point — use this when the user provides a natural language goal.
338
+ */
339
+ async function validateWithGoal(actions, goalText, params) {
340
+ // Run validation first (never block on goal annotation)
341
+ const result = validateActionSequence(actions);
342
+ // Fire-and-forget: annotate the goal and write trajectory with goal attached
343
+ const { annotateGoal } = await Promise.resolve().then(() => __importStar(require("./goal-annotator")));
344
+ const actionNames = actions.map(a => a.function || a.kind || "?");
345
+ const ctx = {
346
+ nestingDepth: 0, exceptionHandled: false, insideLoop: false, branchCount: 0, asyncContext: false,
347
+ };
348
+ annotateGoal(goalText).then(goalRecord => {
349
+ const { recordTrajectory } = require("./failure-corpus");
350
+ if (result.valid) {
351
+ recordTrajectory({
352
+ protocol: goalRecord.protocol,
353
+ initialState: [goalRecord.initial_state],
354
+ finalState: [goalRecord.target_state],
355
+ trajectory: actionNames,
356
+ result: "success",
357
+ context: ctx,
358
+ source: "llm",
359
+ intent: goalText,
360
+ goal: goalRecord,
361
+ });
362
+ }
363
+ else {
364
+ for (const v of result.violations) {
365
+ recordTrajectory({
366
+ protocol: goalRecord.protocol,
367
+ initialState: [goalRecord.initial_state],
368
+ finalState: [goalRecord.target_state],
369
+ trajectory: actionNames,
370
+ result: "violation",
371
+ violationType: svlToViolationType(v.svl, v.description),
372
+ violationDesc: v.description,
373
+ failingStepIndex: v.actionIndex,
374
+ fixPath: v.fixPath,
375
+ context: ctx,
376
+ intent: goalText,
377
+ goal: goalRecord,
378
+ });
379
+ }
380
+ }
381
+ }).catch(() => { });
382
+ // Enrich with repair alternatives
383
+ const enriched = await validateWithRepair(actions, params);
384
+ return enriched;
385
+ }
386
+ // ═══════════════════════════════════════════════════════════════
387
+ // P2 V3: Validation with Counterfactual Repair
388
+ // ═══════════════════════════════════════════════════════════════
389
+ /**
390
+ * Validate an action sequence and enrich any violations with
391
+ * counterfactual repair alternatives (top-3).
392
+ *
393
+ * This is the async V3 entry point — use this instead of
394
+ * validateActionSequence when you want repair suggestions.
395
+ */
396
+ async function validateWithRepair(actions, params) {
397
+ // Run the sync validation first
398
+ const result = validateActionSequence(actions);
399
+ if (result.valid || result.violations.length === 0)
400
+ return result;
401
+ // Enrich each violation with counterfactual alternatives
402
+ const { suggestAlternatives } = await Promise.resolve().then(() => __importStar(require("./counterfactual-engine")));
403
+ const enrichedViolations = [...result.violations];
404
+ for (let i = 0; i < enrichedViolations.length; i++) {
405
+ const v = enrichedViolations[i];
406
+ try {
407
+ const alts = await suggestAlternatives({
408
+ violation: v,
409
+ protocol: params?.protocol || v.namespace || "default",
410
+ currentState: v.currentStates || [],
411
+ targetState: params?.targetState || v.requiredStates || ["COMPLETED"],
412
+ rules: params?.rules || new Map(),
413
+ });
414
+ enrichedViolations[i] = {
415
+ ...v,
416
+ repairAlternatives: alts.map(a => ({
417
+ rank: a.rank,
418
+ description: a.description,
419
+ fixPath: a.fixPath,
420
+ source: a.source,
421
+ score: a.score,
422
+ historicalSuccessRate: a.historicalSuccessRate,
423
+ })),
424
+ };
425
+ }
426
+ catch {
427
+ // repair suggestion failure must never invalidate the base validation
428
+ }
429
+ }
430
+ return { valid: false, errors: result.errors, violations: enrichedViolations };
431
+ }