@startuml actor User participant "API" as API participant "Orchestrator" as Orch participant "LcscCategoryResolver" as Resolver participant "LcscAdapter" as Adapter == Implemented == User -> API : POST /upload (file) API -> Orch : build_session(content, filename) Orch --> API : BomSession (rows: pending) API --> User : row table (HTMX) User -> API : GET .../row/{id}/scout API -> Orch : scout_row(session, row_id) Orch -> Resolver : resolve(row) Resolver --> Orch : [LcscCategory] (cache hit or Haiku call) Orch -> Orch : row.scout_candidates = [...]\nrow.state = scouting Orch --> API : row API --> User : candidate list (HTMX swap) User -> API : POST .../confirm-category {category_id, category_name} API -> Orch : confirm_category(session, row_id, category_id, category_name) Orch -> Orch : row.resolved_category_id = ...\nrow.applied_filters = {}\nrow.state = filtering Orch -> Adapter : query_facets(category_id, applied_filters) Adapter --> Orch : facet groups (Package/Manufacturer/...) Orch -> Adapter : search(category_id, params, applied_filters, page=1) Adapter --> Orch : SearchResult(items, count) Orch --> API : row (facet_groups, search_results set) API --> User : facets + results (HTMX swap) User -> API : POST .../apply-filter {group, value} API -> Orch : apply_filter(session, row_id, group, value) Orch -> Orch : applied_filters[key].append(value) Orch -> Adapter : query_facets(...) + search(...)\n(same as confirm-category) Adapter --> Orch : narrowed facets + SearchResult Orch --> API : row (updated) API --> User : narrowed facets + results (HTMX swap) User -> API : POST .../confirm {product_code} API -> Orch : confirm_pick(session, row_id, product_code) Orch -> Orch : row.confirmed_pick = \nrow.state = confirmed Orch --> API : row API --> User : confirmed summary (HTMX swap) == Designed, not yet built == User --> API : POST .../apply-filter {group: , value} note right : per-component param filters\n(Capacitance/Tolerance/...) -\nrequest shape unverified live User --> API : GET .../export API --> User : collated BOM (CSV/XLSX) @enduml