The integration round: the two additive items left on the audit backlog — remote compose stacks that report the container they actually run (r464), and an SDK that can manage the node-enrolment token (r463).
Fixed
- A remote compose stack that pinned
container_name:reported a container that did not exist (r464). The remote builder always recorded the deterministic<project>-<service>-1name; the local builder has always resolved the ACTUAL container viadocker compose ps, but the agent protocol had no such operation — so a template pinning its own container name (or a scale change) left health checks, routing and teardown all targeting a ghost while the deploy claimed its machinery around it. A new validateddocker.composePsagent op (same operand regexes and workspace confinement as every other op) resolves the real name right afterup— before the secrets-bearing override file is deleted, with the same-fset — andstop()tears the project down through the resolved id's mapping. Unparseable or failed resolution falls back to the deterministic name with a logged warning, never a failed deploy.
Added
- The SDK speaks enrolment (r463).
client.settings.enrolment.get/rotate/disablewrap the admin routes the server already exposed — the token an agent'sNINEDEPLOY_ENROLMENT_TOKENneeds is now rotatable and revocable from scripts and the CLI, not only the dashboard. (Deliberately NOT surfaced through MCP's read-only tools: the token is secret material.)