DO NOT MERGE: canary for models metadata-only plus E2E stabilizers#13000
DO NOT MERGE: canary for models metadata-only plus E2E stabilizers#13000jaeone94 wants to merge 4 commits into
Conversation
📝 WalkthroughWalkthroughThe PR simplifies the missing-model enrichment pipeline by converting ChangesMissing Model Enrichment Simplification
Browser Test Infrastructure Fixes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 5 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1669 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 7.45 MB gzip 🟢 -582 BDetailsSummary
Category Glance App Entry Points — 46.7 kB (baseline 46.7 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 95.3 kB (baseline 95.3 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed / 3 unchanged Panels & Settings — 525 kB (baseline 525 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 11 added / 11 removed / 15 unchanged User & Accounts — 19.9 kB (baseline 19.9 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 3 unchanged Editors & Dialogs — 112 kB (baseline 112 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 4 added / 4 removed / 1 unchanged UI Components — 57.2 kB (baseline 57.2 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed / 8 unchanged Data & Services — 266 kB (baseline 266 kB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 13 added / 13 removed / 3 unchanged Utilities & Hooks — 3.32 MB (baseline 3.32 MB) • 🟢 -2.75 kBHelpers, composables, and utility bundles
Status: 14 added / 14 removed / 16 unchanged Vendor & Third-Party — 15.3 MB (baseline 15.3 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 10.4 MB (baseline 10.4 MB) • ⚪ 0 BBundles that do not match a named category
Status: 62 added / 62 removed / 89 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-06-19T11:00:04.745Z",
"gitSha": "cfe8a7eb4c5e516d1ba91ab753024264fb9c2be7",
"branch": "jaeone/do-not-merge-models-e2e-canary",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2022.7780000000166,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.321,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 373.744,
"heapDeltaBytes": -2466564,
"heapUsedBytes": 56046628,
"domNodes": 20,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 16.493000000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2022.3999999999478,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.817000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 354.405,
"heapDeltaBytes": -2249588,
"heapUsedBytes": 56468296,
"domNodes": 18,
"jsHeapTotalBytes": 24379392,
"scriptDurationMs": 14.846,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1922.1520000000396,
"styleRecalcs": 76,
"styleRecalcDurationMs": 39.256,
"layouts": 12,
"layoutDurationMs": 3.8320000000000003,
"taskDurationMs": 809,
"heapDeltaBytes": -7367336,
"heapUsedBytes": 51074768,
"domNodes": 59,
"jsHeapTotalBytes": 26214400,
"scriptDurationMs": 118.98599999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1775.1719999999978,
"styleRecalcs": 75,
"styleRecalcDurationMs": 37.909,
"layouts": 12,
"layoutDurationMs": 3.475,
"taskDurationMs": 788.4480000000001,
"heapDeltaBytes": -7059620,
"heapUsedBytes": 51340828,
"domNodes": 58,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 127.001,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1729.916000000003,
"styleRecalcs": 31,
"styleRecalcDurationMs": 16.715,
"layouts": 6,
"layoutDurationMs": 0.738,
"taskDurationMs": 311.52799999999996,
"heapDeltaBytes": 1515564,
"heapUsedBytes": 59956384,
"domNodes": 77,
"jsHeapTotalBytes": 26738688,
"scriptDurationMs": 18.136000000000003,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1726.7289999999775,
"styleRecalcs": 32,
"styleRecalcDurationMs": 15.546999999999999,
"layouts": 6,
"layoutDurationMs": 0.678,
"taskDurationMs": 304.26300000000003,
"heapDeltaBytes": 1465596,
"heapUsedBytes": 60106148,
"domNodes": 76,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 18.647,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 566.4430000000493,
"styleRecalcs": 11,
"styleRecalcDurationMs": 6.793999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 327.096,
"heapDeltaBytes": 6755384,
"heapUsedBytes": 65288232,
"domNodes": 18,
"jsHeapTotalBytes": 17563648,
"scriptDurationMs": 55.041,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 560.0400000000718,
"styleRecalcs": 11,
"styleRecalcDurationMs": 7.186999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 342.617,
"heapDeltaBytes": 7285376,
"heapUsedBytes": 65759240,
"domNodes": 18,
"jsHeapTotalBytes": 18874368,
"scriptDurationMs": 62.71399999999999,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2036.5130000000136,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.598,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 496.358,
"heapDeltaBytes": -9149064,
"heapUsedBytes": 66605324,
"domNodes": 20,
"jsHeapTotalBytes": 10629120,
"scriptDurationMs": 87.52600000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 1998.4929999999395,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.178999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 472.435,
"heapDeltaBytes": -9617916,
"heapUsedBytes": 62066856,
"domNodes": 18,
"jsHeapTotalBytes": 9580544,
"scriptDurationMs": 83.52200000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2106.851000000006,
"styleRecalcs": 69,
"styleRecalcDurationMs": 18.935999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1048.055,
"heapDeltaBytes": 10260040,
"heapUsedBytes": 82840316,
"domNodes": 18,
"jsHeapTotalBytes": 11591680,
"scriptDurationMs": 407.63100000000003,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-pan",
"durationMs": 2103.560000000016,
"styleRecalcs": 69,
"styleRecalcDurationMs": 19.226999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1046.889,
"heapDeltaBytes": 10230080,
"heapUsedBytes": 82880508,
"domNodes": 16,
"jsHeapTotalBytes": 10280960,
"scriptDurationMs": 403.389,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3086.6829999999936,
"styleRecalcs": 66,
"styleRecalcDurationMs": 18.254999999999995,
"layouts": 60,
"layoutDurationMs": 7.378000000000001,
"taskDurationMs": 1227.689,
"heapDeltaBytes": 13742192,
"heapUsedBytes": 68504232,
"domNodes": 14,
"jsHeapTotalBytes": 6029312,
"scriptDurationMs": 473.50699999999995,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3111.772999999971,
"styleRecalcs": 66,
"styleRecalcDurationMs": 19.532999999999998,
"layouts": 60,
"layoutDurationMs": 7.550000000000001,
"taskDurationMs": 1271.359,
"heapDeltaBytes": 14366716,
"heapUsedBytes": 73160216,
"domNodes": 14,
"jsHeapTotalBytes": 8126464,
"scriptDurationMs": 474.00300000000004,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2032.1569999999838,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.727000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 498.29099999999994,
"heapDeltaBytes": -10882304,
"heapUsedBytes": 65750176,
"domNodes": 20,
"jsHeapTotalBytes": 7745536,
"scriptDurationMs": 89.47099999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2028.7650000000212,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.392,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 500.059,
"heapDeltaBytes": -9143864,
"heapUsedBytes": 64270204,
"domNodes": 18,
"jsHeapTotalBytes": 7745536,
"scriptDurationMs": 90.452,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 583.3410000000185,
"styleRecalcs": 46,
"styleRecalcDurationMs": 10,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 379.09700000000004,
"heapDeltaBytes": -17638428,
"heapUsedBytes": 50948200,
"domNodes": -267,
"jsHeapTotalBytes": 8826880,
"scriptDurationMs": 120.364,
"eventListeners": -197,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66666666666665,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 592.2809999999572,
"styleRecalcs": 48,
"styleRecalcDurationMs": 12.153,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 370.736,
"heapDeltaBytes": 7997776,
"heapUsedBytes": 66764836,
"domNodes": 22,
"jsHeapTotalBytes": 19398656,
"scriptDurationMs": 122.25800000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-idle",
"durationMs": 2006.1570000000302,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.764,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 378.913,
"heapDeltaBytes": -2593612,
"heapUsedBytes": 55992312,
"domNodes": 18,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 15.883000000000001,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1989.4329999999627,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.798000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 335.562,
"heapDeltaBytes": -2607308,
"heapUsedBytes": 55958252,
"domNodes": 20,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 12.382,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1677.082999999982,
"styleRecalcs": 75,
"styleRecalcDurationMs": 34.692,
"layouts": 16,
"layoutDurationMs": 4.047000000000001,
"taskDurationMs": 638.79,
"heapDeltaBytes": 15410540,
"heapUsedBytes": 73961512,
"domNodes": 61,
"jsHeapTotalBytes": 26476544,
"scriptDurationMs": 86.162,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1706.2570000000505,
"styleRecalcs": 76,
"styleRecalcDurationMs": 33.722,
"layouts": 16,
"layoutDurationMs": 3.9560000000000004,
"taskDurationMs": 659.432,
"heapDeltaBytes": -11117544,
"heapUsedBytes": 47460756,
"domNodes": 62,
"jsHeapTotalBytes": 26214400,
"scriptDurationMs": 88.82499999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 915.9469999999601,
"styleRecalcs": 15,
"styleRecalcDurationMs": 27.659000000000002,
"layouts": 4,
"layoutDurationMs": 14.426000000000002,
"taskDurationMs": 726.725,
"heapDeltaBytes": 4312848,
"heapUsedBytes": 79794688,
"domNodes": 13833,
"jsHeapTotalBytes": 18087936,
"scriptDurationMs": 26.119000000000003,
"eventListeners": 2527,
"totalBlockingTimeMs": 166,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8148.506999999995,
"styleRecalcs": 251,
"styleRecalcDurationMs": 53.80700000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3538.25,
"heapDeltaBytes": 17964576,
"heapUsedBytes": 74299896,
"domNodes": -265,
"jsHeapTotalBytes": 9363456,
"scriptDurationMs": 1210.6000000000001,
"eventListeners": -118,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8168.407000000002,
"styleRecalcs": 250,
"styleRecalcDurationMs": 54.019,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3586.276,
"heapDeltaBytes": 13373124,
"heapUsedBytes": 77919616,
"domNodes": -263,
"jsHeapTotalBytes": 6250496,
"scriptDurationMs": 1217.49,
"eventListeners": -145,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 12019.226000000002,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 11999.727,
"heapDeltaBytes": -31659968,
"heapUsedBytes": 168644504,
"domNodes": -3302,
"jsHeapTotalBytes": 19107840,
"scriptDurationMs": 586.951,
"eventListeners": -16472,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 12787.53699999993,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12773.485,
"heapDeltaBytes": -41550576,
"heapUsedBytes": 169639020,
"domNodes": -3302,
"jsHeapTotalBytes": 20942848,
"scriptDurationMs": 589.6139999999999,
"eventListeners": -16473,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 14798.371999999972,
"styleRecalcs": 70,
"styleRecalcDurationMs": 17.641999999999992,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14775.66,
"heapDeltaBytes": -32934076,
"heapUsedBytes": 179750720,
"domNodes": -3302,
"jsHeapTotalBytes": 19546112,
"scriptDurationMs": 888.1380000000001,
"eventListeners": -16470,
"totalBlockingTimeMs": 44,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 15032.725999999911,
"styleRecalcs": 70,
"styleRecalcDurationMs": 17.569000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 15010.904999999997,
"heapDeltaBytes": -56506148,
"heapUsedBytes": 160054204,
"domNodes": -3304,
"jsHeapTotalBytes": 20680704,
"scriptDurationMs": 866.6859999999999,
"eventListeners": -16470,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 470.5020000000104,
"styleRecalcs": 24,
"styleRecalcDurationMs": 29.419,
"layouts": 5,
"layoutDurationMs": 1.7189999999999999,
"taskDurationMs": 134.008,
"heapDeltaBytes": 5455136,
"heapUsedBytes": 65033440,
"domNodes": 192,
"jsHeapTotalBytes": 3407872,
"scriptDurationMs": 18.291,
"eventListeners": 69,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66666666666665,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 463.87700000002496,
"styleRecalcs": 17,
"styleRecalcDurationMs": 22.674999999999997,
"layouts": 4,
"layoutDurationMs": 0.9759999999999999,
"taskDurationMs": 173.736,
"heapDeltaBytes": -22345452,
"heapUsedBytes": 47420176,
"domNodes": -219,
"jsHeapTotalBytes": 5156864,
"scriptDurationMs": 16.245,
"eventListeners": -134,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
}
]
} |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/platform/missingModel/missingModelScan.ts`:
- Around line 246-259: The fallback lookup using only the model name on line 250
can match candidates across multiple directories, causing incorrect enrichment
of directory/url/hash properties based on iteration order. Before using the
fallback candidates, validate that they don't represent ambiguous matches across
different directories. If the fallback candidates exist in multiple directories,
skip the enrichment loop to avoid stamping wrong directory/url/hash values, only
proceeding with enrichment when the match is unambiguous or the candidate lacks
a directory specification.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 6f8f890d-edd2-49c7-9770-d24616c15ed9
📒 Files selected for processing (12)
browser_tests/fixtures/helpers/TemplateHelper.tsbrowser_tests/fixtures/helpers/WorkflowHelper.tsbrowser_tests/tests/nodeHelp.spec.tsbrowser_tests/tests/propertiesPanel/errorsTabMissingModels.spec.tsbrowser_tests/tests/templateFilteringCount.spec.tssrc/platform/missingModel/__fixtures__/activeSubgraphUnmatchedModel.jsonsrc/platform/missingModel/__fixtures__/bypassedSubgraphUnmatchedModel.jsonsrc/platform/missingModel/missingModelPipeline.test.tssrc/platform/missingModel/missingModelPipeline.tssrc/platform/missingModel/missingModelScan.test.tssrc/platform/missingModel/missingModelScan.tssrc/platform/missingModel/types.ts
💤 Files with no reviewable changes (2)
- src/platform/missingModel/fixtures/activeSubgraphUnmatchedModel.json
- src/platform/missingModel/fixtures/bypassedSubgraphUnmatchedModel.json
| for (const model of deduped) { | ||
| const dirKey = `${model.name}::${model.directory}` | ||
| const exact = candidatesByKey.get(dirKey) | ||
| const fallback = candidatesByKey.get(model.name) | ||
| const existing = exact?.length ? exact : fallback | ||
| if (existing) { | ||
| for (const c of existing) { | ||
| if (c.directory && c.directory !== model.directory) continue | ||
| c.directory ??= model.directory | ||
| c.url ??= model.url | ||
| c.hash ??= model.hash | ||
| c.hashType ??= model.hash_type | ||
| } | ||
| } else { | ||
| unmatched.push(model) | ||
| if (!existing) continue | ||
| for (const c of existing) { | ||
| if (c.directory && c.directory !== model.directory) continue | ||
| c.directory ??= model.directory | ||
| c.url ??= model.url | ||
| c.hash ??= model.hash | ||
| c.hashType ??= model.hash_type | ||
| } | ||
| } |
There was a problem hiding this comment.
Prevent ambiguous name-only enrichment across multiple directories.
Line 250 falls back to model.name even when that name exists in multiple
embedded directories. For candidates without directory, this can stamp the
wrong directory/url/hash based on iteration order.
Suggested fix
const deduped: ModelFile[] = []
const enrichedKeys = new Set<string>()
+ const modelDirsByName = new Map<string, Set<string | undefined>>()
for (const model of embeddedModels) {
const dedupeKey = `${model.name}::${model.directory}`
if (enrichedKeys.has(dedupeKey)) continue
enrichedKeys.add(dedupeKey)
deduped.push(model)
+
+ const dirs = modelDirsByName.get(model.name) ?? new Set<string | undefined>()
+ dirs.add(model.directory)
+ modelDirsByName.set(model.name, dirs)
}
for (const model of deduped) {
const dirKey = `${model.name}::${model.directory}`
const exact = candidatesByKey.get(dirKey)
const fallback = candidatesByKey.get(model.name)
- const existing = exact?.length ? exact : fallback
+ const canUseNameFallback = (modelDirsByName.get(model.name)?.size ?? 0) <= 1
+ const existing = exact?.length
+ ? exact
+ : canUseNameFallback
+ ? fallback
+ : undefined
if (!existing) continue
for (const c of existing) {
if (c.directory && c.directory !== model.directory) continue
c.directory ??= model.directory
c.url ??= model.url🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/platform/missingModel/missingModelScan.ts` around lines 246 - 259, The
fallback lookup using only the model name on line 250 can match candidates
across multiple directories, causing incorrect enrichment of directory/url/hash
properties based on iteration order. Before using the fallback candidates,
validate that they don't represent ambiguous matches across different
directories. If the fallback candidates exist in multiple directories, skip the
enrichment loop to avoid stamping wrong directory/url/hash values, only
proceeding with enrichment when the match is unambiguous or the candidate lacks
a directory specification.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #13000 +/- ##
==========================================
+ Coverage 76.06% 76.27% +0.20%
==========================================
Files 1573 1573
Lines 95592 100749 +5157
Branches 28860 30380 +1520
==========================================
+ Hits 72710 76842 +4132
- Misses 22094 23116 +1022
- Partials 788 791 +3
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 286 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Draft canary PR to exercise CI with the models metadata-only change plus the two independent E2E stabilizer PRs together.
This is intentionally not intended for merge. It exists only to verify whether the combined test surface is green before marking the two E2E stabilizer PRs ready for review.