v0.68.7

feder-cr/invisible_dotsv0.68.7Sep 18, 2026by github-actions[bot]

Upgrading?

AI Summary

This release fixes a critical click delivery bug caused by dependency conflicts with `invisible-playwright` and refactors version checking logic to ensure consistency. It raises the minimum dependency version to 0.22.1 and introduces documentation and tests to prevent version list rot.

Key Highlights

  • Fixes a click delivery bug where older versions of `invisible-playwright` caused retries or missed clicks.
  • Raises the minimum required version for `invisible-playwright` from 0.16.2 to 0.22.1.
  • Refactors version checking logic to read declarations instead of installed versions.
  • Adds `WHAT_THE_TOOLS_NEED` documentation and validation tests to maintain version list integrity.

Breaking Changes

  • Raises minimum requirement for `invisible-playwright` to version 0.22.1.
  • Changes version checking logic from installed versions to declared versions.

Full Release Notes

`invisible-playwright` is declared with `>=`, so somebody who already has an
older wheel installed updates this package and keeps whatever that wheel does.
Up to 0.22.0 that means a click is not delivered once: the driver read the hit
target again AFTER the event and turned what it found into a retry, so any
control that stops being hittable by its own effect got pressed again.

Measured on 0.22.0: a button that hides itself took 1068 clicks across 30
calls, and every call then reported failure; a toggle was flipped twice by one
call and reported success. That is a modal's close, a cookie banner's accept, a
menu item, a submit that becomes a spinner - most of what an agent clicks.

The floor moves from 0.16.2 to 0.22.1, and the reason joins the three already
written beside it, in the same form: a version here is the first release in
which the named behaviour is true.

And the reasons stop being a comment nobody reads. `WHAT_THE_TOOLS_NEED` lists
each floor with what breaks below it, and two tests hold it from both sides:
the declared floor may not be below any version in the list, and every version
in the list must be one the floor actually reached - so the list cannot rot
into a description of a past the declaration has moved on from.

It reads the DECLARATION, not what is installed. A test that asked the
interpreter which version is importable would pass on a machine where the
wrapper comes from a checkout and say nothing about what `pip install aihawk`
gives a user, which is the only thing a floor decides.

Three known-bad mutations killed: the floor back to 0.16.2, the floor below the
screencast one, and a reason naming a version the floor never reached.

Suite: 732 passed, 9 skipped. Lint, `invisible_core.english` and
`check_content.py` clean.

Related Repositories