- suffix-first identifier matching (container names no longer resolve to
their first descendant)
- scroll: pure-AX scrollbar drive (--to/--by), works on background windows
- click/rightclick/hover/key/type/mouse*: real HID events (postToPid is
dropped by AppKit/Qt) — auto-activate target, restore cursor after; guarded:
refuse when the user was active <2s ago, when the app cannot become
frontmost, or when another window covers the target point
- key: esc/enter/tab/arrows/home/end/page + back/forward (mouse nav buttons)
- skill: interaction hierarchy (pure AX first), popup hot-reload and
occluded-window screenshot gotchas
- tools/ax: Swift CLI to inspect/drive any app via the AX API (tree/find/
read/press/set/click/type/screenshot); elements addressed by Qt's
objectName-derived AXIdentifier
- scripts/storybook-agent.sh: start/status/stop lifecycle for a persistent
Storybook harness launched directly on a page
- storybook/main.qml: fix -- page-from-command-line (currentPage initial
property landed on ApplicationWindow instead of the Storybook item)
- .claude/skills/qml-storybook-loop: documented agent workflow
Validated end-to-end on SwapModalPage: objectName addressing, AXPress,
AXValue set (triggers QML bindings), and hot reload of production
SwapModal.qml (~4s edit-to-verified, no rebuild/restart).