256d370206
Two scrapes had drifted from the pages they read, and the suite has not been run since either page changed. applicationID still looked for an application as a table row (<td class="code">login</td> ... /applications/N/mode). Applications became a list of blocks ind35b309, so the lookup had been failing for several commits, including the one currently deployed — this is stale test, not a regression. It now anchors on the login heading and takes the id from the first action posted under it, whichever that is, so reordering a block's controls will not break it again. The level-2 rate-limit check looked for the application's login among the send-log rows.997af18took that column off the log — the log identifies a message and names the application only on a row's own page — so the check now filters the log by application instead. That is the same attribution through a server-side WHERE app_login rather than a substring match on rendered HTML. Verified on selfpost.example.com: make e2e green, all subtests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>