Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 0 additions & 22 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,6 @@ updates:
all-docker-auth-api:
patterns: ['*']

- package-ecosystem: docker
directory: /services/assistant-api
schedule:
interval: weekly
open-pull-requests-limit: 1
cooldown:
default-days: 7
groups:
all-docker-assistant-api:
patterns: ['*']

- package-ecosystem: docker
directory: /services/auth-ui
schedule:
Expand All @@ -60,17 +49,6 @@ updates:
all-docker-auth-ui:
patterns: ['*']

- package-ecosystem: docker
directory: /services/assistant-ui
schedule:
interval: weekly
open-pull-requests-limit: 1
cooldown:
default-days: 7
groups:
all-docker-assistant-ui:
patterns: ['*']

- package-ecosystem: docker
directory: /services/app-ui
schedule:
Expand Down
5 changes: 0 additions & 5 deletions .github/scripts/verify-system-test-migrations.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,4 @@ PGPASSWORD=ci_auth_pass psql -h 127.0.0.1 -U auth_user -d auth_db -c '\dt' | gre
exit 1
}

PGPASSWORD=ci_assistant_pass psql -h 127.0.0.1 -U assistant_user -d assistant_db -c '\dt' | grep -q conversation || {
echo "assistant_db migrations missing" >&2
exit 1
}

echo "==> Database migrations verified"
6 changes: 2 additions & 4 deletions .github/scripts/wait-for-system-test-routes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ check_route() {

echo "Waiting for Traefik routes to become reachable..."
check_route auth-api "https://auth.jorisjonkers.test/api/actuator/health/liveness"
check_route assistant-api "https://assistant.jorisjonkers.test/api/actuator/health/liveness"
check_route app-ui "https://jorisjonkers.test/"
check_route auth-ui "https://auth.jorisjonkers.test/"
check_route assistant-ui "https://assistant.jorisjonkers.test/"
check_route app-ui "https://jorisjonkers.test/"
check_route auth-ui "https://auth.jorisjonkers.test/"
check_route vault "https://vault.jorisjonkers.test/ui/"
18 changes: 0 additions & 18 deletions .github/workflows/build-and-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,8 @@ jobs:
- '.github/workflows/build-and-publish.yml'
auth-api:
- 'services/auth-api/**'
assistant-api:
- 'services/assistant-api/**'
knowledge-api:
- 'services/knowledge-api/**'
agent-runner:
- 'services/agent-runner/**'
- 'services/agent-gateway/**'
knowledge-ingest-worker:
- 'services/knowledge-ingest-worker/**'
knowledge-curator:
Expand All @@ -78,8 +73,6 @@ jobs:
- 'gradlew.bat'
auth-ui:
- 'services/auth-ui/**'
assistant-ui:
- 'services/assistant-ui/**'
app-ui:
- 'services/app-ui/**'
stalwart-tools:
Expand All @@ -97,15 +90,12 @@ jobs:
FILTER_WORKFLOW: ${{ steps.filter.outputs.workflow }}
FILTER_GRADLE_CONFIG: ${{ steps.filter.outputs.gradle-config }}
FILTER_AUTH_API: ${{ steps.filter.outputs.auth-api }}
FILTER_ASSISTANT_API: ${{ steps.filter.outputs.assistant-api }}
FILTER_KNOWLEDGE_API: ${{ steps.filter.outputs.knowledge-api }}
FILTER_AGENT_RUNNER: ${{ steps.filter.outputs.agent-runner }}
FILTER_KNOWLEDGE_INGEST_WORKER: ${{ steps.filter.outputs.knowledge-ingest-worker }}
FILTER_KNOWLEDGE_CURATOR: ${{ steps.filter.outputs.knowledge-curator }}
FILTER_VUE_COMMON: ${{ steps.filter.outputs.vue-common }}
FILTER_FRONTEND_CONFIG: ${{ steps.filter.outputs.frontend-config }}
FILTER_AUTH_UI: ${{ steps.filter.outputs.auth-ui }}
FILTER_ASSISTANT_UI: ${{ steps.filter.outputs.assistant-ui }}
FILTER_APP_UI: ${{ steps.filter.outputs.app-ui }}
FILTER_STALWART_TOOLS: ${{ steps.filter.outputs.stalwart-tools }}
run: |
Expand Down Expand Up @@ -148,20 +138,12 @@ jobs:
FORCE_ALL="${{ github.event.inputs.force_all || 'false' }}"

[[ "$(any "$FORCE_ALL" "$KOTLIN_SHARED" "$FILTER_AUTH_API")" == "true" ]] && append auth-api services/auth-api/Dockerfile "$AMD64"
[[ "$(any "$FORCE_ALL" "$KOTLIN_SHARED" "$FILTER_ASSISTANT_API")" == "true" ]] && append assistant-api services/assistant-api/Dockerfile "$AMD64"
[[ "$(any "$FORCE_ALL" "$KOTLIN_SHARED" "$FILTER_KNOWLEDGE_API")" == "true" ]] && append knowledge-api services/knowledge-api/Dockerfile "$AMD64"
# agent-runner bundles the agent-gateway jar (built from the
# same Gradle settings), so a single image rebuild covers both
# the per-workspace tmux/runner shell and the gateway HTTP
# sidecar. amd64-only — the credential PVCs pin every
# consumer to a single amd64 Enschede worker anyway.
[[ "$(any "$FORCE_ALL" "$KOTLIN_SHARED" "$FILTER_AGENT_RUNNER")" == "true" ]] && append agent-runner services/agent-runner/Dockerfile "$AMD64"
# Python services — only depend on their own dir; no shared
# Kotlin or frontend trigger keys.
[[ "$(any "$FORCE_ALL" "$FILTER_WORKFLOW" "$FILTER_KNOWLEDGE_INGEST_WORKER")" == "true" ]] && append knowledge-ingest-worker services/knowledge-ingest-worker/Dockerfile "$AMD64"
[[ "$(any "$FORCE_ALL" "$FILTER_WORKFLOW" "$FILTER_KNOWLEDGE_CURATOR")" == "true" ]] && append knowledge-curator services/knowledge-curator/Dockerfile "$AMD64"
[[ "$(any "$FORCE_ALL" "$FRONTEND_SHARED" "$FILTER_AUTH_UI")" == "true" ]] && append auth-ui services/auth-ui/Dockerfile "$UI_PLATFORMS"
[[ "$(any "$FORCE_ALL" "$FRONTEND_SHARED" "$FILTER_ASSISTANT_UI")" == "true" ]] && append assistant-ui services/assistant-ui/Dockerfile "$UI_PLATFORMS"
[[ "$(any "$FORCE_ALL" "$FRONTEND_SHARED" "$FILTER_APP_UI")" == "true" ]] && append app-ui services/app-ui/Dockerfile "$UI_PLATFORMS"
# stalwart-tools: small alpine image baking stalwart-cli + the
# reconcile scripts/plans/accounts; amd64-only (frankfurt).
Expand Down
27 changes: 4 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ jobs:
- '.github/workflows/system-tests.yml'
auth-api:
- 'services/auth-api/**'
assistant-api:
- 'services/assistant-api/**'
knowledge-api:
- 'services/knowledge-api/**'
knowledge-ingest-worker:
Expand All @@ -69,8 +67,6 @@ jobs:
- 'gradlew.bat'
auth-ui:
- 'services/auth-ui/**'
assistant-ui:
- 'services/assistant-ui/**'
app-ui:
- 'services/app-ui/**'
vue-common:
Expand All @@ -94,14 +90,12 @@ jobs:
FILTER_WORKFLOW: ${{ steps.filter.outputs.workflow }}
FILTER_GRADLE_CONFIG: ${{ steps.filter.outputs.gradle-config }}
FILTER_AUTH_API: ${{ steps.filter.outputs.auth-api }}
FILTER_ASSISTANT_API: ${{ steps.filter.outputs.assistant-api }}
FILTER_KNOWLEDGE_API: ${{ steps.filter.outputs.knowledge-api }}
FILTER_KNOWLEDGE_INGEST_WORKER: ${{ steps.filter.outputs.knowledge-ingest-worker }}
FILTER_KNOWLEDGE_CURATOR: ${{ steps.filter.outputs.knowledge-curator }}
FILTER_VUE_COMMON: ${{ steps.filter.outputs.vue-common }}
FILTER_FRONTEND_CONFIG: ${{ steps.filter.outputs.frontend-config }}
FILTER_AUTH_UI: ${{ steps.filter.outputs.auth-ui }}
FILTER_ASSISTANT_UI: ${{ steps.filter.outputs.assistant-ui }}
FILTER_APP_UI: ${{ steps.filter.outputs.app-ui }}
FILTER_SYSTEM_TESTS: ${{ steps.filter.outputs.system-tests }}
FILTER_INFRA: ${{ steps.filter.outputs.infra }}
Expand All @@ -113,10 +107,9 @@ jobs:
FRONTEND_SHARED=$(any "$FILTER_WORKFLOW" "$FILTER_VUE_COMMON" "$FILTER_FRONTEND_CONFIG")

AUTH_API_KOTLIN=$(any "$KOTLIN_SHARED" "$FILTER_AUTH_API")
ASSISTANT_API_KOTLIN=$(any "$KOTLIN_SHARED" "$FILTER_ASSISTANT_API")
KNOWLEDGE_API_KOTLIN=$(any "$KOTLIN_SHARED" "$FILTER_KNOWLEDGE_API")
ANY_KOTLIN=$(any "$KOTLIN_SHARED" "$FILTER_AUTH_API" "$FILTER_ASSISTANT_API" "$FILTER_KNOWLEDGE_API")
ANY_FRONTEND=$(any "$FRONTEND_SHARED" "$FILTER_AUTH_UI" "$FILTER_ASSISTANT_UI" "$FILTER_APP_UI")
ANY_KOTLIN=$(any "$KOTLIN_SHARED" "$FILTER_AUTH_API" "$FILTER_KNOWLEDGE_API")
ANY_FRONTEND=$(any "$FRONTEND_SHARED" "$FILTER_AUTH_UI" "$FILTER_APP_UI")
ANY_SERVICE=$(any "$ANY_KOTLIN" "$ANY_FRONTEND")
RUN_SYSTEM_TESTS=$(any "$FILTER_WORKFLOW" "$FILTER_SYSTEM_TESTS" "$FILTER_INFRA" "$ANY_SERVICE")
ANY_PLATFORM=$(any "$FILTER_PLATFORM")
Expand All @@ -139,9 +132,8 @@ jobs:
# unauthenticated portfolio page.
CHANGED_SERVICES=""
[[ "$AUTH_API_KOTLIN" == "true" ]] && CHANGED_SERVICES+=" auth-api"
[[ "$ASSISTANT_API_KOTLIN" == "true" ]] && CHANGED_SERVICES+=" assistant-api"
[[ "$KNOWLEDGE_API_KOTLIN" == "true" ]] && CHANGED_SERVICES+=" knowledge-api"
CHANGED_SERVICES+=" auth-ui assistant-ui app-ui stalwart-tools"
CHANGED_SERVICES+=" auth-ui app-ui stalwart-tools"
CHANGED_SERVICES="${CHANGED_SERVICES# }"

echo "any-kotlin=$ANY_KOTLIN" >> "$GITHUB_OUTPUT"
Expand All @@ -152,23 +144,18 @@ jobs:
echo "any-platform=$ANY_PLATFORM" >> "$GITHUB_OUTPUT"
echo "run-system-tests=$RUN_SYSTEM_TESTS" >> "$GITHUB_OUTPUT"
echo "auth-api-kotlin=$AUTH_API_KOTLIN" >> "$GITHUB_OUTPUT"
echo "assistant-api-kotlin=$ASSISTANT_API_KOTLIN" >> "$GITHUB_OUTPUT"
echo "knowledge-api-kotlin=$KNOWLEDGE_API_KOTLIN" >> "$GITHUB_OUTPUT"
echo "changed-services=$CHANGED_SERVICES" >> "$GITHUB_OUTPUT"
- name: Build dynamic matrices
id: matrix
env:
AUTH_API_KOTLIN: ${{ steps.compute.outputs.auth-api-kotlin }}
ASSISTANT_API_KOTLIN: ${{ steps.compute.outputs.assistant-api-kotlin }}
KNOWLEDGE_API_KOTLIN: ${{ steps.compute.outputs.knowledge-api-kotlin }}
run: |
KOTLIN_MATRIX="[]"
if [[ "$AUTH_API_KOTLIN" == "true" ]]; then
KOTLIN_MATRIX=$(echo "$KOTLIN_MATRIX" | jq -c '. + [{"module":"auth-api","gradle-path":":services:auth-api"}]')
fi
if [[ "$ASSISTANT_API_KOTLIN" == "true" ]]; then
KOTLIN_MATRIX=$(echo "$KOTLIN_MATRIX" | jq -c '. + [{"module":"assistant-api","gradle-path":":services:assistant-api"}]')
fi
if [[ "$KNOWLEDGE_API_KOTLIN" == "true" ]]; then
KOTLIN_MATRIX=$(echo "$KOTLIN_MATRIX" | jq -c '. + [{"module":"knowledge-api","gradle-path":":services:knowledge-api"}]')
fi
Expand All @@ -179,9 +166,6 @@ jobs:
if [[ "$AUTH_API_KOTLIN" == "true" ]]; then
INT_MATRIX=$(echo "$INT_MATRIX" | jq -c '. + [{"module":"auth-api","gradle-path":":services:auth-api"}]')
fi
if [[ "$ASSISTANT_API_KOTLIN" == "true" ]]; then
INT_MATRIX=$(echo "$INT_MATRIX" | jq -c '. + [{"module":"assistant-api","gradle-path":":services:assistant-api"}]')
fi
if [[ "$KNOWLEDGE_API_KOTLIN" == "true" ]]; then
INT_MATRIX=$(echo "$INT_MATRIX" | jq -c '. + [{"module":"knowledge-api","gradle-path":":services:knowledge-api"}]')
fi
Expand All @@ -191,9 +175,6 @@ jobs:
if [[ "$AUTH_API_KOTLIN" == "true" ]]; then
COV_MATRIX=$(echo "$COV_MATRIX" | jq -c '. + [{"module":"auth-api","gradle-path":":services:auth-api","has-integration":true}]')
fi
if [[ "$ASSISTANT_API_KOTLIN" == "true" ]]; then
COV_MATRIX=$(echo "$COV_MATRIX" | jq -c '. + [{"module":"assistant-api","gradle-path":":services:assistant-api","has-integration":true}]')
fi
if [[ "$KNOWLEDGE_API_KOTLIN" == "true" ]]; then
COV_MATRIX=$(echo "$COV_MATRIX" | jq -c '. + [{"module":"knowledge-api","gradle-path":":services:knowledge-api","has-integration":true}]')
fi
Expand Down Expand Up @@ -411,7 +392,7 @@ jobs:
- uses: ./.github/actions/setup-node-pnpm
with:
node-version: ${{ env.NODE_VERSION }}
- run: bash infra/scripts/run-strict-command.sh ./gradlew :services:auth-api:test :services:assistant-api:test --tests "*ArchitectureTest*"
- run: bash infra/scripts/run-strict-command.sh ./gradlew :services:auth-api:test --tests "*ArchitectureTest*"
- run: pnpm -r depcruise

system-tests:
Expand Down
24 changes: 6 additions & 18 deletions .github/workflows/contract-validate.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
name: Contract Validate

# Pins committed OpenAPI contracts and the assistant-api -> assistant-ui type
# contract. The freshly-exported springdoc specs are diffed against the
# committed service `openapi.json` files, then the regenerated TypeScript types
# are diffed against `services/assistant-ui/src/api/generated.ts`. Regenerate
# locally with `./gradlew :services:assistant-api:exportOpenApiSpec
# :services:knowledge-api:exportOpenApiSpec` and
# `pnpm --filter @personal-stack/assistant-ui contract:generate`.
# Pins committed OpenAPI contracts. The freshly-exported springdoc spec is
# diffed against the committed `services/knowledge-api/openapi.json`. Regenerate
# locally with `./gradlew :services:knowledge-api:exportOpenApiSpec`.

on:
workflow_call:
Expand All @@ -27,23 +23,15 @@ jobs:
- uses: ./.github/actions/setup-java-gradle
with:
java-version: '21'
- uses: ./.github/actions/setup-node-pnpm
with:
node-version: '24'
- name: Export OpenAPI specs
run: >
bash infra/scripts/run-strict-command.sh ./gradlew
:services:assistant-api:exportOpenApiSpec
:services:knowledge-api:exportOpenApiSpec
- name: Diff exported specs against committed openapi.json files
run: |
set -euo pipefail
# The export tasks overwrite the committed paths with fresh springdoc
# output. `git diff --exit-code` against HEAD then surfaces drift.
if ! git diff --exit-code -- services/assistant-api/openapi.json services/knowledge-api/openapi.json; then
echo "::error::One or more committed openapi.json files are stale."
echo "::error::Regenerate locally with: ./gradlew :services:assistant-api:exportOpenApiSpec :services:knowledge-api:exportOpenApiSpec"
if ! git diff --exit-code -- services/knowledge-api/openapi.json; then
echo "::error::Committed openapi.json is stale."
echo "::error::Regenerate locally with: ./gradlew :services:knowledge-api:exportOpenApiSpec"
exit 1
fi
- name: Check openapi-typescript output is up to date
run: bash infra/scripts/run-strict-command.sh pnpm --filter @personal-stack/assistant-ui contract:check
6 changes: 0 additions & 6 deletions .github/workflows/crac-train.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,6 @@ jobs:
db_user: auth_user
db_password: auth_password
port: 8081
- service: assistant-api
db_name: assistant_db
db_user: assistant_user
db_password: assistant_password
port: 8082
services:
postgres:
image: postgres:17-alpine
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/migration-guard.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Blocks the failure mode that crashlooped assistant-api: an already-applied
# Blocks the failure mode that crashlooped agents-api: an already-applied
# Flyway migration was edited, flipping its checksum so `validate` hard-fails
# on boot. Enforces that committed migrations are immutable and that versions
# only ever increment. Fast (seconds) and unconditional so it is safe to mark
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/prod-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ name: Production Smoke
# kube-personal && kubectl -n auth-system exec deploy/auth-api -- \
# curl -X POST http://localhost:8081/api/v1/admin/users/canary-bot/permissions \
# -H 'Content-Type: application/json' \
# -d '{"service":"ASSISTANT","granted":true}'
# -d '{"service":"AGENTS","granted":true}'
#
# Demote canary-bot from ADMIN once permission is granted so the
# canary's blast-radius matches a real user.
Expand All @@ -74,7 +74,7 @@ permissions:
contents: read

env:
ASSISTANT_API_URL: https://assistant.jorisjonkers.dev
AGENTS_API_URL: https://agents.jorisjonkers.dev
AUTH_API_URL: https://auth.jorisjonkers.dev

jobs:
Expand Down Expand Up @@ -137,7 +137,7 @@ jobs:
exit 1
fi
body=$(curl -sf -b "${COOKIES}" \
-X POST "${ASSISTANT_API_URL}/api/v1/repositories" \
-X POST "${AGENTS_API_URL}/api/v1/repositories" \
-H 'Content-Type: application/json' \
-H "X-XSRF-TOKEN: ${csrf}" \
--data "{\"name\":\"${name}\",\"repoUrl\":\"git@github.com:owner/${name}.git\",\"defaultBranch\":\"main\"}")
Expand All @@ -163,7 +163,7 @@ jobs:
public_key="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl canary-${REPO_NAME}"
private_key=$'-----BEGIN OPENSSH PRIVATE KEY-----\ncanary-private-'"${REPO_NAME}"'\n-----END OPENSSH PRIVATE KEY-----\n'
curl -sf -b "${COOKIES}" \
-X POST "${ASSISTANT_API_URL}/api/v1/repositories/${REPO_ID}/key" \
-X POST "${AGENTS_API_URL}/api/v1/repositories/${REPO_ID}/key" \
-H 'Content-Type: application/json' \
-H "X-XSRF-TOKEN: ${csrf}" \
--data "$(jq -n --arg pk "$private_key" --arg pub "$public_key" \
Expand All @@ -183,7 +183,7 @@ jobs:
# missing fingerprint here implies either the Vault write
# silently fell back to a no-op store (PR #405 shape) or
# the row update was rolled back.
body=$(curl -sf -b "${COOKIES}" "${ASSISTANT_API_URL}/api/v1/repositories/${REPO_ID}")
body=$(curl -sf -b "${COOKIES}" "${AGENTS_API_URL}/api/v1/repositories/${REPO_ID}")
fingerprint=$(jq -r '.repository.deployKeyFingerprint // .deployKeyFingerprint // empty' <<<"$body")
if [ -z "$fingerprint" ]; then
echo "::error::deployKeyFingerprint is empty after attach. Body: $body"
Expand All @@ -202,7 +202,7 @@ jobs:
fi
csrf=$(awk '/XSRF-TOKEN/{print $7}' "${COOKIES}" | tail -1)
curl -sf -b "${COOKIES}" \
-X DELETE "${ASSISTANT_API_URL}/api/v1/repositories/${REPO_ID}" \
-X DELETE "${AGENTS_API_URL}/api/v1/repositories/${REPO_ID}" \
-H "X-XSRF-TOKEN: ${csrf}" \
-o /dev/null || echo "::warning::cleanup DELETE returned non-2xx — repository ${REPO_ID} may need manual cleanup"

Expand All @@ -213,5 +213,5 @@ jobs:
run: |
curl -sf -X POST "${WEBHOOK}" \
-H 'Content-Type: application/json' \
--data "{\"text\":\":rotating_light: prod-smoke failed — assistant attach-key flow broken in production. Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\"}" \
--data "{\"text\":\":rotating_light: prod-smoke failed — agents attach-key flow broken in production. Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\"}" \
|| true
9 changes: 1 addition & 8 deletions .github/workflows/system-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ on:
on the branch. Defaults to all five services for callers that
haven't computed a narrower set.
type: string
default: 'auth-api assistant-api auth-ui assistant-ui app-ui stalwart-tools'
default: 'auth-api auth-ui app-ui stalwart-tools'

concurrency:
group: system-tests-${{ github.ref }}
Expand All @@ -44,15 +44,9 @@ jobs:
- name: auth-api
dockerfile: services/auth-api/Dockerfile
build_arg: ''
- name: assistant-api
dockerfile: services/assistant-api/Dockerfile
build_arg: ''
- name: auth-ui
dockerfile: services/auth-ui/Dockerfile
build_arg: ''
- name: assistant-ui
dockerfile: services/assistant-ui/Dockerfile
build_arg: VITE_AUTH_URL=https://auth.jorisjonkers.test
- name: app-ui
dockerfile: services/app-ui/Dockerfile
build_arg: VITE_AUTH_URL=https://auth.jorisjonkers.test
Expand Down Expand Up @@ -171,7 +165,6 @@ jobs:
run: >-
bash infra/scripts/run-strict-command.sh ./gradlew ${{ matrix.suite.gradle_task }}
-Dtest.auth-api.url=https://auth.jorisjonkers.test
-Dtest.assistant-api.url=https://assistant.jorisjonkers.test
-Dtest.db.password=ci_auth_pass
${{ matrix.suite.shard_args }}
- name: Dump diagnostics on failure
Expand Down
Loading
Loading