skill_view returns a skill's full text, so bundled SKILL.md files are
part of the request surface: skill content loaded into a later request
travels verbatim to the provider. OpenRouter's gateway classifier treats
the angle-bracket tool placeholder documented in three bundled skills as
a role-tag injection attempt and rejects the whole request with HTTP 403
("Request blocked: prompt injection patterns detected"); Hermes'
per-provider retries then fail the same way, leaving the conversation
unrecoverable on that provider.
Switch the three documented placeholders to the brace form already used
by skills/autonomous-ai-agents/hermes-agent/references/native-mcp.md:
- skills/software-development/hermes-agent-skill-authoring/SKILL.md
(CLI-wrapper invocation example)
- skills/autonomous-ai-agents/claude-code/SKILL.md (MCP tool naming)
- optional-skills/creative/unreal-mcp/SKILL.md (tool-search mode)
Add tests/tools/test_bundled_skill_doc_placeholders.py, a data-driven
guard that scans the bundled skills tree (skills/ and optional-skills/,
skipping hub caches) for the angle-bracket tool placeholder and lists
every offending file:line. The scanned token is assembled from fragments
so the guard itself never carries the literal.
Note for operators: the hub index cache (skills/.hub/index-cache/) is
not tracked by git. After pulling this change, rebuild the cache so
runtime-loaded skill text picks up the corrected placeholders.
Fixes#132504
(cherry picked from commit c080bc17ae0cf133af90399aa09bdee3d818f7af)