{"repo":"NousResearch/hermes-agent","public_id":"10467","display_label":"TUI /q alias conflict: quit vs queue","summary":"Multiple bug reports and fix attempts addressing a command alias collision where '/q' resolves to '/quit' instead of '/queue' in the TUI. The fixes involve removing the 'q' alias from the quit command and assigning it to the queue command.","subsystem":"gateway","counts":{"members":12,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":4,"merged_prs":2,"attempt_prs":6},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":10538},"resolution":{"state":"partially_resolved","by":"pr-10538,pr-32074"},"freshness":{"state":"verified","last_verified_at":"2026-05-25T12:48:47+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.1787878787878788},"fix_edges":[{"issue_number":7220,"pr_number":10538,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":10467,"pr_number":10538,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":10467,"pr_number":32074,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":31983,"pr_number":32074,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":10467,"title":"Bug: /queue alias q is shadowed by /quit in command registry","url":null,"state":"closed"},{"kind":"issue","number":14712,"title":"CLI command alias collision: /q resolves to quit, making queue shorthand unreachable","url":null,"state":"closed"},{"kind":"issue","number":18927,"title":"[Bug]: TUI /q alias incorrectly mapped to quit instead of queue","url":null,"state":"closed"},{"kind":"issue","number":31983,"title":"TUI: /q alias resolves to /quit instead of /queue","url":null,"state":"closed"},{"kind":"pr","number":10538,"title":"fix: remove 'q' alias from /quit so /queue's 'q' alias works","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/commands.py","tests/hermes_cli/test_commands.py"],"fix_hunks":[{"file":"hermes_cli/commands.py","hunks":["@@ -164,7 +164,7 @@ class CommandDef:\n \n     # Exit\n     CommandDef(\"quit\", \"Exit the CLI\", \"Exit\",\n-               cli_only=True, aliases=(\"exit\", \"q\")),\n+               cli_only=True, aliases=(\"exit\",)),\n ]\n \n "]},{"file":"tests/hermes_cli/test_commands.py","hunks":["@@ -97,7 +97,7 @@ def test_canonical_name_resolves(self):\n     def test_alias_resolves_to_canonical(self):\n         assert resolve_command(\"bg\").name == \"background\"\n         assert resolve_command(\"reset\").name == \"new\"\n-        assert resolve_command(\"q\").name == \"quit\"\n+        assert resolve_command(\"q\").name == \"queue\"\n         assert resolve_command(\"exit\").name == \"quit\"\n         assert resolve_command(\"gateway\").name == \"platforms\"\n         assert resolve_command(\"set-home\").name == \"sethome\"\n"]}]},{"kind":"pr","number":14681,"title":"fix(tui): remove 'q' alias from /quit, add to /queue","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#32074","number":32074},{"kind":"pr","value":"#31985","number":31985}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":14957,"title":"fix: stabilization fixes and architectural enhancements","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#14712","number":14712},{"kind":"pr","value":"#12176","number":12176},{"kind":"pr","value":"#12184","number":12184},{"kind":"pr","value":"#12190","number":12190},{"kind":"pr","value":"#12108","number":12108},{"kind":"pr","value":"#24276","number":24276},{"kind":"pr","value":"#23255","number":23255},{"kind":"pr","value":"#14712","number":14712},{"kind":"pr","value":"#12176","number":12176}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":18928,"title":"fix(tui): move /q alias from quit to queue","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#14681","number":14681}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":18941,"title":"fix(tui): remap /q alias from quit to queue (#18927)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"3b4ecf8ee","number":0},{"kind":"pr","value":"#18927","number":18927}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":31985,"title":"fix(tui): drop /quit alias 'q' so /q routes to backend /queue","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#14681","number":14681},{"kind":"pr","value":"#31983","number":31983},{"kind":"pr","value":"#14681","number":14681},{"kind":"pr","value":"#14681","number":14681}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":32074,"title":"fix(tui): remap /q alias from quit to queue (salvage #14681 + #31985)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["scripts/release.py","ui-tui/src/__tests__/slashParity.test.ts","ui-tui/src/app/slash/commands/core.ts"],"fix_hunks":[{"file":"scripts/release.py","hunks":["@@ -1308,6 +1308,8 @@\n     \"[redacted:email]\": \"wanwan2qq\",  # PR #10215 (strip brackets/quotes from /resume; gateway session-ID lookup)\n     \"[redacted:email]\": \"SimoKiihamaki\",  # PR #30773 (Windows /reset+/new freeze; stdin fallback for modal)\n     \"[redacted:email]\": \"Tranquil-Flow\",  # PR #27518 (bracketed-paste timeout)\n+    \"[redacted:email]\": \"8bit64k\",  # PR #14681 (TUI /q alias from quit to queue)\n+    \"[redacted:email]\": \"hclsys\",  # PR #31985 (TUI /q alias regression test)\n }\n \n "]},{"file":"ui-tui/src/__tests__/slashParity.test.ts","hunks":["@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'\n \n import { describe, expect, it } from 'vitest'\n \n-import { SLASH_COMMANDS } from '../app/slash/registry.js'\n+import { findSlashCommand, SLASH_COMMANDS } from '../app/slash/registry.js'\n \n type CommandRoute = 'fallback' | 'local' | 'native'\n ","@@ -110,4 +110,14 @@ describe('slash parity matrix', () => {\n       expect(routes[name], `mutating command must not fallback: ${name}`).not.toBe('fallback')\n     }\n   })\n+\n+  it('/q alias resolves to queue, not quit (#31983)', () => {\n+    // Regression for #31983: the TUI `quit` command used to carry alias `q`,\n+    // which collided with the Python-side `/queue` alias. TUI-local commands\n+    // dispatch before the backend, so `/q` resolved to /quit (session.die)\n+    // instead of queueing a prompt.\n+    const cmd = findSlashCommand('q')\n+    expect(cmd, '/q must resolve to a command').toBeDefined()\n+    expect(cmd!.name).toBe('queue')\n+  })\n })"]},{"file":"ui-tui/src/app/slash/commands/core.ts","hunks":["@@ -110,7 +110,7 @@ export const coreCommands: SlashCommand[] = [\n   },\n \n   {\n-    aliases: ['exit', 'q'],\n+    aliases: ['exit'],\n     help: 'exit hermes',\n     name: 'quit',\n     run: (_arg, ctx) => ctx.session.die()","@@ -547,6 +547,7 @@ export const coreCommands: SlashCommand[] = [\n   },\n \n   {\n+    aliases: ['q'],\n     help: 'inspect or enqueue a message',\n     name: 'queue',\n     run: (arg, ctx) => {\n"]}]},{"kind":"pr","number":49523,"title":"fix: stabilization fixes and architectural enhancements","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#48290","number":48290},{"kind":"pr","value":"#14909","number":14909},{"kind":"pr","value":"#14913","number":14913},{"kind":"pr","value":"#14957","number":14957}],"category":"superseded_by_pr","implication":"superseded"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}