v0.53.0

feder-cr/invisible_dotsv0.53.0Sep 14, 2026by github-actions[bot]

Upgrading?

AI Summary

This release simplifies the application lifecycle from a complex seven-step process into a streamlined architecture centered around `browser_open` and `Work.acting`. It consolidates browser state management and significantly reduces code complexity by removing legacy modules like `registry.py`.

Key Highlights

  • Simplified lifecycle architecture replacing the previous 7-step process.
  • Introduction of `browser_open` as the primary tool for browser initialization.
  • Implementation of a unified funnel (`Work.acting`) for tool execution and state checks.
  • Removal of `registry.py` (367 lines) and consolidation of test files.
  • New `browser_close` tool added to free the engine.

Breaking Changes

  • Removal of the legacy 7-step lifecycle (declare, wake, look, act, rebuild, remember, close).
  • Removal of the `registry.py` module entirely.
  • Removal of tab bookkeeping logic in `session.py` (ids, counter, active flag).
  • Removal of specific 'nothing running' sentence handling in the old lifecycle.

New Features

  • `browser_open` tool now handles browser initialization and profile reading.
  • `Work.acting` funnel handles browser state errors (not open, gone, closed) and page refusals.
  • `browser_close` tool added to free the engine.
  • Live pane updated to interpret 'not-open' sentences as idle state.

Full Release Notes

The lifecycle had seven steps - declare, wake, look, act, rebuild,
remember, close - because a command aimed at a browser that was not
running STARTED one, and an action whose browser had died REBUILT it and
ran the action again. Each was a place to be wrong, and both were. The
owner cut it on 2026-09-14. What is left:

- `browser_open` opens a browser and nothing else does. With no arguments
  `main` is the person this session already was: seed, exit and profile
  read from the file, which `browser_open` writes and which nothing else
  touches. Any argument is a decision and goes through the planner.
- Every other tool goes through one funnel, `Work.acting`. A browser that
  is not open answers `the main browser is not open. Call browser_open to
  open it.`; one that was open and died answers `the main browser is
  gone: it closed or crashed. Call browser_open to open it again; it
  comes back as the same person.` and is forgotten, so the next open
  starts clean. A closed target raised under an action is the same fact
  and the same sentence. A page that refuses passes through untouched.
- `browser_close` frees the engine and keeps who it was.
- The live pane reads the not-open sentence as idle and every other
  sentence as something to say.

What died with it: `registry.py` (367 lines - locks per key, refusals,
tab numbering across rebuilds, ensure/drop/declare/on_change/is_dead),
half of `work.py` (ready, looking, already_open, retrying, the pages
owed and seen, three sentences for "nothing running"), the tab
bookkeeping in `session.py` (ids, counter, active flag, close_page: a
browser drives one page, the newest live one of its context), and the
strip of other browsers in the page with its stylesheet, empty by
construction once nothing is "declared and not started". Nine test
files of the old lifecycle are one file of the new one.

The model's instructions open with it, and so does the system prompt.
Driven with the real model from this tree: asked to read a heading with
nothing open, it called browser_open first, then navigated. The page
loads with no script error and one screen.

Eight mutations, seven killed and one equivalent (remember called for the
helper writes nothing either way). Suite 584; engine tests 32 green on
firefox-30.

Related Repositories