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

110 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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.