Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e2a323d
docs: state the no-Python rule in the working agreement
Sep 2, 2026
3b77049
feat: migrate to @pathscale/ui 3.x and complete the Layouts wiring
Sep 7, 2026
a9cce33
fix(deps): pin @pathscale/ui to ^4.0.0
Sep 7, 2026
215ca67
fix(deps): pin @pathscale/ui to ^3.1.0
Sep 7, 2026
81948dd
chore(deps): resolve the lockfile onto @pathscale/ui 3.1.0
Sep 7, 2026
df04fbd
fix(routes): give the Dashboard link a page
Sep 7, 2026
043de4c
test(qa): check the navbar reaches a page, against a real browser engine
Sep 8, 2026
e8d87a4
test(qa): press something, so a dead page cannot pass
Sep 8, 2026
5677a93
test(qa): drive both authentication forms, and record what they refuse
Sep 8, 2026
29a6b40
build: stop committing the lockfile
Sep 9, 2026
e39f0a5
build: pin @solidjs/signals to the release solid-js was cut against
Sep 9, 2026
4cab4aa
fix(home): give the landing title a heading role
Sep 9, 2026
ab110d4
fix(navbar): match the logo link exactly, so it is not current everyw…
Sep 9, 2026
e3e14f6
test(qa): drive both authentication forms to the end
Sep 9, 2026
a393ec2
test(qa): press every link this site has, from every page that draws it
Sep 9, 2026
ac90ece
test(qa): ask for every header control on every route
Sep 9, 2026
721ab92
test(qa): measure the boxes, not only the names
Sep 9, 2026
df32b63
test(qa): ask what each page reports about itself
Sep 9, 2026
9c3897f
test(qa): carry the theme across every surface and put it back
Sep 9, 2026
8c41ee7
ci(qa): run every check group, not only navigation
Sep 9, 2026
8eabb6e
fix(lint-staged): stop routing markdown at a formatter that ignores it
Sep 9, 2026
68cc9e0
docs: say that this repository has an end-to-end suite, and how to ru…
Sep 9, 2026
512be04
fix(dashboard): name the card as the region it is
Sep 9, 2026
631cf46
test(qa): name each surface by something that has a box
Sep 9, 2026
9fbcaf0
test(qa): ask nothing of a glyph the CI runner cannot shape
Sep 9, 2026
531171e
docs(qa): say that CI runs fontless, and what that forbids
Sep 9, 2026
1eaf421
test(qa): verify every UI release surface
Sep 11, 2026
3c04851
chore(ui): finish the 3.2 migration
Sep 11, 2026
2f59793
fix(qa): identify authentication controls
Sep 12, 2026
2e96d66
test(qa): inventory complete application surfaces
Sep 12, 2026
02e2020
chore(ui): use UI 3.2.3
Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .github/workflows/qa.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Run every declared group, including newly added functionality.
name: QA

on:
pull_request:
push:
branches: [master]
workflow_dispatch:

jobs:
rendered-outcomes:
runs-on: ubicloud-standard-4
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install

# The checks drive the built site, not the dev server: what ships is what
# is asked about.
- name: Build
run: bun run build

- name: Headless browser host
id: qa
uses: pathscale/chuzz/.github/actions/headless-host@master
with:
token: ${{ secrets.SIBLING_REPOS_TOKEN }}

- name: Rendered outcomes
env:
# A shared runner is slower than a laptop for outcomes that pass
# locally well inside the budget. This widens scheduling deadlines
# only; every declared transition is still required.
QA_TIMEOUT_SCALE: 2
run: |
ps-qa --app tests/ps-qa/ps-qa.ron \
qa-hosted \
--host "${{ steps.qa.outputs.host }}" \
--page dist --checks tests/ps-qa/checks
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,10 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json

# Finder (MacOS) folder config
.DS_Store

# Lockfiles are not committed. Dependencies are caret ranges, and a committed
# lock holds them still: a recorded version keeps satisfying its range, so
# nothing is ever reconsidered and no build reports that it is behind. Without
# one, each build resolves the newest version in range, and a bad upstream
# release fails the build that picked it up.
bun.lock
46 changes: 45 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,22 @@ natively, and Claude Code loads it through the `@AGENTS.md` import in

## Invariants (don't break these)

- **No Python.** Not a script, not `python3 -c`, not a heredoc. Reaching for it is the
tell that a step is being solved by parsing when the tool that owns the answer could
just be asked. Do not swap it for another parser either, and do not assume `jq` is
present: it does not ship with macOS. A fixed-shape field is one `sed -nE` line;
anything needing real parsing belongs in this repo's own language, where it can be
tested. If a task seems to need Python, the approach is wrong.

- **Read [`docs/frontend-conventions.md`](docs/frontend-conventions.md) before opening
implementation files.** It is the frontend working agreement: SolidJS/`@pathscale/ui`
conventions, and a context-efficient workflow. Reading it first keeps
context small and avoids re-deriving patterns that already exist.
- **`npm run typecheck` must pass.** It is the type gate for this repo; a build succeeding is not the same as types being sound.
- **`npm` is the package manager** — its lockfile is authoritative. Don't introduce a second one by running npm/yarn/pnpm here.
- **`npm` is the package manager.** Do not introduce a second one by running
another package manager here. Its lockfile is not committed: dependencies
are caret ranges, and a committed lock holds them still, because a recorded
version keeps satisfying its range and nothing is ever reconsidered.
- **Docs describe what is true now.** If you change behaviour, update the README and any affected doc in the same change.

## Build & run
Expand All @@ -38,6 +48,40 @@ success.
- A build that finishes suspiciously fast was cached, not rebuilt. Force a real rebuild when
the rebuild is the thing you're verifying.

### The rendered-outcome suite

`tests/ps-qa/checks` holds this site's end-to-end checks: six groups, driven against the
**built** site through a real browser engine rather than through jsdom, so a control that
lays out correctly and draws nothing fails. `.github/workflows/qa.yml` runs every group on
each pull request. To run them locally you need two binaries built from sibling checkouts:

```sh
cargo build --release --bin chuzz-headless # in ~/code/chuzz
cargo build --release -p ps-qa # in ~/code/ps-observability

npm run build
ps-qa --app tests/ps-qa/ps-qa.ron qa-hosted [group] \
--host <path-to>/chuzz-headless --page dist --checks tests/ps-qa/checks
```

Omit the group to run all six. Each check file opens with the reasoning for what it asserts
and, where the site or the engine cannot currently satisfy an assertion, the measurement
that says so — read the header before adding to one.

Checks are bucketed by the surface their `open` names, so **every check must name the
surface it measures** unless it is a deliberate continuation of the one directly above it.
A check with no surface inherits whichever one the previous file left behind.

**Write nothing in `checks/` that needs a glyph.** CI's host is built without
`system-fonts`, so text there shapes to no glyphs: a heading lays out at its line width and
zero height, and a bare inline anchor gets no box at all. Anything asking such a node to
paint, standing it at one end of `Above`/`RightOf`/`ContainedBy`/`DistinctPositions`, or
naming it in a surface marker, fails on a runner while the site is fine. Use `Present` for a
node whose observable is its text, `Count` where the words name more than one node, and a
padded control — a field, a button, `@card` — wherever a box is needed.
`tests/ps-qa/checks-fonts` is the group for the questions that genuinely need a font stack;
it is deliberately not run in CI and its own header says how to run it.

## PR discipline

**Always paste the full PR URL** (`https://github.com/pathscale/ui-starter-app/pull/<n>`), not just the number, so it's
Expand Down
4 changes: 2 additions & 2 deletions biome.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
"$schema": "https://biomejs.dev/schemas/2.5.13/schema.json",
"formatter": {
"enabled": true,
"indentStyle": "space",
Expand All @@ -9,7 +9,7 @@
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"preset": "recommended",
"correctness": {
"noUnusedVariables": "error",
"noInvalidPositionAtImportRule": "off"
Expand Down
Loading
Loading