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

+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.