Repository navigation
Release 1.3.0: version bump, pins, changelog section - #89
austinintelligence wants to merge 203 commits into
Conversation
…t.rs - Budgets (formatted lines): Rust 8,650, Java 4,100, automation 2,350, authored 19,100. Rust and authored were within 31 and 38 lines of the old caps, so nearly every 1.3.0 PR would have failed xtask check. - file_bytes errors on a missing artifact instead of measuring 0. - The stale-version check flags only standalone versions (v2, v3.1), not words that contain one (dev2, v2ray). - golden-capture needs --reviewed and refuses rows that look like an email address, phone number, or card number. - The Markdown link check runs once instead of once per required doc. - Screen presentation moves out of agent.rs (851 lines, near the 900-line cap) into present.rs; no behavior change. Tests: a_missing_artifact_fails_instead_of_measuring_zero, budgets_allow_the_one_three_limits_and_name_what_is_over, only_version_shaped_markers_are_stale, captures_refuse_rows_that_look_personal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
`au uninstall --dry-run` used to uninstall. The flags were never read, so the dry run removed the helper and local state, and unknown flags were silently ignored. - `--dry-run` only lists what would be removed: the helper on the enrolled device and each local item that exists. Nothing is changed. - Unknown flags on `au uninstall` and `au uninstall AGENT` exit non-zero and name the flag and the valid ones. - A real uninstall takes the state lock first and refuses with a message to stop `au serve` if it is running. Tests: computer/tests/uninstall.rs runs the binary against a private state folder and a fake adb. Before this change four tests fail (the dry run removes state, and unknown flags and a held lock do not stop the uninstall); after it all four pass. Claude-Session: https://claude.ai/code/session_012icJ5Ajeey87ED2rdrxsic
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NgoMJVZqFc4yfZur53EN2X
Promote the foreground service (mediaProjection) before getting the projection, register its callback before creating the virtual display, and clear the single-use consent token after use on API 34+. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019W9EXiawviZK7Nj8A3ycnp
Host state folders are 0700 and files 0600 on macOS and Linux, created that way through one private_file/atomic path; existing entries owned by the current user are tightened at startup and others warn. Artifacts older than 7 days are deleted. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4YSrBkjtUfR2ZABGLaifv
After an action, poll the helper's status generation every 40 ms and read rows only when it moves, up to the old 1.5 s cap, and give a tap that changed nothing 600 ms for a late change. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VBuuDWN89yt1W59QT8aHLo
…ts cleaned up Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhZN1bSNpFL8C6DjVFr92L
Skip re-parsing the journal when the lock-file write counter and the journal length are unchanged since this process last loaded or wrote it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sk1x4anW8FP9TEQhMwhwr7
The launcher exits 1 on a missing manifest, a missing platform entry, or a checksum mismatch, warns on every AU_BIN use, and forwards SIGINT/SIGTERM/SIGHUP to au. One manifest helper is shared by the launcher, staging, and publishing. au setup under an npx cache registers npx -y android-use@VERSION. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RM39rzqThy5R8BarCB7Zjk
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhZN1bSNpFL8C6DjVFr92L
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N3kbhQiDyKuSW9wfzCsrTk
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We2CZKximmKbza8X1VZV3y
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01469vDnhendwPanzMTvwSdP
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YAbe34cvkmUtsvXKH65Cq1
Declare and claim camera, microphone and location foreground-service types on Android 14+, reject all-zero audio, close a camera that opens after the capture timed out, finish location reads when a provider is disabled, and stop captures holding the UI lock. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019W9EXiawviZK7Nj8A3ycnp
.mcp.json launched android-use@1, so an agent ran whatever 1.x npm served next, including a compromised or broken latest. Pin it to the release in VERSION, and pin the npm commands and release-tag install URLs in the README and install docs to the same version. cargo xtask version now fails when any pin disagrees with VERSION, so the release bump updates all of them. A unit test covers a mismatched pin, and the release guide lists the pins. Fixes review findings #18 and #19. Claude-Session: https://claude.ai/code/session_017pXzZG674QvStUMcuyVgzy
… a version marker
Second-agent review found the personal-data scanner refused ordinary
screens with a date that was not at the start of a digit run
('(2026-10-15 12:30)', '12:30 2026-10-15', '15-10-2026 12:30'), and the
card check ran before the date exemption. Dates and times are now blanked
before digit runs are scanned. The stale-version check treats '_' as a
boundary again (android_use_v2 is flagged, as before A-01) and counts
non-ASCII letters as part of a word.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
…ection Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LiZMvjfmwYQAzM48E8GC6f
Adds a bounded dump of every accessibility window (status capability bit 3), a typed Rust reader, and a golden fixture shared by JUnit and Rust. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NeP2PsVVNwHx89gRVt2PVj
Events bump an atomic generation and the last-event time instead of taking the UI lock; a scene older than the generation is rebuilt on demand. The quiet window is configurable (AU_QUIET_MS, default 200) and benchmark-live can sweep it with BENCH_QUIET_MS. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VBuuDWN89yt1W59QT8aHLo
Only a missing config file is empty; other read errors and failed backups abort without writing. The file's mode is kept. Agent CLIs run by au are killed after 30 seconds, and a failed re-add restores the old entry. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4YSrBkjtUfR2ZABGLaifv
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NgoMJVZqFc4yfZur53EN2X
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4YSrBkjtUfR2ZABGLaifv
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S8TMw6nzvS1618R9FpjGJR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We2CZKximmKbza8X1VZV3y
…tically Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We2CZKximmKbza8X1VZV3y
`au serve --mcp` no longer ends on bad input. An oversized line gets a JSON-RPC error (-32600) and the rest of that line is discarded; invalid JSON gets -32700 with a null id; a batch or other non-object frame gets -32600, since batches are not supported. The loop then keeps reading. An operation journal over 2 MiB is moved aside once, with a warning, and a fresh journal starts. It keeps the pending records, so an uncertain operation still fences new mutations after the move. Owner sidecar files left by exited processes are removed on open. Their locks are OS-level and release when the process exits, so nothing blocked on them; the leftover file was the only stale artifact. Session-Claude: https://claude.ai/code/session_01W1JwFFSKf1pHM8HHSymzJV
1.3.0 merge train, step 5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
B-05 (already merged) and B-06 each added a do-nothing-if-already-set switch action (Set and Turn). Following B-06's own description of turn on|off as an alias, it now parses to B-05's Set, which also re-reads the switch after the tap. B-06's Turn variant and its second switch_state are dropped; B-05's switch_state also accepts a row copied from the screen (sw X=on). B-06's flow test is adapted (refusals are errors; added a positive turn on/off case on the switches fixture). The corpus test lists run notification action as INTENDED because A-19 added an optional action label. CHANGELOG updated. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 5. turn on|off is folded into B-05's set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
…rain present.rs: the fix suggestion for a switch miss uses AndroidAction::Set (set "X" on|off), since turn on|off was folded into set when B-06 merged. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
…rain Base retargeted from b-10 to friendly-dirac. device.rs keeps A-14's parse_key and A-11's bounded pipe readers plus both tests. protocol-golden.json takes friendly-dirac's object plus A-14's handshake vectors; shared keys are identical. Also drops a stale duplicate of the Lenient targets CHANGELOG line left by the B-07 union merge. AdbLink::helper's cached key is refreshed after a failed proof, so A-13's in-place upgrade still reconnects. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
Base retargeted from b-10 to friendly-dirac. agent.rs: AgentState keeps A-16's marked_in plus B-02/B-04's fields; the stale-handle check runs first in resolve_target_as, before B-06's screen-row fallback. agent_tests.rs: the fake helper reports the screen as its package (A-16) and keeps the dupes, switches, loading and late screens. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
Base retargeted from b-10 to friendly-dirac. AgentState keeps B-08's verified plus the merged fields; command_grammar.rs keeps both tests; agent-protocol.md keeps B-04's act-first line; protocol-golden.json takes friendly-dirac's object plus B-08's env vectors. link.rs: B-08's AdbLink::attach passes A-14's helper-key cache to the handshake. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
Base retargeted from b-10 to friendly-dirac. install.rs uses A-04's install(…, embedded) and B-09's start_helper(…, true). link.rs keeps A-13's upgrade-on-connect, then start_helper(…, false), so a reconnect does not resume a stopped helper. BridgeService.java keeps B-09's STOP action and A-18's held capture types. protocol-golden.json takes B-09's env reply, which has stopped. Gates and helper javac (with a stub R) pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
…erge train testing.md keeps B-10's FakeLink guidance with A-02's --locked. Gates, workflow-policy and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
…rain Base retargeted from a-02 to friendly-dirac. release.md keeps A-12's versionCode and pin paragraph, reworded for A-03 (the workflow signs with apksigner in an isolated job; AUBRIDGE_SIGNING_PROPERTIES is for local release builds), then A-03's signing isolation and owner setup. Gates, workflow-policy and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
… train Base retargeted from a-03 to friendly-dirac. policy.rs keeps A-03's hardened jobs() (lowercased and uncommented bodies, workflow-level secrets, artifact-only signing job, ready switch) and runs A-05's id-token and npm-publishing environment checks on every job before the signing-only checks. A-03's npm ci rule now allows exactly one form, a step that is only npm install --global npm@X.Y.Z (trusted publishing needs npm 11.5.1+), with a test. release.md: owner steps keep A-03's ready switch as step 5 and A-05's npm environment as step 6; Publish keeps A-03's release-window warning and A-05's automated npm job. Gates, workflow-policy and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
Base retargeted from a-03 to friendly-dirac. install.md: the pinned 1.2.0 commands (A-07) plus A-06's hardened script description, noting that the pinned commands set ANDROID_USE_VERSION. Gates, npm test, sh -n and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
Base retargeted from a-06 to friendly-dirac. testing.md keeps B-10's FakeLink guidance plus A-08's package-smoke paragraph. Gates, helper javac, and package-smoke.sh (linux-x64, debug au) pass locally. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
testing.md keeps B-12's bench-model section and B-09's extended emulator-e2e paragraph; the xtask usage line lists both workflow-policy (A-02) and bench-model. Gates and helper javac pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
1.3.0 merge train, step 8. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NZLaa2TojSgBwyk35cJjco
- VERSION, the workspace version, install/package.json, package-lock.json, install/cli.mjs, the plugin and marketplace manifests: 1.3.0. - Pins move to android-use@1.3.0 and the v1.3.0 install URLs (.mcp.json, README, install/README.md, the install and agent guides). - CHANGELOG: the Unreleased entries from the 34 merged PRs become one 1.3.0 section with a Highlights paragraph and the plan's behavior changes on top, one subsection per kind, the superseded first budget line and a stale "contains #63" note dropped. - docs/reference/agent-protocol.md was 55 bytes over its 2,800-byte budget on main (CI runs `xtask check`, not the docs budgets); trimmed three phrases so `cargo xtask docs` passes again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
…d8d2e) to keep this branch fast-forward Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
What changed
Step 1 ("Prepare") of releasing for 1.3.0. Main already carries all 34 1.3.0 PRs (#55 merge train, 48d8d2e).
VERSION, the workspaceCargo.toml(andCargo.lock),install/package.json,package-lock.json,install/cli.mjs, and the plugin and marketplace manifests. The helper'sversionCodefollowsVERSION: 1,003,000.android-use@1.3.0and thev1.3.0install URLs in.mcp.json, the README,install/README.md, and the install and agent guides.cargo xtask versionpasses.## 1.3.0 — 2026-10-15section.au uninstall;togglechecks that the switch flipped.cargo xtask release-notesrenders the section.docs/reference/agent-protocol.mdwas 2,855 bytes on main, over its 2,800 cap. CI runsxtask check, not the docs budgets, so it slipped through. I trimmed three phrases (now 2,785 bytes) with no change of meaning.The last commit is a
-s oursmerge of the old train head6766075. Its tree is identical tomain; it only keeps this branch fast-forward. Squash-merging this PR leaves one clean commit on main.Why
The 1.3.0 code is on main. This is the bump that the tag, the release workflow and npm publishing build from.
Safety and compatibility
adb, or page JavaScript; no command forms changed.Verification
cargo xtask version(version=1.3.0) andcargo xtask check. Source sizes: Rust 8,703 / 9,100, Java 4,382 / 4,700, automation 2,870 / 3,200, authored 21,389 / 22,800.cargo xtask docs: every docs budget passes, fixed tokens 388.cargo test --workspace --all-targets, all green.npm test(35 pass) andnpm run lint.cargo xtask verify: CI runs the helper job; no emulator here.Release impact
After this merges (owner)
main. It stops before signing.v*tag:v*tags;release-signing;AUBRIDGE_*secrets moved into environment scope;RELEASE_SIGNING_READYandNPM_ENV_READYset on the environments only;content query, the multi-window tree, keyguard preflight, the event flood, and notification actions.v1.3.0, then cutrelease/1.xfrom the tag.🤖 Generated with Claude Code
https://claude.ai/code/session_01UpnQk1aJW5mGv69LgiELm1
Generated by Claude Code
Summary by CodeRabbit
Release
Documentation