For AI agents: the complete documentation index is available at https://mfdoctor.kevinbeier.com/llms.txt, the full documentation bundle is available at https://mfdoctor.kevinbeier.com/llms-full.txt, and this page is available as Markdown at https://mfdoctor.kevinbeier.com/limitations.md.

Limitations

MVP supports Vite (including Rolldown-integrated Vite and Vite Plus as a partial matrix cell, Vite Plus production smoke plus unit lifecycle hooks; not a full supported claim yet), direct Rspack, Rsbuild, Webpack, and Modern.js as a partial matrix cell, adapter API plus an Rspack-under-the-hood smoke (not a full @modern-js/app-tools build in this lockfile; see compatibility). Gaps below are tracked as GitHub issues and milestones so each one can be removed from this page when it ships.

Next.js Module Federation (@module-federation/nextjs-mf / NextFederationPlugin) is unsupported. No mfdoctor adapter is planned. Prefer Rsbuild or Modern.js. See compatibility.

Roadmap: v1.0 · post-v1 · epic #30.

v1.0 (governance-ready)

The v1 compatibility matrix for Vite / Rolldown / Vite Plus / Rspack / Rsbuild / Webpack / Modern.js (partial), Node engines, package managers, and report surfaces has shipped (#15, MFDOCTOR-106).

Dynamic Module Federation import patterns are covered at the documented completeness bar: supported literals and runtime/manifest hints when evidence exists, with honest doctor/partial-analysis for unresolved dynamics, not a claim of 100% arbitrary runtime JS (#14, MFDOCTOR-105).

The mfdoctor plugin analyzes the current app (config + emit). Cross-app host↔remote shared/integration issues need each app's .mf/doctor/project.json plus the one-shot workspace gate (mfdoctor workspace / mfdoctor federation --workspace) or manual mfdoctor federation globs (#25, MFDOCTOR-109). Opt-in mfdoctor probe inspects a deployed manifest.

Opt-in browser runtime trace import is available through mfdoctor runtime when you supply an Observability Plugin export. Default check and federation analysis stay offline. When runtimeTrace is set on mfdoctor options, check also merges shared/remote hints from that export into import facts without fetching URLs or executing remote JavaScript.

mfdoctor does not ship an HTML dashboard or --ui server. Use terminal, JSON, and SARIF reports. buildUiPayload / schemas/ui.schema.json remain as a programmatic federation graph contract for custom tooling, see report schemas and the public API surface. An HTML analysis UI (#13) was closed as not planned.

post-v1

No open post-v1 adapter gaps right now. Rolldown / Vite Plus (#11) and Modern.js (#12) shipped as partial matrix cells, see compatibility. A real @modern-js/app-tools CI emit remains blocked by lockfile trustPolicy: no-downgrade (last provenance-attested stable is 2.63.3); the upstream core-demo re-soak is #130. Next.js is a permanent non-goal, not a deferred adapter.

What mfdoctor covers

PathCovered?
Bundler MF plugin + mfdoctor adapter + shared mfOptions (including runtimePlugins)Yes, primary
CLI check with explicit moduleFederation / module-federation.configPartial (config/imports; weaker without emit)
On-disk / deployed mf-manifest.json (check on-disk manifests / probe)Producer/deploy evidence only
mfdoctor runtime + Observability exportOpt-in live correlation, offline

MF runtimePlugins declared in bundler MF config are first-class: mfdoctor reads them from the shared mfOptions object at build time. That is not the same as analyzing a runtime-only host.

SSR host-init inject (Vite-only)

vite/host-init-inject-ssr is a Vite dialect check. It reads @module-federation/vite's public hostInitInjectLocation option and requires entry when SSR signals are present on a host with remotes. HTML injection never runs on the server, so federation bootstrap would otherwise be skipped. See Vite integration.

Rsbuild and Modern.js SSR hosts inject federation bootstrap through different public APIs. They do not have Vite's HTML-vs-entry switch:

BundlerPublic SSR inject surface mfdoctor uses todayHost-init analogue of hostInitInjectLocation
Vite (including Nuxt / Rolldown Vite-under-the-hood)hostInitInjectLocation (html vs entry)vite/host-init-inject-ssr
RsbuildpluginModuleFederation second argument (target / environment / ssrDir)None. Wrong placement is config/rsbuild-mf-api-generation, not a host-init sibling
Modern.js@module-federation/modern-js SSR plugin (partial adapter; Rspack-under-the-hood smoke)None until a documented public option and failing fixture exist
Webpack / Rspack (Enhanced)No Vite HTML/entry inject switchCopied Vite keys → config/copied-vite-options-on-webpack

mfdoctor skips vite/host-init-inject-ssr on non-Vite bundlers. That skip is intentional, not doctor/partial-analysis. Do not invent an Rsbuild or Modern.js finding for a missing hostInitInjectLocation. A follow-up rule needs a public option plus a fixture.

Permanent guarantees / non-goals

mfdoctor does not rely on undocumented private Module Federation plugin fields. That is a stability guarantee and permanent non-goal, not removable follow-up work. See #18.

Adapters and rules use public Module Federation options, emitted manifests, stats, and recorded capabilities only. They must not scrape private plugin instance state, undocumented internals, or other non-public compiler/plugin fields. Missing optional public input yields doctor/partial-analysis instead of reaching into private MF plugin state.

Adapter authors should use public Module Federation options and emitted build artifacts. Contribution guidance lives in the repository contribution guide.

Topology / production governance evidence notes (MFDOCTOR-123)

These rules are implemented; a few need compiler-observed facts that CLI-only check cannot invent:

RuleEvidence
config/duplicate-plugin-registrationWebpack/Rspack adapters count MF plugins via public .name (ModuleFederationPlugin, RspackModuleFederationPlugin) or constructor.name when .name is missing. Vite/Rsbuild adapters count public federation plugin registrations (module-federation-vite, rsbuild:module-federation-enhanced, and plugins that expose a public MF config). Distinct moduleFederationInstances are not treated as duplicates.
artifact/public-path-non-string-manifestWebpack/Rspack/Rsbuild adapters classify public output.publicPath; Vite adapters classify public MF publicPath. Unobserved Vite/Rsbuild surfaces emit doctor/partial-analysis
Remaining topology rulesConfig / project.json / remotes graph (mfdoctor federation)

mfdoctor does not scrape private Module Federation plugin fields for these checks, only public plugin name / constructor.name, public bundler output.publicPath, and Vite MF publicPath. When those adapters cannot observe a public publicPath field, they record doctor/partial-analysis instead of a silent skip.

mfdoctor is build/CI-only. Install it as a devDependency. Adapters run after emit in Node and must not appear in the client bundle (#32, MFDOCTOR-115). An in-browser mfdoctor runtime agent is not planned (#33, MFDOCTOR-116). mfdoctor stays plugin-primary, with a complementary CLI, and is never injected as an in-browser agent.

Runtime-only Module Federation apps, @module-federation/runtime / createInstance / runtime plugins without a Vite, Rspack, Rsbuild, Webpack, or Modern.js Module Federation build plugin, are out of scope for first-class support (#34, MFDOCTOR-117).

Without a bundler MF plugin there is usually no mfdoctor post-emit hook, no reliable emit/manifest from that app, and mfdoctor does not parse createInstance(...) from source. Manifest and probe coverage apply to producer artifacts that emit mf-manifest.json, not to "we inferred the whole runtime-only host."

mfdoctor analysis and the terminal findings showcase run only post-emit / after-build (writeBundle / closeBundle / afterEmit / onAfterBuild / Modern.js modifyBundlerChain → afterEmit). Adapters never register transform / load / client-injection hooks (#54).

Do not ship mfdoctor into the browser to close that gap. Prefer Observability exports + mfdoctor runtime, or add a bundler MF plugin + mfdoctor adapter. See Observability latest.json → mfdoctor runtime and setup.

Next.js Module Federation (@module-federation/nextjs-mf / NextFederationPlugin) is out of scope. Upstream support is Pages Router only and is no longer actively maintained. mfdoctor does not ship a Next.js adapter, and no Next adapter is planned. Prefer Rsbuild or Modern.js for new Module Federation apps. Do not start a Next.js adapter.

Shared-usage governance (non-goals)

mfdoctor closes high-value shared config gaps inspired by @mf-toolkit/shared-inspector (deep-import bypass, local-graph import depth, federation host gaps / ghost shares, expandable singleton/candidate lists via policy packs). mfdoctor does not duplicate RS Doctor duplicate-package treemaps, chunk graphs, or general bundle-size visualization, use RS Doctor or a bundler analyzer for those questions.