Telegram refusal copy: "did not answer (Unauthorized)"
Seen while rendering Settings › Integrations › Telegram (Task 7224) with a revoked bot token.
1. The webhook read says "Telegram did not answer (Unauthorized)" when Telegram did answer and refused the token. Say "Telegram refused the bot token" on a 401, and keep "did not answer" for when Telegram is unreachable (`routes/settings.py::get_telegram_webhook`).
2. Saving the Bot knob with a refused token says "Telegram refused the webhook (Unauthorized). The bot was not saved." but doesn't send the operator to the credential the way the webhook panel does. Add the same Credentials next step.
3. The webhook panel recognises a token refusal by matching "Credentials" in the server's sentence (`pointsAtCredential`). Return a machine-readable refusal code (e.g. `{code: 'telegram_token_refused'}`) and have the panel key on it.
Out of scope: delivery behaviour, plan gating, the events vocabulary.
Done means:
- Each item shipped, or rejected with a reason in the PR body.
- `./dc check full` green.
Outcome
A refused Telegram token is now a 422 {code: telegram_token_refused}. A credential with no token no longer reads "did not answer", and the Bot save shows Open credential. PR #5905 merged as f71c223 after the lane's full gate. Visual check done at 1280 and 400 px. Follow-up draft #7263.
Artifacts
Activity
- Created
- Run
- Runner started
- Runner ended (done)