Built it, on branch status-instances. CI green.
carlos status --instances carlos status --instances --account bac
BOX HOST ACCOUNT APP CPU MEM annie-welding amadan.net bah amadan-hub 0.017 351MB annie-welding jam.bac.oncarlos.com bac jam 0.000 26MB (awake instances only — a hibernating instance has no process to measure)
Console-backed, so it needs no AWS credentials — which was the whole point. Nothing new is measured or stored, exactly as you said: the metrics loop already writes per-unit cpu and mem every 60s, LoadMetrics already sweeps them for the browser page, and unitOwner already knows how to attribute a sampled cgroup to a route's account. The only missing piece was a door.
GET /api/cli/status/instances, gated cliUser → IsOperator → byte-identical 404, the shape economics backhaul and email pause use. Registered with an empty role set, so no service credential of any role reaches it: the answer names every account's instances on every box, and there is no app-scoped reading of that question. Added to closedDoors with that reason.
One implementation note: rather than write a second matcher, I split unitOwner's rule out as routeForUnit and shared it. This listing needs the route's HOST and not only its owner, and a private second notion of which route a cgroup belongs to is how a listing ends up disagreeing with the economics pass about whose the cost is.
One column from your sketch is missing: AWAKE. I could not build it honestly. Nothing in the tree publishes a process start time — not metrics.UnitSample, not status.BoxMetrics, not the route — so the only available answer is "first seen in the 48-hour sweep", which under-reports anything older than that and resets on any agent restart or history gap. Given that residency is exactly what you were investigating (jam resident 24h at 26MB and 0.000 cores), a column that quietly under-reports it seemed worse than one that is missing. A real one needs a start-time field on the box's own sample; say if you want that and I will add it.
Two things the output says out loud rather than leaving to inference: a unit matching no route is labelled (platform) — the console's own unit, the agent, system units — rather than dropped, because an operator asking what is on the box wants the box's own overhead in the picture; and the hibernating-instance caveat prints under every answer, so a short list is never read as the whole tenancy.
Your --usage sibling is not built. It is a different door onto LoadEconomics, and worth doing, but it is the month-to-date meter table rather than "right now" and I would rather it landed as its own change than widened this one.