Some checks are pending
CI / validate (push) Waiting to run
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>
4.9 KiB
4.9 KiB
| 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-entrymit 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-tplkommt 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 lograuschig. 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_KEYfü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.