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,326 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 9: AI Code Certificate
4
+ *
5
+ * The minimal closed-loop product: certify that a file was AI-generated
6
+ * and passed protocol security verification.
7
+ *
8
+ * Usage:
9
+ * progmune certify <file.ts>
10
+ *
11
+ * Output: a human-readable certificate suitable for audit, compliance,
12
+ * and regulatory evidence.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.certify = certify;
49
+ exports.formatCertificate = formatCertificate;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ // ── Core ──
53
+ function certify(filePath) {
54
+ const absPath = path.resolve(filePath);
55
+ if (!fs.existsSync(absPath)) {
56
+ throw new Error(`File not found: ${absPath}`);
57
+ }
58
+ // 1. Parse @progmune-generated marker (first 5 lines)
59
+ const content = fs.readFileSync(absPath, "utf-8");
60
+ const head = content.split("\n").slice(0, 5).join("\n");
61
+ const markerMatch = head.match(/@progmune-generated\s+session=(\S+)(?:\s+timestamp=(\S+))?(?:\s+ruleHash=(\S+))?/);
62
+ if (!markerMatch) {
63
+ throw new Error(`No @progmune-generated marker found in ${filePath}.\n` +
64
+ `This file was not generated through Progmune's immune pipeline.`);
65
+ }
66
+ const sessionId = markerMatch[1];
67
+ const markerTimestamp = markerMatch[2];
68
+ // 2. Load session from corpus
69
+ const { getAllSessions } = require("./failure-corpus");
70
+ const sessions = getAllSessions();
71
+ const session = sessions.find((s) => s.sessionId === sessionId || s.sessionId?.startsWith(sessionId));
72
+ // 3. Collect transitions
73
+ let allTransitions = [];
74
+ let generatedBy = "AI (Progmune)";
75
+ if (session) {
76
+ for (const a of session.attempts || []) {
77
+ allTransitions = allTransitions.concat(a.transitions || []);
78
+ if (a.plannerSeed && !a.plannerSeed.includes("fallback")) {
79
+ generatedBy = "AI (LLM via Progmune)";
80
+ }
81
+ }
82
+ }
83
+ // 4. Check ledger consistency
84
+ let validated = false;
85
+ let violations = 0;
86
+ try {
87
+ if (session && allTransitions.length > 0) {
88
+ const { checkLedgerConsistency } = require("./ssg-validator");
89
+ const { getNsInit } = require("./protocol-registry");
90
+ const result = checkLedgerConsistency(allTransitions, getNsInit());
91
+ validated = result.consistent;
92
+ violations = (result.violations || []).length;
93
+ }
94
+ else if (session) {
95
+ validated = true; // No transitions = no violations possible
96
+ }
97
+ }
98
+ catch {
99
+ validated = false;
100
+ }
101
+ // 5. Verify fingerprint
102
+ let fingerprint = "";
103
+ let provenanceIntact = true;
104
+ try {
105
+ const { verifyFingerprint } = require("./ledger-registry");
106
+ const fp = verifyFingerprint(sessionId, allTransitions);
107
+ fingerprint = fp.stored?.ledgerHash || fp.stored?.ledgerHash || "";
108
+ if (!fingerprint) {
109
+ const { getFingerprint } = require("./ledger-registry");
110
+ const fp2 = getFingerprint(sessionId);
111
+ fingerprint = fp2?.ledgerHash || "";
112
+ }
113
+ provenanceIntact = !fp.tampered;
114
+ }
115
+ catch {
116
+ // No fingerprint — still valid, just unregistered
117
+ }
118
+ // 6. PLSB coverage
119
+ let plsbVersion = "1.0";
120
+ let plsbCoverage = "unknown";
121
+ let plsbRecall = 0;
122
+ try {
123
+ const { buildPLSB, PROTOCOL_WEAKNESS_TAXONOMY } = require("./plsb-benchmark");
124
+ const benchmark = buildPLSB();
125
+ plsbVersion = benchmark.version || "1.0";
126
+ plsbRecall = benchmark.metadata?.recall || 0;
127
+ const taxonomy = PROTOCOL_WEAKNESS_TAXONOMY;
128
+ const byPLS = benchmark.metadata?.byPLS || {};
129
+ const covered = taxonomy.filter((t) => (byPLS[t.id] || 0) > 0).length;
130
+ plsbCoverage = `${covered}/${taxonomy.length}`;
131
+ }
132
+ catch {
133
+ // PLSB not available
134
+ }
135
+ // 7. Detect degraded generation
136
+ let degraded = false;
137
+ if (session) {
138
+ degraded = session.attempts?.some((a) => a.plannerSeed?.includes("fallback") || a.outcome === "constraint_violation") || false;
139
+ }
140
+ // 8. Compute confidence
141
+ const confidence = computeConfidence({
142
+ validated,
143
+ hasFingerprint: !!fingerprint && !fingerprint.includes("pending"),
144
+ provenanceIntact,
145
+ hasSession: !!session,
146
+ hasTransitions: allTransitions.length > 0,
147
+ plsbRecall,
148
+ degraded,
149
+ violations,
150
+ });
151
+ // 9. Determine validator
152
+ let validator = "SSG Protocol Verification";
153
+ if (validated && fingerprint && !fingerprint.includes("pending")) {
154
+ validator += " + Ledger Fingerprint";
155
+ }
156
+ if (degraded) {
157
+ validator += " (fallback — reduced reliability)";
158
+ }
159
+ const validTrans = allTransitions.filter((t) => t.valid !== false).length;
160
+ // 10. Query Knowledge Base for matching protocol assets
161
+ let kbVersion;
162
+ let kbAssets;
163
+ try {
164
+ const { buildKnowledgeBase } = require("./protocol-knowledge");
165
+ const kb = buildKnowledgeBase();
166
+ kbVersion = kb.version;
167
+ const stableAssets = kb.units.filter((u) => u.maturity === "stable");
168
+ kbAssets = stableAssets.map((u) => ({
169
+ id: u.id, name: u.name, version: u.currentVersion,
170
+ confidence: u.confidence, rfc: u.rfcReference,
171
+ }));
172
+ }
173
+ catch { /* KB unavailable */ }
174
+ return {
175
+ file: absPath,
176
+ generatedBy,
177
+ sessionId,
178
+ validated,
179
+ validator,
180
+ plsbVersion,
181
+ plsbCoverage,
182
+ plsbRecall,
183
+ fingerprint: fingerprint || "(pending — run 'npm run check')",
184
+ timestamp: markerTimestamp || new Date().toISOString(),
185
+ transitions: allTransitions.length,
186
+ validTransitions: validTrans,
187
+ violations,
188
+ provenanceIntact,
189
+ confidence,
190
+ degraded,
191
+ kbVersion,
192
+ kbAssets,
193
+ };
194
+ }
195
+ function computeConfidence(input) {
196
+ // LOW: degraded generation or no session data at all
197
+ if (input.degraded)
198
+ return "low";
199
+ if (!input.hasSession)
200
+ return "low";
201
+ // If no transitions to check, can't be high confidence
202
+ if (!input.hasTransitions)
203
+ return "medium";
204
+ // HIGH requires: validated + fingerprint intact + provenance intact + PLSB recall >= 0.7
205
+ if (input.validated &&
206
+ input.hasFingerprint &&
207
+ input.provenanceIntact &&
208
+ input.plsbRecall >= 0.7 &&
209
+ input.violations === 0) {
210
+ return "high";
211
+ }
212
+ // MEDIUM: validated but missing some signals
213
+ if (input.validated)
214
+ return "medium";
215
+ // Failed validation → low
216
+ return "low";
217
+ }
218
+ // ── Formatter ──
219
+ const C = {
220
+ reset: "\x1b[0m",
221
+ bold: "\x1b[1m",
222
+ dim: "\x1b[2m",
223
+ green: "\x1b[32m",
224
+ red: "\x1b[31m",
225
+ yellow: "\x1b[33m",
226
+ cyan: "\x1b[36m",
227
+ };
228
+ const W = 52;
229
+ function formatCertificate(cert) {
230
+ const validatedIcon = cert.validated
231
+ ? `${C.green}✅ PASS${C.reset}`
232
+ : `${C.red}❌ FAIL${C.reset}`;
233
+ const provenanceIcon = cert.provenanceIntact
234
+ ? `${C.green}✅ INTACT${C.reset}`
235
+ : `${C.yellow}⚠️ CHANGED${C.reset}`;
236
+ // Confidence display
237
+ const confColor = cert.confidence === "high" ? C.green
238
+ : cert.confidence === "medium" ? C.yellow : C.red;
239
+ const confIcon = cert.confidence === "high" ? "🟢 HIGH"
240
+ : cert.confidence === "medium" ? "🟡 MEDIUM"
241
+ : "🔴 LOW";
242
+ const confNote = cert.confidence === "high"
243
+ ? "Fully verified — suitable for audit evidence"
244
+ : cert.confidence === "medium"
245
+ ? "Verified with limited coverage — recommend human review"
246
+ : "Degraded or unverified — human review required";
247
+ const boxTop = `${C.bold}${C.cyan}╔${"═".repeat(W)}╗${C.reset}`;
248
+ const boxMid = `${C.bold}${C.cyan}╠${"═".repeat(W)}╣${C.reset}`;
249
+ const boxBot = `${C.bold}${C.cyan}╚${"═".repeat(W)}╝${C.reset}`;
250
+ const boxV = `${C.bold}${C.cyan}║${C.reset}`;
251
+ const row = (label, value) => {
252
+ const valStr = String(value);
253
+ const pad = Math.max(0, W - 17 - valStr.length);
254
+ return `${boxV} ${C.bold}${label.padEnd(14)}${C.reset}${valStr}${" ".repeat(pad)}${boxV}`;
255
+ };
256
+ const title = "AI Code Certificate";
257
+ const subtitle = "Progmune Runtime — Program Immune System";
258
+ const lines = [
259
+ "",
260
+ boxTop,
261
+ `${boxV}${C.bold}${C.cyan} ${title}${C.reset}${" ".repeat(Math.max(0, W - title.length - 3))}${boxV}`,
262
+ `${boxV} ${C.dim}${subtitle}${C.reset}${" ".repeat(Math.max(0, W - subtitle.length - 3))}${boxV}`,
263
+ boxMid,
264
+ row("File", path.basename(cert.file)),
265
+ row("Generated by", cert.generatedBy),
266
+ row("Session", cert.sessionId.slice(0, W - 17)),
267
+ boxMid,
268
+ row("Validated", validatedIcon),
269
+ row("Confidence", `${confColor}${confIcon}${C.reset}`),
270
+ row("Validator", cert.validator.slice(0, W - 17)),
271
+ row("Transitions", `${cert.validTransitions}/${cert.transitions} valid`),
272
+ row("Violations", cert.violations > 0 ? `${C.red}${cert.violations}${C.reset}` : "0"),
273
+ row("PLSB", `v${cert.plsbVersion} (${cert.plsbCoverage} categories, recall ${(cert.plsbRecall * 100).toFixed(0)}%)`),
274
+ boxMid,
275
+ row("Fingerprint", cert.fingerprint.slice(0, W - 17)),
276
+ row("Provenance", provenanceIcon),
277
+ boxMid,
278
+ row("Timestamp", cert.timestamp.slice(0, W - 17)),
279
+ boxBot,
280
+ "",
281
+ ` ${confColor}${confNote}${C.reset}`,
282
+ "",
283
+ cert.degraded
284
+ ? ` ${C.yellow}⚠️ This session used fallback generation — review code carefully.${C.reset}\n`
285
+ : "",
286
+ ` ${C.dim}Replay: npx ts-node src/ledger/cli.ts replay ${cert.sessionId.slice(0, 24)}${C.reset}`,
287
+ cert.kbVersion ? ` ${C.dim}Ontology: Protocol Knowledge Base v${cert.kbVersion} (${cert.kbAssets?.length || 0} stable assets)${C.reset}` : "",
288
+ cert.kbAssets?.length ? ` ${C.dim}Assets: ${cert.kbAssets.map(a => `${a.name} v${a.version} (${a.confidence}%)`).join(", ")}${C.reset}` : "",
289
+ ` ${C.dim}Report: npm run governance${C.reset}`,
290
+ "",
291
+ ];
292
+ return lines.join("\n");
293
+ }
294
+ // ── CLI Entry ──
295
+ if (require.main === module) {
296
+ const args = process.argv.slice(2);
297
+ const filePath = args.find((a) => !a.startsWith("--"));
298
+ if (!filePath || args.includes("--help") || args.includes("-h")) {
299
+ console.log(`
300
+ Progmune AI Code Certificate
301
+
302
+ Usage:
303
+ npx ts-node src/certify.ts <file.ts>
304
+ npx ts-node src/certify.ts --json <file.ts>
305
+
306
+ Examples:
307
+ npx ts-node src/certify.ts src/server.ts
308
+ npx ts-node src/certify.ts --json src/server.ts > certificate.json
309
+ `);
310
+ process.exit(0);
311
+ }
312
+ const useJson = args.includes("--json");
313
+ try {
314
+ const cert = certify(filePath);
315
+ if (useJson) {
316
+ console.log(JSON.stringify(cert, null, 2));
317
+ }
318
+ else {
319
+ console.log(formatCertificate(cert));
320
+ }
321
+ }
322
+ catch (e) {
323
+ console.error(`\n${C.red}❌ ${e.message}${C.reset}\n`);
324
+ process.exit(1);
325
+ }
326
+ }
package/dist/check.js CHANGED
@@ -100,7 +100,7 @@ if (cliArg === "--ledger") {
100
100
  }
101
101
  }
102
102
  }
103
- catch { }
103
+ catch { /* check step — best-effort */ }
104
104
  const allTransitions = session.attempts.flatMap(a => a.transitions || []);
105
105
  if (allTransitions.length === 0) {
106
106
  console.log(`${D("No ledger data in this session.")}`);
@@ -346,7 +346,7 @@ step("4/6 Ledger 不变量");
346
346
  }
347
347
  }
348
348
  }
349
- catch { }
349
+ catch { /* check step — best-effort */ }
350
350
  }
351
351
  }
352
352
  if (checked === 0) {
@@ -401,7 +401,7 @@ step("4/6 Ledger 不变量");
401
401
  }
402
402
  }
403
403
  }
404
- catch { }
404
+ catch { /* check step — best-effort */ }
405
405
  }
406
406
  if (invariantFailed) {
407
407
  fail("PROGMUNE_STRICT=true — 严格不变量断言发现违规");
@@ -433,7 +433,7 @@ step("4/6 Ledger 不变量");
433
433
  console.log(` ${Y(`Replay divergence: ${sid.slice(0, 13)}... at index ${result.divergencePoint}`)}`);
434
434
  }
435
435
  }
436
- catch { }
436
+ catch { /* check step — best-effort */ }
437
437
  }
438
438
  if (replayed > 0) {
439
439
  const status = replayPassed === replayed