# NousResearch/hermes-agent · Kanban archived-board resurrection bugs and fixes

## Open now

- 4 issues, 6 PRs open on GitHub.
- #35211: \[Bug\]: Archived kanban board instantly resurrected by gateway dispatcher — Archive appears to not work
- #61908: kanban: 'boards rm' (archive) has no restore path; manual recovery can silently drop open tasks
- #61945: fix(kanban): create_board/board_exists blind to _archived/ — concurrent connect can fabricate live board over archived slug
- #67888: Deleting/archiving a kanban board while the gateway is running causes it to be silently recreated (race condition), plus a false-positive corrupt-board auto-quarantine
- PR #26057: feat: add explicit planning, self-review, autonomous execution, memory retrieval, multimodal verification, and editing verification guidance
- PR #35208: fix(gateway): guard kanban board_dir before connect() to prevent archived board resurrection
- PR #37654: fix(kanban): stop connect() from auto-creating board directories (archived board resurrection)
- PR #43286: fix(kanban): refuse to create DB for archived boards
- PR #61937: fix(kanban): add boards restore for archived boards
- PR #62029: fix(kanban): refuse create_board over archived slug instead of fabricating empty live board (#61945)

The majority of these items concern a cluster of related bugs where archived or deleted kanban boards are silently recreated as empty stubs by gateway ticks, stale pointers, or concurrent connect() calls, along with associated fixes and guards. A small number of unrelated desktop and account items are also present.

## TL;DR

- 26 member(s): 4 open issue(s), 8 closed issue(s), 6 open PR(s), 3 merged PR(s), 5 PR(s) closed without merging.
- A fix was merged to main in PR #20183. Verify it addresses your case.
- **Recommended:** read PR #20183 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `partially_resolved` · deciding PR(s): `pr-20183,pr-133995`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.07`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Open related issues

- #35211: \[Bug\]: Archived kanban board instantly resurrected by gateway dispatcher — Archive appears to not work
- #61908: kanban: 'boards rm' (archive) has no restore path; manual recovery can silently drop open tasks
- #61945: fix(kanban): create_board/board_exists blind to _archived/ — concurrent connect can fabricate live board over archived slug
- #67888: Deleting/archiving a kanban board while the gateway is running causes it to be silently recreated (race condition), plus a false-positive corrupt-board auto-quarantine

## Closed / duplicate issues

- #10641: \[Feature\]: DELETE YOUR ACCOUNT
- #20055: Kanban should not silently synthesize/create boards from a stale current-board pointer
- #21858: close,delete
- #23139: \[Bug\]: kanban boads rm --delete does not delete boards
- #23833: Kanban archive race: remove_board() doesn't clear _INITIALIZED_PATHS, causing empty DB + no such table: task_events
- #26046: kanban: boards rm --delete ineffective when gateway is running (board auto-resurrects)
- #43243: \[Bug\]: Kanban dashboard/watch paths can resurrect archived/deleted boards as empty DB-only stubs
- #47369: \[Feature\] Archive/delete conversations from Desktop sidebar

## Prior & competing PRs

- **#20069: fix(cli): validate kanban current-board pointer to stop silent synth/create**. closed without merge · fix tier `suggested`
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#20063`
  - _suggested-tier fix detail withheld; re-request with `?tier=all` to include it._
- **#20183: fix(kanban): ignore stale current board pointers (salvages #20063)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `hermes_cli/kanban_db.py`, `scripts/release.py`, `tests/hermes_cli/test_kanban_boards.py`
  - fix hunks:
  - `hermes_cli/kanban_db.py`

    ```diff
    @@ -190,12 +190,12 @@ def get_current_board() -> str:
         1. ``HERMES_KANBAN_BOARD`` env var (set by the dispatcher on worker
            spawn, or manually for ad-hoc overrides).
         2. ``<root>/kanban/current`` on disk (set by ``hermes kanban boards
    -       switch``).
    +       switch``), but only when that board still exists.
         3. ``DEFAULT_BOARD`` (``"default"``).
     
    -    A malformed slug at any step falls through to the next layer with a
    -    best-effort warning — the dispatcher must never crash because a user
    -    hand-edited a file.
    +    A malformed or stale slug at any step falls through to the next layer
    +    with a best-effort warning — the dispatcher must never crash because a
    +    user hand-edited a file or removed a board directory.
         """
         env = os.environ.get("HERMES_KANBAN_BOARD", "").strip()
         if env:
    ```

    ```diff
    @@ -212,7 +212,7 @@ def get_current_board() -> str:
                 if val:
                     try:
                         normed = _normalize_board_slug(val)
    -                    if normed:
    +                    if normed and board_exists(normed):
                             return normed
                     except ValueError:
                         pass
    ```
  - `scripts/release.py`

    ```diff
    @@ -81,6 +81,7 @@
         # Curator fixes (Apr 30 2026)
         "[redacted:email]": "y0shua1ee",
         "[redacted:email]": "0xDevNinja",
    +    "[redacted:email]": "steezkelly",
         "[redacted:email]": "heyitsaamir",
         "[redacted:email]": "johnncenae",
         "[redacted:email]": "ThomassJonax",
    ```
  - `tests/hermes_cli/test_kanban_boards.py`

    ```diff
    @@ -160,6 +160,15 @@ def test_file_pointer_honoured(self, fresh_home):
             kb.set_current_board("filepick")
             assert kb.get_current_board() == "filepick"
     
    +    def test_stale_file_pointer_falls_back_to_default(self, fresh_home):
    +        current = fresh_home / "kanban" / "current"
    +        current.parent.mkdir(parents=True, exist_ok=True)
    +        current.write_text("missing-board\n", encoding="utf-8")
    +
    +        assert kb.get_current_board() == "default"
    +        assert not kb.board_exists("missing-board")
    +        assert [b["slug"] for b in kb.list_boards()] == ["default"]
    +
         def test_env_beats_file(self, fresh_home, monkeypatch):
             kb.create_board("a")
             kb.create_board("b")
    ```
- **#26061: fix(kanban): prevent deleted boards from being resurrected by gateway ticks**. closed without merge · fix tier `suggested`
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#26046`
  - _suggested-tier fix detail withheld; re-request with `?tier=all` to include it._
- **#28366: fix(kanban): clear _INITIALIZED_PATHS in remove_board so recycled DBs re-init schema (#23852)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `hermes_cli/kanban_db.py`, `tests/hermes_cli/test_kanban_boards.py`
- **#133995: fix(kanban): read/watch paths no longer resurrect archived or deleted boards (#43243)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `hermes_cli/kanban_boards.py`, `hermes_cli/kanban_db.py`, `hermes_cli/kanban_db_boards.py`, `hermes_cli/kanban_db_connect.py`, `plugins/kanban/dashboard/plugin_api.py`, `tests/hermes_cli/test_kanban_boards.py`, `tests/hermes_cli/test_kanban_core_functionality.py`, `tests/plugins/test_kanban_board_lifecycle_api.py`, `tests/plugins/test_kanban_dashboard_plugin.py`
- **#20063: fix(kanban): ignore stale current board pointers**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#20183`
- **#23852: fix(kanban): clear _INITIALIZED_PATHS in remove_board so recycled DBs re-init schema**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `d62964cdfaa2de446372a920ac7a1d4e269beb42`, `#28366`
- **#26057: feat: add explicit planning, self-review, autonomous execution, memory retrieval, multimodal verification, and editing verification guidance**. open
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#26046`, `#23139`, `#23833`, `#23852`, `#23900`
  - files: `.github/workflows/contributor-check.yml`, `.github/workflows/deploy-site.yml`, `.github/workflows/docker-publish.yml`, `.github/workflows/docs-site-checks.yml`, `.github/workflows/lint.yml`, `.github/workflows/nix-lockfile-fix.yml`, `.github/workflows/nix.yml`, `.github/workflows/osv-scanner.yml`, `.github/workflows/skills-index.yml`, `.github/workflows/supply-chain-audit.yml`, `.github/workflows/tests.yml`, `.github/workflows/uv-lockfile-check.yml`, `agent/prompt_builder.py`, `run_agent.py`, `tests/agent/test_prompt_builder.py`, `tests/run_agent/test_run_agent.py`
- **#35208: fix(gateway): guard kanban board_dir before connect() to prevent archived board resurrection**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `1c68f6f81f6ff5f94ceb1b6933f2524e59e5f9c8`
  - files: `gateway/run.py`
- **#35537: fix(kanban): stop connect() from auto-creating board directories (archived board resurrection)**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#35208`, `#35211`, `#35208`, `#26046`, `#23139`
- **#37654: fix(kanban): stop connect() from auto-creating board directories (archived board resurrection)**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`
  - files: `hermes_cli/kanban_db.py`
- **#43286: fix(kanban): refuse to create DB for archived boards**. open
  - maintainer direction: category `stale_abandoned`; implication `active`
  - files: `hermes_cli/kanban_db_connect.py`, `tests/hermes_cli/test_kanban_db.py`
- **#61937: fix(kanban): add boards restore for archived boards**. open
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `#61945`
  - files: `hermes_cli/kanban_boards.py`, `hermes_cli/kanban_db.py`, `hermes_cli/kanban_db_boards.py`, `hermes_cli/kanban_parser.py`, `tests/hermes_cli/test_kanban_boards.py`, `website/docs/reference/cli-commands.md`, `website/docs/user-guide/features/kanban.md`
- **#62029: fix(kanban): refuse create_board over archived slug instead of fabricating empty live board (#61945)**. open
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `aaebc0a0c`
  - files: `hermes_cli/kanban_db.py`, `tests/hermes_cli/test_kanban_boards.py`

## Fix status

- Merged to main in PR #20183 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-10-07`.
- Subsystem: `agent`
