Common issues and solutions. When in doubt, run tirith doctor for diagnostics.
Run tirith doctor to see the hook directory and whether hooks were materialized from the embedded binary.
If hooks are not found:
tirith is in your PATHeval "$(tirith init)" and check for errorsTIRITH_SHELL_DIR to point to your hooks directory explicitlyIf brew reports a newer version but tirith --version is older:
Then refresh materialized hooks and restart shell:
Tirith supports two bash integration modes:
Binds to Enter key via bind -x. Intercepts commands and paste before execution. Includes startup health gate and runtime self-healing.
Uses DEBUG trap. Compatible with more environments but warn-only — cannot block commands. No paste interception.
Set via environment variable (before tirith init in your shell rc):
If enter mode detects a failure, it auto-degrades to preexec and writes a persistent flag. To re-enable:
Tirith auto-defaults to preexec mode when SSH_CONNECTION, SSH_TTY, or SSH_CLIENT is set. If you still see input issues:
Ensure the tirith hook loads after PSReadLine initialization. The hook overrides PSConsoleHostReadLine to intercept pastes.
Tirith's Tier 1 fast path (no URLs detected) targets <2ms. If you notice latency:
tirith check --json -- "your command" and check timings_mstirith doctor to see policy pathsIf a command is incorrectly blocked or warned:
tirith why to see which rule triggered~/.config/tirith/allowlistseverity_overrides: { rule_id: LOW }Tirith searches for policy in this order:
TIRITH_POLICY_ROOT env var.tirith/policy.yaml~/.config/tirith/policy.yaml (user-level fallback)Use tirith doctor to see which policy files are active.
Warp handles /dev/tty output differently. Tirith auto-detects Warp, but if messages aren't showing:
Codex has two execution paths. MCP gateway covers MCP tools/call, but native /bin/zsh -lc execution does not pass through MCP.
Fix: Ensure both paths are configured — the MCP gateway AND the ~/.zshenv guard. See the MCP Integration docs for details.
Tirith uses a mixed fail-safe policy for unexpected exit codes (crashes, OOM-kills):
| Context | Behavior |
|---|---|
| Bash enter mode | Auto-degrades to preexec. Current command not executed. |
| Zsh / Fish / PowerShell | Warns and executes. Terminal never breaks. |
| All paste paths | Fail-closed — discards paste. You can re-paste. |
Expected exit codes: 0 (allow), 1 (block), 2 (warn). Anything else is treated as unexpected.
Default: ~/.local/share/tirith/log.jsonl (XDG-compliant). Each entry is a JSON line with timestamp, action, rule IDs, and redacted command. Disable with export TIRITH_LOG=0.