Decisions
The decisions behind the system
Decisions are recorded before implementation and changed only by a superseding record. Each record names the context, the options that were on the table, what was chosen, what it costs, and what was rejected. Where a record and the build plan disagree, the record wins.
99 records
Foundations
What Tacid is built on and what it speaks.
Change and authority
The transaction API, system definition, and authorization boundaries.
- 0006The typed transaction API is the OS APIAccepted
- 0007`/etc/tacid` is a git repository; the owner is a keyAccepted
- 0008The agent writes typed `tacid.*` options, never arbitrary NixAccepted
- 0009Five autonomy levels; reversibility is computed and is the boundaryAccepted
- 0010Hard invariants enforced outside the agentAccepted
- 0011bubblewrap/Landlock/seccomp, microVMs, and a kernel-enforced egress proxyAccepted
Storage and updates
Persistence, boot, updates, rollback, and changes to Tacid itself.
- 0012LUKS2 + TPM2 with PIN, Btrfs, impermanence, systemd-boot, Lanzaboote opt-inAccepted
- 0013Signed channels, quiet-point updates, health-gated automatic rollbackAccepted
- 0014The agent may rebuild its own source within a signed core; proposals, not pull requestsAccepted
- 0015iwd + systemd-networkd + resolved; firewall on, SSH offAccepted
Models and tools
Model providers, memory, and tool access.
Surfaces
The terminal first, then the shell, the installer and the voice.
- 0019Niri compositor; `tacid-shell` in Iced on layer-shellAccepted
- 0020The TUI ships first and is complete; the daemon is headless-firstAccepted
- 0021One token file generates every surfaceAccepted
- 0022Netinstall and offline ISOs; the installer is Tacid in genesis modeAccepted
- 0023x86_64 first, aarch64 second, three GPU vendors, tiers, Apple as communityAccepted
- 0024Push-to-talk default; wake word opt-in; voice is untrusted; English firstAccepted
The project
Naming, licensing, testing, and who Tacid is for.
- 0025One monorepo; names, pronunciation, binariesAccepted
- 0026Apache-2.0 and CC-BY-4.0; DCO; BDFL; no telemetry; no accountsAccepted
- 0027VM tests, stub model, cassettes, eval set, injection corpus, fuzzing, hardware labAccepted
- 0028A typed fact API feeds Doctor and the health gateAccepted
- 0029Project environments, device center, probes, never rewrite existing NixAccepted
- 0030Brain and body may be separated over the same protocol, laterAccepted
From implementation
Settled after the founding set.
- 0031What building it changedAccepted
- 0032What the first boot foundAccepted
- 0033Installation without an evaluator on the privileged pathAccepted
- 0034The machine carries what it was built fromaccepted
- 0035A person's files are read as themaccepted
- 0036The root is a snapshot restored at bootaccepted
- 0037The machine builds its next generation from what it carriesaccepted
- 0038A machine follows its channel, and comes back from a revision that cannot startaccepted
- 0039The root's key is sealed to the TPM behind a PIN, and the passphrase is the way backaccepted
- 0040Generations are kept by declaration and collected by the keeperaccepted
- 0041The owner's key is made at installation, and the recovery key is shown onceaccepted
- 0042The body is declared at birth, and the first boot reads it backaccepted
- 0043Logs are read as data, by a capability of their ownaccepted
- 0044A repository is read as the person, and nothing in it is writtenaccepted
- 0045What is plugged in is a fact, with a role and the profile that grants accessaccepted
- 0046A project is what its files say, and Tacid writes nothing into itaccepted
- 0047The face is two surfaces, software-rendered, and a client like any otheraccepted
- 0048A system declares what it is, and the keeper checks before it activatesaccepted
- 004949. A tool result is filtered, and a path list is a boundaryaccepted
- 005050. A change a mind composed is the agent's, and a channel is not a mind's to moveaccepted
- 005151. What leaves is named by the conversation, not by the adapteraccepted
- 005252. The machine says what it is doing, while it is doing itaccepted
- 005353. One compositor, and it is Hyprlandaccepted
- 005454. The data leg: a restore is a request the next boot honoursaccepted
- 005555. A write in a person's repository is a second process, and an action transactionaccepted
- 005656. A local model is held to a grammar compiled from the tools it was offeredaccepted
- 005757. A change nobody was asked about is kept until somebody has been toldaccepted
- 005858. A budget belongs in the process the bytes pass throughaccepted
- 005959. A value a person registers is refused by the process the bytes pass throughaccepted
- 006060. A chain cannot say how long it should be, so a counter doesaccepted
- 006161. An integration is a principal anybody may claim, because claiming it only subtractsaccepted
- 006262. A wait with no bound and no signal is how a working machine fails to bootaccepted
- 006363. The keeper does not hold itself while the stem is workingaccepted
- 006464. The journal's integrity check depends on the code that reads itaccepted
- 00650065. A generation the bootloader gave up on is not one of the newest worth keepingaccepted
- 00660066. A command no rule can read is not one any autonomy level reachesaccepted
- 00670067. A record is bytes, and what those bytes mean is a separate questionaccepted
- 00680068. A rollback check that compares strings must check they are comparableaccepted
- 00690069. A promise is kept about the value that was judgedaccepted
- 00700070. A daemon that bound and then wedged can only be caught from outsideaccepted
- 00710071. A budget per conversation needs a conversation that names itselfaccepted
- 00720072. The only thing outside a machine is what somebody carried out of itaccepted
- 00730073. What one machine learned about its body enters through a door of its ownaccepted
- 00740074. A corpus is made of the things that must not leaveaccepted
- 00750075. A microphone is a principal anybody in the room can beaccepted
- 00760076. A narrowing kept at one door is not a narrowingaccepted
- 00770077. An operation that names a unit is a shell with a longer spellingaccepted
- 00780078. A name a machine offers and nothing implements is a machine lying about itselfaccepted
- 00790079. A name out of this machine's own registry is not a URLaccepted
- 00800080. A firmware told to verify a chain nobody signed is a brickaccepted
- 00810081. A partition that classifies files promises something about processesaccepted
- 00820082. A flake with no lock is not a valueaccepted
- 00830083. A declaration covers what the agent may write, and the owner's files are not thataccepted
- 00840084. A socket that is never made needs no firewallaccepted
- 00850085. Some questions have no file, and the kernel answers them on a socketaccepted
- 00860086. A door the supervisor holds, for an engine that can only bind a portaccepted
- 00870087. A buffer with no alpha channel decides what the face can look likesuperseded
- 00880088. The face renders through wgpu, because that is what carries an alpha channelaccepted
- 00890089. The boot screen is generated from the tokens, like every other surfaceaccepted
- 00900090. A generation writes down what its initrd carriesaccepted
- 00910091. A turn ends in words when this machine has something that can produce themaccepted
- 00920092. A translation layer is a hole in the argument, and the owner opens itaccepted
- 00930093. A scan is asked of the supplicant that owns the radioaccepted
- 009494. A flash names the probe that is on the busaccepted
- 009595. A password is asked at installation, and the genome says where its hash isaccepted
- 009696. The live image opens a setup that asks what `tacid install` takesaccepted
- 009797. A machine may open its own root when its owner says soaccepted
- 009898. The installer makes the host key, and the machine answers to its nameaccepted
- 0099Display and compute roles, with reviewed VM ownershipAccepted
No decisions match. Try a topic such as “storage”, “policy”, or “models”.