> For AI agents: the complete documentation index is available at https://mfdoctor.kevinbeier.com/de/llms.txt, the full documentation bundle is available at https://mfdoctor.kevinbeier.com/de/llms-full.txt.

<!-- mfdoctor locale: de. Technische Bezeichner, CLI-Flags, Regel-IDs, Links und Codebeispiele bleiben byte-kompatibel mit dem kanonischen englischen Vertrag. -->

> Dies ist die deutsche mfdoctor-Dokumentation. Technische Bezeichner, CLI-Flags, Regel-IDs und Codebeispiele bleiben unverändert, damit die Inhalte zwischen den Sprachen vollständig kompatibel bleiben. Verwenden Sie den Sprachumschalter für die kanonische englische Fassung.

# 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](https://mfdoctor.kevinbeier.com/de/compatibility.md)).
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](https://mfdoctor.kevinbeier.com/de/compatibility.md).

Roadmap: [v1.0](https://github.com/tonoizer/module-federation-doctor/milestone/1)
· [post-v1](https://github.com/tonoizer/module-federation-doctor/milestone/2)
· epic [#30](https://github.com/tonoizer/module-federation-doctor/issues/30).

## v1.0 (governance-ready)

The v1 [compatibility matrix](https://mfdoctor.kevinbeier.com/de/compatibility.md) for Vite / Rolldown /
Vite Plus / Rspack / Rsbuild / Webpack / Modern.js (**partial**), Node engines,
package managers, and report surfaces has shipped
([#15](https://github.com/tonoizer/module-federation-doctor/issues/15),
`MFDOCTOR-106`).

Dynamic Module Federation import patterns are covered at the documented
[completeness bar](https://mfdoctor.kevinbeier.com/de/capabilities.md#dynamic-import-completeness-v1): 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](https://github.com/tonoizer/module-federation-doctor/issues/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](https://github.com/tonoizer/module-federation-doctor/issues/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](https://mfdoctor.kevinbeier.com/de/report-schemas.md) and the [public API surface](https://mfdoctor.kevinbeier.com/de/api.md).
An HTML analysis UI
([#13](https://github.com/tonoizer/module-federation-doctor/issues/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](https://mfdoctor.kevinbeier.com/de/compatibility.md). 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.

## Was mfdoctor abdeckt

| Path                                                                                   | Covered?                                      |
| -------------------------------------------------------------------------------------- | --------------------------------------------- |
| Bundler MF plugin + mfdoctor adapter + shared `mfOptions` (including `runtimePlugins`) | Yes, primary                                  |
| CLI `check` with explicit `moduleFederation` / `module-federation.config`              | Partial (config/imports; weaker without emit) |
| On-disk / deployed `mf-manifest.json` (`check` on-disk manifests / `probe`)            | Producer/deploy evidence only                 |
| `mfdoctor runtime` + Observability export                                              | Opt-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`](https://mfdoctor.kevinbeier.com/de/rules/vite/host-init-inject-ssr.md) 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](https://mfdoctor.kevinbeier.com/de/vite-integration.md#vite-only-options).

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

| Bundler                                              | Public SSR inject surface mfdoctor uses today                                            | Host-init analogue of `hostInitInjectLocation`                                                                                                                       |
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Vite (including Nuxt / Rolldown Vite-under-the-hood) | `hostInitInjectLocation` (`html` vs `entry`)                                             | [`vite/host-init-inject-ssr`](https://mfdoctor.kevinbeier.com/de/rules/vite/host-init-inject-ssr.md)                                                                 |
| Rsbuild                                              | `pluginModuleFederation` second argument (`target` / `environment` / `ssrDir`)           | None. Wrong placement is [`config/rsbuild-mf-api-generation`](https://mfdoctor.kevinbeier.com/de/rules/config/rsbuild-mf-api-generation.md), 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 switch                                                         | Copied Vite keys → [`config/copied-vite-options-on-webpack`](https://mfdoctor.kevinbeier.com/de/rules/config/copied-vite-options-on-webpack.md)                      |

mfdoctor **skips** `vite/host-init-inject-ssr` on non-Vite bundlers. That skip
is intentional, not [`doctor/partial-analysis`](https://mfdoctor.kevinbeier.com/de/rules/doctor/partial-analysis.md).
Do not invent an Rsbuild or Modern.js finding for a missing
`hostInitInjectLocation`. A follow-up rule needs a public option plus a fixture.

## Dauerhafte Garantien / keine Ziele

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](https://github.com/tonoizer/module-federation-doctor/issues/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](https://github.com/tonoizer/module-federation-doctor/blob/main/CONTRIBUTING.md#adapter-contract).

### Hinweise zur Topologie-/Produktions-Governance-Evidenz (MFDOCTOR-123)

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

| Rule                                       | Evidence                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `config/duplicate-plugin-registration`     | Webpack/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-manifest` | Webpack/Rspack/Rsbuild adapters classify public `output.publicPath`; Vite adapters classify public MF `publicPath`. Unobserved Vite/Rsbuild surfaces emit `doctor/partial-analysis`                                                                                                                                                                                                                                        |
| Remaining topology rules                   | Config / `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](https://github.com/tonoizer/module-federation-doctor/issues/32),
`MFDOCTOR-115`). An in-browser mfdoctor runtime agent is **not planned**
([#33](https://github.com/tonoizer/module-federation-doctor/issues/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](https://github.com/tonoizer/module-federation-doctor/issues/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](https://github.com/tonoizer/module-federation-doctor/issues/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](https://mfdoctor.kevinbeier.com/de/observability-runtime.md) and
[setup](https://mfdoctor.kevinbeier.com/de/setup.md).

**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.

## Governance der Shared-Nutzung (keine Ziele)

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.
