# Cron Job: second-brain-crosslink-intelligent

**Job ID:** 77447b1b4dcd
**Run Time:** 2026-06-10 08:04:57
**Schedule:** 0 */4 * * *

## Prompt

[IMPORTANT: The user has invoked the "model-router" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

---
name: model-router
description: "Routeert taken naar het juiste model: per-job overrides voor crons, fallback chain via config.yaml"
version: 1.1.0
author: Styto + Cato
metadata:
  hermes:
    tags: [routing, model, provider, cost-optimization]
---

# Model Router

Deze skill definieert welke taken naar welk model gaan.

## Routing rules

### 1. Cron jobs → per-job `deepseek-chat` via `deepseek`
Alle geplande/achtergrond taken gebruiken DeepSeek (goedkoop, 1M context, betrouwbaar):
- YouTube channel sitreps (content monitoring, summaries)
- Reddit digests (50 subreddits)
- Prijsmonitoren (Zendure, Motorola, etc.)
- Meteo/weerberichten
- Weekly briefings (Garmin, etc.)
- Obsidian crosslink maintenance
- Opruimtaken
- Elke andere cron/background taak

**Hoe:** Elke cron job krijgt een individuele model override:
```
model: deepseek-chat
provider: deepseek
```

### 2. Telegram interactie → `gpt-5.5` via `openai-codex`
Creatief werk, analyse, code, gesprekken — alles wat jij typt in Telegram.

### 3. Fallback chain (globale config)
In `config.yaml` staat een fallback chain die actief wordt als de primary provider faalt:
```
fallback_providers:
  - provider: deepseek
    model: deepseek-chat
  - provider: openai-codex
    model: gpt-5.5
```
Als DeepSeek faalt (quota, outage) → OpenAI Codex vangt het op.
Deze fallback geldt voor **alle** provider calls (crons + Telegram + delegatie).

### 4. Gemini — historisch, niet meer in gebruik
Gemini was voorheen default voor crons (`gemini-3.1-flash-lite-preview`), maar de Gemini API key staat uitgecomment in `.env`. Gemini OAuth (`google-gemini-cli` provider) heeft policy-risico's en wordt afgeraden voor cron gebruik. **Nieuwe crons krijgen geen Gemini model override meer.**

### 5. Token-monitor blijft script-only (geen LLM kosten)
De token monitoring cron draait als `no_agent=True` — pure Python, nul tokens.

## Hoe een cron job opzetten met model override

```
cronjob(
    action="create",
    name="<naam>",
    schedule="...",
    prompt="...",
    model={"provider": "deepseek", "model": "deepseek-chat"},
    deliver="origin",  # of "local" voor mail-only
    skills=["content-monitoring-briefings", "long-output-to-email"],
    enabled_toolsets=["web", "terminal", "file"],
)
```

## Hoe bestaande crons migreren van Gemini naar DeepSeek

```python
cronjob(action="update", job_id="...", model={"provider": "deepseek", "model": "deepseek-chat"})
```

Geen andere aanpassingen nodig — de fallback chain vangt eventuele DeepSeek-fouten op.

## Relationship to model-auto-switcher

The `model-auto-switcher` cron (07:00 daily) is the **upstream** voor Telegram model — it writes to `config.yaml`:
- `model.default` → the top-ranked free OpenRouter model
- `fallback_providers[0].model` → the second-ranked

**Cron jobs zijn NIET afhankelijk van de auto-switcher** — ze hebben hardcoded per-job model overrides (deepseek-chat). Alleen de Telegram interactie volgt wat de auto-switcher die ochtend heeft gezet.

## Provider notes

### DeepSeek
- API key in `/opt/data/.env` als `DEEPSEEK_API_KEY`
- Model: `deepseek-chat` (snelle, goedkope inference, 1M context)
- Geen OAuth — enkel API key
- Fallback naar OpenAI Codex bij fouten

### OpenAI Codex (openai-codex)
- OAuth via `hermes auth add openai-codex` (device code flow)
- Model: `gpt-5.5`
- Maandelijks abonnement, reset op 11e van de maand
- Wordt gebruikt voor: Telegram interactie + fallback voor crons

### Gemini
- Niet meer in gebruik voor crons (zie #4 hierboven)
- API key zou via `GOOGLE_API_KEY` of `GEMINI_API_KEY` in `.env` werken
- OAuth provider `google-gemini-cli` bestaat maar heeft policy-risico's (Google kan gebruik door third-party software als schending zien)

## Cron job aanmaken met skills + long-output-to-email (beproefd recept)

Wanneer een cron job lange output produceert (>50 regels / 3000 chars):

1. Maak de cron met `deliver: "origin"` (korte Telegram samenvatting)
2. Voeg skills `["content-monitoring-briefings", "long-output-to-email"]` toe
3. In de prompt: schrijf uitvoer naar `/opt/data/cron/output/<slug>/YYYY-MM-DD.md`
4. Prompt stuurt mail via AgentMail naar `styto@duck.com`
5. Eindoutput in Telegram = korte samenvatting (3-8 regels) + "Volledige digest gemaild"

Zie `content-monitoring-briefings` voor de complete prompt template.

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.]

Bekijk de Obsidian vault op /second-brain. Zoek naar interaction-notes in de map Interactions/ die sinds de vorige run nieuw zijn of nog niet optimaal gecrosslinkt zijn.

Lees de inhoud van elke nieuwe/onaangeraakte note. Bepaal:
1. Naar welke projectnote(s) in Projects/ deze zou moeten linken
2. Naar welke themanote(s) in Themes/ deze zou moeten linken
3. Of er relevante backlinks ontbreken in de project/thema notes zelf

Voeg de crosslinks toe volgens Obsidian [[wikilink]] formaat.
- In de interaction-note: voeg een ## Projecten en ## Thema's sectie toe als die ontbreekt, met correcte [[links]]
- In de project/thema notes: voeg de interaction toe als bullet onder ## Related interactions (indien nog niet aanwezig)

Werk enkel met NOTES waar nog geen adequate crosslinks bestaan. Idempotent: als alles al gelinkt is, rapporteer dan enkel "[SILENT]".

Rapporteer wat je aangepast hebt (aantal notes, welke links toegevoegd).

## Response

All clean. Here's the report:

---

## Crosslink maintenance report — 2026-06-10

**3 interaction notes aangepast**, **4 project notes backlinked**.

### Interaction notes — `## Projecten` toegevoegd

| Note | Toegevoegde Projecten-links |
|---|---|
| `2026-06-10-040730` (Sitrep NetworkChuck) | [[Projects/YT Reddit Nieuws Cron Briefings]], [[Projects/Home Assistant Dashboard]] |
| `2026-06-10-061206` (AGENT IDENTITY) | [[Projects/Hermes Telegram Workflows]] |
| `2026-06-10-061400` (onedrive-classify.py) | [[Projects/Hermes Telegram Workflows]], [[Projects/Obsidian Second Brain]] |

### Project notes — `## Related interactions` backlinks toegevoegd

| Project note | Backlink(s) toegevoegd |
|---|---|
| **YT Reddit Nieuws Cron Briefings** | `2026-06-10-040730` |
| **Home Assistant Dashboard** | `2026-06-10-040730` |
| **Hermes Telegram Workflows** | `2026-06-10-061206`, `2026-06-10-061400` |
| **Obsidian Second Brain** | `2026-06-10-061400` |

### Onaangeroerd (idempotent)

- `2026-06-10-061216` (werkwijze) — puur OneDrive taxonomie, geen projectlink nodig
- `2026-06-10-061235` (taxonomie) —zelfde, enkel [[inbox]] thema is correct
- `2026-06-09-063035` (maak project "werk") — onvoldoende concrete project-match
- `2026-06-09-201247` (Garmin dagreflectie) — had al "Geen specifiek project", correct
- Alle andere bestaande notes hadden al adequate crosslinks
