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,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P6.3: Unsupervised Physics Discovery
|
|
4
|
+
*
|
|
5
|
+
* Discovers protocol patterns WITHOUT hand-crafted keywords.
|
|
6
|
+
* Input: raw call sequences. Output: structural clusters.
|
|
7
|
+
*
|
|
8
|
+
* The test: if the system clusters [open,read,close] with
|
|
9
|
+
* [connect,query,disconnect] WITHOUT knowing the function names,
|
|
10
|
+
* it has genuinely learned the Acquire→Use→Release pattern.
|
|
11
|
+
*
|
|
12
|
+
* Algorithm:
|
|
13
|
+
* 1. Extract structural fingerprints from call sequences
|
|
14
|
+
* 2. Cluster by structural similarity (no keyword matching)
|
|
15
|
+
* 3. Compare discovered clusters to known physics patterns
|
|
16
|
+
* 4. Measure: are Acquire/Release clusters emergent?
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.CROSS_REPO_SEQUENCES = void 0;
|
|
20
|
+
exports.fingerprint = fingerprint;
|
|
21
|
+
exports.fingerprintSequences = fingerprintSequences;
|
|
22
|
+
exports.clusterByStructure = clusterByStructure;
|
|
23
|
+
exports.evaluateUnsupervisedDiscovery = evaluateUnsupervisedDiscovery;
|
|
24
|
+
exports.runUnsupervisedDiscovery = runUnsupervisedDiscovery;
|
|
25
|
+
exports.printUnsupervisedReport = printUnsupervisedReport;
|
|
26
|
+
/**
|
|
27
|
+
* Extract structural fingerprint from a function in context.
|
|
28
|
+
* Uses ONLY positional and structural features — NO function names.
|
|
29
|
+
*/
|
|
30
|
+
function fingerprint(fn, index, sequence) {
|
|
31
|
+
const uniqueFns = new Set(sequence);
|
|
32
|
+
// Check if sequence forms a closed loop: first and last functions
|
|
33
|
+
// have structural similarity (both are single-occurrence "boundary" functions)
|
|
34
|
+
const firstFn = sequence[0];
|
|
35
|
+
const lastFn = sequence[sequence.length - 1];
|
|
36
|
+
const firstCount = sequence.filter(f => f === firstFn).length;
|
|
37
|
+
const lastCount = sequence.filter(f => f === lastFn).length;
|
|
38
|
+
// Closed loop: first and last are "boundary" functions (appear only once)
|
|
39
|
+
const isClosedLoop = firstCount === 1 && lastCount === 1 && sequence.length >= 2;
|
|
40
|
+
return {
|
|
41
|
+
seqId: sequence.join("→"),
|
|
42
|
+
length: sequence.length,
|
|
43
|
+
position: index / Math.max(1, sequence.length - 1),
|
|
44
|
+
isFirst: index === 0,
|
|
45
|
+
isLast: index === sequence.length - 1,
|
|
46
|
+
isClosedLoop,
|
|
47
|
+
uniqueCount: uniqueFns.size,
|
|
48
|
+
phase: index === 0 ? 0 : index === sequence.length - 1 ? 2 : 1,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build fingerprints for all functions in a set of sequences.
|
|
53
|
+
*/
|
|
54
|
+
function fingerprintSequences(sequences) {
|
|
55
|
+
const fps = new Map();
|
|
56
|
+
for (const seq of sequences) {
|
|
57
|
+
for (let i = 0; i < seq.length; i++) {
|
|
58
|
+
const fp = fingerprint(seq[i], i, seq);
|
|
59
|
+
fps.set(`${seq[i]}@${i}`, fp);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return fps;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Cluster sequences by structural similarity ONLY.
|
|
66
|
+
* No function names. No keywords. Pure topology.
|
|
67
|
+
*/
|
|
68
|
+
function clusterByStructure(sequences) {
|
|
69
|
+
const features = sequences.map(seq => {
|
|
70
|
+
const uniqueFns = new Set(seq);
|
|
71
|
+
const firstFn = seq[0];
|
|
72
|
+
const lastFn = seq[seq.length - 1];
|
|
73
|
+
const firstCount = seq.filter(f => f === firstFn).length;
|
|
74
|
+
const lastCount = seq.filter(f => f === lastFn).length;
|
|
75
|
+
const closedLoop = firstCount === 1 && lastCount === 1 && seq.length >= 2;
|
|
76
|
+
// Phase profile: how many functions are at each phase
|
|
77
|
+
const profile = [0, 0, 0];
|
|
78
|
+
for (let i = 0; i < seq.length; i++) {
|
|
79
|
+
const phase = i === 0 ? 0 : i === seq.length - 1 ? 2 : 1;
|
|
80
|
+
profile[phase]++;
|
|
81
|
+
}
|
|
82
|
+
return { seq, length: seq.length, closedLoop, uniqueCount: uniqueFns.size, phaseProfile: profile };
|
|
83
|
+
});
|
|
84
|
+
// Clustering: group by [length bucket, closedLoop, uniqueCount]
|
|
85
|
+
const clusters = new Map();
|
|
86
|
+
for (const f of features) {
|
|
87
|
+
const lenBucket = f.length <= 2 ? "short" : f.length <= 4 ? "medium" : "long";
|
|
88
|
+
const loopKey = f.closedLoop ? "closed" : "open";
|
|
89
|
+
const key = `${lenBucket}-${loopKey}-${f.uniqueCount}`;
|
|
90
|
+
if (!clusters.has(key))
|
|
91
|
+
clusters.set(key, []);
|
|
92
|
+
clusters.get(key).push(f);
|
|
93
|
+
}
|
|
94
|
+
// Convert to DiscoveredCluster
|
|
95
|
+
const results = [];
|
|
96
|
+
let id = 0;
|
|
97
|
+
for (const [key, members] of clusters) {
|
|
98
|
+
if (members.length < 1)
|
|
99
|
+
continue;
|
|
100
|
+
const avgLen = members.reduce((s, m) => s + m.length, 0) / members.length;
|
|
101
|
+
const closedRate = members.filter(m => m.closedLoop).length / members.length;
|
|
102
|
+
// Infer physics pattern based on STRUCTURE, not names
|
|
103
|
+
let inferredPattern;
|
|
104
|
+
if (closedRate > 0.5 && avgLen >= 3) {
|
|
105
|
+
inferredPattern = "RESOURCE_ACQUIRE"; // Acquire-Use-Release structure
|
|
106
|
+
}
|
|
107
|
+
else if (closedRate > 0.5 && avgLen === 2) {
|
|
108
|
+
inferredPattern = "LOCK_ACQUIRE"; // Lock-Unlock structure
|
|
109
|
+
}
|
|
110
|
+
results.push({
|
|
111
|
+
id: `C${id++}`,
|
|
112
|
+
sequences: members.map(m => m.seq),
|
|
113
|
+
avgLength: avgLen,
|
|
114
|
+
closedLoopRate: closedRate,
|
|
115
|
+
signature: key,
|
|
116
|
+
inferredPattern,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return results.sort((a, b) => b.sequences.length - a.sequences.length);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Evaluate whether structural clustering discovers physics patterns.
|
|
123
|
+
*
|
|
124
|
+
* This is the KEY test: input raw sequences, output clusters.
|
|
125
|
+
* If Acquire-Use-Release clusters emerge WITHOUT keyword matching,
|
|
126
|
+
* the system has genuinely learned protocol structure.
|
|
127
|
+
*/
|
|
128
|
+
function evaluateUnsupervisedDiscovery(sequences) {
|
|
129
|
+
const clusters = clusterByStructure(sequences);
|
|
130
|
+
// Check: do clusters match known physics patterns by STRUCTURE alone?
|
|
131
|
+
let structuralMatches = 0;
|
|
132
|
+
let sequencesInMatches = 0;
|
|
133
|
+
for (const c of clusters) {
|
|
134
|
+
if (c.inferredPattern) {
|
|
135
|
+
structuralMatches++;
|
|
136
|
+
sequencesInMatches += c.sequences.length;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const total = sequences.length;
|
|
140
|
+
const emergent = structuralMatches > 0 && sequencesInMatches / total > 0.5;
|
|
141
|
+
return {
|
|
142
|
+
totalSequences: total,
|
|
143
|
+
clusters,
|
|
144
|
+
structuralCoverage: clusters.length > 0 ? structuralMatches / clusters.length : 0,
|
|
145
|
+
sequenceCoverage: total > 0 ? sequencesInMatches / total : 0,
|
|
146
|
+
emergent,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// ═══════════════════════════════════════════════════════════════
|
|
150
|
+
// Cross-Repo Unsupervised Benchmark
|
|
151
|
+
// ═══════════════════════════════════════════════════════════════
|
|
152
|
+
exports.CROSS_REPO_SEQUENCES = {
|
|
153
|
+
Redis: [
|
|
154
|
+
["createClient", "sendCommand", "closeClient"],
|
|
155
|
+
["selectDB", "getKey"],
|
|
156
|
+
["createClient", "sendCommand", "readReply", "closeClient"],
|
|
157
|
+
],
|
|
158
|
+
SQLite: [
|
|
159
|
+
["sqlite3_open", "sqlite3_exec", "sqlite3_close"],
|
|
160
|
+
["sqlite3_prepare", "sqlite3_step", "sqlite3_finalize"],
|
|
161
|
+
["sqlite3_open", "sqlite3_prepare", "sqlite3_step", "sqlite3_finalize", "sqlite3_close"],
|
|
162
|
+
],
|
|
163
|
+
nginx: [
|
|
164
|
+
["ngx_accept_connection", "ngx_read_request", "ngx_close_connection"],
|
|
165
|
+
["ngx_parse_headers", "ngx_send_response"],
|
|
166
|
+
["ngx_accept_connection", "ngx_process_request", "ngx_send_response", "ngx_close_connection"],
|
|
167
|
+
],
|
|
168
|
+
PostgreSQL: [
|
|
169
|
+
["PQconnectdb", "PQexec", "PQfinish"],
|
|
170
|
+
["begin_transaction", "execute_query", "commit_transaction"],
|
|
171
|
+
["PQconnectdb", "begin_transaction", "execute_query", "commit_transaction", "PQfinish"],
|
|
172
|
+
],
|
|
173
|
+
LevelDB: [
|
|
174
|
+
["DB_Open", "DB_Get", "DB_Close"],
|
|
175
|
+
["DB_Open", "DB_Put", "DB_Close"],
|
|
176
|
+
["DB_Open", "DB_Write", "DB_Compact", "DB_Close"],
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Full unsupervised discovery across all known repos.
|
|
181
|
+
*/
|
|
182
|
+
function runUnsupervisedDiscovery() {
|
|
183
|
+
const perRepo = {};
|
|
184
|
+
const allSeqs = [];
|
|
185
|
+
for (const [repo, seqs] of Object.entries(exports.CROSS_REPO_SEQUENCES)) {
|
|
186
|
+
const eval_ = evaluateUnsupervisedDiscovery(seqs);
|
|
187
|
+
perRepo[repo] = eval_;
|
|
188
|
+
allSeqs.push(...seqs);
|
|
189
|
+
}
|
|
190
|
+
const allEval = evaluateUnsupervisedDiscovery(allSeqs);
|
|
191
|
+
const emergent = Object.values(perRepo).every(e => e.emergent);
|
|
192
|
+
return {
|
|
193
|
+
perRepo,
|
|
194
|
+
allSequences: allEval,
|
|
195
|
+
emergent,
|
|
196
|
+
summary: emergent
|
|
197
|
+
? "ACQUIRE→USE→RELEASE clusters emerged WITHOUT keyword matching. Software Physics is REAL."
|
|
198
|
+
: "Structural clustering found some patterns, but not consistently across repos. More data needed.",
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function printUnsupervisedReport(report) {
|
|
202
|
+
console.log("\n╔════════════════════════════════════════════════════╗");
|
|
203
|
+
console.log("║ P6.3 Unsupervised Physics Discovery ║");
|
|
204
|
+
console.log("║ (NO keywords. NO function names. Pure topology.) ║");
|
|
205
|
+
console.log("╚════════════════════════════════════════════════════╝\n");
|
|
206
|
+
console.log(`Emergent Physics: ${report.emergent ? "✅ YES" : "❌ NO"}`);
|
|
207
|
+
console.log(`Summary: ${report.summary}`);
|
|
208
|
+
console.log();
|
|
209
|
+
console.log("─── Per-Repo Discovery ───");
|
|
210
|
+
console.log("Repo Seqs Clusters StructCov Emergent");
|
|
211
|
+
console.log("──────────────────────────────────────────────────");
|
|
212
|
+
for (const [repo, eval_] of Object.entries(report.perRepo)) {
|
|
213
|
+
const sc = (eval_.structuralCoverage * 100).toFixed(0).padStart(4);
|
|
214
|
+
const icon = eval_.emergent ? "✅" : "❌";
|
|
215
|
+
console.log(` ${repo.padEnd(12)} ${String(eval_.totalSequences).padStart(4)} ${String(eval_.clusters.length).padStart(8)} ${sc}% ${icon}`);
|
|
216
|
+
}
|
|
217
|
+
console.log();
|
|
218
|
+
console.log("─── Discovered Clusters ───");
|
|
219
|
+
for (const c of report.allSequences.clusters.slice(0, 10)) {
|
|
220
|
+
const pattern = c.inferredPattern || "unknown";
|
|
221
|
+
const closed = c.closedLoopRate > 0.5 ? "closed-loop" : "open";
|
|
222
|
+
console.log(` ${c.id}: ${c.sequences.length} seqs, avgLen=${c.avgLength.toFixed(1)}, ${closed}, → ${pattern}`);
|
|
223
|
+
if (c.sequences.length <= 3) {
|
|
224
|
+
for (const s of c.sequences) {
|
|
225
|
+
console.log(` ${s.join(" → ")}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
console.log();
|
|
230
|
+
}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python IR Extractor — Bridge to tools/extract_ir.py
|
|
4
|
+
*
|
|
5
|
+
* V5: Python IR now matches TypeScript FunctionInfo interface
|
|
6
|
+
* and feeds directly into the SSG validator and protocol discovery pipeline.
|
|
7
|
+
*
|
|
8
|
+
* Protocol annotations via Python decorators:
|
|
9
|
+
* @progmune(namespace="auth", pre=["UNAUTHENTICATED"], post=["PASSWORD_VERIFIED"])
|
|
10
|
+
* def verify_password(...): ...
|
|
11
|
+
*
|
|
12
|
+
* Docstring-based metadata:
|
|
13
|
+
* @purpose, @requires, @produces, @tags, @inputs, @outputs
|
|
14
|
+
*/
|
|
2
15
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
16
|
if (k2 === undefined) k2 = k;
|
|
4
17
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -34,22 +47,56 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
47
|
})();
|
|
35
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
49
|
exports.extractIRPython = extractIRPython;
|
|
50
|
+
exports.isPythonProject = isPythonProject;
|
|
37
51
|
const child_process_1 = require("child_process");
|
|
38
52
|
const fs = __importStar(require("fs"));
|
|
39
53
|
const path = __importStar(require("path"));
|
|
40
54
|
function extractIRPython(projectRoot) {
|
|
41
|
-
const scriptPath = path.resolve(__dirname, "
|
|
42
|
-
const
|
|
55
|
+
const scriptPath = path.resolve(__dirname, "..", "tools", "extract_ir.py");
|
|
56
|
+
const irPath = path.resolve(projectRoot, "ir.json");
|
|
57
|
+
const cmd = `python3 "${scriptPath}" "${projectRoot}" "${irPath}"`;
|
|
43
58
|
try {
|
|
44
59
|
(0, child_process_1.execSync)(cmd, { encoding: "utf-8", stdio: "pipe" });
|
|
45
60
|
}
|
|
46
61
|
catch (e) {
|
|
47
|
-
console.error("Python IR
|
|
62
|
+
console.error("Python IR extraction failed:", e.stderr?.toString() || String(e));
|
|
48
63
|
return [];
|
|
49
64
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
65
|
+
if (!fs.existsSync(irPath))
|
|
66
|
+
return [];
|
|
67
|
+
const raw = JSON.parse(fs.readFileSync(irPath, "utf-8"));
|
|
68
|
+
if (!Array.isArray(raw))
|
|
69
|
+
return [];
|
|
70
|
+
// Map Python IR records to FunctionInfo
|
|
71
|
+
return raw.map((r) => ({
|
|
72
|
+
name: r.name || "",
|
|
73
|
+
params: (r.params || []).map((p) => ({
|
|
74
|
+
name: p.name || "",
|
|
75
|
+
type: p.type || "any",
|
|
76
|
+
})),
|
|
77
|
+
returnType: r.returnType || "any",
|
|
78
|
+
file: r.file || "",
|
|
79
|
+
calls: r.calls || [],
|
|
80
|
+
exported: r.exported !== false,
|
|
81
|
+
external: r.external || false,
|
|
82
|
+
description: r.description || r.purpose || "",
|
|
83
|
+
purpose: r.purpose || "",
|
|
84
|
+
tags: r.tags || (r.language ? [r.language] : []),
|
|
85
|
+
inputs: r.inputs || [],
|
|
86
|
+
outputs: r.outputs || [],
|
|
87
|
+
requires: r.requires || "",
|
|
88
|
+
produces: r.produces || "",
|
|
89
|
+
useWhen: r.useWhen || "",
|
|
90
|
+
protocol: r.protocol || undefined,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
/** Auto-detect whether a project is Python (looks for .py files). */
|
|
94
|
+
function isPythonProject(projectRoot) {
|
|
95
|
+
try {
|
|
96
|
+
const files = fs.readdirSync(projectRoot);
|
|
97
|
+
return files.some(f => f.endsWith(".py"));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
53
101
|
}
|
|
54
|
-
return [];
|
|
55
102
|
}
|