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) |