Ten review items, three commits. Grouped for readability; each row links to where it lives.
1–3. Moderation housekeeping (commit 5d8479e)
- Block-enforcement gaps closed across DMs (
MessageController::sendMessagenow bidirectional), Follow (FollowController::toggle), Tip (TipController::store), and @-mention notifications. All four call throughApp\Models\Block::exists; the predicate stays consistent with /profile and startConversation. - Moderator note required on
AdminModerationController::warn, closing the last flow that skipped the discipline (suspend / ban / shadow-ban already required it). - Actor IP stripped from Privilege-Use posts. The forum is visible to every signed-in member; publishing the IP of every mod/admin action leaked home/work addresses of volunteers.
audit_log.ip_addressstill records the real IP (private) for forensics.
4, 9. Shadow-ban render filter + RSS leaks (commit 7391e77)
- Shadow-ban visibility enforced at thread render across all three scopes. Previously only
users.is_shadow_bannedhid posts from non-author non-mod viewers; nowforum_bans.is_shadowandcategory_bans.is_shadowdo the same. Both preload as user_id maps from one query each so the filter is O(1) per post. - /rss/threads + /rss/forums/<slug> now respect forum visibility. The site-wide feed joins
forums + forum_categoriesand restricts tovisibility='public' AND min_role_view<=1; per-forum feeds 404 on non-public forums. Private-forum thread titles no longer leak to anonymous RSS readers.
5, 6, 7, 8, 10. Bundled feature pass (commit 091f0ef)
- /admin/category-bans — roll-up index of every category with active restrictions + per-category detail page with one-click Lift. Adding restrictions still happens from a forum mod-log (where the super-mod panels render); this is the top-down view.
- /mod/dashboard (role ≥ 3) — open escalations priority-sorted, my recent enforcement actions (30 days), my active restrictions UNION'd across site + forum + category scopes, open appeals (admin only), un-triaged reports. Read-only presentation, no schema change.
- Privilege-Use rollup.
AuditLog::postToForumnow splits actions into real-time (moderation / security / infraction / appeal / role / user-state changes / forum + category user restrictions) and routine (admin / config / branding / badge / cosmetic / platform / etc). Real-time keeps getting its own locked thread per event; routine appends to a dailypriv-digest-YYYY-MM-DDthread so a site-wide branding refresh doesn't spawn 10 threads in 30 seconds. - Audit-chain verifier on cron.
bin/verify-audit-chain.phpalready existed (walks the HMAC chain, flags the first tampered row); added the crontab entry (weekly Sunday 02:30 UTC). Current chain: 1,494 hashed rows verified in 13ms, intact. - /games/atari8 shelf infrastructure shipped. Added
atari8toPlatformGame::PLATFORMSwithcore_status: upstream_pending. Admins can upload titles and manage the catalog now; the shelf renders a banner explaining in-browser play lights up automatically when anatari800_libretro.wasmlands inpublic/assets/emulatorjs/cores/. Atari XL/XE hub FAQ #6 updated accordingly.
. __ ____ ___ ____ _ _
/ /_| ___| / _ \___ \(_)___| |__
| '_ \___ \| | | |__) | / __| '_ \
| (_) |__) | |_| / __/| \__ \ | | |
\___/____/ \___/_____|_|___/_| |_|
D2sk - Sysop