---
title: "Upstream Tracking"
description: "All issues and PRs reviewed for this fork"
weight: 16
---

## Upstream Tracking

We continue to monitor and selectively adopt changes from the upstream repository.

### Implemented from Upstream
- ✅ [#1513] - JSONEqBytes
- ✅ [#1803] - Kind/NotKind assertions
- ✅ [#1805] - IsOfTypeT[T] generic assertions
- ✅ [#1685] - Partial iterator support (SeqContainsT variants)
- ✅ [#1828] - Spew panic fixes
- ✅ [#1611] - Goroutine leak in Eventually/Never (drove the context-based pollCondition refactor)
- ✅ [#1825], [#1818], [#1223], [#1813], [#1822], [#1829] - Various bug fixes
- ✅ [#1606], [#1087] - Consistently assertion
- ✅ [#1848] - Subset error message
- ✅ [#1839] - `InEpsilonSymmetric` (number equality with symmetric role)
- ✅ [#1840] - JSON/YAML `Redactor` pattern (dynamic input redaction, inspired by Insta)
- ✅ [#1859] - Channel assertions (`Blocked` / `NotBlocked`)
- ✅ [#1860] - `ErrorAsType` / `NotErrorAsType` (go1.26+, adapted with a typed `*E` target)
- ✅ [#1940], [#1942] - `ErrorNotContains` (the opposite of `ErrorContains`)
- ✅ [#1908] - `Contains` with a rune or byte element
- ✅ [#1874], [#1875] - quoted string values in `Empty` / `NotEmpty` failures
- ✅ [#1931], [#1899] - `InEpsilonSlice` keeps the caller's message
- ✅ [#1898] - `InDeltaMapValues` names the failing key

### Superseded by Our Implementation
- ✅ [#1801] - Error message on large collections for `Len`
- ⛔ [#1845] - Fix Eventually/Never regression (superseded by context-based pollCondition)
- ✅ [#1830] - CollectT.Halt() (implemented as `CollectT.Cancel()` in v2.4 — see [CHANGES](./CHANGES.md))
- ✅ [#1819] - Handle unexpected exits (handled by per-tick goroutine wrap in v2.4)
- ⛔ [#1824] - Spew testing (superseded by property-based fuzzing)

[#1830]: https://github.com/stretchr/testify/pull/1830
[#1824]: https://github.com/stretchr/testify/pull/1824

**Review frequency**: Quarterly (last review: August 2026, next review: November 2026)

---
[#1223]: https://github.com/stretchr/testify/pull/1223
[#1513]: https://github.com/stretchr/testify/pull/1513
[#1611]: https://github.com/stretchr/testify/issues/1611
[#1685]: https://github.com/stretchr/testify/pull/1685
[#1803]: https://github.com/stretchr/testify/pull/1803
[#1805]: https://github.com/stretchr/testify/issues/1805
[#1813]: https://github.com/stretchr/testify/issues/1813
[#1818]: https://github.com/stretchr/testify/pull/1818
[#1822]: https://github.com/stretchr/testify/issues/1822
[#1825]: https://github.com/stretchr/testify/pull/1825
[#1828]: https://github.com/stretchr/testify/pull/1828
[#1829]: https://github.com/stretchr/testify/issues/1829

## Appendix: Upstream References

This table catalogs all upstream PRs and issues from [github.com/stretchr/testify](https://github.com/stretchr/testify) that we have processed.

### Implemented (Adapted or Merged)

| Reference | Type | Summary | Outcome in Fork |
|-----------|------|---------|-----------------|
| [#994] | PR | Colorize expected vs actual values | ✅ Adapted into `enable/color` module with themes and configuration |
| [#1087] | Issue | Consistently assertion | ✅ Adapted |
| [#1223] | PR | Display uint values in decimal instead of hex | ✅ Merged - Applied to diff output |
| [#1232] | PR | Colorized output for expected/actual/errors | ✅ Adapted into `enable/color` module |
| [#1356] | PR | panic(nil) handling for Go 1.21+ | ✅ Merged - Updated panic assertions |
| [#1467] | PR | Colorized output with terminal detection | ✅ Adapted into `enable/color` module (most mature implementation) |
| [#1480] | PR | Colorized diffs via TESTIFY_COLORED_DIFF env var | ✅ Adapted with env var support in `enable/color` |
| [#1513] | PR | JSONEqBytes for byte slice JSON comparison | ✅ Merged - Added to JSON domain |
| [#1606] | PR | Consistently assertion | ✅ Adapted |
| [#1611] | Issue | Goroutine leak in Eventually/Never | ✅ Fixed by using context.Context (consolidation into single pollCondition function) |
| [#1685] | PR | Iterator support (`iter.Seq`) for Contains/ElementsMatch | ✅ Partial - Implemented SeqContainsT and SeqNotContainsT only |
| [#1772] | PR | YAML library migration to maintained fork | ✅ Adapted - Used gopkg.in/yaml.v3 in optional `enable/yaml` module |
| [#1797] | PR | Codegen package consolidation and licensing | ✅ Adapted - Complete rewrite of code generation system |
| [#1803] | PR | Kind/NotKind assertions | ✅ Merged - Added to Type domain |
| [#1805] | Issue | Generic `IsOfType[T]()` without dummy value | ✅ Implemented - IsOfTypeT and IsNotOfTypeT in Type domain |
| [#1813] | Issue | Panic with unexported fields | ✅ Fixed via #1828 in internalized spew |
| [#1816] | Issue | Fix panic on unexported struct key in map | ✅ Fixed in internalized go-spew |
| [#1818] | PR | Fix panic on invalid regex in Regexp/NotRegexp | ✅ Merged - Added graceful error handling |
| [#1822] | Issue | Deterministic map ordering in diffs | ✅ Fixed in internalized go-spew |
| [#1825] | PR | Fix panic using EqualValues with incomparable types | ✅ Merged - Enhanced type safety in EqualValues |
| [#1826] | Issue | Type safety with spew (meta-issue) | ✅ Addressed through comprehensive fuzzing and fixes |
| [#1828] | PR | Fixed panic with unexported fields in maps | ✅ Merged into internalized go-spew |
| [#1829] | Issue | Fix time.Time rendering in diffs | ✅ Fixed in internalized go-spew |
| [#1848] | PR | Subset (garbled error message) | ✅ Adapted |
| [#1839] | PR | Number equality with symmetric role | ✅ Adapted  |
| [#1840] | Issue | JSON presence check without exact values | ✅ Adapted  |
| [#1859] | Issue | Channel assertions | ✅ Adapted |
| [#1860] | Issue (PR [#1861]) | `ErrorAsType[E]` for Go 1.26+ | ✅ Adapted - implemented as `ErrorAsType` / `NotErrorAsType` with a typed `*E` target and a `bool` return (not the upstream `(E, bool)` shape), guarded by `//go:build go1.26`. First user of the codegen go-version guard. |
| [#1915] | Issue | Stack overflow on recursive walk | ✅ Fixed (detected and fixed independently) |
| [#1874], [#1875] | PR | Quote string values in empty assertion failures | ✅ Adapted - `Empty`/`NotEmpty` render a string value with `%q`, so whitespace and the empty string stay visible. `NotEmpty` also gained the truncation every other failure message has. |
| [#1898] | PR | Include the map key in `InDeltaMapValues` error message | ✅ Adapted - the per-key call carries `at key <k>`, alongside the caller's own message. |
| [#1899], [#1931] | PR | Pass the custom message through `InEpsilonSlice` | ✅ Adapted - the index context no longer replaces the caller's message; both are joined. |
| [#1908] | PR | `Contains` is not rune-safe on Unicode strings | ✅ Adapted - `Contains(t, "héllo", 'é')` compared against the literal `"<int32 Value>"`. Dispatch is now on the element kind (string, rune, byte, defined string type). The invalid-UTF-8 half of the upstream report is deliberately left as byte semantics. |
| [#1940], [#1942] | Issue/PR | `ErrorNotContains` assertion | ✅ Adapted - implemented as `ErrorNotContains` in the error domain, the opposite of `ErrorContains`: a nil error fails, and so does an error whose message contains the substring. |
| [#1878] | Issue    | diff hunk size | ✅ Implemented (forward only) - parameterized hunk size is an API challenge |

[#994]: https://github.com/stretchr/testify/pull/994
[#1232]: https://github.com/stretchr/testify/pull/1232
[#1356]: https://github.com/stretchr/testify/pull/1356
[#1467]: https://github.com/stretchr/testify/pull/1467
[#1480]: https://github.com/stretchr/testify/pull/1480
[#1576]: https://github.com/stretchr/testify/pull/1576
[#1601]: https://github.com/stretchr/testify/issues/1601
[#1772]: https://github.com/stretchr/testify/pull/1772
[#1797]: https://github.com/stretchr/testify/pull/1797
[#1816]: https://github.com/stretchr/testify/issues/1816
[#1826]: https://github.com/stretchr/testify/issues/1826
[#1087]: https://github.com/stretchr/testify/issues/1087
[#1606]: https://github.com/stretchr/testify/pull/1606
[#1839]: https://github.com/stretchr/testify/pull/1839
[#1840]: https://github.com/stretchr/testify/issues/1840
[#1848]: https://github.com/stretchr/testify/pull/1848
[#1859]: https://github.com/stretchr/testify/pull/1859
[#1915]: https://github.com/stretchr/testify/issues/1915
[#1874]: https://github.com/stretchr/testify/pull/1874
[#1875]: https://github.com/stretchr/testify/pull/1875
[#1878]: https://github.com/stretchr/testify/pull/1878
[#1898]: https://github.com/stretchr/testify/pull/1898
[#1899]: https://github.com/stretchr/testify/pull/1899
[#1908]: https://github.com/stretchr/testify/pull/1908
[#1931]: https://github.com/stretchr/testify/pull/1931
[#1937]: https://github.com/stretchr/testify/pull/1937
[#1940]: https://github.com/stretchr/testify/pull/1940
[#1942]: https://github.com/stretchr/testify/pull/1942

### Superseded by Our Implementation

| Reference | Type | Summary | Why Superseded |
|-----------|------|---------|----------------|
| [#1801] | Issue | `Len` error printing large collections | Duplicate issue upstream. This is fixed by generalized truncation |
| [#1845] | PR | Fix Eventually/Never regression | Superseded by context-based pollCondition implementation (we don't have this bug) |
| [#1819] | PR | Handle unexpected exits in Eventually | Implemented in v2.4 via per-tick goroutine wrap — a `runtime.Goexit` in the condition only aborts the current tick |
| [#1824] | PR | Spew testing improvements | Superseded by property-based fuzzing with random type generator |
| [#1830] | PR | `CollectT.Halt()` for stopping tests | Implemented in v2.4 as `CollectT.Cancel()` — see [CHANGES](./CHANGES.md) |
| [#1937] | PR | `ErrorAsType` (go1.27) | Superseded by our implementation |


### Under Consideration (Monitoring)

| Reference | Type | Summary | Status |
|-----------|------|---------|--------|
| [#1576] | Issue/PR | `EqualValues` assertion | 🔍 Monitoring [#1863]- Wrong equality when comparing float32 and float64|
| [#1945] | PR | `Must` helper | 🔍 Monitoring [#1945]- Syntactic sugar to hand a value directly when no error |

[#1945]: https://github.com/stretchr/testify/pull/1945

### Informational (Not Implemented)

| Reference | Type | Summary | Outcome |
|-----------|------|---------|---------|
| [#1147] | Issue | General discussion about generics adoption | ℹ️ Marked "Not Planned" upstream - We implemented our own generics approach ({{% siteparam "metrics.generics" %}} functions) |
| [#1308] | PR | Comprehensive refactor with generic type parameters | ℹ️ Draft for v2.0.0 upstream - We took a different approach with the same objective |
| [#1591], [#1601] | PR + Issue | `NoFieldIsZero` recursive zero-value assertion | ⛔ **Won't do** - Considered and prototyped (2026-04-26). Same conclusion as upstream maintainers: semantics is too ambiguous (map keys, []byte, pointer targets, unexported fields, cycles, time.Time-style smart-zero types) and overlaps too heavily with [Equal](...) for legitimate use cases. Each pitfall fix adds a knob; full version is a struct validator, not an assertion. |
| [#1776] | Issue | `require` doc-comment examples call functions that return no value | ℹ️ Same defect in our generated API pages, found and fixed independently: the signature tables listed a `bool` return for every `require` row. Nothing to adopt. |
| [#1862] | Issue | `CollectT` redesign / `testing.TB` interop | ⛔ **Won't do (for now)** - Studied in depth (2026-04-17). All four design options (interface widening, embedding `*testing.T`, opt-in `CollectTB` wrapper, `CollectT`-as-interface) carry visible costs; Go's `testing.TB.private()` blocks any clean proxy. Workaround for affected users is a 3-line per-helper adapter. Revisit if traction warrants the breaking churn. |

[#1147]: https://github.com/stretchr/testify/issues/1147
[#1776]: https://github.com/stretchr/testify/issues/1776
[#1308]: https://github.com/stretchr/testify/pull/1308
[#1591]: https://github.com/stretchr/testify/pull/1591
[#1801]: https://github.com/stretchr/testify/pull/1801
[#1819]: https://github.com/stretchr/testify/pull/1819
[#1845]: https://github.com/stretchr/testify/pull/1845
[#1860]: https://github.com/stretchr/testify/pull/1860
[#1861]: https://github.com/stretchr/testify/pull/1861
[#1862]: https://github.com/stretchr/testify/pull/1862
[#1863]: https://github.com/stretchr/testify/pull/1863

### Summary Statistics

| Category | Count |
|----------|-------|
| **Implemented/Merged** | 35 |
| **Superseded** | 6 |
| **Monitoring** | 1 |
| **Informational** | 5 |
| **Total Processed** | 47 |

**Note**: This fork maintains an active relationship with upstream, regularly reviewing new PRs and issues. The quarterly review process ensures we stay informed about upstream developments while maintaining our architectural independence.

---

## See Also

- [Changes from v1](./CHANGES.md) - Complete list of all implemented changes and new features
- [Roadmap](../project/maintainers/ROADMAP.md) - Future plans and development priorities
- [Architecture](../project/maintainers/ARCHITECTURE.md) - Technical architecture and design decisions
- [Original Project](../project/maintainers/ORIGINAL.md) - History and acknowledgments

---
