{
  "service": "dissenter.website",
  "version": "1",
  "purpose": "KI-gestützte Bearbeitung von Mandanten-Websites. Eine KI bekommt nach erfolgreichem Pairing einen 24h-API-Token und kann das Designsystem, die Inhalte und Bilder eines Mandanten bearbeiten.",

  "workflow": {
    "1_user_action": "Der User loggt sich auf https://dissenter.website/ ein und ruft https://dissenter.website/pair.php auf. Dort generiert er per Klick einen 6-stelligen Code, der 5 Minuten gültig ist.",
    "2_user_tells_ki": "Der User nennt der KI den 6-stelligen Code im Chat.",
    "3_ki_redeems_code": "Die KI ruft POST https://dissenter.website/api/ki-pair.php auf mit JSON-Body {\"code\": \"123456\", \"label\": \"<KI-Identifikation>\"}. Bei Erfolg bekommt sie api_token, tenant-Infos und alle Endpoint-URLs.",
    "4_ki_reads_context": "Die KI fetcht zuerst die endpoints.bundle-URL — dort sind AGENTS.md, design-system.json, site.json, content.json, sections.json und alle Doku-Files in einem einzigen Markdown-Dokument gebündelt. Das ist der vollständige Kontext.",
    "5_ki_makes_changes": "Die KI ändert Files via POST <endpoints.update> mit {\"file\": \"data/...\", \"content\": \"...\"} und Authorization: Bearer <api_token>. Welche Files erlaubt sind, hängt von tenant.role ab (designer = alle, content = nur data/site.json und data/content.json)."
  },

  "endpoints": {
    "pair": "POST /api/ki-pair.php — Code → Token tauschen",
    "manage": "https://dissenter.website/manage_tokens.php — User kann aktive KI-Tokens listen/revoken"
  },

  "auth": {
    "scheme": "Bearer",
    "header": "Authorization: Bearer <api_token>",
    "token_ttl_seconds": 86400,
    "token_ttl_human": "24 Stunden",
    "code_ttl_seconds": 300,
    "code_ttl_human": "5 Minuten"
  },

  "rate_limits": {
    "ki_pair_per_ip_per_hour": 10
  },

  "rules_for_ki": [
    "Vor jeder Änderung den aktuellen Stand via bundle.php oder view.php?file=...&raw=1 lesen — nie blind überschreiben.",
    "AGENTS.md im Bundle ist der Master der Konventionen. Die Regeln dort haben Vorrang vor Allgemeinwissen.",
    "Nur Werte aus dem Designsystem (design-system.json) verwenden — keine hartkodierten Farben, Schriftgrößen, Spacings.",
    "Bei Mehrdeutigkeit eine kurze Klärungsfrage stellen, statt anzunehmen.",
    "Wenn role = content: keine Schreibversuche auf design-system.json, sections.json, tools/* — server antwortet sonst 403.",
    "Token nicht im Klartext im Chat-Verlauf wiederholen."
  ]
}
