FrameworkCheck
THE VERB: asks the registry what the newest `milpa/framework` is, and fetches it to be hashed. This is the only thing in the panel that reaches the network on purpose, and it exists as a route precisely so that no RENDER ever does. Measured: 567 ms to ask which version is newest, 1.0 s to fetch and hash a release, 0 ms once cached — 1.6 seconds that would otherwise sit inside a page (greenhouse decisions/0281 measured what probing on paint costs; 0294 built this). ── WHAT IT IS AND IS NOT ─────────────────────────────────────────────────────────────────────────── It READS. It writes two caches under `storage/` and nothing else: which version is newest, and that release's file hashes. It applies nothing, touches no file of the house, and holds no bytes of the new skeleton where anything could copy them. Applying is a governed act and its own slice — a route that could both look and write would put «show me» and «do it» one request apart. Because it changes nothing about the house, it needs no operation ceiling and no consent: the panel's own door is the gate, the same one `/workspace/settings` and the section pages carry. It is egress with a cost, not authority.
FrameworkCheck::__construct()
public function __construct(Milpa\Interfaces\Di\DIContainerInterface $container, Psr\Http\Message\ResponseFactoryInterface $responses = new Psr17Factory()):🚨 THE ROOT IS RESOLVED PER REQUEST, NOT AT CONSTRUCTION, and the first build got it wrong. The skeleton's `public/index.php` registers the Kernel in the container AFTER `Kernel::boot()` returns — so while plugins are booting there is no Kernel to ask, and a root captured then is the empty string. Pressed in a real browser, the verb answered `{"ok":true,"latest":"0.48.1"}` and wrote nothing: `ships()` caches best-effort, so a bad root loses the cache silently and still returns the hashes, while `remember()` — the file the render reads — failed. The button worked and the page kept saying nobody had asked (greenhouse decisions/0294). Asked per request, like `HouseSource::root()` does for the same reason.
Parameters
| Name | Type | Description |
|---|---|---|
| $container | Milpa\Interfaces\Di\DIContainerInterface | |
| $responses | Psr\Http\Message\ResponseFactoryInterface |
FrameworkCheck::handle()
public function handle(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterfaceAsks, fetches, remembers — and says what it could not do rather than throwing. A laptop with no network is the ordinary case for this button, and «I could not reach the registry» is a sentence a person can act on. A stack trace is not.
Parameters
| Name | Type | Description |
|---|---|---|
| $request | Psr\Http\Message\ServerRequestInterface |