Unify vhost rendering on contracts/routes, or delete the contract #20
Labels
No labels
blocked
conflicted
curated
in-progress
in-review
needs-decision
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
larandar/flaky-mesh#20
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?
Stable ID: FM-AUDIT-03
Source:
modules/contracts/routes.nix, everyservices.{caddy,nginx}writerSource status: new finding, not previously tracked
Disposition: open owner decision, then architecture work
Epic: #9
Blocked by: #11 (FM-AUDIT-02)
Problem
contracts/routesexists to make route intent renderer-agnostic: "a producer… says nothing about Caddy, nginx, or Authelia — that translation is a
renderer's job". Its actual reach:
mesh.routes?implementations/caddyintegrations/victoria-dashboardsintegrations/vault-dashboardsintegrations/mesh-whoami:297implementations/hermes:743integrations/mesh-librefang:24outputs/hosts/heimdallr:132outputs/hosts/bifrost:154Four of eight bypass the contract; three of those run the other web server;
two are host files.
mesh-whoamiargues its case in-file (a bare port, severalupstreams, the wireguard boundary as its scope) and that argument is sound —
the other three do not make one.
bifrost additionally hand-rolls what
implementations/caddyalready does, andgets it wrong in the exact way that aspect documents fixing:
The aspect explains that the bare-string form leaves
/var/lib/caddyroot-owned where impermanence creates the bind mount before systemd would
chown it, and Caddy then cannot write its ACME account:
bifrost is latent, not broken — its directory predates the persistence
entry — but a cold rebuild walks into the documented failure. The aspect's fix
does not apply because bifrost never sets
mesh.implementations.caddy.enable.Decision needed
Either every vhost goes through
contracts/routesand one renderer, or thecontract is deleted as aspirational. The current state pays the abstraction's
maintenance cost and delivers none of its guarantee.
Note the fleet runs two HTTP servers with no recorded decision between them.
Acceptance
mesh.routesentries and enable therenderer;
hermesandmesh-librefangmigrate off nginx or state why theycannot;
mesh-whoami's exemption written into its record.contracts/routes,implementations/caddyand the two dashboardproducers collapse to direct configuration.
Provenance
Split from #9 (FM-ASPECT-AUDIT). Audit run 2026-08-04 by agent.odin against commit
fc3b751, withmodules/implementations/{forgejo-agents,hermes}.nixandoutputs/hosts/odin/{configuration.nix,secrets.agents.yaml}dirty in the working copy.