Skip to content

M3/E5/#17 — SoLEXS parsers #54

M3/E5/#17 — SoLEXS parsers

M3/E5/#17 — SoLEXS parsers #54

Workflow file for this run

# CI for the AdityaNet web platform. Spec §13.3.
#
# Three gates run in parallel. The `e2e` gate is added in the sprint that ships the
# first persona journey — a gate with zero tests is not a gate, it is a slow no-op.
#
# Target wall time is under 12 minutes (§13.3): a pipeline slower than that gets
# bypassed, and a bypassed gate is not a gate.
#
# TOOLCHAIN RESOLUTION — the reason each setup step names an explicit file.
#
# `defaults.run.working-directory` applies ONLY to `run:` steps, never to `uses:`
# steps. Every action below therefore executes at the REPOSITORY ROOT, where this
# project has no package.json — the web app lives in web/. Left implicit,
# pnpm/action-setup found no `packageManager` field and failed the job before a
# single gate ran:
#
# Error: No pnpm version is specified.
#
# So the pnpm version is read from web/package.json (`packageManager`), and Node is
# read from web/.node-version — the SAME file the Render deploy reads, so CI cannot
# pass on a Node version that production does not use.
name: web
# GATE RELIABILITY — why `push` to main carries no path filter.
#
# GitHub truncates the file list it evaluates for `paths:` on very large diffs. A
# 3,231-file restructure changed two files under web/ and this workflow did not run:
# the gate was skipped silently, which is the one failure mode a gate must not have.
# Pull requests carry no filter either, for a second and independent reason recorded
# at the `pull_request` trigger below. The job takes well under a minute.
on:
push:
branches: [main]
# NO `paths:` FILTER ON PULL REQUESTS — a required check that never runs is a
# permanent block, not a skipped one.
#
# `main` requires all four checks (verify, test, budget, lint-and-test) before a merge.
# GitHub reports a required check that was never triggered as "Expected — waiting for
# status to be reported", and the pull request can never be merged. With a path filter,
# a PR touching only web/ would deadlock on lint-and-test, and a PR touching only docs/
# would deadlock on all four.
#
# Both jobs finish in well under a minute. Running them on every pull request costs
# less than one afternoon spent working out why a green branch will not merge.
pull_request:
branches: [main]
workflow_dispatch:
defaults:
run:
working-directory: web
jobs:
verify:
# Generated-code drift, type errors, and architecture-boundary violations.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
package_json_file: web/package.json
- uses: actions/setup-node@v4
with:
node-version-file: web/.node-version
cache: pnpm
cache-dependency-path: web/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm verify
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
package_json_file: web/package.json
- uses: actions/setup-node@v4
with:
node-version-file: web/.node-version
cache: pnpm
cache-dependency-path: web/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm test
budget:
# Performance, accessibility, and evidence-consistency budgets are measured
# against real build output, so this gate must build first (§11.6). It also
# re-reads the committed artifacts under artifacts/ — which is why this
# workflow triggers on changes there as well as under web/.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
package_json_file: web/package.json
- uses: actions/setup-node@v4
with:
node-version-file: web/.node-version
cache: pnpm
cache-dependency-path: web/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm budget
- uses: actions/upload-artifact@v4
with:
name: build-output
path: web/dist
retention-days: 7