Skip to content

[BE-0281] feat(e2e): add real on-device iOS actuation coverage#1181

Merged
0x0c merged 8 commits into
mainfrom
claude/be-0281-implementation-89cc34
Jul 21, 2026
Merged

[BE-0281] feat(e2e): add real on-device iOS actuation coverage#1181
0x0c merged 8 commits into
mainfrom
claude/be-0281-implementation-89cc34

Conversation

@0x0c

@0x0c 0x0c commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Wires real on-device actuation into the iOS E2E lane (ios-e2e.yml) beyond the conformance job's tap, closing the CI-wiring gap BE-0281 identifies: the showcase already carries gestures.yaml, device.yaml, and push.yaml, but they ran only in local-only Makefile targets, never CI. This PR moves BE-0281 to Implemented, with scope narrowed from the original design (see Scope below).

What changed

  • .github/workflows/ios-e2e.yml — adds one new non-gating job, actuation (idb), driving navigation.yaml (tap + back) and device.yaml + push.yaml (setLocation, clipboard, push) over idb on the Stable launch tab — the only surface idb can reach. Also wires two more runs into the existing xcuitest (multi-touch) job: search.yaml for the runner channel's /type endpoint and notices.yaml for /swipe + /back, reusing that job's already-built runner rather than a new job. actuation stays out of the E2E gate's needs:, like golden/visual, landing as signal first per the Simulator lane's flakiness history (BE-0218).
  • docs/ci.md / docs/ja/ci.md — update the iOS lane's job inventory (six jobs → seven) to describe the new actuation (idb) job and the xcuitest (multi-touch) job's expanded scope.
  • roadmaps/BE-0281-ios-on-device-actuation-coverage/*.md — flip Status to Implemented, check off the Progress items, and log what shipped and why the scope narrowed.
  • roadmaps/README.md / roadmaps/README-ja.md — regenerated via make roadmap-index (BE-0281 moves from Proposal to Implemented).

Scope

Narrowed from the original proposal. idb cannot tap the native tab bar at all — SwiftUI's TabView collapses into one opaque group in idb's describe-all, with no per-tab children (SPEC.md §3, BE-0107) — confirmed on-device before implementation (a tap: {label: "Log"} step returned 一致なし/no-match). The proposal's idb interaction job assumed gestures.yaml and similar tab-crossing scenarios would run over idb; they cannot, since every one of them opens with a tab tap. The only existing scenario idb can drive end-to-end is navigation.yaml (Stable launch tab only), covering tap + back.

Consequently:

  • idb's type / swipe / scroll / longPress / doubleTap stay proven on-device only via the XCUITest runner channel (this PR's search.yaml / notices.yaml wiring) or mocked unit tests — not via the idb companion itself. Closing that specific gap needs a new tab-free showcase screen (idb has no surface today with a text field, scrollable list, or gesture targets outside the tab bar). Left for a follow-up roadmap item.
  • Device control (setLocation, clipboard, push) is fully covered as proposed — it lives entirely on the Stable launch tab, which idb reaches.
  • XCUITest actuation (/type, /swipe, /back) is fully covered as proposed, reusing the existing shared search.yaml/notices.yaml scenarios rather than authoring a new file.

Prime-directive compliance

  • AI never judges — no LLM is consulted; every new job is a deterministic bajutsu run against machine-checkable expect assertions.
  • Determinism first — no fixed sleep; the new job reuses the same BAJUTSU_MIN_WAIT_TIMEOUT condition-wait floor pattern as smoke/golden/visual.
  • App-agnostic — no per-app logic added; the new job runs existing showcase scenarios through the existing bajutsu-e2e composite action.

Verification

make check
  format-check / lint / lint-docstrings / lint-imports / lint-sh / lint-actions / lint-js /
  lint-roadmap / lock-check / typecheck: all passed
  4369 passed, 3 skipped, coverage 92.37% (floor 89%)

actionlint and YAML-parse checks pass on the modified workflow. The XCUITest half of the new coverage (search.yaml for /type, notices.yaml for /swipe + /back) was additionally verified end-to-end on a local Simulator + Xcode 26.6 toolchain before landing — both scenarios PASS over --backend xcuitest. The idb half (navigation.yaml, device.yaml, push.yaml) could not be locally verified the same way (the local idb_companion build is too old to read the iOS 26 accessibility tree) — the job's actual on-device behavior will be observed on this PR's CI run, which is exactly why it starts non-gating.

🤖 Generated with Claude Code

@github-actions github-actions Bot added the topic:dev-infra CI / build infrastructure (roadmap topic) label Jul 17, 2026
0x0c added a commit that referenced this pull request Jul 17, 2026
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@0x0c
0x0c temporarily deployed to claude-review July 17, 2026 13:51 — with GitHub Actions Inactive
Comment thread .github/workflows/ios-e2e.yml Outdated
0x0c added a commit that referenced this pull request Jul 17, 2026
…ntrol on-device

- ios-e2e.yml: notices.yaml only uses `/swipe` + `/back` steps (no `/scroll`
  endpoint exists on the runner channel), so drop the stray "+ `/scroll`" from
  the job-header comment describing it.
- docs/architecture.md and its docs/ja/architecture.md mirror: credit idb's
  `back` and device-control (setLocation/clipboard/push) actuation as now
  confirmed on-device via the `actuation (idb)` job (BE-0281), per CLAUDE.md's
  BE-0113 rule to keep architecture.md in step with behavior in the same PR.

Addresses review feedback on PR #1181.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@0x0c
0x0c temporarily deployed to claude-review July 17, 2026 14:09 — with GitHub Actions Inactive
Comment thread .github/workflows/ios-e2e.yml
@0x0c
0x0c temporarily deployed to claude-review July 17, 2026 14:45 — with GitHub Actions Inactive
Comment thread docs/architecture.md Outdated
Comment thread docs/ja/architecture.md Outdated
Comment thread .github/workflows/ios-e2e.yml
0x0c added a commit that referenced this pull request Jul 17, 2026
Address round-3 review feedback on PR #1181: the actuation (idb) job's
three bajutsu-e2e steps (navigation/device/push) are independent
scenarios bundled into one job for cost reasons, but a plain step
failure skipped every step after it — hiding the other scenarios' pass/
fail signal and artifacts. Mark each step continue-on-error and add a
final step that re-fails the job if any of the three failed, so all
three always get a chance to run while the job-level result stays
accurate.

Also fixes documentation drift flagged by the same review round: the
roadmap's References list still cited gestures.yaml/controls.yaml
(never actually wired over idb) instead of the scenarios this PR wired
(navigation/device/push/search/notices.yaml), and architecture.md
overclaimed the actuation (idb) job "confirmed" back/device-control
on-device before a passing run had been observed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@0x0c
0x0c temporarily deployed to claude-review July 17, 2026 15:11 — with GitHub Actions Inactive
Comment thread .github/workflows/ios-e2e.yml Outdated
Comment thread docs/architecture.md Outdated
@0x0c
0x0c marked this pull request as ready for review July 18, 2026 04:08
0x0c pushed a commit that referenced this pull request Jul 18, 2026
…ture.md antecedent

Address two open review comments on PR #1181:
- Bump ios-e2e.yml xcuitest-gestures timeout-minutes 25 -> 30 to restore
  headroom after BE-0281's ~13min -> ~21min runtime growth on a gating job.
- Fix 'runs it' -> 'runs both' in docs/architecture.md's idb entry: the bullet
  describes two things (back and device control), so the singular pronoun misread.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NgEYipfg6U2xLeCAxTTNF7
@0x0c
0x0c temporarily deployed to claude-review July 18, 2026 04:31 — with GitHub Actions Inactive
Comment thread .github/workflows/ios-e2e.yml Outdated
0x0c added a commit that referenced this pull request Jul 20, 2026
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0x0c added a commit that referenced this pull request Jul 20, 2026
…ntrol on-device

- ios-e2e.yml: notices.yaml only uses `/swipe` + `/back` steps (no `/scroll`
  endpoint exists on the runner channel), so drop the stray "+ `/scroll`" from
  the job-header comment describing it.
- docs/architecture.md and its docs/ja/architecture.md mirror: credit idb's
  `back` and device-control (setLocation/clipboard/push) actuation as now
  confirmed on-device via the `actuation (idb)` job (BE-0281), per CLAUDE.md's
  BE-0113 rule to keep architecture.md in step with behavior in the same PR.

Addresses review feedback on PR #1181.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0x0c added a commit that referenced this pull request Jul 20, 2026
Address round-3 review feedback on PR #1181: the actuation (idb) job's
three bajutsu-e2e steps (navigation/device/push) are independent
scenarios bundled into one job for cost reasons, but a plain step
failure skipped every step after it — hiding the other scenarios' pass/
fail signal and artifacts. Mark each step continue-on-error and add a
final step that re-fails the job if any of the three failed, so all
three always get a chance to run while the job-level result stays
accurate.

Also fixes documentation drift flagged by the same review round: the
roadmap's References list still cited gestures.yaml/controls.yaml
(never actually wired over idb) instead of the scenarios this PR wired
(navigation/device/push/search/notices.yaml), and architecture.md
overclaimed the actuation (idb) job "confirmed" back/device-control
on-device before a passing run had been observed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0x0c pushed a commit that referenced this pull request Jul 20, 2026
…ture.md antecedent

Address two open review comments on PR #1181:
- Bump ios-e2e.yml xcuitest-gestures timeout-minutes 25 -> 30 to restore
  headroom after BE-0281's ~13min -> ~21min runtime growth on a gating job.
- Fix 'runs it' -> 'runs both' in docs/architecture.md's idb entry: the bullet
  describes two things (back and device control), so the singular pronoun misread.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NgEYipfg6U2xLeCAxTTNF7
@0x0c
0x0c force-pushed the claude/be-0281-implementation-89cc34 branch from 1911bef to e44ed09 Compare July 20, 2026 22:39
@0x0c
0x0c temporarily deployed to claude-review July 20, 2026 22:39 — with GitHub Actions Inactive
@0x0c
0x0c temporarily deployed to claude-review July 20, 2026 23:23 — with GitHub Actions Inactive
0x0c and others added 7 commits July 21, 2026 11:03
Wires idb and XCUITest actuation beyond the conformance job's `tap` into
ios-e2e.yml: a new non-gating `actuation (idb)` job drives `back`
(navigation.yaml) and device control — setLocation, clipboard, push
(device.yaml + push.yaml) — on the Stable launch tab, the only surface
idb can reach (idb collapses the native tab bar into one opaque group
and cannot tap any tab, confirmed on-device before implementation). The
existing `xcuitest (multi-touch)` job gains two more runs — search.yaml
for `/type` and notices.yaml for `/swipe` + `/back` on the runner
channel — reusing its already-built runner rather than a new job.

Scope narrowed from the original proposal: idb cannot drive the
tab-crossing gesture/text scenarios (gestures.yaml, controls.yaml) it
assumed, so type/swipe/scroll/longPress/doubleTap stay idb-unproven on
device pending a tab-free showcase screen (left for a follow-up item).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ntrol on-device

- ios-e2e.yml: notices.yaml only uses `/swipe` + `/back` steps (no `/scroll`
  endpoint exists on the runner channel), so drop the stray "+ `/scroll`" from
  the job-header comment describing it.
- docs/architecture.md and its docs/ja/architecture.md mirror: credit idb's
  `back` and device-control (setLocation/clipboard/push) actuation as now
  confirmed on-device via the `actuation (idb)` job (BE-0281), per CLAUDE.md's
  BE-0113 rule to keep architecture.md in step with behavior in the same PR.

Addresses review feedback on PR #1181.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…eout comment

The Progress checklist bullet incorrectly lumped `tap` in with the actuators
that stay on XCUITest, contradicting the PR's own actuation (idb) job (which
runs navigation.yaml's `tap` step) and the Log entry below it, which already
excludes `tap` correctly. Fix both the English and Japanese checklist bullets
to match.

Also update the xcuitest-gestures job's stale ~13min budget comment to ~21min,
reflecting the two extra bajutsu run invocations (search.yaml, notices.yaml)
this PR added to that job — timeout-minutes: 25 still has headroom.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Address round-3 review feedback on PR #1181: the actuation (idb) job's
three bajutsu-e2e steps (navigation/device/push) are independent
scenarios bundled into one job for cost reasons, but a plain step
failure skipped every step after it — hiding the other scenarios' pass/
fail signal and artifacts. Mark each step continue-on-error and add a
final step that re-fails the job if any of the three failed, so all
three always get a chance to run while the job-level result stays
accurate.

Also fixes documentation drift flagged by the same review round: the
roadmap's References list still cited gestures.yaml/controls.yaml
(never actually wired over idb) instead of the scenarios this PR wired
(navigation/device/push/search/notices.yaml), and architecture.md
overclaimed the actuation (idb) job "confirmed" back/device-control
on-device before a passing run had been observed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ture.md antecedent

Address two open review comments on PR #1181:
- Bump ios-e2e.yml xcuitest-gestures timeout-minutes 25 -> 30 to restore
  headroom after BE-0281's ~13min -> ~21min runtime growth on a gating job.
- Fix 'runs it' -> 'runs both' in docs/architecture.md's idb entry: the bullet
  describes two things (back and device control), so the singular pronoun misread.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NgEYipfg6U2xLeCAxTTNF7
@0x0c
0x0c force-pushed the claude/be-0281-implementation-89cc34 branch from 73df8a9 to 633070a Compare July 21, 2026 02:05
@0x0c
0x0c temporarily deployed to claude-review July 21, 2026 02:05 — with GitHub Actions Inactive
Comment thread .github/workflows/ios-e2e.yml Outdated
Comment thread .github/workflows/ios-e2e.yml Outdated
Comment thread .github/workflows/ios-e2e.yml Outdated
Comment thread .github/workflows/ios-e2e.yml
Addresses review feedback: consistent "never actuate" phrasing with the
smoke job's description, a double-negative fix, a missing object, and a
note on why the required xcuitest-gestures job skips the actuation job's
continue-on-error pattern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@0x0c
0x0c temporarily deployed to claude-review July 21, 2026 03:05 — with GitHub Actions Inactive
@0x0c
0x0c disabled auto-merge July 21, 2026 04:36
@0x0c
0x0c merged commit f9d58c9 into main Jul 21, 2026
56 of 60 checks passed
@0x0c
0x0c deleted the claude/be-0281-implementation-89cc34 branch July 21, 2026 04:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

topic:dev-infra CI / build infrastructure (roadmap topic)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants