| --- |
| title: A guide to risky changes to the standard library and toolchain |
| --- |
| |
| Please take special care when working on **risky changes**. |
| As a reminder: |
| |
| A change is risky if it can cause **failures that are hard to diagnose** (for example, changes to |
| the runtime, GC, compiler, linker, TLS, other low-level component, or **complex changes that |
| need soak time under production workloads**), or if it **requires many CLs that are hard to |
| revert** (for example, large CLs or stacks of CLs). |
| |
| If you plan on working on a change that may be risky, please do the following: |
| 1. Unless the entire change is absolutely trivial to revert, protect the new code paths with a |
| boolean flag, prefixed with `go125`, that can be used to quickly toggle back to the old |
| implementation. |
| It can be a simple bool constant, for example, `const go125UseEvenBetterLinker = true`. |
| Such flags **must be findable** by a simple grep for the string `go125`. |
| That way we can find them without missing any, and they can be cleaned up when we get to the |
| Go 1.26 cycle. |
| 2. Consider how you would answer the following questions for your change: |
| * How risky is the change you're planning to make? |
| * How will you know if it is working as intended? |
| * How much production testing does it need for you to be confident it is working as intended? |
| * When should the keep/revert decision be made? |
| 3. Create a tracking issue in the Go 1.25 milestone with a release-blocker label. |
| This issue will be used to track progress on the feature and make the final decision for Go 1.25. |