Flow Nexus Swarm
ruvnet/agentic-flow
Cloud-based AI swarm deployment and event-driven workflow automation with Flow Nexus platform
File-based message queue for inter-agent coordination. An agent skill from Ibrahim-3d/orchestrator-supaconductor.
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-bus --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/message-bus .claude/skills/message-bus && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .claude/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-busType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-bus --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/message-bus .agents/skills/message-bus && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .agents/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-bus --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/message-bus .cursor/skills/message-bus && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .cursor/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Ibrahim-3d/orchestrator-supaconductor.git --path skills/message-bus--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-bus --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/message-bus .gemini/skills/message-bus && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .gemini/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-busInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/message-bus .github/skills/message-bus && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .github/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Ibrahim-3d/orchestrator-supaconductor message-bus --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ibrahim-3d/orchestrator-supaconductor.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/message-bus .opencode/skills/message-bus && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "message-bus" agent skill from https://github.com/Ibrahim-3d/orchestrator-supaconductor/tree/master/skills/message-bus into .opencode/skills/message-bus/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "message-bus", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
message-busFile-based message queue for inter-agent coordination. An agent skill from Ibrahim-3d/orchestrator-supaconductor.
Message Bus is an agent skill from Ibrahim-3d/orchestrator-supaconductor. File-based message queue for inter-agent coordination. Used by workers AND board directors to communicate. Provides: progress updates, task completion signals, file locking, board deliberation. Core infrastructure for parallel execution.
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `scripts/init-bus.py` and `scripts/monitor-bus.py`).
It sits in Backend & APIs, covering Multi-agent orchestration and Event-driven systems. The repository describes itself as: Multi-agent orchestration system for Claude Code with parallel execution, automated quality gates, Board of Directors, and bundled Superpowers skills. The licence is AGPL-3.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 76c9b10. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Message Bus loads about 5.5k tokens when it runs. Until then it costs about 62 tokens; SKILL.md has 225 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from Ibrahim-3d/orchestrator-supaconductor at commit 76c9b10, republished under its AGPL-3.0 licence (© Ibrahim-3d). 225 words, ~5,523 tokens.
.claude/skills/message-bus/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.File-based message queue enabling workers and board directors to coordinate via shared state.
conductor/tracks/{track}/.message-bus/
├── queue.jsonl # Append-only message log (all messages)
├── .lock_mutex # OS-level mutex file for atomic lock operations (fcntl)
├── locks.json # Current file locks
├── worker-status.json # Worker heartbeats and states
├── events/ # Signal files for polling
│ ├── TASK_COMPLETE_1.1.event
│ └── FILE_UNLOCK_*.event
└── board/ # Board deliberation sessions
├── session-{ts}.json # Session metadata
├── assessments.json # Director assessments (Phase 1)
├── discussion.jsonl # Discussion messages (Phase 2)
└── votes.json # Final votes (Phase 3)| Type | Purpose | Payload |
|---|---|---|
PROGRESS | Task progress update | { task_id, progress_pct, current_subtask } |
TASK_COMPLETE | Task finished | { task_id, commit_sha, files_modified, unblocks[] } |
TASK_FAILED | Task failed | { task_id, error, stack_trace } |
FILE_LOCK | Acquire file lock | { filepath, lock_type, expires_at } |
FILE_UNLOCK | Release file lock | { filepath } |
BLOCKED | Waiting on dependency | { task_id, waiting_for, resource } |
| Type | Purpose | Payload |
|---|---|---|
BOARD_ASSESS | Director assessment | { director, verdict, score, concerns[], recommendations[] } |
BOARD_DISCUSS | Discussion message | { from, to, type, message, changes_my_verdict } |
BOARD_VOTE | Final vote | { director, final_verdict, confidence, conditions[] } |
BOARD_RESOLVE | Aggregated decision | { verdict, vote_summary, conditions[], dissent[] } |
All messages follow this structure:
{
"id": "msg-{uuid}",
"type": "PROGRESS | TASK_COMPLETE | BOARD_ASSESS | ...",
"source": "worker-1.1-xxx | CA | orchestrator",
"timestamp": "2026-02-01T12:00:00Z",
"payload": { ... }
}def post_message(bus_path: str, msg_type: str, source: str, payload: dict):
message = {
"id": f"msg-{uuid4()}",
"type": msg_type,
"source": source,
"timestamp": datetime.utcnow().isoformat() + "Z",
"payload": payload
}
# Append to queue (atomic via file locking)
with open(f"{bus_path}/queue.jsonl", "a") as f:
f.write_file(json.dumps(message) + "\n")
# Create event file for polling
if msg_type in ["TASK_COMPLETE", "FILE_UNLOCK", "BOARD_RESOLVE"]:
event_file = f"{bus_path}/events/{msg_type}_{payload.get('task_id', 'all')}.event"
Path(event_file).touch()def read_messages(bus_path: str, since: str = None, msg_type: str = None) -> list:
messages = []
with open(f"{bus_path}/queue.jsonl", "r") as f:
for line in f:
msg = json.loads(line)
if since and msg["timestamp"] < since:
continue
if msg_type and msg["type"] != msg_type:
continue
messages.append(msg)
return messagesdef wait_for_event(bus_path: str, event_pattern: str, timeout: int = 300) -> bool:
"""Wait for event file to appear. Returns True if found, False if timeout."""
import glob
import time
start = time.time()
while time.time() - start < timeout:
matches = glob.glob(f"{bus_path}/events/{event_pattern}")
if matches:
return True
time.sleep(1)
return Falseimport fcntl
def acquire_lock(bus_path: str, filepath: str, worker_id: str) -> bool:
locks_file = f"{bus_path}/locks.json"
mutex_file = f"{bus_path}/.lock_mutex"
# Use an OS-level exclusive lock on a dedicated mutex file so that
# the read → check → write sequence is atomic across concurrent processes.
# Open in append mode — we only need the file to exist as a lock target,
# not to store any content. Append mode avoids truncation overhead.
lock_fd = open(mutex_file, "a")
try:
fcntl.flock(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
lock_fd.close()
return False # Another process is mid-lock; retry later
try:
if os.path.exists(locks_file):
with open(locks_file) as f:
locks = json.load(f)
else:
locks = {}
existing = locks.get(filepath)
if existing and existing["worker_id"] != worker_id:
# Check if the lock has expired (30-min timeout)
if datetime.fromisoformat(existing["expires_at"]) > datetime.utcnow():
return False # Legitimately locked by another worker
# Acquire lock
locks[filepath] = {
"worker_id": worker_id,
"acquired_at": datetime.utcnow().isoformat() + "Z",
"expires_at": (datetime.utcnow() + timedelta(minutes=30)).isoformat() + "Z"
}
with open(locks_file, "w") as f:
json.dump(locks, f, indent=2)
# Post lock message
post_message(bus_path, "FILE_LOCK", worker_id, {"filepath": filepath})
return True
finally:
fcntl.flock(lock_fd, fcntl.LOCK_UN)
lock_fd.close()def release_lock(bus_path: str, filepath: str, worker_id: str):
locks_file = f"{bus_path}/locks.json"
locks = json.load(open(locks_file)) if os.path.exists(locks_file) else {}
if filepath in locks and locks[filepath]["worker_id"] == worker_id:
del locks[filepath]
with open(locks_file, "w") as f:
json.dump(locks, f, indent=2)
# Post unlock message and event
post_message(bus_path, "FILE_UNLOCK", worker_id, {"filepath": filepath})Workers post heartbeats every 5 minutes:
def update_worker_status(bus_path: str, worker_id: str, task_id: str, status: str, progress: int):
status_file = f"{bus_path}/worker-status.json"
statuses = json.load(open(status_file)) if os.path.exists(status_file) else {}
statuses[worker_id] = {
"task_id": task_id,
"status": status, # "RUNNING" | "COMPLETE" | "FAILED" | "BLOCKED"
"progress_pct": progress,
"last_heartbeat": datetime.utcnow().isoformat() + "Z"
}
with open(status_file, "w") as f:
json.dump(statuses, f, indent=2)Each director posts their assessment:
def post_board_assessment(bus_path: str, director: str, assessment: dict):
board_path = f"{bus_path}/board"
# read_file existing assessments
assess_file = f"{board_path}/assessments.json"
assessments = json.load(open(assess_file)) if os.path.exists(assess_file) else {}
# Add this director's assessment
assessments[director] = assessment
with open(assess_file, "w") as f:
json.dump(assessments, f, indent=2)
# Post to main queue too
post_message(bus_path, "BOARD_ASSESS", director, assessment)Directors respond to each other:
def post_board_discussion(bus_path: str, from_dir: str, to_dir: str,
msg_type: str, message: str, changes_verdict: bool):
board_path = f"{bus_path}/board"
discussion_msg = {
"from": from_dir,
"to": to_dir,
"type": msg_type, # "CHALLENGE" | "AGREE" | "QUESTION" | "CLARIFY"
"message": message,
"changes_my_verdict": changes_verdict,
"timestamp": datetime.utcnow().isoformat() + "Z"
}
# Append to discussion log
with open(f"{board_path}/discussion.jsonl", "a") as f:
f.write_file(json.dumps(discussion_msg) + "\n")
# Post to main queue
post_message(bus_path, "BOARD_DISCUSS", from_dir, discussion_msg)Directors cast final votes:
def post_board_vote(bus_path: str, director: str, verdict: str,
confidence: float, conditions: list):
board_path = f"{bus_path}/board"
votes_file = f"{board_path}/votes.json"
votes = json.load(open(votes_file)) if os.path.exists(votes_file) else {}
votes[director] = {
"final_verdict": verdict, # "APPROVE" | "REJECT"
"confidence": confidence, # 0.0 - 1.0
"conditions": conditions,
"timestamp": datetime.utcnow().isoformat() + "Z"
}
with open(votes_file, "w") as f:
json.dump(votes, f, indent=2)
post_message(bus_path, "BOARD_VOTE", director, votes[director])Orchestrator aggregates votes:
def resolve_board_vote(bus_path: str) -> dict:
board_path = f"{bus_path}/board"
votes = json.load(open(f"{board_path}/votes.json"))
approve_count = sum(1 for v in votes.values() if v["final_verdict"] == "APPROVE")
reject_count = len(votes) - approve_count
# Determine verdict
if approve_count >= 4:
verdict = "APPROVED"
elif approve_count == 3:
verdict = "APPROVED_WITH_REVIEW"
elif reject_count >= 4:
verdict = "REJECTED"
elif reject_count == 3:
verdict = "REJECTED"
else:
verdict = "ESCALATE"
# Collect conditions
all_conditions = []
for director, vote in votes.items():
for cond in vote.get("conditions", []):
all_conditions.append(f"{cond} ({director})")
resolution = {
"verdict": verdict,
"vote_summary": {d: v["final_verdict"] for d, v in votes.items()},
"conditions": all_conditions,
"timestamp": datetime.utcnow().isoformat() + "Z"
}
# Post resolution
post_message(bus_path, "BOARD_RESOLVE", "orchestrator", resolution)
# Create event file
Path(f"{bus_path}/events/BOARD_RESOLVE.event").touch()
return resolutionMonitor for circular waits:
def detect_deadlock(bus_path: str) -> list:
"""Returns list of workers in deadlock cycle, or empty if none."""
status_file = f"{bus_path}/worker-status.json"
locks_file = f"{bus_path}/locks.json"
statuses = json.load(open(status_file)) if os.path.exists(status_file) else {}
locks = json.load(open(locks_file)) if os.path.exists(locks_file) else {}
# Build wait-for graph
# worker -> worker it's waiting for
wait_for = {}
# Find blocked workers
blocked_msgs = read_messages(bus_path, msg_type="BLOCKED")
for msg in blocked_msgs:
blocker = msg["payload"].get("waiting_for")
if blocker:
wait_for[msg["source"]] = blocker
# Detect cycles using DFS
def find_cycle(start, visited, path):
if start in path:
return path[path.index(start):]
if start in visited:
return []
visited.add(start)
path.append(start)
if start in wait_for:
cycle = find_cycle(wait_for[start], visited, path)
if cycle:
return cycle
path.pop()
return []
visited = set()
for worker in wait_for:
cycle = find_cycle(worker, visited, [])
if cycle:
return cycle
return []Initialize message bus for a track:
def init_message_bus(track_path: str):
bus_path = f"{track_path}/.message-bus"
# Create directories
os.makedirs(bus_path, exist_ok=True)
os.makedirs(f"{bus_path}/events", exist_ok=True)
os.makedirs(f"{bus_path}/board", exist_ok=True)
# Initialize files
Path(f"{bus_path}/queue.jsonl").touch()
Path(f"{bus_path}/.lock_mutex").touch() # OS-level mutex for atomic lock operations
with open(f"{bus_path}/locks.json", "w") as f:
json.dump({}, f)
with open(f"{bus_path}/worker-status.json", "w") as f:
json.dump({}, f)
with open(f"{bus_path}/board/assessments.json", "w") as f:
json.dump({}, f)
with open(f"{bus_path}/board/votes.json", "w") as f:
json.dump({}, f)
Path(f"{bus_path}/board/discussion.jsonl").touch()## Worker Protocol
1. **On Start**:
- read_file message bus for TASK_COMPLETE events of dependencies
- Verify all dependencies are met
- Update worker-status.json with RUNNING
2. **Before Modifying Files**:
- Call acquire_lock() for each file
- If lock fails, post BLOCKED message and wait
3. **During Execution**:
- Post PROGRESS every 5 minutes
- Update worker-status.json heartbeat
4. **On Completion**:
- Release all file locks
- Post TASK_COMPLETE with commit SHA and files modified
- Update worker-status.json with COMPLETE
5. **On Failure**:
- Release all file locks
- Post TASK_FAILED with error details
- Update worker-status.json with FAILED## Board Protocol
1. **Phase 1 (ASSESS)**:
- All 5 directors read_file proposal
- Each posts BOARD_ASSESS to assessments.json
- Wait for all 5 assessments
2. **Phase 2 (DISCUSS)** -- 3 rounds:
- Directors read_file others' assessments
- Post BOARD_DISCUSS messages
- Respond to challenges and questions
3. **Phase 3 (VOTE)**:
- Each director posts BOARD_VOTE
- Include confidence level and conditions
4. **Phase 4 (RESOLVE)**:
- Orchestrator calls resolve_board_vote()
- Posts BOARD_RESOLVE
- Creates event file for completiondef create_board_session(bus_path: str, checkpoint: str, proposal: dict) -> str:
"""Initialize a new board session for deliberation."""
board_path = f"{bus_path}/board"
session_id = f"board-{datetime.utcnow().strftime('%Y%m%d%H%M%S')}"
session = {
"session_id": session_id,
"checkpoint": checkpoint, # "EVALUATE_PLAN" | "EVALUATE_EXECUTION" | "PRE_LAUNCH"
"status": "ASSESSING",
"proposal": proposal,
"directors": ["CA", "CPO", "CSO", "COO", "CXO"],
"started_at": datetime.utcnow().isoformat() + "Z",
"phases": {
"assess": {"status": "IN_PROGRESS", "complete": 0, "of": 5},
"discuss": {"status": "NOT_STARTED", "rounds": 0, "max_rounds": 3},
"vote": {"status": "NOT_STARTED", "complete": 0, "of": 5},
"resolve": {"status": "NOT_STARTED"}
}
}
# Clear previous session data
with open(f"{board_path}/assessments.json", "w") as f:
json.dump({}, f, indent=2)
with open(f"{board_path}/votes.json", "w") as f:
json.dump({}, f, indent=2)
Path(f"{board_path}/discussion.jsonl").write_text("")
# Save session metadata
with open(f"{board_path}/session-{session_id}.json", "w") as f:
json.dump(session, f, indent=2)
return session_iddef check_board_phase_complete(bus_path: str, session_id: str) -> dict:
"""Check if current board phase is complete and advance if ready."""
board_path = f"{bus_path}/board"
session_file = f"{board_path}/session-{session_id}.json"
session = json.load(open(session_file))
assessments = json.load(open(f"{board_path}/assessments.json"))
votes = json.load(open(f"{board_path}/votes.json"))
discussions = []
with open(f"{board_path}/discussion.jsonl") as f:
discussions = [json.loads(l) for l in f if l.strip()]
result = {"phase": session["status"], "complete": False, "can_advance": False}
if session["status"] == "ASSESSING":
session["phases"]["assess"]["complete"] = len(assessments)
if len(assessments) >= 5:
result["complete"] = True
result["can_advance"] = True
result["next_phase"] = "DISCUSSING"
elif session["status"] == "DISCUSSING":
current_round = session["phases"]["discuss"]["rounds"]
if current_round >= 3:
result["complete"] = True
result["can_advance"] = True
result["next_phase"] = "VOTING"
elif session["status"] == "VOTING":
session["phases"]["vote"]["complete"] = len(votes)
if len(votes) >= 5:
result["complete"] = True
result["can_advance"] = True
result["next_phase"] = "RESOLVING"
# Save updated session
with open(session_file, "w") as f:
json.dump(session, f, indent=2)
return resultdef advance_board_phase(bus_path: str, session_id: str) -> str:
"""Advance to next deliberation phase."""
board_path = f"{bus_path}/board"
session_file = f"{board_path}/session-{session_id}.json"
session = json.load(open(session_file))
transitions = {
"ASSESSING": "DISCUSSING",
"DISCUSSING": "VOTING",
"VOTING": "RESOLVING",
"RESOLVING": "COMPLETE"
}
current = session["status"]
next_phase = transitions.get(current, current)
session["status"] = next_phase
session["phases"][next_phase.lower().replace("ing", "")]["status"] = "IN_PROGRESS"
with open(session_file, "w") as f:
json.dump(session, f, indent=2)
return next_phaseasync def invoke_board_meeting(
bus_path: str,
checkpoint: str,
proposal: str,
context: dict
) -> dict:
"""
Full 4-phase board deliberation.
Called by orchestrator at EVALUATE_PLAN or EVALUATE_EXECUTION checkpoints.
"""
# 1. Create session
session_id = create_board_session(bus_path, checkpoint, {
"proposal": proposal,
"context": context
})
# 2. Phase 1: ASSESS -- Dispatch all directors in parallel
director_prompts = {
"CA": f"Evaluate technical aspects: {proposal}",
"CPO": f"Evaluate product value: {proposal}",
"CSO": f"Evaluate security posture: {proposal}",
"COO": f"Evaluate operational feasibility: {proposal}",
"CXO": f"Evaluate user experience: {proposal}"
}
# Dispatch via parallel Task calls (see agent-factory)
assessments = await dispatch_board_directors(director_prompts, bus_path)
# Wait for all assessments
while check_board_phase_complete(bus_path, session_id)["complete"] == False:
await asyncio.sleep(5)
advance_board_phase(bus_path, session_id)
# 3. Phase 2: DISCUSS -- 3 rounds
for round_num in range(3):
await run_discussion_round(bus_path, session_id, round_num)
advance_board_phase(bus_path, session_id)
# 4. Phase 3: VOTE -- All directors vote
await dispatch_final_votes(bus_path, session_id)
while check_board_phase_complete(bus_path, session_id)["complete"] == False:
await asyncio.sleep(5)
advance_board_phase(bus_path, session_id)
# 5. Phase 4: RESOLVE
resolution = resolve_board_vote(bus_path)
return {
"session_id": session_id,
"verdict": resolution["verdict"],
"votes": resolution["vote_summary"],
"conditions": resolution["conditions"]
}async def invoke_board_review(bus_path: str, proposal: str) -> dict:
"""
Quick board review -- Phase 1 only, no discussion.
Used for execution quality checks or low-stakes decisions.
"""
session_id = create_board_session(bus_path, "QUICK_REVIEW", {
"proposal": proposal,
"quick_mode": True
})
# Dispatch all directors
await dispatch_board_directors(proposal, bus_path)
# Wait for assessments
while check_board_phase_complete(bus_path, session_id)["complete"] == False:
await asyncio.sleep(5)
# Aggregate assessments directly (skip discussion and vote)
board_path = f"{bus_path}/board"
assessments = json.load(open(f"{board_path}/assessments.json"))
approve_count = sum(1 for a in assessments.values()
if a["verdict"] in ["APPROVE", "CONCERNS"])
reject_count = len(assessments) - approve_count
return {
"session_id": session_id,
"verdict": "APPROVED" if approve_count >= 3 else "REJECTED",
"assessments": assessments,
"consensus": approve_count >= 4
}Directors can poll for messages addressed to them:
def get_messages_for_director(bus_path: str, director: str) -> list:
"""Get all discussion messages addressed to this director."""
board_path = f"{bus_path}/board"
messages = []
with open(f"{board_path}/discussion.jsonl") as f:
for line in f:
if line.strip():
msg = json.loads(line)
if msg["to"] == director or msg["to"] == "ALL":
messages.append(msg)
return messages.message-bus/board/
├── session-board-20260201120000.json # Active session metadata
├── assessments.json # Phase 1: Director assessments
│ {
│ "CA": { "verdict": "APPROVE", "score": 8, "concerns": [...] },
│ "CPO": { "verdict": "CONCERNS", "score": 7, "concerns": [...] },
│ ...
│ }
├── discussion.jsonl # Phase 2: Discussion log
│ {"from": "CA", "to": "CPO", "type": "CHALLENGE", "message": "..."}
│ {"from": "CPO", "to": "CA", "type": "CLARIFY", "message": "..."}
├── votes.json # Phase 3: Final votes
│ {
│ "CA": { "final_verdict": "APPROVE", "confidence": 0.9 },
│ ...
│ }
└── resolution.md # Phase 4: Board decision© Ibrahim-3d, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (scripts) in skills/message-bus of Ibrahim-3d/orchestrator-supaconductor.
Open the folder on GitHubat commit 76c9b10
Message Bus next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Message Bus this skillIbrahim-3d/orchestrator-supaconductor | 380 | — | ~5.5k | Automated safety check: Pass | AGPL-3.0 | |
| Flow Nexus Swarmruvnet/agentic-flow | 816 | 4 repos | ~4.2k | Automated safety check: Pass | None | |
| Agent Signal Pipelinelobehub/lobehub | 83k | — | ~1.7k | Automated safety check: Pass | Custom licence | |
| NookplotBankrBot/skills | 1.2k | — | ~3.2k | Automated safety check: Pass | MIT | |
| Lindy Reference Architecturejeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~3.2k | Automated safety check: Pass | MIT | |
| Port Daddycuriositech/some_claude_skills | 243 | — | ~6.2k | Automated safety check: Pass | MIT |
ruvnet/agentic-flow
Cloud-based AI swarm deployment and event-driven workflow automation with Flow Nexus platform
lobehub/lobehub
Guides building event-driven background work for LobeHub agents, with sources, signals, actions, policies, workflow handoff and deduplication.
BankrBot/skills
Decentralized coordination network for AI agents on Base (Ethereum L2).
jeremylongshore/tons-of-skills-marketplace
Reference architectures for Lindy AI agent integrations. An agent skill from jeremylongshore/tons-of-skills-marketplace.
curiositech/some_claude_skills
Multi-agent coordination daemon for coding agents. An agent skill from curiositech/some_claude_skills.
fossasia/eventyay
A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.
Ibrahim-3d/orchestrator-supaconductor
Technical leadership guidance for engineering teams, architecture decisions, and technology strategy.
Ibrahim-3d/orchestrator-supaconductor
A skill your agent uses when working with Conductor's context-driven development methodology, managing project context artifacts, or understanding the relationship between product.md, tech-stack.md…
Ibrahim-3d/orchestrator-supaconductor
Creates specialized worker agents dynamically from templates.
Ibrahim-3d/orchestrator-supaconductor
Simulate a 5-member expert board deliberation for major decisions.
Ibrahim-3d/orchestrator-supaconductor
A skill your agent uses when completing a track that changes pricing, AI models, product features, or asset pipelines — syncs business context documents across all tiers.
Ibrahim-3d/orchestrator-supaconductor
Load project context efficiently for Conductor workflows. An agent skill from Ibrahim-3d/orchestrator-supaconductor.
Categories
File-based message queue for inter-agent coordination. An agent skill from Ibrahim-3d/orchestrator-supaconductor. Message Bus is an agent skill from Ibrahim-3d/orchestrator-supaconductor. File-based message queue for inter-agent coordination.
Message Bus fits situations like: tasks that involve Multi-agent orchestration; tasks that involve Event-driven systems.
Run `npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a claude-code`. Or copy the skill folder (skills/message-bus in Ibrahim-3d/orchestrator-supaconductor) into .claude/skills/message-bus in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a codex`. Or copy the skill folder (skills/message-bus in Ibrahim-3d/orchestrator-supaconductor) into .agents/skills/message-bus in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ibrahim-3d/orchestrator-supaconductor --skill message-bus -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/message-bus, .gemini/skills/message-bus, .github/skills/message-bus and .opencode/skills/message-bus in your project.
Going by SKILL.md and its folder, Message Bus needs Python for the scripts in its folder. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Message Bus is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Message Bus: Flow Nexus Swarm (ruvnet/agentic-flow, 816 stars), Agent Signal Pipeline (lobehub/lobehub, 83k stars), Nookplot (BankrBot/skills, 1.2k stars) and Lindy Reference Architecture (jeremylongshore/tons-of-skills-marketplace, 2.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Ibrahim-3d (a GitHub user) maintains it in Ibrahim-3d/orchestrator-supaconductor, which has 380 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on September 27, 2026.
Source: Ibrahim-3d/orchestrator-supaconductor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.