Bug type
Behavior bug (incorrect output/state without crash)
Summary
When using the Feishu channel, every message sent by the user is received twice by the AI agent, causing duplicate replies.
Steps to reproduce
- Configure Feishu channel with app credentials
- Send any message to the bot in DM
- Observe that the agent receives two identical events
- Agent replies twice to the same message
Expected behavior
Each message should be processed exactly once.
Actual behavior
Each message is processed twice, causing duplicate replies.
OpenClaw version
2026.2.13
Operating system
Ubuntu 24.04 (Linux 6.8.0)
Install method
npm global
Logs, screenshots, and evidence
Impact and severity
- Affected: Feishu DM users
- Severity: High (extremely annoying, poor UX)
- Frequency: 100% reproducible
- Consequence: Users receive duplicate responses for every message
Additional information
Root cause: Feishu webhook may retry or send duplicate events. OpenClaw gateway does not deduplicate based on event_id.
Suggested fix: Implement event deduplication using event_id with 60s TTL cache.
// Pseudo-code:
const processedEvents = new Map();
function handleEvent(event) {
if (processedEvents.has(event.event_id)) return;
processedEvents.set(event.event_id, Date.now());
// process event...
}
Bug type
Behavior bug (incorrect output/state without crash)
Summary
When using the Feishu channel, every message sent by the user is received twice by the AI agent, causing duplicate replies.
Steps to reproduce
Expected behavior
Each message should be processed exactly once.
Actual behavior
Each message is processed twice, causing duplicate replies.
OpenClaw version
2026.2.13
Operating system
Ubuntu 24.04 (Linux 6.8.0)
Install method
npm global
Logs, screenshots, and evidence
Impact and severity
Additional information
Root cause: Feishu webhook may retry or send duplicate events. OpenClaw gateway does not deduplicate based on event_id.
Suggested fix: Implement event deduplication using event_id with 60s TTL cache.
// Pseudo-code:
const processedEvents = new Map();
function handleEvent(event) {
if (processedEvents.has(event.event_id)) return;
processedEvents.set(event.event_id, Date.now());
// process event...
}