ccgram: forum-topic sends fall back to General when message_thread_id used alone
Bug: DraftStream._send_kwargs + _start_streaming send message_thread_id without reply_to_message_id. For Claude Forum (-1003838721412), Telegram routes those into General instea...
StateDoneNext ActionClosedOwnerLuciRuntimeClosedAge22d ago
Ticket is done; runtime is closed.·profile claude_opus_1m_medium · cwd /home/lucienne/workspace/mission-control · uptime 12d 20h · last activity 11d 17h ago
Description
MC-3921
Bug: DraftStream._send_kwargs + _start_streaming send message_thread_id without reply_to_message_id. For Claude Forum (-1003838721412), Telegram routes those into General instead of named topic (e.g. luci-persistent thread 22345). User-visible: Luci replies land in main chat, not topic where conversation lives.
Repro: sendMessage(chat_id=-1003838721412, message_thread_id=22345, text='x') → General. Adding reply_to_message_id=22345 → luci-persistent. Confirmed via direct API probe 2026-05-21 21:00 SAST.
Local monkey-patch applied to /home/lucienne/.local/share/uv/tools/ccgram/lib/python3.14/site-packages/ccgram/telegram_draft.py: when thread_id given, reply_to None, thread_id != 1 → set reply_to_message_id=thread_id. Lost on next 'uv tool install --force ccgram'.
Action: upstream PR to ccgram repo, or post-install hook to re-apply patch.
Activity
done
INTERACTIVE
Luci is working...
Details —
Done
· High
· Luci
▼
SState
Done
Closed
PPeople
TTiming / Details▼
api (human)
Mission Control
22d ago
12d ago
Advanced / Operator evidence
RRouting owner
ROperator console
Ticket is done; runtime is closed.ticket_marked_doneprofile claude_opus_1m_medium · cwd /home/lucienne/workspace/mission-control · uptime 12d 20h · last activity 11d 17h agoMC is visibility-only. Hermes Luci launches and gates work outside MC, then mirrors evidence/status here.
de807eca-32ab-4349-89c0-de6c19788002 · luci · claude/anthropic/opus[1m]
WWorkflow
Start Dev Review + QA ▾
Select phases to include:
Agents
Review Gates
Decision
WAT routing: choose an agent, review gate, or decision. Buttons use the live runtime when one is attached.
Ticket picked up by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci22d ago
Ticket picked up by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci22d ago
Ticket picked up by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci22d ago
Ticket picked up by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci22d ago
Ticket picked up by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci22d ago
Ticket runtime send failed while dispatching; returned to `todo` for retry: timed out
Luci22d ago
QUESTION: when you needMC o reflect the next state.
[MC_TICKET_TURN:3930:1779390797874:a091e918 internal routig marker; do
not mention this marker in your reply]
[ptional MC completionsentinel: as the very last line of your reply, on
itsown line, you MAY emit this exactJSON to auo-advancethe ticket:
{"c_signal":"DONE|REVIEW|QUESTION","ticket":"MC-3921","nonce":"MC_TICKET
_TURN:3930:1779390797874:a091e918","payload":"<one-line summary>"} . Use
DONE for completed code changes, REVIEW for research/analysis, QUESTION
when blocked. The DONE/REVIEW/QUESTION prefix at the top of your reply
remains required.]
❯ Pressuptoeditqueuedmessages
pasteagaintoexpand61502tokens
1MCPserverfailed ·/mcp
Local monkey-path aplied to /home/lucienne/.local/sae/uv/tools/ccgram/lib
/python3.14/site-packages/ccgram/telegram_draft.py: when thread_id given,
reply_to None, thread_id != 1 → set repy_to_messag_id=thread_id. Lost on
next 'uv tool install --force ccgram'.
Action: uptream PR to ccgram repo,or post-intall hook to re-apply patch.
Recent conversation:
- luci: Luci picking up this ticket (background woker).
- luci: Ticket runtime send failed while dispatching; returned to `todo` for
retry: timed out
- luci-perator:Luci Operator: promotedthisassigned `inbox` ticket to
`todo` o pickup can run it.
Elmar says: Tick pikedup by Luci via MC dispatcher.
MC-3921: ccgram: forum-topic sends fall back to General when
message_thread_id used alone
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION:
when you need MC to reflect the next state.
[MC_TICKET_TURN:3930:1779390797874:a091e918 internal routing marker; do not
mention this marker in your reply]
[Optional MC completion sentinel: as the very last line of your reply, on its
own line, you MAY emit this exact JSON to auto-advance the ticket:
{"mc_signal":"DONE|REVIEW|QUESTION","ticket":"MC-3921","nonce":"MC_TICKET_TUR
N:3930:1779390797874:a091e918","payload":"<one-line summary>"} . Use DONE for
completed code changes, REVIEW for research/analysis, QUESTION when blocked.
The DONE/REVIEW/QUESTION prefix at the top of your reply remains required.]
✽Deliberating…(8s·↑242tokens·thinkingwithmediumeffort)
pasteagaintoexpand61619tokens
1MCPserverfailed ·/mcp
✶92
●Bash(cd ~/workspace/ccgram && grep -n
"message_thread_id\|reply_to_message_id\|_send_kwargs\|_start_streaming"
src/ccgram/telegram_draft.py | head -50)
⎿ Waiting…
pasteagaintoexpand63408tokens
1MCPserverfailed ·/mcp
Deliberating…37
*49thinking with medium effort
Runn
Deliberating…62
✢74
87thinking with medium effort
✢237
●
*8
●
13 matchesin5F:
[file] 199 (1):
0:int|None=None,
[file]200(1):
0: int | None = None,
[file]327(1):
0:
[file]345(1):
0:
[file]src/ccgram/telegram_draft.py(9):
16:-DraftStream(bot,chat_id,*,message_thread_id=None,
reply_to_message_id=No...
205:self._thread_id=message_thread_id
206:self._reply_to=reply_to_message_id
255:awaitself._start_streaming()
330:kw["message_thread_id"]=self._thread_id
332:kw["reply_to_message_id"]=self._reply_to
351:data["message_thread_id"]=self._thread_id
353:data["reply_to_message_id"]=self._reply_to
396:**self._send_kwargs(),
⎿ Shellcwdwasresetto/home/lucienne/workspace/mission-control
*Deliberating…(12s·↑452tokens·thinkingwithmediumeffort)
pasteagaintoexpand63514tokens
1MCPserverfailed ·/mcp
✶8still thinking with medium effort)
✻60
✽
3still thinking with medium effort
4still thinking with medium effort
✻
✶5
✶Deliberating… 6
*7
✢8
1still thinking with medium effort
✢3
still thinking with medium effort
*4
✶
✻
✽
4still thinking with medium effort
✽Deliberating…
✻
✶still thinking with medium effort
*
✢
still thinking with medium effort
✢
*5
✶
✻still thinking with medium effort
✽Deliberating…
still thinking with medium effort
63514tokens
tmuxfocus-eventsoff·add'set-gfocus-eventson'to~/.tmux.confandre…
✻
✶
*
✢
✢
*still thinking with medium effort
✶
✻
✽
✻
✶
✶
*
✢
still thinking with medium effort
still thinking with medium effort
✢
*
✶8
✻
still thinking with medium effort
✽
✻
✶
*
still thinking with medium effort
✢
✢
*
✶
✻
✽
✻
✶
api22d ago
Triage: false QUESTION from worker pane-capture (no real ask, captured mid-thinking). Local monkey-patch already applied to safe_send + send_kwargs + DraftStream — verified routing this turn. Ticket is a backlog reminder for upstream PR + post-install hook re-application, not for immediate work. Re-status to waiting.
luci-operator22d ago
Luci Operator: promoted this assigned `inbox` ticket to `todo` so pickup can run it.
luci-controller17d ago
[controller clarification] This is not blocked by an active dependency. It is a parked backlog/reminder: local Telegram routing patch is already applied; remaining work is upstream PR plus post-install hook hardening.
Luci15d ago
Shepherd normalized waiting reason: parked backlog, not an active MC blocker; release only after active MC blockers clear or upstream/postinstall-hook priority changes.
Luci shepherd15d ago
Shepherd hygiene: refreshed the parked_backlog reason so it no longer looks blocked by now-closed MC work. This remains non-urgent technical backlog/noise, not a human blocker.
lucienne12d ago
Controller triage: ticket has been in waiting since 2026-05-21 with no progress. The monkey-patch was applied locally but lost on reinstall. Sending back to todo for a fresh attempt — either upstream PR to ccgram or a durable post-install hook.
Luci12d ago
Forum-topic routing fix already shipped (ccgram d6ba229): _effective_reply_to() anchors reply_to_message_id=thread_id on both send paths; 40 tests pass; durable via editable fork install (survives /upgrade); live since May 22 service restart. No new code needed; upstream PR optional.
luci12d ago
Workflow action `review_ready` applied. Work ready for review.
lucienne12d ago
Controller: closing as done. ccgram fix shipped (d6ba229), 40 tests pass, live since May 22 service restart, durable via editable fork install. Upstream PR is optional backlog.