--- # pm-agent — the Program Manager agent service: it reads Gitea issues, decides what to do # about each thread, and runs one worker agent per assignment that authors a change, gates # it and opens a pull request. Full design: platform/pm-agent/README.md and # docs/plans/pm-agent-issue-to-pr.md. # # NO UI, NO INGRESS. There is deliberately no `gateway-access: shared` label and no # HTTPRoute: nothing connects INTO this namespace. The dispatcher polls Gitea rather than # receiving webhooks, precisely so that a namespace whose whole purpose is running # model-authored code needs no inbound path at all (the reasoning is in the header of # infra/agent/pm-dispatch.py). The operator's interface is the Gitea issue thread and # `kubectl logs`. # # INTENTIONALLY NOT homelab.keithjackson.dev/app-namespace=true. This is PLATFORM plumbing — # CI/delivery machinery, like `gitea-actions` and `conformance`, not a user-facing app. Every # Kyverno app policy matches on that label (the generated default-deny baseline, the # egress-class and auth-mode label requirements), so carrying it would demand an auth mode # and an egress class for a workload that serves no traffic. The baseline those policies # would have generated is therefore shipped EXPLICITLY here instead — see networkpolicy.yaml. # # PodSecurity `restricted` IS enforced, unlike in `gitea-actions` (which needs a privileged # DinD sidecar and so cannot). Nothing here needs any privilege: both the dispatcher and # every worker run as uid 65532 with no capabilities, no privilege escalation and a # read-only root filesystem. Declaring it means the kubelet refuses a pod that drifts from # that, in addition to the admission policy that constrains the worker Job's shape. apiVersion: v1 kind: Namespace metadata: name: pm-agent labels: app.kubernetes.io/part-of: pm-agent homelab.keithjackson.dev/ci: pm-agent pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/enforce-version: latest