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,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P6.3: Unsupervised Physics Discovery Tests
|
|
4
|
+
*
|
|
5
|
+
* Verifying: does structural clustering discover Acquire/Release
|
|
6
|
+
* patterns WITHOUT any keyword matching or function names?
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const vitest_1 = require("vitest");
|
|
10
|
+
const unsupervised_physics_1 = require("./experimental/unsupervised-physics");
|
|
11
|
+
(0, vitest_1.describe)("Structural Fingerprint (no function names)", () => {
|
|
12
|
+
(0, vitest_1.it)("assigns phase 0/1/2 based on position only", () => {
|
|
13
|
+
const fp0 = (0, unsupervised_physics_1.fingerprint)("fopen", 0, ["fopen", "fread", "fclose"]);
|
|
14
|
+
(0, vitest_1.expect)(fp0.phase).toBe(0);
|
|
15
|
+
(0, vitest_1.expect)(fp0.isFirst).toBe(true);
|
|
16
|
+
(0, vitest_1.expect)(fp0.isLast).toBe(false);
|
|
17
|
+
const fp1 = (0, unsupervised_physics_1.fingerprint)("fread", 1, ["fopen", "fread", "fclose"]);
|
|
18
|
+
(0, vitest_1.expect)(fp1.phase).toBe(1);
|
|
19
|
+
const fp2 = (0, unsupervised_physics_1.fingerprint)("fclose", 2, ["fopen", "fread", "fclose"]);
|
|
20
|
+
(0, vitest_1.expect)(fp2.phase).toBe(2);
|
|
21
|
+
(0, vitest_1.expect)(fp2.isLast).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)("detects closed loops (first and last appear only once)", () => {
|
|
24
|
+
const fp = (0, unsupervised_physics_1.fingerprint)("fopen", 0, ["fopen", "fread", "fclose"]);
|
|
25
|
+
// The SEQUENCE [fopen, fread, fclose] is a closed loop
|
|
26
|
+
// because fopen and fclose each appear once
|
|
27
|
+
(0, vitest_1.expect)(fp.isClosedLoop).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)("does NOT consider repeated functions as closed loops", () => {
|
|
30
|
+
const fp = (0, unsupervised_physics_1.fingerprint)("fread", 0, ["fread", "fread", "fread"]);
|
|
31
|
+
(0, vitest_1.expect)(fp.isClosedLoop).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.describe)("Unsupervised Clustering", () => {
|
|
35
|
+
(0, vitest_1.it)("groups sequences by structure, not by name", () => {
|
|
36
|
+
// [A,B,C] and [X,Y,Z] should cluster together — same structure (length=3, closed loop)
|
|
37
|
+
const seqs = [
|
|
38
|
+
["fopen", "fread", "fclose"],
|
|
39
|
+
["sqlite3_open", "sqlite3_exec", "sqlite3_close"],
|
|
40
|
+
["DB_Open", "DB_Get", "DB_Close"],
|
|
41
|
+
["PQconnectdb", "PQexec", "PQfinish"],
|
|
42
|
+
["ngx_accept", "ngx_process", "ngx_close"],
|
|
43
|
+
];
|
|
44
|
+
const clusters = (0, unsupervised_physics_1.clusterByStructure)(seqs);
|
|
45
|
+
(0, vitest_1.expect)(clusters.length).toBeGreaterThan(0);
|
|
46
|
+
// All 5 sequences have length=3 and are closed-loop → same cluster
|
|
47
|
+
const mainCluster = clusters.find(c => c.avgLength === 3 && c.closedLoopRate === 1);
|
|
48
|
+
(0, vitest_1.expect)(mainCluster).toBeDefined();
|
|
49
|
+
(0, vitest_1.expect)(mainCluster.sequences.length).toBe(5);
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)("separates Acquire-Release from Lock-Unlock by length", () => {
|
|
52
|
+
const seqs = [
|
|
53
|
+
["open", "read", "close"], // len=3, closed → Acquire
|
|
54
|
+
["connect", "query", "disconnect"], // len=3, closed → Acquire
|
|
55
|
+
["lock", "unlock"], // len=2, closed → Lock
|
|
56
|
+
["mutex_lock", "mutex_unlock"], // len=2, closed → Lock
|
|
57
|
+
];
|
|
58
|
+
const clusters = (0, unsupervised_physics_1.clusterByStructure)(seqs);
|
|
59
|
+
(0, vitest_1.expect)(clusters.length).toBeGreaterThanOrEqual(2);
|
|
60
|
+
const acquireCluster = clusters.find(c => c.avgLength === 3);
|
|
61
|
+
(0, vitest_1.expect)(acquireCluster).toBeDefined();
|
|
62
|
+
(0, vitest_1.expect)(acquireCluster.inferredPattern).toBe("RESOURCE_ACQUIRE");
|
|
63
|
+
const lockCluster = clusters.find(c => c.avgLength === 2);
|
|
64
|
+
(0, vitest_1.expect)(lockCluster).toBeDefined();
|
|
65
|
+
(0, vitest_1.expect)(lockCluster.inferredPattern).toBe("LOCK_ACQUIRE");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.describe)("Unsupervised Discovery Evaluation", () => {
|
|
69
|
+
(0, vitest_1.it)("discovers physics patterns across all repos", () => {
|
|
70
|
+
const allSeqs = [];
|
|
71
|
+
for (const seqs of Object.values(unsupervised_physics_1.CROSS_REPO_SEQUENCES)) {
|
|
72
|
+
allSeqs.push(...seqs);
|
|
73
|
+
}
|
|
74
|
+
const eval_ = (0, unsupervised_physics_1.evaluateUnsupervisedDiscovery)(allSeqs);
|
|
75
|
+
(0, vitest_1.expect)(eval_.totalSequences).toBeGreaterThanOrEqual(10);
|
|
76
|
+
(0, vitest_1.expect)(eval_.clusters.length).toBeGreaterThan(0);
|
|
77
|
+
(0, vitest_1.expect)(eval_.sequenceCoverage).toBeGreaterThan(0.5);
|
|
78
|
+
(0, vitest_1.expect)(eval_.emergent).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.it)("each repo independently shows emergent physics", () => {
|
|
81
|
+
for (const [repo, seqs] of Object.entries(unsupervised_physics_1.CROSS_REPO_SEQUENCES)) {
|
|
82
|
+
const eval_ = (0, unsupervised_physics_1.evaluateUnsupervisedDiscovery)(seqs);
|
|
83
|
+
// Each repo has at least one Acquire-Use-Release sequence
|
|
84
|
+
(0, vitest_1.expect)(eval_.sequenceCoverage).toBeGreaterThan(0);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("full unsupervised report", () => {
|
|
88
|
+
const report = (0, unsupervised_physics_1.runUnsupervisedDiscovery)();
|
|
89
|
+
(0, vitest_1.expect)(report.perRepo).toBeDefined();
|
|
90
|
+
(0, vitest_1.expect)(report.allSequences.clusters.length).toBeGreaterThan(0);
|
|
91
|
+
// At minimum, the 3-element closed-loop cluster should emerge
|
|
92
|
+
(0, vitest_1.expect)(report.emergent).toBe(true);
|
|
93
|
+
(0, unsupervised_physics_1.printUnsupervisedReport)(report);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Unit tests for utility functions and pure-logic modules.
|
|
5
|
+
* Demonstrates the Vitest pattern for Progmune.
|
|
6
|
+
*/
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
// ── jaccardSimilarity ──
|
|
10
|
+
(0, vitest_1.describe)("jaccardSimilarity", () => {
|
|
11
|
+
(0, vitest_1.it)("returns 1 for identical strings", () => {
|
|
12
|
+
(0, vitest_1.expect)((0, utils_1.jaccardSimilarity)("hello", "hello")).toBeCloseTo(1, 1);
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)("returns 0 for strings with no common characters", () => {
|
|
15
|
+
(0, vitest_1.expect)((0, utils_1.jaccardSimilarity)("abc", "xyz")).toBe(0);
|
|
16
|
+
});
|
|
17
|
+
(0, vitest_1.it)("returns a value between 0 and 1 for partially overlapping strings", () => {
|
|
18
|
+
const score = (0, utils_1.jaccardSimilarity)("loginUser", "userLogin");
|
|
19
|
+
(0, vitest_1.expect)(score).toBeGreaterThan(0);
|
|
20
|
+
(0, vitest_1.expect)(score).toBeLessThanOrEqual(1);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
// ── extractKeywords ──
|
|
24
|
+
(0, vitest_1.describe)("extractKeywords", () => {
|
|
25
|
+
(0, vitest_1.it)("extracts Chinese words", () => {
|
|
26
|
+
const kw = (0, utils_1.extractKeywords)("验证用户密码并生成JWT令牌");
|
|
27
|
+
(0, vitest_1.expect)(kw.some(k => k.includes("验证") || k.includes("用户"))).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)("extracts English words and camelCase tokens", () => {
|
|
30
|
+
const kw = (0, utils_1.extractKeywords)("authenticate user and generateToken");
|
|
31
|
+
(0, vitest_1.expect)(kw.some(k => k.toLowerCase().includes("authenticate"))).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)("returns non-empty array for any input", () => {
|
|
34
|
+
const kw = (0, utils_1.extractKeywords)("hello world");
|
|
35
|
+
(0, vitest_1.expect)(kw.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
});
|
package/dist/validator.js
CHANGED
|
@@ -35,15 +35,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.validateAction = validateAction;
|
|
37
37
|
exports.validateActionSequence = validateActionSequence;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const raw = JSON.parse(fs.readFileSync(irPath, "utf-8"));
|
|
45
|
-
return Array.isArray(raw) ? raw : (raw.functions || []);
|
|
46
|
-
}
|
|
38
|
+
exports.validateActionResult = validateActionResult;
|
|
39
|
+
exports.validateWithGoal = validateWithGoal;
|
|
40
|
+
exports.validateWithRepair = validateWithRepair;
|
|
41
|
+
const ir_utils_1 = require("./ir-utils");
|
|
42
|
+
const runtime_types_1 = require("./runtime-types");
|
|
43
|
+
const failure_corpus_1 = require("./failure-corpus");
|
|
47
44
|
const BUILTIN_WHITELIST = new Set([
|
|
48
45
|
"console.log", "setTimeout", "setInterval", "clearTimeout",
|
|
49
46
|
"JSON.stringify", "JSON.parse", "fetch"
|
|
@@ -152,7 +149,7 @@ function checkVariableFlow(actions) {
|
|
|
152
149
|
*/
|
|
153
150
|
/** @requires ACTION @produces VALIDATION_RESULT */
|
|
154
151
|
function validateAction(action, actionIndex) {
|
|
155
|
-
const functions = loadIR();
|
|
152
|
+
const functions = (0, ir_utils_1.loadIR)();
|
|
156
153
|
const errors = [];
|
|
157
154
|
const violations = [];
|
|
158
155
|
const idx = actionIndex ?? 0;
|
|
@@ -250,5 +247,185 @@ function validateActionSequence(actions) {
|
|
|
250
247
|
}
|
|
251
248
|
}
|
|
252
249
|
}
|
|
250
|
+
// ── P0: Trajectory auto-collection — record ALL outcomes ──
|
|
251
|
+
const actionNames = actions.map(a => a.function || a.kind || "?");
|
|
252
|
+
const ctx = {
|
|
253
|
+
nestingDepth: 0,
|
|
254
|
+
exceptionHandled: false,
|
|
255
|
+
insideLoop: false,
|
|
256
|
+
branchCount: 0,
|
|
257
|
+
asyncContext: false,
|
|
258
|
+
};
|
|
259
|
+
if (violations.length > 0) {
|
|
260
|
+
// Record violation trajectories
|
|
261
|
+
for (const v of violations) {
|
|
262
|
+
try {
|
|
263
|
+
(0, failure_corpus_1.recordTrajectory)({
|
|
264
|
+
protocol: v.namespace || "default",
|
|
265
|
+
initialState: v.currentStates || [],
|
|
266
|
+
finalState: v.requiredStates || [],
|
|
267
|
+
trajectory: actionNames,
|
|
268
|
+
result: "violation",
|
|
269
|
+
violationType: svlToViolationType(v.svl, v.description),
|
|
270
|
+
violationDesc: v.description,
|
|
271
|
+
failingStepIndex: v.actionIndex,
|
|
272
|
+
fixPath: v.fixPath,
|
|
273
|
+
context: ctx,
|
|
274
|
+
successRate: 0,
|
|
275
|
+
intent: v.description,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch { /* auto-collection must never crash validation */ }
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Record success trajectory — positive sample for reward learning
|
|
283
|
+
try {
|
|
284
|
+
(0, failure_corpus_1.recordSuccess)({
|
|
285
|
+
protocol: "default",
|
|
286
|
+
initialState: ["INIT"],
|
|
287
|
+
finalState: ["COMPLETED"],
|
|
288
|
+
trajectory: actionNames,
|
|
289
|
+
context: ctx,
|
|
290
|
+
source: "planner",
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
catch { /* auto-collection must never crash validation */ }
|
|
294
|
+
}
|
|
253
295
|
return { valid: errors.length === 0, errors, violations };
|
|
254
296
|
}
|
|
297
|
+
/** Map SVL level to ViolationType for auto-collection. */
|
|
298
|
+
function svlToViolationType(svl, desc) {
|
|
299
|
+
if (svl === 4)
|
|
300
|
+
return "protocol_violation";
|
|
301
|
+
if (svl === 1)
|
|
302
|
+
return "undefined_variable";
|
|
303
|
+
if (desc.includes("type"))
|
|
304
|
+
return "wrong_arg_type";
|
|
305
|
+
if (desc.includes("import") || desc.includes("module"))
|
|
306
|
+
return "wrong_import_path";
|
|
307
|
+
if (desc.includes("arg") || desc.includes("parameter"))
|
|
308
|
+
return "wrong_arg_count";
|
|
309
|
+
return "other";
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Result-typed variant of validateActionSequence.
|
|
313
|
+
* Returns Ok<Action[]> on success, Err<ValidationError[]> on failure.
|
|
314
|
+
* Use this for new code; the legacy {valid, errors} API remains for backward compat.
|
|
315
|
+
*/
|
|
316
|
+
function validateActionResult(actions) {
|
|
317
|
+
const legacy = validateActionSequence(actions);
|
|
318
|
+
if (legacy.valid)
|
|
319
|
+
return (0, runtime_types_1.ok)(actions);
|
|
320
|
+
const mapped = legacy.errors.map((msg, i) => {
|
|
321
|
+
const v = legacy.violations[i];
|
|
322
|
+
return {
|
|
323
|
+
message: msg,
|
|
324
|
+
code: v?.violatedConstraint || "unknown",
|
|
325
|
+
index: v?.actionIndex,
|
|
326
|
+
};
|
|
327
|
+
});
|
|
328
|
+
return (0, runtime_types_1.err)(mapped);
|
|
329
|
+
}
|
|
330
|
+
// ═══════════════════════════════════════════════════════════════
|
|
331
|
+
// P1: Validation with Goal Skeleton annotation
|
|
332
|
+
// ═══════════════════════════════════════════════════════════════
|
|
333
|
+
/**
|
|
334
|
+
* Validate actions with an associated goal. The goal is annotated asynchronously
|
|
335
|
+
* (best-effort, non-blocking) and attached to the trajectory record.
|
|
336
|
+
*
|
|
337
|
+
* This is the P1 entry point — use this when the user provides a natural language goal.
|
|
338
|
+
*/
|
|
339
|
+
async function validateWithGoal(actions, goalText, params) {
|
|
340
|
+
// Run validation first (never block on goal annotation)
|
|
341
|
+
const result = validateActionSequence(actions);
|
|
342
|
+
// Fire-and-forget: annotate the goal and write trajectory with goal attached
|
|
343
|
+
const { annotateGoal } = await Promise.resolve().then(() => __importStar(require("./goal-annotator")));
|
|
344
|
+
const actionNames = actions.map(a => a.function || a.kind || "?");
|
|
345
|
+
const ctx = {
|
|
346
|
+
nestingDepth: 0, exceptionHandled: false, insideLoop: false, branchCount: 0, asyncContext: false,
|
|
347
|
+
};
|
|
348
|
+
annotateGoal(goalText).then(goalRecord => {
|
|
349
|
+
const { recordTrajectory } = require("./failure-corpus");
|
|
350
|
+
if (result.valid) {
|
|
351
|
+
recordTrajectory({
|
|
352
|
+
protocol: goalRecord.protocol,
|
|
353
|
+
initialState: [goalRecord.initial_state],
|
|
354
|
+
finalState: [goalRecord.target_state],
|
|
355
|
+
trajectory: actionNames,
|
|
356
|
+
result: "success",
|
|
357
|
+
context: ctx,
|
|
358
|
+
source: "llm",
|
|
359
|
+
intent: goalText,
|
|
360
|
+
goal: goalRecord,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
for (const v of result.violations) {
|
|
365
|
+
recordTrajectory({
|
|
366
|
+
protocol: goalRecord.protocol,
|
|
367
|
+
initialState: [goalRecord.initial_state],
|
|
368
|
+
finalState: [goalRecord.target_state],
|
|
369
|
+
trajectory: actionNames,
|
|
370
|
+
result: "violation",
|
|
371
|
+
violationType: svlToViolationType(v.svl, v.description),
|
|
372
|
+
violationDesc: v.description,
|
|
373
|
+
failingStepIndex: v.actionIndex,
|
|
374
|
+
fixPath: v.fixPath,
|
|
375
|
+
context: ctx,
|
|
376
|
+
intent: goalText,
|
|
377
|
+
goal: goalRecord,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}).catch(() => { });
|
|
382
|
+
// Enrich with repair alternatives
|
|
383
|
+
const enriched = await validateWithRepair(actions, params);
|
|
384
|
+
return enriched;
|
|
385
|
+
}
|
|
386
|
+
// ═══════════════════════════════════════════════════════════════
|
|
387
|
+
// P2 V3: Validation with Counterfactual Repair
|
|
388
|
+
// ═══════════════════════════════════════════════════════════════
|
|
389
|
+
/**
|
|
390
|
+
* Validate an action sequence and enrich any violations with
|
|
391
|
+
* counterfactual repair alternatives (top-3).
|
|
392
|
+
*
|
|
393
|
+
* This is the async V3 entry point — use this instead of
|
|
394
|
+
* validateActionSequence when you want repair suggestions.
|
|
395
|
+
*/
|
|
396
|
+
async function validateWithRepair(actions, params) {
|
|
397
|
+
// Run the sync validation first
|
|
398
|
+
const result = validateActionSequence(actions);
|
|
399
|
+
if (result.valid || result.violations.length === 0)
|
|
400
|
+
return result;
|
|
401
|
+
// Enrich each violation with counterfactual alternatives
|
|
402
|
+
const { suggestAlternatives } = await Promise.resolve().then(() => __importStar(require("./counterfactual-engine")));
|
|
403
|
+
const enrichedViolations = [...result.violations];
|
|
404
|
+
for (let i = 0; i < enrichedViolations.length; i++) {
|
|
405
|
+
const v = enrichedViolations[i];
|
|
406
|
+
try {
|
|
407
|
+
const alts = await suggestAlternatives({
|
|
408
|
+
violation: v,
|
|
409
|
+
protocol: params?.protocol || v.namespace || "default",
|
|
410
|
+
currentState: v.currentStates || [],
|
|
411
|
+
targetState: params?.targetState || v.requiredStates || ["COMPLETED"],
|
|
412
|
+
rules: params?.rules || new Map(),
|
|
413
|
+
});
|
|
414
|
+
enrichedViolations[i] = {
|
|
415
|
+
...v,
|
|
416
|
+
repairAlternatives: alts.map(a => ({
|
|
417
|
+
rank: a.rank,
|
|
418
|
+
description: a.description,
|
|
419
|
+
fixPath: a.fixPath,
|
|
420
|
+
source: a.source,
|
|
421
|
+
score: a.score,
|
|
422
|
+
historicalSuccessRate: a.historicalSuccessRate,
|
|
423
|
+
})),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
// repair suggestion failure must never invalidate the base validation
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return { valid: false, errors: result.errors, violations: enrichedViolations };
|
|
431
|
+
}
|