⚡ Bolt: [performance improvement] Memoize grouping operations in Usecase and Actor tables #51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| # Fast, blocking gate for merges: lint + typecheck + the vitest suite sharded | |
| # across parallel runners. Coverage thresholds and the goal gate sweep are NOT | |
| # here — they run in the non-blocking Verify workflow | |
| # (.github/workflows/verify.yml) so a slow/in-progress correctness sweep never | |
| # blocks a merge. | |
| # Skip CI when a push/PR touches ONLY non-code paths that cannot change | |
| # lint/typecheck/vitest outcomes. Measured against 213 real pushes to main | |
| # (2026-05-20..25): 39.4% touched no code at all; this list captures 93% of | |
| # them (78/84) with ZERO false-skips of a code change. The dominant churn is | |
| # docs/state/** (the autonomous harness's next-task.md / progress.md). | |
| # | |
| # Deliberately NOT ignored (a test reads them — see | |
| # apps/api/tests/integration/readme.test.ts): docs/ root files such as | |
| # docs/build-harness.md and docs/09-bootstrap.md. Only docs/ SUBTREES with no | |
| # test dependency are listed. Keep this list a denylist of proven-safe paths; | |
| # anything new defaults to running CI. | |
| on: | |
| push: | |
| branches: [main] | |
| paths-ignore: | |
| - "docs/state/**" | |
| - "docs/findings/**" | |
| - "docs/claude/**" | |
| - "docs/decisions/**" | |
| - "goals/**" | |
| - "cycles/**" | |
| - "prompts/**" | |
| - "guidelines/**" | |
| - "assets/**" | |
| - ".claude/**" | |
| - ".codex/**" | |
| - ".agents/**" | |
| - ".argos/**" | |
| - "README.md" | |
| - "README.ko.md" | |
| - "AGENTS.md" | |
| - "CLAUDE.md" | |
| - "LICENSE" | |
| - ".gitignore" | |
| - ".prettierignore" | |
| - "*-goal.md" | |
| pull_request: | |
| branches: [main] | |
| paths-ignore: | |
| - "docs/state/**" | |
| - "docs/findings/**" | |
| - "docs/claude/**" | |
| - "docs/decisions/**" | |
| - "goals/**" | |
| - "cycles/**" | |
| - "prompts/**" | |
| - "guidelines/**" | |
| - "assets/**" | |
| - ".claude/**" | |
| - ".codex/**" | |
| - ".agents/**" | |
| - ".argos/**" | |
| - "README.md" | |
| - "README.ko.md" | |
| - "AGENTS.md" | |
| - "CLAUDE.md" | |
| - "LICENSE" | |
| - ".gitignore" | |
| - ".prettierignore" | |
| - "*-goal.md" | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| jobs: | |
| lint-typecheck: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 11.0.5 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: "22" | |
| cache: pnpm | |
| - run: pnpm install --frozen-lockfile | |
| # _meta M.2 — strict lint. `pnpm run lint` is `eslint . --max-warnings 0`. | |
| - name: Lint | |
| run: pnpm run lint | |
| # _meta M.1 — typecheck. | |
| - name: Typecheck (tsc --noEmit) | |
| run: pnpm run typecheck | |
| test: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| strategy: | |
| # Run every shard even if one fails, so a single flaky shard does not | |
| # mask failures in the others. | |
| fail-fast: false | |
| matrix: | |
| shard: [1, 2] | |
| services: | |
| postgres: | |
| image: postgres:16-alpine | |
| env: | |
| POSTGRES_USER: vspec | |
| POSTGRES_PASSWORD: vspec | |
| POSTGRES_DB: vspec_test | |
| ports: | |
| - 5432:5432 | |
| options: >- | |
| --health-cmd "pg_isready -U vspec -d vspec_test" | |
| --health-interval 3s | |
| --health-timeout 3s | |
| --health-retries 20 | |
| env: | |
| DATABASE_URL: postgresql://vspec:vspec@localhost:5432/vspec_test | |
| TEST_DATABASE_URL: postgresql://vspec:vspec@localhost:5432/vspec_test | |
| VSPEC_AUTH_STUB: "1" | |
| # Boot the compiled dist entry (built below) instead of re-transpiling via | |
| # tsx on every server restart in the persistence-matrix integration tests. | |
| # See apps/api/tests/integration/persistence-matrix-helpers.ts. | |
| VSPEC_TEST_USE_DIST: "1" | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 11.0.5 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: "22" | |
| cache: pnpm | |
| - run: pnpm install --frozen-lockfile | |
| # Build before the test step: dist/scripts/dogfood-smoke.js is consumed by | |
| # apps/api/tests/integration/dogfood-test.test.ts (which asserts the script | |
| # does not rebuild), and VSPEC_TEST_USE_DIST boots dist directly. Each shard | |
| # builds its own dist — cheap (~37s) and keeps shards self-contained. | |
| - name: Build all workspace apps | |
| run: pnpm -r build | |
| # _meta M.3 — vitest. Coverage thresholds are enforced in verify.yml, not | |
| # here, to keep the blocking path fast. `--shard=i/N` splits test files | |
| # deterministically across the matrix. | |
| - name: Test (shard ${{ matrix.shard }}/2) | |
| run: pnpm exec vitest run --shard=${{ matrix.shard }}/2 |