Threadwake is a validated, locally installable, MCP-backed Codex plugin. Installed version 0.1.0+codex.20260809134453 contains:
.agents/plugins/marketplace.json
plugins/threadwake/
.codex-plugin/plugin.json
.mcp.json
assets/
server/threadwake-mcp.mjs
server/THIRD_PARTY_NOTICES.txt
skills/threadwake/SKILL.md
.mcp.json points only to server/threadwake-mcp.mjs inside the plugin. The server exposes the deterministic in-memory synthetic fixture. The current plugin is one skill plus 8 tools. It does not contain .app.json, an MCP Apps widget, lifecycle hooks, plugin UI screenshots, a remote registration identifier, or a hosted MCP connection.
This is an independent plugin proposal. It is not published in the universal plugin directory and is not endorsed by OpenAI.
The manifest identifies Albert Buchard as publisher, declares Apache License 2.0, and links to the public repository, privacy policy, and terms. Ordinary support uses GitHub Issues, and vulnerabilities use private vulnerability reporting.
The Threadwake skill helps Codex reason about long-running work supplied in the task. It tells Codex to preserve stable work identity, distinguish lifecycle from outcome, inspect evidence and provenance, retain useful rejected paths, and describe the exact context a next action should inherit.
The installed tools make that safe write posture executable for fixture lifecycle changes. Codex can read capabilities and state, request a server-issued preview, show the exact change, and confirm only with the preview token, current version, confirmation literal, and idempotency key. The server does not expose hierarchy attachment, context-update, or history-mutation tools.
OpenAI documents repo-scoped marketplaces at .agents/plugins/marketplace.json and plugin folders under plugins/. The plugin source path is relative to the repository marketplace root. See Package your plugin.
To inspect the current plugin:
- Open this repository in Codex or Work mode in the ChatGPT desktop app.
- Restart the desktop app if Threadwake Local does not appear as a plugin source.
- Install Threadwake from that local source.
- Start a fresh task so plugin discovery does not rely on an earlier task state.
- Ask Threadwake to get capabilities, list the synthetic units, and preview one lifecycle change.
- Verify that preview does not change state and that Codex does not confirm without explicit user confirmation.
The marketplace declares ON_USE authentication policy. The local fixture server itself has no account or authentication flow. The policy does not claim that hosted sign-in exists.
These checks confirm the committed package shape:
node -e "JSON.parse(require('fs').readFileSync('.agents/plugins/marketplace.json','utf8')); JSON.parse(require('fs').readFileSync('plugins/threadwake/.codex-plugin/plugin.json','utf8'))"
test -f plugins/threadwake/skills/threadwake/SKILL.md
test -f plugins/threadwake/assets/threadwake-mark.svg
test -f plugins/threadwake/assets/threadwake-mark-dark.svg
test -f plugins/threadwake/.mcp.json
test -f plugins/threadwake/server/threadwake-mcp.mjs
test -f plugins/threadwake/server/THIRD_PARTY_NOTICES.txt
test ! -e plugins/threadwake/.app.jsonThe supported plugin validator passed. Remove and add testing installed version 0.1.0+codex.20260809134453. Source and installed-cache server bytes match. The operating-system sandbox denied reads from the source repository while the installed cache initialized and exposed 8 tools.
OpenAI plugin packages can include .mcp.json for a bundled MCP server or .app.json for a registered server connection. The official packaging guide requires the manifest at .codex-plugin/plugin.json and keeps optional components at the plugin root.
Threadwake passed the local bundled-MCP conditions:
- The deterministic build produced a dependency-bundled executable and generated third-party notices inside
plugins/threadwake/. - The installed executable ran without sibling workspace files, repository-root dependencies, unpublished packages, network installation, or source-repository access.
- The installed cache initialized and exposed all 8 tools.
- A fresh Codex
0.147.0task usinggpt-5.6-solwith extra-high reasoning discoveredthreadwake:threadwakeand the MCP tools. - That task completed capabilities, list, and preview calls without confirming a write.
- The plugin's contracts and MCP coverage passes 6 files with 31 tests. The current implementation test run also passes 15 application files with 167 tests, for 21 files and 198 implementation tests in one receipt.
An .app.json file will not be added until a real MCP server connection has been registered through the supported developer flow and a real registration identifier exists. A placeholder identifier would be misleading.
The repository now includes the released pure task-link contract and synthetic tests. The plugin does not expose that contract through a widget or adapter and includes no private snapshot, real identity, or conversation-derived fixture. The smallest future visual increment is a thin, read-only MCP Apps wrapper after a separately reviewed public-safe shell is released. It must not duplicate the unreleased desktop mockup, host switch, or owner-only interface. Raw task, turn, item, and message identities or excerpts must never enter public fixtures, URL state, or persisted widget state.
The installed fixture server exposes exactly these 8 tools:
| Tool | Kind and metadata | Behavior |
|---|---|---|
threadwake_get_capabilities |
Read-only, non-destructive, closed-world | Returns mode, contract version, the 8 capabilities, and limits |
threadwake_list_work_units |
Read-only, non-destructive, closed-world | Lists deterministic synthetic units with filters and cursor pagination |
threadwake_get_work_unit |
Read-only, non-destructive, closed-world | Gets one unit with parent, children, and explicit relations |
threadwake_search_work_units |
Read-only, non-destructive, closed-world | Searches synthetic identifiers and text as inert data |
threadwake_get_evidence |
Read-only, non-destructive, closed-world | Gets evidence attached to one synthetic unit |
threadwake_preview_fixture_change |
Read-only, non-destructive, closed-world | Issues the preview required for one fixture lifecycle change |
threadwake_confirm_fixture_change |
Write, destructiveHint: true, idempotentHint: true, closed-world |
Applies the exact previewed in-memory change; conditionally undoable only until a later change is confirmed on that work unit |
threadwake_undo_fixture_change |
Write, destructiveHint: true, idempotentHint: true, closed-world |
Undoes only the most recently confirmed change and never reopens an earlier receipt |
The confirm and undo tools are correctly marked destructive because the MCP SDK defines state-changing operations as destructive even when the state is local and in memory. idempotentHint: true means an identical retry with the same key returns the same receipt; it does not make a different request with that key valid. openWorldHint: false means the fixture tools do not affect an external or public system. Only the most recently confirmed change on a work unit can be undone, and only if no later confirmed change has ever existed on that unit. Undoing it does not reopen an earlier receipt. These annotations do not replace server validation or explicit confirmation.
A repository marketplace supports authoring, testing, and scoped distribution. Publishing its source repository is separate from the universal plugin directory shared by ChatGPT and Codex.
A public submission would require a final plugin bundle or production MCP server, verified publisher identity, Apps Management write permission, public website and policy routes, a stable production endpoint where applicable, authentication, domain verification, accurate tool metadata, reviewer-ready fixtures or credentials, and formal review. The current OpenAI submission guide also asks for at least five positive and three negative test cases.
The verified local bundle is not a directory submission. Publisher and policy metadata are present, but Threadwake has no stable public production MCP endpoint, hosted authentication, domain-verification receipt, or directory review. See External actions still required.
Use the ChatGPT desktop app's plugin controls to disable or uninstall the local Threadwake plugin. Restart the app and open a fresh task to confirm that the skill is no longer available. Do not hand-edit Codex installation state to simulate an uninstall receipt.