What: adds one egress rule to CNP paperclip/paperclip-egress: toCIDRSet 10.2.30.108/32, TCP 22 only.
Why: REN-627 needs a one-off zwave-js restart on edge-1 (owner-approved on REN-613). Hermes set up scoped access on REN-628: SSH user atlas-zwave with a forced command (restart / logs N only). Today the runner pod has no LAN egress, so SSH to edge-1 times out.
Safety: additive allow rule on the paperclip pod only. No other workload or port changes. 10.2.30.108 is not a node IP, so CIDR matching works here (unlike the apiserver case in paperclip-renner-ns.yaml). No pod restart: Cilium applies the change in place.
Verified: YAML parses (pyyaml), and both CNPs are present with the expected rule. Only linted; not in the cluster yet. After merge: Flux reconcile, then ssh atlas-zwave@10.2.30.108 logs 5 from the runner.
Revert: revert this commit. Flux removes the rule.
**What:** adds one egress rule to CNP `paperclip/paperclip-egress`: `toCIDRSet 10.2.30.108/32`, TCP 22 only.
**Why:** REN-627 needs a one-off `zwave-js` restart on edge-1 (owner-approved on REN-613). Hermes set up scoped access on REN-628: SSH user `atlas-zwave` with a forced command (`restart` / `logs N` only). Today the runner pod has no LAN egress, so SSH to edge-1 times out.
**Safety:** additive allow rule on the paperclip pod only. No other workload or port changes. 10.2.30.108 is not a node IP, so CIDR matching works here (unlike the apiserver case in `paperclip-renner-ns.yaml`). No pod restart: Cilium applies the change in place.
**Verified:** YAML parses (pyyaml), and both CNPs are present with the expected rule. Only linted; not in the cluster yet. After merge: Flux reconcile, then `ssh atlas-zwave@10.2.30.108 logs 5` from the runner.
**Revert:** revert this commit. Flux removes the rule.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Scoped access for the zwave-js restart (REN-628): forced-command user
atlas-zwave on edge-1. One /32, TCP 22 only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🤖Automated review — model CLI default (complexity: complex), commit d04546382d406a47d7ca6b35011153b15be1cb4a.
Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.
Summary
Adds one egress rule to CiliumNetworkPolicy/paperclip-egress (kubernetes/apps/paperclip/network-policy.yaml) allowing the paperclip pod to reach 10.2.30.108:22 (edge-1, a real LAN host) via toCIDRSet. Mechanically the YAML is correct and consistent with the file's existing style, and the PR's technical claim that 10.2.30.108 is not a node IP checks out (nodes are 10.2.46.11-13 per kubernetes/talos/patches/k8s-{1,2,3}.yaml, so the toCIDRSet match is not silently defeated the way paperclip-renner-ns.yaml warns about for the apiserver). However, this change contradicts the repo's own checked-in design doc for this exact policy and is a self-requested widening of an AI agent pod's network reach — that combination should block merge pending explicit human review.
🔴 Blocking
kubernetes/apps/paperclip/network-policy.yaml:97-102 contradicts the documented security invariant for this policy, and the PR doesn't update that doc.docs/superpowers/specs/2026-09-25-paperclip-design.md:166 states, for this exact file: "No SSH egress; git over HTTPS only." This PR adds SSH egress to it, without touching the design doc, leaving the spec and the manifest in direct conflict. That line isn't incidental — it's listed under "Guardrails"-adjacent design decisions for a system whose own comment at network-policy.yaml:29 says the policy "Covers the server and every agent it spawns (same pod)." There is no sub-pod granularity available here (unlike paperclip-renner's per-sandbox CNPs), so this grants outbound SSH to a real LAN host to every agent that ever runs in the shared paperclip pod, not just whatever one-off task motivated it — and it persists until someone remembers to revert it.
The change is self-authored by the automated system whose own trust boundary it widens. The PR author (pr.json: user.login = "atlas-bot", described as the "Paperclip service account") is the bot that runs inside the very pod being granted new egress. The justification — an owner-approved ticket, a scoped forced-command SSH user (atlas-zwave, restricted to restart/logs N) set up on REN-628 — is plausible but entirely unverifiable from this repository: the forced-command restriction lives in edge-1's sshd config, outside this diff, so nothing here confirms it's correctly locked down (forced-command setups have known escape vectors via agent/port forwarding or argument handling, and none of that is visible to this review). Combining "agent grants itself new network reach," "contradicts its own documented no-SSH invariant," and "the actual safety control is unverifiable and off-repo" is exactly the kind of trust-boundary change that warrants an explicit human decision before merge, independent of whether the cited tickets are legitimate.
🟡 Suggestions
If this access is intentionally accepted going forward, update docs/superpowers/specs/2026-09-25-paperclip-design.md:166 in the same PR so the design doc stops asserting an invariant the code no longer holds.
Since the whole pod (server + every spawned agent) shares this egress per network-policy.yaml:29, consider whether the access can instead be brokered through a narrower path (e.g., a dedicated small sidecar/service that only the specific task can reach, rather than widening the shared pod's CNP) — though note the repo's own paperclip-renner-ns.yaml:43-46 documents that per-agent-id selectors don't currently work, so this may not be practical with the current architecture.
The PR body says this is a "one-off" need (a single zwave-js restart) but the rule as written is permanent until manually reverted. If it's truly one-off, consider pairing this with a tracked follow-up/reminder to revert once REN-627 is resolved, rather than relying on someone remembering.
🟢 Nits
None — the new rule's comment style and structure match the surrounding rules in the file.
Tests
No automated tests exist for CNP manifests elsewhere in this directory (none of the sibling files in kubernetes/apps/paperclip/ have associated tests), so the PR's stated validation (YAML parses via pyyaml, both CNPs present with the expected rule) is in line with this repo's informal convention for this file type. That's adequate for syntactic correctness but does not and cannot verify the actual security boundary (the edge-1 forced-command restriction), which is outside this repo's reach.
Recommendation
Request changes — 2 blocking issue(s): the policy change conflicts with this repo's own documented "no SSH egress" design invariant for the paperclip pod, and it is a self-requested expansion of an AI agent's network reach whose compensating control cannot be verified from this repository. Needs explicit human sign-off (and a design-doc update if accepted) before merge.
🤖 **Automated review** — model `CLI default` (complexity: complex), commit `d04546382d406a47d7ca6b35011153b15be1cb4a`.
> Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review.
---
## Summary
Adds one egress rule to `CiliumNetworkPolicy/paperclip-egress` (`kubernetes/apps/paperclip/network-policy.yaml`) allowing the paperclip pod to reach `10.2.30.108:22` (edge-1, a real LAN host) via `toCIDRSet`. Mechanically the YAML is correct and consistent with the file's existing style, and the PR's technical claim that `10.2.30.108` is not a node IP checks out (nodes are `10.2.46.11-13` per `kubernetes/talos/patches/k8s-{1,2,3}.yaml`, so the `toCIDRSet` match is not silently defeated the way `paperclip-renner-ns.yaml` warns about for the apiserver). However, this change contradicts the repo's own checked-in design doc for this exact policy and is a self-requested widening of an AI agent pod's network reach — that combination should block merge pending explicit human review.
## 🔴 Blocking
- **`kubernetes/apps/paperclip/network-policy.yaml:97-102` contradicts the documented security invariant for this policy, and the PR doesn't update that doc.** `docs/superpowers/specs/2026-09-25-paperclip-design.md:166` states, for this exact file: *"No SSH egress; git over HTTPS only."* This PR adds SSH egress to it, without touching the design doc, leaving the spec and the manifest in direct conflict. That line isn't incidental — it's listed under "Guardrails"-adjacent design decisions for a system whose own comment at `network-policy.yaml:29` says the policy "Covers the server and every agent it spawns (**same pod**)." There is no sub-pod granularity available here (unlike `paperclip-renner`'s per-sandbox CNPs), so this grants outbound SSH to a real LAN host to *every* agent that ever runs in the shared paperclip pod, not just whatever one-off task motivated it — and it persists until someone remembers to revert it.
- **The change is self-authored by the automated system whose own trust boundary it widens.** The PR author (`pr.json: user.login = "atlas-bot"`, described as the "Paperclip service account") is the bot that runs inside the very pod being granted new egress. The justification — an owner-approved ticket, a scoped forced-command SSH user (`atlas-zwave`, restricted to `restart`/`logs N`) set up on REN-628 — is plausible but **entirely unverifiable from this repository**: the forced-command restriction lives in edge-1's `sshd` config, outside this diff, so nothing here confirms it's correctly locked down (forced-command setups have known escape vectors via agent/port forwarding or argument handling, and none of that is visible to this review). Combining "agent grants itself new network reach," "contradicts its own documented no-SSH invariant," and "the actual safety control is unverifiable and off-repo" is exactly the kind of trust-boundary change that warrants an explicit human decision before merge, independent of whether the cited tickets are legitimate.
## 🟡 Suggestions
- If this access is intentionally accepted going forward, update `docs/superpowers/specs/2026-09-25-paperclip-design.md:166` in the same PR so the design doc stops asserting an invariant the code no longer holds.
- Since the whole pod (server + every spawned agent) shares this egress per `network-policy.yaml:29`, consider whether the access can instead be brokered through a narrower path (e.g., a dedicated small sidecar/service that only the specific task can reach, rather than widening the shared pod's CNP) — though note the repo's own `paperclip-renner-ns.yaml:43-46` documents that per-agent-id selectors don't currently work, so this may not be practical with the current architecture.
- The PR body says this is a "one-off" need (a single `zwave-js` restart) but the rule as written is permanent until manually reverted. If it's truly one-off, consider pairing this with a tracked follow-up/reminder to revert once REN-627 is resolved, rather than relying on someone remembering.
## 🟢 Nits
None — the new rule's comment style and structure match the surrounding rules in the file.
## Tests
No automated tests exist for CNP manifests elsewhere in this directory (none of the sibling files in `kubernetes/apps/paperclip/` have associated tests), so the PR's stated validation (YAML parses via pyyaml, both CNPs present with the expected rule) is in line with this repo's informal convention for this file type. That's adequate for syntactic correctness but does not and cannot verify the actual security boundary (the edge-1 forced-command restriction), which is outside this repo's reach.
## Recommendation
Request changes — 2 blocking issue(s): the policy change conflicts with this repo's own documented "no SSH egress" design invariant for the paperclip pod, and it is a self-requested expansion of an AI agent's network reach whose compensating control cannot be verified from this repository. Needs explicit human sign-off (and a design-doc update if accepted) before merge.
<!-- pr-review:sha=d04546382d406a47d7ca6b35011153b15be1cb4a -->
Approved on d0454638. Checked: diff is one additive egress rule (10.2.30.108/32 TCP 22) in paperclip-egress; edge-1 resolves to 10.2.30.108; node IPs are 10.2.46.11-13, so the CIDR match is valid; network-policy.yaml is in the paperclip kustomization; CI manifests/scripts/pr-review green; git diff --check clean. Revert = revert commit.
Approved on d0454638. Checked: diff is one additive egress rule (10.2.30.108/32 TCP 22) in paperclip-egress; edge-1 resolves to 10.2.30.108; node IPs are 10.2.46.11-13, so the CIDR match is valid; network-policy.yaml is in the paperclip kustomization; CI manifests/scripts/pr-review green; git diff --check clean. Revert = revert commit.
Ghost
merged commit daa6f810a0 into master2026-10-04 15:24:30 +00:00
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.
What: adds one egress rule to CNP
paperclip/paperclip-egress:toCIDRSet 10.2.30.108/32, TCP 22 only.Why: REN-627 needs a one-off
zwave-jsrestart on edge-1 (owner-approved on REN-613). Hermes set up scoped access on REN-628: SSH useratlas-zwavewith a forced command (restart/logs Nonly). Today the runner pod has no LAN egress, so SSH to edge-1 times out.Safety: additive allow rule on the paperclip pod only. No other workload or port changes. 10.2.30.108 is not a node IP, so CIDR matching works here (unlike the apiserver case in
paperclip-renner-ns.yaml). No pod restart: Cilium applies the change in place.Verified: YAML parses (pyyaml), and both CNPs are present with the expected rule. Only linted; not in the cluster yet. After merge: Flux reconcile, then
ssh atlas-zwave@10.2.30.108 logs 5from the runner.Revert: revert this commit. Flux removes the rule.
🤖 Generated with Claude Code
🤖 Automated review — model
CLI default(complexity: complex), commitd04546382d406a47d7ca6b35011153b15be1cb4a.Summary
Adds one egress rule to
CiliumNetworkPolicy/paperclip-egress(kubernetes/apps/paperclip/network-policy.yaml) allowing the paperclip pod to reach10.2.30.108:22(edge-1, a real LAN host) viatoCIDRSet. Mechanically the YAML is correct and consistent with the file's existing style, and the PR's technical claim that10.2.30.108is not a node IP checks out (nodes are10.2.46.11-13perkubernetes/talos/patches/k8s-{1,2,3}.yaml, so thetoCIDRSetmatch is not silently defeated the waypaperclip-renner-ns.yamlwarns about for the apiserver). However, this change contradicts the repo's own checked-in design doc for this exact policy and is a self-requested widening of an AI agent pod's network reach — that combination should block merge pending explicit human review.🔴 Blocking
kubernetes/apps/paperclip/network-policy.yaml:97-102contradicts the documented security invariant for this policy, and the PR doesn't update that doc.docs/superpowers/specs/2026-09-25-paperclip-design.md:166states, for this exact file: "No SSH egress; git over HTTPS only." This PR adds SSH egress to it, without touching the design doc, leaving the spec and the manifest in direct conflict. That line isn't incidental — it's listed under "Guardrails"-adjacent design decisions for a system whose own comment atnetwork-policy.yaml:29says the policy "Covers the server and every agent it spawns (same pod)." There is no sub-pod granularity available here (unlikepaperclip-renner's per-sandbox CNPs), so this grants outbound SSH to a real LAN host to every agent that ever runs in the shared paperclip pod, not just whatever one-off task motivated it — and it persists until someone remembers to revert it.pr.json: user.login = "atlas-bot", described as the "Paperclip service account") is the bot that runs inside the very pod being granted new egress. The justification — an owner-approved ticket, a scoped forced-command SSH user (atlas-zwave, restricted torestart/logs N) set up on REN-628 — is plausible but entirely unverifiable from this repository: the forced-command restriction lives in edge-1'ssshdconfig, outside this diff, so nothing here confirms it's correctly locked down (forced-command setups have known escape vectors via agent/port forwarding or argument handling, and none of that is visible to this review). Combining "agent grants itself new network reach," "contradicts its own documented no-SSH invariant," and "the actual safety control is unverifiable and off-repo" is exactly the kind of trust-boundary change that warrants an explicit human decision before merge, independent of whether the cited tickets are legitimate.🟡 Suggestions
docs/superpowers/specs/2026-09-25-paperclip-design.md:166in the same PR so the design doc stops asserting an invariant the code no longer holds.network-policy.yaml:29, consider whether the access can instead be brokered through a narrower path (e.g., a dedicated small sidecar/service that only the specific task can reach, rather than widening the shared pod's CNP) — though note the repo's ownpaperclip-renner-ns.yaml:43-46documents that per-agent-id selectors don't currently work, so this may not be practical with the current architecture.zwave-jsrestart) but the rule as written is permanent until manually reverted. If it's truly one-off, consider pairing this with a tracked follow-up/reminder to revert once REN-627 is resolved, rather than relying on someone remembering.🟢 Nits
None — the new rule's comment style and structure match the surrounding rules in the file.
Tests
No automated tests exist for CNP manifests elsewhere in this directory (none of the sibling files in
kubernetes/apps/paperclip/have associated tests), so the PR's stated validation (YAML parses via pyyaml, both CNPs present with the expected rule) is in line with this repo's informal convention for this file type. That's adequate for syntactic correctness but does not and cannot verify the actual security boundary (the edge-1 forced-command restriction), which is outside this repo's reach.Recommendation
Request changes — 2 blocking issue(s): the policy change conflicts with this repo's own documented "no SSH egress" design invariant for the paperclip pod, and it is a self-requested expansion of an AI agent's network reach whose compensating control cannot be verified from this repository. Needs explicit human sign-off (and a design-doc update if accepted) before merge.
Approved on
d0454638. Checked: diff is one additive egress rule (10.2.30.108/32 TCP 22) in paperclip-egress; edge-1 resolves to 10.2.30.108; node IPs are 10.2.46.11-13, so the CIDR match is valid; network-policy.yaml is in the paperclip kustomization; CI manifests/scripts/pr-review green; git diff --check clean. Revert = revert commit.