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,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 1 D3/D4: Coverage-Based Confidence Calculator
|
|
4
|
+
*
|
|
5
|
+
* Replaces qualitative Confidence labels (HIGH/MEDIUM/LOW/UNCERTAIN) with
|
|
6
|
+
* computed Confidence = Σ weight(ns) × Coverage(ns).
|
|
7
|
+
*
|
|
8
|
+
* Two-factor model: Coverage(ns) = has_vocabulary(ns) × density_factor(ns)
|
|
9
|
+
*
|
|
10
|
+
* Integrates with: trajectory corpus data, protocols.json transition space,
|
|
11
|
+
* and project-level protocol usage analysis.
|
|
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
|
+
exports.computeCoverageConfidence = computeCoverageConfidence;
|
|
48
|
+
exports.clearConfidenceCache = clearConfidenceCache;
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
// ── Constants (from Phase 1 empirical data) ──
|
|
52
|
+
/** Empirical saturation threshold: ~5 trajectories per transition */
|
|
53
|
+
const SATURATION_THRESHOLD = 5;
|
|
54
|
+
/** Confidence level thresholds */
|
|
55
|
+
const HIGH_THRESHOLD = 70;
|
|
56
|
+
const MEDIUM_THRESHOLD = 40;
|
|
57
|
+
let _cachedTransitionSpace = null;
|
|
58
|
+
function loadTransitionSpace(projectPath) {
|
|
59
|
+
if (_cachedTransitionSpace)
|
|
60
|
+
return _cachedTransitionSpace;
|
|
61
|
+
const protoPath = path.join(projectPath, "protocols.json");
|
|
62
|
+
if (!fs.existsSync(protoPath)) {
|
|
63
|
+
_cachedTransitionSpace = { totalTransitions: 0, perNamespace: new Map() };
|
|
64
|
+
return _cachedTransitionSpace;
|
|
65
|
+
}
|
|
66
|
+
const proto = JSON.parse(fs.readFileSync(protoPath, "utf-8"));
|
|
67
|
+
const rules = proto.rules || {};
|
|
68
|
+
const allTransitions = new Set();
|
|
69
|
+
const perNamespaceTransitions = new Map();
|
|
70
|
+
for (const [, rule] of Object.entries(rules)) {
|
|
71
|
+
const ns = rule.namespace || "_global";
|
|
72
|
+
if (!perNamespaceTransitions.has(ns)) {
|
|
73
|
+
perNamespaceTransitions.set(ns, new Set());
|
|
74
|
+
}
|
|
75
|
+
const nsSet = perNamespaceTransitions.get(ns);
|
|
76
|
+
for (const pre of rule.pre_states || []) {
|
|
77
|
+
for (const post of rule.post_states || []) {
|
|
78
|
+
const key = `${ns}::${pre}::${post}`;
|
|
79
|
+
allTransitions.add(key);
|
|
80
|
+
nsSet.add(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const perNamespace = new Map();
|
|
85
|
+
for (const [ns, trans] of perNamespaceTransitions) {
|
|
86
|
+
perNamespace.set(ns, trans.size);
|
|
87
|
+
}
|
|
88
|
+
_cachedTransitionSpace = {
|
|
89
|
+
totalTransitions: allTransitions.size,
|
|
90
|
+
perNamespace,
|
|
91
|
+
};
|
|
92
|
+
return _cachedTransitionSpace;
|
|
93
|
+
}
|
|
94
|
+
let _cachedCoverage = null;
|
|
95
|
+
function loadTrajectoryCoverage(projectPath) {
|
|
96
|
+
if (_cachedCoverage)
|
|
97
|
+
return _cachedCoverage;
|
|
98
|
+
const protoPath = path.join(projectPath, "protocols.json");
|
|
99
|
+
if (!fs.existsSync(protoPath)) {
|
|
100
|
+
_cachedCoverage = { coveredTransitions: new Set(), trajectoryCounts: new Map() };
|
|
101
|
+
return _cachedCoverage;
|
|
102
|
+
}
|
|
103
|
+
const proto = JSON.parse(fs.readFileSync(protoPath, "utf-8"));
|
|
104
|
+
const rules = proto.rules || {};
|
|
105
|
+
// Build rule → transitions map (consistent key format: ns::pre::post)
|
|
106
|
+
const ruleTransitions = {};
|
|
107
|
+
for (const [rname, rule] of Object.entries(rules)) {
|
|
108
|
+
const ns = rule.namespace || "_global";
|
|
109
|
+
ruleTransitions[rname] = [];
|
|
110
|
+
for (const pre of rule.pre_states || []) {
|
|
111
|
+
for (const post of rule.post_states || []) {
|
|
112
|
+
ruleTransitions[rname].push({ ns, key: `${ns}::${pre}::${post}` });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const coveredTransitions = new Set();
|
|
117
|
+
const trajectoryCounts = new Map();
|
|
118
|
+
// Scan trajectory corpus
|
|
119
|
+
const corpusDir = path.join(projectPath, ".progmune_corpus", "trajectories");
|
|
120
|
+
if (!fs.existsSync(corpusDir)) {
|
|
121
|
+
_cachedCoverage = { coveredTransitions, trajectoryCounts };
|
|
122
|
+
return _cachedCoverage;
|
|
123
|
+
}
|
|
124
|
+
for (const dateDir of fs.readdirSync(corpusDir)) {
|
|
125
|
+
const dpath = path.join(corpusDir, dateDir);
|
|
126
|
+
if (!fs.statSync(dpath).isDirectory())
|
|
127
|
+
continue;
|
|
128
|
+
for (const f of fs.readdirSync(dpath)) {
|
|
129
|
+
if (!f.endsWith(".json"))
|
|
130
|
+
continue;
|
|
131
|
+
try {
|
|
132
|
+
const traj = JSON.parse(fs.readFileSync(path.join(dpath, f), "utf-8"));
|
|
133
|
+
const trajNs = new Set();
|
|
134
|
+
for (const step of traj.trajectory || []) {
|
|
135
|
+
if (step in ruleTransitions) {
|
|
136
|
+
for (const { ns, key } of ruleTransitions[step]) {
|
|
137
|
+
coveredTransitions.add(key);
|
|
138
|
+
trajNs.add(ns);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// One trajectory can count for multiple namespaces
|
|
143
|
+
for (const ns of trajNs) {
|
|
144
|
+
trajectoryCounts.set(ns, (trajectoryCounts.get(ns) || 0) + 1);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// skip malformed files
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
_cachedCoverage = { coveredTransitions, trajectoryCounts };
|
|
153
|
+
return _cachedCoverage;
|
|
154
|
+
}
|
|
155
|
+
// ── Per-Namespace Confidence ──
|
|
156
|
+
function computeNamespaceConfidence(ns, totalTransitions, coveredCount, trajectoryCount) {
|
|
157
|
+
const hasVocab = coveredCount > 0;
|
|
158
|
+
const densityFactor = totalTransitions > 0
|
|
159
|
+
? Math.min(1, trajectoryCount / (SATURATION_THRESHOLD * totalTransitions))
|
|
160
|
+
: 0;
|
|
161
|
+
const coverage = totalTransitions > 0 ? coveredCount / totalTransitions : 0;
|
|
162
|
+
let status;
|
|
163
|
+
if (!hasVocab) {
|
|
164
|
+
status = "no_vocabulary";
|
|
165
|
+
}
|
|
166
|
+
else if (densityFactor >= 0.8) {
|
|
167
|
+
status = "saturated";
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
status = "partial";
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
namespace: ns,
|
|
174
|
+
coverage: Math.round(coverage * 1000) / 1000,
|
|
175
|
+
transitionsCovered: coveredCount,
|
|
176
|
+
transitionsTotal: totalTransitions,
|
|
177
|
+
trajectoryDensity: Math.round(densityFactor * 100) / 100,
|
|
178
|
+
status,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// ── Project-Level Confidence ──
|
|
182
|
+
/**
|
|
183
|
+
* Estimate namespace usage weights for a project.
|
|
184
|
+
*
|
|
185
|
+
* Currently uses a heuristic based on file extensions and directory structure.
|
|
186
|
+
* Future: parse IR function calls to determine actual protocol usage.
|
|
187
|
+
*/
|
|
188
|
+
function estimateProjectWeights(projectPath, namespaces) {
|
|
189
|
+
const weights = new Map();
|
|
190
|
+
// Default: equal weight for all namespaces
|
|
191
|
+
// In production, this would analyze the project's function calls
|
|
192
|
+
// to determine which protocols are actually used.
|
|
193
|
+
const defaultWeight = 1.0 / namespaces.length;
|
|
194
|
+
for (const ns of namespaces) {
|
|
195
|
+
weights.set(ns, defaultWeight);
|
|
196
|
+
}
|
|
197
|
+
return weights;
|
|
198
|
+
}
|
|
199
|
+
// ── Main API ──
|
|
200
|
+
/**
|
|
201
|
+
* Compute coverage-based confidence for a project.
|
|
202
|
+
*
|
|
203
|
+
* @param projectPath - Absolute path to the project root (contains protocols.json + .progmune_corpus/)
|
|
204
|
+
* @returns CoverageConfidence with computed score, margin, level, and breakdown
|
|
205
|
+
*/
|
|
206
|
+
function computeCoverageConfidence(projectPath) {
|
|
207
|
+
// 1. Load protocol transition space
|
|
208
|
+
const space = loadTransitionSpace(projectPath);
|
|
209
|
+
const namespaces = [...space.perNamespace.keys()];
|
|
210
|
+
// 2. Load trajectory coverage
|
|
211
|
+
const coverage = loadTrajectoryCoverage(projectPath);
|
|
212
|
+
// 3. Compute per-namespace confidence
|
|
213
|
+
const breakdown = [];
|
|
214
|
+
let weightedSum = 0;
|
|
215
|
+
let totalWeight = 0;
|
|
216
|
+
const weights = estimateProjectWeights(projectPath, namespaces);
|
|
217
|
+
for (const ns of namespaces) {
|
|
218
|
+
const totalTrans = space.perNamespace.get(ns) || 0;
|
|
219
|
+
const coveredCount = [...coverage.coveredTransitions]
|
|
220
|
+
.filter(t => t.startsWith(`${ns}::`)).length;
|
|
221
|
+
const trajCount = coverage.trajectoryCounts.get(ns) || 0;
|
|
222
|
+
const nsCov = computeNamespaceConfidence(ns, totalTrans, coveredCount, trajCount);
|
|
223
|
+
breakdown.push(nsCov);
|
|
224
|
+
const w = weights.get(ns) || 0;
|
|
225
|
+
weightedSum += w * nsCov.coverage;
|
|
226
|
+
totalWeight += w;
|
|
227
|
+
}
|
|
228
|
+
// 4. Normalize score
|
|
229
|
+
const score = totalWeight > 0 ? Math.round((weightedSum / totalWeight) * 100) : 0;
|
|
230
|
+
// 5. Compute margin (simplified: based on proportion of namespaces with trajectory data)
|
|
231
|
+
const nsWithVocab = breakdown.filter(b => b.status !== "no_vocabulary").length;
|
|
232
|
+
const vocabRatio = namespaces.length > 0 ? nsWithVocab / namespaces.length : 0;
|
|
233
|
+
// Margin decreases as more namespaces have vocabulary
|
|
234
|
+
const margin = Math.round((1 - vocabRatio) * 20 + 5); // 5-25% margin
|
|
235
|
+
// 6. Determine level
|
|
236
|
+
let level;
|
|
237
|
+
if (score >= HIGH_THRESHOLD) {
|
|
238
|
+
level = "HIGH";
|
|
239
|
+
}
|
|
240
|
+
else if (score >= MEDIUM_THRESHOLD) {
|
|
241
|
+
level = "MEDIUM";
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
level = "LOW";
|
|
245
|
+
}
|
|
246
|
+
// 7. Build summary
|
|
247
|
+
const saturated = breakdown.filter(b => b.status === "saturated").length;
|
|
248
|
+
const partial = breakdown.filter(b => b.status === "partial").length;
|
|
249
|
+
const noVocab = breakdown.filter(b => b.status === "no_vocabulary").length;
|
|
250
|
+
const summary = `Weighted coverage: ${score}% ±${margin}%. ` +
|
|
251
|
+
`${saturated} namespaces saturated, ${partial} partial, ${noVocab} no vocabulary. ` +
|
|
252
|
+
(noVocab > 0 ? `Top gap: add trajectories for ${noVocab} uncovered namespaces.` : "");
|
|
253
|
+
return { score, margin, level, breakdown, summary };
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Clear internal caches (for testing or when corpus is updated).
|
|
257
|
+
*/
|
|
258
|
+
function clearConfidenceCache() {
|
|
259
|
+
_cachedTransitionSpace = null;
|
|
260
|
+
_cachedCoverage = null;
|
|
261
|
+
}
|