diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index be678c3..5c1f2d0 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -72,13 +72,31 @@ jobs:
java-version: '21'
distribution: temurin
cache: maven
+ - name: Memory before tests
+ run: free -h
- name: Test
- run: mvn --batch-mode --no-transfer-progress -P jcstress verify
+ run: mvn -e --batch-mode --no-transfer-progress -P jcstress verify
- uses: actions/upload-artifact@v7
with:
name: jacoco-report
path: target/site/jacoco/jacoco.xml
if-no-files-found: ignore
+ - name: Memory after tests
+ if: always()
+ run: free -h
+ - name: Upload crash & surefire dumps
+ if: failure()
+ uses: actions/upload-artifact@v7
+ with:
+ name: crash-dumps-test
+ path: |
+ ${{ github.workspace }}/hs_err_pid*.log
+ ${{ github.workspace }}/*.hprof
+ ${{ github.workspace }}/target/surefire-reports/*.dump
+ ${{ github.workspace }}/target/surefire-reports/*.dumpstream
+ ${{ github.workspace }}/target/surefire-reports/*.txt
+ ${{ github.workspace }}/target/surefire-reports/TEST-*.xml
+ if-no-files-found: ignore
- name: Run PIT mutation tests
run: mvn --batch-mode --no-transfer-progress test-compile org.pitest:pitest-maven:mutationCoverage
- name: Extract PIT survivors
diff --git a/CLAUDE.md b/CLAUDE.md
index 5da3767..5103a17 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -349,6 +349,10 @@ Run `mvn spotless:apply` before every commit that touches `.java` files.
See [`../workspace/policies/jqwik-prompt-injection.md`](../workspace/policies/jqwik-prompt-injection.md).
+## CI Test Diagnostics
+
+See [`../workspace/policies/ci-test-diagnostics.md`](../workspace/policies/ci-test-diagnostics.md).
+
## Lombok Config
See [`../workspace/policies/lombok-config.md`](../workspace/policies/lombok-config.md).
diff --git a/pom.xml b/pom.xml
index 1653a39..6c278c8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -273,6 +273,15 @@ SPDX-License-Identifier: Apache-2.0
maven-surefire-plugin
3.5.6
+
+ @{argLine} -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=. -XX:ErrorFile=hs_err_pid%p.log