48ddc5ab

By: ananjiani <ananjiani@noreply.codeberg.org>

feat(syncthing): declare game-save peers instead of pairing by hand (#348)

## The problem

Save sync has never actually run. Every host declared the `game-saves` folder, but each one listed **only itself** as a device:

```
steammachine  -> 1 device (itself)
ammars-pc     -> 1 device (itself)
steamdeck     -> 1 device (itself)
theoden       -> 1 device (itself)
```

Pairing by hand would not have fixed it either. `services.syncthing.overrideDevices` **defaults to `true`** in both the Home Manager and NixOS modules:

> Whether to delete the devices which are not configured via the `devices` option. If set to `false`, devices added via the web interface will persist.

So any peer added through the web UI is deleted on the next activation. That is what the old *"Devices are paired via web UI"* comment was up against — it only held until the next switch.

## The change

Adds `lib/syncthing-hosts.nix` with the four device IDs, keyed by hostname, consumed from both call sites:

- `modules/dendritic/gaming.nix` — desktop, steamdeck, steammachine
- `hosts/servers/theoden/configuration.nix` — NixOS service

Each host filters out its own entry, because Syncthing must not be handed itself as a peer.

### Why a new `gaming.syncthing.device` option

The module cannot work out which host it is:

- Home Manager exposes no `networking.hostName`
- The workstation hosts use **standalone** HM (`homeConfigurations."ammar@ammars-pc"`), which evaluates with `nixosConfig = null`, so the NixOS hostname is not reachable either

So it is set explicitly per host, the same way `ludusavi.backupPath` already is.

### Why `overrideDevices = false`

Device IDs derive from each machine's TLS certificate in its Syncthing data directory, and are therefore **per-install**. A reinstalled host gets a new ID. With `overrideDevices = false`, declared peers stay enforced while a device re-paired by hand after a reinstall persists rather than being deleted.

## Caveat worth stating

These IDs cannot be mirrored in terraform the way `lib/hosts.nix` is, because they are per-install rather than assigned. `lib/syncthing-hosts.nix` documents how to re-read one:

```bash
grep -oE '<device id="[A-Z0-9-]+" name="[^"]*"' ~/.local/state/syncthing/config.xml
```

If a host is reinstalled, update that file.

## Verification

After deploying, each host should show three peers and the folder should be shared with all three:

```bash
ssh root@192.168.1.111 'sudo -u ammar syncthing cli config devices list'
ssh root@theoden.lan 'syncthing cli config devices list'
```

Then a real round trip: write a file under `~/Games/Saves/` on the desktop, confirm it reaches the Steam Machine and theoden.

Note the Steam Deck currently has `syncthing.service` **inactive**, so it will not sync until that host is deployed too.

Co-authored-by: Ammar <ammar.nanjiani@gmail.com>
Reviewed-on: https://codeberg.org/ananjiani/infra/pulls/348
comin-ci-gate-testsdevshelldocshome-ammars-pchome-framework13nixos-ammars-pcnixos-aragornnixos-boromirnixos-denethornixos-erebornixos-framework13nixos-rivendellnixos-samwisenixos-steamdecknixos-steammachinenixos-theodennixos-wsl-workpre-commit-checkconfiguredevShellattic-clientdocumentationx86_64-linux