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"] }
]
}
}
}
| Field | Required | Values |
|---|---|---|
id | yes | Lowercase letters, digits, and hyphens. The deny tag is [concise:dictionary:<id>]. |
match | yes | exact, contains, startsWith, endsWith, or regex. |
value | yes | The term, the phrase, or the regular expression. |
fix | yes | What to write instead. The deny shows it. |
on | no | word (default), line, or text. regex ignores it. |
caseSensitive | no | false by default. |
flags | no | Regex flags for regex entries. Default i. The scanner adds g and d and drops y. |
hooks | no | edit, bash, stop, subagentStop. Absent means all 4. |
scopes | no | files, comments, code, gh, commit, command, reply. Absent means every scope except command and code. |
enabled | no | false switches the entry off. A switched-off entry needs only its id. |
How on changes the match:
word:exactmatches the whole word or phrase.startsWith,endsWith, andcontainsmatch inside a word and report the whole word. A word edge is any character other than a letter, a digit, or_, soC++and#tagwork 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, aghbody, 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.