{"record":{"id":"7c17dcffeee2e4c7","repo":"ruvnet/RuView","slug":"min-confidence-must-be-between-0-0-and-1-0","errorCode":null,"errorMessage":"min_confidence must be between 0.0 and 1.0","messagePattern":"min_confidence must be between 0\\.0 and 1\\.0","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"warning","filePath":"archive/v1/src/api/dependencies.py","lineNumber":388,"sourceCode":"class QueryFilters:\n    \"\"\"Common query filters.\"\"\"\n    \n    def __init__(\n        self,\n        start_time: Optional[str] = None,\n        end_time: Optional[str] = None,\n        min_confidence: Optional[float] = None,\n        activity: Optional[str] = None\n    ):\n        self.start_time = start_time\n        self.end_time = end_time\n        self.min_confidence = min_confidence\n        self.activity = activity\n        \n        # Validate confidence\n        if min_confidence is not None:\n            if not 0.0 <= min_confidence <= 1.0:\n                raise HTTPException(\n                    status_code=status.HTTP_400_BAD_REQUEST,\n                    detail=\"min_confidence must be between 0.0 and 1.0\"\n                )\n\n\ndef get_query_filters(\n    start_time: Optional[str] = None,\n    end_time: Optional[str] = None,\n    min_confidence: Optional[float] = None,\n    activity: Optional[str] = None\n) -> QueryFilters:\n    \"\"\"Get query filters.\"\"\"\n    return QueryFilters(\n        start_time=start_time,\n        end_time=end_time,\n        min_confidence=min_confidence,\n        activity=activity\n    )","sourceCodeStart":370,"sourceCodeEnd":406,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/archive/v1/src/api/dependencies.py#L370-L406","documentation":"Raised as HTTP 400 by the QueryFilters dependency at dependencies.py:388 when min_confidence is supplied outside the closed interval [0.0, 1.0]. Confidence is a probability fraction in this system, not a percentage; None (parameter omitted) skips the check entirely.","triggerScenarios":"A filtered listing endpoint called with ?min_confidence=1.2, ?min_confidence=-0.1, or a percentage like ?min_confidence=80 (anything not in [0.0, 1.0]).","commonSituations":"A 0-100 UI slider value is sent without dividing by 100; a caller sends 5 meaning '5 percent'; a NaN serializes to an out-of-range float.","solutions":["Convert percentages to fractions before sending (80 percent becomes 0.8)","Clamp the value client-side to [0.0, 1.0]","Omit min_confidence entirely when no filtering is wanted — None is accepted"],"exampleFix":"# before\nparams = {'min_confidence': slider_percent}\n\n# after\nparams = {'min_confidence': slider_percent / 100.0}","handlingStrategy":"validation","validationCode":"def to_confidence(value):\n    c = float(value) / 100.0 if float(value) > 1.0 else float(value)\n    return round(min(1.0, max(0.0, c)), 4)\n\nparams = {'min_confidence': to_confidence(slider_percent)}","typeGuard":"def is_valid_confidence(c) -> bool:\n    return c is None or (isinstance(c, (int, float)) and 0.0 <= c <= 1.0)","tryCatchPattern":"resp = await client.get('/api/v1/detections', params=params)\nif resp.status_code == 400 and 'min_confidence' in resp.json().get('detail', ''):\n    params.pop('min_confidence', None)  # drop the filter and retry unfiltered\n    resp = await client.get('/api/v1/detections', params=params)","preventionTips":["Store confidence as a 0..1 fraction in client state; convert only at the UI layer","Omit min_confidence when no filter is wanted — None is accepted","Guard against NaN before sending"],"tags":["python","fastapi","validation","query-params","http-400"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}