The spinnerTipsOverride setting is now a full object rather than a list of strings, letting you supply tips inline or from a JSON file, replace the "Tip" prefix with your own label, and drop the tips that ship with Claude Code. Individual tips can carry an identifier, a per-tip cooldown and a priority weight so a curated set rotates the way you want. Parsing is lenient throughout, so a malformed field or entry is dropped rather than breaking settings loading, and what a scope is allowed to set depends on whether that scope is trusted.
- The object takes
tips(the list itself),tipsFile(a path to a JSON file of the same shape),label(replaces the default "Tip" prefix), andexcludeDefault(drops the built-in tips). - A tip entry is either a plain string or an object of the form
{ id, text, cooldownSessions?, priority? }; array members that are neither are dropped without rejecting the rest of the list. idis a stable identifier of letters, digits,.,_and-, up to 64 characters;textis capped at 500 characters and must be a single line.cooldownSessions(default 0) is how many sessions to wait before showing a tip again;priority(default 0) breaks ties among tips that have never been shown.spinnerTipsOverrideis now read from project scope too, but project settings are untrusted: only plain strings are accepted there, and object entries are dropped with the warningspinnerTipsOverride: object tip entries in ${s} are ignored; only plain strings are read from project settings, where the placeholder names the scope.tipsFileandlabelare ignored entirely when they come from an untrusted scope;tipsFileis honoured only from user settings, the--settingsflag, and managed settings installed on disk, and is read once per CLI process.- A
tipsFilearriving through remote managed settings is refused withspinnerTipsOverride.tipsFile from remote managed settings is ignored; ship inline tips or install the file path via managed-settings.json. - File load failures are logged and counted under the
tips_org_tips_file_loadmetric. - The built-in tips are suppressed only when a trusted scope supplied tips, so if only a project supplied them the shipped defaults still show.
- The spinner reads the label from application state as
spinnerTipLabeland applies it to the narration tip; when the label is still the default "Tip" it renders lower-cased.
{ id: stable id (letters, digits, ".", "_", "-"; max 64), text: the tip (max 500 characters, one line), cooldownSessions?: sessions to wait before showing it again (default 0), priority?: tie-break weight among never-shown tips (default 0) }, spinnerTipsOverride: object tip entries in ${s} are ignored; only plain strings are read from project settings, spinnerTipsOverride.tipsFile from remote managed settings is ignored; ship inline tips or install the file path via managed-settings.json, spinnerTipLabel
Strings lifted out of the shipped bundle, so the claim above can be checked against them.
Added {id, text, cooldownSessions, priority} entries, tipsFile, and label to spinnerTipsOverride, so organizations can rotate their own tips…