openclaw - ✅(Solved) Fix Slack: top-level channel messages with replyToMode="all" cause dual-session processing [1 pull requests, 1 comments, 1 participants]
ON THIS PAGE
Recommended Tools
×6Utilities matched from this issue’s tags and category — try them while you read without losing context.
GitHub issue graph ai analysis
Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.
The report is written in English Markdown for sharing and archival.
Helpful · Quick feedback
Root Cause
4. Root Cause (Source Code Analysis)
Fix Action
Fix / Workaround
8. Workaround
No clean workaround exists. Options:
PR fix notes
PR #64080: Slack: unify auto-thread routing for channel top-level messages under replyToMode=all
- Repository: openclaw/openclaw
- Author: carayim-dev
- State: open | merged: False
- Link: https://github.com/openclaw/openclaw/pull/64080
Description (problem / solution / changelog)
Problem
When replyToMode="all" is enabled on a Slack channel, each top-level message triggers two independent LLM processing paths:
- A parent channel session (via the base session key
agent:...:slack:channel:<channelId>) - A thread-scoped session (via
messageThreadId = messageTsused for reply delivery)
This causes:
- Duplicate LLM work — every message processed twice
- Inflated costs — observed $18.46 wasted on a single parent session accumulating 82 duplicate responses
- Cross-sender context bleed — unrelated senders' conversations mix in the shared parent session
- Privacy issues — messages from different users visible in shared context
Root Cause
In resolveSlackRoutingContext(), the canonicalThreadId computation has an isRoomish branch that discards autoThreadId for room/channel messages:
// Before (buggy):
const roomThreadId = isThreadReply && threadTs ? threadTs : undefined;
const canonicalThreadId = isRoomish ? roomThreadId : isThreadReply ? threadTs : autoThreadId;For top-level channel messages: isThreadReply is false, so roomThreadId = undefined, and the session key falls back to the shared parent channel session. Meanwhile, messageThreadId is correctly set to messageTs for reply delivery — creating the split-brain routing.
DMs did not have this bug because they used the autoThreadId path.
Fix
Remove the room/DM asymmetry. Use autoThreadId for all conversation types:
// After (fixed):
const canonicalThreadId =
isThreadReply && threadTs ? threadTs : autoThreadId;This ensures the session key (baseKey:thread:<messageTs>) matches the messageThreadId used for reply delivery, eliminating the dual-processing path.
Behavior Changes
| Scenario | Before | After |
|---|---|---|
Top-level channel msg, replyToMode=all | Parent channel session + thread session (dual) | Thread session only (:thread:<ts>) |
Top-level channel msg, replyToMode=off | Parent channel session | Parent channel session (unchanged) |
| Thread reply | Thread session (:thread:<parent_ts>) | Thread session (unchanged) |
| DMs | Thread session (:thread:<ts>) | Thread session (unchanged) |
Tests
- Updated existing test: removed
allfrom the "keeps top-level on per-channel session" loop (now onlyoff/first) - Added 5 new test cases:
- Each top-level channel message gets its own thread session with
replyToMode=all - SessionKey and MessageThreadId are aligned
- Thread replies route to parent thread session
- Distinct senders get separate sessions
replyToMode=off/firstbehavior preserved
- Each top-level channel message gets its own thread session with
Fixes #64078
Changed files
extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts(modified, +99/-2)extensions/slack/src/monitor/message-handler/prepare.ts(modified, +15/-10)
Code Example
{
"channels": {
"slack": {
"replyToMode": "all",
"channels": {
"C0ANBM0SJKF": {
"allow": true,
"requireMention": false
}
}
}
}
}
---
"agent:main:slack:channel:c0anbm0sjkf:thread:1775660310.007009" → sessionId: "3da7b8e2-..."
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679025.746549" → sessionId: "805dc0f3-..."
"agent:main:slack:channel:c0anbm0sjkf:thread:1775689714.554029" → sessionId: "df14ba11-..."
... (one per message)
---
"agent:main:slack:channel:c0anbm0sjkf" → sessionId: "7f7593bb-..."
---
function resolveSlackRoutingContext(params) {
const { ctx, account, message, isDirectMessage, isGroupDm, isRoom, isRoomish } = params;
// ... route resolution ...
const replyToMode = resolveSlackReplyToMode(account, chatType); // → "all"
const threadContext = resolveSlackThreadContext({ message, replyToMode });
const threadTs = threadContext.incomingThreadTs; // undefined (top-level message)
const isThreadReply = threadContext.isThreadReply; // false (top-level message)
// autoThreadId IS computed correctly for replyToMode="all":
const autoThreadId = !isThreadReply && replyToMode === "all" && threadContext.messageTs
? threadContext.messageTs // → "1775660310.007009" (the message's own ts)
: void 0;
// ⚠️ BUG: canonicalThreadId DISCARDS autoThreadId for rooms:
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0) // → void 0 (always, for top-level)
: (isThreadReply ? threadTs : autoThreadId); // DMs would use autoThreadId
// With canonicalThreadId = void 0, session key = base channel key (no thread suffix):
const threadKeys = resolveThreadSessionKeys({
baseSessionKey: route.sessionKey, // "agent:main:slack:channel:c0anbm0sjkf"
threadId: canonicalThreadId, // void 0
parentSessionKey: canonicalThreadId && ctx.threadInheritParent
? route.sessionKey : void 0 // void 0
});
// Result: sessionKey = "agent:main:slack:channel:c0anbm0sjkf" (parent channel session)
const sessionKey = threadKeys.sessionKey;
return { route, chatType, replyToMode, threadContext, threadTs, isThreadReply,
threadKeys, sessionKey, /* ... */ };
}
---
function resolveSlackThreadContext(params) {
const incomingThreadTs = params.message.thread_ts; // undefined (top-level)
const eventTs = params.message.event_ts;
const messageTs = params.message.ts ?? eventTs; // "1775660310.007009"
const isThreadReply = typeof incomingThreadTs === "string"
&& incomingThreadTs.length > 0
&& (incomingThreadTs !== messageTs || Boolean(params.message.parent_user_id));
// → false (no thread_ts)
return {
incomingThreadTs, // undefined
messageTs, // "1775660310.007009"
isThreadReply, // false
replyToId: incomingThreadTs ?? messageTs, // "1775660310.007009"
// messageThreadId IS set correctly for reply delivery:
messageThreadId: isThreadReply
? incomingThreadTs
: params.replyToMode === "all" ? messageTs : void 0
// → "1775660310.007009"
};
}
---
function resolveThreadSessionKeys(params) {
const threadId = (params.threadId ?? "").trim();
// When threadId is empty (void 0 from canonicalThreadId):
if (!threadId) return {
sessionKey: params.baseSessionKey, // → parent channel session key
parentSessionKey: void 0
};
// When threadId is provided (non-room path):
const normalizedThreadId = (params.normalizeThreadId ?? ((value) => value.toLowerCase()))(threadId);
return {
sessionKey: `${params.baseSessionKey}:thread:${normalizedThreadId}`,
parentSessionKey: params.parentSessionKey
};
}
---
{
SessionKey: sessionKey, // Parent channel session key (from routing)
MessageThreadId: threadContext.messageThreadId, // Per-message thread ID (for reply delivery)
// ...
}
---
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0) // ROOMS: only uses threadTs for actual thread replies
: (isThreadReply ? threadTs : autoThreadId); // DMs: uses autoThreadId for top-level messages
---
// Current (buggy):
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0)
: (isThreadReply ? threadTs : autoThreadId);
// Proposed fix:
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : autoThreadId) // ← use autoThreadId
: (isThreadReply ? threadTs : autoThreadId);
// Or simplified (since both branches are now identical):
const canonicalThreadId = isThreadReply && threadTs ? threadTs : autoThreadId;
---
function resolveSlackThreadContext(params) {
const incomingThreadTs = params.message.thread_ts;
const eventTs = params.message.event_ts;
const messageTs = params.message.ts ?? eventTs;
const isThreadReply = typeof incomingThreadTs === "string" && incomingThreadTs.length > 0 && (incomingThreadTs !== messageTs || Boolean(params.message.parent_user_id));
return {
incomingThreadTs,
messageTs,
isThreadReply,
replyToId: incomingThreadTs ?? messageTs,
messageThreadId: isThreadReply ? incomingThreadTs : params.replyToMode === "all" ? messageTs : void 0
};
}
---
function resolveSlackThreadTargets(params) {
const { incomingThreadTs, messageTs, isThreadReply } = resolveSlackThreadContext(params);
const replyThreadTs = isThreadReply ? incomingThreadTs : params.replyToMode === "all" ? messageTs : void 0;
return {
replyThreadTs,
statusThreadTs: replyThreadTs,
isThreadReply
};
}
---
function resolveSlackRoutingContext(params) {
const { ctx, account, message, isDirectMessage, isGroupDm, isRoom, isRoomish } = params;
const route = resolveAgentRoute({
cfg: ctx.cfg,
channel: "slack",
accountId: account.accountId,
teamId: ctx.teamId || void 0,
peer: {
kind: isDirectMessage ? "direct" : isRoom ? "channel" : "group",
id: isDirectMessage ? message.user ?? "unknown" : message.channel
}
});
const chatType = isDirectMessage ? "direct" : isGroupDm ? "group" : "channel";
const replyToMode = resolveSlackReplyToMode(account, chatType);
const threadContext = resolveSlackThreadContext({
message,
replyToMode
});
const threadTs = threadContext.incomingThreadTs;
const isThreadReply = threadContext.isThreadReply;
const autoThreadId = !isThreadReply && replyToMode === "all" && threadContext.messageTs ? threadContext.messageTs : void 0;
const canonicalThreadId = isRoomish ? isThreadReply && threadTs ? threadTs : void 0 : isThreadReply ? threadTs : autoThreadId;
const threadKeys = resolveThreadSessionKeys({
baseSessionKey: route.sessionKey,
threadId: canonicalThreadId,
parentSessionKey: canonicalThreadId && ctx.threadInheritParent ? route.sessionKey : void 0
});
const sessionKey = threadKeys.sessionKey;
return {
route,
chatType,
replyToMode,
threadContext,
threadTs,
isThreadReply,
threadKeys,
sessionKey,
historyKey: isThreadReply && ctx.threadHistoryScope === "thread" ? sessionKey : message.channel
};
}
---
function resolveThreadSessionKeys(params) {
const threadId = (params.threadId ?? "").trim();
if (!threadId) return {
sessionKey: params.baseSessionKey,
parentSessionKey: void 0
};
const normalizedThreadId = (params.normalizeThreadId ?? ((value) => value.toLowerCase()))(threadId);
return {
sessionKey: params.useSuffix ?? true ? `${params.baseSessionKey}:thread:${normalizedThreadId}` : params.baseSessionKey,
parentSessionKey: params.parentSessionKey
};
}
---
// Inside prepareSlackMessage():
const ctxPayload = buildInboundContext({
// ...
SessionKey: sessionKey, // ← Parent channel session key
MessageThreadId: threadContext.messageThreadId, // ← Per-message thread ID
ParentSessionKey: threadKeys.parentSessionKey, // ← void 0
// ...
});
---
{
"mode": "socket",
"enabled": true,
"replyToMode": "all",
"groupPolicy": "allowlist",
"dmPolicy": "allowlist",
"streaming": "block",
"nativeStreaming": true,
"allowBots": true,
"channels": {
"C0ANBM0SJKF": {
"allow": true,
"requireMention": false
}
}
}
---
{
"agent:main:slack:channel:c0anbm0sjkf": {
"sessionId": "7f7593bb-c78d-4677-83a2-afb7853d7ed7",
"updatedAt": 1775710558469,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775660310.007009": {
"sessionId": "3da7b8e2-3956-4ef4-b603-039704dcd35b",
"updatedAt": 1775696077967,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679025.746549": {
"sessionId": "805dc0f3-4825-42ff-b2a4-3b1de1ea5923",
"updatedAt": 1775695384636,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679068.095299": {
"sessionId": "e1fddd17-6187-494e-b556-8f9e17b77e6a",
"updatedAt": 1775695715853,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775686608.909049": {
"sessionId": "668e5247-5c24-4356-ad88-b1f0992739aa",
"updatedAt": 1775687127587,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775689714.554029": {
"sessionId": "df14ba11-6a7d-4993-bcea-34db89f1e998",
"updatedAt": 1775695753084,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775691340.591129": {
"sessionId": "25502d5b-a259-434b-995a-bba4bcc06071",
"updatedAt": 1775719657511,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775694933.768589": {
"sessionId": "e328f4e8-773d-4e62-9d72-ae2d7d0e7327",
"updatedAt": 1775695230953,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775695293.271419": {
"sessionId": "1988fe0b-d82b-40bf-b905-d4c7b8cf418f",
"updatedAt": 1775696477892,
"displayName": "Slack thread #fox-email: <@U0AEHL4S6TC> Tell me what you've learned..."
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775699200.009569": {
"sessionId": "221e12bd-2aee-4134-8a25-7e3986b0783c",
"updatedAt": 1775699332990,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775710479.753369": {
"sessionId": "9e0f9089-26a6-4592-8d12-21badb6a6821",
"updatedAt": 1775710517133,
"displayName": "slack:g-c0anbm0sjkf"
}
}
---
1. [user] Slack message from Janice Pena — asking about Travel Nursing salary data
2. [assistant] cost=$0.88 — processes Janice's salary question (with thinking)
3-15. [tool calls] — reads spreadsheet, processes salary data, sends Slack reply
16. [assistant] cost=$0.08 — NO_REPLY
17. [user] Slack message from Renea Nielsen — asking for compliance review of email copy
18. [assistant] cost=$0.76 — processes Renea's compliance request (with thinking)
19-32. [tool calls] — searches memory, reads compliance KB, sends compliance review
33. [user] QUEUED messages: more from Renea (different message)
34-36. [assistant+tools] — processes queued Renea message
37. [user] Slack edit notification
38. [assistant] cost=$0.79 — processes edit
39. [user] Slack delete + Janice's new message
40. [assistant] cost=$0.80 — Janice asking about what Fox has learned from her
... continues with Kevin's messages, Edward's messages, etc.RAW_BUFFERClick to expand / collapse
OpenClaw Bug Report: Dual Session Processing on Slack Channels with replyToMode: "all"
Product: OpenClaw
Version tested: 2026.4.5 (source code analysis), 2026.4.2 (live reproduction)
Severity: High (causes 2x–4x token spend, context pollution across senders)
Date: 2026-04-09
1. Summary
When replyToMode: "all" is configured on a Slack channel (not a DM), every top-level channel message is processed by the LLM twice — once in a per-message thread-scoped session (used for threaded reply delivery) and once in the shared parent channel session. The parent channel session accumulates ALL messages from ALL senders into a single growing context, causing:
- Massive token waste — every message triggers two independent LLM calls with completely different response IDs
- Cross-sender context pollution — all senders' conversations bleed into the parent session
- Unbounded cost growth — the parent session context grows with every message across all threads
2. Reproduction
Config (Fox agent, OpenClaw 4.2)
{
"channels": {
"slack": {
"replyToMode": "all",
"channels": {
"C0ANBM0SJKF": {
"allow": true,
"requireMention": false
}
}
}
}
}Steps
- Configure a Slack channel with
allow: true,requireMention: false, and globalreplyToMode: "all" - Have User A post a top-level message in the channel
- The agent replies in a thread under User A's message (correct behavior)
- Have User B post a different top-level message in the same channel
- The agent replies in a thread under User B's message (correct behavior)
- Observe: Both User A's and User B's messages are in the parent channel session, and the LLM was called independently for both the thread session AND the parent session for each message
Observed behavior on April 8, 2026
10 top-level messages from 4 different senders (Janice, Renea, Kevin, Edward) in #fox-email over ~5 hours:
| # | Sender | message_ts | Thread Session ID | Thread Cost | Parent Session Cost |
|---|---|---|---|---|---|
| 1 | Janice | 1775660310.007009 | 3da7b8e2 | $1.11 | Included in $18.46 |
| 2 | Renea | 1775679025.746549 | 805dc0f3 | $0.29 | Included in $18.46 |
| 3 | Renea | 1775679068.095299 | e1fddd17 | $0.68 | Included in $18.46 |
| 4 | Janice | 1775686608.909049 | 668e5247 | $0.23 | Included in $18.46 |
| 5 | Kevin | 1775689714.554029 | df14ba11 | $1.77 | Included in $18.46 |
| 6 | Kevin | 1775691340.591129 | 25502d5b | $0.33 | Included in $18.46 |
| 7 | Renea | 1775694933.768589 | e328f4e8 | $0.34 | Included in $18.46 |
| 8 | Renea | 1775695293.271419 | 1988fe0b | $0.18 | Included in $18.46 |
| 9 | Edward | 1775699200.009569 | 221e12bd | $0.00 | Included in $18.46 |
| 10 | Edward | 1775710479.753369 | 9e0f9089 | $0.00 | Included in $18.46 |
Thread sessions total: $4.93 (correct, isolated per-message)
Parent session total: $18.46 (82 LLM turns, all messages accumulated)
Response ID overlap: 0 out of 82+94 — every response is a unique, independent LLM call
Effective cost multiplier: ~4.7x ($23.39 actual vs ~$4.93 expected)
3. Session Store Evidence
The sessions.json file confirms the dual routing. Each message creates BOTH:
A. A thread-scoped session key (correct):
"agent:main:slack:channel:c0anbm0sjkf:thread:1775660310.007009" → sessionId: "3da7b8e2-..."
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679025.746549" → sessionId: "805dc0f3-..."
"agent:main:slack:channel:c0anbm0sjkf:thread:1775689714.554029" → sessionId: "df14ba11-..."
... (one per message)B. The parent channel session key (all messages route here too):
"agent:main:slack:channel:c0anbm0sjkf" → sessionId: "7f7593bb-..."Session file 7f7593bb-...-topic-1775660310.007009.jsonl contains all 10 senders' messages (179 lines, 82 LLM turns, $18.46).
4. Root Cause (Source Code Analysis)
File: dist/prepare-D5Swazfl.js (maps to extensions/slack/src/routing.ts or similar)
The routing function: resolveSlackRoutingContext() (line ~920)
function resolveSlackRoutingContext(params) {
const { ctx, account, message, isDirectMessage, isGroupDm, isRoom, isRoomish } = params;
// ... route resolution ...
const replyToMode = resolveSlackReplyToMode(account, chatType); // → "all"
const threadContext = resolveSlackThreadContext({ message, replyToMode });
const threadTs = threadContext.incomingThreadTs; // undefined (top-level message)
const isThreadReply = threadContext.isThreadReply; // false (top-level message)
// autoThreadId IS computed correctly for replyToMode="all":
const autoThreadId = !isThreadReply && replyToMode === "all" && threadContext.messageTs
? threadContext.messageTs // → "1775660310.007009" (the message's own ts)
: void 0;
// ⚠️ BUG: canonicalThreadId DISCARDS autoThreadId for rooms:
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0) // → void 0 (always, for top-level)
: (isThreadReply ? threadTs : autoThreadId); // DMs would use autoThreadId
// With canonicalThreadId = void 0, session key = base channel key (no thread suffix):
const threadKeys = resolveThreadSessionKeys({
baseSessionKey: route.sessionKey, // "agent:main:slack:channel:c0anbm0sjkf"
threadId: canonicalThreadId, // void 0
parentSessionKey: canonicalThreadId && ctx.threadInheritParent
? route.sessionKey : void 0 // void 0
});
// Result: sessionKey = "agent:main:slack:channel:c0anbm0sjkf" (parent channel session)
const sessionKey = threadKeys.sessionKey;
return { route, chatType, replyToMode, threadContext, threadTs, isThreadReply,
threadKeys, sessionKey, /* ... */ };
}The thread context function: resolveSlackThreadContext() (line ~540)
function resolveSlackThreadContext(params) {
const incomingThreadTs = params.message.thread_ts; // undefined (top-level)
const eventTs = params.message.event_ts;
const messageTs = params.message.ts ?? eventTs; // "1775660310.007009"
const isThreadReply = typeof incomingThreadTs === "string"
&& incomingThreadTs.length > 0
&& (incomingThreadTs !== messageTs || Boolean(params.message.parent_user_id));
// → false (no thread_ts)
return {
incomingThreadTs, // undefined
messageTs, // "1775660310.007009"
isThreadReply, // false
replyToId: incomingThreadTs ?? messageTs, // "1775660310.007009"
// messageThreadId IS set correctly for reply delivery:
messageThreadId: isThreadReply
? incomingThreadTs
: params.replyToMode === "all" ? messageTs : void 0
// → "1775660310.007009"
};
}The session key function: resolveThreadSessionKeys() (session-key-BR3Z-ljs.js, line ~255)
function resolveThreadSessionKeys(params) {
const threadId = (params.threadId ?? "").trim();
// When threadId is empty (void 0 from canonicalThreadId):
if (!threadId) return {
sessionKey: params.baseSessionKey, // → parent channel session key
parentSessionKey: void 0
};
// When threadId is provided (non-room path):
const normalizedThreadId = (params.normalizeThreadId ?? ((value) => value.toLowerCase()))(threadId);
return {
sessionKey: `${params.baseSessionKey}:thread:${normalizedThreadId}`,
parentSessionKey: params.parentSessionKey
};
}The message construction (line ~1232):
{
SessionKey: sessionKey, // Parent channel session key (from routing)
MessageThreadId: threadContext.messageThreadId, // Per-message thread ID (for reply delivery)
// ...
}What happens next
The SessionKey field routes the inbound message processing to the parent channel session. The MessageThreadId field is used later in the delivery/reply layer to create a separate thread-scoped session for reply targeting.
Both sessions process the message independently with the LLM.
5. The Asymmetry Between Rooms and DMs
The code has an explicit asymmetry in the canonicalThreadId ternary:
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0) // ROOMS: only uses threadTs for actual thread replies
: (isThreadReply ? threadTs : autoThreadId); // DMs: uses autoThreadId for top-level messagesFor DMs with replyToMode: "all": Top-level messages correctly get canonicalThreadId = autoThreadId = messageTs, so sessionKey = baseKey:thread:<messageTs> — each message gets its own session.
For rooms/channels with replyToMode: "all": Top-level messages get canonicalThreadId = void 0, so sessionKey = baseKey — ALL messages share the parent channel session.
This asymmetry is the bug. The DM path was fixed in version 2026.2.25 (PR #26849: "when replyToMode="all" auto-threads top-level Slack DMs, seed the thread session key from the message ts"). The equivalent fix was never applied to the room/channel path.
6. Relevant Changelog Entries
Version 2026.2.25 (DM fix — applied, but only for DMs):
Slack/Threading: when
replyToMode="all"auto-threads top-level Slack DMs, seed the thread session key from the messagetsso the initial message and later replies share the same isolated:thread:session instead of falling back to base DM context. (#26849)
Version 2026.2.27 (Thread isolation — applied, but doesn't cover this case):
Slack/Thread session isolation: route channel/group top-level messages into thread-scoped sessions (
:thread:<ts>) and read inboundpreviousTimestampfrom the resolved thread session key, preventing cross-thread context bleed and stale timestamp lookups. (#10686)
Note: Despite the description saying "route channel/group top-level messages into thread-scoped sessions," the actual code still has void 0 for rooms in the ternary. Either this fix was incomplete, regressed, or the description doesn't accurately reflect the code's behavior.
Version 2026.3.2 (replyToMode=off fix — different case):
Slack/session routing: keep top-level channel messages in one shared session when
replyToMode=off, while preserving thread-scoped keys for true thread replies and non-off modes. (#32193)
This fix is specifically for replyToMode=off. The phrase "preserving thread-scoped keys for true thread replies and non-off modes" suggests thread-scoped keys should work for replyToMode=all on channels — but the code doesn't implement this for top-level (non-thread-reply) room messages.
7. Proposed Fix
In resolveSlackRoutingContext(), change the canonicalThreadId computation to use autoThreadId for rooms:
// Current (buggy):
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : void 0)
: (isThreadReply ? threadTs : autoThreadId);
// Proposed fix:
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : autoThreadId) // ← use autoThreadId
: (isThreadReply ? threadTs : autoThreadId);
// Or simplified (since both branches are now identical):
const canonicalThreadId = isThreadReply && threadTs ? threadTs : autoThreadId;This ensures that when replyToMode: "all" is active on a channel, each top-level message gets its own thread-scoped session key (baseKey:thread:<messageTs>) instead of falling back to the parent channel session.
Impact of fix: The inbound processing session key will match the thread-scoped session that's already being created for reply delivery, eliminating the duplicate processing.
8. Workaround
No clean workaround exists. Options:
- Set
replyToMode: "off"on the channel — but this means the agent won't reply in threads, which defeats the purpose for multi-sender channels - Set
requireMention: true— reduces message volume but doesn't fix the dual-session routing - Accept the cost — the parent session will keep growing until reset
9. Files Referenced
| File | Purpose |
|---|---|
dist/prepare-D5Swazfl.js | Slack inbound routing (lines ~540, ~920) |
dist/session-key-BR3Z-ljs.js | Session key resolution (line ~255) |
CHANGELOG.md | Version history for related fixes |
sessions/sessions.json (Fox) | Live session store showing dual routing |
sessions/7f7593bb-...-topic-1775660310.007009.jsonl (Fox) | Parent accumulator session (179 lines, $18.46) |
sessions/3da7b8e2-...jsonl through 9e0f9089-...jsonl (Fox) | Individual thread sessions ($4.93 combined) |
10. Full Source Code Excerpts
resolveSlackThreadContext (prepare-D5Swazfl.js, line 538)
function resolveSlackThreadContext(params) {
const incomingThreadTs = params.message.thread_ts;
const eventTs = params.message.event_ts;
const messageTs = params.message.ts ?? eventTs;
const isThreadReply = typeof incomingThreadTs === "string" && incomingThreadTs.length > 0 && (incomingThreadTs !== messageTs || Boolean(params.message.parent_user_id));
return {
incomingThreadTs,
messageTs,
isThreadReply,
replyToId: incomingThreadTs ?? messageTs,
messageThreadId: isThreadReply ? incomingThreadTs : params.replyToMode === "all" ? messageTs : void 0
};
}resolveSlackThreadTargets (prepare-D5Swazfl.js, line ~555)
function resolveSlackThreadTargets(params) {
const { incomingThreadTs, messageTs, isThreadReply } = resolveSlackThreadContext(params);
const replyThreadTs = isThreadReply ? incomingThreadTs : params.replyToMode === "all" ? messageTs : void 0;
return {
replyThreadTs,
statusThreadTs: replyThreadTs,
isThreadReply
};
}resolveSlackRoutingContext (prepare-D5Swazfl.js, line 908)
function resolveSlackRoutingContext(params) {
const { ctx, account, message, isDirectMessage, isGroupDm, isRoom, isRoomish } = params;
const route = resolveAgentRoute({
cfg: ctx.cfg,
channel: "slack",
accountId: account.accountId,
teamId: ctx.teamId || void 0,
peer: {
kind: isDirectMessage ? "direct" : isRoom ? "channel" : "group",
id: isDirectMessage ? message.user ?? "unknown" : message.channel
}
});
const chatType = isDirectMessage ? "direct" : isGroupDm ? "group" : "channel";
const replyToMode = resolveSlackReplyToMode(account, chatType);
const threadContext = resolveSlackThreadContext({
message,
replyToMode
});
const threadTs = threadContext.incomingThreadTs;
const isThreadReply = threadContext.isThreadReply;
const autoThreadId = !isThreadReply && replyToMode === "all" && threadContext.messageTs ? threadContext.messageTs : void 0;
const canonicalThreadId = isRoomish ? isThreadReply && threadTs ? threadTs : void 0 : isThreadReply ? threadTs : autoThreadId;
const threadKeys = resolveThreadSessionKeys({
baseSessionKey: route.sessionKey,
threadId: canonicalThreadId,
parentSessionKey: canonicalThreadId && ctx.threadInheritParent ? route.sessionKey : void 0
});
const sessionKey = threadKeys.sessionKey;
return {
route,
chatType,
replyToMode,
threadContext,
threadTs,
isThreadReply,
threadKeys,
sessionKey,
historyKey: isThreadReply && ctx.threadHistoryScope === "thread" ? sessionKey : message.channel
};
}resolveThreadSessionKeys (session-key-BR3Z-ljs.js, line 255)
function resolveThreadSessionKeys(params) {
const threadId = (params.threadId ?? "").trim();
if (!threadId) return {
sessionKey: params.baseSessionKey,
parentSessionKey: void 0
};
const normalizedThreadId = (params.normalizeThreadId ?? ((value) => value.toLowerCase()))(threadId);
return {
sessionKey: params.useSuffix ?? true ? `${params.baseSessionKey}:thread:${normalizedThreadId}` : params.baseSessionKey,
parentSessionKey: params.parentSessionKey
};
}Message construction (prepare-D5Swazfl.js, line ~1215)
// Inside prepareSlackMessage():
const ctxPayload = buildInboundContext({
// ...
SessionKey: sessionKey, // ← Parent channel session key
MessageThreadId: threadContext.messageThreadId, // ← Per-message thread ID
ParentSessionKey: threadKeys.parentSessionKey, // ← void 0
// ...
});11. Fox Slack Config (Sanitized)
{
"mode": "socket",
"enabled": true,
"replyToMode": "all",
"groupPolicy": "allowlist",
"dmPolicy": "allowlist",
"streaming": "block",
"nativeStreaming": true,
"allowBots": true,
"channels": {
"C0ANBM0SJKF": {
"allow": true,
"requireMention": false
}
}
}Note: threadInheritParent is not set (defaults to false/undefined). threadHistoryScope is not set.
12. Session Store Snapshot (Fox, sessions.json excerpt)
All entries for channel c0anbm0sjkf (#fox-email):
{
"agent:main:slack:channel:c0anbm0sjkf": {
"sessionId": "7f7593bb-c78d-4677-83a2-afb7853d7ed7",
"updatedAt": 1775710558469,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775660310.007009": {
"sessionId": "3da7b8e2-3956-4ef4-b603-039704dcd35b",
"updatedAt": 1775696077967,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679025.746549": {
"sessionId": "805dc0f3-4825-42ff-b2a4-3b1de1ea5923",
"updatedAt": 1775695384636,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775679068.095299": {
"sessionId": "e1fddd17-6187-494e-b556-8f9e17b77e6a",
"updatedAt": 1775695715853,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775686608.909049": {
"sessionId": "668e5247-5c24-4356-ad88-b1f0992739aa",
"updatedAt": 1775687127587,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775689714.554029": {
"sessionId": "df14ba11-6a7d-4993-bcea-34db89f1e998",
"updatedAt": 1775695753084,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775691340.591129": {
"sessionId": "25502d5b-a259-434b-995a-bba4bcc06071",
"updatedAt": 1775719657511,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775694933.768589": {
"sessionId": "e328f4e8-773d-4e62-9d72-ae2d7d0e7327",
"updatedAt": 1775695230953,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775695293.271419": {
"sessionId": "1988fe0b-d82b-40bf-b905-d4c7b8cf418f",
"updatedAt": 1775696477892,
"displayName": "Slack thread #fox-email: <@U0AEHL4S6TC> Tell me what you've learned..."
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775699200.009569": {
"sessionId": "221e12bd-2aee-4134-8a25-7e3986b0783c",
"updatedAt": 1775699332990,
"displayName": "slack:#fox-email"
},
"agent:main:slack:channel:c0anbm0sjkf:thread:1775710479.753369": {
"sessionId": "9e0f9089-26a6-4592-8d12-21badb6a6821",
"updatedAt": 1775710517133,
"displayName": "slack:g-c0anbm0sjkf"
}
}Key observation: Each message has its own :thread: session key AND all messages also route to the base agent:main:slack:channel:c0anbm0sjkf session.
13. Parent Session Message Flow (First 20 entries)
Showing the parent session (7f7593bb) accumulating messages from multiple senders:
1. [user] Slack message from Janice Pena — asking about Travel Nursing salary data
2. [assistant] cost=$0.88 — processes Janice's salary question (with thinking)
3-15. [tool calls] — reads spreadsheet, processes salary data, sends Slack reply
16. [assistant] cost=$0.08 — NO_REPLY
17. [user] Slack message from Renea Nielsen — asking for compliance review of email copy
18. [assistant] cost=$0.76 — processes Renea's compliance request (with thinking)
19-32. [tool calls] — searches memory, reads compliance KB, sends compliance review
33. [user] QUEUED messages: more from Renea (different message)
34-36. [assistant+tools] — processes queued Renea message
37. [user] Slack edit notification
38. [assistant] cost=$0.79 — processes edit
39. [user] Slack delete + Janice's new message
40. [assistant] cost=$0.80 — Janice asking about what Fox has learned from her
... continues with Kevin's messages, Edward's messages, etc.All 10 senders' conversations are interleaved in this single session. Each successive message pays for the full accumulated context of all prior messages.
14. Cost Breakdown
Thread sessions (correct, isolated):
| Session ID | Sender(s) | Lines | Cost |
|---|---|---|---|
| 3da7b8e2 | Janice | 60 | $1.11 |
| 805dc0f3 | Renea | 16 | $0.29 |
| e1fddd17 | Renea | 43 | $0.68 |
| 668e5247 | Janice | 10 | $0.23 |
| df14ba11 | Kevin | 105 | $1.77 |
| 25502d5b | Kevin | -- | $0.33 |
| e328f4e8 | Renea | -- | $0.34 |
| 1988fe0b | Renea | -- | $0.18 |
| 221e12bd | Edward | -- | $0.00 |
| 9e0f9089 | Edward | -- | $0.00 |
| Total | $4.93 |
Parent session (buggy accumulator):
| Session ID | All senders combined | Lines | Cost |
|---|---|---|---|
| 7f7593bb | Janice+Renea+Kevin+Edward | 179 | $18.46 |
Totals:
- Actual spend: $23.39
- Expected spend (thread sessions only): $4.93
- Waste: $18.46 (79% of total)
- Multiplier: 4.7x
15. Questions for the OpenClaw Team
-
Was the
isRoomishbranch in thecanonicalThreadIdternary intentionally different from the DM branch? If so, what's the expected behavior forreplyToMode: "all"on channels? -
The changelog for version 2026.2.27 (#10686) says "route channel/group top-level messages into thread-scoped sessions." Was this fix intended to cover this case? If so, it appears to have regressed or was incomplete.
-
Is there a second code path that creates the thread-scoped session from
MessageThreadIdthat we haven't identified? Understanding both paths would help validate the fix. -
Would the proposed fix (using
autoThreadIdfor rooms) break any intentional behavior where channels withreplyToMode: "all"are expected to maintain a shared parent context?
extent analysis
TL;DR
The most likely fix for the dual session processing issue on Slack channels with replyToMode: "all" is to update the canonicalThreadId computation in resolveSlackRoutingContext() to use autoThreadId for rooms, ensuring each top-level message gets its own thread-scoped session key.
Guidance
- Review the
resolveSlackRoutingContext()function: Verify that thecanonicalThreadIdcomputation is the root cause of the issue, whereisRoomishbranches discardautoThreadIdfor top-level messages. - Apply the proposed fix: Update the
canonicalThreadIdcomputation to useautoThreadIdfor rooms, as suggested in the issue report. - Test the fix: Validate that the updated code correctly routes top-level messages to their own thread-scoped sessions, eliminating the duplicate processing and cost waste.
- Monitor session store and cost metrics: After applying the fix, observe the session store and cost metrics to ensure the fix is effective and does not introduce any regressions.
Example
The proposed fix involves changing the canonicalThreadId computation in resolveSlackRoutingContext():
const canonicalThreadId = isRoomish
? (isThreadReply && threadTs ? threadTs : autoThreadId) // ← use autoThreadId
: (isThreadReply ? threadTs : autoThreadId);Or simplifying it to:
const canonicalThreadId = isThreadReply && threadTs ? threadTs : autoThreadId;Notes
- The fix assumes that using
autoThreadIdfor rooms will not break any intentional behavior where channels withreplyToMode: "all"are expected to maintain a shared parent context. - It is essential to test the fix thoroughly to ensure it does not introduce any regressions or unexpected behavior.
Recommendation
Apply the proposed fix to update the canonicalThreadId computation in resolveSlackRoutingContext(), as it directly addresses the identified root cause of the issue. This fix should eliminate the duplicate processing and cost waste associated with the dual session processing on Slack channels with replyToMode: "all".
Vote matrix · Quick signals
Still need to ship something?
×6Another batch ranked right after the header list — different links, same matching logic.
TRENDING
- -z/oneshot 模式下 final_response 丢弃带工具调用的消息正文
- NameError: _pool_may_recover_from_rate_limit not imported into extracted agent/conversation_loop.py
- [Feature]: persist session kind/provenance metadata
- [Bug]: 使用telegram和微信会话,会话着会自动自动中断,往往一个问答还没结束就中断了,需要很久才能恢复会话,但是也会再次中断
- [Bug]: TUI input box gets flooded with ANSI escape sequences after gateway pipe break
- Memory: auto-compact MEMORY.md when char limit reached
- [Feature] Cross-platform shared context
- [Bug]: Dashboard -TUI is UNUSABLE -- who wrote this crap
- feat: expose structured multi-turn response metadata from run_conversation()
- feat(vision): add agent.max_vision_images_in_context config to limit base64 image accumulation
- Embedded Hindsight retain reports failure while async retain later appears in recall
- Test - please ignore
- Session permanently stuck after conflicting instructions, cannot recover after restarting WebUI + Gateway
- [Bug]: After executing /goal on the Windows version, the /goal trigger will not stop automatically even when the goal is completed; instead, it keeps triggering until the maximum limit is reached.
- [Bug]: Two profile gateway services enter SIGTERM flap loop — `--replace` + PID file cross-profile mis-routing
- feat: /dashboard slash command to list agent dashboard URLs
- [Feature Request] Memory: automatic conversation capture via session lifecycle hooks
- [Bug]: Docker xurl docs can lead auth to be stored outside Hermes subprocess HOME
- [Feature]: Be pass custom temperature to subagents
- Feature: Content-bound tool call extraction layer (fallback for models emitting tool calls as text/XML)
- The Docker image needs to upgrade the Node.js version.
- Maintainer lift option for PR #29035 forked Actions blocker
- [Bug]: Hermes does not work through Claude CLI
- [Bug]: acp adapter code syntax error
- WhatsApp bridge drops messages on bridge/gateway restart (no durable queue)
- Image auto-routing cannot use native vision when auxiliary.vision is configured as fallback
- Direct provider models (e.g. MiniMax highspeed) not selectable via /model when live catalog only lists openrouter/nous providers
- [Feature] Weixin multi-account: gateway adapter architecture blocks enterprise deployment — profiles are not the answer
- Copilot /models context display uses prompt limit instead of context window
- Parallel tool calls stored as separate assistant messages break DeepSeek session replay
- [Security tracking] Hermes Agent — Cross-User Session Hijacking via Unauthenticated Global Title Lookup in `/resume` (GHSA-7w36-4h66-4hx4)
- [Security tracking] Arbitrary File Read via Unsanitized `MEDIA:` Tag Path in Gateway Media Extraction (GHSA-jmf9-9729-7pp8)
- [Security tracking] Authentication Bypass via Insecure Credential Pool Synchronization during Anthropic Exhaustion (GHSA-9xm9-hchr-3jhv)
- [Security tracking] Hermes Agent API Server allows forged todo-tool history hydration that can exhaust session context (GHSA-5g4g-6jrg-mw3g)
- [Security tracking] Pre-Execution Security Scanner Bypass in Hermes Agent Gateways (GHSA-qhmp-283q-wqmv)
- [Security tracking] Feishu Webhook Pre-Authentication Rate-Limit Consumption Enables External Denial of Service (GHSA-jm8j-wwx3-97gc)
- [Security tracking] Environment Variable Semantic Injection via Substring Split in `.env` Parser (`_sanitize_env_lines`) (GHSA-3jhv-97h6-hjpv)
- [Security tracking] Remote Code Execution (RCE) via `HERMES_ENABLE_PROJECT_PLUGINS` Bypass in Web Server (GHSA-5qr3-c538-wm9j)
- [Security tracking] Information Leak — Messaging gateway credentials leaked to subprocesses (GHSA-m4m8-xjp4-5rmm)
- [Security tracking] Denial of Service via Device Path Blocklist Bypass in `read_file` Tool (`_is_blocked_device` uses `expanduser` instead of `normpath`) (GHSA-3p9q-rxhm-5x3g)
- [Security tracking] Dangerous Command Approval Bypass in `batch_runner.py` via Insecure Default Fallback (GHSA-7gp4-gfvg-4mpj)
- [Bug]: Kanban dashboard hides rightmost columns (done/blocked/review) due to invisible horizontal scrollbar
- [Test] github-specialist 写入能力验证
- [Test] gh with GH_TOKEN
- Kanban needs first-class waiting states for human, approval, and review gates
- [Bug]: Typing indicator lingers ~5s after streamed reply finishes
- Stale background processes permanently block session idle/daily reset
- [Bug]: /restart does not relaunch the gateway under macOS launchd
- [bug]: hardcoded "***" session token
- MCP startup hangs: synchronous HTTP call in osv_check blocks asyncio event loop
- TERMINAL_ENV in ~/.hermes/.env overrides terminal.backend in config.yaml
- [Bug]: Telegram streaming truncates at unclosed backtick during finalize when transient httpx hiccup occurs (regression edge case from #25710 / d44dafdb4)
- NameError: _pool_may_recover_from_rate_limit is not defined — missing _ra() prefix in conversation_loop.py
- Anthropic fallback can fail after Codex reasoning-only empty turns due to trailing assistant prefill
- Profile切换后session历史未隔离 — default profile会话泄漏到named profile
- Profile切换后session历史未隔离 — default profile的会话泄漏到named profile
- [Feature]: Distributed Kanban workers with central board visibility
- Feishu gateway: Markdown tables render as broken plain text
- `/reasoning max` rejected by frontend even though Anthropic adapter already supports it end-to-end
- Docs request: iFlow Search MCP server configuration for Hermes Agent
- Add Hermes agent-readiness sentinel inspired by Cursor agent-compatibility
- Add PR review digest mode grouped by reviewer value
- Standardize Kanban/delegation handoff and verification evidence schema
- [Feature]: Configurable default working directory for QQBot and Weixin gateway sessions
- Feature: non-interactive, parseable model listing per provider
- kanban: --board flag placement is easy to misuse; add explicit error hint/examples
- Bug: auth.json active_provider silently overrides model.provider in config.yaml at runtime
- [vision] torchvision import initializes CUDA context, causing gateway/agent to reserve ~7GB VRAM each
- google-gemini-cli provider: Gemini CLI / Code Assist sunsets for consumer tiers on 2026-06-18
- [Bug]: Gateway Memory Leak — aiohttp ClientSession Never Closed → 6.2 GB OOM
- [Feature]: Need Https Oauth callback url ability
- feat: dedupe loaded skills via active skill context registry
- [Bug]: Matrix Gateway Boot-Loop due to Pending Invitations to closed or unexistent rooms
- Auxiliary client (title-gen / compress) cannot use AWS Bedrock Bearer Token (AWS_BEARER_TOKEN_BEDROCK) — anthropic SDK 0.87.0 CVE-pin lacks api_key parameter
- [Feature]: Avoid KittenTTS redundant installation.
- kanban dispatcher: add circuit-breaker for repeated worker bails with identical block reason
- [Bug]: Deprecation and security warnings (glob, inflight) during hermes update
- Telegram polling can conflict without a visible duplicate gateway
- [Feature]: FR: Implement chat history normalization / adapter for strict backends (LiteRT, custom OpenAI shims)
- feat: add Volcengine (火山引擎) as built-in provider
- Bug: Context compression creates new session but gateway never sees it — infinite compression loop
- [Bug]: Windows: \hermes update` always reports "Another hermes.exe is running" — launcher shim PID not excluded from concurrent-instance detection`
- [Bug]: _is_entitlement_failure over-matches xAI 'bad-credentials' 403 — long-running TUI sessions can't auto-refresh stale OAuth tokens
- Discord: tool-using responses (api_calls≥2) silently dropped — no `Sending response` log after `response ready`
- [Bug] Kanban dashboard DELETE /tasks/:id ignores board parameter — 404 on non-default boards
- Unable to add custom tools
- [Feature]: git-bisect-debugging skill
- chrome-devtools-mcp subprocess leak: not reaped on gateway shutdown or session end
- Skill Matching Should Be Advisory, Not Mandatory — A Control Theory Perspective
- User message arriving during preflight compaction aborts the agent loop when an alt context engine is active
- [Bug]: Tool-progress consumer drops last event when __reset__ arrives during throttle window
- [Bug] Desktop Sessions tab shows infinite spinner on Intel Macs — better_sqlite3.node compiled for arm64
- Feature: Native Canvas Mode for collaborative planning and UI/design workflows
- Bug: Dashboard achievements share button causes flickering animation
- SSL: CERTIFICATE_VERIFY_FAILED
- Add idle time-gap pre-compression for stale near-limit sessions
- [Bug]: Updated to 0.14 in Docker. python-telegram-bot not installed
- [BUG] Scheduler prematurely marks repeating cron jobs as 'completed' after first successful run
- Honcho memory tools ignore focused query and token budget controls
- [Bug] Holographic probe/reason algebraically broken: circular-mean bundle incompatible with phase-subtract unbind
- [Feature] computer_use: route screenshots through auxiliary.vision when main model lacks vision
- ACP edit approval prompts every edit individually with no session/always option, unlike terminal command approvals
- Bug: auth_mode: api_key sends x-api-key instead of Bearer for Azure Foundry Anthropic-style endpoints (v0.14.0)
- Bug: kanban_swarm.py references missing skill avoid-ai-writing, synthesizer crashes in retry loop (v0.14.0)
- [Bug]: Nous inference API streaming times out on agent-sized payloads — non-streaming works fine
- [Bug]: Gateway restart hangs indefinitely — D-Bus race with systemd user unit
- 🌙 Plugin Proposal: Dreaming — Automatic Background Memory Consolidation
- Feature request: customizable Discord auto-thread naming (template or rename hook)
- doctor falsely reports Copilot as unconfigured when gh_cli credential exists
- [Bug] New chat is blocked while context compression is running
- fix(dashboard): plugin enable/disable routes return 405 for category-namespaced plugins
- [Feature]: Ability to toggle title generation
- [Feature]: Kanban task request for approval
- [Bug]: Kanban active_pr respawn guard has no operator clear path and ignores closed PRs
- bug(feishu): DM reply messages routed to thread instead of main chat
- Obsidian skill: Vault path from `OBSIDIAN_VAULT_PATH` is not validated or confirmed on load
- bug(feishu): first chunk of long messages sent as msg_type=text, breaking Markdown rendering
- [Setup]: USER.md seems to be unknown to hermes
- [Bug]: hermes doctor SSH check ignores configured SSH user/port/key
- [Bug]: Langfuse plugin shows reasoning: None for reasoning_content models (DeepSeek/Qwen/LM Studio convention)
- [Feature]: Render Slack progress drafts as plan cards
- cron create: positional [prompt] documented as optional but rejected at runtime
- Interrupted OpenAI/httpx request thread survives across turns and writes TLS record bytes to unrelated file descriptors on delayed close
- approval.py: gateway-mode auto-deny leaks DANGEROUS COMMAND warning text into agent's visible output, contaminates downstream consumers
- config docs claim TIRITH_ENABLED env var works but cli.py only reads from security_cfg dict (silently ignored)
- Feature request: `security.trusted_url_prefixes` config with 127.0.0.1/::1 default-allowed for approval.py + tirith scanners
- Automatic context compaction can hide or drop just-completed assistant response
- Discord clicked slash-command suggestions are not normalized before dispatch
- Profile HOME isolation can hide existing GitHub CLI auth from subprocesses
- Profiled workers need a shared auth home separate from isolated HERMES_HOME
- Per-session working directory for gateway (OpenAI-compatible API) sessions
- [Bug]: Getting a weird error since I installed and now it's harassing me in tui about the warning
- [Setup]: Bad UX: Manual .env/config.yaml configuration required for Discord gateway setup
- Gateway: route chat/thread messages to Hermes profiles in a single gateway process
- [Show & Tell] hermes-memory-pgvector v0.3 — drop-in Postgres + pgvector memory provider plugin
- [Bug]: claude code pro/max changes to api mode
- [Bug]: Vision routing issue in Hermes Agent v0.14.x with MiniMax custom provider
- [Discussion] 心智孪生体:五层递进蒸馏记忆架构 — 从第一性原理思考 Hermes Memory 的进化
- Bug: cache_read_tokens and cache_write_tokens missing from API Server SSE usage events
- [Bug]: Mouse tracking escape sequences leak into input buffer (raw SGR mouse codes appear in prompt input)
- [Bug] Context compression silently drops summary on connection error, causing total context loss for long tasks
- [Bug]: Dashboard TUI scroll regression in v0.14.0 — long sessions truncated / missing history
- [Feature]: a Hermes-Canvas (Text Editing & Hybrid Completion Environment) on top of a well-built GUI for Hermes Agent
- background_review fork sends wider tools[] than parent, fragments Anthropic prefix cache (~50% wasted cache-write on long sessions)
- [Feature]: upload owned skill with scripts not from bash mode
- [Bug]: WeChat gateway fails to send .html files due to MEDIA extension allowlist
- Bug: productivity/maps SKILL.md script path is wrong twice — missing category prefix and uses ~/ which sandboxed subprocesses can't resolve
- [i18n] clarify tool's reply-prompt template is hardcoded in English
- [Bug/Enhancement] Hardcoded max_tokens and overly verbose prompt in vision_tools.py causes severe latency for reasoning models
- [Refactor/Chore] apply enforce-canonical-classes for tailwind v4
- [Refactor/Chore] fix api docker build
- Local Cloud edition dev loads production analytics scripts and shows a Script error overlay
- Legacy model_type values break custom model credential management
- [Refactor/Chore] Cap non-dev dependency ranges below next major versions
- [Refactor/Chore] move contract progress count to avoid conflict
- Web test shard jobs hide failure details until report merge
- Looping node, unable to exit the loop
- [Refactor/Chore] Stop using `{"result": "success"}` randomly in the response
- Cache plugin model provider discovery across runs with tenant-scoped invalidation
- sandbox no space left on device
- [Refactor/Chore] Consolidate workflow persistence async writes into default repositories
- suggested-questions failed
- Security: OWASP ASI06 memory poisoning defense for Dify agent memory
- Security Concerns and Enterprise Security Enhancement Suggestions
- Why does the service report an error after some time, indicating an incorrect database password, when I deployed Dify using Docker Compose? The version of Dify I used is 1.9.2
- 404 Error Occurs When Create from Blank in Self-hosted Docker Dify Deployment
- [Feature Request/Bug]: Missing ANSI Color Support and TUI Elements in Gemini CLI
- Feedback: [ISSUE]
- Gemini cli will be exclusive to API and Enterprise user in the future
- OAuth flow fails in SSH/Headless sessions - Browser cannot be opened
- Can't login from gemini-cli
- Feature Request: Transform Gemini CLI into a full-fledged GUI software / application
- Antigravity CLI - is it open source?
- Alienating your users is not a good business practice
- [Bug] Antigravity v2.0.0 language_server is been hardcoded to staging endpoint (daily-cloudcode-pa) . Below details includes deep forensic, extreme consequences and solutions to be consider.
- [Bug] Critical crash when optional .kilocode/rules directory is missing
- Non English characters appearing in CLI output
- Bug: Ultra subscription detected as "AI Pro" with unusually low limit (200 requests)
- [Feature Request / Regression] Bring back standalone Gemini CLI or support full legacy workflow with stable OAuth
- Full path with filename in success message.
- Cannot read properties of undefined (reading 'type') on write_file/replace tools
- gemini code assist using 10K tokens for input , for task like "hi"
- O comando /statusline salva a descrição textual diretamente no settings.json em vez de gerar o script de statusline
- Will Antigravity CLI support custom slash commands that were stored in the "commands" folder
- " Error 403 " on cloudcode-pa still happening — checked main branch, two proposed fixes (#25450, #26420) were never merged, users still blocked!!
- Will Gemini CLI, an open-source project, be maintained in the future?
- `POST /rest/ai/sessions` returns 500 when loading code-builder sessions (`invalid input syntax for type uuid`)
- AgentToolV3: EngineRequest returned by sub-agent LLM tool calls is not handled, causes "not supported in Agents" error
- Salesforce Node is not outputing full error in error node.
- API credentials being replaced with blank value placeholder
- Loop node disfunction on repeated passes
- OpenAPI key issue config.headers.setContentType
- workflow started to fail a lot
- Error while working with pdf
- Security: OWASP ASI06 memory poisoning defense for n8n AI agent nodes
- Rag tool
- Header Auth credential value is replaced by __n8n_BLANK_VALUE_... when saving
- External task-runner sandbox ignores NODE_FUNCTION_ALLOW_EXTERNAL — modules always 'disallowed' (n8n 2.14.2)
- [BUG] JetBrains ClaudeCode PlugIn java IndexOutOfBounds Exception
- [BUG] CLI and VS Code extension conflict on Windows — extension unusable until CLI is uninstalled
- Feature: Git Worktree Awareness for Claude Code Desktop
- [BUG] Anthropic CLI Overwrites and Pins Claude Code Credentials
- [BUG] Continuously crashing!
- [BUG] Harness system prompt lacks a verification lane boundary — anti-over-engineering instructions cause agents to skip verification and override loaded user safety rules
- Claude model prioritizes protecting Anthropic's reputation over being honest with users
- [BUG] Hook executor silent fail in v2.1.x — mid-session hooks never invoked despite registration
- [Enhancement] Reap MCP child processes on parent claude exit — portable-workspace external drives get corrupted by orphan handles
- [BUG] Cowork Crashing!
- claude.exe ugrep subprocess wedges holding 6-9 GB RAM; parent does not SIGKILL on timeout
- [BUG] Claude Code version 2.1.139 indicate malware
- [BUG] usage limit with sonnet (default) with 70% of my 5 hour window available.
- [BUG] Sandbox write allowlist does not match filenames containing .. (e.g. advisory-db..lock)
- [BUG] Claude on Fold 3 (and probably the rest of foldables)
- [BUG] claude plugins --json fails with "unknown option '--json'" in Manage Plugins panel (v2.1.145)
- [FEATURE] Setting to disable copy-on-selection in the agents view (TUI)
- C:/Program Files/Git/quit prints session ID for a session file that was never written (WSL + Windows path interop)
- Plan-mode inline comments left via desktop UI are silently lost — never reach session jsonl or plan file
- Sessions become unresumable after EnterWorktree → ExitWorktree, missing from both same-cwd and cross-worktree /resume pickers
- [Bug] Session usage quota consumed disproportionately on minimal Sonnet interactions
- Feature request: word autocomplete in prompt input
- [Bug] Early stopping triggered incorrectly in loop
- [FEATURE] Subagents have no Agent/Task tool — recursive/nested subagent dispatch impossible
- Feature request: Expose account usage limits via CLI / API
- [Bug] Terminal display corruption after Shopify CLI usage with non-ASCII character rendering
- API Error: cache_control cannot be set for empty text blocks when sending image-only message
- remote-control vs --rc: different session visibility and app access behavior
- [BUG] Claude Code VS code plugin attached file never gone
- Re-attaching to existing session ENOENTs after Homebrew Cask upgrade (stale versioned worker path)
- Image-only message sends empty text block with cache_control, 400s and kills conversation
- [BUG]cant open claude code desktop
- [BUG] `autoUpdate: true` on git-sourced marketplace does not `git pull` the clone — silent across quit/relaunch (2.1.139)
- [BUG] Subject: Claude code appears to hallucinate user messages and act on them
- Voice dictation: user-configurable vocabulary hints for custom terms
- Context usage percentage not updating from 0%
- 2.1.144/145: CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 in settings.json + --chrome freezes input for ~3.5 min at startup (macOS)
- [MODEL] Prevent Claude code from scanning the repo automatically before being asked!
- [BUG] Bug: File edits cause metadata loss (group, setuid, xattrs, hardlinks)
- [BUG] Claude Desktop Relaunch on Relaunch Chip Click fails in Windows 11
- /remote-control: desktop session works, mobile never receives anything — and no obvious way to report it from the app
- C:/Program Files/Git/goal (and slash commands) pasted from mobile do not execute — requires follow-up prompt to fire
- [BUG] [Agent View] Persistent flicker and broken input on Windows Terminal + Git Bash with CJK (v2.1.145)
- Claude SONET 4.5 , CLAUDE OPUS 4.7 models slowness in claude code
- Terminal escape sequences (DA response) appear as input text
- Feature Request: Vim insert mode key remapping (imap equivalent)
- Feature request: configurable colour for user input in conversation display
- [Bug] Rate limit consumed disproportionately to token usage
- Color theme renders in 256-color mode inside tmux despite COLORTERM=truecolor
- [BUG] Fullscreen rendering: mouse-wheel scrolling stalls / drops frames in VS Code integrated terminal (Windows, v2.1.145) — keyboard scroll unaffected
- Code tab: "remote control disconnected" when resuming any session whose CLI owner is gone (e.g. after PC restart)
- /resume picker silently switches to global view when current dir's session bucket is empty and git ancestor exists
- Pasted content in agent panel is not accessible to the agent
- Agents cannot read pasted content in their session — arrives as unreadable placeholder
- [FEATURE] ! shell command mode doesn't load interactive ZSH plugins (zsh-autosuggestions, zsh-autocomplete)
- Incorrect glyph rendering for certain characters (Latin and CJK) in Claude Code UI
- [FEATURE] /clear and specify model for next session at once, e.g., "/clear -m sonnet"
- VS Code extension — expose open tab list for multi-file context awareness
- CI / monitor event payloads embed imperative action instructions that override the user's verb
- Notarize the macOS claude CLI binary — un-notarized binary causes syspolicyd / XProtect YARA scanning storm on Sequoia (15+)
- [plugin: ralph-loop] stop-hook.sh #!/bin/bash shebang fails on Windows + Git Bash
- [Bug] Auto-update mechanism fails silently
- [BUG] /resume renders an unselected session's transcript and injects synthetic messages into its .jsonl (v2.1.139, Windows PowerShell)
- Explore subagent hallucinates "respond text-only" instructions from non-existent prior messages, refuses tools
- [BUG] Status bar shows "thinking with xhigh effort" while skill frontmatter sets effort: max
- [FEATURE] Chat-Titel in der Sprache des Gesprächs (Claude Code)
- [Bug] RemoteTrigger.list: API returns next_cursor but tool wrapper exposes no cursor input parameter (pagination unusable from CLI)
- Hosted GitHub MCP OAuth flow broken in claude.ai/code web sessions
- [BUG] /copy command: clipboard copy not working on Windows 11
- [BUG] Failure to open / enable CoWork
- Support image viewing capability (view_image tool) like GitHub Copilot
- [BUG] PR review panel shows wrong file diff (same files for all PRs) — diff payload cached/decoupled from branch label
- [Bug] UI rendering issue: Background colors overlaying text instead of displaying content
- [FEATURE] Support spinnerVerbs in VSCode Extension
- Opus 4.7 (1M context) missing from /model picker on Bedrock
- [BUG] Claude Code is not working on the desktop app. It's working on the website and through VS Code, but it just won't work on the desktop app of Claude. It's been stuck for 3 days.
- Routines stuck at "Setting up a cloud container" — never execute
- Model carries imperative actions from earlier system-reminder payloads past an explicit plan-scope narrowing
- [FEATURE] CI monitor: surface branch-out-of-date (BEHIND) alongside failing checks
- [BUG] No scroll at Claude.Ai desktop app at my MacBook Pro where my os is macOS Tahoe 26.2
- [Bug] Socket connection closed unexpectedly during API communication
- [BUG] [BUG] Plugin [email protected] inbound notification: MCP SDK dispatch resolves OK but Claude Code does not render <channel> block (Windows)
- VS Code extension: strip trailing newline when copying fenced code blocks (or make it configurable)
- skill-creator run_eval.py: Windows incompatibility — select.select() fails on pipe handles (WinError 10038)
- skill-creator run_eval.py: false negative when model calls non-Skill tool before Skill tool
- Feature request: 24-hour time format option for /usage display
- Thai text broken in TUI: input editing + output rendering
- [Bug] Claude outputs duplicate instructions and repeats text on terminal resize/scroll
- [BUG] CLAUDE_CODE_USE_BEDROCK=1 writes <2% of prompt to cache at >150k context, vs full prompt on Anthropic 1P direct
- [BUG] Garbled/corrupted text rendering in terminal on macOS
- Feature Request: TodoWrite / TodoRead tool support in Claude Desktop (Web & App)
- [BUG] /mcp dialog hides servers with zero tools, blocking mid-session reconnect
- [BUG] Prompt revision draft is lost once Arrow Up is pressed on Claude Extension for Visual Studio Code and Claude Code
- [MODEL] Tests written by Claude wrote to production shared infrastructure (NAS) without isolation
- Session: How can we quickly delete the whole draft/unsent message?
- API Error 400: text content blocks must be non-empty - session becomes unresumable
- [FEATURE] Turn the 5h limit into a rolling window, instead of emitting "resets at <time>" whilst expecting form the user to sent a message first
- [Bug] Claude Code inconsistently follows user instructions and requires excessive token-burning iterations
- VS Code extension: support attaching to running remote/bg sessions as a thin client (like the mobile app)
- [BUG] Big one!
- [BUG] claude --resume picker pulls in sessions from sibling projects whose encoded folder name shares the cwd's prefix
- [BUG] 클로드 코드 폴더명 바꿔달라 요청하니 이전 폴더명을 찾으며 계속 이상동작함.
- [Feature Request] Add NotebookRead tool for efficient Jupyter notebook cell extraction
- Persist parent-session lineage (`forked_from_id`) in transcript JSONL for `/branch` and `/clear`
- accept/discard buttons
- Bun 1.3.14 integer overflow panic on Windows x64 after long-running session (low memory) - claude 2.1.145
- Ambiguous 'Don't ask me again' option in session resume prompt
- Garbled/overlapping text in transcript during rapid bash execution with active subagents
- Large dead space in UI when agent panel is visible with subagents
- Sessions are tied to cwd path, breaking --resume after directory rename
- [BUG]Failed to start Claude's workspace
- [Bug] Vision model returns inconsistent bounding box extraction results between Claude Code CLI and Claude API
- [BUG] Claude desktop is not recognizing my pro account
- [BUG] New Session button completely unresponsive in Claude Code Desktop on Windows 11
- WebFetch/WebSearch: support content negotiation (Accept header), default to Accept: text/markdown
- [FEATURE] Enable voice dictation (/voice) when using AWS Bedrock, Vertex AI, and other third-party providers
- [FEATURE] Opt out of sending session information
- [FEATURE] Microsoft 365 MCP: Add support for inline images (hostedContents) in Teams channel messages
- [BUG] spawn-task / local-agent-mode session orphaned, not visible in app or terminal but PID still alive
- [FEATURE] Open $EDITOR (Ctrl-G) from the subagent prompt editor before dispatch
- [FEATURE] Allow users to customize dark mode color palette (e.g. dark blue instead of muddy brown)
- [BUG] Tab autocomplete completes skill names to dash form, losing argument-hint rendering vs. colon form
- not wroking
- [FEATURE] Add bindable actions for `chat:deleteNextWord` and `chat:deletePreviousWord`
- [Bug] Claude Code process hangs or responds with significant delays
- Allow specifying working directory when spawning subagents via the Agent tool
- Intermittent "Working directory was deleted" + EPERM on file ops when project lives under ~/Documents/Claude/* (macOS Tahoe)
- [BUG] MacOS app crashes immediatly when loading up
- VS Code extension: Notification hooks don't fire on permission-approval or elicitation dialogs
- Worktree feature is subdirectory-blind in monorepos (loses subdirectory-scoped CLAUDE.md)
- [BUG] Drag and drop files not working inside Vscode with WSL
- [FEATURE] Add a "New chat" button / shortcut to quickly start a fresh session in the VS Code chat panel
- [BUG] Cowork on Windows ARM64: Linux guest never establishes vsock callback — stuck at add_plan9_shares, 100% reproducible after exhaustive diagnosis
- [BUG] Claude Code fails to launch on Mac OS (Mac OS version 26.2 (25C56))
- [Bug] Dispatch routes to Claude Desktop Code tab instead of Claude Code CLI in Warp terminal
- [BUG] reopen of https://github.com/anthropics/claude-code/issues/34678 with vs code Claude Code version 2.1.145
- Desktop app: support multiple windows on Windows for virtual-desktop workflows
- [BUG] Hook runner produces git usage text on Windows for all hooks
- Add Portuguese (Brazil) localization for VSCode extension UI labels
- [FEATURE] It would be fun to get curated spinner words, rather than just the local list, to keep it fresh.
- [FEATURE] [FEATURE] Show elapsed thinking time as a live timer in VSCode extension
- [BUG] Plugin install rejects skills[] object-form with misleading 'Update Claude Code' error on latest version
- [BUG] Permission preview flickers / scroll snaps back when reviewing long Write or Edit tool-call content
- telegram plugin: infinite CPU loop on EPIPE (broken pipe causes uncaughtException storm)
- [BUG] Characters rendering incorrectly in chat interface after recent update
- [BUG] Windows: Two parallel installs (Squirrel + MSIX) both reporting v1.8089.1 cause Code Recents to permanently empty on app restart
- Statusline usage indicators: replace bars with percentages, fix Current Session bar fill, add countdown reset label
- [BUG] claude agents: keyboard input (Esc/f/x) unresponsive after a /btw answer while the session's main task is still running
- UX: way to attach a question/annotation to a specific fragment of agent output instead of typing it as a new prompt
- [Bug] Claude unnecessarily uses `cd` command for directory navigation
- [BUG] Token waste due to repeated failed edits that broke a live production site
- [BUG] Edit tool frequently fails with "String to replace not found" on exact matches (macOS)
- One session's HEAD silently changes when another session in the same repo creates/modifies a worktree
- [BUG] Korean output: valid Hangul but wrong/missing syllables and hallucinated non-words (not U+FFFD)
- [BUG] Claude cowork de escritorio se cierra al escribin instrucciones
- [Bug] Auto-resume after compaction starts tasks before user instruction
- [BUG] ant auth login switches Claude Code to API billing
- [FEATURE] Usage dashboard / at-a-glance summary command in CLI
- [Bug] Agent fails to execute planned tasks and performs unintended actions
- TUI auto-links bare #NNN issue/PR refs to the current repo, ignoring an explicitly-named different repo
- Auto-archive of inactive sessions breaks multi-agent / multi-project workflows
- [Bug] Input buffering behavior inconsistent during active task execution
- [BUG] claude-in-chrome: socket protocol endianness mismatch on Linux/WSL — "Invalid message length" on connect
- Security · `claude mcp add` echoes Authorization Bearer token to stdout — enables credential leak via paste-back verification
- [BUG] Environment variables defined in Local Settings are ignored if any Environment Variables are defined in Managed Settings
- [BUG] Multiple Agent(type)entries in agenttools:` frontmatter — only last entry survives
- Session rename reverts after pressing Enter
- [BUG] CLI 2.1.145 sends literal "claude-opus-4-7[1m]" as model name on session resume, hits 404, silently falls back to 200K
- Feature Request: i18n / UI localization support
- [BUG] Remote routine agent stuck on 'Setting up a cloud container'
- Claude Code not connecting to Chrome
- [BUG] VS Code Extension hangs
- Claude Code cannot reliably follow SCRUM/Agile process
- [Feature Request] Add search functionality to grep across all conversations and navigate to matching context
- Background `claude --print` spawns silently burn Max5 quota; no per-account rate-limit visibility
- [FEATURE] Desktop App: Allow Files panel to be repositioned (left or right side)
- [BUG] $480 paid across 3 Stripe invoices for Max 20x — Anthropic's own Stripe sent "payment unsuccessful" while charging card — no provisioning, ticket #98190248 unanswered 17 days
- Preview tool: allow user to resize viewport from UI
- [FEATURE] Consolidate exact-match permission entries into patterns
- [BUG] Chinese characters display as question marks in Termius terminal on Linux
- [Bug] Anthropic API Error: System role not supported on model
- [BUG] FleetView desktop session returns 403 for cloud MCP connectors (Slack)
- [BUG] Cowork: EINVAL error on every second prompt due to stale oneshot session mount
- Preview tool: auto-fill form fields with test data (like Chrome autofill)
- Preview tool: support multiple tabs/viewports for side-by-side comparison
- [Bug] Socket connection closed during extended API requests
- PreToolUse hooks do not fire for sub-agent (Agent tool) Bash calls
- Claude circumvents Bash permission restrictions by switching to PowerShell
- [FEATURE] Auto-restore editor-area Claude sessions across VS Code window reload
- [BUG] CLI is unrecoverable when returning to an expired session — /login and all inputs fail with 403
- [FEATURE] Make thinking summaries streaming
- Indeed MCP OAuth fails with `invalid_client / Client not allowed` — same pattern as #47185
- [Feature Request] Improve proactive suggestion of alternative methods and best practices
- Claude repeatedly revisits ruled-out debug hypotheses with fresh confidence in long technical sessions
- [FEATURE] External wake signal for interactive sessions
- Allow starting a new session without restoring the last project directory
- [BUG] Two identical Claude Code icons appear in activity bar after installing a single extension
- [DOCS] `Build a streaming UI` miss the the check for in_tool
- 400 role 'system' is not supported — client builds malformed request after large, twice-compacted session (unrecoverable in-place)
- [FEATURE] Allow multiple team members to edit organization-provisioned skills
- HTTP MCP transport does not auto-reinitialize after server restart (404 "Session not found" is not handled)
- Claude Opus 4.7: skipped /script skill for "temp" bash, treated rule as exempt
- You're out of extra usage · resets 6pm (America/Toronto)
- 2.1.143 CLAUDE CODE SKIP MD. RULES (COST MONEY)
- [FEATURE] Allow hooks to trigger MCP server reconnection
- [FEATURE] Group Claude Code sessions into folders that mirror project directories (like Codex)
- [DOCS] Undocumented "Classify session states" and its impact on privacy and costs
- [BUG] autoUpdates: false in ~/.claude.json is not respected on native installation — CLI self-updates on launch
- SDK worktree creation contaminates parent repo's core.hooksPath config
- [Bug] Interactive prompt fails when input provided during /btw execution
- [Bug] Insights skill doesn't detect C++ file changes (.cpp, .cc, .cxx, .hpp, .hh, .ipp)
- [FEATURE] Per-word predictive tree-dialogue completion for slash commands (grammar from skill metadata)
- [Bug] Performance degradation and reduced output verbosity in current session
- [BUG] Claude Doesn't Follow Instructions #742 - still happening or happening again
- [Bug] MCP tool-call arguments coerced to JSON-string on the wire regardless of schema type
- [BUG] /usage view cannot be exited — Escape, q, and Ctrl+C have no effect IntelliJ (Windows CLI)
- [BUG] The claude for /resume broke following links
- /goal Stop hook fails with "Prompt is too long" in long sessions
- 429 rate limit error should suggest starting a new conversation
- [BUG] pwsh.exe FailFast (0xE9 ERROR_PIPE_NOT_CONNECTED) in ConsoleHost.Start, triggered by spawned statusline / hook subprocesses on Windows
- [Feature Request] Auto-suggest `!cat` command when reviewing generated planning specs
- [FEATURE] would love an inline editing feature in the plan like antigravity.
- [BUG] VSCode extension requests permissions for commands already approved
- Desktop "+ New session": cwd picker + stable cross-device session naming
- [FEATURE] Auto-signal context compaction + recommend state refresh after /compact
- Permission prompt misclassifies edits inside `.claude/worktrees/` as Claude settings edits
- Agent View / FleetView: allow specifying a starting directory (cwd) when spawning a new agent so it boots with the correct project context
- [BUG] Cowork HCS 0x80070003 when Claude Desktop is installed inside Hyper-V VM (nested virtualization)
- Categorical prohibitions gate at named instances, not at their rule-implied counterparts
- macOS: "'2.x.xxx' would like to access data from other apps" prompt on every launch
- [BUG] Text selection highlight invisible on white background in code terminal window (desctop)
- [FEATURE] Add minimize / collapse control to side-chat panels (long-running sessions stack visual context)
- [Bug] Claude Code ignores explicit instructions to avoid parallel tool calls
- [FEATURE] Sticky input bar at bottom of TUI while scrolling conversation history
- [Bug] claude rc "Remote Control not yet enabled for your account" — seatTier: null on active Max subscription (macOS aarch64)
- Regression in 2.1.144/2.1.145: conversation JSONL files only save ai-title, no message content written to disk
- Misleading warning: '--allowed-tools' CLI flag and shell env do not satisfy CLAUDE_CODE_SUBPROCESS_ENV_SCRUB auto-mode gate
- [BUG] Desktop app stuck — prompt submitted but no response (Select repo error)
- Agent teams: teammates die immediately — harness spawns claude without a pty, causing stdin/print mode failure
- False-positive 'cyber-related safeguards' block on hard-SF fiction Q&A — fires on tool-result continuation, re-fires on benign retry
- [FEATURE] Add /share command for allow other users see prompts and answers history.
- [Bug] Table rendering broken in Khlod
- Projects section missing from sidebar after recent update
- Feature request: pin / bookmark responses in CLI session
- [FEATURE] Revive #24244 — Stop hook needs additionalContext (or continueWith) for clean workflow continuation
- [BUG] IS_SANDBOX=yes and port 27017 blocked on "Full" network access cloud environment
- [FEATURE] Architect Mode — Pre-Execution Architectural Planning Layer for Claude Code
- [BUG] UI get's stuck in Win 11 desktop app while running subagents in Cowork
- Agent spawning ignores explicit user constraints, wastes rate limits and produces low-quality output
- [FEATURE] `claude -p` 3-second stdin timeout breaks `vipe`-style edit-in-pipeline workflows
- Expose thinking token counts in statusline JSON input
- [BUG] dangerously skip permissions does not work in VSCode
- claude -p hangs indefinitely on a silently-dead API stream (no SSE stream-idle timeout)
- Feature request: slash command to list workspace directories
- [BUG] Cowork: `request_cowork_directory` rejects WSL2-backed paths even when aliased via `subst` or `net use`
- Add simple 'Copy' option to message hover menu for copying selected text
- [BUG] Windows: every tool call flashes a visible console window (child_process.spawn missing windowsHide: true)
- Meta Ads MCP returns 500 error on all tool calls after successful connection
- bug(mcp): --mcp-config dynamic entries silently dropped when server name appears in disabledMcpServers
- Claude in Chrome: false-positive block on dashboard.tossplace.com (SMB merchant analytics, not payment processing)
- [BUG] Write/MCP tool silently writes [Trimmed input: ~NNN chars] placeholder to disk/API instead of actual content
- Channels: notifications/claude/channel delivered after a tool-only turn lands in the prompt buffer instead of starting a new turn
- [BUG] Menu buttons close on mouseUp instead of registering click — Claude Desktop AND claude.ai web (Safari + Chrome)
- Usage limit reached repeatedly without active use — Pro plan
- Cowork & Claude Code Crashing - ARM64 Surface Laptop 7
- [Bug] Rate limit reset calculation incorrect - usage spike after reset
- [BUG] Scheduled routines fail every MCP tool call with "MCP tool call requires approval" on custom connectors (regression ~2026-05-20)
- [FEATURE] Proactive usage limit warnings before hitting caps
- [FEATURE] Add custom entries for the spinner
- [Feature Request] Add direct access to claude.ai chat history and export functionality
- [BUG] GitHub repositories not showing in Claude Code mobile app despite GitHub App installed
- [BUG] CCR routines stuck on "Setting up a cloud container" — never execute
- Can no longer easily select text to copy and paste
- [Feature Request] Support email address changes for existing Claude accounts
- [MODEL] Commands so slow on the windows machine ( windows 11 )
- Support configurable language for terminal tab title (session topic)
- [FEATURE] CLAUDE_CODE_BASE_REF env var should apply to all default-branch lookups, not only the per-file merge-base path
- [BUG] "gave incorrect register advice for STM32WLE4, couldn't read local PDF"
- [BUG] Routines: MCP connector tool calls fail with "requires approval" despite connectors being added to routine
- [BUG] Cowork: "Reached maximum number of turns (100)" breaks long-running browser automation projects
- Make the /color session-name bar themeable (accept hex or follow the theme)
- After long command finished, call hook to feedback
- False-positive safety block when migrating legitimate biomedical research workflow skill files
- Codex Desktop: official app connectors fail to initialize with JsonRpcMessage deserialize error
- quota drops without doing anything
- Codex multi-agent orchestration sucks
- Codex Desktop project sidebar shows empty even when threads have matching cwd
- changing permissions in CLI crashes codex
- WSL image paste fallback fails when appendWindowsPath=false and Get-Clipboard returns null
- Chrome extension backend does not expose viewport capability for @Chrome browser tasks
- Stash follow-up prompts while Codex is running
- `Work locally` picks up PR by branch name startsWith (??) not exact branch name so gets the wrong association
- Suggestion: Interactive choice prompts for user confirmation in Codex CLI/client
- Codex Desktop (MSIX) v26.513.4821.0 — Black/blank window on Windows 11; clean reinstall + full state reset do not fix
- Codex CLI /permissions omits Read-only in WSL2 but shows it in Windows PowerShell
- `codex mcp login` fails for Kaggle MCP: OAuth authorize rejects short `client_id=codex`
- Rendering is completely broken when git is detected
- Remote Codex projects should render Markdown/HTML files like local projects
- @chrome plugin cannot be called and reinstall/update/uninstall fails
- Codex mobile remote connections break after renaming two computers on iOS
- Codex Desktop plugin marketplace is covered by a large white overlay on macOS Intel
- Chrome plugin: tab.goto() causes native pipe closed / kernel reset, blocking navigation and web automation