- Require ADMIN_TOKEN bearer auth on /members and new /schedule CRUD routes
- Validate JSON body shape and reject empty/malformed writes so a
bad multipart POST can no longer wipe authorized.json
- Make saveJSON atomic (tmp -> rename) with a one-generation .bak file
- Serve a self-contained admin SPA at /admin (public/admin.html) for
editing the discount schedule and authorized members without hand-
editing JSON, with a /preview endpoint that renders the bot's
fallback text for draft entries
- Dockerfile now copies public/ into the image
Co-authored-by: Cursor <cursoragent@cursor.com>