Skip documentation navigation

Configuration

dictionary

features.dictionary.entries lists terms to flag. Each entry fires in the same hooks, with the same confirm flow, as the other style checks.

{
  "features": {
    "dictionary": {
      "entries": [
        { "id": "blacklist", "match": "startsWith", "value": "blacklist", "fix": "denylist" },
        { "id": "hope-helps", "match": "endsWith", "on": "line", "value": "Hope this helps!", "fix": "end on the last fact", "hooks": ["stop", "subagentStop"] },
        { "id": "ticket", "match": "regex", "value": "\\bJIRA-\\d+\\b", "fix": "link the ticket", "scopes": ["commit", "gh"] }
      ]
    }
  }
}
FieldRequiredValues
idyesLowercase letters, digits, and hyphens. The deny tag is [concise:dictionary:<id>].
matchyesexact, contains, startsWith, endsWith, or regex.
valueyesThe term, the phrase, or the regular expression.
fixyesWhat to write instead. The deny shows it.
onnoword (default), line, or text. regex ignores it.
caseSensitivenofalse by default.
flagsnoRegex flags for regex entries. Default i. The scanner adds g and d and drops y.
hooksnoedit, bash, stop, subagentStop. Absent means all 4.
scopesnofiles, comments, code, gh, commit, command, reply. Absent means every scope except command and code.
enablednofalse switches the entry off. A switched-off entry needs only its id.

How on changes the match:

  • word: exact matches the whole word or phrase. startsWith, endsWith, and contains match inside a word and report the whole word. A word edge is any character other than a letter, a digit, or _, so C++ and #tag work as values.
  • line: the value is compared with each line, with leading and trailing spaces ignored. In a code comment, the comment marker is ignored as well.
  • text: the value is compared with the whole scanned span: a prose file, one comment run, a commit message, a gh body, or a reply.

For regex, a named group (?<hit>...) sets the part the deny quotes.

The hooks map to the text they scan: edit covers file writes, edits, and patches; bash covers git commit messages and gh bodies; stop covers the final reply; subagentStop covers subagent replies and SubagentHandback reports. concise-ignore, concise-ignore-file, allowList, bypass, ignoreGlobs, and styleIgnoreGlobs apply to dictionary findings. features.aiWriting.allow does not.

An entry that does not validate is skipped, and the hook reports it once per session. The settings console and concise-config refuse to save it. The feature id for BEC_FEATURE_* is dictionary.