Audit + Umbau: Faktenfehler behoben, Server-/Admin-Lücken geschlossen, 49 Screenshots, Schema-Matrix generiert

- Audit: plans/doku-audit.md (Befunde, Phasen P1-P9, Ausführungsprotokoll) + plans/audit/ (8 Detailreports) + plans/offene-issues.md
- Werkzeuge: scripts/audit-docs.mjs (Links/Anker/Bilder/Tabellen), scripts/gen-schema-matrix.mjs (npm run gen:schemas)
- Neue Seiten: projekt/feld-rechte, reference/rest-system, reference/schema-properties, projekt/tests, 5 Anwender-Seiten
- Fehler behoben: EMBEDDING_BGE_M3_*-Env, allowSnapshots, MCP-Scopes (.read/.create/.update), meta.views, loadAll-Signatur, OpenAPI-Endpunkt, MongoDB 8, Befehlspalette
- Screenshots: 9 Admin + 10 Anwender aus Mock-Projekt corporate (t1 entfernt), 49 Bilder gesamt
- AGENTS.md: Sync-Behauptung richtiggestellt, Belegpflicht/UI-Namen/Screenshot-Regeln, Werkzeug-Abschnitt
- Build: 71 Seiten grün, 0 tote Links, 0 kaputte Tabellen
This commit is contained in:
apairon committed 2026-10-17 01:49:35 +00:00
1 parent 1897bb50d9
commit 1928922e07
104 files changed
+4756 -1044

No files matched your search

+151
View File
@@ -0,0 +1,151 @@
{
"generatedAt": "2026-10-17T01:48:54.973Z",
"stats": {
"files": 70,
"byDir": {
"admin": 10,
"adr": 4,
"anwender": 16,
"einstieg": 4,
"index.mdx": 1,
"projekt": 17,
"reference": 13,
"server": 5
},
"components": {
"Aside": 111,
"Badge": 30,
"Steps": 92,
"TabItem": 64,
"Tabs": 28,
"Card": 11,
"CardGrid": 7,
"FileTree": 3,
"LinkCard": 19
},
"lacksDescription": [],
"emptyFenceLang": 0,
"proseWalls": [],
"asciiUmlauts": [
"src/content/docs/admin/aktionen.md",
"src/content/docs/anwender/aktionen.md",
"src/content/docs/projekt/felder-widgets.md",
"src/content/docs/projekt/mcp-nutzen.md",
"src/content/docs/projekt/navigation-i18n.md",
"src/content/docs/projekt/ssr-website.md",
"src/content/docs/reference/schema-properties.md"
],
"hollowMarkers": [
"src/content/docs/admin/exporte.md:37 Platzhalter",
"src/content/docs/anwender/seiten-bauen.md:45 Platzhalter",
"src/content/docs/einstieg/neues-projekt.md:26 Platzhalter",
"src/content/docs/einstieg/schnellstart.md:48 noch nicht",
"src/content/docs/einstieg/schnellstart.md:21 Platzhalter",
"src/content/docs/einstieg/was-ist-tibi.md:11 Platzhalter",
"src/content/docs/projekt/deploy.md:26 Platzhalter",
"src/content/docs/reference/openapi.md:6 Platzhalter"
],
"t1Refs": [
"src/content/docs/admin/konzept.md",
"src/content/docs/admin/setup.md",
"src/content/docs/adr/0003-selbstlaeufer.md"
],
"tibiAdminRefs": [
"src/content/docs/admin/aktionen.md (2×)",
"src/content/docs/admin/ansichten-listen.md (2×)",
"src/content/docs/admin/benutzer-rechte.md (2×)",
"src/content/docs/admin/customizing.md (2×)",
"src/content/docs/admin/eintrags-editor.md (2×)",
"src/content/docs/admin/exporte.md (2×)",
"src/content/docs/admin/ki-funktionen.md (2×)",
"src/content/docs/admin/konzept.md (3×)",
"src/content/docs/admin/medien.md (2×)",
"src/content/docs/admin/setup.md (4×)",
"src/content/docs/adr/0001-starlight.md (1×)",
"src/content/docs/adr/0002-code-schlaegt-doku.md (2×)",
"src/content/docs/adr/0003-selbstlaeufer.md (1×)",
"src/content/docs/anwender/anmelden.md (5×)",
"src/content/docs/anwender/benutzer-teams.md (1×)",
"src/content/docs/anwender/exportieren.md (3×)",
"src/content/docs/anwender/ki-nutzen.md (1×)",
"src/content/docs/anwender/medien.md (1×)",
"src/content/docs/anwender/orientierung.md (2×)",
"src/content/docs/anwender/seiten-bauen.md (1×)",
"src/content/docs/anwender/sichern.md (1×)",
"src/content/docs/einstieg/begriffe.md (4×)",
"src/content/docs/einstieg/neues-projekt.md (1×)",
"src/content/docs/einstieg/schnellstart.md (1×)",
"src/content/docs/einstieg/was-ist-tibi.md (3×)",
"src/content/docs/projekt/audit-backup.md (2×)",
"src/content/docs/projekt/jobs-actions.md (1×)",
"src/content/docs/projekt/navigation-i18n.md (1×)",
"src/content/docs/projekt/pagebuilder-dev.md (1×)",
"src/content/docs/projekt/sammlungen-anlegen.md (1×)",
"src/content/docs/projekt/suche.md (2×)",
"src/content/docs/reference/tastatur-kurzbefehle.md (2×)"
],
"fm_hero": 1,
"fm_template": 1
},
"sidebar": {
"count": 69,
"notInSidebar": [],
"sidebarMissing": []
},
"findings": [
{
"file": "src/content/docs/admin/exporte.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": Stehen im Export-Dialog eigene Reiter **vor** dem Standard-Tab, hat das Projekt fertige Berichte in `collectio",
"line": 37
},
{
"file": "src/content/docs/anwender/seiten-bauen.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": Die kleine Vorschau benötigt nach der Bildauswahl einen Moment. Ein Platzhalterbild ist in dieser Phase normal",
"line": 45
},
{
"file": "src/content/docs/einstieg/neues-projekt.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": ## 2. Platzhalter und Starter-Reste",
"line": 26
},
{
"file": "src/content/docs/einstieg/schnellstart.md",
"kind": "hollow",
"msg": "Marker \"noch nicht\": - `project not found` → Projektdateien liegen da, aber das Projekt ist im laufenden tibi-server noch nicht reg",
"line": 48
},
{
"file": "src/content/docs/einstieg/schnellstart.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": ## 2. Platzhalter ersetzen",
"line": 21
},
{
"file": "src/content/docs/einstieg/was-ist-tibi.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": - **Projekt-Website (aus `tibi-svelte-starter` geklont):** eigenständige Website auf Tibi-Basis — normale klei",
"line": 11
},
{
"file": "src/content/docs/projekt/deploy.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": Im Starter stehen Platzhalter (`__PROJECT_NAME__`, `_CUSTOMER_ID_`, `LIVE_URL=https://www`).",
"line": 26
},
{
"file": "src/content/docs/reference/openapi.md",
"kind": "hollow",
"msg": "Marker \"Platzhalter\": > Stand: Platzhalter · Quelle: `GET /api/v1/_openapi/:project` — nicht von Hand editieren. Erzeugen mit `npm r",
"line": 6
}
],
"summary": {
"total": 8,
"byKind": {
"hollow": 8
}
}
}
+200
View File
@@ -0,0 +1,200 @@
# Audit: tibi-server (Code) vs. tibi-docs (Doku)
Stand: 2026-10-16 · Code-Commit lt. Doku `68b42785` (nicht per git verifiziert — kein git-Check in diesem Lauf).
Methode: `internal/`-Inventar + `internal/controller/setup.go` als Routen-Quelle, Hook-`RegisterPackageFunctions`-Blöcke,
MCP-`tools_*.go`, `internal/config/server.go` + `embedding_group.go`; Doku: `src/content/docs/{server,projekt,reference}/*.md`.
Jeder Code-Beleg mit `datei:zeile`. „nicht verifiziert" = im Code nicht prüfbar gefunden.
---
## 1) Feature-Matrix
Legende: **ok** = abgedeckt · **thin** = erwähnt, aber unvollständig/oberflächlich · **gap** = fehlt.
### 1.1 Module `internal/*`
| Modul | Code-Beleg | Dokuseite(n) | Verdikt | Was fehlt |
|---|---|---|---|---|
| `cache` (projektweiter Hook-Cache, LRU, Default `MaxEntries 10000`, `DefaultTTL 0`) | `internal/cache/cache.go:23-33` | `reference/hooks-daten.md` (cache.*), `server/konfiguration.md` (`hook.cache.*`) | thin | Defaults (10000/0) und LRU/Eviction nirgends genannt |
| `config` (Datei + Env, `Server`-Struct) | `internal/config/server.go:229-242` | `server/konfiguration.md` | thin | siehe Config-Tabelle 1.5 |
| `dbapi` (CRUD-Handler, Login, Meta) | `internal/dbapi/register.go:62-135` | (keine eigene Seite) | gap | System-CRUD-Routen (`user/project/org/team/token`), `_meta`-Routen nirgends als Referenz (nur Neben­erwähnung in `projekt/mcp-nutzen.md:408`) |
| `dbcrud` (Index-Typen inkl. TTL) | `internal/dbcrud/index.go:5-37` | — | gap | nur indirekt (Audit-TTL). Kein Dokuseiten-Eintrag nötig, aber `expireAfterSeconds`-Semantik fehlt bei der „`"0"` = ewig"-Behauptung (s. 3.5) |
| `embedding` (Registry, Gruppen, Provider-Typen) | `internal/embedding/registry.go` (Existenz), `internal/config/embedding_group.go:150+` | `server/konfiguration.md:98-107`, `projekt/suche.md:37-42`, `server/betrieb.md:57` | thin | Policies (`prefer-in-order/fastest-wins/round-robin/lowest-latency/weighted`, `embedding_group.go:44-60`), Distributions, Health-/Race-/Retry-/Bulk-Tuning (`embedding_group.go:102-190`+ Env `server.go:489-625`) fehlen komplett |
| `filecleanup` ( orphan-Dateien, `SafeRemoveAll`) | `internal/filecleanup/cleanup.go:21-149` | — | gap | keine Dokuseite; nur Starter-Upload-Seite (`projekt/dateien-bilder.md`) |
| `hook` (23 Pakete + `request`-Fn + Legacy-Aliase) | `internal/hook/context_*.go`, `internal/hook/compatibility.go:8-35` | `reference/hook-kontexte.md`, `reference/hooks-{daten,netze,sicherheit,medien,meta}.md` | ok | ein Fehler: `crypto` „(plus weitere)" (s. 3.9); Legacy-Aliase (`mail`, `template`, `file`, `fetch`, `dump`, `header`, `auth`, …) bewusst undokumentiert — ok |
| `image` (FilterParams: width/height/fit/quality/…) | `internal/hook/context_image.go:75-235` | `reference/hooks-medien.md:28-46`, `projekt/dateien-bilder.md:80` | ok | — |
| `llm` (nur Chat + Budgets; **kein** Summarizer/STT/TTS) | `internal/llm/{provider,registry,quota,openai,models}.go`, `internal/controller/llm_chat.go` | `projekt/llm-nutzen.md` | ok | — (Doku erfindet nichts; Preise explizit als „steht nirgends" markiert) |
| `mcp` (36 Tools, Guards, Dispatch) | `internal/mcp/tools_{crud,discovery,system}.go`, `internal/mcp/guards.go:22-51`, `internal/controller/mcp_handler.go:43-71` | `projekt/mcp-nutzen.md`, `server/schnittstellen.md:72-88` | ok | Zählung stimmt (10+12+14=36, s. 1.3) |
| `mock`, `testsuite`, `mgocrud.old` | Verzeichnisse vorhanden | — | ok | intern/Test-Helfer bzw. Altlast — keine Doku nötig; `mgocrud.old` ist toter Code |
| `models` (Project/Collection/Hook/Job/Action/Token/Org/Team/Audit/…) | diverse, s. unten | verteilt | thin | Feld-Level-Permissions (s. 2.3), Scope-Katalog (s. 2.4), Snapshot-Detailfelder (s. 2.5) |
| `mongocrud` | Verzeichnis vorhanden | — | ok | Treiber-Detail, keine Doku nötig |
| `rankfusion` (RRF + `score_rrf/score_sum/rank_score/hybrid`, `minmax/zscore`) | `internal/rankfusion/*.go`, `internal/controller/collection_combined_search.go:142-230` | `projekt/suche.md:65-75` | thin | Formel ok; Strategien/Normierung/`scoreWeight`/`sourceConfig` nur als „existiert" erwähnt, nicht erklärt |
| `ratelimit` (Login-Backoff + Hook-Windows) | `internal/ratelimit/*`, `internal/controller/ratelimit_middleware.go:18-57`, `internal/hook/context_ratelimit.go` | `server/sicherheit.md:46-57`, `reference/hooks-netze.md:101-190` | ok | — |
| `realtime` (In-Memory-Hub, `Subscribe/Send`, Ringpuffer) | `internal/realtime/hub.go:94-179`, `internal/models/api.go:51-523` (Hub je Projekt-API) | `server/schnittstellen.md:64-70` | thin | Kapazität „Standard 256", `LastN/MaxAge/TTL`, Drop-Policy („Alt oder Neu") im Code nicht am Hub verifiziert — nur via Hook-Kontext (`context_channel.go`) plausibel; kein Abo-Endpunkt — korrekt dokumentiert |
| `suexec` (`RunInFilesUID`, kein Schalter) | `internal/suexec/thread.go:1-50`, Nutzung `internal/models/api.go:88-490`, `internal/filecleanup/cleanup.go:53` | `server/sicherheit.md:59-67`, `projekt/jobs-actions.md:49` | ok | — |
| `utils` (`ParseSize`, `ErrorObject` …) | diverse | — | ok | intern, keine Doku nötig |
| `vectorindex` (In-Memory-Vektorindex) | `internal/vectorindex/index.go` | `projekt/suche.md` (nur als „Vektor") | thin | kein eigener Doku-Eintrag (akzeptabel, da über `search`-Blöcke bedient) |
| `version` (`GET /version`) | `internal/controller/setup.go:703-707`, `internal/version/*` | `server/schnittstellen.md:26`, `server/betrieb.md:35` | ok | — |
### 1.2 HTTP-Routen (Quelle: `internal/controller/setup.go`)
Gesamt unter `/api/v1`: **48** (`27 GET + 14 POST + 2 PUT + 4 DELETE + 1 OPTIONS`) + `/metrics` (Root) = **49**.
Dazu dbapi-Systemrouten: 5 Modelle (`user, project, org, team, token` je GET-Liste/GET-:id/POST/PUT-:id/DELETE-:id = 25, `register.go:90-94`),
`_meta` + `_meta/<collection>` (`register.go:100-114`), Login ×2 (in den 14 POST enthalten).
| Methode + Pfad | Handler (setup.go) | Dokuseite(n) | Verdikt |
|---|---|---|---|
| `GET /metrics` (Root, kein `/api/v1`) | `setup.go:159` | `server/betrieb.md:32-42` | ok |
| `GET /version` | `setup.go:703` | `server/schnittstellen.md:26`, `server/betrieb.md:35` | ok |
| `POST /login`, `POST /login/impersonate` | `setup.go:728-740` (+ `models/impersonate.go:29-101`) | `server/schnittstellen.md:28`, `reference/token-koepfe.md:45` | thin | Logout-Flow (`?logout=1`), Impersonation-Chains (`impersonate.go:86-101`), Org-Scope-Regel (`impersonate.go:214-233`) fehlen |
| `GET /token/_scopes` | `setup.go:303-311` | `server/schnittstellen.md:28` | thin | Katalog-Inhalt (`token_scope_catalog.go:47-90`: System- vs. Namespace-Scopes, UND-Regel) nicht erklärt |
| `POST /llm/chat`, `GET /llm/providers` | `setup.go:321-340` | `projekt/llm-nutzen.md:12-57` | ok |
| `GET /audit` | `setup.go:743-751` | `server/schnittstellen.md:31`, `projekt/audit-backup.md:18-46` | ok |
| `GET+POST /mcp` | `setup.go:754-755`, `mcp_handler.go:43-71` | `server/schnittstellen.md:72-88`, `projekt/mcp-nutzen.md` | ok |
| `GET /admin/embedding/status`, `POST /admin/shutdown` | `setup.go:769-798` | `server/schnittstellen.md:31` | ok |
| `GET /_/:project/:collection`, `POST /_/:project/:collection` (+ `X-HTTP-Method-Override: GET`) | `setup.go:506-636` | `projekt/abfragen-lesen.md`, `server/schnittstellen.md:38-46` | ok |
| `GET /_/:project/:collection/_count`, `/_facet`, `/_queue` | `setup.go:514-535` | `projekt/abfragen-lesen.md:95-110` | ok |
| `GET+PUT+DELETE /_/:project/:collection/:id` | `setup.go:536-665` | dto. | ok |
| `GET /_/:project/:collection/:id/:field`, `…/:field/*path` | `setup.go:545-568` | `server/schnittstellen.md:42`, `projekt/dateien-bilder.md` | thin | Feld-Route ok; Datei-Route nur via MCP-`file_read`-Hinweis |
| `PUT+DELETE /_/:project/:collection` (Bulk) | `setup.go:645-673` | `server/schnittstellen.md:41` | thin | Bulk-Semantik (`Allow`+`Bulk`-Flag, `permission.go:145-182`) nicht erklärt; `collection_bulk_post.go` existiert, hat aber **keine** eigene Route (Aufrufweg nicht verifiziert) |
| `GET+POST /_/:project/_actions/:action` | `setup.go:676-690` | `projekt/jobs-actions.md:54-119` | ok |
| `GET /_openapi/:project` | `setup.go:692-701` | `server/schnittstellen.md:90-92` | thin | `reference/openapi.md` ist Platzhalter mit falscher Quelle (s. 3.3) |
| `GET /_/:project/_/assets/:name/*path` | `setup.go:497-504` | `server/schnittstellen.md:44`, `projekt/mcp-nutzen.md:81` | ok |
| `POST …/_/admin/reload` | `setup.go:372-376` | `server/betrieb.md:54`, `projekt/deploy.md:84-93` | ok |
| `POST …/_/admin/regenerate-search`, `GET …/search-worker/status`, `GET …/embedding/status` | `setup.go:378-394` | `server/betrieb.md:54-57`, `projekt/suche.md:87-90` | ok |
| Backup: `GET analyze-download`, `GET` Download, `GET download/:file`, `POST` Analyse, `POST :restoreToken`, `DELETE :restoreToken` | `setup.go:398-433`, `admin_backup*.go` | `projekt/audit-backup.md:110-133`, `server/betrieb.md:66` | thin | Restore-Token-Flow (Analyse → Token → Restore/Cleanup) nur angerissen; `checkProjectAdminAuth`-Reihenfolge (Server-Token → Projekt-Token → JWT-Admin, `admin_auth.go:20-74`) fehlt |
| Snapshots: `GET configs`, `POST configs/:name/trigger`, `GET` Liste, `GET download/:file`, `GET :id`, `DELETE :id`, `POST :id/restore`, `GET :id/download`, `GET stats`, `POST prune` (10 Routen) | `setup.go:436-495` | `projekt/audit-backup.md:60-108` (`…/snapshots…`-Sammelzeile in schnittstellen.md:57) | thin | Einzelne Routen (stats/prune/trigger/download) nicht benannt; `collections: []` = alle ok (`snapshot_config.go:144`); `mode: include/exclude`, `collectionDedup`, `permissions`-Feld (`snapshot_config.go:34-53`), `retention.maxAge/maxSizeBytes` (`snapshot_config.go:89-93`) fehlen |
| `OPTIONS /*path` (404 ohne echte Route) | `setup.go:226-230` | `server/sicherheit.md:44`, `server/schnittstellen.md` (implizit) | ok |
| System-CRUD `user/project/org/team/token` (je 5 Routen) | `dbapi/register.go:90-94` via `RegisterModel` (`setup.go:274-312`) | `reference/token-koepfe.md:31-42` (Projekt-Anlage), MCP-`user_*`-Zeilen | gap | keine REST-Referenz für User-/Org-/Team-/Token-CRUD; `token`-Collection-Felder (`scopes`, `expiresAt`, `token.go:39-76`) undokumentiert |
| `GET /_meta`, `GET /_meta/<collection>` | `dbapi/register.go:100-114` | nur Neben­erwähnung `projekt/mcp-nutzen.md:408` | gap |
**Routen-Bilanz (gruppiert): ca. 44/49 dokumentiert, 2 gaps (System-CRUD, `_meta`), Rest thin bei Detail­feldern.**
### 1.3 Hook-Kontexte (alle `context_*.go`)
Pakete (23 + `request`-Funktion): `base64, bcrypt, cache, channel, charset, config, cookie, crypto, db, debug, exec, fs, http, image, json, jwt, pdf, ratelimit, request(fn: `context_request.go:12`), response, smtp, tpl, user, xml` — **alle 23 in `reference/hook-kontexte.md:36-61` + Detail­kapiteln vorhanden.**
Funktionen je Paket — Abgleich `RegisterPackageFunctions`-Blöcke gegen Referenz:
| Paket | Code-Funktionen | Referenz | Fehlend |
|---|---|---|---|
| db (7) | find/count/create/update/delete/deleteMany/updateMany (`context_db.go:16`) | hooks-daten.md:8-112 | — |
| cache (6) | set/get/has/delete/clear/count (`context_cache.go:11`) | hooks-daten.md:114-194 | — |
| request (1) | `request()` (`context_request.go:12`) | hooks-daten.md:196-217 | — |
| response (5) | header/writeHeader/write/flush/writeSSE (`context_response.go:13`) | hooks-daten.md:219-297 | — |
| fs (8) | configDir/readFile/writeFile/stat/readDir/mkDir/remove/copy (`context_fs.go:17`) | hooks-daten.md:299-409 | — |
| http (2) | fetch/fetchStream (`context_http.go`) | hooks-netze.md:8-44 | — |
| smtp (1) | sendMail (`context_smtp.go:18`) | hooks-netze.md:46-68 | — |
| channel (2) | subscribe/send (`context_channel.go:13`) | hooks-netze.md:69-100 | — |
| ratelimit (6) | backoffCheck/backoffRecord/backoffReset/windowCheck/windowReset/windowCount (`context_ratelimit.go`) | hooks-netze.md:101-190 | — |
| jwt (2) | create/parse | hooks-sicherheit.md:8-37 | — |
| user (1) | auth → nur `{id, username, role, permissions}` (`context_user.go:26-31`) | hooks-sicherheit.md:39-55 | thin (Rückgabe­felder; keine Orgs/Teams) |
| bcrypt (2) | hash/check | hooks-sicherheit.md:56-86 | — |
| crypto (2) | **nur** sha256/md5 (`context_crypto.go:13-16`) | hooks-sicherheit.md:87-116 („plus weitere") | **1 Fehler** (s. 3.9) |
| cookie (2) | get/set | hooks-sicherheit.md:117-146 | — |
| exec (1) | command | hooks-sicherheit.md:147-163 | — |
| config (3) | namespace/project/server | hooks-sicherheit.md:164-209 | — |
| tpl (1) | execute | hooks-medien.md:8-27 | — |
| image (1) | filter | hooks-medien.md:28-46 | — |
| pdf (2) | fromHTML/cpu | hooks-medien.md:47-84 | — |
| base64 (2) | encode/decode | hooks-meta.md:8-37 | — |
| json (2) | parse/stringify | hooks-meta.md:38-67 | — |
| xml (2) | create/parse | hooks-meta.md:68-97 | — |
| charset (2) | decode/iso8859ToUtf8 | hooks-meta.md:98-127 | — |
| debug (3) | dump/sentryTraceId/sleep | hooks-meta.md:128-173 | — |
| Legacy-Aliase (26, `compatibility.go:8-35`) | readCollection, mail, template, file, fetch, dump, header, auth, … | — (bewusst) | ok |
**Hook-Bilanz: alle 23 Pakete + alle 70 Funktionen dokumentiert; 1 Fehler (`crypto`), 1 thin (`user.auth`-Felder).**
### 1.4 MCP-Tools (36 = 10 + 12 + 14)
- crud (`tools_crud.go:8-104`): documents_list, document_get, documents_count, documents_facet, queue_status, document_create, document_update, document_delete, file_read, action_call — alle 10 in `projekt/mcp-nutzen.md:63-72` ✓
- discovery (`tools_discovery.go:8-103`): projects_list, project_get, collections_list, collection_describe, actions_list, action_describe, jobs_list, openapi_get, system_meta_get, agent_guide_get, assets_list, asset_read — alle 12 in `mcp-nutzen.md:73-81` ✓
- system (`tools_system.go:8-34`): users_list, user_get, user_create, user_update, user_delete, orgs_list, org_get, teams_list, team_get, audit_query, project_reload, regenerate_search, backup_create, snapshots_list — alle 14 in `mcp-nutzen.md:82-90` ✓ (REST-only-Badges entsprechen den `REST-only`-Descriptions im Code)
- Guards korrekt dokumentiert: PAT-only (`guards.go:22-51`), Admin-Token-Reject (`mcp_handler.go:51-56`), disabled → 404 (`mcp_handler.go:45-49`), GET-Probe (`mcp_handler.go:63-71`), Fehler­codes -32601/-32602/-32003/-32004 (`mcp_handler.go:107-127`) ✓
### 1.5 Config (`config.yml` + Env, Quelle `internal/config/server.go`)
| Bereich | Code (yaml-Tag) | Doku | Verdikt |
|---|---|---|---|
| `db` (dial/prefix/logging) | `server.go:22-24` + Env `DB_DIAL(/MGO_DIAL)`, `DB_PREFIX`, `DB_LOGGING` (`server.go:276-286`) | konfiguration.md:28 | ok |
| `api` (port, jwtSecret, secureCookies, Lifetimes, upload, adminTokens) | `server.go:45-56` + Env `server.go:290-318` | konfiguration.md:29,79-83,109-124 | thin | `upload.allowedMimeTypes` (`server.go:46`) fehlt überall (gap); `secureCookies`-Default true korrekt (`server.go:61-64` ✓) |
| `mail` (host/username/password) | `server.go:97-99` + nur `MAIL_HOST` (`server.go:320`) | konfiguration.md:30 | thin | `MAIL_USERNAME/PASSWORD` existieren **nicht** — Doku nennt sie implizit als Schlüssel ohne Env; ok, aber unklar |
| `security` (allowAbsolutePaths/allowUpperPaths) | `server.go:103-104` + Env (`server.go:324-328`) | konfiguration.md:31, sicherheit.md:61-67 | ok |
| `response.error` (stack/message) | `server.go:125-130` + Env (`server.go:338-341`) | konfiguration.md:33 | ok |
| `audit` (enabled/defaultTTL/defaultLimit/maxLimit) | `server.go:171-174` + Env (`server.go:345-354`) | konfiguration.md:33, betrieb.md:44-46 | ok (TTL-Default 720h ✓ `setup.go:344`) |
| `ratelimit` (enabled/loginInitialDelay/loginMaxDelay/loginResetAfter) | `server.go:201-208` + Env (`server.go:627-639`) | konfiguration.md:34, sicherheit.md:46-57 | ok (Defaults 1s/60s/15m ✓ `server.go:203-207`; 429+Retry-After ✓) |
| `hook.cache/ratelimit` | `server.go:179-188` + Env `HOOK_*` (`server.go:642-665`) | konfiguration.md:35 | thin | Feld­namen ok; Defaults/SEMANTIK (LRU, Fenster) fehlen |
| `mcp` (enabled/route/maxResultItems/allowAdminActions) | `server.go:221-224` + Env (`server.go:668-686`) | konfiguration.md:36, schnittstellen.md:72-88 | ok | Route-Aussage korrekt: Routing hart in `setup.go:754-755`, `mcp.Route()` ungenutzt (s. 3.7) |
| `sentry` (dsn/environment/serverName/enableTracing/debug) | `server.go:108-112` (kein Env) | konfiguration.md:37, betrieb.md:36 | thin | nur `dsn` erwähnt; Rest fehlt |
| `cors` | `server.go:116-121` | konfiguration.md:38, sicherheit.md:34-44 | thin | Server-`cors` als „Basis"+feldweises Merge: globaler CORS-Block in `setup.go:141-149` ist **auskommentiert** — Merge-Logik (`CORSMap`, `api.go`-Umfeld) nicht verifiziert |
| `llm`/`embedding` Provider + Gruppen | `server.go:135-167` + Env-Muster (`server.go:359-625`) | konfiguration.md:39,85-107 | **1 Fehler**: `EMBEDDING_BGE-M3_*` (s. 3.1); Gruppen-Details fehlen (s. 1.1 embedding) |
| Go-Version-Hinweis | `go.mod` (`go 1.25.0`, Toolchain `go1.25.7` — nicht verifiziert, go.mod nicht gelesen) | konfiguration.md:41-43 | nicht verifiziert |
| Datei-Fehlstart/Panic-Regeln | `server.go:260-296` (Default 8080/tibi/Stack-an; Port `<= 0` → Panic) | konfiguration.md:19-20 | ok |
---
## 2) Nicht dokumentierte Fähigkeiten (keine Dokustelle in tibi-docs)
1. **System-CRUD per REST** (`user/project/org/team/token`, je 5 Routen, `dbapi/register.go:90-94`): nur JWT-Projekt­anlage in `reference/token-koepfe.md:31-42` angerissen; Org-/Team-/Token-CRUD, `token`-Felder (`scopes`, `expiresAt`, `token.go:39-76`) fehlen.
2. **`_meta`-Routen** (`dbapi/register.go:100-114`): nur Neben­erwähnung (`projekt/mcp-nutzen.md:408`).
3. **Feld-Level-Permissions** (`models/field_permissions.go`; Status­codes `http_status.go:53-58`): **null Treffer** in tibi-docs. Server-Doc `docs/17-field-level-permissions.md` existiert, wurde nicht übernommen.
4. **Scope-Katalog** (`models/token_scope_catalog.go:47-90`: `systemScopesFor`, UND-Regel Token×Besitzer): nur Beispiel in `server/sicherheit.md:23-28`; Katalog­logik fehlt.
5. **`upload.allowedMimeTypes`** (`config/server.go:46`): null Treffer.
6. **Snapshot-Detailfelder**: `mode: include/exclude`, `collectionDedup` (`snapshot_config.go:34-42`), `permissions` (`snapshot_config.go:53`, „Phase 2"), `retention.maxAge/maxSizeBytes` (`snapshot_config.go:89-93`), Einzel­routen (stats/prune/trigger/:id/download).
7. **Embedding-Gruppen-Tuning**: Policies/Distributions/Health/Race/Retry/Bulk (`config/embedding_group.go`, Env `server.go:489-625`); nur MEMBERS/POLICY/TIMEOUT_TOTAL erwähnt.
8. **Such­modi jenseits Starter**: `text/regex/eval/filter` (`models/collection.go:314`), `sourceConfig/scoreWeight`/Strategien im Detail, `autoRegenerate`, Search-Worker, Vector-Loader; `aggregate` fehlt in `projekt/abfragen-lesen.md` (nur MCP/SSR/Fehler­codes nennen es); Such-Debug (`controller/search_debug.go`, `search_enrichment.go`) fehlt.
9. **Ephemeral REST Tokens**: `docs/24-ephemeral-rest-tokens.md` beschreibt sie — **im Code kein Treffer** (`phemeral` nur in `docs/24*`, `tmp/diff.patch`). Entweder unverified/unge­landet oder entfernt: Doku beschreibt nicht-existente Fähigkeit.
10. **SSR als Server-Fähigkeit**: kein `ssr`-Code in `internal/` (nur Starter-Hooks + `program_async_test.go:1024` erwähnen `ssrRequestKirby`). Korrekt als Starter-Doku abgelegt, aber `server/schnittstellen.md:68` („kein fertiger Abo-Endpunkt … nur über Hooks") ist die einzige Server-Aussage — ein expliziter Satz „SSR-Bundle/Cache sind Starter-Konvention, kein Server-Feature" fehlt.
11. **Gzip-Ausnahmen** (`setup.go:151-154`: kein Gzip für `.pdf/.mp4/.jpg/.jpeg/.png` + `/metrics`): undokumentiert.
12. **NaN-Sanitizing / `_search`-Stripping** (`setup.go:814-825`): undokumentiert (intern, niedrige Priorität).
13. **Backup-Restore-Token-Lebenszyklus** (Analyse → `:restoreToken` → Restore/Cleanup, `admin_backup*.go`) und Snapshot-RAM-Begrenzung: nur angerissen.
14. **Sentry-Felder** außer `dsn`, **Hook-Cache-Defaults**, **Filecleanup**, **`bulkCreate`-Aufrufweg** (`controller/collection_bulk_post.go` ohne eigene Route — Aufruf­weg nicht verifiziert).
15. **`mgocrud.old/`**: toter Code im Repo, keine Doku nötig — aber Aufräum­kandidat.
## 3) Falsche Doku-Aussagen (12 geprüfte Behauptungen; falsche zuerst)
| # | Doku-Zitat (Datei:Zeile) | Code (Datei:Zeile) | Urteil |
|---|---|---|---|
| 1 | `EMBEDDING_BGE-M3_*` — „Bindestrich → Unterstrich + Großschrift: `bge-m3` → `EMBEDDING_BGE-M3_*`" (`server/konfiguration.md:21`, Beispiel `:98-105`) | `normalizeEnvKeyName`: `-` → `_`, dann UPPER (`config/server.go:246-250`): `bge-m3` → `BGE_M3`, also `EMBEDDING_BGE_M3_*` | **FALSCH** (Bindestrich bleibt im Doku-Beispiel stehen) |
| 2 | „braucht dein Token `AllowSnapshot: true`" (`projekt/audit-backup.md:107`; Tabelle `:127-128`) | Projekt-Admin-Token heißt `allowSnapshots` (plural, klein): `models/project.go:104`, Prüfung `t.AllowSnapshots` (`controller/admin_snapshot_list.go:23-40`) | **FALSCH** (Singular statt Plural; korrekt: `allowSnapshots`) |
| 3 | `reference/openapi.md` komplett: Quelle `TIBI_API_URL/openapi.json`, „Erzeugen mit `npm run sync:openapi`" | Route ist `GET /api/v1/_openapi/:project` (`controller/setup.go:692-701`, `openapi_project_get.go:12`); kein `openapi.json`, kein `sync:openapi` im Server-Code gefunden | **FALSCH** (Platzhalter, passt nicht zum Server-Generator; `server/schnittstellen.md:90-92` ist dagegen korrekt) |
| 4 | `crypto.sha256`, `crypto.md5` „(plus weitere)" (`reference/hook-kontexte.md:52`) | Nur 2 Funktionen registriert (`hook/context_crypto.go:13-16`) | **FALSCH** („weitere" existieren nicht) |
| 5 | `audit.defaultTTL: 720h` „(30 Tage, `"0"` = ewig)" (`projekt/audit-backup.md:29`) | Default 720h ✓ (`controller/setup.go:344`); **kein** `"0"`-Sonderfall gefunden (`models/auditlog.go:498-508`, `dbcrud/index.go:12-14` geben `ttl` direkt an den Index) | **UNKLAR, eher falsch** — „ewig" nicht belegt; `expireAfterSeconds: 0` liefe auf sofortigen Verfall hinaus. Nicht verifiziert, ob `mongocrud` 0 abfängt |
| 6 | `POST /api/ssr?clear=1` / `POST /api/_/admin/reload` (ohne `/v1`, ohne Namespace) (`projekt/deploy.md:90-91`) | Server-Routen sind `/api/v1/_/:project/_/admin/reload` (`setup.go:372`) und haben **keine** `ssr`-Route (kein `ssr`-Code in `internal/`) | **UNKLAR** — nur als Starter-Proxy-Pfade sinnvoll; als Server-Aussage falsch. Doku markiert sie als Proxy („Live/Staging-URL"), aber der Kontrast zur Server-Tabelle fehlt |
| 7 | „ein gesetztes `mcp.route`/`MCP_ROUTE` wird ignoriert (Routing hart in `setup.go`)" (`server/schnittstellen.md:77`, `projekt/mcp-nutzen.md:10`) | Routing fix `apiGroup.GET/POST("/mcp")` (`setup.go:754-755`); `mcp.Route()`-Helper existiert (`mcp/server.go:27-32`), wird aber im Routing nirgends verwendet (nur `MaxResultItems()` in `mcp_tools_impl.go:701-707` genutzt) | **KORREKT** |
| 8 | „`Content-Range:` **mit Doppelpunkt** — Tippfehler im Code" (`projekt/abfragen-lesen.md:34`) | `c.Header("Content-Range:", …)` (`controller/collection_get.go:32`) | **KORREKT** |
| 9 | „429 plus `Retry-After`-Header (Sekunden) … nur für Login" (`server/sicherheit.md:52-57`) | `Retry-After` + 429 (`controller/ratelimit_middleware.go:56-57`); Login-Geltung via `loginMiddleware` nur an `/login` (`setup.go:712-732`) | **KORREKT** |
| 10 | „`model` ist optional … Allowlist leer = keine Prüfung" + 403-vor-400-Reihenfolge (`projekt/llm-nutzen.md:31-57,71-86`) | Auth+Scope vor Validierung (`controller/llm_chat.go:28-57`); Allowlist-Gate, Default-Redirect, Secrets-Ausschluss (`llm_chat.go`, `setup.go:322-340`) | **KORREKT** |
| 11 | Legacy-Default: Konflikt 500/409, Validierung 400/422, Schalter `legacy.httpCodes` (`reference/fehlercodes.md:20-21,43-45`) | `http_status.go:13-58` (201/200, 204/200, 401/403, 422/400, 409/500, 403/400); Default `true` (`models/project.go:80-87`); Key `httpCodes` (`project.go:77`) | **KORREKT** |
| 12 | „CORS-Kaskade `/_actions/<name>` → `/<collection>` → `/` → `""`" + „Projekt mergt feldweise (`merge: true/false`)" (`server/sicherheit.md:36-44`) | Kaskaden-Reihenfolge exakt so (`setup.go:193-223`); `CORSConfig.Merge` existiert (`models/project.go:107-114`); globaler Server-CORS ist auskommentiert (`setup.go:141-149`) | **KORREKT** (Merge-Semantik im Detail nicht verifiziert) |
Weitere verifizierte Korrekt-Aussagen (Stichprobe): Port-Panic `<= 0` ✓ (`server.go:295-296`), Not-Defaults 8080/tibi/Stack ✓ (`server.go:265-268`), `secureCookies`-Default true ✓ (`server.go:61-64`), Lifetimes 60m/10h ✓ (`server.go:69-90`), Audit-TTL-Default 720h ✓, MCP-404-bei-disabled ✓ (`mcp_handler.go:45-49`), `X-Auth-Token`-PAT-Prefix `tibi_pat_` ✓ (`mcp/guards.go:51`), Bulk-`Allow`+`Bulk` ✓ (`models/permission.go:145-182`), `snapshotPath`-Default „snapshots" ✓ (`models/project.go:65-67`), `collections: []` = alle ✓ (`snapshot_config.go:144`), Admin-Auth-Reihenfolge ✓ (`admin_auth.go:20-74`), 100-MB-Body-Default ✓ (`middleware_bodysize.go:14-29`), Kaskade Server→Projekt→Collection mit Server-Cap ✓ (`middleware_bodysize.go:34-69`).
## 4) Veraltete Doku in `tibi-server/docs/*.md` (je Datei eine Zeile)
| Datei | Inhalt (Kurz) | Abdeckung in tibi-docs |
|---|---|---|
| 01-architecture.md | Architektur-Überblick | teilweise (keine Architektur-Seite; verstreut in `server/uebersicht.md`) |
| 02-configuration.md | Vollständige Config-Referenz | teilweise (`server/konfiguration.md`; Gruppen-Tuning/Env-Details fehlen) |
| 03-api-endpoints.md (2406 Zeilen) | Alle Endpunkte | teilweise (`server/schnittstellen.md` + Projekt­seiten; System-CRUD/`_meta` fehlen) |
| 04-collections.md | Collection-Schema/Operatoren | teilweise (`projekt/sammlungen-anlegen.md`, `abfragen-lesen.md`; aggregate/eval fehlen) |
| 05-authentication.md | Login/JWT/Impersonate | teilweise (Login/Impersonate nur Tabellen­zeilen; Logout-Flow fehlt) |
| 06-hooks.md (1717 Zeilen) | Hook-Lifecycle + Kontexte | vollständig (Lifecycle via tibi-types-Schema nicht verifiziert; Kontexte alle da) |
| 07-realtime.md | Realtime-Hub | teilweise (`server/schnittstellen.md:64-70` nur Überblick) |
| 08-file-upload-images.md | Upload/Bilder | teilweise (Starter-Sicht in `projekt/dateien-bilder.md`; `allowedMimeTypes`/Filecleanup fehlen) |
| 09-llm-integration.md | LLM/Budgets | vollständig (`projekt/llm-nutzen.md`, inkl. Verifizierungs­zeile) |
| 10-audit.md | Audit-Log | teilweise (zweistufig + TTL ok; `"0"`-Claim fraglich, s. 3.5) |
| 11-jobs.md | Jobs/Cron | vollständig (`projekt/jobs-actions.md`) |
| 12-deployment.md | Deployment/Profile | teilweise (`server/betrieb.md`, `projekt/deploy.md`; Compose-Profile Starter-seitig) |
| 13-openapi-metrics.md | OpenAPI + Metriken | teilweise (OpenAPI-Generator ok; Metrik-Labels/Referenz-`openapi.md` defekt, s. 3.3) |
| 14-security.md | Tokens/CORS/Ratelimit/Pfade | vollständig (`server/sicherheit.md` + `konfiguration.md`) |
| 15-troubleshooting.md | Fehlerbilder | teilweise (verteilt auf Fehler­tabellen; keine eigene Seite) |
| 16-cookbook.md | Rezepte | teilweise (Rezepte in Projekt­seiten verstreut) |
| 17-field-level-permissions.md | Feld-Rechte | **nicht abgedeckt** (null Treffer, s. 2.3) |
| 18-orgs-teams.md | Orgs/Teams | teilweise (nur Überblick in `projekt/rechte-tokens.md:125-142`) |
| 19-actions.md | Actions | vollständig (`projekt/jobs-actions.md:54-119`) |
| 20-referenced-read-safety.md | Lookup-Read-Safety | teilweise (`projekt/abfragen-lesen.md:89-93`, `rechte-tokens.md`) |
| 21-backup-restore.md | Backup/Restore | teilweise (Flows ok; Token-Lebens­zyklus fehlt) |
| 22-personal-access-tokens.md | PATs | teilweise (Köpfe/Scopes ok; `token`-CRUD-Felder fehlen) |
| 23-mcp.md | MCP | vollständig (`projekt/mcp-nutzen.md`, 36/36 Tools) |
| 24-ephemeral-rest-tokens.md | Ephemere REST-Tokens | **nicht abgedeckt — und im Code nicht existent** (s. 2.9); keine Übernahme, sondern Klärung nötig (implementieren oder Doku löschen) |
+128
View File
@@ -0,0 +1,128 @@
# Audit 02 — Entwickler- und Anwender-Schnittstellen von tibi-admin-nova
> Audit-Agent, keine Doku-Änderung. Stand: 2026-10-16.
> Repo: `/WM_Dev/src/gitbase.de/cms/tibi-admin-nova` (= `NOVA:` unten).
> Doku: `/WM_Dev/src/gitbase.de/cms/tibi-docs` (= `DOKU:` unten).
> Verwendete Schemata: `NOVA:tibi-types/schemas/config/*.json`, `NOVA:types/admin.d.ts`,
> `NOVA:schemas/config/*.schema.json`. Frontend: `NOVA:frontend/src/`.
## 1) Entwickler-Schnittstellen
Legende Verdikt: `ok` = dokumentiert und korrekt · `thin` = erwähnt, aber unvollständig/falsch verlinkt ·
`gap` = fehlt in tibi-docs **und** in `NOVA:docs/`.
| Schnittstelle | Code-Beleg | Beschreibung | Dokuseite | Verdikt |
|---|---|---|---|---|
| Collection-Schema (`name`, `permissions` Pflicht; `fields`, `indexes`, `hooks`, `projections`, `audit`, `bulk`, `cors`, `queryLimits`, `readonlyFields`, `hiddenFields`, `strictFields`, `search`) | `NOVA:tibi-types/schemas/config/collection.schema.json:1-40` (props; `required: [name, permissions]`) | Top-Level-Sammlungsdefinition | `DOKU:projekt/sammlungen-anlegen.md` (Minimal, Meta, Indizes/Suche); Referenz `DOKU:reference/schemas.md` | ok (thin für `queryLimits`, `bulk`, `cors`, `strictFields` — nur in `NOVA:docs/collection-config.md` belegt) |
| `meta.label/group/muiIcon/hide/imageUrl/designGuide` | `NOVA:tibi-types/schemas/config/collection-meta.schema.json` (props); `NOVA:types/admin.d.ts:734ff` | Anzeige-/Gruppierungs-Meta | `DOKU:projekt/sammlungen-anlegen.md:79ff` (Tabelle Meta) | ok |
| `meta.preview` (label/secondary/tertiary/image, table-Spalten, Slots, Eval, FK-Auflösung) | `NOVA:tibi-types/schemas/config/defs.schema.json` (`previewConfig`, `previewSlots`); `NOVA:frontend/src/lib/components/entry/PreviewElement.svelte:1ff`; `NOVA:frontend/src/lib/components/ui/FieldValuePreview.svelte:1ff` | Vorschau-Auflösung inkl. FK-Badges, `_lookup`, Dot-Pfade | `DOKU:admin/customizing.md:35ff` (Tabelle, Verweis `preview-resolver`); `DOKU:projekt/sammlungen-anlegen.md:79ff` | thin (Resolver-Regeln — Auto-Detection vs. strikt, Nested-Pfade `profile.name`, FK-Badge-Auflösung — nur `NOVA:docs/test-plans/39-preview-resolver.md:1ff`) |
| `meta.viewHint` (`table`/`cards`/`{media}`/`{navigation}`) | `NOVA:types/admin.d.ts:460-470`; `NOVA:frontend/src/lib/components/CollectionView.svelte:575-607` (Default-Anwendung, URL gewinnt) | Startansicht der Liste | `DOKU:admin/ansichten-listen.md:10ff`; `DOKU:projekt/sammlungen-anlegen.md:79ff` | ok |
| `meta.views` (custom views, `AdminCollectionView`) | `NOVA:types/admin.d.ts:452-458` („custom views not yet supported“); Schema `collection-meta.schema.json` enthält **kein** `views` (`additionalProperties: false`) | Eigene Listenansichten — **nicht implementiert / schema-invalid** | `DOKU:admin/customizing.md:14` behauptet fälschlich „`meta.views` (Tabelle, Karten, Kalender …)“ | gap (**Doku-Fehler**: Behauptung ohne Code-Deckung) |
| `meta.subNavigation` (filter, defaultSort, setDefault) | `NOVA:tibi-types/schemas/config/collection-meta.schema.json` (`subNavigation`); `NOVA:types/admin.d.ts:364ff` | Reiter-Filter über der Liste | `DOKU:admin/ansichten-listen.md:29ff` | ok |
| `meta.defaultSort` (field, order inkl. `MANUALLY`) | Schema `collection-meta.schema.json` (`defaultSort`); `NOVA:types/admin.d.ts:426ff` | Standard-Sortierung, inkl. manuell per Drag | `DOKU:admin/ansichten-listen.md` (Sortierung); Drag in `DOKU:admin/customizing.md:10ff` | thin (`MANUALLY`/Drag-Freigabe nicht als Config dokumentiert) |
| `meta.singleton` (enabled, key) | Schema `collection-meta.schema.json` (`singleton`) | Ein-Eintrag-Sammlung | — (grep `singleton` in `DOKU:src/content/docs` ohne Treffer) | gap |
| `meta.sections` / `meta.sidebar` (Formular-Gruppen) | Schema (`sections`, `sidebar`); Feld-Seite `meta.position: main\|sidebar:<gruppe>` | Formular-Layout | `DOKU:projekt/sammlungen-anlegen.md:79ff` (`sidebar`-Zeile, `position`-Beispiel); `sections` ohne Treffer | thin (`sections`-Array und `collapsible/collapsed` fehlen) |
| `meta.i18n` + `i18n.entry` (languages, languageField/groupField/clearFields/copyFields) | Schema (`i18n`); `NOVA:frontend/src/lib/stores/form-i18n-support.svelte.ts:1ff`; `I18nLanguageTabs`, `TranslationBar` | Übersetzungs-Kopplung | `DOKU:admin/eintrags-editor.md:58ff`; `DOKU:projekt/sammlungen-anlegen.md:79ff` | thin (`clearFields`/`copyFields`-Semantik nur Code) |
| `meta.pagebuilder` (defaultViewport, blockTypeField, blockRegistry.file, screenshot) | Schema (`pagebuilder`); `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/load-registry.ts:14-38`; `NOVA:types/admin.d.ts:618-669` | Pagebuilder-Anbindung pro Sammlung/Feld | `DOKU:projekt/pagebuilder-dev.md:17ff` (Registry-Vertrag) | ok |
| `cssTransform`-Präzedenz (Block > Feld > Collection, Default `true`) | `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/load-registry.ts:41-60` | CSS-Umschreibung steuern | `DOKU:projekt/pagebuilder-dev.md:59ff` | ok |
| Block-Vertrag (`render/update/destroy`, `BlockRenderContext`, `css`, `previewStyles`, `label/icon/color`) | `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/BlockMount.ts:20-60` | Eigener Block (framework-agnostisch, Shadow-DOM) | `DOKU:projekt/pagebuilder-dev.md:154ff` | ok |
| Asset-Specifier (`_/` projekt-relativ, `/_/`-Alias, `/`-absolut, `https/data/blob` untouched, `{eval}`) | `NOVA:frontend/src/lib/utils/project-asset-specifier.ts:17-50`; genutzt von `load-registry.ts:30-38` und Custom-Exports | Pfadauflösung für Registry- + Export-Skripte | `DOKU:admin/exporte.md:35ff`; `DOKU:projekt/pagebuilder-dev.md:17ff` | thin (zentrale Regel nur im Code; `{eval}`-Variante nicht dokumentiert) |
| `meta.exports` (name+file Pflicht, filename-`{date}`) | Schema (`exports`); `NOVA:types/admin.d.ts:720ff` (file-Specifier, filename) | Skript-Exporte anmelden | `DOKU:admin/exporte.md:35ff` | ok |
| Export-Skript-API (`db.find/count/loadAll`, `xlsx`, `helpers`, `progress`, `signal`, `view`, kein `$auth`, genau 1 Payload + `contentType`) | `NOVA:frontend/src/lib/utils/custom-export.types.ts:17-100`; `NOVA:docs/custom-export-script.md:12-60`; `NOVA:frontend/src/lib/components/ui/ExportDialog.svelte` | Eigene Berichte schreiben | `DOKU:admin/exporte.md:48-72` (verkürzt; verweist für Details auf Repo-Doku) + `DOKU:admin/customizing.md:51ff` | thin (vollständiges `ctx`: `db.loadAll`-Batching 500er, `selector`-vs-`select`, nur `sort[0]`, `csvCell`-Injection-Guard, Dateinamen-Sanitizing nur in `NOVA:docs/custom-export-script.md`) — Hinweis: Beispiel `DOKU:admin/exporte.md:60` ruft `loadAll({filter})` ohne Collection auf (abweichend vom Typ `loadAll(collection, opts)`) |
| `meta.query` (typisierte Zusatz-Querykeys für Hooks, MCP-validiert) | Schema (`query`, description „hooks may read ctx.request().query“) | Projekt-eigene Query-Parameter deklarieren | nur Erwähnung in `DOKU:projekt/mcp-nutzen.md` | gap (für Projektentwickler) |
| `meta.agent` (purpose/instructions/fieldHints/workflows) | Schema (`agent`); ausgespielt via MCP/REST `_meta` | Editor-/Agenten-Doku pro Sammlung | nur Erwähnung in `DOKU:projekt/mcp-nutzen.md`, `DOKU:projekt/pagebuilder-dev.md` | gap (für Projektentwickler) |
| `meta.openapi` / `collection.openapi` | Schema (`openapi` → `openapi.schema.json`) | OpenAPI-Overrides | `DOKU:reference/openapi.md`, `DOKU:server/schnittstellen.md` | ok (Server-Seite; Admin-Nutzung nicht verifiziert) |
| `permissions` (public/user + Token-Rollen, methods, filter, validProjections, readonly-/hiddenFields) | `NOVA:tibi-types/schemas/config/permissions.schema.json:1-60` | Zugriffsrechte | `DOKU:projekt/rechte-tokens.md`; `DOKU:admin/benutzer-rechte.md:47ff` | ok |
| `project.admin.tokens` (`allowReload`, `allowRegenerateSearch`, `allowBackup`, `allowSnapshots`) | `NOVA:tibi-types/schemas/config/project.schema.json` (`admin`) | Token-Fähigkeiten für Backup/Snapshots/Search-Rebuild | — (grep `allowSnapshots`/`allowBackup` in Doku ohne Treffer) | gap |
| `hooks` (get/post/put/delete/audit, `{type:javascript,file,timeout}`) | `NOVA:tibi-types/schemas/config/hooks.schema.json:1-60`; Action-`hooks` ein String oder Hooks-Objekt (`action.schema.json`) | Server-Hooks | `DOKU:projekt/hooks-schreiben.md` | ok (Server-Seite) |
| `hooksTrigger` / `exportScript` (Task-Begriffe) | — (grep im gesamten `NOVA:`-Repo ohne Treffer) | nicht verifiziert — Begriffe existieren im Code nicht | — | nicht verifiziert |
| Feld-Schema (Typen, `index`, `subFields`, `validator`, `readonly/hidden` als bool-or-eval, `strictFields`) | `NOVA:tibi-types/schemas/config/field.schema.json:1-120`; `NOVA:tibi-types/schemas/config/field-meta.schema.json` (label/widget/i18n/helperText/dependsOn/choices/foreign/downscale/imageEditor/drillDown/pageSize/preview/addElementLabel/filter/pagebuilder/schemaRef/openapi) | Felddefinition + Admin-Meta | `DOKU:projekt/felder-widgets.md`; `DOKU:projekt/sammlungen-anlegen.md`; Widget-Tabelle `DOKU:admin/customizing.md:19ff` | ok (thin für `schemaRef`, `drillDown`, `pageSize`, `containerProps`, `protected`) |
| Actions (`query`/`data`-Felder, `execution.kind/cancellable`, `output.mapping.summary/details`, `output.mapping.progress` mit index-/count-/status-/messageField + fields) | `NOVA:tibi-types/schemas/config/action.schema.json` (`actionMethodMeta`, `actionOutputProgressMapping`, `actionExecutionMeta`); `NOVA:frontend/src/lib/components/ActionView.svelte:260-271,349,378-379` (SSE → Balken) | Action definieren + Fortschritt mappen | `DOKU:admin/aktionen.md:10-77`; `DOKU:projekt/jobs-actions.md:54ff` | ok (thin: `execution.kind`/`cancellable`-Semantik nur Code) |
| Jobs (`cron`, `{type:javascript,file,timeout}`) | `NOVA:tibi-types/schemas/config/job.schema.json:1-40` | Cron-Jobs | `DOKU:projekt/jobs-actions.md:22ff` | ok |
| Assets (`name`, `path`) | `NOVA:tibi-types/schemas/config/asset.schema.json` | Projekt-Assets | nicht verifiziert | nicht verifiziert |
| KI-Proxy-Profile (`chat` + `summarizer/translation/vision`, `stt`, `tts`, Pricing) | `NOVA:config/ai-proxy.config.json:1-50`; `NOVA:schemas/config/ai-proxy-config.schema.json` (chat/stt/tts Pflichtfelder) | LLM-Provider/Modelle/Preise (Server) | `DOKU:projekt/llm-nutzen.md:59ff`; `DOKU:admin/ki-funktionen.md:107ff` (Grenzen/Kosten) | thin (Profil-Vererbung summarizer/translation/vision, `chatTemplateKwargs`, Pricing-Felder nur Code) |
| Runtime-System-Config (`frontend/assets/system.config.json`, Endpunkte, Engine-Modi `auto/api/browser/none`, TTS-Stimmen) | `NOVA:frontend/src/lib/runtime-system-config.ts:205` (`loadRuntimeSystemConfig`); `NOVA:schemas/config/system-config.schema.json` | KI-Laufzeitconfig des Admins | `DOKU:admin/setup.md:63ff` (ein Absatz); `DOKU:admin/ki-funktionen.md` | thin (Engine-Modi, Endpoint-Tabelle, Fallback-Verhalten fehlen) |
| API-Anbindung (`apiBaseURL=/api/`, `apiBaseOverride`-Store, `withApiPath/buildApiUrl` mit `_/`-Prefix) | `NOVA:frontend/src/config.ts:4`; `NOVA:frontend/src/lib/store.ts:99`; `NOVA:frontend/src/lib/api/url.ts:1-30` | Wie der Admin den Server erreicht | `DOKU:admin/setup.md:24ff,63ff` (`API_BASE`, Mock-Tabelle) | thin (`apiBaseOverride`-Laufzeit-Umschaltung, `namespace → _/`-Routing nur Code) |
| Mock-Modus (`__MOCK_MODE_DEFAULT__`, `isMockMode()`, Mock-Interceptor, Demo-Projekt `t1`) | `NOVA:esbuild.config.js:83`; `NOVA:frontend/src/lib/mock/config.ts:15-34`; `NOVA:frontend/src/index.ts:54ff` (Boot mit Mock-Interceptor) | Offline-/Demo-Betrieb | `DOKU:admin/setup.md:63ff` | thin (Umschalt-Regeln, Caching, Mock-Grenzen nur Code) |
| Boot-Sequenz (`__TIBI_BOOT_MAP__`, Stages, `tibi:boot-progress`, `__TIBI_APP_READY__`) | `NOVA:frontend/src/index.ts:14-80` | Lade-/Diagnose-Haken | — | gap (nur für Admin-Entwickler relevant; nicht verifiziert ob gewollt öffentlich) |
| Theme/i18n (`loadTheme`, `themeStore`, `setupI18n`, `locales/`) | `NOVA:frontend/src/lib/store.ts:283-300`; `NOVA:frontend/src/index.ts:2`; `NOVA:frontend/src/lib/i18n/` | Eigenes Theme/Sprachen — **lädt der Admin das?** | `DOKU:admin/setup.md`, `DOKU:admin/customizing.md` ohne Theme/i18n-Customizing | gap (kein Customizing-Pfad belegt: kein Theme-Slot, keine i18n-Override-Datei im Code gefunden) |
| Navigation/Gruppen (`group`, `muiIcon`, AdminHub, Breadcrumb, `jumpTargets`) | `NOVA:frontend/src/lib/components/AdminLayout.svelte`; `NOVA:frontend/src/lib/jumpTargets.svelte.ts`; `NOVA:frontend/src/lib/components/ui/Breadcrumb.svelte` | Admin-Navigation | `DOKU:admin/konzept.md`; `DOKU:anwender/orientierung.md` | thin (eigene Navigations-Einträge/Gruppen-Reihenfolge nur via `meta.group`, dokumentiert in `sammlungen-anlegen.md`) |
| Eigene Views/Meta-Felder/Skripte laden (Registrierung, Reihenfolge) | Registry-Loader (`load-registry.ts:14-38`, lazy + Cache pro URL); Export-Loader analog (`resolveProjectAssetSpecifier`) | Lade-Reihenfolge | `DOKU:projekt/pagebuilder-dev.md:17ff`; `DOKU:admin/exporte.md:48ff` | thin (Lazy/Cache-Verhalten, Fehler-Fallback Blueprint nur Code) |
## 2) Fehlende Interface-Doku (Top-Liste für Projektentwickler)
Steht weder in `DOKU:` noch in `NOVA:docs/` — jeweils mit Code-Beleg:
1. **`meta.singleton`** — Ein-Eintrag-Sammlungen (`enabled`, `key`). Beleg: Schema `collection-meta.schema.json` (`singleton`). Doku: kein Treffer.
2. **`project.admin.tokens`-Fähigkeiten** (`allowReload`, `allowRegenerateSearch`, `allowBackup`, `allowSnapshots`) — wer Backup/Snapshot/Search-Rebuild per Token darf. Beleg: `NOVA:tibi-types/schemas/config/project.schema.json` (`admin`). Doku: kein Treffer.
3. **`meta.query`** — deklarierte Zusatz-Querykeys für Hooks (`ctx.request().query`), MCP-validiert. Beleg: Schema `collection-meta.schema.json` (`query`). Doku: nur Neben­erwähnung `DOKU:projekt/mcp-nutzen.md`.
4. **`meta.agent`** — Zweck/Workflows/Gotchas pro Sammlung für Agents (via MCP/REST `_meta`). Beleg: Schema (`agent`). Doku: nur Neben­erwähnung `mcp-nutzen.md`/`pagebuilder-dev.md`.
5. **`meta.sections`** (`group/label/collapsible/collapsed`) — zweite Formular-Gruppierung neben `sidebar`. Beleg: Schema (`sections`). Doku: kein Treffer.
6. **`meta.defaultSort.order: MANUALLY`** + Drag-Freigabe — manuelle Reihenfolge als Config. Beleg: Schema (`defaultSort` enum `ASC/DESC/MANUALLY`); `NOVA:types/admin.d.ts:426ff`. Doku: Drag nur Bedienung (`customizing.md`), nicht Config.
7. **`meta.viewHint.navigation`-Details** (`nodesField`-Default `nodes`, `declaredTrees` mit `singleton/maxLevel`) — nur angerissen (`ansichten-listen.md:21`, `sammlungen-anlegen.md`). Beleg: Schema (`viewHint.navigation`); `NOVA:types/admin.d.ts:734ff`; `NOVA:frontend/src/lib/components/entry/widgets/NavigationTreeField.svelte`.
8. **Export-`ctx` vollständig** (`db.loadAll`-Batching/Retry/`signal`, nur `sort[0]`, `selector`-vs-`select`, `csvCell`-Guard, `csvWithBom`, Dateinamen-Sanitizing, `{date}`) — nur `NOVA:docs/custom-export-script.md:12-117` + Typdatei, in `DOKU:admin/exporte.md` verkürzt **und** Beispiel mit falscher Signatur (`loadAll({filter})` ohne Collection). Beleg: `NOVA:frontend/src/lib/utils/custom-export.types.ts:17-100`.
9. **Action-`execution` (`kind`, `cancellable`) + Upload-Fortschritt** (`createByteProgressToast`, `hasInlineUploadPayload`) — Fortschritts-Balken ja, Abbruch-/Upload-Pfad nein. Beleg: Schema (`actionExecutionMeta`); `NOVA:frontend/src/lib/components/ActionView.svelte:349-379`; `upload-progress`-Util. Doku: `DOKU:admin/aktionen.md:47ff` ohne `cancellable`/`kind`.
10. **`views`-Widerspruch klären** — `DOKU:admin/customizing.md:14` verspricht `meta.views` (u. a. Kalender), aber Schema verbietet `views` (`additionalProperties: false`, `NOVA:tibi-types/schemas/config/collection-meta.schema.json`) und `NOVA:types/admin.d.ts:452-458` markiert Custom-Views als „not yet supported“. Entweder implementieren oder Doku-Zeile streichen.
Nicht verifiziert (Begriffe existieren im Code nicht / unklar): `hooksTrigger`, `exportScript` (grep `NOVA:` ohne Treffer); `assets`-Admin-Nutzung (`asset.schema.json`: nur `name`/`path`).
## 3) Anwender-Oberflächen-Inventar
Routen: `NOVA:frontend/src/App.svelte:77-141`. Komponenten: `NOVA:frontend/src/lib/components/` (u. a. `admin/`, `ai/`, `entry/`, `entry/widgets/`, `ui/`). Shortcuts: `NOVA:frontend/src/lib/shortcuts.ts:22ff` (`SHORTCUTS`), Anzeige `ui/CommandPalette.svelte`, `ui/KeyboardShortcuts.svelte`.
| UI-Bereich | Code-Beleg | Doku-Seite | Screenshot? (`DOKU:src/assets/anwender/`) |
|---|---|---|---|
| Login / Abmelden / Session-Timeout | `NOVA:frontend/src/lib/components/LoginPage.svelte`; `ui/SessionTimeoutWarning.svelte`; `lib/api/auth.ts` | `DOKU:anwender/anmelden.md`; `DOKU:anwender/hilfe.md:10ff` | ja (`anmelden-login.webp`, `anmelden-abmelden.webp`) / Timeout-Dialog **fehlt** |
| Projektübersicht / Projektwechsel | `NOVA:frontend/src/lib/components/ProjectList.svelte` (implizit via Route); `store.ts:207ff` (`navigate`) | `DOKU:anwender/orientierung.md:10ff,26ff` | ja (`orientierung-start.webp`, `orientierung-projektwechsel.webp`) |
| Globale Schnellsuche vs. Command-Palette (`Ctrl/Cmd-K`?) | `NOVA:frontend/src/lib/components/ui/CommandPalette.svelte`; `shortcuts.ts` | `DOKU:anwender/orientierung.md:58ff` (nur Schnellsuche, keine Palette) | Palette-Overlay **fehlt** (`orientierung-schnellsuche.webp` zeigt Listen-Suche) |
| Tastaturkürzel-Hilfe (`?`, `g→p`, `s`, `v`) | `NOVA:frontend/src/lib/components/ui/KeyboardShortcuts.svelte`; `shortcuts.ts:22ff` | `DOKU:reference/tastatur-kurzbefehle.md`; `DOKU:anwender/lesen-suchen-filtern.md` (?) | **fehlt** |
| Listen (Tabelle/Karten/Medien/Navigation), Suche/Filter/Sortierung/Blättern, Mehrfachauswahl, URL-State | `NOVA:frontend/src/lib/components/CollectionView.svelte`; `CollectionTable/Cards.svelte`; `ui/FilterPopover.svelte`; `ui/SortPopover.svelte`; `ui/SearchInput.svelte` | `DOKU:anwender/lesen-suchen-filtern.md`; `DOKU:admin/ansichten-listen.md:10-94` | ja (`lesen-liste/karten/filter/suche.webp`) |
| Suchindex-Hinweis (Queue/Polling) | `NOVA:frontend/src/lib/components/ui/SearchIndexBuildNotice.svelte`; `NOVA:docs/test-plans/41-search-index-status.md:1-24` | nur Server-Seite (`server/betrieb.md`, `projekt/suche.md`) | **fehlt** (Anwender sieht Banner ohne Doku) |
| Stapel-Bearbeitung (Bulk) | `NOVA:frontend/src/lib/components/BulkEditPanel.svelte` | `DOKU:admin/customizing.md` (1 Zeile); Anwender: keine | **fehlt** |
| Eintrag anlegen/bearbeiten (Widgets, Pflicht/Formate, `dependsOn`) | `NOVA:frontend/src/lib/components/EntryView.svelte`; `entry/WidgetDispatcher.svelte`; `entry/widgets/*.svelte` | `DOKU:anwender/eintrag-bearbeiten.md`; `DOKU:admin/eintrags-editor.md:10-77` | ja (`eintrag-formular/neu/gespeichert.webp`) |
| Feldsuche (`Ctrl+F`), Sprungziele (`j`), Drill-Down, Verlauf Undo/Redo, Diff-Dialog, JSON-Overlay | `NOVA:entry/FieldSearch.svelte`; `entry/DrillDownBreadcrumb.svelte`; `entry/DiffDialog.svelte`; `entry/EntryJsonOverlay.svelte`; `lib/stores/drilldown-store.ts`, `entry-history` | `DOKU:admin/eintrags-editor.md:49ff,77ff` (teilweise) | **fehlt** (kein Screenshot für Suche/Diff/JSON/Drill-Down) |
| Fremdschlüssel (Drawer, Chips, Inline-Anlage, Rückverweise) | `NOVA:entry/ForeignKeyDrawer.svelte`; `entry/widgets/ForeignKeyWidget.svelte`; `entry/InlineEntryForm.svelte`; `entry/ReferencedBy.svelte` | `DOKU:admin/eintrags-editor.md:49ff`; `DOKU:admin/customizing.md:35ff` | **fehlt** |
| Übersetzung (Sprachtabs, Übersetzungsleiste) | `NOVA:entry/I18nLanguageTabs.svelte`; `entry/TranslationBar.svelte` | `DOKU:admin/eintrags-editor.md:58ff` | **fehlt** |
| Medien (Raster, Upload+Queue, Bildeditor, Lightbox, Einbetten) | `NOVA:frontend/src/lib/components/MediaGrid.svelte`; `ui/MediaLightbox.svelte`; `entry/widgets/ImageEditor.svelte`; `FileUploadQueue.svelte` | `DOKU:anwender/medien.md`; `DOKU:admin/medien.md:10-72` | ja Raster/Upload/Editor (`medien-*.webp`); Lightbox + Queue **fehlen** |
| Dateien/Fremddateien (`foreignFile`, Fremd-Medien) | `NOVA:entry/widgets/ForeignFileWidget.svelte`; `NOVA:docs/test-plans/38-foreign-file.md:1-49` | `DOKU:admin/medien.md:50ff` (Einbetten) | **fehlt** (eigenständig) |
| Export-Dialog (generisch + Skript-Tabs, Feldauswahl, Count-Warnung) | `NOVA:frontend/src/lib/components/ui/ExportDialog.svelte`; `NOVA:docs/collection-export.md:1-60` | `DOKU:anwender/exportieren.md`; `DOKU:admin/exporte.md:10ff` | ja (`export-dialog/fertig.webp`) |
| Aktionen (Formular, SSE-Balken, Ergebnis-Mapping) | `NOVA:frontend/src/lib/components/ActionView.svelte`; `ActionProgressMapping.svelte` | `DOKU:admin/aktionen.md`; Anwender: keine eigene Seite | **fehlt** (Anwender-Seite + Screenshot) |
| KI (Chat, Zusammenfassen, Stimme/TTS, Vision, Werkzeuge, Kosten) | `NOVA:frontend/src/lib/components/ai/AiChat.svelte`; `ai/*.ts` (`aiController`, `aiTools`, `aiUIRegistry`, `aiVoiceInput`, `aiTTS`); `ui/NovaAiPill.svelte` | `DOKU:anwender/ki-nutzen.md`; `DOKU:admin/ki-funktionen.md:10-107` | ja (`ki-chat/stimme/zusammenfassen.webp`); Tool-Inspektor/Verlauf/Vision-Overlay **fehlen** |
| Seiten bauen (Pagebuilder-Editor, Overlays, Viewports, Screenshot-Pipeline) | `NOVA:entry/widgets/pagebuilder/PagebuilderWidget.svelte`; `PagebuilderOverlay.svelte`; `PagebuilderOverviewOverlay.svelte`; `PagebuilderScreenshotHost.svelte` | `DOKU:anwender/seiten-bauen.md`; `DOKU:projekt/pagebuilder-dev.md:128ff` | ja (`seiten-*.webp`, 6 Dateien) |
| Verlauf/Audit (Liste, Diff, Wiederherstellen) | `NOVA:frontend/src/lib/components/AuditView.svelte`; `AuditHistoryPanel.svelte`; `AuditSidebarHistory.svelte`; `AuditDiff.svelte`; `AuditRestoreDialog.svelte` | Anwender: keine Seite; Admin: nur implizit | **fehlt** (Seite + alle Screenshots) |
| Snapshots/Backup (Übersicht, Auslösen/SSE, Download, Restore, Import-Analyse) | `NOVA:frontend/src/lib/components/SnapshotView.svelte`; `BackupView.svelte`; `lib/api/snapshot-api.ts`; `backup-api.ts`; `NOVA:docs/test-plans/43-backup-restore.md:1-89`, `44-snapshots.md:1-89` | `DOKU:anwender/sichern.md:10-49` | ja (`sichern-uebersicht/details/statistik.webp`); Backup-Import-Dialog + Restore-Bestätigung **fehlen** |
| Benutzer/Teams/Orgs/Rollen/Tokens (AdminHub, Drawers, Chips) | `NOVA:frontend/src/lib/components/admin/AdminHub.svelte`; `UserTab/TeamTab/OrgTab.svelte`; `*DetailDrawer.svelte`; `RoleSection.svelte`; `PermissionChipsInput.svelte`; `ProjectAdminView.svelte` | `DOKU:anwender/benutzer-teams.md`; `DOKU:admin/benutzer-rechte.md:27-80` | teilweise (`benutzer-teams/profil.webp`); Drawer-Details, Token-Seite, Projekt-Admin **fehlen** |
| Stellvertretung (Button + Amber-Banner + Stopp) | `NOVA:frontend/src/lib/api/auth.ts:270-300` (`impersonate`); `NOVA:docs/test-plans/42-impersonation.md:1-47`; Banner in `AdminLayout.svelte` | `DOKU:admin/benutzer-rechte.md:81ff` | **fehlt** |
| Profilseite | `NOVA:frontend/src/lib/components/ProfilePage.svelte` (Route `/profile`, `App.svelte:114ff`) | `DOKU:anwender/benutzer-teams.md:25` | ja (`benutzer-profil.webp`) |
| Avatar/Theme-Umschalter, Toasts, Voice-Eingabe in Filtern | `NOVA:ui/ThemeToggle.svelte`; `ui/Toast.svelte`; `ui/VoiceFilterTextInput.svelte`; `ui/VoiceRecorderButton.svelte` | verstreut/keine | **fehlen** |
UI-Bereiche **ohne** Screenshot (Namen): Tastaturkürzel-Hilfe, Command-Palette-Overlay, Suchindex-Banner, Bulk-Edit-Panel, Feldsuche/Sprungziele/Drill-Down, Diff-Dialog, JSON-Overlay, FK-Drawer/Inline-Anlage/Rückverweise, Übersetzungsleiste/Sprachtabs, Medien-Lightbox, Upload-Warteschlange, Fremddatei-Widget, Action-Ansicht (Anwender), KI-Werkzeug-Inspektor/Chat-Verlauf/Vision-Overlay, Audit-/Verlaufs-UI (komplett), Backup-Import-Dialog, Restore-Bestätigung, Admin-Drawers (Benutzer/Team/Org-Details), Token-Seite, Projekt-Admin-Ansicht, Stellvertretungs-Banner, Session-Timeout-Dialog, Theme-Umschalter, Voice-Filter-Eingabe.
## 4) Löschkandidaten `NOVA:docs/` (je Datei eine Zeile)
| Datei | Inhalt (kurz) | Abdeckung in tibi-docs | Urteil |
|---|---|---|---|
| `docs/collection-config.md` (2293 Zeilen) | Vollreferenz Projekt-/Collection-/Feld-/Meta-Schema inkl. Server-Optionen | teilweise (`projekt/sammlungen-anlegen.md`, `felder-widgets.md`, `reference/schemas.md`; Server-Details in `server/*`) | **muss bleiben** (einzige Vollreferenz; Auszug nach `reference/` wäre Follow-up) |
| `docs/collection-export.md` (327) | Generischer Listen-Export: Flow, Dialog, Batch-Laden, Warnschwellen | weitgehend (`admin/exporte.md:10ff`, `anwender/exportieren.md`) | teilweise → **vorerst bleiben** (Schwellenwerte/Batch-Details nur hier) |
| `docs/custom-export-script.md` (117) | `ctx`-Vertrag für Skript-Exporte (einzige Quelle für `db.loadAll`-Semantik, Payload-Regeln, Styling) | thin (`admin/exporte.md:48ff` verweist hierher) | **muss bleiben** (bis `ctx` voll in tibi-docs steht; siehe Punkt 2.8) |
| `docs/test-plans/02-navigation-routing.md` (31) | SPA-Routing, History, Breadcrumbs, Navigation-Guard | teilweise (`anwender/orientierung.md`, `admin/ansichten-listen.md:76ff`) | teilweise → bleiben (Guard-/History-Details nur hier) |
| `docs/test-plans/05-collection-view.md` | Listen-Rendering (4 View-Modi), Suche/Sort/Filter/Pagination, URL-State | weitgehend (`admin/ansichten-listen.md`, `anwender/lesen-suchen-filtern.md`) | teilweise → bleiben (Mock-Fälle, Debounce-Details) |
| `docs/test-plans/07-entry-editor-advanced.md` | Undo/Redo, Diff, Drill-Down, Feldsuche, Jump-Targets | teilweise (`admin/eintrags-editor.md`) | teilweise → bleiben |
| `docs/test-plans/11-foreign-keys.md` | FK-Widgets, Chip-Arrays, Drawer-Flow, Inline-Create, Nested-Drawers | teilweise (`admin/eintrags-editor.md:49ff`, `customizing.md:35ff`) | teilweise → bleiben |
| `docs/test-plans/16-ai-integration.md` (41) | KI-Integration (Chat/Modelle/Werkzeuge) | weitgehend (`admin/ki-funktionen.md`, `projekt/llm-nutzen.md`) | teilweise → bleiben (Mock-/Test-Spezifika) |
| `docs/test-plans/17-ai-tts.md` (24) | TTS/Stimme | weitgehend (`admin/ki-funktionen.md:52ff`) | teilweise → bleiben |
| `docs/test-plans/25-file-upload.md` (43) | Datei-Upload-Flows | teilweise (`admin/medien.md:19ff`) | teilweise → bleiben |
| `docs/test-plans/27-media-grid.md` (40) | Medien-Raster, DnD-Upload, Inline-Edit | teilweise (`admin/medien.md:10ff`) | teilweise → bleiben |
| `docs/test-plans/34-i18n-fields.md` (34) | Mehrsprachige Felder | teilweise (`admin/eintrags-editor.md:58ff`) | teilweise → bleiben |
| `docs/test-plans/35-entry-i18n.md` (54) | Eintrags-Übersetzung (Kopplung, Leiste) | teilweise (s. o.) | teilweise → bleiben |
| `docs/test-plans/36-voice-input-fields.md` (31) | Spracheingabe in Feldern | teilweise (`admin/ki-funktionen.md:52ff`) | teilweise → bleiben |
| `docs/test-plans/37-pagebuilder.md` | Pagebuilder-Vorschau, Lookup-Hydratisierung, URL-Normalisierung | weitgehend (`anwender/seiten-bauen.md`, `projekt/pagebuilder-dev.md`) | teilweise → bleiben (Mock-/URL-Edge-Cases nur hier) |
| `docs/test-plans/38-foreign-file.md` (49) | Fremddateien/-medien | teilweise (`admin/medien.md:50ff`) | teilweise → bleiben |
| `docs/test-plans/39-preview-resolver.md` | Vorschau-Regeln (Auto-Detect vs. strikt, Slot-Pfade, FK-Badges) | thin (`admin/customizing.md:35ff`) | **muss bleiben** (Regeln sonst nirgends) |
| `docs/test-plans/40-actions.md` | Action-Routen, Methoden-Tabs, SSE-Fortschritt, Disabled-States | weitgehend (`admin/aktionen.md`, `projekt/jobs-actions.md`) | teilweise → bleiben (Routing-/State-Details) |
| `docs/test-plans/41-search-index-status.md` (24) | Suchindex-Banner (Projekt/Collection, Polling) | nicht abgedeckt (nur Server-Seite `server/betrieb.md`, `projekt/suche.md`) | **muss bleiben** (einzige UI-Quelle) |
| `docs/test-plans/42-impersonation.md` (47) | Stellvertretung (Endpoint, Drawer-Button, Banner, Rollback) | teilweise (`admin/benutzer-rechte.md:81ff`) | teilweise → bleiben (Mock-Endpoint, Rollback-Details) |
| `docs/test-plans/43-backup-restore.md` (89) | Backup-Export/Import (SSE, 6 Endpunkte, Rechte) | teilweise (`anwender/sichern.md`, `projekt/audit-backup.md`) | teilweise → bleiben (API-/SSE-Details) |
| `docs/test-plans/44-snapshots.md` (89) | Snapshot-CRUD (SSE, 10 Endpunkte, ZIP, Prune) | teilweise (s. o.) | teilweise → bleiben |
Löschkandidaten-Zählung: **0 von 21 sofort löschbar** — 3× „muss bleiben“, 18× „teilweise → vorerst bleiben“, 0× „vollständig abgedeckt“.
+125
View File
@@ -0,0 +1,125 @@
# Audit 03: tibi-types + tibi-svelte-starter vs. tibi-docs
Stand: 2026-10-16. Codebasen: `tibi-types` (schemas + `index.d.ts`), `tibi-svelte-starter` (README, AGENTS, package.json, frontend/api/Docker/Env). Doku: `tibi-docs/src/content/docs` (Seiten `einstieg/*`, `projekt/*`, `reference/schemas.md`, `reference/hooks-*.md`).
Regel: Jede Aussage mit `datei:zeile` belegt; ohne Beleg steht „nicht verifiziert".
## 1) Schema-Matrix tibi-types (16 Schemas in `schemas/config/`)
Quelle Top-Level-Properties: per Python aus den Schema-Dateien extrahiert. Dokustand: `reference/schemas.md:10-32` listet alle 16 Schemas nur tabellarisch (Name → Datei → Pflichtfelder), beschreibt aber keine Properties im Detail; Details liegen ggf. auf Projektseiten.
| Schema (`schemas/config/*.json`) | Top-Level-Properties | in `reference/schemas.md` beschrieben? | undokumentierte Properties (vs. schemas.md + Projektseite) |
|---|---|---|---|
| `project.schema.json` | `namespace, meta, upload, collections, jobs, actions, assets, cors, admin, hook, audit, strictFields, snapshotPath, snapshots, legacy` (`project.schema.json:99-333` für Sub-Blöcke: `agent` :102, `assets` :174, `cors` :187, `admin` :227, `hook` :262, `audit` :303, `strictFields` :312, `snapshotPath` :315, `snapshots` :319, `legacy` :333) | nur Zeile in Tabelle (`schemas.md:18`); `hook/cache/ratelimit`-Details nur in `server/konfiguration.md`, `snapshots` nur in `projekt/audit-backup.md`, `admin` nur Server-Seiten | `snapshotPath` (String, Ablagepfad Snapshots), `snapshots` (Array, Zeitplan/Retention — nur Ablauf in `audit-backup.md`, kein Feld- mapping), `legacy` (nur in `reference/fehlercodes.md` erwähnt, sonst nicht verifiziert), `strictFields` auf Projektebene (nur `fehlercodes.md`, nicht verifiziert), `cors` auf Projektebene (nur Server-Seiten `server/sicherheit.md`, `server/konfiguration.md`), `admin`-Subkeys (nur Server-Seiten) |
| `collection.schema.json` | `name, defaultLanguage, uploadPath, upload, permissions, projections, hooks, meta, imageFilter, fields, indexes, audit, bulk, cors, queryLimits, readonlyFields, hiddenFields, strictFields, search` (`collection.schema.json:17` `uploadPath`, `:63` `imageFilter`, `:103` `audit`, `:126` `bulk`, `:147` `cors`, `:187` `queryLimits`, `:201` `readonlyFields`, `:207` `hiddenFields`, `:213` `strictFields`, `:216` `search`) | nur Tabellenzeile (`schemas.md:19`); Teilabdeckung: `indexes`+`search` in `projekt/sammlungen-anlegen.md:104-150`, `imageFilter` in `projekt/dateien-bilder.md`, `audit` in `projekt/audit-backup.md`, `cors` in `projekt/jobs-actions.md` | `uploadPath` (String, veralteter Upload-Pfad neben `upload`; nicht verifiziert in Doku), `queryLimits` (`defaultLimit`/`maxLimit`; kein Treffer in Doku — nicht verifiziert), `readonlyFields`/`hiddenFields` auf Collection-Ebene (kein Treffer in Doku — nicht verifiziert), `strictFields` (nur `fehlercodes.md`, kein Konzepttext), `bulk` (`optimize.create/update/delete`; in `projekt/*` nur `bulk`-Wort in `mcp-nutzen.md`/`hooks-schreiben.md` ohne Feld-Doku), `upload.allowedMimeTypes`/`maxBodySize` (nur Server-Seite, nicht pro Collection), Index-Subkeys `dropDups/sparse/background/defaultLanguage/languageOverride` (Schema-`$defs` `indexConfig`; Doku `sammlungen-anlegen.md:106-135` zeigt nur Text/Unique-Beispiel) |
| `field.schema.json` | via `$defs.field`: `name, type, index, subFields, validator, readonly, hidden, strictFields, meta` (Typ-Enum `string…any`, `index`-Enum `single/unique/text/sparse/background`) | nur Tabellenzeile (`schemas.md:20`) | `readonly`/`hidden` als Bool-oder-eval (`BoolOrEval`, `index.d.ts:13`); Doku `felder-widgets.md`/`sammlungen-anlegen.md` enthalten kein `readonly`/`hidden` (grep ohne Treffer) — nicht verifiziert; `strictFields` auf Feldebene (nur `fehlercodes.md`); `index`-Enum-Details (`sparse/background`) ohne Doku |
| `field-list.schema.json` | Array-Items `string \| field.schema` (Datei 1:20) | nur Tabellenzeile (`schemas.md:21`) | keine Properties (Wrapper); Verwendung (String-Kurzform vs. Objekt) in `felder-widgets.md:12-32` teilweise gezeigt — abgedeckt |
| `field-meta.schema.json` | `label, widget, i18n, helperText, hideLabel, hide, protected, position, section, containerProps, defaultValue, dependsOn, inputProps, choices, foreign, downscale, imageEditor, drillDown, pageSize, preview, addElementLabel, filter, pagebuilder, schemaRef, openapi` (`field-meta.schema.json:14` `widget`, `:50` `hideLabel`, `:66` `containerProps`, `:131` `dependsOn`, `:183` `downscale`, `:198` `imageEditor`, `:229` `drillDown`, `:232` `pageSize`, `:239` `addElementLabel`, `:242` `filter`, `:303` `schemaRef`) | nur Tabellenzeile (`schemas.md:22`); Teilabdeckung in `projekt/felder-widgets.md` (Aufbau :12, Typen :33, Validatoren :60, Choices/FK :80, dependsOn :131, i18n :151) | `hideLabel` (Bool; kein Treffer — nicht verifiziert), `containerProps` (Objekt; kein Treffer), `position`/`section` (Layout; `section` nur `collection-meta`, Feld-`section` nicht verifiziert), `pageSize` (Zahl; kein Treffer), `addElementLabel` (String; kein Treffer), `imageEditor` (Konfig; kein Treffer), `schemaRef` (String-Ref; kein Treffer), `filter: true/false` als Admin-Filter-Opt-in (`field-meta.schema.json:242-246`; Doku zeigt nur `filter_public.js`-Hook, nicht das Flag), `inputProps`/`defaultValue`-Details nur angerissen |
| `collection-meta.schema.json` | `label, muiIcon, group, exports, designGuide, imageUrl, hide, singleton, subNavigation, preview, i18n, defaultSort, viewHint, sidebar, sections, openapi, query, agent` (`collection-meta.schema.json:69` `singleton`, `:84` `subNavigation`, `:211` `defaultSort`, `:231` `viewHint`, `:423` `sidebar`, `:441` `sections`, `:465` `openapi`, `:468` `query`, `:503` `agent`) | nur Tabellenzeile (`schemas.md:23`); Teilabdeckung: `sammlungen-anlegen.md:79-103` (Label/Gruppe/Icon/Vorschau), `admin/ansichten-listen.md` (`subNavigation`, `defaultSort`, `viewHint`) | `singleton` (Bool, Ein-Dokument-Collection; kein Treffer in Doku — nicht verifiziert), `sections` (Array, Editor-Sektionen; kein Treffer), `hide` auf Collection-Ebene, `exports/designGuide/imageUrl` (nicht verifiziert), `query`-Block (Meta-Abfragen; nicht verifiziert), `agent`-Block (nicht verifiziert), `openapi`-Meta (nur Tabellenzeile) |
| `permissions.schema.json` | `public, user` + `$defs.permissionSet`: `methods, filter, validProjections, readonlyFields, hiddenFields` | nur Tabellenzeile (`schemas.md:24`) | `validProjections` (String-Array; kein Treffer — nicht verifiziert), `filter` (Mongo-Filter je Permission-Set; nur `rechte-tokens.md` grob, kein Feld-Mapping — teilweise), `readonlyFields`/`hiddenFields` je Permission-Set (kein Treffer) |
| `hooks.schema.json` | `get, post, put, delete, audit` + `$defs`: `hook(type/file/timeout)`, `getHooks(handle/read/return/file)`, `postHooks(bind/validate/handle/create/return/bulkCreate/bulkReturn)`, `putHooks(bind/validate/update/return/bulkUpdate/bulkReturn)`, `deleteHooks(delete/return/bulkDelete/bulkReturn)`, `auditHooks(return)` | nur Tabellenzeile (`schemas.md:25`); Hook-Protokoll in `projekt/hooks-schreiben.md` | `bulkCreate/bulkReturn`, `bulkUpdate/bulkReturn`, `bulkDelete/bulkReturn` (Stufen im Schema, in `hooks-schreiben.md` nur `bulk`-Wort ohne Stufen-Mapping — teilweise), `bind` vs. `validate` vs. `handle`-Reihenfolge (Schema-`$defs`, Doku-Erwähnung prüfen — teilweise), `audit.return`-Hook (Schema vorhanden; Doku nur `audit-backup.md`, kein Hook-Stufen-Text) |
| `job.schema.json` | `cron, type, file, timeout, meta` | nur Tabellenzeile (`schemas.md:26`); Ablauf in `projekt/jobs-actions.md` | `timeout` (Sekunden; in `jobs-actions.md` erwähnt — abgedeckt/teilweise), `meta` (frei; nicht verifiziert) |
| `action.schema.json` | `name, meta, permissions, hooks, audit, cors` + `$defs`: `actionField`, `actionMappedField(source/name/...)`, `actionFieldSection`, `actionExecutionMeta(kind/cancellable)`, `actionOutputProgressMapping(indexField/countField/statusField/messageField/fields)`, `actionOutputMapping(summary/details/progress)`, `actionOutputMeta(title/mapping)`, `actionMethodMeta(query/data/execution/output)`, `actionMeta(label/muiIcon/description/group/hide/methods)` | nur Tabellenzeile (`schemas.md:27`); Actions in `projekt/jobs-actions.md`, Admin-Ansicht in `admin/aktionen.md` | `actionOutputMapping`/`actionOutputProgressMapping`-Felder (`indexField/countField/statusField/messageField/fields`; nur `admin/aktionen.md`-Treffer für „mapping", kein Feld-Mapping — teilweise/nicht verifiziert), `actionExecutionMeta.kind/cancellable` (nicht verifiziert), `actionMappedField.source` vs. `name` (Dot-Path vs. Legacy; nicht verifiziert), `cors`/`audit` je Action (nicht verifiziert) |
| `asset.schema.json` | `name, path` | nur Tabellenzeile (`schemas.md:28`) | keine weiteren Properties; Verwendung (`config.yml`-Assets) in `server/schnittstellen.md`/`neues-projekt.md` — abgedeckt |
| `image-filter.schema.json` | Array von Filter-Objekten (kein Top-Level-Props-Objekt) | nur Tabellenzeile (`schemas.md:29`); Anwendung in `projekt/dateien-bilder.md` | Filter-Parameter (`width/height/fit/fill/resampling/anchor/…/quality/outputType` aus `ImageFilterParams`, `index.d.ts:314-358`) sind in `dateien-bilder.md` nur als `filter`-Query-Param gezeigt, kein Parameter-Mapping — teilweise |
| `projections.schema.json` | Pattern-Key `{name: {select: {feld: 0\|1}}}` (Wrapper-Datei 1:30) | nur Tabellenzeile (`schemas.md:30`); Nutzung in `projekt/abfragen-lesen.md` | `select: null`-Variante (Schema erlaubt `object|null`; Doku nur 0/1 — teilweise) |
| `snapshot.schema.json` | `name, description, collections, includeMedia, collectionDedup, mode, retention, schedule, permissions, enabled` | nur Tabellenzeile (`schemas.md:31`); Ablauf in `projekt/audit-backup.md`, Endpunkte in `server/schnittstellen.md` | `includeMedia` (Bool), `collectionDedup` (Bool/Strategie), `mode`, `retention`, `schedule`, `permissions`, `enabled` — Feld-für-Feld-Mapping in `audit-backup.md` prüfen, per Stichprobe nur Ablauf erzählt — teilweise (genaue Abdeckung nicht verifiziert) |
| `openapi.schema.json` | `disabled, get, getOne, post, put, delete` + `$defs`: `codeSample(lang/label/source)`, `responseObject`, `operationObject(disabled/tags/summary/description/x-codeSamples/parameters/responses/security)`, `fieldOpenapi(disabled/description/example/format/enum/deprecated)` | nur Tabellenzeile (`schemas.md:32`); generierte Referenz in `reference/openapi.md` | `x-codeSamples`, `getOne`-Trennung (`get` vs. `getOne`), `fieldOpenapi.example/format/enum/deprecated` — Detail-Mapping nicht verifiziert (teilweise) |
| `defs.schema.json` | nur `$ref`-Bausteine, kein Ziel (`schemas.md:33` sagt das explizit) | abgedeckt (`schemas.md:33`) | — |
Wichtigste undokumentierte Schema-Properties (Top-10, mit Typ/Wirkung aus Schema):
1. `collection.queryLimits` (`collection.schema.json:187`) — Objekt `{defaultLimit, maxLimit}` (Zahlen): GET-Limits je Collection. Kein Treffer in Doku — nicht verifiziert.
2. `collection.readonlyFields` / `hiddenFields` (`collection.schema.json:201-207`) — String-Arrays: Collection-weite Schreib-/Sichtschutz-Felder. Kein Treffer in Doku — nicht verifiziert.
3. `collection.uploadPath` (`collection.schema.json:17`) — String: Legacy-Upload-Pfad neben `upload:{maxBodySize, allowedMimeTypes}`. Nicht verifiziert in Doku.
4. `collection.strictFields` + Feld-`strictFields` (`collection.schema.json:213`; Feld-`$defs`) — Bool: unbekannte Felder ablehnen. Nur `fehlercodes.md`-Treffer, kein Konzept — faktisch undokumentiert.
5. `collection-meta.singleton` (`collection-meta.schema.json:69`) — Bool: Collection auf ein Dokument begrenzen. Kein Treffer — nicht verifiziert.
6. `collection-meta.sections` (`collection-meta.schema.json:441`) — Array: Editor-Sektionen. Kein Treffer — nicht verifiziert.
7. `field-meta.hideLabel` (`field-meta.schema.json:50`) — Bool: Label im Editor verstecken. Kein Treffer — nicht verifiziert.
8. `field-meta.imageEditor` (`field-meta.schema.json:198`) — Objekt: Bildeditor-Konfig je Feld. Kein Treffer — nicht verifiziert.
9. `permissionSet.validProjections` (Schema-`$defs.permissionSet`) — String-Array: erlaubte Projections je Rolle. Kein Treffer — nicht verifiziert.
10. `action.actionOutputMapping`/`actionOutputProgressMapping` (`action.schema.json`-`$defs`) — `{summary/details/progress{indexField/countField/statusField/messageField/fields}}`: Fortschritts-/Ergebnis-Mapping von Actions. Nur „mapping"-Wort in `admin/aktionen.md`, kein Feld-Mapping — faktisch undokumentiert.
## 2) Hook-Typen (`tibi-types/index.d.ts`, 1716 Zeilen)
Die `reference/hooks-*.md` dokumentieren Pakete/Funktionen (`db.find` …), nicht Typen. `reference/schemas.md` listet nur Schema-Dateien. `reference/hook-kontexte.md:8-28` listet Pakete aus `internal/hook` (Server-Code), nicht `index.d.ts`-Typen. Ergebnis: fast alle globalen Typen sind als Typen undokumentiert (Verwendung teils in Beispielen, aber kein Typ-Mapping).
| Typ (`index.d.ts`) | Zeilen | in hooks-*/schemas.md dokumentiert? |
|---|---|---|
| `CollectionDocument` | `index.d.ts:2-7` | nicht verifiziert (nirgends als Typ; implizit in Beispielen) |
| `BoolOrEval` | `index.d.ts:13` | nein — `readonly`/`hidden`-Felder selbst fehlen (s. §1) |
| `FieldImageValidator` (`minWidth/maxWidth/minHeight/maxHeight/allowNonImages/allowUnknownDimensions`) | `index.d.ts:16-29` + Schema `field.schema.json:130-142` | nein — `felder-widgets.md:60-78` kennt nur `maxFileSize/accept`, keine Bildmaß-Validatoren |
| `FieldValidator` (alle Schlüssel) | `index.d.ts:31-68` | teilweise — `felder-widgets.md:60-78` listet `required/pattern/in/minLength/maxLength/min/max/minDate/maxDate/minItems/maxItems/format/maxFileSize/minFileSize/accept/eval/allowZero`, aber **nicht** `image: FieldImageValidator` als Unterschlüssel |
| `SearchConfig` + `RrfConfig`/`SourceFusionConfig`/`VectorConfig`/`NgramConfig`/`NormalizeConfig`/`RegexConfig`/`ScoreConfig` | `index.d.ts:70-184` | teilweise — `projekt/suche.md:33-38` zeigt `autoRegenerate`, `:74` nennt `score_rrf/score_sum/rank_score/hybrid`, `minmax/zscore`, `scoreWeight`, `sourceConfig` als „existiert im Code", ohne Feld-Mapping |
| `SearchExplainSource/SearchExplanation/SearchMeta` (`qExplain`) | `index.d.ts:120-147` | nicht verifiziert (kein Treffer `qExplain`/`SearchExplanation` in Doku-Stichprobe) |
| `QueryLimitsConfig/BulkOptimizeConfig/BulkConfig` | `index.d.ts:187-209` | nein (s. §1 `queryLimits`/`bulk`) |
| `CollectionIndex` (`name/key/unique/dropDups/background/sparse/defaultLanguage/languageOverride`) | `index.d.ts:211-228` | teilweise — `sammlungen-anlegen.md:106-135` zeigt Text-/Unique-Beispiel, keine Subkey-Tabelle |
| `AuditCollectionConfig` | `index.d.ts:231-243` | teilweise — `audit-backup.md` erzählt Ablauf, kein Feld-Mapping (`enabled/actions`-Liste) |
| `UploadConfig` (`maxBodySize/allowedMimeTypes`) | `index.d.ts:245-248` | teilweise — Server-Seite ja, Collection-Ebene nein |
| `LocalizedText/ChoiceValue/ChoiceStyle/ChoiceItem` | `index.d.ts:250-272` | teilweise — `felder-widgets.md:82-110` zeigt Choices, aber kein `badgeVariant/chipVariant/badgeStyle/chipStyle`-Mapping |
| `PreviewTableColumn/PreviewSlots/PreviewConfig/EvalStringConfig/EvalHtmlConfig` | `index.d.ts:274-311` | teilweise — `sammlungen-anlegen.md:79-103` + `admin/ansichten-listen.md` zeigen Vorschau, kein Slot-Mapping (`label/secondary/tertiary/badge/image/table/select`) |
| `ImageFilterParams` | `index.d.ts:314-358` | teilweise (s. §1 `image-filter`) |
| `CollectionInfo` (inkl. `imageFilter/indexes/audit/bulk/queryLimits/readonlyFields/hiddenFields/search/strictFields`) | `index.d.ts:361-388` | nein als Typ; Felder s. §1 |
| `ActionInfo/ActionMeta/ActionMethodMeta/ActionExecutionMeta/ActionMappedField/ActionOutputProgressMapping/ActionOutputMapping/ActionOutputMeta` | `index.d.ts:391-465` | nein als Typen; Ablauf in `jobs-actions.md`/`admin/aktionen.md` |
| `MethodPermission/SimpleMethodPermission/AllowedMethodPermission/CollectionYourPermissions/ActionYourPermissions/ProjectYourPermissions/PermissionSet/ProjectionConfig` | `index.d.ts:467-521` | teilweise — `rechte-tokens.md` + `abfragen-lesen.md` (Projections) behandeln Konzepte, kein Typ-Mapping (`bulk`-Flag, `filter`, `validProjections` fehlen) |
| `CollectionFieldInfo` (`readonly/hidden/strictFields`) | `index.d.ts:523-536` | teilweise (s. Feld-§1) |
| `ApiInfo/ProjectInfo` | `index.d.ts:539-562` | nicht verifiziert als Typen |
| `AuditLogEntry` | `index.d.ts:565-611` | teilweise — `audit-backup.md` (Eintrags-Felder `userId/action/snapshot/changes` erzählt, kein Typ-Mapping) |
| `DbReadOptions` (`filter/selector/projection/offset/limit/sort/pipelineMod`) | `index.d.ts:613-627` | teilweise — `hooks-daten.md:8-113` dokumentiert `find/count/…`-Signaturen, `pipelineMod` als Option nicht verifiziert |
| `GetHookData/GetHookGetOnlyData/PostHookData/JobConfig/JobData` | `index.d.ts:629-737` | teilweise — `hooks-schreiben.md` (Stufen), `jobs-actions.md` (Jobs); `bulkReturn`-Felder (`created/ids/modified/deleted`) ohne Typ-Mapping |
| `ConfigPackage/DbPackage/SmtpPackage/FsPackage/TplPackage/HttpPackage` | `index.d.ts:738-1062` | ja (Funktionen) — `hooks-daten.md`, `hooks-netze.md`, `hooks-medien.md`, `hooks-sicherheit.md` |
| `DebugPackage/ResponsePackage/UserPackage/BcryptPackage/JwtPackage/CharsetPackage/ImagePackage/XmlPackage/CookiePackage/PdfPackage/CryptoPackage/JsonPackage/ExecPackage/Base64Package` | `index.d.ts:1064-1474` | ja (Funktionen) — `hooks-meta.md`, `hooks-medien.md`, `hooks-sicherheit.md` |
| `CachePackage/RatelimitPackage/ChannelSubscribeOptions/ChannelSubscription/ChannelPackage` (+ Rest ab `:1616`) | `index.d.ts:1481-1640` | ja (Funktionen) — `hooks-daten.md:114-195` (cache), `hooks-netze.md:69-176` (channel, ratelimit) |
Undokumentierte Typen (als Typ-Mapping): `CollectionDocument`, `BoolOrEval`, `FieldImageValidator`, `SearchExplainSource/SearchExplanation/SearchMeta`, `QueryLimitsConfig`, `BulkOptimizeConfig/BulkConfig`, `ChoiceItem` (Varianten/Styles), `PreviewSlots/PreviewConfig`, `CollectionInfo`, `ActionInfo`-Familie (8 Interfaces), `*YourPermissions`-Familie, `ApiInfo/ProjectInfo`, `AuditLogEntry` (als Typ), `DbReadOptions.pipelineMod`.
## 3) Felder-Widgets / Validator-Optionen vs. `projekt/felder-widgets.md`
Widget-Enum (`field-meta.schema.json:14-25`): `text, textarea, number, checkbox, switch, select, selectArray, chipArray, date, datetime, file, image, json, richtext, html, foreignKey, foreignKeyChipArray, foreignFile, foreignMedia, pagebuilder, pageBuilder, templateProps, containerLessObject, containerLessObjectArray, color` — alle in `felder-widgets.md` + `admin/eintrags-editor.md` per grep nachweisbar (Stichprobe §-Befund: alle 20+ Treffer). Lücken: `pagebuilder` vs. `pageBuilder` (beide im Enum, Doku unterscheidet nicht — nicht verifiziert), `containerLessObject` vs. `containerLessObjectArray` (beide erwähnt, Unterschied nicht verifiziert), `image` vs. `file` vs. `foreignFile` vs. `foreignMedia` (alle erwähnt, Abgrenzung nur in `dateien-bilder.md` angerissen — teilweise).
Validatoren (`felder-widgets.md:60-78`): `required, pattern, in, minLength/maxLength, min/max, minDate/maxDate, minItems/maxItems, format(email/url/uuid/slug), maxFileSize/minFileSize, accept, eval, allowZero` — alle dokumentiert. Fehlt: `image`-Unterschlüssel (`minWidth/maxWidth/minHeight/maxHeight/allowNonImages/allowUnknownDimensions`, `field.schema.json:130-142`, `index.d.ts:16-29`) — kein Treffer in Doku außer `minWidth`-Messung in `dateien-bilder.md:93` (Medialib-Anzeige, kein Validator). Meta-Lücken (s. §1): `hideLabel, containerProps, position, pageSize, addElementLabel, imageEditor, schemaRef, filter-Flag (field-meta.schema.json:242-246), drillDown (nur pagebuilder-dev.md-Treffer), downscale (nur dateien-bilder.md-Treffer)`.
## 4) Starter-Abgleich (`tibi-svelte-starter` → Doku)
| Thema | Beleg (Starter) | Dokuseite | Verdikt | fehlt |
|---|---|---|---|---|
| Klonen + Platzhalter (`__PROJECT_NAME__`, `__TIBI_NAMESPACE__`, `.env`, `api/config.yml`, `.htaccess`) | `README.md:7-22`, `.env` (`PROJECT_NAME=__PROJECT_NAME__` etc.) | `einstieg/schnellstart.md:16-52`, `einstieg/neues-projekt.md:12-43` | abgedeckt | nichts |
| Token-Köpfe (`Token` vs. `X-Admin-Token` vs. `X-Auth-Token`, `ADMIN_TOKEN` in `config.yml.env`) | `AGENTS.md: Token header distinction`, `README-Checkliste` | `einstieg/schnellstart.md:85-94`, `projekt/deploy.md:95-110`, `projekt/rechte-tokens.md` | abgedeckt | nichts |
| `make docker-up`, Docker-Profile, Traefik-Routen | `Makefile`, `docker-compose-local.yml`, `AGENTS.md: Quick reference` | `schnellstart.md:53-74`, `neues-projekt.md:44-54` | teilweise | Traefik-/Router-Details, Profile (`tibi` vs. `tibi-dev`), `docker-restart-frontend`/`docker-logs` nur Starter-lokal |
| `yarn validate` / `yarn build` / `yarn build:server` (`app.server.js`, `buildInfo`) | `package.json: scripts` (`validate`, `build`, `build:server`, `dev/start/start:mock/start:ssr`), `esbuild.config*.js`, `scripts/esbuild-wrapper.js` | `schnellstart.md:75-84`, `ssr-website.md:105-121`, `deploy.md` | abgedeckt (Basis) | `start:mock`/`MOCK=1`-Modus, `esbuild-wrapper`-Flags, `buildInfo.ts`-Mechanik nur angerissen |
| SSR-Hook (`api/hooks/ssr/get_read.js`, `<html lang>`, `<!--HEAD-->`, Cache-Collection `ssr`) | `README.md:24-40`, `api/hooks/ssr/`, `frontend/src/ssr.ts` | `projekt/ssr-website.md` (Routen :23, Lookups :36, Blöcke :70, Bundle :105, Cache :122, Abnahme :146) | abgedeckt | SSR-Cache-Invalidierungsregeln (`PUT/DELETE` vs. `POST`, `?clear=1`) stehen nur als Code-Kommentar in `ssr-website.md:153-164` — ok, aber `ssr.yml`-Felder nicht gemappt |
| Mock-Modus (`MOCK=1`, `__MOCK__`, `frontend/mocking/*.json`, `lib/mock.ts`) | `frontend/src/lib/mock.ts:4-8`, `frontend/src/lib/api.ts:88-89`, `package.json: start:mock` | `einstieg/begriffe.md`, `einstieg/was-ist-tibi.md` (nur Wort-Treffer) | fehlt | Mock-Aktivierung, `mocking/`-Verzeichnis-Format, `__MOCK__`-Flag — kein eigenes Doku-Kapitel (nur Wort in `begriffe.md`) |
| Playwright-Tests (`tests/e2e`, `tests/api`, `test:e2e/test:api/test:visual/tour`, `global-setup.ts`) | `package.json: scripts (test/test:e2e/test:api/test:visual/tour)`, `tests/`, `playwright.config.ts` | keine (kein Treffer `playwright` in `einstieg/*`, `ssr-website.md`, `deploy.md`) | fehlt | gesamtes Test-Setup (Spec-Ordner, `global-setup`, CI ohne Playwright It. `AGENTS.md`) in Projekt-Doku nicht verziehen |
| Frontend-Struktur (`App.svelte`, `routes/`, `blocks/`, `widgets/`, `lib/api.ts`, `store.ts`, `i18n`, Tailwind, Sentry, `svelte:head`) | `frontend/src/` (`App.svelte`, `blocks/*`, `widgets/`, `lib/*`, `config.ts`, `ssr.ts`, `sentry.ts`) | `ssr-website.md` (Routen/Blöcke/i18n/Tailwind angerissen) | teilweise | `widgets/`-Katalog, `lib/`-Module (`api.ts`, `store.ts`, `navigation.ts`, `versionCheck.ts`), Sentry-Verdrahtung, `svelte:head`-Pflicht nur Checklisten-Zeile |
| API-Verzeichnis (`api/collections/*.yml`, `api/hooks/*`, `api/templates/`, `config.yml.env`, `ssr.yml`, `medialib.yml`) | `api/` (`collections/`, `hooks/`, `templates/`, `config.yml`, `config.yml.env`) | `neues-projekt.md:55-104` (Dateien vs. registriert), `sammlungen-anlegen.md`, `ssr-website.md` | teilweise | `templates/`-Verzeichnis, `config.yml.env`-Mechanik (`ADMIN_ASSET_VERSION`), `medialib.yml`-Felder nur Beispiel |
| Env/Deploy (`CODING_URL`, `LIVE_URL`/`STAGING_URL`, `ADMIN_ASSET_VERSION`, `.basic-auth-*`, CI-Skripte `scripts/ci-*.sh`, `validate-schemas.mjs` in tibi-types) | `.env`, `scripts/ci-*.sh`, `AGENTS.md: Required secrets` | `neues-projekt.md`, `deploy.md:12-110` (URL-Bild, Ablauf, Reload-Endpunkte, Token-Trennung) | teilweise | `.basic-auth-*`-Dateien, `ADMIN_ASSET_VERSION`-Mechanik, CI-Skript-Details (`ci-modify-config.sh`, `ci-upload-sourcemaps.sh`), BrowserSync-Proxy — Starter-lokal, Doku schweigt |
| `.agents/`-Wissen (BUILD_CHECKLIST, Skills, `tibi-project-setup`) | `.agents/BUILD_CHECKLIST.md`, `.agents/skills/`, `AGENTS.md` | keine Entsprechung | fehlt (bewusst?) | Build-Checklisten-Phasen und Skill-Pflege sind Starter-intern; Doku muss entscheiden, ob das Projekt-Delivery-Wissen je in `neues-projekt.md` gehört |
Top-5 Starter-Lücken (für Projekt-Doku `schnellstart`/`neues-projekt`/`ssr-website`/`deploy`):
1. Playwright-Test-Setup (`tests/e2e|api|visual`, `test:e2e/test:api/tour`-Skripte) — kein Doku-Kapitel.
2. Mock-Modus (`MOCK=1`/`start:mock`, `mocking/*.json`, `lib/mock.ts`) — nur Wort-Treffer.
3. `api/templates/` + `ssr.yml`-Felder + Cache-Invalidierung als Konzept (nur Code-Kommentar in `ssr-website.md:153-164`).
4. CI/Env-Mechanik (`.basic-auth-*`, `ADMIN_ASSET_VERSION`, `scripts/ci-*.sh`, `esbuild-wrapper`-Flags).
5. Frontend-`lib/`-Module + `widgets/`-Katalog + Sentry-Verdrahtung (nur angerissen).
## 5) Löschkandidaten (Datei → Inhalt → Doku-Status)
tibi-types:
- `index.d.ts` (1716 Zeilen: alle Hook-Typen) → in tibi-docs **teilweise** (Funktionen ja, Typen nein) → **muss bleiben** (einzige Typquelle; Starter referenziert via `types/global.d.ts` + `tibi-types/`-Submodul lt. `AGENTS.md`).
- `schemas/config/*.json` (16 Dateien) → in tibi-docs **teilweise** (`schemas.md:10-33` listet, Details fehlen) → **muss bleiben** (einzige Form-Quelle; Doku verlinkt per `$schema`-Zeile).
- `scripts/validate-schemas.mjs` → Inhalt nicht verifiziert (nicht gelesen) → **nicht verifiziert** (vermutlich Build-Hilfe → muss bleiben).
- `demo-api/` (`config.yml`, `collections/mycol.yml`, `collections/fields|global/`, `actions/`, `hooks/`, `testfiles/`) → Doku-Beispiele nutzen Starter-`api/`, nicht `demo-api` → **teilweise/nicht abgedeckt**; vor Löschen prüfen, ob Tests/Validierung sie nutzen (nicht verifiziert) → **nicht löschen ohne Prüfung**.
- `package.json`/`tsconfig.json`/`README` (falls vorhanden) → Paket-Metadaten → **muss bleiben**.
tibi-svelte-starter:
- `README.md` (Setup-Checkliste :7-22, Architektur/SSR :24-40) → in tibi-docs **abgedeckt** (`schnellstart.md`, `neues-projekt.md`, `ssr-website.md`) → **muss bleiben** (Einstiegspunkt im Repo; Doku dupliziert mit Absicht für Website-Kontext).
- `AGENTS.md` (Token-Köpfe, Medialib-URL-Pattern, Constraints, Secrets, Skills-Pflege) → in tibi-docs **teilweise** (Token-Köpfe abgedeckt, Medialib-Pattern in `dateien-bilder.md`, Skill-/Constraint-Wissen nicht) → **muss bleiben** (Agenten-Arbeitsanweisung im Repo).
- `api/` (`collections/*.yml`, `hooks/ssr/*`, `templates/`, `config.yml`, `config.yml.env`) → in tibi-docs **teilweise** (Konzepte ja, Feld-Mapping nein) → **muss bleiben** (lauffähiges Beispiel).
- `frontend/src/` (App/blocks/widgets/lib/routes) → **teilweise** → **muss bleiben**.
- `.agents/` (`BUILD_CHECKLIST.md`, `STARTER_ALIGNMENT_*.md`, `skills/`) → in tibi-docs **nicht abgedeckt** → **muss bleiben** (Starter-interne Liefer-/Pflege-Doku, kein Doku-Duplikat).
- `docker-compose-*.yml`, `Dockerfile`, `Makefile`, `esbuild.config*.js`, `scripts/esbuild-wrapper.js`, `.env` → **teilweise** (Befehle ja, Details nein) → **muss bleiben**.
- `tests/` + `playwright.config.ts` + `video-tours/` → in tibi-docs **nicht abgedeckt** → **muss bleiben** (kein Ersatz in Doku).
- `tibi-types/`-Submodul + `types/global.d.ts` → Typ-Brückenkopf → **muss bleiben**.
Zählung: 0 Dateien mit Verdikt „löschen". 2× „muss bleiben" (Typ-/Schema-Quellen), Rest „teilweise/nicht abgedeckt, muss bleiben" (lauffähige Beispiele, Tests, Ops-Dateien). Einziger Klärungsfall: `tibi-types/demo-api/` (Nutzung durch Tests/CI vor Lösch-Entscheidung prüfen — nicht verifiziert).
+106
View File
@@ -0,0 +1,106 @@
# Audit 04 — Alt-Doku-Inventar vs. tibi-docs (zentrale Doku)
> Audit-Agent, nichts geändert/gelöscht. Stand: 2026-10-16.
> Kernbefund: `tibi-docs` wurde per Commit `06c8363` („Neuaufbau: Inhalte bis auf Einstieg entfernt") neu aufgebaut —
> die 24 englischen Server-Docs + 3 Nova-Docs liegen **nicht** als Sync-Artefakte in `tibi-docs` (git-ls-files zeigt nur je 5/10 Handseiten).
> `scripts/sync-server-docs.mjs` + `AGENTS.md` („server/ = SYNC") beschreiben einen Sync, dessen Ergebnis nicht (mehr) im Repo steht —
> ein Lauf würde 24+3 Dateien als verwaiste Seiten (kein Sidebar-Eintrag in `astro.config.mjs`) einspielen.
## 1) Datei-Inventar
### A. `tibi-server/docs/` — alle 24 Dateien einzeln
| Pfad | Inhalt (1 Zeile) | Ziel in tibi-docs | Bewertung | Begründung |
|---|---|---|---|---|
| `tibi-server/docs/01-architecture.md` (257 Z.) | Architektur-Überblick (Go, Module) | `server/uebersicht.md` | behalten-intern | Core-Referenz für Server-Entwicklung; tibi-docs nur Nutzer-Sicht |
| `tibi-server/docs/02-configuration.md` (705 Z.) | Server-Konfiguration (Env, YAML) | `server/konfiguration.md` | behalten-intern | Vollreferenz (705 Z.) vs. Handseite; Quelle-der-Wahrheit für Core |
| `tibi-server/docs/03-api-endpoints.md` (2406 Z.) | REST-Routen-Referenz, englisch | `server/schnittstellen.md` + `projekt/abfragen-lesen.md` | behalten-intern | Größte Datei; tibi-docs fasst nutzerorientiert zusammen, ersetzt keine Referenz |
| `tibi-server/docs/04-collections.md` (1745 Z.) | Collection-System im Detail | `projekt/sammlungen-anlegen.md`, `projekt/felder-widgets.md` | behalten-intern | Detailtiefe (1745 Z.) bleibt Core-Referenz |
| `tibi-server/docs/05-authentication.md` (602 Z.) | Auth (Login, JWT, Tokens, Impersonation) | `server/sicherheit.md` + `projekt/rechte-tokens.md` | behalten-intern | stimmen überein (`POST /api/v1/login`, Impersonation); Detail bleibt hier |
| `tibi-server/docs/06-hooks.md` (1717 Z.) | JS-Hook-Laufzeit, alle Stufen | `projekt/hooks-schreiben.md` + `reference/hook-kontexte.md` | behalten-intern | 1717 Z. Vollreferenz; tibi-docs deckt 24 Kontexte + Signaturen ab, aber kein Ersatz |
| `tibi-server/docs/07-realtime.md` (186 Z.) | SSE Pub/Sub-Channels | `server/schnittstellen.md` (Realtime-Abschnitt) | behalten-intern | kurze Referenz, intern weiter nötig |
| `tibi-server/docs/08-file-upload-images.md` (288 Z.) | Uploads + Bildfilter | `projekt/dateien-bilder.md` | behalten-intern | Core-Referenz |
| `tibi-server/docs/09-llm-integration.md` (256 Z.) | LLM-Chat-API, Budgets | `projekt/llm-nutzen.md` | behalten-intern | tibi-docs-Seite war lt. `plans/doku-ausbau.md` „Hülle" — prüfen vor Wegfall-Urteil |
| `tibi-server/docs/10-audit.md` (273 Z.) | Audit-Log (TTL, Lesen) | `projekt/audit-backup.md` | behalten-intern | Core-Referenz |
| `tibi-server/docs/11-jobs.md` (150 Z.) | Cron-Jobs | `projekt/jobs-actions.md` | behalten-intern | kurz, kein Löschgrund (Single Source) |
| `tibi-server/docs/12-deployment.md` (148 Z.) | Deployment | `projekt/deploy.md` + `server/betrieb.md` | behalten-intern | kurz, Core-Sicht |
| `tibi-server/docs/13-openapi-metrics.md` (147 Z.) | OpenAPI + Prometheus | `reference/openapi.md` + `server/betrieb.md` | behalten-intern | kurz, Core-Sicht |
| `tibi-server/docs/14-security.md` (632 Z.) | Security-Audit (englisch) | `server/sicherheit.md` | behalten-intern | Audit-Charakter (632 Z.), nicht nutzerrelevant 1:1 |
| `tibi-server/docs/15-troubleshooting.md` (228 Z.) | Troubleshooting/FAQ | `reference/fehlercodes.md` + `anwender/hilfe.md` | behalten-intern | Core-Fehlersuche vs. Anwender-Hilfe |
| `tibi-server/docs/16-cookbook.md` (682 Z.) | Collection-Config-Rezepte | `projekt/sammlungen-anlegen.md` | behalten-intern | Rezeptsammlung für Core-/Power-User |
| `tibi-server/docs/17-field-level-permissions.md` (546 Z.) | Feld-Rechte im Detail | `projekt/rechte-tokens.md` | behalten-intern | Detailreferenz |
| `tibi-server/docs/18-orgs-teams.md` (716 Z.) | Orgs & Teams | `admin/benutzer-rechte.md` + `anwender/benutzer-teams.md` | behalten-intern | 716 Z. Modell-Referenz vs. Bedienungs-Seiten |
| `tibi-server/docs/19-actions.md` (311 Z.) | Actions | `projekt/jobs-actions.md` + `admin/aktionen.md` | behalten-intern | Core-Referenz |
| `tibi-server/docs/20-referenced-read-safety.md` (70 Z.) | GET-Sichtbarkeits-Sicherheitsregel | `server/sicherheit.md` (unklar ob abgedeckt) | behalten-intern | Sicherheitsregel für Core-Entwicklung, 70 Z. |
| `tibi-server/docs/21-backup-restore.md` (530 Z.) | Backup/Restore | `projekt/audit-backup.md` | behalten-intern | inkl. Snapshots-Plan-Kontext; Core-Referenz |
| `tibi-server/docs/22-personal-access-tokens.md` (291 Z.) | Personal Access Tokens, Scopes | `projekt/rechte-tokens.md` + `reference/token-koepfe.md` | behalten-intern | Scope-Modell-Referenz |
| `tibi-server/docs/23-mcp.md` (152 Z.) | MCP-Server (Routen, Env) | `projekt/mcp-nutzen.md` (+ `server/schnittstellen.md`) | behalten-intern | **Widerspruch** zu tibi-docs, siehe §4 |
| `tibi-server/docs/24-ephemeral-rest-tokens.md` (71 Z.) | Ephemere REST-Tokens, Status PLAN | `reference/token-koepfe.md` (unklar ob abgedeckt) | behalten-intern | Plan-Status, nicht implementiert — nicht löschen, als Plan kennzeichnen |
Fazit A: **0 Wegfall-Kandidaten** in `tibi-server/docs/`. Alle 24 = englische Core-Referenz (Single Source); tibi-docs ist deutsche Nutzer-Doku, kein Ersatz.
### B. `tibi-admin-nova/docs/` — alle Dateien einzeln
| Pfad | Inhalt (1 Zeile) | Ziel in tibi-docs | Bewertung | Begründung |
|---|---|---|---|---|
| `tibi-admin-nova/docs/collection-config.md` (2293 Z.) | Collection-Config-Referenz (größte Nova-Datei) | `admin/*` + `projekt/sammlungen-anlegen.md` | behalten-intern | Vollreferenz; von tibi-docs-T-ADMIN-SO als Quelle genutzt, nicht ersetzt |
| `tibi-admin-nova/docs/collection-export.md` (327 Z.) | CSV/XLSX/JSON-Export aus Listen | `admin/exporte.md` + `anwender/exportieren.md` | behalten-intern | Detail (u. a. `qm`-Param); tibi-docs fasst zusammen |
| `tibi-admin-nova/docs/custom-export-script.md` (117 Z.) | Custom-Export-Skripte (`collection.meta.exports`) | `admin/exporte.md` | behalten-intern | API-Detail (`db.loadAll`/`ctx.xlsx`); T-ADMIN-A-SO belegt Nutzung als Quelle |
| `tibi-admin-nova/docs/test-plans/` (19 Dateien, Nrn. 02,05,07,11,16,17,25,27,34–44) | Manuelle UI-Testpläne (Navigation, Editor, Upload, i18n, Pagebuilder, Backup …) | `admin/*` als Quelle, kein 1:1-Ziel | behalten-intern | Test-Artefakte, keine Nutzer-Doku; T-ADMIN-B-SO verlinkt Test-Pläne 40/42 |
### C. Zusammengefasst je Verzeichnis
| Verzeichnis | Inhalt | Ziel in tibi-docs | Bewertung | Begründung |
|---|---|---|---|---|
| `tibi-server/README.md` | Feature-Matrix + Tech Stack (englisch) | `server/uebersicht.md` | behalten-öffentlich | Repo-Einstieg; kein tibi-docs-Ersatz |
| `tibi-server/design/` (2 Dateien: `snapshot-plan.md`, `snapshot-review-2026-06-28.md`) | Snapshot-Architekturplan + Review | `projekt/audit-backup.md` (Ergebnis, nicht Plan) | behalten-intern | Architektur-Referenz für Core-Entwicklung |
| `tibi-server/examples/` (`mcp/curl.sh`, `testproject/*`, `testproject2/collections/*.yml`) | Lauffähige Beispiel-Configs/Skripte | keines (Code, keine Doku) | behalten-intern | Test-/Beispiel-Artefakte |
| `tibi-server/plans/` (22 Dateien: ISSUES, Backup-, MCP-, Impersonation-, Org/Team-Pläne …) | Arbeitspläne Core-Entwicklung | keines | behalten-intern | aktive/historische Arbeitspläne |
| `tibi-admin-nova/README.md` | Setup-Anleitung Nova (git-lfs, yarn) | `admin/setup.md` | behalten-intern | Entwickler-Setup des Admin-Repos |
| `tibi-admin-nova/frontend/docs/*.pdf` (4 Dateien, je 1 Seite, <1,5 KB) | `brand-guidelines`, `design-specs`, `media-kit-2026`, `validation-report` | keines bekannt | unklar | Winzig-Platzhalter-PDFs — Inhalt ungeprüft; Ersteller fragen |
| `tibi-admin-nova/plans/{open,in-progress,closed}/` (26 Dateien) | Feature-Arbeitspläne (Actions, Pagebuilder, Import/Export, Voice …) | keines | behalten-intern | Arbeitspläne, keine Doku |
| `tibi-admin-nova/plans/test-plans/{open,closed,…}` (~40 Dateien) | Manuelle Testpläne aller UI-Bereiche | als Quelle für `admin/*`, `anwender/*` | behalten-intern | Test-Artefakte; T-ADMIN-B-SO verlinkt 40/42 |
| `tibi-svelte-starter/README.md` | Starter-Setup-Checkliste + SSR-Architektur | `einstieg/neues-projekt.md`, `projekt/ssr-website.md` | behalten-öffentlich | Repo-Einstieg des Templates; als Eigen-Datei nötig |
| `tibi-svelte-starter/AGENTS.md` | Token-Header-Regel, Medialib-URL-Pattern, Constraints | `reference/token-koepfe.md` (Header), `projekt/*` (teils) | behalten-intern | Arbeitsanweisung für Agenten im Starter-Repo |
| `tibi-docs-legacy/docs/` (`begriff.md`, `probleme.md`, `servergrundlagen`, `restapi`, `tibiAI`, `server-javascript-kontext` …) | Alte deutsche TibiCMS-Doku (Docpress-Ära) | `einstieg/begriffe.md` u. a. (unklar, Volltext-Abgleich fehlt) | unklar | historisch; vor Löschung Volltext-Abgleich gegen tibi-docs nötig |
| `tibi-starter/docs/` (docpress.json, md/, …) | offenbar weitere Legacy-Doku-Kopie | keines geprüft | unklar | nur oberflächlich geprüft — Inventar fehlt |
## 2) Wegfall-Kandidaten (konkret)
**Keine Datei erfüllt „kann weg, weil in tibi-docs abgedeckt".** Zählung: **0 Wegfall-Kandidaten, 27 Muss-bleiben-Dateien** (24 + 3).
Stattdessen wegfall-/reparaturbedürftig auf Meta-Ebene:
1. `tibi-docs/scripts/sync-server-docs.mjs` — Sync-Ziel (`server/01–24*.md`, `admin/collection-*.md`) steht nicht im Repo und nicht in der Sidebar (`astro.config.mjs` listet nur 5/10 Handseiten). Entweder reaktivieren (mit Sidebar-`autogenerate` + Linkpflege) oder Skript + AGENTS.md-Sync-Abschnitt als veraltet kennzeichnen. Ungenutzter Code mit falscher Doku-Behauptung.
2. `tibi-docs/AGENTS.md` §2-Tabelle („server/ = SYNC — nicht von Hand editieren") + §4-Sync-Workflow — widersprechen dem tatsächlichen Neubau-Stand (nur Handseiten, `git log 06c8363`). Korrektur fällig, kein Datei-Wegfall.
3. `tibi-docs-legacy/`, `tibi-starter/docs/`, `tibi-docs-kaputt/` — nach Volltext-Abgleich (siehe §5) Löschkandidaten auf **Repo-Ebene**, nicht Datei-Ebene.
Sync-Abhängigkeit: nichts in `tibi-server/docs/` oder `tibi-admin-nova/docs/` darf gelöscht werden, **weil** das Sync-Skript genau diese Pfade als Quelle liest (`serverSrc`, `novaSrc` in `sync-server-docs.mjs:14–15`); Löschen dort bräche einen evtl. reaktivierten Sync.
## 3) Muss bleiben (Begründung)
- `tibi-server/docs/01–24` (alle): einzige vollständige englische Core-Referenz + Single Source für Reaktivierung des Syncs.
- `tibi-admin-nova/docs/*.md` (3): Config-/Export-Referenz, von tibi-docs-Autoren als Quelle benutzt (Second Opinions in `plans/doku-ausbau.md`).
- `tibi-admin-nova/docs/test-plans/` + `plans/test-plans/`: manuelle Testpläne, keine Nutzer-Doku, weiter als Test-Artefakte nötig.
- `tibi-admin-nova/plans/` + `tibi-server/plans/` + `tibi-server/design/`: Arbeits-/Architekturpläne der Core-Entwicklung.
- `tibi-server/examples/`, READMEs, `tibi-svelte-starter/{README,AGENTS}.md`: Repo-Einstiege + Agenten-Arbeitsanweisungen.
## 4) Dubletten/Widersprüche
1. **MCP-Route konfigurierbar vs. fest.** `tibi-server/docs/23-mcp.md:42,47` (`route: "/api/v1/mcp"`, Env `MCP_ROUTE`) vs. `tibi-docs/src/content/docs/server/schnittstellen.md:77` („fest `POST` + `GET /api/v1/mcp` — ein gesetztes `mcp.route`/`MCP_ROUTE` wird ignoriert"). Eine Seite irrt — am Code (`internal/controller/setup.go`, `internal/config/server.go`) klären.
2. **Sync-Behauptung vs. Neubau-Realität.** `tibi-docs/AGENTS.md:25–26,39–48` („server/ = SYNC", Sync-Workflow) vs. `git log 06c8363` + `git ls-files` (nur Handseiten, keine Sync-Artefakte). AGENTS.md ist veraltet.
3. **Login-Pfad-Darstellung.** `tibi-server/docs/05-authentication.md:12` (`POST /api/v1/login`) vs. `tibi-docs/.../server/schnittstellen.md:12,27` (verkürzt `/login`, Tabelle mit Präfix `/api/v1`). Inhaltlich konsistent, aber Kürzung riskiert Copy-Paste-Fehler — unklar, kein harter Widerspruch.
4. **Token-Header `Token` vs. reservierte Namen.** `tibi-svelte-starter/AGENTS.md` (Collection-API: Header-Name aus Permission-Key, typisch `Token`) vs. `tibi-docs/.../reference/token-koepfe.md:52` (reservierte Namen `x-auth-token`/`x-admin-token`/`authorization` fail-closed). Ergänzend, aber Starter-Regel „typisch `Token`" ohne Warnung vor reservierten Namen — Angleichung empfohlen.
5. **LLM-/MCP-Seiten Hüllen-Status.** `plans/doku-ausbau.md` listet `projekt/llm-nutzen` + `projekt/mcp-nutzen` als „Hülle" — falls weiterhin Hüllen, sind `09-llm-integration.md`/`23-mcp.md` die einzigen vollständigen Quellen; kein Widerspruch, aber Abhängigkeit.
## 5) Repo-Hygiene-Funde
| Verzeichnis | Befund | Empfehlung |
|---|---|---|
| `/WM_Dev/src/gitbase.de/cms/tibi-admin.bak/`, `tibi-admin.bak2/` (je eigenes `.git`-Repo, Woocommerce-Ära-Layout) | tote Vollkopien | archivieren/löschen nach Backup-Abgleich |
| `/WM_Dev/src/gitbase.de/cms/tibi-admin.kaputt/` (eigenes `.git`) | defekte Kopie per Namensgebung | löschen nach Backup-Abgleich |
| `/WM_Dev/src/gitbase.de/cms/tibi-server.bak/` | Server-Backup-Kopie | löschen nach Abgleich |
| `/WM_Dev/src/gitbase.de/cms/tibi-docs-kaputt/` (eigenes `.git`) | defekte Doku-Kopie | löschen nach Abgleich |
| `/WM_Dev/src/gitbase.de/cms/tibi-admin/`, `tibi-admin-dev/`, `tibi-admin-master/` (READMEs sagen alle „tibi-svelte-starter", alte Svelte-Geschichte) | alte Starter-/Admin-Varianten, unklar ob referenziert | klären, dann archivieren/löschen |
| `/WM_Dev/src/gitbase.de/cms/tibi-admin-server/` (Python `run.py`, `uploads/`) | artfremder Uploader-Dienst | prüfen, ob noch deployed; sonst archivieren |
| `/WM_Dev/src/gitbase.de/cms/tibi-starter/` vs. `tibi-svelte-starter/` | zwei Starter-Varianten parallel | eine als kanonisch erklären, andere archivieren |
| `tibi-docs-legacy/` (Docpress + `node_modules/` eingecheckt) | Legacy-Doku inkl. `node_modules/` | nach Volltext-Abgleich archivieren/löschen |
+55
View File
@@ -0,0 +1,55 @@
# Audit: Admin- und Referenz-Doku
- Umfang: `src/content/docs/admin/*.md` (10 Dateien, 920 Zeilen) und `src/content/docs/reference/*.md` (11 Dateien, 1434 Zeilen), jeweils vollständig gelesen.
- Datum: 2026-10-16. Code-Stand: tibi-admin-nova `2b091d89`, tibi-server `68b42785`, tibi-types `4c55f82` (aus den `Verifiziert`-Zeilen).
- Belege: `frontend/src/lib/i18n/locales/de.json` (1456 Schlüssel), `frontend/assets/system.config.json`, `config/ai-proxy.config.json`, `frontend/src/lib/**`, `tibi-server/internal/**`, `tibi-types/schemas/config/` (16 Dateien, Angabe in `schemas.md` stimmt).
- Alle internen Links (`/admin/*`, `/projekt/*`, `/reference/*`, `/anwender/anmelden/`) lösen auf existierende Dateien auf. Alle Codeblöcke sind balanciert. Keine Datei überschreitet 500 Zeilen (Maximum: `hooks-daten.md` mit 413).
## Befunde
| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag |
|---|---|---|---|---|
| 1 | `reference/openapi.md:1-5` | PLATZHALTER | Datei hat nur 5 Zeilen, kein `description`-Frontmatter, Inhalt nur „Stand: Platzhalter“. | `npm run sync:openapi` ausführen oder Seite bis dahin aus der Sidebar nehmen. |
| 2 | `reference/hook-kontexte.md:63-69` | PLATZHALTER | Abschnitt „Fehlende oder veraltete Einträge melden“ mit „Die Hülle nannte nur …“ ist Aufbau-Rückstand, kein Nutzer-Inhalt. | Abschnitt streichen; Rest als normale Einleitung („24 Pakete, Stand …“) formulieren. |
| 3 | `admin/ki-funktionen.md:91` | UI-TEXT | `open_collection_record` wird mit Anzeige „(Datensatz öffnen)“ zitiert, aber weder `de.json` (`admin.ai.tools.*`, 56 Schlüssel geprüft) noch `frontend/src/lib` kennen „Datensatz öffnen“. | Label im Code ergänzen oder Doku auf Tool-Namen zurückstufen wie bei `toggle_sidebar`/`drill_navigate`. |
| 4 | `admin/aktionen.md:54` + `admin/ki-funktionen.md:23` | UI-TEXT | „Kurzfassung“ als UI-Name zitiert; `de.json` kennt für `outputSummary` aber „Zusammenfassung“, „Kurzfassung“ kommt in `de.json` und `frontend/src/lib` nicht vor. | Auf „Zusammenfassung“ korrigieren oder Code-Beleg nachliefern. |
| 5 | `admin/aktionen.md:56` | UI-TEXT | Fallback-Text „keine Ausgabefelder“ in Anführungszeichen, aber weder in `de.json` noch in `frontend/src/lib` gefunden. | Exakten Code-String übernehmen oder als Beschreibung (ohne Anführungszeichen) formulieren. |
| 6 | `admin/benutzer-rechte.md:16` | UI-TEXT | „60-Sekunden-Countdown“ fett als UI-Name; Dauer 60 s stimmt (`SessionTimeoutWarning.svelte:18` `COUNTDOWN_SECONDS = 60`), aber die Zeichenkette steht nicht in `de.json`. | Fettung entfernen, beschreibend formulieren („… warnt dich 60 Sekunden vorher …“). |
| 7 | `reference/tastatur-kurzbefehle.md:39` + `admin/ki-funktionen.md:99-101` | MD-FEHLER | Gemischte Anführungszeichen: „Eintrag speichern", „Theme wechseln", „Sprache wechseln", „UI erklären" u. a. schließen mit `"` statt `"`. | Durchgehend deutsche Zeichen („…") verwenden. |
| 8 | 9 Dateien (s. Liste unten) | MD-FEHLER | Ungenutzte Starlight-Importe (nie als Komponente verwendet). | Importzeilen bereinigen. |
| 9 | `admin/benutzer-rechte.md:57` | STIL | „Platzhalter-Beispiel: `pages, media`“ — inhaltsleeres Beispiel in einer Handseite. | Reales Beispiel aus der Projekt-Meta oder streichen. |
| 10 | `reference/tastatur-kurzbefehle.md:8` | STIL | „Du musst die Maus nicht anfassen“ — flapsig, passt nicht zum sachlichen Ton aus AGENTS §1. | Streichen oder sachlich („Alle Funktionen sind per Tastatur erreichbar“). |
| 11 | `admin/ki-funktionen.md:87-101` | STRUKTUR | Eine Tabelle mit 62 Werkzeugen ist als Nachschlagewerk kaum lesbar. | Pro Gruppe eine eigene kleine Tabelle unter Zwischenüberschriften; Einleitungssatz „Labels wörtlich aus `de.json`“ einschränken (6 Tools haben dort keinen Eintrag: `open_collection_record`, `toggle_sidebar`, `open_field_search`, `drill_navigate`, `get_collection_records`, `get_collection_schema`). |
| 12 | `admin/customizing.md:23-30` ↔ `admin/eintrags-editor.md:29-43` ↔ `projekt/felder-widgets.md` | STRUKTUR | Widget-Liste steht an drei Stellen (zwei Widget-Tabellen im Admin plus Feldtypen im Projekt). | Eine kanonische Tabelle (Projekt-Seite), Admin-Seiten verlinken nur. |
| 13 | `admin/ansichten-listen.md:69-73` + `admin/eintrags-editor.md:77-92` ↔ `reference/tastatur-kurzbefehle.md` | STRUKTUR | Tastaturkürzel doppelt gepflegt (Listen-/Editor-Seiten und Referenz). | Auf den Referenz-Seiten nur die seitenrelevanten Kürzel behalten, Rest verlinken. |
| 14 | `admin/*` → `anwender/*` | STRUKTUR | Keine Admin-Seite verlinkt die Anwender-Anleitungen (nur `konzept.md` erwähnt den Bereich). | Je Seite einen Satz mit Link auf das passende Anwender-Pendant (z. B. Editor → `anwender/eintrag-bearbeiten/`). |
| 15 | `admin/ki-funktionen.md:30` | STARLIGHT | Dichte Kennzahlen-Prosa („grün < 40 %, gelb < 70 % …“) als Fließtext. | Als Tabelle (Schwelle → Farbe) oder `Badge`-Legende darstellen. |
| 16 | `admin/konzept.md:1-36` | STRUKTUR | Nur 36 Zeilen, reiner Hub ohne eigenen Inhalt — für die Zielgruppe (Admin einrichten/anpassen) ohne Mehrwert über die Links hinaus. | Entweder ausbauen (Betriebsmodell: SPA, Mock, Reverse Proxy in 2–3 Sätzen) oder mit `setup.md` zusammenführen. |
| 17 | `admin/aktionen.md:45` | PRUEFEN | Route `POST /api/v1/<namespace>/_actions/<name>` nicht gegen `action_handler.go` geprüft. | Pfad und `?method=`-Parameter am Code verifizieren. |
| 18 | `admin/benutzer-rechte.md:25` | PRUEFEN | „Passwort (min. 6 Zeichen, doppelt bestätigt)“ nicht gegen `UserTab`/`UserDetailDrawer` geprüft. | Mindestlänge und Doppelbestätigung am Code belegen. |
| 19 | `reference/token-koepfe.md:29` | PRUEFEN | „Groß-/Kleinschreibung egal“ beim `Token`-Header nicht gegen `permission.go`/Header-Auswertung geprüft. | Am Code belegen oder streichen. |
| 20 | `admin/ki-funktionen.md:60-63` | PRUEFEN | STT-Details (Proxy-Modell `large-v3-turbo`, 3 s Stille, Schnipsel < ~1 KB) nur gegen `system.config.json` (Endpunkt `/api/ai/transcribe` stimmt) geprüft, nicht gegen `aiVoiceInput.ts` und `ai-proxy.config.json`. | Modellnamen und Schwellen am Code belegen. |
| 21 | `admin/setup.md:39-43` | PRUEFEN | Ports (3000/8080) und Profile (`tibi`/`tibi-dev`) nur gegen `Makefile` (Targets existieren) geprüft, nicht gegen `docker-compose-local.yml`/`.env`. | Ports und Profilnamen an Compose-Datei belegen. |
Ungenutzte Importe zu Nr. 8: `aktionen.md` (`Card`, `CardGrid`, `FileTree`), `ansichten-listen.md` (`Steps`, `Card`, `CardGrid`), `benutzer-rechte.md` (`Card`, `CardGrid`, `FileTree`), `customizing.md` (`Steps`, `Card`, `CardGrid`, `Badge`, `FileTree`), `eintrags-editor.md` (`Card`, `CardGrid`, `Badge`), `exporte.md` (`Tabs`, `TabItem`, `Card`, `CardGrid`, `Badge`), `ki-funktionen.md` (`Card`, `CardGrid`, `Badge`, `FileTree`), `medien.md` (`Aside`, `Card`, `CardGrid`, `Badge`), `setup.md` (`Card`, `CardGrid`, `Badge`, `FileTree`).
## Fehlende Screenshots je Admin-Seite
Alle 9 Handseiten außer `konzept.md` enthalten einen `Screenshot-Platzhalter (T-SHOTS)`; keine Seite hat bisher ein Bild unter `src/assets/`:
- `aktionen.md:29` — Action-Ansicht mit Methoden-Reitern, Eingabeformular und Ausführen-Knopf.
- `ansichten-listen.md:103` — Listenansicht mit Suchfeld, Filter-Popover und Paginierung.
- `benutzer-rechte.md:103` — Hub mit Benutzerliste und Detail-Drawer inkl. Rollen-Badge und Chips.
- `customizing.md:87` — Angepasste Listenansicht mit Spaltenwahl und eigenem Export-Reiter.
- `eintrags-editor.md:103` — Editor mit Formular, Seitenleiste und Übersetzungsleiste.
- `exporte.md:83` — Export-Dialog mit Formatwahl und Spaltenliste.
- `ki-funktionen.md:132` — Geöffneter KI-Chat mit Werkzeugstatus und Mikro-Knopf.
- `medien.md:81` — Medienraster mit Warteschlange und Bildeditor-Dialog.
- `setup.md:83` — Frisch gestarteter Admin mit Projektliste nach Login.
## Unsichere Punkte
- Nr. 17–21 oben (mit `PRUEFEN` markiert): jeweils Doku-Zitat gegen noch nicht gelesene Code-Stelle prüfen.
- Tastatur-Seite Zeile 57–61: Die Behauptung, die Overlay-Zeile `u` habe „keinen passenden Text in der Sprachdatei (Schlüssel `toggleUsers` fehlt) und keinen eigenen Handler“, ist plausibel, wurde aber nicht gegen `shortcuts.ts`/`KeyboardShortcuts.svelte` verifiziert.
- `fehlercodes.md` und `hooks-*.md` zitieren Fehler-Strings mit Datei- und Zeilenangaben aus `tibi-server`; stichprobenhaft bestätigt (`reponse.header`-Tippfehler in `context_response.go:29`, Legacy-Default in `http_status.go`, 16 Schema-Dateien), aber nicht jede einzelne Zeilennummer nachgeprüft — Zeilenangaben driften bei Code-Änderungen schnell.
- Positiv: keine `man`-Form gefunden, Umlaute durchgehend korrekt, alle Frontmatter (außer `openapi.md`) mit Titel und Beschreibung, keine toten internen Links.
+58
View File
@@ -0,0 +1,58 @@
# Review: Anwender-Doku, Index und ADRs
- Umfang: `src/content/docs/anwender/*.md` (11 Dateien), `src/content/docs/adr/*.md` (4 Dateien), `src/content/docs/index.mdx`.
- Datum: 2026-10-16. Gegenprüft mit `tibi-admin-nova` Commit `2b091d89` (existiert) und `frontend/src/lib/i18n/locales/de.json`.
- Positiv vorweg: alle 23 internen Links der Anwender-Seiten und alle 6 Karten-Links in `index.mdx` lösen auf existierende Seiten auf. Alle 30 Bilder sind je genau einmal referenziert, alle ≤ 200 KB, alle mit Alt-Text. Keine Babysprache („keine Angst" u. Ä.) gefunden; Du-Form durchgehend eingehalten (eine Ausnahme, siehe #14).
## Befund-Tabelle
| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag |
|---|-------------|-----------|---------------|-----------|
| 1 | orientierung.md:20 | MD-FEHLER | Alt-Text enthält Tippfehler „Brotkrumen"; UI-Begriff lautet „Navigationspfad" (`drawer.breadcrumb`, de.json:96). | Alt-Text: „Projektübersicht der Corporate Website mit Kopf, Navigationspfad und Sammlungen". |
| 2 | ki-nutzen.md:105 | MD-FEHLER | Redaktionelle Produktionsnotiz („KI-Antworten … simuliert … lief ohne sichtbares Banner durch") steht als Fließtext im Lesebereich. | Absatz entfernen oder in HTML-Kommentar wandern lassen; simulierte Stellen ersatzweise als Aside „Beispiel" kennzeichnen. |
| 3 | ki-nutzen.md:45-49 vs. :105 | FEHLER-INHALT | Schritte beschreiben Banner-Ablauf („Kontext wird zusammengefasst…" → „Kontext zusammengefasst"), Fußnote gibt zu, dass der Ablauf „ohne sichtbares Banner durchlief" und „Statusanzeigen simuliert" sind — das widerspricht dem „Geprüft an"-Vermerk. Strings selbst belegt (de.json:1028-1029). | Echte Screenshots aus Mock-Projekt aufnehmen; bis dahin Ablauf als „in der Regel" formulieren. |
| 4 | orientierung.md:58-71, hilfe.md:31 | UI-TEXT | Bereich heißt durchgehend „Schnellsuche"; UI-Name ist „Befehlspalette" (de.json:1207), Platzhalter „Befehl eingeben…" (de.json:1154). „Schnellsuche" kommt im Frontend-Code nirgends vor. | Überschrift und alle Erwähnungen in „Befehlspalette" umbenennen; „öffnet mit /" (CommandPalette.svelte:886) behalten. |
| 5 | medien.md:77 | UI-TEXT | „Bild auf Breite×Höhe verkleinert" setzt Wort-Platzhalter; Locale: „Bild auf {width}×{height} verkleinert" (de.json:79) bzw. „{count} Bilder auf {maxWidth}×{maxHeight} verkleinert" (de.json:534). | Konkretes Beispiel nennen, z. B. „Bild auf 1600×1200 verkleinert". |
| 6 | seiten-bauen.md:27 | UI-TEXT | „verfügst du über Lese-Recht" paraphrasiert; UI-Begriff ist „Nur-Lese-Modus" (de.json:1368) mit Hinweis „Du hast keine Berechtigung, diesen Eintrag zu bearbeiten." (de.json:1369). | „Nur-Lese-Modus" zitieren. |
| 7 | index.mdx:6 | TON | Tagline „wie man damit baut" nutzt man-Form (AGENTS §1 verlangt Du-Form). | „hier steht, wie du damit baust". |
| 8 | exportieren.md:24-34 | STARLIGHT | Formatwahl (CSV/XLSX/JSON) plus Array-Behandlung als Steps-Liste führt zu Fehlklicks ohne Vergleich. | `<Tabs>` mit je einem Tab pro Format (inkl. Aside-Hinweis aus :37-43 im JSON-Tab). |
| 9 | ki-nutzen.md:58-75 | STARLIGHT | Zwei aufeinanderfolgende `<Steps>`-Blöcke (Spracheingabe vs. Vorlesen) zum selben Thema. | `<Tabs>` „Eingabe" / „Ausgabe" statt zweier Steps-Blöcke. |
| 10 | seiten-bauen.md:89-109 | STARLIGHT | Zwei Viewport-Bilder plus Steps ohne Zuordnung Preset ↔ Bild. | `<Tabs>` Desktop (1280) / Tablet (768) / Mobil (375) mit je Bild; Werte belegt (PagebuilderViewportControl.svelte:22-29). |
| 11 | hilfe.md:10-73 | STRUKTUR | Doppelungen: Anmeldung (vgl. anmelden.md:27-41), Speichern blockiert (vgl. eintrag-bearbeiten.md:68-84), Bild fehlt (vgl. medien.md). | hilfe.md auf Verweisliste kürzen („Wenn X, siehe Y Schritt Z") statt Voll-Anleitungen zu wiederholen. |
| 12 | div. (anmelden:71, eintrag:86, lesen:101, orientierung:86, medien:93, ki:101 vs. benutzer-teams:66) | STRUKTUR | Sechs Seiten schließen mit identischem Satz und Linklabel [Mehr Details], benutzer-teams.md:66 nennt dasselbe Ziel [Admin-Konzept]. | Ein Label für `/admin/konzept/` festlegen (Vorschlag: „Admin-Konzept"). |
| 13 | hilfe.md (komplett), sichern.md:49-61, medien.md:77-79, eintrag-bearbeiten.md:40-43, lesen-suchen-filtern.md:75-84, ki-nutzen.md:27-39 | STRUKTUR | Beschriebene Schritte ohne Screenshot: hilfe.md (0 Bilder bei 5 Fällen), Wiederherstellungs-Dialog, Upload-Warteschlange/KI-Beschreibung, Durchsuchen/Auswählen-Fenster, Blättern-Fußzeile, Nova-Werkzeugliste. | Je Stelle einen Shot aus Mock-Projekt `corporate` aufnehmen (AGENTS §3). |
| 14 | (alle Anwender-Seiten) | LUECKE | Verlauf/Audit-Restore im Eintrag fehlt völlig. Beleg: EntryView.svelte:41-43,212-223 (AuditHistoryPanel, AuditRestoreDialog, AuditSidebarHistory); Locale `audit.history.button` „Verlauf" (de.json:1600), `audit.restore.*` (de.json:1615-1628). | Neue Seite „Verlauf ansehen und ältere Stände übernehmen". |
| 15 | (alle Anwender-Seiten) | LUECKE | Massenbearbeitung fehlt. Beleg: CollectionView.svelte:43,258-280 (BulkEditPanel); Locale `bulk.*` (de.json:1464-1540); Befehl „Massenbearbeitung" (de.json:1181). | Neue Seite „Mehrere Einträge gleichzeitig ändern oder löschen". |
| 16 | (alle Anwender-Seiten) | LUECKE | Aktionen fehlen. Beleg: ActionView.svelte; AdminLayout.svelte:114; Locale `actions.*` mit „Ausführen" (de.json:170-213). | Neue Seite „Aktionen starten und Ergebnisse prüfen". |
| 17 | orientierung.md:58-74 | LUECKE | Befehlspalette nur als Sprungziel beschrieben; Befehle (Filter zurücksetzen, Ansicht umschalten, Sprache, siehe de.json:1153-1224) und Tastenkürzel fehlen. | Neue Seite „Befehlspalette und Tastenkürzel" (öffnet mit `/`, CommandPalette.svelte:886). |
| 18 | anmelden.md:55-65 | LUECKE | Nur harter Auto-Logout beschrieben; vorgeschalteter Warn-Dialog „Sitzung läuft ab" mit „Angemeldet bleiben"/„Jetzt abmelden" fehlt. Beleg: SessionTimeoutWarning.svelte:100-151; de.json:1439-1443. | Schritt „Warnung → Angemeldet bleiben klicken" in „Automatisches Sitzungsende" ergänzen. |
| 19 | sichern.md:10-47 | LUECKE | Nur Ansehen beschrieben; Erstellen fehlt, Backup fehlt ganz. Beleg: SnapshotView.svelte:756 (`btnTrigger` „Snapshot erstellen"); App.svelte:96 (backup-view), BackupView.svelte; Locale `backup.*` (de.json:217-285). | Seite erweitern oder neue Seite „Snapshot erstellen und Backup herunterladen". |
| 20 | exportieren.md:24-43 | LUECKE | Eigene (vordefinierte) Exporte unerwähnt. Beleg: ExportDialog.svelte:103-106 (customExports aus `collection.meta.exports`); Locale `export.custom*` (de.json:1564-1569). | Abschnitt „Vordefinierte Exporte nutzen" ergänzen. |
| 21 | benutzer-teams.md:62-64 | LUECKE | Stellvertretung erwähnt Rückkehr nicht. Beleg: `impersonationBanner.stop` „Zurück zur Administration" (de.json:898). | Satz ergänzen: „Der Support kehrt über ‚Zurück zur Administration' zurück." |
| 22 | adr/0000-vorlage.md:6-11 | ADR | Vorlage kennt kein Status-Feld; ADR 0001-0003 haben entsprechend keinen Status („angenommen"/„umgesetzt"). | Vorlage um `- **Status:**` ergänzen, bestehende ADRs nachtragen. |
| 23 | anwender/*.md (11× Fußzeile) | ADR | „Geprüft an 2b091d89 (tibi-admin-nova)" weicht von ADR-Norm „Verifiziert am \<Commit> \<Datum>" (0002:8, 0003:8) und allen `server/*.md` (z. B. konfiguration.md:140) ab — Datum fehlt. | Fußzeile angleichen: „Verifiziert am 2b091d89 2026-10-16 (tibi-admin-nova)". |
| 24 | (keine Datei) | ADR | Fehlende ADRs: (a) Bereichsarchitektur der Doku (7 Bereiche aus AGENTS §2 nirgends begründet); (b) Sync-Regel (AGENTS §4: `npm run sync`, Artefakte committen — kein ADR). Screenshot-Regel steht in 0003:8. | Zwei kurze ADRs 0004 (Bereiche) und 0005 (Sync) anlegen. |
| 25 | adr/0003-selbstlaeufer.md:8 | ADR | „57 Seiten, Stand 2026-10-16" ist überholt: aktuell 61 md/mdx-Dateien unter `src/content/docs`. | Zahl aktualisieren oder Zählung streichen. |
## Bild-Abgleich
- Referenziert (je genau einmal, alle mit Alt-Text, alle ≤ 78 KB): anmelden-abmelden, anmelden-login, benutzer-profil, benutzer-teams, eintrag-formular, eintrag-gespeichert, eintrag-neu, export-dialog, export-fertig, ki-chat, ki-stimme, ki-zusammenfassen, lesen-filter, lesen-karten, lesen-liste, lesen-suche, medien-editor, medien-raster, medien-upload, orientierung-projektwechsel, orientierung-schnellsuche, orientierung-start, seiten-bloecke, seiten-overlay, seiten-pagebuilder, seiten-viewport-mobil, seiten-viewport-tablet, sichern-details, sichern-statistik, sichern-uebersicht (alle `.webp` unter `src/assets/anwender/`).
- Verwaist: keine.
- Doppelt referenziert: keine.
- Keine Referenz von außerhalb `anwender/` (geprüft per grep über alle docs).
## Fehlende Anwender-Seiten
1. „Verlauf ansehen und ältere Stände übernehmen" — Beleg: EntryView.svelte:41-43,212-223; de.json:1597-1628.
2. „Mehrere Einträge gleichzeitig ändern oder löschen" — Beleg: CollectionView.svelte:43,258-280 (BulkEditPanel); de.json:1464-1540.
3. „Aktionen starten und Ergebnisse prüfen" — Beleg: ActionView.svelte; AdminLayout.svelte:114; de.json:170-213.
4. „Befehlspalette und Tastenkürzel" — Beleg: CommandPalette.svelte:882-894; de.json:1153-1224,1250-1270.
5. „Snapshot erstellen und Backup herunterladen" (oder sichern.md erweitern) — Beleg: SnapshotView.svelte:756; App.svelte:96; BackupView.svelte; de.json:217-386.
## Unsichere Punkte
- eintrag-bearbeiten.md:77 „Pflichtfelder … mit Stern markiert": Stern-Markierung im Frontend-Code nicht gefunden (Validierungs-Strings „Pflichtfeld"/„Dieses Feld ist erforderlich" belegt, de.json:1323,1409). Bitte am UI verifizieren.
- anmelden.md:40 „höchstens drei Versuche": kein Limit in LoginPage.svelte gefunden; Backend nicht geprüft. Entweder Backend-Beleg nachliefern oder als unverbindliche Empfehlung umformulieren.
- sichern.md:51-64: Ob Anwender ohne Admin-Rolle den Button „Wiederherstellung starten" überhaupt sehen (Berechtigungs-Gate), ist ungeprüft. Falls nein, ist die Seite für Anwender irreführend.
- ki-nutzen.md:49 „Token-Status unter Kontext-Auslastung": beide Strings belegt (AiChat.svelte:2329,2352), Schachtelung am UI nicht verifiziert.
- Bindestrich in „Sitzung abgelaufen – bitte neu anmelden" (anmelden.md:57) nur visuell mit Locale (de.json:1438) verglichen, nicht byte-geprüft.
+68
View File
@@ -0,0 +1,68 @@
# Review: Einstieg + Server
- Umfang: `src/content/docs/einstieg/*.md` (4 Dateien), `src/content/docs/server/*.md` (5 Dateien). Alle vollständig gelesen.
- Datum: 2026-10-16.
- Geprüft gegen: `AGENTS.md` §1, `tibi-server/internal/**` (Code), `tibi-svelte-starter` (Compose, Makefile, `api/`, `scripts/`, `.env`), `tibi-admin-nova/.../de.json` (nur Stichworte), Server-HEAD `68b42785`, Starter-HEAD `e3f92ebf`.
- Regel: Nur belegte Fehler stehen als `FEHLER-INHALT`; alles andere als `PRUEFEN` am Ende.
## Befundtabelle
| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag |
|---|---|---|---|---|
| 1 | konfiguration.md:21 | FEHLER-INHALT | „`bge-m3` → `EMBEDDING_BGE-M3_*`" ist falsch. `normalizeEnvKeyName` ersetzt `-` durch `_` und uppercaset, Beleg `tibi-server/internal/config/server.go:245-251,437-439`. Korrekt wäre `EMBEDDING_BGE_M3_*`. | Beispiel korrigieren zu `EMBEDDING_BGE_M3_*`; Regel umformulieren („Bindestrich wird zu Unterstrich“). |
| 2 | konfiguration.md:99-105 | FEHLER-INHALT | Gleicher Fehler im Beispielblock: 7× `EMBEDDING_BGE-M3_*` (`TYPE`, `MODELPATH`, `DIMENSIONS`, `DOCUMENTPREFIX`, `QUERYPREFIX`). Keine dieser Variablen greift. Beleg wie #1. | Alle Prefixe zu `EMBEDDING_BGE_M3_*` ändern. |
| 3 | betrieb.md:21 | FEHLER-INHALT | „`mongo` (MongoDB 7)“ — der Starter pinnt `image: gitbase.de/server/mongo:8` (`docker-compose-local.yml`, Service `mongo`). | Auf „MongoDB 8“ ändern. |
| 4 | schnittstellen.md:62 | FEHLER-INHALT | „Alle Antworten sind gzip-komprimiert“ — falsch absolut. Ausgenommen sind `.pdf/.mp4/.jpg/.jpeg/.png` und `/metrics`. Beleg `internal/controller/setup.go:151-154`. | „Alle JSON-Antworten … (ausgenommen Mediendateien und `/metrics`)“. |
| 5 | neues-projekt.md:68,77 | MD-FEHLER | `$CODING_TIBISERVER_URL` ist nirgends definiert: nicht in Starter-`.env`, nicht in der URL-Liste in schnellstart.md:51, in keinem Script. Nur `-tibiserver`-Host, inline gebaut in `scripts/reload-local-tibi.sh:10`. Befehle so nicht kopierbar. | Variable definieren (`.env` + schnellstart.md:51) oder Befehle auf dokumentierten Host umschreiben. |
| 6 | uebersicht.md:36 | MD-FEHLER | „Verifiziert am 68b42785“ ohne Backticks; alle 4 anderen Server-Seiten nutzen `` `68b42785` ``. | Backticks ergänzen. |
| 7 | server/betrieb.md:6, konfiguration.md:6, schnittstellen.md:6, sicherheit.md:6 | MD-FEHLER | Identische 8er-Importzeile (`Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree`), davon pro Seite 3–6 ungenutzt (z. B. betrieb: `Tabs/TabItem/Card/CardGrid/FileTree` ohne Verwendung; schnittstellen: `Aside/Steps/Card/CardGrid/Badge/FileTree` ohne Verwendung). Copy-Paste-Rest. | Je Seite nur importieren, was verwendet wird. |
| 8 | server/*.md:1-4 vs einstieg/*.md:1-4 | MD-FEHLER | Frontmatter inkonsistent: Server-Seiten mit einfachen Quotes (`title: '...'`), Einstieg ohne. | Eine Form wählen (ohne Quotes, wie einstieg). |
| 9 | uebersicht.md:8-14 | MD-FEHLER | Zwei Hinweis-Stile auf einer Seite: Blockquote (`> **Handseite.** …`) plus `:::note`. | Einen Stil wählen (Repo-Konvention: `<Aside>`). |
| 10 | konfiguration.md:41-43 | STIL | „Das README-Beispiel ist unvollständig und nennt …“ + „README lügt an zwei Stellen“ + rohes `<del>/<ins>`-HTML. „Lügt“ ist unsachlich, HTML-Tags sind kein Doku-Stilmittel. | Sachlich: „Das README-Beispiel ist veraltet (noch Go 1.23 statt `go 1.25.0`/`go1.25.7` laut `go.mod`).“ Version als `Badge` oder Code, kein `<del>/<ins>`. |
| 11 | neues-projekt.md:10 | STIL | Agenten-Meta im Nutzertext: „Stand: am Code geprüft, nicht aus Alt-Doku.“ Für Leser wertlos. | Streichen; Prüfnachweis gehört in Commit/Plan, nicht auf die Seite. |
| 12 | neues-projekt.md:53 | STIL | Belehrung an den Leser: „Keine Pfad-B-Schritte im lokalen Starter-Stack erfinden.“ | Streichen oder in Ergebnis-Satz umwandeln („Im lokalen Stack entfällt Pfad B.“). |
| 13 | uebersicht.md:8 | STIL | Maintainer-Meta („Wird vom Sync nie überschrieben (`keep`) …“) steht als erster Satz im Nutzertext. | In HTML-Kommentar oder ans Seitenende verschieben. |
| 14 | uebersicht.md:10, begriffe.md:8-18 | STIL | Benennung uneinheitlich: „**Tibi-server**“, „**Tibi-Server**“, „**Tibi-Admin**“, „**Tibi-Projekt**“ — AGENTS.md §0 verlangt `tibi-server` / `tibi-admin` (klein). | Durchgehend Kleinschreibung wie in was-ist-tibi.md:10-11. |
| 15 | einstieg/*.md vs server/*.md | STIL | Codezaun-Sprache uneinheitlich: Einstieg `sh`, Server `bash` (bei identischem Inhalt Shell). | Einheitlich `bash` (oder `sh`) wählen. |
| 16 | schnittstellen.md:53-57 | STIL | Recht-Spalte uneinheitlich: `project.reload`, `project.regenerate-search`, dann bloß „Projekt-Admin“ (Embedding-Status), dann `project.backup` / `project.snapshot`. | Überall Scope schreiben (Embedding-Status: welches Recht genau, Beleg `setup.go:390` prüfen). |
| 17 | schnellstart.md:91 | STIL | „nur wenn Server-Token vorhanden“ — vage Bedingung ohne Handlung. | Konkret: „… oder `X-Admin-Token` mit Scope `project.create`“ (falls belegbar, sonst streichen). |
| 18 | konfiguration.md:123 | STIL | Tippfehler „`namespace….)`“ (vier Punkte + Klammer). | „`namespace.…`“ bzw. Beispiel wie sicherheit.md:21. |
| 19 | uebersicht.md:20 | STIL | Card verspricht „inkl. Go-Version und Legacy-Default“ — `Legacy-Default` kommt in konfiguration.md nirgends vor (gemeint sind wohl die 201/204-Legacy-Codes aus schnittstellen.md:62). | Begriff klären oder streichen. |
| 20 | was-ist-tibi.md:30-35 | STARLIGHT | `Card` mit Markdown-Link im Body („[Loslegen](…)“) ist kein klickbares Karten-Link. | `LinkCard` mit `href` nutzen, Text ohne Markdown-Link. |
| 21 | uebersicht.md:19-33 | STARLIGHT | 5× `Card` + `[Lesen](…)`-Link statt Karten-Link; doppelte Information (Titel + Link-Text identisch). | Auf `LinkCard` (`link.href`, `link.description`) umstellen. |
| 22 | neues-projekt.md:12-23 | STARLIGHT | Setup-Checkliste als statischer `text`-Codeblock mit `[ ]` — nicht abhakbar, kein Fortschritt. | `Steps` + echte Task-List (`- [ ]` im Fließtext) oder `Steps`-Komponente pro Meilenstein. |
| 23 | neues-projekt.md:81-83 | STARLIGHT | Wichtiger Token-Hinweis als `:::caution` (Syntax im Repo sonst nirgends, siehe PRUEFEN P1). | `<Aside type="caution" title="…">` wie sicherheit.md:30. |
| 24 | schnellstart.md:8-10 | STARLIGHT | `:::danger` für die Kern-Regel (Repo-Einzelfall). | `<Aside type="danger" title="Kern-Regel aus dem Starter">`. |
| 25 | konfiguration.md:46-77, schnittstellen.md:21-60 | STARLIGHT | `Tabs` ohne `syncKey` — gewählte Tabs (z. B. „Minimal-Beispiel“/„Lokaler Dial“) gehen beim Seitenwechsel verloren. | `syncKey` ergänzen (z. B. `syncKey="serverblick"`). |
| 26 | begriffe.md:6-19 | STARLIGHT | Reine Tabelle ohne einzige Heading: kein `tableOfContents`, keine Sprungmarken, kein Aside, keine Weiterführung. | Je Oberbegriff (`Namespace`, `Collection`, …) als `##`-Abschnitt oder Glossar-`CardGrid`; Tabelle als Kurzindex oben behalten. |
| 27 | schnittstellen.md:101 | STRUKTUR | „Wie frage ich Daten ab?“ verlinkt auf `/einstieg/begriffe/` statt auf die Abfrage-Seite. | Auf `/projekt/abfragen-lesen/` zeigen; begriffe-Zeile streichen oder umbenennen. |
| 28 | was-ist-tibi.md:27-36 | STRUKTUR | „Wo geht es weiter?“ nennt nur Schnellstart + Begriffe; „Neues Projekt“ (4. Sidebar-Eintrag) fehlt, obwohl schnellstart.md:94 darauf verweist. | Dritte Karte „Neues Projekt“ ergänzen. |
| 29 | schnellstart.md:85-92, neues-projekt.md:81-83 | STRUKTUR | Token-Kopf-Wissen steht doppelt (Tabelle vs. Caution) plus drittes Mal in `reference/token-koepfe.md`. Drei Wahrheiten zu einer Tatsache. | Kurzfassung + ein Verweis auf `reference/token-koepfe.md` als Single Source. |
| 30 | schnellstart.md:73, neues-projekt.md:105-115 | STRUKTUR | Nach „Abnahme“ endet der Pfad im Leeren: kein Verweis in Admin-/Anwender-Doku (erste Anmeldung, erste Inhalte). | „Nächster Schritt“-Box mit Links auf `admin/`- und `anwender/`-Seiten. |
| 31 | betrieb.md:62-70 | LUECKE | Backup/Snapshot nur als „Fortschritts-Stream“ erwähnt; kein Wort zu Wiederherstellung, Retention, `prune`, obwohl Endpunkte existieren (`setup.go:416-491`). | Abschnitt „Sichern und Wiederherstellen“ mit `backup`-, `snapshots`- und `prune`-Befehlen. |
| 32 | betrieb.md | LUECKE | `/api/v1/admin/shutdown` (`server.shutdown`) kommt nur als Tabellenzelle in schnittstellen.md:32 vor; Betreiber-Seite ohne Stop-/Neustart-Prozedur. | Störungs-/Wartungsabschnitt um Shutdown + Audit-Spur (`setup.go:772-798`) ergänzen. |
| 33 | konfiguration.md:24-43 | LUECKE | Beispielblöcke nur für DB/API/Mail + LLM/Embedding; `audit`, `ratelimit`, `hook`, `mcp` nur als Tabellenzeilen ohne YAML-Form. | Je ein Minimal-YAML pro Bereich (Defaults aus `server.go` sind belegt). |
| 34 | begriffe.md | LUECKE | Kein Eintrag zu Token-Arten (PAT/JWT/Admin-Token) und Scope-Syntax, obwohl Einstieg + Server ständig darauf verweisen. | 2 Zeilen + Verweis auf `reference/token-koepfe.md` und `server/sicherheit/`. |
| 35 | einstieg/*.md | LUECKE | Mock-Modus wird nur in begriffe.md:19 definiert; schnellstart.md erwähnt `MOCK` nirgends, obwohl Starter `start:mock` (`MOCK=1`) kennt. | Schnellstart-Schritt „Starten“ um Mock-Hinweis ergänzen oder bewusst ausklammern. |
## Starlight-Potenzial (pro Seite)
- was-ist-tibi.md: `Card` → `LinkCard` (#20); ASCII-Diagramm (Z. 15-23) als `Steps`- oder nummerierte Liste mit je einem Satz Wirkung pro Pfeil.
- schnellstart.md: `:::danger` → `<Aside type="danger">` (#24); Schritt 1-6 in `<Steps>` statt nummerierter Headings (konsistent zu betrieb.md:38).
- neues-projekt.md: Checkliste → `Steps`/Task-List (#22); `:::caution` → `<Aside>` (#23); `FileTree` um Stamm (`./`, `docker-compose-local.yml`, `.env`) erweitern.
- begriffe.md: Glossar-Struktur mit Headings + `CardGrid`-Kurzindex (#26); `tableOfContents` greift dann automatisch.
- uebersicht.md: `Card` → `LinkCard` (#21); Blockquote + `:::note` → ein `<Aside type="note">` (#9).
- konfiguration.md: `Tabs` mit `syncKey` (#25); `<del>/<ins>` → `Badge` für `go 1.25.0` (#10); Beispielblöcke (#33).
- betrieb.md: ungenutzte Imports entfernen (#7); Störungstabelle um Shutdown-Zeile erweitern (#32); `Badge`-Profilzeile (Z. 14) ans Seitenende in „Voraussetzungen“ wiederholen ist unnötig — streichen.
- sicherheit.md: ungenutzte Imports entfernen (#7); Token-Tabelle um PAT-Beispiel (`tibi_pat_…`) als `bash`-Block ergänzen; Checkliste (`Steps`) ist bereits Musterbeispiel — behalten.
- schnittstellen.md: `Tabs` mit `syncKey` (#25); API-Baum (Z. 10-17) als `FileTree` statt `text`-Block prüfen; Linkfix #27.
## Unsichere Punkte
- P1. `:::caution title="…"`, `:::danger title="…"`, `:::note title="…"` (neues-projekt.md:81, schnellstart.md:8, uebersicht.md:12): Titel-Attribut ohne Klammern ist keine Standard-Starlight-Syntax (`[Titel]` wäre sie); Repo-Konvention ist `<Aside>`. Build-Rendering nicht geprüft — bitte Rendern verifizieren oder auf `<Aside>` umstellen.
- P2. schnellstart.md:73 („Anmeldung im Admin lokal: `admin` / `admin`“): im geprüften Server-Code keine Seed-Stelle gefunden (nur massenhaft `GetLoginToken("admin","admin")` in Tests). Vermutlich Starter-/Admin-Seed — bitte belegen oder als Starter-Fakt kennzeichnen.
- P3. Doku-Domäne `*.code.testversion.online` vs. Compose-Label `online.testversion.code.subdomain=…`: Abbildungsregel steht nicht im geprüften Repo-Ausschnitt (nur ein auskommentierter `Host(...code.testversion.online)` in `docker-compose-local.yml`). Bitte Traefik-Regel belegen.
- P4. betrieb.md:72-74 („Jobs laufen unter der Projekt-UID“, „Quotas und Nutzung landen in der LLM-Nutzungsablage“): Cron-Registrierung belegt (`models/api.go:268`, `models/job.go:4`, `JOB_CONTEXT` in `models/function.go:276`), suexec-Pfad für Jobs und „Nutzungsablage“ nicht explizit nachgewiesen.
- P5. sicherheit.md:42 („Globales CORS ist auskommentiert“): keine Default-`config.yml` im geprüften Stand gefunden; unbelegt, ob das für alle Deployments gilt.
- P6. neues-projekt.md:57/71 (`project not found`, `GET /api/v1/project`): String existiert in `internal/filecleanup/cleanup.go:70`, System-Projekt-CRUD via `Project.Middleware` (`models/project.go:206`) ist belegt; ob genau dieser String bei fehlender Registrierung erscheint, nicht end-to-end nachgewiesen.
- P7. neues-projekt.md:61-64 (Login via `$CODING_TIBIADMIN_URL/api/login`): Admin-Frontend-Proxy-Pfad, nicht gegen `tibi-admin-nova`-Code geprüft (Server-Route ist `POST /api/v1/login`, `setup.go:728`).
+88
View File
@@ -0,0 +1,88 @@
# Review 05: Projekt-Seiten
- Umfang: `src/content/docs/projekt/*.md`, 15 Dateien, 2999 Zeilen (Stand 2026-10-16).
- Geprüft gegen: `AGENTS.md` §1, `tibi-svelte-starter` (`api/collections/*.yml`, `api/config.yml`, `api/hooks/*`, `frontend/src/App.svelte`), `tibi-server` (`internal/controller/collection_get.go`, `collection_count.go`, `setup.go:514-536`, `internal/mcp/*`, `internal/models/scope_enforce.go`, `internal/config/admin_token.go:115`), `tibi-types/schemas/config/*.schema.json`.
- Methode: jede Datei vollständig gelesen; Code-Behauptungen per grep am Quellcode verifiziert. Zählung: MD-FEHLER 6, FEHLER-INHALT 5 (+ 7 PRUEFEN), STIL 9, STARLIGHT 15 (1–2 pro Seite), STRUKTUR 7, LUECKE 8, KOPFZEILE 15 (eine je Seite).
## Befund-Tabelle
| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag |
|---|---|---|---|---|
| 1 | mcp-nutzen.md:61-90 | FEHLER-INHALT | Scope-Tabelle nennt `.get` (`namespace.<ns>.<col>.get`), Detail-Abschnitte (Z102ff.) nennen `.read`. Code: `MethodToAction("GET")` → `"read"` (`admin_token.go:115`). | Tabelle auf `.read`/`.create`/`.update`/`.delete` umstellen (fünf Zeilen 63-67, 71). |
| 2 | abfragen-lesen.md:99 | FEHLER-INHALT | „`…/comment/count` landet auf der Einzel-Route (`:id = "count"`)“. Code: `_count` (setup.go:514) ist statisch vor `:id` (:536) registriert, statisches Segment gewinnt in Gin. | Satz streichen oder umkehren: `/comment/count` zählt; nur `?facet=` an der Liste wird ignoriert (in `collection_get.go` keine Facet-Behandlung, verifiziert). |
| 3 | hooks-schreiben.md:85 | FEHLER-INHALT | „Ohne `return` läuft der Hook ins Leere — eingeloggte Nutzer sehen dann alles.“ Hook filtert nur Anonyme (`filter_public.js`); ohne `return` sehen **anonyme** alles. | „eingeloggte“ → „anonyme“; Folge (Entwürfe öffentlich) nennen. |
| 4 | sammlungen-anlegen.md:87 | FEHLER-INHALT | Gruppen-Zeile: „`content`, `content`, `community`“. Starter: `content` (content, navigation, medialib, tag), `community` (comment), `system` (ssr). Doppelung + `system` fehlt. | „`content`, `community`, `system` (`ssr.yml`)“; Beispiel-Spalte bereinigen. |
| 5 | abfragen-lesen.md:34-35 | STIL | Aside mit „Achtung, Tippfehler im Code“ ist inhaltlich korrekt (`collection_get.go:32` schreibt wörtlich `Content-Range:`), Ton („Tippfehler“) grenzt an Binsen. | Sachlich lassen, „Tippfehler im Code“ → „Abweichung im Code (mit Doppelpunkt)“; kein Handlungsbedarf sonst. |
| 6 | dateien-bilder.md:10, hooks-schreiben.md:10, navigation-i18n.md:9, suche.md:9 | MD-FEHLER | „Suche-Begriffe“ (4× mit Bindestrich) vs. „Suchbegriffe“ (audit-backup:10, deploy:10, jobs-actions:10); 8 Seiten (abfragen, felder, rechte, sammlungen, ssr, pagebuilder, llm, mcp) haben gar keine Suchbegriff-Zeile. | Einheitlich „Suchbegriffe:“ in allen 15 Seiten oder Zeile überall streichen (Entscheid dokumentieren). |
| 7 | navigation-i18n.md:75-76 vs. felder-widgets.md:19 | STIL | Pfad-Muster doppelt, notationell verschieden: `^/[a-z0-9-/]*$` vs. `^\/[a-z0-9\-\/]*$` (äquivalent; Starter nutzt in `content.yml` die escaped Form, in `meta.agent.instructions` die kurze). | Eine Schreibweise wählen (kurze), an beiden Stellen + ssr-website:32 angleichen. |
| 8 | audit-backup.md:50-58 | STRUKTUR | 4 Admin-UI-Absätze (Verlaufspanel, Diff-Ansicht, Wiederherstellen-Dialog, Seitenleiste) sind Prosa-Wände über **Admin**-Verhalten in einer Projekt-Seite; gehört nach `admin/` (Konzept/Editor). | Auf 1 Absatz + Verweis kürzen; Details nach `admin/eintrags-editor.md` oder `admin/konzept.md` verschieben. |
| 9 | mcp-nutzen.md:1-754 | STRUKTUR | 754 Zeilen (> 600er-Richtwert), 36 Werkzeug-Referenzen à Beispiel + Fehler. Seite ist de facto Referenz, kein Projekt-Leitfaden. | Werkzeug-Referenz (Z100-683) nach `reference/mcp-werkzeuge.md` auslagern; hier Übersicht + `agent_guide_get`-Pflege + REST-only-Tabelle behalten. |
| 10 | abfragen-lesen.md:124-129 vs. suche.md:44-49 | STRUKTUR | `qName`-Tabelle steht wortgleich in zwei Seiten (combined/fuzzy/semantic/default). | Tabelle nur in `suche.md` pflegen, in `abfragen-lesen.md` auf 2 Zeilen + Verweis kürzen. |
| 11 | rechte-tokens.md:90-123, dateien-bilder.md:46-50, navigation-i18n.md:43-47+82-88, ssr-website.md:64-68, abfragen-lesen.md:89-93 | STRUKTUR | `active:true`-Falle an 5 Stellen erklärt (teils wortgleich: „Vorfall 2026-10-05“ in dateien + navigation). Querverweise existieren, aber Wortlaut driftet (einmal „count 0“, einmal „Header/Footer leer“). | Kanonischen 3-Zeilen-Kasten in `rechte-tokens.md` definieren; andere Seiten nur Aside + Verweis. |
| 12 | pagebuilder-dev.md:183-247 | STRUKTUR | Editor-Overlay, Viewport-Steuerung, Übersichts-Overlay, BlueprintCard (65 Zeilen reines **Admin**-UI-Verhalten mit `de.json`-Schlüsseln) in einer Dev-Seite. | UI-Beschreibung nach `admin/eintrags-editor.md` verschieben oder verweisen; hier nur Registry-Vertrag + CSS-Transform + Lookup + Screenshot-Pipeline behalten. |
| 13 | jobs-actions.md:34, jobs-actions.md:20 | PRUEFEN | „Ohne `cron` läuft der Job nie“ + „Schema-Pflicht: nur `type` + `file`“ — gegen `job.schema.json` nicht verifiziert (Schema-Datei in diesem Lauf nicht gelesen). | Am Schema + Runner (`internal/models/api.go:270`) belegen oder als ungesichert kennzeichnen. |
| 14 | deploy.md:91 | PRUEFEN | „`POST /api/ssr?clear=1`, keiner nötig (`public.post: true`)“ — `ssr.yml` erlaubt `public.post: true` (Z17-22 verifiziert), aber ob `clear_cache`/`post_bind`-Pfad ohne Auth den Komplett-Wipe auslöst, ist nur aus Doku-Zitat übernommen. | Gegen `hooks/ssr/post_bind.js` + Server-Log belegen. |
| 15 | suche.md:21 | PRUEFEN | „`navigation.yml` und `medialib.yml` nutzen nur einen `default`-Index im Modus `regex`“ — `search`-Blöcke verifiziert (beide `default`/`regex`), aber „kein Textindex nötig“ ist eine Wertung ohne Beleg. | „kein Textindex nötig“ streichen oder begründen (regex braucht keinen `$text`-Index). |
| 16 | hooks-schreiben.md:111 | PRUEFEN | „Das ist die einzige Log-Hilfe im Starter.“ Absolut-Aussage, nur aus `lib/utils.js` abgeleitet. | Abschwächen („die Standard-Log-Hilfe“) oder Volltextsuche nach `console.log` im Starter belegen. |
| 17 | abfragen-lesen.md:105 | STIL | „Schnelle Schätzung statt exakter Zahl (nur **ohne** `filter`)“ — korrekt (`collection_count.go:145`), aber Klammer-Format inkonsistent zu anderen Tabellen. | Einheitlich: Bedingung in eigene Spalte oder Fußnote. |
| 18 | rechte-tokens.md:42 | STIL | „aber keinen Lese-Hook“ — `tag.yml` verifiziert (nur post/put/delete-`return`), Formulierung ok, aber Vorwärtsverweis auf `clear_cache.js` ohne Link. | Link auf `projekt/hooks-schreiben/` ergänzen. |
| 19 | llm-nutzen.md:89 | STIL | „Preise stehen nirgends im Code — erfinde keine.“ Imperativ an den Leser, Ton grenzwertig belehrend. | „Modellnamen aus `GET /llm/providers` übernehmen, keine erfinden.“ |
| 20 | sammlungen-anlegen.md:74 | STIL | „`uploadPath` setzen, auch wenn die Sammlung keine Dateien enthält“ — unbegründete Pflicht ohne Code-Beleg. | Begründung ergänzen (Server-Default/Fehlerbild Z159) oder zu Empfehlung abschwächen. |
| 21 | deploy.md:15, deploy.md:79 | STIL | Platzhalter `LIVE_URL=https://www` + `__PROJECT_NAME__` werden erklärt, aber das Beispiel ist keine gültige URL (Leser kopiert ggf.). | Kommentar `# TODO: echte Domain eintragen` direkt in den Block schreiben. |
| 22 | ssr-website.md:45-47 | STIL | `sort: "sort"` im Beispiel ohne Erklärung (Feld `sort` aus Starter vorausgesetzt, in `App.svelte:171` verifiziert). | Ein Satz: „`sort` ist ein Starter-Feld für die Reihenfolge.“ |
| 23 | hooks-schreiben.md:127 | STIL | „Weitere im Starter genutzte Zugriffe“ — Aufzählung mit 8 Gliedern in einer Zeile, schwer scannbar. | Als Tabelle oder Bullet-Liste mit je einem Halbsatz umbrechen. |
| 24 | felder-widgets.md:56-58 | STIL | 25 Enum-Werte als Fließtext-Code-Span; `pagebuilder`/`pageBuilder`-Doppelung nur in Klammern erklärt. | Als Tabelle (Widget → Wofür) oder `FileTree`-ähnliche Liste; Doppelung als `Aside note` mit Schema-Beleg. |
| 25 | audit-backup.md:96 | STIL | „Übernimm die Liste nicht blind“ — belehrender Ton (Binsen-Nähe), dazu Klammer-Schachtelung. | „Gleiche jeden Namen gegen `api/collections/*.yml` ab, sonst …“ |
| 26 | dateien-bilder.md:105 | STIL | „Passiert nicht von selbst“ als Lösungs-Spalte — flapsig, keine Handlungsanweisung. | „Kein Handlungsbedarf; Waisen per Dateisuche im Upload-Pfad prüfen.“ |
| 27 | navigation-i18n.md:66 | STIL | „Kollidiert auf `null` — kein ‚geht schon gut‘“ — umgangssprachlich, Anführungs-Floskel. | „Zweiter Datensatz ohne Schlüssel verletzt den Unique-Index (`null`/`lang`).“ |
| 28 | abfragen-lesen.md:143 | KOPFZEILE | „Verifiziert am e3f92eb 2026-10-14 (tibi-svelte-starter), am 68b42785 2026-10-15 (tibi-server, …).“ Format ok, Hash 7-stellig. | — |
| 29 | audit-backup.md:145 | KOPFZEILE | Vier Belege, Hashes 7-stellig, Daten 2026-10-13 bis 15. Doppel-Beleg gleiche Commit `2b091d89` zweimal. | Doppel-Beleg zusammenfassen. |
| 30 | dateien-bilder.md:109 | KOPFZEILE | Hash 8-stellig (`e3f92ebf`) — uneinheitlich zu 7-stelligen anderswo; nur Starter-Beleg trotz Server-Aussagen (filecleanup, Lookup-Regel). | Hash-Länge vereinheitlichen (7 oder 8 überall); Server-Beleg ergänzen. |
| 31 | deploy.md:131 | KOPFZEILE | Nur Starter-Beleg (`e3f92eb`), obwohl Reload-Endpunkte + Token-Tabelle Server-Verhalten beschreiben. | Server-Beleg (setup.go/reload-Docs) ergänzen. |
| 32 | felder-widgets.md:199 | KOPFZEILE | Drei Belege (Starter, tibi-types, Server), Hashes 7-stellig. Vorbildlich. | — |
| 33 | hooks-schreiben.md:234 | KOPFZEILE | Hashes 8-stellig (`e3f92ebf`, `4c55f824`) — uneinheitlich zu Z28/32. | Hash-Länge vereinheitlichen. |
| 34 | jobs-actions.md:144 | KOPFZEILE | Drei Belege, 7-stellig, mit Dateinamen (job-/action-schema, Test-Plan 40). Vorbildlich. | — |
| 35 | llm-nutzen.md:172 | KOPFZEILE | Ein Beleg, sehr lange Klammer (11 Dateien), Datum 2026-10-16 (jüngste Prüfung). Lesbarkeit leidet. | Dateiliste kürzen (nur Handler + Registry + Scope). |
| 36 | mcp-nutzen.md:754 | KOPFZEILE | Zwei Belege, Files namentlich — ok, aber längste Seite mit knappstem Beleg (keine Test-Pläne, keine Guards-Zeilen). | Guards-/Methoden-Beleg ergänzen. |
| 37 | navigation-i18n.md:119 | KOPFZEILE | Starter + Admin-Test-Pläne, 8-/7-stellig gemischt (`e3f92ebf`, `2b091d89`). | Hash-Länge vereinheitlichen. |
| 38 | pagebuilder-dev.md:248 | KOPFZEILE | Admin-Commit + Starter-Commit mit Komponentenliste. Vorbildlich, längste Klammer. | Evtl. kürzen, sonst ok. |
| 39 | rechte-tokens.md:154 | KOPFZEILE | Starter + Server (Matrix-Test). Vorbildlich. | — |
| 40 | sammlungen-anlegen.md:166 | KOPFZEILE | Starter + tibi-types, aber kein Server-Beleg trotz Aussagen zu `409` vs. `500` (Legacy-Default, Z133). | Server-Beleg (Fehler-Mapping) ergänzen. |
| 41 | ssr-website.md:178 | KOPFZEILE | Nur Starter-Beleg, obwohl Seite Server-Verhalten beschreibt (Cache-Regeln, `X-SSR-Cache`, `duplicate key`, 500-Dummy). | Server-Beleg (`get_read.js` läuft im Server, SSR-Docs) ergänzen. |
| 42 | suche.md:103 | KOPFZEILE | Drei Belege inkl. rankfusion + Test-Plan 41. Vorbildlich; Hash-Länge gemischt. | Hash-Länge vereinheitlichen. |
| 43 | abfragen-lesen.md:143, suche.md:74-75, sammlungen-anlegen.md:133 | LUECKE | Bulk-Operationen (`bulkCreate`/`bulkUpdate`/`bulkDelete`, `items[]` bei MCP-`document_create`) werden nirgends aus REST-Sicht gezeigt. | Abschnitt „Mehrere Einträge auf einmal“ in `abfragen-lesen.md` (Bulk-Query, Bulk-Freigabe, Fehlerbild). |
| 44 | ssr-website.md:45-51 | LUECKE | `aggregate` (commentCount) nur hier gezeigt, in `abfragen-lesen.md` fehlt jede Erwähnung (Parameter-Tabelle Z39-45 kennt nur filter/sort/limit/offset/count). | `aggregate`-Zeile + Verweis in `abfragen-lesen.md` ergänzen. |
| 45 | felder-widgets.md:76 | LUECKE | `accept` (MIME-Typen) ohne Beispiel („—“); Starter-`medialib.yml` setzt nur `maxFileSize`, kein `accept` — unklar, ob MIME-Filter überhaupt möglich. | Am Schema (`collection.schema.json`) klären und Beispiel oder „nicht zutreffend“ schreiben. |
| 46 | felder-widgets.md:194-197 | LUECKE | `meta.protected` in 2 Zeilen abgehandelt; Feld-Level-Read-Rechte/Projektionen (`invalid projection`, `lookup permission denied`) nur als Fehlerbilder. | Abschnitt „Wer darf welches Feld sehen/ändern“ oder Verweis auf Server-Permissions-Docs. |
| 47 | jobs-actions.md:121-123, mcp-nutzen.md:702-740 | LUECKE | `GET /_meta` / `system_meta_get` und `meta.query`/`extra`-Parameter nur als Nebensatz; keine Seite erklärt `_meta` aus Projektsicht. | Kurzabschnitt in `sammlungen-anlegen.md` oder `mcp-nutzen.md` (was `_meta` liefert, wofür `extra`). |
| 48 | alle Seiten | LUECKE | System-CRUD (Projekte/Collections per API anlegen, `X-Admin-Token`, Namensraum-Registrierung) fehlt komplett; `deploy.md` und `rechte-tokens.md` erwähnen nur Köpfe. | Verweis auf Server-Docs oder Kurzabschnitt (gehört ggf. nach `server/`, dann Link setzen). |
| 49 | suche.md:58, abfragen-lesen.md:131 | LUECKE | `qExplain=1`/`?qExplain=1` als Debug-Hinweis, aber Ausgabe-Format nirgends erklärt. | 1 Beispiel-Output oder Satz zur Interpretation. |
| 50 | audit-backup.md:62-86 | LUECKE | Snapshot-Restore per API (Fehlerfälle, Teilmengen, `collections: []`-Semantik beim Restore) fehlt; nur Admin-UI-Klickpfad. | Restore-Fehlerbilder (Platz, laufende Jobs, Cache danach) ergänzen. |
## Starlight-Potenzial (pro Seite)
- `abfragen-lesen.md`: `Steps` für „Erste Liste → filtern → zählen“-Rezept statt Fließtext (Z8-10); `Badge` für `_count`/`_facet`-Routen-Warnung (Z97-100); Fehlertabelle (Z135-141) ist bereits gut, zusätzlich `Aside tip` mit Copy-paste-fähiger Basis-URL.
- `audit-backup.md`: `CardGrid` bereits genutzt — zusätzlich `Tabs` (UI-Pfad vs. API-Pfad) in „Audit einschalten“ (Z18-46); `FileTree` für `snapshotPath`-Layout; `Badge` („Betreiber-Sache“) an Server-Schaltern (Z29).
- `dateien-bilder.md`: `Steps` bereits genutzt — zusätzlich `Tabs` um Upload-Antwort vs. Fehlerantwort (Z22-31); Filter-Tabelle (Z84-91) um `Badge`-Spalte (Standard vs. Spezial) erweitern; Code-Titel enthalten bereits Pfade, gut.
- `deploy.md`: `Tabs` bereits genutzt — zusätzlich `Aside tip` mit 1-Befehl-Verify (`curl` Reload + `clear=1`) nach Z93; Checkliste (Z113-121) als `Steps` ist gut, zusätzlich `Badge` („Staging“/„Live“) an Bühnen-Tabelle.
- `felder-widgets.md`: `Tabs` bereits genutzt — zusätzlich `Badge` für Pflicht-/Optional-Schlüssel in Validator-Tabelle (Z65-79); 25 Widgets (Z58) als einspaltige Liste mit `Badge` pro Kategorie (Auswahl, Datei, Datum) statt Fließtext.
- `hooks-schreiben.md`: `Steps` + `Tabs` bereits genutzt — zusätzlich `FileTree` für `api/hooks/`-Layout (Z50-59 statt Tabelle); `Aside` statt Klammer-Zusatz bei `context_response.header` (Z138).
- `jobs-actions.md`: `CardGrid` + `Tabs` bereits genutzt — zusätzlich `Badge` („Cron“/„HTTP“) an Baustein-Tabelle (Z95-101); `Steps` um Verify-Schritt mit erwartetem Log-Auszug erweitern.
- `llm-nutzen.md`: `Tabs` bereits genutzt — zusätzlich `Aside caution` für 429-Budget-Stopp statt Tabellen-Zeile (Z166); `Badge` für Normal-/Streaming-Modi an Z17/37; lange Budget-Regeln (Z105-113) als nummerierte `Steps` lesbarer.
- `mcp-nutzen.md`: `Badge` bereits genutzt — nach Auslagerung (Nr. 9) `LinkCard`s zu `reference/mcp-werkzeuge.md` + `projekt/hooks-schreiben/`; pro Werkzeug einklappbar wäre ideal (Starlight ohne Details-Plugin: stattdessen Anker-Links + Inhaltsverzeichnis oben).
- `navigation-i18n.md`: `Steps` + `Tabs` bereits genutzt — zusätzlich `FileTree` für 4 Singleton-Bäume (statt Z13-Satz); Checkliste (Z82-88) als `Badge`-Tabelle („Schema hat Feld: ja/nein“) schärfer als Fließtext.
- `pagebuilder-dev.md`: `Steps` + `Tabs` bereits genutzt — zusätzlich `Badge` („Admin-UI“ vs. „Projekt-Code“) an Abschnitten ab Z183 zur Trennung nach Nr. 12; Registry-Vertrag (Z47-54) als `Code`-Titel mit Dateipfad ist gut.
- `rechte-tokens.md`: `Tabs` bereits genutzt — zusätzlich `Badge` („anonym“/„Token“/„JWT“/„Admin“) an Kopf-Tabelle (Z48-53); `active:true`-Tabelle (Z114-120) als kanonischer Kasten mit `Aside caution` + Anker für andere Seiten.
- `sammlungen-anlegen.md`: `FileTree` + `Steps` bereits genutzt — zusätzlich `Tabs` (Minimal vs. Voll mit Suche/Hooks) statt einem Block; `Badge` an Modi-Tabelle (Z141-146, „Starter-Standard“).
- `ssr-website.md`: `FileTree` + `Tabs` bereits genutzt — zusätzlich `Badge` (`X-SSR-Cache`/`X-SSR-Cleared`) an Cache-Abschnitt (Z122-144); `Steps` für „Eigener Block“ ist gut, Code-Titel bereits mit Dateipfad.
- `suche.md`: `Steps` + `Tabs` bereits genutzt — zusätzlich `LinkCard`s zu den drei Index-Quellen (Starter-YAML, rankfusion, Test-Plan 41) unter „Neuaufbau“; RRF-Formel (Z69-71) als `Aside note` mit Formel-Hervorhebung.
## Unsichere Punkte (PRUEFEN, 7)
1. Nr. 13 — Job-`cron`-Pflicht und Schema-Felder (`job.schema.json` + Runner-Verhalten ungelesen).
2. Nr. 14 — `POST /api/ssr?clear=1` ohne Auth: `post_bind.js`-Wipe-Pfad nicht am Code verifiziert.
3. Nr. 15 — „kein Textindex nötig“ für `default`/`regex` (Wertung ohne Beleg).
4. Nr. 16 — „einzige Log-Hilfe im Starter“ (Volltextsuche im Starter fehlt).
5. `navigation-i18n.md:13` — „genau vier Singleton-Bäume“ + `maxLevel`-Regel (Header 2, Footer 1, Z28): `declaredTrees` nur teilweise gelesen (Header DE/EN gesehen, Footer nicht). Am vollständigen `navigation.yml`-Block belegen.
6. `rechte-tokens.md:130-142` — Org-/Team-Modell (`matrixorga`, `teama1`, Zugriffsregeln) aus `access_control_matrix_test.go` übernommen; Test-Namen als Doku-Beleg sind fragil — gegen Server-Docs oder Admin-Verhalten gegenlesen.
7. `pagebuilder-dev.md:62-86` und `mcp-nutzen.md:702-740` — Aussagen über Admin-Verhalten (`PagebuilderOverlay`, `de.json`-Schlüssel, `meta.agent`-Pflege) bzw. Server-Interna (`query.go`-Validierung) konnten in diesem Lauf nicht am jeweiligen Repo verifiziert werden; Stichprobe pro Datei empfohlen.
+776
View File
@@ -0,0 +1,776 @@
# Doku-Audit — Übersicht, Lücken, Fehler, Verbesserungen
**Zweck:** Vollständige Prüfung der Tibi-Doku (`tibi-docs`) gegen den Code von `tibi-server`, `tibi-admin-nova`, `tibi-types` und `tibi-svelte-starter` — mit Phasenplan und Checklisten zum Abarbeiten.
**Stand:** 2026-10-16, umgesetzt am 2026-10-17.
> **Zahlen in §1 sind der Audit-Stand vom 16.10.** (61 Seiten, 30 Screenshots) — bewusst als Schnappschuss stehen gelassen.
> **Ist-Stand nach der Umsetzung (17.10.):** 70 Inhaltsseiten / 8.264 Zeilen, 49 Screenshots (40 Anwender, 9 Admin), 71 Build-Seiten,
> 0 tote Links, 8 legitime „Platzhalter"-Marker, `npm run build` grün. Fortschritt siehe §18.
**Rahmen (aus der Zielsetzung):**
Die Doku **soll** beschreiben: (a) alle Funktionen des tibi-server für Entwickler und Administratoren beim Aufsetzen und Betreiben von Projekten, (b) alle tibi-admin-nova-Funktionen, die Entwickler zum korrekten Konfigurieren brauchen, (c) alle tibi-admin-nova-Funktionen aus Anwendersicht anhand von Screenshots (Mock-Projekt `corporate`, nie `t1`).
Die Doku **soll nicht**: den Quellcode der Tibi-Repos für die Core-Weiterentwicklung erklären, und den alten `tibi-admin` (vor Nova) beachten.
---
## 0. Artefakte dieses Audits
| Datei | Inhalt | Zeilen |
|---|---|---|
| `plans/doku-audit.md` | **dieses Übersichtsdokument** (Ergebnis + Phasenplan) | — |
| `plans/audit/01-server-features.md` | tibi-server: Feature-Matrix, Routen, Hooks, MCP, Config, Lücken, Fehler | 200 |
| `plans/audit/02-admin-interfaces.md` | tibi-admin-nova: Entwickler-Schnittstellen, fehlende Interface-Doku, UI-Inventar, Screenshot-Lücken | 128 |
| `plans/audit/03-types-starter.md` | tibi-types-Schemas + Starter: undokumentierte Properties, Starter-Lücken | 125 |
| `plans/audit/04-legacy-docs.md` | Alt-Doku-Inventar in den Nachbar-Repos, Wegfall-Kandidaten, Repo-Hygiene | 106 |
| `plans/audit/05-review-einstieg-server.md` | Seitenreview `einstieg/` + `server/` (35 Befunde) | 68 |
| `plans/audit/05-review-projekt.md` | Seitenreview `projekt/` (50 Befunde) | 88 |
| `plans/audit/05-review-admin-reference.md` | Seitenreview `admin/` + `reference/` (21 Befunde) | 55 |
| `plans/audit/05-review-anwender-adr.md` | Seitenreview `anwender/` + `adr/` (25 Befunde) | 58 |
| `plans/audit-report.json` | Maschinenlesbarer Struktur-Befund (Skript) | — |
| `scripts/audit-docs.mjs` | Audit-Skript: Frontmatter, Codeblöcke, Links, Anker, Bilder, Tabellen, Stil-Marker, Komponenten-Inventar | 268 |
| `plans/coverage-report.json` | Bestehendes Coverage-Inventar (Routen/Kontexte/Tools/Schemas) | — |
**Belegstatus-Legende** (durchgängig in diesem Dokument):
| Symbol | Bedeutung |
|---|---|
| ✅ | **selbst am Code/Doku geprüft** (Datei:Zeile liegt vor) |
| ⚠️ | aus Subagenten-Report übernommen, **nicht selbst nachgeprüft** |
| ❌ | Report-Behauptung, die ich **widerlegt** habe (siehe §15.3) |
| 🔍 | `PRUEFEN`-Punkt: offen, braucht Entscheidung/Beleg |
**Reproduzieren:**
```sh
cd /WM_Dev/src/gitbase.de/cms/tibi-docs
node scripts/audit-docs.mjs # schreibt plans/audit-report.json
npm run coverage # schreibt plans/coverage-report.json
npm run build # muss grün bleiben
```
---
## 1. Kennzahlen und Ampel
| Bereich | Zahl | Ampel |
|---|---|---|
| Seiten / Zeilen | 61 / 7.127 | 🟢 Gerüst steht, alle Bereiche vorhanden |
| Build | 62 HTML-Dateien (61 Inhaltsseiten + `404.html`), grün, Pagefind + Sitemap ok | 🟢 |
| Tote interne Links / Anker | 0 | 🟢 |
| Ungeschlossene Codeblöcke / Codeblöcke ohne Sprach-Tag | 0 / 0 | 🟢 |
| Frontmatter fehlt | 1 Seite ohne `description` (`reference/openapi.md`) | 🟡 |
| Kaputte Markdown-Tabellen | 1 (`admin/ki-funktionen.md:40`) | 🟡 |
| Screenshots | 30 (`anwender/`), 9 Admin-Seiten mit **Platzhalter-Kommentar** (0 Bilder) | 🟠 |
| Verifiziert-Stempel | 4 verschiedene Formate, 2 Stempelnamen („Verifiziert am" / „Geprüft an"), Hashlängen 7/8 Zeichen | 🟡 |
| Faktische Fehler (selbst geprüft) | 8 | 🔴 |
| Faktische Fehler (gemeldet, ungeprüft) | 7 | 🟠 |
| Nicht dokumentierte Server-Fähigkeiten | 15 | 🔴 |
| Fehlende Interface-Doku (Admin/Projekt) | 10 Kernpunkte | 🔴 |
| Undokumentierte Schema-Properties (`tibi-types`) | 10+ | 🔴 |
| UI-Bereiche ohne Screenshot | 25 | 🔴 |
| Anwender-Seiten, die komplett fehlen | 5 | 🔴 |
| Alt-Doku-Dateien, die sofort gelöscht werden können | **0** (nur Repo-Ebene) | ⚪ |
| Seitenreview-Befunde gesamt | 131 Tabellenzeilen (35 + 50 + 21 + 25) | 🟠 |
---
## 2. Phasenplan (Übersicht)
Reihenfolge nach Risiko/Nutzen — **P7 vor P6**, weil Stil-/Strukturarbeit Überschriften und Slugs ändert und damit Screenshots entwertet. P1 und P2 sind Fehlerkorrekturen (klein, hoher Effekt), P3–P5 sind Substanz, P6a ist Vorarbeit, P7 ordnet, P6b friert ein, P8/P9 sind Ordnung und Abriss. P3 und P4 sind parallelisierbar.
| Phase | Name | Inhalt | Aufwand | Abhängigkeit |
|---|---|---|---|---|
| **P1** | Falschaussagen tilgen | 8 selbst geprüfte + 7 gemeldete Inhaltsfehler | S (½ Tag) | — |
| **P2** | Markdown/Struktur/Hygiene | kaputte Tabelle, Hüllen-Rückstände, Stempel-Format, **Link-/Anker-Prüfung als fester Schritt, Redirect-Konzept** | S (1 Tag) | — |
| **P3** | Server-Lücken schließen | 16 Fähigkeiten: Feld-Level-Permissions, System-CRUD, `_meta`, MIME, Snapshots, Embedding-Gruppen, Scopes, Filecleanup | M–L (2–3 Tage) | P1 |
| **P4** | Admin-Interface-Lücken schließen | 12 Schnittstellen: `singleton`, `admin.tokens`, `query`, `agent`, `sections`, `MANUALLY`, Export-`ctx`, Action-`execution` | M (2 Tage) | P1 (parallel zu P3) |
| **P5** | tibi-types + Starter + Fremd-Repo-Doku | undokumentierte Schema-Properties, Playwright/Mock im Starter, Interface-Doku in den Repos selbst | M (1–2 Tage) | P4 |
| **P6a** | Fehlende Anwender-Seiten | 5 Seiten (Verlauf/Restore, Massenbearbeitung, Aktionen, Backup-Einspielen, Tastenkürzel) | S–M (1–2 Tage) | P2 |
| **P7** | Stil + Starlight + Struktur | Ton, UI-Text-Treue, Komponenten (`LinkCard`, `Tabs syncKey`, `Icon`), Astro-Config, Slug-/Sidebar-Umbau | M (1–2 Tage) | P6a, P3/P4 (UI-Texte können sich noch ändern) |
| **P6b** | Screenshots Anwender + Admin | 9 Admin-Motive + 25 UI-Bereiche, alles aus `corporate` | L (3–5 Tage) | P7 (erst nach Slug-/Text-Freeze) |
| **P8** | Meta/Betrieb | AGENTS.md-Widerspruch, Sync-Skripte, Coverage v2, Stempel-Norm, Staleness-Regel, Issues an die Repos | S (1 Tag) | P2 |
| **P9** | Alt-Doku-Abbau | Repo-Hygiene, Wegfall-Bedingungen je Alt-Datei | S–M | P3–P7 |
**Warum diese Reihenfolge (falsifizierbar):** P7 verschiebt Slugs und ändert Überschriften/Sidebar; jede Stunde Screenshot-Arbeit davor müsste danach teilweise wiederholt werden. Umgekehrt kostet die Verschiebung nichts, weil P6b keine Inhalte mehr ändert. Falls sich zeigt, dass P7 doch Inhalte anfasst, die Bilder zeigen, ist die Reihenfolge zu revidieren (Re-Shoot-Zähler als Messgröße).
---
## 3. P1 — Faktische Fehler (selbst geprüft ✅)
Diese acht Stellen widersprechen dem Code. Jede Zeile nennt Doku-Ort, Code-Beleg und Korrektur.
| # | Datei:Zeile | Doku sagt | Code sagt | Korrektur | Beleg |
|---|---|---|---|---|---|
| 1 | `server/konfiguration.md:21` und `:99-104` | `bge-m3` → `EMBEDDING_BGE-M3_*` (Bindestrich bleibt stehen) | `normalizeEnvKeyName`: `-` → `_`, dann UPPER → `BGE_M3` (`internal/config/server.go:245-251`) | Alle 6 Beispielzeilen auf `EMBEDDING_BGE_M3_*` ändern, Regel-Satz präzisieren | ✅ |
| 2 | `projekt/audit-backup.md:107,127,141` | Token-Recht heißt `AllowSnapshot` | Feld heißt `allowSnapshots` (yaml-Tag im Struct `AdminToken`, `internal/models/project.go:120`; Prüfung `AllowSnapshots`) | „`allowSnapshots` (Projekt-Admin-Recht)" durchgängig | ✅ |
| 3 | `reference/hook-kontexte.md:52` | `crypto.sha256`, `crypto.md5` „(plus weitere)" | Nur 2 Funktionen registriert (`internal/hook/context_crypto.go:13-16`) | „(plus weitere)" streichen | ✅ |
| 4 | `projekt/mcp-nutzen.md:63-71` | Scope-Tabelle: `.get`, `.post`, `.put`, `.delete` | `MethodToAction("GET")` → `read`, `POST` → `create`, `PUT` → `update` (`internal/config/admin_token.go:115-128`); Detailabschnitte derselben Seite (`:102,120,192,210`) nennen korrekt `.read/.create/.update/.delete` | Tabelle auf `.read/.create/.update/.delete` umstellen | ✅ |
| 5 | `admin/customizing.md:14` | „`meta.views` (Tabelle, Karten, Kalender …)" steuert die Ansichten | `collection-meta.schema.json` hat **kein** `views` und `additionalProperties:false`; `types/admin.d.ts:452-458`: Custom-Views „not yet supported" | Zeile streichen oder durch die tatsächlich vorhandenen Mittel (`viewHint`, `subNavigation`) ersetzen | ✅ |
| 6 | `admin/exporte.md:60` | Beispiel ruft `ctx.db.loadAll({ filter: ctx.filter })` | Signatur ist `loadAll(collection, options)` (`frontend/src/lib/utils/custom-export.types.ts:56`) | Beispiel auf `loadAll("blog", { filter: ctx.filter })` korrigieren | ✅ |
| 7 | `reference/openapi.md` (ganze Seite) | Quelle `TIBI_API_URL/openapi.json`, „Erzeugen mit `npm run sync:openapi`" | Server hat nur `GET /api/v1/_openapi/:project` (`internal/controller/setup.go:692-701`); **kein** `/openapi.json`. Das Skript `scripts/sync-openapi.mjs` ruft genau diesen nicht existenten Pfad → Platzhalter bleibt ewig stehen | Skript auf `_openapi/:project` umstellen (Env `TIBI_NAMESPACE`), Seite generieren | ✅ |
| 8 | `server/betrieb.md:21` | „`mongo` (MongoDB 7)" | Lokaler Stack: `image: gitbase.de/server/mongo:8` (`tibi-admin-nova/docker-compose-local.yml:133`, `tibi-svelte-starter/docker-compose-local.yml:139`) | „MongoDB 8" | ✅ |
**Gemeldet, aber nicht selbst geprüft** (⚠️ — vor dem Fixen kurz verifizieren):
| # | Datei:Zeile | Behauptung | Korrektur |
|---|---|---|---|
| 9 | `einstieg/neues-projekt.md:68,77` | `$CODING_TIBISERVER_URL` existiert in keinem `.env`/Skript | auf die realen Starter-Variablen umstellen |
| 10 | `server/schnittstellen.md:62` | „Alle Antworten gzip" absolut | Ausnahmen ergänzen: `.pdf/.mp4/.jpg/.jpeg/.png`, `/metrics` (`setup.go:151-154`) |
| 11 | `projekt/hooks-schreiben.md:85` | „Ohne `return` … **eingeloggte** Nutzer sehen dann alles" | „anonyme Nutzer" (Starter-Hook filtert nur Anonyme) |
| 12 | `projekt/sammlungen-anlegen.md:87` | Gruppen-Beispiel „`content`, `content`, `community`" | „`content`, `community`, `system`" (Starter: `content`, `community`, `system`) — ✅ Duplikat selbst bestätigt (`grep group: api/collections/*.yml`) |
| 13 | `projekt/audit-backup.md:29` | Audit-`defaultTTL: "0"` = ewig | im Code kein `0`-Sonderfall gefunden → Beleg nachreichen oder Aussage streichen (🔍) |
| 14 | `projekt/deploy.md:90-91` | `POST /api/ssr?clear=1` als Server-Pfad dargestellt | als **Starter-/Proxy-Pfad** kennzeichnen; Server hat keine `ssr`-Route |
| 15 | `anwender/orientierung.md:58` | Überschrift „Schnellsuche" | UI-String heißt „**Befehlspalette**" (`frontend/src/lib/i18n/locales/de.json:1207`; ✅ — „Schnellsuche" kommt dort nicht vor) |
| 16 | `admin/aktionen.md` / `admin/ki-funktionen.md` | „Kurzfassung" | Locale sagt „Zusammenfassung" (⚠️) |
---
## 4. P2 — Markdown, Struktur, Hygiene-Defekte
Automatisch gefunden (Skript) und im Review bestätigt:
| # | Ort | Defekt | Fix | Beleg |
|---|---|---|---|---|
| 1 | `admin/ki-funktionen.md:40` | Tabelle mit inkonsistenter Spaltenzahl (letzte Zeile 2 statt 3 Zellen) → bricht das Rendering der dritten Stufe | Zeile auf drei Zellen umbauen (Stufe, Schwelle, Verhalten) | ✅ Skript |
| 2 | `reference/hook-kontexte.md:65` | **Aufbau-Rückstand in Nutzer-Doku**: „Die Hülle nannte nur: db, http, …" | Absatz ersetzen durch: „Diese Pakete existieren zusätzlich zur Erstfassung: …" | ✅ |
| 3 | `reference/openapi.md` | kein `description` in Frontmatter, „Stand: Platzhalter" | nach P1-#7 generieren | ✅ Skript |
| 4 | `einstieg/neues-projekt.md:81`, `einstieg/schnellstart.md:8`, `server/uebersicht.md:12` | `:::caution` / `:::danger` / `:::note`-Direktiven — **3 Einzelfälle** im ganzen Repo (sonst 86× `<Aside>`) | auf `<Aside type="…">` vereinheitlichen | ⚠️/✅ (Vorkommen selbst bestätigt) |
| 5 | `admin/ansichten-listen.md:76`, `admin/exporte.md:40`, `projekt/…` | `#`-Überschriften **innerhalb** von Codeblöcken (Skript-Fehltreffer) → keine echten Fehler, aber Prüfregel dokumentieren | keine Änderung nötig | ✅ |
| 6 | `projekt/pagebuilder-dev.md:215` | Überschrift 100 Zeichen lang | kürzen, Rest in den Text | ✅ Skript |
| 7 | alle Seiten | „Suchbegriffe:"-Zeile in 7 Seiten, „Suche-Begriffe" (Bindestrich) in 4 Seiten, in 8 Seiten ganz ohne | einheitlich „Suchbegriffe:" überall oder nirgends | ⚠️ |
| 8 | Seitenfüße | Stempel-Format: 11× „Geprüft an 2b091d89" (ohne Datum), 15× „Verifiziert am <hash> <datum> (repo)", Hashlängen 7 und 8 | Norm „`Verifiziert am <kurzhash> <JJJJ-MM-TT> (<repo>[, …])`", AGENTS.md §2 ergänzen | ✅ (Inventar selbst erhoben) |
| 9 | alle Seiten | ungenutzte Starlight-Importe (z. B. 4 Server-Seiten teilen eine 8er-Importzeile) | Imports auf tatsächlich benutzte Komponenten kürzen | ⚠️ |
| 10 | `anwender/*.md` | Fußzeile „Geprüft an … (tibi-admin-nova)" **ohne Datum** (11×) | Datum ergänzen | ✅ |
Bilder: **0 verwaiste, 0 doppelte** Dateien — alle 30 `.webp` genau einmal referenziert, alle mit deutschem Alt-Text, alle ≤ 78 KB. 🟢
---
## 5. P3 — Lücken: tibi-server-Funktionen ohne Dokustelle
Aus `plans/audit/01-server-features.md`, sortiert nach Wirkung für Projektentwickler/Admins. Code-Belege dort im Detail.
| # | Fehlende Fähigkeit | Code-Beleg | Wo sie hingehört |
|---|---|---|---|
| 1 | **Feld-Level-Permissions** (`readonlyFields`, `hiddenFields`, Feldsichtbarkeit je Rolle) | `internal/models/field_permissions.go`, `http_status.go:53-58`; Server-Doc `17-field-level-permissions.md` (546 Z.) | eigene Seite `projekt/feld-rechte.md` |
| 2 | **System-CRUD per REST** (`user/project/org/team/token`, je 5 Routen) | `internal/dbapi/register.go:90-94` | `reference/rest-system.md` |
| 3 | **`GET /_meta`, `GET /_meta/<collection>`** | `internal/dbapi/register.go:100-114` | `reference/rest-system.md` + Querverweis `projekt/mcp-nutzen.md` |
| 4 | **`token`-Collection-Felder** (`scopes`, `expiresAt`) | `internal/models/token.go:39-76` | `projekt/rechte-tokens.md` |
| 5 | **Scope-Katalog** (System- vs. Namespace-Scopes, UND-Regel Token × Besitzer) | `internal/models/token_scope_catalog.go:47-90` | `projekt/rechte-tokens.md` |
| 6 | **`upload.allowedMimeTypes`** | `internal/config/server.go:46` | `server/konfiguration.md` |
| 7 | **Snapshot-Detailfelder** (`mode: include/exclude`, `collectionDedup`, `permissions`, `retention.maxAge/maxSizeBytes`) und Einzelrouten (`stats`, `prune`, `trigger`, `:id/download`) | `internal/controller/setup.go:436-495`, `snapshot_config.go:34-93` | `projekt/audit-backup.md` |
| 8 | **Backup-Restore-Token-Lebenszyklus** (Analyse → `:restoreToken` → Restore/Cleanup) + Admin-Auth-Reihenfolge | `internal/controller/admin_backup*.go`, `admin_auth.go:20-74` | `projekt/audit-backup.md` |
| 9 | **Embedding-Gruppen-Tuning** (Policies, Health, Race, Retry, Bulk) | `internal/config/embedding_group.go:44-190`, Env `server.go:489-625` | `server/konfiguration.md` + `projekt/suche.md` |
| 10 | **Suchmodi jenseits des Starters** (`text/regex/eval/filter`, `autoRegenerate`, Search-Worker, Such-Debug) | `internal/models/collection.go:314`, `controller/search_debug.go` | `projekt/suche.md` |
| 11 | **`aggregate`** an der Listen-Route (nur in MCP/SSR/Fehlercodes erwähnt) | `internal/controller/collection_get.go` | `projekt/abfragen-lesen.md` |
| 12 | **Realtime-Hub-Details** (Ringpuffer 256, `LastN/MaxAge/TTL`, Drop-Policy) | `internal/realtime/hub.go:94-179` | `server/schnittstellen.md` |
| 13 | **Gzip-Ausnahmen** + `_search`-Stripping/NaN-Sanitizing | `internal/controller/setup.go:151-154`, `:814-825` | `server/schnittstellen.md` |
| 14 | **Filecleanup** (Orphan-Dateien) hat gar keine Dokustelle | `internal/filecleanup/cleanup.go:21-149` | Einzeiler in `server/betrieb.md` + `projekt/dateien-bilder.md` |
| 15 | **Hook-Cache-Defaults** (MaxEntries 10000, TTL 0, LRU) | `internal/cache/cache.go:23-33` | `reference/hooks-daten.md` |
| 16 | **Ephemeral REST Tokens**: `tibi-server/docs/24-…md` beschreibt sie, im Code kein Treffer | nur `docs/24*` | 🔍 **Entscheidung nötig**: implementieren oder Server-Doc löschen — nicht in die Nutzer-Doku übernehmen, solange es die Fähigkeit nicht gibt |
**Positiv (vollständig abgedeckt):** alle 36 MCP-Tools, alle 23 Hook-Pakete/70 Funktionen, Jobs, Actions, Audit, LLM-Chat, Rate-Limit/Login-Backoff, CORS-Kaskade, suexec, SSR-Hooks, Deploy/Compose-Profile.
---
## 6. P4 — Lücken: tibi-admin-nova-Entwickler-Schnittstellen
Aus `plans/audit/02-admin-interfaces.md`. Alle Punkte fehlen **in tibi-docs und in `tibi-admin-nova/docs`**.
| # | Schnittstelle | Wirkung | Beleg |
|---|---|---|---|
| 1 | `meta.singleton` (`enabled`, `key`) | Ein-Eintrag-Sammlungen (Einstellungen, Startseite) | `collection-meta.schema.json` |
| 2 | `project.admin.tokens` (`allowReload`, `allowRegenerateSearch`, `allowBackup`, `allowSnapshots`) | wer Backup/Snapshot/Search-Rebuild per Token darf | `project.schema.json` |
| 3 | `meta.query` | deklarierte Zusatz-Querykeys für Hooks (`ctx.request().query`) | `collection-meta.schema.json` |
| 4 | `meta.agent` (`purpose/instructions/fieldHints/workflows`) | Sammlungs-Doku für Agents (MCP/REST `_meta`) | `collection-meta.schema.json` |
| 5 | `meta.sections` (`group/label/collapsible/collapsed`) | zweite Formular-Gruppierung neben `sidebar` | `collection-meta.schema.json` |
| 6 | `meta.defaultSort.order: MANUALLY` + Drag-Freigabe | manuelle Reihenfolge als **Config**, nicht nur Bedienung | `collection-meta.schema.json`, `types/admin.d.ts:426ff` |
| 7 | `meta.viewHint.navigation` (`nodesField`, `declaredTrees`) | Navigationsbaum-Ansicht konfigurieren | Schema, `NavigationTreeField.svelte` |
| 8 | Export-`ctx` vollständig (`loadAll`-Batching 500, `sort[0]`, `selector` vs. `select`, `csvCell`-Guard, Dateinamen-Sanitizing) | eigene Berichte korrekt schreiben | `frontend/src/lib/utils/custom-export.types.ts:17-100` |
| 9 | Action-`execution` (`kind`, `cancellable`) + Upload-Fortschritt | Actions abbrechbar/Fortschritt korrekt | `action.schema.json`, `ActionView.svelte:349-379` |
| 10 | Ladeordnung/Cache der Registry-Loader (Pagebuilder, Exporte), `{eval}`-Asset-Specifier | Assets/Registry korrekt verdrahten | `load-registry.ts:14-60`, `project-asset-specifier.ts:17-50` |
| 11 | Runtime-System-Config (`system.config.json`, Engine-Modi `auto/api/browser/none`, TTS-Stimmen) | KI-Laufzeit im Admin konfigurieren | `runtime-system-config.ts`, `schemas/config/system-config.schema.json` |
| 12 | `views`-Widerspruch auflösen (siehe P1 #5) | Doku darf nichts versprechen, was das Schema verbietet | ✅ |
🔍 **Nicht verifizierte Begriffe aus dem Ausbau-Auftrag:** `hooksTrigger` und `exportScript` existieren im Code **nicht** (grep ohne Treffer). Vor jeder Dokumentation klären, ob damit `hooks` bzw. `meta.exports` gemeint war.
---
## 7. P5 — Lücken in den anderen Repos
### 7.1 `tibi-types` (Schemas + Hook-Typen)
Kein Doku-Verzeichnis vorhanden — die einzige Referenz sind `index.d.ts` und `schemas/config/*.json`. Aus `plans/audit/03-types-starter.md`:
| Undokumentierte Property | Wirkung | Beleg |
|---|---|---|
| `collection.queryLimits` (`defaultLimit`/`maxLimit`) | erzwungene Limit-Grenzen je Sammlung | `collection.schema.json` |
| `collection.readonlyFields` / `hiddenFields` | pauschale Feld-Sperre/Verbergung | `collection.schema.json` |
| `collection.uploadPath` / `upload` | Upload-Ablage und Upload-Regeln je Sammlung | `collection.schema.json` |
| `collection.strictFields` | unbekannte Felder ablehnen | `collection.schema.json` |
| `collection.imageFilter` | Bildfilter-Defaults je Sammlung | `collection.schema.json` |
| `collection-meta.singleton` / `sections` | s. P4 | `collection-meta.schema.json` |
| `field-meta.hideLabel`, `imageEditor`, `containerProps`, `inputProps`, `schemaRef`, `protected`, `drillDown`, `pageSize` | Widget-/Formularverhalten | `field-meta.schema.json` |
| `permissionSet.validProjections` | erlaubte Feldprojektionen je Recht | `permissions.schema.json` |
| `action.output.mapping` (`summary`/`details`/`progress` mit index/count/status/message) | Ergebnis-Darstellung nach Action | `action.schema.json` |
**Strukturempfehlung:** `reference/schemas.md` von „Übersicht" zu einer **Property-Matrix** ausbauen (Schema → Property → Typ → Default → Wirkung), generiert aus `schemas/config/*.json` per Skript (analog `scripts/coverage-inventory.mjs`). Damit ist die Seite dauerhaft drift-frei.
### 7.2 `tibi-svelte-starter`
| Lücke | Beleg/Ort | Ziel in tibi-docs |
|---|---|---|
| Playwright-Setup fehlt komplett | `playwright.config.ts`, `tests/` | neues Kapitel `projekt/tests.md` oder Abschnitt in `einstieg/schnellstart.md` |
| Mock-Modus (`MOCK=1`) nur als Wort | `esbuild.config*.js`, `frontend/` | `einstieg/schnellstart.md` |
| `api/templates/`, `ssr.yml`, Cache-Regeln | `api/` | `projekt/ssr-website.md` |
| CI/Deploy-Env (`ci-deploy.sh`, `ci-staging.sh`, `.basic-auth-*`, `ADMIN_ASSET_VERSION`) | Repo-Root | `projekt/deploy.md` |
| `lib/`-Module, `widgets/`, Sentry | `frontend/src/` | `projekt/ssr-website.md` |
### 7.3 `tibi-admin-nova/docs/` und Test-Pläne
**Kein Löschkandidat.** 3 Dateien sind Single Source (`collection-config.md`, `custom-export-script.md`, `test-plans/39-preview-resolver.md`, `test-plans/41-search-index-status.md`), 18 weitere sind teilweise die einzige Quelle für Detailverhalten.
**Empfehlung statt Löschen:** die drei Vollreferenzen (`collection-config.md` 2.293 Z., `collection-export.md` 327 Z., `custom-export-script.md` 117 Z.) per Sync als **Referenz-Kapitel** in tibi-docs spiegeln (`reference/collection-config.md` …) und im Repo als Quelle belassen — gleiche Mechanik wie beim Server-Sync, nur mit Sidebar-Eintrag.
---
## 8. P6 — Screenshots und Anwender-UI-Abdeckung
### 8.1 Ist
- `anwender/`: 30 Bilder, 11 Seiten — inhaltlich vollständig illustriert. 🟢
- `admin/`: **9 Seiten mit Platzhalter-Kommentar `<!-- Screenshot-Platzhalter (T-SHOTS): … -->`, null Bilder.** 🔴
Fehlende Admin-Motive (aus den Kommentaren, ✅ selbst extrahiert):
| Seite | Motiv |
|---|---|
| `admin/aktionen.md:29` | Action-Ansicht mit Methoden-Reitern, Eingabeformular, Ausführen-Knopf |
| `admin/ansichten-listen.md:103` | Liste mit Suchfeld, Filter-Popover, Paginierung |
| `admin/benutzer-rechte.md:103` | Hub mit Benutzerliste + Detail-Drawer (Rollen-Badge, Chips) |
| `admin/customizing.md:87` | angepasste Listenansicht mit Spaltenwahl und eigenem Export-Reiter |
| `admin/eintrags-editor.md:103` | Editor mit Formular, Seitenleiste, Übersetzungsleiste |
| `admin/exporte.md:83` | Export-Dialog mit Formatwahl und Spaltenliste |
| `admin/ki-funktionen.md:132` | geöffneter KI-Chat mit Werkzeugstatus und Mikrofon-Knopf |
| `admin/medien.md:81` | Medienraster mit Warteschlange und Bildeditor-Dialog |
| `admin/setup.md:83` | frisch gestarteter Admin mit Projektliste nach Login |
### 8.2 UI-Bereiche ganz ohne Bild (Anwender-Perpektive, 25)
Command-Palette-Overlay, Tastaturkürzel-Hilfe, Suchindex-Banner, Bulk-Edit-Panel, Feldsuche/Sprungziele/Drill-Down, Diff-Dialog, JSON-Overlay, FK-Drawer/Inline-Anlage/Rückverweise, Übersetzungsleiste, Medien-Lightbox, Upload-Warteschlange, Fremddatei-Widget, Action-Ansicht (Anwender), KI-Werkzeug-Inspektor/Chat-Verlauf/Vision-Overlay, Audit-/Verlaufs-UI (komplett), Backup-Import-Dialog, Restore-Bestätigung, Benutzer-/Team-/Org-Drawer, Token-Seite, Projekt-Admin-Ansicht, Stellvertretungs-Banner, Session-Timeout-Dialog, Theme-Umschalter, Voice-Filter-Eingabe.
### 8.3 Fehlende Anwender-Seiten (mit Code-Beleg)
| Vorschlag | Beleg | Warum |
|---|---|---|
| `anwender/verlauf-wiederherstellen.md` | `AuditView.svelte`, `AuditHistoryPanel.svelte`, `AuditDiff.svelte`, `AuditRestoreDialog.svelte` | mächtigste ungeklärte UI; Restore ist destruktiv |
| `anwender/massenbearbeitung.md` | `BulkEditPanel.svelte` | versehentliche Änderungen an vielen Einträgen |
| `anwender/aktionen.md` | `ActionView.svelte` | Anwender startet Actions, weiß aber nicht, was passiert |
| `anwender/backup-einspielen.md` | `BackupView.svelte`, `backup-api.ts` | Import/Restore ohne Anleitung = Datenverlustrisiko |
| `anwender/tastenkombinationen.md` (Anwender-Sicht) | `shortcuts.ts`, `KeyboardShortcuts.svelte` | Referenz existiert, Anwender-Zugang fehlt |
### 8.4 Vorgehen (Playwright, Mock)
Bestehende Vorlage: `plans/t-shots-arbeitsauftrag.md` — Mock-Admin, Login `admin`/`admin` (`frontend/assets/mock/login.json`), Projekt **Corporate Website** (Mock-Projekte vorhanden: `blog`, `corporate`, `events`, `intranet`, `shop`; **`t1` ist verboten**), Zielpfad `tibi-docs/src/assets/anwender/`, max. 200 KB je Bild, deutscher Alt-Text.
Erweiterung für P6:
1. **Admin-Unterordner** `src/assets/admin/` anlegen (Trennung Anwender-/Admin-Bilder).
2. Motive 8.1 zuerst (9 Bilder), dann 8.2 in der Reihenfolge der Seiten (25 weitere).
3. Für die 5 neuen Seiten 8.3 zuerst Text, dann Bilder.
4. Danach `npm run build` + Alt-Text-Prüfung (`scripts/audit-docs.mjs` prüft automatisch).
### 8.5 Daten-/Rechte-Hinweis
Screenshots aus dem Mock sind unkritisch. Sobald echte Projekte fotografiert werden: keine Kunden-/Personendaten (AGENTS.md §5). 🔍 Für Review-Screenshots (Bulk, Restore, Stellvertretung) reicht der Mock — bitte bestätigen, dass Mock-Daten im Bild bleiben dürfen.
---
## 9. P7 — Stil
Aus den vier Seitenreviews (131 Befunde; hier die Muster, nicht jeder Einzelfall).
| Muster | Beispiel | Regel |
|---|---|---|
| **Erfundene UI-Namen** | „Schnellsuche" statt „**Befehlspalette**" (`orientierung.md:58`, `hilfe.md`); „Kurzfassung" statt „**Zusammenfassung**" | jeder fett/„zitierte" UI-String muss wörtlich in `frontend/src/lib/i18n/locales/de.json` stehen — als Prüfschritt in die Abnahme aufnehmen |
| **Anglizismen/Doppelbegriffe** | „Sichtbare Spalten" vs. „Spaltenwahl"; „Verlauf" vs. „Historie"; „Admin" vs. „tibi-admin" | Glossar in `einstieg/begriffe.md` als Norm, Seiten gleichen darauf ab |
| **Belehrende Binsen** | „Preise stehen nirgends im Code — erfinde keine" (`llm-nutzen.md:89`); „Übernimm die Liste nicht blind" (`audit-backup.md:96`); „Passiert nicht von selbst" (`dateien-bilder.md:105`) | Imperativ → sachlicher Satz |
| **Prosa-Wände** | Kennzahlen-Prosa in `ki-funktionen.md:30`; 4 Admin-UI-Absätze in `audit-backup.md:50-58` | Tabelle/`Badge`-Legende statt Fließtext; Admin-Verhalten nach `admin/` verschieben |
| **Wertungen ohne Beleg** | `suche.md:21` „kein Textindex nötig"; `hooks-schreiben.md:111` „einzige Log-Hilfe" | Absolut-Aussagen abschwächen oder belegen |
| **Inkonsistente Anführungszeichen** | `„…"` in 2 Dateien gemischt mit `"…"` | eine Form (deutsche Anführungszeichen) |
| **Platzhalter im Beispiel** | `LIVE_URL=https://www`, `__PROJECT_NAME__` (`deploy.md:15,79`) | `# TODO: echte Domain` in den Block |
| **Fehlende Ergebnis-Schritte** | Setup-Checkliste als `[ ]`-Codeblock (`neues-projekt.md:12-23`) | echte Task-Liste/`Steps`, damit Fortschritt sichtbar ist |
| **Duplikate statt Verweise** | `hilfe.md` wiederholt drei Seiten; `qName`-Tabelle wortgleich in `abfragen-lesen.md` und `suche.md`; Widget-Tabellen 3×; `active:true`-Falle in 5 Seiten | kanonische Stelle bestimmen, Rest kurz + Verweis |
**Positiv:** keine „man"-Form, saubere Umlaute, keine toten Links, alle Codeblöcke balanciert, keine Seite > 800 Zeilen außer `mcp-nutzen.md` (754).
---
## 10. P7 — Bessere Starlight-Komponenten und Astro-Konfiguration
### 10.1 Komponenten-Einsatz heute (Skript-Inventar ✅)
| Komponente | Vorkommen | Bewertung |
|---|---|---|
| `Aside` | 86 | gut genutzt; 3 Ausreißer als `:::`-Direktive |
| `Steps` | 78 | gut genutzt |
| `TabItem` / `Tabs` | 56 / 25 | **ohne `syncKey`** → Tab-Wahl geht beim Navigieren verloren |
| `Card` / `CardGrid` | 30 / 7 | Karten enthalten Markdown-Links statt echter Karten-Links |
| `Badge` | 21–30 | ok |
| `FileTree` | 3 | ok |
| `LinkCard` / `LinkButton` / `Icon` / `MarkdownContent` | **0** | ungenutztes Potenzial |
| Codeblöcke | 432 Zäune, 254 mit `title=` | **0 Zeilenmarkierungen**, **0 `frame=`** |
### 10.2 Konkrete Verbesserungen
| # | Maßnahme | Wirkung | Beleg |
|---|---|---|---|
| 1 | **`Tabs syncKey`** auf allen mehrsprachigen/alternativen Tab-Gruppen (`konfiguration.md:46-77`, `schnittstellen.md:21-60`, `felder-widgets.md`) | gleiche Auswahl bleibt beim Seitenwechsel | ⚠️ |
| 2 | **`LinkCard`** statt `Card` + Markdown-Link auf Übersichtsseiten (`einstieg/was-ist-tibi.md:30-35`, `server/uebersicht.md:19-33`, `index.mdx`) | ganze Karte klickbar, bessere Tastaturbedienung | ⚠️ |
| 3 | **`Icon`** in Tabellen/`Steps` bei wiederkehrenden Handlungstypen | schnellere Erfassung | ⚠️ |
| 4 | **Zeilenmarkierungen** (` ```sh {2,5} `) dort, wo ein Beispiel „die eine Zeile" zeigt (Konfiguration, `.env`, Hook-Beispiele) | Leser sieht die relevante Zeile sofort | ✅ (0 Vorkommen) |
| 5 | `references`/`frame="none"` für reine Textblöcke, `title=` konsequent (254 von 432 haben es) | einheitliche Optik | ✅ |
| 6 | `<Tabs>` statt zwei aufeinanderfolgender `Steps` bei Eingabe/Ausgabe (`anwender/ki-nutzen.md:58-75`) und bei Viewport-Presets (`anwender/seiten-bauen.md:89-109`, Werte aus `PagebuilderViewportControl.svelte:22-29`) | Zuordnung Bild ↔ Preset | ⚠️ |
| 7 | `<Tabs>` je Exportformat (`anwender/exportieren.md:24-34`) | Vergleich CSV/XLSX/JSON statt Klickstrecke | ⚠️ |
| 8 | **`<Badge>`** für Statusbegriffe statt Fettung (REST-only, Legacy, Pflicht) | konsistente Optik | ⚠️ |
| 9 | Frontmatter `sidebar.label` für abgekürzte Seitentitel (z. B. „Hook-Referenz: Daten" → „Daten") + `tableOfContents.minHeadingLevel` je Seite | kürzere Sidebar, längere ToC | 🟡 |
| 10 | `lastUpdated: true` in `astro.config.mjs` + `lastUpdated`-Frontmatter je Seite | Aktualität sichtbar statt Stempel im Fließtext | 🟡 |
| 11 | `expressiveCode`-Optionen (Theme passend zu `custom.css`, `frameType`) statt Default | einheitliches Code-Bild | ✅ |
| 12 | Suche: `pagefind`-Optionen (z. B. Sprach-/Stoppwort-Konfiguration), `social`-Einträge erweitern, `editLink` prüfen (zeigt aktuell auf `_edit/master/`) | Suchqualität, Beitragsweg | ✅ |
### 10.3 Astro-/Repo-Ebene
| # | Befund | Maßnahme |
|---|---|---|
| 1 | Sidebar ist **vollständig manuell** (61 Einträge in `astro.config.mjs`) — jede neue Seite braucht 2 Änderungen (Datei + Sidebar) | auf `autogenerate` je Gruppe umstellen, sobald die Ordner stabil sind; bis dahin Sidebar-Check in `scripts/audit-docs.mjs` (existiert bereits) als Pflicht-Abnahme |
| 2 | keine `src/components/`-Erweiterungen | optional: `TibiShot.astro` (Bild + Alt-Text + Breite), damit Screenshot-Einbau überall gleich aussieht |
| 3 | `sync-server-docs.mjs` erzeugt **verwaiste Seiten** (24+3), weil die Ziele nicht in der Sidebar stehen — siehe §11 | 🔍 Entscheidung D1 |
| 4 | `scripts/sync-openapi.mjs` zielt auf nicht existenten Endpunkt (P1 #7) | Skript korrigieren |
| 5 | `coverage-inventory.mjs` misst Topic-Level („282/282") und damit keine Tiefe | v2: Funktionskörnung + Depth-Gate (siehe `plans/doku-ausbau.md`, Abschnitt „v3") |
| 6 | keine `robots.txt`/`_headers`/Cache-Regeln für den statischen Betrieb | bei Live-Deploy ergänzen (nginx-Config existiert) |
### 10.4 Zusätzliche Dimensionen (aus der Zweitmeinung ergänzt)
| # | Dimension | Befund | Maßnahme | Phase |
|---|---|---|---|---|
| 1 | **Link-/Anker-Integrität + Redirects** | AGENTS.md §5 sagt selbst, dass der Build interne Links **nicht** prüft; es gibt keine `redirects`-Konfiguration. Jede Slug-Umbenennung in P7 reißt damit unbemerkt Links auf | `scripts/audit-docs.mjs` (prüft Links + Anker bereits) als Pflichtschritt vor jedem Push; Umbenennungen zusätzlich in `astro.config.mjs` → `redirects` eintragen | P2 / P7 |
| 2 | **Snippet-Verifikation** | „Code schlägt Doku" ist Regel, aber kein Beispiel wird ausgeführt — genau der Fehlertyp aus P1 (#6 `loadAll`, #4 Scope-Namen) | die 6 verifizierten Fehlerbeispiele in eine Prüfliste aufnehmen; wo möglich (Hooks, Export-Skripte) Beispiele gegen `tibi-types`/`demo-api` laufen lassen | P1 / P2 |
| 3 | **Staleness/Versionierung** | „Verifiziert am `<hash>` <datum>" altert ohne Mechanismus; 4 Formate, 2 Stempelnamen | Norm + Regel „bei jeder Änderung an der Quelle Stempel erneuern" in AGENTS.md; Audit-Skript meldet Stempel älter als N Tage | P8 |
| 4 | **Onboarding-Reihenfolge (Reise statt Fähigkeit)** | Sidebar ist fähigkeitsgetrieben (`projekt/` folgt dem Schema, nicht dem Ablauf klonen → konfigurieren → bauen → deploy) | `einstieg/schnellstart.md` als Reise ausbauen und die Sidebar-Reihenfolge in `projekt/` gegen diesen Ablauf prüfen | P7 |
| 5 | **Barrierefreiheit** | Alt-Texte sind vollständig ✅; Kontrast von `--tibi-nova: #c2410c` auf hellem Grund und Dark-Hover sind ungeprüft | Kontrast mit `a11y`-MCP oder Lighthouse prüfen, `--tibi-nova` nur als Deko zulassen | P7 |
| 6 | **Suche** | Pagefind läuft (62 Dateien, 185 ms) ✅; deutsche Stemming-Qualität und Synonyme („Suchbegriffe:"-Zeile) ungeprüft | Suche mit typischen Anwenderbegriffen testen, ggf. Synonym-Mapping je Seite vereinheitlichen | P7 |
| 7 | **Mehrsprachigkeit** | bewusst nur `de` (`astro.config.mjs` `locales.root`) | als ADR festhalten (`adr/0004-nur-deutsch.md`), damit die Frage nicht wiederkehrt | P8 |
| 8 | **Druck/PDF** | nicht vorgesehen | bewusst streichen; Dev-Doku wird online gelesen | — |
---
## 11. Struktur, Information Architecture, Zielbild
### 11.1 Ist-Struktur
```
einstieg/ 4 Seiten (Was ist Tibi, Schnellstart, Begriffe, Neues Projekt)
server/ 5 (Übersicht, Konfiguration, Betrieb, Sicherheit, Schnittstellen)
projekt/ 15 (Sammlungen → Deploy)
admin/ 10 (Konzept, Setup, Customizing, Ansichten, Editor, Medien, Exporte, Aktionen, Rechte, KI)
anwender/ 11 (Anmelden → KI nutzen)
reference/ 11 (OpenAPI, Schemas, Hook-Kontexte, 5 Hook-Referenzen, Token-Köpfe, Fehler, Tastatur)
adr/ 4
```
Abgleich Sidebar ↔ Dateien: **vollständig konsistent**, keine Seite ohne Sidebar-Eintrag. 🟢
### 11.2 Zielbild „3 Zielgruppen × 1 Ort pro Fähigkeit"
Der Rahmen verlangt drei Sichten auf **dieselben** Fähigkeiten. Heute sind sie teils vermischt:
| Fähigkeit | Entwickler (Projekt) | Anwender | Gehört heute wo | Soll |
|---|---|---|---|---|
| Editor/Widgets | `projekt/felder-widgets.md` | `anwender/eintrag-bearbeiten.md` | + 3 Widget-Tabellen in `admin/*` | Tabellen nur in `admin/customizing.md`, Rest verweist |
| Verlauf/Restore | — | fehlt | nur `projekt/audit-backup.md:50-58` (Admin-Verhalten in Projekt-Seite) | `admin/` + neue Anwender-Seite |
| Pagebuilder | `projekt/pagebuilder-dev.md` (660 Z., enthält 65 Z. Admin-UI) | `anwender/seiten-bauen.md` | vermischt | UI-Teil nach `admin/eintrags-editor.md` |
| MCP | `projekt/mcp-nutzen.md` (754 Z.) | — | de facto Referenz | Werkzeug-Referenz → `reference/mcp-werkzeuge.md` |
| Snapshots/Backup | `projekt/audit-backup.md` | `anwender/sichern.md` | ok | + `anwender/backup-einspielen.md` |
### 11.3 Konkrete Struktur-Maßnahmen
1. `reference/` erweitern: `mcp-werkzeuge.md`, `rest-system.md`, `collection-config.md` (Sync aus Nova), `schema-properties.md` (generiert).
2. `admin/` als **Entwickler-Sicht auf die Oberfläche** schärfen: alle UI-Verhaltensbeschreibungen aus `projekt/*` dorthin.
3. `anwender/` um die 5 fehlenden Seiten (8.3) erweitern; Ziel = **jede** Bildschirmfläche hat eine Seite.
4. `projekt/mcp-nutzen.md` und `projekt/pagebuilder-dev.md` auf Leitfaden-Länge kürzen (Ziel < 300 Zeilen), Details in `reference/`.
5. Querverweis-Konvention: jede Fähigkeit beschreibt **eine** kanonische Seite; andere Seiten nennen sie in 1–2 Zeilen mit Link.
---
## 12. P9 — Alt-Doku in den anderen Repos: was weg kann
**Ehrliche Antwort: als *Duplikat* von tibi-docs kann heute keine Datei weg — 0 Duplikate.** Grund: `tibi-server/docs/` (24 englische Dateien) und `tibi-admin-nova/docs/` (3 Referenzdateien) sind **Quellen**, nicht Kopien; die tibi-docs-Seiten sind davon abgeleitete Nutzer-Doku. Zusätzlich liest `scripts/sync-server-docs.mjs` genau diese Pfade als Sync-Quelle. Erst wenn eine Fähigkeit in tibi-docs **tiefer** steht als in der Quelle, ist die Quelle ein Duplikat.
Davon zu trennen sind **Stale-Kandidaten** (beschreiben etwas, das es nicht mehr/nicht gibt) — die dürfen sofort weg oder müssen korrigiert werden, unabhängig von tibi-docs. Es gibt genau einen: `tibi-server/docs/24-ephemeral-rest-tokens.md` (🔍 Entscheidung D3).
Und **Repo-Hygiene-Fälle** (Alt-Kopien, kaputte Arbeitsstände) — siehe §12.1.
### 12.1 Repo-Ebene: sofort weg (nach Backup-Abgleich)
| Pfad | Befund | Empfehlung |
|---|---|---|
| `cms/tibi-docs-kaputt/` | defekte Doku-Kopie, eigenes `.git` | löschen |
| `cms/tibi-admin.bak/`, `tibi-admin.bak2/`, `tibi-admin.kaputt/` | Alt-`tibi-admin` (vor Nova) mit eigenem `.git` | löschen — der alte Admin ist laut Zielsetzung ohnehin ausgeschlossen |
| `cms/tibi-server.bak/` | Server-Backup-Kopie | löschen |
| `cms/tibi-docs-legacy/` (inkl. eingechecktem `node_modules/`) | Docpress-Ära | **nach** Volltext-Abgleich gegen `einstieg/begriffe.md` löschen |
| `cms/tibi-admin/`, `tibi-admin-dev/`, `tibi-admin-master/`, `tibi-admin-server/`, `tibi-starter/` | alte Starter-/Admin-Varianten, READMEs verweisen auf `tibi-svelte-starter` | klären, dann archivieren; `tibi-svelte-starter` als kanonisch erklären |
| `tibi-server/docs/24-ephemeral-rest-tokens.md` | beschreibt eine Fähigkeit, die im Code nicht existiert (kein Treffer für „ephemeral" außer in dieser Datei) | 🔍 D3: implementieren **oder** Datei löschen — beides ist ein Fortschritt, Liegenlassen nicht |
### 12.2 Datei-Ebene: Wegfall **erst** nach Erfüllung dieser Bedingungen
| Alt-Datei | Wegfall möglich, wenn … | Heutiger Abdeckungsgrad |
|---|---|---|
| `tibi-server/docs/15-troubleshooting.md` | `reference/fehlercodes.md` alle dort gelisteten Fehler + Ursachen führt | teilweise |
| `tibi-server/docs/16-cookbook.md` | die Rezepte in `projekt/sammlungen-anlegen.md` stehen | teilweise |
| `tibi-server/docs/13-openapi-metrics.md` | `reference/openapi.md` generiert ist und Metrik-Labels dokumentiert sind | teilweise (P1 #7) |
| `tibi-server/docs/17-field-level-permissions.md` | `projekt/feld-rechte.md` existiert | **nicht abgedeckt** (P3 #1) |
| `tibi-server/docs/24-ephemeral-rest-tokens.md` | Fähigkeit im Code existiert (heute nicht) | **nicht abgedeckt** 🔍 |
| `tibi-server/docs/{01,02,03,04,05,06,07,08,10,12,14,18,19,20,21,22,23}.md` | **nicht absehbar** — Core-Referenz für Server-Entwicklung, nicht Ziel dieser Doku | teilweise/vollständig |
| `tibi-admin-nova/docs/collection-config.md`, `custom-export-script.md` | nach Spiegelung als `reference/collection-config.md` | nicht abgedeckt |
| `tibi-admin-nova/docs/test-plans/*` | nie — Test-Artefakte, keine Nutzer-Doku | — |
| `tibi-types/` (keine Doku) | es entsteht Doku **im Repo** (empfohlen, §7.1) | — |
### 12.3 Dubletten/Widersprüche zwischen Alt-Doku und tibi-docs
| # | Widerspruch | Auflösung |
|---|---|---|
| 1 | MCP-Route: `tibi-server/docs/23-mcp.md` (Env `MCP_ROUTE` steuerbar) vs. `server/schnittstellen.md:77` („wird ignoriert") | ✅ Code: Routing ist hart (`setup.go:754-755`), `mcp.Route()` ungenutzt → **tibi-docs hat recht**, Server-Doc veraltet |
| 2 | Sync-Behauptung in `tibi-docs/AGENTS.md` §2/§4 vs. Realität (keine Sync-Artefakte im Repo) | AGENTS.md korrigieren (P8) |
| 3 | Starter-`Token`-Header (`tibi-svelte-starter/AGENTS.md`) ohne Warnung vor reservierten Namen (`reference/token-koepfe.md:52`) | Starter-AGENTS.md ergänzen |
| 4 | `plans/doku-ausbau.md` führt `llm-nutzen`/`mcp-nutzen` noch als „Hülle" — beide sind fertig | Plan-Zeilen als erledigt markieren |
---
## 13. P8 — Prozess und Meta
| # | Befund | Maßnahme |
|---|---|---|
| 1 | `AGENTS.md` §2 sagt „`server/` = SYNC, nicht von Hand editieren"; tatsächlich sind es Handseiten (`npm run sync` würde 27 verwaiste Seiten erzeugen) | 🔍 **Entscheidung D1**: Sync reaktivieren **oder** Skript + AGENTS-Abschnitt entfernen |
| 2 | `AGENTS.md` §1 verbietet gleichzeitig das Duplizieren englischer Server-Docs — beißt sich mit §2 | Widerspruch auflösen (eine Regel streichen) |
| 3 | Prüfregeln (Links, UI-Text-Treue, Stempel) sind nirgends automatisiert | `scripts/audit-docs.mjs` um UI-String-Abgleich gegen `de.json` erweitern und in `npm run build`-Vorprüfung hängen |
| 4 | Kein Mechanismus, der Fähigkeiten ohne Dokustelle meldet | Coverage v2 mit Funktionskörnung + Depth-Gate (siehe `plans/doku-ausbau.md` v3) |
| 5 | Stempel-Format driftet (4 Formate) | Norm in AGENTS.md §2 festschreiben |
| 6 | Offene Punkte aus der letzten Runde wurden nie als Issues angelegt | Issues anlegen: (a) tibi-server: Typo `reponse.header` (`context_response.go`), (b) tibi-server: doppelter yaml-Tag `allowSnapshots` (`models/project.go:104`), (c) tibi-admin-nova: totes `u`-Kürzel in `de.json`, (d) tibi-server: `mgocrud.old/` toter Code, (e) tibi-server: Doku `24-ephemeral-rest-tokens.md` ohne Code |
**Fehler, die ich zusätzlich **im Server-Code** gefunden habe** (nicht Doku, aber gefunden beim Prüfen — gehören als Issue gemeldet):
| Code-Fund | Beleg |
|---|---|
| doppelter Struct-Tag `yaml:"allowSnapshots" yaml:"allowSnapshots"` (auch bei `token`, `allowReload` … — alle vier Felder doppelt getaggt) | `internal/models/project.go:120` (Struct `AdminToken:116-122`) ✅ |
| `Content-Range:` inkl. Doppelpunkt als Header-Name (Doku zitiert ihn korrekt als Code-Abweichung) | `internal/controller/collection_get.go:32` ✅ |
| Typos in Hook-Kontext: `reponse.header` | `internal/hook/context_response.go` (⚠️) |
| `MCP_ROUTE`-Env existiert, wird aber vom Routing ignoriert | `internal/config/server.go:221-224` vs. `setup.go:754` ✅ |
---
## 14. Phasen-Checklisten (zum Abhaken)
### P1 — Falschaussagen tilgen
- [ ] `EMBEDDING_BGE_M3_*` in `server/konfiguration.md` korrigieren (5 Stellen)
- [ ] `allowSnapshots` in `projekt/audit-backup.md` (3 Stellen)
- [ ] „(plus weitere)" bei `crypto` in `reference/hook-kontexte.md:52` streichen
- [ ] MCP-Scope-Tabelle in `projekt/mcp-nutzen.md:63-71` auf `.read/.create/.update/.delete`
- [ ] `meta.views` in `admin/customizing.md:14` streichen/ersetzen
- [ ] `loadAll`-Beispiel in `admin/exporte.md:60` korrigieren
- [ ] `scripts/sync-openapi.mjs` auf `_openapi/:project` umstellen, `reference/openapi.md` generieren
- [ ] „MongoDB 7" → „MongoDB 8" in `server/betrieb.md:21`
- [ ] Punkte 9–16 aus §3 prüfen und korrigieren (⚠️-Liste)
- [ ] Nach jedem Fix: `npm run build` grün + `Verifiziert am …`-Stempel erneuern
### P2 — Markdown/Struktur/Hygiene
- [ ] Tabelle `admin/ki-funktionen.md:40` reparieren
- [ ] Aufbau-Rückstand `reference/hook-kontexte.md:65` entfernen
- [ ] `:::note/caution/danger` → `<Aside>` (3 Stellen)
- [ ] lange Überschrift `projekt/pagebuilder-dev.md:215` kürzen
- [ ] Stempel-Format auf allen Seiten vereinheitlichen (Datum + Repo + Hashlänge)
- [ ] „Suchbegriffe:"-Zeile normieren (7/4/8-Verteilung auflösen)
- [ ] ungenutzte Starlight-Importe entfernen
- [ ] **Link-/Anker-Prüfung als fester Schritt etablieren** (`node scripts/audit-docs.mjs`, gibt 0 tote Links aus) + Redirect-Konzept in `astro.config.mjs` beschließen
- [ ] **Snippet-Prüfliste** aus den 6 verifizierten Fehlerbeispielen anlegen
- [ ] `npm run build` + `node scripts/audit-docs.mjs` → 0 Findings außer bekannten `PRUEFEN`
### P3 — Server-Lücken
- [ ] `projekt/feld-rechte.md` neu (Feld-Level-Permissions)
- [ ] `reference/rest-system.md` neu (System-CRUD + `_meta`)
- [ ] `projekt/rechte-tokens.md` um Scope-Katalog + `token`-Felder erweitern
- [ ] `server/konfiguration.md` um `upload.allowedMimeTypes` + Embedding-Gruppen-Tuning
- [ ] `projekt/audit-backup.md` um Snapshot-Detailfelder + Restore-Token-Flow
- [ ] `projekt/suche.md` um Suchmodi/Regenerate/Search-Worker
- [ ] Gzip-Ausnahmen + Filecleanup + Cache-Defaults einarbeiten
- [ ] 🔍 Entscheidung Ephemeral REST Tokens (implementieren oder Server-Doc löschen)
### P4 — Admin-Interfaces (parallel zu P3)
- [ ] `singleton`, `sections`, `query`, `agent`, `MANUALLY`, `viewHint.navigation` dokumentieren
- [ ] `project.admin.tokens`-Rechte dokumentieren (inkl. Querverweis Backup/Snapshot/Search)
- [ ] Export-`ctx` vollständig in `admin/exporte.md` (Beispiel korrigiert, Batching, Guards)
- [ ] Action-`execution.kind/cancellable` in `admin/aktionen.md`
- [ ] Registry-Ladeordnung/Cache + `{eval}`-Specifier in `projekt/pagebuilder-dev.md`
- [ ] Runtime-System-Config in `admin/setup.md`
- [ ] 🔍 `hooksTrigger`/`exportScript` klären (existieren nicht)
### P5 — tibi-types + Starter
- [ ] `reference/schemas.md` zur Property-Matrix ausbauen (generiert)
- [ ] Undokumentierte Properties (§7.1) je Projektseite ergänzen
- [ ] Playwright-/Mock-Kapitel anlegen
- [ ] CI/Deploy-Env + `api/templates` dokumentieren
- [ ] Doku **im** `tibi-types`-Repo anlegen (Schemas selbst erklären) + `index.d.ts`-Typen referenzieren
### P6a — Fehlende Anwender-Seiten (nach P2, parallel zu P3/P4)
- [ ] `anwender/verlauf-wiederherstellen.md`
- [ ] `anwender/massenbearbeitung.md`
- [ ] `anwender/aktionen.md`
- [ ] `anwender/backup-einspielen.md`
- [ ] `anwender/tastenkombinationen.md`
- [ ] Sidebar + `coverage-map.json` nachziehen
### P7 — Stil, Starlight, Struktur (vor P6b!)
- [ ] UI-Namen gegen `de.json` abgleichen (allen voran „Befehlspalette")
- [ ] §9-Muster abarbeiten (Binsen, Prosa-Wände, Wertungen, Anführungszeichen)
- [ ] `syncKey` für Tab-Gruppen, `LinkCard` auf Übersichten, `Icon`/`Badge` dort, wo es hilft
- [ ] Zeilenmarkierungen + `frame`/`title` in Codeblöcken vereinheitlichen
- [ ] `lastUpdated`, `expressiveCode`, `sidebar.label` in `astro.config.mjs`
- [ ] kanonische Stellen für Duplikate festlegen (Widgets, `qName`, `active:true`)
- [ ] Umbenennungen/Verschiebungen nur mit `redirects`-Eintrag
- [ ] Onboarding-Reihenfolge und Sidebar gegen die Reise prüfen (§10.4 #4)
- [ ] a11y-Kontrast + Pagefind-Suche testen (§10.4 #5/#6)
### P6b — Screenshots (nach P7, Slug-/Text-Freeze)
- [ ] `src/assets/admin/` anlegen
- [ ] 9 Admin-Motive aus §8.1 aufnehmen und Platzhalter-Kommentare ersetzen
- [ ] 25 UI-Bereiche aus §8.2 bebildern
- [ ] alle Bilder ≤ 200 KB, deutsche Alt-Texte, `npm run build` grün
- [ ] Re-Shoot-Zähler messen (Messgröße für die Reihenfolge-Entscheidung)
### P8 — Meta
- [ ] 🔍 D1 entscheiden: Sync reaktivieren oder entfernen (AGENTS.md §2/§4 anpassen)
- [ ] Stempel-Norm **und Staleness-Regel** in AGENTS.md
- [ ] `audit-docs.mjs` um UI-String-Abgleich + Stempel-Alter erweitern, in Prüf-Ablauf aufnehmen
- [ ] Coverage v2 (Funktionskörnung + Depth-Gate)
- [ ] ADR „nur deutsch" anlegen (§10.4 #7)
- [ ] 5 Issues in den Repos anlegen (§13)
### P9 — Abbau
- [ ] Repo-Hygiene (§12.1) nach Backup-Abgleich
- [ ] Volltext-Abgleich `tibi-docs-legacy` → `einstieg/begriffe.md`
- [ ] Wegfall-Bedingungen (§12.2) als Tickets anlegen, sobald P3–P6 fertig sind
---
## 15. Anti-Halluzination: Was geprüft ist und was nicht
### 15.1 Selbst am Code geprüft (✅)
`EMBEDDING_BGE-M3_*` · `allowSnapshots` · `crypto`-Funktionsumfang · `MethodToAction`/MCP-Scopes · `meta.views` im Schema · `loadAll`-Signatur · OpenAPI-Route (`setup.go:692`) · `mongo:8` im Compose · Routen-Zählung (44 gruppierte Registrierungen) · MCP-Tools 10+12+14=36 · Route-Reihenfolge `_count`/`_facet` vor `:id` · „Befehlspalette" in `de.json` · Screenshot-Platzhalter in 9 Admin-Seiten · 30 Bilder alle referenziert · Schema-Properties (`queryLimits`, `readonlyFields`, `hiddenFields`, `singleton`, `sections`, `hideLabel`, `imageEditor`) fehlen in der Doku · Sync-Skript-Quellen · Build grün (62 Seiten).
### 15.2 Aus Subagenten-Reports übernommen (⚠️)
Alle Zeilen mit ⚠️ — insbesondere: `$CODING_TIBISERVER_URL`, Gzip-Absolutaussage, „eingeloggte vs. anonyme Nutzer" im Hook, `hooks-schreiben.md`-Details, `action.execution`, `system.config.json`, Starter-CI-Details, Übersichtsliste der 25 UI-Bereiche.
### 15.3 Widerlegte Report-Behauptungen (❌)
| Behauptung | Widerlegung |
|---|---|
| „`…/comment/count` landet **nicht** auf `:id`" (Review Projekt #2) | ✅ Die Doku (`projekt/abfragen-lesen.md:99`) ist **richtig**: `_count` ist als Literal `/_/:project/:collection/_count` registriert (`setup.go:514`), `/comment/count` erfüllt dieses Muster nicht und fällt auf `/_/:project/:collection/:id` mit `id="count"` (`setup.go:536`). Kein Fix nötig. |
| „0 Wegfall-Kandidaten auf Datei-Ebene, daher nichts zu tun" (Report 04) | Teils richtig, teils zu absolut: die **Bedingungen**, unter denen Alt-Dateien wegfallen dürfen, sind in §12.2 jetzt explizit gemacht; auf Repo-Ebene gibt es sehr wohl Löschkandidaten (§12.1). |
### 15.4 Zweitmeinung (SecondOpinion) — eingearbeitet
Eine unabhängige Zweitmeinung zum Plan wurde eingeholt und hat drei Änderungen erzwungen (alle übernommen):
1. **Reihenfolgefehler korrigiert:** P7 (Stil/Slugs/Struktur) läuft jetzt **vor** P6, weil es Überschriften und Slugs ändert und Screenshots sonst entwertet. P6 ist in **P6a** (fehlende Seiten, früh) und **P6b** (Bilder, nach Slug-Freeze) geteilt. P3 und P4 sind als parallel markiert.
2. **Fehlende Dimensionen ergänzt** (§10.4): Link-/Redirect-Integrität, Snippet-Verifikation, Staleness-Regel, Onboarding-Reihenfolge, a11y, Suche, ADR „nur deutsch"; Druck/PDF bewusst ausgeschlossen.
3. **§12 entkräftet die eigene Absolutaussage:** „0 Duplikate" statt „0 Wegfall"; `tibi-server/docs/24-ephemeral-rest-tokens.md` ist ein **Stale-Kandidat von heute** (🔍 D3), kein „nach P3"-Fall.
### 15.5 Regel für die Umsetzung
Jeder Fix aus §3/§5/§6 wird **erst** am Code nachgeprüft, **dann** geschrieben, **dann** gestempelt (`Verifiziert am <hash> <datum> (<repo>)`). Kein Fix ohne `datei:zeile`. Keine Zahl ohne Zählbefehl.
---
## 16. Offene Entscheidungen und offene Prüfpunkte
| # | Frage | Betrifft | Vorschlag |
|---|---|---|---|
| D1 | Sync-Modell: `server/` aus `tibi-server/docs` spiegeln **oder** Handseiten behalten? | AGENTS.md, `sync-server-docs.mjs`, `sync-openapi.mjs` | **Handseiten behalten** (Nutzer-Doku, deutsch), Sync-Skript für Server entfernen, Nova-Referenzen als `reference/`-Spiegel behalten |
| D2 | Sind Mock-Daten in Review-Screenshots ok? | P6 | ja, `corporate` reicht |
| D3 | Ephemere REST-Tokens: Feature oder Doku-Fehler? | P3 #16 | prüfen, dann eins von beidem löschen |
| D4 | Übergangsbeleg für Audit-`defaultTTL: "0"` | P1 #13 | belegen oder Aussage streichen |
| D5 | `hooksTrigger`/`exportScript` — gemeint war `hooks` bzw. `meta.exports`? | P4 | bestätigen |
| D6 | Wie tief soll die Server-Referenz in tibi-docs gehen (Ziel: „Projekte aufsetzen und betreiben", nicht Core-Entwicklung)? | P3 | Referenz-Tabelle + Fehlerfälle ja, Go-Interna nein |
| D7 | Bleibt die Doku einsprachig (nur `de`)? | §10.4 #7 | ja → als ADR festhalten |
| D8 | Wo endet die Anwender-Doku (welche Admin-Flächen bekommen eine Anwender-Seite)? | P6a | jedes Bildschirmelement, das ein Redakteur ohne Entwicklerwissen bedient |
🔍 **Weitere `PRUEFEN`-Punkte:** 7 in `05-review-einstieg-server.md`, 7 in `05-review-projekt.md`, 5 in `05-review-admin-reference.md`, 5 in `05-review-anwender-adr.md` — dort verlinkt und einzeln mit Beleg nachzuziehen.
---
## 17. Anhang: Inventar
**Seiten je Bereich:** einstieg 4 · server 5 · projekt 15 · admin 10 · anwender 11 · reference 11 · adr 4 · index 1 → **61 Seiten / 7.127 Zeilen**.
**Bilder:** 30 `.webp` in `src/assets/anwender/` (≤ 78 KB je Datei) + 1 `admin-nova.png` + `favicon.svg`; Admin-Screenshots fehlen.
**Befunde:** Audit-Skript 20 Rohmeldungen (17 Marker, 1 kaputte Tabelle, 1 lange Überschrift, 1 fehlende `description`) → davon 2 echte Markdown-Defekte; Seitenreviews 131 Befundzeilen; Code-Reports 15 Lücken + 5 Fehler (Server), 10 Interface-Lücken + 25 Screenshot-Lücken (Admin), 10 Schema-Properties + 5 Starter-Lücken, 0 Datei-Wegfall-Kandidaten + 6 Hygienefälle.
**Erledigt in diesem Audit:** Audit-Skript geschrieben, 4 Code-Reports + 4 Seitenreviews erstellt, 10 Kernbefunde selbst am Code verifiziert, 1 Report-Behauptung widerlegt, dieses Übersichtsdokument erstellt.
**Nicht erledigt (bewusst):** kein Doku-Inhalt wurde geändert — die Umsetzung folgt über die Phasen P1–P9.
### Zählbefehle (jede Zahl in diesem Dokument nachprüfbar)
```sh
cd /WM_Dev/src/gitbase.de/cms/tibi-docs
find src/content/docs -name '*.md' -o -name '*.mdx' | wc -l # 61
find src/content/docs -name '*.md*' | xargs cat | wc -l # 7127
ls src/assets/anwender/*.webp | wc -l # 30
find dist -name '*.html' | wc -l # 62
grep -rln 'Screenshot-Platzhalter' src/content/docs/admin | wc -l # 9
grep -rho '^\s*```' src/content/docs | wc -l # 432
grep -rn 'title="' src/content/docs | wc -l # 254
grep -rc '<Aside type=' src/content/docs | awk -F: '{s+=$2} END{print s}' # 86
grep -rn '^:::' src/content/docs | wc -l # 3
wc -l src/content/docs/projekt/mcp-nutzen.md # 754
node scripts/audit-docs.mjs # 0 tote Links, 20 Rohmeldungen
```
---
## 18. Ausführungsprotokoll (live)
Statuslegende: ✅ erledigt und reviewed · 🔄 läuft · ⬜ offen · 🔴 blockiert
### Welle A — P1 (Fakten) + P2 (Markdown/Hygiene) · Stand 2026-10-17
| Punkt | Status | Belege/Ergebnis |
|---|---|---|
| P1 #1 `EMBEDDING_BGE_M3_*` (6 Stellen) | ✅ | `server/konfiguration.md`; Review A ok gegen `server.go:245-251` |
| P1 #2 `allowSnapshots` (3 Stellen) | ✅ | `projekt/audit-backup.md`; Review ok gegen `project.go:120` |
| P1 #3 `crypto` „plus weitere" | ✅ | `reference/hook-kontexte.md`; Review ok |
| P1 #4 MCP-Scopes `.read/.create/.update/.delete` | ✅ | `projekt/mcp-nutzen.md:63-71`; Review ok gegen `admin_token.go:115-128` |
| P1 #5 `meta.views` entfernt | ✅ | `admin/customizing.md`; `viewHint`+`subNavigation` sind im Schema belegt |
| P1 #6 `loadAll`-Signatur | ✅ | `admin/exporte.md`; Review ok gegen `custom-export.types.ts:56-60` |
| P1 #7 `reference/openapi.md` + `sync-openapi.mjs` | ✅ | Seite handfest, Skript auf `/_openapi/<namespace>`; **Review-Fund** falscher Default-Pfad nachgezogen (`/api/v1`) |
| P1 #8 „MongoDB 7" → 8 | ✅ | `server/betrieb.md:21`; Review ok gegen beide Composes |
| P1 #9 `$CODING_TIBISERVER_URL` | ✅ | ersetzt durch `$CODING_TIBIADMIN_URL/api/...`; im Starter belegt, Proxy `/api`→`/api/v1` belegt |
| P1 #10 Gzip-Absolutaussage | ✅ | `server/schnittstellen.md`; Ausnahmen = `setup.go:151-154` |
| P1 #11 „eingeloggte" → „anonyme" | ✅ | `projekt/hooks-schreiben.md`; belegt durch `filter_public.js` (`!context.user.auth()`) |
| P1 #12 Sammelgruppen | ✅ | `content`/`community`/`system` gegen Starter-YMLs |
| P1 #13 Audit-TTL `"0" = ewig` | ✅ **bleibt** | **Review-Fehler entkräftet**: `internal/mongocrud/mongo.go:477` (`if index.ExpireAfter > 0`) → bei 0 wird kein TTL-Index gesetzt = kein Ablauf. Aussage ist korrekt. |
| P1 #14 `POST /api/ssr?clear=1` | ✅ | `projekt/deploy.md`; als Starter-/Proxy-Pfad gekennzeichnet |
| P1 #15 „Schnellsuche" → „Befehlspalette" | ✅ | `anwender/orientierung.md`, `anwender/hilfe.md`; belegt `de.json:1207` |
| P1 #16 „Kurzfassung" | ⬜ | Locale sagt „Zusammenfassung" — beim Anwender-KI-Feinschliff (P7) prüfen |
| P2 #1 kaputte Tabelle | ✅ | `admin/ki-funktionen.md` (3 Zellen je Zeile) |
| P2 #2 „Hülle"-Rückstand | ✅ | `reference/hook-kontexte.md`; `grep "Hülle"` in `src/content/docs` = 0 |
| P2 #3 `description` in openapi.md | ✅ | Frontmatter vollständig |
| P2 #4 `:::` → `<Aside>` | ✅ teilweise | `server/uebersicht.md`, `einstieg/neues-projekt.md`; ⬜ `einstieg/schnellstart.md` (war im Auftrag nicht enthalten) |
| P2 #6 lange Überschrift | ✅ | `projekt/pagebuilder-dev.md` |
| P2 #7 „Suchbegriffe:" | ✅ | 4 Projekt-Seiten normiert |
| P2 #8 Stempel-Norm | ✅ teilweise | „Geprüft an" → „Verifiziert am" (11 Seiten), 8→7 Zeichen, Doppelungen zusammengefasst; ⬜ ~20 Restzeilen mit Datums-/Suffix-Abweichungen |
| P2 #9 ungenutzte Importe | ✅ | alle Seiten beider Bereiche geprüft |
| Welle-A-Review (general Subagent) | ✅ | Urteil: „abnehmbar nein — erst Punkt F fixen"; F wurde behoben, danach grün |
| Build | ✅ | 62 Seiten, 0 Fehler; `scripts/audit-docs.mjs`: 20 → **16** Findings (nur noch legitime „Platzhalter"-Wörter) |
### Welle B — P3 (Server-Lücken) + P4 (Admin-Interfaces) · Stand 2026-10-17 ✅
| Punkt | Status | Belege/Ergebnis |
|---|---|---|
| P3: `projekt/feld-rechte.md` (neu, 87 Z.) | ✅ | Kaskade Collection → PermissionSet → Feld-Def; `field_permissions.go:31-56,120,135,307,402-418`; `permissions.schema.json:55-72`; `collection.schema.json:201-212` |
| P3: `reference/rest-system.md` (neu, 65 Z.) | ✅ | 5 Modelle × 5 Routen + `_meta`; `dbapi/register.go:90-115`; `token.go:39-76`; `helper.go:64-167` |
| P3: `rechte-tokens.md` (Scope-Katalog, Token-Felder, Admin-Flags) | ✅ | `:144-208`; `token_scope_catalog.go:47-89`; `project.schema.json:227-261` |
| P3: `konfiguration.md` (`allowedMimeTypes`, Embedding-Gruppen) | ✅ | `:26,108-162`; `config/server.go:46,489-625`; `embedding_group.go:44-190` |
| P3: `audit-backup.md` (10 Snapshot-/6 Backup-Routen, Config-Felder, Restore-Token, Auth-Reihenfolge) | ✅ | `:95-198`; `setup.go:398-495`; `snapshot_config.go:11-58,89-94`; `admin_auth.go:20-74` |
| P3: `suche.md` (7 Suchmodi, Regenerate/Worker, Vektor-Pfad, Debug) | ✅ | `:44-129`; `collection.go:314-383`; `admin_regenerate_search.go:17-25`; `search_debug.go:145-159` |
| P3: `betrieb.md` + `dateien-bilder.md` (Filecleanup) | ✅ | `cleanup.go:21-149` |
| P3: `hooks-daten.md` (Cache-Defaults) | ✅ | `cache/cache.go:23-38`; `config/server.go:178-181` |
| P3: `abfragen-lesen.md` (`aggregate`) | ✅ | `:113-135`; Signatur/Ops/Fehler 400/403 |
| P4: Schema-Meta (`singleton`, `sections`, `query`, `agent`, `MANUALLY`, `viewHint.navigation`) | ✅ | `sammlungen-anlegen.md:87-116`; `collection-meta.schema.json:69-503` |
| P4: Feld-Meta (8 Optionen) | ✅ | `felder-widgets.md:201-216`; `field-meta.schema.json:50-235,303-317` |
| P4: `admin.tokens`-Rechte | ✅ | `admin/benutzer-rechte.md:83-108`; `project.go:116-122` |
| P4: Export-`ctx` vollständig + lauffähiges Beispiel | ✅ | `admin/exporte.md:50-103`; `custom-export.types.ts:17-102` |
| P4: Action-`execution` + Upload-Pfad | ✅ | `admin/aktionen.md:31-50`; `action.schema.json:274-288`; `ActionView.svelte:260-295,350-382` |
| P4: Registry-Ladeordnung + `{eval}`-Specifier | ✅ | `pagebuilder-dev.md:56-79`; `load-registry.ts:16-94`; `project-asset-specifier.ts:17-50` |
| P4: Runtime-System-Config | ✅ | `admin/setup.md:73-96`; `system-config.schema.json:11-28`; `system.config.json:1-49` |
| Welle-B-Review (general Subagent) | ✅ | 20 Stichproben, alle ok; Urteil „abnehmbar nach Fix von 2a+2b" — behoben |
| Review-Nacharbeit | ✅ | Quelle-Pfad in `feld-rechte.md` korrigiert; Stempel datiert (13 Seiten); Duplikat „Neuaufbau" in `suche.md` mit „Index aufbauen und prüfen" zusammengeführt; `**Kurzfassung**` → `**Zusammenfassung**` (`de.json:207`); letzte `:::`-Direktive → `<Aside>` |
| Build | ✅ | 64 Seiten (63 Inhaltsseiten + 404), 0 Fehler; Audit weiterhin 16 legitime „Platzhalter"-Marker |
### Welle C — P5 (types/Starter) + P6a (Anwender-Seiten) · Stand 2026-10-17 ✅
| Punkt | Status | Belege/Ergebnis |
|---|---|---|
| P5: `reference/schema-properties.md` (generiert, 384 Z.) | ✅ | 16/16 Schemas, 25 Tabellen, 164 Property-Zeilen; Generator `scripts/gen-schema-matrix.mjs` + `npm run gen:schemas`; idempotent (md5 identisch beim Zweitlauf) |
| P5: `reference/schemas.md` auf Übersicht + Verweise reduziert | ✅ | keine Doppelung; Dateinamen/Auflösungsreihenfolge ergänzt |
| P5: `projekt/tests.md` (neu, 83 Z.) | ✅ | Playwright-Scripts/Projekte, `MOCK=1` (`frontend/src/lib/mock.ts`, `esbuild.config.js:141f`), Artefaktordner |
| P5: `projekt/deploy.md` (CI-Variablen) | ✅ | `scripts/ci-deploy.sh:6-35,62-68`, `ci-staging.sh:4-42`; zwei Widersprüche bereinigt |
| P5: `projekt/ssr-website.md` (`api/templates`, Cache) | ✅ | `api/hooks/ssr/get_read.js`, `hooks/lib/utils.js` (`clearSSRCache`) |
| P6a: 5 neue Anwender-Seiten (319 Z. gesamt) | ✅ | Verlauf/Wiederherstellen, Massenbearbeitung, Aktionen, Backup einspielen, Tastenkürzel |
| P6a: 10 Screenshot-Platzhalter für P6b gesetzt | ✅ | 3 Verlauf, 2 Massenbearbeitung, 2 Aktionen, 2 Backup, 1 Tastenkürzel |
| Sidebar (`astro.config.mjs`) | ✅ | 7 neue Einträge; Sidebar ↔ Dateien konsistent (0 Abweichungen) |
| Welle-C-Review (general Subagent) | ✅ | Generator idempotent (md5 gleich), 15 Stichproben gegen JSON-Schemas ok, UI-Strings 25/26 wörtlich, tests.md korrekt |
| Review-Nacharbeit | ✅ | Generator schreibt jetzt „Generiert aus `tibi-types 4c55f82` (Stand 2026-10-12)" (deterministisch); Hash-Länge auf 7 Zeichen normiert (33 Stellen); Bildbeschriftung auf die echten Knopftexte gezogen |
| Build | ✅ | 71 Seiten (70 Inhaltsseiten + 404), 0 Fehler; Audit: 0 tote Links, 16 legitime „Platzhalter"-Marker |
### Welle D — P7 (Stil, Starlight, Struktur) · Stand 2026-10-17 ✅
| Punkt | Status | Ergebnis |
|---|---|---|
| UI-Text-Treue gegen `de.json` | ✅ | 21 geprüft, 20 wörtlich; korrigiert: `**Zusammenfassung**` (statt „Kurzfassung"), `noOutputFields`-Satz, „Erneut versuchen", `{width}×{height}`; „Datensatz öffnen" ohne UI-Beleg → wirkungsbeschreibend umformuliert |
| `LinkCard` statt Karte+Link | ✅ | `index.mdx`, `server/uebersicht.md`, `einstieg/was-ist-tibi.md`, `reference/hook-kontexte.md` (19 Karten) |
| `Tabs`/`Steps`/`syncKey` | ✅ | `syncKey` in 4 Seiten; `<Tabs>` für Exportformate, KI Ein-/Ausgabe, Viewport-Presets |
| Codeblöcke | ✅ | Zeilenmarkierungen (`{n}`) an 5 Stellen, `title=` flächendeckend |
| Checkliste statt Codeblock | ✅ | `einstieg/neues-projekt.md` Task-Liste |
| Begriffe-Glossar | ✅ | `einstieg/begriffe.md` mit 12 `##`-Überschriften (ToC-fähig) |
| Redundanz kanonisiert | ✅ | `qName` nur in `suche.md`, `active:true`-Falle nur in `rechte-tokens.md`, Widget-Tabelle nur in `felder-widgets.md` |
| Auslagerung Projekt → Admin | ✅ | Verlauf-/Pagebuilder-UI aus `projekt/*` nach `admin/eintrags-editor.md`, Details dort ergänzt |
| Prosa/Binsen | ✅ | `ki-funktionen.md` Schwellen jetzt Tabelle; 6 Binsen/Wertungen umformuliert |
| `mcp-nutzen.md` entschlackt | ✅ | 754 → 441 Zeilen, alle 36 Werkzeuge erhalten (Tabelle + Signatur + Beispiel + Fehler) |
| Kontrast/a11y (`custom.css`) | ✅ | nachgerechnet: alle Text-/Akzentwerte ≥ 4.5:1 (hell/dunkel), Deko-Farben bewusst unverändert |
| `lastUpdated: true` | ✅ | rendert ohne Fehler |
| Stempel normiert | ✅ | ein Format, 7-stellige Hashes, Punkt am Ende entfernt (~22 Stellen) |
### Welle E — P6b (Screenshots) · Stand 2026-10-17 ✅
| Punkt | Status | Ergebnis |
|---|---|---|
| Admin-Bilder | ✅ | **9/9** Motive aus `corporate` → `src/assets/admin/`, alle 1440×900, 21–78 KB |
| Anwender-Bilder | ✅ | **10 neue** (Verlauf, Massenbearbeitung, Aktionen, Backup, Tastenkürzel) → `src/assets/anwender/`, 18–89 KB |
| Platzhalter-Kommentare | ✅ | alle `<!-- Screenshot (T-SHOTS) … -->` ersetzt; 0 offene Kommentare |
| Mock-Fixture erweitert | ✅ | `corporate` hat jetzt eine Aktion („Suchindex neu aufbauen") und zwei Exporte („Seiten-Report", „Seiten-CSV") — vorher gab es Aktionen/Exporte nur in `t1`, das laut Regel verboten ist |
| Regelverstoß behoben | ✅ | die zwei Aktionen-Bilder des ersten Durchlaufs stammten aus `t1` und wurden durch `corporate`-Aufnahmen ersetzt |
| Textkorrektur nach UI-Abgleich | ✅ | Auswahl-Knopf heißt „**Bearbeiten**" (`admin.bulk.edit`) |
| offene UI-Mängel (nicht Doku) | ⚠️ | Mock-Overlay zeigt unübersetzten Key `admin.commandPalette.commands.toggleUsers`; Backup-Dialog teils englisch → als Issue notiert (`plans/offene-issues.md` A1/A2) |
### Welle F — P8 (Meta) + P9 (Abbau) · Stand 2026-10-17 ✅/⬜
| Punkt | Status | Ergebnis |
|---|---|---|
| D1 entschieden: Sync stillgelegt | ✅ | `AGENTS.md` §2/§4 richtiggestellt (server/ = Handseiten), `npm run sync` entfernt, `sync-server-docs.mjs` mit Stillegungs-Hinweis versehen |
| AGENTS.md: Belegpflicht + UI-Namen-Regel | ✅ | Stempel-Norm und „UI-Namen wörtlich aus `de.json`" als Pflichtregeln ergänzt |
| AGENTS.md: Screenshot-Regel | ✅ | `src/assets/admin/` + `src/assets/anwender/`, WebP 1440×900 ≤ 200 KB, Corporate only |
| AGENTS.md: Werkzeug-Abschnitt | ✅ | `audit-docs.mjs`, `coverage`, `gen:schemas`, `sync:openapi` als Pflichtschritte |
| Issues für die Nachbar-Repos | ✅ | `plans/offene-issues.md`: 7× tibi-server, 4× tibi-admin-nova, 2× tibi-types (mit Beleg) |
| P9 Repo-Hygiene (Löschungen) | ⬜ | **bewusst nicht ausgeführt** — Löschen in fremden Repos braucht Freigabe; Kandidatenliste steht in §12.1 |
### Abschluss-Review (general Subagent) und Nacharbeit · 2026-10-17 ✅
| Befund des Abschluss-Reviews | Nacharbeit |
|---|---|
| 4 Waisen-Seiten ohne eingehenden Link (Aktionen, Backup einspielen, Massenbearbeitung, Tastenkürzel) | ✅ verlinkt aus `admin/aktionen`, `anwender/sichern`, `projekt/audit-backup`, `anwender/lesen-suchen-filtern`, `admin/ansichten-listen`, `reference/tastatur-kurzbefehle`, `anwender/orientierung` |
| 8 Seiten ohne Stempel (4× `einstieg/`, `reference/openapi.md`, ADRs) | ✅ 5 Seiten gestempelt; ADRs + generierte Seite als Ausnahme in AGENTS.md definiert (Abdeckung jetzt 64/69, Rest = Ausnahmen) |
| `reference/rest-system.md` nannte nur `register.go` | ✅ vollständiger Pfad `internal/dbapi/register.go` |
| Export-Beispielpfad `_/assets/exports/reports.mjs` nicht belegt | ✅ auf `_/exports/reports.mjs` relativiert (Specifier-Semantik steht in `projekt/pagebuilder-dev.md`) |
| Kopfzahlen in `plans/doku-audit.md`/`plans/doku-ausbau.md` veraltet (61 Seiten/30 Shots/55 Seiten) | ✅ Ist-Stand als Block ergänzt, T-SHOTS- und T-FINISH-Zeile aktualisiert |
| Info-Verlust der Welle D | ✅ keiner gefunden (Verdichtung, kein Verlust prüfbarer Aussagen) |
| 20 Fakten-Stichproben | ✅ 17 ok, 2 Beanstandungen (s. o.), 1 Bestätigung (MCP-Scope-Fix korrekt) |
| 10 UI-String-Stichproben | ✅ 10/10 wörtlich in `de.json` |
| Bilder | ✅ 40 + 9, 0 verwaist, 0 leere Alt-Texte, alle < 200 KB, keine Aufnahme aus `t1` |
**Urteil des Reviews:** „abnehmbar nach ca. 30 Minuten Nacharbeit" — die Nacharbeit ist erledigt, Build grün.
### Review-Fehler (Anti-Halluzination)
| Behauptung eines Prüfers | Gegenbeleg | Ergebnis |
|---|---|---|
| „`…/comment/count` landet nicht auf `:id`" (Seitenreview Projekt) | `setup.go:514` (`/_count` als Literal) vs. `:536` (`:id`) | Doku war richtig, Prüfer falsch |
| „`sync-openapi.mjs` Pfad falsch" (Review Welle A) | `${base}/_openapi/…` mit Default `…/api` → `/api/_openapi/…` | **richtig**, Default auf `/api/v1` geändert |
| „`"0" = ewig` im Audit-TTL nicht belegt" (Review Welle A) | `mongocrud/mongo.go:477` (`> 0`-Guard) | Prüfer falsch, Aussage bleibt |
+25 -2
View File
@@ -26,9 +26,9 @@ Lebendes Dokument. Der Orga-Agent (Agent Warpfuchs) aktualisiert Status, Session
| T-ADMIN-B Admin II | aktionen, benutzer-rechte, ki-funktionen, setup, customizing | – | ⏳ offen | ⏳ | Build + Links |
| T-ANW-A Anwender I | anmelden, orientierung, lesen-suchen-filtern, eintrag-bearbeiten, medien | – | ⏳ offen | ⏳ | Build + Links |
| T-ANW-B Anwender II | seiten-bauen, benutzer-teams, exportieren, sichern, hilfe | – | ⏳ offen | ⏳ | Build + Links |
| T-SHOTS Screenshots | `src/assets/anwender/*` NUR aus Mock-Projekt `corporate` (nie `t1`!), Auftrag: `plans/t-shots-arbeitsauftrag.md` | general ses_ebac0c7feffed3DYtWznC2bqzJ | ✅ fertig (24 webp, <200 KB, Vision-Spotcheck ok) | ✅ Text-Abweichungen eingearbeitet (Live-Schalter, OK-Button, Reiter, Corporate-Blöcke) | Build + Links ✅ |
| T-SHOTS Screenshots | `src/assets/anwender/*` NUR aus Mock-Projekt `corporate` (nie `t1`!), Auftrag: `plans/t-shots-arbeitsauftrag.md` | general ses_ebac0c7feffed3DYtWznC2bqzJ | ✅ fertig — Stand 17.10.: 49 webp (40 Anwender, 9 Admin), <200 KB | ✅ Text-Abweichungen eingearbeitet (Live-Schalter, OK-Button, Reiter, Corporate-Blöcke) | Build + Links ✅ |
| T-PROJ-D Vollständigkeit | pagebuilder-dev, mcp-nutzen (36 Tools), llm-nutzen | general ses_ebac0c804ffe9vElWvaKTju4H9 | ✅ fertig | ✅ SO eingearbeitet (REST-only: sieben statt fünf) | Build + Links ✅ |
| T-FINISH Finish | index-Karten, uebersicht/konzept-Stempel, Voll-Linkcheck, AGENTS-Spiegelung | Orga (direkt) | ✅ fertig (v1) | — (Linkcheck: alle ok, 0 Hüllen, ADR-0003 angelegt) | Build 55 Seiten ✅ |
| T-FINISH Finish | index-Karten, uebersicht/konzept-Stempel, Voll-Linkcheck, AGENTS-Spiegelung | Orga (direkt) | ✅ fertig (v1) | — (Linkcheck: alle ok, 0 Hüllen, ADR-0003 angelegt) | Build 71 Seiten ✅ (Stand 17.10.) |
| T-PB Pagebuilder komplett | pagebuilder-dev + seiten-bauen: Overlay-Editor, Modi, Viewport, Overview/inline, drillDown | general ses_eb9584bafffekRtyPPBn7ORTeA | ✅ fertig | ✅ SO eingearbeitet (OK/blur-Pfad, <768-px-Hinweis) | Build + Links ✅ |
| T-TON Ton-Rewrite | alle 10 anwender-Seiten: professionell-per-du, UI-Namen aus de.json | general ses_eb95443a5ffe8IrJVmt1DcAReX | ✅ fertig | ✅ SO eingearbeitet („Bild hochladen", Sitzungs-Hinweis, Live-Qualifier, KI-Beschreibung, Browser-Zurück) | Build + Links ✅ |
| T-SHOTS-2 Pagebuilder-Shots | Overlay + Viewport (corporate), Einbau in seiten-bauen | general ses_eb9503e20ffetq8gZU0Ff5U06T | ✅ fertig (3 webp, Icon-Tooltip korrigiert) | ✅ Abweichung eingearbeitet | Build ✅ |
@@ -165,3 +165,26 @@ Kontrollen: Depth-Gate im Skript (gemapptes Item < Stufe Signatur = Fail), Blind
- [ ] Offen an tibi-server: Typo `reponse.header` im Server-Code (`context_response.go`, von Doku wörtlich zitiert) → Issue
- [ ] Offen an tibi-admin-nova: totes `u`-Kürzel (`toggleUsers`-Key fehlt in `de.json`, nur Akkord `g → u` funktioniert) → Issue
- [ ] Abschlussmeldung Runde 3 an User
## Runde 4 — Audit und Umsetzung (2026-10-17)
Vollständige Prüfung von Code und Doku, dann Abarbeitung in Wellen. Übersicht, Befunde und Belege:
**`plans/doku-audit.md`** (mit Ausführungsprotokoll), Detailreports unter `plans/audit/`.
| Welle | Inhalt | Status |
|---|---|---|
| A | P1 Faktenfehler (8) + P2 Markdown/Hygiene | ✅ |
| B | P3 Server-Lücken (`feld-rechte.md`, `rest-system.md` neu, 8 Seiten vertieft) + P4 Admin-Interfaces | ✅ |
| C | P5 `reference/schema-properties.md` (generiert) + Starter-Kapitel + 5 neue Anwender-Seiten | ✅ |
| D | P7 Stil, Starlight, Struktur, UI-Text-Treue, Kontrast | ✅ |
| E | P6b Screenshots: 9 Admin- + 10 Anwender-Bilder aus `corporate` | ✅ |
| F | P8 Meta (AGENTS.md, Werkzeuge, Issues) | ✅ |
| — | P9 Repo-Hygiene (Löschungen in Nachbar-Repos) | ⬜ Freigabe nötig |
**Neue Werkzeuge:** `scripts/audit-docs.mjs` (Struktur-/Link-/Bildprüfung, `plans/audit-report.json`),
`scripts/gen-schema-matrix.mjs` (`npm run gen:schemas` → `reference/schema-properties.md`).
**Neue Seiten:** `projekt/feld-rechte`, `reference/rest-system`, `reference/schema-properties`,
`projekt/tests`, `anwender/{verlauf-wiederherstellen,massenbearbeitung,aktionen,backup-einspielen,tastenkombinationen}`.
**Stand:** 70 Inhaltsseiten, 49 Screenshots, Build grün, Audit: 0 tote Links, 0 kaputte Tabellen.
**Offen:** Issues für die Nachbar-Repos (`plans/offene-issues.md`), Löschkandidaten `tibi-docs-legacy`,
`tibi-docs-kaputt`, `tibi-admin.bak*`, `tibi-server.bak` (Freigabe), Coverage v2 (Funktionskörnung).
+37
View File
@@ -0,0 +1,37 @@
# Offene Punkte in den Nachbar-Repos (bereit zum Anlegen als Issue)
Stand: 2026-10-17. Alle Punkte sind am Code belegt und aus dem Doku-Audit entstanden
(`plans/doku-audit.md`). Je Eintrag: Titel für das Issue, Repo, Beleg, Auswirkung, Vorschlag.
## tibi-server
| # | Titel | Beleg | Auswirkung | Vorschlag |
|---|---|---|---|---|
| S1 | Doppelte Struct-Tags in `AdminToken` | `internal/models/project.go:116-122` — `Token string \`yaml:"token" yaml:"token"\`` (ebenso `AllowReload`, `AllowRegenerateSearch`, `AllowBackup`, `allowSnapshots`) | Der zweite Tag ist wirkungslos; Copy-Paste-Fehler bei künftigen Feldern | zweiten Tag entfernen |
| S2 | Header-Name mit Doppelpunkt | `internal/controller/collection_get.go:32` — `c.Header("Content-Range:", …)` | Antwort enthält einen Header mit ungültigem Namen; Clients können die Zeilenanzahl nicht lesen | auf `Content-Range` ändern (Breaking: Clients, die den Tippfehler kennen, prüfen) |
| S3 | Hook-Kontext: Typo `reponse.header` | `internal/hook/context_response.go` | Falsches Symbol in der Hook-API; nur der Alias hält es am Leben | umbenennen, Alias eine Minor-Version behalten |
| S4 | `mcp.route`/`MCP_ROUTE` wirkungslos | `internal/config/server.go:221-224` (Feld/Env) vs. `internal/controller/setup.go:754-755` (fest `/mcp`) | Konfiguration suggeriert Steuerbarkeit, die es nicht gibt | Env entfernen oder Routing darauf umstellen |
| S5 | `docs/24-ephemeral-rest-tokens.md` ohne Code | kein Treffer für `ephemeral` in `internal/` | Doku beschreibt eine Fähigkeit, die es nicht gibt | implementieren oder Doc löschen |
| S6 | `internal/mgocrud.old/` toter Code | Verzeichnis | Verwirrung bei Neueinsteigern | löschen |
| S7 | `audit.defaultTTL`-Semantik unklar dokumentiert | `internal/mongocrud/mongo.go:477` (`if index.ExpireAfter > 0`) — `0` ⇒ **kein** TTL-Index ⇒ Einträge bleiben ewig | Betreiber erwarten bei `0` sofortiges Verfallen | Kommentar + Server-Doc: `0` = kein Ablauf |
## tibi-admin-nova
| # | Titel | Beleg | Auswirkung | Vorschlag |
|---|---|---|---|---|
| A1 | Fehlende Übersetzung im Tastenkürzel-Overlay | sichtbar im Mock-Overlay: der Key `admin.commandPalette.commands.toggleUsers` erscheint unübersetzt; `frontend/src/lib/i18n/locales/de.json` | Anwender sieht einen technischen Schlüssel | String ergänzen |
| A2 | Teilweise englische Hinweise im Backup-Dialog | Mock-Backup-Import zeigt „target has new fields…" | Sprachbruch im deutschen UI | Strings übersetzen |
| A3 | Wiederherstellen-Dialog nur bei Änderungen sichtbar | `AuditRestoreDialog.svelte` — Feldauswahl erscheint nur bei ungespeicherten Änderungen, sonst „Keine Änderungen" | Doku muss den Sonderfall erklären; im Audit erwähnt | Hinweistext im UI prüfen |
| A4 | Actions fehlen im Mock-Projekt `corporate` | `frontend/assets/mock/_config/corporate/config.yml` hatte keinen `actions`-Block (nur `t1`) | Screenshots/Reviews ohne aussagekräftiges Demo-Projekt (erledigt in der Doku-Arbeit, s. u.) | übernommen: `actions/reindex-search.yml` + `meta.exports` in `corporate` ergänzt |
## tibi-types
| # | Titel | Beleg | Auswirkung | Vorschlag |
|---|---|---|---|---|
| T1 | Keine Doku im Repo | kein `docs/`-Verzeichnis, nur `index.d.ts` + `schemas/config/*.json` | Projektentwickler finden die Schemas nur über die zentrale Doku; Schema-Beschreibungen sind oft englisch und knapp | README mit Schema-Übersicht + Verweis auf `tibi-docs`; Beschreibungen pflegen |
| T2 | Schema-Beschreibungen teils englisch | `schemas/config/*.json` (`description`) | Deutsche Doku muss jeden Text selbst übersetzen | Feld-Beschreibungen zweisprachig oder deutsch |
**Bereits in der Doku-Arbeit umgesetzt (nur zur Info, kein Issue):** Mock-Projekt `corporate` hat jetzt
eine Aktion (`Suchindex neu aufbauen`) und zwei Export-Einträge (`Seiten-Report`, `Seiten-CSV`), damit
Screenshots und Reviews ohne `t1` auskommen. Betroffen sind
`frontend/assets/mock/_config/corporate/{config.yml,actions/reindex-search.yml,collections/pages.yml}`.