Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add rules/golid-ai/golid/go-service-errorsgit clone --depth 1 https://github.com/golid-ai/golidWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/golid-ai/golid/go-service-errors)<a href="https://agentmods.dev/rules/golid-ai/golid/go-service-errors"><img src="https://agentmods.dev/badge/rules/golid-ai/golid/go-service-errors.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.00995 |
| Opus 5 | $0.00000 | $0.00498 |
| Sonnet 5 | $0.00000 | $0.00199 |
| Haiku 4.5 | $0.00000 | $0.00100 |
Grade A, and why
go-service-errors scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 100 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Go Service — Errors, History, and Side Effects
Thesis: Constraint violations and scan mistakes are expected failure modes — translate them to
apperror, never swallow them as 500s or silent drops.Refrain:
Check → Translate → Log
Reference files: auth/auth.go, feature/feature.go
Error Handling
- Always check
pgx.ErrNoRowsexplicitly — returnapperror.NotFoundfor missing entities. - Check real DB errors before ErrNoRows:
if err != nil && err != pgx.ErrNoRows { return 500 }. - Never
_ = pool.Exec(...)— log failures withlogger.Error. - Pass bare resource nouns to
apperror.NotFound("User")— not"User not found"(double-suffix).
PostgreSQL Error Translation Checklist
When a service method writes to a table with a UNIQUE, CHECK, or FOREIGN KEY constraint, the corresponding pgconn.PgError SQLSTATE must be translated to an apperror. A bare 500 from a PG constraint violation is always a bug — the constraint exists because the situation is expected.
| SQLSTATE | Meaning | Translate to |
|---|---|---|
23505 |
unique_violation | apperror.Conflict("...") |
23503 |
foreign_key_violation | apperror.BadRequest (parent missing) or apperror.Conflict (child blocking delete) |
23514 |
check_violation | apperror.BadRequest with the constraint name |
23502 |
not_null_violation | apperror.BadRequest (input was missing) or apperror.Internal (code bug) |
Standard pattern (always use errors.As, never type assertion — the error may be wrapped):
var pgErr *pgconn.PgError
if errors.As(err, &pgErr) && pgErr.Code == "23505" {
return apperror.Conflict("...")
}
return apperror.Internal(fmt.Errorf("...: %w", err))
When the same translation appears in two or more methods, extract a helper like translateUniqueConflict(err, resource) and unit-test it directly with synthetic *pgconn.PgError values. The TOCTOU race that triggers 23505 isn't deterministic from an integration test, but a unit test of the helper pins the contract.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 100 lines · 0 tokens per session scan A 783e26be57f2
go-service-errors is a cursor rule published in the GitHub repository golid-ai/golid (40 stars, last pushed 2mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 995 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other cursor rules, from other repositories
agentic-loop
Follow this loop on every development task in this repository. For full conventions, architecture, and examples, see @.github/copilot-instructions.md (source of truth). This rule distills the workflow; do not duplicate that document.
adapter-features
Database-specific features must be implemented in the specialized adapter only. Base adapters (postgres, mysql, etc.) must remain database-agnostic.
git-commits
Git commit safety — commits are human-only; AI suggests, never executes.
unit-tests-tdd
TDD required for behavior changes; ≥80% package coverage on touched packages; unit-test conventions.
adapter-unit-tests
Postgres adapter unit tests are sqlmock-only; no real DB or sqlx.Connect.
studio-build
After Studio changes, regenerate embedded assets with make studio-build and keep dist in the diff.