Files
tibi-docs/plans/audit/01-server-features.md
T
apairon 1928922e07 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
2026-10-17 01:49:35 +00:00

201 lines
27 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) |