secrets: a placeholder may carry a fallback, and web search stops being a Settings field
An unset ${SEARXNG_URL} failed the whole navi-web connection, all three of its
tools and not only search, because resolve_secrets raises on any placeholder it
cannot fill. The rule is right for credentials, where a blank value quietly
becomes anonymous access, and wrong for a setting, where an empty SearXNG URL
costs one backend rather than the server. ${NAME:-fallback} (POSIX-ish, empty
fallback allowed) says which is which, and writing the fallback down makes it a
decision in the config instead of an accident of a variable nobody set.

Settings.brave_search_api_key and .searxng_url were read by nothing — the
navi-web server has its own config — so they go, with docs/config.md pointing at
mcp_servers.d/navi-web.json and deploy/env.template naming SEARXNG_URL where a
deploy actually sets it.

The literal-secret guard still holds: a placeholder name is a credential unless
it is in SETTINGS_VARIABLES, and a settings placeholder must sit in an env block.
1 parent 974fd2d commit 7d879e2b968b369d415988689f555e1fabe43250
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 1 day ago
Showing 6 changed files
View
deploy/env.template
View
docs/config.md
View
navi/config.py
View
navi/mcp/secrets.py
View
tests/unit/mcp/test_no_literal_secrets.py
View
tests/unit/mcp/test_secrets.py