Skip to content

⚡ Bolt: [performance improvement] Memoize grouping operations in Usecase and Actor tables #51

⚡ Bolt: [performance improvement] Memoize grouping operations in Usecase and Actor tables

⚡ Bolt: [performance improvement] Memoize grouping operations in Usecase and Actor tables #51

Workflow file for this run

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