← w3yh.xyz

journal day

Samstag, 11. April 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: hoch

Samstag, 11. April 2026

codexopenclaw

Google-Reauth und TLI-Volltext-Backfill live abgeschlossen

changed

  • **Google OAuth Stores (`gog` + `gws`)**
  • `gog` mit frischem Consent erneut autorisiert.
  • `gws` vom kaputten verschluesselten Token-Store auf einen frischen Plaintext-Credentials-Store mit demselben neuen Refresh-Token umgezogen; alte Dateien als Backup unter `~/.config/gws/backup-20260411T...Z/` weggeparkt.
  • **`thelonginvestor/scripts/backfill-tli-intake.mjs`**
  • Edgecase gefixt, bei dem ein doppelter `ticker + subject` innerhalb desselben Gmail-Laufs als `id=undefined` im Update-Zweig endete.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/app/api/insights/route.ts`**
  • TLI-Dedupe-Key auf `ticker + subject + created_at` umgebaut und bei gleichem Zeitstempel die laengere Summary bevorzugt, damit frisch hochgezogene Volltexte die alten Kurzfassungen im Feed verdrängen.
  • Patreon-Mail-Noise wie `In der App anzeigen`, Teilen-/Footer-Blocke im API-Sanitizer entfernt.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/lib/supabase.ts`**
  • denselben Timestamp-basierten TLI-Dedupe samt Laengen-Priorisierung und Kommentar-Bereinigung fuer den Client-/Fallbackpfad nachgezogen.

verified

  • `gog gmail messages search 'from:[E-Mail] newer_than:3d' --account [E-Mail] -j`
  • Ergebnis: `gog` liest Gmail wieder live.
  • `gws gmail users messages list --params '{"userId":"me","maxResults":3,"q":"from:[E-Mail] newer_than:3d"}' --format json`
  • Ergebnis: `gws` liest ebenfalls wieder live.
  • `node `thelonginvestor/scripts/backfill-tli-intake.mjs` --after 2026/03/25 --max 250`
  • Ergebnis: `19` Upgrades im zweiten Lauf; zuvor im ersten Teil-Lauf bereits die fehlenden `26` portfolio-relevanten TLI-Mails neu geschrieben.
  • `curl -s 'http://[localhost]/api/insights?ticker=HIMS&limit=3'`
  • Ergebnis: HIMS-TLI-Feed zeigt jetzt den langen Kommentar statt der alten 53-Zeichen-Kurzfassung; Footer-/Patreon-Muell ist aus der API-Antwort entfernt.
  • `npm test -- --runTestsByPath src/__tests__/components/NewsPanel.test.tsx`
  • Ergebnis: `5/5` Tests gruen.
  • `npm run build` in `.openclaw/workspace/projects/tyrone-terminal`
  • Ergebnis: Build gruen; danach `pm2 restart [process] + `pm2 save`.
codexopenclaw

TLI-Mail-Ingest auf Volltext-Kommentare und Upgrade-Backfills vorbereitet

changed

  • **`thelonginvestor/scripts/tli-gmail-hook-v2.mjs`**
  • den TLI-Cron von einem reinen `is:unread`-Leser auf einen wiederholbaren Recent-Scan (`newer_than:21d`) umgestellt, damit bereits vom OpenClaw-Gmail-Hook gelabelte und als gelesen markierte Mails spaeter noch mit besseren Kommentaren nachgezogen werden koennen.
  • Body-Parsing fuer `text/plain`/`text/html` gehaertet: URL-safe Base64, HTML-Entities, Absatzgrenzen und Patreon-/Footer-Noise bleiben jetzt getrennt statt als Ein-Zeile zusammenzufallen.
  • Kommentar-Extraktion auf ganze relevante Mail-Abschnitte gehoben; der Hook faellt nicht mehr auf nur den ersten "meaningful sentence" zurueck.
  • **`.openclaw/tli-briefing/tli-gmail-hook-v2.mjs`**
  • Produktivkopie auf denselben Stand gezogen, damit der Cronpfad ausserhalb des Repo-Spiegels dieselbe Volltext-Extraktion nutzt.
  • **`thelonginvestor/scripts/log-intake.mjs`**
  • `tli_entries` werden jetzt pro `ticker + subject` auf vorhandene Eintraege geprueft; laengere/bessere Kommentare aktualisieren den bestehenden Row statt stumme Duplikate zu erzeugen.
  • Kommentar-Sanitizing erhaelt Absatzumbrueche.
  • **`.openclaw/tli-briefing/log-intake.mjs`**
  • Produktivkopie des Intake-Loggers synchron mit demselben Upgrade-Verhalten versehen.
  • **`thelonginvestor/scripts/backfill-tli-intake.mjs`**
  • Backfill erkennt jetzt `Upgrade-Kandidaten` fuer bereits vorhandene Kurzfassungen und kann sie bei wieder verfuegbarem Gmail-Zugriff direkt verbessern.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/app/api/insights/route.ts`**
  • serverseitiges Comment-Sanitizing so umgebaut, dass TLI-Absatzstruktur im API-Output erhalten bleibt.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/lib/supabase.ts`**
  • Client-Sanitizing und TLI-Dedupe-Key auf absatzfreundliche Kommentare gehoben; Anzeige bleibt sauber dedupliziert, ohne Volltext wieder zusammenzustauchen.

verified

  • `node --check `thelonginvestor/scripts/tli-gmail-hook-v2.mjs`
  • `node --check `.openclaw/tli-briefing/tli-gmail-hook-v2.mjs`
  • `node --check `thelonginvestor/scripts/log-intake.mjs`
  • `node --check `.openclaw/tli-briefing/log-intake.mjs`
  • `node --check `thelonginvestor/scripts/backfill-tli-intake.mjs`
  • `npm test -- --runTestsByPath src/__tests__/components/NewsPanel.test.tsx`
  • Ergebnis: `5/5` Tests gruen.
  • `~/.local/bin/gws auth status`
  • Ergebnis: Google-Token weiter `token_valid: false`, `Token has been expired or revoked.`
  • `GOG_KEYRING_PASSWORD=... ~/.local/bin/gog gmail messages search 'from:[E-Mail] newer_than:7d' --account [E-Mail] -j`
  • Ergebnis: weiter `invalid_grant`; echter Backfill bleibt bis zur Gmail-Re-Auth blockiert.
codexopenclaw

Tyrone-Market-Feed um aufklappbare TLI-Karten erweitert

changed

  • **`.openclaw/workspace/projects/tyrone-terminal/src/components/NewsPanel/NewsPanel.tsx`**
  • Feed-Karten um lokalen Expand/Collapse-State erweitert; laengere TLI-Texte zeigen jetzt einen `Mehr`/`Weniger`-Schalter statt stumm auf fixer Vorschauhoehe stehen zu bleiben.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/components/NewsPanel/NewsPanel.css`**
  • Summary-Block fuer News-Items auf umschaltbare Vorschau gebracht; TLI-Zeilen kollabieren jetzt kompakt und wachsen beim Oeffnen sichtbar mit.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/__tests__/components/NewsPanel.test.tsx`**
  • Test fuer lange TLI-Zusammenfassungen ergänzt, der `Mehr` -> `Weniger` samt `aria-expanded` absichert.
  • **`.openclaw/workspace/INCIDENT_LOG.md`**
  • UI-Fix fuer nicht aufklappbare TLI-Karten dokumentiert.

verified

  • `npm test -- --runInBand src/__tests__/components/NewsPanel.test.tsx`
  • Ergebnis: `5/5` Tests gruen.
  • `npm run build` in `.openclaw/workspace/projects/tyrone-terminal`
  • Ergebnis: Build gruen.
  • `pm2 restart [process]
  • Ergebnis: produktiver Terminal-Prozess auf `:3000` mit frischem Build neu gestartet und gespeichert.
  • Browser-Check gegen `http://[localhost]`
  • Ergebnis: im TLI-Tab sind `Mehr`-Buttons sichtbar; nach Klick springt mindestens eine Karte auf `Weniger` um.
codexopenclaw

Tyrone Terminal auf echte Chart-Historie und serverseitige TLI-Reads gehoben

changed

  • **`.openclaw/workspace/projects/tyrone-terminal/src/app/api/chart/route.ts`**
  • neue serverseitige Chart-Route gebaut, die echte Yahoo-Finance-Historie fuer Tyrone-Ticker liefert statt synthetischer Verlaufspunkte; inklusive Alias-/`yahoo_symbol`-Aufloesung aus `tt_positions` und `tt_watchlist`.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/app/api/insights/route.ts`**
  • neue serverseitige Insights-Route eingebaut, die `tli_entries` mit Service-Role liest, Alias-Ticker mitnimmt, Rauschen filtert und deduplizierte TLI-Eintraege fuer den Browser ausliefert.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/lib/server/openclaw.ts`**
  • kleinen Server-Helper fuer Supabase-URL plus Service-Role-Key aus `~/.openclaw/openclaw.json` ergänzt, damit Tyrone API-Routen ohne neue lokale Secrets auf die Live-Daten zugreifen koennen.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/lib/supabase.ts`**
  • Browserpfade fuer `getHistoricalData()` und `getTLIEntries()` auf die neuen API-Routen umgestellt; echte Chartdaten werden jetzt live nachgeladen, statt im UI aus `generateDeterministicHistory()` zu kommen.
  • **`.openclaw/workspace/projects/tyrone-terminal/src/components/ChartPanel/ChartPanel.tsx`**
  • Chart-Kopf auf echten Referenzkurs umgestellt: fuer `1D` wird jetzt `chartPreviousClose` (`baseline`) statt des ersten Intraday-Opens verwendet, damit Header und Watchlist denselben Tagesmove zeigen.
  • **`.openclaw/workspace/INCIDENT_LOG.md`**
  • Incident fuer den Fake-Chart-/`TLI (0)`-Befund dokumentiert.

verified

  • `npm test -- --runInBand` in `.openclaw/workspace/projects/tyrone-terminal`
  • Ergebnis: `13` Test-Suites, `161` Tests gruen.
  • `npm run build` in `.openclaw/workspace/projects/tyrone-terminal`
  • Ergebnis: Build gruen; `app/api/chart` und `app/api/insights` werden als dynamische Routes gebaut.
  • `curl http://[localhost]/api/chart?ticker=ASTS&timeframe=1D`
  • Ergebnis: echte OHLCV-Kerzen fuer `ASTS`, letzte Kerze `close=94.90`, `baseline=91.61`.
  • `curl http://[localhost]/api/insights?ticker=ASTS&limit=5`
  • Ergebnis: ASTS-TLI-Eintraege werden wieder ausgeliefert; der neueste Eintrag stammt von `2026-04-08`.
  • Browser-Check gegen `http://[localhost]`
  • Ergebnis: Chart zeigt fuer `ASTS` nun `$94.90` und `+3.29 (3.59%)`; `MARKET FEED` zeigt `TLI (32)` statt `TLI (0)`.
  • Supabase-Gegencheck
  • Ergebnis: `x_tweets` enthaelt frische Cashtag-Eintraege bis `2026-04-11`; der Cashtag-Job wirkte heute also nicht ausgefallen.
codexopenclaw

Parqet-OAuth erneuert und Portfolio-Live-Sync wiederhergestellt

changed

  • **`.openclaw/parqet-token.json`**
  • Parqet-OAuth per Browser-Callback auf `localhost:46257/callback` erfolgreich neu autorisiert; Access- und Refresh-Token wurden frisch gespeichert.
  • **`.openclaw/workspace/tasks/todo.md`**
  • offenen Punkt `Parqet Refresh Token erneuern` aus `Mit Dominik jetzt machbar` entfernt, da der Re-Auth abgeschlossen ist.
  • **`.openclaw/workspace/INCIDENT_LOG.md`**
  • Live-Recovery des Parqet-Syncs als abgeschlossenen Incident dokumentiert.

verified

  • `node `thelonginvestor/scripts/sync-parqet.mjs`
  • Ergebnis: `Parqet Sync erfolgreich: 26 Positionen.`
  • Snapshot neu geschrieben: `.openclaw/workspace/data/portfolio-parqet-live-2026-04-11.json`
  • nachgelagerter Terminal-Sync ebenfalls gruen: `positions=26, watchlist=18`
codexopenclaw

Parqet-Sync meldet Re-Auth jetzt direkt mit konkretem Recovery-Pfad

changed

  • **`thelonginvestor/scripts/sync-parqet.mjs`**
  • invaliden Parqet-Refresh-Token (`refreshToken not valid`) als eigenen Fehlerpfad gekennzeichnet.
  • produktive Fehlermeldung um direkte Re-Auth-Anweisung erweitert: `node `thelonginvestor/scripts/parqet-auth.mjs` plus Hinweis auf den benoetigten `localhost:3000 -> [localhost]` Tunnel.
  • **`.openclaw/workspace/INCIDENT_LOG.md`**
  • den aktuellen Parqet-Refresh-Token-Ausfall und die Recovery-Massnahme dokumentiert.

verified

  • `node --check `thelonginvestor/scripts/sync-parqet.mjs`
  • Ergebnis: Syntax ok.
  • `node `thelonginvestor/scripts/sync-parqet.mjs`
  • Ergebnis: Fehlerpfad reproduziert; Meldung verweist jetzt explizit auf den Re-Auth-Flow statt nur auf den lokalen Fallback.
  • `node `thelonginvestor/scripts/parqet-auth.mjs`
  • Ergebnis: frischer OAuth-Link wird ausgegeben und der Listener bindet auf `[localhost]`.

notes

  • der Live-Sync bleibt bis zum Browser-basierten Parqet-Login auf dem lokalen Stand von `2026-04-08`; der technische Recovery-Pfad ist jetzt aber wieder sofort sichtbar.

Incidents

Tyrone Terminal / TLI Feed UI
~15 mincodex

Problem: Lange TLI-Nachrichten im Market Feed liessen sich nicht aufklappen; die Kartenhoehe blieb fuer Nutzer faktisch auf einer starren Vorschau stehen

Ursache: Im `NewsPanel` gab es fuer TLI-Items keinen Expand/Collapse-Zustand und keine sichtbare Action, um laengere Kommentare aufzufalten

Fix: TLI-Karten im `NewsPanel` um `Mehr`/`Weniger`-Toggle plus kollabierte Vorschau erweitert, CSS auf sichtbares Aufwachsen der Karten umgestellt, Tests ergänzt und den produktiven PM2-Run danach neu gestartet

Tyrone Terminal / Chart-Historie + TLI Feed
~35 mincodex

Problem: Der Terminal-Chart zeigte synthetische Kerzen/Volumen statt echter Historie und der Market-Feed blieb im Browser bei `TLI (0)`, obwohl TLI-Mails live in Supabase lagen

Ursache: `getHistoricalData()` erzeugte im Live-UI weiter Verlaufspunkte aus `generateDeterministicHistory()`, und `tli_entries` waren nur per Service-Role lesbar, waehrend der Browser anonym auf RLS lief

Fix: serverseitige `/api/chart`-Route fuer echte Yahoo-Historie und `/api/insights` fuer TLI-Reads gebaut, Browserpfade in `supabase.ts` darauf umgestellt und den Chart-Kopf fuer `1D` auf `chartPreviousClose` (`baseline`) gehoben; Live-Check danach mit `ASTS $94.90 +3.29 (3.59%)` und `TLI (32)` erfolgreich

Parqet Sync / OAuth Re-Auth
~10 mincodex

Problem: Der Portfolio-Live-Sync hing seit `2026-04-08` am ungueltigen Parqet-Refresh-Token und lief nur noch gegen das stale lokale `portfolio.json`

Ursache: Der gespeicherte `refresh_token` war von Parqet serverseitig nicht mehr gueltig; ohne erneuten Browser-Login konnte kein neuer Access-Token mehr ausgestellt werden

Fix: Parqet-OAuth ueber den lokalen Callback auf `localhost:46257/callback` erfolgreich neu autorisiert, `parqet-token.json` frisch geschrieben und den produktiven Sync danach direkt wieder gruen verifiziert (`26` Positionen, Snapshot `2026-04-11`, Terminal-Sync `positions=26`, `watchlist=18`)

Parqet Sync / OAuth Re-Auth
~20 mincodex

Problem: Der taegliche `portfolio:parqet-sync` lief weiter in den lokalen Fallback, aber der produktive Fehlerpfad gab keinen direkten Recovery-Befehl fuer den abgelaufenen Refresh-Token aus

Ursache: Parqet lehnt den gespeicherten `refresh_token` mit `refreshToken not valid` ab; ohne expliziten Re-Auth-Hinweis blieb nur die Telegram-Fehlermeldung plus stale `portfolio.json` vom `2026-04-08`

Fix: produktiven `thelonginvestor/scripts/sync-parqet.mjs` um einen klaren Re-Auth-Hinweis (`node `thelonginvestor/scripts/parqet-auth.mjs` + Port-Forward-Hinweis) erweitert, Fehler lokal reproduziert und einen frischen OAuth-Listener auf `[localhost]` vorbereitet

TLI Mail / Volltext-Ingest
~55 mincodex

Problem: TLI-Kommentare in `tli_entries` wurden auf 1-3 Saetze bzw. stumpfe Satzschnipsel reduziert und spaeter in API/UI erneut zu einer Ein-Zeile zusammengezogen

Ursache: der Gmail-Hook extrahierte nur den ersten "meaningful sentence", `log-intake` schrieb ohne Upgrade-Pfad Duplikate bzw. liess Kurzfassungen stehen, und `sanitizeComment()` flachte Absatzstruktur im Server-/Client-Feed wieder ab

Fix: `tli-gmail-hook-v2.mjs` auf robuste Volltext-Extraktion plus Recent-Rescan umgestellt, `log-intake.mjs` auf bestehende Rows mit Kommentar-Upgrade gehoben, `backfill-tli-intake.mjs` auf Upgrade-Kandidaten erweitert und Tyrone-Insights-Sanitizer so angepasst, dass Absatzumbrueche erhalten bleiben

Google Mail Auth / TLI Backfill
~70 mincodex

Problem: Volltext-Backfill war trotz Parser-Fix blockiert, weil sowohl `gog` als auch `gws` mit widerrufenen Google-Tokens liefen; beim ersten echten Backfill-Lauf hing zusaetzlich ein In-Run-Dedupe-Fehler an `id=undefined`

Ursache: Google-OAuth war abgelaufen; `gws` hing noch an einem verschluesselten, toten Refresh-Token-Store. Im Backfill wurden spaetere Dubletten desselben `ticker + subject` auf einen noch nicht geschriebenen Insert-Kandidaten wie auf einen DB-Row gemappt

Fix: `gog` neu autorisiert, frischen Refresh-Token in einen neuen funktionierenden `gws`-Credentials-Store uebernommen, alte `gws`-Caches als Backup weggeparkt, `backfill-tli-intake.mjs` fuer In-Run-Upgrades ohne DB-ID gepatcht, danach Backfill ab `2026-03-25` erfolgreich mit `26` neuen Eintraegen und `19` Volltext-Upgrades gefahren; Tyrone-Dedupe/Patreon-Noise im Insights-Pfad anschliessend live nachgezogen

kuratiert

Redaktionelle Notes zu diesem Tag

journaljournal / stocktracker / produkt / architektur

Stocktracker wird zur öffentlichen Markets-App

TL;DR

Der bestehende Stocktracker passt inhaltlich gut unter `w3yh`, aber nicht als Kopie des privaten Portfolio-Tools. Der Scope wurde bewusst auf öffentliche Marktdaten reduziert: Quotes, Company Info, Fundamentals und EU/US-Vergleich. Persönliche Portfolio- und Watchlist-Daten bleiben draußen.

Basis in den Logs

  • w3yh-Changelog vom 10. April 2026: stocktracker-Audit und Scope-Entscheidung
  • w3yh-Audit-Dokument: Produkt-Fit, Domain-Empfehlung und Go-Live-Blocker

Was gemacht wurde

  • Produkt-Fit zwischen Stocktracker und w3yh bewertet und als positiv entschieden.
  • Bevorzugte Ziel-Domain auf `markets.w3yh.xyz` festgelegt.
  • Klaren Product-Cut definiert: oeffentliche Marktdaten ja, private Portfolio-Logik nein.
  • Technischen Repo-Stand auditiert und Blocker fuer den Go-Live identifiziert.
  • Codebase wieder auf gruenen Build gebracht und mit API-Guards, Cache-Layer und EU-Ticker-Mappings deployed.

Verifiziert

  • Die bestehende Production-URL antwortet weiterhin mit `HTTP 200`.
  • `npm run lint` und `npm run build` laufen wieder sauber durch.
  • API-Routes sind mit Rate-Limiting und Origin-Validierung abgesichert.

Warum

Ein gutes internes Tool direkt oeffentlich zu machen, endet meistens in einer App, die weder fuer die eine noch fuer die andere Zielgruppe richtig passt. Der bewusste Schnitt zwischen oeffentlichem Research-Slice und privatem Portfolio-Kontext macht beide Seiten ehrlicher.

Persönliches Build-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.