hermes - 💡(How to fix) Fix [Feature]: Per-board kanban.orchestrator_profile override

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Root Cause

hermes_cli/kanban_decompose.py:_resolve_orchestrator_profile reads from cfg["kanban"]["orchestrator_profile"] only — no per-board lookup:

def _resolve_orchestrator_profile(cfg: dict) -> str:
    kanban_cfg = cfg.get("kanban", {}) if isinstance(cfg, dict) else {}
    explicit = (kanban_cfg.get("orchestrator_profile") or "").strip()
    if explicit:
        if profiles_mod.profile_exists(explicit):
            return explicit
    return profiles_mod.get_active_profile_name() or "default"

The CLI already has kanban boards set-default-workdir <slug> for per-board workdir, but no equivalent for orchestrator.

Fix Action

Fix / Workaround

  • Multi-project setups: separate boards for separate projects, each with its own orchestrator persona.
  • Dashboard correctness: per-board label reflects actual routing behavior.
  • Auto-decompose: when an orchestration card lands on board X, the dispatcher should claim it on behalf of X's orchestrator, not the global default.

Workarounds today

Code Example

def _resolve_orchestrator_profile(cfg: dict) -> str:
    kanban_cfg = cfg.get("kanban", {}) if isinstance(cfg, dict) else {}
    explicit = (kanban_cfg.get("orchestrator_profile") or "").strip()
    if explicit:
        if profiles_mod.profile_exists(explicit):
            return explicit
    return profiles_mod.get_active_profile_name() or "default"

---

kanban:
  orchestrator_profile: default  # global fallback
  boards:
    gtm:
      orchestrator_profile: gtm_orchestrator
    research:
      orchestrator_profile: research_lead

---

hermes kanban boards set-orchestrator <slug> <profile>
hermes kanban boards set-orchestrator <slug>          # clears (uses global)

---
RAW_BUFFERClick to expand / collapse

Problem or Use Case

[Feature] Per-board kanban.orchestrator_profile override

Problem

kanban.orchestrator_profile in ~/.hermes/config.yaml is global, not per-board. When multiple boards exist on a single Hermes install (e.g. default for general work + gtm for a specific project), they all share one orchestrator profile.

The dashboard's per-board "Orchestrator" display reads this global value, so for every board it shows the same orchestrator. Setting kanban.orchestrator_profile=gtm_orchestrator to fix the gtm board's label means the default board now also routes to gtm_orchestrator (which is wrong — its SOUL is hardcoded to a specific workdir and decomposition rules).

Root cause

hermes_cli/kanban_decompose.py:_resolve_orchestrator_profile reads from cfg["kanban"]["orchestrator_profile"] only — no per-board lookup:

def _resolve_orchestrator_profile(cfg: dict) -> str:
    kanban_cfg = cfg.get("kanban", {}) if isinstance(cfg, dict) else {}
    explicit = (kanban_cfg.get("orchestrator_profile") or "").strip()
    if explicit:
        if profiles_mod.profile_exists(explicit):
            return explicit
    return profiles_mod.get_active_profile_name() or "default"

The CLI already has kanban boards set-default-workdir <slug> for per-board workdir, but no equivalent for orchestrator.

Proposed Solution

Proposal

Add per-board orchestrator config, with global as fallback:

Option A — config.yaml nesting:

kanban:
  orchestrator_profile: default  # global fallback
  boards:
    gtm:
      orchestrator_profile: gtm_orchestrator
    research:
      orchestrator_profile: research_lead

Option B — board metadata in kanban.db (consistent with how board names live): Add an orchestrator_profile column to the boards metadata table; expose via:

hermes kanban boards set-orchestrator <slug> <profile>
hermes kanban boards set-orchestrator <slug>          # clears (uses global)

_resolve_orchestrator_profile would take a board: str | None arg and check per-board first, fall back to global, fall back to active profile.

Why this matters

  • Multi-project setups: separate boards for separate projects, each with its own orchestrator persona.
  • Dashboard correctness: per-board label reflects actual routing behavior.
  • Auto-decompose: when an orchestration card lands on board X, the dispatcher should claim it on behalf of X's orchestrator, not the global default.

Workarounds today

  • Hardcode board="gtm" into the orchestrator's kanban_create calls in SOUL.md (works but couples persona to one board).
  • Drive decomposition manually with hermes -p <orchestrator> -z "..." instead of relying on auto-decompose.

Related

  • #30678 — same family ("board scoping is leaky" — HERMES_KANBAN_DB outranks explicit board in worker env).
  • #30966 (closed) — max_in_progress per-gateway voluntary; called out the broader pattern of kanban config that should be db-global authoritative rather than per-process.

Environment

  • macOS 26.5
  • Hermes installed at ~/.hermes/hermes-agent
  • Single user, multi-board (default + gtm)

Alternatives Considered

No response

Feature Type

Configuration option

Scope

None

Contribution

  • I'd like to implement this myself and submit a PR

Debug Report (optional)

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - 💡(How to fix) Fix [Feature]: Per-board kanban.orchestrator_profile override