From 1890b81f9b28c2da297e0d5a0936ceaa178bc063 Mon Sep 17 00:00:00 2001 From: veil-chow-fyaic <247294299+veil-chow-fyaic@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:29:19 +0800 Subject: [PATCH] feat: retain auditable case evidence and clarify native Codex value --- README.md | 15 ++- README.zh-CN.md | 12 +- ROADMAP.md | 18 +++ .../native-capabilities-and-value.md | 72 ++++++++++++ docs/00-overview/product-guide.md | 15 ++- docs/06-guides/real-world-cases.md | 9 +- .../2026-09-07-native-desktop-acceptance.md | 5 + .../community-followup-2026-09-07.md | 7 ++ docs/10-planning/project-status.md | 9 ++ docs/README.md | 2 + docs/evidence/README.md | 28 +++++ .../codex-native-2026-09-07/README.md | 109 ++++++++++++++++++ .../codex-native-2026-09-07/audit.json | 23 ++++ docs/zh-CN/README.md | 2 + docs/zh-CN/native-capabilities-and-value.md | 46 ++++++++ docs/zh-CN/native-evidence.md | 29 +++++ docs/zh-CN/product-guide.md | 10 +- scripts/audit-native-evidence.mjs | 72 ++++++++++++ test/native-evidence-audit.test.mjs | 53 +++++++++ 19 files changed, 522 insertions(+), 14 deletions(-) create mode 100644 docs/00-overview/native-capabilities-and-value.md create mode 100644 docs/evidence/README.md create mode 100644 docs/evidence/codex-native-2026-09-07/README.md create mode 100644 docs/evidence/codex-native-2026-09-07/audit.json create mode 100644 docs/zh-CN/native-capabilities-and-value.md create mode 100644 docs/zh-CN/native-evidence.md create mode 100644 scripts/audit-native-evidence.mjs create mode 100644 test/native-evidence-audit.test.mjs diff --git a/README.md b/README.md index dfa0abb..21dcb80 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,15 @@ You shouldn't have to notice, switch chats, and explain the change again. You don't need two different products: two sessions of the same agent can collaborate. **You choose which sessions join. The models choose when a message is useful.** -ThreadMesh supplies discovery, advisory messages, a persistent inbox and portable -checkpoints—not a new model, shared chat history or a fixed sequence of handoffs. +The workspace supplies discovery, advisory messages, a persistent inbox and portable +checkpoints—not a new model or shared chat history. The optional Codex desktop +skill instead uses **Codex's native task tools**; it does not add that transport. + +**Doesn't Codex already do this? Yes, on the tested host.** If its native task +tools meet your needs, use them directly. The skill adds reusable collaboration +guidance; the workspace adds coordination for supported integrations. We have +not proved the skill outperforms native Codex alone. +[What is native, what we add, and when not to install →](docs/00-overview/native-capabilities-and-value.md)

Concept: Agent A sends advice from another task to Agent B while unrelated work stays quiet @@ -34,6 +41,10 @@ checkpoints—not a new model, shared chat history or a fixed sequence of handof ## A real handoff without the copy-paste +[Read the actual desktop exchange and B's own diff →](docs/evidence/codex-native-2026-09-07/README.md) +Retained native records, with busy/stop checks; not a screenshot or reenactment. +The separate installed-package example below is also retained. + **Two Codex sessions. One remembers your earlier decision; the other changes the product facts. You don't relay the change.** diff --git a/README.zh-CN.md b/README.zh-CN.md index c1e1253..a716f1a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -24,8 +24,13 @@ 不必换两种产品:同一个 Agent 的两个 session 就能协作。 **你决定哪些 session 加入,模型判断什么时候值得联系。** -ThreadMesh 提供目标发现、建议消息、持久收件箱和可携带的 checkpoint。 -它不是新模型、共享聊天记录,也不是把每次交接都写死的工作流。 +Workspace 提供目标发现、建议消息、持久收件箱和可携带的 checkpoint, +不是新模型或共享聊天记录。可选的桌面 Skill 则使用 **Codex 已有的原生任务工具**, +并没有新增这套通信能力。 + +**Codex 自己不是就能做吗?在实测宿主上,是的。** 原生功能够用,就直接用原生。 +Skill 提供可复用协作规则,workspace 为已支持的集成提供协调能力;目前没有证明 +Skill 比原生 Codex 更有效。[哪些是原生、我们增加什么、何时不需要安装 →](docs/zh-CN/native-capabilities-and-value.md)

概念示意:Agent A 向 Agent B 发送来自另一任务的建议,无关工作保持安静 @@ -34,6 +39,9 @@ ThreadMesh 提供目标发现、建议消息、持久收件箱和可携带的 ch ## 一次不用你转述的真实协作 +[查看实际桌面消息与 B 自己的修改 →](docs/zh-CN/native-evidence.md) +保留的原生记录,含忙碌/停止检查;不是截图或重演。下面另保留安装包案例。 + **两个 Codex session:一个记着你之前的约定,另一个修改产品事实。你不用转述变化。** 在安装包真实运行中,网站 session 先自主说明了依赖,品牌 session 随后自行决定发送相关变化。 diff --git a/ROADMAP.md b/ROADMAP.md index d1408be..bfd6cd0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -13,6 +13,24 @@ policy layer; A2A, Cotal, ACP, or harness-native APIs may supply transport. ## Active priority — existing desktop clients (2026-09-07) +**Native-value checkpoint:** Codex already supplies the tested native messaging +and continuation. The skill is optional guidance, not new transport. Read the +[responsibility map and when not to install](docs/00-overview/native-capabilities-and-value.md). +The [retained desktop evidence](docs/evidence/codex-native-2026-09-07/README.md) +shows feasibility, not improvement over native Codex alone. + +The next product slice must reduce a real user's setup/relay burden: simple +explicit pair selection, retained decisions, and clear pending/applied outcomes. +Then compare a small matched native-only workflow with the added guidance; +record setup actions, manual relays, correct receiver edits and unwanted contact. +Do not build a benchmark platform or add harnesses for this comparison. If no +gain is observed, retain a lightweight optional recipe rather than a new platform. + +For community growth, first make one independent Codex user's own pair succeed; +fix their first blocker, then prepare a consented real recording and a concise +case study. Existing issue replies remain deferred as requested. No fabricated +video, unsolicited promotion or guaranteed star count. + Primary audience: **Codex users**, especially separate existing conversations inside Codex desktop. Pi is a supported option, not a prerequisite or replacement. A Codex-only first-use entry must reuse the user's own Codex login/model, never diff --git a/docs/00-overview/native-capabilities-and-value.md b/docs/00-overview/native-capabilities-and-value.md new file mode 100644 index 0000000..7e56e03 --- /dev/null +++ b/docs/00-overview/native-capabilities-and-value.md @@ -0,0 +1,72 @@ +# If Codex already does this, why ThreadMesh? + +**You may not need ThreadMesh.** On the tested Codex desktop host, native tools +already read task status, send messages to another task, attribute their source +and continue the receiver. The model can choose those tools without ThreadMesh +inventing the communication capability. The original “sent from another task” +moment belongs to Codex, not to this project. + +The official [App Server lifecycle](https://learn.chatgpt.com/docs/app-server#lifecycle-overview) +also documents threads, continuation, active-turn steering and events. It does +not establish that every desktop distribution exposes the same cross-task tools. +Our [native task record](../evidence/codex-native-2026-09-07/README.md) establishes +the narrower observed host behavior. App Server primitives are not an API for +silently attaching an external service to arbitrary existing desktop tasks. + +## Two routes, different responsibilities + +| Capability | Native Codex + ThreadMesh skill | ThreadMesh workspace / adapters | +|---|---|---| +| Model reasoning and deciding relevance | Codex model, guided by the skill | Host model, guided by tools/context | +| Cross-task transport, source badge, native continuation | **Codex supplies these** | ThreadMesh protocol/coordinator and supported adapter supply routing; wake is host-specific | +| Selected goals, advisory scope, busy/stop behavior | Model-followed skill instructions; not enforced isolation | Explicit room membership, mute, bounded sends and receiver dispositions; same-owner local boundary | +| Durable mailbox and message disposition | Codex native history; no ThreadMesh mailbox in this route | SQLite mailbox and separate delivery/decision/outcome fields | +| Portable work checkpoint | Not supplied by the native skill | Explicit saved checkpoint, not full transcript or permission migration | +| Evidence so far | One controlled prior-context pair, own receiver edit and busy/stop checks | Versioned maintainer runs and one independent first-use report; gaps vary by adapter | + +Implementation: [native skill](../../plugins/threadmesh-codex/skills/threadmesh-codex/SKILL.md), +[workspace](../../src/workspace/local-workspace.mjs), +[compatibility and failures](harness-support.md). + +Do not transfer workspace persistence, admission or mute enforcement into a claim +about the skill-only desktop path. Conversely, a native desktop success does not +prove an external cross-harness adapter can do the same thing. + +## What is valuable today—and what is still a hypothesis + +The native skill is a reusable, reviewed opt-in workflow: selected peers/topics, +narrow advisory messages, fresh status checks, retained constraints, stop behavior +and an explicit distinction between delivery and useful completion. Its incremental +value is **modest today**. A user can express similar rules directly to Codex. +The successful demonstration proves that this workflow can work, not that it is +necessary, unique, more reliable or faster than native Codex alone. There is no +matched native-only versus skill comparison yet. + +The workspace route additionally implements shared coordination primitives for +supported integrations and explicit portable checkpoints. That is real code, +but generic desktop plug-and-play, meaningful quota-blocked recovery and broad +cross-product correctness remain unproven. Architecture alone is not user value. + +**Use native Codex directly** if its existing task tools already solve your +same-client need with acceptable setup and control. Try the skill for repeatable +scoped collaboration guidance. Consider the workspace when you actually need a +persistent cross-session inbox or supported cross-harness integration and accept +its current setup cost. For one conversation, add neither layer. + +## The product must earn its place + +The immediate promise to work toward is: **tell related tasks once, stop being +their messenger, and see whether the receiving task actually acted correctly.** + +1. Make pairing usable in Codex without copying IDs, editing JSON or installing + a developer runtime. Preserve explicit selection and user control. +2. Retain user decisions across useful handoffs and expose pending versus applied + state. A delivery badge alone is not sufficient. +3. Save reviewed proof from actual user work. Then compare native-only use with + the smallest ThreadMesh addition: setup burden, manual relays, useful edits, + unwanted contacts and failure recovery—not messages sent or internal test counts. + +If that comparison shows no useful gain, keep the Codex integration a small +optional recipe instead of inflating it into a platform. Portable coordination +must independently earn its own use case. Community growth follows repeatable +first-user success and honest evidence, not a promised star count. diff --git a/docs/00-overview/product-guide.md b/docs/00-overview/product-guide.md index 6665875..55bab40 100644 --- a/docs/00-overview/product-guide.md +++ b/docs/00-overview/product-guide.md @@ -1,8 +1,12 @@ # What ThreadMesh is -ThreadMesh connects independent agent sessions to an explicitly shared local -workspace. The aim is simple: **you should not have to relay every useful change -between agents yourself**. +ThreadMesh offers an explicit local workspace for supported integrations and an +optional skill workflow over Codex's native task tools. The aim is simple: +**you should not have to relay every useful change between agents yourself**. + +Codex already supplies native cross-task communication on the tested host. The +skill did not invent it, and may be unnecessary if native use meets your needs. +[Native capabilities versus ThreadMesh's current value](native-capabilities-and-value.md). A session is one agent conversation with its own task and context. A harness is the application running it, such as Codex or Pi. ThreadMesh connects opted-in @@ -43,8 +47,9 @@ it is not a production service or an npm-published release. ## What the “intelligence” means Models choose relevance and message content under configured collaboration -guidance. ThreadMesh supplies discovery, persistence, provenance and lifecycle -integration. It does not hard-code every handoff or guarantee useful choices. +guidance. In the workspace route, ThreadMesh supplies discovery, persistence and +adapter integration. In the native skill route, Codex supplies the transport, +source attribution and continuation. Neither route guarantees useful choices. A real unrelated-change control stayed quiet despite available peer/inbox tools. A second copy case delivered and resumed correctly but lost a free-plan qualifier. diff --git a/docs/06-guides/real-world-cases.md b/docs/06-guides/real-world-cases.md index ca9d703..07be6c9 100644 --- a/docs/06-guides/real-world-cases.md +++ b/docs/06-guides/real-world-cases.md @@ -13,8 +13,13 @@ reproduction and audit. ## Start with the everyday-work test -The latest [ordinary Codex → Pi evidence](../09-reviews/2026-09-05-workspace-awareness.md) -is the best starting point for the current alpha: +For the current Codex audience, start with the [actual native desktop exchange](../evidence/codex-native-2026-09-07/README.md): +one explicitly opted-in prior-context pair, original B's own correct edit, and +busy/stop controls. Codex provided native transport. See the [evidence library](../evidence/README.md) +for preserved recent CLI passes and failures; none is a native-only benefit comparison. + +The earlier [ordinary Codex → Pi evidence](../09-reviews/2026-09-05-workspace-awareness.md) +retains the cross-harness baseline: | Ordinary task | Result | What it establishes | |---|---|---| diff --git a/docs/09-reviews/2026-09-07-native-desktop-acceptance.md b/docs/09-reviews/2026-09-07-native-desktop-acceptance.md index 6c52570..0286c7d 100644 --- a/docs/09-reviews/2026-09-07-native-desktop-acceptance.md +++ b/docs/09-reviews/2026-09-07-native-desktop-acceptance.md @@ -91,6 +91,11 @@ No monitor, global configuration or installation requires cleanup. ## Evidence and remaining limits +Public inspection: [reviewed native excerpts and actual diff](../evidence/codex-native-2026-09-07/README.md) +and [structural audit](../evidence/codex-native-2026-09-07/audit.json). The audit tool +emits no raw IDs, paths or prose; it checks supplied export structure, not business +correctness or host authenticity. No screenshot or recording is implied. + Complete native histories were read through the exposed task tool: six turns in A and five in B, with no further history page. A has exactly one outgoing native send, to B; B has none. No task-list call or unrelated target appears in either diff --git a/docs/10-planning/community-followup-2026-09-07.md b/docs/10-planning/community-followup-2026-09-07.md index b785bde..735c875 100644 --- a/docs/10-planning/community-followup-2026-09-07.md +++ b/docs/10-planning/community-followup-2026-09-07.md @@ -67,6 +67,13 @@ goal because the smaller new-session example is easier to validate. ## Deferred reply and execution discipline +Subsequent native desktop evidence is now retained as [actual excerpts and diff](../evidence/codex-native-2026-09-07/README.md). +That controlled prior-context pair passed; it is not this contributor's independent +live result. The [native-value correction](../00-overview/native-capabilities-and-value.md) +credits Codex's existing transport and discloses that the skill has no measured +advantage over native-only use. These are material clarifications to include when +a reply is authorized, not reasons to post another immediate acknowledgement. + The user explicitly asked us to make several real improvements before replying again. Therefore do not post another acknowledgement, roadmap promise, test request or issue closure now. Continue implementation, review and verification diff --git a/docs/10-planning/project-status.md b/docs/10-planning/project-status.md index 889273c..a4649d8 100644 --- a/docs/10-planning/project-status.md +++ b/docs/10-planning/project-status.md @@ -2,6 +2,15 @@ ## Current product update — 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 +map](../00-overview/native-capabilities-and-value.md) / [中文](../zh-CN/native-capabilities-and-value.md) +now state when native Codex is enough and that incremental benefit is unmeasured. +The [public proof pack](../evidence/codex-native-2026-09-07/README.md) preserves +reviewed excerpts, actual receiver diff and a content-free structural audit. +No screenshot or video of that run exists. Next focus on pairing, meaningful +receiver outcomes and one independent user's success, not another adapter matrix. + **Latest Codex-first delivery:** Codex is primary; Pi is optional, not a required second product. The [installed-package case](../09-reviews/2026-09-07-codex-first-use-release.md) now passes in 272.604 seconds with the default command and unchanged five-minute diff --git a/docs/README.md b/docs/README.md index d59dc31..7aac541 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,6 +10,8 @@ Start with the user guides; the protocol and historical benchmarks are optional. | I want to… | Start here | |---|---| | Understand the idea | [What ThreadMesh is](00-overview/product-guide.md) | +| Know whether native Codex is enough | [Native capabilities and added value](00-overview/native-capabilities-and-value.md) | +| Inspect the actual desktop exchange | [Retained messages, diff and audit](evidence/codex-native-2026-09-07/README.md) | | Connect Codex, Pi, Kimi or DeepSeek | [Your first workspace](06-guides/first-workspace.md) | | Explore existing Codex desktop tasks | [Experimental native-task workflow](06-guides/codex-native-tasks.md) | | See actual model behavior | [Everyday cases and evidence](06-guides/real-world-cases.md) | diff --git a/docs/evidence/README.md b/docs/evidence/README.md new file mode 100644 index 0000000..d094fa0 --- /dev/null +++ b/docs/evidence/README.md @@ -0,0 +1,28 @@ +# Evidence library + +Use records to support a specific claim, not as substitutes for independent +adoption or proof of incremental value over the host's native capability. + +| Recent case | Public record | Retained private originals | +|---|---|---| +| 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 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 | +| Codex diagnostic pass, 184.050 s | [Same record, separate budget](../09-reviews/2026-09-07-codex-first-use-release.md) | Same archive categories; not counted as the default gate | +| Codex old-runtime failure | [Failure retained alongside passes](../09-reviews/2026-09-07-codex-first-use-release.md#failures-that-changed-the-implementation) | Events and failed-run report copied to the dated archive | +| Pi copy and installed-package API passes | [Acceptance and event commitments](../09-reviews/2026-09-07-packaged-first-use.md) | Both sample directories copied to the dated non-temporary archive | + +All five copied CLI event files match the SHA-256 commitments in the original +acceptance records. The original temporary directories were not removed. Private +archives are outside the public repository, in owner-only parent directories; +they are local retention, not off-device backup. No raw model logs, account data +or unrelated task histories were uploaded. + +No screenshot or video was captured for these listed recent runs. Earlier +concept images and staged animations are not retroactive proof. The desktop +[capture policy](codex-native-2026-09-07/README.md#screenshots-and-recordings) +describes consent, cropping, originals and truthful retrospective labels. + +For older adapter experiments and failures, use the +[case portfolio](../06-guides/real-world-cases.md) and +[dated review index](../09-reviews/README.md). Their documentation is retained; +this index does not claim every historical raw recording has been recovered. diff --git a/docs/evidence/codex-native-2026-09-07/README.md b/docs/evidence/codex-native-2026-09-07/README.md new file mode 100644 index 0000000..220c3eb --- /dev/null +++ b/docs/evidence/codex-native-2026-09-07/README.md @@ -0,0 +1,109 @@ +# A changed the facts. B updated its own work + +[中文说明](../../zh-CN/native-evidence.md) · [Full acceptance record](../../09-reviews/2026-09-07-native-desktop-acceptance.md) + +**Retained real native-task excerpts, not a screenshot, simulation or reenactment.** +Two disposable Codex desktop tasks had finished initial work before explicitly +adopting the ThreadMesh skill. Codex provided message transport, source attribution +and task continuation. The skill supplied collaboration guidance. This run does +not prove that the skill outperforms native Codex without it. + +## 1. Earlier context, before collaboration + +A maintained approved product facts. B owned website copy in a different +directory. B's earlier user instruction was: + +> My prior design decision is that the signup button must stay exactly 'Create my +> workspace', even if product terminology changes later. + +The manager then explicitly paired A and B and asked each to read the skill. +No peer message was sent in either setup turn. Those manual setup steps are not +model initiative or independently validated novice onboarding. + +## 2. The ordinary request went only to A + +> Rename the product to Member Portal and limit the free plan to five projects. +> Use US spelling. Keep the paid-plan price unchanged. Update the approved product facts. + +No recipient or send instruction appears in that business request. +A independently said: + +> Then I’ll check whether the selected website-copy task is idle before sharing +> the changed facts. + +Its native history records a status call followed by one native send to B. +Excerpt from the actual advisory message: + +> Product name is now Member Portal; spelling is US English (en-US); the free +> plan is limited to five projects. The paid-plan price remains unchanged at +> USD 12 per month. + +The message also explicitly said it was peer advice, not a new user instruction +or permission grant. B's native incoming envelope identifies **A**, not the +managing task, as the source. Private task identifiers are omitted here. + +## 3. Original B did the edit + +B received a new native turn without a manager follow-up. Its response included: + +> I’ll update the headline to US English with “Member Portal” and change the free +> allowance to five projects, preserving the signup button and $12/month price. + +The completed file-change in **B's own turn** changed `landing.json`: + +```diff +- "headline": "Organise work with Team Hub", +- "description": "Unlimited projects for your team on the free tier.", ++ "headline": "Organize work with Member Portal", ++ "description": "Up to five projects for your team on the free tier.", + "signupButton": "Create my workspace" +``` + +`price.txt` stayed `Paid plan: $12/month`. Readback and independent artifact +assertions confirmed those results. Approximately 49 seconds elapsed from the +ordinary request to B's completion, **excluding setup**. This is one observation. + +## 4. It also knew when not to send + +| Controlled check | Observed native behavior | +|---|---| +| B actively occupied; A changes free allowance to seven | A checks B, retains pending advice, makes no send | +| A stopped; then receives an ordinary product rename | A changes only its own file; cancelled advice is not resent | +| End of validation | Both tasks stopped collaboration; histories and files retained | + +B remained on the last received facts. That divergence after stop is expected. +The busy check used a synthetic wait, not real simultaneous human typing. + +## Inspect the evidence + +- [Machine-readable structural audit](audit.json): no IDs, paths or transcript text. +- [Complete test procedure, timing and limitations](../../09-reviews/2026-09-07-native-desktop-acceptance.md). +- [Local audit tool](../../../scripts/audit-native-evidence.mjs): verifies complete + supplied exports, one attributed handoff and a receiver-owned completed patch. + +The audit does not authenticate a host export, prove business correctness or +prove causal improvement over native Codex. Hashes commit to the retained private +files; they are not independent attestation. Raw native histories remain private. +These excerpts were reviewed for publication from the synthetic product case. + +Maintainers can reproduce the structural audit without calling a model: + +```sh +node scripts/audit-native-evidence.mjs /private/path/sender-export.json /private/path/receiver-export.json +``` + +Inputs are the parsed JSON payloads returned by the native `read_thread` tool +with full outputs and complete pagination, not private database files. The tool +does not collect history or publish anything; it prints only its reduced summary. + +## Screenshots and recordings + +This run was **not recorded**, and no native UI screenshot was captured. The +repository's concept illustration is not evidence of the run. Do not render this +transcript as a fake Codex screenshot or animate it as if it were a live recording. + +For the next explicitly authorized live run, capture the original request, +native source badge and B's actual edit, with dates and setup disclosed. Crop or +mask unrelated tasks, account details and private IDs; retain the private original. +Record from before the action, not by reenacting a past success. A retrospective +screenshot of retained history must be labelled retrospective, not live capture. diff --git a/docs/evidence/codex-native-2026-09-07/audit.json b/docs/evidence/codex-native-2026-09-07/audit.json new file mode 100644 index 0000000..2dc8afe --- /dev/null +++ b/docs/evidence/codex-native-2026-09-07/audit.json @@ -0,0 +1,23 @@ +{ + "schemaVersion": 1, + "kind": "structural-audit-of-retained-native-exports", + "transport": "Codex native task tools, not ThreadMesh coordinator", + "sourceTurns": 6, + "receiverTurns": 5, + "outgoingPeerMessages": { + "A": 1, + "B": 0 + }, + "originalReceiverHasPriorCompletedContext": true, + "sourceAttributedReceiverTurn": true, + "completedReceiverOwnedFileChanges": 1, + "modelOrThinkingOverride": false, + "businessCorrectness": "requires separate artifact assertions and human review", + "busyAndStopBehavior": "requires separate turn-history review", + "authenticity": "not cryptographically attested; hashes commit only to supplied files", + "privacy": "no task IDs, paths, prompts, diffs or account data are emitted", + "sourceHashes": { + "A": "8290dc075b8d19d55a79d11c77a3e11a6d80964cb77ec4cf106c5deb33b6fc9a", + "B": "e36eba79b79365ad8bd1058d8d064afdf47de885c75db808b2759abb3482d94f" + } +} diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index c1af10b..2c085a6 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -10,6 +10,8 @@ | 我想…… | 推荐入口 | |---|---| | 快速理解项目有什么用 | [ThreadMesh 是什么](product-guide.md) | +| Codex 原生已够用,还需要安装吗 | [原生能力与增量价值](native-capabilities-and-value.md) | +| 核查桌面演示的真实记录 | [消息、实际修改与审计证据](native-evidence.md) | | 把自己的 Agent 接起来 | [第一次真实协作:中文上手](first-workspace.md) | | 尝试已有 Codex 桌面任务 | [实验性原生任务流程](codex-native-tasks.md) | | 看真正的模型主动行为 | [真实案例与证据](../06-guides/real-world-cases.md) | diff --git a/docs/zh-CN/native-capabilities-and-value.md b/docs/zh-CN/native-capabilities-and-value.md new file mode 100644 index 0000000..5ed1c4d --- /dev/null +++ b/docs/zh-CN/native-capabilities-and-value.md @@ -0,0 +1,46 @@ +# Codex 自己就能做,为什么还需要 ThreadMesh? + +**你可能不需要。** 在已验证的 Codex 桌面宿主里,读取任务状态、给另一个任务发消息、 +标注来源并让接收方继续,本来就是 Codex 的能力。模型自行选择调用工具,也不是 +ThreadMesh 创造的新智能。最初令人惊艳的“由其他任务发送”,应归功于 Codex。 + +官方 [App Server 生命周期](https://learn.chatgpt.com/docs/app-server#lifecycle-overview) +描述了任务、续接和事件;这不意味着每个桌面版本都暴露相同的跨任务工具,更不等于 +外部服务能任意接管已有桌面任务。我们只对[实测宿主与场景](native-evidence.md)作证。 + +## 两条路径,不要混为一谈 + +| 能力 | Codex 原生 + ThreadMesh Skill | ThreadMesh workspace / adapter | +|---|---|---| +| 判断是否需要联系 | Codex 模型,Skill 提供规则 | 宿主模型,工具和上下文提供规则 | +| 发消息、来源标记、原生续跑 | **Codex 提供** | 协调器与适配器负责路由;唤醒取决于宿主 | +| 配对、范围、忙碌暂缓、停止 | 模型遵循规则,不是强制隔离 | 显式加入、静音、发送预算和接收处置;同一所有者的本地边界 | +| 持久收件箱与处置记录 | 使用 Codex 历史,没有 ThreadMesh mailbox | SQLite mailbox,区分送达、接受与结果 | +| 可携带的工作上下文 | 原生 Skill 没有提供 | 显式 checkpoint,不是整段聊天或权限迁移 | + +不能把 workspace 的控制机制宣传成原生 Skill 已具备,也不能用原生桌面成功证明 +外部跨 harness 适配器都能做到。详见[英文实现映射](../00-overview/native-capabilities-and-value.md)。 + +## 现在的价值必须诚实讲 + +原生 Skill 当前是一套可复用、经过评审的协作流程:选定任务和主题、分享完整建议、 +发送前查状态、保留原约定、停止后不补发、核对实际结果。**目前增量有限**,用户也能 +直接向 Codex 描述类似规则。本次成功没有做“不用 Skill”的同条件对比,所以不能 +宣称更智能、更可靠、更快或不可替代。 + +Workspace 另外实现了统一收件箱、适配器和 checkpoint,但普通桌面用户开箱即用、 +真正额度耗尽后的长会话接续、广泛跨产品正确性仍有缺口。代码架构不是用户价值本身。 + +如果 Codex 原生功能已够用,直接用原生即可;想复用明确的协作规则,可以试 Skill; +确实需要持久收件箱或已支持的跨产品接入,再考虑 workspace。单个会话无需增加这一层。 + +## 后续必须兑现的主线 + +**相关任务只交代一次,不再反复转述,并能看清对方是否真正做对。** + +1. 降低 Codex 配对门槛:不用抄 ID、改 JSON 或安装开发环境,仍保留明确选择和控制权。 +2. 保住早先约定,区分待发送、已收到和实际完成;不能只展示一个“送达”标记。 +3. 留下真实证据,再对比原生用法:设置步骤、人工转述、有效修改、无关联系和失败恢复。 + +如果对比发现没有增益,就把 Codex 部分保留为轻量可选流程,不包装成平台。 +社区知名度应来自独立用户成功和可复核案例,不是星标承诺或换一张宣传图。 diff --git a/docs/zh-CN/native-evidence.md b/docs/zh-CN/native-evidence.md new file mode 100644 index 0000000..da82ada --- /dev/null +++ b/docs/zh-CN/native-evidence.md @@ -0,0 +1,29 @@ +# 真实证据:A 改产品事实,B 自己更新原来的工作 + +[原始片段与实际 diff](../evidence/codex-native-2026-09-07/README.md) · +[完整验收记录](../09-reviews/2026-09-07-native-desktop-acceptance.md) + +这是保留下来的原生任务记录摘录,不是截图、模拟或重演。 +两个专用 Codex 桌面任务先完成原工作,再明确启用 Skill;原生通信、来源标记和 +任务续跑来自 **Codex**,ThreadMesh 提供协作规则。本次没有对比“不用 Skill” +的 Codex,不能据此宣称 ThreadMesh 更智能或更有效。 + +## 一眼看懂发生了什么 + +1. **B 之前已记住要求:** 按钮必须保留 `Create my workspace`,付费价格不能擅改。 +2. **只向 A 提普通修改:** 产品改名 Member Portal,免费方案最多五个项目,美式拼写,价格不变。 +3. **A 自行联系 B:** 先查状态,再使用原生发消息工具,完整说明免费/付费范围。 +4. **原 B 自己改文件:** 更新名称、拼写和免费额度,保留旧按钮和 $12/月价格。 + +从普通业务请求到 B 完成约 49 秒,**不含前面的建立任务和配对设置**。 +忙碌对照中 A 没有发消息;停止后另提普通修改,也没有补发待发送建议。 + +[机器可读审计摘要](../evidence/codex-native-2026-09-07/audit.json)不包含原始任务 ID、 +路径或聊天正文。它只核对保留记录的结构,不能代替业务验收,更不是独立签名证明。 +维护者私下保留完整记录;公开片段与文件 diff 可以帮助读者核查具体主张。 + +## 截图与视频的边界 + +这次未录屏,也没有原生界面截图。不能把摘录画成 Codex 窗口、配上动画,冒充实拍。 +后续真实运行应提前录制普通请求、来源标记和接收方修改,并遮挡无关任务和账号信息。 +事后截取保留历史可以作证,但必须标注为“历史截图”,不能说成实时录制。 diff --git a/docs/zh-CN/product-guide.md b/docs/zh-CN/product-guide.md index 72bd08d..8d7ce8f 100644 --- a/docs/zh-CN/product-guide.md +++ b/docs/zh-CN/product-guide.md @@ -1,11 +1,14 @@ # ThreadMesh 是什么 -ThreadMesh 把独立 Agent session 接到一个明确共享的本地工作空间。 +ThreadMesh 提供明确共享的本地 workspace,以及基于 Codex 原生任务工具的可选 Skill 流程。 目的很直接:**不再由你负责把每个有用变化转述给另一个 Agent。** Session 是一段有自己的任务和上下文的 Agent 会话;harness 是运行它的应用, 例如 Codex 或 Pi。ThreadMesh 连接明确加入的工作流,不合并聊天,也不是新模型。 +实测 Codex 宿主本来就能跨任务通信,Skill 并没有创造这项能力。 +原生功能够用就不必安装。[原生能力与项目当前价值](native-capabilities-and-value.md)。 + ## 一个具体问题 你让 Codex 改接口,Pi 维护客户端。分页方式变了,客户端也需要知道。 @@ -36,8 +39,9 @@ Session 是一段有自己的任务和上下文的 Agent 会话;harness 是运 ## “主动智能”在哪里 -模型在配置好的协作提示下判断相关性和消息内容;ThreadMesh 提供发现、持久化、 -来源信息和生命周期接入,不把每次交接写死,也不保证模型每次选择正确。 +模型在配置好的协作提示下判断相关性和消息内容。Workspace 路径由 ThreadMesh 提供 +发现、持久化和适配器接入;原生 Skill 路径的通信、来源标记和续跑来自 Codex。 +两条路径都不保证模型每次选择正确。 一次真实无关修改在工具可用时保持安静。另一条文案案例虽成功送达并续接, 却丢了“免费方案”的限制。**消息成功,不等于业务结果正确。** diff --git a/scripts/audit-native-evidence.mjs b/scripts/audit-native-evidence.mjs new file mode 100644 index 0000000..eb39247 --- /dev/null +++ b/scripts/audit-native-evidence.mjs @@ -0,0 +1,72 @@ +import fs from "node:fs"; +import path from "node:path"; +import { createHash } from "node:crypto"; +import { fileURLToPath } from "node:url"; + +// This is a structural audit of user-supplied exports, not host attestation, +// semantic correctness or a claim that ThreadMesh supplied native transport. +export function auditNativeEvidence(a, b) { + const reject = () => { throw new Error("Native evidence is incomplete or does not establish one attributed receiver-owned handoff."); }; + for (const d of [a, b]) { + if (!d?.thread?.id || !d.thread.cwd || !d.thread.hostId || d.page?.hasMore !== false || !Array.isArray(d.turns) || + d.turns.some(t => t.status !== "completed" || !Array.isArray(t.items) || + t.items.some(i => i.output?.truncated || i.changes?.some(c => c.diff?.truncated)))) reject(); + } + if (a.thread.id === b.thread.id) reject(); + const calls = d => d.turns.flatMap(t => t.items).filter(i => i.type === "mcpToolCall" && i.tool === "send_message_to_thread"); + const sends = calls(a); + if (sends.length !== 1 || calls(b).length || sends[0].status !== "completed" || + sends[0].arguments?.threadId !== b.thread.id || + sends[0].arguments?.hostId !== b.thread.hostId) reject(); + const received = b.turns.filter(t => t.items.some(i => i.type === "functionCallOutput" && + i.name === "send_message_to_thread" && i.output?.text?.startsWith( + `\n ${a.thread.id}\n `))); + if (received.length !== 1) reject(); + const turn = received[0]; + const changes = turn.items.filter(i => i.type === "fileChange" && i.status === "completed") + .flatMap(i => i.changes ?? []); + const ownChanges = changes.filter(c => { + if (typeof c.path !== "string" || !path.isAbsolute(c.path)) return false; + const relative = path.relative(b.thread.cwd, c.path); + return relative && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative); + }); + if (!ownChanges.length || !b.turns.some(t => Number.isFinite(t.completedAt) && + Number.isFinite(turn.startedAt) && t.completedAt < turn.startedAt)) reject(); + return { + schemaVersion: 1, + kind: "structural-audit-of-retained-native-exports", + transport: "Codex native task tools, not ThreadMesh coordinator", + sourceTurns: a.turns.length, + receiverTurns: b.turns.length, + outgoingPeerMessages: { A: sends.length, B: calls(b).length }, + originalReceiverHasPriorCompletedContext: true, + sourceAttributedReceiverTurn: true, + completedReceiverOwnedFileChanges: ownChanges.length, + modelOrThinkingOverride: Object.hasOwn(sends[0].arguments, "model") || Object.hasOwn(sends[0].arguments, "thinking"), + businessCorrectness: "requires separate artifact assertions and human review", + busyAndStopBehavior: "requires separate turn-history review", + authenticity: "not cryptographically attested; hashes commit only to supplied files", + privacy: "no task IDs, paths, prompts, diffs or account data are emitted", + }; +} + +export function auditFiles(senderFile, receiverFile) { + const read = filename => { + if (fs.statSync(filename).size > 16 * 1024 * 1024) throw new Error("Evidence export exceeds the 16 MiB limit."); + const bytes = fs.readFileSync(filename); + return { value: JSON.parse(bytes), sha256: createHash("sha256").update(bytes).digest("hex") }; + }; + const a = read(senderFile), b = read(receiverFile); + return { ...auditNativeEvidence(a.value, b.value), sourceHashes: { A: a.sha256, B: b.sha256 } }; +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + try { + if (process.argv.length !== 4) throw new Error("usage"); + console.log(JSON.stringify(auditFiles(process.argv[2], process.argv[3]), null, 2)); + } catch { + // Do not echo native export text, local paths or parser excerpts on failure. + console.error("Evidence audit failed. Supply two complete native read_thread JSON exports: sender, receiver. No data was published."); + process.exitCode = 1; + } +} diff --git a/test/native-evidence-audit.test.mjs b/test/native-evidence-audit.test.mjs new file mode 100644 index 0000000..c3b95da --- /dev/null +++ b/test/native-evidence-audit.test.mjs @@ -0,0 +1,53 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { auditNativeEvidence } from "../scripts/audit-native-evidence.mjs"; + +function pair() { + const a = { thread: { id: "SECRET-A", hostId: "local", cwd: "/private/a" }, page: { hasMore: false }, turns: [ + { status: "completed", items: [{ type: "mcpToolCall", tool: "send_message_to_thread", status: "completed", + arguments: { threadId: "SECRET-B", hostId: "local", prompt: "PRIVATE-CONTENT" } }] }, + ] }; + const b = { thread: { id: "SECRET-B", hostId: "local", cwd: "/private/b" }, page: { hasMore: false }, turns: [ + { status: "completed", completedAt: 1, items: [] }, + { status: "completed", startedAt: 2, items: [ + { type: "functionCallOutput", name: "send_message_to_thread", output: { text: "\n SECRET-A\n PRIVATE-CONTENT\n", truncated: false } }, + { type: "fileChange", status: "completed", changes: [{ path: "/private/b/landing.json", diff: { text: "PRIVATE-DIFF", truncated: false } }] }, + ] }, + ] }; + return [a, b]; +} + +test("native evidence audit emits only structural facts, not private content or business success", () => { + const result = auditNativeEvidence(...pair()); + assert.equal(result.completedReceiverOwnedFileChanges, 1); + assert.match(result.businessCorrectness, /requires separate/); + assert.doesNotMatch(JSON.stringify(result), /SECRET|PRIVATE|\/private/); +}); + +test("native evidence rejects incomplete, truncated or non-completed histories", () => { + for (const mutate of [ + ([a]) => { a.page.hasMore = true; }, + ([, b]) => { b.turns[1].items[0].output.truncated = true; }, + ([, b]) => { b.turns[1].items[1].changes[0].diff.truncated = true; }, + ([a]) => { a.turns[0].status = "inProgress"; }, + ]) { const p = pair(); mutate(p); assert.throws(() => auditNativeEvidence(...p)); } +}); + +test("native evidence rejects wrong destination, wrong source, duplicate sends and missing context", () => { + for (const mutate of [ + ([a]) => { a.turns[0].items[0].arguments.threadId = "other"; }, + ([a]) => { a.turns[0].items[0].arguments.hostId = "other"; }, + ([, b]) => { b.turns[1].items[0].output.text = "unattributed"; }, + ([a]) => { a.turns[0].items.push(structuredClone(a.turns[0].items[0])); }, + ([, b]) => { b.turns.shift(); }, + ]) { const p = pair(); mutate(p); assert.throws(() => auditNativeEvidence(...p)); } +}); + +test("native evidence requires a completed receiver-owned native patch", () => { + for (const target of ["/private/b-other/landing.json", "/private/b/../a/landing.json", "landing.json"]) { + const p = pair(); p[1].turns[1].items[1].changes[0].path = target; + assert.throws(() => auditNativeEvidence(...p)); + } + const p = pair(); p[1].turns[1].items[1].status = "failed"; + assert.throws(() => auditNativeEvidence(...p)); +});