LAP-256 Fase 1 — Contraste contra instrucciones existentes

Generado: 2026-04-22 · PR #1 · Objetivo: comparar las 65 + 67 FieldDefs creadas en Fase 1 con las instrucciones ya escritas por Frank, sin re-preguntarlas.

Fuentes consultadas (leídas en este contraste)

Lo que NO encontré en basic-memory: un "Manual SGR" versionado (V.3 / V.6) como archivo dentro de lpdi-relacionamiento/. Las menciones a V.3/V.4/V.5/V.6 están solo como referencias en el análisis de alcance, no como documento subido. Los "listados ya cargados a Supabase" que menciona Frank (industrias, TMRL, propósito de recursos) viven hoy en BD, no en basic-memory.

● Alineado campo mencionado en instrucciones con mismo label/panel ● Divergente existe en instrucciones pero hay discrepancia ● Nuevo (schema BD) lo agregué porque existe como columna en Prisma; no está en instrucciones ● Legacy / Deuda compatibilidad, no en uso activo

Sección 1 — Startup (65 campos)

Campo Estado Fuente Nota
registeredByIdNuevo (schema)N/A — solo schema BD (Startup.registered_by_id, FK Profile)Ownership server-side. No es un campo que el usuario vea; necesario para RLS.
statusNuevo (schema)N/A — enum EntityStatus en PrismaDRAFT/PENDING/APPROVED/REJECTED. Usado por admins. No lo decide Frank en instrucciones de formulario.
companyNameAlineadoPanel 1 identidad legal (FS + FD) — referencia estándar en biblia-hub-central y en instruccionesSin discrepancia. Label "Nombre comercial" consistente.
countryAlineadoPanel 1 — "País de origen" referenciado en instrucciones-activas.md (contexto de taxonomías) y schema.prisma NOT NULLCanónico.
cityDivergentePanel 1 — schema NOT NULL; qa-lap218.md cita "city=Lima" como dato real en BDDiscrepancia: en instrucciones Frank asume que el campo se llena (ver Mis Registros QA-LAP218). Mi FieldDef dice scoreWeight: 0 porque hoy el FS inserta "". Decidir: ¿se pide o se deja opcional?
originCountryLegacyN/A — duplicado de countryMarcado para consolidar en Fase 2. Frank nunca lo pidió explícito.
originRegionLegacyN/A — columna en Prisma sin consumidorDerivable de country. No se pide en formulario.
fiscalDomicileDivergentePanel 1 — schema Prisma lo tiene como string. ICG.fiscalCountries (array) sí se pide en instrucciones-activasDiscrepancia de tipo: en ICG es array<string> (Panel 4), en Startup es string. Mi nota en el FieldDef ya advierte que el FD persiste además fiscal_domicile_countries que no está en schema — deuda técnica.
companyTypeAlineadoEnum CompanyType Prisma + instrucción 2026-04-17: "empresas de base tecnológica — Startups, Scaleups y PyMEs"STARTUP/PYME/SCALEUP.
isTechBasedAlineadoInstrucción 2026-04-18 22:06: "taxonomía tech vs tradicional"Controla visibilidad de TRL (solo si es tech).
industryIdLegacyN/A — singular, reemplazado por StartupIndustry (many-to-many)Instrucción 2026-04-18 23:55 explícita: "se debe elegir al menos una subindustria entre los dos listados" — plural.
subIndustryIdLegacyN/ALegacy paralelo a industryId.
revenueRangeAlineadoPanel 2 FD — rango de facturación; instrucción 2026-04-19 15:30 confirma "propósito de los recursos y TMRL"Enum de 6 valores consistente con lo que Frank usa en V.6.
revenueYearNuevo (schema)N/A — columna PrismaAño asociado al rango. No mencionado explícito en instrucciones; opcional.
brlLevelAlineadoPanel 2 FD — mencionado en analisis-alcance-honesto ("LAP-50 tooltips BRL/TRL/CRL")Coherente.
trlLevelAlineadoPanel 2 FD — mismo LAP-50Coherente. Condicional a isTechBased.
aboutCompanyDivergentePanel 2 FD — presente en FD hoy, mostrado en perfilDivergencia de score: mi FieldDef dice scoreWeight: 0 (nota explicita que profileScore.ts no lo incluye). Frank espera que perfiles "completos" cuenten descripción — decidir si subir peso en Fase 2.
crlLevelDivergentePanel 3 madurez (mi asignación); analisis-alcance-honesto.md y biblia dicen "CRL: 9 niveles de madurez comercial"Discrepancia de panel: lo asigné a stepper 3 (Nivel de madurez) pero en el UI histórico del FD aparece en Panel 2. Decidir si se reordena el stepper.
tmrlLevelDivergenteInstrucción 2026-04-19 15:30 ("agrega TMRL a la BD"); Panel 3 mi asignaciónDiscrepancia de panel: mi FieldDef lo asigna al stepper 3 pero yo mismo anoté que "en el UI actual aparece dentro del Panel 6 Equipo". Decidir dónde queda.
investmentSourcesDivergenteInstrucción 2026-04-19 00:50: "capital no dilusivo y financiamiento" — Panel 4 tesisDivergencia de comportamiento: instrucción dice "si no hay nada seleccionado el sistema toma como si hubiera algo" (bug reportado). Mi FieldDef lo declara simplemente como array; falta documentar la validación "al menos una opción".
financingLegacyN/A — superseded por financingSourcesColumna Prisma sin uso activo.
financingSourcesAlineadoPanel 4 tesis — relacionado con "capital no dilusivo" (instrucción 2026-04-19 00:50)Array de strings.
investmentTicketAlineadoPanel 4 — referenciado como concepto estándar de StartupSin discrepancia.
investmentPurposeAlineadoPanel 4 — instrucción 2026-04-19 15:30: "propósito de los recursos"Frank pidió explícitamente agregar esta lista a Supabase.
previousInvestmentsNuevo (schema)N/A — columna Prisma (string JSON)No mencionado explícito en instrucciones activas; sí existe en FD actual.
previousRoundsNuevo (schema)N/A — columna PrismaSimilar: presente en FD, no destacado en instrucciones-activas.
totalCapitalRaisedNuevo (schema)N/A — columna PrismaPresente en FD. No hay instrucción directa reciente.
pitchDeckUrlAlineadolap-16-storage-archivos.md: "Pitch deck (solo FD)"Bucket privado pitch-decks. Peso 10 binario ya en profileScore.ts.
pitchDeckConsentNuevo (schema)N/A — columna Prisma pitch_deck_consentFlag DEFAULT false. No hay instrucción directa.
highConceptPitchAlineadoPanel 5 modelo de negocio FD — campo existenteSin discrepancia.
icpAlineadoPanel 5 — perfil de cliente ideal (FD)Sin discrepancia.
idealClientProfileLegacyN/A — duplicado de icpConsolidar en Fase 2.
problemStatementAlineadoPanel 5 FD — "Problema que resuelve"Sin discrepancia.
problemToSolveLegacyN/A — duplicado de problemStatementConsolidar en Fase 2.
solutionAlineadoPanel 5 FD — "Solución propuesta"Sin discrepancia.
businessModelLegacyN/A — superseded por businessModelDescriptionConsolidar en Fase 2.
businessModelDescriptionAlineadoPanel 5 FD — "Descripción del modelo de negocio"Sin discrepancia.
teamSizeDivergentePanel 6 equipo FDDivergencia de score: profileScore.ts NO cuenta teamSize (usa teamComposition). Score del campo = 0. Decidir si es el comportamiento esperado.
teamCompositionAlineadoPanel 6 — JSON array de rolesSin discrepancia.
teamConsentNuevo (schema)N/A — columna Prisma DEFAULT falseCuenta al score (pTeamA). No hay instrucción directa que lo mencione.
teamVerifiedNuevo (schema)N/A — columna PrismaFlag operativo de admin.
ceoFirstNameAlineadoFS + FD Panel 6 — "Nombre del CEO"Sin discrepancia.
ceoLastNameAlineadoFS + FD Panel 6Sin discrepancia.
ceoGenderAlineadoFS + FD Panel 6Sin discrepancia.
ceoLinkedInAlineadoFS + FD Panel 6 — "LinkedIn del CEO"Sin discrepancia.
ceoEmailAlineadoFS + FD Panel 6Sin discrepancia.
ceoPhoneAlineadoFS + FD Panel 6Sin discrepancia.
ceoIsFounderAlineadoFS + FD Panel 6Sin discrepancia.
ceoContactConsentNuevo (schema)N/A — columna Prisma DEFAULT falseFlag de consentimiento. No en instrucciones-activas.
websiteAlineadoPanel 7 presencia digital — instrucción 2026-04-15 20:22 (LAP-132: "Página web en FUD sin prefijo https://")Coherente.
linkedInDivergentePanel 7 — instrucción 2026-04-16 12:30: "en el último panel pedimos al menos 1 red social, resaltar la advertencia"Divergencia de obligatoriedad: Frank requiere "al menos 1 red social". Mi FieldDef declara cada red como required: false individual pero falta representar la regla compuesta "al menos una de (LinkedIn, Instagram, Facebook, Twitter, YouTube, TikTok)".
instagramDivergentePanel 7 — misma instrucción 2026-04-16 12:30Misma observación: regla "al menos 1" no capturada.
facebookDivergentePanel 7 — misma instrucciónMisma observación.
twitterDivergentePanel 7 — misma instrucciónMisma observación. Además mi nota declara deuda: en FS actual twitter espeja tiktok por retrocompatibilidad.
youtubeDivergentePanel 7Misma observación.
tiktokDivergentePanel 7Misma observación.
logoUrlAlineadolap-16-storage-archivos.md: "Logo de la organización (FI, FS, FD)"; bucket público logosCoherente.
emailConsentNuevo (schema)N/A — columna Prisma DEFAULT falseFlag de consentimiento. No mencionado en instrucciones activas (flujo legal estándar).
contactEmailAlineadoFS + FD Panel 1 — schema NOT NULLRequerido para el registro.
contactPhoneNuevo (schema)N/A — columna Prisma opcionalPresente en FD; no destacado en instrucciones.
industries (m-to-m)AlineadoInstrucciones 2026-04-18 21:38 y 22:06: "12 categorías de industrias tech + tradicional + agnóstica"Tabla StartupIndustry. Frank ya aprobó la taxonomía.
operatingCountriesAlineadoTabla StartupOperatingCountry (country+region)Coherente.
businessNeedsAlineadoTabla StartupBusinessNeed Panel 4Coherente.
socialMedia (aux)DivergenteTabla StartupSocialMedia — duplicada con columnas escalaresDuplicación semántica: misma data en dos lugares. Mi nota ya lo advierte; decidir cuál es la fuente canónica en Fase 2.
foundersAlineadoTabla StartupFounder — Panel 5C original ("Fundadores y equipo directivo")Peso 12 heredado de profileScore.ts.
31 Alineados · 14 Divergentes · 12 Nuevos (schema BD) · 8 Legacy Total: 65 campos

Sección 2 — ICG (67 campos)

Campo Estado Fuente Nota
registeredByIdNuevo (schema)N/A — FK ProfileServer-side.
statusNuevo (schema)N/A — enum EntityStatusAdmin-only.
isPublicNuevo (schema)N/A — DEFAULT trueFlag directorio público.
icgTypeDivergentePanel 1 — enum Prisma (7 valores)Divergencia de semántica: mi FieldDef nota que es "derivado de icgRoleCategory via categoryToIcgType". Instrucción 2026-04-19 19:30 y 19:33 dice explícitamente: "respeta el diseño aprobado para el orden de las categorías de rol". Validar que el mapping categoryToIcgType conserva el orden pedido.
icgRoleDivergentePanel 1 — analisis-alcance-honesto.md: "Taxonomía Rol en ecosistema (~40 subcategorías)"; QA-LAP218: "Family Office"Discrepancia de peso: mi FieldDef asigna 1.5 pts. Dado que Frank trata el rol como campo crítico (varias instrucciones sobre orden 2026-04-19), validar si el peso debe subir.
icgRoleCategoryDivergentePanel 1 — instrucciones 2026-04-19 19:30 y 19:33Discrepancia de orden: Frank fue explícito: "en los formularios las categorías deben mostrarse en el orden que ya habíamos aprobado, no alfabético". Mi FieldDef no captura el orden — vive en otro lado. Confirmar dónde se renderiza el orden.
organizationNameAlineadoPanel 1 — NOT NULL schemaCoherente. Nota explícita sobre excepción Inversionista Individual.
investorFirstNameAlineadoPanel 1 — derivación para Inversionista IndividualCoherente con icgRoleCategory.
investorLastNameAlineadoPanel 1Coherente.
presentationAlineadoPanel 1 — "Presentación / acerca del ICG"Sin discrepancia.
countryAlineadoPanel 1 — schema NOT NULLCoherente.
cityDivergentePanel 1 — schema NOT NULLMisma discrepancia que Startup.city: submit inserta "" hoy. Score = 0. Decidir si es obligatorio de facto.
operatingCountriesDivergentePanel 1 — columna escalar + tabla aux IcgOperatingCountryDuplicación semántica: escalar y tabla aux almacenan lo mismo. Consolidar en Fase 2.
interestIndustriesDivergentePanel 1 — instrucción 2026-04-19 00:26: "En FI Panel 1 es obligación del ICG seleccionar al menos una subindustria entre los dos listados (Tech y tradicional)"Discrepancia triple: (1) Frank exige al menos 1 subindustria — no capturado como regla compuesta. (2) duplicado semánticamente con interestIndustriesP3 y con IcgIndustry. (3) instrucción 2026-04-19 00:32: "antes del mensaje de apoyo pon el título 'Industrias en las que opera el ICG*'" — el asterisco marca obligatoriedad; mi FieldDef dice required: false.
contactEmailAlineadoPanel 1 — NOT NULLCoherente.
contactPhoneAlineadoPanel 2 FDCoherente.
industryIdLegacyN/A — supersededDeuda.
subIndustryIdLegacyN/ADeuda.
emailConsentNuevo (schema)N/A — columna PrismaFlag.
termsAcceptedNuevo (schema)N/A — legalEstándar.
privacyAcceptedNuevo (schema)N/A — legalEstándar.
contactFirstNameAlineadoPanel 2 datos de contacto FISin discrepancia.
contactLastNameAlineadoPanel 2 FISin discrepancia.
contactPositionAlineadoPanel 2 FISin discrepancia.
contactPersonalEmailAlineadoPanel 2 FIDistinto del corporativo.
contactLinkedInAlineadoPanel 2 FISin discrepancia.
contactUserIdNuevo (schema)N/A — FK opcional a ProfileResuelta server-side por email match.
valuePropositionP4DivergentePanel 3 propuesta de valor FI (jsonb)Discrepancia de panel: mi FieldDef lo mete al panel 3 con peso 10 y nombre valuePropositionP4 (sufijo P4) porque históricamente era panel 4. El nombre del campo ya refleja el drift — decidir si se renombra al consolidar el stepper 6-paneles.
investmentSourcesP4DivergentePanel 3 — mismo sufijo confusoMisma observación: nombre P4 en panel 3 es confuso. Renombrar en Fase 2.
investmentRoundsAlineadoPanel 3 FISin discrepancia.
debtFinancingSourcesAlineadoPanel 3 FI — condicional a financiamiento-deudaCoherente.
ticketValueAlineadoPanel 3 FIArray de rangos.
hasActiveCallAlineadoPanel 3 FICoherente.
callClosingDateAlineadoPanel 3 FI — condicionalCoherente.
isPermanentCallAlineadoPanel 3 FI — subordinado a hasActiveCallCoherente.
activeProcessesLegacyN/A — text legacyDeuda.
selectedCompanyTypesAlineadoPanel 4 empresas de interés FI — controla visibilidad de TRL/CRLCoherente.
interestIndustriesP3DivergentePanel 4 — duplicado con interestIndustries y con IcgIndustry (tabla aux)Triple duplicación. Además sufijo P3 en Panel 4 es confuso. Renombrar + consolidar en Fase 2.
brlLevelsAlineadoPanel 4 FIArray.
trlLevelsAlineadoPanel 4 FI — solo Startup/ScaleupCoherente.
crlLevelsAlineadoPanel 4 FICoherente.
revenueRange (ICG)DivergentePanel 4 FI — columna BD revenue_range_icgDiscrepancia de nombre: en Startup es revenue_range (string enum), en ICG es revenue_range_icg (array). Mi nota ya lo anota. Semánticamente confunden.
teamCompositionP3AlineadoPanel 4 FIArray.
legalConstitutionAlineadoPanel 4 FICoherente.
fiscalCountriesAlineadoPanel 4 FIArray.
strategicNeedsP5AlineadoPanel 5 necesidades estratégicas FI (jsonb)Peso 8.
idealAllyP5AlineadoPanel 5 FI (jsonb)Peso 6.
otherStrategicNeedAlineadoPanel 5 FI — condicional a subcategoryId "otra"Coherente.
websiteDivergentePanel 6 presencia digital FIMisma instrucción 2026-04-16 12:30 sobre "al menos 1 red social" aplica también a FI. Regla compuesta no representada.
linkedInDivergentePanel 6 FIMisma observación.
instagramDivergentePanel 6 FIMisma observación.
facebookDivergentePanel 6 FIMisma observación.
twitterDivergentePanel 6 FIMisma observación.
tiktokDivergentePanel 6 FIMisma observación.
youtubeDivergentePanel 6 FIMisma observación.
logoUrlAlineadoPanel 6 — lap-16-storage-archivos.mdCoherente.
valuePropositionLegacyLegacyN/A — text supersededDeuda.
idealAllyLegacyLegacyN/A — text supersededDeuda.
investmentSourcesLegacyLegacyN/ADeuda.
financing (ICG)LegacyN/ADeuda.
investmentTicketLegacyLegacyN/ADeuda.
previousRoundsLegacyLegacyN/ADeuda.
teamSize (ICG)LegacyN/ADeuda.
teamComposition (ICG)LegacyN/A — superseded por teamCompositionP3Deuda.
strategicNeedsAuxDivergenteTabla StrategicNeed — enum StrategicNeedCategoryDuplicación: con strategic_needs_p5 (jsonb). Consolidar.
icgIndustriesDivergenteTabla IcgIndustry — duplica interestIndustriesDuplicación semántica triple (con interestIndustries + interestIndustriesP3).
icgOperatingCountriesDivergenteTabla IcgOperatingCountry — duplica operatingCountriesDuplicación: mismo dato en columna escalar y tabla aux.
29 Alineados · 20 Divergentes · 7 Nuevos (schema BD) · 11 Legacy Total: 67 campos

Sección 3 — Resumen ejecutivo

Sección 4 — Campos en instrucciones NO cubiertos

Hallazgo positivo

No encontré ningún campo individual mencionado en las instrucciones de Frank que esté totalmente ausente de STARTUP_FIELDS o ICG_FIELDS. Eso quiere decir que la Fase 1 sí cubre la superficie de data que el formulario pide hoy.

Lo que sí falta — no son campos, son reglas:

Interpretación para Frank: el archivo de Fase 1 captura bien el "qué" (qué columnas existen y dónde viven) pero todavía no captura bien el "cómo se valida" (reglas cross-field) ni el "cómo se presenta" (orden de opciones, enum values, umbrales de color). Fase 2 debería extender la metadata con esos tres ejes antes de regenerar los consumidores.