A user-defined AI personality, set via a stepped onboarding wizard. The
first time you open Clip AI, a real step-by-step wizard (welcome → one question
per step with a progress bar and Back/Next → a summary of what the assistant
sees) asks how it should come across — tone, verbosity, register, initiative,
expertise level, formatting/emoji — plus optional free-text (a name, focus
areas, hard don'ts). Every step is skippable. Shown once to users with no
personality yet; re-openable anytime from the AI panel's Personalize
assistant… entry, prefilled, to revise it (the same wizard, not a separate
form).
Structured answers are the source of truth; compileSoul() turns them into a
deterministic prompt fragment (lib/ai/soul.ts, snapshot-tested).
Dual-mode storage: localStorage for everyone (and the read path the AI
request uses), plus a per-user public.ai_soul row (owner-scoped RLS) that
syncs the personality across devices when you're signed in.
Precedence is enforced by placement, not trust. The compiled personality
is injected beneath the Phase-A guardrails: buildSystem always orders the
prompt SAFETY_PREAMBLE → persona + soul → untrusted board data → task, and the
server clamps the fragment's length. A personality can shape tone and focus; it
can never loosen a safety rule. Documented in docs/AI_SAFETY.md.
Notes
Un-onboarded users are unaffected — with no answers set, compileSoul returns
"" and the prompt is byte-for-byte what it was before. Covered by
tests/ai-soul.test.ts.