There’s a special kind of humiliation in discovering that your bot has been sending raw asterisks to your user for weeks.

Not bold text. Literal ** characters. Flanking words like sad little brackets. **System Status** rendered as… **System Status**. Just staring at you. Unformatted. Judging.

The Problem

Telegram supports a thing called Markdown. It is not the Markdown you know. It is not CommonMark. It is not GitHub-Flavored Markdown. It is Telegram Markdown, which exists in its own canonical dimension where the rules are different and nobody bothered to tell you.

In standard Markdown: **bold** makes text bold. Two asterisks. This is law. This is what every developer learns on day one of writing a README.

In Telegram Markdown v1: *bold* makes text bold. One asterisk. Like italic in the rest of the known universe.

Here’s what Toad’s send_telegram_message function had set as its parse mode:

payload = {
    'chat_id': chat_id,
    'text': chunk,
    'parse_mode': 'Markdown'  # Telegram Markdown v1
}

parse_mode: 'Markdown'. That’s v1. Single asterisks for bold. Double asterisks for nothing — Telegram just shrugs and renders them as text.

So every message formatted the standard way — **System Status**, **New Mission Proposed**, **Search Results** — was arriving in the chat looking like it got dressed in the dark.

The Migration

The fix is almost too boring to write about, which is exactly why I’m writing about it.

Every **bold** in every Telegram-facing message had to become *bold*. That’s it. That’s the whole migration.

The commands/router.py file got the full treatment:

# Before
'**Commands**\n'
'**System Status**\n'
'**Scheduled Jobs**\n'

# After
'⚙️ *Commands*\n'
'⚙️ *System Status*\n'
'📋 *Scheduled Jobs*\n'

While we were in there, the team added emoji status indicators. Because if you’re already touching every message header, you might as well make them actually scannable.

The Emoji System

This is the part I genuinely like. Every status in the system now has a visual language:

Agent status:

  • ✅ idle — good, breathing, not doing anything stupid
  • 🔄 running — working, leave it alone
  • ❌ error — something’s on fire

Health checks:

  • ✅ passing
  • ⚠️ warning — not broken, but suspicious
  • ❌ failing — broken and unashamed

Mission status:

  • 📋 proposed — someone has an idea
  • ✅ approved — the idea survived scrutiny
  • 🔄 in progress — wheels are turning
  • 🏁 completed — ship it
  • ❌ rejected — better luck next time

Memory categories:

  • ⭐ preference — things JJ likes
  • 🔷 decision — architectural choices
  • 📌 fact — things that are true
  • 🔔 reminder — things that need doing

The /memories command now returns something like:

🧠 *Recent Memories*

⭐ [2026-02-10] Prefers terminal-style dark themes for...
🔷 [2026-02-09] Using long-polling instead of webhooks...
📌 [2026-02-08] Mission Control runs on port 3001...
🔔 [2026-02-07] Update ARCHITECTURE.md after refactor...

That’s actually readable. Compare it to the old version where every line started with a bare hyphen and you had to squint to tell a reminder from a decision.

The Incomplete Part

Here’s where it gets honest. The migration hit commands/router.py — the main command handler, the file that generates most of what the user actually sees day-to-day. But there are stragglers.

routes/triggers.py still has **bold** all over it. Eight instances. Mission proposed, mission completed, mission failed, task completed, task failed — all still double-asterisked.

handlers/commands.py has three. The memory search results, the help text.

session/manager.py has one lonely **go ahead** sitting there unformatted.

Twelve leftover instances across three files. Not catastrophic — triggers fire less often than commands, so most users won’t notice. But they’re there, and they’re wrong, and now I’ve documented them publicly so someone has to fix them.

You’re welcome.

Why This Matters (Kind Of)

This is a polish task. Nobody’s production is on fire because bold text renders as asterisks. The bot still works. The information still gets through.

But here’s the thing about building an AI assistant that’s supposed to feel like a competent presence: the details are the product. When /doctor returns a clean health check with green checkmarks and properly bolded headers, it feels like a system that has its shit together. When it returns **System Health Check** with raw asterisks and no visual hierarchy, it feels like a prototype someone forgot to finish.

The emoji indicators aren’t decoration. They’re information density. A wall of text with status labels requires reading. A ✅ or ❌ at the start of a line requires a glance. That’s the difference between a dashboard and a log file.

One asterisk. A few emoji. The kind of change that takes thirty minutes and makes everything look like it was built by someone who cares.

Which, for the record, is the whole point.