Go Development Guide
Production-ready patterns extracted from real projects.
Table of Contents
Core Principle: LESS CODE = FEWER BUGS
This applies to ALL code — not just project scaffolding.
What this means:
❌ Don't write error types that won't be used
❌ Don't create custom error type for every error case
❌ Don't add methods "for completeness"
❌ Don't create helper functions that have one caller
❌ Don't add validation for impossible scenarios
❌ Don't implement interfaces "just in case"
❌ Don't add logging/metrics that nobody reads
❌ Don't create common, helpers, utils, shared, misc packages
✅ Write only what the feature requires
✅ Use few sentinel categories (ErrNotFound, ErrConflict) + wrap with context
✅ Typed errors only when caller needs to extract data (RetryAfter, Field)
✅ Add code when there's actual need
✅ Delete unused code immediately
✅ Prefer inline code over tiny functions
✅ Trust the type system, don't over-validate
✅ Name packages by what they provide, not what's in them
✅ Keep helper functions close to usage (unexported)
✅ If truly shared, create small purpose-named packages (internal/optional/)
❌ Don't modify .golangci.yml — linting config is protected
Examples:
| Bad |
Good |
| Define 10 error types, use 2 |
Define errors as you need them |
Create GetByID, GetByEmail, GetByName upfront |
Create only the method you're using now |
Add Update, Delete when only Create is needed |
Add Update when the feature requires it |
Write helper formatUserName() called once |
Inline the logic |
| Validate internal struct fields |
Trust internal code, validate at boundaries |
Architecture Decisions
| Aspect |
Choice |
| Config |
caarlos0/env (env only) |
| Structure |
cmd/, internal/, pkg/ |
| Database |
pgx/v5 + squirrel |
| Transactions |
Context injection + retry |
| DI |
Service Registry |
| Errors |
Sentinel categories + wrap (errs package) |
| Logging |
slog (small) / zap (large) — ask user |
| Tracing |
OpenTelemetry (optional) — ask user |
| Migrations |
goose/v3 |
Linter Enforcement
All rules are enforced via golangci-lint (revive rules) in .golangci.yml:
| Rule |
Linter |
Description |
userID not userId |
var-naming |
Go idiom: acronyms in caps |
any not interface{} |
use-any |
Go 1.18+ alias |
No common/helpers/utils packages |
var-naming |
extraBadPackageNames |
| Error wrapping |
err113, errorlint |
Sentinel errors + wrap |
| Test helpers |
thelper |
Must use t.Helper() |
| Test parallelism |
tparallel |
Suggests t.Parallel() |
| Test env vars |
tenv |
Detects os.Setenv in tests |
Required Validation
After generating/modifying Go code:
golangci-lint run ./...
Do not modify .golangci.yml — linting config is protected by golangci-guard hook.
Enforced Project Structure
The skill MUST enforce this structure for all Go projects:
project/
├── cmd/
│ └── app/
│ └── main.go # Entry point only
├── internal/
│ ├── config/
│ │ └── config.go # Config with envPrefix
│ ├── errs/
│ │ └── errors.go # Sentinel errors + helpers
│ ├── optional/
│ │ └── optional.go # Pointer conversion helpers
│ ├── models/
│ │ └── {entity}.go # Domain models + mappers
│ ├── services/
│ │ ├── registry.go # Service registry
│ │ └── {entity}.go # Business logic
│ ├── storage/
│ │ ├── storage.go # Storage interface
│ │ ├── {entity}.go # Repository impl
│ │ ├── main_test.go # TestMain with testcontainers
│ │ └── testmigration/ # Test data fixtures (SQL)
│ │ ├── 100001_users.up.sql
│ │ └── 100001_users.down.sql
│ └── http/
│ └── v1/
│ ├── router.go # Router + path constants
│ ├── {entity}_handler.go
│ ├── dto.go # Request/Response types
│ └── json.go # encode/decode
├── pkg/
│ ├── logger/
│ └── postgres/
├── migrations/
├── go.mod
├── .env.example
├── Makefile
├── Dockerfile
└── docker-compose.yml
Structure Rules
| Rule |
Correct |
Wrong |
| Handler files |
user_handler.go, order_handler.go |
handlers.go (all in one) |
| Mappers |
In models/{entity}.go with model |
In separate mappers/ package |
| DTOs |
In http/v1/dto.go |
Mixed with domain models |
| Path constants |
In router.go |
Hardcoded strings in handlers |
| IDs |
string type |
uuid.UUID type |
| ID generation |
uuid.NewString() in service |
In handler or repository |
| Config nesting |
Use envPrefix tag |
Full env var names in nested structs |
| Doc comments |
// User represents... |
// This struct... |
| Section organization |
Separate files |
// ----- Section ----- |
References
Core Patterns
| Pattern |
File |
| Entry Point |
entrypoint-pattern.md |
| Configuration |
config-pattern.md |
| Package Structure |
package-structure-decision.md |
| Database & Transactions |
database-pattern.md |
| Advisory Locks |
advisory-lock-pattern.md |
| Service Layer |
service-pattern.md |
| Repository |
repository-pattern.md |
| Filter Pattern |
filter-pattern.md |
| Mapper |
mapper-pattern.md |
| JSONB Types |
jsonb-pattern.md |
| Optional Helper |
optional-pattern.md |
| Error Handling |
error-handling.md |
| Logging |
logging-pattern.md |
| Testing |
testing-pattern.md |
| Test Fixtures |
test-fixtures-pattern.md |
| Money |
money-pattern.md |
| Build & Deploy |
build-deploy.md |
HTTP Layer
| Pattern |
File |
| HTTP Handlers |
http-handler-pattern.md |
| Middleware |
middleware-pattern.md |
| Validation |
validation-pattern.md |
| Authentication |
auth-pattern.md |
Production Patterns
| Pattern |
File |
| Pagination |
pagination-pattern.md |
| Health Checks |
health-check-pattern.md |
| Background Workers |
worker-pattern.md |
| Tracing |
tracing-pattern.md |
Best Practices
| Topic |
File |
| Naming Conventions |
naming-conventions.md |
| Package Naming |
package-naming.md |
| Control Structures |
control-structures.md |
| Interface Design |
interface-design.md |
| Allocation (new/make) |
allocation-patterns.md |
| Defer |
defer-patterns.md |
| Embedding |
embedding-patterns.md |
| Blank Identifier |
blank-identifier.md |
| Concurrency |
concurrency-pattern.md |
| Channel Axioms |
channel-axioms.md |
| Linting |
linting-pattern.md |
| Common Pitfalls |
common-pitfalls.md |
| Performance |
performance-tips.md |
| Code Quality |
code-quality.md |
Examples
Core
| Component |
File |
| Main |
main.go |
| Backend |
backend.go |
| Config |
config.go |
| Filter |
filter.go |
| Common Models |
common_models.go |
| Common Storage |
common_storage.go |
| Database Client |
pg-client.go |
| Advisory Lock |
advisory_lock.go |
| Repository |
repository.go |
| Service |
service.go |
| Mapper |
mapper.go |
| JSONB Types |
jsonb.go |
| Optional Helper |
optional.go |
| Errors |
errors.go |
| Logger (slog) |
logger_slog.go |
| Logger (zap) |
logger_zap.go |
| Test Setup |
main_test.go |
| Test Fixtures (SQL) |
testmigration_example.sql |
| Repository Tests |
repository_test.go |
| Service Tests |
service_test.go |
| Money |
money.go |
| Money Tests |
money_test.go |
HTTP Layer
| Component |
File |
| HTTP Handler |
handler.go |
| Middleware |
middleware.go |
| HTTP Errors |
http_errors.go |
| Authentication |
auth.go |
Production
| Component |
File |
| Pagination |
pagination.go |
| Health Check |
health.go |
| Worker |
worker.go |
| Tracing |
tracing.go |
Templates
| File |
Purpose |
| Dockerfile |
Multi-stage build |
| Makefile |
Build automation |
| docker-compose.yml |
Local development |
| .env.example |
Environment template |
Dependencies
ALWAYS use @latest when adding new dependencies.
Recommended libraries:
# Core
go get golang.org/x/sync/errgroup@latest
go get github.com/caarlos0/env/v10@latest
go get github.com/jackc/pgx/v5@latest
go get github.com/Masterminds/squirrel@latest
go get github.com/pressly/goose/v3@latest
go get github.com/avast/retry-go@latest
go get github.com/google/uuid@latest
go get github.com/shopspring/decimal@latest
# HTTP Layer
go get github.com/go-chi/chi/v5@latest
go get github.com/go-playground/validator/v10@latest
go get gopkg.in/go-jose/go-jose.v2@latest
# Testing
go get github.com/stretchr/testify@latest
go get github.com/testcontainers/testcontainers-go@latest
# Tracing (OpenTelemetry)
go get go.opentelemetry.io/otel@latest
go get go.opentelemetry.io/otel/sdk@latest
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@latest
go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@latest
go get github.com/exaring/otelpgx@latest
Version
- 1.20.0 — Advisory lock pattern for serializable transactions: Serialize() method, enforcement hook, /go-add-repository includes Serialize() by default
- 1.19.0 — Filter pattern for database queries: XxxFilter, getXxxCondition(), /go-add-repository generates filter scaffold
- 1.18.0 — Dependency version enforcement: PreToolUse hook for
go get @latest
- 1.17.0 — Testcontainers integration: typed closer, testmigration/ fixtures, goose with sql.Open
- 1.16.1 — Fix golangci-lint v2 schema: imports-blocklist, remove deprecated options
- 1.16.0 — Protected .golangci.yml (hook + documentation)
- 1.15.0 — Package naming: no common/helpers/utils, purpose-named packages (optional/, json.go)
- 1.14.0 — Error handling: sentinel categories + wrap (internal/errs), helpers, no re-wrap
- 1.13.1 — golangci-lint v2 fix: typecheck is built-in, wsl (not wsl_v5), troubleshooting
- 1.13.0 — golangci-lint v2 migration (formatters, nolintlint anti-cheat, err113)
- 1.12.0 — Comprehensive linting configuration (revive, depguard, exclusion patterns)
- 1.11.1 — Channel axioms (nil/closed behavior, WaitMany, broadcast signaling)
- 1.11.0 — Effective Go patterns (control structures, interfaces, allocation, defer, embedding, blank identifier)
- 1.10.3 — Package structure decision guide (pkg/ vs internal/)
- 1.10.2 — Config: embedded structs only (no named fields in main Config)
- 1.10.1 — Fix: UserColumns() in models package only (not repository)
- 1.10.0 — Repository pattern: Save as upsert, UserColumns() function, Values() method
- 1.9.0 — Authentication patterns (gateway-based, full JWT validation)
- 1.8.0 — Code quality tools (deadcode analysis, make deadcode target)
- 1.7.1 — Comment conventions (stdlib-style doc comments, no decorative separators)
- 1.7.0 — Handler-per-entity, Optional[T], JSONB types, Mapper pattern, Config envPrefix, IDs as string
- 1.6.1 — Money pattern: NUMERIC database storage (was TEXT)
- 1.6.0 — Money pattern (decimal precision, currency conversion, exchange rates)
- 1.5.0 — Enhanced testing (testcontainers, testify mock, CI/Local detection)
- 1.4.0 — Entry point pattern (backend, errgroup, graceful shutdown)
- 1.3.0 — Best practices (naming, concurrency, pitfalls, performance)
- 1.2.0 — Simple errors, OpenTelemetry tracing
- 1.1.0 — HTTP Layer, Enhanced Errors, Production Patterns (pagination, health, workers)
- 1.0.0 — Initial release
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: go-development3description: This skill should be used when the user is working with Go projects (go.mod, *.go files), asking about "Go patterns", "Go architecture", "services", "repositories", or mentions "Go development", "Go project", "Go handlers", "Go testing". Use when this capability is needed.4---56# Go Development Guide78Production-ready patterns extracted from real projects.910## Table of Contents1112- [Core Principle: LESS CODE = FEWER BUGS](#core-principle-less-code--fewer-bugs)13- [Architecture Decisions](#architecture-decisions)14- [Linter Enforcement](#linter-enforcement)15- [Enforced Project Structure](#enforced-project-structure)16- [References](#references)17 - [Core Patterns](#core-patterns)18 - [HTTP Layer](#http-layer)19 - [Production Patterns](#production-patterns)20 - [Best Practices](#best-practices)21- [Examples](#examples)22- [Templates](#templates)23- [Commands](#commands)24- [Dependencies](#dependencies)25- [Version](#version)2627## Core Principle: LESS CODE = FEWER BUGS2829**This applies to ALL code — not just project scaffolding.**3031### What this means:3233- ❌ Don't write error types that won't be used34- ❌ Don't create custom error type for every error case35- ❌ Don't add methods "for completeness"36- ❌ Don't create helper functions that have one caller37- ❌ Don't add validation for impossible scenarios38- ❌ Don't implement interfaces "just in case"39- ❌ Don't add logging/metrics that nobody reads40- ❌ Don't create `common`, `helpers`, `utils`, `shared`, `misc` packages4142- ✅ Write only what the feature requires43- ✅ Use few sentinel categories (ErrNotFound, ErrConflict) + wrap with context44- ✅ Typed errors only when caller needs to extract data (RetryAfter, Field)45- ✅ Add code when there's actual need46- ✅ Delete unused code immediately47- ✅ Prefer inline code over tiny functions48- ✅ Trust the type system, don't over-validate49- ✅ Name packages by what they provide, not what's in them50- ✅ Keep helper functions close to usage (unexported)51- ✅ If truly shared, create small purpose-named packages (`internal/optional/`)5253- ❌ Don't modify `.golangci.yml` — linting config is protected5455### Examples:5657| Bad | Good |58|-----|------|59| Define 10 error types, use 2 | Define errors as you need them |60| Create `GetByID`, `GetByEmail`, `GetByName` upfront | Create only the method you're using now |61| Add `Update`, `Delete` when only `Create` is needed | Add `Update` when the feature requires it |62| Write helper `formatUserName()` called once | Inline the logic |63| Validate internal struct fields | Trust internal code, validate at boundaries |6465## Architecture Decisions6667| Aspect | Choice |68|--------|--------|69| **Config** | `caarlos0/env` (env only) |70| **Structure** | `cmd/`, `internal/`, `pkg/` |71| **Database** | `pgx/v5` + `squirrel` |72| **Transactions** | Context injection + retry |73| **DI** | Service Registry |74| **Errors** | Sentinel categories + wrap (errs package) |75| **Logging** | slog (small) / zap (large) — ask user |76| **Tracing** | OpenTelemetry (optional) — ask user |77| **Migrations** | `goose/v3` |7879## Linter Enforcement8081All rules are enforced via `golangci-lint` (revive rules) in `.golangci.yml`:8283| Rule | Linter | Description |84|------|--------|-------------|85| `userID` not `userId` | `var-naming` | Go idiom: acronyms in caps |86| `any` not `interface{}` | `use-any` | Go 1.18+ alias |87| No `common/helpers/utils` packages | `var-naming` | `extraBadPackageNames` |88| Error wrapping | `err113`, `errorlint` | Sentinel errors + wrap |89| Test helpers | `thelper` | Must use `t.Helper()` |90| Test parallelism | `tparallel` | Suggests `t.Parallel()` |91| Test env vars | `tenv` | Detects `os.Setenv` in tests |9293### Required Validation9495After generating/modifying Go code:9697```bash98golangci-lint run ./...99```100101**Do not modify `.golangci.yml`** — linting config is protected by `golangci-guard` hook.102103## Enforced Project Structure104105The skill MUST enforce this structure for all Go projects:106107```108project/109├── cmd/110│ └── app/111│ └── main.go # Entry point only112├── internal/113│ ├── config/114│ │ └── config.go # Config with envPrefix115│ ├── errs/116│ │ └── errors.go # Sentinel errors + helpers117│ ├── optional/118│ │ └── optional.go # Pointer conversion helpers119│ ├── models/120│ │ └── {entity}.go # Domain models + mappers121│ ├── services/122│ │ ├── registry.go # Service registry123│ │ └── {entity}.go # Business logic124│ ├── storage/125│ │ ├── storage.go # Storage interface126│ │ ├── {entity}.go # Repository impl127│ │ ├── main_test.go # TestMain with testcontainers128│ │ └── testmigration/ # Test data fixtures (SQL)129│ │ ├── 100001_users.up.sql130│ │ └── 100001_users.down.sql131│ └── http/132│ └── v1/133│ ├── router.go # Router + path constants134│ ├── {entity}_handler.go135│ ├── dto.go # Request/Response types136│ └── json.go # encode/decode137├── pkg/138│ ├── logger/139│ └── postgres/140├── migrations/141├── go.mod142├── .env.example143├── Makefile144├── Dockerfile145└── docker-compose.yml146```147148### Structure Rules149150| Rule | Correct | Wrong |151|------|---------|-------|152| Handler files | `user_handler.go`, `order_handler.go` | `handlers.go` (all in one) |153| Mappers | In `models/{entity}.go` with model | In separate `mappers/` package |154| DTOs | In `http/v1/dto.go` | Mixed with domain models |155| Path constants | In `router.go` | Hardcoded strings in handlers |156| IDs | `string` type | `uuid.UUID` type |157| ID generation | `uuid.NewString()` in service | In handler or repository |158| Config nesting | Use `envPrefix` tag | Full env var names in nested structs |159| Doc comments | `// User represents...` | `// This struct...` |160| Section organization | Separate files | `// ----- Section -----` |161162## References163164### Core Patterns165166| Pattern | File |167|---------|------|168| Entry Point | [entrypoint-pattern.md](references/entrypoint-pattern.md) |169| Configuration | [config-pattern.md](references/config-pattern.md) |170| Package Structure | [package-structure-decision.md](references/package-structure-decision.md) |171| Database & Transactions | [database-pattern.md](references/database-pattern.md) |172| Advisory Locks | [advisory-lock-pattern.md](references/advisory-lock-pattern.md) |173| Service Layer | [service-pattern.md](references/service-pattern.md) |174| Repository | [repository-pattern.md](references/repository-pattern.md) |175| Filter Pattern | [filter-pattern.md](references/filter-pattern.md) |176| Mapper | [mapper-pattern.md](references/mapper-pattern.md) |177| JSONB Types | [jsonb-pattern.md](references/jsonb-pattern.md) |178| Optional Helper | [optional-pattern.md](references/optional-pattern.md) |179| Error Handling | [error-handling.md](references/error-handling.md) |180| Logging | [logging-pattern.md](references/logging-pattern.md) |181| Testing | [testing-pattern.md](references/testing-pattern.md) |182| Test Fixtures | [test-fixtures-pattern.md](references/test-fixtures-pattern.md) |183| Money | [money-pattern.md](references/money-pattern.md) |184| Build & Deploy | [build-deploy.md](references/build-deploy.md) |185186### HTTP Layer187188| Pattern | File |189|---------|------|190| HTTP Handlers | [http-handler-pattern.md](references/http-handler-pattern.md) |191| Middleware | [middleware-pattern.md](references/middleware-pattern.md) |192| Validation | [validation-pattern.md](references/validation-pattern.md) |193| Authentication | [auth-pattern.md](references/auth-pattern.md) |194195### Production Patterns196197| Pattern | File |198|---------|------|199| Pagination | [pagination-pattern.md](references/pagination-pattern.md) |200| Health Checks | [health-check-pattern.md](references/health-check-pattern.md) |201| Background Workers | [worker-pattern.md](references/worker-pattern.md) |202| Tracing | [tracing-pattern.md](references/tracing-pattern.md) |203204### Best Practices205206| Topic | File |207|-------|------|208| Naming Conventions | [naming-conventions.md](references/naming-conventions.md) |209| Package Naming | [package-naming.md](references/package-naming.md) |210| Control Structures | [control-structures.md](references/control-structures.md) |211| Interface Design | [interface-design.md](references/interface-design.md) |212| Allocation (new/make) | [allocation-patterns.md](references/allocation-patterns.md) |213| Defer | [defer-patterns.md](references/defer-patterns.md) |214| Embedding | [embedding-patterns.md](references/embedding-patterns.md) |215| Blank Identifier | [blank-identifier.md](references/blank-identifier.md) |216| Concurrency | [concurrency-pattern.md](references/concurrency-pattern.md) |217| Channel Axioms | [channel-axioms.md](references/channel-axioms.md) |218| Linting | [linting-pattern.md](references/linting-pattern.md) |219| Common Pitfalls | [common-pitfalls.md](references/common-pitfalls.md) |220| Performance | [performance-tips.md](references/performance-tips.md) |221| Code Quality | [code-quality.md](references/code-quality.md) |222223## Examples224225### Core226227| Component | File |228|-----------|------|229| Main | [main.go](examples/main.go) |230| Backend | [backend.go](examples/backend.go) |231| Config | [config.go](examples/config.go) |232| Filter | [filter.go](examples/filter.go) |233| Common Models | [common_models.go](examples/common_models.go) |234| Common Storage | [common_storage.go](examples/common_storage.go) |235| Database Client | [pg-client.go](examples/pg-client.go) |236| Advisory Lock | [advisory_lock.go](examples/advisory_lock.go) |237| Repository | [repository.go](examples/repository.go) |238| Service | [service.go](examples/service.go) |239| Mapper | [mapper.go](examples/mapper.go) |240| JSONB Types | [jsonb.go](examples/jsonb.go) |241| Optional Helper | [optional.go](examples/optional.go) |242| Errors | [errors.go](examples/errors.go) |243| Logger (slog) | [logger_slog.go](examples/logger_slog.go) |244| Logger (zap) | [logger_zap.go](examples/logger_zap.go) |245| Test Setup | [main_test.go](examples/main_test.go) |246| Test Fixtures (SQL) | [testmigration_example.sql](examples/testmigration_example.sql) |247| Repository Tests | [repository_test.go](examples/repository_test.go) |248| Service Tests | [service_test.go](examples/service_test.go) |249| Money | [money.go](examples/money.go) |250| Money Tests | [money_test.go](examples/money_test.go) |251252### HTTP Layer253254| Component | File |255|-----------|------|256| HTTP Handler | [handler.go](examples/handler.go) |257| Middleware | [middleware.go](examples/middleware.go) |258| HTTP Errors | [http_errors.go](examples/http_errors.go) |259| Authentication | [auth.go](examples/auth.go) |260261### Production262263| Component | File |264|-----------|------|265| Pagination | [pagination.go](examples/pagination.go) |266| Health Check | [health.go](examples/health.go) |267| Worker | [worker.go](examples/worker.go) |268| Tracing | [tracing.go](examples/tracing.go) |269270## Templates271272| File | Purpose |273|------|---------|274| [Dockerfile](templates/Dockerfile) | Multi-stage build |275| [Makefile](templates/Makefile) | Build automation |276| [docker-compose.yml](templates/docker-compose.yml) | Local development |277| [.env.example](templates/.env.example) | Environment template |278279## Dependencies280281**ALWAYS use `@latest`** when adding new dependencies.282283Recommended libraries:284285```bash286# Core287go get golang.org/x/sync/errgroup@latest288go get github.com/caarlos0/env/v10@latest289go get github.com/jackc/pgx/v5@latest290go get github.com/Masterminds/squirrel@latest291go get github.com/pressly/goose/v3@latest292go get github.com/avast/retry-go@latest293go get github.com/google/uuid@latest294go get github.com/shopspring/decimal@latest295296# HTTP Layer297go get github.com/go-chi/chi/v5@latest298go get github.com/go-playground/validator/v10@latest299go get gopkg.in/go-jose/go-jose.v2@latest300301# Testing302go get github.com/stretchr/testify@latest303go get github.com/testcontainers/testcontainers-go@latest304305# Tracing (OpenTelemetry)306go get go.opentelemetry.io/otel@latest307go get go.opentelemetry.io/otel/sdk@latest308go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@latest309go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@latest310go get github.com/exaring/otelpgx@latest311```312313## Version314315- 1.20.0 — Advisory lock pattern for serializable transactions: Serialize() method, enforcement hook, /go-add-repository includes Serialize() by default316- 1.19.0 — Filter pattern for database queries: XxxFilter, getXxxCondition(), /go-add-repository generates filter scaffold317- 1.18.0 — Dependency version enforcement: PreToolUse hook for `go get @latest`318- 1.17.0 — Testcontainers integration: typed closer, testmigration/ fixtures, goose with sql.Open319- 1.16.1 — Fix golangci-lint v2 schema: imports-blocklist, remove deprecated options320- 1.16.0 — Protected .golangci.yml (hook + documentation)321- 1.15.0 — Package naming: no common/helpers/utils, purpose-named packages (optional/, json.go)322- 1.14.0 — Error handling: sentinel categories + wrap (internal/errs), helpers, no re-wrap323- 1.13.1 — golangci-lint v2 fix: typecheck is built-in, wsl (not wsl_v5), troubleshooting324- 1.13.0 — golangci-lint v2 migration (formatters, nolintlint anti-cheat, err113)325- 1.12.0 — Comprehensive linting configuration (revive, depguard, exclusion patterns)326- 1.11.1 — Channel axioms (nil/closed behavior, WaitMany, broadcast signaling)327- 1.11.0 — Effective Go patterns (control structures, interfaces, allocation, defer, embedding, blank identifier)328- 1.10.3 — Package structure decision guide (pkg/ vs internal/)329- 1.10.2 — Config: embedded structs only (no named fields in main Config)330- 1.10.1 — Fix: UserColumns() in models package only (not repository)331- 1.10.0 — Repository pattern: Save as upsert, UserColumns() function, Values() method332- 1.9.0 — Authentication patterns (gateway-based, full JWT validation)333- 1.8.0 — Code quality tools (deadcode analysis, make deadcode target)334- 1.7.1 — Comment conventions (stdlib-style doc comments, no decorative separators)335- 1.7.0 — Handler-per-entity, Optional[T], JSONB types, Mapper pattern, Config envPrefix, IDs as string336- 1.6.1 — Money pattern: NUMERIC database storage (was TEXT)337- 1.6.0 — Money pattern (decimal precision, currency conversion, exchange rates)338- 1.5.0 — Enhanced testing (testcontainers, testify mock, CI/Local detection)339- 1.4.0 — Entry point pattern (backend, errgroup, graceful shutdown)340- 1.3.0 — Best practices (naming, concurrency, pitfalls, performance)341- 1.2.0 — Simple errors, OpenTelemetry tracing342- 1.1.0 — HTTP Layer, Enhanced Errors, Production Patterns (pagination, health, workers)343- 1.0.0 — Initial release344345---346> Converted and distributed by [TomeVault](https://tomevault.io/claim/11me) — claim your Tome and manage your conversions.347<!-- tomevault:4.0:skill_md:2026-04-11 -->