diff --git a/docs/development/action-space.md b/docs/development/action-space.md new file mode 100644 index 0000000..79968be --- /dev/null +++ b/docs/development/action-space.md @@ -0,0 +1,49 @@ +# Action Space + +Inventory of user interaction primitives Sanderling currently supports, compared against the full set available through the Maestro driver layer. + +## Current Actions + +| Action | Parameters | Notes | +|--------|-----------|-------| +| `Tap` | `on` (selector or element) | Single tap on element or coordinates | +| `DoubleTap` | `on` (selector or element) | Two taps within a sub-100 ms window | +| `LongPress` | `on` (selector or element) | Press and hold; resolves to coordinates | +| `InputText` | `into`, `text` | Type into focused field | +| `Swipe` | `from`, `to`, `durationMillis?` | Point-to-point or element-to-element | +| `Scroll` | `direction`, `in?`, `durationMillis?` | Scroll a container up, down, left, or right | +| `PressKey` | `key` | back, home, enter, tab, up, down, left, right | +| `Wait` | `durationMillis` | Sleep for N ms | + +## Gaps vs Maestro Driver + +The Maestro driver layer (both `AndroidDriver` and `IOSDriver`) already implements these actions. They are not yet surfaced in Sanderling's action model. + +### User Interaction Gaps + +| Action | Priority | Notes | +|--------|----------|-------| +| `EraseText` | Medium | Clear N characters from focused field | +| `HideKeyboard` | Medium | Dismiss software keyboard after text input | +| `PasteText` | Low | Paste clipboard content into focused field | + +### Device/Environment Gaps + +These are less about user gesture modeling and more about test environment setup. Separate decision on whether they belong in the action model. + +| Action | Notes | +|--------|-------| +| `SetLocation` | GPS coordinate mocking | +| `SetOrientation` | Portrait, landscape-left, landscape-right | +| `SetAirplaneMode` | Network condition simulation | +| `OpenLink` | Deep links and URLs | +| `AddMedia` | Inject photos or videos into device gallery | + +### Out of Scope + +These Maestro commands don't fit Sanderling's interaction model: + +- `LaunchApp`, `StopApp`, `KillApp`, `ClearState` - app lifecycle, handled outside the action stream +- `AssertVisible`, `AssertWithAI` - Sanderling has its own property and assertion model +- `RunScript`, `EvalScript`, `RunFlow`, `Repeat` - Sanderling has its own flow and generator model +- `InputRandomText/Number/Email/...` - Sanderling's `from()` and `weighted()` generators cover this