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.
- package/README.md +108 -468
- package/dist/ablation-study.js +144 -0
- package/dist/ablation-study.test.js +18 -0
- package/dist/action-runtime.js +3 -1
- package/dist/active-learning.js +211 -0
- package/dist/analytics.js +139 -0
- package/dist/asset-factory.js +309 -0
- package/dist/asset-growth.js +244 -0
- package/dist/asset-promotion.js +382 -0
- package/dist/asset-quality.js +550 -0
- package/dist/audit/business-translator.js +285 -0
- package/dist/audit/cli.js +66 -0
- package/dist/audit/formatters/html.js +379 -0
- package/dist/audit/formatters/json.js +11 -0
- package/dist/audit/formatters/markdown.js +192 -0
- package/dist/audit/formatters/terminal.js +189 -0
- package/dist/audit/index.js +25 -0
- package/dist/audit/report-builder.js +318 -0
- package/dist/audit/types.js +8 -0
- package/dist/audit.js +3 -3
- package/dist/auto-benchmark-generator.js +137 -0
- package/dist/auto-benchmark-generator.test.js +45 -0
- package/dist/auto-protocol-synthesizer.js +362 -0
- package/dist/auto-protocol-synthesizer.test.js +82 -0
- package/dist/autonomous-patch.js +175 -0
- package/dist/autonomous-patch.test.js +128 -0
- package/dist/badge/badge-server.js +98 -0
- package/dist/behavior-miner.js +442 -0
- package/dist/belief-layer.js +475 -0
- package/dist/benchmark-count.js +5 -0
- package/dist/benchmark-generator.js +211 -0
- package/dist/benchmark-harness.js +201 -0
- package/dist/benchmark-pass-rate.js +7 -0
- package/dist/benchmark-report.js +8 -3
- package/dist/benchmark-save.js +14 -1
- package/dist/bootstrap-validation.js +197 -0
- package/dist/bootstrap-validation.test.js +51 -0
- package/dist/branch-ledger.js +1 -1
- package/dist/capability-gap.js +130 -0
- package/dist/certify-html.js +351 -0
- package/dist/certify.js +326 -0
- package/dist/check.js +4 -4
- package/dist/compliance-miner.js +447 -0
- package/dist/continuous-benchmark.js +194 -0
- package/dist/continuous-benchmark.test.js +116 -0
- package/dist/corpus-stats.js +173 -0
- package/dist/counterfactual-engine.js +288 -0
- package/dist/coverage-dashboard.js +109 -0
- package/dist/coverage-system.test.js +205 -0
- package/dist/cross-repo-precision.js +352 -0
- package/dist/cve-benchmark.js +180 -0
- package/dist/cve-benchmark.test.js +28 -0
- package/dist/cve-collector.js +73 -0
- package/dist/data-quality.js +141 -0
- package/dist/decision-engine.js +388 -0
- package/dist/derive-metadata.js +250 -0
- package/dist/difficulty-active.test.js +198 -0
- package/dist/difficulty-map.js +244 -0
- package/dist/discovery-analytics.js +125 -0
- package/dist/discovery-model.js +149 -0
- package/dist/discovery-optimize.test.js +199 -0
- package/dist/discovery-trace.js +276 -0
- package/dist/discovery-trace.test.js +97 -0
- package/dist/emitter.js +83 -1
- package/dist/enterprise-dashboard.js +405 -0
- package/dist/eval-hardening.js +297 -0
- package/dist/eval-hardening.test.js +85 -0
- package/dist/evaluation-campaign.js +359 -0
- package/dist/evaluation-campaign.test.js +181 -0
- package/dist/evidence-growth.js +143 -0
- package/dist/evidence-repository.js +209 -0
- package/dist/evidence-system.js +441 -0
- package/dist/execute.js +15 -7
- package/dist/experimental/software-physics.js +291 -0
- package/dist/experimental/state-inference.js +516 -0
- package/dist/experimental/unsupervised-physics.js +230 -0
- package/dist/extract-ir-python.js +54 -7
- package/dist/extract-ir.js +376 -12
- package/dist/failure-collector.js +2 -2
- package/dist/failure-corpus.js +322 -9
- package/dist/feedback.js +16 -5
- package/dist/feedback.test.js +49 -0
- package/dist/file-lock.js +1 -1
- package/dist/flywheel-batch.js +292 -0
- package/dist/frameworks/express-cli.js +237 -0
- package/dist/frameworks/express-detector.js +445 -0
- package/dist/frameworks/express-detector.test.js +206 -0
- package/dist/frameworks/index.js +30 -0
- package/dist/frameworks/nestjs-detector.js +302 -0
- package/dist/frameworks/trpc-detector.js +161 -0
- package/dist/frameworks/version-awareness.js +179 -0
- package/dist/function-synonyms.js +164 -0
- package/dist/function-synonyms.test.js +68 -0
- package/dist/generalization.test.js +352 -0
- package/dist/goal-annotator.js +113 -0
- package/dist/goal-planner.js +563 -0
- package/dist/gold-cve.js +164 -0
- package/dist/gold-cve.test.js +104 -0
- package/dist/gold-quality.js +206 -0
- package/dist/gold-tiers.js +241 -0
- package/dist/governance-dashboard.js +327 -0
- package/dist/graph-viz.js +240 -0
- package/dist/guided-frontier.js +195 -0
- package/dist/hierarchical-planner.js +148 -0
- package/dist/identifier-parser.js +260 -0
- package/dist/immune-metrics.js +93 -0
- package/dist/immune-receiver.js +158 -0
- package/dist/immune-reporter.js +1 -1
- package/dist/improvement-orchestrator.js +206 -0
- package/dist/inject-p0-vocabulary.js +300 -0
- package/dist/intent-parser.js +218 -0
- package/dist/invariant-algebra.js +476 -0
- package/dist/invariant-calculus.js +533 -0
- package/dist/ir-utils.js +70 -0
- package/dist/ir-utils.test.js +50 -0
- package/dist/knowledge-api.js +312 -0
- package/dist/knowledge-evolution.js +452 -0
- package/dist/knowledge-explorer.js +506 -0
- package/dist/knowledge-flywheel.js +274 -0
- package/dist/knowledge-governance.js +338 -0
- package/dist/knowledge-governance.test.js +150 -0
- package/dist/knowledge-graph.js +181 -0
- package/dist/knowledge-guided-synth.js +246 -0
- package/dist/knowledge-loop.test.js +77 -0
- package/dist/knowledge-object.js +316 -0
- package/dist/knowledge-package.js +98 -0
- package/dist/kpi-dashboard.js +561 -0
- package/dist/l3-cross-function.js +280 -0
- package/dist/learning-ranker.js +148 -0
- package/dist/learning-ranker.test.js +291 -0
- package/dist/ledger/accountability.js +322 -0
- package/dist/ledger/chain-builder.js +185 -0
- package/dist/ledger/cli.js +222 -0
- package/dist/ledger/index.js +13 -0
- package/dist/ledger/signatures.js +193 -0
- package/dist/ledger/types.js +9 -0
- package/dist/llm.js +74 -3
- package/dist/load-benchmarks.js +8 -3
- package/dist/logger.js +66 -0
- package/dist/logger.test.js +37 -0
- package/dist/logistic-reward.js +339 -0
- package/dist/logistic-reward.test.js +180 -0
- package/dist/macro-graph.js +193 -0
- package/dist/macro-repair.js +183 -0
- package/dist/mcp-server.mjs +1202 -483
- package/dist/memory-layer.js +42 -5
- package/dist/multi-repo-precision.js +422 -0
- package/dist/name-free-protocol.js +425 -0
- package/dist/name-free-protocol.test.js +170 -0
- package/dist/name-scrambling.js +138 -0
- package/dist/name-scrambling.test.js +16 -0
- package/dist/p3-observability.test.js +281 -0
- package/dist/p5-orchestrator.test.js +225 -0
- package/dist/pairwise-preference.js +294 -0
- package/dist/pairwise-preference.test.js +140 -0
- package/dist/planner-constraints.js +104 -0
- package/dist/planner-prompts.js +155 -0
- package/dist/planner-telemetry.js +415 -0
- package/dist/planner-trace.js +214 -0
- package/dist/planner.js +162 -167
- package/dist/plsb/artifact.js +116 -0
- package/dist/plsb/cli.js +71 -0
- package/dist/plsb/index.js +19 -0
- package/dist/plsb/leaderboard.js +249 -0
- package/dist/plsb/report-md.js +156 -0
- package/dist/plsb/schema.js +179 -0
- package/dist/plsb-benchmark.js +284 -0
- package/dist/plsb-benchmark.test.js +119 -0
- package/dist/policy/cli.js +134 -0
- package/dist/policy/engine.js +333 -0
- package/dist/policy/index.js +12 -0
- package/dist/policy/types.js +59 -0
- package/dist/policy-miner.js +505 -0
- package/dist/precision-analyze.js +229 -0
- package/dist/precision-benchmark.js +147 -0
- package/dist/precision-label-c.js +134 -0
- package/dist/precision-label.js +193 -0
- package/dist/precision-report-c.js +149 -0
- package/dist/precision-report.js +246 -0
- package/dist/progmune-status.js +108 -0
- package/dist/proof-engine.js +479 -0
- package/dist/proof-provenance.js +315 -0
- package/dist/protocol-coverage.js +294 -0
- package/dist/protocol-detector.js +1189 -0
- package/dist/protocol-embedding-expanded.js +297 -0
- package/dist/protocol-embedding-expanded.test.js +97 -0
- package/dist/protocol-embedding.js +195 -0
- package/dist/protocol-embedding.test.js +82 -0
- package/dist/protocol-extractor-v2.js +354 -0
- package/dist/protocol-extractor-v2.test.js +140 -0
- package/dist/protocol-extractor.js +310 -0
- package/dist/protocol-extractor.test.js +113 -0
- package/dist/protocol-foundation.js +322 -0
- package/dist/protocol-foundation.test.js +163 -0
- package/dist/protocol-frontier.js +243 -0
- package/dist/protocol-frontier.test.js +92 -0
- package/dist/protocol-gap-analyzer.js +228 -0
- package/dist/protocol-gap-analyzer.test.js +49 -0
- package/dist/protocol-invariants.js +276 -0
- package/dist/protocol-invariants.test.js +111 -0
- package/dist/protocol-knowledge.js +464 -0
- package/dist/protocol-miner.js +343 -0
- package/dist/protocol-mining.js +207 -0
- package/dist/protocol-mining.test.js +37 -0
- package/dist/protocol-registry.js +1 -1
- package/dist/protocol-security-benchmark.js +222 -0
- package/dist/protocol-vulnerability.js +257 -0
- package/dist/protocol-vulnerability.test.js +60 -0
- package/dist/python-benchmark.js +120 -0
- package/dist/python-emitter.js +163 -45
- package/dist/python-protocol-extractor.js +187 -0
- package/dist/python-protocol-extractor.test.js +116 -0
- package/dist/realworld-benchmark.js +646 -0
- package/dist/realworld-benchmark.test.js +36 -0
- package/dist/repair-arch.test.js +411 -0
- package/dist/repair-evolution.test.js +454 -0
- package/dist/repair-executor.js +719 -0
- package/dist/repair-proposal.js +4 -4
- package/dist/repair-ranker.js +141 -0
- package/dist/repair-strategies.js +419 -0
- package/dist/repair-taxonomy.js +234 -0
- package/dist/repair-types.js +12 -0
- package/dist/repo-evaluator.js +250 -0
- package/dist/repo-evaluator.test.js +128 -0
- package/dist/resource-abstraction.js +242 -0
- package/dist/resource-detector.js +211 -0
- package/dist/result.test.js +43 -0
- package/dist/reward-system.js +411 -0
- package/dist/reward-system.test.js +175 -0
- package/dist/risk-model.js +215 -0
- package/dist/rule-miner.js +234 -7
- package/dist/rule-specificity.js +254 -0
- package/dist/runtime-types.js +27 -0
- package/dist/scaffold.js +208 -0
- package/dist/scale-collector.test.js +101 -0
- package/dist/scale-trajectory-collector.js +128 -0
- package/dist/sdk.js +250 -0
- package/dist/search-planner.js +4 -41
- package/dist/semantic-snapshot.js +1 -1
- package/dist/semantic-topology.js +121 -0
- package/dist/semantic-trace.js +310 -317
- package/dist/sequence-extractor.js +343 -0
- package/dist/skill-library.js +245 -0
- package/dist/skill-planner.test.js +189 -0
- package/dist/software-physics.js +291 -0
- package/dist/software-physics.test.js +81 -0
- package/dist/ssg-precision.js +478 -0
- package/dist/ssg-validator.js +71 -21
- package/dist/state-inference-doubleblind.test.js +160 -0
- package/dist/state-inference.js +516 -0
- package/dist/state-inference.test.js +115 -0
- package/dist/state-machine-fingerprint.js +345 -0
- package/dist/state-machine-fingerprint.test.js +120 -0
- package/dist/state-miner.js +386 -0
- package/dist/state-name-inference.js +213 -0
- package/dist/state-name-inference.test.js +69 -0
- package/dist/strategy-planner.js +262 -96
- package/dist/strategy-planner.test.js +135 -0
- package/dist/telemetry-analytics.test.js +402 -0
- package/dist/terminal-format.js +68 -0
- package/dist/terminal-format.test.js +83 -0
- package/dist/topology-factory.js +196 -0
- package/dist/topology-representation.js +242 -0
- package/dist/topology-representation.test.js +27 -0
- package/dist/trajectory-augmentation.js +254 -0
- package/dist/trajectory-augmentation.test.js +63 -0
- package/dist/trajectory-corpus.js +440 -0
- package/dist/trajectory-corpus.test.js +32 -0
- package/dist/trajectory-feedback.test.js +116 -0
- package/dist/transition-synthesizer.js +286 -0
- package/dist/transition-synthesizer.test.js +123 -0
- package/dist/trust/api-semantic-mapper.js +809 -0
- package/dist/trust/call-graph-propagator.js +225 -0
- package/dist/trust/cli.js +122 -0
- package/dist/trust/compliance-scorer.js +283 -0
- package/dist/trust/confidence-calculator.js +261 -0
- package/dist/trust/engine.js +1145 -0
- package/dist/trust/explainability.js +85 -0
- package/dist/trust/formatters/ci.js +42 -0
- package/dist/trust/formatters/json.js +11 -0
- package/dist/trust/formatters/terminal.js +152 -0
- package/dist/trust/index.js +39 -0
- package/dist/trust/phase1-verify.js +171 -0
- package/dist/trust/protocol-domain-validator.js +697 -0
- package/dist/trust/score-calculator.js +282 -0
- package/dist/trust/ssg-bridge.js +641 -0
- package/dist/trust/ssg-bridge.test.js +269 -0
- package/dist/trust/types.js +67 -0
- package/dist/trust/violation-trace.js +335 -0
- package/dist/trust-api.js +179 -0
- package/dist/trust-calibration.js +279 -0
- package/dist/unknown-protocol-discovery.js +339 -0
- package/dist/unknown-protocol-discovery.test.js +102 -0
- package/dist/unsupervised-physics.js +230 -0
- package/dist/unsupervised-physics.test.js +95 -0
- package/dist/utils.test.js +37 -0
- package/dist/validator.js +187 -10
- package/dist/verification-intelligence.js +475 -0
- package/dist/verify-api.js +432 -0
- package/dist/vi-impact-report.js +293 -0
- package/dist/wl-fingerprint.js +162 -0
- package/dist/wl-fingerprint.test.js +130 -0
- package/dist/zeroshot-strategy.js +139 -0
- 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
- package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
- package/package.json +74 -7
- package/protocols.json +1956 -50
- package/.dockerignore +0 -14
- package/.mcp.json +0 -11
- package/.progmune_allowlist +0 -50
- package/.test_report/test_report.md +0 -87
- package/Dockerfile +0 -9
- package/FAQ.md +0 -167
- package/WHITEPAPER.md +0 -540
- package/demo-project/auth.ts +0 -55
- package/demo-project/tsconfig.json +0 -8
- package/dist/acl-breakdown.js +0 -13
- package/dist/all-sessions.js +0 -11
- package/dist/antibody-stats.js +0 -11
- package/dist/branch-tree-count.js +0 -14
- package/dist/common-fixpath.js +0 -12
- package/dist/constraint-types.js +0 -12
- package/dist/exec-metrics.js +0 -11
- package/dist/failure-report.js +0 -11
- package/dist/fast-path-hits.js +0 -13
- package/dist/fingerprint-list.js +0 -15
- package/dist/gen-history-log.js +0 -13
- package/dist/heatmap-data.js +0 -11
- package/dist/recent-session.js +0 -12
- package/dist/svl-distribution.js +0 -11
- package/dist/terminal-status.js +0 -11
- package/dist/token-savings.js +0 -11
- package/dist/total-repairs.js +0 -12
- package/dist/unresolved-count.js +0 -12
- package/dist/valid-fingerprints.js +0 -13
- package/dist/verify-ledgers.js +0 -11
- package/docs/whitepaper-style.css +0 -77
- package/docs/whitepaper-v2.1.md +0 -609
- package/docs/whitepaper-v2.2.md +0 -1064
- package/docs/whitepaper-v2.2.pdf +0 -0
- package/fly.toml +0 -31
- package/public/dashboard.html +0 -119
- package/server/hub.js +0 -116
- package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
- package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
- package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
- package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
- package/test/replay-golden.ts +0 -84
- package/test_benchmark.js +0 -165
- package/test_comprehensive.mjs +0 -638
- package/test_concurrency.js +0 -129
- package/test_ir_robustness.js +0 -85
- package/test_semantic_contracts.js +0 -269
- package/test_ssg_stress.js +0 -156
- package/test_svl3.js +0 -58
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Progmune V7 — Proof Provenance System
|
|
4
|
+
* ======================================
|
|
5
|
+
* 把每一个不变量变成可追溯的证明对象。
|
|
6
|
+
*
|
|
7
|
+
* 核心原则:
|
|
8
|
+
* Proof ≠ Belief — 两者永远分离。
|
|
9
|
+
*
|
|
10
|
+
* Proof: 形式逻辑对象。回答"这个结论能否从前提推导出来?"
|
|
11
|
+
* 没有概率,只有有效/无效。每一层推导都精确记录来源。
|
|
12
|
+
*
|
|
13
|
+
* Belief: 工程决策对象。回答"我们有多相信这个结论?"
|
|
14
|
+
* 融合运行时数据、Git 历史、业务文档、人工确认。
|
|
15
|
+
* 这是 V8 的事。
|
|
16
|
+
*
|
|
17
|
+
* 三层架构:
|
|
18
|
+
* L1 Recovery: Code → AST → State Machine → Protocol
|
|
19
|
+
* L2 Reasoning: Protocol → Proof Tree → Counterexample → Retain/Discard
|
|
20
|
+
* L3 Belief: Proof + Runtime + Docs + Human → Belief Score (V8)
|
|
21
|
+
*
|
|
22
|
+
* V7 完成 L1+L2。Proof 层不出现任何概率数字。
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.buildProofProvenance = buildProofProvenance;
|
|
59
|
+
const fs = __importStar(require("fs"));
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
// ══════════════════════════════════════════════
|
|
62
|
+
// L1: RECOVERY — Build derivation from code artifacts
|
|
63
|
+
// ══════════════════════════════════════════════
|
|
64
|
+
/**
|
|
65
|
+
* Build a derivation node for an OBSERVATION — something directly read from code.
|
|
66
|
+
* This is the leaf of every proof tree. No inference. Just extraction.
|
|
67
|
+
*/
|
|
68
|
+
function observationNode(id, conclusion, sourceFile, sourceLine, extractionMethod) {
|
|
69
|
+
return {
|
|
70
|
+
id,
|
|
71
|
+
conclusion,
|
|
72
|
+
rule: "OBSERVATION",
|
|
73
|
+
children: [],
|
|
74
|
+
provenance: {
|
|
75
|
+
sourceFile,
|
|
76
|
+
sourceLine,
|
|
77
|
+
sourceArtifact: conclusion,
|
|
78
|
+
extractionMethod,
|
|
79
|
+
transformationChain: [extractionMethod],
|
|
80
|
+
},
|
|
81
|
+
depth: 0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extend an observation through a transformation.
|
|
86
|
+
* e.g. OBSERVATION("status: ['pending','paid','shipped']")
|
|
87
|
+
* → STATE_MACHINE("order_suppliers: pending → paid → shipped → completed")
|
|
88
|
+
*/
|
|
89
|
+
function transformNode(id, conclusion, childId, rule, transformStep) {
|
|
90
|
+
return {
|
|
91
|
+
id,
|
|
92
|
+
conclusion,
|
|
93
|
+
rule,
|
|
94
|
+
children: [childId],
|
|
95
|
+
provenance: {
|
|
96
|
+
sourceFile: "", // Filled by combining child provenances
|
|
97
|
+
sourceLine: 0,
|
|
98
|
+
sourceArtifact: conclusion,
|
|
99
|
+
extractionMethod: transformStep,
|
|
100
|
+
transformationChain: [transformStep],
|
|
101
|
+
},
|
|
102
|
+
depth: 1,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// ══════════════════════════════════════════════
|
|
106
|
+
// L2: REASONING — Build the full proof provenance graph
|
|
107
|
+
// ══════════════════════════════════════════════
|
|
108
|
+
/**
|
|
109
|
+
* Build a complete Provenance Report from the pipeline outputs.
|
|
110
|
+
*
|
|
111
|
+
* Every invariant gets:
|
|
112
|
+
* 1. A full derivation tree tracing back to OBSERVATION leaves
|
|
113
|
+
* 2. A refutation record if V6 found a counterexample
|
|
114
|
+
* 3. No probability — only provenance
|
|
115
|
+
*/
|
|
116
|
+
function buildProvenance(protocols, stateMachines, proofEngine) {
|
|
117
|
+
const invariants = [];
|
|
118
|
+
const refutations = [];
|
|
119
|
+
let nodeCounter = 1000;
|
|
120
|
+
// ── Build derivation trees from protocol invariants ──
|
|
121
|
+
for (const proto of protocols) {
|
|
122
|
+
for (const inv of proto.invariants || []) {
|
|
123
|
+
const id = inv.id;
|
|
124
|
+
const predicate = inv.predicate || inv.rawPredicate || "";
|
|
125
|
+
const sources = inv.sources || [];
|
|
126
|
+
const domain = inv.domain || proto.domain || "unknown";
|
|
127
|
+
// Determine logic type from the predicate
|
|
128
|
+
let logicType = "REQUIRES";
|
|
129
|
+
if (predicate.includes("¬(") && predicate.includes("→"))
|
|
130
|
+
logicType = "FORBIDS";
|
|
131
|
+
else if (predicate.includes("¬∃"))
|
|
132
|
+
logicType = "TERMINAL";
|
|
133
|
+
else if (predicate.includes("≤ 1") || predicate.includes("unique"))
|
|
134
|
+
logicType = "UNIQUE";
|
|
135
|
+
else if (predicate.includes("initial_state"))
|
|
136
|
+
logicType = "INITIAL";
|
|
137
|
+
// Find the corresponding state machine
|
|
138
|
+
const machine = stateMachines.find((m) => m.entity === domain || domain.includes(m.entity) || m.entity.includes(domain));
|
|
139
|
+
// Build the OBSERVATION leaf
|
|
140
|
+
const sourceFile = sources[0] || "unknown";
|
|
141
|
+
const obsNode = observationNode(`OBS-${nodeCounter++}`, sources[0] || predicate, sourceFile.includes("State transition") ? "state-miner output" : sourceFile, 0, sourceFile.includes("Domain:") ? "domain_template" : "state_transition_recovery");
|
|
142
|
+
// Build the STATE_MACHINE intermediate node (if machine exists)
|
|
143
|
+
let derivation;
|
|
144
|
+
if (machine) {
|
|
145
|
+
const smNode = transformNode(`SM-${nodeCounter++}`, `${machine.entity}: ${(machine.states || []).join(" → ")}`, obsNode.id, "STATE_MACHINE", "state_transition_recovery → state_machine");
|
|
146
|
+
smNode.depth = 1;
|
|
147
|
+
// Build the top-level PROTOCOL node
|
|
148
|
+
derivation = {
|
|
149
|
+
id: `PR-${nodeCounter++}`,
|
|
150
|
+
conclusion: predicate,
|
|
151
|
+
rule: inv.id.startsWith("INV-TMPL") ? "PROTOCOL_TEMPLATE" : "STATE_MACHINE",
|
|
152
|
+
children: [smNode.id],
|
|
153
|
+
provenance: {
|
|
154
|
+
sourceFile: sourceFile,
|
|
155
|
+
sourceLine: 0,
|
|
156
|
+
sourceArtifact: predicate,
|
|
157
|
+
extractionMethod: smNode.provenance.extractionMethod,
|
|
158
|
+
transformationChain: [...smNode.provenance.transformationChain, "state_machine → protocol_invariant"],
|
|
159
|
+
},
|
|
160
|
+
depth: 2,
|
|
161
|
+
};
|
|
162
|
+
// Attach all nodes for serialization
|
|
163
|
+
derivation._obsNode = obsNode;
|
|
164
|
+
derivation._smNode = smNode;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// No state machine — direct OBSERVATION → invariant
|
|
168
|
+
derivation = {
|
|
169
|
+
id: `PR-${nodeCounter++}`,
|
|
170
|
+
conclusion: predicate,
|
|
171
|
+
rule: "PROTOCOL_TEMPLATE",
|
|
172
|
+
children: [obsNode.id],
|
|
173
|
+
provenance: {
|
|
174
|
+
sourceFile: sourceFile,
|
|
175
|
+
sourceLine: 0,
|
|
176
|
+
sourceArtifact: predicate,
|
|
177
|
+
extractionMethod: obsNode.provenance.extractionMethod,
|
|
178
|
+
transformationChain: [...obsNode.provenance.transformationChain, "template → invariant"],
|
|
179
|
+
},
|
|
180
|
+
depth: 1,
|
|
181
|
+
};
|
|
182
|
+
derivation._obsNode = obsNode;
|
|
183
|
+
}
|
|
184
|
+
// Check refutation from V6 — match by PREDICATE TEXT, not ID
|
|
185
|
+
// (IDs collide across protocols: each has its own INV-3)
|
|
186
|
+
const v6Counterexamples = proofEngine?.counterexamples || [];
|
|
187
|
+
const ce = v6Counterexamples.find((c) => c.invariantStatement === predicate);
|
|
188
|
+
const isRefuted = !!ce;
|
|
189
|
+
if (ce) {
|
|
190
|
+
refutations.push({
|
|
191
|
+
invariantId: id,
|
|
192
|
+
invariantPredicate: predicate,
|
|
193
|
+
counterexamplePath: ce.path || [],
|
|
194
|
+
explanation: ce.explanation || "",
|
|
195
|
+
refutationRule: "BFS_SHORTCUT",
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
invariants.push({
|
|
199
|
+
id,
|
|
200
|
+
predicate,
|
|
201
|
+
domain,
|
|
202
|
+
logicType,
|
|
203
|
+
derivation,
|
|
204
|
+
derivationDepth: derivation.depth,
|
|
205
|
+
isRefuted,
|
|
206
|
+
counterexamplePath: ce?.path,
|
|
207
|
+
counterexampleExplanation: ce?.explanation,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ── Check inferred invariants from V6 ──
|
|
212
|
+
for (const inf of proofEngine?.inferred || []) {
|
|
213
|
+
const pred = inf.deducedPredicate;
|
|
214
|
+
const premises = inf.premises || [];
|
|
215
|
+
const proofTree = inf.proofTree;
|
|
216
|
+
// Build TRANSITIVITY node with premises as children
|
|
217
|
+
const derivation = {
|
|
218
|
+
id: `INF-${nodeCounter++}`,
|
|
219
|
+
conclusion: pred,
|
|
220
|
+
rule: "TRANSITIVITY",
|
|
221
|
+
children: premises.map((p) => p.id),
|
|
222
|
+
provenance: {
|
|
223
|
+
sourceFile: "",
|
|
224
|
+
sourceLine: 0,
|
|
225
|
+
sourceArtifact: pred,
|
|
226
|
+
extractionMethod: "transitive_closure",
|
|
227
|
+
transformationChain: ["premise_a ⇒ premise_b", "premise_b ⇒ premise_c", "transitivity ⇒ conclusion"],
|
|
228
|
+
},
|
|
229
|
+
depth: 2,
|
|
230
|
+
};
|
|
231
|
+
invariants.push({
|
|
232
|
+
id: proofTree?.id || `INF-${nodeCounter}`,
|
|
233
|
+
predicate: pred,
|
|
234
|
+
domain: "inferred",
|
|
235
|
+
logicType: "REQUIRES",
|
|
236
|
+
derivation,
|
|
237
|
+
derivationDepth: 2,
|
|
238
|
+
isRefuted: false,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Compute summary
|
|
242
|
+
const observations = invariants.filter(i => i.derivationDepth === 0 || i.derivation.rule === "OBSERVATION");
|
|
243
|
+
const derived = invariants.filter(i => !i.isRefuted && i.derivationDepth > 0);
|
|
244
|
+
const refuted = invariants.filter(i => i.isRefuted);
|
|
245
|
+
const retained = invariants.filter(i => !i.isRefuted);
|
|
246
|
+
const depths = invariants.map(i => i.derivationDepth);
|
|
247
|
+
const report = {
|
|
248
|
+
timestamp: new Date().toISOString(),
|
|
249
|
+
invariants,
|
|
250
|
+
refutations,
|
|
251
|
+
summary: {
|
|
252
|
+
totalInvariants: invariants.length,
|
|
253
|
+
observations: observations.length,
|
|
254
|
+
derived: derived.length,
|
|
255
|
+
refuted: refuted.length,
|
|
256
|
+
retained: retained.length,
|
|
257
|
+
proofDepth: {
|
|
258
|
+
min: depths.length > 0 ? Math.min(...depths) : 0,
|
|
259
|
+
max: depths.length > 0 ? Math.max(...depths) : 0,
|
|
260
|
+
avg: depths.length > 0 ? Math.round(depths.reduce((a, b) => a + b, 0) / depths.length) : 0,
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
return report;
|
|
265
|
+
}
|
|
266
|
+
// ══════════════════════════════════════════════
|
|
267
|
+
// MAIN
|
|
268
|
+
// ══════════════════════════════════════════════
|
|
269
|
+
function buildProofProvenance(projectPath) {
|
|
270
|
+
console.log("🔬 Progmune Proof Provenance System — V7");
|
|
271
|
+
const protoPath = path.join(projectPath, ".progmune_protocols.json");
|
|
272
|
+
const statePath = path.join(projectPath, ".progmune_state_machines.json");
|
|
273
|
+
const proofPath = path.join(projectPath, ".progmune_proofs.json");
|
|
274
|
+
const protocols = fs.existsSync(protoPath) ? JSON.parse(fs.readFileSync(protoPath, "utf-8")).protocols || [] : [];
|
|
275
|
+
const stateMachines = fs.existsSync(statePath) ? JSON.parse(fs.readFileSync(statePath, "utf-8")).machines || [] : [];
|
|
276
|
+
const proofEngine = fs.existsSync(proofPath) ? JSON.parse(fs.readFileSync(proofPath, "utf-8")) : {};
|
|
277
|
+
console.log(` Input: ${protocols.length} protocols, ${stateMachines.length} state machines`);
|
|
278
|
+
console.log(` V6 data: ${proofEngine.summary?.totalInvariants || 0} invariants, ${proofEngine.summary?.counterexamples || 0} counterexamples`);
|
|
279
|
+
const report = buildProvenance(protocols, stateMachines, proofEngine);
|
|
280
|
+
// Print the proof provenance for refuted invariants
|
|
281
|
+
console.log(`\n ${report.summary.totalInvariants} invariants with full provenance`);
|
|
282
|
+
console.log(` ${report.summary.refuted} refuted (counterexample found)`);
|
|
283
|
+
console.log(` ${report.summary.retained} retained`);
|
|
284
|
+
if (report.refutations.length > 0) {
|
|
285
|
+
console.log("\n ── Refutations ──");
|
|
286
|
+
for (const ref of report.refutations) {
|
|
287
|
+
console.log(` ❌ ${ref.invariantPredicate}`);
|
|
288
|
+
console.log(` Rule: ${ref.refutationRule}`);
|
|
289
|
+
console.log(` Path: ${ref.counterexamplePath.join(" → ")}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return report;
|
|
293
|
+
}
|
|
294
|
+
// ══════════════════════════════════════════════
|
|
295
|
+
// CLI
|
|
296
|
+
// ══════════════════════════════════════════════
|
|
297
|
+
if (require.main === module) {
|
|
298
|
+
const targetProject = process.argv[2];
|
|
299
|
+
if (!targetProject) {
|
|
300
|
+
console.error("Usage: npx ts-node src/proof-provenance.ts <project-path>");
|
|
301
|
+
process.exit(1);
|
|
302
|
+
}
|
|
303
|
+
const report = buildProofProvenance(targetProject);
|
|
304
|
+
const outputPath = path.join(targetProject, ".progmune_provenance.json");
|
|
305
|
+
fs.writeFileSync(outputPath, JSON.stringify(report, null, 2));
|
|
306
|
+
console.log(`\n✅ Provenance report saved to: ${outputPath}`);
|
|
307
|
+
console.log("\n═══ Proof Provenance Summary ═══");
|
|
308
|
+
console.log(` Total: ${report.summary.totalInvariants}`);
|
|
309
|
+
console.log(` Observations: ${report.summary.observations}`);
|
|
310
|
+
console.log(` Derived: ${report.summary.derived}`);
|
|
311
|
+
console.log(` Refuted: ${report.summary.refuted}`);
|
|
312
|
+
console.log(` Retained: ${report.summary.retained}`);
|
|
313
|
+
console.log(` Proof Depth: min=${report.summary.proofDepth.min} max=${report.summary.proofDepth.max} avg=${report.summary.proofDepth.avg}`);
|
|
314
|
+
console.log();
|
|
315
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P3.6: Protocol Coverage Engine
|
|
4
|
+
*
|
|
5
|
+
* Analyzes Trajectory Corpus against Protocol Definitions to determine
|
|
6
|
+
* which states and transitions have been observed in real execution data.
|
|
7
|
+
*
|
|
8
|
+
* Core question: "What does the system NOT know yet?"
|
|
9
|
+
*
|
|
10
|
+
* Coverage gaps drive:
|
|
11
|
+
* 1. Benchmark generation (targeted test cases)
|
|
12
|
+
* 2. Data acquisition priorities (where to collect more feedback)
|
|
13
|
+
* 3. Risk assessment (which protocols are under-observed)
|
|
14
|
+
*
|
|
15
|
+
* Architecture:
|
|
16
|
+
* Protocol definitions → All possible states + transitions
|
|
17
|
+
* Trajectory records → Observed states + transitions
|
|
18
|
+
* Coverage engine → Gap analysis + risk ranking
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.parseProtocolDefinition = parseProtocolDefinition;
|
|
55
|
+
exports.analyzeCoverage = analyzeCoverage;
|
|
56
|
+
exports.analyzeAllCoverage = analyzeAllCoverage;
|
|
57
|
+
exports.loadDefaultProtocolDefinitions = loadDefaultProtocolDefinitions;
|
|
58
|
+
// ═══════════════════════════════════════════════════════════════
|
|
59
|
+
// Protocol Parser
|
|
60
|
+
// ═══════════════════════════════════════════════════════════════
|
|
61
|
+
function parseTransitions(rules) {
|
|
62
|
+
const transitions = [];
|
|
63
|
+
for (const [fn, rule] of rules) {
|
|
64
|
+
// Acquire transitions: pre_states (or INIT) → post_states
|
|
65
|
+
const pres = rule.pre_states.length > 0 ? rule.pre_states : ["INIT"];
|
|
66
|
+
for (const pre of pres) {
|
|
67
|
+
for (const post of rule.post_states) {
|
|
68
|
+
transitions.push({ from: pre, to: post, rule: fn, type: "acquire" });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Invalidation transitions: state → ∅
|
|
72
|
+
if (rule.invalidate) {
|
|
73
|
+
for (const inv of rule.invalidate) {
|
|
74
|
+
transitions.push({ from: inv, to: "∅", rule: fn, type: "invalidate" });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return transitions;
|
|
79
|
+
}
|
|
80
|
+
function allStatesFromRules(rules, initialState) {
|
|
81
|
+
const states = new Set();
|
|
82
|
+
states.add(initialState);
|
|
83
|
+
states.add("INIT");
|
|
84
|
+
for (const rule of rules.values()) {
|
|
85
|
+
for (const s of rule.pre_states)
|
|
86
|
+
states.add(s);
|
|
87
|
+
for (const s of rule.post_states)
|
|
88
|
+
states.add(s);
|
|
89
|
+
if (rule.invalidate)
|
|
90
|
+
for (const s of rule.invalidate)
|
|
91
|
+
states.add(s);
|
|
92
|
+
}
|
|
93
|
+
return [...states].sort();
|
|
94
|
+
}
|
|
95
|
+
/** Parse a protocol definition from its rules. */
|
|
96
|
+
function parseProtocolDefinition(name, rules, initialState) {
|
|
97
|
+
return {
|
|
98
|
+
name,
|
|
99
|
+
states: allStatesFromRules(rules, initialState),
|
|
100
|
+
initialState,
|
|
101
|
+
transitions: parseTransitions(rules),
|
|
102
|
+
rules,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// ═══════════════════════════════════════════════════════════════
|
|
106
|
+
// Coverage Analyzer
|
|
107
|
+
// ═══════════════════════════════════════════════════════════════
|
|
108
|
+
/** Extract observed states from a trajectory. */
|
|
109
|
+
function extractVisitedStates(trajectory, rules, initial) {
|
|
110
|
+
const visited = new Set();
|
|
111
|
+
if (initial)
|
|
112
|
+
visited.add(initial);
|
|
113
|
+
let current = new Set();
|
|
114
|
+
if (initial)
|
|
115
|
+
current.add(initial);
|
|
116
|
+
for (const fn of trajectory) {
|
|
117
|
+
const rule = rules.get(fn);
|
|
118
|
+
if (!rule)
|
|
119
|
+
continue;
|
|
120
|
+
for (const pre of rule.pre_states)
|
|
121
|
+
visited.add(pre);
|
|
122
|
+
for (const post of rule.post_states) {
|
|
123
|
+
visited.add(post);
|
|
124
|
+
current.add(post);
|
|
125
|
+
}
|
|
126
|
+
if (rule.invalidate)
|
|
127
|
+
rule.invalidate.forEach(s => { visited.add(s); current.delete(s); });
|
|
128
|
+
}
|
|
129
|
+
return visited;
|
|
130
|
+
}
|
|
131
|
+
/** Extract observed transitions from a trajectory. */
|
|
132
|
+
function extractVisitedTransitions(trajectory, rules, initial) {
|
|
133
|
+
const visited = new Set();
|
|
134
|
+
let current = new Set();
|
|
135
|
+
if (initial)
|
|
136
|
+
current.add(initial);
|
|
137
|
+
for (const fn of trajectory) {
|
|
138
|
+
const rule = rules.get(fn);
|
|
139
|
+
if (!rule)
|
|
140
|
+
continue;
|
|
141
|
+
for (const pre of rule.pre_states) {
|
|
142
|
+
for (const post of rule.post_states) {
|
|
143
|
+
visited.add(`${pre}→${post}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (rule.invalidate) {
|
|
147
|
+
for (const inv of rule.invalidate) {
|
|
148
|
+
visited.add(`${inv}→∅`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Advance state
|
|
152
|
+
if (rule.invalidate)
|
|
153
|
+
rule.invalidate.forEach(s => current.delete(s));
|
|
154
|
+
for (const post of rule.post_states)
|
|
155
|
+
current.add(post);
|
|
156
|
+
}
|
|
157
|
+
return visited;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Compute coverage for a single protocol from trajectory data.
|
|
161
|
+
*/
|
|
162
|
+
function analyzeCoverage(protocol, trajectories) {
|
|
163
|
+
// Filter trajectories relevant to this protocol
|
|
164
|
+
const relevant = trajectories.filter(t => t.protocol === protocol.name || t.protocol === "_global");
|
|
165
|
+
// Aggregate visited states + transitions
|
|
166
|
+
const visitedStates = new Set();
|
|
167
|
+
const visitedTransitions = new Set();
|
|
168
|
+
for (const t of relevant) {
|
|
169
|
+
const initialState = t.initialState?.length > 0 ? t.initialState[0] : undefined;
|
|
170
|
+
for (const s of extractVisitedStates(t.trajectory, protocol.rules, initialState))
|
|
171
|
+
visitedStates.add(s);
|
|
172
|
+
for (const tr of extractVisitedTransitions(t.trajectory, protocol.rules, initialState))
|
|
173
|
+
visitedTransitions.add(tr);
|
|
174
|
+
}
|
|
175
|
+
const totalStates = protocol.states.length;
|
|
176
|
+
const visitedStateCount = [...visitedStates].filter(s => protocol.states.includes(s)).length;
|
|
177
|
+
const totalTransitions = protocol.transitions.length;
|
|
178
|
+
const visitedTransitionKeys = new Set(protocol.transitions.filter(t => visitedTransitions.has(`${t.from}→${t.to}`)).map(t => `${t.from}→${t.to}`));
|
|
179
|
+
const missingStates = protocol.states.filter(s => !visitedStates.has(s));
|
|
180
|
+
const missingTransitions = protocol.transitions
|
|
181
|
+
.filter(t => !visitedTransitions.has(`${t.from}→${t.to}`))
|
|
182
|
+
.map(t => ({ from: t.from, to: t.to, rule: t.rule }));
|
|
183
|
+
return {
|
|
184
|
+
protocol: protocol.name,
|
|
185
|
+
stateCoverage: {
|
|
186
|
+
protocol: protocol.name,
|
|
187
|
+
totalStates,
|
|
188
|
+
visitedStates: visitedStateCount,
|
|
189
|
+
stateCoverage: totalStates > 0 ? visitedStateCount / totalStates : 0,
|
|
190
|
+
missingStates,
|
|
191
|
+
},
|
|
192
|
+
transitionCoverage: {
|
|
193
|
+
protocol: protocol.name,
|
|
194
|
+
totalTransitions,
|
|
195
|
+
visitedTransitions: visitedTransitionKeys.size,
|
|
196
|
+
transitionCoverage: totalTransitions > 0 ? visitedTransitionKeys.size / totalTransitions : 0,
|
|
197
|
+
missingTransitions,
|
|
198
|
+
},
|
|
199
|
+
trajectoryCount: relevant.length,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Analyze coverage across all protocols.
|
|
204
|
+
*/
|
|
205
|
+
function analyzeAllCoverage(protocols, trajectories) {
|
|
206
|
+
return protocols.map(p => analyzeCoverage(p, trajectories));
|
|
207
|
+
}
|
|
208
|
+
// ═══════════════════════════════════════════════════════════════
|
|
209
|
+
// Default protocol definitions (from protocols.json)
|
|
210
|
+
// ═══════════════════════════════════════════════════════════════
|
|
211
|
+
const fs = __importStar(require("fs"));
|
|
212
|
+
const path = __importStar(require("path"));
|
|
213
|
+
const ssg_validator_1 = require("./ssg-validator");
|
|
214
|
+
let _cachedProtocols = null;
|
|
215
|
+
function loadDefaultProtocolDefinitions() {
|
|
216
|
+
if (_cachedProtocols)
|
|
217
|
+
return _cachedProtocols;
|
|
218
|
+
const protoDef = JSON.parse(fs.readFileSync(path.resolve(__dirname, "..", "protocols.json"), "utf-8"));
|
|
219
|
+
const fns = (0, ssg_validator_1.parseProtocolsFromJSON)(protoDef);
|
|
220
|
+
const rules = new Map();
|
|
221
|
+
for (const p of fns)
|
|
222
|
+
rules.set(p.function, p.protocol);
|
|
223
|
+
// Split rules into logical protocol groups by state namespace
|
|
224
|
+
const protocolGroups = [
|
|
225
|
+
{
|
|
226
|
+
name: "FileProtocol",
|
|
227
|
+
ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("FILE")) || rule.post_states.some(s => s.includes("FILE")) || (rule.invalidate || []).some(s => s.includes("FILE")),
|
|
228
|
+
initialState: "INIT",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: "AuthProtocol",
|
|
232
|
+
ruleFilter: (_fn, rule) => rule.pre_states.some(s => ["UNAUTHENTICATED", "PASSWORD_VERIFIED", "TOKEN_ISSUED", "SESSION_ACTIVE"].includes(s)) ||
|
|
233
|
+
rule.post_states.some(s => ["UNAUTHENTICATED", "PASSWORD_VERIFIED", "TOKEN_ISSUED", "SESSION_ACTIVE"].includes(s)),
|
|
234
|
+
initialState: "UNAUTHENTICATED",
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
name: "DBProtocol",
|
|
238
|
+
ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("DB")) || rule.post_states.some(s => s.includes("DB")) || (rule.invalidate || []).some(s => s.includes("DB")),
|
|
239
|
+
initialState: "INIT",
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: "IRProtocol",
|
|
243
|
+
ruleFilter: (_fn, rule) => rule.pre_states.some(s => s.includes("IR_") || s.includes("ACTION_") || s.includes("SEQUENCE_") || s.includes("CODE_") || s.includes("SESSION_")) ||
|
|
244
|
+
rule.post_states.some(s => s.includes("IR_") || s.includes("ACTION_") || s.includes("SEQUENCE_") || s.includes("CODE_") || s.includes("SESSION_")),
|
|
245
|
+
initialState: "IR_STALE",
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: "StatelessProtocol",
|
|
249
|
+
ruleFilter: (_fn, rule) => rule.namespace === "stateless" ||
|
|
250
|
+
(rule.pre_states.length === 0 && rule.post_states.length === 0),
|
|
251
|
+
initialState: "IDLE",
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: "TransactionProtocol",
|
|
255
|
+
ruleFilter: (_fn, rule) => rule.namespace === "transaction" ||
|
|
256
|
+
rule.pre_states.some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD") ||
|
|
257
|
+
rule.post_states.some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD") ||
|
|
258
|
+
(rule.invalidate || []).some(s => s.startsWith("TX_") || s === "SAVEPOINT_HELD"),
|
|
259
|
+
initialState: "TX_IDLE",
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: "ConditionalProtocol",
|
|
263
|
+
ruleFilter: (_fn, rule) => rule.namespace === "conditional" ||
|
|
264
|
+
rule.pre_states.some(s => s.startsWith("COND_")) ||
|
|
265
|
+
rule.post_states.some(s => s.startsWith("COND_")) ||
|
|
266
|
+
(rule.invalidate || []).some(s => s.startsWith("COND_")),
|
|
267
|
+
initialState: "COND_IDLE",
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: "LoopProtocol",
|
|
271
|
+
ruleFilter: (_fn, rule) => rule.namespace === "loop" ||
|
|
272
|
+
rule.pre_states.some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING") ||
|
|
273
|
+
rule.post_states.some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING") ||
|
|
274
|
+
(rule.invalidate || []).some(s => s.startsWith("LOOP_") || s === "FETCHING" || s === "BATCH_READY" || s === "ITERATING"),
|
|
275
|
+
initialState: "LOOP_IDLE",
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: "CrossProtocol",
|
|
279
|
+
ruleFilter: (_fn, rule) => rule.namespace === "cross" ||
|
|
280
|
+
rule.pre_states.some(s => s.includes("AUTH_FILE_GATE") || s.includes("AUTH_DB_GATE")) ||
|
|
281
|
+
rule.post_states.some(s => s.includes("AUTH_FILE_GATE") || s.includes("AUTH_DB_GATE")),
|
|
282
|
+
initialState: "UNAUTHENTICATED",
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
_cachedProtocols = protocolGroups.map(g => {
|
|
286
|
+
const groupRules = new Map();
|
|
287
|
+
for (const [fn, rule] of rules) {
|
|
288
|
+
if (g.ruleFilter(fn, rule))
|
|
289
|
+
groupRules.set(fn, rule);
|
|
290
|
+
}
|
|
291
|
+
return parseProtocolDefinition(g.name, groupRules, g.initialState);
|
|
292
|
+
});
|
|
293
|
+
return _cachedProtocols;
|
|
294
|
+
}
|