Skip to content
docsv0.13.1

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): array

Gate `$metadataArrays` through one {@see GraphResolver} resolution and resequence them to its `loadOrder`.

Parameters

Parameters of order()
NameTypeDescription
$metadataArrayslist<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\ResolutionReport

El 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

Parameters of diagnose()
NameTypeDescription
$metadataArrayslist<array<string, mixed>>name/version/type/provides/requires/suggests
$raiz?string
$cargadorstring

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