v0.65.0
feder-cr/invisible_dotsv0.65.0Sep 14, 2026by github-actions[bot]
Upgrading?
AI Summary
This release focuses on stabilizing constants and reducing code duplication within the module. It fixes the `READ_TEXT` cap definition to prevent silent drift, consolidates the three-valued rule, and ensures the selector study and option count descriptions remain accurate.
Key Highlights
- Fixed `READ_TEXT` cap definition to read from the constant in `actions.py` instead of drifting.
- Consolidated the three-valued rule into a single `_asked` variable used by both resolvers.
- Updated selector study and option count descriptions with gates to prevent silent rule loss.
- Fixed `STEALTHFOX_NO_PROXY` veto logic to ensure correct proxy handling.
Full Release Notes
Three more copies, found by scanning for measured numbers written in more than one file rather than by reading. THE READ_TEXT CAP WAS WRITTEN THREE TIMES: DEFAULT_MAX_CHARS in actions.py, the default in browser_read_text's signature, and the digit in its description. Nothing read the signature back, so it could drift from the constant in silence and the tool would honour a number its own module did not declare. It reads the constant now. The digit in the prose STAYS, and a draft that deleted it was wrong. The reasoning was that the schema already publishes "default": 6000 so the sentence is a second copy - true, and not the whole story: test_the_two_readers_do_not_pretend_to_share_a_cap holds that this description declares its cap while browser_read_html declares it has none, because a reader shown one and not the other assumes symmetry, and the two differ by 34x on a large page. A number with a reason to be written twice gets a gate rather than a deletion, so the prose digit is now tied to the constant and cannot drift. THE SELECTOR STUDY AND THE OPTION COUNT WERE IN TWO PLACES EACH. 958 elements, 88% addressable and 48% unambiguous, two hundred option nodes: all of it also written in actions.py beside the code it explains. A measurement in two places is one that gets re-run once and updated once, and the copy left wrong is the one a model reads - out of the 1024 characters the description is cut at. The evidence stays in the module; the description keeps every rule those paragraphs carried, and a gate holds both halves so dropping the numbers cannot quietly drop a rule with them. THE THREE-VALUED RULE WAS SPELLED OUT IN BOTH RESOLVERS, in two different shapes, with the second one's docstring saying "same three-way rule as the profile" - a claim a reader had to go and verify, and one that stops being true the moment either is edited. It is `_asked` now, said once. AND A SURVIVING MUTATION FOUND A HOLE THAT WAS ALREADY THERE. Restricting the STEALTHFOX_NO_PROXY veto to the environment's own answer looked like a behaviour change and is not: the old code got the same result from the ORDER of two returns, the explicit branch returning before the veto was read. Dropping the guard changed nothing any test could see. That a caller's proxy beats the variable is now held by a test, which is the use of a known-bad input beyond judging the change: it finds what the suite never looked at. The published figures move with the descriptions, so fourteen pages carry 8,040 characters and 3,141 tokens now. Suite 638 green. Eight known-bad inputs: seven killed, one expected to survive and reported as such - rewriting the profile resolver back to its old spelling is an equivalent rewrite, and a gate that went red on it would be holding the shape rather than the behaviour.
Related Repositories
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
Interactive roadmaps, guides and other educational content to help developers grow in their careers.
Reverse engineer anything with agents, from app behavior down to native binaries.
The open source coding agent.
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.