0042 — Sovereign self-hosted defaults, paid declared-only relays¶
Status: proposed · Date: 2026-09-21 · Cites: sub-doctrine 8.b · Related: ADR-0015, ADR-0016, ADR-0027, ADR-0038, ADR-0037 · Evidence: the engine-pool, deploy, forge and tracker surfaces; sub-doctrine 8.b; the corpus index
Superseded in part by the change feat(engines)!: remove the repealed opencodeloop engine (2026-09-25): canon 8.b repealed OpenCode, and the opencode engine and its runner opencodeloop are deleted, so the engines' sovereign default below is qwenloop alone.
Owes: the conduct rule is sub-doctrine 8.b. This record decides the mechanism that enforces it — one vibey-owned protocol per surface, sovereign self-hosted defaults, paid platforms declared and relayed. The rule is ratified only by the human merge that carries it.
Context¶
Doctrine 8.a makes the purely sovereign path the preference, not the fallback.
But a preference without a concrete default is a platitude: the codebase still
defaulted spreadsheets of surfaces to paid or hosted platforms — the deploy
default was azure, the forge default was github, the ticketing surface had
no implementation at all, and the engine pool defaulted to the four paid loop
engines with the sovereign pair behind opt-in switches.
Sub-doctrine 8.b (ratified by this PR's merge) names what sovereign means, surface by surface: the self-hosted, free implementation is the only default, everywhere; every paid counterparty is declared by a human and relays through the sovereign host on a vibey-owned protocol.
Decision¶
Every operational surface speaks one vibey-owned protocol, realized by per-platform adapters (ADR-0016). The sovereign, self-hosted, free adapter is the default of every surface — always on, never needing declaration, never demoted. Every paid platform adapter is declared-only and relays through the sovereign host rather than replacing it.
| Surface | Protocol | Sovereign default | Declared-only |
|---|---|---|---|
| Engines | EngineDescriptor/EngineProvider (ADR-0005) |
qwenloop, opencode |
claudeloop, codexloop, cursorloop, agyloop |
| Cloud | CloudClientPort |
self-hosted openstack |
azure, aws, gcp |
| Forge | ForgeAdapterInterface (vibey-gh #138) |
self-hosted forgejo |
github, gitlab |
| Ticketing | IssueTrackerPort |
self-hosted free plane |
jira, linear, asana (+ sibling sovereign openproject) |
| Documentation | DocsPort |
self-hosted free bookstack |
confluence, notion, gitbook |
| Secrets | SecretsPort |
self-hosted free bitwarden |
lastpass, 1password, proton |
| Files | FilesPort |
self-hosted free nextcloud |
gdrive, icloud |
EmailPort |
self-hosted free forward-email |
proton, gmail, apple |
|
| SMS | SmsPort |
self-hosted free fossify |
google-messages, imessage |
| Messaging | MessagingPort |
self-hosted free Matrix (matrix/element) |
signal, discord, slack, zoom, whatsapp, telegram, messenger, facebook, instagram, tiktok |
Mechanically:
- Engines.
qwenloopandopencodeare resident in the engine pool by default, in every phase, no option or switch. The paid loop engines join only when declared in[engines] enabledor--engines(config + CLI, the declaration mechanism of ADR-0037's single distribution). Theopencodedescriptor is targetedLOCAL(it is the local opencode binary, running on the operator's machine — a sovereign engine, not a paid one).qwenloopswitches on by default._resolve_providerprefersopencodefirst, thenqwenloop. - Cloud.
ApplicationAzureClientPortis generalized toCloudClientPortby rename-with-alias;AzureTargetScopebecomes a provider-discriminatedTargetScopecarrying the provider name, so the digest differs per provider.deploy.targetdefaults toopenstack. The sovereign default loads the self-hosted OpenStack adapter (a realopenstackCLI adapter plus the existing in-memory default), andazure,aws,gcpadapters are declared-only. - Forge. In vibey-gh,
[platform] kinddefaults toforgejo(the self-hosted, free sovereign forge) with GitHub and GitLab declared-only. The selector and adapters already exist (#138); only the default and the declaration posture change, plus the stale "GitHub is the only adapter" claims in the architecture doc and ADR-0001. - Ticketing. A vendor-neutral
IssueTrackerPortprotocol is added underapplication/interfaces/; its default implementation is self-hosted free Plane; Jira is declared-only (the inverse of runbook 01's original plan, which made Jira primary). - Documentation. A vendor-neutral
DocsPortprotocol joins the same family; its default implementation is self-hosted free BookStack, whose own living docs (properdocs.yml) are already the first documentation surface; Confluence, Notion and GitBook are declared-only relays. Every surface keeps a common protocol — engines, cloud, forge, ticketing, documentation — each with a sovereign self-hosted default adapter and declared-only paid adapters that relay through the sovereign host rather than replacing it.
Security impact¶
The trust boundary does not move. Declared adapters still run in the same
working directory and never reach a shell; CloudClientPort keeps the
in-memory default so a bare install exercises the deploy surface with no
credentials. The relay posture means the sovereign host stays the source of
truth, so a declared counterparty holds no authority it is not transitively
granted by a protocol call the sovereign host can inspect.
Migration¶
deploy.targetno longer defaults toazure; an existing adopter that wants Azure must writetarget = "azure"(the declaration).[platform] kindno longer defaults togithub; an existing adopter that wants GitHub must writekind = "github".[engines] enabled/--enginesnow means "add the paid engines listed, atop the sovereign pair" — the sovereign pair is always present.- The engine
opencodedescriptor's tier changes toLOCAL; no invocation changes, only tier classification.
Consequences¶
- Every surface is empty-by-default and sovereign-by-default: a bare install runs on qwenloop + opencode, deploys to self-hosted OpenStack, lands in self-hosted Forgejo, tracks work in self-hosted Plane, and documents in self-hosted BookStack.
- A paid platform can never arrive silently; its declaration is a repository change, reviewed and merged by a human.
- Relay-through-sovereign keeps the sovereign host authoritative, which is the whole point: the paid platform is a reachable counterparty on a vibey-owned protocol, never a second source of truth.
- The interplay with the forge/ticketing surfaces is governance, filed under 8.b; this record is the mechanism half.