Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
Problem: Elmar received direct DMs from @lucienne_claude_bot that were generated by the old Claude/CCGram persistent session via ~/workspace/notify.py, not by the current Hermes...
StateDoneNext ActionClosedOwnerLuciRuntimeClosedAge9d ago
Ticket is done; runtime is closed.·cwd /home/lucienne/workspace/state/control-room-worktrees/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b · uptime 8d 17h · last activity 8d 16h ago
Description
MC-4684
Problem: Elmar received direct DMs from @lucienne_claude_bot that were generated by the old Claude/CCGram persistent session via ~/workspace/notify.py, not by the current Hermes/Luci control-room session. Evidence from /home/lucienne/.claude/projects/-home-lucienne-workspace/2952377d-...jsonl shows explicit calls to `python3 notify.py ...` with tool results `Sent to Elmar DM` at 2026-06-03 21:18/21:28/21:31 SAST.
Why this matters: old controller sessions can still bypass the current single-voice orchestrator model and DM Elmar directly. That creates stale/conflicting status, especially after Hermes/control-room state has changed. It is not a Telegram 409/poller conflict; it is an outbound notification governance issue.
Scope:
- Audit all direct Elmar DM senders: notify.py, scheduled tasks, ccgram/persistent Claude sessions, workers.
- Add a governance/fence so legacy Claude/CCGram sessions cannot send non-critical MC status directly to Elmar; route to orchestrator inbox / MC topic instead.
- Preserve true emergency/auth-failure alerts where policy explicitly allows direct notification.
- Update runbook/docs so current Luci/Hermes controller is the single voice for MC status.
- Add a regression/check: search active tasks/scripts for notify.py DM usage and flag MC-related direct DMs not using the approved controller route.
Acceptance:
- Reproduced source of the three 2026-06-03 DMs and documented it.
- Legacy path either disabled, gated, or rerouted for MC status.
- Critical/auth direct-alert exceptions remain functional and explicit.
- No duplicate Telegram pollers are introduced.
Activity
done
INTERACTIVE
Luci is working...
Details —
Done
· High
· Luci
▼
SState
Done
Closed
PPeople
TTiming / Details▼
api (human)
Mission Control
9d ago
9d ago
Advanced / Operator evidence
RRouting owner
ROperator console
Ticket is done; runtime is closed.direct_worker_done_recoveredcwd /home/lucienne/workspace/state/control-room-worktrees/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b · uptime 8d 17h · last activity 8d 16h agoMC is visibility-only. Hermes Luci launches and gates work outside MC, then mirrors evidence/status here.Raw console: luci-controller · claude-code
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.
Controller note: created from Elmar's 2026-06-03 Telegram question about unexpected @lucienne_claude_bot DMs. Source already traced to old Claude/CCGram session calling ~/workspace/notify.py directly. Treat as outbound governance cleanup; do not confuse with Telegram poller/409 conflict.
Controller decision
luci9d ago
Luci picking up this ticket (background worker).
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
Ticket runtime send failed while dispatching.
root_cause: timed out
safe_retry: returned to `todo` for a fresh runtime retry.
human_input_required: no
luci9d ago
Worker died unexpectedly.
**Worker PID:** unknown
**OOM kill:** unknown
**Exit signal / dmesg:** unknown
**Last tool_use:** none
**tmux target:** none recorded
**Last pane output:**
```
[no pane output captured]
```
Reset to Todo to retry, or provide additional context.
luci9d ago
Luci picking up this ticket (background worker).
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
Ticket runtime send failed while dispatching.
root_cause: timed out
safe_retry: returned to `todo` for a fresh runtime retry.
human_input_required: no
luci9d ago
Luci picking up this ticket (background worker).
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket moved to Todo: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
luci9d ago
Luci picking up this ticket (background worker).
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket picked up by Luci via MC dispatcher.
MC-4684: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket picked up by Luci via MC dispatcher.
MC-4684: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci9d ago
[failed_to_inject] send_failed: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control
Ticket picked up by Luci via MC dispatcher.
MC-4684: Fence legacy Claude/CCGram notify.py DM path behind current Luci controller
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
luci-controller9d ago
[control-room-recover] MC-4684: cleared false manual_safe_dispatch_required blocker caused by controller pool-claim / unsafe-main-checkout failure (reason: 'unsafe_main_checkout_runtime: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control'). Requeued to todo; Control Room pickup now owns retry/dispatch. No human reply was pending.
luci-controller9d ago
[control-room-recover] MC-4684: cleared false manual_safe_dispatch_required blocker caused by controller pool-claim / unsafe-main-checkout failure (reason: 'unsafe_main_checkout_runtime: pool claim timeout for MC-4684; refusing unsafe runtime cwd /home/lucienne/workspace/mission-control'). Requeued to todo; Control Room pickup now owns retry/dispatch. No human reply was pending.
luci-controller9d ago
[control-room-dispatch] Control Room dispatched MC-4684 to a Claude Code worker.
Worktree: /home/lucienne/workspace/state/control-room-worktrees/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-0c1d02
Branch: cr/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-0c1d02
tmux: cr-MC-4684
Expected check-in: 2026-06-04T10:01:46.315011+00:00
luci-controller9d ago
[controller-cleanup] Killed orphan Control Room tmux worker created during overlap with legacy ticket-pickup. Ticket remains in todo for clean single-owner redispatch.
luci-controller9d ago
[controller-requeue] Completed branch is based on stale master and conflicts in notify.py; direct merge would risk reverting already-landed work. Requeued to todo for a fresh controller replay against current origin/master, preserving current MC-4710 notification guard changes.
luci-controller9d ago
[control-room-dispatch] Control Room dispatched MC-4684 to a Claude Code worker.
Worktree: /home/lucienne/workspace/state/control-room-worktrees/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b
Branch: cr/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b
tmux: cr-MC-4684
Expected check-in: 2026-06-04T13:56:54.891886+00:00
luci-controller9d ago
[control-room-recover] MC-4684: recovered DONE from a finished direct worker whose tmux was gone. Ticket → in_review. Summary: MC-4684 single-voice DM fence on branch cr/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b @ 29e965c6 — notify.py dm_governance_gate reroutes non-critical MC-status DMs to MC topic (chokepoint at send_telegram + send_audio + scripts/notify.py), critical/auth exceptions explicit, audit script (--lint rc=0) + 31 pytest pass, council-hardened, runbook added; pushed to origin.
[control-room-merge-required] ⚠️ NOT SHIPPED: the work is committed on `cr/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b` but is NOT on master. This ticket is review/merge-ready, not done. Land it safely with:
python3 mission-control/scripts/control_room_pickup.py --merge-recovered
(or `git -C /home/lucienne/workspace fetch && git -C /home/lucienne/workspace merge --ff-only cr/mc-4684-fence-legacy-claude-ccgram-notify-py-dm-1c9f7b` from a master worktree, then push). `done` is blocked until the branch is an ancestor of origin/master.
luci-controller9d ago
[controller-landed] Resolved MC-4684 notify.py conflict with second-opinion plan: preserved MC-4710 question block and MC-4684 MC-status reroute. Verified 55 pytest, py_compile, audit_notify_dm_governance --lint, diff --check. Pushed to luci-workspace master at d9398d15.