deploy(sovrn): TLSA checks, migrate to devenv
8 files changed,  +190, -403
M .gitignore
+11, -0
 1@@ -1,2 +1,13 @@
 2 result
 3 result-*
 4+
 5+# Devenv
 6+.devenv*
 7+devenv.local.nix
 8+devenv.local.yaml
 9+
10+# direnv
11+.direnv
12+
13+# pre-commit
14+.pre-commit-config.yaml
D devbox.json
+0, -21
 1@@ -1,21 +0,0 @@
 2-{
 3-  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.17.1/.schema/devbox.schema.json",
 4-  "packages": [
 5-    "yarn@latest",
 6-    "bash@latest",
 7-    "ripgrep@latest",
 8-    "coreutils@latest",
 9-    "git@latest",
10-    "git+https://git.kilimanjaro.io/vibe"
11-  ],
12-  "shell": {
13-    "init_hook": [
14-      "echo 'Welcome to devbox!' > /dev/null"
15-    ],
16-    "scripts": {
17-      "test": [
18-        "echo \"Error: no test specified\" && exit 1"
19-      ]
20-    }
21-  }
22-}
D devbox.lock
+0, -377
  1@@ -1,377 +0,0 @@
  2-{
  3-  "lockfile_version": "1",
  4-  "packages": {
  5-    "bash@latest": {
  6-      "last_modified": "2026-04-07T16:32:49Z",
  7-      "resolved": "github:NixOS/nixpkgs/dfd9566f82a6e1d55c30f861879186440614696e#bash",
  8-      "source": "devbox-search",
  9-      "version": "5.3p9",
 10-      "systems": {
 11-        "aarch64-darwin": {
 12-          "outputs": [
 13-            {
 14-              "name": "out",
 15-              "path": "/nix/store/my9bsdsfxcaxkb400i4xvvh1ahb8pybs-bash-interactive-5.3p9",
 16-              "default": true
 17-            },
 18-            {
 19-              "name": "man",
 20-              "path": "/nix/store/5nwbrxj440mxkv8sqzy3d9xsfpswhkkx-bash-interactive-5.3p9-man",
 21-              "default": true
 22-            },
 23-            {
 24-              "name": "dev",
 25-              "path": "/nix/store/047i8vx61kv70j0xahh65x1p0gs4bzp5-bash-interactive-5.3p9-dev"
 26-            },
 27-            {
 28-              "name": "doc",
 29-              "path": "/nix/store/p8v2kq7q82l8cz5axc9lvyj2klib1799-bash-interactive-5.3p9-doc"
 30-            },
 31-            {
 32-              "name": "info",
 33-              "path": "/nix/store/bqh3ll20jibzdrc42lclk29k144fanak-bash-interactive-5.3p9-info"
 34-            }
 35-          ],
 36-          "store_path": "/nix/store/my9bsdsfxcaxkb400i4xvvh1ahb8pybs-bash-interactive-5.3p9"
 37-        },
 38-        "aarch64-linux": {
 39-          "outputs": [
 40-            {
 41-              "name": "out",
 42-              "path": "/nix/store/f6lsdzsgbh5mxaaa91gykyi8mqmlzpr2-bash-interactive-5.3p9",
 43-              "default": true
 44-            },
 45-            {
 46-              "name": "man",
 47-              "path": "/nix/store/87ljrnbjn8w6iqf3bzirh6wd7lpmhvzp-bash-interactive-5.3p9-man",
 48-              "default": true
 49-            },
 50-            {
 51-              "name": "debug",
 52-              "path": "/nix/store/zyi5m4r7wma9vvvfzg7r99avh8sxg9m1-bash-interactive-5.3p9-debug"
 53-            },
 54-            {
 55-              "name": "dev",
 56-              "path": "/nix/store/hkmlf3zy6brfn3xr3magif6c54ln3z4c-bash-interactive-5.3p9-dev"
 57-            },
 58-            {
 59-              "name": "doc",
 60-              "path": "/nix/store/l7bcjyprsmzdnrimjg8al47wsr4vsy6q-bash-interactive-5.3p9-doc"
 61-            },
 62-            {
 63-              "name": "info",
 64-              "path": "/nix/store/cad8ahawmbf12gvh0bq7sf9rjjwbfzg9-bash-interactive-5.3p9-info"
 65-            }
 66-          ],
 67-          "store_path": "/nix/store/f6lsdzsgbh5mxaaa91gykyi8mqmlzpr2-bash-interactive-5.3p9"
 68-        },
 69-        "x86_64-darwin": {
 70-          "outputs": [
 71-            {
 72-              "name": "out",
 73-              "path": "/nix/store/hzc40jxl7zhc1cikxri178a4w6f4fzd6-bash-interactive-5.3p9",
 74-              "default": true
 75-            },
 76-            {
 77-              "name": "man",
 78-              "path": "/nix/store/8lp42ghh8l89v5kj6q5asbfdskssgcxn-bash-interactive-5.3p9-man",
 79-              "default": true
 80-            },
 81-            {
 82-              "name": "dev",
 83-              "path": "/nix/store/jfiwg11dqs0vzg45s58kkabjm0rm8d0c-bash-interactive-5.3p9-dev"
 84-            },
 85-            {
 86-              "name": "doc",
 87-              "path": "/nix/store/rlz86kfy3jxfi7ap587rhrm9ynbw2kvc-bash-interactive-5.3p9-doc"
 88-            },
 89-            {
 90-              "name": "info",
 91-              "path": "/nix/store/d9y32zx4cxwm3h20c0zrzsabjmws3z0m-bash-interactive-5.3p9-info"
 92-            }
 93-          ],
 94-          "store_path": "/nix/store/hzc40jxl7zhc1cikxri178a4w6f4fzd6-bash-interactive-5.3p9"
 95-        },
 96-        "x86_64-linux": {
 97-          "outputs": [
 98-            {
 99-              "name": "out",
100-              "path": "/nix/store/sfvyavxai6qvzmv9p9x6mp4wwdz4v41m-bash-interactive-5.3p9",
101-              "default": true
102-            },
103-            {
104-              "name": "man",
105-              "path": "/nix/store/lw0v8hggdjsqs9zpwwrxajcc4rbsmlfq-bash-interactive-5.3p9-man",
106-              "default": true
107-            },
108-            {
109-              "name": "debug",
110-              "path": "/nix/store/h979dcfkxhswbsdqcwqbzynaqnz1n5a0-bash-interactive-5.3p9-debug"
111-            },
112-            {
113-              "name": "dev",
114-              "path": "/nix/store/832yrsfhq3z41zn9rqsvv0cv22mblv4c-bash-interactive-5.3p9-dev"
115-            },
116-            {
117-              "name": "doc",
118-              "path": "/nix/store/fy5pa2zv8g7l3v0nn6rpwib8nl4whdx1-bash-interactive-5.3p9-doc"
119-            },
120-            {
121-              "name": "info",
122-              "path": "/nix/store/p9lkzmrvl0wqjs4mjv87h5lqcypgrzbp-bash-interactive-5.3p9-info"
123-            }
124-          ],
125-          "store_path": "/nix/store/sfvyavxai6qvzmv9p9x6mp4wwdz4v41m-bash-interactive-5.3p9"
126-        }
127-      }
128-    },
129-    "coreutils@latest": {
130-      "last_modified": "2026-04-06T17:08:15Z",
131-      "resolved": "github:NixOS/nixpkgs/ff048610a1b698607a66f4671821716c2272dc9f#coreutils",
132-      "source": "devbox-search",
133-      "version": "9.10",
134-      "systems": {
135-        "aarch64-darwin": {
136-          "outputs": [
137-            {
138-              "name": "out",
139-              "path": "/nix/store/akih5l2yxpzqyh63xvyc6zsxl7kl2x4v-coreutils-9.10",
140-              "default": true
141-            },
142-            {
143-              "name": "info",
144-              "path": "/nix/store/rqr62g2a1dl14qg090lixy4kyalamxnc-coreutils-9.10-info"
145-            }
146-          ],
147-          "store_path": "/nix/store/akih5l2yxpzqyh63xvyc6zsxl7kl2x4v-coreutils-9.10"
148-        },
149-        "aarch64-linux": {
150-          "outputs": [
151-            {
152-              "name": "out",
153-              "path": "/nix/store/f03gf7yy36rlr9n1wkblvikq12a3hg6c-coreutils-9.10",
154-              "default": true
155-            },
156-            {
157-              "name": "debug",
158-              "path": "/nix/store/l7pb1mavzin4hmwpp87f6xisfprrgnr2-coreutils-9.10-debug"
159-            },
160-            {
161-              "name": "info",
162-              "path": "/nix/store/802yhcvnd2kp712af4v48klcxqzjgdkp-coreutils-9.10-info"
163-            }
164-          ],
165-          "store_path": "/nix/store/f03gf7yy36rlr9n1wkblvikq12a3hg6c-coreutils-9.10"
166-        },
167-        "x86_64-darwin": {
168-          "outputs": [
169-            {
170-              "name": "out",
171-              "path": "/nix/store/33dari5qaqpza7z0yhyzrjg85xmclg8c-coreutils-9.10",
172-              "default": true
173-            },
174-            {
175-              "name": "info",
176-              "path": "/nix/store/mybh7m3jhp3hzp83hsz8aj6w7wr49hxv-coreutils-9.10-info"
177-            }
178-          ],
179-          "store_path": "/nix/store/33dari5qaqpza7z0yhyzrjg85xmclg8c-coreutils-9.10"
180-        },
181-        "x86_64-linux": {
182-          "outputs": [
183-            {
184-              "name": "out",
185-              "path": "/nix/store/74sind1d6vf2bfwd7yklg8chsvzqxmmq-coreutils-9.10",
186-              "default": true
187-            },
188-            {
189-              "name": "debug",
190-              "path": "/nix/store/hm1z5hlgc4p99s3vng7g69cqgdn1j93h-coreutils-9.10-debug"
191-            },
192-            {
193-              "name": "info",
194-              "path": "/nix/store/c5dpvsjmin1cx3ma6jizdzb26bx2avdl-coreutils-9.10-info"
195-            }
196-          ],
197-          "store_path": "/nix/store/74sind1d6vf2bfwd7yklg8chsvzqxmmq-coreutils-9.10"
198-        }
199-      }
200-    },
201-    "git+https://git.kilimanjaro.io/vibe": {
202-      "last_modified": "2026-05-03T10:22:37Z",
203-      "resolved": "git+https://git.kilimanjaro.io/vibe?ref=refs%2Fheads%2Fmain&rev=9dc3da3eebc815756178020554870fbfc3b1b26c"
204-    },
205-    "git@latest": {
206-      "last_modified": "2026-04-02T01:59:51Z",
207-      "resolved": "github:NixOS/nixpkgs/106eb93cbb9d4e4726bf6bc367a3114f7ed6b32f#git",
208-      "source": "devbox-search",
209-      "version": "2.53.0",
210-      "systems": {
211-        "aarch64-darwin": {
212-          "outputs": [
213-            {
214-              "name": "out",
215-              "path": "/nix/store/6qbj40r0s289k5slmy8yna5x2hfz01wg-git-2.53.0",
216-              "default": true
217-            },
218-            {
219-              "name": "doc",
220-              "path": "/nix/store/xp9w7bcl4c78268kn82qdayqglj0zdxa-git-2.53.0-doc"
221-            }
222-          ],
223-          "store_path": "/nix/store/6qbj40r0s289k5slmy8yna5x2hfz01wg-git-2.53.0"
224-        },
225-        "aarch64-linux": {
226-          "outputs": [
227-            {
228-              "name": "out",
229-              "path": "/nix/store/0vbb6j0ppx1w8cw28h7w8s2dzla9j3m6-git-2.53.0",
230-              "default": true
231-            },
232-            {
233-              "name": "debug",
234-              "path": "/nix/store/gaj4q67pid2pcy9nvh2ysv4728wxj5m4-git-2.53.0-debug"
235-            },
236-            {
237-              "name": "doc",
238-              "path": "/nix/store/9mrg9g0w2b4cfdppq3n4zvhkvyixvqpx-git-2.53.0-doc"
239-            }
240-          ],
241-          "store_path": "/nix/store/0vbb6j0ppx1w8cw28h7w8s2dzla9j3m6-git-2.53.0"
242-        },
243-        "x86_64-darwin": {
244-          "outputs": [
245-            {
246-              "name": "out",
247-              "path": "/nix/store/2q2hzaclp1rsj65h21lng7wa26vawhnq-git-2.53.0",
248-              "default": true
249-            },
250-            {
251-              "name": "doc",
252-              "path": "/nix/store/yi2mi426la2x7rggv0a0ah11s2dangz4-git-2.53.0-doc"
253-            }
254-          ],
255-          "store_path": "/nix/store/2q2hzaclp1rsj65h21lng7wa26vawhnq-git-2.53.0"
256-        },
257-        "x86_64-linux": {
258-          "outputs": [
259-            {
260-              "name": "out",
261-              "path": "/nix/store/7yvcckar1lzhqnr0xx2n19nsdjd4qa4d-git-2.53.0",
262-              "default": true
263-            },
264-            {
265-              "name": "debug",
266-              "path": "/nix/store/9xs1n97fsdbgnk8cxbdx3hqlz6fdaynb-git-2.53.0-debug"
267-            },
268-            {
269-              "name": "doc",
270-              "path": "/nix/store/rv7cz5lz1qmbdnh3zrpv0j0wa5ivaacq-git-2.53.0-doc"
271-            }
272-          ],
273-          "store_path": "/nix/store/7yvcckar1lzhqnr0xx2n19nsdjd4qa4d-git-2.53.0"
274-        }
275-      }
276-    },
277-    "github:NixOS/nixpkgs/nixpkgs-unstable": {
278-      "last_modified": "2026-03-16T02:27:38Z",
279-      "resolved": "github:NixOS/nixpkgs/f8573b9c935cfaa162dd62cc9e75ae2db86f85df?lastModified=1773628058&narHash=sha256-hpXH0z3K9xv0fHaje136KY872VT2T5uwxtezlAskQgY%3D"
280-    },
281-    "ripgrep@latest": {
282-      "last_modified": "2026-03-21T07:29:51Z",
283-      "resolved": "github:NixOS/nixpkgs/09061f748ee21f68a089cd5d91ec1859cd93d0be#ripgrep",
284-      "source": "devbox-search",
285-      "version": "15.1.0",
286-      "systems": {
287-        "aarch64-darwin": {
288-          "outputs": [
289-            {
290-              "name": "out",
291-              "path": "/nix/store/qx2i265ck9hi773q0hhg96bjchkghpgm-ripgrep-15.1.0",
292-              "default": true
293-            }
294-          ],
295-          "store_path": "/nix/store/qx2i265ck9hi773q0hhg96bjchkghpgm-ripgrep-15.1.0"
296-        },
297-        "aarch64-linux": {
298-          "outputs": [
299-            {
300-              "name": "out",
301-              "path": "/nix/store/p16w1972rd9hj2kdczmdlwv0wa8c0drf-ripgrep-15.1.0",
302-              "default": true
303-            }
304-          ],
305-          "store_path": "/nix/store/p16w1972rd9hj2kdczmdlwv0wa8c0drf-ripgrep-15.1.0"
306-        },
307-        "x86_64-darwin": {
308-          "outputs": [
309-            {
310-              "name": "out",
311-              "path": "/nix/store/hm6mgwzrdznpadk6nxzmlls1p534m2d3-ripgrep-15.1.0",
312-              "default": true
313-            }
314-          ],
315-          "store_path": "/nix/store/hm6mgwzrdznpadk6nxzmlls1p534m2d3-ripgrep-15.1.0"
316-        },
317-        "x86_64-linux": {
318-          "outputs": [
319-            {
320-              "name": "out",
321-              "path": "/nix/store/922crn2k3v8yaqk7anps80hba919lnds-ripgrep-15.1.0",
322-              "default": true
323-            }
324-          ],
325-          "store_path": "/nix/store/922crn2k3v8yaqk7anps80hba919lnds-ripgrep-15.1.0"
326-        }
327-      }
328-    },
329-    "yarn@latest": {
330-      "last_modified": "2026-03-21T07:29:51Z",
331-      "resolved": "github:NixOS/nixpkgs/09061f748ee21f68a089cd5d91ec1859cd93d0be#yarn",
332-      "source": "devbox-search",
333-      "version": "1.22.22",
334-      "systems": {
335-        "aarch64-darwin": {
336-          "outputs": [
337-            {
338-              "name": "out",
339-              "path": "/nix/store/59yqhmvbl7bsyv5qc30nmrpaf4iqj79h-yarn-1.22.22",
340-              "default": true
341-            }
342-          ],
343-          "store_path": "/nix/store/59yqhmvbl7bsyv5qc30nmrpaf4iqj79h-yarn-1.22.22"
344-        },
345-        "aarch64-linux": {
346-          "outputs": [
347-            {
348-              "name": "out",
349-              "path": "/nix/store/ybspc2b9q9j9drfpa5d1bmw2qgrkx4qc-yarn-1.22.22",
350-              "default": true
351-            }
352-          ],
353-          "store_path": "/nix/store/ybspc2b9q9j9drfpa5d1bmw2qgrkx4qc-yarn-1.22.22"
354-        },
355-        "x86_64-darwin": {
356-          "outputs": [
357-            {
358-              "name": "out",
359-              "path": "/nix/store/8j2xmk7ijy7nijpy2yc3mcjf7hxpnpyl-yarn-1.22.22",
360-              "default": true
361-            }
362-          ],
363-          "store_path": "/nix/store/8j2xmk7ijy7nijpy2yc3mcjf7hxpnpyl-yarn-1.22.22"
364-        },
365-        "x86_64-linux": {
366-          "outputs": [
367-            {
368-              "name": "out",
369-              "path": "/nix/store/g1ksanljq7v16gj8yb7zs6wkv7ikycy3-yarn-1.22.22",
370-              "default": true
371-            }
372-          ],
373-          "store_path": "/nix/store/g1ksanljq7v16gj8yb7zs6wkv7ikycy3-yarn-1.22.22"
374-        }
375-      }
376-    }
377-  }
378-}
A devenv.lock
+65, -0
 1@@ -0,0 +1,65 @@
 2+{
 3+  "nodes": {
 4+    "devenv": {
 5+      "locked": {
 6+        "dir": "src/modules",
 7+        "lastModified": 1791471428,
 8+        "narHash": "sha256-Iva5vlTiCPCHx3k3X7VFMn/TRJxcThJAUuOGjOAsHhQ=",
 9+        "owner": "cachix",
10+        "repo": "devenv",
11+        "rev": "c69190c2702bad99474200b6b7a80be86146ae71",
12+        "type": "github"
13+      },
14+      "original": {
15+        "dir": "src/modules",
16+        "owner": "cachix",
17+        "repo": "devenv",
18+        "type": "github"
19+      }
20+    },
21+    "nixpkgs": {
22+      "inputs": {
23+        "nixpkgs-src": "nixpkgs-src"
24+      },
25+      "locked": {
26+        "lastModified": 1789506231,
27+        "narHash": "sha256-vNkJbtmqyBfFhn/HnzQo4ROuoyYWuy/allqTfJb4kMY=",
28+        "owner": "cachix",
29+        "repo": "devenv-nixpkgs",
30+        "rev": "c2f38fe7f9e04d9aadd354d380f2bd40531d9737",
31+        "type": "github"
32+      },
33+      "original": {
34+        "owner": "cachix",
35+        "ref": "rolling",
36+        "repo": "devenv-nixpkgs",
37+        "type": "github"
38+      }
39+    },
40+    "nixpkgs-src": {
41+      "flake": false,
42+      "locked": {
43+        "lastModified": 1789370336,
44+        "narHash": "sha256-6RSEDHIWQtesQKWSu5qRai8L2h4KgCgMEfJHstW99G4=",
45+        "owner": "NixOS",
46+        "repo": "nixpkgs",
47+        "rev": "c7def046b9a883d46974757852106483d741586f",
48+        "type": "github"
49+      },
50+      "original": {
51+        "owner": "NixOS",
52+        "ref": "nixpkgs-unstable",
53+        "repo": "nixpkgs",
54+        "type": "github"
55+      }
56+    },
57+    "root": {
58+      "inputs": {
59+        "devenv": "devenv",
60+        "nixpkgs": "nixpkgs"
61+      }
62+    }
63+  },
64+  "root": "root",
65+  "version": 7
66+}
A devenv.nix
+83, -0
 1@@ -0,0 +1,83 @@
 2+{
 3+  pkgs,
 4+  lib,
 5+  config,
 6+  inputs,
 7+  ...
 8+}:
 9+
10+{
11+  # https://devenv.sh/basics/
12+  env.GREET = "devenv";
13+
14+  # https://devenv.sh/packages/
15+  packages = [
16+    pkgs.git
17+    pkgs.bash
18+    pkgs.bash-completion
19+    pkgs.bashInteractive
20+    pkgs.just
21+    pkgs.curl
22+    pkgs.jq
23+
24+    # go toolchain
25+    pkgs.go
26+    pkgs.golangci-lint
27+
28+    # atproto
29+    pkgs.atproto-goat
30+  ];
31+
32+  # https://devenv.sh/languages/
33+  # languages.rust.enable = true;
34+
35+  # https://devenv.sh/processes/
36+  # processes.dev.exec = "${lib.getExe pkgs.watchexec} -n -- ls -la";
37+
38+  # https://devenv.sh/services/
39+  # services.postgres.enable = true;
40+
41+
42+  enterShell = ''
43+    export SOVRN_DATA_DIR="${config.devenv.root}/data/dev"
44+
45+    # Configure bash with fish-like features
46+    bind 'set completion-ignore-case on'  # Case-insensitive completion
47+    bind 'set show-all-if-ambiguous on'   # Show all completions on first tab
48+    bind 'set menu-complete-display-prefix on'
49+    bind 'TAB:menu-complete'              # Tab cycles through completions
50+    bind '\e[A:history-search-backward'   # Up arrow searches history
51+    bind '\e[B:history-search-forward'    # Down arrow searches history
52+    bind 'set colored-completion-prefix on'  # Color the completion prefix
53+    bind 'set colored-stats on'           # Color the completion stats
54+
55+    # Enable bash-completion if available
56+    if [ -f ${pkgs.bash-completion}/etc/profile.d/bash_completion.sh ]; then
57+      source ${pkgs.bash-completion}/etc/profile.d/bash_completion.sh
58+    fi
59+
60+    # Better directory navigation
61+    shopt -s autocd 2>/dev/null          # Type directory name to cd
62+    shopt -s dirspell 2>/dev/null        # Correct spelling of dir names
63+    shopt -s cdspell 2>/dev/null         # Correct spelling of cd args
64+
65+    # Enable ** globbing for recursive directory matching
66+    shopt -s globstar 2>/dev/null
67+
68+    # Use correct hcloud context
69+  '';
70+  # https://devenv.sh/tasks/
71+  # tasks = {
72+  #   "myproj:setup".exec = "mytool build";
73+  #   "devenv:enterShell".after = [ "myproj:setup" ];
74+  # };
75+
76+  # https://devenv.sh/tests/
77+  enterTest = ''
78+  '';
79+
80+  # https://devenv.sh/git-hooks/
81+  # git-hooks.hooks.shellcheck.enable = true;
82+
83+  # See full reference at https://devenv.sh/reference/options/
84+}
A devenv.yaml
+18, -0
 1@@ -0,0 +1,18 @@
 2+# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
 3+inputs:
 4+  nixpkgs:
 5+    url: github:cachix/devenv-nixpkgs/rolling
 6+
 7+# If you're using non-OSS software, you can set allow_unfree to true.
 8+# allow_unfree: true
 9+
10+# If you're not willing to allow unsupported packages:
11+# allow_unsupported_system: false
12+
13+# If you're willing to use a package that's vulnerable
14+# permitted_insecure_packages:
15+#  - "openssl-1.1.1w"
16+
17+# If you have more than one devenv you can merge them
18+#imports:
19+# - ./backend
M flake.lock
+4, -4
 1@@ -290,11 +290,11 @@
 2         "nixpkgs": "nixpkgs_4"
 3       },
 4       "locked": {
 5-        "lastModified": 1791461335,
 6-        "narHash": "sha256-7db4M6L087F1c/HljOvZXSIm0+mU7E5XDdb56+4AiF4=",
 7+        "lastModified": 1791543971,
 8+        "narHash": "sha256-/Xo38EKhaSqPwFlvQ7xp1I06CxXC40AJNpz4G6Ynf5I=",
 9         "ref": "HEAD",
10-        "rev": "9834ad9fcf708a85f24489b74a6452db90f10ee5",
11-        "revCount": 200,
12+        "rev": "23fc06deee16b9008a375bfcfda7def213cffbe1",
13+        "revCount": 201,
14         "type": "git",
15         "url": "file:///home/btburke/projects/sovrn"
16       },
M hive.nix
+9, -1
 1@@ -68,7 +68,15 @@ let
 2     ];
 3     sovrn-metrics = [
 4       inputs.sovrn.nixosModules.metrics
 5-      { sovrn.fleet = (host.settings or { }).sovrn or { }; }
 6+      {
 7+        sovrn.fleet = (host.settings or { }).sovrn or { };
 8+        # The DANE watch: every cell's TLSA must match its certificate; the
 9+        # relays must have none (the backup MX fails open, bug 209274a).
10+        sovrn.daneCheck = {
11+          hosts = map (h: h.name) (hostsWithRole "sovrn-cell");
12+          failOpenHosts = map (h: h.settings.sovrnRelay.hostname) (hostsWithRole "sovrn-relay");
13+        };
14+      }
15     ];
16     sovrn-cell = [
17       inputs.sovrn.nixosModules.cell