GloriousFlywheel Deployment Authority Execution Plan 2026-04-15
Snapshot date: 2026-04-15
Purpose
Turn the deployment-authority decision originally captured in #169 and
TIN-128 into a concrete edit sequence.
This document is intentionally narrow. It covers only the execution path needed to move GloriousFlywheel off its mixed GitLab-state plus Civo-bootstrap model without reopening the broader cache, FlakeHub, or runner-topology discussions.
Companion note:
- gloriousflywheel-deployment-authority-decision-2026-04-15.md
- gloriousflywheel-backend-authority-options-2026-04-15.md
- gloriousflywheel-backend-target-state-2026-04-16.md
gloriousflywheel-arc-ci-input-contract-2026-04-15.mdgloriousflywheel-arc-additive-policy-governance-2026-04-15.md- gloriousflywheel-honey-onprem-rollout-2026-04-16.md
Historical note:
- GitHub issue
#169closed on 2026-04-16 - this execution plan remains the canonical repo-local sequencing note
- live GitHub rollout owner is now
#208
Status
Phase 1 completed in-repo on 2026-04-15 for the documentation and example surfaces:
docs/infrastructure/quick-start.mdconfig/organization.example.yamltofu/stacks/arc-runners/terraform.tfvars.exampletofu/stacks/attic/terraform.tfvars.exampletofu/stacks/runner-dashboard/terraform.tfvars.exampletofu/stacks/gitlab-runners/terraform.tfvars.example
Result:
- the primary onboarding and example surfaces now describe the target local-first kubeconfig contract
- GitLab HTTP backend init and GitLab runner-manager paths are explicitly labeled as legacy-current compatibility where they still appear
- the next execution slice should start with
Justfile, not with more operator copy cleanup
Phase 2 completed in-repo on 2026-04-15 for the local operator entry surfaces:
Justfiledocs/reference/justfile-commands.mddocs/reference/environment-variables.md.env.exampledocs/infrastructure/quick-start.md
Result:
just tofu-init <stack>no longer presents GitLab HTTP state as the primary operator path- the Justfile now supports a generic backend-init contract through
TOFU_BACKEND_CONFIG_DIR,TOFU_BACKEND_CONFIG_FILE, orTF_HTTP_* - the repo now includes
config/backend.http.example.hclas the concrete example for per-stack backend config files - the explicit legacy path is now
just tofu-init-gitlab-legacy <stack> - the next execution slice should start with workflow authority and backend files, not with more local init cleanup
Phase 3 partially completed in-repo on 2026-04-15 for the workflow authority surface:
.github/workflows/deploy-arc-runners.ymltofu/stacks/arc-runners/dev-policy.tfvarstofu/stacks/arc-runners/dev-extra-runner-sets.tfvarstofu/stacks/arc-runners/legacy-civo.tfvarstofu/stacks/arc-runners/terraform.tfvars.example
Result:
- the GitHub Actions deployment path is now explicitly a compatibility workflow
- it now prefers explicit
KUBECONFIG_B64,KUBE_CONTEXT, andTOFU_BACKEND_CONFIGinputs when they are present - it now consumes committed dev ARC policy from
dev-policy.tfvarsinstead of treatinglegacy-civo.tfvarsas the primary workflow policy source - extra runner-set policy is now split into the additive
dev-extra-runner-sets.tfvarssurface - the workflow now also supports org-specific additive or overriding policy
through the
TOFU_EXTRA_POLICY_TFVARSsecret - automatic main-branch apply behavior was removed; legacy apply is now manual
via
workflow_dispatch - the repo still needs one real non-legacy backend authority and a non-legacy CI environment contract for cluster-access inputs to fully converge with the local path
- the current CI-side input analysis now lives in
docs/research/gloriousflywheel-arc-ci-input-contract-2026-04-15.md - additive runner-set ownership is now classified explicitly in
docs/research/gloriousflywheel-arc-additive-policy-governance-2026-04-15.md
Phase 4 completed in-repo on 2026-04-15 for the stack backend surfaces:
tofu/stacks/attic/backend.tftofu/stacks/arc-runners/backend.tftofu/stacks/gitlab-runners/backend.tftofu/stacks/runner-dashboard/backend.tf
Result:
- stack backend files now describe the current generic HTTP backend contract instead of teaching GitLab project state as the active model
- each stack now points operators toward
just tofu-init <stack>for the preferred init path andjust tofu-init-gitlab-legacy <stack>for compatibility - the remaining deployment-authority gap is no longer backend comment drift; it is the still-unresolved non-legacy backend authority that local and CI paths should converge on
Phase 5 partially completed in-repo on 2026-04-15 for secondary cleanup:
docs/reference/config-reference.mddocs/infrastructure/customization-guide.mddocs/reference/tofu-modules.mddocs/guides/github-app-adoption.mddocs/getting-started-guide.mddocs/infrastructure/overlay-creation.mddocs/ci-cd/overlay-pipelines.mddocs/guides/cross-forge-ci.mddocs/runners/project-onboarding.mddocs/runners/runbook.mddocs/runners/troubleshooting.mdtofu/stacks/attic/Justfiletofu/stacks/runner-dashboard/Justfiletofu/stacks/gitlab-runners/Justfile
Result:
- the shared config docs now describe the real
organization.yamlshape instead of the oldorganization.environmentsschema - the ARC adoption guide now uses the local-first kubeconfig path instead of Civo-era apply examples
- the remaining getting-started, overlay, and cross-forge docs now label GitLab-backed state as compatibility instead of teaching it as the normal GloriousFlywheel operator path
- the GitLab runner onboarding and operations docs are now explicitly labeled as legacy support surfaces
- the stack-local
Justfilehelpers are now explicitly classified as legacy-current direct-stack helpers rather than peer operator entrypoints - the root
Justfilepath is now explicitly documented as takingcluster_contextauthority fromconfig/organization.yaml - per-stack tfvars
cluster_contextvalues are now explicitly described as direct-stack or compatibility inputs that should only be kept aligned when those secondary paths are in use - the remaining cleanup is lower-signal and should not block backend-authority decisions
- the remaining deployment-authority gap is now backend authority, not cluster-context ownership
Phase 6 completed in-repo on 2026-04-16 for corrected on-prem cluster truth:
docs/infrastructure/quick-start.mddocs/getting-started-guide.mddocs/infrastructure/cluster-access.mddocs/infrastructure/clusters-and-environments.mddocs/infrastructure/proxy-and-access.mddocs/reference/config-reference.mddocs/reference/justfile-commands.mddocs/infrastructure/customization-guide.mdconfig/organization.example.yamlscripts/validate-org-config.shapp/scripts/generate-environments.ts
Result:
- primary docs now model
honeyas the only physical on-prem cluster target bumbleandstingare now documented as node-role placement inputs rather than separate clusters- config validation and generated environment metadata now accept
honeyas a first-class kubeconfig context - the remaining blocker is backend authority, not cluster identity or access wording
Phase 7 partially validated live on 2026-04-16 from the local operator machine:
~/.kube/kubeconfig-honey.yamlexists and contains thehoneycontextkubectl --context honey get nodes -o widesucceeds- nodes
honey,bumble, andstingare allReady - live cache runtime already exists in namespace
nix-cache arc-systems,arc-runners, andrunner-dashboarddo not yet exist live on the cluster
Result:
- cluster access is now verified, not inferred
- the next blocker is no longer “can this machine reach honey?”
- the next blockers are:
- missing local
config/organization.yaml - missing local backend config or
TF_HTTP_* - unresolved backend authority choice
- namespace or runtime drift between repo examples and live
nix-cachenaming onhoney
- missing local
- backend target direction is now explicit:
keep the current generic HTTP init path as transitional support, but converge
the post-
#208rollout toward environment-owned S3-compatible state on the localhoneyenvironment once implemented
Phase 8 partially completed in-repo on 2026-04-16 for root-init and stack example convergence:
Justfiledocs/reference/justfile-commands.mdtofu/stacks/attic/terraform.tfvars.exampletofu/stacks/arc-runners/terraform.tfvars.exampletofu/stacks/runner-dashboard/terraform.tfvars.exampletofu/stacks/gitlab-runners/terraform.tfvars.exampledocs/research/gloriousflywheel-backend-target-state-2026-04-16.md
Result:
- root init/help text now says plainly that current
TOFU_BACKEND_CONFIG_*andTF_HTTP_*inputs all feed the same transitional HTTP backend family - the current Tinyland stack examples now default to the
honeycontext - the Attic example now reflects the current
nix-cachenamespace plus the OpenEBS-on-bumblestorage bias - cache/Kubernetes shortcut defaults now target the live
nix-cachenamespace instead of the staleattic-cachehelper default - the repo now states explicitly that future S3-compatible backend migration
will require stack
backend.tfchanges, not just new init files
Phase 9 partially completed in-repo on 2026-04-16 for local preflight:
scripts/tofu-preflight.shJustfiledocs/reference/justfile-commands.mddocs/infrastructure/quick-start.mddocs/getting-started-guide.md
Result:
- the repo now has a GloriousFlywheel-side local preflight before
tofu init just tofu-preflight <stack>validates:config/organization.yaml- resolved cluster context
- resolved kubeconfig path and local context presence
{ENV}.tfvarsfor the chosen stack- the currently configured backend-init path
- this narrows the remaining blocker again: if preflight passes, the next gap is no longer local operator ambiguity; it is real backend endpoint selection and backend-family migration timing
- current local execution from this checkout now fails cleanly at the first real
blocker: missing
config/organization.yaml
Current local validation update from this checkout after local config materialization:
- local
config/organization.yamlnow exists and validates against the currenthoneytruth - local
tofu/stacks/attic/dev.tfvarsnow exists and matches the currentnix-cacheplus OpenEBS-on-bumblepath just tofu-backend-scaffold atticnow creates the expected local backend file underconfig/backends/just tofu-preflight atticnow advances past missing config and missing backend-path failures- the current first blocker is now exact:
config/backends/attic-dev.hclstill contains example placeholder values and needs a real backend endpoint plus credentials
Current Blocking Surfaces
These files currently define the mixed-era deployment contract.
Backend And Init
tofu/stacks/attic/backend.tftofu/stacks/arc-runners/backend.tftofu/stacks/gitlab-runners/backend.tftofu/stacks/runner-dashboard/backend.tfJustfiletofu/stacks/attic/Justfiletofu/stacks/runner-dashboard/Justfiletofu/stacks/gitlab-runners/Justfile
Why they block:
- all active stacks still declare
backend "http" - the actual non-legacy backend endpoint and credential authority is still chosen outside the repo at init time
- the root operator flow still carries an explicit legacy GitLab init path for compatibility until a non-legacy backend authority is fully adopted
- several stack-local helper surfaces still hard-code GitLab project state even
after the root
Justfilemoved to a generic HTTP contract
Current Repo-Local Rollout Note
docs/research/gloriousflywheel-honey-onprem-rollout-2026-04-16.md
Why it matters:
- it is the authoritative repo-local statement that
honeyis the only physical cluster target - it keeps node placement on
honey,bumble, andstingexplicit while the backend decision remains open
Workflow Authority
.github/workflows/deploy-arc-runners.ymltofu/stacks/arc-runners/legacy-civo.tfvars
Why they still matter:
- the workflow is now explicitly legacy-current and manual-only, but it still obtains kubeconfig through Civo CLI
- it still initializes GitLab HTTP backend state directly
- it still selects a legacy Civo-shaped tfvars file instead of the same
{env}.tfvarspath used by the local operator model
Secondary Legacy Teaching Surfaces
docs/getting-started-guide.mddocs/infrastructure/overlay-creation.mddocs/ci-cd/overlay-pipelines.mddocs/guides/cross-forge-ci.md
Why they still matter:
- they can reintroduce GitLab-state assumptions even after the primary docs and root operator path are corrected
- they should not block the backend decision itself, but they do need to be cleaned up before the slice can be called complete
Execution Rules
- Do not change stack backends without simultaneously updating the operator entrypoints that initialize them.
- Do not keep a CI deployment path that uses a different authority model from the documented local path.
- Mark GitLab-state and Civo-specific surfaces as legacy-current until the new path is implemented.
- Keep
gitlab-runnersexplicitly classified as legacy support during the transition. - Do not model
bumbleorstingas separate clusters anywhere in the primary operator path.
Phase Plan
Phase 1: Introduce The New Operator Contract In Docs And Examples
Goal:
- make the target model explicit before refactoring runtime surfaces
Files:
docs/infrastructure/quick-start.mdconfig/organization.example.yamltofu/stacks/arc-runners/terraform.tfvars.exampletofu/stacks/attic/terraform.tfvars.exampletofu/stacks/runner-dashboard/terraform.tfvars.example
Edits:
- rewrite quick-start initialization so GitLab HTTP state is clearly labeled as current legacy behavior, not the target operator contract
- document the target operator inputs as:
environment tfvars, explicit kubeconfig or ambient
KUBECONFIG, and a backend owned by the deployment environment - replace primary cluster-context examples that imply GitLab agent or Civo-only operation
- keep legacy examples only where they are explicitly marked as compatibility paths
Why first:
- this reduces the chance of refactoring code into an undocumented or ambiguous model
- it also provides the text that later code and workflow changes should match
Exit criteria:
- a new operator can tell which deployment path is legacy-current and which is the intended local-first path
Phase 2: Refactor Local Operator Entry Points
Goal:
- make local execution stop assuming GitLab HTTP state as the default init path
Files:
Justfiledocs/reference/justfile-commands.md
Edits:
- split backend initialization concerns from plan and apply flows
- remove
TF_HTTP_PASSWORDas the default requirement presented to operators - add one explicit path for the target backend contract and one clearly labeled legacy path if temporary compatibility is required
- keep
cluster_contextand kubeconfig handling aligned with the provider model already present in the stacks
Why second:
- the root
Justfileis the actual operator entry surface - backend refactors are not safely testable if the local init contract is still anchored to GitLab-specific environment variables
Exit criteria:
just tofu-init <stack>no longer implies GitLab backend as the primary path- docs and command output agree on the same credentials and inputs
Phase 3: Reclassify Or Replace CI Deploy Authority
Goal:
- stop GitHub Actions from acting as a separate authority model
Files:
.github/workflows/deploy-arc-runners.ymltofu/stacks/arc-runners/legacy-civo.tfvars- optionally
.github/workflows/validate.ymlif deploy responsibilities need to move
Edits:
- remove or demote the current Civo-bootstrap plus GitLab-backend workflow path
- if CI deployment remains, make it consume the same backend contract and kubeconfig model as the local operator path
- replace
civo.tfvarsas the primary workflow input with the same environment-oriented tfvars naming used elsewhere, or explicitly mark the compatibility file as legacy
Why third:
- local operator truth should be established before CI automation is allowed to mirror it
- otherwise the repo will keep two competing deployment contracts
Exit criteria:
- no primary deployment workflow depends on Civo CLI bootstrap
- CI deploy automation no longer hard-codes a GitLab backend model that local operators are supposed to abandon
Phase 4: Rewrite Stack Backend Surfaces
Goal:
- make stack-level backend declarations match the new authority model
Files:
tofu/stacks/attic/backend.tftofu/stacks/arc-runners/backend.tftofu/stacks/gitlab-runners/backend.tftofu/stacks/runner-dashboard/backend.tf
Edits:
- replace GitLab-managed backend comments and examples with the chosen target backend contract
- keep any temporary legacy instructions clearly bounded and labeled
- ensure each stack follows the same backend authority family
Why fourth:
- the backend files should be the final codification of the new decision, not the first place it appears
- changing them earlier would create drift if the operator contract is still not
implemented upstream in
Justfileand docs
Exit criteria:
- stack backend files no longer describe GitLab HTTP state as the primary model
- all active stacks describe the same backend family and initialization pattern
Phase 5: Secondary Cleanup And Legacy Labeling
Goal:
- remove remaining mixed-era wording after the primary path is consistent
Files:
docs/reference/config-reference.mddocs/reference/tofu-modules.mddocs/runners/project-onboarding.mddocs/runners/runbook.mddocs/runners/troubleshooting.md- any remaining stack examples or helper scripts that mention GitLab state or Civo bootstrap
Edits:
- update references to match the final contract
- label
gitlab-runnersand any GitLab-state instructions as legacy support where still retained
Exit criteria:
- no primary operator surface contradicts the new deployment-authority model
File Ownership Map
#169 / TIN-128
Primary files:
tofu/stacks/*/backend.tfJustfile.github/workflows/deploy-arc-runners.ymldocs/infrastructure/quick-start.mdconfig/organization.example.yamltofu/stacks/arc-runners/legacy-civo.tfvars
Adjacent But Parallel
#167/TIN-125: cache and publication contract#171/TIN-127: builder and clean-derivation contract#170/TIN-126: ARC topology and lifecycle
These can keep moving, but they should stay out of backend-authority files while
#169 is active.
Recommended Execution Order
docs/infrastructure/quick-start.mdconfig/organization.example.yamlplus stack tfvars examplesJustfile.github/workflows/deploy-arc-runners.ymltofu/stacks/*/backend.tf- secondary sweep docs
Verification Plan
After each phase:
- run
git diff --check - search for residual
TF_HTTP_PASSWORD,gitlab.com/api/v4/projects/.*/terraform/state,civo kubernetes config, andlegacy-civo.tfvarsreferences in primary surfaces - verify local docs and workflow docs describe the same kubeconfig and backend inputs
Before claiming implementation complete:
- confirm there is only one primary deployment contract across local docs,
Justfile, workflow automation, and stack backend files
Non-Goals For This Slice
- choosing the final FlakeHub or clean-derivation publication policy
- redesigning ARC pool topology
- redesigning dashboard auth
- deleting all GitLab support surfaces immediately
Those remain separate lanes after deployment authority is grounded.