Feed of "qyriad/rfd-modular-dynamicism" https://git.afnix.fr/qyriad/rfd-modular-dynamicism An experimental proposal for dynamic configs in NixOS Sat, 14 Feb 2026 17:11:39 +0000 pennae opened issue qyriad/rfd-modular-dynamicism#1 https://git.afnix.fr/qyriad/rfd-modular-dynamicism/issues/1 1#opt-in dynamicism can produce inconsistent system states depending on eval method# <![CDATA[

consider this module tree:

{ config, ... }: {
  config.services.foo.settings.threads = config.services.bar.settings.threads;
}

specified dynamicism in this case cannot detect that foo will need to have changes applied to it if bar.settings.threads is changed unless this has been explicitly written down. making value transfers of this sort safe requires that dynamic values are not used outside of the modules that declared them, otherwise a dynamic change to bar could produce a different system config than a monolithic evaluation of the same base config and setting override would produce.

we have a similar problem with types and option reuses:

{ config, options, lib, ... }: {
  options.services.something.context = options.services.different.context;
}

in this case changes to different.context would also entail changes to something.context and vice versa. it is now no longer possible to apply overrides to one of these without also affecting the other, and any type-based checking approach (like inserting tagged bottom types for values during a pre-flight check phase) will not be able to find this dependency. this pattern has been used in nixpkgs in the past to share lists between services.

dynamicism may be unsolvable in the nixos module system in the general case. consider the following module:

{ config, lib, ... }: {
  # imagine integer options foo.a, foo.b, foo.c with defaults 0

  config.foo.a = lib.mkMerge [
    (lib.mkIf (config.foo.b > 9000) (lib.mkForce config.foo.c))
    config.bar.settings threads
  ];

  config.systemd.services.foo.environment.a = toString config.foo.a;
}

in this case a dynamic change to foo.c may propagate to foo.a depending on the rest of the configuration, but it may not. in particular a later change to foo.b may change where foo.a propagates from, and bottom injection will not easily solve this becase the uses of the foo values are all located in the foo module.

this is complicated further by the fact that nixos module types are themselves mergeable and depending on eval order such type merges may not be commutative.

]]>
pennae 4921: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/issues/1 Tue, 03 Feb 2026 15:53:13 +0000
qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/9c3736612ffab0a850c756f20a7e62dfe7f8b111 <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/9c3736612ffab0a850c756f20a7e62dfe7f8b111">9c3736612ffab0a850c756f20a7e62dfe7f8b111</a> note k8s vs nix rollback/introspection <![CDATA[9c3736612ffab0a850c756f20a7e62dfe7f8b111 note k8s vs nix rollback/introspection]]> qyriad 3873: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/9c3736612ffab0a850c756f20a7e62dfe7f8b111 Tue, 02 Dec 2025 14:44:19 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/797291a4aa1d0e83e545bffa7eedc3482529327a <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/797291a4aa1d0e83e545bffa7eedc3482529327a">797291a4aa1d0e83e545bffa7eedc3482529327a</a> tweak vcpu halving pseudocode <![CDATA[797291a4aa1d0e83e545bffa7eedc3482529327a tweak vcpu halving pseudocode]]> qyriad 3872: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/797291a4aa1d0e83e545bffa7eedc3482529327a Mon, 01 Dec 2025 16:48:59 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/883079e1eab58313898e71309e97b77b1187cf9e <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/883079e1eab58313898e71309e97b77b1187cf9e">883079e1eab58313898e71309e97b77b1187cf9e</a> rationale -&gt; proposal <![CDATA[883079e1eab58313898e71309e97b77b1187cf9e rationale -> proposal]]> qyriad 3871: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/883079e1eab58313898e71309e97b77b1187cf9e Mon, 01 Dec 2025 16:43:43 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/937365ec34e12da636a28cdfb23e4d227757c6c6 <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/937365ec34e12da636a28cdfb23e4d227757c6c6">937365ec34e12da636a28cdfb23e4d227757c6c6</a> add a whole lot more <![CDATA[937365ec34e12da636a28cdfb23e4d227757c6c6 add a whole lot more]]> qyriad 3870: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/937365ec34e12da636a28cdfb23e4d227757c6c6 Mon, 01 Dec 2025 16:11:32 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/1166c464b9e584dc9ad393715770d49acf7b53bf <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/1166c464b9e584dc9ad393715770d49acf7b53bf">1166c464b9e584dc9ad393715770d49acf7b53bf</a> add source link for grafana.settings.paths.provisioning default value <![CDATA[1166c464b9e584dc9ad393715770d49acf7b53bf add source link for grafana.settings.paths.provisioning default value]]> qyriad 3840: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/1166c464b9e584dc9ad393715770d49acf7b53bf Fri, 28 Nov 2025 11:39:41 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism /qyriad/rfd-modular-dynamicism/compare/021fbefa011b16421e2ab1f149b4e0dff515d2a9...32425a286d82287cc5861961449117b8fe44095e <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/32425a286d82287cc5861961449117b8fe44095e">32425a286d82287cc5861961449117b8fe44095e</a> fix jenkins numbers in README <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/e1dcce4b51b8a40c68ca5b250c0a87841a0e198a">e1dcce4b51b8a40c68ca5b250c0a87841a0e198a</a> expand grafana benchmarks <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/566352f5f64e0e8cc7e73017ed9d3b4de0f60555">566352f5f64e0e8cc7e73017ed9d3b4de0f60555</a> correct performance for mkOverride <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/de3cde5185439032c16e06cea7ee09a3d6de48c7">de3cde5185439032c16e06cea7ee09a3d6de48c7</a> add benchmarks for option times <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/3ce367d2ad89cfd386b5ef7353d5a6ed07c0dc68">3ce367d2ad89cfd386b5ef7353d5a6ed07c0dc68</a> add benchmarks for overrides <![CDATA[32425a286d82287cc5861961449117b8fe44095e fix jenkins numbers in README e1dcce4b51b8a40c68ca5b250c0a87841a0e198a expand grafana benchmarks 566352f5f64e0e8cc7e73017ed9d3b4de0f60555 correct performance for mkOverride de3cde5185439032c16e06cea7ee09a3d6de48c7 add benchmarks for option times 3ce367d2ad89cfd386b5ef7353d5a6ed07c0dc68 add benchmarks for overrides]]> qyriad 3839: /qyriad/rfd-modular-dynamicism/compare/021fbefa011b16421e2ab1f149b4e0dff515d2a9...32425a286d82287cc5861961449117b8fe44095e Fri, 28 Nov 2025 11:38:29 +0000 qyriad pushed to main at qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/021fbefa011b16421e2ab1f149b4e0dff515d2a9 <a href="https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/021fbefa011b16421e2ab1f149b4e0dff515d2a9">021fbefa011b16421e2ab1f149b4e0dff515d2a9</a> initial commit <![CDATA[021fbefa011b16421e2ab1f149b4e0dff515d2a9 initial commit]]> qyriad 3812: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/commit/021fbefa011b16421e2ab1f149b4e0dff515d2a9 Mon, 24 Nov 2025 17:18:29 +0000 qyriad created branch main in qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism/src/branch/main qyriad 3811: https://git.afnix.fr/qyriad/rfd-modular-dynamicism/src/branch/main Mon, 24 Nov 2025 17:18:29 +0000 qyriad created repository qyriad/rfd-modular-dynamicism https://git.afnix.fr/qyriad/rfd-modular-dynamicism qyriad 3810: https://git.afnix.fr/qyriad/rfd-modular-dynamicism Mon, 24 Nov 2025 17:15:21 +0000