Settings

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).

AppliesMeaning
restartA change restarts the setting's consumer. The Smine tab's apply report names every changed restart row.
liveA change needs no restart.
Note

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.

Config server

Component config-server.

KeyKindDefaultAppliesHelp
portint6001restartPort the config server listens on; the LaunchAgent restarts it on a change.
init_welcomeboolfalseliveOpen the Welcome page on the next config server start.
server_pathstring""restartPATH the config server runs its tools with; empty takes the $PATH of the process applying the install.
trash_retention_daysint0liveDays a stashed file stays under ~/.claude/smine/trash before the sweep removes it; 0 keeps every stash forever.

Skill environment

Component skill-environment.

KeyKindDefaultAppliesHelp
groups.skill-environment-cwdchanged-skillenv.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.skill-environment-cwdchanged-skillenv.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.skill-environment-cwdchanged-skillenv.asyncboolfalseliveRun the hook without waiting for its answer.
groups.skill-environment-pretooluse-skillenv.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.skill-environment-pretooluse-skillenv.matcherregexSkillliveTool-name pattern the group fires on; empty fires on every tool.
groups.skill-environment-pretooluse-skillenv.asyncboolfalseliveRun the hook without waiting for its answer.
groups.skill-environment-sessionstart-skillenv.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.skill-environment-sessionstart-skillenv.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.skill-environment-sessionstart-skillenv.asyncboolfalseliveRun the hook without waiting for its answer.
groups.skill-environment-userpromptexpansion-skillenv.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.skill-environment-userpromptexpansion-skillenv.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.skill-environment-userpromptexpansion-skillenv.asyncboolfalseliveRun the hook without waiting for its answer.

Context system

Component context.

KeyKindDefaultAppliesHelp
context_dirstring""liveRepo-relative directory holding the context docs the hooks inject; empty injects nothing and names this setting once per session start.
global_inline_capint9000liveBytes of global context delivered inline; above it the hook writes an injection file and a pointer.
global_read_budgetint55000liveBytes one required-reading chunk may hold before the pointer splits it.
global_bannerstring===== GLOBAL CONTEXT (injected by hook) =====liveFirst line of the injected global context.
global_pointer_formatstring%s\nWritten to %s (%d chars, %d lines). Read it in full before any other tool call — the read-gate hook enforces this.livePointer text when the context went to a file: banner, path, size, lines.
readgate_ledger_retentionduration168h0m0sliveHow long the read gate's ledger remembers a read; the skill-context prune uses the same age.
readgate_default_slice_suffixstringtopic-defaultliveSuffix of the default-slice injection file name.
readgate_deny_formatstringRequired reading first (read-gate). Read the files below in full with the offset/limit pairs listed, then retry this %s.%sliveDeny text of the read gate; the first placeholder is the owed file list.
readgate_bash_addendumstring\nBash reads do not count as coverage — use Read.liveLine appended to a deny of a Bash call naming a governed file.
readgate_manifest_write_reasonstringread-gate: lane manifests are written by smine-rules lanes onlyliveDeny text of a write to a lane manifest.
readgate_head_mismatch_textstringread-gate: lane worktree is at %s, the lane manifest pins %s — review the pinned headliveDeny text of a lane manifest whose head differs from the worktree.
readgate_gate_subagentsbooltrueliveGate subagents too; off gates the root agent alone.
readgate_disabled_guidesstrings[]liveGuide file names the gate never owes, such as go_test.md; every other guide stays gated.
skill_inline_capint9000liveRunes of skill context delivered inline; above it the hook writes an injection file.
skill_default_slicestringdefaultliveThe slice a smartskill injects without a topic token.
skill_help_patternregex(?m)^\s*(?:/\S+\s+)?(?:-{1,2}|—|–)(?:help|h)\s*$livePrompt pattern that marks a --help invocation.
skill_no_context_patternregex(?:^|\s)(?:-{1,2}|—|–)no-context(?:\s|$)liveInvocation token that suppresses the injection.
skill_banner_formatstring===== SKILL CONTEXT /%s%s v%s (injected by hook) =====liveFirst line of an injected skill context: skill and version.
skill_repeat_formatstringInjected earlier this session (%d): %sliveLine of a repeated invocation: the ids already delivered.
skill_pointer_formatstringWritten to %s lines %d-%d (%d chars). Read those lines before any other tool call — the read-gate hook enforces this.livePointer text when the skill context went to a file.
planmode_entry_id_prefixstringRULE-PLAN-liveId prefix of the entries the plan-mode hook injects.
planmode_bannerstring===== PLAN CONTEXT (injected on plan-mode entry) =====liveFirst line of the injected plan context.
planmode_headingstringPlan-format rules (rules/plan.md, gate: plan-format on persisted plans):liveHeading above the injected plan entries.
planmode_entry_formatstring- **%s** — %s\nliveLine format of one injected plan entry: id, statement.
planmode_pack_formatstring%s\n%s\n%s\n%s\nliveWrapper of the injected plan pack.
planmode_pointer_formatstring%s\nWritten to %s (%d chars, %d lines). Read it in full before any other tool call — the read-gate hook enforces this.livePointer text when the plan pack went to a file.
planmode_trailerstringPlanned 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.liveLast line of the injected plan context.
planmode_root_onlybooltrueliveInject plan context into the root agent only, never into a subagent.
acdsl_timeoutduration14sliveDeadline of one acdsl child run; the hook gives up and answers nothing after it.
acdsl_binariesstrings["acdsl","acdsl.exe"]liveBinary names tried under bin/ in order.
acdsl_go_run_fallbackbooltrueliveRun go run ./cmd/acdsl when no built binary exists.
acdsl_context_textstringACDSL rules governing %s:\n%sliveLead line of the rules context a Read of a governed file receives.
groups.context-posttooluse-readgate.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.context-posttooluse-readgate.matcherregexRead|SkillliveTool-name pattern the group fires on; empty fires on every tool.
groups.context-posttooluse-readgate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-posttooluse-skillcontext.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.context-posttooluse-skillcontext.matcherregexSkillliveTool-name pattern the group fires on; empty fires on every tool.
groups.context-posttooluse-skillcontext.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-posttooluse-acdslhook.timeoutint15liveSeconds Claude Code waits for the hook before it gives up.
groups.context-posttooluse-acdslhook.matcherregexReadliveTool-name pattern the group fires on; empty fires on every tool.
groups.context-posttooluse-acdslhook.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-posttooluse-planmodecontext.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.context-posttooluse-planmodecontext.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-posttooluse-planmodecontext.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-pretooluse-readgate.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.context-pretooluse-readgate.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-pretooluse-readgate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-sessionstart-globalcontext.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.context-sessionstart-globalcontext.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-sessionstart-globalcontext.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-sessionstart-readgate.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.context-sessionstart-readgate.matcherregexcompact|clearliveTool-name pattern the group fires on; empty fires on every tool.
groups.context-sessionstart-readgate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-subagentstart-globalcontext.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.context-subagentstart-globalcontext.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-subagentstart-globalcontext.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-userpromptsubmit-skillcontext.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.context-userpromptsubmit-skillcontext.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-userpromptsubmit-skillcontext.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-userpromptsubmit-readgate.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.context-userpromptsubmit-readgate.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-userpromptsubmit-readgate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.context-userpromptsubmit-planmodecontext.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.context-userpromptsubmit-planmodecontext.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.context-userpromptsubmit-planmodecontext.asyncboolfalseliveRun the hook without waiting for its answer.

Permission gate

Component gate. How the gate uses these values is in Permissions.

KeyKindDefaultAppliesHelp
read_only_commandsstrings["[","basename","cat","cd","cmp","cut","date","df","diff","dirname","du","echo","egrep","false","fgrep","file","find","git blame","git branch","git cherry","git config --get","git describe","git diff","git grep","git log","git ls-files","git ls-tree","git merge-base","git remote -v","git rev-list","git rev-parse","git shortlog","git show","git stash list","git status","git tag -l","git worktree list","go env","go list","go version","grep","head","jq","ls","od","printf","pwd","readlink","realpath","rg","sed","smine-rules --help","smine-rules -h","smine-rules base","smine-rules entries","smine-rules help","smine-rules intake","smine-rules pairs","smine-rules task-check","smine-rules walk","smine-rules settings list","smine-rules settings get","smine-rules settings-defaults --check","sort","stat","strings","sw_vers","tail","test","tr","true","type","uname","uniq","wait","wc","which","xxd"]liveCommands the gate admits as read-only; a two-word entry lists one subcommand of its head.
ungated_toolsstrings["Agent","CronCreate","CronDelete","CronList","EndConversation","ExitPlanMode","ExitWorktree","LSP","ListAgents","ListMcpResourcesTool","PushNotification","ReadMcpResourceTool","RemoteTrigger","ReportFindings","ScheduleWakeup","SendFeedback","SendMessage","SendUserFile","StructuredOutput","SubagentHandback","TaskCreate","TaskGet","TaskList","TaskOutput","TaskUpdate","TodoWrite","ToolSearch","WaitForMcpServers"]liveTools the gate never judges.
tool_classes_bashstrings["Bash","PowerShell"]liveTools the gate judges as shell commands.
tool_classes_readstrings["Read","Glob","Grep"]liveTools the gate judges as file reads.
tool_classes_writestrings["Edit","Write","NotebookEdit"]liveTools the gate judges as file writes.
tool_classes_rule_bearingstrings["WebFetch","WebSearch","Skill","Agent","Workflow","Monitor","Artifact","EnterWorktree","mcp__*"]liveTools the gate admits only through an allow rule naming them.
denied_toolsstrings["AskUserQuestion","EnterPlanMode","TaskStop"]liveTools the gate always denies.
protected_pathspaths["~/.claude/agents","~/.claude/hooks","~/.claude/skills","~/.claude/tool-policy"]livePaths no session writes, whatever its rules say.
operator_pathspaths["install.sh","cmd/sync","bin/configserver"]liveRepo paths only the operator runs; a linked worktree of the gate's own repo is refused them.
extra_read_dirspaths["~/.cargo/registry","~/.claude","~/.local/share/uv","~/.rustup","~/Library/Application Support/Claude","~/Library/Caches","~/go/bin","~/go/pkg/mod"]liveDirectories every session may read beside its roots.
extra_write_dirspaths["~/.claude/plans","~/.claude/projects/*/memory"]liveDirectories every session may write beside its roots.
managed_settings_pathstring/Library/Application Support/ClaudeCode/managed-settings.jsonliveThe managed settings file whose allow rules the gate reads first.
max_loop_itemsint16liveItems a shell for loop may list before the fence refuses it.
tmp_dirspaths["/private/tmp","/tmp"]liveTemp directories the fence treats as a session's scratch roots.
engine_protected_dirspaths[".cargo",".devcontainer",".git",".husky",".idea",".mvn",".vscode",".yarn"]liveRepo directories no write reaches, like Claude Code's own protected dirs.
engine_protected_file_patternsglobs[".bazelrc*",".bazeliskrc",".bazelversion",".pnp.*",".yarnrc*","lefthook*.yaml","lefthook*.yml"]liveFile-name patterns no write reaches.
engine_protected_filespaths[".bash_aliases",".bash_login",".bash_logout",".bash_profile",".bashrc",".claude.json",".devcontainer.json",".envrc",".gitconfig",".gitmodules",".mcp.json",".npmrc",".pnpmfile.cjs",".pre-commit-config.yaml",".profile",".ripgreprc",".zlogin",".zlogout",".zprofile",".zshenv",".zshrc","bunfig.toml","gradle-wrapper.properties","maven-wrapper.properties","pyrightconfig.json"]liveFile names no write reaches, like Claude Code's own protected files.
file_commandsstrings["cp","mkdir","mv","rm","rmdir","touch"]liveFile commands whose path arguments the fence checks.
wrapper_commandsstrings["command","env","nice","time","timeout","xargs"]liveCommands that run the next word as the command the gate judges.
git_admitted_flagsstrings["--no-optional-locks","--no-pager","-P"]liveGit global options the gate cuts before matching a rule.
makefile_namesstrings["GNUmakefile","makefile","Makefile"]liveFile names make reads as the Makefile.
fimplement_skillstringfimplementliveSkill whose invocation applies a plan's frozen rules.
design_skillstringfdesignliveSkill whose run may freeze a plan's rules.
cause_acdsl_rule_filestringacdsl policy mode is strict: rule files are not editable in this repo (docs/acdsl.html, Modes)liveDeny cause of a rule-file write under acdsl strict mode.
cause_acdsl_surfacestringacdsl policy mode is gated or strict: the self-management surface changes only on the base branch (docs/acdsl.html, Modes)liveDeny cause of a self-management surface write under acdsl gated or strict mode.
cause_agent_modelsstringAgent call while the model vocabulary (settings availableModels, heartbeat forbidden_subagent_models) is unreadableliveDeny cause of an Agent call while the model vocabulary is unreadable.
cause_anchor_removedstringthe session's worktree no longer exists — end this session; nothing outside it is reachableliveDeny cause of a call after the session's worktree was removed.
cause_awk_writestringawk program that writes or runs commands (print >, |, system, getline) — the path fence cannot check itliveDeny cause of an awk program that writes or runs commands.
cause_cd_gitstringcd combined with git in one command — run git -C <dir> <subcommand> as its own callliveDeny cause of cd combined with git in one command.
cause_cd_protectedstringcd 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 argumentliveDeny cause of cd into a protected root.
cause_cd_redirectstringcd combined with a redirect the gate cannot resolve — redirect to an absolute path inside the working rootsliveDeny cause of cd combined with a redirect the gate cannot resolve.
cause_compoundstringcompound command with state-changing or unrecognized partsliveDeny cause of a compound command with state-changing or unrecognized parts.
cause_critical_removestringrm/rmdir on a critical path (/, a top-level directory, $HOME, the working directory or one of its parents)liveDeny cause of rm or rmdir on a critical path.
cause_denied_toolstringtool is denied by policyliveDeny cause of a tool listed in denied_tools.
cause_engine_protectedstringengine-protected path (VCS, editor, shell, package-manager or agent config) — Claude Code never auto-approves writes there; edit it by handliveDeny cause of a write to an engine-protected path.
cause_fence_constructstringshell construct the path fence cannot follow (function, eval, coprocess, popd, cd -, assigning HOME/PWD/OLDPWD/CDPATH)liveDeny cause of a shell construct the path fence cannot follow.
cause_fence_unparseablestringcommand does not parse — the path fence cannot check itliveDeny cause of a command the path fence cannot parse.
cause_fencedstringpath is outside this session's scopeliveDeny cause of a path inside the read fence.
cause_find_execstringfind with an exec or write flag (-exec/-execdir/-ok/-okdir/-delete/-fprint*) runs or deletes past every checkliveDeny cause of find with an exec or write flag.
cause_freeze_budgetstringno freeze left in this session — a session freezes one plan per /fdesign prompt the user typed, an unattended design run one planliveDeny cause of a freeze beyond the session's design prompts.
cause_freeze_reopenstringthis plan's rules are frozen — they change only in a design run the user starts by typing /fdesign with the plan's file nameliveDeny cause of a refreeze of a frozen plan outside its design run.
cause_freeze_targetstringtoolpolicy freeze takes one wip plan dir of this worktree: plans/<feature folder>/<plan dir>liveDeny cause of a freeze target that is no wip plan dir.
cause_git_dirstringgit dir: hooks and config under .git run code on the next git command — change them through git itself, never by writing the filesliveDeny cause of a write under a .git dir.
cause_git_environmentstringGIT_* environment on a git call (GIT_INDEX_FILE excepted) — git reads config, pager, diff driver, git dir and exec path from it: drop the assignmentliveDeny cause of a GIT_* assignment on a git call.
cause_git_execstringgit 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 thisliveDeny cause of a git subcommand or option that runs a command.
cause_git_global_optionstringgit 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 executablesliveDeny cause of a git global option outside git_admitted_flags.
cause_git_same_repostringgit -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 worktreeliveDeny cause of git -C onto another checkout of the session's repository.
cause_go_program_flagstringgo flag that runs another program (-exec, -toolexec, -vettool), or a word the gate cannot resolve statically — run the plain go commandliveDeny cause of a go flag that runs another program.
cause_make_argsstringmake 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 lineliveDeny cause of a make call that loads code or sets an undeclared variable.
cause_no_allow_rulestringno allow rule matchesliveDeny cause of a call no allow rule matches; toolpolicy check names a candidate rule only for it.
cause_operator_commandstringoperator entry point — it deploys from the checkout it runs in, so it runs only from the main checkout: the user runs itliveDeny cause of an operator entry point run from a linked worktree.
cause_pane_loginstringURL 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)liveDeny cause of a Browser pane URL carrying sign-in credentials.
cause_proc_subststringprocess substitution <(…) or >(…) — write a file under the scratchpad insteadliveDeny cause of a process substitution.
cause_protected_pathstringprotected path: a settings layer, a gate input (hooks, skills, agents, tool-policy state) or the session transcriptliveDeny cause of a write to a protected path.
cause_read_outsidestringread outside the working directoriesliveDeny cause of a read outside the session's read roots.
cause_rules_filestringpermissions.json is written only by a design run that may still freeze its planliveDeny cause of a write to a plan's rules file outside a freezable design run; the freeze cause follows it.
cause_sed_script_writestringsed script with a w command — write files with the Edit tool or a redirectliveDeny cause of a sed script with a w command.
cause_settings_interactivestringsettings.local.json self-service runs only in a session a human prompted — headless and scheduled sessions never change the permission layerliveDeny cause of toolpolicy allow in a session no human prompted.
cause_settings_revokedstringsettings.local.json self-service revoked — the user's last message for it is #deny settings.local.jsonliveDeny cause of toolpolicy allow after the user's #deny settings.local.json.
cause_settings_uncoveredstringsettings.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: liveDeny cause of toolpolicy allow rules no human act covers; the uncovered rules follow it.
cause_settings_usagestringusage: 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 redirectsliveUsage text of a malformed toolpolicy command.
cause_settings_via_commandstringsettings.local.json is written only by the gate — add rules with: toolpolicy allow '<rule>' …liveDeny cause of a direct write to settings.local.json.
cause_state_unavailablestringtool-policy state unavailable: liveLead of the deny cause when the session state cannot be read; the error follows it.
cause_tilde_userstring~user path — name the absolute path insteadliveDeny cause of a ~user path.
cause_tmp_writestringwrite under /tmp outside the session scratchpad — write under the scratchpad directory insteadliveDeny cause of a write under a temp dir outside the session scratchpad.
cause_unknown_toolstringunknown toolliveDeny cause of a tool in no tool class.
cause_unparseable_compoundstringunparseable compound commandliveDeny cause of a command that does not parse and carries a separator.
cause_unresolvable_headstringcommand name the gate cannot resolve staticallyliveDeny cause of a command name the gate cannot resolve.
cause_unresolvable_pathstringpath argument the gate cannot resolve statically ($VAR from the environment, $(…) output, or a relative path after an uncertain cd)liveDeny cause of a path argument the gate cannot resolve.
cause_workflow_markerstringinline script carries the SMINE-PRIMER marker but is not the primer — only the primer may carry itliveDeny cause of an inline Workflow script carrying the primer marker without being the primer.
cause_workflow_relaystringlaunch outside a turn a task notification opened — the harness hands the newest typed message to every agent of the launchliveDeny cause of a Workflow launch outside a turn a task notification opened.
cause_worktree_outsidestringEnterWorktree path outside this repository's .claude/worktrees — enter a worktree of the session's own repositoryliveDeny cause of an EnterWorktree path outside the repository's worktrees dir.
cause_write_outsidestringwrite outside the working directoriesliveDeny cause of a write outside the session's write roots.
cause_xargs_writestringxargs feeding a command that is not read-only — its arguments come from stdin and cannot be path-checkedliveDeny cause of xargs feeding a command that is not read-only.
reason_accept_editsstringacceptEdits file command, paths checked by the fence (bash-policy)liveAllow reason of a file command in acceptEdits or auto mode.
reason_active_skillstringactive skill liveLead of the allow reason of a Skill call to an active skill; the skill follows it.
reason_path_flagstringflagged file command with safe flags inside the write roots (bash-policy)liveAllow reason of a file command with safe flags inside the write roots.
reason_pipelinestringtwo-segment pipeline of allowed commands (bash-policy)liveAllow reason of a pipe whose two sides are allowed.
reason_prompt_skillstringskill the user's newest message names: /liveLead of the allow reason of a Skill call the user's newest message names; the skill follows it.
reason_read_onlystringread-only command batch (bash-policy)liveAllow reason of a read-only command batch.
reason_rootsstringinside the session's working rootsliveAllow reason of a path inside the session's roots.
reason_sed_writestringin-place sed, files checked by the fence (bash-policy)liveAllow reason of an in-place sed whose files the fence checked.
reason_settings_rulestringsettings rule liveLead of the allow reason of a settings allow rule; the rule follows it.
reason_skill_grantstringskill grant liveLead of the allow reason of a skill's allowed-tools rule; the rule follows it.
reason_system_readstringsystem path, read-onlyliveAllow reason of a read under a system path.
reason_ungatedstringungated toolliveAllow reason of a tool listed in ungated_tools.
steer_bashstringCompound 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.liveSteering text every Bash deny appends.
steer_denystringNothing 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.liveSteering text every deny appends after the candidate rule.
steer_findstringBash(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.liveSteering text of a find exec or write deny.
steer_relaystringNo 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:\nliveRelay steps of a Workflow relay deny; the primer script follows them.
invoke_entry_chaptersstrings["actions","facts","rules"]liveContext chapters whose entries reach a session only through a skill invocation.
invoke_shell_meta_charsstring;|&<>$`'"()liveCharacters that make a Bash read of an entry non-literal.
invoke_deny_textsstrings["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).","skill-invoke-gate: invoke the Skill tool with skill=%q before any other tool call — your review context arrives via that invocation."]liveThe two deny texts of the skill-invoke gate: a direct entry read, a call before the required invocation.
groups.gate-directoryadded-toolpolicy.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-directoryadded-toolpolicy.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-directoryadded-toolpolicy.asyncboolfalseliveRun the hook without waiting for its answer.
groups.gate-permissionrequest-toolpolicy.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-permissionrequest-toolpolicy.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-permissionrequest-toolpolicy.asyncboolfalseliveRun the hook without waiting for its answer.
groups.gate-posttooluse-toolpolicy.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-posttooluse-toolpolicy.matcherregexSkillliveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-posttooluse-toolpolicy.asyncboolfalseliveRun the hook without waiting for its answer.
groups.gate-pretooluse-toolpolicy.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-pretooluse-toolpolicy.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-pretooluse-toolpolicy.asyncboolfalseliveRun the hook without waiting for its answer.
groups.gate-pretooluse-skillinvokegate.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-pretooluse-skillinvokegate.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-pretooluse-skillinvokegate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.gate-userpromptsubmit-toolpolicy.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.gate-userpromptsubmit-toolpolicy.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.gate-userpromptsubmit-toolpolicy.asyncboolfalseliveRun the hook without waiting for its answer.

Session worktrees

Component worktrees.

KeyKindDefaultAppliesHelp
branch_prefixstringclaude/livePrefix of every session branch the worktree hook creates.
worktrees_dirstring.claude/worktreesliveRepo-relative directory the session worktrees live in.
reset_attemptsint5liveAttempts of the branch reset when git reports index.lock.
reset_retry_delayduration200msliveBase delay between reset attempts; attempt n waits n times this.
acdsl_build_timeoutduration12sliveDeadline of the acdsl build after a base move; it stays under the hook's own timeout.
short_sha_lengthint7liveHex digits of the short sha a worktree name ends in.
default_branch_fallbackstrings["main","master"]liveDefault-branch names tried when origin/HEAD is unset.
name_patternregex^[A-Za-z0-9][A-Za-z0-9._-]*$livePattern a requested worktree name must match.
pool_segmentstring/.claude/worktrees/livePath segment that marks a session worktree for the write guard and the protected-root check.
guard_deny_textsstrings["session is worktree-anchored: writes go under %s — refusing write into the main checkout or a sibling worktree: %s","path contains ../ segments — write with a normalized absolute path (session worktree: %s)","path is inside a protected checkout (%s) — routine cells write only inside their own worktree"]liveThe three deny texts of the write guard: outside the worktree, a parent segment, a protected checkout.
groups.worktrees-pretooluse-worktreewriteguard.timeoutint10liveSeconds Claude Code waits for the hook before it gives up.
groups.worktrees-pretooluse-worktreewriteguard.matcherregexWrite|Edit|NotebookEditliveTool-name pattern the group fires on; empty fires on every tool.
groups.worktrees-pretooluse-worktreewriteguard.asyncboolfalseliveRun the hook without waiting for its answer.
groups.worktrees-sessionstart-worktreecreate.timeoutint15liveSeconds Claude Code waits for the hook before it gives up.
groups.worktrees-sessionstart-worktreecreate.matcherregexstartupliveTool-name pattern the group fires on; empty fires on every tool.
groups.worktrees-sessionstart-worktreecreate.asyncboolfalseliveRun the hook without waiting for its answer.
groups.worktrees-worktreecreate-worktreecreate.timeoutint60liveSeconds Claude Code waits for the hook before it gives up.
groups.worktrees-worktreecreate-worktreecreate.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.worktrees-worktreecreate-worktreecreate.asyncboolfalseliveRun the hook without waiting for its answer.

Session helpers

Component session-helpers.

KeyKindDefaultAppliesHelp
max_title_runesint62liveRunes a session title may hold.
max_statesint8liveTitle states one skill may declare.
max_token_runesint16liveRunes one title state token may hold.
title_instruction_plan_modestring This call is allowed in plan mode: it changes only this session's sidebar title, nothing in the repository or the system.liveSentence the rename instruction adds in plan mode.
title_instruction_tailstring 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.liveClosing sentences of the rename instruction.
title_rename_allow_reasonstringsessiontitle: hook-instructed rename of this sessionliveAllow reason of the hook-instructed rename call.
title_trigger_patternsstrings["(^|[;\u0026|\\s])(\\S*/)?smine-agentwt\\s+remove\\s+--dry-run(\\s|$)","(^|[;\u0026|\\s])(\\S*/)?smine-heartbeat\\s+done(\\s|$)","(^|[;\u0026|\\s])(\\S*/)?smine-heartbeat\\s+join(\\s|$)","(^|[;\u0026|\\s])(\\S*/)?smine-heartbeat\\s+subscribe(\\s|$)","--fleet[= ]([A-Za-z0-9-]+)","^[A-Za-z0-9-]+-M[A-Z]+$","(^|[;\u0026|\\s])(\\S+)\\s+title\\s+set\\s+([A-Z][A-Z-]*)(\\s|$)"]liveCommand patterns the title hook watches for: close check, done, join, subscribe, the fleet flag, the member token, title set.
help_patternregex^\s*/([A-Za-z0-9_-]+)[ \t]+(?:-{1,2}|—|–)(?:help|h)[ \t]*(?:\r?\n|$)livePrompt pattern that marks a /<skill> --help prompt.
help_features_leadstringWhat each switch keeps on. `#disable <group>` turns every member of a group off, `<group>:a,b` names members, `all` names everything; `heartbeat` spells `hb`.liveLead line above the feature catalog of a help answer.
notification_soundstring/System/Library/Sounds/Funk.aiff; Windows C:/Windows/Media/notify.wav; Linux emptyliveSound file played on a notification (afplay on macOS, PlaySound on Windows; forward slashes, the path lands in a bash hook command).
stop_soundstring/System/Library/Sounds/Hero.aiff; Windows C:/Windows/Media/ding.wav; Linux emptyliveSound 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.timeoutint0liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-notification-play-sound.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-notification-play-sound.asyncbooltrueliveRun the hook without waiting for its answer.
groups.session-helpers-posttooluse-sessiontitle.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-posttooluse-sessiontitle.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-posttooluse-sessiontitle.asyncboolfalseliveRun the hook without waiting for its answer.
groups.session-helpers-pretooluse-sessiontitle.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-pretooluse-sessiontitle.matcherregexmcp__ccd_session_mgmt__set_session_titleliveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-pretooluse-sessiontitle.asyncboolfalseliveRun the hook without waiting for its answer.
groups.session-helpers-sessionstart-sessiontitle.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-sessionstart-sessiontitle.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-sessionstart-sessiontitle.asyncboolfalseliveRun the hook without waiting for its answer.
groups.session-helpers-stop-play-sound.timeoutint0liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-stop-play-sound.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-stop-play-sound.asyncbooltrueliveRun the hook without waiting for its answer.
groups.session-helpers-stop-sessiontitle.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-stop-sessiontitle.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-stop-sessiontitle.asyncboolfalseliveRun the hook without waiting for its answer.
groups.session-helpers-userpromptsubmit-skillhelp.timeoutint5liveSeconds Claude Code waits for the hook before it gives up.
groups.session-helpers-userpromptsubmit-skillhelp.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.session-helpers-userpromptsubmit-skillhelp.asyncboolfalseliveRun the hook without waiting for its answer.

peek

Component peek.

KeyKindDefaultAppliesHelp
portint4242restartPort of the central peek MCP server; heartbeat's peek address follows it.
control_portint42442restartPort of peek's control endpoint.
claude_homestring""restartClaude home peek reads sessions from; empty takes ~/.claude.
codex_homestring""restartCodex home peek reads sessions from; empty takes ~/.codex.

heartbeat

Component heartbeat.

KeyKindDefaultAppliesHelp
portint6101restartPort the heartbeat daemon listens on; its hook URLs and the plist follow it.
peek_retryduration30srestartWait before a degraded peek round is repeated.
staging_targetstring""restartLanding target the done skill catches up; empty means no staging target, and /done branch: refuses naming this setting.
workersint2restartWorker threads of the daemon.
shutdown_timeoutduration500msrestartGrace the daemon gives its threads at shutdown.
inbox_capacityint16384restartEvents the engine inbox holds before senders wait.
exempt_pathsglobs[]livePath patterns two fleet members may both change without a collision.
version_keysstrings["version"]liveJSON keys whose change alone is no collision.
forbidden_subagent_modelsmodels[]liveModel patterns a subagent may not run on; the heart attack stops one that does.
collision_prefixesstrings["claude/"]liveBranch prefixes whose branches the collision check compares.
runtime_stop_reasonstringheartbeat runtime stop ({finding}): {skill} {check} — {reason}. Stopped by the runtime agent.liveStop text of a runtime finding: {finding}, {skill}, {version}, {check}, {reason}, {evidence}.
kill_atint8liveFailures of one check after which the run is killed.
kill_reasonstringheartbeat enforce: run {id} of {skill} killed — {check} failed {kill_at} times: {reason}. Stopped until the next prompt.liveStop text of a killed run: {id}, {skill}, {check}, {kill_at}, {reason}.
max_ended_runsint64liveEnded runs the runtime keeps listed.
runtime_digest_linesint50liveLines of a runtime digest.
guarded_toolsstrings["SendMessage","mcp__ccd_session_mgmt__send_message","mcp__ccd_session_mgmt__stop_session"]liveTools a runtime subscriber may not call.
subscriber_deny_reasonstringheartbeat runtime: the runtime subscriber acts only through `smine-heartbeat runtime send|stop`; {tool} is denied while subscribed.liveDeny text of a guarded tool while subscribed: {tool}.
max_fieldint256restartCharacters a free-text field keeps.
digest_linesint50liveLines of a fleet digest.
digest_line_pathsint8livePaths one digest line names.
max_terminalint1000liveTerminal sessions the fleet keeps listed.
merge_branch_prefixstringclaude-orch/livePrefix of the orchestrator's merge branches.
worker_branch_prefixstringclaude/restartPrefix of the worker branches the hook edge maps to their sessions.
waiting_toolsstrings["AskUserQuestion","ExitPlanMode"]liveTools whose call marks a session as waiting on its human.
waiting_notificationsstrings["permission_prompt","elicitation_dialog","elicitation_url_dialog","agent_needs_input"]liveNotification types that mark a session as waiting on its human.
ledger_secondduration1sliveWindow within which a denial ledger line matches a hook event.
max_refused_unknownint32liveUnknown sessions whose refusal the engine remembers.
attack_deny_reasonstringheartbeat: {model} is a forbidden subagent model; spawn the subagent with an allowed model.liveDeny text of a spawn on a forbidden model: {model}.
attack_stop_reasonstringheartbeat heart attack: this subagent runs on {model}, a forbidden subagent model.liveStop text of a subagent running on a forbidden model: {model}.
attack_inherited_reasonstringheartbeat: this subagent was spawned without a model and inherits the session's {model}; every spawn names its model.liveStop text of a subagent spawned without a model: {model}.
attack_substituted_reasonstringheartbeat: this subagent was spawned with model {requested} but runs on {model} — the harness substituted the session model for a token it cannot run.liveStop text of a subagent whose model the harness substituted: {requested}, {model}.
member_deny_reasonstringheartbeat: {token} is a fleet member — commit, then run /done; the orchestrator reads heartbeat status, members never message it.liveDeny text of a fleet member messaging the orchestrator: {token}.
member_role_textstringheartbeat: 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.liveRole context a fleet member receives on every prompt: {token}, {fleet}.
max_id_lenint62restartCharacters a fleet or member id may hold.
hook_max_bodyint67108864restartBytes one hook request body may hold.
hook_max_subjectint256restartCharacters of a hook event's subject the edge keeps.
hook_max_detailint2048restartCharacters of a hook event's detail the edge keeps.
claim_pollduration10msrestartInterval at which the hook edge polls for a claimed answer.
claim_pollsint200restartPolls the hook edge makes before it answers without a claim.
client_timeoutduration5srestartDeadline of one CLI call against the daemon.
peek_healthz_timeoutduration5srestartDeadline of the peek identity probe.
peek_call_timeoutduration10srestartDeadline of one peek MCP call.
socket_write_timeoutduration5srestartDeadline of one socket write to a subscriber.
scan_settleduration250msrestartQuiet time the worktree edge waits before it rescans.
ledger_tail_windowint1048576restartBytes of the denial ledger the ledger edge reads from its end.
transcript_max_linesint64restartTranscript lines the transcript edge reads per wake.
exits_batchint64restartProcess exits the exits edge batches into one event.
exits_pollduration1srestartInterval of the polling process-exit watch off macOS (macOS watches through kqueue).
number_of_filesint16384restartOpen-file limit the LaunchAgent grants the daemon.
groups.heartbeat-notification.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-notification.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-notification.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-permissionrequest.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-permissionrequest.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-permissionrequest.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-posttooluse.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-posttooluse.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-posttooluse.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-posttoolusefailure.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-posttoolusefailure.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-posttoolusefailure.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-pretooluse.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-pretooluse.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-pretooluse.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-sessionend.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-sessionend.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-sessionend.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-sessionstart.timeoutint2liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-sessionstart.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-sessionstart.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-stop.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-stop.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-stop.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-stopfailure.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-stopfailure.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-stopfailure.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-subagentstart.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-subagentstart.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-subagentstart.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-subagentstop.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-subagentstop.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-subagentstop.asyncboolfalseliveRun the hook without waiting for its answer.
groups.heartbeat-userpromptsubmit.timeoutint1liveSeconds Claude Code waits for the hook before it gives up.
groups.heartbeat-userpromptsubmit.matcherregex""liveTool-name pattern the group fires on; empty fires on every tool.
groups.heartbeat-userpromptsubmit.asyncboolfalseliveRun the hook without waiting for its answer.

Routines

Component routines.

KeyKindDefaultAppliesHelp
count_tokensenumoffrestartHow 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.