progmune-runtime 2.1.6 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +108 -468
  2. package/dist/ablation-study.js +144 -0
  3. package/dist/ablation-study.test.js +18 -0
  4. package/dist/action-runtime.js +3 -1
  5. package/dist/active-learning.js +211 -0
  6. package/dist/analytics.js +139 -0
  7. package/dist/asset-factory.js +309 -0
  8. package/dist/asset-growth.js +244 -0
  9. package/dist/asset-promotion.js +382 -0
  10. package/dist/asset-quality.js +550 -0
  11. package/dist/audit/business-translator.js +285 -0
  12. package/dist/audit/cli.js +66 -0
  13. package/dist/audit/formatters/html.js +379 -0
  14. package/dist/audit/formatters/json.js +11 -0
  15. package/dist/audit/formatters/markdown.js +192 -0
  16. package/dist/audit/formatters/terminal.js +189 -0
  17. package/dist/audit/index.js +25 -0
  18. package/dist/audit/report-builder.js +318 -0
  19. package/dist/audit/types.js +8 -0
  20. package/dist/audit.js +3 -3
  21. package/dist/auto-benchmark-generator.js +137 -0
  22. package/dist/auto-benchmark-generator.test.js +45 -0
  23. package/dist/auto-protocol-synthesizer.js +362 -0
  24. package/dist/auto-protocol-synthesizer.test.js +82 -0
  25. package/dist/autonomous-patch.js +175 -0
  26. package/dist/autonomous-patch.test.js +128 -0
  27. package/dist/badge/badge-server.js +98 -0
  28. package/dist/behavior-miner.js +442 -0
  29. package/dist/belief-layer.js +475 -0
  30. package/dist/benchmark-count.js +5 -0
  31. package/dist/benchmark-generator.js +211 -0
  32. package/dist/benchmark-harness.js +201 -0
  33. package/dist/benchmark-pass-rate.js +7 -0
  34. package/dist/benchmark-report.js +8 -3
  35. package/dist/benchmark-save.js +14 -1
  36. package/dist/bootstrap-validation.js +197 -0
  37. package/dist/bootstrap-validation.test.js +51 -0
  38. package/dist/branch-ledger.js +1 -1
  39. package/dist/capability-gap.js +130 -0
  40. package/dist/certify-html.js +351 -0
  41. package/dist/certify.js +326 -0
  42. package/dist/check.js +4 -4
  43. package/dist/compliance-miner.js +447 -0
  44. package/dist/continuous-benchmark.js +194 -0
  45. package/dist/continuous-benchmark.test.js +116 -0
  46. package/dist/corpus-stats.js +173 -0
  47. package/dist/counterfactual-engine.js +288 -0
  48. package/dist/coverage-dashboard.js +109 -0
  49. package/dist/coverage-system.test.js +205 -0
  50. package/dist/cross-repo-precision.js +352 -0
  51. package/dist/cve-benchmark.js +180 -0
  52. package/dist/cve-benchmark.test.js +28 -0
  53. package/dist/cve-collector.js +73 -0
  54. package/dist/data-quality.js +141 -0
  55. package/dist/decision-engine.js +388 -0
  56. package/dist/derive-metadata.js +250 -0
  57. package/dist/difficulty-active.test.js +198 -0
  58. package/dist/difficulty-map.js +244 -0
  59. package/dist/discovery-analytics.js +125 -0
  60. package/dist/discovery-model.js +149 -0
  61. package/dist/discovery-optimize.test.js +199 -0
  62. package/dist/discovery-trace.js +276 -0
  63. package/dist/discovery-trace.test.js +97 -0
  64. package/dist/emitter.js +83 -1
  65. package/dist/enterprise-dashboard.js +405 -0
  66. package/dist/eval-hardening.js +297 -0
  67. package/dist/eval-hardening.test.js +85 -0
  68. package/dist/evaluation-campaign.js +359 -0
  69. package/dist/evaluation-campaign.test.js +181 -0
  70. package/dist/evidence-growth.js +143 -0
  71. package/dist/evidence-repository.js +209 -0
  72. package/dist/evidence-system.js +441 -0
  73. package/dist/execute.js +15 -7
  74. package/dist/experimental/software-physics.js +291 -0
  75. package/dist/experimental/state-inference.js +516 -0
  76. package/dist/experimental/unsupervised-physics.js +230 -0
  77. package/dist/extract-ir-python.js +54 -7
  78. package/dist/extract-ir.js +376 -12
  79. package/dist/failure-collector.js +2 -2
  80. package/dist/failure-corpus.js +322 -9
  81. package/dist/feedback.js +16 -5
  82. package/dist/feedback.test.js +49 -0
  83. package/dist/file-lock.js +1 -1
  84. package/dist/flywheel-batch.js +292 -0
  85. package/dist/frameworks/express-cli.js +237 -0
  86. package/dist/frameworks/express-detector.js +445 -0
  87. package/dist/frameworks/express-detector.test.js +206 -0
  88. package/dist/frameworks/index.js +30 -0
  89. package/dist/frameworks/nestjs-detector.js +302 -0
  90. package/dist/frameworks/trpc-detector.js +161 -0
  91. package/dist/frameworks/version-awareness.js +179 -0
  92. package/dist/function-synonyms.js +164 -0
  93. package/dist/function-synonyms.test.js +68 -0
  94. package/dist/generalization.test.js +352 -0
  95. package/dist/goal-annotator.js +113 -0
  96. package/dist/goal-planner.js +563 -0
  97. package/dist/gold-cve.js +164 -0
  98. package/dist/gold-cve.test.js +104 -0
  99. package/dist/gold-quality.js +206 -0
  100. package/dist/gold-tiers.js +241 -0
  101. package/dist/governance-dashboard.js +327 -0
  102. package/dist/graph-viz.js +240 -0
  103. package/dist/guided-frontier.js +195 -0
  104. package/dist/hierarchical-planner.js +148 -0
  105. package/dist/identifier-parser.js +260 -0
  106. package/dist/immune-metrics.js +93 -0
  107. package/dist/immune-receiver.js +158 -0
  108. package/dist/immune-reporter.js +1 -1
  109. package/dist/improvement-orchestrator.js +206 -0
  110. package/dist/inject-p0-vocabulary.js +300 -0
  111. package/dist/intent-parser.js +218 -0
  112. package/dist/invariant-algebra.js +476 -0
  113. package/dist/invariant-calculus.js +533 -0
  114. package/dist/ir-utils.js +70 -0
  115. package/dist/ir-utils.test.js +50 -0
  116. package/dist/knowledge-api.js +312 -0
  117. package/dist/knowledge-evolution.js +452 -0
  118. package/dist/knowledge-explorer.js +506 -0
  119. package/dist/knowledge-flywheel.js +274 -0
  120. package/dist/knowledge-governance.js +338 -0
  121. package/dist/knowledge-governance.test.js +150 -0
  122. package/dist/knowledge-graph.js +181 -0
  123. package/dist/knowledge-guided-synth.js +246 -0
  124. package/dist/knowledge-loop.test.js +77 -0
  125. package/dist/knowledge-object.js +316 -0
  126. package/dist/knowledge-package.js +98 -0
  127. package/dist/kpi-dashboard.js +561 -0
  128. package/dist/l3-cross-function.js +280 -0
  129. package/dist/learning-ranker.js +148 -0
  130. package/dist/learning-ranker.test.js +291 -0
  131. package/dist/ledger/accountability.js +322 -0
  132. package/dist/ledger/chain-builder.js +185 -0
  133. package/dist/ledger/cli.js +222 -0
  134. package/dist/ledger/index.js +13 -0
  135. package/dist/ledger/signatures.js +193 -0
  136. package/dist/ledger/types.js +9 -0
  137. package/dist/llm.js +74 -3
  138. package/dist/load-benchmarks.js +8 -3
  139. package/dist/logger.js +66 -0
  140. package/dist/logger.test.js +37 -0
  141. package/dist/logistic-reward.js +339 -0
  142. package/dist/logistic-reward.test.js +180 -0
  143. package/dist/macro-graph.js +193 -0
  144. package/dist/macro-repair.js +183 -0
  145. package/dist/mcp-server.mjs +1202 -483
  146. package/dist/memory-layer.js +42 -5
  147. package/dist/multi-repo-precision.js +422 -0
  148. package/dist/name-free-protocol.js +425 -0
  149. package/dist/name-free-protocol.test.js +170 -0
  150. package/dist/name-scrambling.js +138 -0
  151. package/dist/name-scrambling.test.js +16 -0
  152. package/dist/p3-observability.test.js +281 -0
  153. package/dist/p5-orchestrator.test.js +225 -0
  154. package/dist/pairwise-preference.js +294 -0
  155. package/dist/pairwise-preference.test.js +140 -0
  156. package/dist/planner-constraints.js +104 -0
  157. package/dist/planner-prompts.js +155 -0
  158. package/dist/planner-telemetry.js +415 -0
  159. package/dist/planner-trace.js +214 -0
  160. package/dist/planner.js +162 -167
  161. package/dist/plsb/artifact.js +116 -0
  162. package/dist/plsb/cli.js +71 -0
  163. package/dist/plsb/index.js +19 -0
  164. package/dist/plsb/leaderboard.js +249 -0
  165. package/dist/plsb/report-md.js +156 -0
  166. package/dist/plsb/schema.js +179 -0
  167. package/dist/plsb-benchmark.js +284 -0
  168. package/dist/plsb-benchmark.test.js +119 -0
  169. package/dist/policy/cli.js +134 -0
  170. package/dist/policy/engine.js +333 -0
  171. package/dist/policy/index.js +12 -0
  172. package/dist/policy/types.js +59 -0
  173. package/dist/policy-miner.js +505 -0
  174. package/dist/precision-analyze.js +229 -0
  175. package/dist/precision-benchmark.js +147 -0
  176. package/dist/precision-label-c.js +134 -0
  177. package/dist/precision-label.js +193 -0
  178. package/dist/precision-report-c.js +149 -0
  179. package/dist/precision-report.js +246 -0
  180. package/dist/progmune-status.js +108 -0
  181. package/dist/proof-engine.js +479 -0
  182. package/dist/proof-provenance.js +315 -0
  183. package/dist/protocol-coverage.js +294 -0
  184. package/dist/protocol-detector.js +1189 -0
  185. package/dist/protocol-embedding-expanded.js +297 -0
  186. package/dist/protocol-embedding-expanded.test.js +97 -0
  187. package/dist/protocol-embedding.js +195 -0
  188. package/dist/protocol-embedding.test.js +82 -0
  189. package/dist/protocol-extractor-v2.js +354 -0
  190. package/dist/protocol-extractor-v2.test.js +140 -0
  191. package/dist/protocol-extractor.js +310 -0
  192. package/dist/protocol-extractor.test.js +113 -0
  193. package/dist/protocol-foundation.js +322 -0
  194. package/dist/protocol-foundation.test.js +163 -0
  195. package/dist/protocol-frontier.js +243 -0
  196. package/dist/protocol-frontier.test.js +92 -0
  197. package/dist/protocol-gap-analyzer.js +228 -0
  198. package/dist/protocol-gap-analyzer.test.js +49 -0
  199. package/dist/protocol-invariants.js +276 -0
  200. package/dist/protocol-invariants.test.js +111 -0
  201. package/dist/protocol-knowledge.js +464 -0
  202. package/dist/protocol-miner.js +343 -0
  203. package/dist/protocol-mining.js +207 -0
  204. package/dist/protocol-mining.test.js +37 -0
  205. package/dist/protocol-registry.js +1 -1
  206. package/dist/protocol-security-benchmark.js +222 -0
  207. package/dist/protocol-vulnerability.js +257 -0
  208. package/dist/protocol-vulnerability.test.js +60 -0
  209. package/dist/python-benchmark.js +120 -0
  210. package/dist/python-emitter.js +163 -45
  211. package/dist/python-protocol-extractor.js +187 -0
  212. package/dist/python-protocol-extractor.test.js +116 -0
  213. package/dist/realworld-benchmark.js +646 -0
  214. package/dist/realworld-benchmark.test.js +36 -0
  215. package/dist/repair-arch.test.js +411 -0
  216. package/dist/repair-evolution.test.js +454 -0
  217. package/dist/repair-executor.js +719 -0
  218. package/dist/repair-proposal.js +4 -4
  219. package/dist/repair-ranker.js +141 -0
  220. package/dist/repair-strategies.js +419 -0
  221. package/dist/repair-taxonomy.js +234 -0
  222. package/dist/repair-types.js +12 -0
  223. package/dist/repo-evaluator.js +250 -0
  224. package/dist/repo-evaluator.test.js +128 -0
  225. package/dist/resource-abstraction.js +242 -0
  226. package/dist/resource-detector.js +211 -0
  227. package/dist/result.test.js +43 -0
  228. package/dist/reward-system.js +411 -0
  229. package/dist/reward-system.test.js +175 -0
  230. package/dist/risk-model.js +215 -0
  231. package/dist/rule-miner.js +234 -7
  232. package/dist/rule-specificity.js +254 -0
  233. package/dist/runtime-types.js +27 -0
  234. package/dist/scaffold.js +208 -0
  235. package/dist/scale-collector.test.js +101 -0
  236. package/dist/scale-trajectory-collector.js +128 -0
  237. package/dist/sdk.js +250 -0
  238. package/dist/search-planner.js +4 -41
  239. package/dist/semantic-snapshot.js +1 -1
  240. package/dist/semantic-topology.js +121 -0
  241. package/dist/semantic-trace.js +310 -317
  242. package/dist/sequence-extractor.js +343 -0
  243. package/dist/skill-library.js +245 -0
  244. package/dist/skill-planner.test.js +189 -0
  245. package/dist/software-physics.js +291 -0
  246. package/dist/software-physics.test.js +81 -0
  247. package/dist/ssg-precision.js +478 -0
  248. package/dist/ssg-validator.js +71 -21
  249. package/dist/state-inference-doubleblind.test.js +160 -0
  250. package/dist/state-inference.js +516 -0
  251. package/dist/state-inference.test.js +115 -0
  252. package/dist/state-machine-fingerprint.js +345 -0
  253. package/dist/state-machine-fingerprint.test.js +120 -0
  254. package/dist/state-miner.js +386 -0
  255. package/dist/state-name-inference.js +213 -0
  256. package/dist/state-name-inference.test.js +69 -0
  257. package/dist/strategy-planner.js +262 -96
  258. package/dist/strategy-planner.test.js +135 -0
  259. package/dist/telemetry-analytics.test.js +402 -0
  260. package/dist/terminal-format.js +68 -0
  261. package/dist/terminal-format.test.js +83 -0
  262. package/dist/topology-factory.js +196 -0
  263. package/dist/topology-representation.js +242 -0
  264. package/dist/topology-representation.test.js +27 -0
  265. package/dist/trajectory-augmentation.js +254 -0
  266. package/dist/trajectory-augmentation.test.js +63 -0
  267. package/dist/trajectory-corpus.js +440 -0
  268. package/dist/trajectory-corpus.test.js +32 -0
  269. package/dist/trajectory-feedback.test.js +116 -0
  270. package/dist/transition-synthesizer.js +286 -0
  271. package/dist/transition-synthesizer.test.js +123 -0
  272. package/dist/trust/api-semantic-mapper.js +809 -0
  273. package/dist/trust/call-graph-propagator.js +225 -0
  274. package/dist/trust/cli.js +122 -0
  275. package/dist/trust/compliance-scorer.js +283 -0
  276. package/dist/trust/confidence-calculator.js +261 -0
  277. package/dist/trust/engine.js +1145 -0
  278. package/dist/trust/explainability.js +85 -0
  279. package/dist/trust/formatters/ci.js +42 -0
  280. package/dist/trust/formatters/json.js +11 -0
  281. package/dist/trust/formatters/terminal.js +152 -0
  282. package/dist/trust/index.js +39 -0
  283. package/dist/trust/phase1-verify.js +171 -0
  284. package/dist/trust/protocol-domain-validator.js +697 -0
  285. package/dist/trust/score-calculator.js +282 -0
  286. package/dist/trust/ssg-bridge.js +641 -0
  287. package/dist/trust/ssg-bridge.test.js +269 -0
  288. package/dist/trust/types.js +67 -0
  289. package/dist/trust/violation-trace.js +335 -0
  290. package/dist/trust-api.js +179 -0
  291. package/dist/trust-calibration.js +279 -0
  292. package/dist/unknown-protocol-discovery.js +339 -0
  293. package/dist/unknown-protocol-discovery.test.js +102 -0
  294. package/dist/unsupervised-physics.js +230 -0
  295. package/dist/unsupervised-physics.test.js +95 -0
  296. package/dist/utils.test.js +37 -0
  297. package/dist/validator.js +187 -10
  298. package/dist/verification-intelligence.js +475 -0
  299. package/dist/verify-api.js +432 -0
  300. package/dist/vi-impact-report.js +293 -0
  301. package/dist/wl-fingerprint.js +162 -0
  302. package/dist/wl-fingerprint.test.js +130 -0
  303. package/dist/zeroshot-strategy.js +139 -0
  304. package/docs/Progmune_/346/212/225/350/265/204/344/272/272/347/231/275/347/232/256/344/271/246_v2.0.html +576 -0
  305. package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
  306. package/package.json +74 -7
  307. package/protocols.json +1956 -50
  308. package/.dockerignore +0 -14
  309. package/.mcp.json +0 -11
  310. package/.progmune_allowlist +0 -50
  311. package/.test_report/test_report.md +0 -87
  312. package/Dockerfile +0 -9
  313. package/FAQ.md +0 -167
  314. package/WHITEPAPER.md +0 -540
  315. package/demo-project/auth.ts +0 -55
  316. package/demo-project/tsconfig.json +0 -8
  317. package/dist/acl-breakdown.js +0 -13
  318. package/dist/all-sessions.js +0 -11
  319. package/dist/antibody-stats.js +0 -11
  320. package/dist/branch-tree-count.js +0 -14
  321. package/dist/common-fixpath.js +0 -12
  322. package/dist/constraint-types.js +0 -12
  323. package/dist/exec-metrics.js +0 -11
  324. package/dist/failure-report.js +0 -11
  325. package/dist/fast-path-hits.js +0 -13
  326. package/dist/fingerprint-list.js +0 -15
  327. package/dist/gen-history-log.js +0 -13
  328. package/dist/heatmap-data.js +0 -11
  329. package/dist/recent-session.js +0 -12
  330. package/dist/svl-distribution.js +0 -11
  331. package/dist/terminal-status.js +0 -11
  332. package/dist/token-savings.js +0 -11
  333. package/dist/total-repairs.js +0 -12
  334. package/dist/unresolved-count.js +0 -12
  335. package/dist/valid-fingerprints.js +0 -13
  336. package/dist/verify-ledgers.js +0 -11
  337. package/docs/whitepaper-style.css +0 -77
  338. package/docs/whitepaper-v2.1.md +0 -609
  339. package/docs/whitepaper-v2.2.md +0 -1064
  340. package/docs/whitepaper-v2.2.pdf +0 -0
  341. package/fly.toml +0 -31
  342. package/public/dashboard.html +0 -119
  343. package/server/hub.js +0 -116
  344. package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
  345. package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
  346. package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
  347. package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
  348. package/test/replay-golden.ts +0 -84
  349. package/test_benchmark.js +0 -165
  350. package/test_comprehensive.mjs +0 -638
  351. package/test_concurrency.js +0 -129
  352. package/test_ir_robustness.js +0 -85
  353. package/test_semantic_contracts.js +0 -269
  354. package/test_ssg_stress.js +0 -156
  355. package/test_svl3.js +0 -58
  356. package/tsconfig.json +0 -17
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ /**
3
+ * Progmune V12 — Unified Evidence System
4
+ * =======================================
5
+ * 将 Proof 和 Evidence 彻底分开,建立两个平行验证世界。
6
+ *
7
+ * 架构:
8
+ * Business World: Code → State → Protocol → Proof
9
+ * Compliance World: Code → Evidence → Requirement → Assessment
10
+ *
11
+ * 关键区分:
12
+ * Proof: 形式逻辑推导 — "能从前提推导出结论吗?"
13
+ * 用于: Business Claims (Production ⇒ Paid)
14
+ * 回答: 推导是否有效?
15
+ *
16
+ * Evidence: 代码产物存在性 — "代码库里有这个东西吗?"
17
+ * 用于: Compliance Requirements (密码哈希存在吗?)
18
+ * 回答: 审计证据是否存在?
19
+ *
20
+ * Evidence 两级:
21
+ * Existence Evidence: ∃ pattern(code) — "至少有一处使用了 bcrypt"
22
+ * Universal Evidence: ∀ path, pattern holds — "所有密码路径都经过 bcrypt"
23
+ *
24
+ * V12 实现 Existence Evidence(100% 覆盖),并标注 Universal Evidence 缺口。
25
+ */
26
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ var desc = Object.getOwnPropertyDescriptor(m, k);
29
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
+ desc = { enumerable: true, get: function() { return m[k]; } };
31
+ }
32
+ Object.defineProperty(o, k2, desc);
33
+ }) : (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ o[k2] = m[k];
36
+ }));
37
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
38
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
39
+ }) : function(o, v) {
40
+ o["default"] = v;
41
+ });
42
+ var __importStar = (this && this.__importStar) || (function () {
43
+ var ownKeys = function(o) {
44
+ ownKeys = Object.getOwnPropertyNames || function (o) {
45
+ var ar = [];
46
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
47
+ return ar;
48
+ };
49
+ return ownKeys(o);
50
+ };
51
+ return function (mod) {
52
+ if (mod && mod.__esModule) return mod;
53
+ var result = {};
54
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
55
+ __setModuleDefault(result, mod);
56
+ return result;
57
+ };
58
+ })();
59
+ Object.defineProperty(exports, "__esModule", { value: true });
60
+ exports.buildEvidenceSystem = buildEvidenceSystem;
61
+ const fs = __importStar(require("fs"));
62
+ const path = __importStar(require("path"));
63
+ const COMPLIANCE_REQUIREMENTS = [
64
+ // ── SOC 2 ──
65
+ {
66
+ id: "SOC2-CC6.1", standard: "SOC2", clause: "CC6.1",
67
+ description: "逻辑和物理访问控制——只有授权实体可以访问系统资源",
68
+ invariant: "ResourceAccess ⇒ Authenticated",
69
+ severity: "critical", category: "access_control",
70
+ evidenceRequired: "每次资源访问前有认证检查的代码证据",
71
+ universalCheck: { pattern: "auth_middleware", shouldExistIn: "所有 API 路由处理函数", estimatedTotal: 52 },
72
+ },
73
+ {
74
+ id: "SOC2-CC6.3", standard: "SOC2", clause: "CC6.3",
75
+ description: "职责分离——高权限操作需要独立审批",
76
+ invariant: "AdminAction ⇒ IndependentReview",
77
+ severity: "critical", category: "access_control",
78
+ evidenceRequired: "管理操作触发审批流程的代码证据",
79
+ universalCheck: { pattern: "auth_middleware", shouldExistIn: "所有 admin 路由", estimatedTotal: 6 },
80
+ },
81
+ {
82
+ id: "SOC2-CC7.1", standard: "SOC2", clause: "CC7.1",
83
+ description: "审计日志——所有高权限操作必须记录",
84
+ invariant: "PrivilegeChange ⇒ AuditRecorded",
85
+ severity: "critical", category: "audit",
86
+ evidenceRequired: "权限变更操作写入审计日志的代码证据",
87
+ universalCheck: { pattern: "audit_logging", shouldExistIn: "所有数据变更操作", estimatedTotal: 20 },
88
+ },
89
+ {
90
+ id: "SOC2-CC7.2", standard: "SOC2", clause: "CC7.2",
91
+ description: "系统事件监控——异常行为检测和告警",
92
+ invariant: "AnomalyDetected ⇒ AlertTriggered",
93
+ severity: "high", category: "monitoring",
94
+ evidenceRequired: "异常检测到告警触发的完整链路",
95
+ universalCheck: { pattern: "rate_limiting", shouldExistIn: "所有认证端点", estimatedTotal: 8 },
96
+ },
97
+ {
98
+ id: "SOC2-CC8.1", standard: "SOC2", clause: "CC8.1",
99
+ description: "变更管理——所有系统变更需要授权和记录",
100
+ invariant: "SystemChange ⇒ Authorized",
101
+ severity: "high", category: "change_management",
102
+ evidenceRequired: "变更授权和记录的代码/流程证据",
103
+ },
104
+ // ── ISO 27001 ──
105
+ {
106
+ id: "ISO-A.9.2", standard: "ISO27001", clause: "A.9.2",
107
+ description: "用户注册和注销——正式的用户访问配置流程",
108
+ invariant: "UserCreated ⇒ AccessPolicy",
109
+ severity: "critical", category: "access_control",
110
+ evidenceRequired: "用户创建时自动配置访问策略的代码证据",
111
+ universalCheck: { pattern: "auth_middleware", shouldExistIn: "所有用户管理路由", estimatedTotal: 4 },
112
+ },
113
+ {
114
+ id: "ISO-A.9.4", standard: "ISO27001", clause: "A.9.4",
115
+ description: "秘密认证信息——密码和令牌的安全管理",
116
+ invariant: "CredentialStored ⇒ HashedOrEncrypted",
117
+ severity: "critical", category: "secrets",
118
+ evidenceRequired: "密码哈希或令牌加密存储的代码证据",
119
+ universalCheck: { pattern: "bcrypt_usage", shouldExistIn: "所有密码处理路径", estimatedTotal: 3 },
120
+ },
121
+ {
122
+ id: "ISO-A.12.4", standard: "ISO27001", clause: "A.12.4",
123
+ description: "事件日志——管理员和操作员活动需记录",
124
+ invariant: "OperatorAction ⇒ Logged",
125
+ severity: "high", category: "audit",
126
+ evidenceRequired: "操作活动被日志记录的代码证据",
127
+ },
128
+ {
129
+ id: "ISO-A.14.2", standard: "ISO27001", clause: "A.14.2",
130
+ description: "安全开发——输入数据需验证,输出数据需清理",
131
+ invariant: "ExternalInput ⇒ Validated",
132
+ severity: "critical", category: "data_protection",
133
+ evidenceRequired: "外部输入经过验证的代码证据(如 Zod schema)",
134
+ universalCheck: { pattern: "zod_validation", shouldExistIn: "所有 API 输入点", estimatedTotal: 52 },
135
+ },
136
+ // ── EU AI Act ──
137
+ {
138
+ id: "AIACT-Art9", standard: "EU_AI_ACT", clause: "Article 9",
139
+ description: "风险管理——AI 系统需持续进行风险评估",
140
+ invariant: "AIModelUpdate ⇒ RiskAssessment",
141
+ severity: "critical", category: "ai_governance",
142
+ evidenceRequired: "AI 模型更新前触发风险评估的证据",
143
+ },
144
+ {
145
+ id: "AIACT-Art14", standard: "EU_AI_ACT", clause: "Article 14",
146
+ description: "人工监督——高风险 AI 决策需人工复核",
147
+ invariant: "HighRiskDecision ⇒ HumanReview",
148
+ severity: "critical", category: "ai_governance",
149
+ evidenceRequired: "高风险决策触发人工复核流程的证据",
150
+ },
151
+ {
152
+ id: "AIACT-Art12", standard: "EU_AI_ACT", clause: "Article 12",
153
+ description: "记录保存——AI 系统操作需自动记录日志",
154
+ invariant: "AISystemOperation ⇒ Logged",
155
+ severity: "high", category: "ai_governance",
156
+ evidenceRequired: "AI 操作自动记录日志的证据",
157
+ universalCheck: { pattern: "provenance_tracking", shouldExistIn: "AI 代码生成流程", estimatedTotal: 1 },
158
+ },
159
+ {
160
+ id: "AIACT-Art15", standard: "EU_AI_ACT", clause: "Article 15",
161
+ description: "透明度和可追溯性——AI 生成内容需可追溯到来源",
162
+ invariant: "AIGeneratedCode ⇒ TraceableToPrompt",
163
+ severity: "critical", category: "ai_governance",
164
+ evidenceRequired: "AI 生成代码可追溯到 Prompt 的完整链路",
165
+ },
166
+ // ── NIST ──
167
+ {
168
+ id: "NIST-AC-2", standard: "NIST", clause: "AC-2",
169
+ description: "账户管理——所有账户的生命周期需受控",
170
+ invariant: "AccountCreated ⇒ Authorized",
171
+ severity: "critical", category: "access_control",
172
+ evidenceRequired: "账户创建需授权的代码证据",
173
+ },
174
+ {
175
+ id: "NIST-IA-5", standard: "NIST", clause: "IA-5",
176
+ description: "认证器管理——密码强度、重置、多因素认证",
177
+ invariant: "PasswordReset ⇒ MFAVerified",
178
+ severity: "critical", category: "secrets",
179
+ evidenceRequired: "密码重置需多因素认证的代码证据",
180
+ },
181
+ {
182
+ id: "NIST-AU-3", standard: "NIST", clause: "AU-3",
183
+ description: "审计记录内容——日志需包含足够信息以追溯事件",
184
+ invariant: "SecurityEvent ⇒ LoggedWithContext",
185
+ severity: "high", category: "audit",
186
+ evidenceRequired: "安全事件日志包含完整上下文信息的证据",
187
+ },
188
+ // ── OWASP ──
189
+ {
190
+ id: "OWASP-V2.1", standard: "OWASP", clause: "V2.1",
191
+ description: "密码安全——所有密码需使用认可的哈希算法存储",
192
+ invariant: "PasswordStored ⇒ BcryptOrArgon2",
193
+ severity: "critical", category: "secrets",
194
+ evidenceRequired: "密码使用 bcrypt/argon2 哈希存储的代码证据",
195
+ universalCheck: { pattern: "bcrypt_usage", shouldExistIn: "所有密码存储路径", estimatedTotal: 3 },
196
+ },
197
+ {
198
+ id: "OWASP-V4.1", standard: "OWASP", clause: "V4.1",
199
+ description: "访问控制——每次资源访问需验证权限",
200
+ invariant: "ResourceAccess ⇒ AuthorizationChecked",
201
+ severity: "critical", category: "access_control",
202
+ evidenceRequired: "每次资源访问前检查权限的代码证据",
203
+ universalCheck: { pattern: "auth_middleware", shouldExistIn: "所有 API 端点", estimatedTotal: 52 },
204
+ },
205
+ {
206
+ id: "OWASP-V5.2", standard: "OWASP", clause: "V5.2",
207
+ description: "输入验证——所有外部输入需经过服务端验证",
208
+ invariant: "ExternalInput ⇒ ServerSideValidated",
209
+ severity: "critical", category: "data_protection",
210
+ evidenceRequired: "服务端验证外部输入的代码证据(Zod/Yup schema)",
211
+ universalCheck: { pattern: "zod_validation", shouldExistIn: "所有 API 输入点", estimatedTotal: 52 },
212
+ },
213
+ ];
214
+ function collectCodeEvidence(projectPath) {
215
+ const ev = {
216
+ files: new Set(),
217
+ patterns: new Map(),
218
+ snippets: new Map(),
219
+ totalEndpoints: 0,
220
+ totalAuthFiles: 0,
221
+ };
222
+ const serverDir = path.join(projectPath, "server");
223
+ if (!fs.existsSync(serverDir))
224
+ return ev;
225
+ function scanDir(dir) {
226
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
227
+ const full = path.join(dir, entry.name);
228
+ if (entry.name.startsWith(".") || entry.name === "node_modules")
229
+ continue;
230
+ if (entry.isDirectory()) {
231
+ scanDir(full);
232
+ continue;
233
+ }
234
+ if (!entry.name.endsWith(".ts"))
235
+ continue;
236
+ const relPath = path.relative(projectPath, full);
237
+ ev.files.add(relPath);
238
+ const content = fs.readFileSync(full, "utf-8");
239
+ // Count endpoints
240
+ const routeMatches = content.match(/\.(post|get|put|delete|patch)\s*\(/g) || [];
241
+ ev.totalEndpoints += routeMatches.length;
242
+ // Count auth files
243
+ if (/auth|login|register|verify|password/i.test(entry.name)) {
244
+ ev.totalAuthFiles++;
245
+ }
246
+ // Pattern detection
247
+ const patternChecks = [
248
+ ["auth_middleware", /authenticate|authRequired|requireAuth|verifyToken|auth\.utils|Auth Middleware/i],
249
+ ["bcrypt_usage", /bcrypt|passwordHash|hashPassword|argon2|compareSync|hash_password/i],
250
+ ["zod_validation", /z\.(string|number|object|enum|array)\(|\.parse\(|\.safeParse\(/i],
251
+ ["audit_logging", /audit|log.*activity|recordSession|pointsLog|notification.*log|audit_mutation/i],
252
+ ["rate_limiting", /rate.?limit|throttle|express-rate-limit|verificationAttempts/i],
253
+ ["verification_code", /verifyCode|verificationCode|verifyPhone|sendVerificationCode/i],
254
+ ["db_transaction", /db\.transaction|\.transaction\(/i],
255
+ ["session_management", /session|createSession|refreshSession|revokeSession/i],
256
+ ["provenance_tracking", /provenance|fingerprint|ledger|@progmune/i],
257
+ ];
258
+ for (const [pattern, regex] of patternChecks) {
259
+ if (regex.test(content)) {
260
+ if (!ev.patterns.has(pattern))
261
+ ev.patterns.set(pattern, []);
262
+ ev.patterns.get(pattern).push(relPath);
263
+ // Save first matching snippet
264
+ if (!ev.snippets.has(pattern)) {
265
+ const lines = content.split("\n");
266
+ for (let i = 0; i < lines.length; i++) {
267
+ if (regex.test(lines[i])) {
268
+ ev.snippets.set(pattern, lines[i].trim().slice(0, 120));
269
+ break;
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ scanDir(serverDir);
278
+ return ev;
279
+ }
280
+ // ══════════════════════════════════════════════
281
+ // EVIDENCE ASSESSMENT (V12 — two-level)
282
+ // ══════════════════════════════════════════════
283
+ const CATEGORY_PATTERNS = {
284
+ "access_control": ["auth_middleware", "session_management"],
285
+ "secrets": ["bcrypt_usage"],
286
+ "audit": ["audit_logging", "provenance_tracking"],
287
+ "data_protection": ["zod_validation"],
288
+ "monitoring": ["rate_limiting"],
289
+ "ai_governance": ["provenance_tracking", "session_management"],
290
+ "change_management": ["db_transaction", "audit_logging"],
291
+ };
292
+ function assessEvidence(req, evidence) {
293
+ const artifacts = [];
294
+ const required = CATEGORY_PATTERNS[req.category] || [];
295
+ let artIdCounter = 1;
296
+ for (const pattern of required) {
297
+ const files = evidence.patterns.get(pattern) || [];
298
+ if (files.length > 0) {
299
+ // ── EXISTENCE evidence ──
300
+ artifacts.push({
301
+ id: `EVID-${artIdCounter++}`,
302
+ requirementId: req.id,
303
+ standard: req.standard,
304
+ clause: req.clause,
305
+ level: "EXISTENCE",
306
+ pattern,
307
+ files,
308
+ snippet: evidence.snippets.get(pattern),
309
+ confidence: 95, // High confidence for existence
310
+ });
311
+ // ── UNIVERSAL evidence check ──
312
+ const uc = req.universalCheck;
313
+ if (uc && uc.pattern === pattern) {
314
+ const foundCount = files.length;
315
+ const estimatedTotal = uc.estimatedTotal;
316
+ const coverage = Math.round((foundCount / estimatedTotal) * 100);
317
+ const isUniversal = coverage >= 80;
318
+ artifacts.push({
319
+ id: `EVID-${artIdCounter++}`,
320
+ requirementId: req.id,
321
+ standard: req.standard,
322
+ clause: req.clause,
323
+ level: "UNIVERSAL",
324
+ pattern,
325
+ files: files.slice(0, 10),
326
+ snippet: evidence.snippets.get(pattern),
327
+ confidence: Math.min(95, coverage),
328
+ universalityGap: isUniversal ? undefined :
329
+ `Found in ${foundCount}/${estimatedTotal} estimated locations (${uc.shouldExistIn}). Coverage: ${coverage}%.`,
330
+ coverageNote: `Found in ${foundCount} files. Estimated total: ${estimatedTotal} (${uc.shouldExistIn}).`,
331
+ });
332
+ }
333
+ }
334
+ }
335
+ // Determine status
336
+ const hasExistence = artifacts.some(a => a.level === "EXISTENCE");
337
+ const universalArtifacts = artifacts.filter(a => a.level === "UNIVERSAL");
338
+ const allUniversalSatisfied = universalArtifacts.length > 0 &&
339
+ universalArtifacts.every(a => a.confidence >= 80);
340
+ let status;
341
+ if (!hasExistence) {
342
+ status = "UNSATISFIED";
343
+ }
344
+ else if (allUniversalSatisfied || universalArtifacts.length === 0) {
345
+ status = universalArtifacts.length === 0 ? "SATISFIED" : "SATISFIED";
346
+ }
347
+ else {
348
+ status = "PARTIAL";
349
+ }
350
+ return {
351
+ requirementId: req.id,
352
+ standard: req.standard,
353
+ clause: req.clause,
354
+ description: req.description,
355
+ invariant: req.invariant,
356
+ artifacts,
357
+ existenceSatisfied: hasExistence,
358
+ universalSatisfied: allUniversalSatisfied,
359
+ universalityGap: universalArtifacts.find(a => a.universalityGap)?.universalityGap,
360
+ status,
361
+ };
362
+ }
363
+ // ══════════════════════════════════════════════
364
+ // MAIN
365
+ // ══════════════════════════════════════════════
366
+ function buildEvidenceSystem(projectPath) {
367
+ console.log("🔬 Progmune Unified Evidence System — V12");
368
+ console.log(" Project:", projectPath);
369
+ const evidence = collectCodeEvidence(projectPath);
370
+ console.log(` Evidence patterns found: ${evidence.patterns.size} types across ${evidence.files.size} files`);
371
+ console.log(` Estimated endpoints: ${evidence.totalEndpoints} | Auth files: ${evidence.totalAuthFiles}`);
372
+ const assessments = [];
373
+ for (const req of COMPLIANCE_REQUIREMENTS) {
374
+ assessments.push(assessEvidence(req, evidence));
375
+ }
376
+ // ── Print ──
377
+ console.log("\n── Evidence Assessment (∃ = Existence, ∀ = Universal) ──\n");
378
+ for (const std of [...new Set(assessments.map(a => a.standard))]) {
379
+ const stdAssessments = assessments.filter(a => a.standard === std);
380
+ const existenceOk = stdAssessments.filter(a => a.existenceSatisfied).length;
381
+ const universalOk = stdAssessments.filter(a => a.universalSatisfied).length;
382
+ const total = stdAssessments.length;
383
+ const existBar = "█".repeat(existenceOk) + "░".repeat(total - existenceOk);
384
+ const univBar = "█".repeat(universalOk) + "░".repeat(total - universalOk);
385
+ console.log(` ${std}`);
386
+ console.log(` ∃ Existence: ${existBar} ${existenceOk}/${total}`);
387
+ console.log(` ∀ Universal: ${univBar} ${universalOk}/${total}`);
388
+ for (const a of stdAssessments) {
389
+ const icon = a.status === "SATISFIED" ? "✅" : a.status === "PARTIAL" ? "⚠️" : "❌";
390
+ console.log(` ${icon} ${a.clause}: ${a.description.slice(0, 50)}...`);
391
+ for (const art of a.artifacts) {
392
+ const levelIcon = art.level === "EXISTENCE" ? "∃" : "∀";
393
+ console.log(` ${levelIcon} ${art.pattern}: ${art.files.length} files [${art.confidence}%]`);
394
+ if (art.snippet)
395
+ console.log(` → ${art.snippet}`);
396
+ if (art.universalityGap)
397
+ console.log(` ⚠️ ${art.universalityGap}`);
398
+ }
399
+ }
400
+ console.log();
401
+ }
402
+ // Summary
403
+ const existenceCount = assessments.filter(a => a.existenceSatisfied).length;
404
+ const universalCount = assessments.filter(a => a.universalSatisfied).length;
405
+ const partialCount = assessments.filter(a => a.status === "PARTIAL").length;
406
+ const total = assessments.length;
407
+ const report = {
408
+ timestamp: new Date().toISOString(),
409
+ projectPath,
410
+ assessments,
411
+ summary: {
412
+ totalRequirements: total,
413
+ existenceSatisfied: existenceCount,
414
+ universalSatisfied: universalCount,
415
+ partialCount,
416
+ standardsCovered: [...new Set(assessments.map(a => a.standard))].length,
417
+ overallExistencePct: Math.round((existenceCount / total) * 100),
418
+ overallUniversalPct: Math.round((universalCount / total) * 100),
419
+ },
420
+ };
421
+ console.log("═══ Evidence System Summary ═══");
422
+ console.log(` ∃ Existence: ${existenceCount}/${total} (${report.summary.overallExistencePct}%)`);
423
+ console.log(` ∀ Universal: ${universalCount}/${total} (${report.summary.overallUniversalPct}%)`);
424
+ console.log(` ⚠️ Partial: ${partialCount} (existence ok, universal not verified)`);
425
+ console.log();
426
+ return report;
427
+ }
428
+ // ══════════════════════════════════════════════
429
+ // CLI
430
+ // ══════════════════════════════════════════════
431
+ if (require.main === module) {
432
+ const targetProject = process.argv[2];
433
+ if (!targetProject) {
434
+ console.error("Usage: npx ts-node src/evidence-system.ts <project-path>");
435
+ process.exit(1);
436
+ }
437
+ const report = buildEvidenceSystem(targetProject);
438
+ const outputPath = path.join(targetProject, ".progmune_evidence.json");
439
+ fs.writeFileSync(outputPath, JSON.stringify(report, null, 2));
440
+ console.log(`✅ Evidence report saved to: ${outputPath}`);
441
+ }
package/dist/execute.js CHANGED
@@ -59,7 +59,7 @@ function loadMetrics() {
59
59
  return JSON.parse(fs.readFileSync(METRICS_FILE, "utf-8"));
60
60
  }
61
61
  }
62
- catch { }
62
+ catch { /* sandbox action — non-critical */ }
63
63
  return { generated: 0, repaired: 0, lastGeneration: null, history: [] };
64
64
  }
65
65
  function saveMetrics(m) {
@@ -104,7 +104,14 @@ async function execute(intent, projectPath, filePath) {
104
104
  ir = (0, extract_ir_1.extractIR)(projectPath);
105
105
  }
106
106
  catch (e) {
107
- return { success: false, code: "", sessionId: "", hash: "", ruleHash: "", irFunctionCount: 0, protocolRuleCount: 0, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: `IR extraction failed: ${e.message}` };
107
+ return { success: false, degraded: false, code: "", sessionId: "", hash: "", ruleHash: "", irFunctionCount: 0, protocolRuleCount: 0, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: `IR extraction failed: ${e.message}` };
108
+ }
109
+ // 1.5 Write ir.json — planner reads from disk
110
+ try {
111
+ fs.writeFileSync("ir.json", JSON.stringify(ir, null, 2));
112
+ }
113
+ catch (e) {
114
+ return { success: false, degraded: false, code: "", sessionId: "", hash: "", ruleHash: "", irFunctionCount: ir.length, protocolRuleCount: 0, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: `ir.json write failed: ${e.message}` };
108
115
  }
109
116
  // 2. Protocol rule count
110
117
  let protocolRuleCount = 0;
@@ -114,7 +121,7 @@ async function execute(intent, projectPath, filePath) {
114
121
  protocolRuleCount = Object.keys(JSON.parse(fs.readFileSync(protoPath, "utf-8")).rules || {}).length;
115
122
  }
116
123
  }
117
- catch { }
124
+ catch { /* sandbox action — non-critical */ }
118
125
  // 3. Plan (LLM + immune constraints)
119
126
  let planResult;
120
127
  try {
@@ -129,11 +136,11 @@ async function execute(intent, projectPath, filePath) {
129
136
  rootCause: (0, failure_collector_1.classifyPlanError)(e.message),
130
137
  sessionId: undefined,
131
138
  });
132
- return { success: false, code: "", sessionId: "", hash: "", ruleHash: "", irFunctionCount: ir.length, protocolRuleCount, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: `Planning failed: ${e.message}` };
139
+ return { success: false, degraded: false, code: "", sessionId: "", hash: "", ruleHash: "", irFunctionCount: ir.length, protocolRuleCount, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: `Planning failed: ${e.message}` };
133
140
  }
134
141
  const actions = planResult.actions || [];
135
142
  if (actions.length === 0) {
136
- return { success: false, code: "", sessionId: planResult.sessionId, hash: "", ruleHash: planResult.ruleHash || "", irFunctionCount: ir.length, protocolRuleCount, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: "Planner returned empty action sequence" };
143
+ return { success: false, degraded: false, code: "", sessionId: planResult.sessionId, hash: "", ruleHash: planResult.ruleHash || "", irFunctionCount: ir.length, protocolRuleCount, violations: 0, repairApplied: false, repairCount: 0, repairBranchIds: [], branchWinner: undefined, error: "Planner returned empty action sequence" };
137
144
  }
138
145
  // 4. Emit code with generation marker
139
146
  const code = (0, emitter_1.emitCode)(actions, {
@@ -181,6 +188,7 @@ async function execute(intent, projectPath, filePath) {
181
188
  irFunctionCount: ir.length,
182
189
  protocolRuleCount,
183
190
  violations: 0,
191
+ degraded: planResult.degraded || false,
184
192
  repairApplied: planResult.repairApplied,
185
193
  repairCount: planResult.repairCount,
186
194
  repairBranchIds: planResult.repairBranchIds,
@@ -205,7 +213,7 @@ async function execute(intent, projectPath, filePath) {
205
213
  }
206
214
  }
207
215
  }
208
- catch { }
216
+ catch { /* sandbox action — non-critical */ }
209
217
  return undefined;
210
218
  })()
211
219
  : undefined,
@@ -246,6 +254,6 @@ function verifyFileMarker(filePath) {
246
254
  return { marked: true, sessionId: match[1], timestamp: match[2] };
247
255
  }
248
256
  }
249
- catch { }
257
+ catch { /* sandbox action — non-critical */ }
250
258
  return { marked: false };
251
259
  }