Skip documentation navigation

Configuration

log

"log": { "enabled": true }, or BEC_LOG_ENABLED=1, writes one record per hook invocation. The default path is ~/.cache/concise/concise.log, with os.tmpdir()/concise/concise.log as the fallback when the home directory cannot be written. A log.path whose directory cannot be created turns logging off.

Fields per record: ts, hook, event, tool, session, cwd, key, scope, decision (allow, flag, deny, ask, block, bypass, or error), mode, softFail, findings (category, match, and line, capped at 20), counts, durationMs, and error. A field with no value is null.

One record from a denied em dash write:

{"ts":"2026-09-04T04:03:23.197Z","hook":"check-edit","event":"PreToolUse","tool":"Write","session":"doc-6","cwd":"/tmp/demo","key":"style:/tmp/demo/notes.md","scope":"files","decision":"deny","mode":"confirm","softFail":false,"findings":[{"category":"emDash","match":"parser runs first — then it rejects th","line":1}],"counts":{"emDash":1,"aiWriting":0},"durationMs":12,"error":null}

Format json writes one JSON object per line. Format plaintext writes ts hook tool decision key summary, with - for an empty cell. Rotation size renames the file to .1 through .<maxFiles> once it passes maxSize and drops the oldest. Rotation daily writes concise.YYYY-MM-DD.log beside the configured path and keeps maxFiles of them. Rotation both does both. A write failure is swallowed and the hook still answers.