EVENTS_BLOG_SPEC.md

Crumbforest · Blog Events · v0.1 (RC01)

„Ein Blogpost ist ein Ereignis im Wald,
kein Eintrag in einer Datenbank.“


0. Zweck

Diese Spezifikation beschreibt, wie Blog‑Inhalte im Crumbforest / PWD_NULLFELD_RESET als Ereignisse dargestellt werden.

Ziele:

  • mehrere Quellen (WordPress, andere DBs, native Notizen) vereinheitlichen
  • pro KrĂŒmel / Hood Blog‑Ansichten ermöglichen
  • alles WALD_EVENT‑kompatibel machen (JSONL, append‑only)
  • pepperPHP / PHP5‑Module simpel halten

1. Grundprinzipien

  1. Events statt Rows
    Ein Blogpost ist ein WALD_EVENT, kein isolierter Datenbank‑Datensatz.

  2. Quelle bleibt sichtbar, ist aber nicht hierarchisch
    source zeigt Herkunft (z.B. wp_ozm, wp_legacy),
    aber alle Posts sind gleichwertige KrĂŒmel im Wald.

  3. KrĂŒmel‑Zugehörigkeit explizit
    Jeder Post gehört mindestens einem crumb (Mensch / Hood / Crew).

  4. Append‑only
    Änderungen erzeugen neue Events. Historie bleibt erhalten.

  5. Keine Bewertung
    Keine Likes, keine Sterne, kein Score.
    Optional: reine View‑Events, wenn sinnvoll.


2. Event‑Typen

Die Blog‑DomĂ€ne nutzt folgende Event‑Typen (im Feld type des WALD_EVENT):

  • blog.post.import
    → Import aus externen Quellen (z.B. WordPress, andere DBs)

  • blog.post.create
    → neuer Post, im Wald erstellt

  • blog.post.update
    → Änderung eines bestehenden Posts (neue Version)

  • blog.post.delete
    → logische Löschung / Ausblenden (kein physikalisches Löschen von Events)

  • blog.post.view
    → optional: ein KrĂŒmel liest einen Post


3. Allgemeines Blog‑Event‑Schema

Alle Blog‑Events folgen diesem Payload‑Schema:

{
  "ts": 1737478799.123,
  "type": "blog.post.import",
  "source": "wp_ozm",
  "payload": {
    "post_id": "blog_ozm_00123",
    "crumb": "crumb_branko",
    "hood": "ozm",
    "title": "Ein Titel",
    "slug": "ein-titel",
    "body_html": "<p>Inhalt
</p>",
    "body_md": "Inhalt
",
    "tags": ["ozm","art","log"],
    "categories": ["blog"],
    "published_at": "2024-03-01T12:34:56Z",
    "source_ref": {
      "system": "wordpress",
      "db": "wp_ozm",
      "table": "wp_posts",
      "id": 123
    },
    "status": "published",
    "language": "de"
  },
  "meta": {
    "import_run_id": "2026-01-20T00:00:00Z",
    "schema_version": "1.0"
  }
}

3.1 Pflichtfelder im Payload

  • post_id (string)
    → interne, quellenĂŒbergreifende ID, eindeutig im Wald
    z.B. blog_ozm_123, blog_legacy_42, blog_local_7

  • crumb (string)
    → welcher KrĂŒmel / welche Person / Crew ist „Besitzer / Autor / Verantwortliche:r“
    z.B. crumb_branko, crumb_crew_legacy

  • title (string)

  • body_html oder body_md (mindestens eines Pflicht)

  • published_at (ISO8601 string)

3.2 Optionale Felder

  • hood (string)
    → logischer Raum / Projekt / Kontext (z.B. ozm, crumbmissions)

  • slug (string)
    → URL‑freundlicher Name (fĂ€llt sonst zur Laufzeit)

  • tags (array of string)

  • categories (array of string)

  • source_ref (object)
    json { "system": "wordpress", "db": "wp_ozm", "table": "wp_posts", "id": 123 }

  • status (string)
    → "published", "draft", "hidden"

  • language (string)
    → "de", "en", etc.


4. Event‑Typen im Detail

4.1 blog.post.import

Verwendung:
Import eines / mehrerer Posts aus externer Quelle.

Minimal:

{
  "ts": 1737478799.123,
  "type": "blog.post.import",
  "source": "wp_ozm",
  "payload": {
    "post_id": "blog_ozm_123",
    "crumb": "crumb_branko",
    "title": "Mein alter Post",
    "body_html": "<p>
</p>",
    "published_at": "2020-01-01T10:00:00Z"
  }
}

Erweiterbar um tags, categories, source_ref, etc.

4.2 blog.post.create

Verwendung:
Neuer Post, direkt im Wald geschrieben (z.B. via pepperPHP UI).

{
  "ts": 1769100000.000,
  "type": "blog.post.create",
  "source": "blog_ui",
  "payload": {
    "post_id": "blog_local_7",
    "crumb": "crumb_kid_01",
    "hood": "forest_school",
    "title": "Heute im Wald",
    "body_md": "Es war schön.",
    "tags": ["wald","kind"],
    "categories": ["tagebuch"],
    "published_at": "2026-01-21T18:00:00Z",
    "status": "published",
    "language": "de"
  }
}

4.3 blog.post.update

Verwendung:
Post wird geÀndert (Inhalt, Titel, Tags
).

Regel:
* post_id bleibt gleich
* neue Version wird als eigenes Event geschrieben
* Frontend wÀhlt neueste Version per ts oder meta.version

{
  "ts": 1769103600.000,
  "type": "blog.post.update",
  "source": "blog_ui",
  "payload": {
    "post_id": "blog_local_7",
    "crumb": "crumb_kid_01",
    "title": "Heute im Wald (Update)",
    "body_md": "Es war noch schöner.",
    "tags": ["wald","kind","update"]
  }
}

4.4 blog.post.delete

Verwendung:
Post soll nicht mehr angezeigt werden.

  • Keine physische Löschung.
  • Frontend respektiert letzten delete‑Event.
{
  "ts": 1769107200.000,
  "type": "blog.post.delete",
  "source": "blog_ui",
  "payload": {
    "post_id": "blog_local_7",
    "crumb": "crumb_kid_01",
    "reason": "user_request"
  }
}

4.5 blog.post.view (optional)

Verwendung:
Ein KrĂŒmel hat einen Post gelesen.
Nur nutzen, wenn sinnvoll – ohne Trackingzwang.

{
  "ts": 1769109000.000,
  "type": "blog.post.view",
  "source": "blog_ui",
  "payload": {
    "post_id": "blog_ozm_123",
    "crumb": "crumb_branko"
  }
}

Keine Dauer, keine Scrolltiefe, kein Score.
Nur: „Resonanz ist passiert“.


5. WordPress → Blog‑Event Mapping

Beispiel‑Mapping bei direktem DB‑Import (wp_posts):

WP‑Feld Blog‑Payload‑Feld
ID source_ref.id + Basis fĂŒr post_id
post_title title
post_name slug
post_content body_html
post_date_gmt published_at
post_status status (publish → published, draft → draft)

Tags / Kategorien via:
wp_terms, wp_term_taxonomy, wp_term_relationships → in payload.tags & payload.categories.

crumb und hood kommen aus deiner crumb_sources.php‑Config (z.B. crumb_branko + ozm).


6. Speicherung

6.1 JSONL

Empfohlenes File: data/blog_events.jsonl
Jede Zeile = ein Event.

6.2 Optional: SQL‑Spiegel

Du kannst aus den Events eine blog_posts‑Tabelle ableiten (z.B. fĂŒr schnelle Queries), aber Quelle der Wahrheit bleibt das JSONL.


7. Beispiel‑Flow: Multi‑DB / Multi‑KrĂŒmel

crumb_sources.php definiert:
* crumb_branko → wp_ozm
* crumb_crew_legacy → wp_legacy_blog
* crumb_local_notes → default

import_wp.php:
pro Quelle → blog.post.import Events in blog_events.jsonl

Frontend (blog.php / pepperPHP):
1. liest blog_events.jsonl
2. berechnet aktuellen Stand pro post_id
3. bietet Filter:
* ?crumb=crumb_branko
* ?hood=ozm
* ?tag=ozm
* ?cat=tagebuch


8. CKL & Kinder‑Regel

Blog‑Events dĂŒrfen von Kindern gelesen werden.

  • Kein Trackingzwang.
  • Keine heimliche Metrik.

Wenn ein Kind fragt: „Wer hat das geschrieben?“
darf die Antwort sein:
* der crumb‑Name
* oder „jemand im Wald, der teilen wollte“


9. Zusammenfassung

EVENTS_BLOG_SPEC sorgt dafĂŒr, dass:

  • alte WordPress‑Blogs
  • mehrere Datenbanken
  • neue Wald‑Texte

alle als gleiche Ereignisse im Crumbforest leben können.

„Kein CMS.
Nur Geschichten im Wald.“ đŸŒČ


Status: v0.1 (RC01)
Lizenz: CKL
Ort: /data/blog_events.jsonl + Repos
Zeit: Jetzt