From 23965eede38cbf78fe8065623e711ca1f6a91f1f Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:30:29 +0000 Subject: [PATCH 1/9] test: run supabase function suites under vitest Include supabase/functions/** in the vitest glob so the nine Deno-style test files (64 cases) execute in every npm test run instead of never running anywhere. A small globalThis.Deno shim registers Deno.test cases as vitest tests and maps readTextFile path shapes produced by vite back to disk; a tiny alias stands in for the single deno.land std assert import. The same files keep working under deno test. --- bun.lockb | Bin 259235 -> 0 bytes src/test/deno-assert-shim.ts | 11 +++++++ src/test/deno-compat.ts | 62 +++++++++++++++++++++++++++++++++++ vitest.config.ts | 16 +++++++-- 4 files changed, 86 insertions(+), 3 deletions(-) delete mode 100755 bun.lockb create mode 100644 src/test/deno-assert-shim.ts create mode 100644 src/test/deno-compat.ts diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 55d32ce05e845541b3f56910d5c3009695e9165d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259235 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 { + const href = input instanceof URL ? input.href : input; + const isFileUrl = input instanceof URL ? input.protocol === "file:" : href.startsWith("file:"); + let candidate: string; + if (isFileUrl) { + candidate = fileURLToPath(input instanceof URL ? input : new URL(href)); + } else { + const atFsIndex = href.indexOf("/@fs/"); + if (atFsIndex !== -1) { + candidate = decodeURIComponent(href.slice(atFsIndex + 4)); + } else if (/^https?:\/\//i.test(href)) { + candidate = decodeURIComponent(new URL(href).pathname); + } else { + candidate = href; + } + } + if (!existsSync(candidate) && candidate.startsWith("/") && existsSync(`${process.cwd()}${candidate}`)) { + return `${process.cwd()}${candidate}`; + } + return candidate; + }; + + const readTextFile = async (input: string | URL): Promise => + readFileSync(toFilePath(input), "utf8"); + + (globalThis as { Deno?: Record }).Deno = { + test: (...args: unknown[]): void => { + const fn = args.filter((arg) => typeof arg === "function").pop() as + | (() => unknown) + | undefined; + if (!fn) throw new Error("Deno.test shim requires a test function argument"); + const first = args[0]; + const name = + typeof first === "string" + ? first + : first && typeof first === "object" && "name" in first && typeof first.name === "string" + ? first.name + : "unnamed deno test"; + it(name, () => { + return fn(); + }); + }, + env: { + get: (_key: string): string | undefined => undefined, + toObject: (): Record => ({}), + }, + readTextFile, + }; +} diff --git a/vitest.config.ts b/vitest.config.ts index c54fd4412..d47ad3a2c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -7,8 +7,11 @@ export default defineConfig({ test: { environment: "jsdom", globals: true, - setupFiles: ["./src/test/setup.ts"], - include: ["src/**/*.{test,spec}.{ts,tsx}"], + setupFiles: ["./src/test/setup.ts", "./src/test/deno-compat.ts"], + include: [ + "src/**/*.{test,spec}.{ts,tsx}", + "supabase/functions/**/*.{test,spec}.{ts,tsx}", + ], coverage: { provider: "v8", // Omit `all` intentionally: this is a selected-scope gate for the audited @@ -35,6 +38,13 @@ export default defineConfig({ }, }, resolve: { - alias: { "@": path.resolve(__dirname, "./src") }, + alias: { + "@": path.resolve(__dirname, "./src"), + // Run Deno-flavored function tests under vitest without rewriting them. + "https://deno.land/std@0.224.0/assert/mod.ts": path.resolve( + __dirname, + "./src/test/deno-assert-shim.ts", + ), + }, }, }); From c930d2d30656b755dd76169d29932ae3920e7b24 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:30:44 +0000 Subject: [PATCH 2/9] ci: gate pull requests and enforce coverage thresholds Add a pull_request trigger so branches are checked before merge, run vitest with --coverage in CI so the configured 90/80/89/90 gates fail the job on regression, and require the push event (plus Docker Hub secrets) before QEMU/buildx/publish steps run so PR builds never push images. --- .github/workflows/deploy.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c6b3beeb4..37c3aaf04 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,13 +3,14 @@ name: Build and Push Docker Image on: push: branches: [ "main" ] + pull_request: workflow_dispatch: jobs: build: runs-on: ubuntu-latest env: - DOCKER_PUSH: ${{ secrets.DOCKER_USERNAME != '' && secrets.DOCKER_PASSWORD != '' }} + DOCKER_PUSH: ${{ github.event_name == 'push' && secrets.DOCKER_USERNAME != '' && secrets.DOCKER_PASSWORD != '' }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -29,15 +30,17 @@ jobs: run: npm run typecheck - name: Test - run: npm test + run: npm test -- --coverage - name: Build run: npm run build - name: Set up QEMU + if: env.DOCKER_PUSH == 'true' uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx + if: env.DOCKER_PUSH == 'true' uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub @@ -49,6 +52,7 @@ jobs: # Create a minimal Dockerfile for multi-arch that just uses pre-built assets - name: Create production Dockerfile + if: env.DOCKER_PUSH == 'true' run: | cat > Dockerfile.prod << 'EOF' FROM nginx:alpine From dd31e49ccdeeed7a1d015fca7254b768eb76e177 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:31:01 +0000 Subject: [PATCH 3/9] chore: add verify script, drop stale bun.lockb, add verification plan npm run verify chains lint, typecheck, coverage-gated tests, and build as the one command agents run before opening a PR. bun.lockb is stale drift: every pipeline path uses npm and package-lock.json. The plan doc describes the full agent verification loop this change starts. --- package.json | 3 +- plans/agent-verification-loop.md | 187 +++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 plans/agent-verification-loop.md diff --git a/package.json b/package.json index ea0e89af2..c41bb817e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "test:coverage": "vitest run --coverage", "test:watch": "vitest", "test:e2e": "playwright test", - "test:e2e:ui": "playwright test --ui" + "test:e2e:ui": "playwright test --ui", + "verify": "npm run lint && npm run typecheck && npm test -- --coverage && npm run build" }, "dependencies": { "@capacitor/app": "^8.1.0", diff --git a/plans/agent-verification-loop.md b/plans/agent-verification-loop.md new file mode 100644 index 000000000..01771925c --- /dev/null +++ b/plans/agent-verification-loop.md @@ -0,0 +1,187 @@ +# Agent Verification Loop + +Goal: make DebateLab verifiable by agents end to end, so bugs are caught inside the development loop instead of by users on production. + +Basis: Theo's thesis that coding is solved and the verification layer is not. This repo proves the point. Agents here can already write code well. What they cannot do today is prove their work: the e2e suite uses fake JWTs, coverage thresholds never fire, four backend test files never execute, PRs gate on nothing, and there is no way for an agent to hold a real authenticated session. This plan closes those gaps in five phases. + +## Current state, verified 2026-08-26 + +What exists: + +- Commands: `npm run lint`, `npm run typecheck`, `npm test`, `npm run test:coverage`, `npm run test:e2e`, `npm run build`. +- CI (`.github/workflows/deploy.yml`): on push to main only. Runs lint, typecheck, vitest, build, then pushes a multi-arch image to Docker Hub (`adamgaborjaniszabo/debate-trainer:latest`). VPS pickup happens off-repo. +- Vitest: ~63 test files, ~630 cases under `src/test`. Coverage thresholds (90/80/89/90) configured over 8 audited modules, enforced only when `--coverage` is passed manually. +- Playwright: two render-smoke specs, Chromium-only, auto-starts `npm run dev` on :8080. Auth is a stubbed localStorage session with a bogus token, good only for render checks. +- Supabase: 12 edge functions, manual CLI deploys, currently linked to prod project `uziwdtkzofptihahfooo`. A staging project `brifeyypjauyusmkptkx` exists and its anon creds ship in `src/lib/supabase/env.ts`, but migrations, functions, secrets, and CORS were never applied or verified. The env switcher (`setActiveEnv`) has zero callers. + +What is broken or missing, ranked by risk: + +1. `vitest.config.ts:11` includes only `src/**`, so the 28 cases in `supabase/functions/**/*.test.ts` (prompt-builder, source-quality, url-validation, native-cors) never run anywhere. +2. Coverage gates never run in CI; `deploy.yml` invokes bare `npm test`. +3. No `pull_request` trigger, so PRs merge ungated. +4. Edge function handlers (Stripe checkout, portal, webhook, redeem-promo, admin) have zero automated execution. Money paths ride on review alone. +5. No real authenticated path in e2e. `demo-code-login` works server-side but nothing in `src/` calls it, no tooling mints codes, no seed users exist. +6. Staging Supabase is created but almost certainly empty; every function's `ALLOWED_ORIGINS` lacks a staging origin. +7. No WebKit/Firefox projects although `plans/smoke-test-checklist.md` names Safari streaming as the likeliest breakage. +8. TypeScript `strict: false`; typecheck is a weak signal. ESLint has `no-unused-vars` off. +9. Observability dead in the Docker path: Sentry DSN unset at build time and nginx CSP omits the Sentry/PostHog origins that `vercel.json` allows. +10. README drift: wrong repo name, Pi/port-3001 hosting story, obsolete `VITE_SUPABASE_*` guidance. Dual lockfiles: `package-lock.json` canonical, stale `bun.lockb` tracked. + +## Target outcome + +One command an agent runs on any branch: + +``` +npm run verify +``` + +runs lint, typecheck, unit tests with enforced coverage, build, and e2e against a real staging environment with a real session, and produces pass/fail plus failure evidence (trace, screenshot, video). CI enforces the same on every PR. When an agent cannot verify something, the repo tells it why and what to build next, via AGENTS.md. + +## Phase 0: Make the checks that exist actually run + +Small, high-leverage, no new infrastructure. + +### Task 0.1: Include Supabase function tests in vitest + +- Modify: `vitest.config.ts:11` +- Change include to `["src/**/*.{test,spec}.{ts,tsx}", "supabase/functions/**/*.{test,spec}.{ts,tsx}"]`. +- Risk: those tests may use Deno-flavored imports. Run `npx vitest run supabase/functions` first. If a test fails on Deno globals, either shim in `src/test/setup.ts` or move the tested pure logic into `_shared/` modules importable by both. Do not weaken assertions to make them pass. +- Verify: `npx vitest run supabase/functions` exits 0 with 28+ passing cases. + +### Task 0.2: Enforce coverage in CI + +- Modify: `.github/workflows/deploy.yml` +- Change the test step to `npm test -- --coverage`. Thresholds in `vitest.config.ts` then fail the job on regression. Keep the inline TODO comment accurate afterward. +- Verify: push a branch with a deliberate assertion deletion, confirm the workflow goes red, revert. + +### Task 0.3: Gate pull requests + +- Modify: `.github/workflows/deploy.yml` +- Add `pull_request:` trigger (any branch) running lint, typecheck, tests with coverage, and build. Docker push steps stay behind the existing secrets check so PR runs never publish. +- Verify: open a draft PR with a failing test, confirm required checks fail, then fix. + +### Task 0.4: Lockfile hygiene + +- Delete `bun.lockb` (stale, unused by CI/Docker/Vercel, all npm). Optionally gitignore it. One-line decision, removes drift bait. + +### Task 0.5: Umbrella verify script + +- Modify: `package.json` scripts. +- Add `"verify": "npm run lint && npm run typecheck && npm test -- --coverage && npm run build"`. E2E joins in Phase 3 once it needs no human. + +## Phase 1: Write down how to verify (AGENTS.md) + +Agents need the playbook in the repo. Create `AGENTS.md` at root: + +- Canonical commands (the ones above), node 22, npm, ports 8080/54321. +- Environment model: creds resolve in `src/lib/supabase/env.ts` from `localStorage['debate-supabase-env']`, prod vs staging refs, what IS_STAGING changes. +- Verification ladder: static checks, unit, coverage, build, e2e smoke, e2e authed flows (once Phase 3 lands), then manual browser only for visual judgment. +- Rule: if a change cannot be verified because tooling is missing, stop and propose the missing piece rather than merging blind. This encodes Theo's "agent notices it can't test, then builds the missing piece". +- Evidence rule: attach trace/screenshot output or state plainly that verification did not happen. Never claim untested work passed. +- Fix README.md drift in the same commit: repo name, Hetzner + port 8080 + cloudflared story, remove `VITE_SUPABASE_URL/ANON_KEY` guidance, correct workflow filename. + +Verify: fresh-agent test, give a subagent only AGENTS.md and ask it to describe how to run and verify the app. It should answer correctly without reading other files. + +## Phase 2: Finish staging so agents have a safe sandbox + +Staging project `brifeyypjauyusmkptkx` exists. Everything below targets it, never prod. + +### Task 2.1: Audit staging state + +- `npx supabase link --project-ref brifeyypjauyusmkptkx`, then `npx supabase migration list` and a probe request to one function URL. +- Record what exists. Expect: empty. + +### Task 2.2: Apply schema and functions + +- `npx supabase db push` (all 19 migrations). +- `npx supabase functions deploy` each of the 12 functions. +- Set non-provider secrets: `SUPABASE_SERVICE_ROLE_KEY` handled by platform; set `DEMO_CODE_PEPPER` to a staging-only random value. +- Provider keys (`OPENAI_API_KEY`, `GOOGLE_API_KEY`, `ANTHROPIC_API_KEY`, `EXA_API_KEY`): Adam supplies values via `supabase secrets set`; never through chat, never in files. Stripe keys deferred until payment flows get e2e coverage. + +### Task 2.3: CORS for staging callers + +- Each function hardcodes an `ALLOWED_ORIGINS` array including `localhost:8080/5173/54321`. Localhost already covers the agent loop, so no change strictly required for Phase 3. If a hosted staging domain is wanted later (e.g. `debate-staging.pi-stack.org` via cloudflared), add it to every array in the same commit. Adam owns the tunnel route. + +### Task 2.4: Deterministic env for tests + +- Modify `src/lib/supabase/env.ts`: read `import.meta.env.VITE_FORCE_SUPABASE_ENV` as initial default for the active env (localStorage still wins). Build-time override, no runtime UI needed. +- Verify: `VITE_FORCE_SUPABASE_ENV=staging npm run dev`, check network tab hits `brifeyypjauyusmkptkx.supabase.co`. + +### Task 2.5: Seed script + +- Create `scripts/seed-staging.ts`: uses service-role key from `STAGING_SERVICE_ROLE_KEY` env var (read at runtime, never committed). Creates one test user, mints a demo access code row with `sha256(pepper:code)` matching the staged `DEMO_CODE_PEPPER`, prints the plaintext code to stdout once. +- Document in AGENTS.md. Rollback: staging is disposable; wipe and re-run. + +## Phase 3: Real authenticated e2e, the actual bug catcher + +This is the phase that catches Peter's-truncated-text-class bugs: things invisible in code review. + +### Task 3.1: Auth setup project + +- Create `e2e/auth.setup.ts`: calls `demo-code-login` on staging with the seeded code, completes `verifyOtp({ type: 'magiclink' })` via the staging anon client, saves valid storageState to `test-results/.auth/staging.json`. +- Modify `playwright.config.ts`: add a `setup` project depending on nothing, authed projects depend on it with `use: { storageState }`. Public specs stay storage-free. +- Env needed in CI/local: `STAGING_URL`, seeded demo code. Values come from the seed step; store locally in `.env.e2e` (gitignored). + +### Task 3.2: First real flow specs + +- Create `e2e/authed-flows.spec.ts` covering, in order of value: + 1. Login persists across reload; user menu shows the test identity. + 2. Ask: submit a prompt, assert streamed tokens arrive (SSE works, error boundary silent). + 3. History: conversation appears after the ask; reload keeps it. + 4. Sources: import `https://example.com`, assert it lands in the library. + 5. Share: share a session, open the public URL logged-out, assert content renders. +- Cost control: pin these specs to the cheapest provider/model via the staging `AI_DEFAULT_MODEL` secret; three short conversations per run is cents. + +### Task 3.3: Browser breadth and failure evidence + +- Add `webkit` project to `playwright.config.ts` (Safari parity, the checklist's known risk). Install deps once: `npx playwright install --with-deps webkit`. +- Config: `video: 'on'`, `trace: 'retain-on-failure'`, screenshot on failure. +- CI: upload `playwright-artifacts` on failure; add `test:e2e` to the PR workflow (public smoke at minimum; authed flows require the staging secrets as GitHub secrets). +- Extend `npm run verify` with e2e once green locally. + +## Phase 4: Prove it, observe it + +- Evidence convention in AGENTS.md: agents attach traces/screenshots via `gh pr comment` uploads or link CI artifacts. Never commit media to the repo. +- Observability: pass `VITE_SENTRY_DSN` as a Docker build arg in `deploy.yml`; align `nginx.conf` CSP `connect-src` with `vercel.json` (add `*.ingest.sentry.io`, `eu.i.posthog.com`). Prod errors become visible to agents fixing incidents instead of invisible to everyone. +- Commit the VPS pickup step: whatever pulls `debate-trainer:latest` on codex-remote (watchtower or systemd timer) gets a compose/unit file in-repo, making the last invisible hop observable and re-runnable. Adam confirms which mechanism runs today before we codify it. +- Optional, decide explicitly: Vercel PR previews (project still linked) would give every PR a live URL humans and agents can poke. Conflicts with Docker-as-canonical unless kept preview-only. + +## Phase 5: The autonomous loop + +Only after Phases 0-3 are green: + +- Nightly full-suite cron on codex-remote (tmux or systemd timer): `npm run verify` + authed e2e against staging, failures reported with artifacts. Fits Adam's watchdog pattern: execute safe diagnosis automatically, alert with evidence. +- Bug intake rule in AGENTS.md: every bug report becomes a failing repro test first, fix second. Mirrors Theo's claim that speced bugs plus minimal verification get solved by frontier agents. +- Later candidates, not committed here: deno check/lint of `supabase/functions` in CI, incremental `strict: true` tsconfig ramp, CodeRabbit re-run against the new baseline. + +## Who does what + +Agent-executable: all of Phase 0, AGENTS.md, README fixes, seed script, e2e code, config changes, docs. + +Adam-only: + +- Provide staging provider secret values via `supabase secrets set` (never chat, never files). +- Choose and disclose the VPS image-pickup mechanism. +- Decide: delete `bun.lockb`, enable Vercel previews or not, staging tunnel domain or localhost-only. +- Approve any GitHub settings change making PR checks required/branch protection. + +Secret handling rules: service-role and pepper values only via env vars or `supabase secrets set`; `.env*` stays gitignored; no secret ever printed in logs, commits, or PR comments; staging secrets distinct from prod. + +## Acceptance test for the whole plan + +On a fresh clone, an agent with only AGENTS.md and `.env.e2e`: + +1. Runs `npm ci && npm run verify`, all green including coverage gates. +2. Makes a deliberate bug (break the share page render), runs verify, watches e2e fail with a saved trace naming the broken page. +3. Opens a PR; CI independently reproduces the red gate. +4. Reverts, everything green again. + +That loop, repeated hundreds of times, is the verification layer. Bugs die in the loop instead of on production. + +## Risks and rollback + +- Flaky authed e2e erodes trust fast. Mitigation: retries only in CI, tight selectors, staging pinned cheap model, quarantine-and-fix policy for flaky specs within 48h. +- Staging drift (migrations applied out of order, secrets rotated silently). Mitigation: seed script is idempotent; AGENTS.md documents refresh procedure; staging is disposable by design. +- Provider cost runaway from scheduled e2e. Mitigation: daily-limit override caps the demo user; nightly cron is the only scheduled consumer. +- Phase 0 coverage enforcement may immediately redden CI if the 81.56% branches baseline dipped since the TODO was written. Mitigation: run `npm test -- --coverage` locally first; fix gaps before merging the workflow change, not by lowering thresholds. +- Rollback: every phase is additive config plus docs. Reverting the workflow edit restores old CI; deleting the e2e auth setup restores smoke-only; staging can be wiped without touching prod. Nothing here writes to prod except the eventual nginx/Sentry header alignment, which ships through the normal gated pipeline. From 75e16d22e98da34a82738f2741413ea6cfd7f104 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:40:50 +0000 Subject: [PATCH 4/9] ci: harden workflow per review Gate the build-push step on DOCKER_PUSH so pull requests never invoke buildx against a missing Dockerfile.prod, pin every action to its current immutable commit SHA, add least-privilege permissions and a concurrency group. Plan doc now keeps the staging access code out of stdout entirely: it goes to gitignored .env.e2e only. --- .github/workflows/deploy.yml | 20 ++++++++++++++------ plans/agent-verification-loop.md | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 37c3aaf04..1621adfec 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,6 +6,13 @@ on: pull_request: workflow_dispatch: +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest @@ -13,10 +20,10 @@ jobs: DOCKER_PUSH: ${{ github.event_name == 'push' && secrets.DOCKER_USERNAME != '' && secrets.DOCKER_PASSWORD != '' }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - name: Set up Node - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: 22 @@ -37,15 +44,15 @@ jobs: - name: Set up QEMU if: env.DOCKER_PUSH == 'true' - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 - name: Set up Docker Buildx if: env.DOCKER_PUSH == 'true' - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - name: Login to Docker Hub if: env.DOCKER_PUSH == 'true' - uses: docker/login-action@v3 + uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -64,7 +71,8 @@ jobs: EOF - name: Build and push - uses: docker/build-push-action@v5 + if: env.DOCKER_PUSH == 'true' + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5 with: context: . file: Dockerfile.prod diff --git a/plans/agent-verification-loop.md b/plans/agent-verification-loop.md index 01771925c..a9c83da60 100644 --- a/plans/agent-verification-loop.md +++ b/plans/agent-verification-loop.md @@ -109,7 +109,7 @@ Staging project `brifeyypjauyusmkptkx` exists. Everything below targets it, neve ### Task 2.5: Seed script -- Create `scripts/seed-staging.ts`: uses service-role key from `STAGING_SERVICE_ROLE_KEY` env var (read at runtime, never committed). Creates one test user, mints a demo access code row with `sha256(pepper:code)` matching the staged `DEMO_CODE_PEPPER`, prints the plaintext code to stdout once. +- Create `scripts/seed-staging.ts`: uses service-role key from `STAGING_SERVICE_ROLE_KEY` env var (read at runtime, never committed). Creates one test user, mints a demo access code row with `sha256(pepper:code)` matching the staged `DEMO_CODE_PEPPER`, and writes the plaintext code only to `.env.e2e` (gitignored, mode 600) for local e2e use. The script never prints secrets; automated CI runs consume masked GitHub secret values instead of minting codes. - Document in AGENTS.md. Rollback: staging is disposable; wipe and re-run. ## Phase 3: Real authenticated e2e, the actual bug catcher From cac4a60784e3fb50f83c881fac385103895b4981 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:51:45 +0000 Subject: [PATCH 5/9] ci: drop checkout credential persistence; scope staging e2e to trusted refs Pull-request jobs run PR-controlled npm scripts, so the workflow must not leave GITHUB_TOKEN in .git/config. The plan now keeps every pull-request job credential-free and runs authenticated staging specs only on main pushes or manual dispatch inside a protected environment. --- .github/workflows/deploy.yml | 2 ++ plans/agent-verification-loop.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1621adfec..d13f94abf 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,6 +21,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 diff --git a/plans/agent-verification-loop.md b/plans/agent-verification-loop.md index a9c83da60..fd9d3ffc4 100644 --- a/plans/agent-verification-loop.md +++ b/plans/agent-verification-loop.md @@ -136,7 +136,7 @@ This is the phase that catches Peter's-truncated-text-class bugs: things invisib - Add `webkit` project to `playwright.config.ts` (Safari parity, the checklist's known risk). Install deps once: `npx playwright install --with-deps webkit`. - Config: `video: 'on'`, `trace: 'retain-on-failure'`, screenshot on failure. -- CI: upload `playwright-artifacts` on failure; add `test:e2e` to the PR workflow (public smoke at minimum; authed flows require the staging secrets as GitHub secrets). +- CI: upload `playwright-artifacts` on failure. Add `test:e2e` public smoke (credential-free) to every pull request. Authenticated staging specs run only on trusted refs (`push` to main, `workflow_dispatch`) inside a protected GitHub environment holding the staging secrets; pull-request jobs stay credential-free because they execute PR-controlled test code that must never see credentials. - Extend `npm run verify` with e2e once green locally. ## Phase 4: Prove it, observe it From 192a3d02d9382a502b9bcb50c2436d47e6ef16bf Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 08:58:40 +0000 Subject: [PATCH 6/9] docs: require main ref for authenticated staging e2e runs workflow_dispatch can target any branch, so the plan gates the credential-carrying job on github.ref == refs/heads/main plus an environment branch policy, with a dispatch-from-branch acceptance case. --- plans/agent-verification-loop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plans/agent-verification-loop.md b/plans/agent-verification-loop.md index fd9d3ffc4..e859b6e8a 100644 --- a/plans/agent-verification-loop.md +++ b/plans/agent-verification-loop.md @@ -136,7 +136,7 @@ This is the phase that catches Peter's-truncated-text-class bugs: things invisib - Add `webkit` project to `playwright.config.ts` (Safari parity, the checklist's known risk). Install deps once: `npx playwright install --with-deps webkit`. - Config: `video: 'on'`, `trace: 'retain-on-failure'`, screenshot on failure. -- CI: upload `playwright-artifacts` on failure. Add `test:e2e` public smoke (credential-free) to every pull request. Authenticated staging specs run only on trusted refs (`push` to main, `workflow_dispatch`) inside a protected GitHub environment holding the staging secrets; pull-request jobs stay credential-free because they execute PR-controlled test code that must never see credentials. +- CI: upload `playwright-artifacts` on failure. Add `test:e2e` public smoke (credential-free) to every pull request. Authenticated staging specs run only when `github.ref == 'refs/heads/main'`, further gated by a protected GitHub environment with a selected-branch rule of main only; pull-request jobs and non-main dispatch runs stay credential-free because they execute PR-controlled test code that must never see staging secrets. Add an acceptance case: dispatch from a non-main branch and confirm the authenticated job skips. - Extend `npm run verify` with e2e once green locally. ## Phase 4: Prove it, observe it From b4cad7ee748598f2d75dfa2b3f9cb743566b41a1 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 11:18:57 +0000 Subject: [PATCH 7/9] chore: verify CI and preview wiring after org migration From 35ce7e2f71dc06d2065eb8e33441ad97aac8ff87 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 11:32:57 +0000 Subject: [PATCH 8/9] test: extend Deno shim for env mutation and loopback serve PR #9's research tests mutate env vars and exercise abort semantics against a Deno.serve loopback server. The shim now backs Deno.env set/delete with process.env and routes matching fetch calls to the registered handler through a signal-wired body stream, preserving native abort behavior without real sockets. --- src/test/deno-compat.ts | 90 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/src/test/deno-compat.ts b/src/test/deno-compat.ts index 936401d55..4fd7b2a85 100644 --- a/src/test/deno-compat.ts +++ b/src/test/deno-compat.ts @@ -36,6 +36,85 @@ if (!("Deno" in globalThis)) { const readTextFile = async (input: string | URL): Promise => readFileSync(toFilePath(input), "utf8"); + // Loopback Deno.serve replacement: instead of binding a real socket, the + // shim records the handler and routes matching fetch calls to it directly. + // Synchronous return with an addr object keeps Deno.serve call shapes valid. + type LoopbackHandler = (request: Request) => Response | Promise; + let loopback: { matches: (url: URL) => boolean; handler: LoopbackHandler } | null = null; + const LOOPBACK_DEFAULT_PORT = 43111; + + if (!("__denoLoopbackFetchPatched" in globalThis)) { + (globalThis as { __denoLoopbackFetchPatched?: boolean }).__denoLoopbackFetchPatched = true; + const originalFetch = globalThis.fetch.bind(globalThis); + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise => { + const url = new URL(input instanceof Request ? input.url : String(input)); + if (loopback && loopback.matches(url)) { + const response = await loopback.handler(new Request(url, init)); + // Native fetch binds the caller's signal to the body stream so an + // aborted read rejects instead of stalling. Reproduce that here. + const signal = init?.signal ?? (input instanceof Request ? input.signal : undefined); + if (!signal || !response.body) { + return response; + } + const reader = response.body.getReader(); + const wired = new ReadableStream({ + start(controller) { + const abort = () => { + void reader.cancel().catch((): undefined => undefined); + controller.error( + signal.reason ?? new DOMException("The operation was aborted", "AbortError"), + ); + }; + if (signal.aborted) { + abort(); + return; + } + signal.addEventListener("abort", abort, { once: true }); + const pump = (): Promise => + reader.read().then(({ done, value }) => { + if (signal.aborted) { + return; + } + if (done) { + controller.close(); + return; + } + controller.enqueue(value); + return pump(); + }, (error) => controller.error(error)); + void pump(); + }, + cancel: (): Promise => reader.cancel().catch((): undefined => undefined), + }); + return new Response(wired, { status: response.status, headers: response.headers }); + } + return originalFetch(input as Parameters[0], init); + }; + } + + const serve = ( + options: { hostname?: string; port?: number }, + handler: LoopbackHandler, + ): { + addr: { transport: string; hostname: string; port: number }; + shutdown: () => Promise; + finished: Promise; + } => { + const hostname = options?.hostname ?? "127.0.0.1"; + const port = options?.port && options.port > 0 ? options.port : LOOPBACK_DEFAULT_PORT; + loopback = { + matches: (url) => url.hostname === hostname && url.port === String(port), + handler, + }; + return { + addr: { transport: "tcp", hostname, port }, + shutdown: async () => { + loopback = null; + }, + finished: Promise.resolve(), + }; + }; + (globalThis as { Deno?: Record }).Deno = { test: (...args: unknown[]): void => { const fn = args.filter((arg) => typeof arg === "function").pop() as @@ -54,9 +133,16 @@ if (!("Deno" in globalThis)) { }); }, env: { - get: (_key: string): string | undefined => undefined, - toObject: (): Record => ({}), + get: (key: string): string | undefined => process.env[key], + set: (key: string, value: string): void => { + process.env[key] = value; + }, + delete: (key: string): void => { + delete process.env[key]; + }, + toObject: (): Record => ({ ...process.env }), }, readTextFile, + serve, }; } From b659d088e4338cecd926abe1d4b7c65f4966d20a Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 Aug 2026 11:41:36 +0000 Subject: [PATCH 9/9] fix: capture scroll anchor before delayed callback The generate-complete scroll used a bare setTimeout that dereferenced document after up to 100ms. Under slower CI workers the callback fired after the test environment tore down, surfacing as an unhandled ReferenceError: document is not defined and failing the run even with every test and coverage gate passing. Capturing the element synchronously removes the teardown race without changing app behavior. --- src/pages/GeneratePage.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/GeneratePage.tsx b/src/pages/GeneratePage.tsx index 898a031f9..cc93f53f0 100644 --- a/src/pages/GeneratePage.tsx +++ b/src/pages/GeneratePage.tsx @@ -60,7 +60,11 @@ export default function GeneratePage() { setDiscoveredSources(sources); setGenerateResult(result); toast({ title: t('generate.complete', 'Generate complete'), description: t('generate.completeDesc', 'Your debate case is ready.'), variant: 'success' }); - setTimeout(() => document.getElementById('generate-results')?.scrollIntoView({ behavior: 'smooth', block: 'start' }), 100); + // Capture the node now; the delayed callback must not touch the global + // document after this async flow may have been torn down (test and + // unmount safety). + const resultsAnchor = document.getElementById('generate-results'); + setTimeout(() => resultsAnchor?.scrollIntoView({ behavior: 'smooth', block: 'start' }), 100); } catch (error) { console.error('Failed to generate case:', error);