Decision 0008
The agent writes typed `tacid.*` options, never arbitrary Nix
Architecture decision record 0008: The agent writes typed `tacid.*` options, never arbitrary Nix
Context
Small models are competent when the surface is small and typed; validation errors must be messages a model can act on; the owner’s own configuration must never be overwritten.
The three plans
- Grok: a TOML tree with a schema; the model is offered only the tools it may use.
- Fable: the single most important design decision: a small set of well-typed options with
descriptions, examples and validation;
tacid.coreandtacid.agentread-only to the agent;tacid.rawas a loud escape hatch; a curated services allow-list with one VM test each. - Codex: typed transactions rendered into a generated area; curated settings, not every option.
Decision
Fable’s surface, rendered from Codex’s transactions. Modules: tacid.core (read), tacid.agent
and tacid.policy (read; owner-signed), tacid.packages, tacid.services (allow-listed with
curated options and a VM test per service), tacid.hardware (udev profiles curated; raw rules need
review), tacid.desktop, tacid.dev, tacid.user, and tacid.raw at level 3 or higher. Every
option has description, example and validation; evaluation errors are returned to the model
verbatim. Every tacid.services.* option declares its persistent directories (impermanence,
review). Tacid does not depend on Home Manager; owner.nix may import it.
Consequences
- Adding a service is a module, its state declaration and a VM test; nothing merges without them.
- Beyond the surface:
pkgs/derivations (ADR-0001) andtacid.raw.
Alternatives rejected
- Free-form Nix for the agent: unbounded blast radius, unverifiable diffs, unhelpful errors.
- A GUI over every Nix option: the opposite of curation.