From 7f7472e81f6ad82326797a3fb4af0661b4e08b68 Mon Sep 17 00:00:00 2001 From: Happy Mahlangu Date: Fri, 14 Aug 2026 09:24:06 +0200 Subject: [PATCH] ci(sap-e2e): upload the run bundle flowproof already writes The nightly sap-e2e job has failed every cron-triggered run since 2026-07-31 (a manual dispatch outside that window passes cleanly, which points at a nightly SAP-side maintenance/batch window rather than a flowproof regression). Diagnosing it required inferring from console text alone: flowproof run already captures per-step PNG frames and a report.html into the suite's run dir on every invocation (recording-detail defaults to full), but the workflow never kept that bundle past the job, so the actual failing screens were never available to look at. Upload examples/sap/.flowproof/runs/ as a build artifact, unconditionally, so the next failure comes with the frames instead of a guess. --- .github/workflows/sap-e2e.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/sap-e2e.yml b/.github/workflows/sap-e2e.yml index 36280972..ab6ab269 100644 --- a/.github/workflows/sap-e2e.yml +++ b/.github/workflows/sap-e2e.yml @@ -68,6 +68,21 @@ jobs: SAP_PASSWORD: ${{ secrets.SAP_PASSWORD }} SAP_CLIENT: ${{ secrets.SAP_CLIENT }} + # `flowproof run` already writes per-step PNG frames and report.html + # into the suite's run dir on every invocation (recording-detail + # defaults to full) — the only thing missing was keeping that bundle + # past the job. `if: always()` so a failure is exactly the case that + # gets captured. Short retention: these frames are real screens off + # the reference SAP system and may show live order/material data. + - name: upload SAP flow diagnostics + if: always() + uses: actions/upload-artifact@v4 + with: + name: sap-e2e-run-${{ github.run_id }} + path: examples/sap/.flowproof/runs/ + retention-days: 14 + if-no-files-found: ignore + # Leave the session clean for whichever run is next, whether that's # tonight's schedule or a manual dispatch during the working day. - name: session reset