name: CI on: push: branches: [main] pull_request: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: project-quality: name: Project quality ยท ${{ matrix.project }} runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false matrix: include: - project: okr manifest: apps/okr/domain/project.manifest.json - project: service-desk manifest: apps/service-desk/domain/project.manifest.json steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" cache: npm - run: npm ci - name: Validate project contract run: python3 packages/casan-harness/scripts/bash/project_manifest.py validate --root . --manifest "${{ matrix.manifest }}" - name: Build run: python3 packages/casan-harness/scripts/bash/project_manifest.py run --root . --manifest "${{ matrix.manifest }}" --kind build - name: Test run: python3 packages/casan-harness/scripts/bash/project_manifest.py run --root . --manifest "${{ matrix.manifest }}" --kind test - name: Project security, corpus and traceability gates env: CASAN_PROJECT_MANIFEST: ${{ matrix.manifest }} # The repository-level governance job runs the exhaustive corpus suite once. CASAN_PROJECT_GATE_RUN_CORPUS: "0" CASAN_PROJECT_GATE_RUN_BUILD: "0" CASAN_PROJECT_GATE_RUN_TEST: "0" run: bin/casan gate casan-governance: name: CASAN governance runs-on: ubuntu-latest timeout-minutes: 45 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" cache: npm - run: npm ci - name: Validate native Codex and Claude plugin facades run: python3 packages/casan-devkit/tests/native-plugin-tests.py - name: Run reusable governance suites env: CASAN_CI_RUN_PROJECT: "0" CASAN_CI_RUN_CONTROL_PANEL: "0" CASAN_CI_RUN_INFRA_LAB: "0" run: bin/casan gate control-panel: name: Control panel runs-on: ubuntu-latest timeout-minutes: 30 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" cache: npm - run: npm ci - run: npm run console:test - run: npm run console:build