Job ID: 76ce033272c7
Run Time: 2026-07-25 16:10:04
Schedule: 0 16 *
[IMPORTANT: The user has invoked the "news-briefings" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]
name: news-briefings
description: "Research current events and deliver formatted news briefings to the user's messaging platform (Telegram/WhatsApp). Covers one-shot news queries and recurring cron-based news briefings — aggregating from RSS feeds via curl, structuring summaries by region/topic, and delivering to the user's preferred channel."
version: 1.3.0
metadata:
hermes:
tags: [news, current-events, rss, briefing, delivery, telegram, whatsapp, cron]
prerequisites: {}
Research and deliver current-events briefings to the user's messaging platform. Supports two modes:
When the user asks for news/current events, gather from multiple RSS feeds using curl (browser dependency may be unavailable). Good free RSS sources:
BBC World: https://feeds.bbci.co.uk/news/world/rss.xml
NYT World: https://rss.nytimes.com/services/xml/rss/nyt/World.xml
Le Monde: https://www.lemonde.fr/international/rss_full.xml
France Info: https://www.francetvinfo.fr/monde.rss (⚠️ /monde/rss → 404, utiliser .rss)
France 24: https://www.france24.com/fr/rss
Hacker News: https://news.ycombinator.com/
Apple Newsroom: https://www.apple.com/newsroom/
The Guardian: https://www.theguardian.com/tone/news
⚠️ Avoid sources with aggressive anti-bot protection — Some sites (Reuters/DataDome, Google News, DuckDuckGo, Bing, Searx) are systematically blocked from certain server IPs. When curl hits these, the connection may get a TCP reset that propagates as a "Broken pipe" (Errno 32) crash, killing the whole agent run — far worse than a simple HTTP error. For one-shot queries, if these fail, just skip them. For cron jobs, remove them from the prompt entirely — a runtime error crashes the agent, and "skip and continue" won't help if curl itself segfaults on a blocked domain.
Use delegate_task for heavier research (multiple feeds → extraction → structured summary) so the main thread stays responsive. Pass toolsets=["terminal"] for simple RSS parsing.
For parallel research on multiple topics, use the tasks= array form:
delegate_task(tasks=[
{"goal": "Research {topic A}", "toolsets": ["terminal"]},
{"goal": "Research {topic B}", "toolsets": ["terminal"]},
])
This runs up to 3 subagents concurrently.
Pitfall: delegate_task is for ONE-SHOT queries only. Do NOT use it in cron job prompts — cron agents cannot use delegate_task.
Format with clear sections by region/topic. Use emoji markers per region:
Each section: 2-3 bullet points max. Bold the headline item (not the emoji). Include source attribution at end.
Check the user's preferred delivery platform:
The send_message(action='list') may not show platforms even when they're configured. If the platform is defined in .env (TELEGRAM_BOT_TOKEN, etc.), try send_message(target='telegram') directly — it routes to the home channel.
Set up automated daily/weekly briefings that deliver directly to the user's messaging platform on a schedule.
Use cronjob(action='create') with:
skills=["news-briefings"] to load this skill automatically"0 16 " for daily at 16h, "0 16 * 0" for Sundays"origin" (default) — auto-routes to the conversation's origin platform (Telegram/WhatsApp if the conversation came from there, CLI otherwise)"telegram:CHAT_ID" — explicit Telegram delivery (e.g., "telegram:8818654814")"local" — no delivery, saved locally"whatsapp:PHONE" — explicit WhatsApp deliveryExample with explicit Telegram delivery:
cronjob(
action='create',
name='Veille quotidienne d\'actualités',
prompt="Génère un briefing quotidien en français...",
schedule='0 16 * * *',
skills=['news-briefings'],
deliver='telegram:8818654814',
)
delegate_task — cron sessions cannot spawn subagentsexecute_code — cron sessions cannot use execute_code (blocked for security). Use write_file or terminal for file operations instead.clarify — cron agents cannot ask the user questionssend_message needed — the job's final response auto-delivers to the target platformIf cronjob(action='list') shows the job as state: scheduled but last_run_at stays null even after next_run_at has passed:
hermes gateway start or hermes gateway installhermes gateway status — if not running, the scheduler is not activeEven feeds classified as "reliable" (BBC, Le Monde, France 24) can intermittently trigger a Broken pipe (Errno 32) crash in cron context. This happens when a CDN or reverse proxy intermittently sends a TCP reset — the curl subprocess crashes before any "skip on error" logic runs.
no_agent=False, script=path) that curl-fetches feeds sequentially in a single bash script with || true fallbacks, then let the LLM summarize the collected data. This isolates the crash risk to the script layer.delegate_task(tasks=[...], toolsets=["terminal"]). Fetch the feeds in parallel subagents (max 3), each handles its own curl failure gracefully. Then compose and deliver the briefing manually. This bypasses the Broken pipe crash because each subagent's curl crash is isolated.last_status: "error" with delivery error about "cannot schedule new futures"When last_status: "error" AND the delivery error contains "cannot schedule new futures after interpreter shutdown" or "Broken pipe" appears in the output log:
curl to a blocked domain (DataDome/Cloudflare) causes a TCP reset → "Broken pipe" (Errno 32)execute_code in cron) ls ~/.hermes/profiles/<profile>/cron/output/<job_id>/
The most recent YYYY-MM-DD_HH-MM-SS.md file often contains the ## Script Output section with collected RSS data, even if the final delivery failed. Extract the data and proceed.
execute_code calls with write_file or terminalcronjob(action='run', job_id='...') to test the fixWhen a cron job shows last_status: "error" but last_delivery_error: null:
cronjob(action='run', job_id='...') to re-kick the job manuallyEach cron briefing can also save a copy locally for historical reference, alongside Telegram delivery.
Pattern: Add an instruction at the end of the cron prompt to write the briefing content to a file:
❗ À la fin, archive le briefing dans un fichier : écris le contenu exact du briefing dans /home/sebastien/.hermes/memory/modules/veille_actualite/daily/YYYY-MM-DD.md (remplace YYYY-MM-DD par la date du jour). Crée le fichier avec la commande d'écriture appropriée.
Use a dedicated module structure under ~/.hermes/memory/modules/:
veille_actualite/daily/ — for daily briefingsveille_actualite/weekly/ — for weekly geopolitics briefingsPre-create the directories before setting up the cron — the cron agent has file-write tools but directory creation is more reliable when done ahead of time:
mkdir -p ~/.hermes/memory/modules/veille_actualite/{daily,weekly}
Updating existing cron jobs to add archiving: use cronjob(action='update', job_id='JOB_ID', prompt='...') with the original prompt + the archive instruction appended. Always read the existing prompt from ~/.hermes/cron/jobs.json first so you preserve the full content.
| Frequency | Cron expression |
|---|---|
| Daily at 16h | 0 16 * |
| Daily at 9h | 0 9 * |
| Weekly Sunday 16h | 0 16 0 |
| Every 2 hours | every 2h |
curl for RSS feeds over browser toolsweb_extract may fail when the backend is DuckDuckGo (search-only). Use the fallback technique in references/curl-extraction-fallback.md when this happens: download HTML with curl -o /tmp/page.html then extract text with the Python cleanup recipe documented theresend_message(action='list') can return empty even with configured platforms — try direct targetingdelegate_task with toolsets=["terminal"] rather than doing curl calls in the main thread — keeps context cleanhttps://www.france24.com/fr/rss) is a reliable French-language source for international news — include it for francophone briefings import urllib.request, json
url = f"https://api.telegram.org/bot{TOKEN}/getMe"
resp = urllib.request.urlopen(url)
data = json.loads(resp.read()) # {"ok":true, "result":{...}}
.env via terminal heredoc may corrupt them (redaction system replaces characters). Always verify with xxd after writing. Use printf '\xHH' or direct Python binary writes to bypass redactionThe skill ships with a reusable data-collection script in scripts/collecte-veille.sh.
Purpose: Eliminates the Broken pipe (Errno 32) crash that kills cron briefings when a CDN sends a TCP reset during curl. Each feed is fetched with || true isolation — if one feed crashes, the others continue unaffected.
Usage in cron: Set script='collecte-veille.sh' on the cron job. The script runs first, its stdout is injected into the cron agent's prompt, and the agent summarizes the pre-collected data instead of running its own curls. The prompt should explicitly say: "Utilise les données collectées — ne fais PAS de curl toi-même."
Feeds collected: BBC World, Le Monde International, France Info (via .rss, not /rss), France 24, The Guardian (HTML topic page). Parses 10 items each.
Customization: Modify the script to add/remove feeds, or adjust the item count per feed.
blogwatcher — for ongoing/monitoring RSS feeds (complementary: use for single-feed watching, use this skill for multi-source LLM-synthesised briefings)editorial-review-cycle — for producing structured daily/weekly reviews that update the editorial memory system (topics, hypotheses, briefs archive, index). Use this skill when the user asks for a "revue quotidienne" or "briefing mémoire"; use news-briefings when they ask for "what's happening in the news" to deliver to a messaging platform.references/rss-feeds.md for the full list of tested RSS endpoints and parsing recipes.references/vps-feed-reliability.md for per-server feed status (which feeds work, which are blocked, intermittent failure patterns).references/curl-extraction-fallback.md for extracting text from web pages when web_extract or the browser are unavailable — the curl+Python HTML-stripping recipe tested on major French news sites.The user has provided the following instruction alongside the skill invocation: [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]
The following data was collected by a pre-run script. Use it as context for your analysis.
═══════════════════════════════════════════
COLLECTE VEILLE QUOTIDIENNE — 2026-07-25
═══════════════════════════════════════════
=== BBC World ===
• Trump takes swipes at press during White House Correspondents' Dinner
The event celebrated press freedom after the first dinner was cancelled by a shooting in April.
• Iran-backed Houthis claim missile attack on Saudi Arabia
US military says it disabled a tanker that was attempting to evade the American blockade on Iranian ports.
• Ten killed in Russian attack on drone exhibition near Kyiv
The event, attended by prominent members of the Ukrainian defence industry, was hit by ballistic missiles in the middle of the day.
• Zelensky tries to fix crisis over removal of defence minister and counts the cost
Protests have continued over Zelensky's decision to dismiss Mykhailo Fedorov, and some commentators believe he has been damaged politically.
• Four Palestinians and two Israelis killed in West Bank shooting
Palestinians say villagers came under attack by settlers, while the Israeli military says a Palestinian stole a weapon and opened fire on hikers.
• ICC top prosecutor removed over sexual misconduct allegations
Karim Khan denies allegations of engaging in an improper sexual relationship with a junior ICC staff member and seeking to stop her pursuing her complaint.
• Texts reveal 14-year-old allegedly murdered by singer D4vd had pregnancy and abortion
Prosecutors allege D4vd started abusing the girl when she was 13 and she had threatened to expose him.
• Trump vows to investigate EU over fining of US tech companies
The US president says fines against Google, as well as Apple, Meta and Amazon, should be "entirely reversed."
• Trump orders Smithsonian to post warnings about 'inaccurate' US history
The Trump administration has often accused the world's largest research museum of harbouring an anti-American bias.
• US hits dozens of countries with new wave of tariffs
Imposed citing forced labour concerns, the levies replace a temporary global duty brought in after the US Supreme Court struck down tariffs in February.
=== Le Monde International ===
• Les images des incendies dans la région de Madrid
Trois incendies font rage dans la région de Madrid depuis lundi 20 juillet, et près de 25 000 hectares ont été brûlés.
• Droits de douane : les nouvelles menaces de Trump douchent les espoirs d’apaisement des Européens
Un an après l’accord commercial transatlantique et sa promesse de stabilité, le président américain continue de souffler le chaud et le froid. Il menace désormais de se venger d’une amende européenne
• Ma vie d’exilée russe à Paris : « Ce qui, à Moscou, peut vous valoir de longues années de prison n’est ici qu’une façon de passer son samedi après-midi »
« Une Russe à Paris » (5/6). La journaliste Elizaveta Osetinskaya, exilée dans l’Hexagone depuis 2022 en raison de son opposition à la guerre en Ukraine, raconte quatre expériences de rassemblements d
• OTAN : soupçons d’espionnage au quartier général du commandement militaire de l’organisation
La justice belge a annoncé, samedi, l’arrestation d’une Canadienne d’origine chinoise, soupçonnée d’avoir profité d’un stage au siège de l’Alliance atlantique pour se livrer à des « faits d’espionnage
• EN DIRECT, guerre en Ukraine : le président du Kazakhstan a dit à Vladimir Poutine, lors d’une rencontre, que les combats en Ukraine devaient être « arrêtés »
« Comment sortir de cette situation ? Personne ne le sait, parce qu’il y a les positions des deux parties. D’un autre côté, il y a, en ce moment, cette possibilité de geler tout cela », a déclaré le p
• L’ONU appelle la communauté internationale à accompagner et à soutenir le peuple syrien
La visite en Syrie du secrétaire général de l’ONU, Antonio Guterres, survient plus d’un an et demi après la chute, à la fin de 2024, du président Bachar Al-Assad, renversé par une coalition de rebelle
• Le typhon Noul s’approche de la Chine, plus de 20 000 personnes évacuées dans la province du Guangdong
Le typhon devrait toucher terre dans la zone côtière s’étendant de Hongkong à la province du Guangdong (sud) entre samedi dans la soirée et dimanche matin, a déclaré le Centre météorologique national
• La Tunisie, autopsie d’un basculement autoritaire
Depuis que le processus de concentration des pouvoirs s’est enclenché, le 25 juillet 2021, le chef de l’Etat tunisien a peu à peu verrouillé l’espace public. Arrestations et condamnations se sont mult
• EN DIRECT, guerre au Moyen-Orient : l’Iran considère qu’il n’y a « pas de solution militaire » au conflit entre les houthistes, du Yémen, et l’Arabie saoudite
Dans une interview publiée samedi par le quotidien d’Etat « Iran Daily », le ministre des affaires étrangères iranien, Abbas Araghtchi, a appelé au « dialogue » entre les Saoudiens et les houthistes,
• La marine française arpente l’océan Atlantique à la recherche de « clients », ces navires chargés de cocaïne en route vers l’Europe
« L’Afrique sous emprise » (6/6). La France assure depuis 1990 une présence militaire quasi permanente le long du littoral ouest-africain pour tenter d’endiguer le trafic de drogue qui inonde l’Europe
=== France Info Monde ===
• Enquête. Pourquoi la fin du support physique bouleverse l'économie du jeu vidéo et tourmente les joueurs ?
Si le marché mondial du jeu vidéo est d'ores et déjà en grande majorité dématérialisé, Sony décide de prendre les devant en annonçant la fin de leur production disque Blu-Ray.
• Donald Trump plaisante sur un éventuel nouveau mandat
Trois mois après avoir échappé à une nouvelle tentative d'assassinat, Donald Trump était de retour au gala de la presse, vendredi 24 juillet. Il en a profité pour attaquer les journalistes et plaisant
• Des frappes en Ukraine et en Russie font au moins 15 morts
Dans la partie occupée de la région de Zaporijjia, le responsable installé par Moscou a déclaré qu'une attaque ukrainienne sur un village au bord de la mer d'Azov avait tué huit personnes.
• En Inde, le ministre de l'Education annonce sa démission, les étudiants mettent fin à leur mobilisation
Le départ de Dharmendra Pradhan était demandé en raison d'une série de fraudes aux examens universitaires.
• "Peut-être qu'il est raciste" : la surprenante accusation de Donald Trump à l'encontre de la star de la NBA LeBron James
Le président américain a émis l'hypothèse que le nouveau joueur de Philadelphie serait raciste, vendredi, lors d'une conférence de presse à la Maison-Blanche.
• En Espagne, les incendies dans les régions de Madrid et d'Avila ont ravagé jusqu'à 25 000 hectares
Le Premier ministre a déclaré samedi matin que la priorité était de "sauver des vies" alors que des vents "erratiques" risquent d'aggraver la situation.
• La maison natale d'Adolf Hitler transformée en commissariat
La maison dans laquelle Adolf Hitler est né, à Braunau-sur-Inn (Autriche), a été transformée en poste de police. L'inauguration a eu lieu mardi 22 juillet. Coût des travaux : 20 M€. L'objectif est de
• Une stagiaire de l'Otan, soupçonnée d'espionnage, arrêtée en Belgique
Cette ressortissante canadienne d'origine chinoise travaillait au quartier général stratégique des Puissances Alliées en Europe de l'Otan, à Mons.
• Les Houthis revendiquent une frappe en Arabie saoudite, après des attaques de Ryad
Ces insurgés pro-Iran ont pris pour cible des navires circulant en mer Rouge ces derniers jours, étendant le conflit au Moyen-Orient.
• "Quand je vais partir, vous allez tous faire faillite" : malaise palpable entre Donald Trump et les journalistes au dîner des correspondants de la Maison Blanche
Lors de cette soirée, le président américain s'en est pris aux journalistes, les qualifiant notamment "de personnes atteintes du syndrome de délire anti-Trump".
=== France 24 ===
• Incendies : plus de 1 500 militaires mobilisés en renfort des sapeurs-pompiers
À partir de samedi soir, 1 500 militaires seront déployés en renfort pour faire face aux incendies qui touchent le sud ouest de la France. Ils participeront notamment aux évacuations, à la protection
• Espagne : le feu gagne du terrain, le poste de commandement évacué
Le village de Cenicientos, où était installé le poste de commandement des pompiers mobilisés contre le gigantesque incendie dans l'ouest de Madrid, a dû être évacué. Comme l'explique notre correspond
• Incendie à Biscarrosse : plus de 5 000 personnes évacuées, le feu ravage 1 200 hectares
Un violent incendie, déclenché jeudi après-midi par un véhicule près de Biscarrosse (Landes), a parcouru près de 1 200 hectares de forêt en quelques heures. Les flammes, attisées par des conditions f
• À Arcachon, face aux incendies, un ballet de vacanciers et d'évacués en quête d'une "respiration"
Depuis mercredi, les incendies qui frappent la Gironde ont forcé l'évacuation de près de 170 000 personnes. Sur le front de mer d'Arcachon, à quelques kilomètres des feux, vacanciers et sinistrés se
• Tour de France : Carapaz vainqueur de l'étape reine, Seixas n'a pas réussi à renverser le podium
Richard Carapaz (EF Education-EasyPost) est l'homme de la troisième semaine du Tour de France 2026. L'Équatorien a signé samedi à l'Alpe d'Huez (Isère) son deuxième succès en trois jours sur le Tou
• RDC : les ADF multiplient les attaques sur fond de progression d'Ebola
Dans l'est de la République démocratique du Congo, une vingtaine de personnes ont été tuées lors d'une nouvelle attaque attribuée au groupe djihadiste ADF, selon la société civile. Affiliée au groupe
• Gironde : le point sur les incendies
L'incendie historique qui ravage la Gironde a déjà détruit plus de 32 000 hectares et entraîné l'évacuation de 167 000 personnes, Le point sur la situation avec nos confrères de France 2.
• Cuba : manifestations nocturnes à La Havane face aux coupures d'électricité
Plongée dans de fréquents black-outs de plus de 24 heures, La Havane est le théâtre de manifestations nocturnes répétées contre le délabrement des services publics et l'aggravation des pénuries d'eau
• Incendies en Gironde : Bordeaux accueille les évacués face à l'avancée des flammes
Hors de contrôle, les incendies ravagent la Gironde et se rapprochent de Bordeaux, entraînant des dizaines de milliers d'évacuations qui se poursuivent sans relâche. Dans les gymnases bordelais trans
• Incendies en Gironde : un bombardier A400M déployé sur demande du Premier ministre
Face à l'ampleur des incendies qui ravagent la Gironde, Matignon a annoncé le déploiement dès ce samedi d'un avion de transport militaire A400M, une décision prise à la demande du Premier ministre Sé
=== The Guardian ===
═══════════════════════════════════════════
FIN DE LA COLLECTE
═══════════════════════════════════════════
Génère un briefing quotidien en français des actualités du jour pour Sébastien.
Les données des flux RSS ont déjà été collectées par le script ci-dessus (section "COLLECTE VEILLE QUOTIDIENNE"). Utilise ces données — ne fais PAS de curl toi-même. Si la section de collecte est vide ou erronée, produis un message d'erreur clair au lieu d'essayer de faire tes propres curls.
Structure la veille avec des emojis par région :
🔴 Moyen-Orient
🟠 Ukraine / Russie
🟡 Amériques / US
🔵 Asie-Pacifique / Chine
🟢 Afrique
🟣 Europe / UE
⚪ Défense / Alliances
🇫🇷 France
2-3 puces max par section. Gras sur le titre principal. Termine par la source et la date.
Message concis, en français, adapté à Telegram (pas de tableaux — listes à puces uniquement).
❗ À la fin, archive le briefing dans un fichier : écris le contenu exact du briefing dans /home/sebastien/.hermes/memory/modules/revue_editoriale/sources/rss/YYYY-MM-DD.md (remplace YYYY-MM-DD par la date du jour). Crée le fichier avec write_file.
Briefing livré et archivé dans revue_editoriale/sources/rss/2026-07-25.md ✅