Repository navigation
v0.24.0
Performance baselines on emulators and simulators: the frame metrics (
frame_time,slow_frames) vary a lot between runs of the same build there, even with the stable-metrics default. Gate with--perf-metrics memory,data(pluscpufor windows of 5 s or more) and keep frame metrics for physical devices in profile mode. In compare mode, windows that span an app restart are skipped.
Fixed
double tapandlong presson a covered target now warn liketap(#265): when something unrelated is on top at the target's point and the screen does not change, the step returns the same "covered by another widget" warning, which--fail-on-warningturns into a failure. They used to succeed silently against a target hidden by an overlay.probe device start --platform ios --name ...failed on a simulator that was already booted on Xcode versions that word the error "Unable to boot device in current state: Booted". It now treats that as success, like the older wording. Found by the browser UI suite.- Studio's device picker listed every device twice when two refreshes overlapped (start-up plus a click on refresh); only the newest refresh fills the list now. Found by the browser UI suite.
- Pricing page no longer advertises what does not exist: the pay-per-use card is now "Pay-per-use for AI agents: Planned" with no features listed, the Team card is labelled planned/not available yet (badge "Planned", "Planned features"), and the waitlist is a plain email link instead of a form with placeholder fields that collected nothing. The experimental
--payflag and thewalletconfig key stay but are described as experimental (the flag is hidden from--help). - JSON/HTML report metadata
probe_versionwas empty; it now carries the CLI version. - Go directive is
go 1.26.1in every module, matchinggo.work, so CI jobs that read the version fromgo.mod(CodeQL) install the toolchain the workspace needs. - CPU was reported as
0.0when the sampler had no usable interval (one sample, or a counter that went backwards after an app restart). It is now unavailable and skipped by comparisons. - A zero or negative baseline made the comparison meaningless (
+0%on a failing test). It now compares the absolute change against the noise floor and prints the real delta. - A measuring window that spans an app restart warns, is marked
window_spans_restartin the report and is not compared with the baseline. start measuringwith no app connected says "no app is connected ... open the app first" instead of blaming the agent version.- A measuring window that contains a relaunch of the app no longer reports zero memory and zero frames. The agent-side window is re-opened on the new process after
restart the app,clear app dataand the other steps that relaunch the process (a plainopen the appthat only brings the app to the front is not a restart), so memory and frames cover the time since the relaunch. Such a window is markedwindow_spans_restart, and--perf-update-baselineleaves it (and any window with no memory and no frames) out of the baseline, with a warning, instead of writing zeros. - A
start measuringwithout a name is reported asmeasurement, so its baseline key no longer ends in an empty name.
Changed
- License keys use format FP2 (
FP2.<kid>.<payload>.<signature>): the Ed25519 signature covers the exact textFP2.<kid>.<payload>, so the key id and the format tag are signed. The CLI verifies in a fixed order (shape, key id lookup, signature, claims, expiry), against a built-in trusted key set and a revoked key id list. A key signed with an unknown key id asks to update the CLI, a revoked one says so,seatsmust be at least 1 (0 is rejected), claims needv: 2, akidequal to the key's, at least one plan and an expiry after the issue time. The old FP1 format is dropped and reported as an old format. The built-in key set is empty in this change;PROBE_LICENSE_PUBKEY(nowkid=publicKey[,kid=publicKey]) still adds keys for development and tests. A shared test vector is checked in the unit tests. - Baseline comparison gates only stable metrics by default (
memory,cpu,slow_frames,frame_time,data).memory_growth,cpu_peakandframe_maxare single-sample extremes that differ a lot between two runs of the same build (a rerun of 106 unchanged tests failed 47 of them); they are still recorded and shown, and gate again with--perf-metrics allor by name.cpuis compared only for windows of 5 s or more. New flags--perf-metrics,--perf-ignore,probe perf compare --metrics. - Baseline keys are relative to the current directory (or
--perf-key-base DIR), so the same tests match from another checkout; keys written by earlier versions are still found, and the run says how many measurements had no baseline entry.
Security
- Dependency updates for the open Dependabot alerts: website (astro 7.2.8+, sharp, devalue, svgo, js-yaml, smol-toml, ...), VS Code extension (
@vscode/vsce4, fast-uri, undici, ...) and Studio (labstack/echo4.15.3, source-map-js). All are build-time or dev-server dependencies; none is part of the CLI or the Dart agent. Ten moderate alerts remain in the docs site's Starlight/expressive-code chain, whose only suggested fix is a downgrade. - Studio headless mode refuses
Sec-Fetch-Site: cross-siteandsame-siterequests, on top of the existing loopback, Host and Origin checks. Test-only server; non-browser clients are unaffected.
Added
- Compatibility policy for 1.x (docs): what is frozen (ProbeScript grammar,
probe.yaml, the agent protocol, report JSON), what is additive-only, what is outside the promise (Studio, experimental features, human-readable output) and the deprecation process. - Studio UI E2E in a browser (
make studio-e2e-web,studio/e2e-web/): the real frontend and Go backend, served by Studio's new headless mode (PROBE_STUDIO_HEADLESS=1, test-only, loopback, per-launch token) and driven by Playwright in headless Chromium: no native window, cursor or focus. 9 tests need no device and run on any CI runner (.github/workflows/studio-e2e-web.yml); 9 more use a named simulator running the fixture app (scripts/studio-e2e-web.sh, macOS). The native-window suite remains for what needs a real window. - Studio automation endpoint (opt-in
PROBE_STUDIO_AUTOMATION=1; confined to the workspace a person opened plusPROBE_STUDIO_AUTOMATION_ROOTS, symlinks resolved; the MCP client only talks to loopback): loopback-only control endpoint with a per-launch token and a 0600 discovery file, exposing open_workspace, connect, run_file (async), cancel, run_state, results, screenshot and more, so Studio can be driven without a window, cursor or focus. Refuses requests from browsers, non-loopback hosts and without the token. - MCP tools
studio_open_workspace,studio_list_devices,studio_connect,studio_run_file,studio_cancel,studio_run_state,studio_results,studio_screenshotdrive a running Studio through that endpoint. - Studio tracks the current/last run (step, step history, results) for
RunState;RunFileAsyncstarts a run in the background. - Studio: live step highlight. While a file runs, the editor's gutter follows the executing step (▶, then ✓ / ✗ / – stays on the line; a failed line keeps its error on hover), step rows nest under each test in the results timeline with line, duration and attempt (click one to jump to its line), the toolbar shows
step N of M, and a Cancel button stops the run. Backed by a new runner hook,Runner.OnStep/Executor.OnStep, that emits aStepEventbefore and after every step (including recipe bodies and composite devices). - Website: draft pages for terms of service, privacy policy, refund and cancellation policy and contact (
/terms,/privacy,/refunds,/contact), linked from the footers and the pricing page. Marked "draft for review" until confirmed. probe license activate <key>/probe license status: stores and verifies an offline ed25519-signed license key in~/.flutterprobe/license.key. Only hosted features will ever need one; everything that runs locally stays free and works without a key.- Release pipeline: canary channel (
vX.Y.Z-next.Ntags publishprobe@nexton Homebrew and pre-release Dart packages), a dogfood gate workflow, an automated review-agent check on pull requests, and auto-rollback of a stable release when aprod-incidentis filed within 24 hours.scripts/release.shaccepts canary versions. Seedocs/ops/release-pipeline.md. - Studio E2E suite (
make studio-e2e,studio/e2e/): drives the real Studio window on macOS through the accessibility tree and screenshots — launch, device picker, connect, run, results, failures, performance lines, recorder, settings, AI-chat and WiFi overlays, error paths — against a new fixture app (native-test-apps/studio-fixture/). Optional vision assertions viaSTUDIO_E2E_AI_PROVIDER. Parameterised for dogfooding on any app (studio/e2e/DOGFOOD.md); self-hosted macOS workflowstudio-e2e.yml. --measure-all(andperf: {measure_all: true}in probe.yaml): a measuring window named after the test around every test body, so an existing suite gets performance baselines with no script edits. Tests that usestart measuringthemselves are left alone.
Security
- Review-agent workflow: reviews only same-repository branches from owners, members and collaborators, and fails (never skips) for anything else, since a skipped required check counts as passing; the model gets no tools and one prompt (conventions from the trusted base commit plus the diff between random markers, declared untrusted), so it cannot read files or the environment; nothing PR-controlled reaches a shell through
${{ }}; the verdict counts only as the exact first line of the reply; an approval is bound to the reviewed commit; a branch behind the current tip of its base fails both before the review and again just before it is submitted; credential-shaped strings in the diff fail the check before any model sees it; the CLI version and actions are pinned. NewREVIEW_PROVIDERvariable (oauthdefault,anthropic, orlocalas a never-approving pre-screen). - Dogfood-gate workflow: the
versioninput is validated againstX.Y.Z[-next.N]before it is used in paths, download URLs or issue titles.
Fixed
- License keys have exactly one valid spelling: the verifier now decodes base64url strictly, so a key re-spelled with non-zero trailing bits is rejected instead of verifying as an alias (not a forgery: the signed bytes were unchanged). The tamper test is deterministic; it failed about once in a few hundred runs before.
- Studio reads
probe.yamlfrom the open workspace (agent port, timeout, device ids) when connecting; it used to read the process working directory.PROBE_STUDIO_WORKSPACE=/pathopens a workspace at launch. - Studio file-browser rows and result rows carry accessible names (
role=button,pass:/fail:labels).
Docs
- Installation: "Try a canary build" covers
brew install AlphaWaveSystems/tap/probe@next, the pre-release binaries and taking the agent from the tagged source (git dependency) because canaries are not published to pub.dev. - Performance guide: what the numbers mean on simulators and emulators (every frame is "slow" in a debug build), what memory is, and that network assertions see
dart:iotraffic only.