{"repo":"NousResearch/hermes-agent","public_id":"10641","display_label":"Kanban archived-board resurrection bugs and fixes","summary":"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.","subsystem":"agent","counts":{"members":26,"open_issues":4,"open_issues_distinct":4,"open_prs":6,"closed_issues":8,"merged_prs":3,"attempt_prs":11},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":20183},"resolution":{"state":"partially_resolved","by":"pr-20183,pr-133995"},"freshness":{"state":"verified","last_verified_at":"2026-10-07T21:21:32+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.07003076923076923},"fix_edges":[{"issue_number":20055,"pr_number":20183,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":23833,"pr_number":28366,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":43243,"pr_number":133995,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":10641,"title":"[Feature]: DELETE YOUR ACCOUNT","url":null,"state":"closed"},{"kind":"issue","number":20055,"title":"Kanban should not silently synthesize/create boards from a stale current-board pointer","url":null,"state":"closed"},{"kind":"issue","number":21858,"title":"close,delete","url":null,"state":"closed"},{"kind":"issue","number":23139,"title":"[Bug]: kanban boads rm --delete does not delete boards","url":null,"state":"closed"},{"kind":"issue","number":23833,"title":"Kanban archive race: remove_board() doesn't clear _INITIALIZED_PATHS, causing empty DB + no such table: task_events","url":null,"state":"closed"},{"kind":"issue","number":26046,"title":"kanban: boards rm --delete ineffective when gateway is running (board auto-resurrects)","url":null,"state":"closed"},{"kind":"issue","number":35211,"title":"[Bug]: Archived kanban board instantly resurrected by gateway dispatcher — Archive appears to not work","url":null,"state":"open"},{"kind":"issue","number":43243,"title":"[Bug]: Kanban dashboard/watch paths can resurrect archived/deleted boards as empty DB-only stubs","url":null,"state":"closed"},{"kind":"issue","number":47369,"title":"[Feature] Archive/delete conversations from Desktop sidebar","url":null,"state":"closed"},{"kind":"issue","number":61908,"title":"kanban: 'boards rm' (archive) has no restore path; manual recovery can silently drop open tasks","url":null,"state":"open"},{"kind":"issue","number":61945,"title":"fix(kanban): create_board/board_exists blind to _archived/ — concurrent connect can fabricate live board over archived slug","url":null,"state":"open"},{"kind":"issue","number":67888,"title":"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","url":null,"state":"open"},{"kind":"pr","number":20063,"title":"fix(kanban): ignore stale current board pointers","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#20183","number":20183}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":20069,"title":"fix(cli): validate kanban current-board pointer to stop silent synth/create","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#20063","number":20063}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":20183,"title":"fix(kanban): ignore stale current board pointers (salvages #20063)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/kanban_db.py","scripts/release.py","tests/hermes_cli/test_kanban_boards.py"],"fix_hunks":[{"file":"hermes_cli/kanban_db.py","hunks":["@@ -190,12 +190,12 @@ def get_current_board() -> str:\n     1. ``HERMES_KANBAN_BOARD`` env var (set by the dispatcher on worker\n        spawn, or manually for ad-hoc overrides).\n     2. ``<root>/kanban/current`` on disk (set by ``hermes kanban boards\n-       switch``).\n+       switch``), but only when that board still exists.\n     3. ``DEFAULT_BOARD`` (``\"default\"``).\n \n-    A malformed slug at any step falls through to the next layer with a\n-    best-effort warning — the dispatcher must never crash because a user\n-    hand-edited a file.\n+    A malformed or stale slug at any step falls through to the next layer\n+    with a best-effort warning — the dispatcher must never crash because a\n+    user hand-edited a file or removed a board directory.\n     \"\"\"\n     env = os.environ.get(\"HERMES_KANBAN_BOARD\", \"\").strip()\n     if env:","@@ -212,7 +212,7 @@ def get_current_board() -> str:\n             if val:\n                 try:\n                     normed = _normalize_board_slug(val)\n-                    if normed:\n+                    if normed and board_exists(normed):\n                         return normed\n                 except ValueError:\n                     pass"]},{"file":"scripts/release.py","hunks":["@@ -81,6 +81,7 @@\n     # Curator fixes (Apr 30 2026)\n     \"[redacted:email]\": \"y0shua1ee\",\n     \"[redacted:email]\": \"0xDevNinja\",\n+    \"[redacted:email]\": \"steezkelly\",\n     \"[redacted:email]\": \"heyitsaamir\",\n     \"[redacted:email]\": \"johnncenae\",\n     \"[redacted:email]\": \"ThomassJonax\","]},{"file":"tests/hermes_cli/test_kanban_boards.py","hunks":["@@ -160,6 +160,15 @@ def test_file_pointer_honoured(self, fresh_home):\n         kb.set_current_board(\"filepick\")\n         assert kb.get_current_board() == \"filepick\"\n \n+    def test_stale_file_pointer_falls_back_to_default(self, fresh_home):\n+        current = fresh_home / \"kanban\" / \"current\"\n+        current.parent.mkdir(parents=True, exist_ok=True)\n+        current.write_text(\"missing-board\\n\", encoding=\"utf-8\")\n+\n+        assert kb.get_current_board() == \"default\"\n+        assert not kb.board_exists(\"missing-board\")\n+        assert [b[\"slug\"] for b in kb.list_boards()] == [\"default\"]\n+\n     def test_env_beats_file(self, fresh_home, monkeypatch):\n         kb.create_board(\"a\")\n         kb.create_board(\"b\")\n"]}]},{"kind":"pr","number":23852,"title":"fix(kanban): clear _INITIALIZED_PATHS in remove_board so recycled DBs re-init schema","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"d62964cdfaa2de446372a920ac7a1d4e269beb42","number":0},{"kind":"pr","value":"#28366","number":28366}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":26057,"title":"feat: add explicit planning, self-review, autonomous execution, memory retrieval, multimodal verification, and editing verification guidance","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#26046","number":26046},{"kind":"pr","value":"#23139","number":23139},{"kind":"pr","value":"#23833","number":23833},{"kind":"pr","value":"#23852","number":23852},{"kind":"pr","value":"#23900","number":23900}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":26061,"title":"fix(kanban): prevent deleted boards from being resurrected by gateway ticks","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#26046","number":26046}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":28366,"title":"fix(kanban): clear _INITIALIZED_PATHS in remove_board so recycled DBs re-init schema (#23852)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/kanban_db.py","tests/hermes_cli/test_kanban_boards.py"]},{"kind":"pr","number":35208,"title":"fix(gateway): guard kanban board_dir before connect() to prevent archived board resurrection","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"1c68f6f81f6ff5f94ceb1b6933f2524e59e5f9c8","number":0}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":35537,"title":"fix(kanban): stop connect() from auto-creating board directories (archived board resurrection)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#35208","number":35208},{"kind":"pr","value":"#35211","number":35211},{"kind":"pr","value":"#35208","number":35208},{"kind":"pr","value":"#26046","number":26046},{"kind":"pr","value":"#23139","number":23139}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":37654,"title":"fix(kanban): stop connect() from auto-creating board directories (archived board resurrection)","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":43286,"title":"fix(kanban): refuse to create DB for archived boards","url":null,"state":"open","close_reason":{"category":"stale_abandoned","implication":"active"},"merged":false},{"kind":"pr","number":61937,"title":"fix(kanban): add boards restore for archived boards","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#61945","number":61945}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":62029,"title":"fix(kanban): refuse create_board over archived slug instead of fabricating empty live board (#61945)","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"aaebc0a0c","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":133995,"title":"fix(kanban): read/watch paths no longer resurrect archived or deleted boards (#43243)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["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"]}],"trust":{"default_tier":"verified","includes_suggested":false}}