The publisher pipeline (research, write, review, QA, security audit) only runs interactively on Kyle's MacBook. This creates two bottlenecks:
Token waste. The K8s agent controller uses OpenRouter API credits for autonomous agent runs. Meanwhile, Kyle's Claude Max subscription has ~70% unused weekly capacity. The Max plan is prepaid; unused tokens are lost each week.
Human-in-the-loop bottleneck. The publisher pipeline requires Kyle to sit at the keyboard for the entire run. The journalist agent proves that K8s-based autonomous execution works, but only the journalist runs there today. The publisher — which produces the primary blog content — has never run in a container.
The result: blog content production is limited to Kyle's available hours, and prepaid compute capacity goes unused.
The publisher pipeline runs autonomously in K8s, uses Claude Max tokens instead of OpenRouter, self-verifies its output (build, render, review), and produces drafts that pass Kyle's review without changes 80% of the time.
As Kyle, I want to submit a topic to the agent controller and have the full publisher pipeline run autonomously so that I get a review-ready draft without sitting at the keyboard.
Acceptance criteria:
As Kyle, I want autonomous agent runs to use my Claude Max subscription so that I stop paying OpenRouter for work my prepaid plan already covers.
Acceptance criteria:
As Kyle, I want the autonomous publisher to verify its own output (builds, renders, passes review) so that what it hands back works on the first try.
Acceptance criteria:
As Kyle, I want autonomous agent runs to be sandboxed so that a misbehaving agent cannot exfiltrate data or access files outside the workspace.
Acceptance criteria:
claude setup-token rotation)claude setup-token scope regression. Issue #23703 reports that
setup-token now requests only the user interface scope, producing
an error about restricted tokens. The root issue (#8052) may or may
not be resolved. This must be tested before implementation begins.
Token lifetime and refresh. The CLAUDE_CODE_OAUTH_TOKEN is
reported to last ~1 year, but OAuth refresh token rotation could
invalidate it sooner. What's the actual observed lifetime? Is manual
re-generation acceptable, or do we need automated refresh?
Runtime image size. Adding Playwright + Chromium to the agent runtime image will significantly increase its size (Chromium alone is ~400MB). Is a separate publisher-specific image preferable to bloating the shared runtime?
Onboarding flag. Headless Claude Code requires
~/.claude.json with "hasCompletedOnboarding": true. The current
runtime image may not set this. Needs verification.
Cloud K8s provider selection. Three viable options exist under
$50 CAD/month with Toronto regions: DigitalOcean DOKS ($16 CAD),
Vultr VKE ($14 CAD, pending Toronto VKE confirmation), Akamai/Linode
LKE (~$16 CAD). Selection criteria and migration path need a
separate design doc if Kyle decides to move off local Rancher Desktop.
Network policy granularity. The allowlist needs to include api.anthropic.com, github.com, registry.npmjs.org, and MCP server endpoints. Are there other domains the publisher needs (e.g., WebSearch/WebFetch targets during research)? WebFetch would require broad egress or a proxy.
Auth instability. CLAUDE_CODE_OAUTH_TOKEN is a community
workaround, not an officially supported auth method. Anthropic closed
the M2M auth request as NOT_PLANNED. A future Claude Code update
could break this flow without warning.
Promotion timing. The March 2026 doubled off-peak limits promotion ends March 28. If implementation takes longer than 12 days, the extra capacity window is missed. The project remains valuable without the promotion, but urgency is real.
Playwright in containers. Running Chromium headless in a K8s pod
requires specific flags, shared memory configuration (/dev/shm),
and possibly elevated seccomp profiles. This is a known pain point
that could block the QA verification step.
Token expiry mid-run. If the OAuth token expires during a long-running publisher pipeline (which could take 30+ minutes), the run fails partway through. There is no documented graceful handling for this in Claude Code.
WebFetch vs. network isolation. The researcher subagent uses WebFetch to access arbitrary URLs during research. Strict network egress policies would block this. The design must decide between broad research egress (weaker isolation) or a proxy/allowlist approach (more complex).