| design-process | Four design axes, work backwards, minimize surface area | | surface-area | Internal packages, no global state, unknown outputs, mutation guards | | dependencies | Accept don't instantiate, accept interfaces, return structs | | evolution | Breaking changes, param objects vs functional options, result objects |
| testability | TimeNow function type, rand.Rand injection, WithX options, deterministic outputs, DST readiness |
Do NOT apply to application-level code that won't be imported by other modules.
Designing Go libraries and packages for long-term evolution. Covers API surface management, dependency direction, backwards compatibility, trade-offs between parameter objects and functional options, and testability via deterministic simulation. Source: stuckinforloop/harness.