Personal Opportunity Intelligence System with career planning, startup intelligence, and AI-powered recommendations
SpectraScout exposes 20 tools via FastAPI HTTP interface. Tool definitions are visible in router files (chat.py, opportunities.py, profile.py, roadmap.py, main.py). However, critical gaps significantly undermine quality: (1) Parameter descriptions are sparse or missing for most tools, many inputs lack explanations of format, constraints, or valid values; (2) Output schemas are not documented anywhere in the visible codebase, no TypeScript interfaces, Pydantic response models, or JSON Schema specs shown; (3) Error handling is absent from tool definitions, no guidance for LLMs on recovery paths; (4) Tool descriptions are brief and lack actionable context (e.g., when to call send_message vs chat history); (5) No enums or type constraints visible for parameters like 'stream', 'year', 'work_style'. Input schemas exist but are minimal. This is a functional set of tools but falls short of production-grade agent tooling. Average tool quality: 52/100.
Clear all opportunities so user can start fresh without outdated results
Clear all chat conversation history
Mark a daily roadmap task as completed
Remove a single outdated or irrelevant opportunity by ID
Generate AI explanation mapping an opportunity to user profile (Why Recommended)
Generate AI-powered career roadmap based on user profile and optional questionnaire answers
Retrieve full chat conversation history
Output schemas not documented. No response type specs visible for any tool. LLMs cannot plan subsequent calls or extract data reliably without knowing what fields are returned.
Parameter descriptions missing or trivial for most tools. E.g., 'query' in manual_refresh lacks format guidance (free text? comma-separated?). 'stream' and 'year' in save_profile_form have no explanation of valid values.
Tool descriptions are generic and under 100 characters for many tools. E.g., 'Retrieve the current user profile' does not explain when to call get_profile vs update_profile, or what profile subsections exist. Descriptions should be 50 - 200 chars with actionable context.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 51 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Get 10-15 LeetCode DSA problem recommendations that user has NOT already solved
Get details of a specific opportunity by ID
Retrieve the current user profile
Get 6-8 portfolio project recommendations based on user skills to bridge gaps
Retrieve the current AI-generated career roadmap
Verify backend is running and healthy
Get all discovered opportunities sorted by score (highest first)
Manually trigger opportunity discovery with a custom search query
Trigger personalized opportunity discovery based on user profile (companies, roles, skills, interests)
Accept onboarding form and map it into user profile, triggering background skill graph and opportunity discovery
Send a message to the SpectraScout AI assistant and receive a response
Trigger intelligence engines to pull GitHub/LeetCode data and update skill graph
Update user profile with partial data (any fields)
No enums declared for constrained inputs. Fields like 'workStyle', 'learningPreference', 'locationPreference' in save_profile_form should declare valid options as enums to prevent hallucinated values.
No error handling guidance in tool definitions. Tools like clear_all_opportunities and delete_opportunity are destructive but lack recovery hints or confirmation patterns. LLMs will not know whether to retry, ask user, or bail.
Tool output may not include downstream chain references. E.g., get_opportunity should return opportunity fields that explain_opportunity and delete_opportunity need; no evidence of such cross-tool field alignment in visible schemas.
Natural-language identifiers not supported. Many tools require 'opp_id' (e.g., delete_opportunity, explain_opportunity), not human-friendly names. This forces agents to do extra lookups.
Pagination not visible for list tools. list_opportunities returns 'all opportunities sorted by score' with no limit, page, or offset params. Large result sets will blow context windows.
save_profile_form bundles 12 separate fields. Splitting into smaller targeted updates (e.g., update_basic_info, update_skills, update_preferences) would enable more precise agent composition and idempotent retries.