- Follow Go idioms: short variable names in small scopes, descriptive names for exported identifiers.
- Return errors as the last return value — check immediately with `if err != nil { return err }`. Never discard errors with `_`.
- Use short variable names for short-lived variables (`i`, `n`, `err`) and descriptive names for package-level and long-lived variables.
- Wrap errors with context: `fmt.Errorf("operation failed: %w", err)` for traceability.
- Accept interfaces, return structs. Keep interfaces small (1-3 methods).
- Use `context.Context` as the first parameter for functions that do I/O or may be cancelled.
- Prefer returning `(result, error)` tuples over panicking. Reserve `panic` for truly unrecoverable states.
- Organize packages by domain, not by type. Avoid packages named `util`, `common`, or `helpers`.