diff --git a/README.md b/README.md index 3c00593..9cac917 100644 --- a/README.md +++ b/README.md @@ -84,15 +84,17 @@ not a screenshot. Simultaneous typing races and plugin hot-loading remain unveri ### Want to connect your existing desktop tasks? [Copy the native-task setup prompt](docs/06-guides/codex-native-tasks.md#1-paste-this-into-each-chosen-task) -into each chosen task: fill in the other task's name and the allowed topic. +into each chosen task: paste the other task's **chat link** and the allowed topic. +In Codex, **Copy chat deep link** is **⌘⌥L** on macOS or **Ctrl+Alt+L** on Windows. It uses a pinned public workflow, not a local path or manually copied internal ID. Setup sends no peer messages; wait for both confirmations, then work normally. No terminal setup is needed for that route. -**Experimental:** the successful case used manager-supplied task references and -a local skill path. The [public-entry check](docs/09-reviews/2026-09-07-native-public-entry.md) -records the newer entry's tested boundary; novice onboarding and normal plugin -installation remain open. The skill cannot add absent host tools or enforce +**Tested, still experimental:** the [public-workflow + chat-link run](docs/09-reviews/2026-09-08-native-deep-link-acceptance.md) +resolved the original two tasks without a global task list. A chose to send; +original B updated its own copy and preserved its button and price. The manager +supplied the documented link format through native tools; manual GUI onboarding +and normal plugin installation remain unverified. The skill cannot add absent host tools or enforce privacy and race-free sending. If native Codex already meets your needs, use it directly; no measured advantage over native-only use is claimed. diff --git a/README.zh-CN.md b/README.zh-CN.md index bb9a16c..22e82a9 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -78,13 +78,16 @@ B 早已知道按钮名称不能改。明确配对后,只向 A 提出普通业 ### 想连接已有的桌面任务? 把[原生任务设置提示词](docs/zh-CN/codex-native-tasks.md#1-分别把下面的提示词发给两个任务) -分别发给选中的两个任务,只填对方名称和允许话题。使用固定版本的公开工作流, +分别发给选中的两个任务,只填对方的**聊天链接**和允许话题。 +Codex 的“复制聊天深链”快捷键为 macOS **⌘⌥L**、Windows **Ctrl+Alt+L**。 +使用固定版本的公开工作流, 不用本地路径或手抄内部 ID。设置时不向对方发消息,等双方各自确认后正常工作。 这条路径不需要终端设置。 -**实验入口:** 成功案例由管理任务提供引用和本地 Skill 路径;新版入口的核验范围见 -[公开入口记录](docs/09-reviews/2026-09-07-native-public-entry.md),新用户上手和常规插件安装 -仍有缺口。Skill 不能补出缺失的宿主工具,也不能强制 +**已实测,仍属实验入口:** [公开工作流+聊天链接实测](docs/09-reviews/2026-09-08-native-deep-link-acceptance.md) +不查全局任务列表就定位了原来的两个任务;A 主动发送,原 B 自己改对文案并保留按钮和价格。 +本次由管理任务通过原生工具提供官方格式的链接;人工 GUI 上手和常规插件安装仍未验收。 +Skill 不能补出缺失的宿主工具,也不能强制 保证隐私隔离或无竞争发送。如果原生 Codex 已满足需求,直接使用即可; 目前不声称比原生用法更有效。 diff --git a/ROADMAP.md b/ROADMAP.md index 77da953..744d6d9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -11,7 +11,14 @@ completion, blockers, review findings, and dependency-ready state without the user acting as their message bus**. ThreadMesh is the attention and admission policy layer; A2A, Cotal, ACP, or harness-native APIs may supply transport. -## Active priority — existing desktop clients (2026-09-07) +## Active priority — existing desktop clients (2026-09-08) + +**Completed this slice:** [public workflow + chat-link pairing](docs/09-reviews/2026-09-08-native-deep-link-acceptance.md), +both original tasks enabled, ordinary request triggering A's chosen advice, +original B's correct own edit with prior decisions preserved, and both stopped. +The bilingual no-terminal entry uses the official copied local-chat link, not +a global task list or maintainer-local skill path. This is a controlled +maintainer link-input pass; manually copying links in the GUI is not yet verified. **Native-value checkpoint:** Codex already supplies the tested native messaging and continuation. The skill is optional guidance, not new transport. Read the @@ -46,15 +53,13 @@ is new-session CLI acceptance, not the primary existing-desktop gate. Next native slice: the [skill-only workflow](docs/06-guides/codex-native-tasks.md) uses task tools already exposed by Codex, with an explicitly selected pair. It needs no Node/MCP/hook setup. [One controlled opted-in desktop pair passed](docs/09-reviews/2026-09-07-native-desktop-acceptance.md), -including prior context, B's own edit and busy/stop checks. A new -[public-entry checkpoint](docs/09-reviews/2026-09-07-native-public-entry.md) verifies -anonymous workflow retrieval; title-based activation, novice task selection and -normal plugin activation remain open. The live readiness attempt returned empty -current-turn evidence despite host-reported completion; an official App Server -read recovered the original results and identified invalid inventory limits. -That parameter is corrected, but a valid bounded inventory still omitted the -pair. Resolve selected-task lookup before claiming entry success. Sending is -not race-free. External adapter/hook adoption is +including prior context, B's own edit and busy/stop checks. The subsequent +[failed title-based entry](docs/09-reviews/2026-09-07-native-public-entry.md) and +[empty-preview diagnosis](docs/09-reviews/2026-09-08-native-task-discovery.md) +are retained. The September 8 deep-link run above completes selected-task lookup +and the full controlled public-source handoff without a list operation. +Independent manual onboarding and normal plugin activation remain open. Sending +is not race-free. External adapter/hook adoption is a separate portability route, not a prerequisite for trying native guidance. The [desktop-first plan](docs/10-planning/desktop-entry-2026-09-07.md) supersedes diff --git a/docs/06-guides/codex-native-tasks.md b/docs/06-guides/codex-native-tasks.md index adb5ce6..8ad1769 100644 --- a/docs/06-guides/codex-native-tasks.md +++ b/docs/06-guides/codex-native-tasks.md @@ -2,7 +2,7 @@ [简体中文](../zh-CN/codex-native-tasks.md) -**Experimental workflow with one controlled native pair pass.** This entry uses +**Experimental workflow with controlled native passes.** This entry uses Codex's own task tools when they are already available. The bundled skill adds opt-in scope and collaboration guidance; it does not add a private desktop API, a new model, an MCP server or a polling daemon. @@ -17,21 +17,27 @@ while the test is running. Normal Codex quota is required. ### 1. Paste this into each chosen task -Replace **OTHER TASK TITLE** with the other task's exact sidebar title and -**SHARED TOPIC** with the limited subject they may exchange, such as approved -product names, spelling and free-plan limits. No internal ID, local path, clone -or terminal command is needed in this prompt. +Open the other task and use **Copy chat deep link**: **⌘⌥L** on macOS or +**Ctrl+Alt+L** on Windows. If your shortcuts differ, find the command in +**Settings → Keyboard Shortcuts**. These are +[official app commands](https://learn.chatgpt.com/docs/reference/commands). + +Paste that link in place of **OTHER TASK LINK** below, then fill in **SHARED +TOPIC**—for example, approved product names, spelling and free-plan limits. +Repeat in the other direction. The link has the form `codex://threads/` +and identifies an existing **local** task. You copy the whole link; you do not +need to find or type an internal ID, share a conversation snapshot, clone a +repository or open a terminal. ```text Use the ThreadMesh workflow at this pinned public URL. Read the complete file: -https://raw.githubusercontent.com/fyaic/threadmesh/7ea4d407b719f0241f1eccbe2e5d95c15a72c72c/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md +https://raw.githubusercontent.com/fyaic/threadmesh/93da0c6fc9814c1a28e95eaf34d287e11a4331f7/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md -Pair only this task with "OTHER TASK TITLE". Each keeps its own current job and +Pair only this task with OTHER TASK LINK. Each keeps its own current job and earlier decisions. Allowed shared topic: SHARED TOPIC. -I allow one task-list lookup to resolve that title, understanding that the list -also exposes other task titles/summaries. Do not read unrelated conversations. -Use list_threads with limit: 50 at most; the host rejects 100. -If the title is missing or ambiguous, ask me; do not guess or scan more history. +Use the supplied local chat link to identify the peer and verify only that +task with native read/status tools. Do not list all tasks or read unrelated +conversations. If the link or target cannot be verified, leave collaboration off. I authorize automatic, relevant peer advice after setup. I understand an idle check cannot guarantee that sending never races with new user input. @@ -41,31 +47,23 @@ Confirm the selected peer by title, allowed topic, available native tools and whether this task is enabled. If anything is unavailable, leave collaboration off. ``` -If your app has already attached a native task reference, use that instead of -the title and remove the task-list permission paragraph. Do not hunt for IDs -in local files. A native reference picker is host-dependent; this guide does -not assume a particular desktop `@` menu. - -Want to check first without enabling? Replace the two automatic-advice -authorization sentences with: +Want to check first without enabling? Replace the automatic-advice +authorization paragraph with: “Only check readiness. Keep collaboration off, including any previous stop; do not send messages, edit files or restore pending advice.” Readiness is not activation and does not verify the peer's quota. ### 2. Wait for both setup confirmations, then work normally -Each task must confirm its own setup. Naming the other task does not activate -it. A missing workflow, missing tools or unresolved title is a stopped setup, +Each task must confirm its own setup. Linking the other task does not activate +it. A missing workflow, missing tools or unverified target is a stopped setup, not a successful connection. You can say **Stop ThreadMesh collaboration** in each task to cancel it; no separate control panel is required. -If the app shows “completed” but supplies no readable setup confirmation, keep -collaboration off. Do not assume pairing worked or repeatedly rerun it. This -occurred in our [readiness attempt](../09-reviews/2026-09-07-native-public-entry.md#read-only-diagnosis-and-correction): -a separate official read recovered the results, which reported a rejected list -limit. The corrected limit is not a complete task search: our subsequent bounded -inventory still did not contain the selected pair. Missing titles require an -app-provided reference or a clearer selection, not a guessed destination. +No readable confirmation means no verified setup, even if the app says +“completed.” Keep collaboration off; see the +[retained failed entry checks](../09-reviews/2026-09-07-native-public-entry.md#read-only-diagnosis-and-correction) +instead of treating a delivery or empty result as success. This is an explicit workflow request in the existing conversation, **not proof that installing a plugin hot-loads old tasks**. The model must actually retrieve @@ -86,6 +84,15 @@ result is an attributed native message, followed by that **same** website task updating its own copy while keeping its earlier button decision and price. Read the receiver's actual result; a delivery notification alone is insufficient. +### Optional: use a task name instead + +An already attached native task reference also works. If you prefer an exact +task title, explicitly allow one native task-list lookup, understanding that it +also exposes other task titles/summaries. The current host accepts `limit: 50` +at most. Its pinned and unpinned results are not a complete search. If the title +is missing or ambiguous, use **Copy chat deep link** rather than expanding the +scan or guessing. No particular desktop `@` picker is assumed. + ## Limits that matter - Requires native read/status/send tools to be exposed by this Codex host. @@ -93,7 +100,8 @@ Read the receiver's actual result; a delivery notification alone is insufficient - Native send lacks an atomic idle-only condition. The skill skips busy, unknown or unloaded targets, but cannot guarantee non-interruption. If that guarantee is required, retain a suggestion for review instead of auto-sending. -- A task reference avoids listing every task. Name lookup needs permission +- A local chat link avoids listing every task; it does not grant permission or + establish cross-host support. Name lookup needs permission because the native list also returns other task titles/summaries. Ambiguous titles need clarification, not a guessed destination. - Stop in **both** tasks to stop both directions. Stopping one task doesn't @@ -108,15 +116,28 @@ native send and source attribution, the receiver's own artifact change and business check. Record human setup actions, a busy-target no-send check and a stop/no-further-send check. Do not publish private IDs or transcripts. -The [September 7 controlled run](../09-reviews/2026-09-07-native-desktop-acceptance.md) -passed this source-read workflow with two disposable tasks that had completed -prior context, original B's own correct edit, and busy/stop checks. The manager -supplied task references and a local skill path through native task messages; -it did not validate the title-based prompt above. The public source is pinned -so readers can inspect the same workflow rather than a maintainer-local file. -See the [public-entry check](../09-reviews/2026-09-07-native-public-entry.md) for -the exact tested boundary. A novice's manual GUI onboarding remains unverified. -Native source attribution was read from turn data, not a screenshot. +The [September 8 deep-link run](../09-reviews/2026-09-08-native-deep-link-acceptance.md) +passed public workflow retrieval, scoped setup and the useful handoff using the +same two existing test tasks. Setup took about 137 and 141 seconds respectively, +with no global task listing, peer messages or business edits. After both +confirmations, the manager asked only A to change the approved product to +**Member Studio**, limit the free plan to **three projects**, use US spelling +and retain paid pricing. A checked B's current idle status and chose one native +send. Original B made its own correct copy edit while preserving the signup +button and price. The business request to B's completed result took about +**61 seconds, excluding setup**; this is one observed run, not a timing promise. + +The manager constructed official-format deep links from already known native +IDs and sent setup through native tools. This verifies the **public workflow +and link-input path**, not someone pressing the copy shortcut or a novice's +manual GUI onboarding. The pair was retained from an earlier dedicated test, +not newly recreated or adopted from ordinary long-running user work. Native +source attribution was read from turn data, not a screenshot. + +The [September 7 run](../09-reviews/2026-09-07-native-desktop-acceptance.md) +retains the earlier busy/stop controls and local-source case. The failed +[title-based entry checks](../09-reviews/2026-09-07-native-public-entry.md) +remain available; the deep-link pass does not establish complete title search. Packaging validation and a behavioral tabletop review alone are not live proof. The earlier [hook/MCP adoption attempt](../09-reviews/2026-09-07-desktop-native-adoption.md) diff --git a/docs/09-reviews/2026-09-07-native-public-entry.md b/docs/09-reviews/2026-09-07-native-public-entry.md index 8d0be96..c0f1bf3 100644 --- a/docs/09-reviews/2026-09-07-native-public-entry.md +++ b/docs/09-reviews/2026-09-07-native-public-entry.md @@ -1,5 +1,9 @@ # Native desktop public entry: retrieval and readiness boundary +Historical failed title-based attempt. The current entry uses copied chat links; +its [September 8 complete controlled run passed](2026-09-08-native-deep-link-acceptance.md). +The findings below remain evidence of this earlier attempt, not today's setup instructions. + Date: 2026-09-07. Status: **readiness failure recovered through official App Server read: both inventory calls used an invalid limit; pairing still not accepted**. The earlier empty desktop-read observations are retained below, not erased. diff --git a/docs/09-reviews/2026-09-08-native-deep-link-acceptance.md b/docs/09-reviews/2026-09-08-native-deep-link-acceptance.md new file mode 100644 index 0000000..e45ffc3 --- /dev/null +++ b/docs/09-reviews/2026-09-08-native-deep-link-acceptance.md @@ -0,0 +1,128 @@ +# Public workflow + chat link: original-task handoff passed + +Date: 2026-09-08. **PASS for one maintainer-operated native link-input workflow:** +public source → selected original tasks → both setup confirmations → ordinary +business request → A's chosen send → original B's own correct edit → both stopped. +This completes the controlled public-entry gate, not independent GUI onboarding. + +## What the user gets + +The [English setup](../06-guides/codex-native-tasks.md) and +[中文入口](../zh-CN/codex-native-tasks.md) now ask for the other task's **chat link +and shared topic**, not an internal ID, local skill path or global task inventory. +Codex documents **Copy chat deep link** as ⌘⌥L on macOS and Ctrl+Alt+L on Windows; +the link identifies a local task, not a shared transcript snapshot. +[Official command reference](https://learn.chatgpt.com/docs/reference/commands). + +The former title-only attempt is retained as a failure. Its agent-created tasks +had empty previews and were excluded by Codex's normal list filter; increasing +the limit or sending more manager messages would not fix that sample. +[Same-version diagnosis](2026-09-08-native-task-discovery.md). + +## Actual setup, not hidden preparation + +- Reused the **same two dedicated validation tasks from September 7**, in separate + working directories, with completed prior context. No replacement tasks, + shared ThreadMesh database, plugin installation or second harness was needed. +- The manager constructed official `codex://threads/` links from + already authorized identities and supplied them through native task messages. + Nobody used or recorded the keyboard-copy gesture in this run. The test proves + the documented link-input route, not novice/manual GUI onboarding. +- Both received the complete public workflow URL pinned to + [`93da0c6`](https://github.com/fyaic/threadmesh/blob/93da0c6fc9814c1a28e95eaf34d287e11a4331f7/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md), + their selected peer link, narrow shared topic and new scoped enable permission. + Earlier stopped/cancelled suggestions were not restored. +- A made an actual web-open of that URL and reported full reading; its export + retains a result summary, not the entire web response. B's successful curl + record retains the full workflow text. Neither substituted a local skill. +- Both used exactly one native read of the selected peer and confirmed its title, + allowed topic and enabled local agreement. **No global list, peer send or + business file change occurred during setup.** Existing sample hashes matched. + +Setup turns took **141.256 seconds for A** and **137.330 seconds for B**, run in +parallel. These model/setup costs are not hidden inside the shorter business +handoff time below. The manager read both confirmations before the business turn. + +## One ordinary change; no instruction to send + +The next input went only to A. Its first sentence acknowledged completed setup; +the rest was the business request, with no recipient or message instruction: + +> 双方设置已确认完成。将产品名改为 Member Studio,免费套餐限制为三个项目, +> 使用美式拼写,付费价格保持不变。更新获批的产品事实。 + +A chose to update its own `brand.json`, check the selected website task's status, +and send advice. The retained native status response explicitly returned B idle. +There was **one completed A → B send**, no model/thinking override and no B → A +reply loop. Its message carried the new name, US spelling and **free-plan** +three-project limit, preserved price/button constraints, and identified itself +as advice rather than a new user instruction or permission grant. + +Original B's new native turn identified **A** as the message source, not the +manager. B read its own files, made this completed file change and read them back: + +```diff +- "headline": "Organize work with Member Portal", +- "description": "Up to five projects for your team on the free tier.", ++ "headline": "Organize work with Member Studio", ++ "description": "Up to three projects for your team on the free tier.", + "signupButton": "Create my workspace" +``` + +`price.txt` remained exactly `Paid plan: $12/month` plus its final newline. +Independent file assertions checked every field, not just message delivery. +The manager did not forward the changed business facts to B, manually continue +B or write B's result. B's own native completed patch establishes edit ownership. + +| Stage | UTC interval | Observation | +|---|---|---| +| Both setup turns | 02:32:43–02:35:05 | Public retrieval, selected reads, separate confirmations | +| A ordinary business turn | 02:35:53–02:36:33 | Own facts updated; fresh idle check; one send | +| Original B receiving turn | 02:36:25–02:36:54 | Own website copy correctly changed | +| Both stop turns | 02:37:34–02:37:38 | Confirmed stopped; no tools, edits or outgoing messages | + +Ordinary request to original B's completed result: **about 61 seconds, excluding +setup**. Setup start to final stop: about 4 minutes 55 seconds including manager +inspection gaps. These are observations, not speed/reliability promises. + +## Stop and evidence retention + +Both stop turns contain only the manager's stop input and the task's confirmation: +collaboration off, no pending suggestions. Both native statuses are idle. No +stop broadcast or artifact cleanup occurred. The September 7 busy/no-send and +post-stop ordinary-change checks remain separate historical controls; they were +not rerun or relabeled as new checks here. No atomic race-free claim is made. + +Private originals are retained outside the repository in an owner-only directory. +The final capture contains all **three selected turns per task for this run**, +not their complete lifetime histories. It is a reduced official `thread/read` +App Server projection with original item payloads, not a fabricated native UI +export. Fresh stdio processes made read-only calls and exited; they did not +resume tasks or supply the send/continuation transport. The desktop read/wait +surface still omitted assistant content, so its completion status alone was not +used as proof. No private database/socket access was used. + +| Retained object | SHA-256 | +|---|---| +| Setup turn capture | `2c1259718ead89ca2eddf2d61c3a0601df173238aaf69e00f544ffac30ea9454` | +| Setup + completed business capture | `2cc14c0a9f578201e7194db9fdfe0f491f2ceaef27985b0464882f828d65c271` | +| Final setup/business/stop capture | `43594c3cc38b557020d9a4ae5e59a4cf013c5c4db3b5d37263e256f87d3f832d` | +| Final A facts | `9e3a5e833ca1ecc30ede96e01533dcf0b86150b8875a948302a802983221c009` | +| Final B copy | `5b628839e9aee540ca0ed82702a19f19e48da55da89cf9067264d122c1fd7389` | +| Unchanged price | `5f9ef93d379ed019937fefa3bada8830ad124e63342acc0aca6da0c0b6ffa38e` | + +Hashes commit to retained files; they are not cryptographic host attestations. +No private task IDs, absolute paths, account data or full transcripts are public. +An independent subagent reviewed the original run records and business files. + +## What this does not prove + +This is not a human-operated keyboard/UI recording, an independent external-user +pass, organic long-lived project usage, normal plugin hot-loading, cross-host +support, cross-harness support or quota recovery. No screenshot/video was captured. +Codex supplied native transport, source attribution and continuation. ThreadMesh +supplied reusable opt-in guidance; improvement over native-only Codex remains +unmeasured. Native send still cannot atomically guarantee non-interruption. + +The source workflow and bilingual guide are public; the existing immutable +alpha.3 CLI release asset was not silently replaced by this source-only change. diff --git a/docs/09-reviews/2026-09-08-native-task-discovery.md b/docs/09-reviews/2026-09-08-native-task-discovery.md new file mode 100644 index 0000000..a02c7c8 --- /dev/null +++ b/docs/09-reviews/2026-09-08-native-task-discovery.md @@ -0,0 +1,88 @@ +# Native task discovery: empty-preview exclusion + +Date: 2026-09-08. Result: **the selected agent-created validation tasks are +excluded by the installed runtime's normal list filter; they are not missing +because their titles are wrong**. This is a read-only diagnosis, not successful +public-entry pairing or activation. + +## Scoped observations + +The official App Server stdio interface, using installed Codex 0.153.1, read only +the two previously authorized validation tasks. No private database, rollout +file or host socket was accessed directly. No task was created, resumed, started, +renamed, moved, enabled or messaged; no model ran. Each diagnostic process exited +after its reads. Only reduced metadata and item counts were printed. + +| Returned field | Task A | Task B | +|---|---|---| +| Name | Matches the authorized sidebar title | Matches the authorized sidebar title | +| Source / model provider | `vscode` / `openai` | `vscode` / `openai` | +| Ephemeral | `false` | `false` | +| History mode | `paginated` | `paginated` | +| Thread source | `agent_created_thread` | `agent_created_thread` | +| Preview | Empty string | Empty string | +| Section / parent task | `null` / `null` | `null` / `null` | +| Stored turns returned | 7 | 6 | +| `userMessage` items | 0 | 0 | +| `functionCallOutput` items | 7 | 6 | + +The two titles, IDs, working-directory paths and conversation content are omitted +from this public record. The task metadata was readable by the already authorized +IDs. This does not establish a user-friendly discovery route by itself. + +## Minimal reproduction + +After the documented `initialize` / `initialized` handshake: + +1. Call `thread/read` with an already authorized task ID and + `includeTurns: false`; inspect its name, preview, source and working directory. +2. Call `thread/list` with `limit: 10`, the exact returned `cwd`, + `sourceKinds: ["vscode"]`, `useStateDbOnly: true`, and `archived: false`. +3. Repeat the same scoped query with `archived: true`. + +For each selected task, both list queries returned `data: []` and +`nextCursor: null`. No `searchTerm` was used, so title matching cannot explain +these empty results. The working-directory filter prevents a broad unrelated +task inventory. An additional `thread/read` with `includeTurns: true` produced +the item-type counts above without printing message content. + +The [official App Server documentation](https://learn.chatgpt.com/docs/app-server) +describes `thread/read` as non-resuming and documents `cwd` filtering and +`useStateDbOnly`. The latter avoids the default scan-and-repair behavior; this +diagnosis did not invoke a metadata-repair path. + +## Why the existing sample cannot validate ordinary title discovery + +The public source for the **same version**, not merely current `main`, explains +the exclusion: + +- The normal list query adds `threads.preview <> ''` unless a relationship filter + or an explicit nonempty section applies. See + [list-query construction](https://github.com/openai/codex/blob/rust-v0.153.1/codex-rs/state/src/runtime/threads.rs#L1229) + and the [empty-preview filter](https://github.com/openai/codex/blob/rust-v0.153.1/codex-rs/state/src/runtime/threads.rs#L1388). +- Preview metadata is populated from user-message events/items; inter-agent + communication records are not treated as those user-message events. See + [event handling](https://github.com/openai/codex/blob/rust-v0.153.1/codex-rs/thread-store/src/thread_metadata_sync.rs#L266) + and [preview assignment](https://github.com/openai/codex/blob/rust-v0.153.1/codex-rs/thread-store/src/thread_metadata_sync.rs#L316). + +The selected tasks have empty previews and neither a section nor a parent. +Their stored input items are manager-delivered function outputs, not direct +`userMessage` items. These observations and the version-matched filter explain +why another valid list limit or another manager message is not a fix. +The earlier successful business exchange remains valid, but this manager-created +sample must not be presented as an independent test of a person typing directly +into two established desktop conversations. + +## Product decision + +Stop repeating manager messages to try to repair the preview. Do not edit private +host storage, fabricate a user message, or silently move tasks into a section to +make the test pass. Existing collaboration remains stopped. + +Prefer the official task deep-link route for an explicitly selected peer: it +avoids dependence on a bounded title inventory and lets users provide a task +reference rather than hunt for an internal ID. The receiving workflow must +validate the selected task through supported tools and preserve consent and stop +rules. This diagnosis alone does **not** validate copying a link in the desktop +UI, consuming it in the workflow, activating a pair, or a new business handoff; +those results need their own acceptance evidence. diff --git a/docs/09-reviews/README.md b/docs/09-reviews/README.md index 563879a..1c4b90e 100644 --- a/docs/09-reviews/README.md +++ b/docs/09-reviews/README.md @@ -30,6 +30,8 @@ not count as live-product or independent external-verifier evidence. ## Live attempt audits +- [Public workflow + chat link: original receiver-owned handoff and final stop passed](2026-09-08-native-deep-link-acceptance.md) +- [Why the agent-created native pair was omitted from task lists](2026-09-08-native-task-discovery.md) - [Native desktop public entry: recovered readiness results and invalid-limit repair](2026-09-07-native-public-entry.md) - [Codex-first installed-package acceptance and retained failures](2026-09-07-codex-first-use-release.md) - [Codex native desktop: prior context, original receiver edit and busy/stop checks](2026-09-07-native-desktop-acceptance.md) diff --git a/docs/10-planning/desktop-entry-2026-09-07.md b/docs/10-planning/desktop-entry-2026-09-07.md index b59ecc7..973cd0a 100644 --- a/docs/10-planning/desktop-entry-2026-09-07.md +++ b/docs/10-planning/desktop-entry-2026-09-07.md @@ -22,9 +22,12 @@ The [controlled native run](../09-reviews/2026-09-07-native-desktop-acceptance.m now passes: two authorized disposable desktop tasks completed prior work, then adopted the skill. A chose advice; original B edited correctly; busy/stop checks passed. Setup used manager-supplied native references and a local skill path. -Next validate simple task selection and source retrieval with an independent -desktop user. Plugin hot-loading and the external adapter sequence below remain -separate open work, not prerequisites for this native workflow. +The current delivery gate is public workflow retrieval, supported task selection, +explicit activation, an ordinary request, original receiver-owned useful work +and a final stop in the same run. Independent desktop-user onboarding follows; +it is not a reason to stop before completing this maintainer-run gate. Plugin +hot-loading and the external adapter sequence below remain separate open work, +not prerequisites for this native workflow. The primary job is **different conversations in the same agent product helping each other without user relaying**. Cross-product collaboration is an extension, @@ -34,13 +37,15 @@ ordinary GUI users. The next desktop acceptance requires **two existing conversations in one client**, not one Codex conversation plus one ZCode conversation. The installed clients -remain feasibility candidates, not shipped integrations. First establish a -supported activation/refresh path in one client, then validate its pair. The -previous one-conversation-per-client probes do not satisfy that acceptance. -Prove native session binding and delivery before building a companion dashboard. - -Install through normal client extension UI. Explicitly opt in chosen existing -conversations with human-readable goals. No programming runtime installation, +remain feasibility candidates, not shipped integrations. For the selected native +skill route, activation means each existing task reads the public workflow and +confirms its own scoped agreement; it does not require plugin refresh or MCP +binding. The previous one-conversation-per-client probes do not satisfy pair +acceptance. Do not build a companion dashboard before this useful pair works. + +Normal client extension installation remains a separate distribution goal, not +a prerequisite for the direct public-workflow route. Explicitly opt in chosen +existing conversations with human-readable goals. No programming runtime installation, JSON editing, session-ID lookup, shared-directory management or relaunch under a ThreadMesh CLI should be required of the user. @@ -49,14 +54,16 @@ decisions and sees the source. Unrelated sessions stay quiet, user work takes priority, and mute/revoke prevents new delivery. Advertise idle wake only after a native host API passes it; otherwise show **pending until next checkpoint**. -Today, processes must address the same local ThreadMesh database, not necessarily -the same code directory. The intended product hides storage without removing +For the separate workspace route, processes must address the same local +ThreadMesh database, not necessarily the same code directory. The native skill +route instead uses host task references and has no shared-directory requirement. +The intended product hides storage without removing explicit sharing boundaries. It does not broadcast all chats or provide a cross-machine service today. ## Evidence checked -Latest: the [authorized native attempt](../09-reviews/2026-09-07-desktop-native-adoption.md) +Historical external-plugin attempt: the [authorized native attempt](../09-reviews/2026-09-07-desktop-native-adoption.md) installed the probe in both clients and tested two pre-installation conversations. Both retained the prior decision but reported the diagnostic unavailable. ZCode was now 3.11.2. Codex hook trust remained incomplete; the follow-up used a @@ -99,6 +106,27 @@ tokens, private IPC or desktop database writes as a ThreadMesh adapter. ## Ordered implementation and acceptance +### Current native skill delivery gate + +1. Retrieve the pinned public workflow and resolve only the selected existing + peer through a supported app-provided reference, such as a copied chat deep + link. Do not require a local source path or manually extracted internal ID. +2. Obtain readable setup confirmations from both original tasks under the + user's authorization. Setup itself sends no peer advice or business edits. +3. Give A an ordinary business request without a send instruction. Verify A's + model-selected advice and original B's own correct edit with earlier decisions + intact; no manager relay, replacement receiver or manager-written result. +4. Stop the test collaboration and retain the actual steps, result and limits. + Update both language guides from that result. An independent novice GUI run + and recording are later external acceptance, not substitutes for or blockers + to finishing this controlled public-entry run. + +### Historical external-plugin / portable-adapter sequence + +The probe findings and numbered sequence below belong to the separate external +plugin/MCP route. They are retained for future portable integration work, not +the critical path or prerequisites for the native skill gate above. + Delegated follow-up: the [Codex lane](../09-reviews/2026-09-07-codex-desktop-lane.md) and [ZCode lane](../09-reviews/2026-09-07-zcode-desktop-lane.md) found native MCP metadata outside model arguments. The probe now compares that metadata with @@ -147,7 +175,7 @@ Quota recovery follows with explicitly saved decisions and unfinished work, using the other agent's own authorized account. Do not promise lossless history or recovery of unsaved context after the source can no longer run. -## This increment and stop line +## Deferred external probe and current stop line A dependency-free [developer probe](../../experiments/desktop/threadmesh-desktop-probe/README.md) has two manifests and five fixture tests. It emits only event type and a session @@ -160,7 +188,8 @@ probe; exact Codex hook trust remains pending. Do not disrupt active user tasks. the passing fixtures from native acceptance; the attempt above records the subsequent negative adoption result. -This order supersedes [first use](first-use-2026-09-05.md) and +The current native skill gate above supersedes the external-plugin sequence and +the earlier [first use](first-use-2026-09-05.md) and [cross-harness acceptance](cross-harness-acceptance-2026-09-05.md). Existing copy-quality failure, DeepSeek live, quota recovery and native input-race gaps remain open, not new prerequisites for trying desktop entry. Track under diff --git a/docs/10-planning/project-status.md b/docs/10-planning/project-status.md index 6c79e31..1ed0705 100644 --- a/docs/10-planning/project-status.md +++ b/docs/10-planning/project-status.md @@ -1,20 +1,32 @@ # Project status -## Current product update — 2026-09-07 - -**Current onboarding increment:** both languages now provide a copyable -title-and-topic prompt with a pinned public workflow. Anonymous retrieval and -source parity passed; readiness checking is separate from activation. The -[entry record](../09-reviews/2026-09-07-native-public-entry.md) keeps title-only -desktop matching and end-to-end activation open. Two user-authorized read-only -checks were dispatched: both host-reported completed, but current-turn histories -were empty while preceding turns were readable. Sample hashes were unchanged; -readiness and absence of peer sends could not initially be verified. A subsequent -official App Server read recovered five items per original turn: both models -reported not ready because `list_threads(limit: 100)` exceeds the host's maximum -of 50. The skill now caps it at 50 and the evidence auditor rejects empty turns. -A valid manager inventory still omitted the selected pair, so name resolution -remains open. No enable command or repeat model dispatch was issued. +## Current product update — 2026-09-08 + +**The controlled public-entry gate is complete.** The +[public-workflow + chat-link run](../09-reviews/2026-09-08-native-deep-link-acceptance.md) +reused the original two Codex validation tasks: both resolved the selected peer, +confirmed setup without sends/edits, then A chose to send after an ordinary +business request and original B made its own correct edit. Earlier button and +price decisions survived. Both were stopped and evidence retained. Independent +subagent review passed; business handoff took about 61 seconds, setup separately +about 137/141 seconds in parallel. No replacement CLI pair was used. + +The bilingual entry now uses **Copy chat deep link + shared topic**. No global +task inventory, local skill path, new runtime or shared database is required. +The former title-only blocker was diagnosed as +[empty-preview filtering in the host](../09-reviews/2026-09-08-native-task-discovery.md), +not solved by repeated manager messages or a wider scan. The failed +[readiness attempt](../09-reviews/2026-09-07-native-public-entry.md) remains recorded. + +**Still open, not claimed complete:** independent manual GUI onboarding, measured +benefit over native-only Codex, plugin hot-loading, cross-host portability and +quota recovery. The current run used manager-supplied official-format links, not +recorded keyboard-copy gestures. This is source-workflow delivery; the immutable +alpha.3 CLI release was not repacked. Subsequent work should test actual user +setup and useful outcomes, not reopen this completed maintainer gate or add +adapters as substitutes. + +## Prior deliveries and evidence — through 2026-09-07 **Value and evidence correction:** the native demo uses Codex's own communication and continuation; the skill adds guidance, not transport. [English responsibility diff --git a/docs/evidence/README.md b/docs/evidence/README.md index e68406a..f0bd962 100644 --- a/docs/evidence/README.md +++ b/docs/evidence/README.md @@ -5,6 +5,7 @@ adoption or proof of incremental value over the host's native capability. | Recent case | Public record | Retained private originals | |---|---|---| +| Codex public workflow + chat-link pair, passed | [Actual setup, 61-second business handoff, B's own diff and final stop](../09-reviews/2026-09-08-native-deep-link-acceptance.md) | Original selected setup/business/stop App Server turn items and verified artifacts | | Codex desktop prior-context pair | [Actual exchange, B's diff and reduced audit](codex-native-2026-09-07/README.md) | Complete A/B native exports, original tasks and files | | Codex public-entry readiness attempt, not accepted | [Recovered results, rejected inventory limits and unchanged artifacts](../09-reviews/2026-09-07-native-public-entry.md) | Empty desktop reads and recovered official App Server turn records retained separately | | Codex default installed-package pass, 272.604 s | [Acceptance](../09-reviews/2026-09-07-codex-first-use-release.md) | Events, report, transcripts and sample artifacts copied to a dated non-temporary archive | diff --git a/docs/zh-CN/codex-native-tasks.md b/docs/zh-CN/codex-native-tasks.md index 1c78d30..6ea4426 100644 --- a/docs/zh-CN/codex-native-tasks.md +++ b/docs/zh-CN/codex-native-tasks.md @@ -2,7 +2,7 @@ [English](../06-guides/codex-native-tasks.md) -**实验入口,一组受控原生双任务已通过。** 这条路径利用 Codex 已经提供的原生任务 +**实验入口,已通过受控原生验证。** 这条路径利用 Codex 已经提供的原生任务 工具。Skill 提供选择范围和协作规则,不新增模型、MCP、后台轮询或私有桌面接口。 ## 免终端工作流 @@ -13,19 +13,24 @@ ### 1. 分别把下面的提示词发给两个任务 -把**对方任务名称**换成侧栏中对方的完整标题,**允许交流的话题**换成限定的内容, -例如已批准的产品名称、拼写与免费方案额度。提示词不需要内部 ID、本地路径、 -clone 仓库或终端命令。 +先打开对方任务,使用 **Copy chat deep link(复制聊天深链)**:macOS 按 +**⌘⌥L**,Windows 按 **Ctrl+Alt+L**。如果快捷键不同,可在 +**Settings → Keyboard Shortcuts(设置 → 键盘快捷键)**中查找这个命令。 +这是[官方支持的应用命令](https://learn.chatgpt.com/docs/reference/commands)。 + +把复制的完整链接粘贴到下方的**对方任务链接**,再填写**允许交流的话题**, +例如已批准的产品名称、拼写与免费方案额度。另一方向也操作一次。 +链接格式为 `codex://threads/`,定位已有的**本地任务**。 +只需复制完整链接,不用查找或手抄内部 ID,不用分享聊天快照、clone 仓库或打开终端。 ```text 使用这个固定版本公开链接中的 ThreadMesh 工作流,请完整读取文件: -https://raw.githubusercontent.com/fyaic/threadmesh/7ea4d407b719f0241f1eccbe2e5d95c15a72c72c/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md +https://raw.githubusercontent.com/fyaic/threadmesh/93da0c6fc9814c1a28e95eaf34d287e11a4331f7/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md -只把当前任务与“对方任务名称”配对。双方保留自己正在做的工作和此前约定。 +只把当前任务与“对方任务链接”配对。双方保留自己正在做的工作和此前约定。 允许交流的话题:允许交流的话题。 -我允许读取一次任务列表来匹配这个名称,理解列表也会显示其他任务的标题和摘要。 -list_threads 的 limit 不超过 50,宿主会拒绝 100。 -不要读取无关对话正文。找不到或遇到重名就问我,不猜测、不继续扫描历史。 +从提供的本地聊天链接确定对方,只用原生读取/状态工具核对这个任务。 +不要列出所有任务或读取无关对话。链接或目标无法核实时,保持协作关闭。 我授权设置完成后自动发送相关的同伴建议,理解空闲检查不能保证绝不与新输入竞争。 本次设置回合不许给对方发消息,也不修改业务文件。 @@ -34,25 +39,19 @@ list_threads 的 limit 不超过 50,宿主会拒绝 100。 任何一项不可用,都保持协作关闭。 ``` -如果当前应用已经附上对方的原生任务引用,可以用它替代名称,并删去读取任务列表 -的授权段落。不要去本地文件找 ID。引用选择器由宿主提供,本指南不假定桌面端 -存在某种固定的 `@` 菜单。 - 想先检查、不启用?把授权自动发送的那一句换成:“只检查是否就绪。保持协作关闭, 保留此前的停止状态;不发消息、不改文件、不恢复待发建议。” 检查就绪不等于启用,也不能证明对方还有可用额度。 ### 2. 等两个任务各自确认设置后,正常工作 -每个任务都必须自己确认。写出对方名称不等于对方已经启用。 -流程读不到、工具缺失、名称无法确定,都属于设置未完成,不能当作连接成功。 +每个任务都必须自己确认。提供对方链接不等于对方已经启用。 +流程读不到、工具缺失、目标无法核实,都属于设置未完成,不能当作连接成功。 要取消,可以分别在两个任务里说“停止 ThreadMesh 协作”,不需要额外控制面板。 -如果应用显示“已完成”,却没有可读的设置确认,请保持协作关闭,不要当作配对成功, -也不要反复重跑。我们在[只读诊断](../09-reviews/2026-09-07-native-public-entry.md#read-only-diagnosis-and-correction) -中通过另一条官方读取接口取回了结果,实际错误是列表参数超限。修正参数仍不等于 -完整搜索:后续有限列表里依然没有选中的两个任务。找不到名称时,需要应用提供的 -任务引用或进一步确认选择,不能猜测目标。 +没有可读的设置确认,就没有核实设置成功,即使应用显示“已完成”也一样。 +请保持协作关闭;可查看[保留的入口失败记录](../09-reviews/2026-09-07-native-public-entry.md#read-only-diagnosis-and-correction), +不要把送达或空结果当作成功。 这是在已有对话中明确请求使用流程,**不是证明安装插件能热加载旧任务**。 模型应实际读取流程,核对已有原生工具,并确认选择范围。若读取失败或缺少工具, @@ -68,13 +67,22 @@ list_threads 的 limit 不超过 50,宿主会拒绝 100。 需要知道变化。有用的结果是:出现带来源的原生消息,**同一个**网页任务接着自己 改对文案,同时保留此前的按钮约定和价格。请看实际结果,不只看“消息送达”。 +### 可选:按任务名称查找 + +已经附上的原生任务引用也可以使用。若想直接填写完整任务标题,请明确允许读取 +一次原生任务列表,并理解其中也会显示其他任务的标题和摘要。当前宿主的 +`limit` 最大为 50;置顶和未置顶结果都不是完整搜索。缺失或重名时,请改用 +**Copy chat deep link(复制聊天深链)**,不要扩大扫描或猜测目标。 +本指南不假定桌面端存在某种固定的 `@` 选择器。 + ## 必须知道的限制 - 当前 Codex 宿主必须实际提供任务读取、状态和发送工具;Skill 无法凭空增加能力, 也不意味着其他 Agent 已经获得控制 Codex 的接口。 - 原生发送没有原子的“仅空闲时发送”条件。规则会跳过忙碌、状态不明或未加载任务, 但不能保证绝不打断;如果需要这个保证,只保留建议供审阅,不自动发送。 -- 原生任务引用可以免去全量查找。按名称查找需先同意读取任务列表,因为其中还会 +- 本地聊天链接可以免去全量查找,但不代表授权或跨主机支持。 + 按名称查找需先同意读取任务列表,因为其中还会 返回其他任务的标题和摘要;重名必须确认,不能猜。 - 要停止双向协作,请在**两个任务**中都说停止。单方停止不能撤回已提交消息, 也不能原子撤销另一任务的独立授权。 @@ -86,12 +94,23 @@ list_threads 的 limit 不超过 50,宿主会拒绝 100。 和业务验证结果。还需记录人工设置步骤、接收方忙碌时不发送、停止后不再发送。 不要公开原始任务 ID 或聊天记录。 -[9 月 7 日受控实测](../09-reviews/2026-09-07-native-desktop-acceptance.md)使用两个先完成 -原任务、再启用协作的专用桌面任务,验证了原 B 自己改对文件,以及忙碌/停止行为。 -管理任务通过原生消息提供了任务引用和本地 Skill 路径,并未验证上面的按名称入口。 -现在将公开流程固定到一个版本,不再依赖维护者的本地文件;具体核验边界见 -[公开入口检查记录](../09-reviews/2026-09-07-native-public-entry.md)。 -新用户的手动 GUI 上手仍未验收。来源归属在原生任务数据中核对,未录制界面。 +[9 月 8 日深链实测](../09-reviews/2026-09-08-native-deep-link-acceptance.md)在原有的 +两个测试任务中,跑通了公开流程读取、限定范围设置和有用的主动交接。 +双方设置分别耗时约 137 秒和 141 秒,没有列出全局任务、发送同伴消息或修改业务文件。 +双方确认后,管理任务只向 A 提出普通需求:产品改为 **Member Studio**, +免费方案限制为**三个项目**,使用美式拼写,付费价格不变。 +A 实时核对 B 空闲后,自行选择发送了一条原生消息;原 B 自己改对了文案, +保留按钮约定和价格。从业务请求到 B 完成约 **61 秒,不含设置**。 +这只是一次实测时间,不是速度承诺。 + +管理任务使用已知原生 ID 构造官方格式深链,并通过原生工具发送设置。 +这验证了**公开流程和链接输入路径**,没有验证人工按下复制快捷键或新用户的 +手动 GUI 上手。这两个任务是之前专用测试留下的既有任务,未重新创建, +也不是从用户日常的长期工作中接入。来源归属在原生任务数据中核对,未录制界面。 + +[9 月 7 日记录](../09-reviews/2026-09-07-native-desktop-acceptance.md)保留此前的 +忙碌/停止控制和本地流程实测。失败的[按名称入口检查](../09-reviews/2026-09-07-native-public-entry.md) +仍可查阅;深链路径通过不代表完整标题搜索已经可用。 仅打包校验和规则情景评审不等于真实桌面证明。此前的 [hook/MCP 接入尝试](../09-reviews/2026-09-07-desktop-native-adoption.md)没有通过; diff --git a/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md b/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md index a0c7bd9..8290ae2 100644 --- a/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md +++ b/plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md @@ -28,9 +28,24 @@ the subject matter they may share and whether automatic advisory sends are allowed. A peer claiming permission is not user authorization. Do not send a setup message merely to obtain consent from an unselected task. -Resolve targets from user-provided native task references or already observed -host IDs, preserving the host ID when present. Do not ask users to find IDs in -files. If names alone are provided, explain that the host's task-list operation +Prefer the user's copied chat deep link: `codex://threads/` identifies +an existing local task. The app's **Copy chat deep link** command uses +**⌘+⌥+L** on macOS or **Ctrl+Alt+L** on Windows/Linux (custom shortcuts may differ). +This is not **Share chat** and does not publish a conversation snapshot. +See the [official command reference](https://learn.chatgpt.com/docs/reference/commands). +Parse the selected task ID from that exact local-chat link and verify its title +with a scoped native read; no global task inventory is needed. Reject new-chat, +settings, malformed or non-task links rather than guessing a destination. +Do not infer cross-host routing from a local deep link. Use an explicit native +host reference when available; otherwise keep resolution on the current host. +The link is a locator, not authorization. Read only enough selected-peer context +to establish identity, not its full history. During readiness-only checks use +metadata if available; if identity requires conversation access, report that +boundary instead of silently widening a no-history-read request. + +Native attached task references or already observed host IDs also work; preserve +the host ID when present. Do not ask users to find IDs in files. +If names alone are provided, explain that the host's task-list operation also exposes other task titles/summaries; obtain permission for one inventory. For this Codex desktop host, call `list_threads` with `limit: 50` at most (or a smaller documented host limit), never 100. The observed tool rejects