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,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P6.0: Protocol Foundation Model
|
|
4
|
+
*
|
|
5
|
+
* Scales protocol extraction from manual rules to automatic,
|
|
6
|
+
* code-driven discovery. The Protocol VM's knowledge base
|
|
7
|
+
* grows organically from real code patterns.
|
|
8
|
+
*
|
|
9
|
+
* Target: Discovery Rate 43% → 70%+
|
|
10
|
+
*
|
|
11
|
+
* Improvements over basic Protocol Extractor (P5.5):
|
|
12
|
+
* 1. Intelligent state naming (FILE_OPEN, not STATE_OPEN)
|
|
13
|
+
* 2. Domain-specific clustering (group related functions)
|
|
14
|
+
* 3. Confidence-weighted rule merging
|
|
15
|
+
* 4. Direct integration with benchmark evaluation
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.inferStateName = inferStateName;
|
|
52
|
+
exports.inferEnhancedRules = inferEnhancedRules;
|
|
53
|
+
exports.extractProtocolFoundation = extractProtocolFoundation;
|
|
54
|
+
exports.enhancedRulesToMap = enhancedRulesToMap;
|
|
55
|
+
exports.measureDiscoveryImpact = measureDiscoveryImpact;
|
|
56
|
+
exports.printFoundationReport = printFoundationReport;
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const protocol_extractor_1 = require("./protocol-extractor");
|
|
60
|
+
const repo_evaluator_1 = require("./repo-evaluator");
|
|
61
|
+
const protocol_coverage_1 = require("./protocol-coverage");
|
|
62
|
+
const evaluation_campaign_1 = require("./evaluation-campaign");
|
|
63
|
+
const discovery_analytics_1 = require("./discovery-analytics");
|
|
64
|
+
// ═══════════════════════════════════════════════════════════════
|
|
65
|
+
// Intelligent State Naming
|
|
66
|
+
// ═══════════════════════════════════════════════════════════════
|
|
67
|
+
const DOMAIN_KEYWORDS = {
|
|
68
|
+
FILE: ["file", "fopen", "fread", "fwrite", "fclose", "open", "read", "write", "close", "flush", "sync", "stat"],
|
|
69
|
+
DB: ["db", "connect", "query", "insert", "update", "delete", "disconnect", "sql", "transaction", "commit", "rollback"],
|
|
70
|
+
AUTH: ["auth", "login", "logout", "password", "token", "jwt", "session", "verify", "credential", "authenticate"],
|
|
71
|
+
NET: ["socket", "connect", "bind", "listen", "accept", "send", "recv", "http", "request", "response"],
|
|
72
|
+
MEM: ["alloc", "malloc", "free", "realloc", "mem", "memory", "buffer", "release"],
|
|
73
|
+
PROC: ["fork", "exec", "wait", "kill", "signal", "process", "thread", "mutex", "lock", "unlock"],
|
|
74
|
+
};
|
|
75
|
+
const STATE_SUFFIXES = {
|
|
76
|
+
open: "_OPEN", close: "_CLOSED", connect: "_CONNECTED", disconnect: "_CLOSED",
|
|
77
|
+
create: "_CREATED", destroy: "_DESTROYED", init: "_INITIALIZED", alloc: "_ALLOCATED",
|
|
78
|
+
free: "_FREED", lock: "_LOCKED", unlock: "_UNLOCKED", start: "_STARTED",
|
|
79
|
+
stop: "_STOPPED", begin: "_ACTIVE", end: "_COMPLETED", login: "_AUTHENTICATED",
|
|
80
|
+
logout: "_UNAUTHENTICATED", read: "_READY", write: "_DIRTY",
|
|
81
|
+
verify: "_VERIFIED", generate: "_ISSUED", send: "_SENT", recv: "_RECEIVED",
|
|
82
|
+
};
|
|
83
|
+
/** Infer a meaningful state name from a function name and its role. */
|
|
84
|
+
function inferStateName(fn, role) {
|
|
85
|
+
const lower = fn.toLowerCase();
|
|
86
|
+
// Find domain
|
|
87
|
+
let domain = "STATE";
|
|
88
|
+
for (const [dom, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
89
|
+
if (keywords.some(kw => lower.includes(kw))) {
|
|
90
|
+
domain = dom;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Find state suffix
|
|
95
|
+
let suffix = "";
|
|
96
|
+
for (const [key, val] of Object.entries(STATE_SUFFIXES)) {
|
|
97
|
+
if (lower.includes(key)) {
|
|
98
|
+
suffix = val;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Default suffixes by role
|
|
103
|
+
if (!suffix) {
|
|
104
|
+
suffix = role === "pre" ? "_REQUIRED" : role === "invalidate" ? "_INVALIDATED" : "_PRODUCED";
|
|
105
|
+
}
|
|
106
|
+
return `${domain}${suffix}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Enhanced protocol rule inference with intelligent state names.
|
|
110
|
+
*/
|
|
111
|
+
function inferEnhancedRules(pairs, minFrequency = 3) {
|
|
112
|
+
// Count transition frequencies
|
|
113
|
+
const transitions = new Map();
|
|
114
|
+
const fnFreq = new Map();
|
|
115
|
+
for (const p of pairs) {
|
|
116
|
+
const key = `${p.from}→${p.to}`;
|
|
117
|
+
transitions.set(key, (transitions.get(key) || 0) + 1);
|
|
118
|
+
fnFreq.set(p.from, (fnFreq.get(p.from) || 0) + 1);
|
|
119
|
+
fnFreq.set(p.to, (fnFreq.get(p.to) || 0) + 1);
|
|
120
|
+
}
|
|
121
|
+
const maxFreq = Math.max(1, ...[...transitions.values()]);
|
|
122
|
+
const rules = [];
|
|
123
|
+
// Build per-function state maps
|
|
124
|
+
const fnStates = new Map();
|
|
125
|
+
for (const [key, freq] of transitions) {
|
|
126
|
+
if (freq < minFrequency)
|
|
127
|
+
continue;
|
|
128
|
+
const [fnA, fnB] = key.split("→");
|
|
129
|
+
const confidence = freq / maxFreq;
|
|
130
|
+
// Infer state name from the PRODUCER (fnA), not consumer
|
|
131
|
+
const stateName = inferStateName(fnA, "post");
|
|
132
|
+
// fnA produces it, fnB requires it
|
|
133
|
+
// Track for fnA
|
|
134
|
+
const aStates = fnStates.get(fnA) || { produced: new Set(), required: new Set(), invalidated: new Set() };
|
|
135
|
+
aStates.produced.add(stateName);
|
|
136
|
+
fnStates.set(fnA, aStates);
|
|
137
|
+
// Track for fnB
|
|
138
|
+
const bStates = fnStates.get(fnB) || { produced: new Set(), required: new Set(), invalidated: new Set() };
|
|
139
|
+
bStates.required.add(stateName);
|
|
140
|
+
fnStates.set(fnB, bStates);
|
|
141
|
+
}
|
|
142
|
+
// Second pass: detect invalidation patterns
|
|
143
|
+
for (const [key, freq] of transitions) {
|
|
144
|
+
if (freq < minFrequency)
|
|
145
|
+
continue;
|
|
146
|
+
const [fnA, fnB] = key.split("→");
|
|
147
|
+
// Check if fnB is a "closer" that invalidates fnA's produced state
|
|
148
|
+
const aStates = fnStates.get(fnA);
|
|
149
|
+
const bStates = fnStates.get(fnB);
|
|
150
|
+
if (!aStates || !bStates)
|
|
151
|
+
continue;
|
|
152
|
+
const isCloser = ["close", "disconnect", "logout", "free", "destroy", "release", "stop", "end", "finish"]
|
|
153
|
+
.some(kw => fnB.includes(kw));
|
|
154
|
+
const isOpener = ["open", "connect", "login", "create", "alloc", "init", "start", "begin"]
|
|
155
|
+
.some(kw => fnA.includes(kw));
|
|
156
|
+
if (isCloser && isOpener) {
|
|
157
|
+
// fnB invalidates what fnA produced
|
|
158
|
+
for (const state of aStates.produced) {
|
|
159
|
+
bStates.invalidated.add(state);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Convert to rules
|
|
164
|
+
const maxFnFreq = Math.max(1, ...[...fnFreq.values()]);
|
|
165
|
+
for (const [fn, states] of fnStates) {
|
|
166
|
+
const freq = fnFreq.get(fn) || 1;
|
|
167
|
+
const confidence = Math.min(1, freq / maxFnFreq);
|
|
168
|
+
const domain = inferDomain(fn);
|
|
169
|
+
rules.push({
|
|
170
|
+
function: fn,
|
|
171
|
+
pre_states: [...states.required],
|
|
172
|
+
post_states: [...states.produced],
|
|
173
|
+
invalidate: states.invalidated.size > 0 ? [...states.invalidated] : undefined,
|
|
174
|
+
confidence,
|
|
175
|
+
evidence: freq,
|
|
176
|
+
domain,
|
|
177
|
+
stateNames: {
|
|
178
|
+
pre: [...states.required],
|
|
179
|
+
post: [...states.produced],
|
|
180
|
+
invalidate: [...states.invalidated],
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return rules.sort((a, b) => b.confidence - a.confidence);
|
|
185
|
+
}
|
|
186
|
+
function inferDomain(fn) {
|
|
187
|
+
const lower = fn.toLowerCase();
|
|
188
|
+
for (const [dom, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
189
|
+
if (keywords.some(kw => lower.includes(kw)))
|
|
190
|
+
return dom;
|
|
191
|
+
}
|
|
192
|
+
return "GENERAL";
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Extract a protocol foundation from a repository.
|
|
196
|
+
*
|
|
197
|
+
* Uses enhanced rule inference with intelligent state naming
|
|
198
|
+
* and frequency-based confidence scoring.
|
|
199
|
+
*/
|
|
200
|
+
function extractProtocolFoundation(repoPath, protocolName, maxFiles = 200, minFrequency = 3) {
|
|
201
|
+
const files = (0, repo_evaluator_1.scanRepository)(repoPath, maxFiles);
|
|
202
|
+
const allPairs = [];
|
|
203
|
+
for (const fp of files) {
|
|
204
|
+
try {
|
|
205
|
+
const code = fs.readFileSync(fp, "utf-8");
|
|
206
|
+
allPairs.push(...(0, protocol_extractor_1.extractCallPairs)(code, fp));
|
|
207
|
+
}
|
|
208
|
+
catch { /* skip */ }
|
|
209
|
+
}
|
|
210
|
+
const rules = inferEnhancedRules(allPairs, minFrequency);
|
|
211
|
+
const states = new Set();
|
|
212
|
+
for (const r of rules) {
|
|
213
|
+
for (const s of r.pre_states)
|
|
214
|
+
states.add(s);
|
|
215
|
+
for (const s of r.post_states)
|
|
216
|
+
states.add(s);
|
|
217
|
+
if (r.invalidate)
|
|
218
|
+
for (const s of r.invalidate)
|
|
219
|
+
states.add(s);
|
|
220
|
+
}
|
|
221
|
+
// Compare against hand-written baseline
|
|
222
|
+
const defs = (0, protocol_coverage_1.loadDefaultProtocolDefinitions)();
|
|
223
|
+
const handWrittenFns = new Set();
|
|
224
|
+
for (const p of defs)
|
|
225
|
+
for (const fn of p.rules.keys())
|
|
226
|
+
handWrittenFns.add(fn);
|
|
227
|
+
const extractedFns = new Set(rules.map(r => r.function));
|
|
228
|
+
let overlap = 0;
|
|
229
|
+
for (const fn of extractedFns) {
|
|
230
|
+
if (handWrittenFns.has(fn))
|
|
231
|
+
overlap++;
|
|
232
|
+
}
|
|
233
|
+
const avgConf = rules.length > 0 ? rules.reduce((s, r) => s + r.confidence, 0) / rules.length : 0;
|
|
234
|
+
return {
|
|
235
|
+
protocol: protocolName || path.basename(repoPath),
|
|
236
|
+
rules,
|
|
237
|
+
states: [...states],
|
|
238
|
+
sourceFiles: files,
|
|
239
|
+
totalPairs: allPairs.length,
|
|
240
|
+
avgConfidence: avgConf,
|
|
241
|
+
handWrittenOverlap: overlap,
|
|
242
|
+
novelRulesCount: extractedFns.size - overlap,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Convert enhanced rules to SSG-compatible StateAnnotation map.
|
|
247
|
+
*/
|
|
248
|
+
function enhancedRulesToMap(rules) {
|
|
249
|
+
const map = new Map();
|
|
250
|
+
for (const r of rules) {
|
|
251
|
+
map.set(r.function, {
|
|
252
|
+
pre_states: r.pre_states,
|
|
253
|
+
post_states: r.post_states,
|
|
254
|
+
invalidate: r.invalidate,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return map;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Measure the Discovery Rate impact of adding extracted protocol rules.
|
|
261
|
+
*/
|
|
262
|
+
async function measureDiscoveryImpact(extractedRules) {
|
|
263
|
+
// Baseline: current hand-written rules
|
|
264
|
+
const baselineAttr = await (0, evaluation_campaign_1.runFailureAttribution)();
|
|
265
|
+
const baselineBudget = (0, evaluation_campaign_1.computeErrorBudget)(baselineAttr);
|
|
266
|
+
const baselineDiscovery = (0, discovery_analytics_1.computeDiscoveryMetrics)(baselineAttr);
|
|
267
|
+
// Note: full integration requires running suggestAlternatives with merged rules
|
|
268
|
+
// For now, compare rule coverage
|
|
269
|
+
const defs = (0, protocol_coverage_1.loadDefaultProtocolDefinitions)();
|
|
270
|
+
const handWrittenFns = new Set();
|
|
271
|
+
for (const p of defs)
|
|
272
|
+
for (const fn of p.rules.keys())
|
|
273
|
+
handWrittenFns.add(fn);
|
|
274
|
+
const newFns = [...extractedRules.keys()].filter(fn => !handWrittenFns.has(fn));
|
|
275
|
+
return {
|
|
276
|
+
baseline: {
|
|
277
|
+
discoveryRate: baselineDiscovery.overall,
|
|
278
|
+
top3Rate: baselineBudget.successRate,
|
|
279
|
+
missingCandidate: baselineBudget.percentages.missing_candidate || 0,
|
|
280
|
+
},
|
|
281
|
+
rulesAdded: newFns.length,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function printFoundationReport(result, impact) {
|
|
285
|
+
console.log("\n╔════════════════════════════════════════════════════╗");
|
|
286
|
+
console.log("║ P6.0 Protocol Foundation Model ║");
|
|
287
|
+
console.log("╚════════════════════════════════════════════════════╝\n");
|
|
288
|
+
console.log(`Protocol: ${result.protocol}`);
|
|
289
|
+
console.log(`Source Files: ${result.sourceFiles.length}`);
|
|
290
|
+
console.log(`Call Pairs: ${result.totalPairs}`);
|
|
291
|
+
console.log(`Rules Extracted: ${result.rules.length}`);
|
|
292
|
+
console.log(`States Inferred: ${result.states.length}`);
|
|
293
|
+
console.log(`Avg Confidence: ${(result.avgConfidence * 100).toFixed(0)}%`);
|
|
294
|
+
console.log(`Hand-written Overlap: ${result.handWrittenOverlap} functions`);
|
|
295
|
+
console.log(`Novel Rules: ${result.novelRulesCount}`);
|
|
296
|
+
console.log();
|
|
297
|
+
if (result.rules.length > 0) {
|
|
298
|
+
console.log("─── Top Extracted Rules ───");
|
|
299
|
+
console.log("Conf Domain Function Pre → Post Inv");
|
|
300
|
+
console.log("────────────────────────────────────────────────────────────────────");
|
|
301
|
+
for (const r of result.rules.slice(0, 15)) {
|
|
302
|
+
const conf = (r.confidence * 100).toFixed(0).padStart(4);
|
|
303
|
+
const dom = r.domain.padEnd(8);
|
|
304
|
+
const fn = r.function.padEnd(22);
|
|
305
|
+
const pre = `[${r.pre_states.join(",") || "none"}]`.padEnd(22);
|
|
306
|
+
const post = `[${r.post_states.join(",") || "none"}]`.padEnd(22);
|
|
307
|
+
const inv = r.invalidate ? `[${r.invalidate.join(",")}]` : "—";
|
|
308
|
+
console.log(` ${conf}% ${dom} ${fn} ${pre} → ${post} ${inv}`);
|
|
309
|
+
}
|
|
310
|
+
console.log();
|
|
311
|
+
}
|
|
312
|
+
if (impact) {
|
|
313
|
+
console.log("─── Discovery Impact ───");
|
|
314
|
+
console.log(` Baseline Discovery: ${(impact.baseline.discoveryRate * 100).toFixed(0)}%`);
|
|
315
|
+
console.log(` Baseline Missing Cand: ${(impact.baseline.missingCandidate * 100).toFixed(0)}%`);
|
|
316
|
+
console.log(` New Rules Added: ${impact.rulesAdded}`);
|
|
317
|
+
if (impact.rulesAdded > 0) {
|
|
318
|
+
console.log(` → Potential discovery improvement from ${impact.rulesAdded} new protocol functions`);
|
|
319
|
+
}
|
|
320
|
+
console.log();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P6.0: Protocol Foundation Model Tests
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const vitest_1 = require("vitest");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const protocol_foundation_1 = require("./protocol-foundation");
|
|
43
|
+
const protocol_extractor_1 = require("./protocol-extractor");
|
|
44
|
+
const FOUND_DIR = path.resolve(__dirname, "..", "test-protocol-foundation");
|
|
45
|
+
fs.mkdirSync(FOUND_DIR, { recursive: true });
|
|
46
|
+
function createTestRepo() {
|
|
47
|
+
const srcDir = path.join(FOUND_DIR, "src");
|
|
48
|
+
fs.mkdirSync(srcDir, { recursive: true });
|
|
49
|
+
// File protocol pattern
|
|
50
|
+
fs.writeFileSync(path.join(srcDir, "file_ops.c"), `
|
|
51
|
+
void read_config(const char* path) {
|
|
52
|
+
FILE* f = fopen(path, "r");
|
|
53
|
+
char buf[1024];
|
|
54
|
+
fread(buf, 1, 1024, f);
|
|
55
|
+
fclose(f);
|
|
56
|
+
}
|
|
57
|
+
void write_config(const char* path, const char* data) {
|
|
58
|
+
FILE* f = fopen(path, "w");
|
|
59
|
+
fwrite(data, 1, strlen(data), f);
|
|
60
|
+
fflush(f);
|
|
61
|
+
fclose(f);
|
|
62
|
+
}
|
|
63
|
+
`);
|
|
64
|
+
// DB protocol pattern
|
|
65
|
+
fs.writeFileSync(path.join(srcDir, "db_ops.js"), `
|
|
66
|
+
function queryUsers() {
|
|
67
|
+
const db = db_connect("localhost");
|
|
68
|
+
const rows = db_query(db, "SELECT * FROM users");
|
|
69
|
+
db_disconnect(db);
|
|
70
|
+
}
|
|
71
|
+
function insertLog(msg) {
|
|
72
|
+
const db = db_connect("localhost");
|
|
73
|
+
db_insert(db, "logs", msg);
|
|
74
|
+
db_disconnect(db);
|
|
75
|
+
}
|
|
76
|
+
`);
|
|
77
|
+
// Auth protocol pattern
|
|
78
|
+
fs.writeFileSync(path.join(srcDir, "auth_flow.c"), `
|
|
79
|
+
int authenticate(const char* user, const char* pass) {
|
|
80
|
+
if (!verify_password(user, pass)) return 0;
|
|
81
|
+
char* token = generate_jwt(user);
|
|
82
|
+
session_t* sess = create_session(token);
|
|
83
|
+
return sess ? 1 : 0;
|
|
84
|
+
}
|
|
85
|
+
void do_logout(session_t* sess) {
|
|
86
|
+
logout(sess);
|
|
87
|
+
}
|
|
88
|
+
`);
|
|
89
|
+
return FOUND_DIR;
|
|
90
|
+
}
|
|
91
|
+
(0, vitest_1.describe)("Protocol Foundation Model", () => {
|
|
92
|
+
createTestRepo();
|
|
93
|
+
(0, vitest_1.it)("infers intelligent state names", () => {
|
|
94
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("fopen", "post")).toBe("FILE_OPEN");
|
|
95
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("fclose", "invalidate")).toBe("FILE_CLOSED");
|
|
96
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("db_connect", "post")).toBe("DB_CONNECTED");
|
|
97
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("verify_password", "post")).toBe("AUTH_VERIFIED");
|
|
98
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("generate_jwt", "post")).toBe("AUTH_ISSUED");
|
|
99
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("create_session", "post")).toBe("AUTH_CREATED");
|
|
100
|
+
(0, vitest_1.expect)((0, protocol_foundation_1.inferStateName)("logout", "invalidate")).toBe("AUTH_UNAUTHENTICATED");
|
|
101
|
+
});
|
|
102
|
+
(0, vitest_1.it)("infers enhanced rules with domain-specific states", () => {
|
|
103
|
+
const code = `
|
|
104
|
+
FILE* f = fopen("x", "r");
|
|
105
|
+
fread(buf, 1, 1024, f);
|
|
106
|
+
fclose(f);
|
|
107
|
+
|
|
108
|
+
DB* db = db_connect("localhost");
|
|
109
|
+
db_query(db, "SELECT 1");
|
|
110
|
+
db_disconnect(db);
|
|
111
|
+
`;
|
|
112
|
+
const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
|
|
113
|
+
const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
|
|
114
|
+
(0, vitest_1.expect)(rules.length).toBeGreaterThan(0);
|
|
115
|
+
// fopen should produce FILE_OPEN
|
|
116
|
+
const fopen = rules.find(r => r.function === "fopen");
|
|
117
|
+
(0, vitest_1.expect)(fopen).toBeDefined();
|
|
118
|
+
(0, vitest_1.expect)(fopen.domain).toBe("FILE");
|
|
119
|
+
(0, vitest_1.expect)(fopen.post_states).toContain("FILE_OPEN");
|
|
120
|
+
// fclose should invalidate FILE_OPEN
|
|
121
|
+
const fclose = rules.find(r => r.function === "fclose");
|
|
122
|
+
(0, vitest_1.expect)(fclose).toBeDefined();
|
|
123
|
+
(0, vitest_1.expect)(fclose.invalidate).toBeDefined();
|
|
124
|
+
// db_connect should produce DB_CONNECTED
|
|
125
|
+
const dbConn = rules.find(r => r.function === "db_connect");
|
|
126
|
+
(0, vitest_1.expect)(dbConn).toBeDefined();
|
|
127
|
+
(0, vitest_1.expect)(dbConn.domain).toBe("DB");
|
|
128
|
+
});
|
|
129
|
+
(0, vitest_1.it)("extracts protocol foundation from test repository", () => {
|
|
130
|
+
const result = (0, protocol_foundation_1.extractProtocolFoundation)(FOUND_DIR, "TestFoundation", 20, 1);
|
|
131
|
+
(0, vitest_1.expect)(result.rules.length).toBeGreaterThan(0);
|
|
132
|
+
(0, vitest_1.expect)(result.states.length).toBeGreaterThan(0);
|
|
133
|
+
(0, vitest_1.expect)(result.totalPairs).toBeGreaterThan(0);
|
|
134
|
+
(0, vitest_1.expect)(result.avgConfidence).toBeGreaterThan(0);
|
|
135
|
+
// Should have FILE states
|
|
136
|
+
(0, vitest_1.expect)(result.states.some(s => s.includes("FILE"))).toBe(true);
|
|
137
|
+
// Should have DB states
|
|
138
|
+
(0, vitest_1.expect)(result.states.some(s => s.includes("DB"))).toBe(true);
|
|
139
|
+
// Hand-written overlap: fopen/fread/fwrite/fclose match ground truth
|
|
140
|
+
(0, vitest_1.expect)(result.handWrittenOverlap).toBeGreaterThanOrEqual(2);
|
|
141
|
+
(0, protocol_foundation_1.printFoundationReport)(result);
|
|
142
|
+
});
|
|
143
|
+
(0, vitest_1.it)("converts enhanced rules to SSG-compatible map", () => {
|
|
144
|
+
const code = `FILE* f = fopen("x", "r"); fclose(f);`;
|
|
145
|
+
const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
|
|
146
|
+
const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
|
|
147
|
+
const map = (0, protocol_foundation_1.enhancedRulesToMap)(rules);
|
|
148
|
+
(0, vitest_1.expect)(map.size).toBeGreaterThan(0);
|
|
149
|
+
const fopenRule = map.get("fopen");
|
|
150
|
+
(0, vitest_1.expect)(fopenRule).toBeDefined();
|
|
151
|
+
(0, vitest_1.expect)(fopenRule.post_states.length).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.it)("measures discovery impact of extracted rules", async () => {
|
|
154
|
+
const code = `FILE* f = fopen("x", "r"); fclose(f);`;
|
|
155
|
+
const pairs = (0, protocol_extractor_1.extractCallPairs)(code);
|
|
156
|
+
const rules = (0, protocol_foundation_1.inferEnhancedRules)(pairs, 1);
|
|
157
|
+
const map = (0, protocol_foundation_1.enhancedRulesToMap)(rules);
|
|
158
|
+
const impact = await (0, protocol_foundation_1.measureDiscoveryImpact)(map);
|
|
159
|
+
(0, vitest_1.expect)(impact.baseline.discoveryRate).toBeGreaterThanOrEqual(0);
|
|
160
|
+
(0, vitest_1.expect)(impact.rulesAdded).toBeGreaterThanOrEqual(0);
|
|
161
|
+
(0, protocol_foundation_1.printFoundationReport)({ protocol: "test", rules, states: [], sourceFiles: [], totalPairs: pairs.length, avgConfidence: 1, handWrittenOverlap: 1, novelRulesCount: impact.rulesAdded }, impact);
|
|
162
|
+
}, 30000);
|
|
163
|
+
});
|