{"record":{"id":"d9ba5f7d96735285","repo":"multica-ai/multica","slug":"invalid-runtime-provider-summary","errorCode":null,"errorMessage":"invalid runtime provider summary","messagePattern":"invalid runtime provider summary","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"warning","filePath":"server/internal/handler/client_usage.go","lineNumber":211,"sourceCode":"\t\tif probe.RuntimeCount != nil || probe.ProviderSummary != nil || probe.OnlineCount != nil || probe.OfflineCount != nil {\n\t\t\treturn validatedRuntimeProbe{}, errors.New(\"failed runtime probes must not include counts\")\n\t\t}\n\t\treturn validated, nil\n\t}\n\n\tif probe.RuntimeCount == nil || probe.ProviderSummary == nil || probe.OnlineCount == nil || probe.OfflineCount == nil {\n\t\treturn validatedRuntimeProbe{}, errors.New(\"successful runtime probes require all counts\")\n\t}\n\tif *probe.RuntimeCount < 0 || *probe.RuntimeCount > 1000 || *probe.OnlineCount < 0 || *probe.OfflineCount < 0 || *probe.OnlineCount+*probe.OfflineCount != *probe.RuntimeCount {\n\t\treturn validatedRuntimeProbe{}, errors.New(\"invalid runtime counts\")\n\t}\n\tif len(probe.ProviderSummary) > 32 {\n\t\treturn validatedRuntimeProbe{}, errors.New(\"too many runtime providers\")\n\t}\n\tvar providerTotal int64\n\tfor provider, count := range probe.ProviderSummary {\n\t\tif !providerNamePattern.MatchString(provider) || count < 0 || count > 1000 {\n\t\t\treturn validatedRuntimeProbe{}, errors.New(\"invalid runtime provider summary\")\n\t\t}\n\t\tproviderTotal += int64(count)\n\t}\n\tif providerTotal != int64(*probe.RuntimeCount) {\n\t\treturn validatedRuntimeProbe{}, errors.New(\"runtime provider counts do not match runtime_count\")\n\t}\n\tsummary, err := json.Marshal(probe.ProviderSummary)\n\tif err != nil {\n\t\treturn validatedRuntimeProbe{}, errors.New(\"invalid runtime provider summary\")\n\t}\n\tvalidated.RuntimeCount = pgtype.Int4{Int32: *probe.RuntimeCount, Valid: true}\n\tvalidated.ProviderSummary = summary\n\tvalidated.OnlineCount = pgtype.Int4{Int32: *probe.OnlineCount, Valid: true}\n\tvalidated.OfflineCount = pgtype.Int4{Int32: *probe.OfflineCount, Valid: true}\n\treturn validated, nil\n}\n","sourceCodeStart":193,"sourceCodeEnd":228,"githubUrl":"https://github.com/multica-ai/multica/blob/2c0912b6ec764b373d44eeea1e80f0d9f11ab417/server/internal/handler/client_usage.go#L193-L228","documentation":"Two paths inside validateClientUsageRuntime produce 'invalid runtime provider summary': (a) a provider key that fails providerNamePattern, or a per-provider count outside 0..1000; (b) json.Marshal of the (already unmarshaled) summary map fails, which for map[string]Int is effectively unreachable but kept as a guard. Path (a) is the real-world one: provider names must match the expected name pattern and each provider's count must be a plausible non-negative integer within the same cap as runtime_count.","triggerScenarios":"POST a success probe with a provider key containing spaces, slashes, or leading digits (whatever providerNamePattern disallows), or with {\"openai\": -1} or {\"openai\": 2000} per-provider counts.","commonSituations":"Embedding versions/URLs/usernames in provider keys ('openai/v1', 'my org'); negative counts from a diffing bug; per-provider counts computed against a different snapshot than the total so one bucket exceeds 1000 after merging.","solutions":["Use plain, stable provider identifiers as keys (same vocabulary as the platform's provider names).","Validate each entry client-side: name matches the provider pattern and 0 <= count <= 1000.","Recompute per-provider counts from the same snapshot used for runtime_count.","Strip dynamic suffixes from provider names before summarizing."],"exampleFix":"// before\nsummary[`${provider} @ ${endpoint}`] += 1;\n\n// after\nsummary[provider] += 1; // bare provider name, count within 0..1000","handlingStrategy":"validation","validationCode":"const PROVIDER_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_.-]{0,63}$/; // align with server pattern\n\nfunction assertProviderSummary(summary) {\n  for (const [name, count] of Object.entries(summary)) {\n    if (!PROVIDER_NAME_RE.test(name)) throw new TypeError(`provider name ${JSON.stringify(name)} fails pattern`);\n    if (!Number.isInteger(count) || count < 0 || count > 1000) throw new RangeError(`provider ${name} count ${count} out of [0,1000]`);\n  }\n}","typeGuard":"const isValidProviderEntry = ([name, count]) => PROVIDER_NAME_RE.test(name) && Number.isInteger(count) && count >= 0 && count <= 1000;","tryCatchPattern":null,"preventionTips":["Use the platform's canonical provider identifiers as summary keys; put versions/models in a separate report if needed.","Run the same name regex client-side and reject weird keys at generation time.","Compute per-provider counts from the same snapshot as the totals."],"tags":["validation","telemetry","regex","http-400"],"backgroundTag":null,"analyzedSha":"2c0912b6ec764b373d44eeea1e80f0d9f11ab417","analyzedAt":"2026-08-15T13:25:18.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}