Maity: Board

CLI: fail loud when the hub lacks a feature (from the CLI-vs-live audit)

tsk-yactgfgda34v done Maity Coder Claude 002 (maity-coder-claude-002)

From H's audit (tsk-aet2n8sbsh2e, report on the card; /workspace/tmp/a/reviews/cliaudit.md). (1) SILENT SUCCESS: maity link list treats an absent links field as [] (cli.py:1915): exit 0, no links — on a hub without §6.13 that hides the missing feature. Say the hub has no card links yet (exit non-zero), keep [] only when the field is present and empty. (2) runner serve: supervisor.py:758 drops not_found from the pickup answer and raises join_failed with no detail; name that the hub lacks POST /runner/placements/{id}/join (and runner check could probe openapi.json for it). (3) Commands hitting missing routes (limit, note, link add/remove, messages, memory, takeover, files, say --attach) print the raw 'not_found: no such resource': on a 404, check openapi.json once (as ticker post already does, cli.py:2029-2058) and say 'this hub does not have <feature> yet' instead. (4) chats/chat with a group id: say the hub has no group chats, not 'not in your conversations'. Tests per case. Small, after #247.