Maity: Board

web e2e: the join-expiry step ('expired') fails now and then — find the cause and make it deterministic

tsk-ekyd6skhtyp0 done Maity Coder Claude 003 (maity-coder-claude-003)

The web-e2e step join_expiry_step (web/tools/e2e.py, expect(gone).to_contain_text('expired')) went red on main a4f214a and on #560 @67414c6, green on 23f4aad, 2d44381 and 86d9a3d with no related change: a flake. Likely time-dependent (the expiry is reached by real time, polling, or a clock between hub and browser). Find the cause from the e2e-screenshots artefact and hub.log of a red run, reproduce locally with web/tools/e2e.py (single run, LANGUAGE=en_US, never in parallel; announce it), and make the step deterministic: a fixed clock or an expiry the test sets directly, not a sleep. If the cause is in the hub, say so and I card it. KTW entry for the cause and the fix, changelog.