Primary finding
Breaking-change detection on untrusted release bodies has no length cap before regex/scan, contradicting 'treat as untrusted' constraint
- skills/ai-framework-watch/SKILL.md:105-117
- skills/ai-framework-watch/SKILL.md:238-240
Step 3 truncates `body_first_line` to 240 chars via jq, which mitigates injection risk for the body, but `name` (release name) and `tag_name` are passed through untruncated and then rendered into the article and notify payload (steps 7 & 11). A maliciously crafted release name from a watched repo could contain prompt-injection text or markdown that breaks the table render, and is not sanitized before being rendered to the article or sent via `./notify`. The constraints section warns about this but the steps do not enforce truncation/escaping on `name`/`tag_name`.
Recommendation
Add truncation (e.g. `name | .[0:120]`) and pipe-character escaping to `name` in step 3's jq, and apply the same to `tag_name` before rendering. Reinforce in step 7 that all maintainer-supplied strings must be escaped for markdown tables.