Files
works/playwright.config.ts
zeekay 81660426dc hanzo.works: the business capabilities, as the addresses that serve them
A one-page site for the operator's half of the cloud — sales, marketing,
support, books, cap table, incorporation, workflows — built so that a claim
and a served route are the same object.

Every card names a real capability, its real /v1 address, and the sentence
that capability publishes about itself: its Go package doc, lifted into the
OpenAPI tag and read back out of public.yaml, the ga-only public contract.
Copy therefore cannot outrun the fleet. A gate asserts llms.txt still names
every capability the page shows, because the drift that matters is the one
where the site tells a person about something it never tells a model.

robots.txt names the AI crawlers and allows them, and declares
Content-Signal: search=yes, ai-input=yes, ai-train=yes. It carries no
Disallow, and a gate fails the build if one appears.

Auth is Hanzo IAM and nothing else — PKCE-S256, which is what lets a static
export run it with no server. The gates prove it against the real issuer
rather than asserting it.
2026-08-21 08:10:05 -07:00

25 lines
732 B
TypeScript

import { defineConfig, devices } from '@playwright/test'
const PORT = 4319
export default defineConfig({
testDir: './e2e',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 1 : 0,
reporter: process.env.CI ? 'list' : 'html',
use: {
baseURL: `http://127.0.0.1:${PORT}`,
trace: 'retain-on-failure',
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
// The subject is `out/` — the bytes that ship — never a dev server. A dev
// server rebuilds on demand and would let a broken export pass.
webServer: {
command: 'node e2e/serve.mjs',
url: `http://127.0.0.1:${PORT}/`,
reuseExistingServer: !process.env.CI,
timeout: 30_000,
},
})