Crumbcore â Crew Onboarding v0.1
Ziel: Alle Rollen (FunkFox, Bugsy, SnakePy, DumboSQL, CrabbyRust, PepperPHP, Schnippsi, Deepbit, Taube, SchraubĂ€râŠ) sauber an den Kern andocken: identisch startbar, messbar, kindgerecht, offlineâfĂ€hig.
0. Prinzipien
- HerzâFreigabe zuerst: Kein auton. Handeln ohne namentliche Freigabe.
- OfflineâFirst: Seeds/Defaults, spĂ€ter Cloud.
- Beweis statt Behauptung: Jeder Output hat Herkunft/Beleg.
- Kostenmeter: Sichtbare Tokenâ/ZeitâKosten.
- Einfacher Bus: Eine gemeinsame âSpracheâ fĂŒr Messages.
1. Ordnerstruktur (Vorschlag)
/opt/crumbcore/
bus/ # MQTT/UDP/TCP-BrĂŒcken
roles/ # alle Rollen als Unterordner
funkfox/
bugsy/
snakepy/
dumbosql/
crabbyrust/
pepperphp/
schnippsi/
policy/
whitelist_topics.txt
block_keywords.txt
seeds/ # Offline-Seeds (Texte, Antworten, Reime, Beispiele)
logs/
crumbcore.log # zentraler, zeilenbasierter Log
etc/
crumbcore.env # gemeinsame ENV
Hinweis: Rollen dĂŒrfen auĂerhalb liegen; jede Rolle erhĂ€lt aber einen symlink nach
/opt/crumbcore/roles/<name>und liest gemeinsame ENV ausetc/crumbcore.env.
2. CrewâRollenâVertrag (CRCâ1.0)
Zweck: Einheitliche Schnittstelle pro Rolle â egal ob Bash, Python, PHP, Rust.
PflichtâKommandos / Endpunkte
--healthâ Exit 0 + JSON:{ "ok":true, "role":"funkfox", "version":"0.3" }--aboutâ Kurzprofil (Name, Kinderschutz, Seeds, Modelle)--actâ Hauptaktion (Parameter via CLI/JSON)--policyâ aktive Whitelist/Blocklist anzeigen--costâ letzte SchĂ€tzung{tokens, est_eur, duration_ms}
JSONâI/OâSchema (CRCMessage v1)
{
"role": "funkfox",
"mode": "rap|teach|echo",
"topic": "regenbogen",
"req_id": "uuid",
"context": {"lang":"de","kid_safe":true},
"input": {},
"output": {"text":"...", "lines":16},
"evidence": ["seed:basis_v1","llm:openrouter:4o"],
"cost": {"tokens": 312, "est_eur": 0.004},
"approval": {"by":"NAME","time":"ISO8601"}
}
3. EventâBus (leichtgewichtig)
MQTTâTopics (empfohlen):
crumb/req/<role>â Requests (Payload:CRCMessage v1ohneoutput)crumb/res/<role>â Responses (Payload: vollstĂ€ndigesCRCMessage v1)crumb/status/<role>â Health/Heartbeat{ok, version, ts}crumb/auditâ nur Metadaten/Costs
UDPâChant (optional, Workshop): Multicast 239.1.1.1:5005 â nur KurzâRefrain (4 Zeilen), keine PII.
4. CrumbcoreâSupervisor (prozessneutral)
Minimaler Supervisor ruft Rollen an, sammelt Kosten, schreibt Audit.
crumbcore_supervisor.sh (Skizze)
#!/usr/bin/env bash
set -euo pipefail
ROLE="$1"; shift || true
REQ_JSON="${1:-}" # optional JSON, sonst stdin
BIN="/opt/crumbcore/roles/${ROLE}/${ROLE}_hardened.sh"
[[ -x "$BIN" ]] || { echo "role bin missing"; exit 3; }
REQ="${REQ_JSON:-$(cat)}"
# Aufruf
OUT="$($BIN --act 2>/dev/null <<<"$REQ")"
# Audit (Zeile)
echo "$(date -Is)\t$ROLE\t$(echo "$OUT" | jq -r '.cost.est_eur // 0')" >> /opt/crumbcore/logs/crumbcore.log
printf '%s' "$OUT"
5. systemdâTemplates
Service: /etc/systemd/system/crumb-role@.service
[Unit]
Description=Crumb Role %i
After=network-online.target
[Service]
Type=simple
EnvironmentFile=/opt/crumbcore/etc/crumbcore.env
WorkingDirectory=/opt/crumbcore/roles/%i
ExecStart=/opt/crumbcore/roles/%i/%i_hardened.sh --health-loop
Restart=on-failure
[Install]
WantedBy=multi-user.target
Timer (Heartbeat): /etc/systemd/system/crumb-role-heartbeat@.timer
[Unit]
Description=Heartbeat for %i
[Timer]
OnBootSec=30
OnUnitActiveSec=60
Unit=crumb-role-heartbeat@%i.service
[Install]
WantedBy=timers.target
HeartbeatâService: /etc/systemd/system/crumb-role-heartbeat@.service
[Service]
Type=oneshot
EnvironmentFile=/opt/crumbcore/etc/crumbcore.env
ExecStart=/opt/crumbcore/roles/%i/%i_hardened.sh --health | \
mosquitto_pub -l -t crumb/status/%i
macOS:
launchdâPlist analog; Docker:HEALTHCHECK+cron.
6. HTTPâBrĂŒcke zur CrumbAPI
WebhookâSkeleton (FastAPI/CakePHP geht auch):
POST /crumbcore/act/<role>â Body:CRCMessage v1(ohneoutput)GET /crumbcore/statusâ Liste aller Rollen + ok/versionGET /crumbcore/policyâ aktive Whitelist/Blocklist
Antwort: CRCMessage v1 (mit output, cost, approval)
7. Rolle exemplarisch: FunkFox
Bin: /opt/crumbcore/roles/funkfox/funkfox_hardened.sh
ErfĂŒllt CRCâ1.0: --health --about --act --policy --cost
Seeds: /opt/crumbcore/seeds/funkfox.txt (symlink)
Policy: nutzt /opt/crumbcore/policy/*.txt
BeispielâRequest (CRCMessage v1)
{
"role":"funkfox",
"mode":"rap",
"topic":"regenbogen",
"req_id":"b3b1-âŠ",
"context":{"lang":"de","kid_safe":true},
"input":{}
}
BeispielâResponse (gekĂŒrzt)
{
"role":"funkfox",
"output":{"text":"âŠ16 ZeilenâŠ","lines":16},
"cost":{"tokens":320,"est_eur":0.004},
"evidence":["seed:basis_v1"],
"approval":{"by":"Mentor","time":"2025-09-25T19:59:00+02:00"}
}
8. Sicherheit & Kinderschutz
- PIIâGate: Jede Rolle muss
--scrubakzeptieren â PIIâErsatz ([redacted]). - Blocklist vorrangig vor Seeds & LLM.
- FreigabeâToken: Kleine EinmalâTokens (âHerzâ), die der Supervisor an Antworten anhĂ€ngt.
9. Kostenâ/RessourcenâMetriken
duration_ms,cpu_ms,mem_peak_mb,tokens_in/out,est_eur- Export: MQTT
crumb/audit+ Zeilenlog/opt/crumbcore/logs/crumbcore.log
10. OnboardingâCheckliste (pro Rolle)
- BinÀr/Script liegt unter
roles/<name>/<name>_hardened.*und ist executable. --healthgibt gĂŒltiges JSON.--aboutenthĂ€lt Version, Seeds, PolicyâPfad.--actkannCRCMessage v1von stdin lesen.- Block/Whitelist greift (TestfĂ€lle).
- OfflineâSeed funktioniert.
- Kostenmeter sichtbar.
- MQTTâStatus sendet ok/version.
- AuditâLog schreibt Zeile.
- Ein manueller FreigabeâToken wird korrekt angehĂ€ngt.
11. Schnellstart (DemoâPfad)
sudo mkdir -p /opt/crumbcore/{roles,policy,seeds,logs,etc}
cp topic_whitelist.txt /opt/crumbcore/policy/whitelist_topics.txt
cp block_keywords.txt /opt/crumbcore/policy/block_keywords.txt
cp bars_seed.txt /opt/crumbcore/seeds/funkfox.txt
ln -s /opt/crumb/fox /opt/crumbcore/roles/funkfox # oder echtes Verzeichnis
# Health Probe (Supervisor)
echo '{"role":"funkfox"}' | /opt/crumbcore/crumbcore_supervisor.sh funkfox
12. NĂ€chste Schritte
CRCâ1.0in README festschreiben + kurze Testsuite (crc_check.sh).- Zwei weitere Rollen migrieren (Bugsy, SnakePy) â EndâtoâEnd ĂŒber MQTT + Webhook.
- A4âCheatposter âCrew â Crumbcoreâ (fĂŒr Workshops) â mit QR zu
--aboutjeder Rolle.
Leitlinie: So wenig Magie wie möglich, so viel Klarheit wie nötig.