Zum Hauptinhalt springen
w3yh.xyzLogin ↗

journal day

Montag, 15. Juni 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

Montag, 15. Juni 2026

claudew3yh

M3/Nachtschicht-Replay: S3.1 Replay-UI + S3.2 reduced-motion/Mobile — M3 abgeschlossen

added

  • `src/components/profile/visitenkarte/nachtschicht-replay.tsx`: Client-Replay am Maschinenraum-Band. Play-Button (kein Autoplay), spielt die letzten ~72 h autonomer Arbeit als Vorlauf ab — Heatmap füllt sich Quadrat für Quadrat (lose an den Vorlauf gekoppelt), Journal-Titel ticken vorbei (`aria-live="polite"`). Pausierbar (Pause ⇄ Weiter ⇄ Nochmal). `prefers-reduced-motion` = statische chronologische Liste derselben Einträge, keine Bewegung (S3.2). Mobile = kürzerer Vorlauf (max 6 Einträge, schnellere Taktung). Bewusst keine Laufzeit-Imports aus `lib/journal`/`lib/autonomous-hours` (würden deren JSON in den Client-Chunk ziehen) — nur Type-Imports, Daten als Props.
  • `src/components/profile/visitenkarte/nachtschicht-replay-island.tsx`: Lazy-Island-Wrapper (`dynamic`, `ssr:false`, `loading:null`) — hält die Replay-UI aus dem First-Load-JS (F7).
  • `src/lib/autonomous-hours.ts`: `getHeatmapDays(count)` + `HeatmapDay` — geteilte Quelle für statische Heatmap und Replay.
  • `src/lib/journal.ts`: `getRecentChangelogEntries(days, max)` + `ReplayEntry` — chronologische Changelog-Einträge der letzten Tage (Public-Regel: nur Datum, keine Uhrzeit).

changed

  • `src/components/profile/visitenkarte/maschinenraum.tsx`: `Heatmap14` nutzt jetzt `getHeatmapDays(14)` statt eigener Schleife; das Replay-Island wird unter dem Band gemountet (statische Heatmap bleibt unverändert als No-JS-/SSR-Fallback).
  • `src/app/globals.css`: `@keyframes nightshift-tick-in` (sanftes Einblenden des Tickers) + reduced-motion-Guard.

verification

  • Gate grün: `npx eslint` 0 Errors (inkl. `react-hooks/set-state-in-effect` sauber gelöst — das Replay-Ende leitet sich ab, kein setState im Effect), `npx tsc --noEmit` 0, `npm run build` grün.
  • SSR-Smoke (`next start`, curl `/`): HTTP 200, Maschinenraum-Band + statische 14-Tage-Heatmap im HTML; Replay-Island **nicht** im SSR (ssr:false → eigener Client-Chunk, First-Load unverändert, F7 gehalten).
  • Datenpfad-Check: `getHeatmapDays(14)` → 6/14 aktive Tage in variierenden Buckets; `getRecentChangelogEntries(3,12)` → 12 reale chronologische Einträge (inkl. M1/M2-Arbeit) ⇒ Replay läuft auf echten Daten.
claudew3yh

M2/„Frag das System": S2.4 Guardrails (Beleg-Gate, Rate-Limit, Cache, Budget) — M2 abgeschlossen

added

  • `src/lib/ask/guardrails.ts`: reine, zeit-injizierte Guardrail-Einheiten — `resolveMinScore` (Default 7.0, empirisch kalibriert), `RateLimiter` (Sliding-Window je Schlüssel), `AnswerCache` (TTL + LRU-Deckel, normalisierter Key), `TokenBudget` (Tagesbudget mit Tageswechsel-Reset), `estimateTokens`.
  • `src/lib/ask/guardrails.test.ts`: 13 Unit-Tests (Σ 29 grün).
  • `src/app/api/ask/route.ts` (`GET`): datensparsame Aggregat-Telemetrie (`queries/noEvidence/cacheHits/rateLimited/budgetBlocked`), kein PII, keine Query-Inhalte.

changed

  • `src/app/api/ask/route.ts` (`POST`): Beleg-Gate (`minScore` 7.0 → kein belastbarer Treffer ⇒ fixe ehrliche Nicht-Antwort, Real-Provider wird nicht gerufen → spart Tokens), Rate-Limit (12/min je SHA-256-gehashter IP), Antwort-Cache (10 min), Token-Budget für kostende Provider + Token-Meter-`alert` als fehlertoleranter Kill-Switch (kostenloser Mock immer erlaubt).
  • `.env.example`: `ASK_MIN_SCORE` (Default 7.0) und `[secret-var]` (leer = unbegrenzt) dokumentiert.

verification

  • minScore 7.0 kalibriert über 626 Journal-Docs: Content-Treffer (seltenes Wort matcht) ≥7.9, Fehl-Treffer (nur Allerweltswörter) ≤6.3 — saubere Lücke.
  • E2E (`next start`, curl): Wave-Count → Belege + Stream; „Lasagne"/„Wetter morgen Tokio" (Score 6.3) → leere Belege + ehrliche Nicht-Antwort (vorher schlüpften beide durch); Cache-Hit → 1 Token statt 47 Fragmente; 15er-Burst → erste 12 = 200, dann 3× HTTP 429; `GET` stats konsistent (`noEvidence`, `cacheHits`, `rateLimited`).
  • `npm test` 29/29, `npm run lint` 0 Errors, `npx tsc --noEmit` grün, `npm run build` grün, `/` weiterhin statisch.
claudew3yh

M2/„Frag das System": S2.3 Streaming-UI (Hero-Eingabe, Beleg-Chips, Lazy-Island)

added

  • `src/app/api/ask/route.ts`: NDJSON-Stream-Route. Sendet zuerst `{type:"belege"}` (für die Beleg-Chips), dann mehrfach `{type:"token"}` (Antwort-Stream), zuletzt `{type:"done"}`; Fehler als `{type:"error"}`. Läuft server-seitig (`runtime:"nodejs"`, F6/§6) → Retrieval + Provider bleiben am Server, Keys verlassen ihn nie. Query-Limit 500 Zeichen, Top-K 4.
  • `src/components/ask/ask-system.tsx`: Client-Streaming-UI. Liest den NDJSON-Stream zeilenweise, zeigt Antwort-Token live, Beleg-Chips mit Datum + Deep-Link ins Journal, `aria-live="polite"`. `prefers-reduced-motion` → keine Token-Animation, Antwort erscheint erst vollständig. `AbortController` gegen überlappende Queries.
  • `src/components/ask/ask-system-island.tsx`: Lazy-Island (`next/dynamic`, `ssr:false`) → hält die Streaming-UI aus dem First-Load-JS (F7); Startseite `/` bleibt statisch (`○`).

changed

  • `src/components/profile/visitenkarte/hero.tsx`: „Frag das System"-Eingabe unter dem Puls verdrahtet, mit Hinweis „Antworten kommen ausschließlich aus dem öffentlichen Journal — mit Beleg oder gar nicht".

verification

  • E2E gegen Mock-Provider (`next start`, curl /api/ask): belegte Frage („Wave-Count-Pipeline") → exakte Belege vom 2026-05-31 + Stream. `npm test` 16/16, `npm run lint` 0 Errors, `npx tsc --noEmit` grün, `npm run build` grün, `/` weiterhin statisch.
  • Offen S2.4: BM25 liefert immer Top-K → beleglose Frage erhält noch schwache Treffer; `minScore`-Guardrail in der Route fehlt noch.
claudew3yh

M2/„Frag das System": S2.2 modellagnostischer Antwort-Provider + ENV-Switch

added

  • `src/lib/ask/provider.ts`: `AnswerProvider`-Interface, `ASK_PROVIDER`-ENV-Switch mit Fallback-Kette (Wunsch-Provider → übrige registrierte → garantierter Mock), `buildGroundedPrompt` (modellunabhängige Grounding-Regel: nur aus Belegen antworten, sonst ehrlich „kein Beleg").
  • `src/lib/ask/providers/mock.ts`: deterministischer `MockProvider` (kein Netz/Modell), streamt fragmentweise, beleggebunden, ohne Belege → ehrliche Nicht-Antwort.
  • `src/lib/ask/index.ts`: Kompositions-`ask()` (Retrieval S2.1 → Provider S2.2 → Stream) + öffentliche API.
  • `src/lib/ask/provider.test.ts`: 9 Unit-Tests (Provider-Auswahl, Fallback, Mock-Determinismus, Grounding). Gesamt 16 grün.

changed

  • `.env.example`: `ASK_PROVIDER` dokumentiert (Default leer → Mock).

verification

  • `npm test` 16/16 grün, `npm run lint` 0 Errors, `npx tsc --noEmit` grün, `npm run build` grün.
claudew3yh

M2/„Frag das System": S2.0 Retrieval-Spike (GO) + S2.1 Retrieval-Layer

added

  • `src/lib/ask/retrieve.ts`: deterministischer BM25-Retrieval-Kern (kein Modell, kein JSON-Import → dependency-frei unit-testbar). DE+EN-Tokenizer mit Umlaut-Erhalt, Hygiene-Filter gegen Stub-Einträge, `minScore`-Hebel als Guardrail-Basis für S2.4.
  • `src/lib/ask/from-journal.ts`: Journal-Wrapper, baut/cacht den BM25-Index aus `content/journal-data.json`.
  • `src/lib/ask/retrieve.test.ts`: 7 Unit-Tests (node:test, `--experimental-strip-types`).
  • `npm test`-Script; `scripts/spikes/s2-0-retrieval-spike.mjs` (S2.0-Wegwerf-Spike, nicht für Prod).

changed

  • `tsconfig.json`: `allowImportingTsExtensions` für native Node-TS-Tests (mit `noEmit`/`bundler` kompatibel, Build unverändert grün).

notes

  • S2.0-Spike-Ergebnis: BM25 über 624 Journal-Docs, Top-1 9/10 + Top-3 9/10 → **GO ohne Vektor-DB** (bestätigt Finding F5). Beleglose Frage (LiteLLM-Incident, nur im INCIDENT_LOG) liefert korrekt nichts → Guardrail-Basis für S2.4 steht.

verification

  • `npm test` 7/7 grün, `npm run lint` 0 Errors, `npx tsc --noEmit` grün, `npm run build` grün.
codexopenclaw

Deploy-Cleanup-Welle 1 ausgeführt

what

  • Alte lokale w3yh-Worktrees entfernt: `/tmp/w3yh-essays-online`, `/tmp/w3yh-health-pr`, `workspace/tmp/w3yh-health-live[id]`, `workspace/tmp/w3yh-health-prod-merge.KBaYvw`.
  • Produktiver Worktree `workspace/tmp/w3yh-journal-sync` bleibt; er ist der Bot-Worktree für `w3yh:journal-sync-deploy`.
  • Lokale gemergte Branches bereinigt: w3yh `feature/landing-*`, `feature/wave-count`, `rework/p*`, `codex/restore-essays[id]`, `codex/health-live[id]`; außerdem `clawledge:tyrone/new-use-cases`, `spielideengenerator:feature/promo-pills`, `spielideengenerator:feature/themenpakete-banner`, `gym-tracker:cross-shell/gym`.
  • Untracked private Artefakte aus Produkt-Repos ausgelagert: `spielideengenerator/private/**` nach `openclaw/private-artifacts/spielideengenerator/2026-06-15/`, `clawledge/openclawusecases[id].xlsx` nach `openclaw/private-artifacts/clawledge/2026-06-15/`.
  • Kleine alte Scratch-Ordner aus `workspace/tmp` nach `openclaw/archive/tmp-cleanup-2026-06-15/` verschoben.

verification

  • `python3 scripts/deploy-readiness-check.py` neu geschrieben: `w3yh` dirty `0`, `clawledge` dirty `12`, `spielideengenerator` dirty `8`.
  • `git worktree list` für w3yh zeigt nur noch Hauptcheckout und `w3yh-journal-sync`.
  • Keine Remote-Branches, kein Push, kein Deploy.
codexopenclaw

Deploy-Readiness-Inventur angelegt

what

  • Globale Git-Repo-Inventur unter `workspace-root` gemacht und produktrelevante Repos von Tool-/Plugin-/Agent-Cache-Repos getrennt.
  • Report angelegt: `workspace/tasks/deploy-readiness-inventory-2026-06-15.md`.
  • Deploy-Registry + reproduzierbaren Check gebaut: `workspace/tasks/deploy-readiness-registry.json`, `workspace/scripts/deploy-readiness-check.py`, Snapshots `deploy-readiness-check-2026-06-15.md/json`.
  • Aufräum-Matrix ergänzt: `workspace/tasks/deploy-cleanup-matrix-2026-06-15.md` mit Kategorien „aktueller aber undeployed“, „verworfen/überholt“, „kann weg nach Sicherheitscheck“ und „Finger weg bis Review“.
  • P0-Blocker dokumentiert: `w3yh.xyz` divergent/dirty, `stocktracker` behind+dirty, `thelonginvestor` mit 6085 tracked `scripts/node_modules`-Löschungen, `spielideengenerator` mit `UD` Icon-Routen und privaten Pinterest-Artefakten, `clawledge` mit Import-/Queue-/Test-Dreck.
  • Lokale Workspace-Memory-Korrektur zum deaktivierten X-Strategy-Refresh committed: `9ef33ed`.

verification

  • `git fetch --all --prune` für relevante GitHub-Repos erfolgreich.
  • Repostati per `git status --short --branch --untracked-files=all`, Branch-/Ahead-Behind-Checks und `package.json`-Deploy-Scripts geprüft.
  • `python3 -m py_compile scripts/deploy-readiness-check.py` und `jq empty` für Registry/JSON-Snapshot grün.
codexopenclaw

Cron-Watchdog-Alarm und w3yh Journal-Sync repariert

what

  • Legacy-Host-Cron `twitter:x-strategy-refresh-analyze` deaktiviert: `jobs.json` war schon disabled, aber die Crontab lief die alte Hermes/xai-oauth-Lane weiter; der Lauf vom 2026-06-14 endete mit `spawnSync `.local/bin/hermes` ETIMEDOUT` und schrieb keinen Marker.
  • `scripts/qwen-cron-watchdog-inventory.json` auf den realen Stand gezogen: `twitter:x-strategy-refresh-analyze` und `twitter:x-strategy-refresh-apply` stehen jetzt auf `cadence=disabled`, damit der Watchdog keine Marker für stillgelegte Jobs verlangt.
  • `scripts/w3yh-journal-sync-deploy.sh` gehärtet: der dedizierte Bot-Worktree räumt ausschließlich bekannte generated JSON-Reste (`content/autonomous-hours.json`, `journal-data.json`, `[secret-file]`, `pulse.json`, `search-index.json`) vor und nach dem Lauf weg.
  • Aktueller stale Bot-Worktree-Diff `content/pulse.json` wurde als Sicherheitsstash gesichert und bereinigt.
  • `memory/twitter-strategy.md` und `tasks/todo.md` aktualisiert: Strategy-Refresh ist nicht mehr als aktiv dokumentiert; Rebuild steht als `XSTRATEGY-REFRESH-REBUILD` im Backlog.

verification

  • `twitter-x-strategy-refresh-analyze-20260614T150001Z.log` geprüft: harter Hermes-Timeout, kein Schein-Erfolg.
  • `qwen-cron-watchdog.py` nach Inventar-Fix ohne X-Strategy-Marker-Alarm geprüft.
  • `direct-cron-runner.sh w3yh:journal-sync-deploy --dry-run` und Bash-Syntaxcheck grün.

Incidents

OpenClaw Cron Watchdog / W3YH Journal-Sync
~35 mincodex

Problem: Watchdog alarmierte fehlenden Marker für `twitter:x-strategy-refresh-analyze`; `w3yh:journal-sync-deploy` fiel mit exit 68 wegen dreckigem Bot-Worktree aus

Ursache: X-Strategy-Refresh war in `jobs.json` disabled, lief aber weiter im Host-Cron und hing an alter Hermes/xai-oauth-Lane (`ETIMEDOUT`); W3YH-Journal-Wrapper blockte auf stale generated `content/pulse.json`, weil der Repo-Sync `pulse.json` nicht sauber als generated residue behandelte

Fix: X-Strategy-Host-Cron deaktiviert, Watchdog-Inventar auf `cadence=disabled`, w3yh-Wrapper räumt bekannte generated JSON-Reste im dedizierten Worktree vor/nach dem Lauf weg; aktueller `pulse.json`-Diff per Sicherheitsstash gesichert und bereinigt

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.