Compatibility matrix
Documented and CI-exercised support for every bundler and runtime mfdoctor claims in v1. Status labels are tied to analysis capabilities and real build+mfdoctor paths, not fixture-only confidence.
Related: capabilities ·
limitations ·
#15
(MFDOCTOR-106).
Status labels
Bundlers
Variant coverage
The machine-readable contract lives in
fixtures/compatibility-matrix.json.
It distinguishes reproducible local CI cells from unit contracts and pinned
upstream validation records:
The upstream rows are evidence records, not release claims: CI uses pinned local fixtures so a moving external repository cannot silently change the release gate. Refresh the pinned ref and rerun the external validation before changing a row's status.
Nuxt 3 / Nuxt 4 use the partial adapter @tonoizer/mfdoctor/nuxt.
It hooks the public vite:extendConfig API. The local emit cell at
examples/compatibility/nuxt
registers that module and production-builds (Vite-under-the-hood). A full @module-federation/nuxt application build remains
dependent on the upstream package-resolution issue tracked in
nuxt/nuxt#36009, so Nuxt is not a
first-class supported CI gate.
Rolldown / Vite Plus use the same @tonoizer/mfdoctor/vite entry as classic
Vite. The local emit cell at
examples/compatibility/rolldown
aliases vite to Vite Plus and production-builds. Reports keep
partial-bundler for this lifecycle, so the matrix cell stays partial.
Runtime-only Module Federation (no bundler MF build plugin) is unsupported as a first-class path, see limitations and #34.
Next.js Module Federation (@module-federation/nextjs-mf) is unsupported.
There is no adapter and none is planned, prefer Rsbuild or Modern.js. See
limitations.
Analysis depth (partial honesty)
*Runtime traces are opt-in and never fetch remote URLs or execute remote JS.
Partial cells must not silently skip gaps. Prefer
doctor/partial-analysis over false
certainty (shared/unused, invented remotes, scraped private plugin fields).
Runtime capture compatibility
Runtime capture is a separate, opt-in Node/offline boundary. The checked-in
contract at fixtures/runtime-capture-compatibility.json
and scripts/verify-runtime-capture-compatibility.mjs exercise the public
@tonoizer/mfdoctor/capture entry point after every package build:
The default @tonoizer/mfdoctor entry and bundler adapter entries do not expose
capture functions. Capture remains available only from the explicit
@tonoizer/mfdoctor/capture subpath, and no automatic browser agent is part of
the package.
Node.js
Package managers
Where paths differ: contributors and CI always use pnpm. Consumers of the
published tarball may use npm or yarn to install mfdoctor into their own app; the
CLI binary name remains mfdoctor.
Report surfaces
CI auto-detect (CI, GITHUB_ACTIONS, …) enables failOn: "error" and
terminal + JSON + SARIF without setting mode: "ci" in plugin config. The
compatibility workflow asserts report artifacts after each supported bundler
build. Terminal success lines stay off unless --verbose /
printLog.success / MFDOCTOR_QUIET=0 is set.
Failure policy (release blockers)
Reds that block a release claim for supported cells:
- Vite, Rspack, Rsbuild, or Webpack real build + mfdoctor path fails on Node 22
or 24 in the
compatibilityworkflow. - Missing mfdoctor artifacts after a green bundler build (
project.json,report.json, orresults.sarifon the CI path). - Quality / package / integration / e2e gates that already guard the adapters.
Reds that do not block other cells:
- npm/yarn consumer-path differences, documented partial; monorepo CI stays pnpm.
- Expected
doctor/partial-analysiswarnings on partial analysis paths, honest gaps, not matrix failures. - Rolldown / Vite Plus, documented partial (Vite Plus production smoke plus unit lifecycle hooks; not a supported release gate).
- Modern.js, documented partial (adapter API + Rspack-under-the-hood
smoke in
compatibility.yml). A real@modern-js/app-toolscell is blocked by this repo'strustPolicy: no-downgrade(current App Tools dropped npm provenance after2.63.3). Upstream core-demo re-soak remains #130. - Nuxt 3/4, documented partial (adapter + local emit smoke; upstream
@module-federation/nuxtapp build remains baseline-blocked; not a supported release gate). - Next.js (
@module-federation/nextjs-mf), documented unsupported (permanent non-goal; no adapter planned).
CI map
mf-toolkit shapes
mfdoctor soft-recognizes intentional mf-toolkit config shapes so agents do not get false broken-remote / component-DTS guidance:
Recognition defaults on when these signals are present. Disable with
recognizeMfToolkit: false in mfdoctor.config / adapter options, or turn the
specific rule "off" / use a fingerprint baseline. Soft-exceptions skip
findings rather than changing evidence shapes (fingerprint-stable for classic apps).
In-repo fixtures (no toolkit checkout): fixtures/mf-bridge-entry,
fixtures/mf-ssr-fragment, fixtures/shared-inspector-mf2. Full Bridge pack
coverage is #131,
not this compatibility note.