058e620bef
`hermes kanban specify|decompose`, the dashboard specify/decompose routes and the gateway auto-decomposer all reach the LLM through hermes_cli/kanban_specify.py::_call_aux outside any agent turn. No conversation affinity scope is bound there, so agent/opencode_affinity.py resolved an empty key and sent no `x-opencode-session`; the OpenCode Go relay rejects such requests with 400 MissingSessionID and the user sees "Specify failed: LLM error: BadRequestError". Declare a per-task affinity scope (`kanban:<task_id>`) around the call — the same host-declared scope the main turn, compression and the OpenRouter/Portal sticky keys already resolve first — but only when no scope is bound, so an in-turn caller keeps its conversation's key. Reset in a finally so nothing leaks past the call. Live: real httpx transport capture against auxiliary.triage_specifier provider=opencode-go — before: no x-opencode-session header; after: `kanban:t_45567533` on specify and decompose, stable per task, distinct per task; a pre-declared scope is preserved; an openai route gets no header. Fixes #112043 Co-authored-by: KoNit-K <124019182+KoNit-K@users.noreply.github.com>