|
@@ -33,7 +33,7 @@
|
|
|
- [x] `api/main.py` — FastAPI app entry point + exception handlers (404 for not-found, 400 for `ScoutingValidationError`)
|
|
- [x] `api/main.py` — FastAPI app entry point + exception handlers (404 for not-found, 400 for `ScoutingValidationError`)
|
|
|
- [x] `POST /upload` — ingest file, return BomSession (HTMX-rendered row table)
|
|
- [x] `POST /upload` — ingest file, return BomSession (HTMX-rendered row table)
|
|
|
- [x] `GET /session/{id}/row/{row_id}/scout` — LLM category inference, HTMX-rendered candidate list (now with confirm buttons)
|
|
- [x] `GET /session/{id}/row/{row_id}/scout` — LLM category inference, HTMX-rendered candidate list (now with confirm buttons)
|
|
|
-- [x] `POST /session/{id}/row/{row_id}/confirm-category` — locks `resolved_category_id`/`resolved_category_name`, resets `applied_filters`, state → filtering, eagerly populates `facet_groups` + `search_results` via live LCSC calls
|
|
|
|
|
|
|
+- [x] `POST /session/{id}/row/{row_id}/confirm-category` — locks `resolved_category_id`/`resolved_category_name`, resets `applied_filters`, state → filtering, eagerly populates `facet_groups` + `search_results` via live LCSC calls; pre-seeds `encapValueList` from `normalized_params.package` when it exactly matches a live facet `Package` name (no match → left unfiltered, never guessed)
|
|
|
- [x] `POST /session/{id}/row/{row_id}/apply-filter` — applies a Package/Manufacturer facet value to `applied_filters`, re-runs facets + search — verified live: narrows `search_results` items to the selected package/manufacturer
|
|
- [x] `POST /session/{id}/row/{row_id}/apply-filter` — applies a Package/Manufacturer facet value to `applied_filters`, re-runs facets + search — verified live: narrows `search_results` items to the selected package/manufacturer
|
|
|
- [x] `POST /session/{id}/row/{row_id}/confirm` — locks `confirmed_pick` from `search_results` by `productCode`, state → confirmed
|
|
- [x] `POST /session/{id}/row/{row_id}/confirm` — locks `confirmed_pick` from `search_results` by `productCode`, state → confirmed
|
|
|
- [x] `bom_assistant/scouting/` — framework-agnostic orchestrator (`build_session`, `scout_row`, `confirm_category`, `apply_filter`, `confirm_pick`) backing the above
|
|
- [x] `bom_assistant/scouting/` — framework-agnostic orchestrator (`build_session`, `scout_row`, `confirm_category`, `apply_filter`, `confirm_pick`) backing the above
|
|
@@ -64,6 +64,7 @@
|
|
|
|
|
|
|
|
### Scouting Loop
|
|
### Scouting Loop
|
|
|
- [ ] Per-component param filters (Capacitance, Tolerance, Voltage Rating, ...) — facet response (`paramNameValueMap`) describes available values, but the exact request shape LCSC expects to *select* one was never captured live; wiring it blind risks a silently-broken filter. Needs another live traffic capture.
|
|
- [ ] Per-component param filters (Capacitance, Tolerance, Voltage Rating, ...) — facet response (`paramNameValueMap`) describes available values, but the exact request shape LCSC expects to *select* one was never captured live; wiring it blind risks a silently-broken filter. Needs another live traffic capture.
|
|
|
|
|
+- [ ] `Packaging` facet group (bulk/reel/tape) — same problem as param filters: `query_facets()` returns it, but no request field for *selecting* a value was ever captured (`_FILTER_DEFAULTS` in `lcsc.py` has no packaging-type key). User decision (2026-07-27): skip rather than guess a field name; revisit after a live traffic capture.
|
|
|
- [ ] Pagination past page 1 of search results
|
|
- [ ] Pagination past page 1 of search results
|
|
|
- [ ] Remove/toggle off an already-applied filter (currently additive-only within a session)
|
|
- [ ] Remove/toggle off an already-applied filter (currently additive-only within a session)
|
|
|
- [ ] Retry / re-scout flow when user rejects results or picks a different category
|
|
- [ ] Retry / re-scout flow when user rejects results or picks a different category
|