Every configurable value of the hooks and the heartbeat daemon, one table per component.
Set a value on the config server's Smine tab (Config page) or with smine-rules settings set <component>.<key> <value>. The install record stores only overrides; every other value is the default listed here (Install § The install record).
| Applies | Meaning |
|---|---|
| restart | A change restarts the setting's consumer. The Smine tab's apply report names every changed restart row. |
| live | A change needs no restart. |
A list kind (strings, globs, paths, models) takes the whole JSON array on the command line; the Smine tab edits it one item per line. Rows the catalog marks hidden stay off the Smine tab and are set with the command: the gate's cause_*, reason_* and steer_* texts and every hook group's matcher and async.
Component config-server.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| port | int | 6001 | restart | Port the config server listens on; the LaunchAgent restarts it on a change. |
| init_welcome | bool | false | live | Open the Welcome page on the next config server start. |
| server_path | string | "" | restart | PATH the config server runs its tools with; empty takes the $PATH of the process applying the install. |
| trash_retention_days | int | 0 | live | Days a stashed file stays under ~/.claude/smine/trash before the sweep removes it; 0 keeps every stash forever. |
Component skill-environment.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| groups.skill-environment-cwdchanged-skillenv.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.skill-environment-cwdchanged-skillenv.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.skill-environment-cwdchanged-skillenv.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.skill-environment-pretooluse-skillenv.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.skill-environment-pretooluse-skillenv.matcher | regex | Skill | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.skill-environment-pretooluse-skillenv.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.skill-environment-sessionstart-skillenv.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.skill-environment-sessionstart-skillenv.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.skill-environment-sessionstart-skillenv.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.skill-environment-userpromptexpansion-skillenv.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.skill-environment-userpromptexpansion-skillenv.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.skill-environment-userpromptexpansion-skillenv.async | bool | false | live | Run the hook without waiting for its answer. |
Component context.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| context_dir | string | "" | live | Repo-relative directory holding the context docs the hooks inject; empty injects nothing and names this setting once per session start. |
| global_inline_cap | int | 9000 | live | Bytes of global context delivered inline; above it the hook writes an injection file and a pointer. |
| global_read_budget | int | 55000 | live | Bytes one required-reading chunk may hold before the pointer splits it. |
| global_banner | string | ===== GLOBAL CONTEXT (injected by hook) ===== | live | First line of the injected global context. |
| global_pointer_format | string | %s\nWritten to %s (%d chars, %d lines). Read it in full before any other tool call — the read-gate hook enforces this. | live | Pointer text when the context went to a file: banner, path, size, lines. |
| readgate_ledger_retention | duration | 168h0m0s | live | How long the read gate's ledger remembers a read; the skill-context prune uses the same age. |
| readgate_default_slice_suffix | string | topic-default | live | Suffix of the default-slice injection file name. |
| readgate_deny_format | string | Required reading first (read-gate). Read the files below in full with the offset/limit pairs listed, then retry this %s.%s | live | Deny text of the read gate; the first placeholder is the owed file list. |
| readgate_bash_addendum | string | \nBash reads do not count as coverage — use Read. | live | Line appended to a deny of a Bash call naming a governed file. |
| readgate_manifest_write_reason | string | read-gate: lane manifests are written by smine-rules lanes only | live | Deny text of a write to a lane manifest. |
| readgate_head_mismatch_text | string | read-gate: lane worktree is at %s, the lane manifest pins %s — review the pinned head | live | Deny text of a lane manifest whose head differs from the worktree. |
| readgate_gate_subagents | bool | true | live | Gate subagents too; off gates the root agent alone. |
| readgate_disabled_guides | strings | [] | live | Guide file names the gate never owes, such as go_test.md; every other guide stays gated. |
| skill_inline_cap | int | 9000 | live | Runes of skill context delivered inline; above it the hook writes an injection file. |
| skill_default_slice | string | default | live | The slice a smartskill injects without a topic token. |
| skill_help_pattern | regex | (?m)^\s*(?:/\S+\s+)?(?:-{1,2}|—|–)(?:help|h)\s*$ | live | Prompt pattern that marks a --help invocation. |
| skill_no_context_pattern | regex | (?:^|\s)(?:-{1,2}|—|–)no-context(?:\s|$) | live | Invocation token that suppresses the injection. |
| skill_banner_format | string | ===== SKILL CONTEXT /%s%s v%s (injected by hook) ===== | live | First line of an injected skill context: skill and version. |
| skill_repeat_format | string | Injected earlier this session (%d): %s | live | Line of a repeated invocation: the ids already delivered. |
| skill_pointer_format | string | Written to %s lines %d-%d (%d chars). Read those lines before any other tool call — the read-gate hook enforces this. | live | Pointer text when the skill context went to a file. |
| planmode_entry_id_prefix | string | RULE-PLAN- | live | Id prefix of the entries the plan-mode hook injects. |
| planmode_banner | string | ===== PLAN CONTEXT (injected on plan-mode entry) ===== | live | First line of the injected plan context. |
| planmode_heading | string | Plan-format rules (rules/plan.md, gate: plan-format on persisted plans): | live | Heading above the injected plan entries. |
| planmode_entry_format | string | - **%s** — %s\n | live | Line format of one injected plan entry: id, statement. |
| planmode_pack_format | string | %s\n%s\n%s\n%s\n | live | Wrapper of the injected plan pack. |
| planmode_pointer_format | string | %s\nWritten to %s (%d chars, %d lines). Read it in full before any other tool call — the read-gate hook enforces this. | live | Pointer text when the plan pack went to a file. |
| planmode_trailer | string | Planned files: run 'make acdsl ARGS="project -plan <path>"' per created/modified file to see its governing gates; the Read hook delivers a governed file's rules as context, never into the file. | live | Last line of the injected plan context. |
| planmode_root_only | bool | true | live | Inject plan context into the root agent only, never into a subagent. |
| acdsl_timeout | duration | 14s | live | Deadline of one acdsl child run; the hook gives up and answers nothing after it. |
| acdsl_binaries | strings | ["acdsl", | live | Binary names tried under bin/ in order. |
| acdsl_go_run_fallback | bool | true | live | Run go run ./cmd/acdsl when no built binary exists. |
| acdsl_context_text | string | ACDSL rules governing %s:\n%s | live | Lead line of the rules context a Read of a governed file receives. |
| groups.context-posttooluse-readgate.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-posttooluse-readgate.matcher | regex | Read|Skill | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-posttooluse-readgate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-posttooluse-skillcontext.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-posttooluse-skillcontext.matcher | regex | Skill | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-posttooluse-skillcontext.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-posttooluse-acdslhook.timeout | int | 15 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-posttooluse-acdslhook.matcher | regex | Read | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-posttooluse-acdslhook.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-posttooluse-planmodecontext.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-posttooluse-planmodecontext.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-posttooluse-planmodecontext.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-pretooluse-readgate.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-pretooluse-readgate.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-pretooluse-readgate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-sessionstart-globalcontext.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-sessionstart-globalcontext.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-sessionstart-globalcontext.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-sessionstart-readgate.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-sessionstart-readgate.matcher | regex | compact|clear | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-sessionstart-readgate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-subagentstart-globalcontext.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-subagentstart-globalcontext.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-subagentstart-globalcontext.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-userpromptsubmit-skillcontext.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-userpromptsubmit-skillcontext.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-userpromptsubmit-skillcontext.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-userpromptsubmit-readgate.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-userpromptsubmit-readgate.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-userpromptsubmit-readgate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.context-userpromptsubmit-planmodecontext.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.context-userpromptsubmit-planmodecontext.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.context-userpromptsubmit-planmodecontext.async | bool | false | live | Run the hook without waiting for its answer. |
Component gate. How the gate uses these values is in Permissions.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| read_only_commands | strings | ["[", | live | Commands the gate admits as read-only; a two-word entry lists one subcommand of its head. |
| ungated_tools | strings | ["Agent", | live | Tools the gate never judges. |
| tool_classes_bash | strings | ["Bash", | live | Tools the gate judges as shell commands. |
| tool_classes_read | strings | ["Read", | live | Tools the gate judges as file reads. |
| tool_classes_write | strings | ["Edit", | live | Tools the gate judges as file writes. |
| tool_classes_rule_bearing | strings | ["WebFetch", | live | Tools the gate admits only through an allow rule naming them. |
| denied_tools | strings | ["AskUserQuestion", | live | Tools the gate always denies. |
| protected_paths | paths | ["~/.claude/agents", | live | Paths no session writes, whatever its rules say. |
| operator_paths | paths | ["install.sh", | live | Repo paths only the operator runs; a linked worktree of the gate's own repo is refused them. |
| extra_read_dirs | paths | ["~/.cargo/registry", | live | Directories every session may read beside its roots. |
| extra_write_dirs | paths | ["~/.claude/plans", | live | Directories every session may write beside its roots. |
| managed_settings_path | string | /Library/Application Support/ClaudeCode/managed-settings.json | live | The managed settings file whose allow rules the gate reads first. |
| max_loop_items | int | 16 | live | Items a shell for loop may list before the fence refuses it. |
| tmp_dirs | paths | ["/private/tmp", | live | Temp directories the fence treats as a session's scratch roots. |
| engine_protected_dirs | paths | [".cargo", | live | Repo directories no write reaches, like Claude Code's own protected dirs. |
| engine_protected_file_patterns | globs | [".bazelrc*", | live | File-name patterns no write reaches. |
| engine_protected_files | paths | [".bash_aliases", | live | File names no write reaches, like Claude Code's own protected files. |
| file_commands | strings | ["cp", | live | File commands whose path arguments the fence checks. |
| wrapper_commands | strings | ["command", | live | Commands that run the next word as the command the gate judges. |
| git_admitted_flags | strings | ["--no-optional-locks", | live | Git global options the gate cuts before matching a rule. |
| makefile_names | strings | ["GNUmakefile", | live | File names make reads as the Makefile. |
| fimplement_skill | string | fimplement | live | Skill whose invocation applies a plan's frozen rules. |
| design_skill | string | fdesign | live | Skill whose run may freeze a plan's rules. |
| cause_acdsl_rule_file | string | acdsl policy mode is strict: rule files are not editable in this repo (docs/acdsl.html, Modes) | live | Deny cause of a rule-file write under acdsl strict mode. |
| cause_acdsl_surface | string | acdsl policy mode is gated or strict: the self-management surface changes only on the base branch (docs/acdsl.html, Modes) | live | Deny cause of a self-management surface write under acdsl gated or strict mode. |
| cause_agent_models | string | Agent call while the model vocabulary (settings availableModels, heartbeat forbidden_subagent_models) is unreadable | live | Deny cause of an Agent call while the model vocabulary is unreadable. |
| cause_anchor_removed | string | the session's worktree no longer exists — end this session; nothing outside it is reachable | live | Deny cause of a call after the session's worktree was removed. |
| cause_awk_write | string | awk program that writes or runs commands (print >, |, system, getline) — the path fence cannot check it | live | Deny cause of an awk program that writes or runs commands. |
| cause_cd_git | string | cd combined with git in one command — run git -C <dir> <subcommand> as its own call | live | Deny cause of cd combined with git in one command. |
| cause_cd_protected | string | cd into a protected root — the shell cwd persists, so every later bare word would resolve under it; stay in the working directory and pass the path as an argument | live | Deny cause of cd into a protected root. |
| cause_cd_redirect | string | cd combined with a redirect the gate cannot resolve — redirect to an absolute path inside the working roots | live | Deny cause of cd combined with a redirect the gate cannot resolve. |
| cause_compound | string | compound command with state-changing or unrecognized parts | live | Deny cause of a compound command with state-changing or unrecognized parts. |
| cause_critical_remove | string | rm/rmdir on a critical path (/, a top-level directory, $HOME, the working directory or one of its parents) | live | Deny cause of rm or rmdir on a critical path. |
| cause_denied_tool | string | tool is denied by policy | live | Deny cause of a tool listed in denied_tools. |
| cause_engine_protected | string | engine-protected path (VCS, editor, shell, package-manager or agent config) — Claude Code never auto-approves writes there; edit it by hand | live | Deny cause of a write to an engine-protected path. |
| cause_fence_construct | string | shell construct the path fence cannot follow (function, eval, coprocess, popd, cd -, assigning HOME/PWD/OLDPWD/CDPATH) | live | Deny cause of a shell construct the path fence cannot follow. |
| cause_fence_unparseable | string | command does not parse — the path fence cannot check it | live | Deny cause of a command the path fence cannot parse. |
| cause_fenced | string | path is outside this session's scope | live | Deny cause of a path inside the read fence. |
| cause_find_exec | string | find with an exec or write flag (-exec/-execdir/-ok/-okdir/-delete/-fprint*) runs or deletes past every check | live | Deny cause of find with an exec or write flag. |
| cause_freeze_budget | string | no freeze left in this session — a session freezes one plan per /fdesign prompt the user typed, an unattended design run one plan | live | Deny cause of a freeze beyond the session's design prompts. |
| cause_freeze_reopen | string | this plan's rules are frozen — they change only in a design run the user starts by typing /fdesign with the plan's file name | live | Deny cause of a refreeze of a frozen plan outside its design run. |
| cause_freeze_target | string | toolpolicy freeze takes one wip plan dir of this worktree: plans/<feature folder>/<plan dir> | live | Deny cause of a freeze target that is no wip plan dir. |
| cause_git_dir | string | git dir: hooks and config under .git run code on the next git command — change them through git itself, never by writing the files | live | Deny cause of a write under a .git dir. |
| cause_git_environment | string | GIT_* environment on a git call (GIT_INDEX_FILE excepted) — git reads config, pager, diff driver, git dir and exec path from it: drop the assignment | live | Deny cause of a GIT_* assignment on a git call. |
| cause_git_exec | string | git subcommand or option that runs a command named on the command line or plants hooks and config (clone -u/--template/-c, fetch/pull/ls-remote --upload-pack, push --receive-pack, archive --exec, grep -O, rebase -x, difftool, mergetool, bisect run, submodule foreach, filter-branch) — no allow rule lifts this | live | Deny cause of a git subcommand or option that runs a command. |
| cause_git_global_option | string | git global option before the subcommand — only -C <dir>, --no-pager, -P and --no-optional-locks are admitted: -c, --config-env, --exec-path, --git-dir, --work-tree and --bare redirect config or executables | live | Deny cause of a git global option outside git_admitted_flags. |
| cause_git_same_repo | string | git -C onto another checkout of this repository — refs and objects are shared across its worktrees: drop -C and run git in the session's own worktree | live | Deny cause of git -C onto another checkout of the session's repository. |
| cause_go_program_flag | string | go flag that runs another program (-exec, -toolexec, -vettool), or a word the gate cannot resolve statically — run the plain go command | live | Deny cause of a go flag that runs another program. |
| cause_make_args | string | make call loads code (-f/--eval/-I/-e), sets a variable the target's "## <target>:" help line does not declare (NAME=), or carries a value with shell metacharacters — declare the parameter in the Makefile's help line | live | Deny cause of a make call that loads code or sets an undeclared variable. |
| cause_no_allow_rule | string | no allow rule matches | live | Deny cause of a call no allow rule matches; toolpolicy check names a candidate rule only for it. |
| cause_operator_command | string | operator entry point — it deploys from the checkout it runs in, so it runs only from the main checkout: the user runs it | live | Deny cause of an operator entry point run from a linked worktree. |
| cause_pane_login | string | URL carries sign-in credentials — the Browser pane asks the user before submitting them and no hook answers that card; open the URL without them (a dev config server needs none) | live | Deny cause of a Browser pane URL carrying sign-in credentials. |
| cause_proc_subst | string | process substitution <(…) or >(…) — write a file under the scratchpad instead | live | Deny cause of a process substitution. |
| cause_protected_path | string | protected path: a settings layer, a gate input (hooks, skills, agents, tool-policy state) or the session transcript | live | Deny cause of a write to a protected path. |
| cause_read_outside | string | read outside the working directories | live | Deny cause of a read outside the session's read roots. |
| cause_rules_file | string | permissions.json is written only by a design run that may still freeze its plan | live | Deny cause of a write to a plan's rules file outside a freezable design run; the freeze cause follows it. |
| cause_sed_script_write | string | sed script with a w command — write files with the Edit tool or a redirect | live | Deny cause of a sed script with a w command. |
| cause_settings_interactive | string | settings.local.json self-service runs only in a session a human prompted — headless and scheduled sessions never change the permission layer | live | Deny cause of toolpolicy allow in a session no human prompted. |
| cause_settings_revoked | string | settings.local.json self-service revoked — the user's last message for it is #deny settings.local.json | live | Deny cause of toolpolicy allow after the user's #deny settings.local.json. |
| cause_settings_uncovered | string | settings.local.json rules not covered by a human act — a plan's rules come from its frozen record, never from toolpolicy allow; any other rule needs the user's message #allow settings.local.json (short: #allow -s); uncovered: | live | Deny cause of toolpolicy allow rules no human act covers; the uncovered rules follow it. |
| cause_settings_usage | string | usage: toolpolicy allow '<rule>' ['<rule>' …] | toolpolicy check [--skill <leaf>]… '<command|url|tool>' … | toolpolicy freeze plans/<feature folder>/<plan dir> | toolpolicy revert — one literal command, no pipes or redirects | live | Usage text of a malformed toolpolicy command. |
| cause_settings_via_command | string | settings.local.json is written only by the gate — add rules with: toolpolicy allow '<rule>' … | live | Deny cause of a direct write to settings.local.json. |
| cause_state_unavailable | string | tool-policy state unavailable: | live | Lead of the deny cause when the session state cannot be read; the error follows it. |
| cause_tilde_user | string | ~user path — name the absolute path instead | live | Deny cause of a ~user path. |
| cause_tmp_write | string | write under /tmp outside the session scratchpad — write under the scratchpad directory instead | live | Deny cause of a write under a temp dir outside the session scratchpad. |
| cause_unknown_tool | string | unknown tool | live | Deny cause of a tool in no tool class. |
| cause_unparseable_compound | string | unparseable compound command | live | Deny cause of a command that does not parse and carries a separator. |
| cause_unresolvable_head | string | command name the gate cannot resolve statically | live | Deny cause of a command name the gate cannot resolve. |
| cause_unresolvable_path | string | path argument the gate cannot resolve statically ($VAR from the environment, $(…) output, or a relative path after an uncertain cd) | live | Deny cause of a path argument the gate cannot resolve. |
| cause_workflow_marker | string | inline script carries the SMINE-PRIMER marker but is not the primer — only the primer may carry it | live | Deny cause of an inline Workflow script carrying the primer marker without being the primer. |
| cause_workflow_relay | string | launch outside a turn a task notification opened — the harness hands the newest typed message to every agent of the launch | live | Deny cause of a Workflow launch outside a turn a task notification opened. |
| cause_worktree_outside | string | EnterWorktree path outside this repository's .claude/worktrees — enter a worktree of the session's own repository | live | Deny cause of an EnterWorktree path outside the repository's worktrees dir. |
| cause_write_outside | string | write outside the working directories | live | Deny cause of a write outside the session's write roots. |
| cause_xargs_write | string | xargs feeding a command that is not read-only — its arguments come from stdin and cannot be path-checked | live | Deny cause of xargs feeding a command that is not read-only. |
| reason_accept_edits | string | acceptEdits file command, paths checked by the fence (bash-policy) | live | Allow reason of a file command in acceptEdits or auto mode. |
| reason_active_skill | string | active skill | live | Lead of the allow reason of a Skill call to an active skill; the skill follows it. |
| reason_path_flag | string | flagged file command with safe flags inside the write roots (bash-policy) | live | Allow reason of a file command with safe flags inside the write roots. |
| reason_pipeline | string | two-segment pipeline of allowed commands (bash-policy) | live | Allow reason of a pipe whose two sides are allowed. |
| reason_prompt_skill | string | skill the user's newest message names: / | live | Lead of the allow reason of a Skill call the user's newest message names; the skill follows it. |
| reason_read_only | string | read-only command batch (bash-policy) | live | Allow reason of a read-only command batch. |
| reason_roots | string | inside the session's working roots | live | Allow reason of a path inside the session's roots. |
| reason_sed_write | string | in-place sed, files checked by the fence (bash-policy) | live | Allow reason of an in-place sed whose files the fence checked. |
| reason_settings_rule | string | settings rule | live | Lead of the allow reason of a settings allow rule; the rule follows it. |
| reason_skill_grant | string | skill grant | live | Lead of the allow reason of a skill's allowed-tools rule; the rule follows it. |
| reason_system_read | string | system path, read-only | live | Allow reason of a read under a system path. |
| reason_ungated | string | ungated tool | live | Allow reason of a tool listed in ungated_tools. |
| steer_bash | string | Compound Bash commands are auto-denied in this environment; they never prompt. Issue ONE command per Bash call. Allowlisted prefixes (git/go/make/jq/gh/curl/...) run without prompting; fully read-only batches (jq/grep/ls/find/echo/...) are auto-allowed even when chained; ONE pipe (a | b) is allowed when both sides are allowlisted or read-only. Do not retry the same compound - split it or use Read/Grep/Glob tools. | live | Steering text every Bash deny appends. |
| steer_deny | string | Nothing prompts in this environment; a denied capability stays denied until a rule is added. Use an allowlisted form or a read-only alternative; do not retry the same call. | live | Steering text every deny appends after the candidate rule. |
| steer_find | string | Bash(find *) does not cover these forms and nothing prompts. Never use them: pipe instead - find <dirs> <tests> | xargs <cmd> - with both sides read-only or allowlisted. | live | Steering text of a find exec or write deny. |
| steer_relay | string | No allow rule lifts this. In a session with a typed message, a Workflow launches only from a turn a task notification opened: 1. launch the primer below with the Workflow tool as an inline script, unchanged; 2. end the turn; 3. in the turn its completion notification opens, relaunch the original Workflow call unchanged. A message typed after the notification restarts at step 1. Primer:\n | live | Relay steps of a Workflow relay deny; the primer script follows them. |
| invoke_entry_chapters | strings | ["actions", | live | Context chapters whose entries reach a session only through a skill invocation. |
| invoke_shell_meta_chars | string | ;|&<>$`'"() | live | Characters that make a Bash read of an entry non-literal. |
| invoke_deny_texts | strings | ["skill-invoke-gate: context entries are injected via your skill invocation — do not read %s directly (language guides and, via Read, the files your lane manifest lists are the only exceptions).", | live | The two deny texts of the skill-invoke gate: a direct entry read, a call before the required invocation. |
| groups.gate-directoryadded-toolpolicy.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-directoryadded-toolpolicy.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-directoryadded-toolpolicy.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.gate-permissionrequest-toolpolicy.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-permissionrequest-toolpolicy.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-permissionrequest-toolpolicy.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.gate-posttooluse-toolpolicy.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-posttooluse-toolpolicy.matcher | regex | Skill | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-posttooluse-toolpolicy.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.gate-pretooluse-toolpolicy.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-pretooluse-toolpolicy.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-pretooluse-toolpolicy.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.gate-pretooluse-skillinvokegate.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-pretooluse-skillinvokegate.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-pretooluse-skillinvokegate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.gate-userpromptsubmit-toolpolicy.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.gate-userpromptsubmit-toolpolicy.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.gate-userpromptsubmit-toolpolicy.async | bool | false | live | Run the hook without waiting for its answer. |
Component worktrees.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| branch_prefix | string | claude/ | live | Prefix of every session branch the worktree hook creates. |
| worktrees_dir | string | .claude/worktrees | live | Repo-relative directory the session worktrees live in. |
| reset_attempts | int | 5 | live | Attempts of the branch reset when git reports index.lock. |
| reset_retry_delay | duration | 200ms | live | Base delay between reset attempts; attempt n waits n times this. |
| acdsl_build_timeout | duration | 12s | live | Deadline of the acdsl build after a base move; it stays under the hook's own timeout. |
| short_sha_length | int | 7 | live | Hex digits of the short sha a worktree name ends in. |
| default_branch_fallback | strings | ["main", | live | Default-branch names tried when origin/HEAD is unset. |
| name_pattern | regex | ^[A-Za-z0-9][A-Za-z0-9._-]*$ | live | Pattern a requested worktree name must match. |
| pool_segment | string | /.claude/worktrees/ | live | Path segment that marks a session worktree for the write guard and the protected-root check. |
| guard_deny_texts | strings | ["session is worktree-anchored: writes go under %s — refusing write into the main checkout or a sibling worktree: %s", | live | The three deny texts of the write guard: outside the worktree, a parent segment, a protected checkout. |
| groups.worktrees-pretooluse-worktreewriteguard.timeout | int | 10 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.worktrees-pretooluse-worktreewriteguard.matcher | regex | Write|Edit|NotebookEdit | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.worktrees-pretooluse-worktreewriteguard.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.worktrees-sessionstart-worktreecreate.timeout | int | 15 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.worktrees-sessionstart-worktreecreate.matcher | regex | startup | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.worktrees-sessionstart-worktreecreate.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.worktrees-worktreecreate-worktreecreate.timeout | int | 60 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.worktrees-worktreecreate-worktreecreate.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.worktrees-worktreecreate-worktreecreate.async | bool | false | live | Run the hook without waiting for its answer. |
Component session-helpers.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| max_title_runes | int | 62 | live | Runes a session title may hold. |
| max_states | int | 8 | live | Title states one skill may declare. |
| max_token_runes | int | 16 | live | Runes one title state token may hold. |
| title_instruction_plan_mode | string | This call is allowed in plan mode: it changes only this session's sidebar title, nothing in the repository or the system. | live | Sentence the rename instruction adds in plan mode. |
| title_instruction_tail | string | Do it as your next action, then continue with what you were doing; if nothing is pending, end your turn without further output. Do not mention it. | live | Closing sentences of the rename instruction. |
| title_rename_allow_reason | string | sessiontitle: hook-instructed rename of this session | live | Allow reason of the hook-instructed rename call. |
| title_trigger_patterns | strings | ["(^|[;\u0026|\\s])(\\S*/)?smine-agentwt\\s+remove\\s+--dry-run(\\s|$)", | live | Command patterns the title hook watches for: close check, done, join, subscribe, the fleet flag, the member token, title set. |
| help_pattern | regex | ^\s*/([A-Za-z0-9_-]+)[ \t]+(?:-{1,2}|—|–)(?:help|h)[ \t]*(?:\r?\n|$) | live | Prompt pattern that marks a /<skill> --help prompt. |
| help_features_lead | string | What each switch keeps on. `#disable <group>` turns every member of a group off, `<group>:a,b` names members, `all` names everything; `heartbeat` spells `hb`. | live | Lead line above the feature catalog of a help answer. |
| notification_sound | string | /System/Library/Sounds/Funk.aiff; Windows C:/Windows/Media/notify.wav; Linux empty | live | Sound file played on a notification (afplay on macOS, PlaySound on Windows; forward slashes, the path lands in a bash hook command). |
| stop_sound | string | /System/Library/Sounds/Hero.aiff; Windows C:/Windows/Media/ding.wav; Linux empty | live | Sound file played when a turn ends (afplay on macOS, PlaySound on Windows; forward slashes, the path lands in a bash hook command). |
| groups.session-helpers-notification-play-sound.timeout | int | 0 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-notification-play-sound.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-notification-play-sound.async | bool | true | live | Run the hook without waiting for its answer. |
| groups.session-helpers-posttooluse-sessiontitle.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-posttooluse-sessiontitle.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-posttooluse-sessiontitle.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.session-helpers-pretooluse-sessiontitle.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-pretooluse-sessiontitle.matcher | regex | mcp__ccd_session_mgmt__set_session_title | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-pretooluse-sessiontitle.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.session-helpers-sessionstart-sessiontitle.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-sessionstart-sessiontitle.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-sessionstart-sessiontitle.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.session-helpers-stop-play-sound.timeout | int | 0 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-stop-play-sound.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-stop-play-sound.async | bool | true | live | Run the hook without waiting for its answer. |
| groups.session-helpers-stop-sessiontitle.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-stop-sessiontitle.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-stop-sessiontitle.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.session-helpers-userpromptsubmit-skillhelp.timeout | int | 5 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.session-helpers-userpromptsubmit-skillhelp.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.session-helpers-userpromptsubmit-skillhelp.async | bool | false | live | Run the hook without waiting for its answer. |
Component peek.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| port | int | 4242 | restart | Port of the central peek MCP server; heartbeat's peek address follows it. |
| control_port | int | 42442 | restart | Port of peek's control endpoint. |
| claude_home | string | "" | restart | Claude home peek reads sessions from; empty takes ~/.claude. |
| codex_home | string | "" | restart | Codex home peek reads sessions from; empty takes ~/.codex. |
Component heartbeat.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| port | int | 6101 | restart | Port the heartbeat daemon listens on; its hook URLs and the plist follow it. |
| peek_retry | duration | 30s | restart | Wait before a degraded peek round is repeated. |
| staging_target | string | "" | restart | Landing target the done skill catches up; empty means no staging target, and /done branch: refuses naming this setting. |
| workers | int | 2 | restart | Worker threads of the daemon. |
| shutdown_timeout | duration | 500ms | restart | Grace the daemon gives its threads at shutdown. |
| inbox_capacity | int | 16384 | restart | Events the engine inbox holds before senders wait. |
| exempt_paths | globs | [] | live | Path patterns two fleet members may both change without a collision. |
| version_keys | strings | ["version"] | live | JSON keys whose change alone is no collision. |
| forbidden_subagent_models | models | [] | live | Model patterns a subagent may not run on; the heart attack stops one that does. |
| collision_prefixes | strings | ["claude/"] | live | Branch prefixes whose branches the collision check compares. |
| runtime_stop_reason | string | heartbeat runtime stop ({finding}): {skill} {check} — {reason}. Stopped by the runtime agent. | live | Stop text of a runtime finding: {finding}, {skill}, {version}, {check}, {reason}, {evidence}. |
| kill_at | int | 8 | live | Failures of one check after which the run is killed. |
| kill_reason | string | heartbeat enforce: run {id} of {skill} killed — {check} failed {kill_at} times: {reason}. Stopped until the next prompt. | live | Stop text of a killed run: {id}, {skill}, {check}, {kill_at}, {reason}. |
| max_ended_runs | int | 64 | live | Ended runs the runtime keeps listed. |
| runtime_digest_lines | int | 50 | live | Lines of a runtime digest. |
| guarded_tools | strings | ["SendMessage", | live | Tools a runtime subscriber may not call. |
| subscriber_deny_reason | string | heartbeat runtime: the runtime subscriber acts only through `smine-heartbeat runtime send|stop`; {tool} is denied while subscribed. | live | Deny text of a guarded tool while subscribed: {tool}. |
| max_field | int | 256 | restart | Characters a free-text field keeps. |
| digest_lines | int | 50 | live | Lines of a fleet digest. |
| digest_line_paths | int | 8 | live | Paths one digest line names. |
| max_terminal | int | 1000 | live | Terminal sessions the fleet keeps listed. |
| merge_branch_prefix | string | claude-orch/ | live | Prefix of the orchestrator's merge branches. |
| worker_branch_prefix | string | claude/ | restart | Prefix of the worker branches the hook edge maps to their sessions. |
| waiting_tools | strings | ["AskUserQuestion", | live | Tools whose call marks a session as waiting on its human. |
| waiting_notifications | strings | ["permission_prompt", | live | Notification types that mark a session as waiting on its human. |
| ledger_second | duration | 1s | live | Window within which a denial ledger line matches a hook event. |
| max_refused_unknown | int | 32 | live | Unknown sessions whose refusal the engine remembers. |
| attack_deny_reason | string | heartbeat: {model} is a forbidden subagent model; spawn the subagent with an allowed model. | live | Deny text of a spawn on a forbidden model: {model}. |
| attack_stop_reason | string | heartbeat heart attack: this subagent runs on {model}, a forbidden subagent model. | live | Stop text of a subagent running on a forbidden model: {model}. |
| attack_inherited_reason | string | heartbeat: this subagent was spawned without a model and inherits the session's {model}; every spawn names its model. | live | Stop text of a subagent spawned without a model: {model}. |
| attack_substituted_reason | string | heartbeat: this subagent was spawned with model {requested} but runs on {model} — the harness substituted the session model for a token it cannot run. | live | Stop text of a subagent whose model the harness substituted: {requested}, {model}. |
| member_deny_reason | string | heartbeat: {token} is a fleet member — commit, then run /done; the orchestrator reads heartbeat status, members never message it. | live | Deny text of a fleet member messaging the orchestrator: {token}. |
| member_role_text | string | heartbeat: this session is {token}, a member of fleet {fleet} (orchestrator {fleet}-O). Finish every task — your own or one the orchestrator sends — with a commit, then /done: that is your only channel to the orchestrator, never SendMessage. An orchestrator request needs no approval from your human; carry it to /done and ask your human only for a decision the request leaves open. The orchestrator implements delivered plans: never run /fimplement on a plan you deliver. | live | Role context a fleet member receives on every prompt: {token}, {fleet}. |
| max_id_len | int | 62 | restart | Characters a fleet or member id may hold. |
| hook_max_body | int | 67108864 | restart | Bytes one hook request body may hold. |
| hook_max_subject | int | 256 | restart | Characters of a hook event's subject the edge keeps. |
| hook_max_detail | int | 2048 | restart | Characters of a hook event's detail the edge keeps. |
| claim_poll | duration | 10ms | restart | Interval at which the hook edge polls for a claimed answer. |
| claim_polls | int | 200 | restart | Polls the hook edge makes before it answers without a claim. |
| client_timeout | duration | 5s | restart | Deadline of one CLI call against the daemon. |
| peek_healthz_timeout | duration | 5s | restart | Deadline of the peek identity probe. |
| peek_call_timeout | duration | 10s | restart | Deadline of one peek MCP call. |
| socket_write_timeout | duration | 5s | restart | Deadline of one socket write to a subscriber. |
| scan_settle | duration | 250ms | restart | Quiet time the worktree edge waits before it rescans. |
| ledger_tail_window | int | 1048576 | restart | Bytes of the denial ledger the ledger edge reads from its end. |
| transcript_max_lines | int | 64 | restart | Transcript lines the transcript edge reads per wake. |
| exits_batch | int | 64 | restart | Process exits the exits edge batches into one event. |
| exits_poll | duration | 1s | restart | Interval of the polling process-exit watch off macOS (macOS watches through kqueue). |
| number_of_files | int | 16384 | restart | Open-file limit the LaunchAgent grants the daemon. |
| groups.heartbeat-notification.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-notification.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-notification.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-permissionrequest.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-permissionrequest.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-permissionrequest.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-posttooluse.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-posttooluse.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-posttooluse.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-posttoolusefailure.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-posttoolusefailure.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-posttoolusefailure.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-pretooluse.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-pretooluse.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-pretooluse.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-sessionend.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-sessionend.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-sessionend.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-sessionstart.timeout | int | 2 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-sessionstart.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-sessionstart.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-stop.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-stop.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-stop.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-stopfailure.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-stopfailure.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-stopfailure.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-subagentstart.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-subagentstart.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-subagentstart.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-subagentstop.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-subagentstop.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-subagentstop.async | bool | false | live | Run the hook without waiting for its answer. |
| groups.heartbeat-userpromptsubmit.timeout | int | 1 | live | Seconds Claude Code waits for the hook before it gives up. |
| groups.heartbeat-userpromptsubmit.matcher | regex | "" | live | Tool-name pattern the group fires on; empty fires on every tool. |
| groups.heartbeat-userpromptsubmit.async | bool | false | live | Run the hook without waiting for its answer. |
Component routines.
| Key | Kind | Default | Applies | Help |
|---|---|---|---|---|
| count_tokens | enum | off | restart | How the config server's context report and the budget routine count Claude tokens: off, or keychain for the Anthropic API key in the OS credential store — the macOS Keychain item com.smine.configserver / anthropic-api-key, or the Windows Credential Manager entry com.smine.configserver/anthropic-api-key. |