Go prizes one obvious way. Then an AI assistant trained on a planet of Java and Python writes code that compiles but reads like a C# port: swallowed errors, fat interfaces, goroutines nobody owns, and init() doing database calls on import. The fix isn't endless re-prompting — it's a .cursorrules file that tells Cursor and Claude Code what idiomatic Go actually looks like in your repo. Eight rules, each with a before and after. Drop them in and ship. Rule 1: Errors are values — handle them, never discard Never write `_ = someCall()` to ignore an error. Check every returned error and return with context via fmt.Errorf("%w", err). Sentinel errors use errors.Is; typed errors use errors.As. Enter fullscreen mode Exit fullscreen mode Before f , _ := os . Open ( path ) defer f . Close () data , _ := io . ReadAll ( f ) Enter fullscreen mode Exit fullscreen mode After f , err := os . Open ( path ) if err != nil { return nil , fmt . Errorf ( "open %s: %w" , path , err ) } defer f . Close () data , err := io .…