Repository navigation
Expose authorized ThreadDesk commands through dynamic MCP and add whiteboard lifecycle - #97
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bd6dfb7bb2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| marker = entry.metadata.get("whiteboard_edit") | ||
| if (not isinstance(marker, dict) or not isinstance(marker.get("entry_id"), str) | ||
| or not isinstance(marker.get("previous_entry_id"), str)): |
There was a problem hiding this comment.
Reserve correction markers for the whiteboard edit operation
When an append-only module supplies a valid metadata.whiteboard_edit marker, this projection treats its contribution as an authorized correction of another author's entry. ModuleContext.append_whiteboard() forwards arbitrary metadata after checking only whiteboard:append, so a module can replace the displayed text under an existing human entry's ID and actor header while its own contribution disappears from the displayed log. Reserve these markers in public/module append paths and create them only through the controlled edit operation.
Useful? React with 👍 / 👎.
| fields = {"actor": actor, "actor_type": actor_type, "entry_type": "note", "content": content, | ||
| "metadata": {"whiteboard_edit": {"entry_id": entry_id, "previous_entry_id": previous}}, | ||
| "task_id": original.task_id, "handoff_id": original.handoff_id, "run_id": original.run_id, | ||
| "room_id": original.room_id} |
There was a problem hiding this comment.
Apply corrections to current-state and handoff consumers
When a user edits a task contribution, the UI displays the corrected task, but whiteboard.stand still reports the original text as open_task: stand() reads raw task entries, whereas this operation appends a note. Handoffs likewise serialize both texts without the correction relationship because history_for_handoff() drops metadata. This leaves downstream consumers with stale or ambiguous instructions despite a successful edit. Apply the effective-entry projection to current-state consumers and either project corrections or preserve their relationship in handoff context.
Useful? React with 👍 / 👎.
ThreadDesk now derives concrete MCP tools directly from its command registry. Each authorized command advertises its domain JSON Schema, parameters, scopes, workspace binding and revision/operation contract; execution returns a verifiable result digest and durable operation receipt where applicable. Registry/module changes refresh discovery, including idle
tools/list_changednotifications. Local schema references retain their resource root. Owner-only commands remain restricted. The catalog contains 141 commands: 133 available through MCP on JSON and 136 on SQLite, or 172/175 discovery tools including compatibility tools.Whiteboards keep their existing thread and append-only log. They can be created, opened, closed, edited, renamed, archived, restored and moved to trash. Stable graph nodes and relationships follow canonical state and restoration. Reversible deletion explicitly confirms moving the owning thread and its notes; the existing trash traffic light and permanent-purge preview, digest and approval remain enforced. Both packaged entrypoints support standalone
--mcp. Open/closed denotes persisted board state, not an acknowledgement from an operating-system window.Merged normally as
067a525798817629ae1d2b8e741d109230f54d08, built from that clean integrated pin and installed in/Applications/ThreadDesk.app. Independent installation review approved the actual package, signature and running original workspace. All 3,791 canonical files retained identical hashes; only two disposable search indexes regenerated and passed their integrity check. The previous app and private installation evidence are retained for rollback.Validation:
Inventory, contracts and reproducible source evidence include the preserved initial CI failures and their corrections. Final installation, native screenshots, data-preservation manifests and independent review are recorded in the private local
dynamic-mcp-whiteboards-20261030/integration.jsonevidence bundle.KiraBridge code, app, configuration and terminal control remain unchanged. A final read-only counterpart probe still advertises 34 old tools from its configured
770bbc9snapshot. Selecting the new standalone endpoint and exercising it through the actual KiraBridge principal remains an external integration dependency; this PR does not claim that end-to-end result.