f8e8cacf35
`hermes config set TELEGRAM_GROUP_ALLOWED_USERS ...` (and ~290 other documented variables Hermes reads straight from os.getenv without registering them in OPTIONAL_ENV_VARS) still landed as a config.yaml top-level scalar with a notice, while the setup flows write .env and one-shot CLI readers never bridge YAML scalars — two writers, two readers. #112250 routed the registered names; this closes the class with a shape rule: any bare ^[A-Z][A-Z0-9_]*$ key is an environment setting. - set: writes .env, drops a stale config.yaml copy, never writes UPPER_SNAKE into config.yaml (--force included); the env writer's denylist (HERMES_YOLO_MODE, PATH, ...) now refuses cleanly instead of the YAML detour bridging the value into os.environ; a name neither registered nor in the environment-variables reference gets a one-line note but is still saved. - get: .env first; a leftover top-level config.yaml copy is reported as stale. - unset: removes the .env entry and the stale copy. - Registered names, credentials (credential lifecycle + masking), dotted paths and lowercase bare keys are unchanged. Fixes #111848 (first half landed in #112250).