···11+# wisp.place E2E Harness
22+33+Runs the full path with Docker Compose:
44+55+1. Main app signs into a real ATProto test account through Playwright OAuth.
66+2. The harness claims a random `*.wisp.place` domain.
77+3. The harness uploads a small site through `/wisp/upload-files`.
88+4. The firehose service receives the `place.wisp.fs` event and writes files to MinIO/S3.
99+5. The hosting service serves the mapped domain, first from cold/S3, then from hot memory.
1010+6. The harness deletes the claimed domain and verifies hosting stops serving the cached domain route.
1111+7. The harness deletes the site record and verifies firehose plus hosting cache invalidation stops direct site serving.
1212+1313+Required environment:
1414+1515+```sh
1616+export E2E_ATPROTO_HANDLE='test.example.com'
1717+export E2E_ATPROTO_PASSWORD='...'
1818+```
1919+2020+Run:
2121+2222+```sh
2323+bun run e2e:harness
2424+```
2525+2626+Tear down volumes:
2727+2828+```sh
2929+bun run e2e:harness:down
3030+```
3131+3232+Useful overrides:
3333+3434+```sh
3535+E2E_CLEANUP=false
3636+E2E_HEADLESS=false
3737+E2E_TIMEOUT_MS=300000
3838+E2E_DOMAIN_HANDLE=e2e-my-run
3939+E2E_SITE_RKEY=e2e-my-run
4040+```