Files
tibi-docs/plans/audit/02-admin-interfaces.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

129 lines
28 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 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“.