Disclose free model data collection#3606
Conversation
| @@ -0,0 +1,20 @@ | |||
| export const FREE_MODEL_DATA_LABEL = 'Free - data collected'; | |||
| export const FREE_MODEL_DATA_SHORT_LABEL = 'Data collected'; | |||
There was a problem hiding this comment.
WARNING: FREE_MODEL_DATA_SHORT_LABEL is exported but never imported or used anywhere in the PR. If it has no planned consumer yet, remove it to avoid dead code. The linter's unused-exports check (pnpm check:unused) will flag this if run.
| @@ -0,0 +1,20 @@ | |||
| export const FREE_MODEL_DATA_LABEL = 'Free - data collected'; | |||
| export const FREE_MODEL_DATA_SHORT_LABEL = 'Data collected'; | |||
There was a problem hiding this comment.
WARNING: Same as the web counterpart — FREE_MODEL_DATA_SHORT_LABEL is exported but unused. Both files define it identically; if it is genuinely needed in the future, consider consolidating into a shared package rather than keeping two copies.
| model.id === 'kilo-auto/free' || | ||
| model.id.endsWith(':free') || | ||
| model.id === 'openrouter/free' || | ||
| (model.id.startsWith('openrouter/') && |
There was a problem hiding this comment.
WARNING: The openrouter/*-alpha / openrouter/*-beta heuristic is purely ID-based and will produce false-positive data-collection indicators for any future OpenRouter alpha/beta model that is not actually free. The server already returns an isFree boolean — relying solely on that flag (and the :free suffix convention) would be more accurate and avoid flagging paid preview models. Consider removing the -alpha/-beta pattern and instead ensuring the API populates isFree for those models.
| model.id === 'kilo-auto/free' || | ||
| model.id.endsWith(':free') || | ||
| model.id === 'openrouter/free' || | ||
| (model.id.startsWith('openrouter/') && |
There was a problem hiding this comment.
WARNING: Same false-positive risk as the web version — openrouter/*-alpha and openrouter/*-beta ID pattern is a heuristic, not a reliable signal. Prefer trusting the server-provided isFree flag exclusively.
| return ( | ||
| <Tooltip> | ||
| <TooltipTrigger asChild> | ||
| <Info className="h-3.5 w-3.5 shrink-0 text-yellow-500" /> |
There was a problem hiding this comment.
SUGGESTION: FreeModelDataIcon uses <TooltipTrigger asChild> on a bare <Info> SVG icon, which has no tabIndex and is not inherently focusable. Keyboard users who navigate the button with Tab/Enter won't be able to discover the tooltip. Consider wrapping the icon in a <button> (or a <span tabIndex={0}> with an aria-label) so the tooltip is reachable without a mouse.
| return ( | ||
| <Tooltip> | ||
| <TooltipTrigger asChild> | ||
| <span className="inline-flex max-w-36 shrink-0 items-center gap-1 rounded-full border border-yellow-500/30 bg-yellow-500/10 px-1.5 py-0.5 text-[10px] font-medium text-yellow-600 dark:text-yellow-300"> |
There was a problem hiding this comment.
SUGGESTION: FreeModelDataBadge renders a <span> as the tooltip trigger (asChild). A bare <span> is not focusable and cannot receive keyboard focus, so the tooltip content (the explanation of data collection) is inaccessible to keyboard-only and screen-reader users. Use a <button type="button"> or add tabIndex={0} and role="status" to expose the information accessibly.
Code Review SummaryStatus: 4 Issues Found | Recommendation: Address before merge Executive SummaryThe Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (18 files)
Fix these issues in Kilo Cloud Reviewed by claude-sonnet-4.6 · 1,189,454 tokens Review guidance: REVIEW.md from base branch |
Show a clear data-collection indicator anywhere users choose or view free Kilo models.\n\nThis makes the free-model training/replay collection behavior visible before selection across web and mobile clients.