Releases: DevinoSolutions/stealth-chrome-devtools-mcp
Releases · DevinoSolutions/stealth-chrome-devtools-mcp
Release list
v2.0.9
Commits
- c0041be test(F-843): freeze the backend before the in-flight kill — the race was runner-speed
- e6b342f Release 2.0.9
- 112c1a5 Merge pull request #71 from DevinoSolutions/fix/2.0.9-batch
- 6b82187 docs: CHANGELOG entries for the 2.0.9 batch (F-842..F-845)
- 6ce62fb Merge branch 'fix/F844-F845-tab-state' into fix/2.0.9-batch
- de948a2 fix(F-844): get_instance_state was partial:true on every call
- 3eaa1c9 Merge branch 'fix/F843-fast-death-heal' into fix/2.0.9-batch
- 000e497 docs(F-843): the finding, and the map entry for the new discriminator
- b5c69fb test(F-843): pin the in-flight kill over the REAL transport
- 426a748 fix(F-845): close_tab re-points the active tab instead of leaving a dead one
- 9b6b5f3 fix(F-843): a bridge-first backend death must heal, not tear down
- b70f589 audit(F-842): file the python-client tree-kill finding — winner-session close kills the detached shared backend
v2.0.8
Pull Requests
- docs: make uv tool install the recommended install path (#69)
Commits
- 70a91a7 Release 2.0.8
- d2ba9b3 Merge PR #70: 2.0.8 batch — disconnect-killers + triage long tail (F-821–F-841)
- 5947088 test: stealth.* logger state is per-test — no test may starve a later caplog
- 31ad4b4 test(F-841): resilience suite may only delete a per-instance clone; F-831 cured the select_option no-op golden
- f893510 Merge branch 'fix/F827-proxy-sentry' into fix/2.0.8-batch
- 505bc6a fix(F-827): the proxy reports to Sentry — condemnations, heals, teardowns, evictions ship
- 13039b9 Merge branch 'fix/F833-navigation-truthfulness' into fix/2.0.8-batch
- 307f2ae fix(F-833): go_back/go_forward/reload_page/new_tab get navigate's truthfulness guard
- 9c16342 Merge branch 'fix/F835-failed-spawns-visible' into fix/2.0.8-batch
- 98970a8 fix(F-835): tool failures land in the debug ring — a spawn outage is no longer invisible
- 7c66754 test: fake send seam answers Runtime.evaluate the way Chrome does
- 179e071 Merge branch 'fix/F826-targeted-pii-redaction' into fix/2.0.8-batch
- c6a1c22 Merge branch 'fix/F821-F825-F836-small-fixes' into fix/2.0.8-batch
- 22964a9 Merge branch 'fix/F832-deep-serialization' into fix/2.0.8-batch
- b610d82 Merge branch 'fix/F831-xpath-dispatch' into fix/2.0.8-batch
- 22957a7 Merge branch 'fix/F824-F828-classifier-reach' into fix/2.0.8-batch
- 36b4cbc Merge branch 'fix/F823-surrogate-safe-returns' into fix/2.0.8-batch
- e44938c Merge branch 'fix/F822-F837-response-handling' into fix/2.0.8-batch
- 6133627 Merge branch 'fix/F834-per-attempt-clone-dirs' into fix/2.0.8-batch
- dc9c126 Merge branch 'fix/F830-F840-log-hygiene' into fix/2.0.8-batch
- 8b758ec Merge branch 'fix/F838-proxy-self-heal' into fix/2.0.8-batch
- a894a43 Merge branch 'fix/F839-ignore-sigbreak' into fix/2.0.8-batch
- 000556e Merge branch 'fix/F829-fingerprint-transient-oserror' into fix/2.0.8-batch
- f50a686 fix(F-831): XPath dispatch lives in element_resolution — advertised XPath works everywhere (fixes #15)
- 50f39b1 fix(F-836): environment validator stops recommending args the stealth filter strips
- 68a59aa fix(F-823): lone surrogates in page content no longer crash tool returns
- bc6939b docs(F-825): search_network_requests docstring names url_pattern
- a117f43 fix(F-821): set_cookie converts same_site to the CDP CookieSameSite enum
- a9d0c74 feat(F-838): proxy self-heals on a confirmed-dead backend — cold-start/adopt + re-bridge instead of exiting
- 07a3c39 fix(F-832): execute_script returns deep values via raw Runtime.evaluate return_by_value (fixes #17)
- c6ff72c fix(F-824,F-828): race classifier reaches the navigate path and matches code-less DOM errors
- 58b33e4 fix(F-830,F-840): boot-log rotation + access-log off; pruner keeps dead-backend post-mortems
- fae6823 fix(F-834): per-attempt retry clone dirs + cleanup ownership guard — concurrent spawns stop killing each other
- a2db959 fix(F-829): unreadable source fingerprint must not read as "source changed"
- f1c3bd6 fix(F-822,F-837): crash-proof token estimation + inline threshold below client ceiling
- 3931a3a fix(F-826): targeted PII redaction in Sentry exception values (emails, URL tokens, user paths)
- d43b488 fix(F-839): backend ignores SIGBREAK — session-scoped console events must not kill the shared backend
v2.0.7
Commits
- 1fd0e0f ci: bump gh-action-pypi-publish pin — old validator rejects Metadata-Version 2.5
- b48e309 Release 2.0.7
- dc81f2b Merge PR #68: F-820 — confirm before condemning: a busy backend is not a dead one
- a429bb7 fix(F-820): confirm before condemning — a busy backend is not a dead one
- a6203b8 Merge PR #66: F-819 — freeze the image's Chrome before reading its identity
- f23abf6 Merge main (2.0.7 + 2.0.8 batches + F-806 re-land) under the F-819 freeze
- 3c200ff Merge PR #67: F-806 re-land — masked-UA version skew, spawn-path CDP read bounded
- 2fa8a0b Merge PR #64: F-509/F-783/F-816/F-817/F-818 — 2.0.8 batch
- 2ddf892 ci: fresh gate run on the converged runner images before merge
- e1e6d87 Merge PR #63: F-812–F-815 — Sentry-driven fixes (2.0.7 batch)
- 4f0cac0 ci: final re-run — Linux cell red with an empty --version at resolve time
- cfbf7b9 ci: re-run — Windows pytest-null again (2-of-3 on identical trees)
- 78e5e4a ci: re-trigger after the Linux runner stall
- cd80c79 ci: re-trigger after the Linux runner stall
- 108bf8e ci: byte-identical re-run to arbitrate the Windows herd-scatter flake
- 8b33fa4 ci: byte-identical re-run to arbitrate the Windows pytest-null flake
- b17e6dc F-806: re-land the masked-UA version-skew fix, with its CDP read bounded
- 9379f40 F-819: freeze the image's Chrome before reading its identity
- 06356f7 ci: byte-identical re-run to arbitrate Windows pytest-null + macOS F-779
- 26fb2ec F-509: fall back when the default port is bind-forbidden, not just held
- e83860f F-783: the timeout and interaction paths join the one-error convention
- 998dfbe F-818: survive a target-less browser; type instance-not-found
- cea508e F-816: fold CDP wire-casing param names onto nodriver's snake_case
- 03c5849 F-817: recover from nodriver's handler-table race in selector resolution
- 6f5fbe1 F-812: re-point the integration specimen the hermetic sweep missed
- 7c14625 F-812, F-813: forgive the two commonest agent-authored call mistakes
- 4646ee0 F-815: drop expected ToolErrors from Sentry before send
- eba699a F-814: wrap extra-header dicts in CDP Headers; one spawn-failure prefix
- 14bef68 F-814: FakeTab.send stops swallowing CDP argument errors
v2.0.6
v2.0.5
Commits
- 8a8d34d Release 2.0.5
- 317f26f Merge PR #60: F-809 — a clean backend stop stops shipping ERROR noise (2.0.5)
- 567a579 F-809 fix round: guard both exits from main(), keep the interrupt frame
- fa2e47c F-809 fix round: make the handler install idempotent, ratchet the cap
- c0e5b2e F-809 fix round: turn an escaping Ctrl+C into a quiet exit 130
- 03b8424 F-809 N3: give uvicorn a positive graceful-shutdown timeout
- a92ac95 F-809: the e2e pin accepts -SIGTERM as well as exit 0
- e1834b4 F-809 N1+N2: hand the signal back instead of sys.exit-ing the loop
- 15692aa F-809 (RED): pin a clean backend stop against ERROR-level noise
- 32df5ca Merge PR #59: F-810 — headed spawns self-heal via desktop task delegation (2.0.5)
- a706bb8 F-810: close the remaining orphan path, and prove the pid before killing it
- 64c0297 F-810: doctor's remedy stops claiming headed spawns will fail when they won't
- 1bb66b5 F-810 review: quote for CreateProcess, derive argv from nodriver, no orphans
- aecb65c Merge pull request #58 from DevinoSolutions/ci/mute-sentry-install-smoke
- 9841a98 CI: stop install-smoke from shipping launch failures to Sentry
- 1b6ca9c F-810: document the amended ruling, and say why available() stays silent-free
- dd93cb7 F-810: the F-808 refusal becomes the fallback, and its message says so
- 23e2c50 F-810: delegate a headed launch to the user's desktop, then attach
- 5f387c1 Ratify the two F-808 cap raises per the human gate ruling 2026-08-02
- 891cc83 Merge PR #57: F-808 — a headed spawn is visible wherever the desktop is (2.0.4)
- 8674f6a Test runs no longer ship injected failures to the real Sentry
v2.0.4
Commits
- d9f8a9f Release 2.0.4
- 6d89754 2.0.4: the scrubber stays linear on hostile separator runs
- 5967dda 2.0.4: close the scrubber's residual leak paths
- 1fb45e9 2.0.4: scrub user-identifying data out of Sentry error events
- c1274a2 F-808 step 7d: quality-review fixes — the glossary goes back to name-only
- ad5935e F-808 step 7c: precision leftovers
- 4a36ef5 F-808 step 7b: spec-review accuracy fixes
- 546731a F-808 step 7: the docs describe a backend keyed by where a window can be seen
- 002b348 Merge F-808 test pre-work: capability regate, EnumWindows helper, integration twin
- 977566c F-808 step 10f: name the normalizer test class after the function it tests
- 3aea184 F-808 step 10e: stage-2 review fixes — contain the ownership check's raise
- 08002f3 F-808 step 8-pre: correct the double-exec comment — the second exec is unconditional
- 7d08c5d F-808 step 8-pre: review fixups — the kill net must survive a failing close
- 9c539d3 F-808 step 8-pre: ask the machine whether a headed spawn is really visible
- 22529ad F-808 step 10d: size the record lock for the critical section it now guards
- f4e58f3 F-808 step 10c: keep kill-orphans --force meaning what it says
- 3fe6b37 F-808 step 8-pre: gate F-804's headed nodes on display capability, not platform
- 38aa897 F-808 step 10b: a backend may only reap browsers nobody living owns
- f437cab F-808 step 10a: give browser_pids.json one home, and make every write merge
- d84323e F-808 step 6c: quality-review fixes — falsifiable remedy asserts, hermetic doctor tests
- 69e48ad F-808 step 6b: a recorded desktop backend only silences the remedy while it is alive
- 60e48da F-808 step 6: say that own_or_first_port's own-context branch no longer decides anything
- 172e014 F-808 step 6: doctor reports a backend per display context
- 58e7725 F-808 step 5c: the doomed_spawn fixture is all tripwires, as documented
- 29f02a0 Test runs no longer ship injected failures to the real Sentry
- d209b46 F-808 step 5b: pin the context token; state the cap raise honestly
- 2b22fe1 F-808 step 5: a headed spawn with no displayable desktop raises instead of returning a ghost
- 4e2ede3 F-808 step 4d: restart terminates only the port it is about to bind
- f02334c F-808 step 4c: a proven-capable client adopts only its own desktop
- 09433a0 F-808 step 4b: an unverified entry is never a port conflict
- 85f7fe6 F-808 step 4: discovery prefers a window-capable backend
- 62d4813 F-808 step 3c: quality fixes for the registry
- 32b3185 F-808 step 3b: a v2 write supersedes the v1 entry on its port
- 7989dee F-808 step 3: server.json records one backend per display context, v1 records still readable
- 663da1a F-808 step 2b: quality fixes for backend_registry
- efed9d0 F-808 step 2: move the backend record out of singleton.py
- 8a78561 F-808 step 1b: quality fixes for display_context
- a1b3075 F-808 step 1: display_context, the one home for "can a window be seen here"
- 215b66c plan_F808: headed browsing works wherever a desktop exists
- 0fbb7bd F-808: a headed spawn is invisible when the backend was cold-started from a non-interactive session
- 4673e62 Record the Windows startup-herd hang evidence (feeds F-509)
v2.0.3
Pull Requests
Commits
- b628b61 Reduce 2.0.3 to the config fix; defer F-806 to 2.0.4
- a0481fb Revert the proxy fail-fast merge out of 2.0.3 (defer to 2.0.4)
- 67b7f28 Release 2.0.3: the shared backend stops absorbing the host project's config
- ca63b77 Merge fix/ua-version-skew: F-806 masked-UA version skew
- 43767f4 issue #56: a backend that dies at startup fails fast and says why
- b863878 F-806 round 2: the Windows version probe reads the binary, not the directory beside it
- 39927a0 F-806: re-key the browser-version memo on binary identity and reconcile against the launched browser
v2.0.2
Commits
- af0eec8 Herd gate: bound the warm join by the client's 30s connect timeout, not by workstation hardware
- ff16de3 Herd gate: count backends by their own boot logs, not by a psutil census CI cannot see
- 7b81db4 Docs: singleton cold-start hardening + startup-herd scale claims (2.0.2)
- 0812716 Release 2.0.2: F-807 cold-start lock hardening + 40-session startup herd gate
- 608d1bb F-807: the cold-start lock can no longer kill a healthy backend + 40-session herd gate
v2.0.1
Commits
- e1ec825 Gate red on v2.0.1: the two headed window-sizing nodes need a desktop
- 7bb5bcf Release 2.0.1: five stability fixes (F-790, F-795, F-802, F-803, F-804), soak coverage, F-805 characterized
- f51afd1 Changelog: complete the 2.0.1 section (F-790, F-802, F-795, F-803, F-804, soak/F-805) and restore the 2.0.0 heading a parallel edit clobbered
- 161e1ad Merge fix/headed-viewport: truthful window-size reporting (requested vs measured, clamped flag) via one-home window_sizing.py (F-804)
- 3f68ecd F-804: measure the spawned window instead of echoing the request back
- 967c87f Merge test/soak-stability: 62-op real-transport soak journey with per-op deadlines; F-805 characterized (missing selector ignores caller timeout)
- 0b0a646 Add the real-Chrome SOAK stability gate: one instance, ~60 bounded operations
- f5ff813 Merge fix/truthful-success-flags: navigate raises on chrome-error final URL (F-802), execute_script raises on script exception (F-795)
- 5ec41d2 Merge fix/F-790-roots-list-hang: bound the spawn_browser roots/list await (STEALTH_MCP_CLIENT_ROOTS_TIMEOUT_SECONDS, default 5s)
- 1c4bb5c Truthful success flags: navigate and execute_script raise when the browser failed (F-802, F-795)
- 3ec51b7 F-790: bound the roots/list round trip on the auto-clone spawn path
- 327746d Merge fix/network-capture-resource-type: populate resource_type from CDP type_, working filter_type, internal-URL noise exclusion (F-803)
- fd0a495 F-803: network capture returns untyped rows full of browser noise
- 02b65bb F-801 is a race, not an invariant: drop strict from the Linux xfail
- e535a3f Apply the same ownership filter to run_release_gate_journey teardown
- 2c15a95 Merge fix: Linux gate red -> F-801 characterization + truthful MQ-160 + harness ownership filter
- 1dae7e7 Scope the Linux integration red to F-801 instead of leaving the gate broken
- 031decf CI arbitration: re-run the gate on a byte-identical tree (integration Linux/X64 red on c95b16c)
- c95b16c Fix stale W10 finding ids in the reservation note (F-782/F-783 -> F-788/F-789)
- 4a65789 Merge W13: wire concurrency, cancellation, and interoperability (MQ-138/139/140/142/144 satisfied; 141/143 planned behind F-790..F-795)
- 29e518b Merge W16: stateful/PWA and internationalized site shapes (MQ-155/156/158/159/160/161/162 satisfied; 157 planned behind F-800)
- e95dbfb RELEASE-13 W13: what the product does on the wire, and where it does not
- c44f0e5 RELEASE-16: deterministic PWA state and internationalized interaction coverage
- ff5de34 Renumber W10 findings F-781..783 -> F-787..789 (parallel-mint collision with W15)
- a9f115d Merge W15: observability on failure (MQ-151/154 satisfied; 150/152/153 planned; no canary disclosure)
- 517d6fb Merge W10: resilience / fault-injection (MQ-127/129 satisfied; 126/128 planned behind routed findings)
- 694ea27 RELEASE-10 W10: inject the four dynamic faults, and report what they found
- 02c5bd2 RELEASE-15 W15: what a failure tells you, and what it costs to be told
v2.0.0
Pull Requests
- perf: fix startup disconnects, slow teardown, and bloated profile clone (#11)
- feat: add stealth-chrome-devtools ops CLI (cleanup, profiles, status, doctor, serve) (#12)
Commits
- e65c5d6 W11 fix: screen doc-example paths under BOTH path conventions
- b5ae81e Merge W12: security-boundary evidence (negative tests + contract security section)
- 2fa0c97 Merge W11: docs-as-tests (README/RUNBOOK examples executed, not trusted)
- addedaa Merge W7: eight deterministic dynamic-site shapes (MQ-114..121) with ledger binding
- 3501909 Merge W6: canary repro lane (soak-lane absence declared, not faked)
- a3a54c4 RELEASE-7 W7: make the MQ->node map, and MQ-116's split, explicit
- a8dc471 RELEASE-7 W7: emit MQ-114..121 into the evidence ledger, not just the prose
- 2f6e813 RELEASE-5: stop chasing the F-779 percentage; state the durable claim
- 3be448b RELEASE-5: name a probable mechanism for F-779 instead of shrugging at it
- a0addc8 RELEASE-7 W7: drop a duplicate MQ-119 body re-read (flake risk, no coverage)
- e0c0654 RELEASE-12: say where the section-6 evidence actually runs
- bec2a51 RELEASE-7 W7: eight deterministic site shapes (MQ-114…121)
- 7a3f546 RELEASE-5: F-779 reproduced on a docs-only commit — correct the rate (2/6)
- db8a060 RELEASE-12: security and filesystem trust-boundary gate
- 5f5582e RELEASE-11: executable docs reuse the release evidence source
- 7c65374 RELEASE-5: explain the three red PRs that look like a FIX-B regression (F-780)
- 68cdd7f RELEASE-6: read-only scheduled observation and local fixture repro metadata
- a97c970 RELEASE 2.0.0: sync uv.lock to the version pyproject already declares
- 2e7cd33 RELEASE-5: record the macOS gate flake the 2.0.0 re-run exposed (F-779)
- 6a8fa79 RELEASE-5: re-run the gate to arbitrate the macOS teardown flake
- d13997e RELEASE-5: regenerate the contract at 2.0.0
- 30700bb RELEASE-5: generate the contract at 2.0.0, the version it actually describes
- 5c2505a RELEASE-5: merge the 2.0.0 version bump into the W5 contract line
- 5028d66 RELEASE-5 W5: record the Linux cold-spawn flake where it actually landed
- b8fabad RELEASE integration: back off between cold-start warmup attempts
- 5bc09e9 RELEASE-5 W5: fix the PRODUCER of the node ids, and stop "unqualified" reading as "untested"
- be115b8 RELEASE 2.0.0: stop shipping 14 MB of demo media and audit docs in the sdist
- bece37f RELEASE 2.0.0: record the per-tool verification depth honestly
- 05e1a6b RELEASE-5 W5: a drift failure prints the diff, not just the word "stale"
- 57609e3 RELEASE-5 W5: claim the cookie tools, and write the contract as a SHIPPING one
- 6fcaaa0 RELEASE 2.0.0: version bump and changelog
- 5a4bb11 RELEASE-5 W5: qualify the cookie round trip, and say what that costs
- bf6b640 RELEASE-5 W5: take the get_cookies transport success path (PR #52)
- c674fe5 RELEASE-5: generated qualified release contract and tool evidence ledger
- eaa574e RELEASE W5-prep: real-transport get_cookies success path
- ff35ae3 RELEASE integration: make offline-stealth a real lane, not an empty one
- aa40384 RELEASE integration: merge the W4/FIX-D stealth line
- ff3c8b7 RELEASE integration: merge W3 packaging line into the FIX-E/F line
- c2b94ae RELEASE-FIX-F: the swallowed half of the F-771 tab family (F-775)
- 080d16d RELEASE-FIX-F F0: RED-first pins for F-775 (the swallowed F-771 siblings)
- 295c8de RELEASE-3 W3: pin the release topology so publish cannot silently regress
- 6c619ab RELEASE-FIX-D D1-D3: mask the headless User-Agent (F-770), and record F-774
- 2dacc05 RELEASE-3 W3: macOS install-smoke is a DECLARED PARTIAL cell (F-773)
- 0b90124 RELEASE-FIX-D D0b: warm Chrome before the isolated stealth lane
- 6620252 RELEASE-FIX-E: list_tabs survives tab rediscovery (F-771)
- 2e589b7 RELEASE-3 W3: build once, gate those exact files, publish those exact files
- 127dc9c RELEASE-3 W3: the one home for artifact facts + exact-artifact install smoke
- f8e9bce RELEASE-FIX-D D0: measure all four F-770 User-Agent leak vectors
- d57eac7 RELEASE-FIX-E E0: RED-first pins for F-771 (list_tabs after close_tab)
- 95ddb75 RELEASE-2 W2: route F-773 and land macOS transport as a DECLARED gap
- ff9339d RELEASE-2 W2: instrument the macOS stall (Chrome's own log + live process tree)
- 52ac985 RELEASE-2 W2: run the gate workspace under RUNNER_TEMP on CI (macOS single-variable test)
- d5348d6 RELEASE-FIX-C C2: hermetic pins for the F-772 interception-arming contract
- c58f51c RELEASE-FIX-C C1: never enable Fetch with nothing to intercept (F-772)
- 57d3001 RELEASE-FIX-C: plan for F-772 (catch-all Fetch interception hangs macOS navigation)
- 27df5e3 RELEASE-2 W2: separate paused-Fetch from unreachable-port; back off the cold-launch retry
- 6dc8f78 RELEASE-2 W2: probe about:blank vs http to isolate the macOS navigate stall
- 4231dd5 RELEASE-2 W2: record fixture-server hits; drop the flag the product strips
- 38f16c2 RELEASE-2 W2: pin F-771 (list_tabs after close_tab), dump backend logs on failure
- 1f1c727 RELEASE-2 W2: warm the page load too, retry the cold launch, mock-keychain on macOS
- b0e9444 RELEASE-2 W2: absorb macOS Chrome cold start in the journey harness (test-side only)
- c2b3088 RELEASE-4: acceptance-complete offline stealth probe plus informational detectors (G-D)
- c56de0b RELEASE-2 W2: fix two defects the first three-OS run exposed (test-side only)
- f5a2b1b RELEASE-2 W2: move session-root env to step level (runner context invalid at job level)
- 0ec4393 RELEASE-2: required Ubuntu-x64 Windows-x64 macOS-arm64 release gate (G-B)
- 8ec46ef RELEASE-2 W2: runner/Chrome resolvers + per-OS lifecycle & identity evidence
- 11dc582 RELEASE-FIX-B: flip plan status to EXECUTED (C1 f81ff8f, C2 585ebf2)
- 585ebf2 RELEASE-FIX-B C2 (B1): flip the W1 transport xfail — journey green over real stdio
- f81ff8f RELEASE-FIX-B C1 (B1): make app_lifespan session-reentrant; bind teardown to process end
- 6592efe RELEASE-1 W1: land plan_RELEASE_FIX_B (finding B1 triage + fix design)
- d32a268 RELEASE-1 W1: real-stdio release-gate harness + transport E2E (catches B1)
- 4a47d0c RELEASE-1: flip plan_RELEASE status to GO (Phase-0 re-proven at 83afe42)
- 83afe42 Merge pull request #41 from DevinoSolutions/audit/release-fix-a
- b532b1b RELEASE-FIX-A C8 (A12): pin proxy creds not percent-decoded (fix owned by W-B3)
- d35fbfa RELEASE-FIX-A C7 (A11): tz-aware UTC defaults for BrowserInstance timestamps
- 74b297f RELEASE-FIX-A C6 (A4): wire the real JS->Python bindingCalled round-trip
- c326f19 RELEASE-FIX-A C5 (A7): bound close_instance Phase-2 tab close
- 76eef80 RELEASE-FIX-A C4 (A3): docs — DESIGN §6 request-store bounding
- ee53b4d RELEASE-FIX-A C4 (A3): bound retained request count + post_data bytes
- f3acd9e RELEASE-FIX-A C3 (A6): JSON-encode the $SELECTOR placeholder at the substitution site
- 96519b9 RELEASE-FIX-A C2 (A5): bind matched_styles for pseudo/inheritance-only styles calls
- 7d5315b RELEASE-FIX-A C1 (A1): route query_elements/get_page_content select_all through recovery; stop swallowing -32000 into []
- f20ec5b RELEASE-FIX-A: land Tier-A fix plan + final-review triage
- 484e143 Merge pull request #40 from DevinoSolutions/audit/release-plan-landing
- 5ba6a76 Land plan_RELEASE (E2E-9) + MANUAL_QA_PROTOCOL on main
- 6b41c63 Merge pull request #39 from DevinoSolutions/audit/fixes-2026-07-02-m14
- f0554ef M14-S8: doc-claim accuracy harness + validation-driven doc fixes
- 2b81a67 M14-S7: retire stale point-in-time docs to audit/history/
- a8b4c52 M14-S6: README repair — A1 renames, tool-count=94 provenance, venv-test caveat, doc links
- 12eb09e M14-S5b: Touch 2 (F-741 A1 X-HARD) — rename colliding CLI 'session' labels + env var
- 72edc3d M14-S5: Touch 1 (F-108) — derive tool counts from SECTION_TOOLS (option a)
- 0ce7db8 M14-S4: CONTRIBUTING.md — clone/install/test + the REAL quality gate
- e04f696 M14-S3: RUNBOOK.md — operator playbooks (verbs, logs, recovery, MCP smoke path)
- 74d7279 M14-S2: CLAUDE.md — agent navigation map, glossary, conventions, tool-count provenance
- 1c94dc2 M14-S1: DESIGN.md — architecture invariants, rationale, known-debt ledger
- b80bd59 Merge pull request #38 from DevinoSolutions/audit/fixes-2026-07-02-m5b
- 650e728 M5b-6: update progressive-tier E2E for the fix (was @characterization of broken)
- b15d3c7 M5b-5: delete element_cloner.py; re-point last 2 tools; F-744 docstrings
- 31bb07d M5b-4b: collapse the 8 _to_file methods to one _extract_and_save (F-141)
- 0d0a1e2 M5b-4a: re-point file_based at the canonical engine + delete comprehensive
- 0d95d6e M5b-3b: re-point clone_element_progressive at the canonical engine (F-143)
- bcde88d M5b-3a: re-point clone_element_complete at the canonical engine
- d67a26e M5b-2: re-point the 5 aspect tools + extract_complete_element_cdp at the engine
- fa224fc M5b-1: build canonical extraction engine surface in CDPElementCloner (additive)
- ac89b81 Merge PR #35: M4-Ph1+A1 server.py decomposition (C1-C5) + nodriver -32000 race fix
- 6ab8962 fix: recover from nodriver -32000 stale-document race in selector resolution
- c03b2fe Merge remote-tracking branch 'origin/main' into audit/fixes-2026-07-02-m4ph1
- 69658ae M4-Ph1: grandfather browser_manager.py at 1532 (C4 spawn_browser seam)
- 1317aa2 M4-Ph1 C5 _with_cdp_timeout canonical (F-164 server half): one CDP-timeout wrapper, enforced
- d2ee1bf M4-Ph1 C4 spawn_browser sub-method pipeline (M13/F-208): testable seam, no behavior change
- 49126ce audit(stage-3): C3b landed (1112dd1) — F-104 CLOSED via human "convert both" ruling; C3a (c52da3c) recorded
- 1112dd1 M4-Ph1 C3b operation-specific error sweep (F-104 full closure): one raise-ToolError convention, no second way
- c52da3c M4-Ph1 C3a tool_errors.py + _require_tab/_require_browser + F-761 instance-not-found cluster (F-761/F-746; F-104 mechanical half)
- 22dd035 audit(stage-3): record C1 landed (2807b41) + C2 idempotency decision (4c0b69e), flagged for merge-gate
- 4c0b69e M4-Ph1 C2 formalize tool_registry.py (F-101/F-505/F-612): one registration + section-gating mechan...