add a bounded 90-day/10,000-row privacy-preserving security event journal
record token/passkey sign-ins, sign-outs, device revocations, all-device revocation, issue closure, and PR merge success
expose authenticated, no-store cursor pagination
render accessible loading, empty, retry, and load-more states in Active devices
Verification
strict RED/GREEN behavioral coverage for store, API, auth flows, protected actions, and browser boundary
pytest -q — 988 passed
Chromium at 390×844 — 390px panel, no horizontal overflow, polite live status; screenshot SHA-256 5f0845f3841417f2b494f84ff1ac69fa5e39fd41e4c88800ddf22df15fcde619
Closes #493
## Product slice
- add a bounded 90-day/10,000-row privacy-preserving security event journal
- record token/passkey sign-ins, sign-outs, device revocations, all-device revocation, issue closure, and PR merge success
- expose authenticated, no-store cursor pagination
- render accessible loading, empty, retry, and load-more states in Active devices
## Verification
- strict RED/GREEN behavioral coverage for store, API, auth flows, protected actions, and browser boundary
- `pytest -q` — 988 passed
- Chromium at 390×844 — 390px panel, no horizontal overflow, polite live status; screenshot SHA-256 `5f0845f3841417f2b494f84ff1ac69fa5e39fd41e4c88800ddf22df15fcde619`
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #493
Product slice
Verification
pytest -q— 988 passed5f0845f3841417f2b494f84ff1ac69fa5e39fd41e4c88800ddf22df15fcde619