Summary
The Technology Stack dropdown on the recommendation page does nothing. get_recommendations accepts a tech_stack parameter, and the route + frontend both send it, but the parameter is never applied to the results. project_matches_tech — the function built to filter by tech stack — has zero callers. This is a regression of #1285 (which fixed the double get_recommendations call but never wired the filter itself) and means the feature requested in #936 is still non-functional.
Evidence
src/utils/recommender.py:618-644 defines project_matches_tech(project, tech_stack) with strict-boundary matching. A repo-wide grep shows the only occurrence of the name is its definition — it is never invoked.
src/utils/recommender.py:646-651:
def get_recommendations(skills_string, level, interest, time_availability, tech_stack="all", max_results=None):
The entire body (verified lines 646-821) iterates all_projects, scores each, and filters on is_relevant / final_score > 0 — tech_stack is never read.
The parameter is passed all the way through:
src/routes/main_routes.py:229-259 — tech_stack = (payload.get("tech_stack") or "").strip() and passed positionally to get_recommendations.
src/static/script.js:1044, 1087-1093 — the dropdown value is included in the POST body.
Impact
Suggested Fix
Apply project_matches_tech(project, tech_stack) inside get_recommendations (skip non-matching projects when tech_stack is not "all"), and add a test asserting the dropdown value changes the returned set.
Summary
The Technology Stack dropdown on the recommendation page does nothing.
get_recommendationsaccepts atech_stackparameter, and the route + frontend both send it, but the parameter is never applied to the results.project_matches_tech— the function built to filter by tech stack — has zero callers. This is a regression of #1285 (which fixed the doubleget_recommendationscall but never wired the filter itself) and means the feature requested in #936 is still non-functional.Evidence
src/utils/recommender.py:618-644definesproject_matches_tech(project, tech_stack)with strict-boundary matching. A repo-wide grep shows the only occurrence of the name is its definition — it is never invoked.src/utils/recommender.py:646-651:The entire body (verified lines 646-821) iterates
all_projects, scores each, and filters onis_relevant/final_score > 0—tech_stackis never read.The parameter is passed all the way through:
src/routes/main_routes.py:229-259—tech_stack = (payload.get("tech_stack") or "").strip()and passed positionally toget_recommendations.src/static/script.js:1044, 1087-1093— the dropdown value is included in the POST body.Impact
Suggested Fix
Apply
project_matches_tech(project, tech_stack)insideget_recommendations(skip non-matching projects whentech_stackis not "all"), and add a test asserting the dropdown value changes the returned set.