MetadataGraphResolver
Gate-and-order for plugin metadata arrays OUTSIDE the boot path: the same one-resolution semantics {@see PluginsManager} boots with, packaged for CLI consumers (deps/simulate) that used to lean on the deprecated ContractResolver. A blocked graph throws with the report's first learnable line; a resolvable graph returns the metadata resequenced to load order.
MetadataGraphResolver::order()
public function order(array $metadataArrays): arrayGate `$metadataArrays` through one {@see GraphResolver} resolution and resequence them to its `loadOrder`.
Parameters
| Name | Type | Description |
|---|---|---|
| $metadataArrays | list<array<string, mixed>> | name/version/type/provides/requires/suggests records |
Returns
The same records, resequenced to the resolver's load order.
Throws
\RuntimeException When the graph is blocked (message = learnable line).
\InvalidArgumentException When a record is malformed and the resolver refuses to ingest
it — e.g. a capability record with no contract version. It was
not declared here until a caller caught it in the wild: the
inspection operations were catching only `RuntimeException`,
so a malformed manifest escaped as a trace instead of an
answer. An undeclared throw is a contract that lies by
omission.
MetadataGraphResolver::diagnose()
public function diagnose(array $metadataArrays, ?string $raiz = null, string $cargador = 'Milpa\Resolver\Ingest\InstalledCapabilityLoader'): Milpa\Resolver\Report\ResolutionReportEl MISMO análisis que {@see order()}, pero contestando en vez de lanzar. ── POR QUÉ HACÍA FALTA ───────────────────────────────────────────────────────────────────── `order()` corre en el arranque, y ahí lanzar es correcto: un grafo que no cierra no puede producir un orden de carga, y seguir sería fingir. Lo que no era correcto es lo que se perdía en el camino — el resolver produce un {@see ResolutionReport} COMPLETO (qué falta, qué choca, qué se degrada, a qué lección lleva cada error) y de todo eso sólo sobrevivía la primera línea, como mensaje de una excepción. Y se perdía justo cuando más se necesitaba: con el grafo roto la app no bootea, así que `coa` no despacha, así que NINGUNA herramienta de diagnóstico corre. Medido en una app de ejemplo con una capacidad sin proveedor: las quince herramientas del agente caídas, y una línea de error como único dato. La diagnosis moría con el paciente. Esto es el mismo cálculo, disponible ANTES de bootear y sin bootear nada.
Parameters
| Name | Type | Description |
|---|---|---|
| $metadataArrays | list<array<string, mixed>> | name/version/type/provides/requires/suggests |
| $raiz | ?string | |
| $cargador | string |
Throws
\InvalidArgumentException cuando un registro está malformado y el resolver se niega a
ingerirlo — eso no es un grafo que no cierra, es una entrada
que no se puede leer, y confundirlos mandaría a alguien a
buscar un proveedor que no era el problema