feat: Authority Router — Advisor collection-agnostisch, KB-2026.1 live #46

Merged
Benjamin_Boenisch merged 1 commits from feat/authority-router into main 2026-06-30 12:26:53 +00:00
Owner

Was & Warum

Der gemessene #61-Slice-Gewinn (+28 Treffer, CB-100: 53→81, 0 Regr) kam bisher nicht beim Advisor an: advisor-rag.ts fan-outete selbst über eine feste Liste expliziter Collections und umging damit das #61-Scope-Routing (das nur den Default-Pfad routet); die hochwertige Slice kb_2026_1_build war für den Advisor unerreichbar (zusätzlich bp_compliance_recht auf dev = 404). Dieser Authority Router zieht den Collection-Fan-out aus dem Advisor in die Retriever-Schicht — der Advisor wird collection-agnostisch und der Gewinn landet im echten Produktpfad.

Advisor.retrieve(query) → Authority Router → { Broad-Base + KB-2026.1-Slice (in-scope) }

Änderung

  • SDK (Go): neuer LegalRAGClient.Retrieve() + Endpoint POST /sdk/v1/rag/retrieve {query, top_k} (authority_router.go, Handler, Route). Fan-outet server-seitig über die Broad-Authority-Base (RAG_ROUTER_COLLECTIONS, Default = die 6 historischen Advisor-Collections) + die Slice bei inKBScope, merged + dedup, sortiert nach dem Authority-Score (rerankByAuthority läuft je Collection in searchInternal), top-K. Index-Warmup vor dem nebenläufigen Fan-out → kein textIndexEnsured-Map-Race.
  • admin (TS): advisor-rag.ts ruft EINMAL /retrieve statt 6-fach explizite Collections. COMPLIANCE_COLLECTIONS/searchCollection entfernt → Advisor collection-agnostisch (Vertrag Compiler→Collections→Retriever→Advisor).

Validierung

  • Go-Unit: Router-Collection-Selektion (in-scope → Slice; out / routing-off → nicht), env-Override-Parsing, dedupResults (max-Score).
  • e2e gegen dev-Qdrant (echter Retrieve(), lokales bge-m3, CB-100-Stichprobe stride 5): OLD-hit 11/20 → NEW-hit 15/20, GAIN 4 (alle DS-Guidance: WP248+WP243, GL07 ×2, TDDDG), REGR 0 — reproduziert den +28/0-Regr durch den Produktionscode-Pfad.
  • go build/vet/gofmt grün; TS-Tests auf den Single-/retrieve-Call angepasst.

Rollback / Sicherheit

Additiv: neuer Endpoint, /search (explizite Collections) unverändert für andere Consumer. RAG_KB_SCOPE_ROUTING=false → Router fällt auf die Broad-Base ohne Slice zurück (= bisheriges Advisor-Verhalten). Deploy ändert den Live-Advisor-Pfad (admin + ai-sdk) → Post-Deploy-Verify: DP-Frage am dev-Advisor liefert jetzt WP248/Guidance.

🤖 Generated with Claude Code

## Was & Warum Der gemessene **#61-Slice-Gewinn (+28 Treffer, CB-100: 53→81, 0 Regr)** kam bisher **nicht beim Advisor an**: `advisor-rag.ts` fan-outete selbst über eine feste Liste **expliziter** Collections und umging damit das #61-Scope-Routing (das nur den *Default*-Pfad routet); die hochwertige Slice `kb_2026_1_build` war für den Advisor unerreichbar (zusätzlich `bp_compliance_recht` auf dev = 404). Dieser **Authority Router** zieht den Collection-Fan-out aus dem Advisor in die **Retriever-Schicht** — der Advisor wird collection-agnostisch und der Gewinn landet im echten Produktpfad. ``` Advisor.retrieve(query) → Authority Router → { Broad-Base + KB-2026.1-Slice (in-scope) } ``` ## Änderung - **SDK (Go):** neuer `LegalRAGClient.Retrieve()` + Endpoint **`POST /sdk/v1/rag/retrieve {query, top_k}`** (`authority_router.go`, Handler, Route). Fan-outet server-seitig über die Broad-Authority-Base (`RAG_ROUTER_COLLECTIONS`, Default = die 6 historischen Advisor-Collections) + die Slice bei `inKBScope`, merged + dedup, sortiert nach dem Authority-Score (`rerankByAuthority` läuft je Collection in `searchInternal`), top-K. Index-Warmup vor dem nebenläufigen Fan-out → kein `textIndexEnsured`-Map-Race. - **admin (TS):** `advisor-rag.ts` ruft **EINMAL** `/retrieve` statt 6-fach explizite Collections. `COMPLIANCE_COLLECTIONS`/`searchCollection` entfernt → Advisor collection-agnostisch (Vertrag `Compiler→Collections→Retriever→Advisor`). ## Validierung - **Go-Unit:** Router-Collection-Selektion (in-scope → Slice; out / routing-off → nicht), env-Override-Parsing, `dedupResults` (max-Score). - **e2e gegen dev-Qdrant** (echter `Retrieve()`, lokales bge-m3, CB-100-Stichprobe stride 5): **OLD-hit 11/20 → NEW-hit 15/20, GAIN 4 (alle DS-Guidance: WP248+WP243, GL07 ×2, TDDDG), REGR 0** — reproduziert den +28/0-Regr durch den Produktionscode-Pfad. - `go build`/`vet`/`gofmt` grün; TS-Tests auf den Single-`/retrieve`-Call angepasst. ## Rollback / Sicherheit Additiv: neuer Endpoint, `/search` (explizite Collections) unverändert für andere Consumer. `RAG_KB_SCOPE_ROUTING=false` → Router fällt auf die Broad-Base ohne Slice zurück (= bisheriges Advisor-Verhalten). Deploy ändert den **Live-Advisor-Pfad** (admin + ai-sdk) → Post-Deploy-Verify: DP-Frage am dev-Advisor liefert jetzt WP248/Guidance. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Benjamin_Boenisch added 1 commit 2026-06-30 12:13:49 +00:00
feat(advisor): Authority Router — Advisor collection-agnostisch, KB-2026.1-Gewinn im Produktpfad
CI / detect-changes (pull_request) Successful in 13s
CI / branch-name (pull_request) Successful in 2s
CI / guardrail-integrity (pull_request) Successful in 5s
CI / secret-scan (pull_request) Successful in 11s
CI / dep-audit (pull_request) Failing after 54s
CI / sbom-scan (pull_request) Failing after 1m1s
CI / build-sha-integrity (pull_request) Successful in 11s
CI / validate-canonical-controls (pull_request) Successful in 7s
CI / loc-budget (pull_request) Successful in 23s
CI / go-lint (pull_request) Successful in 53s
CI / python-lint (pull_request) Failing after 17s
CI / nodejs-lint (pull_request) Failing after 1m6s
CI / nodejs-build (pull_request) Successful in 2m59s
CI / test-go (pull_request) Successful in 1m0s
CI / iace-gt-coverage (pull_request) Successful in 17s
CI / test-python-backend (pull_request) Successful in 26s
CI / test-python-document-crawler (pull_request) Successful in 12s
CI / test-python-dsms-gateway (pull_request) Successful in 8s
1e5aaf7103
Der Advisor fan-outete bisher selbst ueber eine feste Liste expliziter Collections
(advisor-rag.ts) und umging damit das #61-Scope-Routing (das nur den Default-Pfad
routet) → der gemessene +28-Retrieval-Gewinn (CB-100: 53→81, 0 Regr) kam nie beim
Antwort-LLM an. Dieser Router zieht den Fan-out in die Retriever-Schicht:

- SDK: LegalRAGClient.Retrieve() + POST /sdk/v1/rag/retrieve {query, top_k} —
  fan-outet server-seitig ueber die Broad-Authority-Base + die KB-2026.1-Slice bei
  inKBScope, merge+dedup, sortiert nach Authority-Score (rerankByAuthority je
  Collection), top-K. Index-Warmup vor dem nebenlaeufigen Fan-out (Map-Race-frei).
  Per-Env via RAG_ROUTER_COLLECTIONS.
- admin: advisor-rag.ts ruft EINMAL /retrieve statt 6-fach expliziter Collections.
  Advisor ist collection-agnostisch (Vertrag Compiler→Collections→Retriever→Advisor);
  COMPLIANCE_COLLECTIONS/searchCollection entfernt.

Validierung: Go-Unit (Router-Selektion, dedup); e2e gegen dev-Qdrant (echter
Retrieve(), CB-100-Stichprobe stride 5): OLD-hit 11/20 → NEW-hit 15/20, GAIN 4
(alle DS-Guidance), REGR 0 — reproduziert den +28/0-Regr durch den Produktionscode.
TS-Tests auf den Single-/retrieve-Call angepasst.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Benjamin_Boenisch merged commit 08086ee75f into main 2026-06-30 12:26:53 +00:00
Sign in to join this conversation.