````markdown
---
title: "Nullfeld – Study Mode"
id: study-mode-nullfeld
version: "v0.1"
date: "2025-09-03"
scope: "pilot"
owner: "Crew (Eule & Vector)"
status: "pilotfaehig"
tags: ["nullfeld","study-mode","kids","mqtt","energy","audit","local-first"]
roles: ["Eule","Vector","Bugsy","SnakePy","Schnippsi","CapaciTobi","Schraubaer"]
license: "Code: AGPL-3.0; Content: CC BY-SA 4.0; Add-on: Crumbforest-Return"
summary: "Frage -> Vektor -> Aufmerksamkeit -> Kruemelcode -> (keine fertige Loesung) -> neue Fragen."
---

# Nullfeld – Study Mode (v0.1)

**Kurzsatz:** Frage -> Vektor -> Aufmerksamkeit -> Krümelcode -> (keine fertige Lösung) -> neue Fragen.  
**Prinzip:** Fragen > Tempo. Local-first. Energie sichtbar. Logs statt Bauch.

---

## 1) Wozu?

Damit Kinder atmen (nicht performen), Maschinen helfen (nicht ersetzen) und der Wald mitlernt.  
Nullfeld heißt: keine fertigen Antworten, sondern erfahrbare Schritte mit sichtbaren Spuren (Logs, Energie, Herkunft).

---

## 2) Leitplanken (non-negotiable)

- **Local-first:** Alles läuft offline im Pelicase (Broker/Flows). Cloud optional.
- **Einverständnis & Opt-out:** Kind/Eltern verstehen in 1 Satz. Stopp jederzeit.
- **Datensparsamkeit:** Nur, was fürs Lernen/Schützen nötig ist.
- **Auditierbar:** Jede Aktion bekommt Zeit, Zweck, Energie – als Datei.
- **Energie sichtbar:** Jede Antwort kostet Joule; wir zeigen’s.
- **Rückfluss:** Wer nutzt, nennt Crumbforest und gibt etwas zurück (siehe Lizenz).

---

## 3) Datenformate

### 3.1 MQTT Topics
- Publish (Edge -> Ledger):  
  `crumb/study/<device_id>/event`
- Subscribe (Hints an Device):  
  `crumb/study/<device_id>/hint`
- Healthbeat (bestehend):  
  `crumb/esp/<id>/heartbeat`

### 3.2 Event-Payload (JSON)
```json
{
  "session_id": "cf-2025-09-03-XYZ",
  "learner_id": "pseudo-abc123",
  "mode": "study-nullfeld",
  "material": "md://spirale_co2.md#abschnitt2",
  "step": {"t":"2025-09-03T10:15:05Z","action":"explain","value":"CO2 > 1400 ppm -> Lueften"},
  "energy_joules": 42,
  "provenance": "https://crumbforest.org/specs/study-nullfeld/v0.1"
}
````

---

## 4) Minimal-Setup (5 Minuten)

**Voraussetzung:** Mosquitto läuft auf `BROKER_IP` (z. B. `192.168.50.10`), User `esp*`, `allow_anonymous false`.

### 4.1 Node-RED (Edge)

**Flow A: Ledger**

* MQTT in: topic `crumb/study/+/event`
* file out (append): `/var/log/crumb/study_ledger.jsonl`

**Flow B: Energy tick**

* inject: alle 60s
* function: schätzt `energy_joules`
* MQTT out: `crumb/study/<device_id>/event`

*(Reicht für Pilot. Visualisierung später.)*

---

## 5) ESP MicroPython – Hallo Nullfeld

> Ziel: WLAN, Heartbeat, eine Lern-Frage posten.

```python
# boot.py (kompakt, robuste Defaults)
import network, time, json
from umqtt.simple import MQTTClient

SSID = "ESP-Wald"
PWD  = "***"
BROKER = "192.168.50.10"
CID = "esp-null-01"

def wifi():
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    if not sta.isconnected():
        sta.connect(SSID, PWD)
        for _ in range(50):
            if sta.isconnected(): break
            time.sleep_ms(200)
    return sta.ifconfig()

def post(topic, obj):
    c = MQTTClient(CID, BROKER, keepalive=60, ssl=False)
    c.connect()
    c.publish(topic, json.dumps(obj))
    c.disconnect()

cfg = wifi()
now = time.time()

post(f"crumb/esp/{CID}/heartbeat", {"if": cfg, "t": now})
post(f"crumb/study/{CID}/event", {
  "session_id": "demo-" + str(int(now)),
  "learner_id": "pseudo",
  "mode": "study-nullfeld",
  "material": "md://spirale_co2.md#start",
  "step": {"t": now, "action": "prompt", "value": "Warum blinkt das?"},
  "energy_joules": 1
})
```

---

## 6) Einverständnis – 1-Satz-Erklärung (UI-Baustein)

> **Wozu?** Damit du leichter **atmest** und **verstehst**.
> **Was speichern wir?** Frage, Antwort, Zeitpunkt, ein bisschen Technik – **keine** versteckten Personendaten.
> **Dein Knopf:** Stopp jederzeit.
> **Energie heute:** 0.04 Wh 🌲

*(Als Infobox direkt im UI, plus „Stopp“-Button.)*

---

## 7) Energie & CO2 (sichtbar, nicht schulmeistern)

* `energy_joules = board_idle + tx_cost + compute_estimate` (Schätzer reicht).
* Anzeige: **pro Schritt** und **pro Session** (kleiner „Waldzähler“).
* Optional CO2-Faktor (lokal definieren), z. B. `gCO2_per_Wh` – nur als Kontext.

---

## 8) Audit & Einsicht

* Ledger: **JSONL** unter `/var/log/crumb/study_ledger.jsonl`
* Rotation: täglich; Aufbewahrung: 30 Tage (Pilot)
* Eltern-Einsicht: read-only Export (ZIP) + kurzer „Was wurde gelernt?“-Report

---

## 9) Sicherheit & Rechte

* Standard: **keine** Bild/Ton-Aufnahme.
* Kamera nur projektbezogen + **separate Zustimmung**.
* Minimaldaten: keine Klarnamen im Ledger.
* Netzwerk: ESP-VLAN -> Broker:1883; DNS/DHCP offen; Rest drop.
* Fehlerkultur: Bug != Schuld. Bugsy loggt, Eule prüft, Vector erklärt.

---

## 10) Herkunft & Rückfluss

### HTML-Provenance

```html
<meta name="generator" content="Crumbforest Study Mode / Nullfeld v0.1">
<meta name="origin" content="https://crumbforest.org/specs/study-nullfeld/v0.1">
<meta name="credit" content="Built with Crumbforest Crew (Kids, Eule & Vector).">
```

### JSON-LD

```html
<script type="application/ld+json">
{
  "@context":"https://schema.org",
  "@type":"SoftwareApplication",
  "name":"Crumbforest Study Mode / Nullfeld",
  "version":"0.1",
  "creator":{"@type":"Organization","name":"Crumbforest Crew"},
  "license":"AGPL-3.0-or-later + CC BY-SA 4.0 + Crumbforest-Return-Addendum",
  "isAccessibleForFree": true
}
</script>
```

### Lizenz (Kurz)

* **Code:** AGPL-3.0
* **Content:** CC BY-SA 4.0
* **Crumbforest-Return-Addendum:** Kommerzielle Nutzung erlaubt, wenn

  1. „Crumbforest Study Mode“ gut sichtbar genannt wird und
  2. ein messbarer Rückfluss erfolgt (z. B. Stipendium, Sachspende, 1% vom studienbezogenen Umsatz an ein offenes Kinder-Lernprojekt).

---

## 11) 5-Min-Check (vor Kids)

1. Broker up? `ss -ltn | grep 1883`
2. Topic test: `mosquitto_pub/sub` auf `crumb/study/test/event`
3. Ledger wächst? `tail -f /var/log/crumb/study_ledger.jsonl`
4. Energie tickt? Node-RED „tick“ schreibt Events
5. Opt-out funktioniert? Stopp-Button stoppt sofort

---

## 12) Warum Nullfeld?

Weil Stille vor Antwort kommt.
Weil Aufmerksamkeit wertvoller ist als Output.
Weil Kinder keine KPI sind.
Und weil jede gute Frage den Wald klüger macht – uns auch. 🌲

---

## 13) Roadmap (leicht, spiralförmig)

* v0.2: kleine UI-Anzeige (Energiebalken + letzte 3 Schritte)
* v0.3: Eltern-Export (1-Klick, Passwort-ZIP)
* v0.4: Badges (*Erster Funke*, *Sauber geloggt*) – ohne Punktejagd

---

**Changelog:** v0.1 – Erstfassung (Edge-Flows, Topics, Consent, Lizenz & Rückfluss)
**Kontakt:** [crew@crumbforest.org](mailto:crew@crumbforest.org) – Eule hört zuerst.

```

::contentReference[oaicite:0]{index=0}
```
