Rio
adr/0084-command-allow-list.mdRaw Markdown · GitHub ↗

ADR-0084: Human-authored command allow-lists

  • Status: Accepted
  • Date: 2026-09-09
  • Deciders: jka
  • Decision: D84

Context

ADR-0083 gates every command, including commands a user runs many times an hour. Other agent front ends let a user mark a command as trusted. ADR-0083 had also stated that there would be no allow-list, and ADR-0053 limits autonomy.

Decision

Users can add commands to an allow-list. An allowed command skips the approval bar and nothing else: it still passes every check of ADR-0083 (redirection guard, confined working directory, timeout).

This refines ADR-0053 rather than contradicting it. An allow-list written by a person in advance is standing approval, not autonomy. The rule becomes: no trust decision is made silently; a human writes every rule.

  • A rule is an argument-vector prefix. A command matches when its argument vector starts with the rule's tokens, compared exactly. There are no shell patterns or globs.
  • Three scopes, matching the prompt layers: global (allow.list in the XDG agent directory), per provider (providers/<name>.allow.list, active only while that provider runs; not for echo), and project (.rio/allow.list). Files hold one Tcl list per line and can be edited by hand.
  • Union. A command is allowed if any active layer allows it; there is no precedence.
  • agent.propose carries auto 1 for an allowed command, which runs immediately with no bar; auto 0 waits for approval as before.
  • On a gated command's bar, "Always allow ▾" offers the program (argv[0], the default) or the exact command line, each into a chosen scope, and approves the current command. An Allowed commands… manager in Preferences ▸ Agent lists, adds and removes rules per scope.

Consequences

  • Repetitive approvals disappear for commands the user trusts.
  • A broad rule (the program alone) trusts every invocation of it. The per-click choice between program and exact command keeps that decision visible.
  • Regular-expression rules, per-directory rules and session-only trust are deferred.