{"repo":"NousResearch/hermes-agent","public_id":"30897","display_label":"kanban unblock multi-word reason argparse bug","summary":"A bug where argparse rejected multi-word reasons for the kanban unblock command, and a fix adding a --reason flag to unblock for symmetry with block.","subsystem":"hermes_cli","counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":34411,"merged_at":"2026-05-29T06:41:44+00:00"},"resolution":{"state":"resolved","by":"pr-34411"},"freshness":{"state":"verified","last_verified_at":"2026-05-29T06:41:44+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":30897,"pr_number":34411,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-05-29T06:41:44+00:00"}],"members":[{"kind":"issue","number":30897,"title":"[Bug]: hermes kanban unblock <id> <reason...> argparse fails on multi-word reasons (works for block)","url":null,"state":"closed"},{"kind":"pr","number":30915,"title":"fix(kanban): argparse rejects multi-word reasons for unblock (fixes #30897)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"ae6817f7f735735d8b6bf928c672002df0fca07a","number":0},{"kind":"pr","value":"#30897","number":30897},{"kind":"pr","value":"#34411","number":34411}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":34411,"title":"fix(kanban): add --reason flag to unblock for symmetry with block (#30897)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/kanban.py","scripts/release.py"],"fix_hunks":[{"file":"hermes_cli/kanban.py","hunks":["@@ -548,6 +548,11 @@ def build_parser(parent_subparsers: argparse._SubParsersAction) -> argparse.Argu\n                             help=\"Additional task ids to schedule with the same reason (bulk mode)\")\n \n     p_unblock = sub.add_parser(\"unblock\", help=\"Return one or more blocked/scheduled tasks to ready\")\n+    p_unblock.add_argument(\n+        \"--reason\",\n+        default=None,\n+        help=\"Optional reason/note — recorded as a comment before unblocking. Quote multi-word reasons.\",\n+    )\n     p_unblock.add_argument(\"task_ids\", nargs=\"+\")\n \n     p_promote = sub.add_parser(","@@ -1978,14 +1983,20 @@ def _cmd_unblock(args: argparse.Namespace) -> int:\n     if not ids:\n         print(\"at least one task_id is required\", file=sys.stderr)\n         return 1\n+    reason = getattr(args, \"reason\", None)\n+    if reason is not None:\n+        reason = reason.strip() or None\n+    author = _profile_author() if reason else None\n     failed: list[str] = []\n     with kb.connect_closing() as conn:\n         for tid in ids:\n+            if reason:\n+                kb.add_comment(conn, tid, author, f\"UNBLOCK: {reason}\")\n             if not kb.unblock_task(conn, tid):\n                 failed.append(tid)\n                 print(f\"cannot unblock {tid} (not blocked/scheduled?)\", file=sys.stderr)\n             else:\n-                print(f\"Unblocked {tid}\")\n+                print(f\"Unblocked {tid}\" + (f\": {reason}\" if reason else \"\"))\n     return 0 if not failed else 1\n \n "]},{"file":"scripts/release.py","hunks":["@@ -59,6 +59,7 @@\n     \"[redacted:email]\": \"wangpuv\",\n     \"202622897+ticketclosed-wontfix@users.noreply.github.com\": \"ticketclosed-wontfix\",\n     \"[redacted:email]\": \"victorGPT\",\n+    \"211828103+julio-cloudvisor@users.noreply.github.com\": \"julio-cloudvisor\",\n     # teknium (multiple emails)\n     \"[redacted:email]\": \"teknium1\",\n     \"[redacted:email]\": \"kenyonxu\",\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}