Originally created by: fu351
ReasonCode (src/doberman/models.py, class ReasonCode(StrEnum) at line 204) is Doberman's explainability contract: every non-PASS decision carries reason codes plus a human explanation. There are 51 codes today and no single page lists them. Add docs/REASON_CODES.md: a table with one row per ReasonCode value — code, the module that raises it, and what it means to a user.
Reading + transcription across a few files, no code changes, but accuracy matters — this is part of Doberman's explainability contract, so double-check each code against where it's actually raised (grep -rn "ReasonCode\.<name>" src/doberman) rather than guessing from the name alone.
src/doberman/models.py — class ReasonCode(StrEnum) (line 204) is the full enum, grouped by feature in comments (objective guardrail, roles/policy, subjective guardrail, token-channel defense, host-hook containment, turn gate, egress broker reconciliation).src/doberman/engine/rules/ and src/doberman/engine/detectors/ — where most objective/subjective codes are raised.docs/REASON_CODES.md.ReasonCode member has exactly one row.ruff check . && ruff format --check . and lint-imports passpytest passespython -c "from doberman.models import ReasonCode; print(len(list(ReasonCode)))"
# confirm this number (51 as of v0.16.0) matches the row count in docs/REASON_CODES.md
New here? Start with CONTRIBUTING.md. Issues are labelled level-1 (docs only) through level-10 (new subsystem) — pick one at your level and climb. Comment to claim an issue before starting.
Ticket changed by: fu351