Problem
SemanticDetectorNode._detect (src/natural_nav/natural_nav/semantic_detector.py:256) takes GroundingDINO's predict() phrase output via phrase.strip().lower() with no validation against the known prompt vocabulary.
Evidence
Confirmed on GPU (full 2Hz run): garbage labels appeared in /natural_nav/semantic_map alongside real ones:
##let door (BERT wordpiece continuation: pal + ##let = "pallet")
box cardboard box, pallet cardboard box table, pallet chair (multi-category merges across the " . "-separated prompt list)
Impact
- Pollutes the semantic map with labels the LLM planner can never usefully target.
- Confusing in any visualization or debug view of the map.
Proposed fix
DEFAULT_PROMPTS is a small, fixed, known vocabulary. Validate each returned phrase against it (exact match, or best-substring match) and drop/snap anything that doesn't correspond to a real prompt, instead of trusting GroundingDINO's raw phrase extraction.
Acceptance criteria
Problem
SemanticDetectorNode._detect(src/natural_nav/natural_nav/semantic_detector.py:256) takes GroundingDINO'spredict()phrase output viaphrase.strip().lower()with no validation against the known prompt vocabulary.Evidence
Confirmed on GPU (full 2Hz run): garbage labels appeared in
/natural_nav/semantic_mapalongside real ones:##let door(BERT wordpiece continuation:pal+##let= "pallet")box cardboard box,pallet cardboard box table,pallet chair(multi-category merges across the" . "-separated prompt list)Impact
Proposed fix
DEFAULT_PROMPTSis a small, fixed, known vocabulary. Validate each returned phrase against it (exact match, or best-substring match) and drop/snap anything that doesn't correspond to a real prompt, instead of trusting GroundingDINO's raw phrase extraction.Acceptance criteria
DEFAULT_PROMPTS(or a configured prompt list) ever reachesSemanticMap.update()._detect's output filtering.