Benchmarks: recovering feature boundaries

Can a planner recover a codebase's real feature boundaries? We flatten feature-modular repos into type folders, then score each method against the original folders: MoJoFM (0–100), ARI, c2c_cvg and the cluster-count ratio. TurboMQ needs no ground truth: it scores the import graph alone (many imports inside a module, few between modules), not whether the modules are the features. Every entry gets both MoJoFM and TurboMQ, each with its own best deterministic method. Each scramble is one commit by our own executor, then checked by our own certifier as a pure move: ghostfolio, hoppscotch-H1 and hoppscotch pass (static checks); kaneo (failing K3c, K4) fails (static checks). Each entry below shows its verdict; a scramble is scored whatever its verdict, since the ground truth is its original folders. Deterministic baselines are always shown next to the planner, because classic methods often win (ICSA 2026 found they beat LLM decompositions by 62% on MoJoFM, docs/plan.md §7; our G1 gate agrees on kaneo, docs/gates.md). Real type-sliced targets have no complete ground truth: they get TurboMQ and back-edges, and where a target's own history labels some of its files (a partial answer key), MoJoFM and the rest over those files only.

In these results the planner beats the best deterministic method on MoJoFM on 3 of 5 entries (ghostfolio, hoppscotch-H1 and hoppscotch), and loses on 2 (immich and kaneo); on TurboMQ it beats it on 1 of 5 entries (ghostfolio), and loses on 4 (hoppscotch-H1, hoppscotch, immich and kaneo). Each measure has its own best deterministic method, and immich's MoJoFM is over its 2024 key. Our own validator rejects the plans of ghostfolio (banned-name: "app" is a junk drawer or a type word, not a feature) and kaneo (banned-name: "middleware" is a junk drawer or a type word, not a feature). ac run refuses such a plan; the bench scores it as it came back. Counting only the plans the validator accepts, the planner wins on MoJoFM on 2 of 5 (hoppscotch-H1 and hoppscotch) and on TurboMQ on 0 of 5.

Bold: the higher of the best deterministic method and the planner on each measure.

EntryMeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
ghostfolioMoJoFMseeds draft (file names)84.7282.6486.81 (plan rejected)+2.09
TurboMQseeds draft (file names)19.8819.2019.93 (plan rejected)+0.05
hoppscotch-H1MoJoFMseeds draft (export names)81.3881.3883.45+2.07
TurboMQLouvain r=4 (mean of seeds 1-5)9.577.377.14-2.43
hoppscotchMoJoFMseeds draft (export names)81.3880.0087.59+6.21
TurboMQLouvain r=4 (mean of seeds 1-5)9.637.638.12-1.51
immichMoJoFM over its 2024 keyseeds draft (file names)93.0293.0288.37-4.65
TurboMQLouvain r=4 (mean of seeds 1-5)10.5010.1910.07-0.43
kaneoMoJoFMLouvain r=4 (mean of seeds 1-5)66.9050.1350.65 (plan rejected)-16.25
TurboMQLouvain r=4 (mean of seeds 1-5)16.0510.409.90 (plan rejected)-6.15

summary.md · each entry's JSON is linked under its table.

Nemotron 3.5 Super VL as the planner

We measured NVIDIA Nemotron 3.5 Super VL as the planner in place of Nemotron 3 Ultra: the same pipeline, prompts and entries, 3 runs per entry for each configuration, with Super VL's thinking off, and on with room to finish (256k-token answers). Ultra was recorded afresh for this comparison; the overview's planner values above are one earlier draw per scramble, and immich's is the demo's recorded plan (planner rules 1). Each cell is the mean over the runs, min to max in parentheses, every run as delivered; bold is the highest on each row.

EntryMeasureBest deterministic methodUltra (medium_effort)Super VL, thinking offSuper VL, thinking on, 256k
ghostfolioMoJoFM84.72 seeds draft (file names)82.18 (76.39 to 87.50)82.18 (80.56 to 83.33)86.11 (83.33 to 87.50)
TurboMQ19.88 seeds draft (file names)18.25 (17.36 to 19.20)18.08 (17.09 to 18.64)18.31 (18.22 to 18.45)
hoppscotch-H1MoJoFM81.38 seeds draft (export names)85.06 (80.00 to 90.34)79.77 (77.24 to 82.76)90.80 (88.97 to 93.10)
TurboMQ9.57 Louvain r=4 (mean of seeds 1-5)7.82 (7.14 to 8.46)7.57 (7.22 to 8.22)8.33 (8.22 to 8.41)
hoppscotchMoJoFM81.38 seeds draft (export names)83.22 (81.38 to 84.83)81.84 (76.55 to 90.34)91.26 (88.97 to 94.48)
TurboMQ9.63 Louvain r=4 (mean of seeds 1-5)7.86 (7.67 to 8.13)7.95 (7.55 to 8.74)8.32 (8.12 to 8.44)
kaneoMoJoFM66.90 Louvain r=4 (mean of seeds 1-5)50.74 (50.39 to 50.91)56.13 (43.34 to 64.75)55.27 (49.61 to 58.75)
TurboMQ16.05 Louvain r=4 (mean of seeds 1-5)9.83 (9.45 to 10.48)10.36 (8.55 to 11.87)10.97 (8.99 to 12.12)
immichMoJoFM over its 2024 key (47 of 269 files)93.02 seeds draft (file names)89.15 (88.37 to 90.70)89.92 (88.37 to 90.70)88.37 (88.37 to 88.37)
TurboMQ10.50 Louvain r=4 (mean of seeds 1-5)10.20 (10.03 to 10.42)9.84 (9.76 to 9.98)10.26 (10.08 to 10.35)

Each configuration's results: ultra, super-vl-direct, super-vl-256k (summary.md; each entry's JSON is next to it).

With thinking on and room to finish (256k-token answers), Super VL's mean MoJoFM is above Ultra's on all 4 scrambles (a permutation test over the runs, stratified by entry, gives p ≈ 0.0007), at 2.5 times Ultra's cost and 6.4 times its time per plan. On TurboMQ none of the 45 planner runs score above the best deterministic method, and on immich (TurboMQ 10.26 against Ultra's 10.20, MoJoFM over its 2024 key 88.37 against Ultra's 89.15) we see no measurable difference between the two. The demo keeps Ultra. Among the reasons: the recorded demo run reproduces byte for byte with the frozen tool, and switching would mean new code and new recordings after the feature freeze; 3 runs per entry are few; in 11 of its 30 calls Super VL's long reasoning names the public project it is planning (ghostfolio, kaneo or immich), and in most of them tries to recall its structure; and Ultra was compared at medium_effort only, never at full thinking.

The full write-up is bench/experiments/s8b-super-vl/README.md in the repository.

Entry by entry

ghostfolio scramble, default

Target apps/api/src/app @ 347cd06a40, 154 movable files.

Scrambled by our own executor in commit 9e65a3a639: 156 scored files moved into type folders (a test next to its source moves with it and isn't scored), 3 declined (they stay), 219 excluded; certificate PASS (static).

Ground truth: 153 feature files in 34 original folders; 54 hard files (their name doesn't give their feature away); 16 of the movable files give their feature away in their path (0 renamed after it, 0 still in a feature folder, 16 under a sub-folder their feature kept; 28 more that no method sees are not counted).

Planner: 42 groups (38 modules), from the seeds draft (export names), plan sha256 9048c87d30c7, $0.0878 when recorded, 1 of 2 calls replayed from cassettes/s7-bench.jsonl and 1 recorded into it ($0.0274 spent by this run).

MeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
MoJoFMseeds draft (file names)84.7282.6486.81 (plan rejected)+2.09
TurboMQseeds draft (file names)19.8819.2019.93 (plan rejected)+0.05
MoJoFM against the original folders (0–100)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders18.1name-token (full stem)61.8name-token (anchored)77.8export-token (anchored)76.4seeds draft (file names)84.7seeds draft (export names)82.6Louvain r=1 (mean of seeds 1-5)53.2Louvain r=2 (mean of seeds 1-5)64.7Louvain r=4 (mean of seeds 1-5)75.6planner (Ultra)86.8
TurboMQ (sum of cluster factors)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders1.64 · 2 back-edgesname-token (full stem)18.33 · 5 back-edgesname-token (anchored)19.42 · 9 back-edgesexport-token (anchored)18.79 · 8 back-edgesseeds draft (file names)19.88 · 8 back-edgesseeds draft (export names)19.20 · 7 back-edgesLouvain r=1 (mean of seeds 1-5)13.84 · 6.6 back-edgesLouvain r=2 (mean of seeds 1-5)16.21 · 12 back-edgesLouvain r=4 (mean of seeds 1-5)19.71 · 7.2 back-edgesplanner (Ultra)19.93 · 8 back-edges
Table view: every measure of every method
MethodKindClustersMoJoFMARIc2c_cvgCluster ratioMoJoFM hardTurboMQBack-edges
B0 type foldersbaseline1018.060.0140.0000.2655.101.642
name-token (full stem)baseline8261.810.2200.7062.3828.5718.335
name-token (anchored)baseline5677.780.3600.7941.6257.1419.429
export-token (anchored)baseline5576.390.3470.7651.5955.1018.798
seeds draft (file names)baseline4484.720.4410.7941.2677.5519.888
seeds draft (export names)draft4482.640.4210.7651.2675.5119.207
Louvain r=1 (mean of seeds 1-5)baseline17.653.200.3340.2290.4984.8913.846.6
Louvain r=2 (mean of seeds 1-5)baseline2364.720.4920.2940.6588.1716.2112
Louvain r=4 (mean of seeds 1-5)baseline30.875.560.5010.4350.8785.3019.717.2
planner (Ultra) (invalid plan: 1 validator error)planner4286.810.4750.7941.2179.5919.938
Louvain MoJoFM by resolution, seeds 1–5
ResolutionMoJoFM per seed
154.86, 52.78, 52.78, 52.78, 52.78
265.28, 64.58, 64.58, 63.89, 65.28
473.61, 76.39, 76.39, 75.00, 76.39

ghostfolio.json

hoppscotch-H1 scramble, H1

Target packages/hoppscotch-backend/src @ 63273f8e59, 186 movable files.

Scrambled by our own executor in commit bf37a0f639: 156 scored files moved into type folders (a test next to its source moves with it and isn't scored), 1 declined (they stay), 22 excluded; certificate PASS (static).

Ground truth: 156 feature files in 25 original folders; 46 hard files (their name doesn't give their feature away); 0 of the movable files give their feature away in their path (0 renamed after it, 0 still in a feature folder, 0 under a sub-folder their feature kept; 3 more that no method sees are not counted).

Planner: 37 groups (35 modules), from the seeds draft (export names), plan sha256 e38cd9aeaa64, $0.1275 when recorded, 1 of 2 calls replayed from cassettes/s7-bench.jsonl and 1 recorded into it ($0.0191 spent by this run).

MeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
MoJoFMseeds draft (export names)81.3881.3883.45+2.07
TurboMQLouvain r=4 (mean of seeds 1-5)9.577.377.14-2.43
MoJoFM against the original folders (0–100)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders9.7name-token (full stem)9.7name-token (anchored)9.7export-token (anchored)74.5seeds draft (file names)23.4seeds draft (export names)81.4Louvain r=1 (mean of seeds 1-5)33.4Louvain r=2 (mean of seeds 1-5)53.1Louvain r=4 (mean of seeds 1-5)76.3planner (Ultra)83.5
TurboMQ (sum of cluster factors)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders1.11 · 15 back-edgesname-token (full stem)0.06 · 1 back-edgesname-token (anchored)0.06 · 2 back-edgesexport-token (anchored)6.92 · 47 back-edgesseeds draft (file names)2.88 · 48 back-edgesseeds draft (export names)7.37 · 36 back-edgesLouvain r=1 (mean of seeds 1-5)4.44 · 22.4 back-edgesLouvain r=2 (mean of seeds 1-5)6.72 · 57.4 back-edgesLouvain r=4 (mean of seeds 1-5)9.57 · 70.4 back-edgesplanner (Ultra)7.14 · 42 back-edges
Table view: every measure of every method
MethodKindClustersMoJoFMARIc2c_cvgCluster ratioMoJoFM hardTurboMQBack-edges
B0 type foldersbaseline179.66-0.0220.0000.6030.001.1115
name-token (full stem)baseline1839.660.0000.0006.2422.500.061
name-token (anchored)baseline1759.660.0000.0006.2422.500.062
export-token (anchored)baseline6274.480.5280.7602.0445.006.9247
seeds draft (file names)baseline9223.450.0150.0803.4015.002.8848
seeds draft (export names)draft4581.380.6340.8001.6062.507.3736
Louvain r=1 (mean of seeds 1-5)baseline9.433.380.2990.0480.3456.504.4422.4
Louvain r=2 (mean of seeds 1-5)baseline16.653.100.4990.2160.6274.006.7257.4
Louvain r=4 (mean of seeds 1-5)baseline33.276.270.6010.6161.2280.509.5770.4
planner (Ultra)planner3783.450.6410.8001.4060.007.1442
Louvain MoJoFM by resolution, seeds 1–5
ResolutionMoJoFM per seed
126.21, 34.48, 42.76, 33.10, 30.34
255.86, 51.03, 54.48, 51.03, 53.10
474.48, 76.55, 76.55, 80.00, 73.79

hoppscotch-H1.json

hoppscotch scramble, default

Target packages/hoppscotch-backend/src @ 63273f8e59, 186 movable files.

Scrambled by our own executor in commit a38bd84671: 156 scored files moved into type folders (a test next to its source moves with it and isn't scored), 1 declined (they stay), 22 excluded; certificate PASS (static).

Ground truth: 156 feature files in 25 original folders; 46 hard files (their name doesn't give their feature away); 0 of the movable files give their feature away in their path (0 renamed after it, 0 still in a feature folder, 0 under a sub-folder their feature kept; 3 more that no method sees are not counted).

Planner: 29 groups (22 modules), from the seeds draft (file names), plan sha256 615def2cbbab, $0.1375 when recorded, 2 calls replayed from cassettes/s7-bench.jsonl ($0.0000 spent by this run).

MeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
MoJoFMseeds draft (export names)81.3880.0087.59+6.21
TurboMQLouvain r=4 (mean of seeds 1-5)9.637.638.12-1.51
MoJoFM against the original folders (0–100)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders9.7name-token (full stem)57.2name-token (anchored)75.2export-token (anchored)74.5seeds draft (file names)80.0seeds draft (export names)81.4Louvain r=1 (mean of seeds 1-5)32.5Louvain r=2 (mean of seeds 1-5)57.0Louvain r=4 (mean of seeds 1-5)74.6planner (Ultra)87.6
TurboMQ (sum of cluster factors)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders1.11 · 15 back-edgesname-token (full stem)6.41 · 44 back-edgesname-token (anchored)7.43 · 53 back-edgesexport-token (anchored)6.92 · 47 back-edgesseeds draft (file names)7.63 · 37 back-edgesseeds draft (export names)7.37 · 36 back-edgesLouvain r=1 (mean of seeds 1-5)4.02 · 17.2 back-edgesLouvain r=2 (mean of seeds 1-5)6.74 · 58 back-edgesLouvain r=4 (mean of seeds 1-5)9.63 · 76.4 back-edgesplanner (Ultra)8.12 · 30 back-edges
Table view: every measure of every method
MethodKindClustersMoJoFMARIc2c_cvgCluster ratioMoJoFM hardTurboMQBack-edges
B0 type foldersbaseline179.66-0.0220.0000.6030.001.1115
name-token (full stem)baseline10957.240.3930.5603.4830.006.4144
name-token (anchored)baseline5675.170.5410.7601.8850.007.4353
export-token (anchored)baseline6274.480.5280.7602.0445.006.9247
seeds draft (file names)draft4380.000.5930.8001.5657.507.6337
seeds draft (export names)baseline4581.380.6340.8001.6062.507.3736
Louvain r=1 (mean of seeds 1-5)baseline8.432.550.2780.0320.3057.004.0217.2
Louvain r=2 (mean of seeds 1-5)baseline1756.960.5160.2720.6477.006.7458
Louvain r=4 (mean of seeds 1-5)baseline33.674.620.6010.6161.2679.009.6376.4
planner (Ultra)planner2987.590.7940.8401.1667.508.1230
Louvain MoJoFM by resolution, seeds 1–5
ResolutionMoJoFM per seed
129.66, 35.17, 35.86, 32.41, 29.66
256.55, 51.72, 59.31, 57.93, 59.31
475.86, 73.79, 74.48, 75.86, 73.10

hoppscotch.json

immich real

Target server/src @ 02063972e8, 269 movable files.

A real type-sliced target, with no complete ground truth. MoJoFM, ARI, c2c_cvg, the cluster ratio and MoJoFM hard are over its 2024 key, immich's March 2024 domain-layer feature folders followed through git history to the pinned commit: 47 of the 269 movable files in 23 features, mostly in src/services/ (23) and src/dtos/ (22) with 2 elsewhere; 41 of the 47 are named after their feature (key bench/ground-truth/immich-2024.rsf, details in bench/ground-truth/README.md in the repository). Every method places all 269, and only those 47 count. TurboMQ (higher is more modular) and back-edges (lower is better) cover every file.

Planner: 59 groups (38 modules), from the seeds draft (file names), plan sha256 b4c7c548883c, $0.1998 when recorded, 2 calls replayed from cassettes/s6-immich.jsonl ($0.0000 spent by this run).

MeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
MoJoFM over its 2024 keyseeds draft (file names)93.0293.0288.37-4.65
TurboMQLouvain r=4 (mean of seeds 1-5)10.5010.1910.07-0.43
MoJoFM over its 2024 key's 47 files (0–100)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders11.6name-token (full stem)81.4name-token (anchored)90.7export-token (anchored)81.4seeds draft (file names)93.0seeds draft (export names)81.4Louvain r=1 (mean of seeds 1-5)23.7Louvain r=2 (mean of seeds 1-5)55.4Louvain r=4 (mean of seeds 1-5)71.6planner (Ultra)88.4
TurboMQ (sum of cluster factors)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders1.94 · 25 back-edgesname-token (full stem)9.03 · 212 back-edgesname-token (anchored)9.51 · 129 back-edgesexport-token (anchored)8.39 · 127 back-edgesseeds draft (file names)10.19 · 141 back-edgesseeds draft (export names)9.11 · 142 back-edgesLouvain r=1 (mean of seeds 1-5)3.81 · 20.8 back-edgesLouvain r=2 (mean of seeds 1-5)7.09 · 136.8 back-edgesLouvain r=4 (mean of seeds 1-5)10.50 · 166 back-edgesplanner (Ultra)10.07 · 118 back-edges
Table view: every measure of every method
MethodKindClustersMoJoFMARIc2c_cvgCluster ratioMoJoFM hardTurboMQBack-edges
B0 type foldersbaseline1011.63-0.0060.0000.1733.331.9425
name-token (full stem)baseline13881.400.5520.9131.3533.339.03212
name-token (anchored)baseline11890.700.7310.9571.1733.339.51129
export-token (anchored)baseline12281.400.6240.8261.3533.338.39127
seeds draft (file names)draft8193.020.8061.0001.1333.3310.19141
seeds draft (export names)baseline8381.400.6130.8261.3033.339.11142
Louvain r=1 (mean of seeds 1-5)baseline9.223.720.1040.0520.2686.673.8120.8
Louvain r=2 (mean of seeds 1-5)baseline25.655.350.2630.3310.7433.337.09136.8
Louvain r=4 (mean of seeds 1-5)baseline47.671.630.4130.6611.1633.3310.50166
planner (Ultra)planner5988.370.7590.9131.0433.3310.07118
Louvain MoJoFM over its 2024 key by resolution, seeds 1–5
ResolutionMoJoFM per seed
125.58, 25.58, 25.58, 20.93, 20.93
253.49, 53.49, 53.49, 58.14, 58.14
465.12, 74.42, 74.42, 72.09, 72.09

immich.json

kaneo scramble, default

Target apps/api/src @ b80818fe2e, 454 movable files.

Scrambled by our own executor in commit aad6fc97e3: 400 scored files moved into type folders (a test next to its source moves with it and isn't scored), 1 declined (they stay), 12 excluded; certificate FAIL (static, failing K3c, K4).

Ground truth: 401 feature files in 47 original folders; 234 hard files (their name doesn't give their feature away); 54 of the movable files give their feature away in their path (53 renamed after it, 1 still in a feature folder, 0 under a sub-folder their feature kept; 4 more that no method sees are not counted).

Planner: 64 groups (55 modules), from the seeds draft (file names), plan sha256 bcb39422b864, $0.1714 when recorded, 1 of 2 calls replayed from cassettes/s7-bench.jsonl and 1 recorded into it ($0.0649 spent by this run).

MeasureBest deterministic methodBestSeeds draftPlannerPlanner − best
MoJoFMLouvain r=4 (mean of seeds 1-5)66.9050.1350.65 (plan rejected)-16.25
TurboMQLouvain r=4 (mean of seeds 1-5)16.0510.409.90 (plan rejected)-6.15
MoJoFM against the original folders (0–100)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders13.3name-token (full stem)13.1name-token (anchored)49.6export-token (anchored)26.4seeds draft (file names)50.1seeds draft (export names)31.1Louvain r=1 (mean of seeds 1-5)29.4Louvain r=2 (mean of seeds 1-5)51.0Louvain r=4 (mean of seeds 1-5)66.9planner (Ultra)50.6
TurboMQ (sum of cluster factors)
the planner (Nemotron)the best deterministic methodother methods
B0 type folders1.07 · 8 back-edgesname-token (full stem)2.38 · 4 back-edgesname-token (anchored)9.75 · 95 back-edgesexport-token (anchored)3.32 · 61 back-edgesseeds draft (file names)10.40 · 72 back-edgesseeds draft (export names)6.30 · 104 back-edgesLouvain r=1 (mean of seeds 1-5)4.92 · 16.2 back-edgesLouvain r=2 (mean of seeds 1-5)10.01 · 43.4 back-edgesLouvain r=4 (mean of seeds 1-5)16.05 · 60.8 back-edgesplanner (Ultra)9.90 · 66 back-edges
Table view: every measure of every method
MethodKindClustersMoJoFMARIc2c_cvgCluster ratioMoJoFM hardTurboMQBack-edges
B0 type foldersbaseline1013.320.0170.0000.1716.441.078
name-token (full stem)baseline42613.050.0120.1497.9614.612.384
name-token (anchored)baseline15649.610.2540.4262.9130.599.7595
export-token (anchored)baseline25226.370.0800.0854.9629.223.3261
seeds draft (file names)draft11450.130.2360.4042.2331.9610.4072
seeds draft (export names)baseline10431.070.0780.0641.9630.596.30104
Louvain r=1 (mean of seeds 1-5)baseline11.229.450.2130.0210.1937.354.9216.2
Louvain r=2 (mean of seeds 1-5)baseline2351.020.3890.0940.4549.5010.0143.4
Louvain r=4 (mean of seeds 1-5)baseline39.666.900.4650.3110.8064.4816.0560.8
planner (Ultra) (invalid plan: 1 validator error)planner6450.650.2480.2771.3236.079.9066
Louvain MoJoFM by resolution, seeds 1–5
ResolutionMoJoFM per seed
127.15, 31.85, 27.68, 32.90, 27.68
251.44, 50.13, 48.30, 52.22, 53.00
463.97, 65.80, 68.15, 68.15, 68.41

kaneo.json