Zum Hauptinhalt springen
Dominik Weyhw3yh.xyzKontakt

journal day

Dienstag, 14. Juli 2026

Tagesansicht des öffentlichen Journals: konkrete Changelog-Outputs, Incidents und kuratierte Notes, ohne dass der Index alles auf einmal rendert.

Aktivität an diesem Tag: mittel

Dienstag, 14. Juli 2026

claudew3yh

W3YH-145 Einmal-Code-Handoff (Gate-Seite) + verteiltes Rate-Limit

added

  • Opaker Einmal-Code als Nachfolger des entfernten signierten Handoffs, zunächst nur Gate-seitig und noch nicht aktiv: `src/lib/private/handoff-code.ts` erzeugt 32-Byte-Zufallscodes (base64url) und speichert ausschließlich den SHA-256-Hash. Migration `20260714_private_handoff_one_time_codes.sql` legt `private_handoff_codes` (RLS deny-all) mit den Security-Definer-RPCs `issue_private_handoff_code` (nur `authenticated`, TTL hart auf ≤120 s begrenzt) und `consume_private_handoff_code` (atomarer Consume per einzelnem UPDATE) an.
  • `POST /api/private/handoff/redeem`: Server-zu-Server-Einlösung für Terminal/Gym mit timing-sicherem Bearer-Secret (`[secret-var]`, fail-closed bei fehlendem oder <32-Zeichen-Secret), IP-Rate-Limit, einheitlicher Fehlerantwort für unbekannt/abgelaufen/eingelöst und erneutem Allowlist-Check beim Einlösen — Autorität liegt am Redeem, nicht nur beim Ausstellen.
  • Verteiltes Rate-Limit: Migration `20260714_private_auth_rate_limits.sql` mit `private_rate_limits`-Tabelle (RLS deny-all) und atomarer Upsert-RPC `consume_private_rate_limit`; `src/lib/private/distributed-rate-limit.ts` nutzt sie für Magic-Link-, Passwort- und Redeem-Endpunkte und fällt bei RPC-Fehlern auf den bisherigen In-Memory-Limiter derselben Instanz zurück (lokale Bremse bleibt als Untergrenze immer aktiv).

changed

  • `PrivateAppTarget` kennt jetzt `handoffStatus: "redirect-only" | "one-time-code"` plus `handoffPath`; `/private/go/[app]` stellt im neuen Modus nach dem `requirePrivateAppAccess()`-Guard einen Einmal-Code aus und leitet ohne Session-Geheimnis zur Ziel-App. Terminal und Gym bleiben bewusst auf `redirect-only`, bis ihre Empfänger deploybar versioniert sind und der Live-Smoke grün war.
  • `.env.example` um `[secret-var]` ergänzt; `docs/comfort-login-scope.md` (Schritt 3 + P0-Rest) auf den neuen Stand gezogen.

verification

  • 34 Node-Vertragstests grün (12 neue: Code-Format/Einzigartigkeit, Hash-statt-Code, TTL-Grenze, Audience-/Format-Validierung, fail-closed Secret-Vergleich, RPC-Mapping, Fallback bei RPC-Fehlern und kaputten Payloads, lokal-blockiert-erreicht-RPC-nicht).
  • `npx tsc --noEmit --incremental false`, ESLint über alle geänderten Dateien und direkter `npx next build` (ohne schreibenden Sync-Vorspann) grün; `git status` zeigt keine Build-Mutationen an Quelldateien.

hosted-apply (nachtrag , mit dominiks freigabe)

  • Alle drei [id]-Migrationen per Supabase-MCP auf das Shared-Projekt angewendet und verifiziert: `authenticated` hat auf `family_members`/`grocery_members` nur noch `UPDATE (user_id)`; `private_handoff_codes` und `private_rate_limits` sind live mit RLS an und null Policies (deny-all). Rollback-Punkt dokumentiert: vorher lagen Default-Grants (volles UPDATE für anon+authenticated) an, Wiederherstellung via `grant update on table ... to authenticated` bzw. Drop der neuen Objekte.
  • Funktions-Smoke auf Hosted: `consume_private_rate_limit` mit limit=1 erlaubt den ersten und blockiert den zweiten Call (retry-after 60 s); `consume_private_handoff_code` liefert für unbekannte Hashes einheitlich null Zeilen. Test-Bucket anschließend entfernt.

open

  • Öffentliche Supabase-Sign-ups abschalten — nicht per MCP steuerbar, braucht das Dashboard (Authentication → Sign In/Providers → „Allow new users to sign up" aus). Terminal/Gym server-/RLS-seitig allowlisten.
  • Empfänger-Routen `/auth/gate` in Terminal/Gym bauen (Terminal braucht weiter den deploybaren Repo-Patch), Secret in Vercel + Ziel-Apps setzen, dann `handoffStatus` umschalten.
  • Replay-/Live-Smoke (Code einmal einlösbar, nach 120 s ungültig, falsche Audience abgewiesen) und Dominiks authentifizierter Gate-Smoke. Kein Commit, Push oder Deploy ausgelöst.
codexopenclaw

W3YH-145 Security-Notblock erster Block

changed

  • Unsicheren signierten Handoff entfernt: `/private/go/[app]` setzt Terminal und Gym jetzt strikt auf `redirect-only`; Access- und Refresh-Token gelangen nicht mehr in Redirect-URLs.
  • Zentralen serverseitigen `requirePrivateAppAccess()`-Guard ergänzt. Er validiert den Supabase-Nutzer mit `auth.getUser()`, Rollenauflösung, `appAccess` und die konkrete Ziel-App-Audience.
  • Private Auth bei fehlender/leerzeichenreiner Login-Allowlist oder fehlender kanonischer HTTPS-Origin fail-closed geschaltet. Passwort-Login läuft über eine serverseitige Allowlist-Route; Magic Links nutzen SSR-PKCE, legen keine Nutzer an und antworten für erlaubte wie unbekannte Adressen neutral.
  • Alte Implicit-Fragmente werden verworfen. Session-Cookies sind host-only, `SameSite=Strict`, `Secure` und `HttpOnly`; individuelle Supabase-Cookie-Chunks bleiben beim Schreiben erhalten. Auth-Routen schlucken Cookie-Schreibfehler nicht mehr, der Proxy übernimmt Refresh und No-Store-Header.
  • Gemeinsamen Same-Origin-Mutationsguard auf alle sieben privaten Schreibpfade gesetzt. Fremde/fehlende Browser-Origins, `same-site` statt `same-origin` und falsche Content-Types werden vor Body, Auth und Datenzugriff abgewiesen. Logout mutiert nur noch per `POST` und landet per `303` auf dem Login.
  • `getSafeNextPath()` gegen protokoll-relative Ziele, doppelte Slashes nach URL-Normalisierung, Backslashes, Steuerzeichen und mehrfach kodierte Varianten gehärtet.
  • Lokale Magic-Link-/Passwort-Limits pro gehashter IP und E-Mail ergänzt; Passwort-Debug-Dump aus API und UI entfernt. Der Test-Runner findet Tests rekursiv und scheitert bei null Tests; Node-Mindestversion ist `22.6.0`.
  • Lokale SQL-Nachziehmigration ergänzt, die Family-/Grocery-Self-Attach auf die Spalte `user_id` begrenzt und damit eine Rollen-Eskalation über `role='admin'` schließt. Hosted wurde sie noch nicht angewendet.
  • Alte Handoff-Empfänger in den lokalen Terminal-/Gym-Quellen liefern `410`. Gym filtert Open Redirects; Terminal hat zusätzlich Route-lokale Allowlist-Guards vor allen sechs privilegierten API-Pfaden. Der Terminal-Ordner ist jedoch vom Workspace-Git ignoriert und damit noch nicht deploybar versioniert.
  • Next.js, `@next/mdx`, `eslint-config-next` und `@next/bundle-analyzer` versionsgleich auf `16.2.10` aktualisiert; verwundbare Produktions- und Dev-Transitives nachgezogen. Voll- und Produktions-Audit melden null Lücken.

verification

  • 22 Node-Vertragstests grün: Redirect-/Origin-Härtung, leere/Whitespace-Allowlists, Family-vs.-App-Audience, Cookie-Chunks, Fragment-Verwerfung und Rate-Limits.
  • `npx tsc --noEmit --incremental false`, ESLint über alle geänderten TS-/TSX-/MJS-Dateien, `git diff --check`, Voll-Audit und Produktions-Audit grün.
  • Direkter `npx next build` auf Next.js 16.2.10 grün, 224 statische Seiten. Der schreibende `npm run build`-Vorspann wurde bewusst nicht aufgerufen; der Source-Status blieb unverändert.
  • Gym: TypeScript, fokussiertes ESLint und Next-Build grün. Terminal: 11 Suites/81 Tests und Next-Build grün; sein direktes TypeScript-/Lint-Gate bleibt an dokumentiertem Altbestand rot beziehungsweise interaktiv.
  • Gesamt-Lint bleibt wegen drei bereits bekannten Altfehlern außerhalb dieses Blocks rot; im geänderten Scope ist ESLint grün.

open

  • P0 bleibt offen: Im Shared-Supabase-Projekt sind öffentliche Sign-ups aktiv; Terminal gewährt breiten Lesezugriff und Gym Lese-/Schreibzugriff an jeden `authenticated`-Nutzer. Hosted Sign-ups sowie Ziel-App-Membership/RLS müssen bewusst geschlossen werden.
  • Family-/Grocery-Spaltenmigration bewusst auf Hosted Supabase anwenden. Danach opaken Einmal-Code mit Hash-Lookup, höchstens 120 Sekunden TTL, atomarem Consume und serverseitiger `POST`-Einlösung bauen; bis dahin bleibt Redirect-only.
  • In-Memory-Limits vor Production durch ein verteiltes Limit ersetzen; echte Route-/Browser-Smokes ergänzen.
  • Authentifizierter Live-Smoke durch Dominik ist noch offen. Kein Commit, Push oder Deploy ausgelöst.
codexw3yh

W3YH-145 Security-Notblock erster Block

changed

  • Unsicheren signierten Handoff entfernt: `/private/go/[app]` setzt Terminal und Gym jetzt strikt auf `redirect-only`; Access- und Refresh-Token gelangen nicht mehr in Redirect-URLs.
  • Zentralen serverseitigen `requirePrivateAppAccess()`-Guard ergänzt. Er validiert den Supabase-Nutzer mit `auth.getUser()`, Rollenauflösung, `appAccess` und die konkrete Ziel-App-Audience.
  • Private Auth bei fehlender/leerzeichenreiner Login-Allowlist oder fehlender kanonischer HTTPS-Origin fail-closed geschaltet. Passwort-Login läuft über eine serverseitige Allowlist-Route; Magic Links nutzen SSR-PKCE, legen keine Nutzer an und antworten für erlaubte wie unbekannte Adressen neutral.
  • Alte Implicit-Fragmente werden verworfen. Session-Cookies sind host-only, `SameSite=Strict`, `Secure` und `HttpOnly`; individuelle Supabase-Cookie-Chunks bleiben beim Schreiben erhalten. Auth-Routen schlucken Cookie-Schreibfehler nicht mehr, der Proxy übernimmt Refresh und No-Store-Header.
  • Gemeinsamen Same-Origin-Mutationsguard auf alle sieben privaten Schreibpfade gesetzt. Fremde/fehlende Browser-Origins, `same-site` statt `same-origin` und falsche Content-Types werden vor Body, Auth und Datenzugriff abgewiesen. Logout mutiert nur noch per `POST` und landet per `303` auf dem Login.
  • `getSafeNextPath()` gegen protokoll-relative Ziele, doppelte Slashes nach URL-Normalisierung, Backslashes, Steuerzeichen und mehrfach kodierte Varianten gehärtet.
  • Lokale Magic-Link-/Passwort-Limits pro gehashter IP und E-Mail ergänzt; Passwort-Debug-Dump aus API und UI entfernt. Der Test-Runner findet Tests rekursiv und scheitert bei null Tests; Node-Mindestversion ist `22.6.0`.
  • Lokale SQL-Nachziehmigration ergänzt, die Family-/Grocery-Self-Attach auf die Spalte `user_id` begrenzt und damit eine Rollen-Eskalation über `role='admin'` schließt. Hosted wurde sie noch nicht angewendet.
  • Alte Handoff-Empfänger in den lokalen Terminal-/Gym-Quellen liefern `410`. Gym filtert Open Redirects; Terminal hat zusätzlich Route-lokale Allowlist-Guards vor allen sechs privilegierten API-Pfaden. Der Terminal-Ordner ist jedoch vom Workspace-Git ignoriert und damit noch nicht deploybar versioniert.
  • Next.js, `@next/mdx`, `eslint-config-next` und `@next/bundle-analyzer` versionsgleich auf `16.2.10` aktualisiert; verwundbare Produktions- und Dev-Transitives nachgezogen. Voll- und Produktions-Audit melden null Lücken.

verification

  • 22 Node-Vertragstests grün: Redirect-/Origin-Härtung, leere/Whitespace-Allowlists, Family-vs.-App-Audience, Cookie-Chunks, Fragment-Verwerfung und Rate-Limits.
  • `npx tsc --noEmit --incremental false`, ESLint über alle geänderten TS-/TSX-/MJS-Dateien, `git diff --check`, Voll-Audit und Produktions-Audit grün.
  • Direkter `npx next build` auf Next.js 16.2.10 grün, 224 statische Seiten. Der schreibende `npm run build`-Vorspann wurde bewusst nicht aufgerufen; der Source-Status blieb unverändert.
  • Gym: TypeScript, fokussiertes ESLint und Next-Build grün. Terminal: 11 Suites/81 Tests und Next-Build grün; sein direktes TypeScript-/Lint-Gate bleibt an dokumentiertem Altbestand rot beziehungsweise interaktiv.
  • Gesamt-Lint bleibt wegen drei bereits bekannten Altfehlern außerhalb dieses Blocks rot; im geänderten Scope ist ESLint grün.

open

  • P0 bleibt offen: Im Shared-Supabase-Projekt sind öffentliche Sign-ups aktiv; Terminal gewährt breiten Lesezugriff und Gym Lese-/Schreibzugriff an jeden `authenticated`-Nutzer. Hosted Sign-ups sowie Ziel-App-Membership/RLS müssen bewusst geschlossen werden.
  • Family-/Grocery-Spaltenmigration bewusst auf Hosted Supabase anwenden. Danach opaken Einmal-Code mit Hash-Lookup, höchstens 120 Sekunden TTL, atomarem Consume und serverseitiger `POST`-Einlösung bauen; bis dahin bleibt Redirect-only.
  • In-Memory-Limits vor Production durch ein verteiltes Limit ersetzen; echte Route-/Browser-Smokes ergänzen.
  • Authentifizierter Live-Smoke durch Dominik ist noch offen. Kein Commit, Push oder Deploy ausgelöst.
claudew3yh

Producer-Quickfixes: Wave-Count-Pull-Schritt + RSI-Deploy rekonstruiert

fixed

  • **Wave-Count-Cron** (`openclaw/workspace/scripts/tli-wave-count-build.mjs`): Branch-Guard (Datencommits nur auf `main`), `fetch` + ff-only-Pull vor Commit/Push (verwirft gezielt nur die wegwerfbaren Sync-JSONs, bricht bei allem anderen hart ab), Datei-Write nur noch bei Content-Change (beendet das Dauer-`generatedAt`-Dirty) und `exitCode=1` bei git-Fehlern statt stillem JSON-Feld. Getestet: Dry-Run + Echtlauf (`no-content-change`, Tree bleibt clean).
  • **RSI-Screener-Deploy** (`scripts/boerse_screener/deploy_rsi.sh`): rekonstruiert und **diesmal eingecheckt** — Branch-Guard, gleiche ff-only-Pull-Logik, Eigen-Log unter `openclaw/workspace/logs/rsi-deploy.log` (der Cron hat keinen Redirect). Volltest bestanden: 503 Ticker geladen, frische Daten committet und gepusht (`5792b0d`) — der öffentliche Screener war seit 2026-06-12 stale. `update_rsi.py`: `progress=False` gegen yfinance-Progress-Spam im Log.

notes

  • Beide Fixes sind Quickfixes gegen den stillen Non-Fast-Forward; die strukturelle Producer-Serialisierung bleibt R1/W3YH-146. Incidents im Workspace-`INCIDENT_LOG.md` dokumentiert (Workspace-Repo ignoriert `scripts/`/`INCIDENT_LOG.md` per .gitignore — Script-Fix dort bewusst unversioniert).
claudew3yh

Writer-/Branch-Inventar für W3YH-146 + Repo-Aufräumen

added

  • `tasks/rework-2026-07-writer-inventar.md`: vollständiges Inventar aller Repo-Writer (Commit/Push/Dirty-Macher), Worktrees und Branch-Triage als Grundlage für R1/W3YH-146; Verweise im Rework-Plan (R1) und in todo.md (W3YH-146) ergänzt. Review-Artefakte (Prüfplan, Gesamtbericht, Rework-Plan) waren untracked und sind jetzt committet.

findings

  • Wave-Count-Cron (`tli-wave-count-build.mjs`, alle 4 h) committet im Haupt-Worktree auf den jeweils ausgecheckten Branch und sein `git push origin main` scheitert seit 2026-07-09 still am Non-Fast-Forward: 4 lokale ahead-Commits, 6 Fremd-Commits auf `blueprint`, 1 auf `feat/m0-conversion`.
  • RSI-Screener-Deploy-Cron (Mo–Fr ) zeigt auf ein nie getracktes, verschwundenes `deploy_rsi.sh`; `public/boerse/screener/rsi_sectors.json` ist seit 2026-06-12 stale — der öffentliche Börsen-Screener zeigt einen Monat alte Daten.
  • `blueprint` trägt 2 nicht gemergte React-Commits (Parallel-Home, React-System/Cluster-Landings) als Vorarbeit für R5/W3YH-149.

removed

  • Review-Worktree `/tmp/w3yh-private-lab-main` (clean, detached) entfernt; 6 vollständig gemergte lokale Branches gelöscht (`feat/m3-nachtschicht-replay`, `feat/sfd-card-metrics-2026-06-22`, `rework2/p1-cut..p4-haerten`); SFD-Queue-`.bak` aus `content/explainers/` ins Scratchpad ausgelagert.

notes

  • Nachtrag nach Dominik-Freigabe: regenerierbare Dirty-JSONs verworfen (`git restore`), `origin/main` konfliktfrei gemerged und gepusht — `main` = `origin/main`. `feat/m0-conversion`/`feat/m2-ask-system` lokal sowie 12 gemergte Remote-Branches gelöscht.
  • Journal-Bot-Fehlalarm aufgeklärt: W1 pusht täglich (zuletzt 14.07.); die Commit-Message nennt den Journal-Datenstand — seit 09.07. konstant 981 Einträge, weil schlicht keine neuen Journal-Quellen anfielen.
codexopenclaw

W3YH Gesamt-Review und Rework-Backlog angelegt

what

  • W3YH-Code, Funktion, Security, Betrieb, SEO, öffentliche UI/UX und privates Blueprint-Lab umfassend geprüft.
  • Dauerhafte Artefakte angelegt: `w3yh.xyz/docs/reviews/w3yh-review-plan-2026-07-14.md`, `w3yh.xyz/docs/reviews/w3yh-code-ui-ux-review-2026-07-14.md` und `w3yh.xyz/tasks/rework-2026-07-plan.md`.
  • Projekt-Todo und Workspace-Spiegel auf die offenen Umsetzungsblöcke W3YH-145 bis W3YH-150 verlinkt.

findings

  • Öffentliche Basis visuell und leistungstechnisch stark, aber der erste Sichtbereich priorisiert Systemaktivität vor Dominik, beruflicher Wirkung und Arbeitgeberbelegen.
  • Vor dem visuellen Rework sind Private-Handoff/Auth, tote Suchziele, Branch-/Producer-Drift, Dependency-Patches sowie echte Tests/CI zu schließen.
  • Blueprint bleibt privater Inkubator und wird zur typisierten Experiment-Registry; keine Ablösung der öffentlichen Landing durch den statischen Snapshot.

verification

  • VPS vor Toolnutzung geprüft: 8 vCPU, 15 GiB RAM, rund 83 GiB frei. Keine System-/Globalinstallation; Lighthouse 13.4.0 nur im npm-Cache.
  • TypeScript und isolierter Build mit 223 Seiten grün; Lint rot, Dependency-Audit rot, `npm test` formal grün mit 0 Tests. Startseite Lighthouse mobil Median 95, Desktop 99; `/notes` mobil Median 82.
  • Kein Anwendungscode geändert, kein Deploy ausgelöst und authentifizierte Live-Flows nicht als bestanden behauptet.
  • Ein anfänglicher Prebuild im bereits dirty Haupt-Worktree aktualisierte vorhandene Generated-JSONs; der vollständige Build lief danach isoliert. Die nicht eindeutig trennbaren Generated-Diffs wurden nicht zurückgesetzt; Lesson unter `workspace/tasks/lessons.md` ergänzt.
codexw3yh

Gesamt-Review und Rework-Plan 2026-07

added

  • Prüfplan, Gesamtbericht und phasenweiser Rework-Plan für Code, Funktion, Security, Betrieb, SEO, UI/UX, Arbeitgeber-Funnel und Blueprint-Lab angelegt.
  • Projekt-Backlog um W3YH-145 bis W3YH-150 ergänzt: Security-Notblock, Git-/Deploy-/Build-Determinismus, Suche/Tests/CI, Arbeitgeber-Visitenkarte, Lab-Registry sowie Performance/SEO/A11y/Launch.

reviewed

  • Öffentliche Produktion und isoliertes Blueprint-Lab auf Desktop, 390-Pixel-Mobile und 320-Pixel-Lab geprüft; Recruiter-Führung, Fokusfluss, Suchdialog, Kernartikel und Journal bewertet.
  • Private-Auth-, Handoff-, Rollen-, Redirect-, Content-, Metadata-, JSON-LD-, Sync- und Deploy-Pfade statisch geprüft.
  • VPS-Kapazität und bestehende Werkzeuge vor Zusatznutzung inventarisiert. Keine System- oder Globalpakete installiert; Lighthouse 13.4.0 nur über den npm-Cache genutzt.

verified

  • TypeScript und isolierter Production-Build grün, 223 statische Seiten.
  • Lighthouse Startseite mobil Median 95 und Desktop 99; `/notes` mobil Median 82.
  • Live-Crawl: 72 Sitemap-URLs und 224 daraus erreichbare interne Links erfolgreich; clientseitige Suchziele separat geprüft.
  • Quality-Gaps ausdrücklich dokumentiert: Lint 3 Fehler/10 Warnungen, Dependency-Audit 2 High/1 Moderate, Testbefehl mit exakt 0 Tests, kein CI.

notes

  • Kein Anwendungscode geändert und kein Deploy ausgelöst. Authentifizierte Live-Flows wurden mangels Zugangsdaten nicht als bestanden gewertet.
  • Ein anfänglicher Prebuild-Aufruf im bereits schmutzigen Haupt-Worktree hat vorhandene Generated-JSONs über die projektseitigen Sync-Hooks teilweise aktualisiert. Der Lauf wurde gestoppt, der vollständige Build danach isoliert ausgeführt und die nicht eindeutig trennbaren Generated-Diffs bewusst nicht zurückgesetzt.
  • Der öffentliche Auftritt bleibt Person-first-Arbeitgeber-Visitenkarte; das Lab wird als Experiment-Registry weitergeführt und ersetzt die Landing nicht.

Incidents

W3YH / Wave-Count-Producer [autonomous]
~45 minclaude

Problem: `tli-wave-count-build.mjs` pushte seit 09.07. still ins Leere (Non-Fast-Forward, Exit trotzdem 0); 4 Daten-Commits aufgestaut, Live-Wave-Count 5 Tage stale; historisch 7 Fremd-Commits auf `blueprint`/`feat`-Branches

Ursache: Cron committet im Haupt-Worktree ohne Branch-Guard und ohne Pull; der tägliche Journal-Bot schiebt `origin/main` weiter; git-Fehler wurde nur als JSON-Feld geloggt, nicht als Exit-Code

Fix: Branch-Guard (nur `main`), `fetch` + ff-only-Pull mit gezieltem Restore wegwerfbarer Sync-JSONs, Datei-Write nur noch bei Content-Change (kein Dauer-Dirty), `exitCode=1` bei git-Fehler; aufgestaute Commits per Merge nach `origin/main` gebracht

W3YH / RSI-Screener-Deploy [autonomous]
~20 minclaude

Problem: Cron Mo–Fr rief `deploy_rsi.sh`, das nicht existierte; öffentlicher Börsen-Screener seit 12.06. stale; kein Log-Redirect → ein Monat unbemerkt

Ursache: Script war nie eingecheckt (existierte nur untracked) und ging vermutlich bei Drift-/Aufräumarbeiten verloren

Fix: `deploy_rsi.sh` rekonstruiert: Branch-Guard, ff-only-Pull, Eigen-Log (`logs/rsi-deploy.log`), diesmal committet; Datenlauf + Push verifiziert

Persönliches Journal. Aufgaben werden über ein Agentensystem (OpenClaw, verschiedene LLMs) per Cron- und Telegram-Trigger ausgeführt; die Heatmap zeigt eine relative Compute-Aktivität in fünf Stufen.