seepuls/devlog/2026-05-15/macher.md
Till JS ad8ce935d7
Some checks are pending
CI / validate (push) Waiting to run
skill polish + 31 weitere Events (Multi-Step + Aggregator-Fallback)
Skill seepuls-curate-events Polish:
- Multi-Step-Crawl-Pattern: Listing → Detail-Pages parallel wenn
  starts_at: null im Listing (Apollo-Pattern).
- Aggregator-Fallback für JS-heavy Sites: konstanz-info.com,
  bodensee.de, party-news.de, thurgaukultur.ch, kreuzlinger.net.
  Attribution-Pflicht: source_url = Aggregator-Listing-Pfad.
- Unicode-sicheres slugify() via unicodedata.NFKD-Normalisierung.
  CALLE MÁLAGA → "calle-malaga" statt "calle-m-laga".
  Funktioniert für CZ/PL/FR/ES/IT.
- Ready-to-copy Python-Helpers im Skill (parse_date strict-first,
  event_hash sha256 trunc, slugify NFKD, truncate_at_sentence).
- Known-Patterns-Tabelle: 6 Domain-Verhaltensweisen aus Demo-Run.
- DB-Migration-Quirk dokumentiert: db:push legt uniqueIndex nicht
  immer an, CREATE UNIQUE INDEX IF NOT EXISTS als Recipe.

Crawl-Run Batch 2026-05-15-2:
- Kult-X via kultur.kult-x.ch (Programm-Subdomain): 8 Events.
  LLM-Year-Drift (2025 → 2026 korrigiert).
- Aggregator-Fallback via party-news.de:
  - Grey Konstanz: 6 Events
  - Destille Café Bar: 6 Events
  - Backstage Musikcafé: 5 Events
  - Kantine: 3 Events
  - Steg 4, Einstein Bar, K9: je 1 Event
- Insgesamt 31 neue Events inserted.
- Crawl-Job-Audit mit robots_check=true, status=ok.
- Slug-Fix CALLE MÁLAGA (existing) via separate UPDATE.

Total events live: 35 (10 Venues bedient).
By category: bar 12, kulturhaus 11, club 10, kino 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 18:44:14 +02:00

4.9 KiB
Raw Permalink Blame History

date day view weekday commits review
2026-05-15 1 macher Freitag 23 written

Freitag, 2026-05-15 — Tag 1 (Macher-Sicht)

Greenfield zu Live in 6 Stunden. Phase α-0 (Skelett) bis α-6 (Curator- Pipeline) plus 30 Venues. Erste Vereins-App, die unter der AGGREGATOR_POLICY operiert — fremde Drittseiten crawlt, aggregiert, re-publiziert.

Stats

23 Commits, +13 600 / 812 LoC, 120 Files. Top-Dirs zeigen das Schwergewicht: apps/api/src/data (36 %) ist die Venue-YAML- Bibliothek, apps/web/src/pages (10 %) das Astro-Frontend. 73 YAML- Files + 59 TS-Files — typisch für YAML-as-SOT-Architektur.

Session 12:14 → 18:16, 184 aktive Minuten, längster Fokus 142 Min. Eine Schicht.

Phasen-Schritte

  • α-0 — Repo-Skelett, Aggregator-Schema (countries/regions/ venues/event_sources/events/crawl_jobs/takedown_requests/ blocked_domains). Validierung via pnpm db:push + Smoke grün.
  • α-1a — robots.txt-Parser + Politeness-Hardening. ≥1.1s Crawl-Delay, User-Agent mit Kontakt-Mail, ETag/If-Modified-Since vom Vor-Crawl, Backoff 6h bei 429/503.
  • α-1b — Venue-from-URL-Flow + JWT-Auth + Service-Clients zu mana-research, mana-geocoding, mana-media.
  • α-1 — Country-Normalisierung-Tests. CH-Adressen sauber parsen, nicht „Kreuzlingen, Deutschland" wie es Photon manchmal macht.
  • α-2 — Event-Source-Add + Probe-Crawl + manueller Run.
  • α-3 — Re-Crawl-Scheduler + DRY-Extraktion. node-cron in-process, kein Plattform-Scheduler.
  • α-3.5 — Seed-Daten + Public Read-API. Die 5 Museen aus STATUS.md (Museum Rosenegg, Seemuseum + Bodensee-Planetarium, Rosgartenmuseum, Arch. Landesmuseum) via Nominatim geokodiert.
  • α-4 — Astro-Web live-tauglich. SSR + Islands für Filter + Karte (Karte selbst Phase β).
  • α-4.5 — SEO + per-Venue-API + Policy-Page + Region-Pages.
  • α-5a — Production-Deploy-Files (compose + Dockerfiles).
  • α-5 — seepuls LIVE auf seepuls.mana.how + seepuls-api.mana.how. Container healthy, DNS + Tunnel up.
  • α-5b — Code-Cleanup + auth.apps-Registrierung.
  • α-6 — Curator-Pipeline für Venues (YAML-as-SOT). Manuelle Pflege vor Crawler-Aktivierung; jeder YAML-Eintrag bekommt crawl_status: manual-entry mit Geokoordinaten.
  • Content-Block — 30 Venues in 6 Pässen: 3 Kreuzlingen, 5 Bars (Konstanz/Kreuzlingen), 4 Clubs, 5 Kulturorte, 13 weitere (Tier 1+2+3 gemischt).
  • UI-Pass — Dark Theme im Memoro-Stil + Kategorien-Anzeige + Land-Text (DE/CH-Etiketten neben Stadt).

Architektur-Entscheidungen

  • YAML-as-SOT für Venues, statt Admin-UI. Manuelle Pflege schneller als CRUD-Tool, Git als Audit-Trail. Curator-Pipeline schaufelt YAML → Postgres beim Boot.
  • Astro, nicht SvelteKit, weil Discovery/SEO-Last, hohe statische Seitenzahl, Mobile-First. Konsumiert Hono-API.
  • mana-research als Crawl-Provider, kein eigener Crawler. Firecrawl/Jina respektieren robots.txt by default. Cost-Tracking geht über mana-credits.
  • Hot-Link für Bilder (Default). Bilder von Drittseiten direkt vom Original, kein lokales Hosting — entspannt Urheberrechts- Last, weniger Speicher.
  • Cross-Border in einem Datenmodell. countries (DE/CH) + regions (bodensee, hegau, thurgau-west) als curated Klammer.
  • MVP ohne User-Auth. Browse + Take-Down public. Claim-Flow
    • Abos kommen mit mana-auth in β-3.
  • AGGREGATOR_POLICY ist nicht-verhandelbar. robots.txt-Check, User-Agent mit Kontakt-Mail, sichtbare Attribution, Take-Down- Endpoint mit 72h-Frist. Compliance-Check ist Pre-Live-Pflicht.

Trade-offs

  • +12 788 LoC netto in einer Session — schaffbar, weil API- Boilerplate aus @mana/shared-app-tpl kommt und das Datenmodell aus der Policy direkt ableitbar war. Crawler-Implementierung steht aber großteils noch aus (Probe-Stub plus Manueller Run).
  • Scheduler = off bis Service-Key + α-1c. Wir haben die Pipeline, aber lassen sie nicht auf Drittseiten los, bevor der Compliance-Check durch ist. Conservative-Default.
  • 23 Commits in 4 Stunden ist sehr granular. Macht Devlog-Erzählung leichter, macht git log rauschig. Akzeptiert.
  • 5 Museen manuell geseedet statt aus Crawl: Geo + Adress- Normalisierung war an Tag 1 wichtiger als Datenvolumen.

Offene Punkte

  • Scheduler ist deaktiviert. β-1/β-2: Crawler aktivieren, Audit-Trail-Surface, Take-Down-Form als Public-Page.
  • Service-Key (MANA_SERVICE_KEY für seepuls) noch nicht in Produktion gesetzt — sobald gesetzt, kann α-1c (echter Probe- Crawl gegen 1 Venue) laufen.
  • Karte im Browser (Phase β-2) fehlt. Heute Listen-only.
  • Claim-Flow + Lieblings-Venue-Abo (β-3) fehlen, brauchen mana-auth-Integration.
  • Compliance-Audit für AGGREGATOR_POLICY-Konformität noch nicht durchgelaufen. Pre-Live-Pflicht für ersten echten Crawl.
  • Mehr als 30 Venues kuratiert — Hegau und Thurgau-West sind noch fast leer; Singen, Radolfzell, Frauenfeld, Romanshorn folgen.