First-time setup: fastapi/uvicorn/starlette are listed in requirements.txt but are not installed by default in a fresh .venv — run pip install -r requirements.txt before running the API.
ComponentCategory.other maps to an empty subcategory list in suppliers/lcsc/categories.py:89 (_SUBCATEGORY_NAMES[other] = []) — rows classified as other can never resolve to an LCSC subcategory. Needs a taxonomy decision (which LCSC categories represent the catch-all), not a code fix.
suppliers/lcsc/enrich_categories.py + make_enrich_input.py / apply_enrich_output.py — scrape example products + LLM one-line descriptions per subcategory, applied to all 600/600
BomRow state machine transitions wired to category resolver + search adapter
Retry / re-scout flow when user rejects results or picks a different category
API
FastAPI app entry point (api/main.py)
POST /upload — ingest file, return BomSession
GET /session/{id} — return session state
GET /session/{id}/row/{row_id}/scout — LLM category inference, return {subcategory, alternatives[]}
POST /session/{id}/row/{row_id}/confirm-category — lock LCSC subcategory, advance state to filtering — deferred until category inference is validated interactively (only inference itself has been tested so far, not the full loop)
POST /session/{id}/row/{row_id}/search — search within confirmed category + param filters — deferred, same reason
POST /session/{id}/row/{row_id}/confirm — lock part pick, advance state to confirmed — deferred, same reason
GET /session/{id}/export — collate confirmed picks → downloadable BOM — deferred, same reason
Future: Other Suppliers
DigiKey adapter
Mouser adapter
Nexar adapter
Frontend
HTMX-based test page (server-rendered by FastAPI, no separate frontend process) for interactively testing category inference — backbone, in progress
React scaffold + build setup — deferred until the scouting loop is validated; HTMX test page covers interim needs