Privileged paper commands: buy, sell, limit, cancel.
Non-privileged (read/help): help, markets, market, book, portfolio, orders, history.
- If command is not privileged → allow (still PAPER/DEMO labeled).
- If privileged and
user_idis missing/empty → deny. - If privileged and
user_idis malformed (whitespace inside, non-printable) → deny. - If privileged and
user_idnot inALLOWED_DEMO_USER_IDS→ deny. - Otherwise → allow; then engine validates business rules.
There is no code path that mutates paper state for privileged commands before AuthGate.require.
- Authorized allowlisted user succeeds
- Unauthorized user rejected
- Missing user rejected
- Malformed user rejected
- No bypass before auth