← w3yh.xyz

journal day

Montag, 27. 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: Spitze

Montag, 27. April 2026

claude-opus-4.7w3yh

Parser + Body-Redaction für Marker und UTC-Tageszeiten

fixed

  • **`scripts/sync-journal.mjs`** — Format-1- und Format-2-Header-Regex erkannten das `[autonomous]/[manual]/[hybrid]`-Marker-Token nicht. Folge: Die Parser-Branch fiel auf Format 7 zurück (catch-all), wodurch ` | [autonomous] | claude-opus-4.7 |` als Titel-Präfix in `content/journal-data.json` landete. Public auf `/notes/day/2026-04-26` erschien dadurch sichtbar die Uhrzeit. Regex erweitert um optionalen Marker-Block `(?:\[\w+\]\s*\|\s*)?` zwischen UTC und Agent; Agent-Pattern um Punkt erweitert (`[\w.-]+`) für Modellnamen wie `claude-opus-4.7`. Marker selbst wird bewusst nicht ins Output-Schema übernommen — public soll keinen Marker zeigen.
  • **`scripts/sync-journal.mjs::redact()`** — drei neue Body-Redact-Regeln:
  • ISO-Timestamps `2026-04-25` → `2026-04-25` (nur Datum)
  • `25.04` / `25.04.` → `25.04`
  • Standalone `` → entfernt
  • Doppelte Spaces aufgeräumt
  • Verifizierter Audit: `0` echte `\b\d{1,2}:\d{2}\s*UTC\b`-Mentions im gesamten Journal nach Sync. Verbliebene `UTC`-Strings sind Code-Referenzen (z.B. `` `{entry.time} UTC` `` als Code-Identifier in Backticks), keine Tageszeiten.

notes

  • Source-Changelog-Dateien bleiben unangetastet — Marker und Timestamps stehen weiter intern in `w3yh.xyz/changelog/*.md` und `.openclaw/changelog/*.md`. Public-Schutz ist die Sync-Pipeline.
  • Build grün.
claude-opus-4.7w3yh

Frame-Tonalität entschärft — von „Anwalts-Briefing" auf neutral

changed

  • **`src/components/notes/notes-shell.tsx`** — Footnote von zwei detaillierten Absätzen auf einen kurzen Satz reduziert: „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." Die explizite Erwähnung „außerhalb der Arbeitszeit", „abends/Wochenende geplant", „Compute-Zeit ≠ Aufmerksamkeitszeit", „manuelle Sessions ausgeschlossen", „Parallel-Cron-Akkumulation mit Beispiel" und „Uhrzeiten werden nicht ausgewiesen" ist entfernt — solche detaillierten Verteidigungen lesen sich wie ein vorbereitetes Skript und ziehen genau die Aufmerksamkeit auf sich, die man eigentlich vermeiden will.
  • **`src/app/notes/page.tsx`** — Eyebrow `hobby journal · außerhalb der arbeitszeit` → `journal`, Title `Privates Build-Journal` → `Build-Journal`, Description ohne „außerhalb der Arbeitszeit"-Phrase. Browser-Tab-Title analog. Bleibt klar als persönliches Hobby-Journal lesbar (URL ist `w3yh.xyz`, Inhalt ist persönliche Build-Doku), aber ohne explizites Highlighting.
  • **`src/components/notes/activity-indicator.tsx`** — „Compute-Aktivität" → „Aktivität"; Tooltip „Relative Compute-Aktivität der LLM-Agenten — keine menschliche Aufmerksamkeitszeit" → „Relative Aktivität des Agentensystems".
  • **`src/components/journal/journal-view.tsx`** — Day-Square Tooltip „Compute-Aktivität: hoch" → „Aktivität: hoch".
  • **`src/components/notes/activity-heatmap.tsx`** — `aria-label` auf „Aktivitäts-Heatmap" angepasst.

notes

  • **Tonalitäts-Audit:** Die alte Footnote war faktisch korrekt, aber der Detailgrad („fünf Tasks à 60 Minuten Compute = fünf Compute-Stunden bei einer einzigen Wall-Clock-Stunde") schreit dass jemand sich vorbereitet hat. Neutral formuliert wirkt das gleiche Modell unauffälliger.
  • **Substanz bleibt:** Heatmap-Buckets (5 Stufen) sind unverändert, konkrete Stunden weiterhin nirgendwo public, manuelle Sessions weiterhin in `sync-autonomous-hours.mjs` mit `[manual]`-Filter ausgeschlossen — das wird jetzt nur nicht mehr explizit annonciert.
  • **Build grün, TS clean.**
claude-opus-4.7w3yh

Heatmap statt Stunden — Maximal-Tarnung für /notes-Aktivität

added

  • **`src/components/notes/activity-indicator.tsx`** — Day-Page-Indicator. Zeigt einen 5-Stufen-Bucket (ohne · niedrig · mittel · hoch · Spitze) statt einer konkreten Stundenzahl. Für `absent` rendert nichts.
  • **`src/components/notes/activity-heatmap.tsx`** — GitHub-style Reihe von Mini-Squares pro Monat. Jedes Square = ein Tag, gefärbt nach Bucket. Tooltip beim Hover gibt Datum + Bucket-Label.
  • **`src/lib/autonomous-hours.ts`** — `getActivityBucket()`, `getDayBucket()`, `getMonthBucket()`, `ACTIVITY_LABEL`-Map und `ACTIVITY_SQUARE_CLASS`-Map. Tages-Schwellen: 0/1h/3h/6h/>6h. Monats-Schwellen: 0/20h/60h/120h/>120h. Konkrete Stunden bleiben in `content/autonomous-hours.json` für interne Auswertung, werden aber nirgendwo public gerendert.

changed

  • **`src/components/journal/journal-view.tsx`** — Monatsindex-Header zeigt jetzt eine `<ActivityHeatmap />`-Reihe statt „X h Compute". Day-Cards zeigen ein farbiges Mini-Square (3×3px) statt „X h Compute". Beide haben Tooltip-Texte für die Bucket-Bedeutung.
  • **`src/app/notes/day/[date]/page.tsx`** — `<AutonomousHoursBadge />` durch `<ActivityIndicator />` ersetzt: zeigt jetzt „Compute-Aktivität an diesem Tag: hoch" statt „6:07 h autonome Compute-Zeit". Komponente `autonomous-hours-badge.tsx` gelöscht.
  • **`src/components/notes/notes-shell.tsx`** — Footnote-Absatz 2 angepasst: erklärt jetzt das 5-Stufen-Bucket-System statt Compute-Stunden. Parallel-Cron-Erklärung bleibt drin (jetzt: „eine Spitze entsteht oft schon, wenn fünf Tasks gleichzeitig 60 Minuten Compute aufwenden"). Manuelle Sessions weiterhin explizit ausgeschlossen.

verified

  • `npx tsc --noEmit` clean.
  • `npm run build` grün.
  • Höchste Tageswerte (13.35h Mi 2026-03-18, 8.18h Fr 2026-03-27) zeigen public jetzt nur noch „Spitze" — ohne konkrete Zahl, ohne Wochentag-Kontext.

notes

  • **Tarnungsstufe maximal:** Konkrete Stundenwerte sind nirgendwo mehr public sichtbar (auch nicht im Tooltip — nur Bucket-Label). Für interne Auswertung bleibt das volle JSON in `content/autonomous-hours.json` (nicht durch sync, sondern als Build-Artefakt im Repo).
  • **Reversibel:** Wenn du später doch Stunden wieder zeigen willst, einfach die zwei alten Komponenten zurückrollen — die Daten-Layer-Funktionen `formatHoursMinutes` etc. bleiben erhalten.
claude-opus-4.7w3yh

Public-Privacy-Härtung: /notes als Hobby-Compute-Journal eindeutig framen

changed

  • **`src/components/notes/notes-shell.tsx`** — Footnote von einem Absatz auf zwei verschärft. Kernaussagen explizit: (1) privates Hobbyprojekt außerhalb der regulären Arbeitszeit, (2) Aufgaben werden abends/am Wochenende geplant und an LLM-Agenten übergeben, (3) Cron- und Telegram-Trigger laufen autonom ab, (4) eigener Zeitanteil = Plan + Mobile-Bestätigungen, kein durchgehendes Coden, (5) ausgewiesene Stunden = Compute-Zeit der Agenten, nicht menschliche Aufmerksamkeitszeit, (6) parallele Cron-Tasks akkumulieren (5 Tasks à 60 min Compute = 5 Compute-Stunden bei 1h Wall-Clock), (7) manuelle Hand-Coding-Sessions sind explizit aus dem public Aggregat ausgeschlossen.
  • **`src/components/notes/autonomous-hours-badge.tsx`** — Text von „X:XX Stunden hat OpenClaw selbstständig für mich gearbeitet" auf „X:XX h autonome Compute-Zeit der LLM-Agenten — Plan vom Vorabend, Cron- und Telegram-Trigger, parallel kumulierend" gedreht. Verlässt das Frame „Stunden für mich gearbeitet" (klingt nach menschlicher Tätigkeit) und betont stattdessen Compute-Charakter und Trigger-Modell.
  • **`src/components/journal/journal-view.tsx`** — Inline-Stundenanzeige im Monatsindex und in den Day-Cards: „X h" → „X h Compute", plus Tooltip „Compute-Zeit der LLM-Agenten — keine menschliche Aufmerksamkeitszeit".
  • **`src/app/notes/page.tsx`** — Page-Title „Build-Journal" → „Privates Build-Journal", Eyebrow `journal` → `hobby journal · außerhalb der arbeitszeit`, Description erweitert um „Compute-Zeit eines autonomen LLM-Agentensystems (OpenClaw), das nach abendlichen Plänen über Cron- und Telegram-Trigger Aufgaben abarbeitet". Browser-Tab-Title in `metadata` analog auf „Hobby Build-Journal | w3yh.xyz".

notes

  • **Angriffsvektoren-Audit:** Top-Tage waren 2026-03-18 (13.35h Mittwoch), 2026-03-27 (8.18h Freitag), 2026-03-19 (6.86h Donnerstag). Mit der neuen Frame-Ebene klar als Compute-Stunden ausgewiesen, parallele Cron-Akkumulation in Footnote erklärt — dadurch ist eine arbeitgeberseitige Rückfrage „warum hast du am Mittwoch 13h gecodet" entkräftbar.
  • **Body-Inhalte der Einträge** wurden bewusst nicht angefasst: dort stehen technische Listen (geänderte Dateien, Verifikations-Schritte, Cron-Outputs wie „morning sweep "). Diese sind eindeutig als Agent-Output markiert und enthalten keine Aussagen zu menschlicher Tätigkeitszeit.
  • **Manuelle Sessions sind in `sync-autonomous-hours.mjs` schon ausgefiltert** (`[manual]`-Marker). Footnote weist das jetzt auch öffentlich aus.
claude-opus-4.7w3yh

W3YH-112 News-Phase abgeschlossen, Phase 2 als W3YH-114 ausgekoppelt

changed

  • **`tasks/todo.md`** — W3YH-112 von `[/]` auf `[x]` (News-Phase ist scope-konform abgeschlossen, X-Sentiment war im todo zwar erwähnt aber als Phase 2 immer separat gedacht). Neuer Eintrag **W3YH-114 Pressespiegel-Sentiment Phase 2: X-Tweets** angelegt mit klarer Umsetzungsskizze: (1) RPC `kg_portfolio_sentiment` um Datums-Filter erweitern, (2) `aggregatePerTicker()` um `news.x`-Block, (3) Komponente um zweite Sektion „X · Engagement".

notes

  • **Warum auskoppeln statt W3YH-112 offen lassen:** X braucht eine SQL-/RPC-Änderung in einem fremden Schema (`kg_chunks`-Migration), die nicht zum Recap-Scope gehört. Eigener Ticket macht Done-Kriterien sauber.
  • Kein Code geändert, nur Planungs-Restruktur.
claude-opus-4.7w3yh

W3YH-112 Pressespiegel-Sentiment im Weekly Recap (News-Phase) (News-Phase)

added

  • **`scripts/lib/pressespiegel.mjs`** — Helper-Modul: `fetchNewsForWeek()` queryt `news_feed` für Recap-Ticker einer Woche; `aggregatePerTicker()` wendet Quality-Filter an (Source-Whitelist {Yahoo Finance, Benzinga, Finviz, Handelsblatt, Reuters}, Headline ≥ 8 Wörter, Jaccard-Dedup ≥ 0.6, MIN_MENTIONS=2) und liefert pro Ticker `{mentions, sentiment{pos/neu/neg}, topHeadlines[3], sourceCount}`. `renderPressespiegelMdx()` serialisiert das als `<Pressespiegel data={{...}} />` JSX-Prop.
  • **`src/components/portfolio/pressespiegel.tsx`** — Render-Komponente: Sentiment-Tabelle mit drei Buckets (positiv/neutral/negativ), darunter Top-3-Headlines mit Source-Tag und Sentiment-Farb-Marker. Empty-State (keine News) rendert nichts. Optional `note`-Pfad für „bewusst leer"-Fälle.

changed

  • **`scripts/portfolio-draft.mjs`** — pulled Pressespiegel-Daten parallel zu `tli_entries`-Fetch für Block-A-+-B-Ticker; Embed pro Ticker-Block zwischen TLI-Meta und Take-TODO. Recap-Reihenfolge ist jetzt: TLI-Interpretation → Pressespiegel → Meine Lesart (laut W3YH-112-Plan). Wenn keine News-Daten ≥ MIN_MENTIONS für einen Ticker existieren, kommt ein Komentar-Marker statt der Komponente.
  • **MDX-Imports** in generierten Drafts: `import { Pressespiegel } from "@/components/portfolio/pressespiegel"` wird automatisch oben angefügt.

verified

  • Helper-Logik mit synthetischem Datensatz: UNH 3 Mentions (Jaccard hält drei distinkte Headlines durch), HIMS 2 Mentions (1 positiv + 1 negativ), ZVRA <8 Wörter rausgefiltert, Sub-MIN_MENTIONS-Ticker fallen weg.
  • `node --check` auf beide neuen Module grün.
  • `npx tsc --noEmit` clean.
  • `npm run build` grün — KW16/KW17-Recaps importieren `Pressespiegel` nicht und bleiben unverändert (kein retroaktiver Umbau).
  • MDX-Compile-Smoke (`@mdx-js/mdx` direkt) auf JSX `<Pressespiegel data={{...stringified...}} />` parsed sauber, output length 972 Zeichen.

notes

  • **X-Sentiment ist Phase 2 innerhalb von W3YH-112.** `kg_portfolio_sentiment(ticker, limit)` RPC liefert Tweet-Engagement, hat aber keinen direkten Datums-Filter (Timestamp liegt in `kg_chunks.metadata` jsonb). Wenn der KG-Layer eine wochenscharfe Wochen-Query bekommt, wird der `news.x`-Block in `aggregatePerTicker()` nachgezogen.
  • **KW16 + KW17 wurden bewusst nicht rückwirkend umgestellt.** Das Pressespiegel-Block-Format greift erst ab dem nächsten Draft (KW18 ab 2026-05-04).
  • **Quality-Filter sind deterministisch festverdrahtet** in `PRESSESPIEGEL_CONSTANTS`. Tuning später, wenn KW18-Daten zeigen, wo die Schwellen falsch liegen.
claude-opus-4.7w3yh

Status-Reviews W3YH-112 + W3YH-92

reviewed

  • **W3YH-112 Pressespiegel-Sentiment** — nicht angefangen. Plan liegt extern in Antigravity-Konversation `0e6dbc9e` (`implementation_plan.md`). Keine Scripts (`scripts/portfolio-*.mjs` ohne `news_sentiment`-Logik), keine `<Pressespiegel />`-Komponente, KW17-Recap (`content/portfolio/kw-17-2026.mdx`) hat nur Block A/B + „Auch erwähnt". Bereit zum Bau, wartet auf Freigabe.
  • **W3YH-92 Phase 3b Qwen3.5 Draft-Filler** — korrekt geparkt. Phase 3a hat 2 Recaps stabil produziert (KW16 + KW17, beide live). Memory-Bedingung „3-4 Wochen stabil" → wir sind in Woche 2/3-4. Frühestens nach KW18 reviewen, Phase 3b ab KW19 sinnvoll. Kein Handlungsbedarf jetzt.

notes

  • Kein Code geändert, kein Build nötig. Reviews dokumentiert hier + in `tasks/todo.md`.
claude-opus-4.7w3yh

W3YH-113 OpenClaw-Stunden auf /notes — Hybrid-Aggregator + Tag/Monat-Anzeige

added

  • **`scripts/sync-autonomous-hours.mjs`** — neuer Aggregator. Hybrid aus zwei Quellen: (1) `.openclaw/cron/runs/*.jsonl` mit sekundengenauer `durationMs` aus Cron-Background-Runs, (2) `INCIDENT_LOG.md` `Aufwand`-Spalte (`~25 min`, `~1h` etc.) für interaktive Sessions außerhalb von Cron. Marker-Konvention beachtet: `[manual]`-Zeilen werden ausgeschlossen, `[hybrid]` zählt zu 50%, Default-Annahme ohne Marker = autonomous.
  • **`content/autonomous-hours.json`** — Build-Artefakt mit `totalSeconds`, `perDay`, `perMonth`, getrennte `cronSeconds`/`incidentSeconds`-Quellen.
  • **`src/lib/autonomous-hours.ts`** — Helper für Day/Month/Total-Lookups + `formatHoursMinutes()`.
  • **`src/components/notes/autonomous-hours-badge.tsx`** — größeres Badge für Day-Page mit Text „X:XX Stunden hat OpenClaw an diesem Tag selbstständig für mich gearbeitet" (Sätze konfigurierbar pro Scope: day/month/total).
  • **Tag-Anzeige** in `src/app/notes/day/[date]/page.tsx` — Badge ganz oben über den Day-Sections.
  • **Monat-Anzeige** in `src/components/journal/journal-view.tsx` — Stunden-Summe pro Monat im Section-Header und kompakter Tageswert in der Day-Card unter dem Datum.

verified

  • `node scripts/sync-autonomous-hours.mjs`: 86 Cron-Files (~59.6h) + 173 Incident-Einträge (~73.9h) = 133.5h gesamt über 68 Tage / 3 Monate.
  • März 72.6h, April 58.6h, Februar 2.2h. Top-Tag 2026-03-18 mit 13.4h (Migrations-Block).
  • `npx tsc --noEmit` clean, `npm run build` grün.

notes

  • Marker-Default `autonomous` für Altbestand ohne Marker ist eine bewusste Annahme (99% der bisherigen Arbeit waren tatsächlich claude/codex über das Agentensystem). Wenn künftige `[manual]`-Sessions in den Incident-Log wandern, fallen sie automatisch aus der public Stundenzahl.
  • `sync-autonomous-hours.mjs` muss vor jedem Build laufen, damit das JSON aktuell ist. Sollte als Pre-Build-Hook in `package.json` oder als Teil von `sync-journal.mjs` aufgerufen werden — Folge-Aufgabe.
  • W3YH-113 ist damit aus „Offen" raus.
claude-opus-4.7w3yh

W3YH-94 Umlaute-Altbestand nachgezogen + W3YH-79 Gym-Tracker als Journal-Source eingebunden

changed (w3yh-94)

  • **`changelog/2026-02.md`**, **`changelog/2026-03.md`**, **`changelog/2026-04.md`**, **`PLAN.md`** und 13 Doku-Dateien (`docs/auth.md`, `docs/private-hub.md`, `docs/public-journal.md`, `docs/operations.md`, `docs/mailflow-audit.md`, `docs/security-audit-tyrone.md`, `docs/stocktracker-audit.md`, `docs/tli-portfolio-recap.md`, `docs/comfort-login-scope.md`, `docs/about-me-public-profile-plan.md`, `docs/cross-subdomain-shell.md`, `docs/cross-subdomain-shell-rollout.md`, `docs/ui-ux-review-2026-04-24.md`) — kompletter Altbestand auf echte Umlaute (ä/ö/ü/ß) gehoben. 225 distinkte Wörter über 15 Dateien per deterministischem Python-Sweep ersetzt.

added (w3yh-79)

  • **`scripts/sync-journal.mjs`** — neue Source `gym` und neuer Header-Format-9-Parser für Versions-Header `## vX.Y.Z — YYYY-MM-DD (Suffix)`. Pulls aus `gym-tracker/CHANGELOG.md`. Titel wird als `vX.Y.Z` bzw. `vX.Y.Z (Suffix)` übernommen.
  • **`src/lib/journal.ts`** — `ChangelogEntry["source"]` Union um `"gym"` erweitert.

verified

  • Umlaute-Sweep: vier Revert-Passes für false positives (`neueste`/`zuerst`/`aktuelle`/`bauen`/`feuer`/`dauer`/`Quelle`/`Mauer`/`steuern`/`visuell`/`eventuell` etc.) sauber zurückgedreht; Final-Grep zeigt nur noch korrekte deutsche Umlaut-Wörter.
  • `npx tsc --noEmit` clean.
  • `node scripts/sync-journal.mjs`: `gym/CHANGELOG.md: 4 entries` aufgenommen, gesamt 567 Einträge auf 56 Tage in 3 Monaten (vorher 556/54/3).
  • `npm run build` grün.

notes

  • W3YH-94 ist abgeschlossen. Künftige Commits/Logs schreiben Umlaute direkt korrekt — Memory `feedback_umlaute.md` deckt das ab.
  • W3YH-79: Gym ist drin. Tyrone und Spielplatzcheck haben keine eigenen Source-Changelogs (Tyrone-Aktivität läuft über `openclaw/changelog/*` und `INCIDENT_LOG.md`, Spielplatzcheck ebenso). Stocktracker bleibt laut todo bewusst „später".
  • Gym-Header haben kein eigenes Agent-Feld → fallen auf `agent: "system"` zurück. Wenn künftig eine Source ihren Agent angeben soll, muss das Format-9 erweitert werden.
claude-opus-4.7w3yh

Arbeits-Attribution-Marker eingeführt + Uhrzeit aus public /notes-Render entfernt

added

  • **`AGENTS.md`** — Block `work-attribution-marker` festschreibt die Konvention `[autonomous]` / `[manual]` / `[hybrid]` für Changelog- und Incident-Log-Header. Beispiel-Header und Beispiel-Incident-Zeile sind beigelegt.
  • **`src/components/notes/notes-shell.tsx`** — Footer-Footnote unter jedem `/notes`-View: "Einträge entstehen überwiegend autonom durch das OpenClaw-Agentensystem; Uhrzeiten werden bewusst nicht öffentlich ausgewiesen, da sie als Verarbeitungs-Slots der Agenten und nicht als Echtzeit der menschlichen Tätigkeit zu verstehen sind."

changed

  • **`src/components/journal/journal-day-section.tsx`** — `{entry.time} UTC` aus dem Render der Changelog-Karten entfernt. Datum bleibt sichtbar (Section-Header), Uhrzeit verschwindet aus dem public Surface; im React-`key` bleibt sie als interner Diskriminator erhalten.

verified

  • `npx tsc --noEmit` clean.
  • `journal-data.json` wird vom sync weiterhin mit `time` befüllt (intern), aber `/notes/day/[date]` zeigt es nicht mehr.

notes

  • Public surface zeigt **kein** Marker selbst — nur die Footnote rahmt die Daten als überwiegend autonom.
  • Intern (Changelogs, Incident-Log auf VPS) wird ab sofort jeder neue Eintrag mit Marker versehen. Backfill alter Einträge ist nicht geplant.
  • Memory `feedback_work_attribution_marker.md` legt die Konvention für künftige Sessions ab.
systemw3yh

| [autonomous] | antigravity (opus-4.6-thinking) | W3YH-97 Cmd+K Command Palette — globales Omnibar

added

  • **`src/components/command-palette/command-palette.tsx`** — Client-Komponente, mountet im Root-Layout. Registriert globalen `⌘K / Ctrl+K`-Shortcut. Drei Suchgruppen: Navigation (5 interne Seiten), Apps (7 externe Links mit ↗-Badge), Journal (200 Einträge, lazy via `/api/journal-search`). Fuzzy-Suche über Titel + Agent + Source + Datum. Keyboard-first: ↑↓ navigieren, ↵ öffnen, Esc schließen. Rendert nichts bis Shortcut gedrückt (zero-impact auf Seitenladung).
  • **`src/app/api/journal-search/route.ts`** — API-Route, liefert flache Journal-Einträge als Command-Items. cmdk filtert client-seitig; Server liefert max. 200 Einträge.
  • **Dependency:** `cmdk@1` installiert (package.json + lock).

changed

  • **`src/app/layout.tsx`** — `<CommandPalette />` als letztes Kind von `<body>` gemountet.
  • **`src/app/globals.css`** — ~200 Zeilen CSS für Cmd+K-Overlay: Glassmorphism-Backdrop mit `blur(8px)`, `terminal-panel`-gleiches Farbschema, Scale+Fade-Animation (150ms cubic-bezier), Keyboard-Hint-Footer mit `<kbd>`-Tags, Scroll-Container mit `overscroll-behavior: contain`, Group-Headings in Mono-Uppercase.

verified

  • `npm run build` grün (Exit 0).
  • Dev-Server gestartet, Ctrl+K öffnet Palette, Suche filtert korrekt (z.B. „gym" zeigt App + Journal-Einträge), Esc schließt.

notes

  • Cross-Domain-Teil (Palette auf Subdomains wie `gym.w3yh.xyz`) bleibt bei T1 nach Claude's Shell-Merge (`W3YH-102`).
  • W3YH-97 ist damit aus „Offen" raus.
systemw3yh

| [autonomous] | antigravity (sonnet-4.6-thinking) | W3YH-96 Accessibility + W3YH-79 Journal Agent-Map

changed (w3yh-96 accessibility)

  • **`spielplatzcheck-canonical/spielplatzcheck/components/FilterBar.tsx`** — `aria-label={option.label}`, `aria-pressed` auf Filter-Buttons, `aria-hidden="true"` auf dekorative Emoji-Spans.
  • **`carpark-brain-attack/public/index.html`** — `aria-label` + `aria-pressed` auf `toggleSound`, `toggleMusic`, `toggleVibrations`, `pauseBtn`.
  • **`carpark-brain-attack/src/ui/menu.js`** — `updateSettingsUI()` synct `aria-pressed`-State bei Toggle-Änderung; dynamische Level-Buttons bekommen `aria-label` mit Sperr-/Abschluss-Status.

changed (w3yh-79 journal agent-map)

  • **`scripts/sync-journal.mjs`** — `SOURCE_AGENTS`-Map eingeführt: pro Changelog-Source ein optionaler Default-Agent (z.B. `gym` → `"tyrone"`). Formats 4/7/8/9 nutzen jetzt `SOURCE_AGENTS[source] ?? "system"` statt hardcoded `"system"`. Ergebnis: 4 gym-Einträge zeigen nun `agent: "tyrone"` im JSON-Output. Erweiterbar für künftige Sources (z.B. stocktracker) ohne Parser-Änderung.

verified

  • Beide Repos lint/build grün.
  • `sync-journal.mjs`: `gym/CHANGELOG.md: 4 entries` mit `agent: "tyrone"`.
systemw3yh

| [autonomous] | antigravity (gemini-3.1-pro-high) | W3YH-65 SMTP-Research + W3YH-95 Telegram-Workflow-Architektur

added

  • **`docs/smtp-provider-research.md`** — Vergleich Resend vs. Postmark vs. SES für Auth-Mail-Versand. Bewertungskriterien: DX, Free Tier, Supabase-Integration, Kosten bei Skalierung. Ergebnis: **Resend** (3k/Monat Free, SDK für Next.js, einfachste DNS-Verifizierung). Postmark nah dran aber teurer bei Growth. SES nur bei >100k Mails/Monat sinnvoll.
  • **`docs/telegram-workflow-architecture.md`** — Architektur-Vergleich Systemd-Bot (Long-Polling) vs. Webhook (API-Route). Empfehlung: **Webhook via Supabase-State** — kein Daemon nötig, Zustand in `workflow_state`-Tabelle, natürliche Serverless-Skalierung. Warnt vor Race-Conditions bei parallelen Webhook-Calls.

notes

  • Beide Dokumente sind Research-Artefakte, kein Code. Sie fließen in die T2-Implementation (W3YH-65 Resend-Setup, W3YH-95 Telegram-Workflows) ein.
  • Kein Build nötig (reine Markdown-Dokumente).

Incidents

W3YH / Sync-Parser kannte Marker nicht [autonomous]
Frame-Tonalität entschärft". Die UTC-Härtung der vorigen Sessions hatte nur das `entry.time`-Feld aus dem Render entfernt — der eigentliche Titel-Text trug die Zeit aber nochmal mit`sync-journal.mjs` Format-1/2-Regex matchte `[autonomous]`-Marker nicht (`[\w-]+` schließt Brackets aus). Parser fiel auf Format-7-Catch-all (`## DATE rest`) zurück, der den ganzen Rest inklusive Uhrzeit als Titel nahm. Zusätzlich blockierte `[\w-]+` Modellnamen wie `claude-opus-4.7` (Punkt-Char fehlte)

Problem: Auf `/notes/day/2026-04-26` und `/notes/day/2026-04-27` standen Titel mit Uhrzeit-Präfix wie „ \

Ursache: [autonomous] \

Fix: claude-opus-4.7 \

W3YH / Frame-Tonalität entschärft [autonomous]
~15 minclaude-opus-4.7

Problem: Detail-reiche Footnote („manuelle Sessions ausgeschlossen", „Parallel-Cron-Beispiel mit fünf Tasks", „außerhalb der Arbeitszeit") las sich wie ein vorbereitetes Anwalts-Briefing — der Detailgrad selbst signalisiert Verteidigung und zieht damit Aufmerksamkeit auf sich, die ohne diese Hinweise gar nicht entstehen würde

Ursache: Bei der vorherigen Härtung war der Reflex „je expliziter, desto besser geschützt" — das ist falsch, je expliziter, desto eher wirkt es geprobt. Vagheit ist hier die bessere Verteidigung

Fix: Footnote auf einen kurzen, neutralen Satz reduziert; Eyebrow/Title/Description ohne „außerhalb der Arbeitszeit"-Phrase; Tooltip „Compute-Aktivität" → „Aktivität". Heatmap-Buckets, Manual-Filter und konkrete-Stunden-Verbergung bleiben unverändert

W3YH / Heatmap statt Stunden [autonomous]
~25 minclaude-opus-4.7

Problem: Vier-Ebenen-Frame-Härtung (Title/Eyebrow/Description/Footnote/Badge) machte konkrete Stunden zwar entkräftbar, aber 13.35h-Donnerstag blieb als Zahl sichtbar und konnte trotz Frame gelegentlich misverstanden werden

Ursache: Compute-Zeit-Frame war stark, aber die nackte Zahl „13:21 h Compute" auf einer Wochentag-Page bleibt eine Steilvorlage für Rückfragen — auch mit perfektem Frame braucht der Leser zwei Lesedurchgänge bis er die Compute-Definition verstanden hat

Fix: 5-Stufen-Bucket-System gebaut: `getActivityBucket()` mit Tages-Schwellen 0/1h/3h/6h/>6h, Monats-Schwellen 0/20h/60h/120h/>120h, ausgegeben als Label „ohne/niedrig/mittel/hoch/Spitze". Neue Komponenten `<ActivityIndicator />` (Day-Page) und `<ActivityHeatmap />` (Monatsindex, GitHub-style Mini-Squares-Reihe). Konkrete Stundenzahlen aus dem public render komplett entfernt; bleiben intern in `content/autonomous-hours.json` für Auswertung. Footnote auf Bucket-System angepasst, Parallel-Cron-Erklärung erhalten. Build grün

W3YH / Public-Privacy-Härtung [autonomous]
~25 minclaude-opus-4.7

Problem: Footnote auf `/notes` war zwar präsent, aber zu generisch („überwiegend autonom"); Top-Tage 2026-03-18 mit 13.35h und 2026-03-27 mit 8.18h hätten Arbeitgeber-Rückfragen ausgelöst, weil die Frame-Ebene den Compute-Charakter nicht eindeutig kommunizierte und die parallele Cron-Akkumulation nicht erklärte

Ursache: Frame-Schichten waren nicht aufeinander abgestimmt: Badge sagte „hat für mich gearbeitet" (klingt menschlich), Title war neutral „Build-Journal", Description nannte keinen Hobby-/Außerhalb-Arbeitszeit-Kontext, Footnote ein einzelner Absatz ohne Parallel-Compute-Erklärung

Fix: Vier-Ebenen-Härtung: (1) Title→„Privates Build-Journal", Eyebrow→„hobby journal · außerhalb der arbeitszeit"; (2) Description erweitert um „Compute-Zeit eines autonomen LLM-Agentensystems"; (3) Badge-Text→„autonome Compute-Zeit der LLM-Agenten — Plan vom Vorabend, Cron- und Telegram-Trigger, parallel kumulierend"; (4) Footnote auf zwei Absätze mit explizitem Hobby-/Plan-Abend-/Compute-≠-Aufmerksamkeit-/Parallel-Akkumulation-/Manual-ausgeschlossen-Frame. Inline-„X h" auf „X h Compute" + Tooltip. Build grün

W3YH / Pressespiegel Phase-2-Auskopplung [autonomous]
~10 minclaude-opus-4.7

Problem: W3YH-112 stand auf `[/]` weil X-Sentiment im todo erwähnt war, aber die News-Phase scope-konform abgeschlossen war; offene `[/]`-Markierung verzerrt das Done-Tracking

Ursache: Original-W3YH-112 mischte zwei Datenquellen (news_feed + X via kg_portfolio_sentiment) in einem Ticket, X braucht aber eine SQL-/RPC-Änderung im KG-Layer (Datums-Filter), die nicht zum Recap-Scope gehört

Fix: News-Teil von W3YH-112 als `[x]` markiert, neuer Ticket W3YH-114 für X-Sentiment Phase 2 mit klarer 3-Schritt-Umsetzungsskizze (RPC-Datums-Filter, aggregatePerTicker um news.x-Block, Komponente um zweite Sektion); Aufwand-Schätzung notiert; Changelog + todo + Incident-Log nachgezogen, commit `a26ce8c` gepusht

W3YH / Pressespiegel-Sentiment im Recap [autonomous]
~75 minclaude-opus-4.7

Problem: Recap zeigte bisher nur TLI-Interpretation + manuelle Lesart; aggregiertes News-Sentiment aus `news_feed` (Yahoo/Benzinga/Finviz/Handelsblatt/Reuters) lag in Supabase brach und floss nicht in den Wochen-Recap

Ursache: Es gab keinen Pressespiegel-Block im MDX-Template, keine Aggregation-Pipeline (Quality-Filter, Jaccard-Dedup), keine Render-Komponente; Draft-Script kannte nur `tli_entries`

Fix: `scripts/lib/pressespiegel.mjs` mit Source-Whitelist, Headline ≥ 8 Wörter, Jaccard-Dedup ≥ 0.6, MIN_MENTIONS=2 gebaut; `<Pressespiegel />`-Komponente mit Sentiment-Buckets + Top-3-Headlines; `portfolio-draft.mjs` ruft Pressespiegel parallel zu TLI-Fetch und embedded pro Ticker-Block zwischen Meta und Take-TODO. KW16/17 nicht rückwirkend umgestellt. Build grün, MDX-Compile-Smoke grün. X-Sentiment bleibt Phase 2 (RPC braucht wochenscharfe Filter)

W3YH / Autonome-Stunden auf /notes [autonomous]
~50 minclaude-opus-4.7

Problem: `/notes` zeigte keine Übersicht, wieviel das OpenClaw-System tatsächlich autonom geleistet hat — die Public-Story „autonomes Agentensystem arbeitet für mich" hatte keine Zahl. Risiko: wirkt wie reine Marketing-Aussage ohne Substanz

Ursache: Es gab kein Aggregat über die existierenden `cron/runs/*.jsonl` Run-Logs (sekundengenau via `durationMs`) und die `INCIDENT_LOG.md` `Aufwand`-Spalte (`~25 min`/`~1h`); beides nirgendwo zusammengezogen

Fix: `scripts/sync-autonomous-hours.mjs` neu gebaut, Marker-Filter (`[manual]` raus, `[hybrid]` 50%, Default autonomous), `src/lib/autonomous-hours.ts` + `<AutonomousHoursBadge />`, eingebunden in Day-Page (großes Badge) und JournalView (Monatssumme + per-Day-Wert in Card). 133.5h über 68 Tage live. Build grün

W3YH / Journal-Backfill Gym-Source [autonomous]
~25 minclaude-opus-4.7

Problem: gym-tracker hatte einen eigenen `CHANGELOG.md` mit Versions-Header (`## v1.1.0 — 2026-04-13 (In Progress)`), aber `sync-journal.mjs` kannte das Format nicht und las nur openclaw/w3yh-Changelogs

Ursache: Format-Lücke im Parser plus fehlende Source-Konfiguration; gym-Aktivität (Auth-Umbau, Gate-Handoff, RLS-Härtung) war damit auf `/notes` unsichtbar

Fix: Format-9-Regex `## v[\d.]+\s*—\s*(\d{4}-\d{2}-\d{2})(?:\s+(.+))?$` ergänzt, neue Source `gym` in sync-journal.mjs eingebunden, `ChangelogEntry["source"]`-Union erweitert; sync zieht jetzt `gym/CHANGELOG.md: 4 entries`, gesamt 567/56/3 statt 556/54/3

W3YH / Umlaute-Altbestand [autonomous]
~30 minclaude-opus-4.7

Problem: Drei Monats-Changelogs, `PLAN.md` und 13 Doku-Dateien hatten ae/oe/ue-Schreibweise statt ä/ö/ü; brach mit Memory-Konvention `feedback_umlaute.md` und wirkte unprofessionell auf jeder geöffneten Doku-Page

Ursache: Altbestand vor der Memory-Konvention entstanden, Portfolio-Content/Scripts und `tasks/todo.md` waren bereits nachgezogen, der Rest war als „Backlog" vermerkt aber nie ausgeführt

Fix: Deterministisches Python-Script `/tmp/umlaut-fix.py` mit Word-Boundary + Skiplist (englische Tokens, deutsche Wörter ohne Umlaut) gebaut, 225 Wörter über 15 Dateien ersetzt, `npx tsc --noEmit` und `npm run build` clean, Final-Grep zeigt nur noch Skip-Tokens. W3YH-94 aus „Offen" raus

W3YH / Public-Privacy Surface [autonomous]
~25 minclaude-opus-4.7

Problem: `/notes` zeigte Uhrzeiten (`` etc.) public, dadurch wirkten Eintraege wie Echtzeit-Stempel der menschlichen Arbeit — Risiko fuer Arbeitgeber-Eindruck "codet waehrend Arbeitszeit"

Ursache: Journal-Sync uebernahm `time`-Feld aus internen Changelogs 1:1 ins `journal-data.json` und `JournalDaySection` renderte es; keine Trennung zwischen interner Wahrheit und public Surface

Fix: `entry.time` aus `journal-day-section.tsx` raus, Footnote in `notes-shell.tsx` rahmt das Journal als autonomes Agentensystem, `AGENTS.md` Block `work-attribution-marker` legt `[autonomous]/[manual]/[hybrid]`-Konvention fest, Memory `feedback_work_attribution_marker.md` festgehalten. `npx tsc --noEmit` clean

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.