Nothing open on GitHub. Fix merged in #9172. Check it covers your case.
The short answer
- Known?
- Yes. 5 related items grouped here, 1 issue already closed.
- Fix event
- A fix was merged to main in PR #9172. Check it covers your case. No release data is tracked.
- Tracker
- The maintainers' tracker marks this
unresolved. That is separate from the fix event. - Still open
- Nothing open on GitHub.
These issues and pull requests address adding and correcting a China-specific domestic provider configuration for Kimi/Moonshot users, ensuring the correct regional endpoint is used during setup and operation.
Open issues0
Open PRs0
Fixes on record
-
#9172 feat(providers): add kimi-coding-cn provider for mainland China users
files:
.env.example,agent/auxiliary_client.py,agent/model_metadata.py,agent/models_dev.py,hermes_cli/auth.py,hermes_cli/config.py,hermes_cli/doctor.py,hermes_cli/main.py,hermes_cli/model_normalize.py,hermes_cli/models.py,hermes_cli/providers.py,hermes_cli/runtime_provider.py,hermes_cli/setup.py,trajectory_compressor.py,website/docs/getting-started/quickstart.md,website/docs/integrations/providers.md,website/docs/reference/environment-variables.md,website/docs/user-guide/configuration.mdShow the diff
-
.env.example@@ -43,6 +43,7 @@ # KIMI_BASE_URL=https://api.kimi.com/coding/v1 # Default for sk-kimi- keys # KIMI_BASE_URL=https://api.moonshot.ai/v1 # For legacy Moonshot keys # KIMI_BASE_URL=https://api.moonshot.cn/v1 # For Moonshot China keys +# KIMI_CN_API_KEY= # Dedicated Moonshot China key # ============================================================================= # LLM PROVIDER (MiniMax) -
agent/auxiliary_client.py@@ -64,6 +64,8 @@ "zhipu": "zai", "kimi": "kimi-coding", "moonshot": "kimi-coding", + "kimi-cn": "kimi-coding-cn", + "moonshot-cn": "kimi-coding-cn", "minimax-china": "minimax-cn", "minimax_cn": "minimax-cn", "claude": "anthropic", @@ -94,6 +96,7 @@ def _normalize_aux_provider(provider: Optional[str]) -> str: "gemini": "gemini-3-flash-preview", "zai": "glm-4.5-flash", "kimi-coding": "kimi-k2-turbo-preview", + "kimi-coding-cn": "kimi-k2-turbo-preview", "minimax": "MiniMax-M2.7", "minimax-cn": "MiniMax-M2.7", "anthropic": "claude-haiku-4-5-20251001", -
agent/model_metadata.py@@ -24,7 +24,7 @@ # are preserved so the full model name reaches cache lookups and server queries. _PROVIDER_PREFIXES: frozenset[str] = frozenset({ "openrouter", "nous", "openai-codex", "copilot", "copilot-acp", - "gemini", "zai", "kimi-coding", "minimax", "minimax-cn", "anthropic", "deepseek", + "gemini", "zai", "kimi-coding", "kimi-coding-cn", "minimax", "minimax-cn", "anthropic", "deepseek", "opencode-zen", "opencode-go", "ai-gateway", "kilocode", "alibaba", "qwen-oauth", "xiaomi", @@ -32,7 +32,7 @@ # Common aliases "google", "google-gemini", "google-ai-studio", "glm", "z-ai", "z.ai", "zhipu", "github", "github-copilot", - "github-models", "kimi", "moonshot", "claude", "deep-seek", + "github-models", "kimi", "moonshot", "kimi-cn", "moonshot-cn", "claude", "deep-seek", "opencode", "zen", "go", "vercel", "kilo", "dashscope", "aliyun", "qwen", "mimo", "xiaomi-mimo", "qwen-portal", @@ -211,6 +211,7 @@ def _is_custom_endpoint(base_url: str) -> bool: "api.anthropic.com": "anthropic", "api.z.ai": "zai", "api.moonshot.ai": "kimi-coding", + "api.moonshot.cn": "kimi-coding-cn", "api.kimi.com": "kimi-coding", "api.minimax": "minimax", "dashscope.aliyuncs.com": "alibaba", -
agent/models_dev.py@@ -148,6 +148,7 @@ class ProviderInfo: "openai-codex": "openai", "zai": "zai", "kimi-coding": "kimi-for-coding", + "kimi-coding-cn": "kimi-for-coding", "minimax": "minimax", "minimax-cn": "minimax-cn", "deepseek": "deepseek", -
hermes_cli/auth.py@@ -160,6 +160,13 @@ class ProviderConfig: api_key_env_vars=("KIMI_API_KEY",), base_url_env_var="KIMI_BASE_URL", ), + "kimi-coding-cn": ProviderConfig( + id="kimi-coding-cn", + name="Kimi / Moonshot (China)", + auth_type="api_key", + inference_base_url="https://api.moonshot.cn/v1", + api_key_env_vars=("KIMI_CN_API_KEY",), + ), "minimax": ProviderConfig( id="minimax", name="MiniMax", @@ -892,6 +899,7 @@ def resolve_provider( "glm": "zai", "z-ai": "zai", "z.ai": "zai", "zhipu": "zai", "google": "gemini", "google-gemini": "gemini", "google-ai-studio": "gemini", "kimi": "kimi-coding", "kimi-for-coding": "kimi-coding", "moonshot": "kimi-coding", + "kimi-cn": "kimi-coding-cn", "moonshot-cn": "kimi-coding-cn", "minimax-china": "minimax-cn", "minimax_cn": "minimax-cn", "claude": "anthropic", "claude-code": "anthropic", "github": "copilot", "github-copilot": "copilot", -
hermes_cli/config.py@@ -816,6 +816,14 @@ def _ensure_hermes_home_managed(home: Path): "category": "provider", "advanced": True, }, + "KIMI_CN_API_KEY": { + "description": "Kimi / Moonshot China API key", + "prompt": "Kimi (China) API key", + "url": "https://platform.moonshot.cn/", + "password": True, + "category": "provider", + "advanced": True, + }, "MINIMAX_API_KEY": { "description": "MiniMax API key (international)", "prompt": "MiniMax API key", @@ -2452,6 +2460,7 @@ def load_config() -> Dict[str, Any]: # nous (OAuth — hermes auth) — Nous Portal # zai (ZAI_API_KEY) — Z.AI / GLM # kimi-coding (KIMI_API_KEY) — Kimi / Moonshot +# kimi-coding-cn (KIMI_CN_API_KEY) — Kimi / Moonshot (China) # minimax (MINIMAX_API_KEY) — MiniMax # minimax-cn (MINIMAX_CN_API_KEY) — MiniMax (China) # @@ -2495,6 +2504,7 @@ def load_config() -> Dict[str, Any]: # nous (OAuth — hermes auth) — Nous Portal # zai (ZAI_API_KEY) — Z.AI / GLM # kimi-coding (KIMI_API_KEY) — Kimi / Moonshot +# kimi-coding-cn (KIMI_CN_API_KEY) — Kimi / Moonshot (China) # minimax (MINIMAX_API_KEY) — MiniMax # minimax-cn (MINIMAX_CN_API_KEY) — MiniMax (China) # -
hermes_cli/doctor.py@@ -721,6 +721,7 @@ def run_doctor(args): _apikey_providers = [ ("Z.AI / GLM", ("GLM_API_KEY", "ZAI_API_KEY", "Z_AI_API_KEY"), "https://api.z.ai/api/paas/v4/models", "GLM_BASE_URL", True), ("Kimi / Moonshot", ("KIMI_API_KEY",), "https://api.moonshot.ai/v1/models", "KIMI_BASE_URL", True), + ("Kimi / Moonshot (China)", ("KIMI_CN_API_KEY",), "https://api.moonshot.cn/v1/models", None, True), ("DeepSeek", ("DEEPSEEK_API_KEY",), "https://api.deepseek.com/v1/models", "DEEPSEEK_BASE_URL", True), ("Hugging Face", ("HF_TOKEN",), "https://router.huggingface.co/v1/models", "HF_BASE_URL", True), ("Alibaba/DashScope", ("DASHSCOPE_API_KEY",), "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/models", "DASHSCOPE_BASE_URL", True), -
hermes_cli/main.py@@ -1045,6 +1045,7 @@ def select_provider_and_model(args=None): "gemini": "Google AI Studio", "zai": "Z.AI / GLM", "kimi-coding": "Kimi / Moonshot", + "kimi-coding-cn": "Kimi / Moonshot (China)", "minimax": "MiniMax", "minimax-cn": "MiniMax (China)", "opencode-zen": "OpenCode Zen", @@ -1079,6 +1080,7 @@ def select_provider_and_model(args=None): ("gemini", "Google AI Studio (Gemini models — OpenAI-compatible endpoint)"), ("zai", "Z.AI / GLM (Zhipu AI direct API)"), ("kimi-coding", "Kimi / Moonshot (Moonshot AI direct API)"), + ("kimi-coding-cn", "Kimi / Moonshot China (Moonshot CN direct API)"), ("minimax", "MiniMax (global direct API)"), ("minimax-cn", "MiniMax China (domestic direct API)"), ("kilocode", "Kilo Code (Kilo Gateway API)"), @@ -1205,7 +1207,7 @@ def _named_custom_provider_map(cfg) -> dict[str, dict[str, str]]: _model_flow_anthropic(config, current_model) elif selected_provider == "kimi-coding": _model_flow_kimi(config, current_model) - elif selected_provider in ("gemini", "zai", "minimax", "minimax-cn", "kilocode", "opencode-zen", "opencode-go", "ai-gateway", "alibaba", "huggingface", "xiaomi"): + elif selected_provider in ("gemini", "zai", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "opencode-zen", "opencode-go", "ai-gateway", "alibaba", "huggingface", "xiaomi"): _model_flow_api_key_provider(config, selected_provider, current_model) # ── Post-switch cleanup: clear stale OPENAI_BASE_URL ────────────── @@ -4626,7 +4628,7 @@ def main(): ) chat_parser.add_argument( "--provider", - choices=["auto", "openrouter", "nous", "openai-codex", "copilot-acp", "copilot", "anthropic", "gemini", "huggingface", "zai", "kimi-coding", "minimax", "minimax-cn", "kilocode", "xiaomi"], + choices=["auto", "openrouter", "nous", "openai-codex", "copilot-acp", "copilot", "anthropic", "gemini", "huggingface", "zai", "kimi-coding", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "xiaomi"], default=None, help="Inference provider (default: auto)" ) -
hermes_cli/model_normalize.py@@ -88,6 +88,7 @@ _MATCHING_PREFIX_STRIP_PROVIDERS: frozenset[str] = frozenset({ "zai", "kimi-coding", + "kimi-coding-cn", "minimax", "minimax-cn", "alibaba", -
hermes_cli/models.py@@ -158,6 +158,12 @@ def _codex_curated_models() -> list[str]: "kimi-k2-turbo-preview", "kimi-k2-0905-preview", ], + "kimi-coding-cn": [ + "kimi-k2.5", + "kimi-k2-thinking", + "kimi-k2-turbo-preview", + "kimi-k2-0905-preview", + ], "moonshot": [ "kimi-k2.5", "kimi-k2-thinking", @@ -488,6 +494,7 @@ def check_nous_free_tier() -> bool: "gemini": "Google AI Studio", "zai": "Z.AI / GLM", "kimi-coding": "Kimi / Moonshot", + "kimi-coding-cn": "Kimi / Moonshot (China)", "minimax": "MiniMax", "minimax-cn": "MiniMax (China)", "anthropic": "Anthropic", @@ -519,6 +526,8 @@ def check_nous_free_tier() -> bool: "google-ai-studio": "gemini", "kimi": "kimi-coding", "moonshot": "kimi-coding", + "kimi-cn": "kimi-coding-cn", + "moonshot-cn": "kimi-coding-cn", "minimax-china": "minimax-cn", "minimax_cn": "minimax-cn", "claude": "anthropic", @@ -841,7 +850,7 @@ def list_available_providers() -> list[dict[str, str]]: _PROVIDER_ORDER = [ "openrouter", "nous", "openai-codex", "copilot", "copilot-acp", "gemini", "huggingface", - "zai", "kimi-coding", "minimax", "minimax-cn", "kilocode", "anthropic", "alibaba", + "zai", "kimi-coding", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "anthropic", "alibaba", "qwen-oauth", "xiaomi", "opencode-zen", "opencode-go", "ai-gateway", "deepseek", "custom", -
hermes_cli/providers.py@@ -179,6 +179,7 @@ class ProviderDef: # kimi-for-coding (models.dev ID) "kimi": "kimi-for-coding", "kimi-coding": "kimi-for-coding", + "kimi-coding-cn": "kimi-for-coding", "moonshot": "kimi-for-coding", # minimax-cn -
hermes_cli/runtime_provider.py@@ -608,7 +608,7 @@ def _resolve_explicit_runtime( base_url = explicit_base_url if not base_url: - if provider == "kimi-coding": + if provider in ("kimi-coding", "kimi-coding-cn"): creds = resolve_api_key_provider_credentials(provider) base_url = creds.get("base_url", "").rstrip("/") else: -
hermes_cli/setup.py@@ -106,6 +106,7 @@ def _supports_same_provider_pool_setup(provider: str) -> bool: ], "zai": ["glm-5.1", "glm-5", "glm-4.7", "glm-4.5", "glm-4.5-flash"], "kimi-coding": ["kimi-k2.5", "kimi-k2-thinking", "kimi-k2-turbo-preview"], + "kimi-coding-cn": ["kimi-k2.5", "kimi-k2-thinking", "kimi-k2-turbo-preview"], "minimax": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M2.1", "MiniMax-M2"], "minimax-cn": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M2.1", "MiniMax-M2"], "ai-gateway": ["anthropic/claude-opus-4.6", "anthropic/claude-sonnet-4.6", "openai/gpt-5", "google/gemini-3-flash"], @@ -815,6 +816,7 @@ def setup_model_provider(config: dict, *, quick: bool = False): "copilot-acp": "GitHub Copilot ACP", "zai": "Z.AI / GLM", "kimi-coding": "Kimi / Moonshot", + "kimi-coding-cn": "Kimi / Moonshot (China)", "minimax": "MiniMax", "minimax-cn": "MiniMax CN", "anthropic": "Anthropic", -
trajectory_compressor.py@@ -415,7 +415,7 @@ def _detect_provider(self) -> str: return "codex" if "api.z.ai" in url: return "zai" - if "moonshot.ai" in url or "api.kimi.com" in url: + if "moonshot.ai" in url or "moonshot.cn" in url or "api.kimi.com" in url: return "kimi-coding" if "minimaxi.com" in url: return "minimax-cn" -
website/docs/getting-started/quickstart.md@@ -51,6 +51,7 @@ hermes setup # Or configure everything at once | **OpenRouter** | Multi-provider routing across many models | Enter your API key | | **Z.AI** | GLM / Zhipu-hosted models | Set `GLM_API_KEY` / `ZAI_API_KEY` | | **Kimi / Moonshot** | Moonshot-hosted coding and chat models | Set `KIMI_API_KEY` | +| **Kimi / Moonshot China** | China-region Moonshot endpoint | Set `KIMI_CN_API_KEY` | | **MiniMax** | International MiniMax endpoint | Set `MINIMAX_API_KEY` | | **MiniMax China** | China-region MiniMax endpoint | Set `MINIMAX_CN_API_KEY` | | **Alibaba Cloud** | Qwen models via DashScope | Set `DASHSCOPE_API_KEY` | -
website/docs/integrations/providers.md@@ -23,6 +23,7 @@ You need at least one way to connect to an LLM. Use `hermes model` to switch pro | **AI Gateway** | `AI_GATEWAY_API_KEY` in `~/.hermes/.env` (provider: `ai-gateway`) | | **z.ai / GLM** | `GLM_API_KEY` in `~/.hermes/.env` (provider: `zai`) | | **Kimi / Moonshot** | `KIMI_API_KEY` in `~/.hermes/.env` (provider: `kimi-coding`) | +| **Kimi / Moonshot (China)** | `KIMI_CN_API_KEY` in `~/.hermes/.env` (provider: `kimi-coding-cn`; aliases: `kimi-cn`, `moonshot-cn`) | | **MiniMax** | `MINIMAX_API_KEY` in `~/.hermes/.env` (provider: `minimax`) | | **MiniMax China** | `MINIMAX_CN_API_KEY` in `~/.hermes/.env` (provider: `minimax-cn`) | | **Alibaba Cloud** | `DASHSCOPE_API_KEY` in `~/.hermes/.env` (provider: `alibaba`, aliases: `dashscope`, `qwen`) | @@ -143,10 +144,14 @@ These providers have built-in support with dedicated provider IDs. Set the API k hermes chat --provider zai --model glm-5 # Requires: GLM_API_KEY in ~/.hermes/.env -# Kimi / Moonshot AI +# Kimi / Moonshot AI (international: api.moonshot.ai) hermes chat --provider kimi-coding --model kimi-for-coding # Requires: KIMI_API_KEY in ~/.hermes/.env +# Kimi / Moonshot AI (China: api.moonshot.cn) +hermes chat --provider kimi-coding-cn --model kimi-k2.5 +# Requires: KIMI_CN_API_KEY in ~/.hermes/.env + # MiniMax (global endpoint) hermes chat --provider minimax --model MiniMax-M2.7 # Requires: MINIMAX_API_KEY in ~/.hermes/.env @@ -167,7 +172,7 @@ hermes chat --provider xiaomi --model mimo-v2-pro Or set the provider permanently in `config.yaml`: ```yaml model: - provider: "zai" # or: kimi-coding, minimax, minimax-cn, alibaba, xiaomi + provider: "zai" # or: kimi-coding, kimi-coding-cn, minimax, minimax-cn, alibaba, xiaomi default: "glm-5" ``` @@ -854,7 +859,7 @@ You can also select named custom providers from the interactive `hermes model` m | **Cost optimization** | ClawRouter or OpenRouter with `sort: "price"` | | **Maximum privacy** | Ollama, vLLM, or llama.cpp (fully local) | | **Enterprise / Azure** | Azure OpenAI with custom endpoint | -| **Chinese AI models** | z.ai (GLM), Kimi/Moonshot, MiniMax, or Xiaomi MiMo (first-class providers) | +| **Chinese AI models** | z.ai (GLM), Kimi/Moonshot (`kimi-coding` or `kimi-coding-cn`), MiniMax, or Xiaomi MiMo (first-class providers) | :::tip You can switch between providers at any time with `hermes model` — no restart required. Your conversation history, memory, and skills carry over regardless of which provider you use. @@ -929,7 +934,7 @@ fallback_model: When activated, the fallback swaps the model and provider mid-session without losing your conversation. It fires **at most once** per session. -Supported providers: `openrouter`, `nous`, `openai-codex`, `copilot`, `copilot-acp`, `anthropic`, `huggingface`, `zai`, `kimi-coding`, `minimax`, `minimax-cn`, `deepseek`, `ai-gateway`, `opencode-zen`, `opencode-go`, `kilocode`, `xiaomi`, `alibaba`, `custom`. +Supported providers: `openrouter`, `nous`, `openai-codex`, `copilot`, `copilot-acp`, `anthropic`, `huggingface`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, `minimax-cn`, `deepseek`, `ai-gateway`, `opencode-zen`, `opencode-go`, `kilocode`, `xiaomi`, `alibaba`, `custom`. :::tip Fallback is configured exclusively through `config.yaml` — there are no environment variables for it. For full details on when it triggers, supported providers, and how it interacts with auxiliary tasks and delegation, see [Fallback Providers](/docs/user-guide/features/fallback-providers). -
website/docs/reference/environment-variables.md@@ -31,6 +31,7 @@ All variables go in `~/.hermes/.env`. You can also set them with `hermes config | `GLM_BASE_URL` | Override z.ai base URL (default: `https://api.z.ai/api/paas/v4`) | | `KIMI_API_KEY` | Kimi / Moonshot AI API key ([moonshot.ai](https://platform.moonshot.ai)) | | `KIMI_BASE_URL` | Override Kimi base URL (default: `https://api.moonshot.ai/v1`) | +| `KIMI_CN_API_KEY` | Kimi / Moonshot China API key ([moonshot.cn](https://platform.moonshot.cn)) | | `MINIMAX_API_KEY` | MiniMax API key — global endpoint ([minimax.io](https://www.minimax.io)) | | `MINIMAX_BASE_URL` | Override MiniMax base URL (default: `https://api.minimax.io/v1`) | | `MINIMAX_CN_API_KEY` | MiniMax API key — China endpoint ([minimaxi.com](https://www.minimaxi.com)) | @@ -67,7 +68,7 @@ For native Anthropic auth, Hermes prefers Claude Code's own credential files whe | Variable | Description | |----------|-------------| -| `HERMES_INFERENCE_PROVIDER` | Override provider selection: `auto`, `openrouter`, `nous`, `openai-codex`, `copilot`, `copilot-acp`, `anthropic`, `huggingface`, `zai`, `kimi-coding`, `minimax`, `minimax-cn`, `kilocode`, `xiaomi`, `alibaba`, `deepseek`, `opencode-zen`, `opencode-go`, `ai-gateway` (default: `auto`) | +| `HERMES_INFERENCE_PROVIDER` | Override provider selection: `auto`, `openrouter`, `nous`, `openai-codex`, `copilot`, `copilot-acp`, `anthropic`, `huggingface`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, `minimax-cn`, `kilocode`, `xiaomi`, `alibaba`, `deepseek`, `opencode-zen`, `opencode-go`, `ai-gateway` (default: `auto`) | | `HERMES_PORTAL_BASE_URL` | Override Nous Portal URL (for development/testing) | | `NOUS_INFERENCE_BASE_URL` | Override Nous inference API URL | | `HERMES_NOUS_MIN_KEY_TTL_SECONDS` | Min agent key TTL before re-mint (default: 1800 = 30min) | -
website/docs/user-guide/configuration.md@@ -601,7 +601,7 @@ Every model slot in Hermes — auxiliary tasks, compression, fallback — uses t When `base_url` is set, Hermes ignores the provider and calls that endpoint directly (using `api_key` or `OPENAI_API_KEY` for auth). When only `provider` is set, Hermes uses that provider's built-in auth and base URL. -Available providers for auxiliary tasks: `auto`, `openrouter`, `nous`, `codex`, `copilot`, `anthropic`, `main`, `zai`, `kimi-coding`, `minimax`, any provider registered in the [provider registry](/docs/reference/environment-variables), or any named custom provider from your `custom_providers` list (e.g. `provider: "beans"`). +Available providers for auxiliary tasks: `auto`, `openrouter`, `nous`, `codex`, `copilot`, `anthropic`, `main`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, any provider registered in the [provider registry](/docs/reference/environment-variables), or any named custom provider from your `custom_providers` list (e.g. `provider: "beans"`). :::warning `"main"` is for auxiliary tasks only The `"main"` provider option means "use whatever provider my main agent uses" — it's only valid inside `auxiliary:`, `compression:`, and `fallback_model:` configs. It is **not** a valid value for your top-level `model.provider` setting. If you use a custom OpenAI-compatible endpoint, set `provider: custom` in your `model:` section. See [AI Providers](/docs/integrations/providers) for all main model provider options.
-
3 PRs closed without merging
From the close comments: merged via another change 2 · other 1
-
#8166 fix: prompt for Moonshot platform during setup (moonshot.cn support) · merged via another change →
#9172 - #8212 feat: add moonshot-cn domestic provider for China-based Kimi/Moonshot users · other
-
#8856 fix(provider): correct moonshot-cn domestic provider for China-based Kimi/Moonshot users · merged via another change →
#9172
Closed issues · 1
- Closed#8096[Config issue]: Kimi/Moonshot provider defaults to wrong endpoint for China users
How this cluster was grouped
-
Link evidence (
structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference. -
Pairwise link density
0.40: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36.1.00means every pair is linked.
Pick up a Lab task
Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.
Open the LabAt a glance
- Merged PRs
- #9172
- Closed issues
- 1
- Attempts
- 3 PRs closed without merging
- Fix link checked
- 13 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.