Records a design session on MCP server deployment in two steps. First a standalone amendment (commit 31bef59, for review on its own), then that amendment folded into the spec and removed, as with the Tiered Inference amendment.
What changed in the spec
Part F is now F1–F4 and applies to all agents.
F1: every agent gets its own VM, justified by inter-agent isolation and per-agent credential attribution. Docker-in-Docker stays in B3 as an extra reason that applies only to the Dev Agent.
F2: each agent instance has its own default-deny egress allowlist, declared as an artifact. It covers what the agent's MCP servers reach, and it calls out that the tailnet (100.64.0.0/10) is not RFC1918.
F3: MCP servers run per agent VM, one instance per (service, site, privilege). Site is part of the server's identity, and read-only and elevated access use separate credentials. Records the rejected routed-meta-tools alternative.
F4: the existing image pipeline, plus a carve-out: third-party MCP images are digest-pinned and excluded from Watchtower.
Part 0: site identifiers garrett-hall and hartman-hut.
A7: a Vaultwarden machine account per MCP server instance, in addition to the agent's own. (Settled with the operator while drafting.)
C2: every write, including a reversible restart, requires an approved plan first. The tiers govern execution within that plan. (Settled with the operator while drafting.)
B3 / C3 / C5: recast to match F1–F3. MCP becomes the primary path to Proxmox and UniFi.
Part H: the network-gear browser item is narrowed to fallback access, and relocating stateful MCP servers is parked.
Records a design session on MCP server deployment in two steps. First a standalone amendment (commit 31bef59, for review on its own), then that amendment folded into the spec and removed, as with the Tiered Inference amendment.
## What changed in the spec
- **Part F is now F1–F4 and applies to all agents.**
- F1: every agent gets its own VM, justified by inter-agent isolation and per-agent credential attribution. Docker-in-Docker stays in B3 as an extra reason that applies only to the Dev Agent.
- F2: each agent instance has its own default-deny egress allowlist, declared as an artifact. It covers what the agent's MCP servers reach, and it calls out that the tailnet (100.64.0.0/10) is not RFC1918.
- F3: MCP servers run per agent VM, one instance per (service, site, privilege). Site is part of the server's identity, and read-only and elevated access use separate credentials. Records the rejected routed-meta-tools alternative.
- F4: the existing image pipeline, plus a carve-out: third-party MCP images are digest-pinned and excluded from Watchtower.
- **Part 0:** site identifiers `garrett-hall` and `hartman-hut`.
- **A7:** a Vaultwarden machine account per MCP server instance, in addition to the agent's own. *(Settled with the operator while drafting.)*
- **C2:** every write, including a reversible restart, requires an approved plan first. The tiers govern execution within that plan. *(Settled with the operator while drafting.)*
- **B3 / C3 / C5:** recast to match F1–F3. MCP becomes the primary path to Proxmox and UniFi.
- **Part H:** the network-gear browser item is narrowed to fallback access, and relocating stateful MCP servers is parked.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Records a design session on MCP server deployment as a standalone
amendment, ahead of folding it into the spec:
- Every agent gets its own VM, justified by inter-agent isolation and
per-agent credential attribution; Docker-in-Docker stays as an extra
Dev Agent reason rather than the rule's foundation
- Egress is a declared, per-agent-instance default-deny allowlist,
covering what MCP servers reach on the agent's behalf, with the
tailnet's 100.64.0.0/10 called out as outside RFC1918
- MCP servers run per agent VM, one instance per (service, site,
privilege), with site in the server identity rather than a tool
argument
- Third-party MCP images are digest-pinned and excluded from Watchtower
- Routed meta-tools rejected; stateful-server relocation parked
Two consequences settled with the operator while drafting: each MCP
server instance gets its own Vaultwarden machine account (A7), and any
write, reversible or not, requires an approved plan (C2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Part F is restructured around rules that now apply to every agent:
- F1: every agent gets its own VM, for inter-agent isolation and
per-agent credential attribution
- F2: a declared, per-instance default-deny egress allowlist that
covers MCP servers' reach, with the tailnet's 100.64.0.0/10 called
out
- F3: MCP servers per agent VM and per (service, site, privilege),
plus the rejected routed-meta-tools alternative
- F4: the existing image pipeline, with third-party MCP images
digest-pinned and excluded from Watchtower
Consequences land where they belong: site identifiers in Part 0, a
machine account per MCP server instance in A7, B3 and C5 recast as
instances of F1/F2, plan approval required for every write in C2, MCP
as the primary infrastructure path in C3, the network-gear browser
item narrowed to fallback access, and stateful-server relocation
parked in Part H.
The standalone amendment is removed now that its content lives here,
as with the Tiered Inference amendment; it remains in the previous
commit.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Good catch. The identifiers themselves stay the same: garrett-hall and hartman-hut are the stems of garrett-hall.com and hartman-hut.com. But the text said "domain stem" without naming the domains, so a reader could not check which domain it meant. Each site now names its domain: "hosts under garrett-hall.com" and "hosts under hartman-hut.com".
Good catch. The identifiers themselves stay the same: `garrett-hall` and `hartman-hut` are the stems of `garrett-hall.com` and `hartman-hut.com`. But the text said "domain stem" without naming the domains, so a reader could not check which domain it meant. Each site now names its domain: "hosts under `garrett-hall.com`" and "hosts under `hartman-hut.com`".
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Records a design session on MCP server deployment in two steps. First a standalone amendment (commit
31bef59, for review on its own), then that amendment folded into the spec and removed, as with the Tiered Inference amendment.What changed in the spec
garrett-hallandhartman-hut.🤖 Generated with Claude Code
@@ -32,6 +35,11 @@ same string across all of those: the VM, the container, the Caddy host, the Matraccount, and the Bitwarden machine account for a given agent all share one name, sothat grepping the infrastructure for `nisse-ops` finds everything.**Sites** are identified by their domain stem: `garrett-hall` (Arlington) andOne note (and I think this was wrong in the original prompt), the domains for the two sites end in garrett-hall.com, and hartman-hut.com.
@@ -32,6 +35,11 @@ same string across all of those: the VM, the container, the Caddy host, the Matraccount, and the Bitwarden machine account for a given agent all share one name, sothat grepping the infrastructure for `nisse-ops` finds everything.**Sites** are identified by their domain stem: `garrett-hall` (Arlington, hosts underGood catch. The identifiers themselves stay the same:
garrett-hallandhartman-hutare the stems ofgarrett-hall.comandhartman-hut.com. But the text said "domain stem" without naming the domains, so a reader could not check which domain it meant. Each site now names its domain: "hosts undergarrett-hall.com" and "hosts underhartman-hut.com".c5d373f4dcto3dbfbc8cf0