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,432 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 12: External Verification API
4
+ *
5
+ * Standalone REST API for third-party certificate verification.
6
+ * Auditors and regulators can verify AI code certificates
7
+ * without installing Progmune — pure HTTP.
8
+ *
9
+ * Endpoints:
10
+ * GET /verify/:sessionId — full verification bundle
11
+ * GET /verify/:sessionId/certificate — certificate only
12
+ * GET /verify/:sessionId/chain — hash chain (independent verification)
13
+ * GET /verify/:sessionId/policy — policy check result
14
+ * POST /verify — submit certificate JSON for verification
15
+ * GET /health — service health
16
+ *
17
+ * Usage:
18
+ * npx ts-node src/verify-api.ts
19
+ * PROGMUNE_VERIFY_PORT=3300 npx ts-node src/verify-api.ts
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ const http = __importStar(require("http"));
56
+ const PORT = parseInt(process.env.PROGMUNE_VERIFY_PORT || "3300", 10);
57
+ const API_KEY = process.env.PROGMUNE_VERIFY_API_KEY || ""; // Empty = no auth required
58
+ const RATE_LIMIT = parseInt(process.env.PROGMUNE_VERIFY_RATE_LIMIT || "100", 10); // requests per window
59
+ const RATE_WINDOW = parseInt(process.env.PROGMUNE_VERIFY_RATE_WINDOW || "3600000", 10); // 1 hour default
60
+ // Rate limiting: IP → count in current window
61
+ const rateMap = new Map();
62
+ function checkRateLimit(ip) {
63
+ if (!API_KEY)
64
+ return true; // No API key configured → no rate limiting
65
+ const now = Date.now();
66
+ const entry = rateMap.get(ip);
67
+ if (!entry || now > entry.resetAt) {
68
+ rateMap.set(ip, { count: 1, resetAt: now + RATE_WINDOW });
69
+ return true;
70
+ }
71
+ if (entry.count >= RATE_LIMIT)
72
+ return false;
73
+ entry.count++;
74
+ return true;
75
+ }
76
+ function getVerificationBundle(sessionId) {
77
+ // 1. Load session
78
+ const { getAllSessions } = require("./failure-corpus");
79
+ const sessions = getAllSessions();
80
+ const session = sessions.find((s) => s.sessionId === sessionId || s.sessionId?.startsWith(sessionId));
81
+ if (!session) {
82
+ return { error: `Session not found: ${sessionId}` };
83
+ }
84
+ // 2. Build provenance chain
85
+ let provenance;
86
+ let hashChain = [];
87
+ try {
88
+ const { buildProvenanceChain } = require("./ledger/chain-builder");
89
+ provenance = buildProvenanceChain(sessionId);
90
+ hashChain = provenance.events.map((e) => e.hash);
91
+ }
92
+ catch (e) {
93
+ return { error: `Provenance chain error: ${e.message}` };
94
+ }
95
+ // 3. Build accountability chain
96
+ let accountability;
97
+ try {
98
+ const { buildAccountabilityChain, verifyAccountabilityChain } = require("./ledger/accountability");
99
+ accountability = buildAccountabilityChain(sessionId);
100
+ // Verify chain integrity
101
+ const acctVerify = verifyAccountabilityChain(accountability);
102
+ accountability._verified = acctVerify.valid;
103
+ accountability._signedCount = acctVerify.signedCount;
104
+ accountability._unsignedCount = acctVerify.unsignedCount;
105
+ }
106
+ catch { /* accountability unavailable */ }
107
+ // 4. Check ledger consistency
108
+ let ledgerConsistent = false;
109
+ let violations = 0;
110
+ let allTransitions = [];
111
+ try {
112
+ for (const a of session.attempts || []) {
113
+ allTransitions = allTransitions.concat(a.transitions || []);
114
+ }
115
+ if (allTransitions.length > 0) {
116
+ const { checkLedgerConsistency } = require("./ssg-validator");
117
+ const { getNsInit } = require("./protocol-registry");
118
+ const result = checkLedgerConsistency(allTransitions, getNsInit());
119
+ ledgerConsistent = result.consistent;
120
+ violations = (result.violations || []).length;
121
+ }
122
+ else {
123
+ ledgerConsistent = true;
124
+ }
125
+ }
126
+ catch { /* skip */ }
127
+ // 5. Verify fingerprint
128
+ let fingerprintVerified = false;
129
+ let fingerprintTampered = false;
130
+ let fingerprintHash = "";
131
+ try {
132
+ const { verifyFingerprint } = require("./ledger-registry");
133
+ const fp = verifyFingerprint(sessionId, allTransitions);
134
+ fingerprintVerified = fp.valid;
135
+ fingerprintTampered = fp.tampered;
136
+ fingerprintHash = fp.stored?.ledgerHash || "";
137
+ }
138
+ catch { /* no fingerprint */ }
139
+ // 6. Build certificate
140
+ let certificate;
141
+ try {
142
+ // Create a minimal cert from session data
143
+ certificate = {
144
+ sessionId: session.sessionId,
145
+ intent: session.intent || "",
146
+ validated: ledgerConsistent,
147
+ fingerprintVerified,
148
+ fingerprintHash,
149
+ transitions: allTransitions.length,
150
+ validTransitions: allTransitions.filter((t) => t.valid !== false).length,
151
+ violations,
152
+ timestamp: session.endedAt
153
+ ? new Date(session.endedAt).toISOString()
154
+ : new Date().toISOString(),
155
+ };
156
+ }
157
+ catch { /* skip */ }
158
+ // 7. Compute overall tampered status
159
+ const tampered = fingerprintTampered || provenance.integrity === "broken";
160
+ const verified = !tampered && ledgerConsistent && fingerprintVerified;
161
+ return {
162
+ verified,
163
+ sessionId: session.sessionId,
164
+ certificate,
165
+ provenance: {
166
+ integrity: provenance.integrity,
167
+ chainHash: provenance.chainHash,
168
+ totalTransitions: provenance.totalTransitions,
169
+ validTransitions: provenance.validTransitions,
170
+ invalidTransitions: provenance.invalidTransitions,
171
+ repairCount: provenance.repairCount,
172
+ },
173
+ accountability: accountability ? {
174
+ totalEvents: accountability.totalEvents,
175
+ humanEvents: accountability.humanEvents,
176
+ aiEvents: accountability.aiEvents,
177
+ automatedEvents: accountability.automatedEvents,
178
+ custodyGap: accountability.custodyGap,
179
+ chainHash: accountability.chainHash,
180
+ _verified: accountability._verified,
181
+ _signedCount: accountability._signedCount,
182
+ _unsignedCount: accountability._unsignedCount,
183
+ } : null,
184
+ policy: {
185
+ ledgerConsistent,
186
+ fingerprintVerified,
187
+ fingerprintTampered,
188
+ violations,
189
+ },
190
+ hashChain,
191
+ chainRoot: provenance.chainHash,
192
+ verifiedAt: new Date().toISOString(),
193
+ tampered,
194
+ detail: tampered
195
+ ? "⚠️ Tampering detected — fingerprint mismatch or provenance chain broken."
196
+ : verified
197
+ ? "✅ Verified — certificate is authentic and the code provenance is intact."
198
+ : "⚠️ Verification incomplete — some checks could not be performed. Manual review recommended.",
199
+ };
200
+ }
201
+ // ═══════════════════════════════════════════════════════════════
202
+ // HTTP Server
203
+ // ═══════════════════════════════════════════════════════════════
204
+ function json(res, data, status = 200) {
205
+ res.writeHead(status, {
206
+ "Content-Type": "application/json",
207
+ "Access-Control-Allow-Origin": "*",
208
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
209
+ "Access-Control-Allow-Headers": "Content-Type",
210
+ });
211
+ res.end(JSON.stringify(data, null, 2));
212
+ }
213
+ function html(res, body, status = 200) {
214
+ res.writeHead(status, { "Content-Type": "text/html; charset=utf-8" });
215
+ res.end(body);
216
+ }
217
+ const server = http.createServer((req, res) => {
218
+ const url = req.url || "/";
219
+ const method = req.method || "GET";
220
+ const ip = req.socket.remoteAddress || "unknown";
221
+ // Auth (if API key configured)
222
+ if (API_KEY) {
223
+ const auth = req.headers["authorization"] || "";
224
+ if (!auth.includes(API_KEY) && url !== "/health" && url !== "/") {
225
+ json(res, { error: "Unauthorized. Use Authorization: Bearer <api_key>" }, 401);
226
+ return;
227
+ }
228
+ }
229
+ // Rate limit
230
+ if (!checkRateLimit(ip) && url !== "/health") {
231
+ json(res, { error: "Rate limit exceeded. Try again later." }, 429);
232
+ return;
233
+ }
234
+ // CORS preflight
235
+ if (method === "OPTIONS") {
236
+ res.writeHead(204, {
237
+ "Access-Control-Allow-Origin": "*",
238
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
239
+ "Access-Control-Allow-Headers": "Content-Type",
240
+ });
241
+ res.end();
242
+ return;
243
+ }
244
+ // Health
245
+ if (url === "/health") {
246
+ json(res, {
247
+ status: "ok",
248
+ service: "Progmune Verification API",
249
+ version: "1.0.0",
250
+ authRequired: !!API_KEY,
251
+ rateLimit: API_KEY ? `${RATE_LIMIT} requests/hour` : "unlimited",
252
+ activeClients: rateMap.size,
253
+ });
254
+ return;
255
+ }
256
+ // Home page
257
+ if (url === "/" || url === "") {
258
+ html(res, renderHomePage());
259
+ return;
260
+ }
261
+ // POST /verify — submit certificate JSON for verification
262
+ if (url === "/verify" && method === "POST") {
263
+ let body = "";
264
+ req.on("data", (chunk) => (body += chunk));
265
+ req.on("end", () => {
266
+ try {
267
+ const submitted = JSON.parse(body);
268
+ const sessionId = submitted.sessionId || submitted.session_id;
269
+ if (!sessionId) {
270
+ json(res, { error: "Missing sessionId or session_id in request body" }, 400);
271
+ return;
272
+ }
273
+ const bundle = getVerificationBundle(sessionId);
274
+ if ("error" in bundle) {
275
+ json(res, bundle, 404);
276
+ return;
277
+ }
278
+ // Cross-check submitted data against stored data
279
+ bundle.certificate._crossCheck = {
280
+ fingerprintMatch: submitted.fingerprint === bundle.certificate.fingerprintHash,
281
+ chainRootMatch: submitted.chainRoot === bundle.chainRoot,
282
+ };
283
+ json(res, bundle);
284
+ }
285
+ catch (e) {
286
+ json(res, { error: `Invalid JSON: ${e.message}` }, 400);
287
+ }
288
+ });
289
+ return;
290
+ }
291
+ // GET /verify/:sessionId/chain
292
+ if (url.startsWith("/verify/") && url.endsWith("/chain")) {
293
+ const sessionId = url.split("/verify/")[1]?.replace("/chain", "");
294
+ const bundle = getVerificationBundle(sessionId);
295
+ if ("error" in bundle) {
296
+ json(res, bundle, 404);
297
+ return;
298
+ }
299
+ json(res, {
300
+ sessionId: bundle.sessionId,
301
+ chainRoot: bundle.chainRoot,
302
+ events: bundle.hashChain.map((hash, i) => ({
303
+ index: i,
304
+ hash,
305
+ prevHash: i > 0 ? bundle.hashChain[i - 1] : "(genesis)",
306
+ })),
307
+ tampered: bundle.tampered,
308
+ verifiedAt: bundle.verifiedAt,
309
+ });
310
+ return;
311
+ }
312
+ // GET /verify/:sessionId/certificate
313
+ if (url.startsWith("/verify/") && url.endsWith("/certificate")) {
314
+ const sessionId = url.split("/verify/")[1]?.replace("/certificate", "");
315
+ const bundle = getVerificationBundle(sessionId);
316
+ if ("error" in bundle) {
317
+ json(res, bundle, 404);
318
+ return;
319
+ }
320
+ json(res, bundle.certificate);
321
+ return;
322
+ }
323
+ // GET /verify/:sessionId/policy
324
+ if (url.startsWith("/verify/") && url.endsWith("/policy")) {
325
+ const sessionId = url.split("/verify/")[1]?.replace("/policy", "");
326
+ const bundle = getVerificationBundle(sessionId);
327
+ if ("error" in bundle) {
328
+ json(res, bundle, 404);
329
+ return;
330
+ }
331
+ json(res, bundle.policy);
332
+ return;
333
+ }
334
+ // GET /verify/:sessionId
335
+ if (url.startsWith("/verify/")) {
336
+ const sessionId = url.split("/verify/")[1];
337
+ const bundle = getVerificationBundle(sessionId);
338
+ if ("error" in bundle) {
339
+ json(res, bundle, 404);
340
+ return;
341
+ }
342
+ json(res, bundle);
343
+ return;
344
+ }
345
+ // 404
346
+ json(res, { error: "Not found" }, 404);
347
+ });
348
+ // ═══════════════════════════════════════════════════════════════
349
+ // Home Page
350
+ // ═══════════════════════════════════════════════════════════════
351
+ function renderHomePage() {
352
+ return `<!DOCTYPE html>
353
+ <html lang="en">
354
+ <head>
355
+ <meta charset="UTF-8">
356
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
357
+ <title>Progmune Verification API</title>
358
+ <style>
359
+ *{margin:0;padding:0;box-sizing:border-box}
360
+ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#0a0a0a;color:#d4d4d4;max-width:720px;margin:40px auto;padding:20px}
361
+ h1{color:#fff;font-size:20px;margin-bottom:8px}
362
+ .sub{color:#666;font-size:13px;margin-bottom:32px}
363
+ .endpoint{background:#111;border:1px solid #222;border-radius:8px;padding:16px;margin-bottom:12px}
364
+ .endpoint .method{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:700;margin-right:8px}
365
+ .method.get{background:#052e16;color:#22c55e}
366
+ .method.post{background:#1e3a5f;color:#60a5fa}
367
+ .endpoint .path{font-family:'SF Mono',Menlo,Consolas,monospace;font-size:13px;color:#fff}
368
+ .endpoint .desc{font-size:12px;color:#888;margin-top:6px}
369
+ pre{background:#111;border-radius:8px;padding:16px;overflow-x:auto;font-size:12px;margin-top:8px;color:#a5d6ff}
370
+ .footer{margin-top:40px;padding-top:16px;border-top:1px solid #222;font-size:11px;color:#444;text-align:center}
371
+ a{color:#60a5fa}
372
+ </style>
373
+ </head>
374
+ <body>
375
+ <h1>Progmune Verification API</h1>
376
+ <div class="sub">Independent AI Code Certificate Verification — no installation required</div>
377
+
378
+ <div class="endpoint">
379
+ <span class="method get">GET</span>
380
+ <span class="path">/verify/:sessionId</span>
381
+ <div class="desc">Full verification bundle — certificate + provenance + accountability + hash chain</div>
382
+ </div>
383
+
384
+ <div class="endpoint">
385
+ <span class="method get">GET</span>
386
+ <span class="path">/verify/:sessionId/chain</span>
387
+ <div class="desc">Hash chain only — for independent cryptographic verification</div>
388
+ </div>
389
+
390
+ <div class="endpoint">
391
+ <span class="method get">GET</span>
392
+ <span class="path">/verify/:sessionId/certificate</span>
393
+ <div class="desc">Certificate data only</div>
394
+ </div>
395
+
396
+ <div class="endpoint">
397
+ <span class="method post">POST</span>
398
+ <span class="path">/verify</span>
399
+ <div class="desc">Submit certificate JSON for cross-check verification against stored data</div>
400
+ </div>
401
+
402
+ <div class="endpoint">
403
+ <span class="method get">GET</span>
404
+ <span class="path">/health</span>
405
+ <div class="desc">Service health check</div>
406
+ </div>
407
+
408
+ <h3 style="margin-top:24px;color:#fff">Example</h3>
409
+ <pre>curl https://progmune.io/verify/sess_1780064610038_5va68
410
+
411
+ {
412
+ "verified": true,
413
+ "sessionId": "sess_1780064610038_5va68",
414
+ "tampered": false,
415
+ "chainRoot": "8cec46ccc8b0e2cb",
416
+ "hashChain": ["88a2...", "25b7...", "d5f6..."],
417
+ "detail": "✅ Verified — certificate is authentic"
418
+ }</pre>
419
+
420
+ <div class="footer">
421
+ Progmune Runtime — AI Generated Software Governance
422
+ · <a href="https://github.com/shenlian19831109/progmune-runtime">GitHub</a>
423
+ </div>
424
+ </body>
425
+ </html>`;
426
+ }
427
+ // ═══════════════════════════════════════════════════════════════
428
+ server.listen(PORT, () => {
429
+ console.error(`\n Verification API: http://localhost:${PORT}`);
430
+ console.error(` Health: http://localhost:${PORT}/health`);
431
+ console.error(` Verify session: http://localhost:${PORT}/verify/<sessionId>\n`);
432
+ });