diff --git a/evolution/proposals/ECP-0080-forgejo-primary-and-mirror-hosting.md b/evolution/proposals/ECP-0080-forgejo-primary-and-mirror-hosting.md new file mode 100644 index 0000000..af6719d --- /dev/null +++ b/evolution/proposals/ECP-0080-forgejo-primary-and-mirror-hosting.md @@ -0,0 +1,36 @@ +# ECP-0080: Forgejo-Primary Git Hosting With Mirror-Only Codeberg/GitHub + +Status: Implemented + +## Context + +Repository governance and CI are currently coupled to Codeberg-specific defaults in scripts and workflows. We want Forgejo to be the primary host for development and automation, while keeping Codeberg and GitHub as mirror endpoints only. + +## Decision + +1. Adopt Forgejo as the primary git/actions host. +2. Treat Codeberg and GitHub as push mirrors. +3. Disable actions on Codeberg mirror repositories. +4. Make workflow API calls host-agnostic by using runtime server/repository context instead of hardcoded Codeberg URLs. +5. Add first-party scripts for: + - setting primary + mirror remotes, + - pushing mirrors, + - toggling repository actions via Forgejo/Gitea API. +6. Update Forge scripts/docs so host/token defaults point to Forgejo first, with compatibility fallbacks for existing `codeberg-token.age`. + +## Alternatives considered + +- Keep Codeberg as the primary host and only tune runners. Rejected because the operational target is Forgejo-first ownership. +- Maintain duplicate active CI on all hosts. Rejected because it doubles cost/noise and risks divergent automation behavior. +- Manually manage remotes and repo settings per developer. Rejected because migration drift is likely without repeatable scripts. + +## Rollout / teardown plan + +- Rollout: + - merge workflow/script/doc updates, + - configure local remotes to Forgejo primary + mirror remotes, + - disable Codeberg actions with the new repository toggle script. +- Teardown: + - re-enable actions on Codeberg via the same toggle script, + - point primary remote back to Codeberg if needed, + - revert workflow host-context changes if a single-host lock-in is required.