Agora ๐Ÿ›๏ธ

August 5, 2026 ยท View on GitHub

Multi-role self-driving team plugin for Hermes Agent โ€” v1.8.8

ไธญๆ–‡ๆ–‡ๆกฃ

Agora turns Hermes into a self-driving team: multiple AI roles โ€” each a real Hermes agent subprocess with its own SOUL.md, tools, and session context โ€” discuss approaches, search the web, write content, and auto-dispatch tasks. A leader (just a worker created from the "leader" template) acts as chair in event-driven discussions, dynamically picking speakers, evaluating progress, calling votes, and summarizing outcomes. Discussion results are stored in the motions database and surfaced via agora tools. The leader plans the next phase, decides when the goal is achieved, and stops itself. Everything is managed from the Dashboard โ€” no CLI needed.

Self-Growth (v1.8.6+): Workers evolve through 2 channels: Skills (skill_manage) and SOUL.md (patch). The old memory tool has been removed โ€” MEMORY.md is written only by the discussion engine (leader) and hooks, not by workers directly.

Key Features

FeatureDescription
Unified worker modelNo separate leader concept โ€” a leader is just a worker created from the "leader" template (is_leader=true). Everything goes through worker_manager
Event-driven discussion engineLeader chairs discussions: opens topic, picks speakers dynamically, evaluates after each turn, calls votes, summarizes โ€” no fixed round-robin
Real agent subprocessesEach speaker is a real hermes -p <profile> chat -q spawn with SOUL.md, tools, and session context โ€” not a stateless LLM call
Per-project session isolationLeader uses a fresh session each heartbeat โ€” context doesn't bleed between projects
Self-Growth (2 channels)Workers evolve via Skills (skill_manage) and SOUL.md (patch). No memory tool โ€” MEMORY.md is managed by the discussion engine and hooks.
Heartbeat on project, not profileheartbeat_member, heartbeat_minutes, heartbeat_cron_id live on the project โ€” one leader can run different projects at different intervals
AGENTS.md as single source of truthProject goal, stop condition, team roster (name โ†’ role template), and active discussions are written to AGENTS.md. Hermes auto-injects it into every agent's system prompt via TERMINAL_CWD. No prompt-level duplication.
Mid-flight project updatesagora_update_project tool lets the leader change goal, description, or stop_condition without stopping the project. AGENTS.md is refreshed automatically. reactivate=true restarts a completed project with a new direction.
8 role templatesArchitect, Developer, Reviewer, Tester, DevOps, Researcher, Writer, Leader
Self-drivingHeartbeat cron wakes leader to check kanban, unblock, plan, dispatch
Auto-stopLeader outputs PROJECT_COMPLETE when stop condition is met โ†’ double confirmation required โ†’ cron auto-paused + all kanban tasks deleted (clean slate on restart)
3 kanban hookskanban_task_completed (comment + skill nudge), kanban_task_claimed (log + motion comment), kanban_task_blocked (auto-trigger discussion if design decision)
Code review workflowagora_close_task(action='submit_review') transitions a task to review status and auto-assigns to reviewer โ€” dispatcher auto-spawns the reviewer worker
Speaker 429 retry_speaker_speak detects API 429/rate-limit errors and retries up to 10 times with incremental backoff (10s, 20s, โ€ฆ, 100s), clearing session on each retry
3 bundled skillsagora-setup (operator onboarding), agora-awareness (worker framework knowledge), agora-deliberation (discussion methodology) โ€” auto-deployed to ~/.hermes/skills/collaboration/ on register
Human participationJump into discussions anytime via Dashboard input box
DashboardProjects tab (default) + Team tab (Members + Teams + Profiles sub-tabs), real-time polling, toast notifications, heartbeat control panel
Generous timeoutsAll LLM calls (speak, chair, vote, dispatch) default to 1 hour (3600s). Hermes HTTP client auto-retries on timeout; Agora subprocess timeout is the hard ceiling. Tuned for local models with long context preprocessing.

Why Agora? โ€” Structured Discussion Amplifies Ordinary Models

Most multi-agent frameworks assume you need a frontier model at every node. Agora challenges this assumption. In 5 hours of production monitoring (docmind project, local model via API relay โ€” not a frontier model), we observed:

  • An Architect correcting a Researcher's proposed sequencing, citing exact file paths and line numbers
  • A Developer overriding effort estimates with concrete numbers ("2-3 hours, not days")
  • A Tester confirming regression risk by referencing the existing 125-test suite
  • A Writer pinpointing exactly which lines of gap-analysis.md needed updating

None of these outputs required any single model to hold the full decision tree in its head. Each agent only needed to make a domain-local judgment โ€” and the structured discussion framework stitched them into a coherent decision.

How the architecture compensates for model limitations

Model weaknessAgora's structural remedy
Loses focus in long contextEach speaker sees a compact, structured history ([role (step_type)]: content), not raw conversation. Typical input: ~2000 chars.
Jumps to conclusionsStep-based flow forces: opening โ†’ speak โ†’ chair evaluates โ†’ next speaker. No skipping ahead.
Blind spots / single perspectiveChair explicitly checks "who hasn't spoken?" and dispatches them. All perspectives must be heard before closure.
Forgets prior decisionsDiscussion outcomes are stored in the motions database. Workers evolve via Skills + SOUL.md (2-channel self-growth, no memory).
Can't self-assess when stuckChair's meta-decision loop: `continue
Hallucinates without evidenceDispatch mode sends a worker to investigate with real tools (web_search, read_file, terminal) before committing to an opinion.

The chair role is different

Speakers do domain reasoning ("should we use SQLite or PostgreSQL?") โ€” single-hop, structured input, within their expertise. The chair does meta-reasoning ("has everyone spoken? are there unresolved disagreements? is this ready to close?") โ€” multi-hop, requires tracking global state.

Recommendation: If budget is constrained, use your strongest available model for the Leader/Chair, and cheaper models for the other roles. The architecture's structural constraints โ€” turn-taking, guided prompts, cross-validation โ€” compensate for weaker speakers. But the chair's meta-cognitive load benefits from a more capable model.

Install

hermes plugins install yzy806806/agora
hermes plugins enable agora
hermes gateway restart
hermes dashboard restart  # if dashboard is running

Note: Both the gateway and the dashboard need restarting after enabling. The gateway loads plugin tools/hooks; the dashboard discovers plugin sidebar tabs at startup. If you only restart the gateway, the Agora tab won't appear in the dashboard sidebar.

Quick Start

Option A: Conversational setup (no dashboard needed)

Just tell Hermes: "Install the Agora plugin and set up a development team."

Hermes reads the agora-setup skill and handles the full flow:

  1. agora_list_templates() โ€” see available roles
  2. agora_create_worker(name="leader", role="leader") โ€” create workers
  3. agora_create_team(team_name="alpha", workers=[...]) โ€” form a team
  4. agora_start_project(name="my-project", workdir="/path/to/repo", goal="...", stop_condition="...") โ€” start

Option B: Dashboard setup

Open hermes dashboard, go to the Agora tab โ†’ Team โ†’ Members:

  1. Pick a template, give the worker a name (e.g. alice, bob)
  2. Create as many workers as you need โ€” including a leader (from the "leader" template)
  3. Go to Team โ†’ Teams โ€” select workers, form a team

Templates:

TemplateIconRole
Architect๐Ÿ—๏ธSystem design, API contracts, tech selection
Developer๐Ÿ’ปImplementation, testing, dependencies
Reviewer๐Ÿ”Code review, security, edge cases
Tester๐ŸงชTest strategy, automation, bug reporting
DevOps๐Ÿš€CI/CD, deployment, infrastructure
Researcher๐Ÿ”ŽWeb research, trend analysis, information synthesis
Writerโœ๏ธContent writing, structuring, tone
Team Leader๐Ÿ‘จโ€๐Ÿ’ผProject monitoring, phase planning, completion detection

Start a project

In the Projects tab, click "Start Project":

  • Name (e.g. docmind)
  • Goal (e.g. "ๆŒ็ปญๅผ€ๅ‘docmind")
  • Stop condition (e.g. "ๆ˜“็”จๆ€งไธŽๆ€ง่ƒฝ่พพๅˆฐๆœ€ไผ˜๏ผŒๅฏนๆฏ”ๅŒ็ฑป้กน็›ฎ๏ผŒๅŠŸ่ƒฝๆ— ็ผบๅคฑ")
  • Working directory
  • Team โ€” select the team you formed
  • Heartbeat member โ€” select a leader worker
  • Heartbeat interval โ€” minutes (default: 15)

Update project mid-flight

The leader can change direction without stopping:

agora_update_project(
    name="docmind",
    goal="Add multi-tenant support and REST API v2",
    stop_condition="All v2 API endpoints tested and documented",
    reactivate=True  # restart if project was completed
)

AGENTS.md is refreshed automatically โ€” all workers see the new goal on next spawn.

AGENTS.md โ€” Single Source of Truth

AGENTS.md is auto-generated in the project workdir. Hermes auto-loads it into every agent's system prompt (leader, discussion participants, and kanban workers) via TERMINAL_CWD context file scanning.

Contents:

  • Project name, goal, status, description
  • Stop condition
  • Team members table: | Profile Name | Role (Template) |
  • Active discussions list
  • Workflow instructions

Refreshed on (atomic write โ€” temp file + os.replace):

  • start_project
  • Leader heartbeat
  • agora_update_project
  • Motion create (agora_raise_motion)
  • Motion close (agora_close_motion)

Heartbeat prompt is minimal โ€” just a wake-up call. All context comes from AGENTS.md, not prompt injection.

Tools (18)

ToolDescription
agora_raise_motionStart a team discussion
agora_get_messagesRead discussion messages
agora_get_resultGet closed discussion result
agora_list_motionsList active/closed discussions
agora_close_motionClose a stale/resolved motion
agora_create_taskCreate a kanban task
agora_close_taskClose/transition a kanban task (complete, cancel, or submit_review)
agora_start_projectStart a self-driving project
agora_stop_projectStop a project
agora_project_statusCheck project status
agora_update_projectUpdate goal/stop_condition mid-flight
agora_create_workerCreate a worker from template
agora_list_workersList all workers
agora_remove_workerRemove a worker
agora_list_templatesList role templates
agora_create_teamCreate a team
agora_list_teamsList teams
agora_remove_teamRemove a team

agora_close_task actions (v1.8.6+):

  • complete โ€” mark task as done
  • cancel โ€” archive the task
  • submit_review โ€” transition to review status, auto-assign to reviewer. The kanban dispatcher auto-spawns the reviewer worker. After the reviewer completes, the task goes to done.

Note: All tool handlers return JSON strings (auto-serialized via _wrap_handler / _wrap_handler_async). Hermes tool registry requires str, not dict.

Kanban Hooks

HookWhenAction
kanban_task_completedWorker finishes a taskWrite motion result to motions DB (not workers โ€” memory removed in v1.8.7); if complex task (>1 run or >30min), write skill-creation nudge comment
kanban_task_claimedDispatcher assigns a taskLog claim; inject motion decision as task comment
kanban_task_blockedWorker blocks a taskIf reason mentions "design decision" or "motion" โ†’ auto-create discussion

Timeout Configuration

All LLM-related timeouts default to 1 hour (3600s):

ScenarioDefaultNotes
Speakerๅ‘่จ€ (speak_timeout)3600sWorker spawned to discuss
Chair่ฏ„ไผฐ (chair_timeout)3600sLeader evaluates discussion state
Dispatch/่ฐƒ็ ”3840sspeak_timeout + 240s buffer
ๆŠ•็ฅจ3600sSame as speak_timeout
spawn_agent_speak3600sFunction default
spawn_chair_speak3600sFunction default

Hermes HTTP client auto-retries on timeout. Agora subprocess timeout is the hard ceiling โ€” if exceeded, the worker is marked as failed and the discussion continues.

Architecture

agora/
โ”œโ”€โ”€ plugin.yaml                  # Plugin manifest (18 tools + hooks)
โ”œโ”€โ”€ __init__.py                  # register(ctx)
โ”œโ”€โ”€ tools/__init__.py            # 18 tool definitions + _wrap_handler
โ”œโ”€โ”€ cli.py                       # hermes agora CLI
โ”œโ”€โ”€ hooks/__init__.py            # 3 kanban hooks
โ”œโ”€โ”€ project_planner.py           # Project lifecycle + heartbeat + AGENTS.md (atomic) + on_project_complete deletes tasks
โ”œโ”€โ”€ agora/
โ”‚   โ”œโ”€โ”€ utils.py                 # Shared utilities
โ”‚   โ”œโ”€โ”€ discussion/
โ”‚   โ”‚   โ”œโ”€โ”€ driver.py            # DiscussionDriver (speak/chair/vote/dispatch) + _speaker_speak 429 retry (10x)
โ”‚   โ”‚   โ”œโ”€โ”€ agent_spawn.py       # Spawn Hermes agent subprocesses (3600s timeout)
โ”‚   โ”‚   โ”œโ”€โ”€ chair.py             # Chair prompts + speaker prompt builder
โ”‚   โ”‚   โ””โ”€โ”€ roles.py             # Discussion templates
โ”‚   โ”œโ”€โ”€ storage/motions.py       # SQLite storage (WAL + busy_timeout=5000)
โ”‚   โ”œโ”€โ”€ session_manager.py       # Session size tracking + rotation (profile-specific state.db)
โ”‚   โ”œโ”€โ”€ worker_templates.py      # 8 role templates (SOUL.md rendering, 2-channel Self-Growth)
โ”‚   โ”œโ”€โ”€ worker_manager.py        # Worker lifecycle (fcntl-locked sessions, _patch_config_toolsets)
โ”‚   โ”œโ”€โ”€ team_manager.py          # Team + dispatch routing
โ”‚   โ””โ”€โ”€ leader_loop.py           # Heartbeat + stuck motion rescue + stale state cleanup (leader: no terminal)
โ”œโ”€โ”€ dashboard/                   # Web UI + REST API
โ”‚   โ”œโ”€โ”€ plugin_api.py            # FastAPI routes
โ”‚   โ””โ”€โ”€ dist/                    # Compiled React frontend
โ””โ”€โ”€ skills/
    โ”œโ”€โ”€ agora-setup/             # Operator onboarding guide
    โ”œโ”€โ”€ agora-awareness/         # Worker framework knowledge
    โ””โ”€โ”€ agora-deliberation/      # Discussion methodology

License

MIT

Changelog

v1.8.8 โ€” Speaker 429 retry (10x) + delete tasks on project completion

  • _speaker_speak 429 retry โ€” When a worker hits API 429 (rate limit) during discussion, the error message was stored directly as the worker's speech โ€” the discussion continued with empty contributions. Now detects 429/rate-limit/authorization-failed errors and retries up to 10 times with incremental backoff (10s, 20s, โ€ฆ, 100s). Session is cleared on each retry for a fresh start.
  • on_project_complete deletes all kanban tasks โ€” Previously, when a project completed, only the heartbeat was stopped and status set to completed. All tasks remained in the kanban DB. On restart with a new goal, the leader saw old tasks and tried PROJECT_COMPLETE immediately. Now deletes all project tasks from all tables (tasks, task_events, task_comments, task_runs, task_links). Clean slate on restart.

v1.8.7 โ€” Delete tasks on completion + memory removal + toolset fixes

  • Delete all kanban tasks on project completion โ€” on_project_complete now calls delete_archived_task() for every task in the project. On restart, the kanban is empty.
  • Worker Self-Growth: 3 channels โ†’ 2 โ€” Removed memory tool from workers. Self-Growth is now Skills (skill_manage) + SOUL.md (patch) only. Cross-project memory was not useful (different projects, different stacks); skills already capture reusable knowledge with better structure.
  • Leader toolset: removed memory โ€” Leader doesn't need it; skills + SOUL.md suffice.
  • Fixed patch toolset warning โ€” patch is part of file, not a standalone toolset.

v1.8.6 โ€” Worker toolsets + submit_review + AGENTS.md improvements

  • Worker toolsets written to config.yaml from template โ€” Previously the template's toolsets field was dead code; config.yaml was copied from global root (hermes-cli = all tools). Now _patch_config_toolsets() writes the template's toolsets into platform_toolsets.cli during worker creation.
    • Worker toolsets (all 7 roles): terminal, file, web, skills, todo, session_search. Removed: browser, tts, vision, code_execution, computer_use, cronjob, delegation, clarify, memory.
    • Leader template toolsets: file, web, skills, todo, session_search (overridden in leader_loop.py spawn to add agora โ€” no terminal).
  • submit_review action added to agora_close_task โ€” Developers submit via agora_close_task(action='submit_review'). Transitions task to review status, auto-assigns to reviewer. Dispatcher auto-spawns the reviewer. After review, task goes to done. Leader does NOT need to create separate review tasks.
  • AGENTS.md Kanban Summary includes review status โ€” Shows Review count + "In review" task list + "Ready (queued)" task list.
  • Leader SOUL.md Step 2: granular crash escalation โ€” 5-level escalation: crashed 1-2x โ†’ retry; >2x same worker โ†’ reassign/split; running >3 heartbeats โ†’ raise motion; review stuck >2 heartbeats โ†’ check reviewer.
  • AGENTS.md Workflow section updated โ€” Developer: submit_review when team has reviewer. Other roles: kanban complete. "Never use Python, terminal, or direct DB calls" warning. Recent Decisions filters 0-step bypassed motions.

v1.8.5 โ€” Leader restricted toolset + SOUL.md rewrite

  • Leader toolset restricted โ€” no terminal โ€” Changed leader spawn toolset from hermes-cli (all tools) to file, web, skills, todo, session_search, agora. The leader can no longer bypass agora_raise_motion by calling Python/DB directly via terminal, run tests, or modify project code. Only read files, edit own SOUL.md/MEMORY.md (patch), create skills (skill_manage), and manage project via agora tools.
  • SOUL.md rewrite โ€” Identity: removed "reading code, tests" from assess role. Core Constraints: "may read project docs, NEVER write project code". Post-Heartbeat Skill Review (replaces Post-Task โ€” leader doesn't execute tasks). Self-Growth: "record what you learned, not what you did"; patch only.
  • Worker SOUL.md shared sections โ€” 4 improvements โ€” Discussion Protocol: fixed terminal contradiction. Post-Task Skill Review: broadened for all roles. Self-Growth: patch only, no write_file. Researcher: removed duplicate Discussion Protocol section.

v1.8.0 โ€” Full code audit: motion guards, discussion quality, truncation fix, 20 bug fixes

Comprehensive code review (OCR standard mode + subagent audit) identified and fixed 20 issues across 7 files:

Critical:

  • agora_close_motion adopted guard โ€” cannot close a motion as "adopted" with 0 discussion steps or 0 messages. Prevents leader from bypassing the discussion engine.
  • File descriptor leak โ€” log_fd opened per heartbeat but never closed in parent process. Now closed after Popen.
  • Discussion min_steps floor โ€” chair can no longer close/vote before max(3, len(participants)) steps. Ensures every participant gets at least one turn.

High:

  • Motion threshold guidance โ€” SOUL.md now has explicit "Do NOT raise a motion for" list (routine assessment, stale cleanup, duplicate topics, recent stop-condition checks).
  • Stop condition cooldown โ€” heartbeat prompt includes complete_count reminder to prevent re-evaluation.
  • _has_pending_tasks includes blocked โ€” was excluding blocked tasks, causing premature "all done" signals.
  • Tenant strip bug โ€” replace("agora-", "") โ†’ removeprefix("agora-") to avoid stripping interior matches.
  • _infer_stance oppose matching โ€” substring match โ†’ regex word boundary, same as support check.
  • agora_close_task missing commit โ€” conn.commit() added before conn.close().
  • chair.py f-string injection โ€” literal curly braces in user input no longer cause KeyError.
  • utils.py model regex escape โ€” re.escape(model) added.
  • reactivate cron HERMES_HOME โ€” already fixed in v1.7.0, confirmed applied.

Medium:

  • Output truncation 2000โ†’8000 โ€” discussion context, task context, and task body all increased from 2000 to 8000 chars.
  • _build_history per-message 500โ†’1000 โ€” more context for chair evaluation.
  • Unused Optional import removed from driver.py.
  • max_steps=0 edge case guarded.
  • max_steps default detection uses None sentinel instead of == 30.
  • Misleading tool count log corrected.
  • except Exception: pass โ†’ logger.warning(...) in 5 critical locations.
  • reactivate validates heartbeat_member before proceeding.
  • Stale cleanup timestamp added to avoid running every heartbeat.

v1.7.1 โ€” Post-Task Skill Review: mandatory skill creation in worker SOUL.md

  • Root cause of 0 self-created skills identified: Hermes' background skill review runs as a daemon thread after the turn completes, but worker processes (hermes -p <profile> --cli chat -Q -q "...") exit immediately after the task, killing the thread before it can run.
  • Fix: Post-Task Skill Review section in SOUL.md โ€” all worker roles now have a mandatory "Before calling kanban_complete, review your work for reusable knowledge" step. Workers create skills during the task turn using skill_manage(action='create'), not after via a background thread.
  • Updated worker_templates.py (render_soul now appends _POST_TASK_SKILL_REVIEW to every role) and all 7 deployed SOUL.md files.
  • Cleaned motion record garbage from reviewer/architect/researcher/writer memory (40KB โ†’ <1KB total).

v1.7.0 โ€” Discussion speaker tool access + chair retry + task management

  • Discussion speakers now have full tool access โ€” changed --toolsets agora to --toolsets hermes-cli in agent_spawn.py. Previously, discussion participants (architect, developer, researcher, tester, reviewer, writer) only had the 17 Agora tools โ€” no terminal, read_file, search_files, web_search, web_extract. This caused 112+ messages across two projects where workers reported they couldn't read code, run tests, or research reference projects. Now speakers have all built-in tools + Agora tools. (Note: In v1.8.6, this was further refined โ€” speakers now use the worker template toolsets: terminal, file, web, skills, todo, session_search, not the full hermes-cli.)
  • Chair open/evaluate retry on non-JSON โ€” when the chair (leader) returns a non-JSON response, the discussion driver retries once with a stronger "respond with JSON ONLY" prompt before aborting. Prevents decision=error, steps=0 motions caused by occasional LLM formatting failures.
  • spawn_discussion_driver uses global ~/.hermes/agora/ โ€” runner scripts and log files now always go to the global agora directory, not the profile-scoped HERMES_HOME. Fixes the issue where leader heartbeat created runner scripts in ~/.hermes/profiles/leader/agora/ but they couldn't be found by other processes.
  • Stuck motion auto-cleanup โ€” motions stuck at steps=0 for more than 5 minutes are now automatically closed as error by _rescue_stuck_motions. Previously these stayed in discussing forever, blocking leader from closing them.
  • Kanban task counts filtered by tenant โ€” _count_tasks() now accepts a tenant parameter. Dashboard project list and detail views show per-project task counts instead of global totals. Fixes "kanban count not resetting" for new projects.
  • New agora_close_task tool โ€” leader can now close stale blocked/running tasks directly (action=complete or cancel) without needing kanban CLI or HERMES_KANBAN_TASK env var. SOUL.md updated with stale task cleanup instructions. (In v1.8.6, a submit_review action was added for code review workflow.)
  • complete_count initialized on new project โ€” new projects now start with complete_count: 0 and completion_check_pos: 0 instead of None.
  • Researcher SOUL.md strengthened โ€” researcher must use web_search, web_extract, terminal, and read_file to investigate topics. Cannot rely on memory alone. Must read reference project source code before giving recommendations.

v1.6.2 โ€” Leader fresh session + AGENTS.md enhancement + kanban gate

  • Leader uses fresh session every heartbeat โ€” no more --resume. Accumulated session history caused attention degradation: leader repeated already-completed motions, ignored SOUL.md constraints, claimed "no running tasks" without checking. Context now comes entirely from AGENTS.md + MEMORY.md + SOUL.md.
  • AGENTS.md enhanced โ€” now includes Kanban Summary (running/ready/blocked/done counts + task list), Last heartbeat timestamp, and Recent Decisions (last 3 adopted motions). Gives fresh-session leader full project state.
  • PROJECT_COMPLETE kanban gate โ€” check_project_complete now queries kanban by tenant before counting PROJECT_COMPLETE. If running/ready/blocked tasks exist, rejects with [SYSTEM] PROJECT_COMPLETE rejected message in log. Multi-project safe (tenant-filtered).
  • Cleaned worker memory โ€” 5 workers had ~34K chars of stale motion records (pre-v1.4.7 hooks). Cleaned to only retain technical experience.

v1.6.1 โ€” Code audit fixes + task creation guardrails

  • start_project reactivate now detects stale cron โ€” same stale-detection logic as update_project: verifies cron_id against hermes cron list before reuse.
  • stop_project / on_project_complete clear heartbeat_cron_id โ€” previously deleted the cron job but left the stale ID in project JSON, causing reactivate to skip cron creation.
  • Task creation guardrails in SOUL.md + heartbeat prompt โ€” leader must check existing tasks before creating new ones (prevent duplicates); must never assign tasks to self (leader is facilitator, not implementer).
  • Fixed tool count in log โ€” 16 โ†’ 17 (agora_update_project added in v1.5.0).

v1.6.0 โ€” Reactivate fix: reset completion state + heartbeat prompt

  • Reactivate now resets complete_count, leader_session_id, completion_check_pos โ€” Previously, reactivating a completed project left stale completion state. Leader would read old memory, see complete_count > 0, and immediately output PROJECT_COMPLETE without evaluating the new goal.
  • Heartbeat prompt warns about goal changes โ€” Added "If the goal or stop condition has changed since your last heartbeat, treat this as a NEW project phase. Do NOT carry over previous PROJECT_COMPLETE decisions."
  • Reactivate verifies cron job existence โ€” Checks hermes cron list to detect stale cron IDs (deleted during PROJECT_COMPLETE but still in project JSON).
  • start_project preserves existing project data โ€” No longer overwrites all fields when project already exists (from v1.5.9, now also in reactivate path).
  • Schema expanded โ€” agora_start_project now accepts description, stop_condition, team. workdir no longer required for existing projects.
  • Verified end-to-end โ€” Reactivated docmind project with new goal, leader correctly identified new phase, raised motions, team discussed and adopted, tasks being assigned.

v1.5.9 โ€” Fix start_project overwriting existing project data

  • agora_start_project no longer overwrites existing projects โ€” if a project already exists, it preserves all fields (team, goal, stop_condition, heartbeat_member, etc.) and only reactivates. Previously, calling start_project on an existing project would reset everything to defaults.
  • Schema expanded โ€” added description, stop_condition, team parameters. workdir is no longer required (preserved from existing project). All new params only override if non-empty.
  • Heartbeat cron auto-recreated โ€” if a reactivated project has heartbeat_member but no heartbeat_cron_id, the cron job is automatically recreated.

v1.5.8 โ€” Dashboard project settings UI

  • Project Settings panel in dashboard Overview tab โ€” edit goal and stop_condition inline, reactivate completed/stopped projects with one click. Calls PUT /api/plugins/agora/projects/{name}.
  • Added agora-form-field and agora-input CSS classes.

v1.5.7 โ€” Hermes v0.18.2 compatibility fix

  • kanban_db.add_comment signature changed โ€” now requires author parameter. Updated all 3 call sites in hooks.
  • Compatibility verified against Hermes v0.18.2 (2026.7.7.2):
    • ctx.register_tool / register_hook / register_cli_command โ€” unchanged โœ…
    • kanban hooks (claimed/completed/blocked) โ€” still in VALID_HOOKS โœ…
    • _normalize_handler_result requires str โ€” Agora uses _wrap_handler โœ…
    • Task class fields (tenant, body, assignee, started_at, completed_at) โ€” unchanged โœ…
    • create_task / block_task / get_task โ€” backward compatible โœ…
    • AGENTS.md context file loading โ€” unchanged โœ…

v1.5.6 โ€” Timeout unification + tool handler fix + dashboard emoji + onboarding

  • All LLM timeouts unified to 1 hour (3600s) โ€” speak_timeout, chair_timeout, vote, dispatch, spawn defaults. Removed min(speak_timeout, 240) cap. Local models with long context preprocessing need generous timeouts.
  • Tool handler return type fix โ€” Hermes registry requires str (JSON), not dict. Added _wrap_handler / _wrap_handler_async at module level. All 17 tools now register and return correctly.
  • Dashboard emoji encoding โ€” JS byte escapes (\xF0\x9F) โ†’ Unicode escapes (\uXXXX). Fixed garbled รฐ โ†’ ๐Ÿ‘‘.
  • agora-setup skill โ€” New onboarding skill for operators (step-by-step: create workers, form teams, start projects).
  • Dead code cleanup โ€” Removed _build_active_motions_summary() (superseded by AGENTS.md).

v1.5.2 โ€” AGENTS.md as single source of truth + project updates

  • AGENTS.md now contains: goal, stop_condition, team members (name โ†’ role template), active discussions. Written atomically (temp + rename). Refreshed on: start_project, heartbeat, project update, motion create/close.
  • Heartbeat prompt simplified โ€” 6 lines, no more inline context injection. All context via AGENTS.md auto-load.
  • agora_update_project tool โ€” change goal/stop_condition mid-flight. reactivate=true restarts completed projects.
  • Motion memory cleanup โ€” decision records only written to leader's MEMORY.md, not workers. Workers keep their own technical experience.
  • Skill creation nudge โ€” complex tasks (>1 run or >30min) get a kanban comment prompting the worker to save reusable workflows.
  • 17 tools (added agora_update_project).

v1.4.4โ€“v1.4.6 โ€” Code audit fixes

  • Chair prompt: prevent false truncation calls
  • Driver: MAX_SAME_SPEAKER=2 hard limit
  • _has_pending_tasks() now accepts project_name with tenant filter
  • SQLite busy_timeout=5000 for concurrent safety
  • _find_project_for_task() uses task.tenant instead of string matching
  • Worker session JSON uses fcntl.flock for concurrent safety
  • Stale discussion_state cleanup on every heartbeat
  • Session manager queries profile-specific state.db
  • 15 issues fixed across 3 releases

v1.4.3 โ€” Discussion state consistency and stale motion recovery

  • discussion_state cleaned on close
  • Stuck discussions with messages recovered
  • agora_close_motion tool added
  • Speaker session preserved on timeout
  • Timeout increased (900s/300s)

v1.4.0โ€“v1.4.2 โ€” Discussion engine reliability

  • Session-not-found recovery
  • Empty tool argument handling
  • Stale memory poisoning fix
  • Dead session cleanup
  • Code cleanup and hardcoded path fixes

v1.3.0 โ€” Discussion engine critical fixes

  • Leader and participants now get --toolsets agora (later changed to hermes-cli in v1.7.0, then refined to specific toolsets in v1.8.6)
  • Stuck motion recovery via _rescue_stuck_motions()