01
Secrets never reach the model.
SecretsManager redacts known patterns (Anthropic, OpenAI, GitHub, Google, Bearer tokens) from event payloads, error messages, and tool outputs. Provider keys are resolved with `SecretsManager.optional()` — never logged, never serialised, never written to disk.
redact-piino-secretsenv-only
02
Voices declare what they touch.
Every voice declares its `required_permissions` (filesystem, network, shell, browser). The PermissionGuard enforces them at runtime — an agent without `network` cannot make HTTP requests, regardless of what the LLM tries to do.
filesystemnetworkshellbrowser
03
Tool inputs are sanitised before they execute.
All tool inputs are validated with Zod schemas. PathSanitizer blocks `/etc/passwd`, `~/.ssh`, `/proc`, `/sys`, `/dev`. UrlSanitizer blocks `file:`, `javascript:`, `data:`, and private network ranges. Tool calls are rate-limited (`max_tool_calls` default 20) and time-limited (`tool_timeout_ms` default 30s).
zod-inputpath-sandboxurl-allowlistrate-limit
04
Tool outputs are quarantined.
PromptGuard scans every tool result before it reaches the model. Pattern-matching detects known injection payloads, structural validation rejects schema-violating output, and boundary markers wrap untrusted content the model is trained to recognise as data.
pattern-detectschema-validateboundary-wrap
05
Destructive tools gate behind approval.
Tools marked `destructive: true` (post, delete, send, pay) automatically pause for operator approval via the InterruptStore — even with no `requireApproval` config. Operators approve or deny via the `tutti-ai interrupts` TUI, the SSE stream, or the REST API.
destructive-flaghitl-gateaudit-log
06
Budgets are hard limits.
Per-agent budgets cap token usage and cost. The agent loop is halted when the budget is exceeded — no runaway loops, no surprise invoices. Score-file validation (Zod) rejects negative limits and dangling references at load time.
token-capcost-capscore-validate