You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Generated SDK files (Fern, OpenAPI Generator, protoc, etc.) — these are public surface even when auto-generated.
16
16
- Any file whose path or name suggests it defines a contract (`*_request.py`, `*Params`, `*Response`, `I*.ts`, `*.proto`).
17
-
3.**Ignore** lockfiles, vendored code, fixtures, internal helpers, and tests — except note when a test was *deleted* (see Step 5).
17
+
3.**Ignore** lockfiles, vendored code, fixtures, internal helpers, and tests — except note when a test was *added*, *deleted*, or *modified to remove a case* (see Step 5).
18
18
4. If the repo has compat-tracking docs (e.g. `AGENTS.md`, `CHANGELOG.md`, `MIGRATION.md`, `BREAKING.md`, `.fernignore`, codeowner files for "frozen" generated files), read them. They tell you what the maintainers consider stable, what shims already exist, and what's deliberately frozen.
19
19
20
20
## Step 2 — Extract every interface change
@@ -40,13 +40,13 @@ Assign each interface change to one of these tiers. Be strict; when in doubt, es
40
40
| ✅ **3**|**Pure rename with full alias**| Identifier renamed, but the old name is preserved as an alias/re-export with identity preserved (`old is new` holds, or runtime type identity is preserved). |
41
41
| 🔍 **4**|**Type tightening / silent risk**| A type was narrowed (e.g. `str` → enum), a default removed, a docstring contract changed, or behavior subtly shifted. Compiles fine; may surprise users. |
42
42
| ➕ **5**|**Purely additive**| New optional field, new optional parameter with default, new method, new exported type. No existing caller can break. |
43
-
| 🆕 **6**|**Brand-new public type**| Entirely new type/class/symbol with no predecessor. Only breaks callers who happened to define a same-named local symbol. |
43
+
| 🆕 **6**|**Brand-new public type**| Entirely new type/class/symbol with no predecessor. Only breaks callers via name collision — same-named local symbol, glob imports (`from X import *`, `use X::*`), Go dot-imports, or TypeScript `import * as` destructuring. |
44
44
45
45
## Step 4 — For each change, document compat & gaps
0 commit comments