Files
zooqueenandHanzo Dev ff7f517985 Release publishes tabs.hanzo.ai to the Sites plane from the forge
Both workflows live in .hanzo/workflows, which git.hanzo.ai runs. Release
installs with pnpm, typechecks, tests, exports, checks the sheet is in the
export, and publishes `out/` through hanzoai/ci's site action as project
`tabs`, the prefix the tabs.hanzo.ai route serves. The deploy key comes
from KMS; no bucket credential is held.

hanzo.yml's gates install with pnpm, since `catalog:` specs only resolve
there, and package-lock.json goes with npm.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 11:19:58 -07:00

42 lines
2.1 KiB
YAML

# Canonical CI/CD config for hanzoai/tabs — the one file both the hanzoai/ci
# reusable (.hanzo/workflows/cicd.yml) and platform.hanzo.ai read.
#
# Tabs IS deployed from this repo — `.hanzo/workflows/release.yml` publishes the
# static export to the Sites plane (project `tabs`) on every push to main, and
# that is what tabs.hanzo.ai serves. There is no `images:` and no `deploy:` here
# because neither describes that: the ingress serves the export straight from
# s3://hanzo-sites/hanzo/tabs, so this repo builds no image and rolls out no
# workload. Read the absence as "nothing to build", not as "nothing ships".
#
# The gate is typecheck, the jest suite, and the surface guard. Jest is
# deliberately narrow and says so in its own config — "pure logic only: the
# layout tree and the shell bindings; everything that needs a browser is
# verified against a real one" — so panes/tiles assert the split arithmetic that
# browser tests would only observe indirectly.
#
# The surface guard is the other half of that sentence, and until it existed
# nothing kept it. It builds the export and walks every screen a stranger can
# reach at 390, 768 and 1440, asserting four things a reader is owed: the page
# does not scroll sideways, every control is at least 44px tall, every colour
# pair clears AA against the background it actually sits on, and no run of prose
# is under 12px. Four defects were live when it was written and it reports all of
# them; the readings are soft so one does not hide the next.
#
# What it does NOT check: line breaking. A widowed last line is a measure
# decision, and a rule general enough to catch one would flag prose that is fine.
test:
- name: build
run: |
set -e
pnpm install --frozen-lockfile
pnpm typecheck
pnpm test
- name: surface
run: |
set -e
# The runner image bakes browsers under /opt/playwright as root, so the
# job's own copy goes where the job may write.
export PLAYWRIGHT_BROWSERS_PATH="$PWD/.cache/ms-playwright"
pnpm exec playwright install chromium
pnpm test:surface