phycool-ctrl-channel

Governs cross-track agent messaging via four ctrl-channel MCP tools with CAS semantics.

10|3|Updated Mar 7, 2026
One-click install
npx skills add https://github.com/Cynthia1070711/PHYCOOL_Tools --skill phycool-ctrl-channel-cynthia1070711
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: phycool-ctrl-channel
Source: https://github.com/Cynthia1070711/PHYCOOL_Tools/tree/main/config-templates/claude/skills/phycool-ctrl-channel
Command: npx skills add https://github.com/Cynthia1070711/PHYCOOL_Tools --skill phycool-ctrl-channel-cynthia1070711

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Multi-window AI agent environments (frontend track, backend track, controller, pipeline subwindows) need a disciplined way to exchange asynchronous messages without reverting to hand-edited Markdown chat files that drift out of sync. This Skill defines when and how to call the four ctrl-channel MCP tools, how the notification hooks deliver unread counts, and what to do when the MCP server is unavailable. ## Core Features & Use Cases - Four MCP tools with CAS semantics: post_ctrl_message (open/reply threads), read_ctrl_messages (read with automatic sign-off), close_ctrl_thread (initiator-only, CAS-protected), and update_ctrl_board (optimistic locking via expected_version). - Notification architecture: Three hook points (UserPromptSubmit inject, PostToolUse throttled probe, Stop check-at-stop) plus an idle knock script deliver unread counts only—never message bodies—so agents pull full content themselves. - Fallback discipline: When MCP is unreachable, messages are staged in scratchpad and replayed later; the idempotent import script with --report verifies DB consistency instead of hand-writing frozen .md files. - Use Case: A backend-track agent finishes a migration and needs the frontend track to release a staging window. It posts a request message with to_tracks targeting the frontend track, knocks the idle recipient window, and the recipient reads, signs off, and replies through the same tool path. ## Quick Start Ask the agent to post a cross-track message to the backend track using post_ctrl_message with a topic and non-empty to_tracks array, then read any unread messages addressed to your track with read_ctrl_messages.

Frequently Asked Questions about phycool-ctrl-channel

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I send a message between agent tracks with ctrl-channel MCP tools?

Call post_ctrl_message with a topic and a non-empty to_tracks array naming the recipient tracks to open a new thread, or pass an existing thread_id to reply. Omitting thread_id creates a new topic; omitting to_tracks returns error CCB1-E01.

How do I read unread cross-track messages in Claude Code?

Call read_ctrl_messages with your reader_track and unread_only set to true. Reading automatically signs off the returned messages in ctrl_message_reads, so a second identical call returns zero results by design.

Why did close_ctrl_thread fail with a CAS rejection?

Only the track that initiated the thread can close it; the close uses a compare-and-swap guard so other callers get a semantic refusal, not an error. Ask the initiating track to close it or record a handoff note instead of bypassing with direct SQL.

What happens when the phycool-context MCP server is unavailable?

Stage pending messages in your scratchpad or conversation context and replay them with post_ctrl_message once MCP recovers. Never hand-write the frozen Markdown chat files; run import-ctrl-channel.js --report for an idempotent consistency check if data drift is suspected.

Why do notification hooks show unread counts but no message content?

The three hook points and the idle knock follow notification inversion: they deliver only unread counts, never message bodies. Agents must call read_ctrl_messages themselves to fetch full content and sign off, keeping hook output small and read paths physically read-only.

Why did my unread message count suddenly drop to near zero?

The unread_only filter now applies recipient filtering, excluding messages not addressed to your track. Earlier inflated counts included other tracks' traffic; the lower number is the corrected behavior, not a regression.