decisionshared last reviewed 2026-05-21

Telegram Bot pattern โ€” LOCKED conventions for internal AI agents

Context

Aspire deploys multiple AI agents that need 1:1 Telegram comms with team members. Without a locked pattern, each new agent re-invents naming, pairing flow, and message format โ€” leading to bot-name collisions, confused users, and inconsistent UX.

Detail

Decision (locked)

ConventionValueRule
Bot username pattern@adg_<name>_botAll Aspire bots prefixed adg_ (Aspire Digital Group). <name> is the agent's short slug, lowercase, underscore-separated.
Bot display name<Name> AITitle case + "AI" suffix. E.g. Zac AI, Praew AI, Pom AI.
Pairing flowPairing DMFirst message from a user is captured as a pairing event. Agent stores chat_id against the user's identity in Aspire Hub (or Odoo for staff). Subsequent messages flow via that captured chat_id.
No public discoveryAll bots locked to invite-onlyDon't post @adg_*_bot usernames publicly. Pairing happens via Aspire Hub OR a direct link from another internal channel.
Message styleLowercase-ish, terseLike Slack DM, not corporate email.

Why these specifics

Implementations following this pattern (per graphify audit 2026-05-20)

sendTelegramMessage() had 15 edges in the aspire-digital-group monorepo audit โ€” Telegram is the primary comms primitive for internal agents. Implementations include morning briefs, daily-brief deliveries, deploy notifications, and ad-hoc agent comms.

Constraints we accepted

Revisit trigger

Actions

Related

๐Ÿ”— Relationships

graph LR telegram_bot_pattern["telegram-bot-pattern"]:::self telegram_bot_pattern --> aspire_hub["aspire-hub"] telegram_bot_pattern --> graphify_trial_2026_05_20["graphify-trial-2026-05-20"] classDef self fill:#715EE3,color:#fff,stroke:#291F50;