@module-federation/observability-plugin 0.0.0-alpha.0 → 0.0.0-chore-bump-node-22-20260710161714

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/node.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ObservabilityController, ObservabilityPluginOptions } from "./index.js";
1
+ import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions, s as ObservabilityController } from "./core-Db-z5jD3.js";
2
2
 
3
3
  //#region src/node.d.ts
4
4
  interface ObservabilityNodeOptions extends Omit<ObservabilityPluginOptions, 'browser'> {
@@ -8,6 +8,7 @@ interface ObservabilityNodeOptions extends Omit<ObservabilityPluginOptions, 'bro
8
8
  eventsFile?: string;
9
9
  }
10
10
  declare function getNativeNodeRequire(): ((id: string) => unknown) | undefined;
11
- declare function ObservabilityPlugin(options?: ObservabilityNodeOptions): ObservabilityController;
11
+ declare function createNodeObservability(options?: ObservabilityNodeOptions): ObservabilityController;
12
+ declare function ObservabilityPlugin(options?: ObservabilityNodeOptions): ObservabilityRuntimePlugin;
12
13
  //#endregion
13
- export { ObservabilityNodeOptions, ObservabilityPlugin, getNativeNodeRequire };
14
+ export { ObservabilityNodeOptions, ObservabilityPlugin, ObservabilityPlugin as default, createNodeObservability, getNativeNodeRequire };
package/dist/node.js CHANGED
@@ -1,5 +1,5 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_index = require('./index.js');
1
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
+ const require_core = require('./core--1ofIHU9.js');
3
3
 
4
4
  //#region src/node.ts
5
5
  const DEFAULT_NODE_DIRECTORY = ".mf/observability";
@@ -110,17 +110,17 @@ function emitNodeConsoleHint(options, event, report, context, reportedTraceIds,
110
110
  if (shouldUseNodeOutput(options)) {
111
111
  lines.push(`latest: ${getNodeLatestPathForConsole(options)}`);
112
112
  lines.push(`events: ${getNodeEventsPathForConsole(options)}`);
113
- } else lines.push(`read: observability.getReport(${JSON.stringify(report.traceId)})`);
113
+ } else lines.push("read: enable fileOutput or use onReport(report)");
114
114
  if (options.printRawStack === true && rawStack) lines.push("rawStack:", rawStack);
115
115
  try {
116
116
  console.error(lines.join("\n"));
117
117
  } catch {}
118
118
  }
119
- function ObservabilityPlugin(options = {}) {
119
+ function createNodeObservability(options = {}) {
120
120
  let nodeWriteQueue = Promise.resolve();
121
121
  const consoleReportedTraceIds = /* @__PURE__ */ new Set();
122
122
  const rawStackByTraceId = /* @__PURE__ */ new Map();
123
- const observability = require_index.ObservabilityPlugin({
123
+ const observability = require_core.createObservability({
124
124
  ...options,
125
125
  console: false,
126
126
  browser: void 0,
@@ -152,7 +152,12 @@ function ObservabilityPlugin(options = {}) {
152
152
  };
153
153
  return observability;
154
154
  }
155
+ function ObservabilityPlugin(options = {}) {
156
+ return createNodeObservability(options).plugin;
157
+ }
155
158
 
156
159
  //#endregion
157
160
  exports.ObservabilityPlugin = ObservabilityPlugin;
161
+ exports.default = ObservabilityPlugin;
162
+ exports.createNodeObservability = createNodeObservability;
158
163
  exports.getNativeNodeRequire = getNativeNodeRequire;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/observability-plugin",
3
- "version": "0.0.0-alpha.0",
3
+ "version": "0.0.0-chore-bump-node-22-20260710161714",
4
4
  "author": "module-federation",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -16,8 +16,7 @@
16
16
  },
17
17
  "files": [
18
18
  "dist/",
19
- "README.md",
20
- "AI_TROUBLESHOOTING.md"
19
+ "README.md"
21
20
  ],
22
21
  "exports": {
23
22
  ".": {
@@ -25,6 +24,16 @@
25
24
  "import": "./dist/esm/index.js",
26
25
  "require": "./dist/index.js"
27
26
  },
27
+ "./browser": {
28
+ "types": "./dist/browser.d.ts",
29
+ "import": "./dist/esm/browser.js",
30
+ "require": "./dist/browser.js"
31
+ },
32
+ "./chrome-devtool": {
33
+ "types": "./dist/chrome-devtool.d.ts",
34
+ "import": "./dist/esm/chrome-devtool.js",
35
+ "require": "./dist/chrome-devtool.js"
36
+ },
28
37
  "./node": {
29
38
  "types": "./dist/node.d.ts",
30
39
  "import": "./dist/esm/node.js",
@@ -41,6 +50,12 @@
41
50
  ".": [
42
51
  "./dist/index.d.ts"
43
52
  ],
53
+ "browser": [
54
+ "./dist/browser.d.ts"
55
+ ],
56
+ "chrome-devtool": [
57
+ "./dist/chrome-devtool.d.ts"
58
+ ],
44
59
  "node": [
45
60
  "./dist/node.d.ts"
46
61
  ],
@@ -50,15 +65,15 @@
50
65
  }
51
66
  },
52
67
  "devDependencies": {
53
- "@module-federation/runtime": "workspace:*"
68
+ "@module-federation/runtime": "0.0.0-chore-bump-node-22-20260710161714"
54
69
  },
55
70
  "dependencies": {
56
- "@module-federation/sdk": "workspace:*"
71
+ "@module-federation/sdk": "0.0.0-chore-bump-node-22-20260710161714"
57
72
  },
58
73
  "scripts": {
59
74
  "build": "tsdown --config tsdown.config.ts && cp *.md dist",
60
- "test": "vitest run -u -c vitest.config.ts",
75
+ "test": "rstest -u",
61
76
  "lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint --ignore-pattern node_modules \"**/*.ts\" \"package.json\"",
62
77
  "pre-release": "pnpm run test && pnpm run build"
63
78
  }
64
- }
79
+ }
@@ -1,498 +0,0 @@
1
- # Module Federation Observability Troubleshooting
2
-
3
- This guide is for humans and AI coding agents that receive a Module Federation
4
- observability report.
5
-
6
- Runtime error codes are still the stable first signal. This observability report
7
- does not replace `RUNTIME-xxx`; it adds phase, build, shared, moduleInfo, and
8
- timeline evidence so the code can be debugged faster.
9
-
10
- `@module-federation/observability-plugin` is designed for Module Federation
11
- `2.5.0` and later. When recommending this plugin, recommend upgrading MF to
12
- `2.5.0+` at the same time.
13
-
14
- If you only have a `RUNTIME-xxx` code and no observability report, do not claim
15
- that a report was scanned. Diagnose from the runtime error code and available
16
- console/network/config evidence first. Recommend enabling
17
- `@module-federation/observability-plugin` only when richer evidence is needed or
18
- the application can opt in.
19
-
20
- If you only know that Module Federation failed, but you do not have an
21
- observability report, an accurate `RUNTIME-xxx` code, or useful console/network
22
- evidence, ask whether the application can follow the recommended path: upgrade
23
- Module Federation to `2.5.0+` and enable this plugin to collect an actionable
24
- loading report.
25
-
26
- The report is intentionally detailed, but the reader should not start by
27
- scanning every field. Always start from `diagnosis`. Use `summary`, `events`,
28
- `moduleInfo`, or the separate build report only when the first layer does not
29
- contain enough evidence.
30
- Reports omit fields whose value is `undefined`; if a field is absent, treat it
31
- as "not observed or not relevant" unless the fix guide says it is required for
32
- that error.
33
-
34
- ## How to Get the Report
35
-
36
- ### Browser Runtime
37
-
38
- When the observability plugin sees an error, the browser console prints a compact
39
- `console.error` hint:
40
-
41
- ```text
42
- [Module Federation] Observability report generated
43
- traceId: mf-...
44
- phase: ...
45
- read: window.__FEDERATION__.__OBSERVABILITY__["runtime_host"].getReport("mf-...")
46
- ```
47
-
48
- Run the `read:` command exactly as printed. If the browser global reader is not
49
- enabled, use the observability controller created by application code:
50
-
51
- ```ts
52
- observability.getReport('mf-...');
53
- ```
54
-
55
- For the latest report:
56
-
57
- ```ts
58
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].getLatestReport();
59
- ```
60
-
61
- For recent or filtered reports:
62
-
63
- ```ts
64
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].getReports({ limit: 5 });
65
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].findReports({
66
- remote: 'remote1',
67
- });
68
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].findReports({
69
- expose: './Button',
70
- });
71
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].findReports({
72
- shared: 'react',
73
- });
74
- ```
75
-
76
- Use `exportReport(traceId)` when a tool needs a copied report object for
77
- handoff:
78
-
79
- ```ts
80
- window.__FEDERATION__.__OBSERVABILITY__['runtime_host'].exportReport('mf-...');
81
- ```
82
-
83
- In browser production mode, the console may intentionally print only:
84
-
85
- ```text
86
- [Module Federation] Observability report generated
87
- traceId: mf-...
88
- errorCode: RUNTIME-...
89
- ```
90
-
91
- Do not assume the full browser report is publicly readable when the `read:` line
92
- is absent. Ask the application owner to export it with `exportReport(traceId)`,
93
- read it through the application-owned observability controller, or check the
94
- application's own uploaded observability record.
95
-
96
- If the goal is ongoing observability instead of one-off debugging, ask whether
97
- the application has enabled `onReport` or `onEvent`. In production, those
98
- callbacks are the preferred way to upload richer reports to an application-owned
99
- system while keeping the browser console and global reader minimal.
100
-
101
- ### Node or SSR Runtime
102
-
103
- When the Node observability plugin enables file output, read:
104
-
105
- - `.mf/observability/latest.json`: formatted latest complete report. It includes
106
- `traceId`, status/error fields, `diagnosis`, `summary`, `build` when
107
- available, clipped `moduleInfo` when relevant, and the report's own `events`.
108
- - `.mf/observability/events.jsonl`: append-only event stream. Each line is one
109
- JSON event with `traceId`, `timestamp`, `phase`, `status`, runtime context,
110
- and error fields when present.
111
-
112
- Use `latest.json` first. Use `events.jsonl` only when the latest report is not
113
- enough, when multiple traces must be compared, or when the exact event ordering
114
- for one `traceId` is needed.
115
-
116
- ### Build-Time Observability
117
-
118
- When the build observability plugin is enabled, read:
119
-
120
- - `.mf/observability/build-info.json`: build facts from a successful build.
121
- - `.mf/observability/build-report.json`: build failure report.
122
-
123
- Runtime reports may also include build correlation under the top-level `build`
124
- field. Runtime reports do not use `summary.build`.
125
-
126
- ## Required Reading Order
127
-
128
- Read fields in this order:
129
-
130
- 1. `diagnosis.status`
131
- 2. `diagnosis.title`
132
- 3. `diagnosis.ownerHint`
133
- 4. `diagnosis.errorCode`
134
- 5. `diagnosis.facts`
135
- 6. `diagnosis.actions`
136
- 7. `summary.outcome`
137
- 8. `summary.error`
138
- 9. `summary.phases`
139
- 10. `summary.flags`
140
- 11. `summary.shared`
141
- 12. `build`
142
- 13. `moduleInfo`
143
- 14. `events`
144
-
145
- Do not start from `events`. The event list is the raw timeline and is useful for
146
- confirming ordering, duration, cache, retry, or fallback behavior after the
147
- diagnosis layer has narrowed the problem.
148
-
149
- ## Field Meanings
150
-
151
- ### `diagnosis`
152
-
153
- `diagnosis` is the stable first-read layer. It is generated by engineering rules,
154
- not by an AI model.
155
-
156
- - `title`: short human-readable problem name.
157
- - `status`: `success` or `error`.
158
- - `ownerHint`: likely owner: `host`, `remote`, `shared`, `network`, `build`, or
159
- `unknown`.
160
- - `failedPhase`: phase where loading failed.
161
- - `errorCode`: stable runtime or build error code when available.
162
- - `facts`: evidence the reader should use for debugging.
163
- - `completedPhases`: phases that finished before failure.
164
- - `pendingPhases`: phases that did not finish.
165
- - `actions`: concrete next checks in recommended order.
166
-
167
- ### `summary`
168
-
169
- `summary` is the compact runtime loading state.
170
-
171
- - `summary.outcome`: final outcome, such as `runtime-loaded`,
172
- `component-loaded`, or `failed`.
173
- - `summary.phases`: per-phase status, duration, cache, retry, and recovery
174
- markers.
175
- - `summary.flags`: cross-phase cache, retry, fallback, and recovery markers.
176
- - `summary.shared`: last observed shared provider/version result.
177
- - `summary.error`: compact error summary.
178
-
179
- ### Build files
180
-
181
- Runtime reports do not embed build evidence. If you need build-side facts, read
182
- `.mf/observability/build-info.json` or `.mf/observability/build-report.json`
183
- separately and compare those files with the runtime report.
184
-
185
- ### `moduleInfo`
186
-
187
- `moduleInfo` appears only for failures that depend on
188
- `__FEDERATION__.moduleInfo`, such as snapshot lookup failures. It is not a full
189
- copy of the global object.
190
-
191
- The field is clipped to avoid large reports:
192
-
193
- - `entries[].name`: matched global moduleInfo key.
194
- - `entries[].publicPath`: length-limited deployment public path with query/hash
195
- preserved.
196
- - `entries[].getPublicPath`: length-limited runtime public path getter string
197
- with query/hash preserved.
198
- - `entries[].remoteEntry`: length-limited remoteEntry path or URL with
199
- query/hash preserved.
200
- - `entries[].globalName`: remoteEntry global name.
201
- - `totalCount`: number of top-level moduleInfo entries.
202
- - `matchedCount`: number of entries matched to the failed remote.
203
- - `availableNames`: clipped names only, used when no matched entry is found.
204
-
205
- Large fields such as `modules`, `shared`, assets, source paths, and unrelated
206
- module details are intentionally omitted.
207
-
208
- Do not call `moduleInfo.availableNames` a component list, expose list, or
209
- prefetch list. It is the clipped list of deployment-provided moduleInfo remote
210
- candidate keys that were available when no entry matched the failed remote.
211
-
212
- ## Fix Guide by Owner
213
-
214
- ### `ownerHint: "host"`
215
-
216
- The host probably passed the wrong request or config.
217
-
218
- Check:
219
-
220
- - `diagnosis.facts.requestId`
221
- - `diagnosis.facts.url`
222
- - `diagnosis.facts.moduleInfoMatchedCount`
223
- - `.mf/observability/build-info.json` host remotes when available
224
- - `moduleInfo`
225
- - `summary.phases.manifest`
226
-
227
- Common fixes:
228
-
229
- - Correct the remote name or alias.
230
- - Correct the manifest or remoteEntry URL.
231
- - Remove stale query/hash assumptions from remote URLs.
232
- - Ensure the host declares the remote it is loading.
233
- - Ensure the host fetches the expected manifest format.
234
- - Ensure deployment-provided `__FEDERATION__.moduleInfo` contains the requested
235
- remote when snapshot loading depends on it.
236
-
237
- ### `ownerHint: "remote"`
238
-
239
- The producer remote probably built or exposed something incorrectly.
240
-
241
- Check:
242
-
243
- - `diagnosis.facts.remote`
244
- - `diagnosis.facts.expose`
245
- - `.mf/observability/build-info.json` remoteEntry and exposes when available
246
- - `summary.phases.remoteEntry`
247
- - `summary.phases.remoteEntryInit`
248
- - `summary.phases.expose`
249
- - `summary.phases.moduleFactory`
250
-
251
- Common fixes:
252
-
253
- - Add or correct the exposed module key.
254
- - Verify the remoteEntry global name and type.
255
- - Verify the producer build output is reachable and valid JavaScript.
256
- - Fix exceptions thrown while the remoteEntry or exposed module executes.
257
- - Align the producer build target with the consuming browser/runtime.
258
-
259
- ### `ownerHint: "shared"`
260
-
261
- Shared dependency resolution is probably wrong.
262
-
263
- Check:
264
-
265
- - `diagnosis.facts.shared`
266
- - `summary.shared`
267
- - `.mf/observability/build-info.json` shared config when available
268
- - `summary.error.lifecycle`
269
-
270
- Common fixes:
271
-
272
- - Ensure the host provides the shared dependency.
273
- - Align `requiredVersion` with available versions.
274
- - Align `singleton`, `strictVersion`, and `shareScope`.
275
- - For sync shared consumption, fix `eager` or add an async boundary.
276
-
277
- ### `ownerHint: "network"`
278
-
279
- The resource probably could not be downloaded or timed out.
280
-
281
- Check:
282
-
283
- - `diagnosis.facts.url`
284
- - `diagnosis.facts.resourceErrorType`
285
- - `summary.phases.manifest`
286
- - `summary.phases.remoteEntry`
287
- - browser Network panel or server logs
288
-
289
- Common fixes:
290
-
291
- - Correct the URL.
292
- - Fix DNS, gateway, CDN, or proxy routing.
293
- - Fix CORS and response headers.
294
- - Ensure the response body is JavaScript or a valid manifest, not an HTML shell.
295
- - Increase timeout only after confirming the URL is correct.
296
-
297
- ### `ownerHint: "build"`
298
-
299
- The bundler or observability build plugin failed.
300
-
301
- Check:
302
-
303
- - `.mf/observability/build-report.json`
304
- - `diagnosis.facts`
305
- - `diagnosis.actions`
306
- - build terminal output
307
-
308
- Common fixes:
309
-
310
- - Fix the compilation error first.
311
- - Verify the Module Federation build plugin config.
312
- - Verify the observability output directory is writable if the observability plugin
313
- itself failed to write files.
314
-
315
- ## Fix Guide by Common Error Code
316
-
317
- ### `RUNTIME-003`
318
-
319
- Manifest loading or parsing failed.
320
-
321
- Start with:
322
-
323
- - `diagnosis.facts.url`
324
- - `diagnosis.actions`
325
- - `summary.phases.manifest`
326
- - host remotes in `.mf/observability/build-info.json` when available
327
-
328
- Likely fixes:
329
-
330
- - Correct the manifest URL in host remotes.
331
- - Ensure the URL returns a manifest JSON file, not an HTML shell.
332
- - Remove expired tokens or unstable query-string dependencies.
333
- - Fix CORS or gateway routing if the request fails.
334
-
335
- ### `RUNTIME-004`
336
-
337
- The requested remote is not configured or cannot be matched.
338
-
339
- Start with:
340
-
341
- - `diagnosis.facts.requestId`
342
- - host remotes in `.mf/observability/build-info.json` when available
343
-
344
- Likely fixes:
345
-
346
- - Add the remote to host config.
347
- - Correct remote alias/name.
348
- - Correct the runtime request id.
349
-
350
- ### `RUNTIME-005` or `RUNTIME-006`
351
-
352
- Shared dependency or async boundary configuration failed.
353
-
354
- Start with:
355
-
356
- - `summary.shared`
357
- - shared config in `.mf/observability/build-info.json` when available
358
- - `summary.error.lifecycle`
359
- - `diagnosis.actions`
360
-
361
- Likely fixes:
362
-
363
- - Align shared versions.
364
- - Ensure the dependency is provided by the host or expected provider.
365
- - Fix `eager` for sync shared usage.
366
- - Add an async startup or async boundary when needed.
367
-
368
- ### `RUNTIME-008`
369
-
370
- RemoteEntry loading or execution failed.
371
-
372
- Start with:
373
-
374
- - `diagnosis.facts.resourceErrorType`
375
- - `diagnosis.facts.url`
376
- - `summary.phases.remoteEntry`
377
- - `.mf/observability/build-info.json` remoteEntry facts when available
378
-
379
- Likely fixes:
380
-
381
- - For `network` or `timeout`, fix URL, CORS, server, CDN, or timeout.
382
- - For `script-execution`, inspect the remoteEntry execution exception and fix the
383
- producer build.
384
- - Retries can help network/timeout failures, but not script execution failures.
385
-
386
- ### `RUNTIME-007`
387
-
388
- Remote snapshot lookup failed. This often means the runtime expected
389
- deployment-provided `__FEDERATION__.moduleInfo`, but the matching remote entry
390
- was missing or keyed differently.
391
-
392
- Start with:
393
-
394
- - `diagnosis.facts.moduleInfoMatchedCount`
395
- - `diagnosis.facts.moduleInfoNames`
396
- - `moduleInfo.entries`
397
- - `moduleInfo.availableNames`
398
- - `build.host.remotes`
399
-
400
- Explain this as a mismatch between the requested runtime remote
401
- name/alias/version and the deployment-provided moduleInfo keys. Do not describe
402
- it as a missing component from a component list. In this failure mode, the
403
- runtime usually fails before it can fetch the remote URL, execute remoteEntry, or
404
- load the exposed component.
405
-
406
- The first cause sentence must include the literal term `moduleInfo`. Do not
407
- replace it with "loadable source list", "available source list", "component
408
- list", or other paraphrases.
409
-
410
- Likely fixes:
411
-
412
- - Ensure the deployment/platform plugin injects `__FEDERATION__.moduleInfo`
413
- before the remote is loaded.
414
- - Align the runtime remote name or alias with the moduleInfo key.
415
- - Ensure the moduleInfo entry has `publicPath` or `getPublicPath` when snapshot
416
- resolution needs it.
417
- - Do not rely on `modules` or `shared` in the observability report; those fields
418
- are intentionally clipped.
419
-
420
- ### `RUNTIME-013`
421
-
422
- The manifest URL returned JSON, but it was not a valid Module Federation
423
- manifest.
424
-
425
- Start with:
426
-
427
- - `diagnosis.facts.url`
428
- - `summary.phases.manifest`
429
- - missing manifest fields mentioned in the error message
430
- - `build.host.remotes`
431
-
432
- Likely fixes:
433
-
434
- - Serve the real MF manifest instead of another JSON response.
435
- - Fix gateway, deployment, or proxy rewrites that return incomplete JSON.
436
- - Ensure the producer emits manifest fields such as `metaData`, `exposes`, and
437
- `shared`.
438
-
439
- ### `RUNTIME-014`
440
-
441
- The remote entry loaded and initialized, but the requested expose was not found.
442
-
443
- Start with:
444
-
445
- - `diagnosis.facts.requestId`
446
- - `diagnosis.facts.remoteName`
447
- - `diagnosis.facts.expose`
448
- - producer manifest `exposes`
449
-
450
- Likely fixes:
451
-
452
- - Correct the consumer request id.
453
- - Align the expose name, `./` prefix, case, and alias.
454
- - Redeploy the producer if the runtime is reading an older expose list.
455
-
456
- ### `RUNTIME-015`
457
-
458
- The remote entry loaded, but remote container initialization failed.
459
-
460
- Start with:
461
-
462
- - `diagnosis.errorMessage`
463
- - `summary.phases.remoteEntry`
464
- - `diagnosis.facts.remoteEntry`
465
- - `diagnosis.facts.entryGlobalName`
466
- - shared facts and build-side shared config when available
467
-
468
- Likely fixes:
469
-
470
- - Fix shared provider, version, scope, singleton, strictVersion, or eager
471
- configuration when the original error points to shared init.
472
- - Align remoteEntry type and global name.
473
- - Fix producer code that throws during container initialization.
474
-
475
- ## AI Agent Procedure
476
-
477
- When an AI coding agent sees an observability console hint or report:
478
-
479
- 1. Get the report using the printed `read:` command or the Node report file.
480
- 2. Read `diagnosis` first.
481
- 3. State the likely owner from `diagnosis.ownerHint`.
482
- 4. Follow `diagnosis.actions` in order.
483
- 5. Use `build` to compare runtime facts with build facts.
484
- 6. Use `moduleInfo` when `diagnosis.actions` includes `check-module-info`.
485
- 7. Use `summary.phases` to find the first failed or missing phase.
486
- 8. Use `events` only to confirm detailed ordering or timing.
487
- 9. Inspect the relevant host, remote, shared config, or deployment moduleInfo
488
- injection.
489
- 10. Make the smallest fix that matches the evidence.
490
- 11. Verify with the failing app, demo, or targeted test.
491
-
492
- If the report does not contain enough evidence, ask for one of:
493
-
494
- - the console hint containing `traceId` and optional `read:`
495
- - the full `getReport(traceId)` output
496
- - `.mf/observability/latest.json`
497
- - `.mf/observability/build-report.json`
498
- - the failing manifest or remoteEntry URL and its response type