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
-
Events statt Rows
Ein Blogpost ist einWALD_EVENT, kein isolierter DatenbankâDatensatz. -
Quelle bleibt sichtbar, ist aber nicht hierarchisch
sourcezeigt Herkunft (z.B.wp_ozm,wp_legacy),
aber alle Posts sind gleichwertige KrĂŒmel im Wald. -
KrĂŒmelâZugehörigkeit explizit
Jeder Post gehört mindestens einemcrumb(Mensch / Hood / Crew). -
Appendâonly
Ănderungen erzeugen neue Events. Historie bleibt erhalten. -
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