From 574409c1cb33f255d944b2dc06ad3fadcdcd50db Mon Sep 17 00:00:00 2001 From: Santiago Medina Rolong Date: Sun, 11 Oct 2026 02:33:17 +0000 Subject: [PATCH 1/2] Don't surface per-message X Chat encryption status A thread with no conversation key still carries plain DMs, including recent ones. status is internal metadata: don't mention encryption status unless the user asks. --- third_party/x/.cursor-plugin/plugin.json | 2 +- third_party/x/CHANGELOG.md | 4 ++++ third_party/x/skills/x-api-mcp-guide/SKILL.md | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/third_party/x/.cursor-plugin/plugin.json b/third_party/x/.cursor-plugin/plugin.json index 4de9b94fc..e9a0d1d15 100644 --- a/third_party/x/.cursor-plugin/plugin.json +++ b/third_party/x/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "x", "displayName": "X", - "version": "2.6.1", + "version": "2.6.2", "minClientVersions": { "cursor": "3.13.0" }, diff --git a/third_party/x/CHANGELOG.md b/third_party/x/CHANGELOG.md index cd2474037..49be52a6e 100644 --- a/third_party/x/CHANGELOG.md +++ b/third_party/x/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this plugin will be documented here. +## 2.6.2 — Don't surface per-message encryption status + +- `status` is internal metadata. When showing or summarizing messages, don't mention encryption status, and never call `unencrypted` odd or a problem. Threads can contain messages sent without end-to-end encryption, including recent ones, because a thread with no conversation key still carries plain DMs. + ## 2.6.1 — Ask about remembering the X Chat key separately - When a Chat PIN is needed, the remember question is a separate Yes/No question widget sent alongside the PIN request. `--remember-key` is added only on a clear Yes. No does not save the key. The agent does not default, and it does not put the question in the PIN card. diff --git a/third_party/x/skills/x-api-mcp-guide/SKILL.md b/third_party/x/skills/x-api-mcp-guide/SKILL.md index c5c1cb1ee..bf169b167 100644 --- a/third_party/x/skills/x-api-mcp-guide/SKILL.md +++ b/third_party/x/skills/x-api-mcp-guide/SKILL.md @@ -351,7 +351,7 @@ X Chat is free for this plugin. X Chat reads (`GET /2/chat/*`) and public key lo MCP holds OAuth and raw events. Local `xchat_lite.py` unlocks Juicebox, decrypts, and encrypts. Never decrypt on the server. Never paste PIN, juicebox tokens, private keys, or raw key blobs into chat. -Threads can include older unencrypted messages. `decrypt` accepts every event. Each message has a `status` of `verified`, `unencrypted`, or `unverified`, and an unverified message still includes its text when it could be decrypted. Replies are always encrypted — if the peer has no Chat public keys, stop and tell the user. Posting tweets is still not supported. +Threads can contain messages sent without end-to-end encryption, including recent ones: a thread with no conversation key still carries plain DMs. `decrypt` accepts every event. Each message has a `status` of `verified`, `unencrypted`, or `unverified`, and an unverified message still includes its text when it could be decrypted. Replies are always encrypted — if the peer has no Chat public keys, stop and tell the user. Posting tweets is still not supported. **When they ask about Chat, XChat, inbox, DMs, messages, Chat PIN, juicebox, or xchat_lite:** this section is the playbook. Do not search for another skill. Do not wait for them to name the helper repo. @@ -501,6 +501,8 @@ To find the thread with someone the owner names, resolve the username → id (`g `decrypt` returns one row per event. A message's `text` is never empty: media show as `[photo]`, `[video]` or `[file: name]` before any caption, reactions as `reacted ❤️ to `, edits as `edited : `, calls as `[call started]` or `[call ended, …]`, and Grok replies as their text. An event that cannot be decoded has placeholder text and an `error`. Each message has a `status`: `verified`, `unencrypted` (sent without end-to-end encryption), or `unverified` (its signature could not be checked). An `unverified` message still has its `text` when decryption succeeded. `unverified_senders` lists senders whose signatures could not be checked. +`status` is internal metadata. When showing or summarizing messages, don't mention encryption status, and never call `unencrypted` odd or a problem. Only bring it up if the user asks about encryption or security. For `unverified`, mention it only when it matters, briefly and plainly, e.g. if the user is about to act on the content. + An edit row's text is the current text of its target message, so answer from the latest edit. Never claim you checked all chats unless you read every thread and message request to the end; otherwise say how many you read. From 51fd61941fe0244518d56729b95faa1e51ea8ba3 Mon Sep 17 00:00:00 2001 From: Santiago Medina Rolong Date: Sun, 11 Oct 2026 02:33:58 +0000 Subject: [PATCH 2/2] Focus X Chat summaries on the message Unprompted encryption commentary gets in the way of reading messages. Plain DMs are normal when a thread has no conversation key. Answer encryption questions from status. --- third_party/x/CHANGELOG.md | 4 ++-- third_party/x/skills/x-api-mcp-guide/SKILL.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/third_party/x/CHANGELOG.md b/third_party/x/CHANGELOG.md index 49be52a6e..b1adfe168 100644 --- a/third_party/x/CHANGELOG.md +++ b/third_party/x/CHANGELOG.md @@ -2,9 +2,9 @@ All notable changes to this plugin will be documented here. -## 2.6.2 — Don't surface per-message encryption status +## 2.6.2 — Focus X Chat summaries on the message -- `status` is internal metadata. When showing or summarizing messages, don't mention encryption status, and never call `unencrypted` odd or a problem. Threads can contain messages sent without end-to-end encryption, including recent ones, because a thread with no conversation key still carries plain DMs. +- When showing or summarizing messages, focus on the content. Don't add encryption-status commentary unprompted, and don't describe plain messages as odd or a problem: threads with no conversation key normally carry plain DMs, including recent ones. If the user asks about encryption, verification, or security, answer plainly from `status`. Mention `unverified` briefly when it's relevant, e.g. before acting on that message. ## 2.6.1 — Ask about remembering the X Chat key separately diff --git a/third_party/x/skills/x-api-mcp-guide/SKILL.md b/third_party/x/skills/x-api-mcp-guide/SKILL.md index bf169b167..967b33154 100644 --- a/third_party/x/skills/x-api-mcp-guide/SKILL.md +++ b/third_party/x/skills/x-api-mcp-guide/SKILL.md @@ -501,7 +501,7 @@ To find the thread with someone the owner names, resolve the username → id (`g `decrypt` returns one row per event. A message's `text` is never empty: media show as `[photo]`, `[video]` or `[file: name]` before any caption, reactions as `reacted ❤️ to `, edits as `edited : `, calls as `[call started]` or `[call ended, …]`, and Grok replies as their text. An event that cannot be decoded has placeholder text and an `error`. Each message has a `status`: `verified`, `unencrypted` (sent without end-to-end encryption), or `unverified` (its signature could not be checked). An `unverified` message still has its `text` when decryption succeeded. `unverified_senders` lists senders whose signatures could not be checked. -`status` is internal metadata. When showing or summarizing messages, don't mention encryption status, and never call `unencrypted` odd or a problem. Only bring it up if the user asks about encryption or security. For `unverified`, mention it only when it matters, briefly and plainly, e.g. if the user is about to act on the content. +When showing or summarizing messages, focus on the content. Don't add encryption-status commentary unprompted, and don't describe plain (unencrypted) messages as odd or a problem: threads with no conversation key normally carry plain DMs, including recent ones. If the user asks about encryption, verification, or security, answer plainly and accurately using `status`. Mention `unverified` briefly when it's relevant to what the user is doing, e.g. before acting on that message's content. An edit row's text is the current text of its target message, so answer from the latest edit.