199. A hub is a declared host service; a working checkout's server stays a client's child
Context
ADR 0003 (accepted) refuses a daemon or system service; README says Majordomus is 'not a daemon'. Yet the lundra hub runs as a systemd user unit with --idle 0 (docs/MESH.md), ADR 0161 and I2722 restart hubs under their service manager, and the owner asked for a host-level resident (10-12) and an OS-supervised watchdog (10-17). The 10-07 audit warned that the tool had already grown daemon-like parts its own EXTRACTION_REPORT refused.
Decision
A machine the mesh declaration names as a hub may run one user-scoped service per repository (systemd user unit or launchd agent written by one typed capability) that ignores the idle exit; every other server remains a client's child under ADR 0003. A host-level resident, if ever built, is the same executable in a declared role with a minimal dependency closure and user-only IPC, never a second server, registry, discovery or update system.
Alternatives rejected
- A separate general-purpose host server
- A daemon per repository on every machine
- Root or system-wide services
- Keeping the hub's unit hand-made outside the model
Consequences
ADR 0003 is narrowed, not reversed; README's 'not a daemon' gains its exception; I3186, I3193 and the OS half of supervision wait for this decision.
Sources
Promoted on 2026-10-18 from the owner's ChatGPT project (workspace chatgpt-majordomus, issue I3100). The owner has not accepted it; it is proposed for the owner's decision.
chatgpt-majordomus:c240#2chatgpt-majordomus:c118#3chatgpt-majordomus:c193#0