Ops rollout: Forgejo external-account lockdown and scoped runners #664
Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#664
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Parent: #658
Engineering checkpoint: commit
6f8beb3on canonical main.The tracked target state is complete and offline validation passes. This issue owns the live boundary that the engineer role cannot cross.
Acceptance:
Rollback: retain the current runner manifests, registrations, replica counts, and legacy token until the scoped path passes. The runbook contains the scale-down and restore sequence.
Ops checkpoint at commit
9c24a88on canonical main.\n\nCompleted:\n\n* Before-state recorded seven instance-global registrations, legacy replicas 4 general / 1 image / 1 deploy / 1 tap, and the legacy SecureString at version 1.\n* Forgejo now preserves external-only registration while repository creation is zero, push-create is off for users and organizations, regular organization creation is off, organization creation defaults off, and forks plus the limit bypass are off.\n* Five owner-revealed scoped registration tokens were stored through private mode-0600 files. No token entered argv, output, tracked state, or the bot permission surface.\n* Seven scoped registrations are live: Flight Deck general 2, Bridge general 1, Gaming general 1, Flight Deck image 1, deploy repository 1, and tap repository 1.\n* Flux is Ready and Healthy on9c24a88with all six scoped StatefulSet health checks. The complete repository gate passed before landing.\n* Clean-boundary canaries passed for Flight Deck lint, infrastructure image build, Agentic OS image publish, Bridge CI, Bridge deploy, and Gaming hygiene. Tap-writer is visible only in homebrew-tap.\n* The unrelated coilysiren/website canary remains waiting with no eligible runner.\n* All seven global registrations were deleted. No Global row remains. Legacy StatefulSets are 0/0 with PVCs retained only for rollback.\n* The legacy SSM parameter was invalidated at version 2. The guarded SSM surface has no delete operation.\n* The sirens-discord-ops CI canary exposed a separate post-checkout workflow failure. A different Gaming workflow passed on the same scoped runner, and coilyco-gaming/sirens-discord-ops#43 owns that defect.\n\nRollback:\n\n* Scoped registrations and PVCs remain intact.\n* Restoring the global path requires an owner-revealed instance token through the guarded file source, followed by the recorded legacy replica counts. The deleted registrations and invalidated token cannot restart accidentally.\n\nTwo human checks remain:\n\n1. Kai installs the hardened summon units from scripts/install-coilyco-ops-summon.sh in an interactive kai-server TTY. The host checkout is current and clean, and all 34 summon tests pass. Sudo is the only install wall.\n2. Kai uses a real external OAuth test account to prove issue creation succeeds while repository, organization, fork, push-create, and runner settings are denied. The live server controls are in place, but the Ops bot is not an external OAuth identity.\n\nThe issue stays open for those two interactive acceptance checks.Kai reported both interactive acceptance checks complete. Ops verification found one installer defect before closure: the timer was enabled, but
coilyco-ops-summon.servicefailed because uv tried to repair the checkout virtualenv under the hidden home. Commit6e30cc3moves the uv environment and managed Python into the service-owned cache and makes the installer prove one complete token-refresh plus poll cycle. The clean kai-server checkout is fast-forwarded through that fix, but the installed unit files still require one repeated sudo-backed installer run.During diagnosis, verbose dependency logging disclosed the summon bot token in operator tool output. Ops treated it as compromised immediately. The bot password, API token, deploy read token, and MCP read token were rotated through the tracked provisioner without printing the replacements. The new credentials authenticated successfully. The deploy ExternalSecret refreshed from SSM and the repository-scoped deploy runner completed its rolling restart. Commits
759503cand8bceea3repaired two stale provisioner paths exposed during that rotation.This issue remains open only for Kai to rerun
scripts/install-coilyco-ops-summon.sh. Ops will then verify a successful constrained poll cycle and close #664 plus #658.Kai chose full retirement instead of repairing or migrating the native summon service. Canonical commit
dd9d903removes the poller, tests, installer, three systemd units, Ward verbs, operator skill, dedicated runbook, and dead cross-references. Future bot-token rotations also drop the now-unusedwrite:notificationscope. The sharedcoilyco-opsidentity remains for its other Forgejo automation consumers.Live verification still shows the old timer enabled and its installed unit files present on kai-server. Kai has the explicit sudo removal command. Close this issue and #658 after those unit files report absent.
Final Ops verification passed.
coilyco-ops-summon.timer,coilyco-ops-summon.service, andcoilyco-ops-summon-token.serviceeach reportLoadState=not-foundand inactive./run/coilyco-ops-summonand/var/cache/coilyco-ops-summonare absent.dd9d903.The retired surface gives external issue content no path to host-side Goose. Acceptance is complete.