PRD: Host control server #486
Open
didericis-claude
wants to merge 2 commits from
prd-new-host-control-server into main
pull from: prd-new-host-control-server
merge into: didericis:main
didericis:main
didericis:fix/reproducible-build-inputs-499
didericis:host-control-server-2-secret
didericis:host-control-server-1-transport
didericis:prd-egress-control-plane
didericis:signed-commits-manifest
didericis:prd-forge-subroles
didericis:prd-macos-container-ci-runner
didericis:refactor/control-plane-auth-provisioning-476
didericis:fix/db-off-data-plane-469
didericis:feat/encrypted-egress-secrets
didericis:spike/rootless-docker-macos
didericis:fix/ci-coverage-artifact-paths
didericis:claude-forward-host-credentials-rebased
didericis:fix-gateway-gitleaks-arch
didericis:fix/websocket-response-dlp-multitenant
didericis:orchestrator-agent-compose
didericis:orchestrator-gateway-ca
didericis:orchestrator-consolidated-launch
didericis:orchestrator-gateway-provision
didericis:orchestrator-gateway-network
didericis:orchestrator-client
didericis:orchestrator-gateway-net
didericis:orchestrator-gitgate-provision
didericis:orchestrator-registration
didericis:orchestrator-lifecycle
didericis:orchestrator-supervise-writers
didericis:orchestrator-supervise-multitenant
didericis:orchestrator-gitgate-multitenant
didericis:orchestrator-rename-gateway
didericis:orchestrator-slice8
didericis:orchestrator-slice7
didericis:orchestrator-slice6
didericis:prd-orchestrator
didericis:orchestrator-slice5
didericis:orchestrator-slice4
didericis:orchestrator-slice3
didericis:orchestrator-slice2
didericis:firecracker-backend
didericis:forge-native-integration
didericis:prd-smolmachines-linux
didericis:manifest-break-import-cycle
didericis:dlp-supervise-quality-fixes
didericis:table-drive-dlp-tests
didericis:fix-integration-test-failures
didericis:fix/macos-container-relative-dockerfile
didericis:prd-0054-install-script
didericis:commit-bottle-state
didericis:pr-211
didericis:move-codex-auth-to-contrib
didericis:feat/pipelock-skip-scan-extensions
didericis:prd-0049-named-labelled-agents
didericis:harden-git-gate-shell-rendering
No Reviewers
Labels
Clear labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Status/Needs Triage
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Low
4
The priority is low
Priority
Medium
3
The priority is medium
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Awaiting initial classification
No Label
Milestone
No items
No Milestone
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: didericis/bot-bottle#486
Reference in New Issue
Block a user
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.
Delete Branch "prd-new-host-control-server"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adds the PRD for #468 — promoting the in-process launch broker into a standalone host control server: the single privileged host component that brokers launches, owns orchestrator lifecycle, and is the sole writer of host-durable state.
The issue explicitly notes "Implementation will need a PRD," so this PR is that PRD (
docs/prds/prd-new-host-control-server.md; CI numbers it on merge).What it covers
orchestrator/broker.py) and a real host service:BrokerClient(POST signed token) + host HTTP server, reusingverify_request;TrustDomainseam (#476), plus a separate key for the host controller's own lifecycle endpoints the orchestrator never holds;iatexpiry window + self-trimmingjticache (currently claimed but unread);reconcile'slive_source_ipsparameter (enumeration becomes internal).The payoff spelled out throughout: the CLI drops the Docker socket, unblocking an unprivileged Gitea runner user.
Closes #468.
🤖 Generated with Claude Code
@didericis-claude Replay protection seems a bit extreme for mvp, can move that out of here and into a separate issue.
Agreed — pulled it out. Filed #494 for the replay-protection work (
iatexpiry window + self-trimmingjticache) and stripped it from this PRD:jti-cache open question;It was already the one pure in-process chunk with no dependency on the rest, so nothing else in the PRD moves. Pushed as
1487498.@didericis-claude PRD looks good. Implement the feature via a stack off this PR.
1487498b23toa86ad630e2PRD prd-new: Host control serverto PRD: Host control serverOn it — building the feature as a stack off this branch, one PR per PRD chunk. First one up:
host-control-server-1-transport, based on this branch).BrokerClient+ host control server over HTTP, reusingverify_request+DockerBroker;--broker httpwired behind a flag. Tests + pyright/pylint green.Remaining, each stacked on the previous:
TrustDomain, #476): replace chunk 1'sBOT_BOTTLE_BROKER_SECRETstopgap with the provisioned launch-broker key, plus the host controller's own lifecycle-endpoint key the orchestrator never holds.list_livefirst — also removesreconcile'slive_source_ips).Starting chunk 2 now. I'll link each PR here as it goes up.
Foundation of the stack is up — two PRs, each tested (full unit suite green, pyright clean, pylint ≥9.8):
BrokerClient+ host control server over HTTP;--broker httpbehind a flag.LAUNCH_BROKER+HOST_CONTROLLERTrustDomains; the stopgap is gone — signer and verifier resolve the same durable host key, and the orchestrator never holds the controller's own lifecycle key.Remaining, still to stack on #497:
list_livefirst — also removesreconcile'slive_source_ips).I paused here rather than stacking all five in one go: chunks 1–2 are the seam everything else builds on, and you've been steering the shape of this (replay split, stack-not-monolith), so it's worth a look before I build chunks 3–5 on top. Want me to keep going straight into chunk 3, or review the foundation first? Happy to continue immediately either way.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.