Spezifikation v0.1 · offen · herstellerneutral

So funktioniert’s

Ein Agent fragt. Dein Zuhause prüft das Mandat. Dann antwortet es: erlauben, nachfragen oder ablehnen – und schreibt es auf.

Fünf Bausteine

  • Haushalt Die Menschen, die dort wohnen. Sie schreiben das Mandat. Begriff in der Spezifikation:principal
  • Agent Jede KI, die etwas tun will – ein Sprachassistent, eine Energie-App. Begriff in der Spezifikation:agent
  • Gerät Eine Lampe, ein Schloss, eine Heizung. In 13 Kategorien sortiert. Begriff in der Spezifikation:resource
  • Aktion Was der Agent will: einschalten, öffnen, auf 21 °C stellen. Begriff in der Spezifikation:action
  • Entscheidung Die Antwort auf eine Anfrage: erlauben, nachfragen oder ablehnen. Begriff in der Spezifikation:decision

Der Weg einer Anfrage

Der Agent spricht nie direkt mit dem Gerät. Alles läuft über den Wächter im Haus.

Weg zeigen
Agentschickt eine Anfrage
Anfrage
Wächterbei dir im Haus · prüft das Mandat
Antwort
Entscheidung erlaubennachfragenablehnen
Befehlkein Befehl
Gerät führt aus es passiert nichts
prüft
Mandatdeine Hausordnung
HandyAlex bestätigt
Protokoll Jede Anfrage und Entscheidung wird festgehalten – auch abgelehnte.

Erlauben: Der Wächter findet eine passende Regel und gibt den Befehl sofort weiter.Nachfragen: Der Wächter schickt eine Frage an Alex’ Handy. Erst nach „Bestätigen“ öffnet sich die Tür. Keine Antwort in 2 Minuten heißt Nein.Ablehnen: Keine Regel erlaubt es, oder eine Regel verbietet es. Das Gerät bekommt nie einen Befehl.

Ein Mandat, zwei Ansichten

Dieselben Regeln – einmal als Sätze für Menschen, einmal als JSON für Maschinen. Beide sagen genau dasselbe.

Im Spielplatz bearbeiten

Klartext

  • Darf den Zustand aller Geräte lesenerlauben
  • Darf Licht ein- und ausschalten und dimmenerlauben
  • Darf die Temperatur bis 22 °C einstellenerlauben
  • Darf Türen entriegeln und öffnen, wenn Alex innerhalb von 2 Min. bestätigtnachfragen
  • Darf keine Kameras nutzen – nicht einmal hineinschauenablehnen
  • Darf die Alarmanlage nicht ausschaltenablehnen
  • Alles andereablehnen

JSON

voice-assistant.json
{
  "type": "https://home-mandate.org/mandate/v0",
  "id": "m-voice-assistant",
  "principal": "household:hm-7f3a",
  "agent": { "client_id": "hm-client:voice-7c21e9a4", "display_name": "Voice assistant" },
  "rules": [
    { "id": "r-read-all", "resource": { "any": true }, "actions": ["read"], "decision": "allow" },
    { "id": "r-lights", "resource": { "category": "light" }, "actions": ["turn_on", "turn_off", "set"], "decision": "allow" },
    { "id": "r-climate", "resource": { "category": "climate" }, "actions": ["set_temperature"], "decision": "allow",
      "constraints": { "temperature": { "max": 2200 } } },
    { "id": "r-locks", "resource": { "category": "lock" }, "actions": ["unlock", "open"], "decision": "ask",
      "approval": { "timeout": "PT2M", "approvers": ["alex"] } },
    { "id": "r-no-cameras", "resource": { "category": "camera" }, "actions": ["*"], "decision": "deny" },
    { "id": "r-no-alarm", "resource": { "category": "alarm" }, "actions": ["disarm"], "decision": "deny" }
  ],
  "default": "deny",
  "approval": { "timeout": "PT2M", "approvers": ["alex"] },
  "limits": { "max_actions_per_hour": 60 },
  "valid_from": "2026-10-01T00:00:00+02:00",
  "created_by": "alex",
  "created_at": "2026-10-01T09:12:00+02:00"
}

Die Grundregeln

  1. Nicht erlaubt heißt verboten.Passt keine Regel, lautet die Antwort ablehnen.
  2. Die strengste Regel gewinnt.Reihenfolge egal. Ablehnen schlägt nachfragen, nachfragen schlägt erlauben.
  3. Kritische Aktionen sind besonders.Ein Erlauben zählt nur, wenn jede passende Erlauben-Regel sie ausdrücklich nennt und allow_critical trägt. Sonst wird aus erlauben nachfragen: Ein Mensch muss bestätigen.
  4. Keine Antwort heißt Nein.Bestätigt niemand eine Nachfrage rechtzeitig, lautet die Antwort ablehnen.
  5. Entschieden und aufgeschrieben zu Hause.Der Wächter entscheidet, nicht der Agent – der Agent kann nur fragen. Jede Entscheidung landet im Protokoll.

Das Protokoll ist ein Fahrtenschreiber

Jeder Eintrag enthält den Fingerabdruck (SHA-256-Hash) des vorherigen. Ändert jemand einen alten Eintrag, ändert sich sein Fingerabdruck – und der nächste Eintrag passt nicht mehr.

  1. #1 · 19:02
    Licht an · Wohnzimmer erlauben
    prev
    null
    digest
    1f56…0405
  2. passt
    #2 · 19:05 geändert
    Alarmanlage aus ablehnen erlauben
    prev
    1f56…0405
    digest
    399d…eb0a
    9fc0…39b7
  3. passt passt nicht
    #3 · 19:06
    Haustür entriegeln nachfragen
    prev
    399d…eb0a
    digest
    a8e4…e87d
  4. passt
    #4 · 19:07
    Heizung auf 21 °C erlauben
    prev
    a8e4…e87d
    digest
    3b32…0251
Kette intakt. Jeder Fingerabdruck passt zum Eintrag davor. Änderung entdeckt. Eintrag 2 wurde bearbeitet, also hat sich sein Fingerabdruck geändert. Der in Eintrag 3 gespeicherte Fingerabdruck passt nicht mehr – die Prüfung schlägt bei Eintrag 3 fehl.

Die Kette ist nicht signiert: Wer das ganze Protokoll neu schreiben kann, kann auch jeden Fingerabdruck neu berechnen. Zum Beweis wird sie erst zusammen mit einer Kopie oder einem signierten Checkpoint außerhalb des Protokolls.

Für Techniker: die vier Einträge

Digest eines Eintrags: "sha256:" + hex(SHA-256(JCS(Eintrag))), über den vollständigen Eintrag einschließlich prev. Der erste Eintrag hat prev null. Austauschformat: JSON Lines.

audit.jsonl
{"type":"https://home-mandate.org/audit/v0","id":"01a13111-6c20-7101-8a01-00005eed0101","seq":1,"recorded_at":"2026-10-12T19:02:01+02:00","event":"decision","principal":"household:hm-7f3a","agent":{"client_id":"hm-client:voice-7c21e9a4"},"request":{"time":"2026-10-12T19:02:00+02:00","timezone":"Europe/Berlin","resource":{"entity_id":"light.living_room","category":"light","areas":["living_room"]},"action":"turn_on"},"mandate":{"id":"m-voice-assistant","digest":"sha256:1bd044ea0d93302d8207adf47a8c5f06f231707cb0822b2e2a88fa51c2d63b64"},"evaluation":{"decision":"allow","reason":"rule","rule_id":"r-lights"},"result":{"status":"executed"},"prev":null}
{"type":"https://home-mandate.org/audit/v0","id":"01a13114-3940-7102-9a02-00005eed0102","seq":2,"recorded_at":"2026-10-12T19:05:01+02:00","event":"decision","principal":"household:hm-7f3a","agent":{"client_id":"hm-client:voice-7c21e9a4"},"request":{"time":"2026-10-12T19:05:00+02:00","timezone":"Europe/Berlin","resource":{"entity_id":"alarm.house","category":"alarm"},"action":"disarm"},"mandate":{"id":"m-voice-assistant","digest":"sha256:1bd044ea0d93302d8207adf47a8c5f06f231707cb0822b2e2a88fa51c2d63b64"},"evaluation":{"decision":"deny","reason":"rule","rule_id":"r-no-alarm"},"result":{"status":"denied","denied_by":"mandate"},"prev":"sha256:1f56a91f3a236721aab9ce2aa120f825ed748afa732dd8523025a12ecec70405"}
{"type":"https://home-mandate.org/audit/v0","id":"01a13115-2420-7103-aa03-00005eed0103","seq":3,"recorded_at":"2026-10-12T19:06:40+02:00","event":"decision","principal":"household:hm-7f3a","agent":{"client_id":"hm-client:voice-7c21e9a4"},"request":{"time":"2026-10-12T19:06:00+02:00","timezone":"Europe/Berlin","resource":{"entity_id":"lock.front_door","category":"lock","areas":["hall"]},"action":"unlock"},"mandate":{"id":"m-voice-assistant","digest":"sha256:1bd044ea0d93302d8207adf47a8c5f06f231707cb0822b2e2a88fa51c2d63b64"},"evaluation":{"decision":"ask","reason":"rule","rule_id":"r-locks","approval_timeout":"PT2M"},"approval":{"outcome":"approved","by":"alex","at":"2026-10-12T19:06:40+02:00"},"result":{"status":"executed"},"prev":"sha256:399dfdceacfa98d5183d713ae58fe974d8212aefc82a04e2c1b665150381eb0a"}
{"type":"https://home-mandate.org/audit/v0","id":"01a13116-0e80-7104-ba04-00005eed0104","seq":4,"recorded_at":"2026-10-12T19:07:01+02:00","event":"decision","principal":"household:hm-7f3a","agent":{"client_id":"hm-client:voice-7c21e9a4"},"request":{"time":"2026-10-12T19:07:00+02:00","timezone":"Europe/Berlin","resource":{"entity_id":"climate.living_room","category":"climate","areas":["living_room"]},"action":"set_temperature","parameters":{"temperature":2100}},"mandate":{"id":"m-voice-assistant","digest":"sha256:1bd044ea0d93302d8207adf47a8c5f06f231707cb0822b2e2a88fa51c2d63b64"},"evaluation":{"decision":"allow","reason":"rule","rule_id":"r-climate"},"result":{"status":"executed"},"prev":"sha256:a8e48436333684cb6ae658427a366aeace6e36e35728a78fde6edb0b2457e87d"}

Weiterlesen