# CI — turns "the two engines are pinned to agree via golden vectors" from a verbal # contract into a machine contract: Rust and TS each run protocol/vectors, so any PR # that changes only one side fails the gate; the wasm job ensures the workspace-excluded # velocut-wasm bindings at least still compile. name: CI on: push: branches: [main] pull_request: jobs: rust: name: Rust engine · golden vectors + lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: cargo fmt --check - run: cargo clippy --all-targets -- -D warnings - run: cargo test web: name: TS engine · golden vectors + typecheck runs-on: ubuntu-latest defaults: run: working-directory: web steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm cache-dependency-path: web/package-lock.json - run: npm ci - run: npm test - run: npx tsc -b apps/editor wasm: name: wasm-pack build · smoke runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: rustup target add wasm32-unknown-unknown - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - run: wasm-pack build crates/velocut-wasm --target web --release --out-dir ../../web/apps/editor/public/wasm e2e: # Boot + import + edit + persistence + project switcher in real Chromium. # Designed to stay green on GPU-less runners: it asserts nothing that # needs working WebGPU or proprietary codecs (the preview degrades to an # error card and the app survives). name: Editor · E2E smoke runs-on: ubuntu-latest defaults: run: working-directory: web steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm cache-dependency-path: web/package-lock.json - run: npm ci - run: npx playwright install --with-deps chromium - run: npx playwright test - uses: actions/upload-artifact@v4 if: failure() with: name: playwright-failure path: | web/test-results/ web/playwright-report/ retention-days: 7