The shared e2e auth account is only enrolled in module 0 (prework), so
module 1 is locked and now returns lessons: [] after the locked-module
mask. Point the list-detail test at module 0 to match what the account
can actually see.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The first-poll diagnostic dumped the 5 most recent emails from the
shared Resend account, including their `to` field, leaking unrelated
customer addresses into CI logs. Replace with a counts-only summary
and drop the recipient from the timeout error message.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
list now returns module 0 (prework) first, and the shared test account
is only enrolled in module 0 — switch the get fixtures from m1l1 to
m0l1 and update the list assertion to expect module 0 at index 0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When the backend rate-limits magic-link requests (e.g. from CI re-runs),
tests now skip with a clear message rather than hard-failing the entire
suite. AuthRateLimitedError is caught in beforeAll and sets authSkipped
flag that each test checks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
auth-flow.test.ts now uses ensureSharedAuth() (single login per run)
and verifies the resulting auth.json, rather than triggering a
duplicate login that gets rate-limited by the backend.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
In --json mode the error envelope goes to stdout, not stderr. The
earlyExit handler now reports both streams so CI failures show the
actual API error message.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>