This write is deterministic for agents: omitted non-logo Brand DNA fields are replaced with empty values. Existing logo fields are preserved unless the optional logo object is supplied.
Parameters
Reviewed brand identity description.
Brand colors as hex codes (#RRGGBB or #RGB), stored as uppercase #RRGGBB. Omitted means replace with [].
Typography guidance. Omitted means replace with "".
Voice-and-tone guidance. Omitted means replace with "".
Product type names, slugs, or display terms. Omitted means replace with [].
Business niches as strings, or {name} objects exactly as brand_dna.get returns them. Omitted means replace with [] — pass the niches from brand_dna.get through to keep the existing ones.
Target audiences. Accepts exactly what brand_dna.get returns (age_range as a "min-max" string, [min, max], or {min, max}). Preset audiences may be passed as just {"key": ..., "is_preset": true} — see brand_dna.list_audience_presets for the catalog. Matching keys keep their existing rows (and virtual models) instead of recreating them.
Raw source description. Omitted means replace with "".
Legacy category names, also used to resolve product types when product_types is absent.
Optional object with logo_url, logo_s3_key, and/or logo_description to update logo fields.
Returns
Persisted brand description.
Persisted colors.
Persisted typography guidance.
Persisted tone guidance.
Persisted product type names.
Persisted niche rows. Each: name, is_preset.
Persisted audience rows — same shape brand_dna.get returns.
Whether a trend rerun was queued. Fires when the brand description, product types, niches, or audiences changed; runs are debounced per org (~2-minute window), so bursts coalesce into one run.