Expert en arquitectura completa Brand Studio (post-refactor field-contract-platform): identity, visuals, story, strategy, positioning, narrative (StoryBrand), brand_personality (Jung), communication_assets, contact, team, testimonials, authority_vault. Incluye PersonalityProfile (3-pilar engine) + BuyerPersona (multi-persona). Habla lenguaje de negocio. Use cuando user pide modificar/agregar fields/secciones/buyer-personas/voice-tone/posicionamiento/narrativa/credenciales/equipo/testimonios. Triggers: 'cambiar voz', 'tono de marca', 'arquetipo', 'StoryBrand', 'narrativa', 'posicionamiento', 'UVP', 'unique value proposition', 'buyer persona', 'avatar', 'historia de marca', 'misión', 'visión', 'identidad visual', 'colores marca', 'logo', 'paleta', 'testimonios', 'autoridad', 'credenciales', 'equipo', 'instructor', 'methodology', 'metodología', 'pilares', 'agregar campo brand', 'modificar marca', 'fusionar buyer persona'.
76
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
User pide cambio brand → habla español neutro LATAM, tono experto branding/posicionamiento (microempresario LATAM), NO caveman. Caveman solo body SKILL.md (eficiencia tokens). Antes de codear:
BrandSettings (raíz, vive en Tenant.config_json["brand_settings"])
├── identity (BrandIdentity) nombre, tagline, descripción, industria, contacto legal
├── visuals (BrandVisuals) colores, tipografía, logo, fotografía
├── story (BrandStory) origen, misión, visión, milestones[]
├── strategy (BrandStrategy) methodology_name + pillars[]
├── positioning (BrandPositioning) UVP, brand_essence, discriminator, insight, benefits, values, RTB[]
├── narrative (BrandNarrative) StoryBrand: hero, problem, guide, plan[], cta, outcome, one_liner
├── contact (BrandContact) support/sales email, phone, social, address
├── brand_personality (BrandPersonality) archetype (Jung 12), core_values, traits
└── communication_assets creative_concepts[], assets[]
Collections externas brand-scoped:
├── team[] (KeyFigure) miembros del equipo + bio
├── testimonials[] (BrandTestimonial) M:N placements via social_proof
├── authority_vault[] (BrandAuthorityItem) certificaciones, premios, hitos
└── buyer_personas[] (BuyerPersona) multi-persona, optional offer-scoped
Aggregate separado (mismo BC):
PersonalityProfile (motor 3-pilar)
├── dimensions (6 axes 0..1: energy, warmth, humor, expressiveness, narrative, verbosity)
├── linguistic_patterns (emoji_style, greeting, farewell, fillers[], punctuation, humor_type, vocab[])
└── sample_exchanges[] (context + other_message + author_response)
compila a 5-block system_instruction (PersonalityCompiler)| Layer | File |
|---|---|
| L0 raíz | backend/src/modules/brand/domain/aggregates.py (BrandSettings) |
| L0 sub-models | identity.py, visuals.py (en identity.py), story.py, strategy.py, positioning.py, narrative.py, team.py (BrandContact + KeyFigure + BrandTestimonial + BrandAuthorityItem), personality.py (BrandPersonality + PersonalityCompiler), communication_assets.py, buyer_persona.py |
| L1 FieldContract | brand/domain/field_contract.py (BRAND_SECTION_MAP + BRAND_FIELD_OVERRIDES) |
| L1 Buyer | brand/domain/buyer_persona_field_contract.py (BUYER_PERSONA_SECTION_MAP + dict_subkeys) |
| Personality | brand/domain/personality.py (DimensionContract, PersonalityCompiler) |
| Repos | brand/infrastructure/repositories/{brand,buyer_persona,personality,avatar}_repository.py |
| Cross-module port | shared/links/ports/brand.py (BrandDataPort, create_brand_data_port) — única forma cross-module read |
| Schema FE | frontend/src/features/brand-studio/schemas/*.schema.ts (no se deriva auto, manual mirror) |
brand_name, tagline, description, industry, website, founding_year,
language, timezone, voice_tone (DEPRECATED — use brand_personality)
[Legal/regulatory/compliance — 18 fields]
legal_name, legal_entity_type, tax_id, tax_regime,
country_of_registration, commercial_registry_number,
fiscal_address, legal_representative,
legal_email, dpo_email,
terms_url, privacy_url, cookies_url, refund_policy_url, acceptable_use_url,
regulated_profession_body, professional_license_number,
professional_license_holder, operating_authorization,
liability_insurance_carrier,
sales_agent_disclaimer, sales_agent_out_of_scope, escalation_contactunique_value_proposition (UVP) — "qué te hace único"
discriminator — "en qué categoría compites"
brand_essence — esencia 3-5 palabras
competitive_environment (sub-objeto) — direct_competitors[]
insight (sub-objeto) — tension + cultural_truth + audience_belief
benefits (sub-objeto) — functional + emotional + social
values (sub-objeto) — core + aspirational + behavioral
reasons_to_believe[] (RTB collection) — proof pointsone_liner — synthesis 1 frase
hero (sub-objeto) — quién es el cliente
problem (sub-objeto) — external + internal + philosophical
guide (sub-objeto) — empathy + authority
plan[] (collection) — 3-5 pasos clear
cta (sub-objeto) — direct + transitional
outcome (sub-objeto) — success + failurearchetype — sage/hero/creator/lover/jester/everyman/
caregiver/innocent/explorer/outlaw/magician/ruler
core_values[] — 3-5 valores
personality_traits[] — 3-5 adjetivosCrítico: dimensions (20%) NO alcanzan. MUST include:
dimensions (40% peso real) — 6 axes en personality.py:DimensionContractlinguistic_patterns (40%) — surface fingerprintsample_exchanges (40%) — few-shot anchors_NEGATIVE_THRESHOLD = 0.3 → emite "NUNCA HACES" constraintsPersonalityCompiler.compile() → 5-block system_instruction:
1. REGLAS DE PERSONALIDAD — 1 instruction por dimension
2. HUELLA LINGÜÍSTICA — surface patterns
3. NUNCA HACES — negative constraints (dim < 0.3)
4. EJEMPLOS DE CONVERSACIÓN — few-shot
5. ANCLA DE IDENTIDAD — immutable identityVive en brand/domain/buyer_persona.py (módulo brand, registra como "buyer_persona" en FieldContract registry).
identity: name, tagline, scope (GLOBAL | offer_scoped), offer_id, is_primary
demographics: age_range, location, occupation, income_range, education, family_status (JSONB sub-keys)
psychographics: values, beliefs, lifestyle, personality_traits, media_consumption, aspirations (JSONB sub-keys)
pain_points[]: list[dict] — items con emotional_impact (form-runtime CRUD)
desires[]: list[dict] — items con urgency
objections[]: list[dict]
preferred_channels[]: list[dict] — channel + frequency + tone
buyer_journey: awareness, consideration, decision (JSONB sub-keys)
purchase_triggers: list[str] (sin UX hoy)
anti_patterns: list[str] (sin UX hoy)Walker handles JSONB sub-keys via dict_subkeys arg (Fase 07).
User dice "quiero que el copilot suene más cálido / más serio / con más humor / menos emoji":
PersonalityProfile:
dimensions (warmth↑, humor↑, energy↓, etc.).linguistic_patterns (emoji_style, fillers[], greeting/farewell).sample_exchanges[] con tone target (mínimo 3 con contexts distintos: greeting, objection, closing).BrandPersonality.archetype + core_values. Cambia voice subyacente.identity.voice_tone está DEPRECATED (brand/domain/field_contract.py:255). NUNCA tocar.system_instruction runtime — sin cache invalidation manual.12 arquetipos clásicos. Pregunta:
Edit brand_personality.archetype. Cambio cascada:
Decisión PRODUCTO. UVP es anchor cross-feature (sales-agent prompt + landing hero + copilot context). Cambio cascada:
positioning.unique_value_proposition + opcional brand_essence/discriminator.narrative.one_liner si se contradice.7 elementos del framework Donald Miller. Asegurate cubrir:
Edit en BrandNarrative. Si user describe en lenguaje propio, traducí al framework con preguntas. Web search "storybrand framework 2026" si dudás definición elemento.
Multi-persona. Cada persona puede ser:
scope=GLOBAL (default tenant-wide).scope=offer_scoped con offer_id=<UUID> (specific to one offer).is_primary=True (primary avatar).CRUD via BuyerPersonaRepository. Fields validados via buyer_persona_field_contract.py. JSONB sub-keys (demographics.age_range etc) registradas en dict_subkeys.
Add new persona:
/api/v1/brand/buyer-personas con name + scope + (opcional) offer_id.is_primary=True, otros se demoten.Fusionar 2 personas: decisión PRODUCTO.
offer_id apuntando al persona eliminado).Ya hay scope: str field con values "GLOBAL" + "offer_scoped". Para nuevo scope (ej. "channel_scoped"):
<scope_id> field si necesita FK (ej. channel_id para channel_scoped).Workflow refactor field-contract-platform (post-Fase-09):
BRAND_SECTION_MAP (brand/domain/field_contract.py).BRAND_FIELD_OVERRIDES:
"narrative.tag_anchor": Override(
priority=80,
is_required_semantic=True,
human_question_es="¿Cuál es la frase ancla que recordás siempre?",
expects="frase corta (5-12 palabras)",
gate="narrative.one_liner", # opcional
label_es="Frase ancla",
),dict_subkeys arg si el field es JSONB sub-key (buyer_persona pattern).Tenant.config_json JSONB).tests/architecture/test_brand_editable_fields_baseline.py + test_field_contract_platform.py. Pydantic ⊆ FieldContract enforced.frontend/src/features/brand-studio/schemas/<section>.schema.ts — alineá manual.propose_field_updates, next_question, extract_structured ya consumen FieldContract.description_preserved test (puede fallar — actualizar intencionalmente).Brand sections (catalog): identity, story, positioning, narrative, avatars, visuals, personality, team, testimonials, authority, communication_assets. Si realmente nueva (no fits ninguna):
BRAND_SECTION_MAP paths.brand_section_catalog.py separado (a diferencia de offer). Las sections se infer del map./brand-studio/<section-slug>.Collections con M:N placement vía social_proof BC:
testimonials[] (BrandTestimonial) — clientes que validaron.authority_vault[] (BrandAuthorityItem) — certificaciones, premios, prensa.team[] (KeyFigure) — miembros activos del equipo.CRUD via repos individuales en brand/infrastructure/repositories/. Placements (qual offer/landing usa cuál) viven en social_proof (M:N table). NO duplicar testimonio per offer — placement decide visibilidad.
Fusionar testimonios duplicados: API CRUD + script si volume.
BrandStrategy:
methodology_name — nombre propio (ej. "Sistema CALMA", "Método 3D").methodology_description — qué es.methodology_pillars[] — 3-7 pilares con name + description.Cambios cascada:
18 fields legal/regulatory en BrandIdentity. Ej. legal_name, tax_id, dpo_email, terms_url, regulated_profession_body. Si tenant es regulado (salud, legal, financiero) → fields obligatorios. Considerá agregar gate condicional (gate="identity.regulated_profession_body") para fields que solo aplican.
BrandVisuals:
primary_color, text_secondary_color (hex).photography_style (string descriptive).logo_url, favicon_url.semantic_colors, font_weights, typography_scale, border_radius_values, brand_mood, logos. NO editar directamente — viene de design system tokens.Colores cambia → re-genera tokens design system (proceso aparte). Logo cambia → invalidate landing assets cache.
CommunicationAssets:
creative_concepts[] (lista). Cada uno: name + description + reference_url. can_propose=False — form-runtime CRUD, item-by-item.assets[] (lista). Material producido (mockups, videos, copies). 8 fields → split form. can_propose=False.Cambios via FE form-runtime CRUD. Copilot NO propone wholesale replace.
User dice "no se entiende" / "muy genérico" / "querés que pregunte mejor":
ExpertBusinessType? Lenguaje varía (PROFESIONAL_SALUD técnico vs NEGOCIO_LOCAL coloquial)..claude/rules/spanish-text.md) — sin voseo.human_question_es: pregunta natural conversational. Ej. "¿En qué industria opera tu marca?" (no "Industria: …").test_brand_editable_fields_baseline.py, test_buyer_persona_editable_fields_baseline.py): si descripción cambia → update baseline (intencional, doc en commit).| Cambio | Copilot acción | Porqué |
|---|---|---|
| Nuevo field en Pydantic + Override | zero-touch | Catalog derivado del FieldContract — auto |
Cambio human_question_es / gate / priority | zero-touch | next_question lee runtime |
Cambio can_propose=False | zero-touch | propose_field_updates filtra |
| Nuevo section path slug | zero-touch | validate_field_path deriva del registry |
| PersonalityProfile dimensions / patterns / exchanges | zero-touch | Compiler genera prompt runtime |
| Buyer persona nuevo | zero-touch | Sales-agent context resolver lee runtime |
| Cambio archetype Jung | zero-touch + flag que sales-agent prompt vuelve a renderizar | Reactive |
| Cambio UVP | zero-touch sales-agent + indicar "regenera landing" al user | Landing copy estática no auto-refresca |
| Drop field DEPRECATED | zero-touch | Status filter en projection |
| Cambio que rompe baseline tests | Update baseline + commit msg explica | Intencional |
Resumen: arquitectura post-Fase-09 = mostly reactive. Copilot lee FieldContract registry + repos en runtime. Solo cambios que afectan assets generados estáticamente (landings) requieren acción extra: indicar al user "regenera tu landing".
brand.domain directo cross-module — usá shared/links/ports/brand.py::BrandDataPort. DDD arch test falla.identity.voice_tone — DEPRECATED desde 2026-04-24 (Fase 06). Use brand_personality / PersonalityProfile.BRAND_SECTION_MAP. Arch test cross-cutting Pydantic ⊆ FieldContract falla.positioning.insight.tension). Walker emite OBJECT con can_propose=False para sub-objects. Si necesitás propose deep, extender walker depth + FE validate_field_path.derived visuals (semantic_colors, typography_scale, etc.) directamente. Viene de design system tokens.feedback_personality_3_pillars).BrandStrategy.unique_value_proposition o competitors (DEPRECATED — model_validator migra a positioning). Edit positioning directo.social_proof BC.brand/domain/, registra como "buyer_persona" en FieldContract.cd backend && .venv/bin/pytest tests/architecture/ -x -q --tb=short
cd backend && .venv/bin/pytest tests/architecture/test_brand_editable_fields_baseline.py tests/architecture/test_buyer_persona_editable_fields_baseline.py -x -q
cd backend && .venv/bin/pytest tests/modules/copilot/test_conversational_questioning.py -x -q
cd backend && .venv/bin/pytest tests/modules/brand/ -x -q
cd frontend && npx vitest run src/__tests__/architecture/
cd frontend && npx vitest run src/features/brand-studio/507 BE arch + 38 FE arch baseline post-Fase-09. Sin regression.
Antes codear, si:
docs/domains/brand/INDEX.md (todos los docs brand)docs/refactors/field-contract-platform/DESIGN.md (FieldContract platform — Fase 04-09)docs/refactors/field-contract-platform/LEARNINGS.md (descubrimientos Fase 06 brand + Fase 07 buyer)~/.claude/projects/.../memory/feedback_personality_3_pillars.md (PersonalityProfile arq)~/.claude/projects/.../memory/feedback_form_runtime_autosave.md (form-runtime no-negociable).claude/rules/spanish-text.md (neutro LATAM).claude/rules/tdd-mandatory.md (test antes impl)offer-expert — cuando el cambio toca offers (incluye lead-magnet, archetype, presets).offer-type-preset-expert — narrow scope preset catalog.sales-agent-expert — si cambio toca sales-agent graph / prompts / tools.content-hunter — si quiere ideas de contenido (consumes brand voice + offer promise).brand-offer-auditor — audita cobertura framework marketing (10 frameworks).references/form-runtime-array.md — array field cards/split mode, autosave preservedd31f7bc
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.