Files
Holden Salomon a9e8287065
test / test (macos-latest, 3.13) (push) Canceled after 0s
test / test (ubuntu-latest, 3.11) (push) Successful in 17s
test / test (ubuntu-latest, 3.12) (push) Successful in 18s
test / test (ubuntu-latest, 3.13) (push) Successful in 15s
ai-incidents 1.0.0
2026-09-21 17:48:40 +00:00

94 lines
4.7 KiB
TOML

# ai-incidents: full configuration reference.
#
# Default location: ~/.config/ai-incidents/config.toml (or $AI_INCIDENTS_CONFIG, or -c PATH).
# Every key is optional except [ledger] dir. Unknown keys are an error, so a typo cannot silently
# switch a setting off. Paths accept ~ and $VARIABLES.
# --- Where the transcripts are ---------------------------------------------------------------
# Read-only, always. Omit every [[source]] to read both defaults below.
# Give two sources of the same type distinct names, e.g. a second Claude Code config directory.
[[source]]
type = "claude-code"
path = "~/.claude/projects" # default; honours $CLAUDE_CONFIG_DIR
# name = "claude-code" # default: the type
[[source]]
type = "opencode"
path = "~/.local/share/opencode/opencode*.db" # default; a glob, to catch channel builds
# --- The pre-filter --------------------------------------------------------------------------
[scan]
max_candidates = 50 # most candidates shown to the judge in one run; the rest wait
max_per_session = 12 # most candidates from any one session
first_run = "baseline" # "baseline": record existing sessions as judged, without judging
# "backfill": judge them, max_candidates at a time
exclude = [] # fnmatch globs on the transcript path, e.g. ["*/-home-me-scratch*"]
extra_destructive = [] # extra regexes for commands that count as destructive
extra_benign = [] # extra regexes for destructive-looking commands that are routine
extra_alarm = [] # extra regexes for your own alarms, e.g. ["MyJobOverdue"]
# --- The judge -------------------------------------------------------------------------------
# One model call per run, and only when there are candidates. It gets the candidates on stdin and
# has no tools. The candidates leave this machine for whichever model you choose here.
[judge]
backend = "claude" # "claude" | "openai" | "command"
model = "sonnet"
timeout = 900 # seconds
prompt_file = "" # replace the built-in rubric (see src/ai_incidents/prompts/judge.md)
# backend = "claude": the Claude Code CLI, run with every tool and MCP server disabled.
binary = "claude"
extra_args = [] # appended to the claude command line
# backend = "openai": any OpenAI-compatible endpoint. This is the local-model option.
# base_url = "http://localhost:8080/v1" # llama.cpp server
# base_url = "http://localhost:11434/v1" # Ollama
# model = "qwen3:32b"
# api_key_env = "LOCAL_LLM_KEY" # name of an env var; never the key itself
# json_mode = true # send response_format = json_object
# max_tokens = 16000
# backend = "command": any program that reads the prompt on stdin and prints the answer.
# command = ["ollama", "run", "qwen3:32b"]
# --- The output ------------------------------------------------------------------------------
[ledger]
dir = "~/ai-incidents-ledger" # required
order = "severity" # "severity": most severe first | "newest"
title = "AI incidents" # heading for a new incidents.md
[git]
enabled = true # commit if ledger.dir is a git repository; ignored otherwise
push = false
remote = "origin"
branch = "" # refuse to run on any other branch; empty = whatever is checked out
expected_remote_url = "" # refuse to push if the remote has been repointed
author_name = "" # commit identity; empty = git's own configuration
author_email = ""
[state]
file = "~/.local/state/ai-incidents/state.json" # default ($XDG_STATE_HOME)
seen_list = "" # optional plain-text export of judged Claude Code transcripts, one
# `<file name>:<mtime>:<size>` per line, for a cleanup job that must
# not delete what has not been judged. Read back on start.
[privacy]
redact = true # mask secret-shaped strings before the judge and before the ledger
extra_redact_patterns = [] # extra regexes to mask
# --- Hooks -----------------------------------------------------------------------------------
# Commands, split like a shell would but not run by one. They get the run summary on stdin and in
# AI_INCIDENTS_* environment variables. A failing hook is logged and ignored.
[hooks]
notify_cmd = "" # after a run that filed something; quiet runs are silent
on_success_cmd = "" # after every successful run (a heartbeat for a dead-man's switch)
on_failure_cmd = "" # after a failed run
timeout = 60
# notify_cmd = "curl -s -H 'Title: ai-incidents' --data-binary @- https://ntfy.sh/your-topic"
# on_success_cmd = "curl -fsS -m 10 https://hc-ping.com/your-uuid"