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,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P8.2: Topology Factory — programmatic protocol state machine generation
|
|
4
|
+
*
|
|
5
|
+
* Generates protocol rule sets for 10 distinct topology types,
|
|
6
|
+
* enabling diverse benchmark construction without hand-writing
|
|
7
|
+
* each protocol. Every topology is defined purely by its
|
|
8
|
+
* state transition structure — function names are auto-generated.
|
|
9
|
+
*
|
|
10
|
+
* 10 topologies:
|
|
11
|
+
* T1 linear A→B→C→D chain
|
|
12
|
+
* T2 star hub with radial spokes
|
|
13
|
+
* T3 tree branching decision tree
|
|
14
|
+
* T4 loop self-transition cycle with exit
|
|
15
|
+
* T5 two_phase_commit prepare → commit/rollback fork
|
|
16
|
+
* T6 auth_bridge auth gate → multiple resources
|
|
17
|
+
* T7 nested inner/outer resource dependency
|
|
18
|
+
* T8 rollback reversible forward/backward edges
|
|
19
|
+
* T9 fan_out fork-join parallelism
|
|
20
|
+
* T10 stateless self-loop only, no state change
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.ALL_TOPOLOGIES = void 0;
|
|
24
|
+
exports.createProtocolForTopology = createProtocolForTopology;
|
|
25
|
+
exports.ALL_TOPOLOGIES = [
|
|
26
|
+
"linear", "star", "tree", "loop", "two_phase_commit",
|
|
27
|
+
"auth_bridge", "nested", "rollback", "fan_out", "stateless",
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Create protocol rules for a given topology type.
|
|
31
|
+
* Returns SSG-compatible StateAnnotation map.
|
|
32
|
+
*/
|
|
33
|
+
function createProtocolForTopology(type, numStates) {
|
|
34
|
+
const rules = buildRules(type, numStates);
|
|
35
|
+
const map = new Map();
|
|
36
|
+
// Convert ProtocolRule[] to Map<string, StateAnnotation>
|
|
37
|
+
// Group by action (function name) — each function appears once
|
|
38
|
+
const byAction = new Map();
|
|
39
|
+
for (const r of rules) {
|
|
40
|
+
if (!byAction.has(r.action)) {
|
|
41
|
+
byAction.set(r.action, { from: new Set(), to: new Set() });
|
|
42
|
+
}
|
|
43
|
+
byAction.get(r.action).from.add(r.from);
|
|
44
|
+
byAction.get(r.action).to.add(r.to);
|
|
45
|
+
}
|
|
46
|
+
for (const [action, { from, to }] of byAction) {
|
|
47
|
+
const postStates = [...to];
|
|
48
|
+
// Invalidation: states in "from" that are NOT in "to" for this action
|
|
49
|
+
// and NOT in "from" for any subsequent action that depends on them
|
|
50
|
+
const invalidate = [];
|
|
51
|
+
for (const f of from) {
|
|
52
|
+
// Check if any other action requires this state as a pre_state
|
|
53
|
+
let stillNeeded = false;
|
|
54
|
+
for (const [otherAction, otherEntry] of byAction) {
|
|
55
|
+
if (otherAction === action)
|
|
56
|
+
continue; // skip self
|
|
57
|
+
if (otherEntry.from.has(f)) {
|
|
58
|
+
stillNeeded = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!stillNeeded && !to.has(f)) {
|
|
63
|
+
invalidate.push(f);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
map.set(action, {
|
|
67
|
+
pre_states: [...from],
|
|
68
|
+
post_states: postStates.length > 0 ? postStates : [],
|
|
69
|
+
invalidate: invalidate.length > 0 ? invalidate : undefined,
|
|
70
|
+
namespace: type,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return map;
|
|
74
|
+
}
|
|
75
|
+
function buildRules(type, n) {
|
|
76
|
+
switch (type) {
|
|
77
|
+
case "linear": return buildLinear(n || 4);
|
|
78
|
+
case "star": return buildStar();
|
|
79
|
+
case "tree": return buildTree(2, 2);
|
|
80
|
+
case "loop": return buildLoop();
|
|
81
|
+
case "two_phase_commit": return buildTwoPhaseCommit();
|
|
82
|
+
case "auth_bridge": return buildAuthBridge();
|
|
83
|
+
case "nested": return buildNested();
|
|
84
|
+
case "rollback": return buildRollback();
|
|
85
|
+
case "fan_out": return buildFanOut();
|
|
86
|
+
case "stateless": return buildStateless();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function buildLinear(n) {
|
|
90
|
+
const rules = [];
|
|
91
|
+
for (let i = 0; i < n; i++) {
|
|
92
|
+
const from = i === 0 ? "INIT" : `S${i - 1}`;
|
|
93
|
+
const to = i < n - 1 ? `S${i}` : `S${n - 1}_DONE`;
|
|
94
|
+
const action = i === 0 ? "open" : i === n - 1 ? "close" : `op${i}`;
|
|
95
|
+
rules.push({ from, to, action });
|
|
96
|
+
}
|
|
97
|
+
return rules;
|
|
98
|
+
}
|
|
99
|
+
function buildStar() {
|
|
100
|
+
return [
|
|
101
|
+
{ from: "INIT", to: "HUB", action: "acquire" },
|
|
102
|
+
{ from: "HUB", to: "LEAF1", action: "use_a" },
|
|
103
|
+
{ from: "LEAF1", to: "HUB", action: "release_a" },
|
|
104
|
+
{ from: "HUB", to: "LEAF2", action: "use_b" },
|
|
105
|
+
{ from: "LEAF2", to: "HUB", action: "release_b" },
|
|
106
|
+
{ from: "HUB", to: "LEAF3", action: "use_c" },
|
|
107
|
+
{ from: "LEAF3", to: "HUB", action: "release_c" },
|
|
108
|
+
{ from: "HUB", to: "DONE", action: "destroy" },
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
function buildTree(branchFactor, depth) {
|
|
112
|
+
const rules = [];
|
|
113
|
+
rules.push({ from: "INIT", to: "ROOT", action: "enter" });
|
|
114
|
+
let nodeCount = 1;
|
|
115
|
+
const id = (d, b) => `N${d}_${b}`;
|
|
116
|
+
for (let d = 0; d < depth; d++) {
|
|
117
|
+
const nodesAtLevel = Math.pow(branchFactor, d);
|
|
118
|
+
for (let n = 0; n < nodesAtLevel; n++) {
|
|
119
|
+
for (let b = 0; b < branchFactor; b++) {
|
|
120
|
+
const child = nodeCount++;
|
|
121
|
+
rules.push({
|
|
122
|
+
from: d === 0 && n === 0 ? "ROOT" : id(d, n),
|
|
123
|
+
to: id(d + 1, child),
|
|
124
|
+
action: `branch_d${d}_b${b}`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return rules;
|
|
130
|
+
}
|
|
131
|
+
function buildLoop() {
|
|
132
|
+
return [
|
|
133
|
+
{ from: "INIT", to: "LOOP", action: "init_loop" },
|
|
134
|
+
{ from: "LOOP", to: "LOOP", action: "process" },
|
|
135
|
+
{ from: "LOOP", to: "LOOP", action: "poll" },
|
|
136
|
+
{ from: "LOOP", to: "EXIT", action: "exit_loop" },
|
|
137
|
+
{ from: "LOOP", to: "EXIT", action: "timeout" },
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
function buildTwoPhaseCommit() {
|
|
141
|
+
return [
|
|
142
|
+
{ from: "INIT", to: "TX_ACTIVE", action: "begin_tx" },
|
|
143
|
+
{ from: "TX_ACTIVE", to: "TX_ACTIVE", action: "insert" },
|
|
144
|
+
{ from: "TX_ACTIVE", to: "TX_ACTIVE", action: "update" },
|
|
145
|
+
{ from: "TX_ACTIVE", to: "PREPARED", action: "prepare" },
|
|
146
|
+
{ from: "PREPARED", to: "COMMITTED", action: "commit" },
|
|
147
|
+
{ from: "PREPARED", to: "ABORTED", action: "rollback" },
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
function buildAuthBridge() {
|
|
151
|
+
return [
|
|
152
|
+
{ from: "INIT", to: "AUTHED", action: "authenticate" },
|
|
153
|
+
{ from: "AUTHED", to: "FILE_OPEN", action: "open_file" },
|
|
154
|
+
{ from: "FILE_OPEN", to: "AUTHED", action: "close_file" },
|
|
155
|
+
{ from: "AUTHED", to: "DB_OPEN", action: "connect_db" },
|
|
156
|
+
{ from: "DB_OPEN", to: "AUTHED", action: "disconnect_db" },
|
|
157
|
+
{ from: "AUTHED", to: "INIT", action: "logout" },
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
function buildNested() {
|
|
161
|
+
return [
|
|
162
|
+
{ from: "INIT", to: "OUTER_HELD", action: "acquire_outer" },
|
|
163
|
+
{ from: "OUTER_HELD", to: "INNER_HELD", action: "acquire_inner" },
|
|
164
|
+
{ from: "INNER_HELD", to: "OUTER_HELD", action: "release_inner" },
|
|
165
|
+
{ from: "OUTER_HELD", to: "DONE", action: "release_outer" },
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
function buildRollback() {
|
|
169
|
+
return [
|
|
170
|
+
{ from: "INIT", to: "S1", action: "step1" },
|
|
171
|
+
{ from: "S1", to: "S2", action: "step2" },
|
|
172
|
+
{ from: "S2", to: "S3", action: "step3" },
|
|
173
|
+
{ from: "S3", to: "DONE", action: "commit_all" },
|
|
174
|
+
{ from: "S2", to: "S1", action: "undo_step2" },
|
|
175
|
+
{ from: "S3", to: "S2", action: "undo_step3" },
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
function buildFanOut() {
|
|
179
|
+
return [
|
|
180
|
+
{ from: "INIT", to: "A", action: "fork_a" },
|
|
181
|
+
{ from: "INIT", to: "B", action: "fork_b" },
|
|
182
|
+
{ from: "INIT", to: "C", action: "fork_c" },
|
|
183
|
+
{ from: "A", to: "JOIN", action: "op_a" },
|
|
184
|
+
{ from: "B", to: "JOIN", action: "op_b" },
|
|
185
|
+
{ from: "C", to: "JOIN", action: "op_c" },
|
|
186
|
+
{ from: "JOIN", to: "DONE", action: "merge" },
|
|
187
|
+
];
|
|
188
|
+
}
|
|
189
|
+
function buildStateless() {
|
|
190
|
+
return [
|
|
191
|
+
{ from: "IDLE", to: "IDLE", action: "compute_hash" },
|
|
192
|
+
{ from: "IDLE", to: "IDLE", action: "validate_input" },
|
|
193
|
+
{ from: "IDLE", to: "IDLE", action: "encode_payload" },
|
|
194
|
+
{ from: "IDLE", to: "IDLE", action: "decode_payload" },
|
|
195
|
+
];
|
|
196
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P7.2: Topology Representation — From Verb Learning to Structure Learning
|
|
4
|
+
*
|
|
5
|
+
* Replaces keyword-based clustering with graph topology analysis.
|
|
6
|
+
* Measures cross-repo similarity using PURE topology — no function names.
|
|
7
|
+
*
|
|
8
|
+
* Key insight from P7.1: 100% → 0% under name scrambling.
|
|
9
|
+
* The system must learn Acquire→Use→Release from graph structure,
|
|
10
|
+
* not from open/close/create vocabulary.
|
|
11
|
+
*
|
|
12
|
+
* Three levels:
|
|
13
|
+
* L1: Transition matrix (directed edges)
|
|
14
|
+
* L2: State machine (graph topology fingerprint)
|
|
15
|
+
* L3: Role discovery (SOURCE/SINK/HUB)
|
|
16
|
+
*
|
|
17
|
+
* Semantic Adversarial Test: rename open→destroy, close→create.
|
|
18
|
+
* If topology similarity survives, it's real structure learning.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.buildTopologyGraph = buildTopologyGraph;
|
|
22
|
+
exports.fingerprintRepo = fingerprintRepo;
|
|
23
|
+
exports.runTopologyExperiment = runTopologyExperiment;
|
|
24
|
+
exports.printTopologyReport = printTopologyReport;
|
|
25
|
+
const software_physics_1 = require("./experimental/software-physics");
|
|
26
|
+
/** Build a topology graph from a call sequence. Node labels are opaque indices. */
|
|
27
|
+
function buildTopologyGraph(sequence) {
|
|
28
|
+
const n = sequence.length;
|
|
29
|
+
if (n === 0) {
|
|
30
|
+
return { nodeCount: 0, edgeCount: 0, edges: [], inDegree: [], outDegree: [], sources: [], sinks: [], diameter: 0, isDAG: true };
|
|
31
|
+
}
|
|
32
|
+
const edges = [];
|
|
33
|
+
const inDegree = new Array(n).fill(0);
|
|
34
|
+
const outDegree = new Array(n).fill(0);
|
|
35
|
+
for (let i = 0; i < n - 1; i++) {
|
|
36
|
+
edges.push({ fromIdx: i, toIdx: i + 1 });
|
|
37
|
+
outDegree[i]++;
|
|
38
|
+
inDegree[i + 1]++;
|
|
39
|
+
}
|
|
40
|
+
const sources = [];
|
|
41
|
+
const sinks = [];
|
|
42
|
+
for (let i = 0; i < n; i++) {
|
|
43
|
+
if (inDegree[i] === 0)
|
|
44
|
+
sources.push(i);
|
|
45
|
+
if (outDegree[i] === 0)
|
|
46
|
+
sinks.push(i);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
nodeCount: n,
|
|
50
|
+
edgeCount: edges.length,
|
|
51
|
+
edges,
|
|
52
|
+
inDegree,
|
|
53
|
+
outDegree,
|
|
54
|
+
sources,
|
|
55
|
+
sinks,
|
|
56
|
+
diameter: n - 1, // linear chain
|
|
57
|
+
isDAG: true, // linear chain is always a DAG
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Build a name-independent fingerprint from a set of sequences. */
|
|
61
|
+
function fingerprintRepo(sequences) {
|
|
62
|
+
if (sequences.length === 0) {
|
|
63
|
+
return { nodeCount: 0, edgeCount: 0, sourceCount: 0, sinkCount: 0, avgOutDegree: 0, diameter: 0, isDAG: true, outDegreeDist: [] };
|
|
64
|
+
}
|
|
65
|
+
const graphs = sequences.map(buildTopologyGraph);
|
|
66
|
+
const totalNodes = graphs.reduce((s, g) => s + g.nodeCount, 0);
|
|
67
|
+
const totalEdges = graphs.reduce((s, g) => s + g.edgeCount, 0);
|
|
68
|
+
const totalSources = graphs.reduce((s, g) => s + g.sources.length, 0);
|
|
69
|
+
const totalSinks = graphs.reduce((s, g) => s + g.sinks.length, 0);
|
|
70
|
+
const avgOut = totalNodes > 0 ? totalEdges / totalNodes : 0;
|
|
71
|
+
const avgDiameter = graphs.reduce((s, g) => s + g.diameter, 0) / graphs.length;
|
|
72
|
+
const allDAG = graphs.every(g => g.isDAG);
|
|
73
|
+
// Out-degree distribution
|
|
74
|
+
const maxOut = Math.max(...graphs.map(g => Math.max(...g.outDegree, 0)), 0);
|
|
75
|
+
const dist = new Array(maxOut + 1).fill(0);
|
|
76
|
+
for (const g of graphs) {
|
|
77
|
+
for (const d of g.outDegree) {
|
|
78
|
+
if (d < dist.length)
|
|
79
|
+
dist[d]++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
nodeCount: totalNodes,
|
|
84
|
+
edgeCount: totalEdges,
|
|
85
|
+
sourceCount: totalSources,
|
|
86
|
+
sinkCount: totalSinks,
|
|
87
|
+
avgOutDegree: avgOut,
|
|
88
|
+
diameter: avgDiameter,
|
|
89
|
+
isDAG: allDAG,
|
|
90
|
+
outDegreeDist: dist,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compute topological similarity between two repos.
|
|
95
|
+
* Uses Jaccard on binned fingerprint features — ZERO function names.
|
|
96
|
+
*/
|
|
97
|
+
function topologySimilarity(a, b) {
|
|
98
|
+
// Normalize features to [0,1] bins
|
|
99
|
+
const features = [
|
|
100
|
+
a.nodeCount > 0 && b.nodeCount > 0 ? Math.min(a.nodeCount, b.nodeCount) / Math.max(a.nodeCount, b.nodeCount) : 0,
|
|
101
|
+
a.edgeCount > 0 && b.edgeCount > 0 ? Math.min(a.edgeCount, b.edgeCount) / Math.max(a.edgeCount, b.edgeCount) : 0,
|
|
102
|
+
a.sourceCount > 0 && b.sourceCount > 0 ? Math.min(a.sourceCount, b.sourceCount) / Math.max(a.sourceCount, b.sourceCount) : 0,
|
|
103
|
+
a.sinkCount > 0 && b.sinkCount > 0 ? Math.min(a.sinkCount, b.sinkCount) / Math.max(a.sinkCount, b.sinkCount) : 0,
|
|
104
|
+
Math.abs(a.avgOutDegree - b.avgOutDegree) < 0.5 ? 1 : 0,
|
|
105
|
+
a.diameter > 0 && b.diameter > 0 ? Math.min(a.diameter, b.diameter) / Math.max(a.diameter, b.diameter) : 0,
|
|
106
|
+
a.isDAG === b.isDAG ? 1 : 0,
|
|
107
|
+
];
|
|
108
|
+
return features.reduce((s, f) => s + f, 0) / features.length;
|
|
109
|
+
}
|
|
110
|
+
/** Classify each node by its topological role (name-independent). */
|
|
111
|
+
function roleProfile(graph) {
|
|
112
|
+
const n = graph.nodeCount;
|
|
113
|
+
if (n === 0)
|
|
114
|
+
return { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 };
|
|
115
|
+
let sources = 0, sinks = 0, hubs = 0, passThrough = 0;
|
|
116
|
+
for (let i = 0; i < n; i++) {
|
|
117
|
+
const inD = graph.inDegree[i];
|
|
118
|
+
const outD = graph.outDegree[i];
|
|
119
|
+
if (inD === 0 && outD === 0) { /* isolated */ }
|
|
120
|
+
else if (inD === 0)
|
|
121
|
+
sources++;
|
|
122
|
+
else if (outD === 0)
|
|
123
|
+
sinks++;
|
|
124
|
+
else if (outD >= 3)
|
|
125
|
+
hubs++;
|
|
126
|
+
else if (inD === 1 && outD === 1)
|
|
127
|
+
passThrough++;
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
sourceRatio: sources / n,
|
|
131
|
+
sinkRatio: sinks / n,
|
|
132
|
+
hubRatio: hubs / n,
|
|
133
|
+
passThroughRatio: passThrough / n,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** Compare two repos by their role profiles. */
|
|
137
|
+
function roleSimilarity(a, b) {
|
|
138
|
+
const feats = [
|
|
139
|
+
1 - Math.abs(a.sourceRatio - b.sourceRatio),
|
|
140
|
+
1 - Math.abs(a.sinkRatio - b.sinkRatio),
|
|
141
|
+
1 - Math.abs(a.hubRatio - b.hubRatio),
|
|
142
|
+
1 - Math.abs(a.passThroughRatio - b.passThroughRatio),
|
|
143
|
+
];
|
|
144
|
+
return feats.reduce((s, f) => s + Math.max(0, f), 0) / feats.length;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Run the topology representation experiment.
|
|
148
|
+
*
|
|
149
|
+
* The decisive test: measure cross-repo similarity using ONLY graph topology,
|
|
150
|
+
* with function names completely removed and replaced by opaque indices.
|
|
151
|
+
*/
|
|
152
|
+
function runTopologyExperiment() {
|
|
153
|
+
// Baseline: name-based
|
|
154
|
+
const redisSeqs = software_physics_1.KNOWN_REPO_SIGNATURES["Redis"].map(fn => [fn]); // wrap as single-fn sequences
|
|
155
|
+
const sqliteSeqs = software_physics_1.KNOWN_REPO_SIGNATURES["SQLite"].map(fn => [fn]);
|
|
156
|
+
const redisFp = fingerprintRepo(CROSS_REPO_SEQS("Redis"));
|
|
157
|
+
const sqliteFp = fingerprintRepo(CROSS_REPO_SEQS("SQLite"));
|
|
158
|
+
const topologyOnly = topologySimilarity(redisFp, sqliteFp);
|
|
159
|
+
// Role-based
|
|
160
|
+
const redisGraphs = CROSS_REPO_SEQS("Redis").map(buildTopologyGraph);
|
|
161
|
+
const sqliteGraphs = CROSS_REPO_SEQS("SQLite").map(buildTopologyGraph);
|
|
162
|
+
const redisRole = redisGraphs.reduce((acc, g) => {
|
|
163
|
+
const r = roleProfile(g);
|
|
164
|
+
acc.sourceRatio += r.sourceRatio;
|
|
165
|
+
acc.sinkRatio += r.sinkRatio;
|
|
166
|
+
acc.hubRatio += r.hubRatio;
|
|
167
|
+
acc.passThroughRatio += r.passThroughRatio;
|
|
168
|
+
return acc;
|
|
169
|
+
}, { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 });
|
|
170
|
+
const sqliteRole = sqliteGraphs.reduce((acc, g) => {
|
|
171
|
+
const r = roleProfile(g);
|
|
172
|
+
acc.sourceRatio += r.sourceRatio;
|
|
173
|
+
acc.sinkRatio += r.sinkRatio;
|
|
174
|
+
acc.hubRatio += r.hubRatio;
|
|
175
|
+
acc.passThroughRatio += r.passThroughRatio;
|
|
176
|
+
return acc;
|
|
177
|
+
}, { sourceRatio: 0, sinkRatio: 0, hubRatio: 0, passThroughRatio: 0 });
|
|
178
|
+
const n = Math.max(1, redisGraphs.length);
|
|
179
|
+
const m = Math.max(1, sqliteGraphs.length);
|
|
180
|
+
redisRole.sourceRatio /= n;
|
|
181
|
+
redisRole.sinkRatio /= n;
|
|
182
|
+
redisRole.hubRatio /= n;
|
|
183
|
+
redisRole.passThroughRatio /= n;
|
|
184
|
+
sqliteRole.sourceRatio /= m;
|
|
185
|
+
sqliteRole.sinkRatio /= m;
|
|
186
|
+
sqliteRole.hubRatio /= m;
|
|
187
|
+
sqliteRole.passThroughRatio /= m;
|
|
188
|
+
const roleSimilarityScore = roleSimilarity(redisRole, sqliteRole);
|
|
189
|
+
// Semantic adversarial: rename open→destroy, close→create (misleading names, topology unchanged)
|
|
190
|
+
// Use the same sequences but with scrambled names (F_001 format)
|
|
191
|
+
const scrambledRedis = CROSS_REPO_SEQS("Redis").map(seq => seq.map((_, i) => `F_${String(i).padStart(4, "0")}`));
|
|
192
|
+
const scrambledSqlite = CROSS_REPO_SEQS("SQLite").map(seq => seq.map((_, i) => `X_${String(i).padStart(4, "0")}`));
|
|
193
|
+
const scrambledRedisFp = fingerprintRepo(scrambledRedis);
|
|
194
|
+
const scrambledSqliteFp = fingerprintRepo(scrambledSqlite);
|
|
195
|
+
const semanticAdversarial = topologySimilarity(scrambledRedisFp, scrambledSqliteFp);
|
|
196
|
+
// Baseline from P6.2 (with names)
|
|
197
|
+
const redisA = (0, software_physics_1.analyzeRepoPhysics)("Redis", software_physics_1.KNOWN_REPO_SIGNATURES["Redis"]);
|
|
198
|
+
const sqliteA = (0, software_physics_1.analyzeRepoPhysics)("SQLite", software_physics_1.KNOWN_REPO_SIGNATURES["SQLite"]);
|
|
199
|
+
const baseline = (0, software_physics_1.compareRepoPhysics)(redisA, sqliteA).similarity;
|
|
200
|
+
const survivalRate = baseline > 0 ? topologyOnly / baseline : 0;
|
|
201
|
+
return {
|
|
202
|
+
baseline,
|
|
203
|
+
topologyOnly,
|
|
204
|
+
roleSimilarity: roleSimilarityScore,
|
|
205
|
+
semanticAdversarial,
|
|
206
|
+
topologySurvivalRate: survivalRate,
|
|
207
|
+
verdict: survivalRate > 0.7 ? "structure_learned" :
|
|
208
|
+
survivalRate < 0.2 ? "verb_learning" : "partial",
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/** Helper: get sequences from a known repo. */
|
|
212
|
+
function CROSS_REPO_SEQS(repo) {
|
|
213
|
+
const all = {
|
|
214
|
+
Redis: [["createClient", "sendCommand", "closeClient"], ["selectDB", "getKey"], ["createClient", "sendCommand", "readReply", "closeClient"]],
|
|
215
|
+
SQLite: [["sqlite3_open", "sqlite3_exec", "sqlite3_close"], ["sqlite3_prepare", "sqlite3_step", "sqlite3_finalize"], ["sqlite3_open", "sqlite3_prepare", "sqlite3_step", "sqlite3_finalize", "sqlite3_close"]],
|
|
216
|
+
};
|
|
217
|
+
return all[repo] || [];
|
|
218
|
+
}
|
|
219
|
+
function printTopologyReport(report) {
|
|
220
|
+
console.log("\n╔════════════════════════════════════════════════════╗");
|
|
221
|
+
console.log("║ P7.2 Topology Representation Experiment ║");
|
|
222
|
+
console.log("║ Pure graph structure — ZERO function names ║");
|
|
223
|
+
console.log("╚════════════════════════════════════════════════════╝\n");
|
|
224
|
+
console.log(`Baseline (name-based): ${(report.baseline * 100).toFixed(0)}%`);
|
|
225
|
+
console.log(`Topology Only (no names): ${(report.topologyOnly * 100).toFixed(0)}%`);
|
|
226
|
+
console.log(`Role Similarity: ${(report.roleSimilarity * 100).toFixed(0)}%`);
|
|
227
|
+
console.log(`Semantic Adversarial: ${(report.semanticAdversarial * 100).toFixed(0)}%`);
|
|
228
|
+
console.log(`Topology Survival Rate: ${(report.topologySurvivalRate * 100).toFixed(0)}%`);
|
|
229
|
+
console.log();
|
|
230
|
+
console.log(`─── Verdict ───`);
|
|
231
|
+
console.log(` Classification: ${report.verdict.toUpperCase()}`);
|
|
232
|
+
console.log();
|
|
233
|
+
if (report.verdict === "structure_learned") {
|
|
234
|
+
console.log(" ✅ Topology similarity SURVIVES without function names.");
|
|
235
|
+
console.log(" The system genuinely learns protocol STRUCTURE.");
|
|
236
|
+
}
|
|
237
|
+
else if (report.verdict === "verb_learning") {
|
|
238
|
+
console.log(" ❌ Topology similarity COLLAPSES without function names.");
|
|
239
|
+
console.log(" The system depends on API vocabulary, not graph structure.");
|
|
240
|
+
}
|
|
241
|
+
console.log();
|
|
242
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P7.2: Topology Representation Tests
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const topology_representation_1 = require("./topology-representation");
|
|
8
|
+
(0, vitest_1.describe)("Topology Graph", () => {
|
|
9
|
+
(0, vitest_1.it)("builds DAG from linear sequence", () => {
|
|
10
|
+
const g = (0, topology_representation_1.buildTopologyGraph)(["A", "B", "C"]);
|
|
11
|
+
(0, vitest_1.expect)(g.nodeCount).toBe(3);
|
|
12
|
+
(0, vitest_1.expect)(g.edgeCount).toBe(2);
|
|
13
|
+
(0, vitest_1.expect)(g.sources.length).toBe(1); // A: in=0
|
|
14
|
+
(0, vitest_1.expect)(g.sinks.length).toBe(1); // C: out=0
|
|
15
|
+
(0, vitest_1.expect)(g.isDAG).toBe(true);
|
|
16
|
+
(0, vitest_1.expect)(g.diameter).toBe(2);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.describe)("P7.2 Topology Experiment", () => {
|
|
20
|
+
(0, vitest_1.it)("measures cross-repo similarity with pure topology (no names)", () => {
|
|
21
|
+
const report = (0, topology_representation_1.runTopologyExperiment)();
|
|
22
|
+
(0, vitest_1.expect)(report.baseline).toBeGreaterThan(0);
|
|
23
|
+
(0, vitest_1.expect)(report.topologyOnly).toBeGreaterThanOrEqual(0);
|
|
24
|
+
(0, vitest_1.expect)(report.topologyOnly).toBeLessThanOrEqual(1);
|
|
25
|
+
(0, topology_representation_1.printTopologyReport)(report);
|
|
26
|
+
});
|
|
27
|
+
});
|