init: extract vestigia-ai-act-auditor from qognio-bot-widget-template@d2c816f
Source files (src/) and rendered bundle (www/) extracted on 2026-04-29T01:35:49+02:00. Adds nginx:alpine Dockerfile + docker-compose.yml (Caddy-labels) so the bot runs stand-alone or as a per-customer template clone. Parent monorepo commit: d2c816f3edbc9760802a11b29ff4151c7aad4b46 Bot version: 2026-04-25
This commit is contained in:
commit
a2b74d7e55
16 changed files with 3502 additions and 0 deletions
7
.dockerignore
Normal file
7
.dockerignore
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
README.md
|
||||||
|
bot.json
|
||||||
|
src/
|
||||||
|
docker-compose.yml
|
||||||
|
*.md
|
||||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
node_modules/
|
||||||
13
Dockerfile
Normal file
13
Dockerfile
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Static-bundle bot — nginx:alpine serves www/ on port 80.
|
||||||
|
FROM nginx:1.27-alpine
|
||||||
|
|
||||||
|
# nginx config: gzip + cache headers + index.html no-store
|
||||||
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
|
# Static bundle
|
||||||
|
COPY www/ /usr/share/nginx/html/
|
||||||
|
|
||||||
|
# Run as non-root via nginx's built-in unprivileged image features
|
||||||
|
EXPOSE 80
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD wget -q --spider http://127.0.0.1/index.html || exit 1
|
||||||
67
README.md
Normal file
67
README.md
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# VESTIGIA — AI-Act Audit-Trail-Generator
|
||||||
|
|
||||||
|
VESTIGIA — generiert dir die Spur, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung, Tech-Doku Anhang IV, Oversight-Checkliste. Im deutschen Bunker.
|
||||||
|
|
||||||
|
```
|
||||||
|
slug : vestigia-ai-act-auditor
|
||||||
|
version : 2026-04-25
|
||||||
|
accent : #b45309
|
||||||
|
runtime : nginx:alpine (static bundle)
|
||||||
|
template : qognio-bot-template-core (former qognio-bot-widget-template)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── src/ source — config.yaml, welcome.html, curricula.json, etc.
|
||||||
|
├── www/ rendered, directly servable static bundle
|
||||||
|
├── Dockerfile nginx:alpine + www/ → port 80
|
||||||
|
├── docker-compose.yml bot-host pattern (Caddy-labels, restart unless-stopped)
|
||||||
|
├── nginx.conf gzip + cache + SPA fallback
|
||||||
|
└── bot.json metadata + parent_core_commit
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up --build
|
||||||
|
# → http://localhost (you'll need to tweak ports for local-only use)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Re-render after upstream core changes
|
||||||
|
|
||||||
|
This repo only stores src + rendered output; the rendering engine lives in
|
||||||
|
`qognio-bot-template-core`. To pull in core changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/qognio-bot-template-core
|
||||||
|
./scripts/render.sh vestigia-ai-act-auditor --bot-repo /path/to/this/repo
|
||||||
|
git -C /path/to/this/repo commit -am "render: refresh from core@<sha>"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Per-customer copy (template usage)
|
||||||
|
|
||||||
|
This repo is a **template**. To clone for a customer:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone <this-repo> my-customer-vestigia-ai-act-auditor
|
||||||
|
cd my-customer-vestigia-ai-act-auditor
|
||||||
|
# tweak src/config.yaml (slug, bot_key_value, accent), src/welcome.html, src/curricula.json
|
||||||
|
docker compose -f docker-compose.yml up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deploy to qognio bot-host (.42 LXC pattern — legacy)
|
||||||
|
|
||||||
|
The bot-manager spawns LXC containers named after the slug. Push www/ via:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh fmh@46.243.203.42
|
||||||
|
sudo lxc file push /tmp/www/* vestigia-ai-act-auditor/var/www/html/
|
||||||
|
```
|
||||||
|
|
||||||
|
(Or run the docker-compose pattern on a Docker host — same network as Caddy.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Generated by `qognio-bot-template-core/scripts/extract-to-repo.sh` on 2026-04-29T01:35:49+02:00.
|
||||||
14
bot.json
Normal file
14
bot.json
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"slug": "vestigia-ai-act-auditor",
|
||||||
|
"name": "VESTIGIA",
|
||||||
|
"title": "AI-Act Audit-Trail-Generator",
|
||||||
|
"tagline": "Audit-Trail",
|
||||||
|
"description": "VESTIGIA — generiert dir die Spur, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung, Tech-Doku Anhang IV, Oversight-Checkliste. Im deutschen Bunker.",
|
||||||
|
"version": "2026-04-25",
|
||||||
|
"accent": "#b45309",
|
||||||
|
"extracted_from": "qognio-bot-widget-template",
|
||||||
|
"parent_core_commit": "d2c816f3edbc9760802a11b29ff4151c7aad4b46",
|
||||||
|
"extracted_at": "2026-04-29T01:35:49+02:00",
|
||||||
|
"runtime": "nginx:alpine",
|
||||||
|
"default_port": 80
|
||||||
|
}
|
||||||
20
docker-compose.yml
Normal file
20
docker-compose.yml
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Stand-alone bot container.
|
||||||
|
# Designed for the "caddy" external network on the bot host (qognio pattern).
|
||||||
|
# Override the hostname via SLUG env var if you reuse this template per customer.
|
||||||
|
services:
|
||||||
|
bot:
|
||||||
|
build: .
|
||||||
|
image: qognio/bot-vestigia-ai-act-auditor:${TAG:-latest}
|
||||||
|
container_name: bot-vestigia-ai-act-auditor
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- caddy
|
||||||
|
labels:
|
||||||
|
caddy: "vestigia-ai-act-auditor.on.qognio.com"
|
||||||
|
caddy.reverse_proxy: "{{upstreams 80}}"
|
||||||
|
qognio.bot.slug: "vestigia-ai-act-auditor"
|
||||||
|
qognio.bot.version: "2026-04-25"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy:
|
||||||
|
external: true
|
||||||
27
nginx.conf
Normal file
27
nginx.conf
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# gzip
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_types text/css application/javascript application/json image/svg+xml text/plain;
|
||||||
|
gzip_min_length 512;
|
||||||
|
|
||||||
|
# index.html: never cache (so welcome screen / wiring updates land instantly)
|
||||||
|
location = /index.html {
|
||||||
|
add_header Cache-Control "no-store, must-revalidate" always;
|
||||||
|
}
|
||||||
|
|
||||||
|
# static assets: cache 1h
|
||||||
|
location ~* \.(?:css|js|json|svg|png|jpe?g|webp|gif|ico|woff2?)$ {
|
||||||
|
add_header Cache-Control "public, max-age=3600" always;
|
||||||
|
try_files $uri =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/check-badges.js
Normal file
18
src/check-badges.js
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Erste Spur — 1 Quiz im Vier-Klassen-Modul (Risiko-Klassen)
|
||||||
|
if ((state.moduleCorrect && state.moduleCorrect['vier-klassen'] >= 1)) unlockBadge('erste_spur');
|
||||||
|
// Anhang-III-Lotse — 5 Quiz korrekt im Anhang-III-Modul
|
||||||
|
if ((state.moduleCorrect && state.moduleCorrect['anhang-iii'] >= 5)) unlockBadge('anhang_iii_lotse');
|
||||||
|
// Tech-Doku-Architekt — 5 Quiz korrekt im Anhang-IV-Struktur-Modul
|
||||||
|
if ((state.moduleCorrect && state.moduleCorrect['anhang-iv-struktur'] >= 5)) unlockBadge('tech_doku_architekt');
|
||||||
|
// Oversight-Profi — 5 Quiz korrekt im Oversight-Grundlagen-Modul
|
||||||
|
if ((state.moduleCorrect && state.moduleCorrect['oversight-grundlagen'] >= 5)) unlockBadge('oversight_profi');
|
||||||
|
// Logging-Champion — Logging-Pflicht-Modul Flashcards bestanden
|
||||||
|
if ((state.modulePassedFlash && state.modulePassedFlash['logging-pflicht'])) unlockBadge('logging_champion');
|
||||||
|
// Audit-Spurleger — 12 von 15 Modulen mit ≥80% Quiz-Score abgeschlossen (80% Master-Coverage)
|
||||||
|
if ((state.completedCurricula || []).length >= 12) unlockBadge('audit_spurleger');
|
||||||
|
// Compliance-Disziplin — 14-Tage-Streak
|
||||||
|
if (state.maxStreak >= 14) unlockBadge('streak_14');
|
||||||
|
// Night Owl & Early Bird (beibehalten)
|
||||||
|
const h = new Date().getHours();
|
||||||
|
if (h >= 22) unlockBadge('night_owl');
|
||||||
|
if (h < 7) unlockBadge('early_bird');
|
||||||
33
src/config.yaml
Normal file
33
src/config.yaml
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
slug: vestigia-ai-act-auditor
|
||||||
|
bot_name: VESTIGIA
|
||||||
|
bot_title: AI-Act Audit-Trail-Generator
|
||||||
|
brand_letter: V
|
||||||
|
title: "VESTIGIA · AI-Act Audit-Trail-Generator"
|
||||||
|
tagline: AI-Act Audit-Trail-Generator
|
||||||
|
tagline_short: Audit-Trail
|
||||||
|
meta_description: "VESTIGIA — generiert dir die Spur, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung, Tech-Doku Anhang IV, Oversight-Checkliste. Im deutschen Bunker."
|
||||||
|
bot_key_var: __VESTIGIA_KEY__
|
||||||
|
bot_key_value: qb_baqyoau66uco
|
||||||
|
ls_prefix: vestigia
|
||||||
|
bot_version: "2026-04-25"
|
||||||
|
|
||||||
|
# Color theme — gold-bronze (Spur, Forensik, Auditor)
|
||||||
|
accent: "#b45309"
|
||||||
|
accent_2: "#d97706"
|
||||||
|
accent_dark: "#92400e"
|
||||||
|
accent_rgb: "180, 83, 9"
|
||||||
|
accent_rgb_compact: "180,83,9"
|
||||||
|
success_color: "#22c55e"
|
||||||
|
msg_strong_color: "#fde68a"
|
||||||
|
|
||||||
|
# UI Labels
|
||||||
|
tab_flash_label: Karten
|
||||||
|
tab_curriculum_label: Module
|
||||||
|
curriculum_long_label: Audit-Atlas
|
||||||
|
|
||||||
|
# Bot-personality strings
|
||||||
|
quiz_intro_hint: "Wähle ein Modul — VESTIGIA generiert AI-Act-Audit-Szenarien (Risiko-Klassen, Anhang III, Tech-Doku)."
|
||||||
|
quiz_verb: erstellt
|
||||||
|
quiz_noun: "Audit-Szenarien"
|
||||||
|
flash_intro_hint: "Karteikarten zu Anhängen, Risiko-Klassen, Oversight-Pflichten — mit Spaced-Repetition."
|
||||||
|
flash_verb: generiert
|
||||||
181
src/curricula.json
Normal file
181
src/curricula.json
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
{
|
||||||
|
"version": "2026-04-25",
|
||||||
|
"updated": "2026-04-25",
|
||||||
|
"curricula": [
|
||||||
|
{
|
||||||
|
"id": "risiko-klassen",
|
||||||
|
"title": "1 · Risiko-Klassen & Anhang III",
|
||||||
|
"short": "Verboten / Hochrisiko / Limited / Minimal — wie klassifizieren",
|
||||||
|
"icon": "shield",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Die 4 Risiko-Klassen des AI Act, Anhang III als Hochrisiko-Katalog, Klassifizierungs-Workflow für eigene und eingekaufte AI-Systeme.",
|
||||||
|
"source_md": "00-risiko-klassen.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "vier-klassen",
|
||||||
|
"title": "Die vier Risiko-Klassen",
|
||||||
|
"objectives": ["Verbotene Praktiken (Art. 5) erkennen","Hochrisiko (Art. 6) vom Limited-Risk (Art. 50 Transparenz) abgrenzen","Minimal-Risk-Default verstehen"],
|
||||||
|
"topics": ["Art. 5","Art. 6","Art. 50","Risiko-Pyramide"],
|
||||||
|
"difficulty": "einfach",
|
||||||
|
"source_heading": "Die 4 Risiko-Klassen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "anhang-iii",
|
||||||
|
"title": "Anhang III — Hochrisiko-Katalog",
|
||||||
|
"objectives": ["8 Anwendungsbereiche aus Anhang III auswendig kennen","HR-Bewerber-Filter, Kreditscoring, Bildungs-AI sicher zuordnen","Anhang-III-Update-Mechanismus (delegierte Rechtsakte) kennen"],
|
||||||
|
"topics": ["Biometrie","Kritische Infrastruktur","Bildung","HR","Wesentliche private/öffentliche Dienste","Strafverfolgung","Migration","Justiz"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Anhang III"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "klassifizierungs-workflow",
|
||||||
|
"title": "Klassifizierungs-Workflow",
|
||||||
|
"objectives": ["Schritt-für-Schritt ein eingekauftes AI-System klassifizieren","Anbieter- vs. Betreiber-Pflichten unterscheiden (Art. 25)","Borderline-Fälle dokumentieren statt raten"],
|
||||||
|
"topics": ["Anbieter (Art. 16)","Betreiber (Art. 26)","Importeur (Art. 23)","Klassifizierungs-Workflow"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Klassifizierung in der Praxis"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tech-doku",
|
||||||
|
"title": "2 · Technische Dokumentation (Anhang IV)",
|
||||||
|
"short": "Was muss rein, in welchem Detail, für wen",
|
||||||
|
"icon": "book",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Anhang-IV-Pflichtinhalte für Hochrisiko-AI: System-Beschreibung, Daten-Karte, Bewertungs-Methodik, Risiko-Management, Logs, Cybersecurity, Anweisungen für Betreiber.",
|
||||||
|
"source_md": "01-tech-doku.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "anhang-iv-struktur",
|
||||||
|
"title": "Anhang IV — die 9 Pflicht-Abschnitte",
|
||||||
|
"objectives": ["Alle 9 Abschnitte von Anhang IV benennen","Detail-Tiefe pro Abschnitt einschätzen","Wer schreibt was — Anbieter vs. Betreiber"],
|
||||||
|
"topics": ["Anhang IV","Tech-Doku","9 Abschnitte"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Anhang IV Struktur"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "data-card",
|
||||||
|
"title": "Daten-Karte & Trainings-Datensätze",
|
||||||
|
"objectives": ["Daten-Karte nach Art. 10 + Anhang IV Abschnitt 2 schreiben","Bias-Doku (Repräsentativität, Lücken, Fehlerquellen)","Verhältnis zu DSGVO Art. 30 VVT"],
|
||||||
|
"topics": ["Art. 10","Daten-Governance","Bias","Repräsentativität"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Daten-Karte"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "anweisungen-betreiber",
|
||||||
|
"title": "Anweisungen für Betreiber (Art. 13)",
|
||||||
|
"objectives": ["Mindest-Inhalte der Betreiber-Doku","Verständlichkeit für Nicht-Techniker:innen","Wie der Betreiber seine Pflichten daraus ableitet"],
|
||||||
|
"topics": ["Art. 13","Transparenz","Betreiber-Anweisungen"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Betreiber-Anweisungen"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "oversight",
|
||||||
|
"title": "3 · Menschliche Aufsicht (Art. 14)",
|
||||||
|
"short": "Wer überwacht wann mit welchen Befugnissen",
|
||||||
|
"icon": "eye",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Konzept der menschlichen Aufsicht: Stop-Befugnis, Override, Plausibilitäts-Checks, Schulungspflichten. Mehr als 'ein Mensch klickt am Ende'.",
|
||||||
|
"source_md": "02-oversight.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "oversight-grundlagen",
|
||||||
|
"title": "Art. 14 — was Oversight wirklich heißt",
|
||||||
|
"objectives": ["Substanzielle Aufsicht von 'Schein-Oversight' (Rubber-Stamping) abgrenzen","Mindest-Befugnisse der Aufsichtsperson","EuGH Schufa-Urteil C-634/21 anwenden"],
|
||||||
|
"topics": ["Art. 14","Substanzielle Aufsicht","Schufa-Urteil"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Substanzielle Oversight"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "oversight-checkliste",
|
||||||
|
"title": "Oversight-Checkliste & Schulung",
|
||||||
|
"objectives": ["Pre-Deployment-Checkliste für Aufsichtspersonen","Schulungs-Inhalte & -Frequenz","Schulungs-Nachweis als Audit-Artefakt"],
|
||||||
|
"topics": ["Schulungs-Pflicht","Pre-Deployment","Audit-Nachweis"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Oversight in der Praxis"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "automation-bias",
|
||||||
|
"title": "Automation-Bias & Gegenmaßnahmen",
|
||||||
|
"objectives": ["Automation-Bias erkennen (zu viel Vertrauen in KI)","Confirmation-Bias bei wiederholten Empfehlungen","Strukturelle Gegenmaßnahmen: Devil's-Advocate, Sample-Audits, Cross-Check"],
|
||||||
|
"topics": ["Automation-Bias","Devil's Advocate","Sample-Audits"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Automation-Bias"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "logging",
|
||||||
|
"title": "4 · Logging-Pflicht (Art. 12)",
|
||||||
|
"short": "Was muss geloggt werden, in welcher Tiefe, wie lange",
|
||||||
|
"icon": "list",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Automatische Aufzeichnung von Ereignissen während des Lebenszyklus (Logs). Was Anbieter, was Betreiber, in welchem Granularitäts-Level.",
|
||||||
|
"source_md": "03-logging.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "logging-pflicht",
|
||||||
|
"title": "Was Art. 12 verlangt",
|
||||||
|
"objectives": ["Mindest-Inhalte der Logs (Eingabe, Ausgabe, Zeitstempel, Modell-Version)","Lebenszyklus-Begriff verstehen","Aufbewahrungsfristen (typisch 6 Monate Anbieter, mind. 6 Monate Betreiber)"],
|
||||||
|
"topics": ["Art. 12","Logs","Aufbewahrungsfrist"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Logging-Pflicht"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "log-schema",
|
||||||
|
"title": "Log-Schema-Beispiel",
|
||||||
|
"objectives": ["Konkretes JSON-Schema für Logs","PII-Minimierung in Logs (Pseudonymisierung)","Trennung: Audit-Logs vs. Debug-Logs"],
|
||||||
|
"topics": ["JSON-Schema","Pseudonymisierung","Audit vs Debug"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Log-Schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "log-retention",
|
||||||
|
"title": "Aufbewahrung & Zugriff",
|
||||||
|
"objectives": ["Wer darf Logs wann sehen","Konflikt mit DSGVO Art. 17 Löschverlangen lösen","Tamper-Evidence (WORM-Storage, Hash-Chains)"],
|
||||||
|
"topics": ["Tamper-Evidence","WORM","Hash-Chain"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Aufbewahrung"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "audit-trail",
|
||||||
|
"title": "5 · Audit-Trail-Generation",
|
||||||
|
"short": "Wie du aus den 4 Bausteinen einen Auditor-tauglichen Trail baust",
|
||||||
|
"icon": "search",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Zusammenspiel der 4 Bausteine zu einem konsistenten Audit-Trail. Pre-Deployment-Bundle, Continuous-Bundle, Incident-Response-Bundle für die notifizierte Stelle / Marktüberwachung.",
|
||||||
|
"source_md": "04-audit-trail.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "trail-architecture",
|
||||||
|
"title": "Audit-Trail-Architektur",
|
||||||
|
"objectives": ["Pre-Deployment-Bundle definieren (Tech-Doku + DPIA + Konformitäts-Erklärung)","Continuous-Bundle (Logs + Monitoring + Re-Klassifizierung-Trigger)","Incident-Response-Bundle (Art. 73 schwerwiegende Vorfälle)"],
|
||||||
|
"topics": ["Pre-Deployment","Continuous","Incident-Response","Art. 73"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Trail-Architektur"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "konformitaets-erklaerung",
|
||||||
|
"title": "EU-Konformitätserklärung & CE-Marke",
|
||||||
|
"objectives": ["Art. 47 EU-Konformitätserklärung — Mindest-Inhalt","CE-Kennzeichnung für Hochrisiko-AI","Notifizierte Stellen — wann involviert"],
|
||||||
|
"topics": ["Art. 47","CE-Marke","Notifizierte Stelle"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Konformitätserklärung"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "marktueberwachung",
|
||||||
|
"title": "Marktüberwachung & Sanktionen",
|
||||||
|
"objectives": ["Welche Behörde ist zuständig (BNetzA, BfDI, Land)","Wann wird die notifizierte Stelle / Behörde involviert","Sanktionen Art. 99: bis 35 Mio. € oder 7 % Jahresumsatz"],
|
||||||
|
"topics": ["BNetzA","BfDI","Marktüberwachung","Art. 99"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Marktüberwachung"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
4
src/levels-fallback.js
Normal file
4
src/levels-fallback.js
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{ min: 0, title: 'AI-Officer-Trainee' }, { min: 50, title: 'AI-Officer' },
|
||||||
|
{ min: 200, title: 'AI-Compliance-Spezialist:in' }, { min: 500, title: 'AI-Auditor:in' },
|
||||||
|
{ min: 1250, title: 'AI-Governance-Lead' }, { min: 2500, title: 'AI-Act-Expert:in' },
|
||||||
|
{ min: 5000, title: 'Lead-Auditor AI-Act' }
|
||||||
25
src/welcome.html
Normal file
25
src/welcome.html
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
<h2>Hi, ich bin VESTIGIA.</h2>
|
||||||
|
<p>Ich kümmere mich nicht um die KI selbst — sondern um die <strong>Spur</strong>, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung (Anhang III), DPIA-Crosswalk, Tech-Doku (Art. 11), Oversight-Checkliste, Begründungs-Logging. Sag mir: welches AI-System ist's und wer setzt es ein? Dann generieren wir die Audit-Spur.</p>
|
||||||
|
<div class="mode-grid">
|
||||||
|
<button class="mode-card" data-goto="chat">
|
||||||
|
<strong>Chat</strong>
|
||||||
|
<span>Frag mich zu Risiko-Klassen, Anhang III, Tech-Doku, Logging.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="quiz">
|
||||||
|
<strong>Quiz</strong>
|
||||||
|
<span>Audit-Szenarien aus dem Compliance-Alltag, mit XP.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="flash">
|
||||||
|
<strong>Flashcards</strong>
|
||||||
|
<span>Anhänge, Risiko-Klassen, Oversight — Spaced-Repetition.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="progress">
|
||||||
|
<strong>Fortschritt</strong>
|
||||||
|
<span>XP, Badges, Level vom AI-Officer-Trainee bis Lead-Auditor.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="curriculum">
|
||||||
|
<strong>Module</strong>
|
||||||
|
<span>5 Curricula / 15 Module: Risiko-Klassen · Tech-Doku Anhang IV · Oversight · Logging · Audit-Trail.</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<p style="font-size:.82rem;color:var(--text-mute)">Drei Sätze: Klassifizier dein AI-System (Risiko-Klasse) → Generier die Pflicht-Artefakte (DPIA, Tech-Doku, Oversight-Plan) → Logg jede Entscheidung mit Begründung. KURT macht den DSGVO+AI-Act-Crosswalk; ich bin der Tiefen-Bot für Audit-Trail.</p>
|
||||||
1749
www/app.js
Normal file
1749
www/app.js
Normal file
File diff suppressed because it is too large
Load diff
181
www/curricula.json
Normal file
181
www/curricula.json
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
{
|
||||||
|
"version": "2026-04-25",
|
||||||
|
"updated": "2026-04-25",
|
||||||
|
"curricula": [
|
||||||
|
{
|
||||||
|
"id": "risiko-klassen",
|
||||||
|
"title": "1 · Risiko-Klassen & Anhang III",
|
||||||
|
"short": "Verboten / Hochrisiko / Limited / Minimal — wie klassifizieren",
|
||||||
|
"icon": "shield",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Die 4 Risiko-Klassen des AI Act, Anhang III als Hochrisiko-Katalog, Klassifizierungs-Workflow für eigene und eingekaufte AI-Systeme.",
|
||||||
|
"source_md": "00-risiko-klassen.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "vier-klassen",
|
||||||
|
"title": "Die vier Risiko-Klassen",
|
||||||
|
"objectives": ["Verbotene Praktiken (Art. 5) erkennen","Hochrisiko (Art. 6) vom Limited-Risk (Art. 50 Transparenz) abgrenzen","Minimal-Risk-Default verstehen"],
|
||||||
|
"topics": ["Art. 5","Art. 6","Art. 50","Risiko-Pyramide"],
|
||||||
|
"difficulty": "einfach",
|
||||||
|
"source_heading": "Die 4 Risiko-Klassen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "anhang-iii",
|
||||||
|
"title": "Anhang III — Hochrisiko-Katalog",
|
||||||
|
"objectives": ["8 Anwendungsbereiche aus Anhang III auswendig kennen","HR-Bewerber-Filter, Kreditscoring, Bildungs-AI sicher zuordnen","Anhang-III-Update-Mechanismus (delegierte Rechtsakte) kennen"],
|
||||||
|
"topics": ["Biometrie","Kritische Infrastruktur","Bildung","HR","Wesentliche private/öffentliche Dienste","Strafverfolgung","Migration","Justiz"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Anhang III"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "klassifizierungs-workflow",
|
||||||
|
"title": "Klassifizierungs-Workflow",
|
||||||
|
"objectives": ["Schritt-für-Schritt ein eingekauftes AI-System klassifizieren","Anbieter- vs. Betreiber-Pflichten unterscheiden (Art. 25)","Borderline-Fälle dokumentieren statt raten"],
|
||||||
|
"topics": ["Anbieter (Art. 16)","Betreiber (Art. 26)","Importeur (Art. 23)","Klassifizierungs-Workflow"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Klassifizierung in der Praxis"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tech-doku",
|
||||||
|
"title": "2 · Technische Dokumentation (Anhang IV)",
|
||||||
|
"short": "Was muss rein, in welchem Detail, für wen",
|
||||||
|
"icon": "book",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Anhang-IV-Pflichtinhalte für Hochrisiko-AI: System-Beschreibung, Daten-Karte, Bewertungs-Methodik, Risiko-Management, Logs, Cybersecurity, Anweisungen für Betreiber.",
|
||||||
|
"source_md": "01-tech-doku.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "anhang-iv-struktur",
|
||||||
|
"title": "Anhang IV — die 9 Pflicht-Abschnitte",
|
||||||
|
"objectives": ["Alle 9 Abschnitte von Anhang IV benennen","Detail-Tiefe pro Abschnitt einschätzen","Wer schreibt was — Anbieter vs. Betreiber"],
|
||||||
|
"topics": ["Anhang IV","Tech-Doku","9 Abschnitte"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Anhang IV Struktur"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "data-card",
|
||||||
|
"title": "Daten-Karte & Trainings-Datensätze",
|
||||||
|
"objectives": ["Daten-Karte nach Art. 10 + Anhang IV Abschnitt 2 schreiben","Bias-Doku (Repräsentativität, Lücken, Fehlerquellen)","Verhältnis zu DSGVO Art. 30 VVT"],
|
||||||
|
"topics": ["Art. 10","Daten-Governance","Bias","Repräsentativität"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Daten-Karte"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "anweisungen-betreiber",
|
||||||
|
"title": "Anweisungen für Betreiber (Art. 13)",
|
||||||
|
"objectives": ["Mindest-Inhalte der Betreiber-Doku","Verständlichkeit für Nicht-Techniker:innen","Wie der Betreiber seine Pflichten daraus ableitet"],
|
||||||
|
"topics": ["Art. 13","Transparenz","Betreiber-Anweisungen"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Betreiber-Anweisungen"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "oversight",
|
||||||
|
"title": "3 · Menschliche Aufsicht (Art. 14)",
|
||||||
|
"short": "Wer überwacht wann mit welchen Befugnissen",
|
||||||
|
"icon": "eye",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Konzept der menschlichen Aufsicht: Stop-Befugnis, Override, Plausibilitäts-Checks, Schulungspflichten. Mehr als 'ein Mensch klickt am Ende'.",
|
||||||
|
"source_md": "02-oversight.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "oversight-grundlagen",
|
||||||
|
"title": "Art. 14 — was Oversight wirklich heißt",
|
||||||
|
"objectives": ["Substanzielle Aufsicht von 'Schein-Oversight' (Rubber-Stamping) abgrenzen","Mindest-Befugnisse der Aufsichtsperson","EuGH Schufa-Urteil C-634/21 anwenden"],
|
||||||
|
"topics": ["Art. 14","Substanzielle Aufsicht","Schufa-Urteil"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Substanzielle Oversight"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "oversight-checkliste",
|
||||||
|
"title": "Oversight-Checkliste & Schulung",
|
||||||
|
"objectives": ["Pre-Deployment-Checkliste für Aufsichtspersonen","Schulungs-Inhalte & -Frequenz","Schulungs-Nachweis als Audit-Artefakt"],
|
||||||
|
"topics": ["Schulungs-Pflicht","Pre-Deployment","Audit-Nachweis"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Oversight in der Praxis"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "automation-bias",
|
||||||
|
"title": "Automation-Bias & Gegenmaßnahmen",
|
||||||
|
"objectives": ["Automation-Bias erkennen (zu viel Vertrauen in KI)","Confirmation-Bias bei wiederholten Empfehlungen","Strukturelle Gegenmaßnahmen: Devil's-Advocate, Sample-Audits, Cross-Check"],
|
||||||
|
"topics": ["Automation-Bias","Devil's Advocate","Sample-Audits"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Automation-Bias"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "logging",
|
||||||
|
"title": "4 · Logging-Pflicht (Art. 12)",
|
||||||
|
"short": "Was muss geloggt werden, in welcher Tiefe, wie lange",
|
||||||
|
"icon": "list",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Automatische Aufzeichnung von Ereignissen während des Lebenszyklus (Logs). Was Anbieter, was Betreiber, in welchem Granularitäts-Level.",
|
||||||
|
"source_md": "03-logging.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "logging-pflicht",
|
||||||
|
"title": "Was Art. 12 verlangt",
|
||||||
|
"objectives": ["Mindest-Inhalte der Logs (Eingabe, Ausgabe, Zeitstempel, Modell-Version)","Lebenszyklus-Begriff verstehen","Aufbewahrungsfristen (typisch 6 Monate Anbieter, mind. 6 Monate Betreiber)"],
|
||||||
|
"topics": ["Art. 12","Logs","Aufbewahrungsfrist"],
|
||||||
|
"difficulty": "mittel",
|
||||||
|
"source_heading": "Logging-Pflicht"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "log-schema",
|
||||||
|
"title": "Log-Schema-Beispiel",
|
||||||
|
"objectives": ["Konkretes JSON-Schema für Logs","PII-Minimierung in Logs (Pseudonymisierung)","Trennung: Audit-Logs vs. Debug-Logs"],
|
||||||
|
"topics": ["JSON-Schema","Pseudonymisierung","Audit vs Debug"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Log-Schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "log-retention",
|
||||||
|
"title": "Aufbewahrung & Zugriff",
|
||||||
|
"objectives": ["Wer darf Logs wann sehen","Konflikt mit DSGVO Art. 17 Löschverlangen lösen","Tamper-Evidence (WORM-Storage, Hash-Chains)"],
|
||||||
|
"topics": ["Tamper-Evidence","WORM","Hash-Chain"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Aufbewahrung"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "audit-trail",
|
||||||
|
"title": "5 · Audit-Trail-Generation",
|
||||||
|
"short": "Wie du aus den 4 Bausteinen einen Auditor-tauglichen Trail baust",
|
||||||
|
"icon": "search",
|
||||||
|
"color": "#b45309",
|
||||||
|
"description": "Zusammenspiel der 4 Bausteine zu einem konsistenten Audit-Trail. Pre-Deployment-Bundle, Continuous-Bundle, Incident-Response-Bundle für die notifizierte Stelle / Marktüberwachung.",
|
||||||
|
"source_md": "04-audit-trail.md",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"id": "trail-architecture",
|
||||||
|
"title": "Audit-Trail-Architektur",
|
||||||
|
"objectives": ["Pre-Deployment-Bundle definieren (Tech-Doku + DPIA + Konformitäts-Erklärung)","Continuous-Bundle (Logs + Monitoring + Re-Klassifizierung-Trigger)","Incident-Response-Bundle (Art. 73 schwerwiegende Vorfälle)"],
|
||||||
|
"topics": ["Pre-Deployment","Continuous","Incident-Response","Art. 73"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Trail-Architektur"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "konformitaets-erklaerung",
|
||||||
|
"title": "EU-Konformitätserklärung & CE-Marke",
|
||||||
|
"objectives": ["Art. 47 EU-Konformitätserklärung — Mindest-Inhalt","CE-Kennzeichnung für Hochrisiko-AI","Notifizierte Stellen — wann involviert"],
|
||||||
|
"topics": ["Art. 47","CE-Marke","Notifizierte Stelle"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Konformitätserklärung"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "marktueberwachung",
|
||||||
|
"title": "Marktüberwachung & Sanktionen",
|
||||||
|
"objectives": ["Welche Behörde ist zuständig (BNetzA, BfDI, Land)","Wann wird die notifizierte Stelle / Behörde involviert","Sanktionen Art. 99: bis 35 Mio. € oder 7 % Jahresumsatz"],
|
||||||
|
"topics": ["BNetzA","BfDI","Marktüberwachung","Art. 99"],
|
||||||
|
"difficulty": "schwer",
|
||||||
|
"source_heading": "Marktüberwachung"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
121
www/index.html
Normal file
121
www/index.html
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>VESTIGIA · AI-Act Audit-Trail-Generator</title>
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
||||||
|
<meta name="theme-color" content="#0a0a0f">
|
||||||
|
<meta name="description" content="VESTIGIA — generiert dir die Spur, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung, Tech-Doku Anhang IV, Oversight-Checkliste. Im deutschen Bunker.">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
<script>window.__VESTIGIA_KEY__ = 'qb_baqyoau66uco';</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="app" role="application" aria-label="VESTIGIA AI-Act Audit-Trail-Generator">
|
||||||
|
|
||||||
|
<header class="topbar">
|
||||||
|
<div class="brand">
|
||||||
|
<span class="brand-icon" aria-hidden="true">V</span>
|
||||||
|
<span>VESTIGIA <small>Audit-Trail</small></span>
|
||||||
|
</div>
|
||||||
|
<div class="spacer"></div>
|
||||||
|
<span class="status" role="status" aria-live="polite">Online</span>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="tabbar" role="tablist" aria-label="Modi">
|
||||||
|
<button class="tab" role="tab" aria-selected="true" aria-controls="view-chat" data-mode="chat">
|
||||||
|
Chat
|
||||||
|
<span class="tab-kbd">⌃1</span>
|
||||||
|
</button>
|
||||||
|
<button class="tab" role="tab" aria-selected="false" aria-controls="view-quiz" data-mode="quiz">
|
||||||
|
Quiz
|
||||||
|
<span class="tab-kbd">⌃2</span>
|
||||||
|
</button>
|
||||||
|
<button class="tab" role="tab" aria-selected="false" aria-controls="view-flash" data-mode="flash">
|
||||||
|
Karten
|
||||||
|
<span class="tab-kbd">⌃3</span>
|
||||||
|
</button>
|
||||||
|
<button class="tab" role="tab" aria-selected="false" aria-controls="view-progress" data-mode="progress">
|
||||||
|
Fortschritt
|
||||||
|
<span class="tab-kbd">⌃4</span>
|
||||||
|
</button>
|
||||||
|
<button class="tab" role="tab" aria-selected="false" aria-controls="view-curriculum" data-mode="curriculum">
|
||||||
|
Module
|
||||||
|
<span class="tab-kbd">⌃5</span>
|
||||||
|
</button>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<!-- CHAT -->
|
||||||
|
<section id="view-chat" class="view" role="tabpanel" aria-labelledby="tab-chat" data-active="true">
|
||||||
|
<div id="welcome-screen" class="welcome hidden" aria-hidden="true">
|
||||||
|
<h2>Hi, ich bin VESTIGIA.</h2>
|
||||||
|
<p>Ich kümmere mich nicht um die KI selbst — sondern um die <strong>Spur</strong>, die jede KI-Entscheidung nach EU AI Act hinterlassen muss. Risiko-Klassifizierung (Anhang III), DPIA-Crosswalk, Tech-Doku (Art. 11), Oversight-Checkliste, Begründungs-Logging. Sag mir: welches AI-System ist's und wer setzt es ein? Dann generieren wir die Audit-Spur.</p>
|
||||||
|
<div class="mode-grid">
|
||||||
|
<button class="mode-card" data-goto="chat">
|
||||||
|
<strong>Chat</strong>
|
||||||
|
<span>Frag mich zu Risiko-Klassen, Anhang III, Tech-Doku, Logging.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="quiz">
|
||||||
|
<strong>Quiz</strong>
|
||||||
|
<span>Audit-Szenarien aus dem Compliance-Alltag, mit XP.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="flash">
|
||||||
|
<strong>Flashcards</strong>
|
||||||
|
<span>Anhänge, Risiko-Klassen, Oversight — Spaced-Repetition.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="progress">
|
||||||
|
<strong>Fortschritt</strong>
|
||||||
|
<span>XP, Badges, Level vom AI-Officer-Trainee bis Lead-Auditor.</span>
|
||||||
|
</button>
|
||||||
|
<button class="mode-card" data-goto="curriculum">
|
||||||
|
<strong>Module</strong>
|
||||||
|
<span>5 Curricula / 15 Module: Risiko-Klassen · Tech-Doku Anhang IV · Oversight · Logging · Audit-Trail.</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<p style="font-size:.82rem;color:var(--text-mute)">Drei Sätze: Klassifizier dein AI-System (Risiko-Klasse) → Generier die Pflicht-Artefakte (DPIA, Tech-Doku, Oversight-Plan) → Logg jede Entscheidung mit Begründung. KURT macht den DSGVO+AI-Act-Crosswalk; ich bin der Tiefen-Bot für Audit-Trail.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="chat-box" class="chat-box" aria-live="polite" aria-label="Gespräch"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- QUIZ -->
|
||||||
|
<section id="view-quiz" class="view" role="tabpanel" aria-labelledby="tab-quiz">
|
||||||
|
<div id="quiz-host"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- FLASHCARDS -->
|
||||||
|
<section id="view-flash" class="view" role="tabpanel" aria-labelledby="tab-flash">
|
||||||
|
<div id="flash-host"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- PROGRESS -->
|
||||||
|
<section id="view-progress" class="view" role="tabpanel" aria-labelledby="tab-progress">
|
||||||
|
<div id="progress-host"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- CURRICULUM -->
|
||||||
|
<section id="view-curriculum" class="view" role="tabpanel" aria-labelledby="tab-curr">
|
||||||
|
<div id="curr-host"></div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<form id="composer-form" class="composer" aria-label="Nachricht verfassen">
|
||||||
|
<div id="attach-strip" class="attach-strip" aria-live="polite"></div>
|
||||||
|
<div class="composer-row">
|
||||||
|
<button type="button" class="btn-attach" id="composer-attach" aria-label="Datei anhängen" title="Datei anhängen (PDF, Bild, Text — max 5 Dateien, 8 MB)">📎</button>
|
||||||
|
<input type="file" id="composer-file" multiple accept=".pdf,.txt,.md,.csv,.json,.xml,.yaml,.yml,.log,.png,.jpg,.jpeg,.webp,.gif" hidden>
|
||||||
|
<textarea id="composer" rows="1" placeholder="Frag VESTIGIA — Enter zum Senden, Shift+Enter für Zeilenumbruch" aria-label="Nachricht"></textarea>
|
||||||
|
<button type="submit" class="btn-primary" id="composer-send">Senden</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
Sovereign AI · Deutscher Bunker · <a href="https://qognio.com">Qognio</a> · DSGVO-konform · Keine externen Fonts · Keine Cookies
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="toast-stack" class="toast-stack" aria-live="polite"></div>
|
||||||
|
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1038
www/styles.css
Normal file
1038
www/styles.css
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue