From 7f00f337ed5beba19a1a7602a8915e1cc63fae9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 28 Oct 2026 13:02:59 +0100 Subject: [PATCH 1/2] ci(conformance): keep engine diagnostics from the iOS differential The nightly lane uploads only the report and replay traces, so the intermittent launchApp clearState "xcrun timed out after 15000ms" (10-11, 10-17, 10-27) and Maestro's driver startup timeout (10-27) left no evidence of which call stalled. Trace every host subprocess and upload the daemon/session diagnostics and Maestro's per-run log through the shared upload action. Refs #3944 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/conformance-differential.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/conformance-differential.yml b/.github/workflows/conformance-differential.yml index 4237a2c064..44190e3f1e 100644 --- a/.github/workflows/conformance-differential.yml +++ b/.github/workflows/conformance-differential.yml @@ -52,6 +52,11 @@ jobs: AGENT_DEVICE_XCUITEST_ARCHS: 'arm64' AGENT_DEVICE_STATE_DIR: ${{ github.workspace }}/.tmp/agent-device-state AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH: ${{ github.workspace }}/.tmp/ios-runner-derived + # A bounded simctl call that times out (e.g. the launchApp clearState + # terminate, #3944) reports only "xcrun timed out". The exec trace keeps + # every host subprocess's spawn, deadline, exit and close in the session + # diagnostics, so the uploaded run shows which call stalled and for how long. + AGENT_DEVICE_EXEC_TRACE: '1' steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -171,3 +176,16 @@ jobs: .tmp/conformance-differential/differential-report.json .agent-device/**/replay-timing.ndjson if-no-files-found: ignore + + # An infrastructure failure on either engine leaves its evidence outside + # the report: agent-device's daemon and session diagnostics, and Maestro's + # own per-run log (e.g. its driver startup timeout). + - name: Upload engine diagnostics + if: always() + uses: ./.github/actions/upload-agent-device-artifacts + with: + artifact-name: conformance-differential-ios-diagnostics + agent-state-dir: ${{ env.AGENT_DEVICE_STATE_DIR }} + runner-derived-path: ${{ env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH }} + additional-paths: | + ~/.maestro/tests/** From d3a22bec51c5735ec42ea1e5cb5fdf5689b1d48c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 28 Oct 2026 15:56:51 +0100 Subject: [PATCH 2/2] ci(conformance): note which upload step keeps which evidence Co-Authored-By: Claude Opus 5.5 --- .github/workflows/conformance-differential.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/conformance-differential.yml b/.github/workflows/conformance-differential.yml index 44190e3f1e..ed6a046e2d 100644 --- a/.github/workflows/conformance-differential.yml +++ b/.github/workflows/conformance-differential.yml @@ -179,7 +179,9 @@ jobs: # An infrastructure failure on either engine leaves its evidence outside # the report: agent-device's daemon and session diagnostics, and Maestro's - # own per-run log (e.g. its driver startup timeout). + # own per-run log (e.g. its driver startup timeout). The step above keeps + # the report and replay-timing.ndjson, which the invariants are computed + # from; this one keeps the daemon's sessions/** with the exec trace. - name: Upload engine diagnostics if: always() uses: ./.github/actions/upload-agent-device-artifacts