diff --git a/gateway/platforms/matrix.py b/gateway/platforms/matrix.py
index f7837a1f7d69e..bb562da5ca605 100644
--- a/gateway/platforms/matrix.py
+++ b/gateway/platforms/matrix.py
@@ -2795,10 +2795,7 @@ def _protect_html(html_fragment: str) -> str:
result = re.sub(
r"\[([^\]]+)\]\(([^)]+)\)",
lambda m: _protect_html(
- '{}'.format(
- MatrixAdapter._sanitize_link_url(m.group(2)),
- _html_escape(m.group(1)),
- )
+ f'{_html_escape(m.group(1))}'
),
result,
)
diff --git a/gateway/run.py b/gateway/run.py
index 367adbe61db19..60742dee90312 100644
--- a/gateway/run.py
+++ b/gateway/run.py
@@ -14016,7 +14016,7 @@ async def _flush_buffer() -> None:
else:
await adapter.send(
chat_id,
- "❌ Hermes update failed (exit code {}).".format(exit_code),
+ f"❌ Hermes update failed (exit code {exit_code}).",
metadata=metadata,
)
logger.info("Update finished (exit=%s), notified %s", exit_code, session_key)
diff --git a/hermes_cli/main.py b/hermes_cli/main.py
index 2a6fb9e4435e3..1fde7d8942169 100644
--- a/hermes_cli/main.py
+++ b/hermes_cli/main.py
@@ -10076,9 +10076,7 @@ def cmd_profile(args):
print(f"{copied} bundled skills synced.")
else:
print(
- "⚠ Skills could not be seeded. Run `{} update` to retry.".format(
- name
- )
+ f"⚠ Skills could not be seeded. Run `{name} update` to retry."
)
# Create wrapper alias
diff --git a/hermes_cli/pairing.py b/hermes_cli/pairing.py
index 101a1d10bc776..e89fc99f5141f 100644
--- a/hermes_cli/pairing.py
+++ b/hermes_cli/pairing.py
@@ -88,8 +88,8 @@ def _cmd_approve(store, platform: str, code: str):
)
print(f" Lockout clears in ~{mins} minute(s).")
print(
- " To reset sooner, delete the '_lockout:{0}' entry from "
- "~/.hermes/platforms/pairing/_rate_limits.json\n".format(platform)
+ f" To reset sooner, delete the '_lockout:{platform}' entry from "
+ "~/.hermes/platforms/pairing/_rate_limits.json\n"
)
else:
print(f"\n Code '{code}' not found or expired for platform '{platform}'.")
diff --git a/hermes_cli/plugins.py b/hermes_cli/plugins.py
index 2218172aa5882..07cac579bcce9 100644
--- a/hermes_cli/plugins.py
+++ b/hermes_cli/plugins.py
@@ -1092,8 +1092,8 @@ def discover_and_load(self, force: bool = False) -> None:
if not is_enabled:
loaded = LoadedPlugin(manifest=manifest, enabled=False)
loaded.error = (
- "not enabled in config (run `hermes plugins enable {}` to activate)"
- .format(lookup_key)
+ f"not enabled in config (run `hermes plugins enable {lookup_key}` to activate)"
+
)
self._plugins[lookup_key] = loaded
logger.debug(
diff --git a/pyproject.toml b/pyproject.toml
index ae2472b7a1051..ee5430ce5dffd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -257,7 +257,7 @@ preview = true # required for PLW1514 (unspecified-encoding) — preview rule
# which silently corrupts any non-ASCII file content. We had three
# separate Windows sandbox regressions in one debug session before
# adding the explicit encoding. This rule keeps new code honest.
-select = ["PLW1514"]
+select = ["UP032", "PLW1514"]
[tool.ruff.lint.per-file-ignores]
# Tests can intentionally exercise locale-encoding edge cases.
diff --git a/tools/skill_manager_tool.py b/tools/skill_manager_tool.py
index 4ce5f06e4c936..2b773e612d030 100644
--- a/tools/skill_manager_tool.py
+++ b/tools/skill_manager_tool.py
@@ -525,7 +525,7 @@ def _create_skill(name: str, content: str, category: str = None) -> Dict[str, An
result["category"] = category
result["hint"] = (
"To add reference files, templates, or scripts, use "
- "skill_manage(action='write_file', name='{}', file_path='references/example.md', file_content='...')".format(name)
+ f"skill_manage(action='write_file', name='{name}', file_path='references/example.md', file_content='...')"
)
return result