Skip to content

Feedback format

Every blocking message follows one template so Claude can parse it the same way every time.

guardrails: go gate failed (2 of 6 checks)

[coverage] 84.2% < 90.0% (touched: ./internal/sched, ./internal/api)
  internal/sched/queue.go:41  (*Queue).Drain  0/14 stmts
  internal/api/handler.go:88  decodeRequest  3/11 stmts
  fix: add table-driven tests for the functions above

[lint] 2 issues
  internal/api/handler.go:102:5  errcheck  Error return value of `w.Write` is not checked
  internal/sched/queue.go:17:1  revive  exported type Queue should have comment
  fix: fix each issue; suppression comments are not allowed

attempt 1 of 3 — run `guardrails gate --explain` for full output

Rules

Order. The failing check's name in brackets with a one-line summary, then file:line:col rule message per issue, then one fix: hint for the group.

Caps. At most 10 issues per check and 4,000 characters in total. The rest is written to a report file in the session directory and the message ends with a pointer to it. guardrails gate --explain runs the gate and prints the full report.

Dedup. Per-edit issues already reported this session are summarized as a count ((3 previously reported, unchanged)) instead of repeated.

Channels.

Channel Used for
decision: "block" + reason PostToolUse and Stop failures Claude must fix
permissionDecision + reason PreToolUse guards
additionalContext The standards summary at SessionStart
systemMessage Things only you need: missing tools, config errors, retries exhausted, warn-mode reports

Tone. Factual statements, no imperative "SYSTEM:" framing, which can trip prompt-injection defenses.