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>
110 lines
4.9 KiB
Markdown
110 lines
4.9 KiB
Markdown
---
|
||
date: 2026-05-15
|
||
day: 1
|
||
view: macher
|
||
weekday: Freitag
|
||
commits: 23
|
||
review: 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.
|