Status: v1.10-additiv ab 2026-05-15 (Deep #24). Customer-driven Scope-Erweiterung aus der Mail Katharina Meißner-Schöller 2026-05-13: „inwiefern zu den jeweiligen Fragen Forschungsexpertise in Wien besteht und, falls ja, welche (etwa 1–3) Forschenden …". Vollspec: docs/prd/2026-05-15-forschende-mapping.md. Empirisches Briefing aller hier referenzierten API-Annahmen: _research/openalex-recon-2026-05-15.md (~25 min Spike, 13 ROR-Lookups, 3 Pilot-WFK-Topic-Discoveries, Rate-Limit-Verifikation).
21.1 Ziel
Pro WFK-Forschungsfrage werden 1–3 in Wien aktive Forschende (an Wien-Hochschulen oder Wien-relevanten außeruniversitären Forschungseinrichtungen) als zusätzliche Dimension im Forschungs-Brief gepflegt. Discovery ist voll-automatisch (OpenAlex-API + LLM-Translate + LLM-Re-Rank).
Ist-Stand (2026-08-13): Das Admin-Review-Gate (§21.5) ist als Spezifikation definiert und das Review-Tooling existiert (Admin-Edit-UI unter /admin/researchers, Reviewer-Rolle, dokumentiertes Urteil je Person, Stichproben-Report scripts/report-researcher-review.ts); ein verpflichtendes Gate vor Customer-Sichtbarkeit ist weiterhin nicht implementiert. Gemessen am 13.08.2026: von 456 publizierten Einträgen (177 distinct Personen) sind 0 menschlich verifiziert, 278 (61,0 %) tragen ein maschinelles Verifikations-Label und 178 (39,0 %) gar keines; dokumentierte menschliche Urteile: 0 von 177 Personen. Publizierte Einträge sind damit automatisiert ermittelt und LLM-kuratiert; die Expert:innen-Stichprobenprüfung steht aus (Issue #336).
Ergebnis-Felder: openalex_id, display_name, institution, optional orcid / public_profile_url + Provenance-Felder. orcid ist seit 2026-08-13 kein reines Ergebnis-Feld mehr: Wo eine ORCID vorliegt, wird die Anstellungsangabe gegen das ORCID-Register abgeglichen und mit Herkunft, Registry-Stand und Abrufdatum ausgewiesen — als Selbstauskunft der Person, nicht als Prüfung durch uns (Verfahren, Zahlen und Grenzen: §21.11). Customer-Render: Detail-Page-Block „Wiener Forschende", Card-Badge, Brief-Body-Sektion, PDF- und CSV-Export.
21.2 Pipeline-Schritte (6 enforced steps)
Die Reihenfolge ist nicht-verhandelbar (siehe PRD §4 Architecture und empirisches Briefing §6). Jeder Schritt schreibt sein Zwischen-Ergebnis ins Provenance-Sidecar data/researcher-provenance/<wfk-id>.json (Audit-Trail-Pflicht analog §19.3).
-
LLM-Translate (DE→EN). WFK-Frage (DE) → Anthropic Haiku-4-5 mit versioniertem Prompt prompts/forschende-translate.v1.md → 3–5 EN-Keywords + 1 kondensierter Topic-Query. Begründung: DE-Suche auf OpenAlex ist empirisch tot (Recon §3: /topics?search=KI Energieverbrauch Gebäude = 0 Treffer; EN-Äquivalent „building energy efficiency" = 5 Topics). Output landet in provenance.translate_output.
-
Topic-Discovery. EN-Keywords → GET /topics?search=<en-keywords> → Top-3 Topic-IDs + scores. Wenn best_topic.score ≥ 0.6: Topic-Pfad (Step 3). Topic-IDs werden NIE hardcoded — sie sind nicht stabil über Briefings hinweg (Recon §5 Edge-Case 6). Output: provenance.topic_discovery.
-
Authors by Topic+Institution. Topic-ID + Wien-ROR-Liste (§21.3) → GET /authors?filter=last_known_institutions.ror:<wien-list>,topics.id:<T>&sort=works_count:desc&per_page=25. Output: provenance.authors_raw (Top-25 Wien-Authors im Topic).
-
Works-Fallback (Trigger: topic_score < 0.6 ODER n_authors < 10). Bei schwachem Topic-Match Keyword-Search auf /works?search=<keywords>&filter=authorships.institutions.ror:<wien-list>&per_page=50 mit anschließendem Author-Rollup (Distinct-Author-Count gewichtet nach works_count). Begründung: Topics sind ein vorgefertigtes 4-Level-Cluster, nicht eine offene Tag-Wolke; Themen wie „Klimagerechtigkeit / Verwaltung & Klima" haben kein dediziertes Topic (Recon §3, §5 Edge-Case 3). Output: provenance.works_fallback.
-
Frische-Filter (Hard-Gate). Für jeden Author: prüfe affiliations[].years; behalte nur Authors mit ≥ 1 Wien-ROR-Affiliation in [today − 3y, today]. Begründung: last_known_institutions allein produziert „Retired-Researcher"-Hits; affiliations[] liefert Jahres-granulare Inst-Historie (Recon §4: Probe Lukas Kranzl years: [2026, 2025, 2024, 2023, 2022]). Output: provenance.fresh_filtered.
-
LLM-Re-Rank (optional, Feature-Flag). Top-10 Authors + Frage-Beschreibung → Anthropic Haiku-4-5 mit versioniertem Prompt prompts/forschende-rerank.v1.md → Re-Rank nach Topic-Fit (statt roher works_count-Sortierung). Adressiert den „Senior-General-vs-Topic-Fit"-Bias (Recon §5 Edge-Case 7: works_count-Sort privilegiert Senior-Autoren über Themen-Breite). Final Top-3. Output: provenance.final (+ optional Frontmatter-Write via --auto-write-frontmatter).
21.3 Wien-Institutions-Definition
12 Institutionen mit eindeutiger ROR + OpenAlex-ID, gepflegt in data/wien-institutions.yaml (Registry). Empirisch verifiziert in Recon §2:
| # | Institution | ROR | OpenAlex |
|---|---|---|---|
| 1 | University of Vienna | 03prydq77 | I129774422 |
| 2 | TU Wien | 04d836q62 | I145847075 |
| 3 | Medical University of Vienna | 05n3x4p02 | I76134821 |
| 4 | BOKU University | 057ff4y42 | I92869138 |
| 5 | Vienna University of Economics (WU) | 03yn8s215 | I102248843 |
| 6 | University of Veterinary Medicine Vienna | 01w6qp003 | I150540706 |
| 7 | IIASA (Laxenburg) | 02wfhk785 | I1317774081 |
| 8 | AIT (Austrian Institute of Technology) | 04knbh022 | I132118926 |
| 9 | GeoSphere Austria (ex-ZAMG) | 048dqgk17 | I2799949648 |
| 10 | WIFO | 0515pjs57 | I1315541505 |
| 11 | IHS (Institut für Höhere Studien) | 05ag62t55 | I4210156362 |
| 12 | Akademie der bildenden Künste Wien | 029djt864 | I5075986 |
CCCA-Aggregation (Sonderfall): Das Climate Change Centre Austria hat keinen eigenen ROR und keinen OpenAlex-Record (Recon §2). CCCA wird als virtuelle Aggregation über Member-Institutionen behandelt — alle CCCA-affiliierten Forschenden werden über ihre primäre Member-Inst (Uni Wien, BOKU, TU Wien, …) erfasst, die ohnehin in der 12er-Liste stehen. data/wien-institutions.yaml enthält dazu einen expliziten ccca_member_aggregation-Block mit Doku-Hinweis. Folge: kein ror:CCCA-Filter, kein „13. Institution"; Pipeline-Doku und Brief-Methodology-Sektion erklären die Aggregation, um Customer-Verwirrung („Wieso ist CCCA nicht in der Liste?") vorzubeugen.
21.4 Provenance-Pflicht (analog ADR-0006)
ADR-0006 (Source-Integrity-Policy) hat die F-121-Lehre — „kein customer-sichtbares Datum ohne nachvollziehbare Provenance" — für Quellen kodifiziert (§19). §21.4 zieht dieselbe Disziplin für Researcher-Records:
Hard-Requirements pro Researcher-Record (im Question-Frontmatter wiener_researchers[]):
openalex_id (Pattern ^A\d+$) — Stable-ID, primärer Anker. NIEMALS NULL bei einem aktiven Record. Ohne openalex_id kein Eintrag — freihändiges Hinzufügen „bekannter Wien-Forschender" ohne OpenAlex-Anchor ist explizit verboten (öffnet Halluzinations-Surface analog F-121).
discovered_at (ISO-Datetime) — Wann der Pipeline-Lauf den Record produziert hat.
verified_by (string) — auto (Auto-Discovery, kein Admin-Touch) | bernhard (Phase-1-Admin) | künftig user-ids bei Multi-Admin-Erweiterung.
Manual-Edit-Path: Sobald ein Admin im Dashboard-Edit-UI (siehe ADR-0007) einen Record ändert (reject / accept / pin neuer Researcher / Inst-Korrektur), gilt:
manually_edited: true wird gesetzt.
- Im Sidecar
data/researcher-provenance/<wfk-id>.json wird edit_history[] um ein Append-only-Entry { ts, user, action, before, after } erweitert. Sidecar-Pattern analog ADR-0004 (mutating metadata).
- Sidecar-Files sind gecommittet (Audit-Trail-Pflicht), keine Gitignore-Ausnahme.
Audit-Trail-Format (analog §19.3, verified_by-String-Variante für Researcher):
verified_by: "forschende-pipeline-2026-05-15:auto" # auto-discovered, no admin touch
verified_by: "forschende-pipeline-2026-05-15:bernhard" # admin-reviewed/edited
Rationale: Der Quellen-Integritäts-Audit (§18) hat gezeigt, dass auto-generierte Daten ohne expliziten Provenance-Trail nicht vertrauenswürdig genug für die Auslieferung sind — deshalb der verpflichtende Verifikations-Nachweis vor jeder Aufnahme. Researcher-Records sind ähnlich exponiert: Eine Kund:in kann zu jedem Researcher fragen „Wo kommt der her?", und die Antwort muss in unter 30 Sekunden aus dem Sidecar reproduzierbar sein (PRD AC-10).
21.5 Admin-Review-Gate
Pipeline-Output ist NIEMALS automatisch customer-sichtbar. Zwischen Auto-Discovery (Step 6) und Brief-Render gibt es einen explizit verpflichtenden Admin-Review-Gate:
- Pipeline schreibt
provenance.final ins Sidecar — Frontmatter-Feld wiener_researchers bleibt zunächst leer (oder mit status: pending-review-Marker im Sidecar, je nach Implementation-Detail-W3).
- Admin (in Phase 1: Bernhard, via Admin-UI
/admin/researchers/[wfk-id]) prüft das Auto-Ergebnis: accept / reject / edit / add-pinned. Optionaler Feedback-Eintrag (§21.6).
- Nach explizitem „Save"-Action wird das Frontmatter geschrieben (
questions/<wfk-id>.md Frontmatter-Update + Git-Commit via Pre-Commit-Hook). Erst jetzt ist der Record für Detail-Page / Card-Badge / PDF / CSV sichtbar.
Begründung (Lehre aus dem Quellen-Audit): Der Vollkorpus-Audit (§18) hat gezeigt, dass ohne expliziten Verifikations-Gate Quellen nicht-bestätigbarer Provenienz ins Korpus wandern können — die Konsequenz war die Quarantäne und der Ausschluss der betroffenen Einträge vor Auslieferung. §17 PhD-Reviewer-Pass und §18 Audit-Methode sind die strukturellen Antworten für Briefe und Quellen; §21.5 ist das Äquivalent für Researcher-Records: ein Mensch entscheidet, was kund:innen-sichtbar wird. Cross-Refs: §17 (PhD-Reviewer-Pass-Pattern), §18 (Source-Integrity-Audit-Methode), ADR-0006 (Source-Provenance-Policy).
21.6 Feedback-Loop
Auto-Discovery ist iterativ. Admin-Feedback wird strukturiert erfasst und in nachfolgende Pipeline-Läufe re-injiziert:
- Erfassung im Admin-UI: Freitext-Feld („Was sollte die Pipeline anders machen?") + Structured-Tags (
wrong-institution, not-active-anymore, wrong-topic-fit, missing-known-expert).
- Persistenz:
data/researcher-feedback/<wfk-id>.json (gecommittet).
- Re-Run-Mechanik: Bei
pnpm tsx scripts/discover-researchers.ts <wfk-id> --consider-feedback:
- bestehende Feedback-Items werden als Negativ-Beispiele in den LLM-Re-Rank-Prompt (Step 6) eingespeist;
- manuell-akzeptierte Researcher werden als pinned beibehalten (überleben Re-Discovery);
- das resultierende Provenance-Sidecar dokumentiert die Feedback-Berücksichtigung explizit (PRD AC-7).
Disziplin: Feedback ist kein Edit-Ersatz — wenn Bernhard einen Researcher rejected, wird das primär als edit_history-Eintrag im Provenance-Sidecar (§21.4) erfasst, das researcher-feedback/-File nimmt die Begründung auf für die nächste LLM-Iteration. Beides koexistiert.
21.7 Risks
Paraphrasiert aus PRD §5 (Risk-Table). Mitigations sind in der jeweiligen Pipeline-Stufe verankert; diese Sektion dient als methodische Sichtbarmachung für Folge-Audits.
- CCCA-No-Record. Das Climate Change Centre Austria hat keinen eigenen ROR/OpenAlex-Record — ein direkter
ror:CCCA-Filter ist unmöglich. Mitigation: virtuelle Aggregation über Member-Inst (§21.3); Pipeline-Doku + Brief-Methodology-Sektion erklären den Workaround.
- DE-Search-Tot. OpenAlex-Suche in DE liefert empirisch 0 Treffer für nicht-trivial-anglophone Begriffe (Recon §3). Mitigation: LLM-Translate-Step (Step 1) ist Pflicht, nicht Optimierung; Output-Validation auf Keywords-Format.
- Topic-Coverage-Skew. Topics sind ein vorgefertigtes 4-Level-Cluster — Themen wie „Klimagerechtigkeit / Verwaltung & Klima" haben kein dediziertes Topic, Topic-Match schwankt stark über Cluster (Recon §3, §5). Mitigation: Works-Fallback (Step 4) bei
score < 0.6 oder n_authors < 10; LLM-Re-Rank (Step 6) für Topic-Fit über bloße works_count-Sortierung.
- OpenAlex-Display-Name-Stale. Display-Namen können veraltet sein (Recon §2: GeoSphere Austria heißt im OpenAlex-Record noch „Central Institution for Meteorology and Geodynamics"). ROR-ID bleibt aber stabil. Mitigation: Wir filtern auf ROR, nicht auf Display-Name; Wien-Inst-Registry
data/wien-institutions.yaml pflegt den korrekten Display-Namen für Customer-Render.
- Works-Count-Bias.
sort=works_count:desc (Step 3) privilegiert Senior-Autoren mit hoher Gesamt-Output — die haben aber nicht zwingend den höchsten Topic-Fit (Recon §5 Edge-Case 7: Kranzl 196 works über alle Themen, davon Anteil im Topic-Cluster ggf. klein). Mitigation: LLM-Re-Rank (Step 6); zusätzlich Erfassung works_count_in_topic als Sekundärsignal in der Researcher-Record-Struktur.
21.8 Cross-Refs
- PRD
docs/prd/2026-05-15-forschende-mapping.md — Vollspec, AC-1…AC-10, Out-of-Scope-Begründungen, Risk-Table mit Probability + Mitigation-Spalten.
- ADR-0007 (NEU)
docs/adr/0007-application-level-auth-rbac.md — Application-Level Auth-Schicht für das Admin-Edit-UI (kontrollierte Erweiterung von ADR-0001 Markdown-SSOT um Session-State).
- Runbook
docs/runbook/forschende-discovery.md — Operative Anleitung (Re-Run, Rate-Limit-Handling, Feedback-Re-Inject-Flow), Output von Sub-Issue W2-E.
- Registry
data/wien-institutions.yaml — 12 ROR-IDs + CCCA-Aggregation-Block (siehe §21.3).
- ADR-0006
docs/adr/0006-source-integrity-policy.md — Vorbild für §21.4 (Provenance-Pflicht, analog für Quellen).
- ADR-0004
docs/adr/0004-sidecar-pattern-mutating-metadata.md — Vorbild für das Provenance-Sidecar-Pattern.
- §17 (PhD-Reviewer-Pass) + §18 (Audit-Method-v2) — Methodische Vorbilder für den Admin-Review-Gate (§21.5).
21.9 PhD-Coordinator-Pattern (Anthropic-API-Bypass)
Historischer Pilotstatus (2026-05-16, Deep #28): 45 Wiener Forschende (3 pro WFK, 15 Pilot-Fragen) wurden zero-cost via Coordinator-Subagents persistiert und verifiziert. Pattern war Bernhard-supervised — nicht voll-autonom.
21.9.1 Motivation
Die Standard-Discovery-Pipeline (§21.2) nutzt zwei Anthropic-API-Subschritte: LLM-Translate (Step 1, Haiku-4-5) und LLM-Re-Rank (Step 6, Haiku-4-5). Im historischen Pilotpfad für kleinere Runs (≤ ~50 WFK) erledigte ein Claude Code Coordinator (Opus 4.7 oder Sonnet, innerhalb einer laufenden Deep-Session) diese beiden LLM-Subschritte als Subagent-Calls direkt — ohne separaten Anthropic-API-Schlüssel, ohne Haiku-Kosten, ohne scripts/discover-researchers.ts-Orchestrierung.
Dieses Verfahren ist zweckmäßig wenn:
- Das Pilot-Set klein ist (≤ 15–50 WFK), sodass das Coordinator-Token-Budget der laufenden Session die Arbeit aufnehmen kann.
- Kosten-Sensitivität hoch ist (kein Anthropic-API-Guthaben, Staging-Phase, Prototyp-Validierung).
- Der Bernhard-Admin-Review-Gate (§21.5) ohnehin unmittelbar folgt — d.h. das Ergebnis muss sowieso vor Customer-Sichtbarkeit manuell geprüft werden.
Wann NICHT verwenden: Bei mehr als ~50 WFK in einem einzelnen Run, oder wenn Reproduzierbarkeit ohne aktive Session Pflicht ist → dann ist der API-Pfad (scripts/discover-researchers.ts + Haiku-4-5) ökonomisch und technisch sinnvoller. Kostenvergleich: siehe §21.9.5.
21.9.2 Architektur
Der Coordinator-Pattern ersetzt Step 1 (LLM-Translate) und Step 6 (LLM-Re-Rank) durch direkte Subagent-Calls innerhalb der Deep-Session. Die verbleibenden Steps 2–5 (OpenAlex-REST, Frische-Filter) bleiben identisch und werden vom Coordinator direkt via curl/Bash-Tool gegen die OpenAlex polite-pool-API ausgeführt (mit mailto-Parameter gemäß API-Etiquette).
Ablauf im Deep #28-Precedent:
-
Translate (Coordinator-intern): Der Coordinator übersetzt die DE-Frage direkt in 3–5 EN-Keywords + Topic-Query. Kein API-Call, keine Latenz — Sprachkompetenz ist im Modell vorhanden. Output landet als Inline-Reasoning im Sidecar-JSON (coordinator_reasoning-Feld).
-
OpenAlex-REST (direkt): GET /topics?search=<en-keywords> + GET /authors?filter=last_known_institutions.ror:<wien-list>,topics.id:<T>&sort=works_count:desc&per_page=25. Polite-Pool mit mailto=office@gotzendorfer.at. Raw-Response wird im Provenance-Sidecar als raw_openalex_response abgelegt (ADR-0006-Provenance-Pflicht; analog §21.4).
-
Frische-Filter (Hard-Gate): Identisch zu §21.2 Step 5 — affiliations[].years ≥ today − 3y für mindestens eine Wien-ROR-Affiliation. Dieser Gate ist nicht-verhandelbar; auch im Coordinator-Pattern gilt: kein Author ohne aktuelle Wien-Affiliation.
-
Re-Rank (Coordinator-intern): Der Coordinator rankt die Top-10 gefilterten Authors nach Topic-Fit semantisch neu (analog Haiku-Re-Rank-Prompt prompts/forschende-rerank.v1.md). Reasoning explizit dokumentiert im Sidecar (coordinator_reasoning-Feld, Freitext).
-
Parallelisierung: Im Deep-#28-Lauf wurden 3 Discovery-Subagents parallel geschickt, je Batch von 5 WFK. Damit war das gesamte Pilot-Set (15 WFK × 3 Authors) in ~30 Minuten abgearbeitet. Für einen Full-Run (204 WFK) wären entsprechend ~4 Batches à 50 WFK möglich — aber ab dieser Größe lohnt der API-Pfad (§21.9.5).
Wien-ROR-Registry: Identisch zu §21.3. Coordinator liest data/wien-institutions.yaml (12 Institutionen + CCCA-Aggregation). Kein Handcoding von ROR-IDs in den Subagent-Prompts — immer aus der Registry laden.
21.9.3 Editor ≠ Verifier-Pass
Gemäß Memory-Pattern feedback-walkthrough-prevet-then-decision (Editor ≠ Verifier on source-integration) wird jeder Author-Block von einem zweiten, unabhängigen Coordinator-Subagent gegen den primären OpenAlex-Record verifiziert, bevor der Record ins Frontmatter geschrieben wird.
Verifikations-Checklist pro Author-Record:
openalex_id auflösbar? (GET /authors/<A-id> → HTTP 200)
display_name im OpenAlex-Record identisch zum persistierten Namen?
- Mindestens 1 Wien-ROR-Affiliation im
affiliations[].institution.ror-Feld mit years-Eintrag ≥ heute − 3 Jahre?
works_count ≥ 3 (Minimal-Output-Schwelle, verhindert Ghost-Autoren)?
- Kein explizit falscher Topic-Fit (Verifier-Agent gibt Freitext-Begründung)?
Wenn mindestens eine Bedingung nicht erfüllt ist → Record wird verworfen, Coordinator-Note im Sidecar, nächster Author aus dem Top-10-Pool wird geprüft. Das Ergebnis des Verifier-Passes ist im Sidecar-Feld verified_by: "phd-curator-YYYY-MM-DD" festgehalten (analog §21.4-Provenance-Pflicht; Cross-Ref ADR-0006).
21.9.4 Provenance-Sidecar
Pflichtige Sidecar-Files unter _research/forschende-pilot-smoke-2026-05-15-sidecars/<WFK-id>.json. Mindest-Schema:
{
"wfk_id": "WFK-2.1.5",
"run_date": "2026-05-16T10:00:00Z",
"pattern": "phd-coordinator",
"coordinator_model": "claude-opus-4-7",
"translate_output": {
"en_keywords": ["building energy efficiency", "smart buildings", "heat pump"],
"topic_query": "energy efficient buildings Vienna"
},
"raw_openalex_response": { "...": "truncated or full response" },
"coordinator_reasoning": "Ranked Kranzl above Mahdavi because works_count_in_topic is higher despite lower overall works_count. Haas excluded: last Wien-affiliation 2019 (< today−3y).",
"fresh_filter_cutoff": "2023-05-16",
"final_top3": [
{ "openalex_id": "A2143292867", "display_name": "Lukas Kranzl", "verified": true },
{ "openalex_id": "A2023456789", "display_name": "Ardeshir Mahdavi", "verified": true },
{ "openalex_id": "A1987654321", "display_name": "Ulla Unger", "verified": true }
],
"verified_by": "phd-curator-2026-05-16"
}
Sidecar-Files sind gecommittet (Audit-Trail-Pflicht, analog ADR-0004). Sie sind nicht gitignored. Das verified_by-Suffix phd-curator-YYYY-MM-DD signalisiert, dass ein Coordinator-Agent (nicht auto-Pipeline, nicht direkter Bernhard-Edit) den Record verifiziert hat — Cross-Ref §21.4.
21.9.5 Cost-Comparison: API-Pfad vs. PhD-Coordinator-Pattern
| Dimension | API-Pfad (scripts/discover-researchers.ts + Haiku-4-5) | PhD-Coordinator-Pattern |
|---|---|---|
| Translate-Kosten | ~$0.001 pro WFK (Haiku Input/Output tokens, DE→EN 50 tokens in / 80 out) | 0 — Session-Token-Budget |
| Re-Rank-Kosten | ~$0.003 pro WFK (Haiku, Top-10 Authors × 200 tokens + Frage) | 0 — Session-Token-Budget |
| Full-Run 204 WFK | ~$0.82 total (604 Translate + 604 Re-Rank calls) | Session-Token-Budget-Druck — bei 204 WFK substanziell |
| Pilot-Set 15 WFK | ~$0.06 total | 0 Kosten, ~30 min Coordinator-Zeit |
| Reproduzierbarkeit | Skript-Run deterministisch, CI-kompatibel | Nur mit aktiver Session reproduzierbar |
| Autonomie | Voll-automatisch (mit --auto-write-frontmatter) | Bernhard-supervised (§21.5 Admin-Gate bleibt Pflicht) |
| Break-Even | Bei ≥ ~50 WFK lohnt API-Pfad | Optimal ≤ 50 WFK, Prototyp-Validierung, Staging |
Faustformel: Pilot-Set (≤ 15–20 WFK) → PhD-Coordinator-Pattern. Rollout (> 50 WFK) → API-Pfad. Dazwischen (20–50 WFK) → situative Entscheidung je nach Session-Token-Budget und Zeitdruck.
21.9.6 Cross-Refs
- §17 (PhD-Reviewer-Pass-Pattern) — Analoges Subagent-Delegation-Prinzip für Brief-Quality-Review; PhD-Coordinator-Pattern überträgt dieselbe Idee auf Discovery.
- §18 (Source-Integrity-Audit, Audit-Method-v2) — F-121-Lehre: Auto-generierte Daten ohne Verifikation sind nicht customer-trust-fähig. PhD-Coordinator-Pattern antwortet darauf mit explizitem Editor≠Verifier-Pass (§21.9.3).
- §21.2 (Pipeline-Schritte) — Coordinator-Pattern ersetzt Step 1 + Step 6; Steps 2–5 sind identisch.
- §21.4 (Provenance-Pflicht) —
verified_by: "phd-curator-YYYY-MM-DD" ist eine explizit definierte Variante im Provenance-Audit-Trail.
- §21.5 (Admin-Review-Gate) — Auch beim Coordinator-Pattern ist der Admin-Gate Pflicht vor Customer-Sichtbarkeit. Der Coordinator-Verifier-Pass (§21.9.3) ersetzt nicht den Admin-Gate — er ist ein zusätzlicher Pre-Gate.
- ADR-0006 (
docs/adr/0006-source-integrity-policy.md) — Provenance-Pflicht, auf Researcher-Records übertragen via §21.4; Sidecar-Pflicht analog ADR-0004.
- Memory
feedback-walkthrough-prevet-then-decision — Editor≠Verifier-Prinzip, das §21.9.3 strukturell umsetzt.
21.10 Geo-Diversität der Forschenden (opt-in GEO_DIVERSITY_V1, #279)
Status: Flag-gated opt-in (Default OFF), customer-gated bis zur Recall-Regressions-A/B. Eingeführt 2026-06-19 (#279).
Der Standard-Discovery-Pfad fordert eine aktuelle Wien-ROR-Affiliation (Frische-Filter §21.2 Step 5) — der Forschenden-Pool ist damit by-design 100 % Wien, und die Geo-Buckets at / eu / global bleiben strukturell leer. Die optionale Geo-Diversitäts-Fähigkeit (GEO_DIVERSITY_V1=1) lockert ausschließlich diesen Gate-3-Schritt: statt nur aktuell-Wien-affiliierter werden jemals-Wien-affiliierte, inzwischen im Ausland tätige Forschende gesourct (über die unveränderte deriveGeoBucket-Logik, die bei fehlender aktueller Wien-Affiliation automatisch at / eu / global liefert). Diese Forschenden werden mit ihrer aktuellen Nicht-Wien-Institution + Land dargestellt. Die Geo-Kandidat:innen laufen über den echten LLM-Rerank (RETRIEVAL_V2-Topic-Grounding) — daher die harte Abhängigkeit GEO_DIVERSITY_V1 ⇒ RETRIEVAL_V2=1; ohne echtes Rerank-Signal kollabierte das Ranking auf Zitationen × Recency = Senior-Generalisten-Bias (Lehre aus #264). Default OFF ist byte-identisch zur Baseline.
Recall-Regressions-Gate (Pflicht vor Default-Flip): Die Lockerung darf den Recall nicht verschlechtern. Validiert über eine LIVE-A/B (Set bakeoff-set-30, EU-gemma $0): final-recall darf nicht fallen (B ≥ A), pool-recall innerhalb von 2 pp; zusätzlich Geo-Fill-Erfolg ≥ 60 % der Fragen mit ≥ 1 at|eu|global-Eintrag und Median Nicht-Wien/Frage ≥ 1. Hält der Recall nicht, bleibt das Flag aus und das Ergebnis wird in #279 dokumentiert. Konsument der Geo-Buckets ist die bestehende DETAIL_UX_V2-Geo-UI (#271/#274, vier Buckets bereits gerendert) — kein UI-Change nötig. Seam-Begründung + Anti-PSA: ADR-0003-Amendment (2026-06-19). Operative Lauf-Anleitung: docs/runbook/forschende-full-run.md §5.7.
#279-Fix (deep-2 2026-06-20): Ein Defekt in scripts/discover-researchers.ts leerte final[] (kuratierten Top-3-Block) wenn GEO_DIVERSITY_V1=1 aktiv war: ever-Wien-abroad-Kandidat:innen füllten den Rerank-Shortlist vollständig, ohne dass aktuelle Wien-Forschende im Kandidaten-Pool verblieben, was zu ranked: [] ohne Fallback führte. Fix (pool-decoupling): Kurationspfad (applyFrischeFilter, aktuell-Wien) und Geo-Anreicherungspfad (applyEverWienFilter, ever-Wien) werden getrennt ausgeführt und erst danach zusammengeführt — ever-Wien-abroad-Kandidat:innen füllen Geo-Buckets, verdrängen aber nie mehr aktuelle Wien-Forschende aus dem Rerank-Pool. Flag-gated; GEO_DIVERSITY_V1=0-Baseline bleibt byte-identisch. Recall-Regressions-A/B (W3, bakeoff-set-30, EU gemma $0) PASSED: final-recall 5,1 % == Baseline ✅, geo-fill 96,7 % ✅, Wien-Forscher 975 == 975 ✅ — der final[]-Flip-Blocker aus deep-2 (2026-06-19) ist damit behoben.
Neuer Default-Flip-Blocker (#269, deep-2 2026-06-20): Die A/B offenbarte, dass works_count in der Geo-Bucket-Aggregation global misst (nicht Wien-spezifisch). Senior-Generalisten mit breitem Publikationsvolumen dominieren at/eu/global-Leaderboards — dieselbe #264-Klasse, nur im Geo-Bucket. Default bleibt OFF bis #269 (Wien-Topic-gewichteter Score in Geo-Buckets) gelöst und ein erneuter bakeoff-30 passiert. Kein Default-Flip vor #269-Behebung.
#269-Fix (2026-06-21 deep-1): Das works_count-Rauschen in den Geo-Buckets wird durch eine zweigliedrige Topic-Rerank-Schicht in buildEnrichedResearchers (scripts/discover-researchers.ts) behoben, gated hinter GEO_DIVERSITY_V1=1 (Baseline byte-identisch):
- Binärer Floor (
topicGroundedIds) — Autoren, deren OpenAlex-Kurz-ID in der topic-geerdeten Kandidatenmenge liegt (aus dem RETRIEVAL_V2-Grounding-Pfad), erhalten den Signal-Flag has_topic_signal=true. Autoren ohne Topic-Erdung werden aus nicht-Wien-Buckets herausgefiltert, wenn der Bucket noch kein GEO_TOPIC_FLOOR_MIN_RELEVANT (Konstante 1) topic-geerdetes Mitglied aufweist.
- Gradiertes bge-Relevanz-Signal (
RERANKER_V2) — Ist zusätzlich RERANKER_V2=1 aktiv, liefert das neue Modul scripts/lib/reranker-prefilter.ts einen Cross-Encoder-Score vom EU-Endpoint (bge-reranker-v2-m3, Cohere-style /rerank, EU_LLM_*). Autoren, die den bge-Prefilter überleben, erhalten topicRelevance = TOPIC_GROUNDED_FLOOR_RELEVANCE (Konstante 0.66) statt neutral 0,5 — unterhalb des Wien-Rerank-Bands, aber klar über dem ungeerdeten Generalisten-Score.
Autoren, die weder topic-geerdet noch bge-Survivor sind, bleiben im Pool nur wenn ihr Bucket ≥ GEO_TOPIC_FLOOR_MIN_RELEVANT topic-Anker enthält — andernfalls werden sie als Generalisten-Noise herausgefiltert. Default (GEO_DIVERSITY_V1=0) bleibt byte-identisch. Recall-Regressions-A/B-Gate (bakeoff-set-30, EU gemma $0) PASSED (2026-06-21 deep-1): geo-fill 100 % (4/4 Fragen), final-recall 5,1 % == Baseline ✅, pool-recall 23,1 % == Baseline ✅, 0 Crashes. GEO_DIVERSITY_V1-Default-Flip ist damit kein quality-Blocker mehr — bleibt #224-gated (via RETRIEVAL_V2 hard-dep). Runbook: docs/runbook/source-enrichment-regen.md §5.5 (GEO-on Regen, transient-empty-Guard, Cross-Ref zu #269 + bge-Prefilter-Modul).
21.11 ORCID-Registry-Abgleich der Anstellungsangaben (#335)
Status: Produktiv seit 2026-08-13. Datenbasis: 144 Sidecars data/orcid-employments/<wfk-id>.json mit 363 Personen-Zeilen (168 distinct Personen) und 746 Anstellungs-Einträgen, abgerufen über die öffentliche ORCID-API v3.0 (/employments, Pipeline-Pin fetch-orcid-employments@orcid-pub-v3.0). Schema-Vertrag: schemas/orcid-employments.zod.ts.
Anlass. Bis dahin stand die ORCID-Nummer unter dem Namen der Person, ohne dass an ihr irgendetwas geprüft war — eine Kennung direkt neben einer Institution liest sich wie ein Beleg für diese Institution. §21.11 schließt genau diese Lücke: Wir holen die Anstellungen, die die Person in ihrem eigenen ORCID-Record führt, und schreiben Herkunft und Stand sichtbar dazu.
Was angezeigt wird — wörtlich gleich im Forschungs-Brief, im Themen-Leaderboard und im PDF-Export:
ORCID-Eintrag (Selbstauskunft): Anstellung ‹Organisation› · Registry-Stand ‹MM.YYYY› · abgerufen ‹TT.MM.YYYY›
Bewusst nicht formuliert wird „Affiliation bestätigt am ‹Datum›". Das wäre in zwei Punkten falsch: Bestätigt hat die Angabe niemand — sie ist eine Selbstauskunft der Person, keine Prüfung durch uns oder durch die genannte Einrichtung. Und unser Abrufdatum sagt nichts über das Alter der Angabe aus, sondern nur darüber, wann wir sie gelesen haben. Deshalb stehen zwei getrennte Daten in der Zeile: der Registry-Stand (wann die Person ihren Eintrag zuletzt geändert hat, monatsgenau — ein Tagesdatum suggerierte eine Präzision, die die Quelle nicht hat) und das Abrufdatum.
Vier unterscheidbare Abruf-Zustände (363 Personen-Zeilen, Stand 13.08.2026):
| Zustand | n | Was die Anzeige sagt |
|---|---|---|
| ok | 287 | Anstellung(en) mit Organisation, Registry-Stand und Abrufdatum |
| no-employments | 46 | „ORCID-Registry abgefragt am ‹Datum› — keine Anstellung hinterlegt" |
| not-checked | 30 | „ORCID-Registry nicht abgefragt — Anstellung ungeprüft" |
| error | 0 | „Abruf fehlgeschlagen — Anstellung ungeprüft" |
„Abgefragt, nichts hinterlegt" ist ausdrücklich nicht dasselbe wie „nicht abgefragt" — im ersten Fall ist die Leere ein Befund, im zweiten fehlt uns schlicht die Grundlage. Das ORCID-Signal an der Person erscheint deshalb nur bei echter Registry-Deckung (ok oder no-employments); not-checked gilt nicht als geprüft. Fehlt ein Sidecar oder ist es unlesbar, entfällt die Herkunftszeile ersatzlos — es wird nie eine Deckung behauptet, die nicht vorliegt.
Qualitätsvorbehalt, in Zahlen. 668 der 746 Anstellungs-Einträge (89,5 %) sind self-asserted, also von der Person selbst eingetragen; 78 stammen aus dem System einer Einrichtung. Von den 393 laufenden Anstellungen wurden 176 (45 %) zuletzt vor 2023 geändert. Ein ORCID-Eintrag belegt damit, was eine Person über sich angegeben hat und wann zuletzt — nicht, dass die Angabe heute noch zutrifft.
Organisations-Auflösung (ROR). Die genannte Organisation wird, wo möglich, auf eine ROR-ID aufgelöst: 663 von 746 Einträgen (88,9 %) in drei Stufen — ORCID liefert bereits eine ROR-Quelle (202), Offline-Abgleich gegen die 12 kuratierten Wien-Institutionen aus data/wien-institutions.yaml (58), Online-Auflösung über api.ror.org/v2 (403). 83 Einträge (11,1 %) bleiben ohne ROR. Rohbezeichner anderer Register (RINGGOLD, GRID, FUNDREF) werden nie als ROR-ID ausgegeben — nur 202 der Einträge tragen überhaupt eine ROR-Rohquelle, wer den Rohwert blind übernähme, publizierte eine GRID-ID als ROR-ID.
Konflikte werden ausgewiesen, nicht still korrigiert. Der Validator scripts/validate/orcid-employments.ts meldet eine WARNung, wenn keine laufende ORCID-Anstellung zu der Institution passt, die der Brief für die Person führt. Erstmals belastbar gemessen (13.08.2026): 28 Konflikte bei 121 prüfbaren von 182 Institutions-Behauptungen; die übrigen 61 haben keine ORCID-Datengrundlage und werden weder als bestätigt noch als widerlegt gezählt. Ein Konflikt ist kein Fehler-Beweis (Personen wechseln, ORCID-Records veralten, Instituts-Namen weichen ab) — er ist ein Fall für die fachliche Prüfung. Automatisch korrigiert wird nichts.
Was offen bleibt. Der Abgleich prüft die Anstellung, nicht die thematische Zuordnung der Person zur Forschungsfrage — dafür gibt es weiterhin kein maschinelles Signal und bis heute (siehe §21.1) kein einziges dokumentiertes menschliches Urteil. Die 28 Konflikte und die Stichproben-Prüfung der Zuordnungen laufen zusammen in Issue #336.
Cross-Refs: §21.1 (Ist-Stand Verifikation) · §21.4 (Provenance-Pflicht) · §21.5 (Admin-Review-Gate) · ADR-0004 (Sidecar-Pattern) · ADR-0006 (kein customer-sichtbares Datum ohne Provenance) · schemas/orcid-employments.zod.ts · scripts/fetch-orcid-employments.ts · scripts/validate/orcid-employments.ts · Issues #335, #336.