Archetypes/Profiles repo split #18

Open
opened 2026-07-17 21:10:28 +01:00 by allod-agent · 0 comments
Member

So that every piece of configuration lives in the one repo meant to own it — and nothing operator-private can end up in the public framework — I want the framework repo, the example machine configs, and the secrets template split so that reusable behavior, machine definitions, and identity data each have exactly one owning repo.

Tracking issue for the Archetypes/Profiles repo split. Full plan: dev-plans/archetypes-profiles-split.md in this repo.

Summary

Rename the framework repo allod/profilesallod/archetypes (archetype merge, builders, shared modules, vmFacts, checks); move machine profile definitions into a dedicated public example repo allod/profiles with fresh history (redirectable by a deploy flake to an operator's own definitions repo); return the secrets template to identity-only exports; and adapt the public allod/deploy template to the split, with a generic composed-layer canary so a deploy flake fails loudly when its profiles redirect is lost.

Sequencing

The load-bearing constraint is the Forgejo rename redirect cliff: the old allod/profiles URL keeps serving the renamed repo until a new repo claims that name (at M1), which kills the redirect permanently. Order: M0 rename → G1 pre-cliff re-points + operator gate → M1 new repo → M2 seam flip → M3/M4 → M5 sweep. Transitional states are harmless by construction — nothing consumes the new repo until M2 locks it, and the secrets template exports dead attrs only between M2 and M4.

PRs and human operations

Human forge operations (human-only): M0 rename, M1 repo creation + settings, all PR merges. One operator confirmation gate (G1) before M1. Every PR carries Refs allod/strategy#<this issue>; the final sweep PR (M5c, allod/memory) carries Closes allod/strategy#<this issue>.

  • M0 (human): rename allod/profilesallod/archetypes on the forge; confirm redirect serves; do not create the replacement repo in the same session
  • G1a: allod/deploy — re-point profiles.url to allod/archetypes at same rev (URL-only; input name stays profiles until M3)
  • G1b: allod/inventory — framework checkout / cold-clone repo lists → allod/archetypes; regen vm-specs.json
  • G1c: allod/nexusDEPLOY_FLAKE defaults + /template/profiles sentinel + rotation lock-bump steps → allod/deploy checkout
  • G1 (operator gate): confirm no live consumer outside the public org still fetches through the allod/profiles redirect
  • M1 (human): create the empty allod/profiles repo — permanently ends the redirect; requires G1 complete
  • M1: populate allod/profiles example definitions repo (fresh history, agent PR)
  • M2: allod/archetypes seam flip — add profiles input, source definitions/profileData/preferences only from it, delete in-tree definitions and secrets/inventory reads, export profilesSource / composeProfileDefinitions / composedLayerCheck
  • M3: allod/deploy adaptation — rename framework input profilesarchetypes, add profiles definitions input + follows-redirects, add composed-layer canary + sabotage fixtures
  • M4: allod/secrets cleanup — remove lib.profileDefinitions, lib.profileData, homeModules.preferences, modules/preferences.nix
  • M5a: allod/inventory — add new definitions checkout, final registry cleanup, vm-specs.json regen
  • M5b: allod/nexus — remaining non-cliff prose/tests (only if needed)
  • M5c: allod/memory — topic-file updates; carries Closes

Risk

Residual risk R3 High overall — cross-repo interfaces and sequencing, a rename with an irreversible redirect cliff, and provisioning-adjacent pointer changes. Per-milestone risk and human-scrutiny notes are in the dev plan's Risk Assessment table.

So that every piece of configuration lives in the one repo meant to own it — and nothing operator-private can end up in the public framework — I want the framework repo, the example machine configs, and the secrets template split so that reusable behavior, machine definitions, and identity data each have exactly one owning repo. Tracking issue for the Archetypes/Profiles repo split. Full plan: `dev-plans/archetypes-profiles-split.md` in this repo. ## Summary Rename the framework repo `allod/profiles` → `allod/archetypes` (archetype merge, builders, shared modules, `vmFacts`, checks); move machine profile definitions into a dedicated public example repo `allod/profiles` with fresh history (redirectable by a deploy flake to an operator's own definitions repo); return the `secrets` template to identity-only exports; and adapt the public `allod/deploy` template to the split, with a generic composed-layer canary so a deploy flake fails loudly when its `profiles` redirect is lost. ## Sequencing The load-bearing constraint is the Forgejo rename redirect cliff: the old `allod/profiles` URL keeps serving the renamed repo until a new repo claims that name (at M1), which kills the redirect permanently. Order: M0 rename → G1 pre-cliff re-points + operator gate → M1 new repo → M2 seam flip → M3/M4 → M5 sweep. Transitional states are harmless by construction — nothing consumes the new repo until M2 locks it, and the secrets template exports dead attrs only between M2 and M4. ## PRs and human operations Human forge operations (human-only): M0 rename, M1 repo creation + settings, all PR merges. One operator confirmation gate (G1) before M1. Every PR carries `Refs allod/strategy#<this issue>`; the final sweep PR (M5c, `allod/memory`) carries `Closes allod/strategy#<this issue>`. - [ ] M0 (human): rename `allod/profiles` → `allod/archetypes` on the forge; confirm redirect serves; do not create the replacement repo in the same session - [ ] G1a: `allod/deploy` — re-point `profiles.url` to `allod/archetypes` at same rev (URL-only; input name stays `profiles` until M3) - [ ] G1b: `allod/inventory` — framework checkout / cold-clone repo lists → `allod/archetypes`; regen `vm-specs.json` - [ ] G1c: `allod/nexus` — `DEPLOY_FLAKE` defaults + `/template/profiles` sentinel + rotation lock-bump steps → `allod/deploy` checkout - [ ] G1 (operator gate): confirm no live consumer outside the public org still fetches through the `allod/profiles` redirect - [ ] M1 (human): create the empty `allod/profiles` repo — permanently ends the redirect; requires G1 complete - [ ] M1: populate `allod/profiles` example definitions repo (fresh history, agent PR) - [ ] M2: `allod/archetypes` seam flip — add `profiles` input, source definitions/`profileData`/preferences only from it, delete in-tree definitions and `secrets`/`inventory` reads, export `profilesSource` / `composeProfileDefinitions` / `composedLayerCheck` - [ ] M3: `allod/deploy` adaptation — rename framework input `profiles`→`archetypes`, add `profiles` definitions input + follows-redirects, add composed-layer canary + sabotage fixtures - [ ] M4: `allod/secrets` cleanup — remove `lib.profileDefinitions`, `lib.profileData`, `homeModules.preferences`, `modules/preferences.nix` - [ ] M5a: `allod/inventory` — add new definitions checkout, final registry cleanup, `vm-specs.json` regen - [ ] M5b: `allod/nexus` — remaining non-cliff prose/tests (only if needed) - [ ] M5c: `allod/memory` — topic-file updates; carries `Closes` ## Risk Residual risk R3 High overall — cross-repo interfaces and sequencing, a rename with an irreversible redirect cliff, and provisioning-adjacent pointer changes. Per-milestone risk and human-scrutiny notes are in the dev plan's Risk Assessment table.
Sign in to join this conversation.
No description provided.