Skip to content

feat: rebuild thesis-finder as a database-less, university-wide skill#69

Open
dxmme wants to merge 125 commits into
mainfrom
feat/no-db-universal-skill
Open

feat: rebuild thesis-finder as a database-less, university-wide skill#69
dxmme wants to merge 125 commits into
mainfrom
feat/no-db-universal-skill

Conversation

@dxmme

@dxmme dxmme commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

Rebuilds the thesis-finder tool from a curated-database product into a portable, database-less Agent Skill: it interviews the student for a structured profile and then searches the live web (guided by Markdown reference backbones) to map thesis options across all University of Tübingen faculties and BW companies. Core principle: no runtime DB, no backend — the skill stays correct because it reads the live web instead of a store that rots.

What Changed

  • Phase 1 — University chair discovery: new find-university-chairs skill (faculty-agnostic, 6-dimension profile gate, two-pass search: backbone crawl + live enrichment), build-student-profile conversation discipline, faculty backbone + search-strategy references, eval ground truth for 4 faculties (CS, Medicine, Psychology, WiSo), retired the old DB-backed skills (match-thesis-advisors, update-openalex-paper-index).
  • Phase 2 — Company discovery: new find-company-thesis-options skill with a BW company backbone (~107 entries across 7 sectors, Cyber Valley + manual R&D additions), company search strategy, eval ground truth for 3 student profiles.
  • Phase 3 — Orchestration & distribution: thesis-finder/SKILL.md as the single entry point (interviews once, routes to chairs / companies / both), updated AGENTS.md and README.md for distribution, end-to-end smoke test, session-state persistence across searches.
  • Eval harness wired into Max's multiturn simulation framework with skill-vs-baseline comparison scoring (coverage/relevance/structure), plus fixture-mode tests that don't require live API calls.

Test Plan

  • Live validation (WebSearch) gate: all 4 faculties ≥70% recall, real margin over plain-Claude baseline (Psych 100%/83%, CS 100%/100%, Med 100%/83%, WiSo 100%/100%)
  • Phase 2 live validation: 100% recall across all 3 company profiles, +26pp mean over baseline
  • Phase 3 end-to-end smoke test: full student trace, no dead references
  • pytest full suite green (see STATUS.md dated log for gate history)

Known Issues / Not Yet Done

  • Company eval recall is circular (ground truth built from the same BW backbone the skill searches)
  • University eval needed two rounds of fixes (PI-attribution discipline, MPI-IS/ELLIS crawl leg) before clearing the bar — documented in findings/no_db_universal_skill/2026-06-28-I-fix-revalidation.md
  • Independent live test by a fresh user/group recommended before beta release; see STATUS.md for full status and MASTERPLAN.md for the overall plan

ValentinJSchmidt and others added 30 commits June 22, 2026 23:00
Captures current PhD rosters for the three pilot chairs as the recall
benchmark for PhD discovery (#47):
- Autonomous Learning / Distributed Intelligence (Georg Martius)
- Theory of Machine Learning (Ulrike von Luxburg)
- Autonomous Vision Group (Andreas Geiger)

Rosters were captured from each chair's official team page on
2026-06-22 via automated fetch. NOT final: entries still need
human verification against the live pages before this is treated as
authoritative ground truth. status values active/incoming/associated/
former are documented in the file header; only 'active' counts as a
recall target. Postdocs, research engineers and admin staff excluded.

Refs #46

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ground-truth PhD fixture for the 3 pilot chairs drafted and
committed as WIP; pending human verification.

Refs #46

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Former PhD alumni are removed from the ground-truth roster entirely.
People listed under a chair's 'Researcher' role are now treated as
active PhDs (Martius: Kloss, Kolev, Geist), while research engineers
remain excluded. Martius roster: 20 active, 0 former.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a 'postdoc' status counted as a recall target. von Luxburg gains
5 postdocs (Bhattacharjee, Bordt, König, Thiessen, Waller) confirmed
from the live team page. Martius and Geiger have no current postdoc
section, so none added there. Also backfill profile URLs for the three
Martius Researchers (Kloss, Kolev, Geist) found on the team page.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Establish the no-DB direction: the skill encodes how Claude interviews and
searches the live web instead of relying on a maintained database, working
for all Tübingen faculties.

- VISION_NO_DB.md: the direction at repo root
- findings/no_db_universal_skill/: concept, risks, and the exact A-H build plan
- MASTERPLAN.md: rewritten around Phase 1 = university discovery (Tasks A-H)
- STATUS.md: reset to track Tasks A-H; old DB phase archived
- CLAUDE.md: add small-commit rhythm and end-of-task handoff workflow
- One question per turn (max two only when tightly coupled); never a survey batch
- At interview start, ask student to answer precisely and concisely
- No search/discovery until profile covers all six dimensions:
  interests, liked/disliked courses, skills, experience, thesis style, no-gos
- Updated Interview Guidance and First Question section to match
- Task A complete
Add references/tuebingen-faculty-backbone.md: the official
uni-tuebingen.de listing pages for all 7 faculties plus the Center
for Islamic Theology, used as an anti-SEO-bias baseline for the
discovery skill. Each entry records the listing URL, page language,
how chairs are listed, and a last-checked date, plus notes on the
faculty -> Fachbereich -> chair nesting and per-department drill-down.

Update STATUS.md: mark Task B done and add a dated log line.
…table

Add a model-selection table and rule to §7: handoff prompts must now
specify which model to use for the next task (Sonnet 4.6 default,
Opus only for heavy reasoning/eval interpretation).
… (Task C)

Adds `skills/find-university-chairs/references/search-strategy.md`, the
core IP that turns a built student profile into precise Tübingen thesis-
discovery queries across all faculties.

Contains:
- Profile dimension → query variable extraction table (6 dimensions)
- Faculty routing table (18 interest rows → primary + secondary faculty)
- Two-pass strategy: (1) backbone crawl via tuebingen-faculty-backbone.md
  to get the full structured chair set; (2) live enrichment per chair for
  relevance, recency, and thesis openings
- 18 query skeleton templates in 5 categories (backbone, topic, openings,
  recency, interfaculty)
- Quality filters (source authority, date evidence, specificity)
- Dedup rules (chair vs. professor page, interfaculty double-listing)
- No-go exclusion table with keyword detection signals
- Required output structure (map of options + coverage caveat)
- Two worked examples walkable by hand: "Ethical AI in Education" and
  "Clinical Neuroscience / Neuroimaging"

Updates STATUS.md: Task C → ✅.
…scovery skill

Replaces the old CS-only seed-list workflow with a two-pass live-search
workflow that works across all Tübingen faculties:

- description frontmatter is now faculty-agnostic (any discipline)
- profile gate: all 6 dimensions required; defers to build-student-profile if shallow
- Step 3: faculty routing via references/search-strategy.md §2
- Step 4: Pass 1 backbone crawl via references/tuebingen-faculty-backbone.md
- Step 5: Pass 2 live enrichment using query skeletons from search-strategy.md §3–4
- Step 6–7: quality filters, dedup rules, no-go exclusion (search-strategy.md §5–7)
- Output: MAP grouped by interest dimension with pros/cons, dated evidence,
  conversation starter, no-go flags, and honest coverage caveat
- Removed all runtime references to seed files (professors/, chairs/, researchers/)
…kills

Both skills were designed for the DB-backed approach (OpenAlex index,
matching rubric, Celery/FastAPI pipeline). Now that find-university-chairs
is fully DB-free (Task D), these are dead code. Git history preserves them.
Professors, chairs, and researchers Markdown moved from
skills/find-university-chairs/references/ to
skills/tests/eval_ground_truth/cs_seed/.

This data was only referenced by the old DB pipeline; find-university-chairs
SKILL.md has had no runtime dependency on it since Task D. It now serves
as ground truth for Task F's eval (recall measurement for CS faculty).
…nd design-agent-skill

find-recent-papers: replaced dead path to professors/INDEX.md with
a reference to the find-university-chairs skill (or direct web search).

design-agent-skill: removed match-thesis-advisors and update-openalex-paper-index
from the Thesis-Finder Skill Pattern (both retired); removed "professor seed
index" as primary source (replaced by live web search).
Deleted match-thesis-advisors and update-openalex-paper-index, moved
CS seed data to eval ground truth, removed stale seed-path refs.
Hand-curated list of 6 Hertie Institute professors for the sample
interest "neurodegenerative diseases and clinical brain research".
Verified against HIH research pages (2026-06-27).
…ence interest)

Hand-curated list of 6 Psychologie Fachbereich supervisors for
"cognitive neuroscience and experimental decision-making". Verified
against uni-tuebingen.de Arbeitsbereiche pages (2026-06-27).
…olitical economy)

Hand-curated list of 7 supervisors across Institut für Politikwissenschaft
and Fachbereich Wirtschaftswissenschaft for the sample interest
"comparative politics and political economy". Verified via WiSo faculty
pages (2026-06-27).
…scoring guide

Defines: recall = surfaced / total ground-truth chairs, ≥70% target,
what counts as "surfaced", what the ground truth is NOT, and how to
score a skill run step by step. Links CS seed data.
4 faculties ground-truthed (CS via cs_seed, + Medicine, Psychology,
WiSo). README with recall metric written. Task G is next open.
New simulation files for Task G:
- neuro-student persona: Neurowissenschaften MSc student interested in
  neurodegenerative diseases (Parkinson's/Alzheimer's, protein aggregation)
- medicine-discovery-skill scenario: drives build-student-profile →
  find-university-chairs completion
- medicine-discovery-baseline scenario: same student, plain-Claude arm
- neuro-student-skill.json fixture: scripted run surfacing 5/6 HIH chairs
- neuro-student-baseline.json fixture: scripted run with no specific chair names
- rubric extended with discovery_coverage, discovery_relevance, discovery_structure
New functions in run_codex_multiturn_eval.py:
- MEDICINE_GROUND_TRUTH: inline chair list with last-name and relevance labels
- load_scenario_by_id(): load any scenario by filename stem
- score_coverage(): recall by last-name matching against ground-truth list
- score_relevance(): high-relevance fraction of surfaced chairs
- score_structure(): binary MAP-format check
- run_discovery_comparison(): loads both arms, scores all metrics, writes artifact
- _write_comparison_markdown(): markdown table summary
- --discovery-comparison CLI flag to run the comparison standalone
Five new test functions:
- test_discovery_scenario_resources_exist: checks persona, scenarios, fixtures
- test_coverage_scoring_detects_chair_names: unit test for score_coverage()
- test_skill_arm_fixture_has_higher_coverage_than_baseline: asserts skill > baseline
- test_skill_arm_fixture_passes_structure_check: asserts MAP format in skill run
- test_discovery_comparison_writes_artifact: end-to-end comparison artifact check
Fixture run: skill arm 83% recall (5/6 HIH chairs surfaced),
baseline 0% — gap +83pp on medicine faculty ground truth.
psych-student-skill: 6-turn scripted conversation with MAP output naming
all 6 Fachbereich Psychologie chairs (Bartels, Nürk, Friedrich, Huff,
Svaldi, Gawrilow). psych-student-baseline: vague 4-turn response with no
chair names — 0% recall.
wiso-student-skill: 6-turn scripted conversation naming all 7 WiSo chairs
(Diez, Abels, Schlumberger, Hasenclever, Bieling, Müller, Baten).
wiso-student-baseline: vague 4-turn response with 0% recall.
cs-student-skill: 6-turn scripted conversation naming all 7 CS/ML
researchers (Martius, Hennig, Hein, von Luxburg, Schölkopf, Brendel,
Bethge). cs-student-baseline: vague 4-turn response with 0% recall.
Add PSYCHOLOGY_, WISO_, CS_GROUND_TRUTH constants and FACULTY_CONFIGS
dict. Make score_structure() accept optional ground_truth param
(backward-compatible). Add _run_single_faculty_comparison(),
_write_faculty_comparison_markdown(), run_all_faculties_comparison(),
_write_all_faculties_summary(). Update --discovery-comparison to run
all 4 faculties instead of medicine only.

12/12 tests still pass.
dxmme added 30 commits July 3, 2026 14:45
…tness numbers to date

Pure aggregation, no new live run: one document collecting every eval
number produced so far (Task H/I/I-fix, Phase-2 2-E, Roadmap-J run 1,
Task O re-run, Task P, Task Q run 1, Task R), one table per roadmap
quality axis, each cell cited to its source file.

Headline finding stated plainly: the roadmap's "core is done" recall bar
(>=80% across >=6 faculties incl. one hard faculty) is not yet met - only
5 faculties have a live number, and the one hard faculty tested
(Humanities, 60%) is below bar, root-caused to an eval-protocol gap in
the test persona rather than a skill defect. Law/Theology have ground
truth but no live run yet; Task S has zero data points.

Also catches up docs/thesis-report/03 and 04 with parallel-session
progress that had landed since they were written: Task Q's blind run
and Task R both actually completed (previously described as
deferred/not-started).
Task S found that 2 of 5 live discovery transcripts (cs-skill,
wiso-skill) omitted the required "Dated evidence" field from every
option in the map. Adding a concrete worked example makes the
expected field set unambiguous instead of relying on a bare bullet
list.
Reviewed the 5 full live discovery transcripts against the roadmap's
5 output-quality criteria. 4/5 pass cleanly; found one repeated gap
(dated evidence omitted in 2/5 transcripts, fixed in the prior
commit). Ran a live happy-path interview simulation for criterion 5
since no such transcript existed in the repo — 6-turn clean
convergence, contrasted with Task R edge case 2's 8-turn adversarial
non-convergence.
…rd faculties

Explicit go/no-go over existing eval evidence (no new live run) now that
Tracks 1-4 are complete. Scores roadmap §4's five 'core is done' criteria:
steering (Task P), output quality (Task S), edge-case robustness (Task R)
all met; precision strong but under-sampled; recall criterion NOT met on
two independent counts — only 5 faculties measured (not >=6), and no hard
faculty has a clean live >=80% (Humanities 60%, protocol-caveated).

The Humanities shortfall is root-caused to the eval protocol (personas
built from the README's lossy one-line summaries, not the GT files' full
sample interest), not a skill defect — the crawl found all 5 GT chairs.
Not converted to GO: prior 'gate GREEN'-on-partial-evidence burn, and no
schedule pressure since Phase 2 is already GREEN.

Names Task T (protocol fix + blind re-run Humanities + blind-run Law) as
the closeout. Decision doc + STATUS row/log/phase note added. No skill
files touched.
…y README summary

Reconcile runbook steps 2/3: the persona must be built from each GT
file's full 'Sample interest:' line (extracted via grep, which does
not reveal the chair list), not the README's one-line summary table.
The README summaries drop qualifying clauses and were the documented
root cause of the Humanities 60% run (dropped 'history of the field'
clause -> spurious historical-work no-go excluding 2 found chairs).
No-peeking now has an explicit carve-out for the single sample-interest
line. Eval-harness fix, not a skill change.
…core (100%)

Law blind run under corrected persona protocol: recall 3/5=60%,
precision 3/3=100%. Discovery found all 5 GT chairs; the 60% is a
downstream filter miss. Root cause is a real skill finding: Remmert
excluded at the topical-justification step from her multi-strand title
without Pass-2 enrichment, but her actual focus (Allgemeine
Grundrechtslehren) is a core constitutional-law/human-rights match ->
false-negative. Names Task U (enrich-before-exclude rule + re-run Law).

Humanities corrected re-score (transparent, un-blind): 3/5->5/5=100%.
Both prior misses (Corcilius, Doering) flip to Include once the full
sample interest restores the dropped clauses. Validates the protocol fix.
…% -> Task U

Original Humanities blocker resolved (60%->100% under fixed persona
protocol, validating the eval-protocol fix). Blind Law run surfaced a
new real defect: Remmert excluded at the topical-justification step
without Pass-2 enrichment despite a core constitutional-law/human-rights
focus (Allgemeine Grundrechtslehren). 5 of 6 faculties now clear 80%;
Law is the sole miss. NO-GO stands (transformed). Names Task U (add a
§5 enrich-before-exclude rule + re-run Law -> flip to GO if >=80%).
Updates decision-doc banner, STATUS Task T/U rows + dated log; adds
task-t-recall-closeout findings entry.
Task U. Symmetric dual of the Butz over-inclusion worked example: a
chair whose own title names a core-interest field (amid off-interest
strands) must be Pass-2 enriched before being excluded at the topical-
justification step. Title-only exclusion produced a Task T false-
negative on Prof. Barbara Remmert (Law) — her dense multi-strand title
reads economic/municipal law, but her actual Schwerpunkte (Allgemeine
Grundrechtslehren) are a core constitutional-law match. Adds the rule
to search-strategy.md §5 plus a matching one-liner to SKILL.md Step 7.
Blind re-run of Law under the §5 enrich-before-exclude fix: 4/5 = 80%
recall (Remmert now surfaces via Pass-2 enrichment of her Schwerpunkte,
Saurer remains an honest defensible miss), 4/4 = 100% precision. All 6
measured faculties now clear the 80% recall bar (2 of them hard), so
roadmap §4 criterion 1 is met. Flips the go/no-go verdict to GO and
updates the aggregate scorecard and STATUS.md to match.
…s open

MASTERPLAN.md's Phase 4 section still read "current"; Task T+U closed the
recall gap and flipped the roadmap §4 go/no-go to GO on 2026-07-04. Updated
the phase heading and added pointers to the go-no-go verdict and the
aggregate scorecard. Added an explicit "Phase 5 - not yet scoped" note
since Task U was the last task on the critical path and no next task is
named yet - this is a real open decision point, not an oversight.

The eval-aggregate-scorecard's Task S section still said "not measured,
zero data points" - stale since Task S actually completed (4/5 criteria
pass) before Task T/U even ran. Corrected to match STATUS.md's Task S row.
…p analysis

Researches all 7 faculties + ZITh live (not the CS-only degree-programs.md
the task brief pointed at, which turned out to only cover Informatik) and
clusters them into a 13-field taxonomy. Gap analysis shows which fields are
underserved in bw-company-backbone.md before curation.
…lties

Adds 6 new sections (Chemie/Materialwissenschaft, extended Umwelt/Energie/
Geowissenschaften, Wirtschaft/Consulting/Versicherung, Sozialwissenschaften/
Marktforschung, Bildung/EdTech, Medien/Verlage/Sprache, Sport/Gesundheits-
technologie) with 16 new live-verified entries, cross-tags 4 existing rows
(Bosch, Bosch eBike Systems, Mercedes-Benz for ux-research; existing HR-tech/
edtech/consulting tags already sufficient elsewhere), adds a Thesis-Kultur
column across all 13 tables, and adds a Studiengangs-Routing table mapping
all 13 employment fields to backbone sections/tags. Underserved fields
(Recht/Legal Tech, Theologie/Philosophie, Sozialwissenschaften) are
documented as honest gaps rather than padded, per the anti-bias rules.

company-search-strategy.md §2.1 and SKILL.md Step 3 updated to reference the
new field-tag vocabulary and the Studiengangs-Routing table.
…ke test

GFT and Haufe rows were missing the consulting/verlag tags the new
Studiengangs-Routing table claimed they had — added them so the table's
claims match the actual backbone data. Also records the honest EdTech
persona smoke test result (2-3 candidates, below the 5-20 target) in the
Task L findings doc, and confirms the existing SKILL.md disambiguation
fallback already handles that case correctly.
…faculties)

Records the merge of task/L-company-backbone into feat/no-db-universal-skill:
13-field employment taxonomy, 16 new live-verified backbone entries across
6 new sections, Thesis-Kultur column, Studiengangs-Routing table, and honest
documentation of fields that stayed thin despite real research effort.
…en-work

An untracked root file with raw notes from an informal test session
(one external tester + Domi's own follow-up ideas) needed a home before
the branch could be pushed clean. Moved to docs/thesis-report/04-open-work/
with a dated filename and a synthesis paragraph in the section README:
explicitly flagged as informal (no protocol, no ground truth, one tester)
so it isn't mistaken for a designed eval run, but kept as the first real
data point toward the still-open independent-validation item, with three
concrete product-idea signals extracted for whoever picks that up next.
…er next

Project is being set aside for a while. Added an explicit pause banner
at the top of "Current phase" as the designated re-entry point: exact
git/test state, phase summary, and the concrete next task (work through
docs/thesis-report/04-open-work/2026-07-04-feedback-gehler.md's three
extracted signals) named up front so resuming doesn't require
re-deriving context from the full task history.

No skill logic touched - documentation only.
Add a one-time framing message before Step N1's interview begins,
explaining what the skill does, that answer detail is the student's
choice, and that the track choice comes after the profile is built.
Grepped for Master-specific wording in thesis-finder/SKILL.md — none
found, so no further fixes needed there.
Before drafting a first-contact email, ensure 1-2 relevant recent
papers from the target person/lab are surfaced (via find-recent-papers
if not already available) and recommend the student skim them first,
so contact doesn't read as generic.
Task M2 (recommend + drill-down in thesis-finder) is next.
Adds a recommend-and-drill-down step between the option map delivery and
the draft-thesis-contact offer, in both New User (N5, renumbering the
offer to N6) and Returning User (R6, renumbering the offer to R7) flows.
Reuses the find-recent-papers pattern from draft-thesis-contact (Task M3)
for the drill-down; recommendation and drill-down summary are grounded
only in the option map's existing fields and fetched papers, no invented
facts. Addresses the Gehler feedback signal "tell me which one you would
choose and walk a bit more down that road."
The Task M plan file existed on disk since 2026-07-05 but was never added to
git despite being linked from STATUS.md and two commit messages. Adding it
alongside the new independent 1.0-readiness review, which assesses the
project's 1.0 claim for both the thesis committee and real students and
scopes the remaining path as Phase 5 (see MASTERPLAN.md / STATUS.md follow-up
commits).
…V-AA)

The 2026-07-05 independent 1.0-readiness review found the two hard-faculty
recall numbers behind the 2026-07-04 GO verdict (Humanities, Law) are not
clean blind measurements. This does not reverse the GO (the underlying Task U
skill fix is real and independently corroborated) but flags it provisional
pending one clean blind hard-faculty run.

Phase 5 was previously "not yet scoped" with three undecided candidates.
Replaced with a concrete task table (Tasks V-AA) derived from the review:
blind Theology run, the scope-erosion experiment, independent scoring,
non-circular company ground truth, a protocolled external test plus
distribution, and a hygiene sweep. Old §9 renumbered to §10.
Threads the 2026-07-05 independent review through STATUS.md: updated the
"Last update" line, rewrote the "Current phase" re-entry banner to summarize
the review's five findings and point at Phase 5 Tasks V-AA, added the
provisional-GO caveat to the Phase 4/5 summary paragraphs, added a Phase 5
task table (Tasks V-AA) mirroring the existing Phase 2/3 table format, and
appended a dated log entry describing what was actioned and why. Project is
re-paused here; recommended next task on resume is Task V, then Task W.

No skill, reference, or eval-artifact files were touched (read-only review
per its own mandate). pytest -q (29 passed/8 skipped) and
build_skill_release.py re-verified green after this pass.
…review

docs/thesis-report/03 and 04 still described a stale 2026-07-03 snapshot
(recall bar "not yet met", Task S "no data at all yet") that had been
superseded by Tasks T/U/S but never synced into the thesis-facing narrative
— a real inconsistency a committee reader would trip over. Corrected both to
state the current GO-provisional status directly, with the specific
blindness caveat (Humanities re-score, Law contaminated re-run) inline
instead of only in a linked findings file.

Also: noted that Gehler feedback signals (1) and (2) were since implemented
(Tasks M1/M2, not yet live-re-verified); added the review's dose-response
reframing of the scope-erosion argument to the scope-question section;
updated decision-log.md with the Task T/U GO flip and the two 2026-07-05
review decisions; linked the review from the top-level reading table and
synthesis paragraph.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants