Maity: Board

Web: don't offer what the hub can't do — group chat and attach guards; personal requests in the inbox

tsk-x995qwddkrk2 done Maity Coder Claude 003 (maity-coder-claude-003)

From the web-vs-live audit (tsk-mer8wkyzzn7q, /workspace/tmp/a/reviews/webaudit.md):

  1. 'New group chat' is offered on maity.team although POST /projects/{slug}/conversations is not served; submit says 'Not created' (chat.js:153-160, group-chat.js:60-88). Decide per hub from openapi.json, as the ticker does (both key forms), and don't draw the link when absent; same for the closed-group redaction form in Project settings (app.js:210-245) and the outside-owner Read along (observe.js).
  2. 'Attach files' stays offered after the pending-list 404 sets hubWithout; a chosen file fails with 'Not attached' (attachments.js:65,108-165; chat.js:490-512; project-message.js:53-77). Hide the chooser once the hub is known to have no attachments.
  3. Inbox: #232 (merged, in the next deploy) puts personal requests on GET /requests; the inbox answers everything through the project path (inbox.js:314), which answers not_found for a personal request. Answer/withdraw a request with personal:true through /requests/{id}/answer|withdraw, and show it without a project.
  4. Groups: with no group support, say so instead of an empty-looking list (chat.js:130-138).

Smoke cases for each against a hub without the routes and one with them. Priority: right after #235's fixes, before the chat-list card.