Skip to content

Compute owns its assistant registration - #369

Merged
scotwells merged 2 commits into
mainfrom
feat/assistant-capability-binding
Sep 25, 2026
Merged

scotwells merged 2 commits into
mainfrom
feat/assistant-capability-binding

Conversation

@scotwells

Copy link
Copy Markdown
Contributor

Compute publishes knowledge, a reviewed tool allow-list, and seven triage skills to the Patch assistant. Until now the document that registers all of that lived as raw JSON in the infra repository, mounted into the assistant as a fixture file.

That put compute's provider content somewhere compute's team neither reviewed nor versioned, and split every change in two: add a skill under docs/agent/skills/, then go edit a JSON blob in another repo to make anyone see it.

This moves the registration here, as a CapabilityBinding — the CRD the assistant landed in milo-os/assistant#87 — in config/components/assistant-capability/, beside the docs and runbooks it names. Adding a skill is now one change in one repo.

What it declares

The same content staging serves today, unchanged: the llms-full.txt knowledge document, three resource-model concepts, the seven compute_* tools (all read-only — compute publishes no mutating tool), and all seven skills.

Before this can go to production

An MCPRoute fronting compute-mcp. The endpoint here is compute-mcp's ClusterIP, which is what staging dials today and works because staging sets no endpoint allow-list. Production sets one, and the assistant refuses to dial a host outside it — reporting Composed=False on the binding rather than failing a chat. A direct endpoint would also bypass the gateway-side copy of the tool allow-list, go unmetered, and receive no caller identity. No such route exists yet; the comment on the field says so.

Something to apply it per project. The object is cluster-scoped and belongs in a project control plane — a Milo project is a virtual control plane, so the plane is the tenancy boundary and one apply entitles one project. At scale that is the service catalog's projection controller's job. metadata.name is the agent name that controller uses, so when it starts materializing bindings it converges on this object instead of creating a second one that would collide tool-for-tool.

Nothing in compute's overlays references this component yet, so merging changes no running deployment — same as config/components/service-catalog/, which infra references.

🤖 Generated with Claude Code

…Binding

Compute's capability document — the knowledge, tool allow-list, and seven
skills it contributes to an entitled project's Patch assistant — lived as raw
JSON in the infra repository, mounted into the assistant as a fixture file.
Compute's provider content sat where compute's team neither reviewed nor
versioned it, and adding a skill under docs/agent/skills/ meant a second change
in a repository its author probably did not have open.

It now ships here as a CapabilityBinding
(capabilities.assistant.miloapis.com/v1alpha1), the CRD the assistant landed in
milo-os/assistant#87, beside the docs and runbooks it names.

The object is cluster-scoped and belongs in a project control plane, not in
Milo root and not in the workload cluster where compute's manager runs: a Milo
project is a virtual control plane, so the plane is the tenancy boundary and
one apply entitles one project. metadata.name is the agent name the service
catalog's projection controller uses, so when that controller starts
materializing bindings it converges on this object instead of creating a second
one that would collide tool-for-tool.

The MCP endpoint is compute-mcp's ClusterIP, which is what staging dials today.
Production needs an MCPRoute fronting compute-mcp and this rewritten to it: the
assistant refuses to dial a host outside CAPABILITY_MCP_ENDPOINT_HOSTS and
reports Composed=False, and a direct endpoint would bypass the gateway-side
copy of the allow-list, go unmetered, and receive no caller identity. The
comment on the field says so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@scotwells
scotwells requested a review from a team as a code owner September 25, 2026 20:03
The comments were doing a design document's job: control-plane partitioning,
tenancy boundaries, and the history of how the object got its name. That buries
the part a reader needs.

Plain language now, and only where a wrong value actually breaks something —
the endpoint that must change before production, the service name that billing
uses, the allow-list that silently hides a tool. The reasoning lives in the
commit history and docs/agent/README.md instead.

No content change: the rendered object is identical.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@scotwells
scotwells merged commit cd31292 into main Sep 25, 2026
10 checks passed
@scotwells
scotwells deleted the feat/assistant-capability-binding branch September 25, 2026 23:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants