TacidOS
DevelopersGitHub

Decision 0008

The agent writes typed `tacid.*` options, never arbitrary Nix

Architecture decision record 0008: The agent writes typed `tacid.*` options, never arbitrary Nix

Status
Accepted
Date
2026-09-03

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.core and tacid.agent read-only to the agent; tacid.raw as 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) and tacid.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.