Skip to content

RELEASE 2.0.0: version bump and changelog (merge LAST, then tag) - #53

Open
AminDhouib wants to merge 3 commits into
audit/release-integrationfrom
release/v2.0.0
Open

RELEASE 2.0.0: version bump and changelog (merge LAST, then tag)#53
AminDhouib wants to merge 3 commits into
audit/release-integrationfrom
release/v2.0.0

Conversation

@AminDhouib

Copy link
Copy Markdown
Member

The 2.0.0 version bump + CHANGELOG. Merge this last.

Human decision 2026-07-25: tag 2.0.0 now, at W5, rather than after W16 as
plan_RELEASE originally stated. The cost was stated and accepted. This PR makes that
decision honest rather than quiet — the changelog declares W6–W16 as not evidenced
instead of letting their absence read as a passing result.

Merge order (this PR is the last step before the tag)

#42 → #43 → #44 → #46 → #49 → #50      (the main line, bottom-up)
#45 → #47                               (the W4/stealth line)
#48                                     (W3 packaging, behind #46)
#52                                     (get_cookies, behind the above)
this PR                                 (version bump — LAST)

Do not merge #51. It is the staging integration branch, used only to give W5 one
tree to generate a contract from. Its content is the merge of the PRs above.

Then:

git tag v2.0.0 && git push origin v2.0.0

That runs the full three-OS gate at the tag SHA. Only if it is green does publish
download the gate-built artifact, re-check its SHA-256 against the build manifest, and
upload those exact bytes. It never rebuilds.

What changed here

File Change
pyproject.toml 1.2.02.0.0
README.md both install pins
RUNBOOK.md the status example output
CHANGELOG.md new

Deliberately left alone

  • singleton.py's <= 1.2.0 comments are historical statements about which released
    backends lack the version file. They are correct as written and must not be bumped.
  • tools/package_verify.py and tests/ use 1.2.0 as an illustrative sample version.
    Verified nothing binds the real package version — there is no importlib.metadata /
    __version__ assertion anywhere in src/ or tests/, and
    test_package_verify.py + test_singleton_version_aware.py pass (53/53).
  • smoke_mcp.py hardcodes "version":"1.2.0" and would have broken, but it is
    gitignored (untracked local helper), so it was fixed in the working copy only.

Scope

2.0.0 carries 85 commits since the untagged 1.2.0 — the whole audit campaign, not
just the recent release work.

The breaking change is the lead item

STEALTH_MCP_SESSION_STORAGE_CAP_GBSTEALTH_MCP_BROWSER_SESSION_STORAGE_CAP_GB
and --session-cap-gb--browser-session-cap-gb, with no back-compat alias.
Anyone setting either loses it silently on upgrade and reverts to the default. This
is the single most user-visible thing in the release, so it leads the changelog rather
than sitting in a register.

What 2.0.0 does and does not claim

Fixed, all shipping in every prior release and all invisible to the old in-process test
seam: browsers destroyed every ~2s over real stdio; list_tabs raising after any
close_tab; every navigation after a close_tab silently switching tabs and leaking
one; close_tab/switch_to_tab failing on rediscovered targets; the headless
HeadlessChrome User-Agent tell; catch-all network interception on every zero-hook
spawn.

Not claimed, stated explicitly in the changelog: macOS navigation (F-773 — neither
"works" nor "broken"; unreproduced outside hosted runners); headless
undetectability (F-774 blanks high-entropy client hints); the switch_to_tab storage
residual; any HTTP-transport claim; and every W6–W16 workstream, listed individually as
not evidenced.

A known flake exists in install-smoke (sdist Linux/X64) on Chrome cold-spawn. It may
block the tag run and need a re-run; it is recorded rather than papered over.

AminDhouib and others added 3 commits July 25, 2026 13:08
Human decision 2026-07-25: tag 2.0.0 now, at W5, rather than after W16 as
plan_RELEASE originally stated. The cost was stated and accepted; the changelog
therefore declares W6-W16 as NOT EVIDENCED rather than letting their absence
read as a passing result.

Bumped 1.2.0 -> 2.0.0 in pyproject.toml, the README install pins, and the
RUNBOOK example.

Left alone deliberately:
- singleton.py's "<= 1.2.0" comments are historical statements about which
  released backends lack the version file. They are correct as written.
- tools/package_verify.py and tests/ use 1.2.0 as an illustrative sample
  version; nothing binds the real package version (verified: no
  importlib.metadata/__version__ assertion anywhere in src/ or tests/).
- smoke_mcp.py is gitignored (untracked local helper); its version assertion
  was updated in the working copy only.

The major bump is required regardless of scope: STEALTH_MCP_SESSION_STORAGE_CAP_GB
-> STEALTH_MCP_BROWSER_SESSION_STORAGE_CAP_GB and --session-cap-gb ->
--browser-session-cap-gb ship with NO back-compat alias, so the old names lapse
silently on upgrade. That is the lead item in the changelog.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
W5's contract generator resolved to 94 served / 3 release-qualified, not 94
qualified. plan_RELEASE 2.5 disqualifies exactly the evidence the other 91 have:
a `.fn`-only call and the representative journey cannot satisfy a transport or
cross-OS success claim. Verified independently: `pytest -m transport
--collect-only` yields ONE node on this base. My earlier "the contract can claim
all 94" was wrong - I carried forward the get_cookies hard-block framing instead
of re-deriving the per-tool rule.

The changelog was silent on this. Stating it, and stating it in BOTH directions:
the 91 are covered end-to-end against real Chrome (set-equality tripwire, 94
covered / 0 exempt), they simply are not verified over the wire. Omitting it
would overclaim; reporting a bare "3 qualified" would read as "91 untested",
which is equally false.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e sdist

Found while dry-running the publish path for a v2.0.0 tag. The sdist was 15 MB
against a 192 KB wheel: 12.8 MB assets/ (demo media) + 2.8 MB audit/ (the
campaign's internal plans and findings). W3's install-smoke installs the sdist on
three runner cells, so the weight was paid on every gate run as well as by anyone
building from source.

Verified safe before changing anything: package_verify's `_check_sdist_members`
requires only pyproject.toml + README.md at the sdist root, and
`_check_package_data` requires the embedded/js files, which live under src/.
Neither excluded directory is structurally required. tests/ is kept deliberately
so a downstream packager can still run the suite from the sdist.

Measured locally, not assumed:
  sdist  15 MB  -> 592 KB   (25x)
  wheel  192 KB -> 192 KB   (unchanged)
  package_verify verify --expect-version v2.0.0 -> OK, before and after
  tests/test_package_verify.py + test_release_workflows.py -> 37 passed

Also confirms the tag/version agreement gate accepts the `v2.0.0` form, so that
failure mode cannot surface late in the tag run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant