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,196 @@
1
+ "use strict";
2
+ /**
3
+ * P8.2: Topology Factory — programmatic protocol state machine generation
4
+ *
5
+ * Generates protocol rule sets for 10 distinct topology types,
6
+ * enabling diverse benchmark construction without hand-writing
7
+ * each protocol. Every topology is defined purely by its
8
+ * state transition structure — function names are auto-generated.
9
+ *
10
+ * 10 topologies:
11
+ * T1 linear A→B→C→D chain
12
+ * T2 star hub with radial spokes
13
+ * T3 tree branching decision tree
14
+ * T4 loop self-transition cycle with exit
15
+ * T5 two_phase_commit prepare → commit/rollback fork
16
+ * T6 auth_bridge auth gate → multiple resources
17
+ * T7 nested inner/outer resource dependency
18
+ * T8 rollback reversible forward/backward edges
19
+ * T9 fan_out fork-join parallelism
20
+ * T10 stateless self-loop only, no state change
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.ALL_TOPOLOGIES = void 0;
24
+ exports.createProtocolForTopology = createProtocolForTopology;
25
+ exports.ALL_TOPOLOGIES = [
26
+ "linear", "star", "tree", "loop", "two_phase_commit",
27
+ "auth_bridge", "nested", "rollback", "fan_out", "stateless",
28
+ ];
29
+ /**
30
+ * Create protocol rules for a given topology type.
31
+ * Returns SSG-compatible StateAnnotation map.
32
+ */
33
+ function createProtocolForTopology(type, numStates) {
34
+ const rules = buildRules(type, numStates);
35
+ const map = new Map();
36
+ // Convert ProtocolRule[] to Map<string, StateAnnotation>
37
+ // Group by action (function name) — each function appears once
38
+ const byAction = new Map();
39
+ for (const r of rules) {
40
+ if (!byAction.has(r.action)) {
41
+ byAction.set(r.action, { from: new Set(), to: new Set() });
42
+ }
43
+ byAction.get(r.action).from.add(r.from);
44
+ byAction.get(r.action).to.add(r.to);
45
+ }
46
+ for (const [action, { from, to }] of byAction) {
47
+ const postStates = [...to];
48
+ // Invalidation: states in "from" that are NOT in "to" for this action
49
+ // and NOT in "from" for any subsequent action that depends on them
50
+ const invalidate = [];
51
+ for (const f of from) {
52
+ // Check if any other action requires this state as a pre_state
53
+ let stillNeeded = false;
54
+ for (const [otherAction, otherEntry] of byAction) {
55
+ if (otherAction === action)
56
+ continue; // skip self
57
+ if (otherEntry.from.has(f)) {
58
+ stillNeeded = true;
59
+ break;
60
+ }
61
+ }
62
+ if (!stillNeeded && !to.has(f)) {
63
+ invalidate.push(f);
64
+ }
65
+ }
66
+ map.set(action, {
67
+ pre_states: [...from],
68
+ post_states: postStates.length > 0 ? postStates : [],
69
+ invalidate: invalidate.length > 0 ? invalidate : undefined,
70
+ namespace: type,
71
+ });
72
+ }
73
+ return map;
74
+ }
75
+ function buildRules(type, n) {
76
+ switch (type) {
77
+ case "linear": return buildLinear(n || 4);
78
+ case "star": return buildStar();
79
+ case "tree": return buildTree(2, 2);
80
+ case "loop": return buildLoop();
81
+ case "two_phase_commit": return buildTwoPhaseCommit();
82
+ case "auth_bridge": return buildAuthBridge();
83
+ case "nested": return buildNested();
84
+ case "rollback": return buildRollback();
85
+ case "fan_out": return buildFanOut();
86
+ case "stateless": return buildStateless();
87
+ }
88
+ }
89
+ function buildLinear(n) {
90
+ const rules = [];
91
+ for (let i = 0; i < n; i++) {
92
+ const from = i === 0 ? "INIT" : `S${i - 1}`;
93
+ const to = i < n - 1 ? `S${i}` : `S${n - 1}_DONE`;
94
+ const action = i === 0 ? "open" : i === n - 1 ? "close" : `op${i}`;
95
+ rules.push({ from, to, action });
96
+ }
97
+ return rules;
98
+ }
99
+ function buildStar() {
100
+ return [
101
+ { from: "INIT", to: "HUB", action: "acquire" },
102
+ { from: "HUB", to: "LEAF1", action: "use_a" },
103
+ { from: "LEAF1", to: "HUB", action: "release_a" },
104
+ { from: "HUB", to: "LEAF2", action: "use_b" },
105
+ { from: "LEAF2", to: "HUB", action: "release_b" },
106
+ { from: "HUB", to: "LEAF3", action: "use_c" },
107
+ { from: "LEAF3", to: "HUB", action: "release_c" },
108
+ { from: "HUB", to: "DONE", action: "destroy" },
109
+ ];
110
+ }
111
+ function buildTree(branchFactor, depth) {
112
+ const rules = [];
113
+ rules.push({ from: "INIT", to: "ROOT", action: "enter" });
114
+ let nodeCount = 1;
115
+ const id = (d, b) => `N${d}_${b}`;
116
+ for (let d = 0; d < depth; d++) {
117
+ const nodesAtLevel = Math.pow(branchFactor, d);
118
+ for (let n = 0; n < nodesAtLevel; n++) {
119
+ for (let b = 0; b < branchFactor; b++) {
120
+ const child = nodeCount++;
121
+ rules.push({
122
+ from: d === 0 && n === 0 ? "ROOT" : id(d, n),
123
+ to: id(d + 1, child),
124
+ action: `branch_d${d}_b${b}`,
125
+ });
126
+ }
127
+ }
128
+ }
129
+ return rules;
130
+ }
131
+ function buildLoop() {
132
+ return [
133
+ { from: "INIT", to: "LOOP", action: "init_loop" },
134
+ { from: "LOOP", to: "LOOP", action: "process" },
135
+ { from: "LOOP", to: "LOOP", action: "poll" },
136
+ { from: "LOOP", to: "EXIT", action: "exit_loop" },
137
+ { from: "LOOP", to: "EXIT", action: "timeout" },
138
+ ];
139
+ }
140
+ function buildTwoPhaseCommit() {
141
+ return [
142
+ { from: "INIT", to: "TX_ACTIVE", action: "begin_tx" },
143
+ { from: "TX_ACTIVE", to: "TX_ACTIVE", action: "insert" },
144
+ { from: "TX_ACTIVE", to: "TX_ACTIVE", action: "update" },
145
+ { from: "TX_ACTIVE", to: "PREPARED", action: "prepare" },
146
+ { from: "PREPARED", to: "COMMITTED", action: "commit" },
147
+ { from: "PREPARED", to: "ABORTED", action: "rollback" },
148
+ ];
149
+ }
150
+ function buildAuthBridge() {
151
+ return [
152
+ { from: "INIT", to: "AUTHED", action: "authenticate" },
153
+ { from: "AUTHED", to: "FILE_OPEN", action: "open_file" },
154
+ { from: "FILE_OPEN", to: "AUTHED", action: "close_file" },
155
+ { from: "AUTHED", to: "DB_OPEN", action: "connect_db" },
156
+ { from: "DB_OPEN", to: "AUTHED", action: "disconnect_db" },
157
+ { from: "AUTHED", to: "INIT", action: "logout" },
158
+ ];
159
+ }
160
+ function buildNested() {
161
+ return [
162
+ { from: "INIT", to: "OUTER_HELD", action: "acquire_outer" },
163
+ { from: "OUTER_HELD", to: "INNER_HELD", action: "acquire_inner" },
164
+ { from: "INNER_HELD", to: "OUTER_HELD", action: "release_inner" },
165
+ { from: "OUTER_HELD", to: "DONE", action: "release_outer" },
166
+ ];
167
+ }
168
+ function buildRollback() {
169
+ return [
170
+ { from: "INIT", to: "S1", action: "step1" },
171
+ { from: "S1", to: "S2", action: "step2" },
172
+ { from: "S2", to: "S3", action: "step3" },
173
+ { from: "S3", to: "DONE", action: "commit_all" },
174
+ { from: "S2", to: "S1", action: "undo_step2" },
175
+ { from: "S3", to: "S2", action: "undo_step3" },
176
+ ];
177
+ }
178
+ function buildFanOut() {
179
+ return [
180
+ { from: "INIT", to: "A", action: "fork_a" },
181
+ { from: "INIT", to: "B", action: "fork_b" },
182
+ { from: "INIT", to: "C", action: "fork_c" },
183
+ { from: "A", to: "JOIN", action: "op_a" },
184
+ { from: "B", to: "JOIN", action: "op_b" },
185
+ { from: "C", to: "JOIN", action: "op_c" },
186
+ { from: "JOIN", to: "DONE", action: "merge" },
187
+ ];
188
+ }
189
+ function buildStateless() {
190
+ return [
191
+ { from: "IDLE", to: "IDLE", action: "compute_hash" },
192
+ { from: "IDLE", to: "IDLE", action: "validate_input" },
193
+ { from: "IDLE", to: "IDLE", action: "encode_payload" },
194
+ { from: "IDLE", to: "IDLE", action: "decode_payload" },
195
+ ];
196
+ }
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ /**
3
+ * P7.2: Topology Representation — From Verb Learning to Structure Learning
4
+ *
5
+ * Replaces keyword-based clustering with graph topology analysis.
6
+ * Measures cross-repo similarity using PURE topology — no function names.
7
+ *
8
+ * Key insight from P7.1: 100% → 0% under name scrambling.
9
+ * The system must learn Acquire→Use→Release from graph structure,
10
+ * not from open/close/create vocabulary.
11
+ *
12
+ * Three levels:
13
+ * L1: Transition matrix (directed edges)
14
+ * L2: State machine (graph topology fingerprint)
15
+ * L3: Role discovery (SOURCE/SINK/HUB)
16
+ *
17
+ * Semantic Adversarial Test: rename open→destroy, close→create.
18
+ * If topology similarity survives, it's real structure learning.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.buildTopologyGraph = buildTopologyGraph;
22
+ exports.fingerprintRepo = fingerprintRepo;
23
+ exports.runTopologyExperiment = runTopologyExperiment;
24
+ exports.printTopologyReport = printTopologyReport;
25
+ const software_physics_1 = require("./experimental/software-physics");
26
+ /** Build a topology graph from a call sequence. Node labels are opaque indices. */
27
+ function buildTopologyGraph(sequence) {
28
+ const n = sequence.length;
29
+ if (n === 0) {
30
+ return { nodeCount: 0, edgeCount: 0, edges: [], inDegree: [], outDegree: [], sources: [], sinks: [], diameter: 0, isDAG: true };
31
+ }
32
+ const edges = [];
33
+ const inDegree = new Array(n).fill(0);
34
+ const outDegree = new Array(n).fill(0);
35
+ for (let i = 0; i < n - 1; i++) {
36
+ edges.push({ fromIdx: i, toIdx: i + 1 });
37
+ outDegree[i]++;
38
+ inDegree[i + 1]++;
39
+ }
40
+ const sources = [];
41
+ const sinks = [];
42
+ for (let i = 0; i < n; i++) {
43
+ if (inDegree[i] === 0)
44
+ sources.push(i);
45
+ if (outDegree[i] === 0)
46
+ sinks.push(i);
47
+ }
48
+ return {
49
+ nodeCount: n,
50
+ edgeCount: edges.length,
51
+ edges,
52
+ inDegree,
53
+ outDegree,
54
+ sources,
55
+ sinks,
56
+ diameter: n - 1, // linear chain
57
+ isDAG: true, // linear chain is always a DAG
58
+ };
59
+ }
60
+ /** Build a name-independent fingerprint from a set of sequences. */
61
+ function fingerprintRepo(sequences) {
62
+ if (sequences.length === 0) {
63
+ return { nodeCount: 0, edgeCount: 0, sourceCount: 0, sinkCount: 0, avgOutDegree: 0, diameter: 0, isDAG: true, outDegreeDist: [] };
64
+ }
65
+ const graphs = sequences.map(buildTopologyGraph);
66
+ const totalNodes = graphs.reduce((s, g) => s + g.nodeCount, 0);
67
+ const totalEdges = graphs.reduce((s, g) => s + g.edgeCount, 0);
68
+ const totalSources = graphs.reduce((s, g) => s + g.sources.length, 0);
69
+ const totalSinks = graphs.reduce((s, g) => s + g.sinks.length, 0);
70
+ const avgOut = totalNodes > 0 ? totalEdges / totalNodes : 0;
71
+ const avgDiameter = graphs.reduce((s, g) => s + g.diameter, 0) / graphs.length;
72
+ const allDAG = graphs.every(g => g.isDAG);
73
+ // Out-degree distribution
74
+ const maxOut = Math.max(...graphs.map(g => Math.max(...g.outDegree, 0)), 0);
75
+ const dist = new Array(maxOut + 1).fill(0);
76
+ for (const g of graphs) {
77
+ for (const d of g.outDegree) {
78
+ if (d < dist.length)
79
+ dist[d]++;
80
+ }
81
+ }
82
+ return {
83
+ nodeCount: totalNodes,
84
+ edgeCount: totalEdges,
85
+ sourceCount: totalSources,
86
+ sinkCount: totalSinks,
87
+ avgOutDegree: avgOut,
88
+ diameter: avgDiameter,
89
+ isDAG: allDAG,
90
+ outDegreeDist: dist,
91
+ };
92
+ }
93
+ /**
94
+ * Compute topological similarity between two repos.
95
+ * Uses Jaccard on binned fingerprint features — ZERO function names.
96
+ */
97
+ function topologySimilarity(a, b) {
98
+ // Normalize features to [0,1] bins
99
+ const features = [
100
+ a.nodeCount > 0 && b.nodeCount > 0 ? Math.min(a.nodeCount, b.nodeCount) / Math.max(a.nodeCount, b.nodeCount) : 0,
101
+ a.edgeCount > 0 && b.edgeCount > 0 ? Math.min(a.edgeCount, b.edgeCount) / Math.max(a.edgeCount, b.edgeCount) : 0,
102
+ a.sourceCount > 0 && b.sourceCount > 0 ? Math.min(a.sourceCount, b.sourceCount) / Math.max(a.sourceCount, b.sourceCount) : 0,
103
+ a.sinkCount > 0 && b.sinkCount > 0 ? Math.min(a.sinkCount, b.sinkCount) / Math.max(a.sinkCount, b.sinkCount) : 0,
104
+ Math.abs(a.avgOutDegree - b.avgOutDegree) < 0.5 ? 1 : 0,
105
+ a.diameter > 0 && b.diameter > 0 ? Math.min(a.diameter, b.diameter) / Math.max(a.diameter, b.diameter) : 0,
106
+ a.isDAG === b.isDAG ? 1 : 0,
107
+ ];
108
+ return features.reduce((s, f) => s + f, 0) / features.length;
109
+ }
110
+ /** Classify each node by its topological role (name-independent). */
111
+ function roleProfile(graph) {
112
+ const n = graph.nodeCount;
113
+ if (n === 0)
114
+ return { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 };
115
+ let sources = 0, sinks = 0, hubs = 0, passThrough = 0;
116
+ for (let i = 0; i < n; i++) {
117
+ const inD = graph.inDegree[i];
118
+ const outD = graph.outDegree[i];
119
+ if (inD === 0 && outD === 0) { /* isolated */ }
120
+ else if (inD === 0)
121
+ sources++;
122
+ else if (outD === 0)
123
+ sinks++;
124
+ else if (outD >= 3)
125
+ hubs++;
126
+ else if (inD === 1 && outD === 1)
127
+ passThrough++;
128
+ }
129
+ return {
130
+ sourceRatio: sources / n,
131
+ sinkRatio: sinks / n,
132
+ hubRatio: hubs / n,
133
+ passThroughRatio: passThrough / n,
134
+ };
135
+ }
136
+ /** Compare two repos by their role profiles. */
137
+ function roleSimilarity(a, b) {
138
+ const feats = [
139
+ 1 - Math.abs(a.sourceRatio - b.sourceRatio),
140
+ 1 - Math.abs(a.sinkRatio - b.sinkRatio),
141
+ 1 - Math.abs(a.hubRatio - b.hubRatio),
142
+ 1 - Math.abs(a.passThroughRatio - b.passThroughRatio),
143
+ ];
144
+ return feats.reduce((s, f) => s + Math.max(0, f), 0) / feats.length;
145
+ }
146
+ /**
147
+ * Run the topology representation experiment.
148
+ *
149
+ * The decisive test: measure cross-repo similarity using ONLY graph topology,
150
+ * with function names completely removed and replaced by opaque indices.
151
+ */
152
+ function runTopologyExperiment() {
153
+ // Baseline: name-based
154
+ const redisSeqs = software_physics_1.KNOWN_REPO_SIGNATURES["Redis"].map(fn => [fn]); // wrap as single-fn sequences
155
+ const sqliteSeqs = software_physics_1.KNOWN_REPO_SIGNATURES["SQLite"].map(fn => [fn]);
156
+ const redisFp = fingerprintRepo(CROSS_REPO_SEQS("Redis"));
157
+ const sqliteFp = fingerprintRepo(CROSS_REPO_SEQS("SQLite"));
158
+ const topologyOnly = topologySimilarity(redisFp, sqliteFp);
159
+ // Role-based
160
+ const redisGraphs = CROSS_REPO_SEQS("Redis").map(buildTopologyGraph);
161
+ const sqliteGraphs = CROSS_REPO_SEQS("SQLite").map(buildTopologyGraph);
162
+ const redisRole = redisGraphs.reduce((acc, g) => {
163
+ const r = roleProfile(g);
164
+ acc.sourceRatio += r.sourceRatio;
165
+ acc.sinkRatio += r.sinkRatio;
166
+ acc.hubRatio += r.hubRatio;
167
+ acc.passThroughRatio += r.passThroughRatio;
168
+ return acc;
169
+ }, { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 });
170
+ const sqliteRole = sqliteGraphs.reduce((acc, g) => {
171
+ const r = roleProfile(g);
172
+ acc.sourceRatio += r.sourceRatio;
173
+ acc.sinkRatio += r.sinkRatio;
174
+ acc.hubRatio += r.hubRatio;
175
+ acc.passThroughRatio += r.passThroughRatio;
176
+ return acc;
177
+ }, { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 });
178
+ const n = Math.max(1, redisGraphs.length);
179
+ const m = Math.max(1, sqliteGraphs.length);
180
+ redisRole.sourceRatio /= n;
181
+ redisRole.sinkRatio /= n;
182
+ redisRole.hubRatio /= n;
183
+ redisRole.passThroughRatio /= n;
184
+ sqliteRole.sourceRatio /= m;
185
+ sqliteRole.sinkRatio /= m;
186
+ sqliteRole.hubRatio /= m;
187
+ sqliteRole.passThroughRatio /= m;
188
+ const roleSimilarityScore = roleSimilarity(redisRole, sqliteRole);
189
+ // Semantic adversarial: rename open→destroy, close→create (misleading names, topology unchanged)
190
+ // Use the same sequences but with scrambled names (F_001 format)
191
+ const scrambledRedis = CROSS_REPO_SEQS("Redis").map(seq => seq.map((_, i) => `F_${String(i).padStart(4, "0")}`));
192
+ const scrambledSqlite = CROSS_REPO_SEQS("SQLite").map(seq => seq.map((_, i) => `X_${String(i).padStart(4, "0")}`));
193
+ const scrambledRedisFp = fingerprintRepo(scrambledRedis);
194
+ const scrambledSqliteFp = fingerprintRepo(scrambledSqlite);
195
+ const semanticAdversarial = topologySimilarity(scrambledRedisFp, scrambledSqliteFp);
196
+ // Baseline from P6.2 (with names)
197
+ const redisA = (0, software_physics_1.analyzeRepoPhysics)("Redis", software_physics_1.KNOWN_REPO_SIGNATURES["Redis"]);
198
+ const sqliteA = (0, software_physics_1.analyzeRepoPhysics)("SQLite", software_physics_1.KNOWN_REPO_SIGNATURES["SQLite"]);
199
+ const baseline = (0, software_physics_1.compareRepoPhysics)(redisA, sqliteA).similarity;
200
+ const survivalRate = baseline > 0 ? topologyOnly / baseline : 0;
201
+ return {
202
+ baseline,
203
+ topologyOnly,
204
+ roleSimilarity: roleSimilarityScore,
205
+ semanticAdversarial,
206
+ topologySurvivalRate: survivalRate,
207
+ verdict: survivalRate > 0.7 ? "structure_learned" :
208
+ survivalRate < 0.2 ? "verb_learning" : "partial",
209
+ };
210
+ }
211
+ /** Helper: get sequences from a known repo. */
212
+ function CROSS_REPO_SEQS(repo) {
213
+ const all = {
214
+ Redis: [["createClient", "sendCommand", "closeClient"], ["selectDB", "getKey"], ["createClient", "sendCommand", "readReply", "closeClient"]],
215
+ SQLite: [["sqlite3_open", "sqlite3_exec", "sqlite3_close"], ["sqlite3_prepare", "sqlite3_step", "sqlite3_finalize"], ["sqlite3_open", "sqlite3_prepare", "sqlite3_step", "sqlite3_finalize", "sqlite3_close"]],
216
+ };
217
+ return all[repo] || [];
218
+ }
219
+ function printTopologyReport(report) {
220
+ console.log("\n╔════════════════════════════════════════════════════╗");
221
+ console.log("║ P7.2 Topology Representation Experiment ║");
222
+ console.log("║ Pure graph structure — ZERO function names ║");
223
+ console.log("╚════════════════════════════════════════════════════╝\n");
224
+ console.log(`Baseline (name-based): ${(report.baseline * 100).toFixed(0)}%`);
225
+ console.log(`Topology Only (no names): ${(report.topologyOnly * 100).toFixed(0)}%`);
226
+ console.log(`Role Similarity: ${(report.roleSimilarity * 100).toFixed(0)}%`);
227
+ console.log(`Semantic Adversarial: ${(report.semanticAdversarial * 100).toFixed(0)}%`);
228
+ console.log(`Topology Survival Rate: ${(report.topologySurvivalRate * 100).toFixed(0)}%`);
229
+ console.log();
230
+ console.log(`─── Verdict ───`);
231
+ console.log(` Classification: ${report.verdict.toUpperCase()}`);
232
+ console.log();
233
+ if (report.verdict === "structure_learned") {
234
+ console.log(" ✅ Topology similarity SURVIVES without function names.");
235
+ console.log(" The system genuinely learns protocol STRUCTURE.");
236
+ }
237
+ else if (report.verdict === "verb_learning") {
238
+ console.log(" ❌ Topology similarity COLLAPSES without function names.");
239
+ console.log(" The system depends on API vocabulary, not graph structure.");
240
+ }
241
+ console.log();
242
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * P7.2: Topology Representation Tests
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const topology_representation_1 = require("./topology-representation");
8
+ (0, vitest_1.describe)("Topology Graph", () => {
9
+ (0, vitest_1.it)("builds DAG from linear sequence", () => {
10
+ const g = (0, topology_representation_1.buildTopologyGraph)(["A", "B", "C"]);
11
+ (0, vitest_1.expect)(g.nodeCount).toBe(3);
12
+ (0, vitest_1.expect)(g.edgeCount).toBe(2);
13
+ (0, vitest_1.expect)(g.sources.length).toBe(1); // A: in=0
14
+ (0, vitest_1.expect)(g.sinks.length).toBe(1); // C: out=0
15
+ (0, vitest_1.expect)(g.isDAG).toBe(true);
16
+ (0, vitest_1.expect)(g.diameter).toBe(2);
17
+ });
18
+ });
19
+ (0, vitest_1.describe)("P7.2 Topology Experiment", () => {
20
+ (0, vitest_1.it)("measures cross-repo similarity with pure topology (no names)", () => {
21
+ const report = (0, topology_representation_1.runTopologyExperiment)();
22
+ (0, vitest_1.expect)(report.baseline).toBeGreaterThan(0);
23
+ (0, vitest_1.expect)(report.topologyOnly).toBeGreaterThanOrEqual(0);
24
+ (0, vitest_1.expect)(report.topologyOnly).toBeLessThanOrEqual(1);
25
+ (0, topology_representation_1.printTopologyReport)(report);
26
+ });
27
+ });