- translate.py: new "nav" job mode (Hello.modes opt-in) — the whole
navigation hierarchy crosses as one nested Markdown list of pending
titles, decomposed back by align_nav: item count/depth must match or
the job is rejected wholesale (titles fall back to scoped jobs);
items failing title checks individually are skipped to scoped jobs.
Dispatched ahead of per-title jobs; a lone pending title stays scoped.
- article jobs carry the already-translated menu title and parent title
as contexts, so the injected heading can match the menu while the
model may adapt the in-article title to the content.
- llm_translator.py: nav mode + nav_prompt; article prompt takes the
title/location context; API keys from per-provider env vars only
(KIMI/MOONSHOT/OPENAI_API_KEY, each sent only to its own host;
LLM_API_KEY generic) — no CLI flag, no config file; Kimi Code /coding
endpoint support (sampling fields dropped, reasoning_effort from
config, field-proven with k3-256k at low effort); errors include the
response body; verbose per-job logging with the raw response incl.
thinking (stripped from results); Kimi models announce all languages.