Commit 683a132
* docs(plan): Story 04 settle-engine TDD implementation plan (#385)
Amendments applied from the multi-LLM plan review (2026-07-04; Claude-Opus-only
— Gemini tier-locked, Antigravity timed out, Codex quota-paused — plus codex-pair
per-edit review):
- M1: device_fill corrective retypes opt out of settle (nativeSettle read-back
is their stability check; prevents up-to-5-settles-per-fill amplification)
- M2: device_fill pins @ref→coords once up front (--at-x/--at-y builder option)
so the pre-tap's settle ref-map refresh cannot retarget the fill
- S1: device_batch per-step settle budget capped at 2500ms
- S2: end-to-end wiring test gets _setActiveSessionForTest (no xcrun shelling)
- S3: Android settle probes use thin typed helpers with a pinned host port
(no per-poll startAndroidRunner ensure; endpoint assumption checked)
- C1-C5 + iOS activation-preamble rationale documented as accepted trade-offs
- codex-pair: capability sync-test regexes target the actual health payload;
settleTimeoutMs documented as budget knob (not opt-out); Number.isFinite pin
guard; literal NUL/SOH delimiters replaced with escapes; primary fill threads
settleOpts; Task 7 commit stages agent-device-wrapper.ts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(rn-fast-runner): isScreenStatic probe + SCREEN_STATIC capability (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(rn-android-runner): isWindowUpdating probe + WINDOW_UPDATE capability (#385)
Also hardens the Task-1 iOS surface per codex-pair review: lifecycle
classification moved to a free function (pure-logic testable without the
XCUITest harness), guard-let in the Swift surface pin, clamped timeoutMs
(0..2000ms) on the Android window gate, block-comment-aware source-sync
regexes. Both native targets compile-verified.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): snapshot-node normalization + SHA-256 hashing (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(settle): JSON-encode hash tuples (delimiter-collision proof) + bucket-boundary tests (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): capability-switched two-tier waitForSettle engine (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): runner-client probe verbs, capability caches, production probes (#385)
Capability caches are runner-lifetime-scoped (cleared on state teardown and
live-port probe failures, never by foreign-port probes); Android settle probes
are thin typed helpers that skip the per-dispatch ensure path and pin the
forwarded host port captured at probe-builder construction — a mid-settle
state change degrades to null rather than posting to the wrong runner.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): wire waitForSettle into runNative after every mutating verb (#385)
attachMeta generalizes attachMetaNote with timings_ms deep-merge;
settleAfterMutation is advisory by contract (never fails the action);
per-call settleTimeoutMs on device_press/device_fill (zod 500..30000,
engine re-clamps to SETTLE_MAX_BUDGET_MS as defense-in-depth); the iOS
health probe now routes through fetchImpl so the fetch test seam covers
it (found when the e2e wiring test's real-network probe classified the
fake runner stale and the reap SIGTERM'd the test process).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): device_fill settle-aware delay, coord pinning, retype settle opt-out (#385)
M2: refCenter resolved ONCE before the pre-tap; press + fill + retypes all
dispatch with --at-x/--at-y pins so the settle's ref-map refresh can never
retarget this fill (both arg builders gain the pin option, Number.isFinite
guarded). M1: corrective retypes pass settle:{enabled:false} — their
stability check is the existing nativeSettle CDP read-back. The B122
Pressable-resolution fallback keeps the same settle-aware delay. Fixed
FOCUS_DELAY_MS survives only as the no-settle fallback. Also hardens the
e2e wiring test with a disposable child pid (a reap regression can no
longer SIGTERM the test process).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(settle): device_batch settles between steps; per-step settle:false hatch (#385)
Batch steps use a 2500ms settle budget (a 10-step walk at the 6000ms
default could take ~60s on an animating screen); the inter-step delayMs
zod default(300) becomes optional so the settle-aware 0ms default can
engage — explicit delayMs still always wins.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* style: oxfmt normalization of story-04 settle files (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(settle): changeset + story status for Story 04 (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(settle): changeset bumps rn-dev-agent-cdp too; story text matches as-implemented behavior (#385)
Per codex-pair post-hoc review: bridge-touching changesets bump both
packages (convention: #422-424 batch); the story's fill/budget/impact
claims now state the settle-less 150ms fallback, the Story-05 deferral
of cross-tool budget carryover, and the native-verbs-only scope.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(settle): pin B122 Pressable-fallback fill coords; carry settle telemetry through verified-native path (#385)
Post-hoc Codex holistic review (IMPORTANT): the Pressable-resolution
fallback tapped the inner input with settle enabled, letting the settle's
ref-map refresh renumber positional refs before the fill re-resolved the
same @en — the exact retargeting hazard the primary path pins against.
Now pinned identically (tap by coords, fill with --at-x/--at-y +
settleOpts). Advisories: verified-native fill returns carry the primary
fill's meta.settle/timings_ms.settle instead of dropping them; settle-hash
documents the value/focused fallback-tier limitation; story acceptance
text now matches the documented settle-less fallback.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(settle): Pressable-fallback re-wrap preserves envelope meta; criterion names the Android clipboard sleep exception (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(settle): acceptance-criterion clipboard-sleep exception cites tracking issue #443 (#385)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 945d3cd commit 683a132
31 files changed
Lines changed: 3600 additions & 88 deletions
File tree
- .changeset
- docs
- stories
- superpowers/plans
- scripts
- cdp-bridge
- dist
- lifecycle
- runners
- tools
- src
- lifecycle
- runners
- tools
- test/unit
- rn-android-runner/app/src/androidTest/java/dev/lykhoyda/rndevagent/androidrunner
- rn-fast-runner/RnFastRunner/RnFastRunnerUITests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
45 | | - | |
46 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
58 | | - | |
| 58 | + | |
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| |||
0 commit comments