From 0756eb94cd936a1bc7af1e9f2af155f652d91921 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Tue, 8 Sep 2026 17:51:31 +0200 Subject: [PATCH] docs: correct spec+plan for self-vs-inputs in imports The fix subagent found that inputs.hermes-agent.nixosModules.default inside `imports` causes infinite recursion in this repo's wiring (inputs comes from _module.args, which merges after imports resolve; self comes from specialArgs, which is available at import-time). Tested both ways. Update docs to show self.inputs, matching commit 31e1910. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01Vbvwg3Qt2u9nbkEA3wL17S --- .../plans/2026-09-08-hermes-agent-mibook.md | 18 ++++++++++++------ .../2026-09-08-hermes-agent-nixos-design.md | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/superpowers/plans/2026-09-08-hermes-agent-mibook.md b/docs/superpowers/plans/2026-09-08-hermes-agent-mibook.md index 3112a0d..23094df 100644 --- a/docs/superpowers/plans/2026-09-08-hermes-agent-mibook.md +++ b/docs/superpowers/plans/2026-09-08-hermes-agent-mibook.md @@ -58,7 +58,7 @@ No other files change. **Interfaces:** - Produces: NixOS option `my.profiles.hermes-agent.enable` (bool). When true, configures `services.hermes-agent` with `environmentFiles = [ config.sops.secrets."hermes-env".path ]` and grants `finn` the `hermes` group. Declares `sops.secrets.hermes-env` (owner/group `hermes`, path resolves to `/run/secrets/hermes-env` at runtime — but note the *service* re-copies it to `/var/lib/hermes/.hermes/.env`, per the spec's persistence note). -- Consumes: `hermes-agent.nixosModules.default` from the new flake input, imported directly inside the profile module via the `inputs` module arg (see Step 3) — not through `machines/configuration.nix`; existing `sops.secrets.` mechanism from `machines/core/sops.nix` (already applied to every machine, unaffected by this task). +- Consumes: `hermes-agent.nixosModules.default` from the new flake input, imported directly inside the profile module via `self.inputs` (the `self` module arg, from `specialArgs` — see Step 3 and Step 5's note on why not the `inputs` module arg) — not through `machines/configuration.nix`; existing `sops.secrets.` mechanism from `machines/core/sops.nix` (already applied to every machine, unaffected by this task). - [ ] **Step 1: Add the flake input** @@ -109,14 +109,14 @@ Create `modules/environments/hermes-agent/default.nix`: config, lib, pkgs, - inputs, + self, ... }: let cfg = config.my.profiles.hermes-agent; in { - imports = [ inputs.hermes-agent.nixosModules.default ]; + imports = [ self.inputs.hermes-agent.nixosModules.default ]; options.my.profiles.hermes-agent.enable = lib.mkEnableOption "Hermes Agent (Telegram + Email gateway)"; @@ -139,9 +139,15 @@ in } ``` -The `inputs` argument is available automatically — every module in this -repo gets it via `_module.args.inputs = self.inputs;` in -`machines/configuration.nix`, no extra wiring needed. +**Use `self`, not `inputs`, in the `imports` line.** `inputs` is supplied +via `_module.args.inputs = self.inputs;`, set inside a config block — but +NixOS resolves a module's `imports` before `_module.args` assignments +merge, so anything referenced inside `imports` must come from +`specialArgs` (fixed up front) instead. `self` is threaded via +`specialArgs = { inherit self; };` in `machines/configuration.nix` and is +available at import-time; `inputs` is not. Using `inputs` here reproduces +`infinite recursion encountered` — confirmed by testing it directly, not +theoretical. `self.inputs.hermes-agent` is the same flake input either way. - [ ] **Step 6: Register the module in the environments import list** diff --git a/docs/superpowers/specs/2026-09-08-hermes-agent-nixos-design.md b/docs/superpowers/specs/2026-09-08-hermes-agent-nixos-design.md index d7a698a..976e329 100644 --- a/docs/superpowers/specs/2026-09-08-hermes-agent-nixos-design.md +++ b/docs/superpowers/specs/2026-09-08-hermes-agent-nixos-design.md @@ -48,10 +48,16 @@ hermes-agent = { ``` Import the upstream module **from inside the profile module itself**, via -`imports = [ inputs.hermes-agent.nixosModules.default ];` — using the -`inputs` module arg already provided repo-wide by -`_module.args.inputs = self.inputs;` in `machines/configuration.nix`. -**Correction (found during implementation, 2026-09-08):** this is +`imports = [ self.inputs.hermes-agent.nixosModules.default ];` — using +`self` (available via `specialArgs = { inherit self; };` in +`machines/configuration.nix`), not the `inputs` module arg. **Correction +(found during implementation, 2026-09-08):** `inputs` is supplied via +`_module.args.inputs = self.inputs;`, set inside a config block — but +NixOS resolves a module's `imports` list before `_module.args` assignments +merge, so anything referenced inside `imports` must come from +`specialArgs` (fixed up front) instead. Using `inputs` here reproduces +`infinite recursion encountered`; `self.inputs.hermes-agent` is the same +flake input, reached the way that actually works. Separately, this is deliberately *not* wired through `machines/configuration.nix`'s per-machine module lists. NixOS's module system errors on a definition for an undeclared option regardless of `lib.mkIf`'s condition — so declaring @@ -72,14 +78,14 @@ repo's standard profile pattern: config, lib, pkgs, - inputs, + self, ... }: let cfg = config.my.profiles.hermes-agent; in { - imports = [ inputs.hermes-agent.nixosModules.default ]; + imports = [ self.inputs.hermes-agent.nixosModules.default ]; options.my.profiles.hermes-agent.enable = lib.mkEnableOption "Hermes Agent (Telegram + Email gateway)";