# What changed in hypothesis

> 95 changes in hypothesis 6 from its official release notes, upgrade guides and advisories: 7 breaking, 8 new APIs and options. Each one cited. Sources checked 2026-10-19. HTML: https://unstale.sh/pypi/hypothesis/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## hypothesis 6

### Breaking changes

- Support for Python 3.10 is dropped because it reached end of life in October 2026. (6.169.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.169.0)
- hypothesis.extra.pandas series(), indexes(), and column() accept timezone-aware dtypes, including coarser resolutions; generated values cover the representable range and include NaT unless the elements strategy excludes it. Requires pandas >= 2.1. (6.162.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.162.0)
- Building Hypothesis from source now requires a Rust toolchain unless installing from a native wheel. (6.156.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.0)
- dates() now raises InvalidArgument when a datetime is passed as min_value or max_value, instead of accepting the bounds and later failing with TypeError while generating examples. (6.155.5) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.5)
- Passing a dtype class where a dtype instance is expected now raises a clear error instead of a confusing message or silent coercion to the object dtype in arrays(). (6.155.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.0)
- Generated dicts now vary iteration order instead of always placing required keys first, helping find code sensitive to key order. Use map(stable_sort_function) or similar for stable order. (6.154.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.154.0)
- The source code directory was renamed from hypothesis-python to hypothesis, which may affect tooling that relies on the directory name. (6.152.10) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.152.10)

### New APIs and options

- Adds support for Python 3.16, which is still in alpha. (6.170.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.170.2)
- The .seed() method of randoms() accepts the same arguments as random.Random.seed(), including a= and version=. Calling it without a seed now raises a clearer error. (6.169.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.169.3)
- Test case observations now include a filename and line number for the status_reason, when known. (6.167.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.167.0)
- Values recorded with note() are now included as an ordered list of strings in each test-case observation's metadata.notes. (6.161.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.0)
- Adds efficient filtering that composes with consumes() in either order; filtered draws select among matching values and consume only the value actually drawn. (6.160.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.160.0)
- Adds an efficient mapping method that composes with consumes() in either order. (6.160.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.160.0)
- abi3 wheels are now published for 32-bit Linux and 32-bit Windows, making those distributions available for these platforms. (6.156.5) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.5)
- Hypothesis now publishes abi3 wheels built against the Python 3.10 stable ABI, in addition to version-specific wheels. (6.156.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.4)

### Performance

- Generating unique collections, such as sets() or lists() with unique=True, is considerably more efficient because Hypothesis avoids draws that would be rejected. (6.170.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.170.1)
- Statistics summarisation no longer has quadratic-time behaviour, avoiding an apparent hang after the last test case when running under pytest with more than 100k test cases. (6.168.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.3)
- Rejected drawn elements are marked as discarded, allowing the shrinker to delete them wholesale and generation to avoid revisiting choices that would be rejected again. (6.167.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.167.1)
- Improves performance when one_of() can be simplified to a single real strategy, such as st.integers() | st.nothing(). (6.165.9) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.9)
- Improves performance for unique collections drawn from a fixed pool of elements under symbolic-execution backends such as hypothesis-crosshair. (6.156.8) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.8)
- Shrinking large floats, strings, and bytestrings is now much faster in some cases. (6.155.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.1)
- from_type() resolves each type only once for hierarchies of abstract classes whose subclasses refer back to the base class in their annotations, improving performance from cubic time in the number of subclasses. (6.153.5) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.5)
- Performance improved for stateful testing of state machines with a large number of rules. (6.153.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.2)

### Behavior and default changes

- Adds support for running Hypothesis on PyPy 3.12. (6.168.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.4)
- datetimes() now generates tricky datetimes more often, including values near offset transitions, leap seconds, and well-known dates. (6.168.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.0)
- The explain phase now varies interactive draws from data(), annotating freely-variable draws with a comment like @given arguments. (6.166.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.166.0)
- For max_examples budgets above 1000, optimisation starts earlier and alternates with generation while scores improve, rather than running one pass halfway through the run. (6.165.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.4)
- Values from specific branches of unions can now be re-encoded and shrunk as if generated by wider branches for more strategy combinations. (6.165.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.2)
- characters() now warns when the codec can generate characters that encode successfully but do not decode back to the same character. Use include_characters to generate them without the warning, or exclude_characters to generate only round-tripping characters. (6.165.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.0)
- Generated async functions follow Trio-style checkpoint semantics. (6.164.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.164.0)
- functions() generates functions of the same kind as like=, supporting async functions, generator functions, and async generator functions as well as plain functions. (6.164.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.164.0)
- pure=True is supported only for plain functions. (6.164.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.164.0)
- Generated generator functions yield values drawn from returns; return-type annotations such as Iterator[int] or AsyncIterator[int] can infer the returns strategy. (6.164.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.164.0)
- Constants collection now also collects the float components of complex literals like "3.5j". (6.163.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.163.1)
- The vendored top-level-domain list used by the provisional domains() strategy was updated. (6.161.7) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.7)
- When the returns= strategy can produce only one value, generated functions are displayed as a constant lambda instead of listing each call separately. (6.161.6) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.6)
- Accepts timezone-aware min_value and max_value bounds, treated as moments in time; timezones defaults to timezones(), and mixing an aware and naive bound raises an error. (6.158.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.158.0)
- When annotated-types has been imported, overloaded type hints distinguish naive from aware datetimes using Timezone metadata. (6.158.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.158.0)
- Now supports the annotated-types Timezone constraint on datetime and time. (6.157.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.157.0)
- Under symbolic backends, observability output now displays arguments generated by data as data(...). (6.156.9) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.9)
- from_dtype() supports numpy.dtypes.StringDType and generates arbitrary strings via text(). (6.155.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.0)
- The mapping and optional arguments can have different key and value types, which are unioned in the inferred result. (6.154.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.154.2)
- The error message now describes what differed between generation runs and the strategy stack; in stateful tests, it also reports the steps leading up to the error. (6.152.12) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.152.12)

### Tooling

- The conformance test can test providers with required constructor arguments, runs many test cases per provider, treats entropy exhaustion as expected control flow, and checks that providers generate a representative range of values. (6.170.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.170.0)
- abi3 wheels are now published for Linux s390x (manylinux) and Linux i686 (musllinux), making those platform-specific wheels available to developers. (6.168.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.1)
- abi3 wheels are now published for Linux armv7l on both manylinux and musllinux. (6.161.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.4)
- Hypothesis publishes native wheels for a range of Python versions and platforms, allowing installation without building from source. (6.156.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.0)
- Hypothesis publishes wheels for Pyodide on wasm32-unknown-emscripten for Python 3.13. (6.156.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.0)
- Its type annotations now accept a Mapping instead of requiring an invariant dict, allowing type-checkers to infer generated types for heterogeneous strategies. (6.154.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.154.2)
- The canonical git tag scheme changed from hypothesis-python-X.Y.Z to vX.Y.Z; distributions and build scripts relying on the old scheme should update. (6.152.10) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.152.10)

### Fixes and other changes

- Integer draws can now generate negative values, and string draws from an empty alphabet return the empty string instead of consuming the whole buffer. (6.170.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.170.0)
- Verbose output for stateful tests now reads "Test case: <state machine>" rather than trailing off after the colon. (6.170.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.170.0)
- Fixes an error on Python 3.14 when applying @given with explicit strategies to functions whose annotations refer to types available only during type checking. (6.169.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.169.4)
- Ghostwriter now raises a helpful error for functions with no arguments instead of writing a test with an invalid empty @given() decorator. (6.169.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.169.2)
- Calling .map() or .flatmap() on data() with a keyword argument now raises the intended unsupported-operation error instead of a generic unexpected-keyword error. (6.169.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.169.1)
- Corrects the type annotation to indicate that from_field() returns a strategy for values of the field, not instances of the field type. (6.168.5) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.5)
- Writes to the cache of constants collected from local source files are now atomic, preventing concurrent processes from reading partially written files and silently changing data generated for a given seed. (6.168.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.2)
- An error during an internal cache update no longer leaves the cache corrupted. (6.168.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.168.0)
- Test cases that exceed the maximum allowed size now report a nonempty status_reason. (6.167.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.167.0)
- Failing cases found when possible inputs were fully enumerated now run the shrink and explain phases. (6.166.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.166.0)
- The explain phase now reports that commented parts can be varied together when the failing example ends with an uncommented part. (6.166.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.166.0)
- Fixes the shrink pass's type check, preventing incorrect handling of float precision loss above MAX_PRECISE_INTEGER. (6.165.11) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.11)
- Character classes combining a negative category with other members now match the union of their members. (6.165.10) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.10)
- Subpatterns that cannot be generated from the alphabet no longer raise an error when they may be repeated zero times. (6.165.10) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.10)
- Patterns compiled with re.ASCII now handle inverted categories, explicit characters and ranges, and casefolding correctly. (6.165.10) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.10)
- Provides a better error message when the passed pattern and alphabet are incompatible. (6.165.8) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.8)
- from_type() can now resolve the new sentinel builtin. (6.165.7) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.7)
- Hypothesis adds support for Python 3.15. (6.165.7) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.7)
- abi3 wheels are now published for Windows arm64 and Linux ppc64le (manylinux and musllinux), making these distributions available for installation on those platforms. (6.165.6) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.6)
- Fixes float generation so negative floats can be produced for a 65-bit float index format. (6.165.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.165.3)
- The explain phase no longer reports lines inside the standard library, avoiding misleading explanations. (6.163.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.163.1)
- The alphabet argument now accepts any collection of length-one strings, including tuples and lists of characters, matching the existing behavior of text(). (6.163.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.163.0)
- Objects' _repr_pretty_() methods are respected in additional places, including the arguments of a failing example. (6.161.6) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.6)
- Fixes lambda display so it no longer shows the definition of an unrelated lambda with the same arguments, such as a function generated by functions() in a failing example. (6.161.5) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.5)
- Hypothesis now publishes abi3 wheels for Linux riscv64 with both manylinux and musllinux tags, enabling wheel installation on those platforms. (6.161.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.2)
- Terminal strategies now generate only strings that the lexer matches in their entirety, avoiding strings that fail to parse. (6.161.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.161.1)
- User-facing documentation, log messages, and error messages now call a single execution a “test case” instead of an “example”; some observability fields may change format. (6.159.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.159.0)
- Simple comparison filters are rewritten into efficient bounds, including bounds inferred from annotated types; contradictory filters produce an empty strategy instead of failing health checks. (6.158.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.158.1)
- Simple comparison filters are rewritten into efficient bounds, including bounds inferred from annotated types; contradictory filters produce an empty strategy instead of failing health checks. (6.158.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.158.1)
- Now resolves the typing-extensions TypeAliasType backport as well as the native form from Python 3.12+. (6.157.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.157.0)
- Suggests subscripting generic aliases such as annotated_types.LowerCase when they are mistakenly passed as Annotated metadata. (6.157.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.157.0)
- Calling flatmap on a consumes() bundle no longer raises an error. (6.156.7) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.7)
- Fixes artifact downloads failing because of a colliding Authorization header. (6.156.6) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.6)
- Source distributions are now uploaded to PyPI, allowing developers to obtain the package in source-distribution form. (6.156.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.3)
- Fixes a KeyError when reading artifacts whose zip files contain no explicit directory entries, including zips produced by actions/upload-artifact. (6.156.2) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.156.2)
- Concurrent use of the same strategy instance no longer errors in rare cases due to a thread-safety bug. (6.155.7) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.7)
- Rewriting a dates filter no longer triggers a stray print(). (6.155.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.4)
- Hypothesis no longer emits a test_case observation when an alternative backend aborts an iteration with BackendCannotProceed before the test body runs, preventing spurious passed observations. (6.155.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.155.3)
- Fixes from_type() resolution to defer recursive forward references eagerly, avoiding recursion-limit failures and using a small, constant amount of stack. (6.154.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.154.1)
- The report now accounts for the Phase.explain phase separately instead of including its runtime and test cases in the Phase.shrink phase. (6.153.6) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.6)
- fuzz_one_input now tracks interesting_origin, so the database saves the smallest example of each distinct failure and observability reports include the origin. (6.153.4) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.4)
- Fixes decimals() generating values outside min_value and max_value when those bounds have more fractional digits than places. (6.153.3) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.3)
- Fixes incorrect git patch files when a file does not have a trailing newline. (6.153.1) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.1)
- event()'s payload is now typed as accepting Any, matching its runtime behavior of accepting any string-coercible object. (6.153.0) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.153.0)
- from_type() now resolves recursive forward references by looking them up in the caller's namespace, including references inside type[...]. (6.152.11) — [release notes](https://github.com/HypothesisWorks/hypothesis/releases/tag/v6.152.11)
