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,85 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 1: Explainability Binary Gate
4
+ *
5
+ * Checks every TrustViolation for complete 6-tuple evidence.
6
+ * If ANY violation is missing ANY required field → UNCERTAIN.
7
+ *
8
+ * This is a GATE, not a scored dimension. An unexplainable Trust Score
9
+ * is inherently untrustworthy and must be flagged rather than averaged in.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.checkExplainability = checkExplainability;
13
+ exports.assertSixTuple = assertSixTuple;
14
+ exports.isViolationComplete = isViolationComplete;
15
+ const types_1 = require("./types");
16
+ // ── Main Entry Point ──
17
+ /**
18
+ * Binary gate: validates ALL violations have complete 6-tuple evidence.
19
+ *
20
+ * The 7 required fields (from the design doc):
21
+ * severity, rule_id, file, function, evidence, why, fix, policy_ref
22
+ *
23
+ * @returns EXPLAINABLE if all violations are complete, UNCERTAIN otherwise
24
+ */
25
+ function checkExplainability(violations) {
26
+ // Vacuous truth: no violations = explainable
27
+ if (!violations || violations.length === 0) {
28
+ return {
29
+ status: "EXPLAINABLE",
30
+ violationsChecked: 0,
31
+ violationsComplete: 0,
32
+ };
33
+ }
34
+ const missingFields = [];
35
+ let violationsComplete = 0;
36
+ for (let i = 0; i < violations.length; i++) {
37
+ const v = violations[i];
38
+ const missing = getMissingFields(v);
39
+ if (missing.length === 0) {
40
+ violationsComplete++;
41
+ }
42
+ else {
43
+ missingFields.push({ index: i, missing });
44
+ }
45
+ }
46
+ const status = missingFields.length === 0 ? "EXPLAINABLE" : "UNCERTAIN";
47
+ return {
48
+ status,
49
+ violationsChecked: violations.length,
50
+ violationsComplete,
51
+ missingFields: missingFields.length > 0 ? missingFields : undefined,
52
+ };
53
+ }
54
+ // ── Helpers ──
55
+ /**
56
+ * Returns the list of required fields that are missing or empty in a violation.
57
+ */
58
+ function getMissingFields(v) {
59
+ const missing = [];
60
+ for (const field of types_1.TRUST_VIOLATION_REQUIRED_FIELDS) {
61
+ const value = v[field];
62
+ if (value === undefined || value === null) {
63
+ missing.push(field);
64
+ }
65
+ else if (typeof value === "string" && value.trim() === "") {
66
+ missing.push(field);
67
+ }
68
+ }
69
+ return missing;
70
+ }
71
+ /**
72
+ * Type guard: checks if a partial violation object satisfies the full
73
+ * TrustViolation interface (all required fields present and non-empty).
74
+ */
75
+ function assertSixTuple(v) {
76
+ if (!v)
77
+ return false;
78
+ return getMissingFields(v).length === 0;
79
+ }
80
+ /**
81
+ * Convenience: quickly check if a single violation is complete.
82
+ */
83
+ function isViolationComplete(v) {
84
+ return getMissingFields(v).length === 0;
85
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * CI/CD output formatter — compact one-line summary for pipeline logs.
4
+ *
5
+ * Format: [PROGMUNE] <DECISION> score=<N> violations=<N> coverage=<N%> <LEVEL>
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.formatTrustCI = formatTrustCI;
9
+ exports.ciExitCode = ciExitCode;
10
+ function formatTrustCI(decision) {
11
+ const { overall, summary, dimensions } = decision;
12
+ const mc = overall.mappingCoverage;
13
+ const parts = [
14
+ "[PROGMUNE]",
15
+ overall.decision,
16
+ `score=${overall.score}`,
17
+ `violations=${summary.total}`,
18
+ ];
19
+ if (mc) {
20
+ parts.push(`coverage=${mc.rate}%`);
21
+ }
22
+ parts.push(`conf=${overall.confidence}`);
23
+ return parts.join(" ");
24
+ }
25
+ /**
26
+ * Returns the recommended CI exit code:
27
+ * 0 = APPROVED
28
+ * 2 = NEEDS_REVIEW
29
+ * 1 = BLOCKED
30
+ */
31
+ function ciExitCode(decision) {
32
+ switch (decision.overall.decision) {
33
+ case "APPROVED":
34
+ return 0;
35
+ case "NEEDS_REVIEW":
36
+ return 2;
37
+ case "BLOCKED":
38
+ return 1;
39
+ default:
40
+ return 3;
41
+ }
42
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 1: Trust Report — JSON Formatter
4
+ *
5
+ * Machine-readable output for CI/CD pipelines.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.formatTrustJSON = formatTrustJSON;
9
+ function formatTrustJSON(decision, pretty) {
10
+ return JSON.stringify(decision, null, pretty !== false ? 2 : 0);
11
+ }
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 1: Trust Report — Terminal Formatter
4
+ *
5
+ * Produces a human-readable Trust Report following the
6
+ * AI Trust Decision Model v1 template (design doc §7).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.formatTrustTerminal = formatTrustTerminal;
10
+ // ANSI escape codes (matching src/audit/formatters/terminal.ts style)
11
+ const RESET = "\x1b[0m";
12
+ const BOLD = "\x1b[1m";
13
+ const DIM = "\x1b[2m";
14
+ const GREEN = "\x1b[32m";
15
+ const YELLOW = "\x1b[33m";
16
+ const RED = "\x1b[31m";
17
+ const CYAN = "\x1b[36m";
18
+ const WHITE = "\x1b[37m";
19
+ const BOX_H = "─";
20
+ const BOX_V = "│";
21
+ const BOX_TL = "╔";
22
+ const BOX_TR = "╗";
23
+ const BOX_BL = "╚";
24
+ const BOX_BR = "╝";
25
+ const BOX_ML = "╠";
26
+ const BOX_MR = "╣";
27
+ function colorScore(score) {
28
+ if (score >= 80)
29
+ return `${GREEN}${score}${RESET}`;
30
+ if (score >= 60)
31
+ return `${YELLOW}${score}${RESET}`;
32
+ return `${RED}${score}${RESET}`;
33
+ }
34
+ function decisionEmoji(decision) {
35
+ switch (decision) {
36
+ case "APPROVED": return `${GREEN}✅ APPROVED${RESET}`;
37
+ case "NEEDS_REVIEW": return `${YELLOW}⚠️ NEEDS_REVIEW${RESET}`;
38
+ case "BLOCKED": return `${RED}❌ BLOCKED${RESET}`;
39
+ default: return decision;
40
+ }
41
+ }
42
+ function confidenceLabel(confidence) {
43
+ switch (confidence) {
44
+ case "HIGH": return `${GREEN}HIGH${RESET}`;
45
+ case "MEDIUM": return `${YELLOW}MEDIUM${RESET}`;
46
+ case "LOW": return `${RED}LOW${RESET}`;
47
+ case "UNCERTAIN": return `${RED}UNCERTAIN${RESET}`;
48
+ default: return confidence;
49
+ }
50
+ }
51
+ function formatTrustTerminal(decision) {
52
+ const { overall, dimensions, violations, violationTraces, summary, auditTrail } = decision;
53
+ const w = 68; // wider box for coverage data
54
+ const lines = [];
55
+ // Header
56
+ lines.push(`${BOLD}${BOX_TL}${BOX_H.repeat(w - 2)}${BOX_TR}${RESET}`);
57
+ lines.push(`${BOLD}${BOX_V}${RESET} ${BOLD}Progmune Trust Report${RESET}${" ".repeat(w - 27)}${BOX_V}`);
58
+ lines.push(`${BOLD}${BOX_ML}${BOX_H.repeat(w - 2)}${BOX_MR}${RESET}`);
59
+ // Overall
60
+ const scoreStr = colorScore(overall.score);
61
+ const scoreLabel = overall.score >= 80 ? "HEALTHY" : overall.score >= 60 ? "CAUTION" : "AT RISK";
62
+ const scoreColor = overall.score >= 80 ? GREEN : overall.score >= 60 ? YELLOW : RED;
63
+ lines.push(`${BOX_V} ${BOLD}Overall Trust Score ${scoreStr} / 100 ${scoreColor}${scoreLabel}${RESET} ${BOX_V}`);
64
+ lines.push(`${BOX_V} ${BOLD}Decision ${decisionEmoji(overall.decision)}${" ".repeat(Math.max(0, 14 - overall.decision.length))} ${BOX_V}`);
65
+ lines.push(`${BOX_V} ${BOLD}Confidence ${confidenceLabel(overall.confidence)}${" ".repeat(24)}${BOX_V}`);
66
+ // Phase 1: Coverage-based confidence (quantified)
67
+ if (overall.coverageConfidence) {
68
+ const cc = overall.coverageConfidence;
69
+ const ccColor = cc.level === "HIGH" ? GREEN : cc.level === "MEDIUM" ? YELLOW : RED;
70
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
71
+ lines.push(`${BOX_V} ${BOLD}Coverage Confidence${RESET} ${ccColor}${cc.score}%${RESET} ${DIM}±${cc.margin}%${RESET} ${ccColor}${cc.level}${RESET}${" ".repeat(Math.max(0, w - 48))}${BOX_V}`);
72
+ lines.push(`${BOX_V} ${DIM}${cc.summary.slice(0, w - 5)}${RESET}`);
73
+ }
74
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
75
+ // Key Findings
76
+ lines.push(`${BOX_ML}${BOX_H.repeat(w - 2)}${BOX_MR}`);
77
+ lines.push(`${BOX_V} ${BOLD}Key Findings${RESET}${" ".repeat(w - 17)}${BOX_V}`);
78
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
79
+ if (summary.critical > 0) {
80
+ lines.push(`${BOX_V} ${RED}❌ ${summary.critical} Critical policy violation(s)${RESET}${" ".repeat(Math.max(0, w - 38))}${BOX_V}`);
81
+ }
82
+ else {
83
+ lines.push(`${BOX_V} ${GREEN}✅ 0 Critical policy violations${RESET}${" ".repeat(w - 36)}${BOX_V}`);
84
+ }
85
+ if (dimensions.protocolSafety.score >= 90) {
86
+ lines.push(`${BOX_V} ${GREEN}✅ Protocol safety verified${RESET}${" ".repeat(w - 31)}${BOX_V}`);
87
+ }
88
+ else if (dimensions.protocolSafety.score >= 70) {
89
+ lines.push(`${BOX_V} ${YELLOW}⚠️ Protocol safety — issues detected${RESET}${" ".repeat(w - 41)}${BOX_V}`);
90
+ }
91
+ else {
92
+ lines.push(`${BOX_V} ${RED}❌ Protocol safety degraded${RESET}${" ".repeat(w - 30)}${BOX_V}`);
93
+ }
94
+ if (dimensions.governanceIntegrity.score >= 95) {
95
+ lines.push(`${BOX_V} ${GREEN}✅ Governance chain complete${RESET}${" ".repeat(w - 31)}${BOX_V}`);
96
+ }
97
+ else {
98
+ lines.push(`${BOX_V} ${RED}❌ Governance integrity issues${RESET}${" ".repeat(w - 34)}${BOX_V}`);
99
+ }
100
+ if (summary.high > 0 || summary.medium > 0) {
101
+ lines.push(`${BOX_V} ${YELLOW}⚠️ ${summary.high} High, ${summary.medium} Medium severity issue(s) require attention${RESET}${" ".repeat(Math.max(0, w - 62))}${BOX_V}`);
102
+ }
103
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
104
+ // Evidence section
105
+ if (violations.length > 0) {
106
+ lines.push(`${BOX_ML}${BOX_H.repeat(w - 2)}${BOX_MR}`);
107
+ lines.push(`${BOX_V} ${BOLD}Evidence${RESET}${" ".repeat(w - 13)}${BOX_V}`);
108
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
109
+ for (let vi = 0; vi < Math.min(violations.length, 10); vi++) {
110
+ const v = violations[vi];
111
+ const trace = violationTraces?.[vi];
112
+ const sevIcon = v.severity === "critical" ? "❌" : v.severity === "high" ? "⚠️ " : v.severity === "medium" ? "●" : "○";
113
+ const sevColor = v.severity === "critical" ? RED : v.severity === "high" ? YELLOW : CYAN;
114
+ lines.push(`${BOX_V} ${sevColor}${sevIcon} ${v.rule_id.padEnd(12).slice(0, 12)}${RESET} ${BOLD}${v.severity.toUpperCase()}${RESET}`);
115
+ lines.push(`${BOX_V} ${DIM}${v.message.slice(0, w - 5)}${RESET}`);
116
+ lines.push(`${BOX_V} ${DIM}Evidence: ${v.evidence.slice(0, w - 14)}${RESET}`);
117
+ // Phase 3: Violation trace (reasoning chain)
118
+ if (trace && trace.steps.length > 0) {
119
+ const violStep = trace.steps.find((s) => s.label && s.action);
120
+ if (violStep) {
121
+ lines.push(`${BOX_V} ${DIM}Trace: ${violStep.action} → ${violStep.preState} → ${violStep.explanation.slice(0, 30)}${RESET}`);
122
+ }
123
+ if (trace.fixPath.length > 0) {
124
+ lines.push(`${BOX_V} ${DIM}Fix: ${trace.fixPath.join(" → ").slice(0, w - 13)}${RESET}`);
125
+ }
126
+ if (trace.estimatedReadingTimeMinutes) {
127
+ lines.push(`${BOX_V} ${DIM}Reading: ~${trace.estimatedReadingTimeMinutes}min${RESET}`);
128
+ }
129
+ }
130
+ else {
131
+ lines.push(`${BOX_V} ${DIM}Fix: ${v.fix.slice(0, w - 13)}${RESET}`);
132
+ }
133
+ lines.push(`${BOX_V} ${DIM}Policy: ${v.policy_ref}${RESET}`);
134
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
135
+ }
136
+ if (violations.length > 10) {
137
+ lines.push(`${BOX_V} ${DIM}... and ${violations.length - 10} more violation(s)${RESET}${" ".repeat(Math.max(0, w - 32))}${BOX_V}`);
138
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
139
+ }
140
+ }
141
+ // Audit Trail
142
+ lines.push(`${BOX_ML}${BOX_H.repeat(w - 2)}${BOX_MR}`);
143
+ lines.push(`${BOX_V} ${BOLD}Audit Trail${RESET}${" ".repeat(w - 16)}${BOX_V}`);
144
+ lines.push(`${BOX_V}${" ".repeat(w - 2)}${BOX_V}`);
145
+ lines.push(`${BOX_V} Commit ${auditTrail.commit.slice(0, 24).padEnd(24)} ${BOX_V}`);
146
+ lines.push(`${BOX_V} Policy Version ${auditTrail.policyVersion.padEnd(24)} ${BOX_V}`);
147
+ lines.push(`${BOX_V} Engine Version ${auditTrail.engineVersion.padEnd(24)} ${BOX_V}`);
148
+ lines.push(`${BOX_V} Generated At ${auditTrail.generatedAt.slice(0, 19).padEnd(24)} ${BOX_V}`);
149
+ lines.push(`${BOX_V} Reproducible ${auditTrail.reproducible ? "Yes" : "No"} ${BOX_V}`);
150
+ lines.push(`${BOLD}${BOX_BL}${BOX_H.repeat(w - 2)}${BOX_BR}${RESET}`);
151
+ return lines.join("\n") + "\n";
152
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 1: Trust Module — Public API
4
+ *
5
+ * Re-exports all public types and functions from the Trust Engine.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DECISION_THRESHOLDS = exports.DEFAULT_GOVERNANCE_DEDUCTIONS = exports.DEFAULT_COVERAGE_MAX_SCORES = exports.DEFAULT_PROTOCOL_WEIGHTS = exports.DEFAULT_SEVERITY_DEDUCTIONS = exports.DEFAULT_DIMENSION_WEIGHTS = exports.TRUST_VIOLATION_REQUIRED_FIELDS = exports.formatTrustJSON = exports.formatTrustTerminal = exports.countViolationsBySeverity = exports.determineConfidence = exports.determineDecision = exports.calculateOverallScore = exports.scoreGovernanceIntegrity = exports.scoreVerificationCoverage = exports.scoreProtocolSafety = exports.scorePolicyCompliance = exports.isViolationComplete = exports.assertSixTuple = exports.checkExplainability = exports.evaluateTrust = void 0;
9
+ // Engine
10
+ var engine_1 = require("./engine");
11
+ Object.defineProperty(exports, "evaluateTrust", { enumerable: true, get: function () { return engine_1.evaluateTrust; } });
12
+ // Explainability
13
+ var explainability_1 = require("./explainability");
14
+ Object.defineProperty(exports, "checkExplainability", { enumerable: true, get: function () { return explainability_1.checkExplainability; } });
15
+ Object.defineProperty(exports, "assertSixTuple", { enumerable: true, get: function () { return explainability_1.assertSixTuple; } });
16
+ Object.defineProperty(exports, "isViolationComplete", { enumerable: true, get: function () { return explainability_1.isViolationComplete; } });
17
+ // Score Calculator
18
+ var score_calculator_1 = require("./score-calculator");
19
+ Object.defineProperty(exports, "scorePolicyCompliance", { enumerable: true, get: function () { return score_calculator_1.scorePolicyCompliance; } });
20
+ Object.defineProperty(exports, "scoreProtocolSafety", { enumerable: true, get: function () { return score_calculator_1.scoreProtocolSafety; } });
21
+ Object.defineProperty(exports, "scoreVerificationCoverage", { enumerable: true, get: function () { return score_calculator_1.scoreVerificationCoverage; } });
22
+ Object.defineProperty(exports, "scoreGovernanceIntegrity", { enumerable: true, get: function () { return score_calculator_1.scoreGovernanceIntegrity; } });
23
+ Object.defineProperty(exports, "calculateOverallScore", { enumerable: true, get: function () { return score_calculator_1.calculateOverallScore; } });
24
+ Object.defineProperty(exports, "determineDecision", { enumerable: true, get: function () { return score_calculator_1.determineDecision; } });
25
+ Object.defineProperty(exports, "determineConfidence", { enumerable: true, get: function () { return score_calculator_1.determineConfidence; } });
26
+ Object.defineProperty(exports, "countViolationsBySeverity", { enumerable: true, get: function () { return score_calculator_1.countViolationsBySeverity; } });
27
+ // Formatters
28
+ var terminal_1 = require("./formatters/terminal");
29
+ Object.defineProperty(exports, "formatTrustTerminal", { enumerable: true, get: function () { return terminal_1.formatTrustTerminal; } });
30
+ var json_1 = require("./formatters/json");
31
+ Object.defineProperty(exports, "formatTrustJSON", { enumerable: true, get: function () { return json_1.formatTrustJSON; } });
32
+ var types_1 = require("./types");
33
+ Object.defineProperty(exports, "TRUST_VIOLATION_REQUIRED_FIELDS", { enumerable: true, get: function () { return types_1.TRUST_VIOLATION_REQUIRED_FIELDS; } });
34
+ Object.defineProperty(exports, "DEFAULT_DIMENSION_WEIGHTS", { enumerable: true, get: function () { return types_1.DEFAULT_DIMENSION_WEIGHTS; } });
35
+ Object.defineProperty(exports, "DEFAULT_SEVERITY_DEDUCTIONS", { enumerable: true, get: function () { return types_1.DEFAULT_SEVERITY_DEDUCTIONS; } });
36
+ Object.defineProperty(exports, "DEFAULT_PROTOCOL_WEIGHTS", { enumerable: true, get: function () { return types_1.DEFAULT_PROTOCOL_WEIGHTS; } });
37
+ Object.defineProperty(exports, "DEFAULT_COVERAGE_MAX_SCORES", { enumerable: true, get: function () { return types_1.DEFAULT_COVERAGE_MAX_SCORES; } });
38
+ Object.defineProperty(exports, "DEFAULT_GOVERNANCE_DEDUCTIONS", { enumerable: true, get: function () { return types_1.DEFAULT_GOVERNANCE_DEDUCTIONS; } });
39
+ Object.defineProperty(exports, "DECISION_THRESHOLDS", { enumerable: true, get: function () { return types_1.DECISION_THRESHOLDS; } });
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 1 MVP Verification Script
4
+ *
5
+ * Tests the API → Protocol Semantic Mapper + Domain Validator
6
+ * against all 25 B-class FPs from the curl benchmark.
7
+ *
8
+ * Expected outcome: all 25 FPs correctly classified as CLEAN,
9
+ * proving that the semantic mapping layer eliminates B-class FPs.
10
+ *
11
+ * Run: npx ts-node --transpile-only src/trust/phase1-verify.ts
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ // ═══════════════════════════════════════════════════════════════
50
+ // Inline the mapper and validator imports (avoid module resolution issues)
51
+ // ═══════════════════════════════════════════════════════════════
52
+ // We need to import from the mapper — use require for simplicity
53
+ const { mapSequenceToSemantic, isKnownProtocolDomain, mapApiToSemantic, } = require("./api-semantic-mapper");
54
+ const { validateSemanticSequence, batchValidateSequences, } = require("./protocol-domain-validator");
55
+ // ═══════════════════════════════════════════════════════════════
56
+ // B-class FP indices from our Phase 0 analysis
57
+ // ═══════════════════════════════════════════════════════════════
58
+ const B_CLASS_INDICES = new Set([
59
+ 4, 5, 11, 12, 15, 31, 34, 36, 42, 47, 48, 51, 52,
60
+ 55, 56, 60, 62, 63, 66, 67, 70, 78, 79, 81, 88,
61
+ ]);
62
+ function loadBenchmarkData() {
63
+ const benchPath = path.resolve(__dirname, "../../benchmarks/reports/cross-repo-precision-latest.json");
64
+ const data = JSON.parse(fs.readFileSync(benchPath, "utf-8"));
65
+ const curl = data.repos.find((r) => r.repo === "curl");
66
+ const mismatches = curl.mismatches.filter((m) => m.expected === "clean" && m.got === "violation");
67
+ return {
68
+ fps: mismatches.filter((m) => B_CLASS_INDICES.has(m.index)),
69
+ };
70
+ }
71
+ // ═══════════════════════════════════════════════════════════════
72
+ // Main Validation
73
+ // ═══════════════════════════════════════════════════════════════
74
+ function main() {
75
+ console.log("═══════════════════════════════════════════════════════");
76
+ console.log(" Phase 1 MVP — B 类 FP 消除验证");
77
+ console.log("═══════════════════════════════════════════════════════");
78
+ console.log("");
79
+ const { fps } = loadBenchmarkData();
80
+ console.log(`加载 B 类 FP: ${fps.length} 个`);
81
+ console.log("");
82
+ // ── Individual FP analysis ──
83
+ let eliminatedCount = 0;
84
+ let stillFlaggedCount = 0;
85
+ const stillFlagged = [];
86
+ const problematicMappings = [];
87
+ for (const fp of fps) {
88
+ const semantic = mapSequenceToSemantic(fp.calls);
89
+ // Filter noise domains for display
90
+ const significantSteps = semantic.steps.filter((s) => s.domain !== "util" && s.domain !== "mem_util" && s.domain !== "str_util");
91
+ const validation = validateSemanticSequence(semantic);
92
+ if (validation.valid) {
93
+ eliminatedCount++;
94
+ }
95
+ else {
96
+ stillFlaggedCount++;
97
+ stillFlagged.push(fp);
98
+ }
99
+ // Check for problematic mappings (util fallbacks that should be known)
100
+ for (const step of semantic.steps) {
101
+ if (step.domain === "util" && step.source === "lookup") {
102
+ // Only flag if it's a significant-looking API (not a common word)
103
+ if (step.api.length > 3 && !/^(buffer|bytes|block|files|directories|size|seek|writing|secrets|handshake|allowed|conditions|status|keys|accessed|delay|secret|startup|argument|info|time|proc|set|get|part|chars|name|type|state|data|list|are|hostname|scheme|literal|failed)$/i.test(step.api)) {
104
+ problematicMappings.push({
105
+ api: step.api,
106
+ reason: `API "${step.api}" maps to "util" — may need a mapping rule`,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // ── Results ──
113
+ console.log("── 判定结果 ──");
114
+ console.log(` ✅ 正确判定为 CLEAN: ${eliminatedCount}/${fps.length} (${(eliminatedCount / fps.length * 100).toFixed(1)}%)`);
115
+ console.log(` ❌ 仍然误报: ${stillFlaggedCount}/${fps.length} (${(stillFlaggedCount / fps.length * 100).toFixed(1)}%)`);
116
+ console.log("");
117
+ if (stillFlagged.length > 0) {
118
+ console.log("── 仍然误报的 FP ──");
119
+ for (const fp of stillFlagged) {
120
+ const semantic = mapSequenceToSemantic(fp.calls);
121
+ const validation = validateSemanticSequence(semantic);
122
+ console.log(` idx=${fp.index}: ${validation.reason}`);
123
+ const domains = [...new Set(semantic.steps.map((s) => s.domain))];
124
+ console.log(` domains: ${domains.join(", ")}`);
125
+ console.log(` primary: ${semantic.primaryDomain}`);
126
+ }
127
+ console.log("");
128
+ }
129
+ // ── Per-FP details ──
130
+ console.log("── 逐条详情 ──");
131
+ for (const fp of fps) {
132
+ const semantic = mapSequenceToSemantic(fp.calls);
133
+ const validation = validateSemanticSequence(semantic);
134
+ const status = validation.valid ? "✅ CLEAN" : "❌ FLAGGED";
135
+ console.log(` ${status} idx=${fp.index} primary=${semantic.primaryDomain || "none"} groups=${validation.groups.join(",") || "none"}`);
136
+ }
137
+ console.log("");
138
+ // ── Problematic mappings ──
139
+ if (problematicMappings.length > 0) {
140
+ console.log("── 需要关注的映射 (映射为 util 的重要 API) ──");
141
+ const unique = new Set(problematicMappings.map(m => m.api));
142
+ for (const api of [...unique].sort()) {
143
+ console.log(` ⚠️ ${api}`);
144
+ }
145
+ console.log("");
146
+ }
147
+ // ── Overall Phase 1 assessment ──
148
+ console.log("═══════════════════════════════════════════════════════");
149
+ console.log(" Phase 1 MVP 判定");
150
+ console.log("═══════════════════════════════════════════════════════");
151
+ console.log("");
152
+ const passThreshold = 20; // Phase 0 threshold: ≥20/25
153
+ if (eliminatedCount >= passThreshold) {
154
+ console.log(` ✅ 通过!${eliminatedCount}/${fps.length} B 类 FP 被消除 (阈值: ${passThreshold})`);
155
+ console.log("");
156
+ console.log(" Phase 1 MVP 验证成功。语义映射层可以有效消除 B 类 FP。");
157
+ if (eliminatedCount === fps.length) {
158
+ console.log(" 100% 消除率 — 所有 B 类 FP 都被正确识别为 CLEAN。");
159
+ }
160
+ console.log("");
161
+ console.log(" 下一步:");
162
+ console.log(" 1. 将映射层集成到 Trust Engine (修改 engine.ts)");
163
+ console.log(" 2. 在 curl 完整基准测试上验证精度提升");
164
+ console.log(" 3. Phase 2: 添加 C 类 FP 处理");
165
+ }
166
+ else {
167
+ console.log(` ❌ 未通过。${eliminatedCount}/${fps.length} < 阈值 ${passThreshold}`);
168
+ console.log(" 需要检查映射表和域验证逻辑。");
169
+ }
170
+ }
171
+ main();