We are going to be looking up certain information that is relevant to what we are loking for. Im going to provide you with a "dictionary" of some of the most common things we are going to be looking for and with that, we are going too be able to "fill in" that information for that company profile and fill in when applicable in onboarding/for later steps. Below is the dictionary, please understand this and modify our initial analysis during onboarding so that we can pre-fill as much of the information that we are asking for. If the information is not available, then we must leave blank and client fills in.


version: "mx_acta_constitutiva_reference_v1"
doc_types_supported:
  - "acta constitutiva / escritura constitutiva"
  - "escritura pública (constitución / protocolización)"
  - "instrumento notarial (sociedad mercantil)"
normalization_recommended:
  - "lowercase + remove extra spaces"
  - "normalize accents (opcional) + normalize punctuation (.,;:)"
  - "normalize OCR confusions: 0/O, 1/I, rn/m, cv/c.v./c v"
  - "build a 'lines' array + also a 'full_text' string"
  - "detect clause blocks: regex on (cl[aá]usula|clausula|primera|segunda|tercera|cuarta|quinta|sexta|séptima|octava|novena|décima|undécima...)"
  - "keep page references if possible (for audit trail)"

# ------------------------------------------------------------
# 0) METADATOS DEL DOCUMENTO (no del negocio, sino del instrumento)
# ------------------------------------------------------------
document_metadata:
  - key: "instrument_type"
    type: "string"
    anchors:
      - "escritura pública"
      - "escritura publica"
      - "instrumento número"
      - "instrumento numero"
      - "acta constitutiva"
      - "constitución de la sociedad"
    regex_hints:
      - "(escritura\\s+p[úu]blica|acta\\s+constitutiva|constituci[oó]n\\s+de\\s+la\\s+sociedad)"
    notes:
      - "Útil para clasificar si es constitución o modificación."

  - key: "instrument_number"
    type: "string"
    anchors:
      - "escritura número"
      - "escritura no."
      - "instrumento número"
      - "instrumento no."
      - "número de escritura"
    regex_hints:
      - "(escritura|instrumento)\\s*(n[uú]mero|no\\.?|n\\.?)[\\s:]*([0-9]{1,10})"
    notes:
      - "OCR puede separar 'No.' o confundir ':'; usa fuzzy matching."

  - key: "protocol_volume_book"
    type: "string"
    anchors:
      - "libro"
      - "tomo"
      - "volumen"
      - "protocolo"
    regex_hints:
      - "(tomo|libro|volumen)\\s*[:#]?\\s*([0-9]{1,10}|[ivxlcdm]+)"
    notes:
      - "A veces hay 'tomo' y 'libro'; guárdalo tal cual."

  - key: "instrument_date"
    type: "date"
    anchors:
      - "a los"
      - "en la ciudad de"
      - "siendo las"
      - "del año"
      - "de dos mil"
    regex_hints:
      - "(a\\s+los?\\s+.*?\\s+del\\s+mes\\s+de\\s+.*?\\s+del\\s+a[nñ]o\\s+.*)"
      - "([0-3]?\\d)\\s+de\\s+(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|setiembre|octubre|noviembre|diciembre)\\s+de\\s+(\\d{4})"
    notes:
      - "Mucho viene en letra ('dos mil veintidós'). Necesitas parser de números en español."
      - "Guarda también raw_text + parsed_date + confidence."

  - key: "place_of_granting"
    type: "string"
    anchors:
      - "en la ciudad de"
      - "municipio de"
      - "estado de"
      - "comparecen"
    regex_hints:
      - "en\\s+la\\s+ciudad\\s+de\\s+([^,\\n]+)"
    notes:
      - "Puede venir como 'Monterrey, Nuevo León' o 'Municipio de ...'"

# ------------------------------------------------------------
# 1) NOTARÍA / FEDATARIO
# ------------------------------------------------------------
notary:
  - key: "notary_name"
    type: "string"
    anchors:
      - "licenciado"
      - "lic."
      - "notario público"
      - "notario publico"
      - "titular de la notaría"
    regex_hints:
      - "(notario\\s+p[úu]blico\\s*(n[uú]mero|no\\.?|n\\.)\\s*[0-9]+\\s*[^\\n,]*,?\\s*(?:lic\\.?|licenciado)?\\s*([A-ZÁÉÍÓÚÑ ].{3,}))"
    notes:
      - "A veces el nombre está antes y el número después; parsea ambos por separado."

  - key: "notary_number"
    type: "string"
    anchors:
      - "notaría número"
      - "notaría no."
      - "notario público número"
    regex_hints:
      - "(notar[ií]a|notario\\s+p[úu]blico)\\s*(n[uú]mero|no\\.?|n\\.)\\s*([0-9]{1,4})"
    notes:
      - "OCR puede leer '1O' por '10'. Normaliza."

  - key: "notary_state"
    type: "string"
    anchors:
      - "del estado de"
      - "con residencia en"
      - "estado de"
    regex_hints:
      - "(del\\s+estado\\s+de|estado\\s+de)\\s+([^,\\n]+)"
    notes:
      - "No siempre viene explícito; a veces se infiere por el domicilio de la notaría (mejor no inferir)."

# ------------------------------------------------------------
# 2) IDENTIDAD DE LA SOCIEDAD (lo más valioso para licitaciones)
# ------------------------------------------------------------
company_identity:
  - key: "legal_name"
    type: "string"
    anchors:
      - "denominación"
      - "denominacion"
      - "razón social"
      - "razon social"
      - "se denominará"
      - "se denomina"
    regex_hints:
      - "(denominaci[oó]n|raz[oó]n\\s+social)\\s*(?:social)?\\s*(?:ser[aá]|es|de)\\s*[:“\"]?\\s*([A-Z0-9ÁÉÍÓÚÑ \\-\\.&]+)"
    notes:
      - "A veces el nombre va entre comillas; a veces va en mayúsculas sin comillas."
      - "Guarda también una versión 'normalized_name' (sin S.A. de C.V. etc.)"

  - key: "company_type"
    type: "enum"
    allowed_values:
      - "SA_DE_CV"
      - "SA"
      - "S_DE_RL_DE_CV"
      - "S_DE_RL"
      - "SAS"
      - "SAPI_DE_CV"
      - "SC"
      - "OTHER"
    anchors:
      - "sociedad anónima de capital variable"
      - "s.a. de c.v."
      - "sociedad de responsabilidad limitada de capital variable"
      - "s. de r.l. de c.v."
      - "sociedad por acciones simplificada"
      - "s.a.s."
      - "s.a.p.i. de c.v."
    regex_hints:
      - "(sociedad\\s+an[oó]nima\\s+de\\s+capital\\s+variable|s\\.?\\s*a\\.?\\s*de\\s*c\\.?\\s*v\\.?)"
      - "(sociedad\\s+de\\s+responsabilidad\\s+limitada\\s+de\\s+capital\\s+variable|s\\.?\\s*de\\s*r\\.?\\s*l\\.?\\s*de\\s*c\\.?\\s*v\\.?)"
      - "(sociedad\\s+por\\s+acciones\\s+simplificada|s\\.?\\s*a\\.?\\s*s\\.?)"
    notes:
      - "Detecta por 'tipo largo' y por abreviaturas. Usa whitelist + fuzzy."

  - key: "domicile"
    type: "string"
    anchors:
      - "domicilio"
      - "domicilio social"
      - "tendrá su domicilio en"
    regex_hints:
      - "domicilio\\s+(?:social\\s+)?(?:ser[aá]|es|en)\\s*[:]?\\s*([^\\n\\.]+)"
    notes:
      - "Muchas veces sólo dice ciudad/estado, no calle."

  - key: "duration"
    type: "string"
    anchors:
      - "duración"
      - "duracion"
      - "tiempo de duración"
      - "será de"
      - "indefinida"
    regex_hints:
      - "duraci[oó]n\\s*(?:ser[aá]|es)\\s*[:]?\\s*(indefinida|[0-9]{1,3}\\s+a[nñ]os)"
    notes:
      - "Indefinida es común."

  - key: "corporate_purpose"
    type: "string"
    anchors:
      - "objeto"
      - "objeto social"
      - "la sociedad tendrá por objeto"
      - "tendrá por objeto"
    regex_hints:
      - "(objeto\\s+social|la\\s+sociedad\\s+tendr[aá]\\s+por\\s+objeto)\\s*[:]?\\s*(.+)"
    notes:
      - "Suele ser un párrafo largo; extrae bloque hasta la siguiente cláusula."
      - "Para licitaciones, también conviene crear 'purpose_keywords' (NLP) pero eso ya es capa 2."

# ------------------------------------------------------------
# 3) REGISTROS / INSCRIPCIÓN (cuando existe en el mismo documento)
# ------------------------------------------------------------
registrations:
  - key: "rpc_reference"
    type: "object"
    subfields: ["folio_mercantil", "registro_publico", "inscription_date"]
    anchors:
      - "registro público de comercio"
      - "registro publico de comercio"
      - "folio mercantil"
      - "inscrita"
      - "inscripción"
    regex_hints:
      - "(folio\\s+mercantil)\\s*[:#]?\\s*([A-Z0-9\\-]+)"
      - "(registro\\s+p[úu]blico\\s+de\\s+comercio)"
    notes:
      - "En constitución pura, a veces aún no está inscrita; en testimonios/modificaciones sí."

# ------------------------------------------------------------
# 4) SOCIOS / ACCIONISTAS / COMPARECIENTES (personas y participación)
# ------------------------------------------------------------
people_and_ownership:
  - key: "founders_list"
    type: "list<object>"
    subfields:
      - "full_name"
      - "nationality"
      - "marital_status"
      - "occupation"
      - "address"
      - "id_type"
      - "id_number"
      - "rfc"
      - "curp"
    anchors:
      - "comparecen"
      - "otorgan"
      - "los señores"
      - "por una parte"
      - "en su carácter"
      - "mexicano"
      - "mayor de edad"
      - "con domicilio"
      - "identificándose con"
    regex_hints:
      - "(comparecen|otorgan)\\s*:?\\s*(.+)"
      - "(mexicano|mexicana|de\\s+nacionalidad\\s+)[^\\n,\\.]+"
    notes:
      - "Esto es mejor por extracción estructurada (LLM) sobre el bloque 'COMPARECEN', porque son listas."
      - "En OCR, 'identificándose con credencial para votar' aparece con variaciones."

  - key: "ownership_structure"
    type: "object"
    subfields:
      - "equity_units_type"   # 'acciones' o 'partes sociales'
      - "equity_table"        # lista por persona
    anchors:
      - "acciones"
      - "parte social"
      - "partes sociales"
      - "capital social"
      - "suscribe"
      - "suscriben"
      - "exhibe"
      - "aportación"
      - "aportacion"
    regex_hints:
      - "(acciones|partes\\s+sociales)"
      - "(suscribe|suscriben)\\s+([0-9,\\.]+)\\s*(acciones|partes\\s+sociales)"
    notes:
      - "SA/SAPI/SAS: acciones. SRL: partes sociales."
      - "Casi siempre hay una tablita o párrafos repetidos (persona + cantidad + valor)."

# ------------------------------------------------------------
# 5) CAPITAL SOCIAL (fijo/variable, series, valor nominal)
# ------------------------------------------------------------
capital:
  - key: "capital_total"
    type: "money"
    anchors:
      - "capital social"
      - "importe"
      - "monto"
      - "asciende a"
      - "será de"
    regex_hints:
      - "capital\\s+social\\s*(?:asciende\\s+a|ser[aá]\\s+de)\\s*\\$?\\s*([0-9\\.,]+)"
    notes:
      - "Guarda moneda si aparece (MXN, pesos)."
      - "También existe en letra: 'la cantidad de cien mil pesos 00/100 M.N.'"

  - key: "capital_fixed"
    type: "money"
    anchors:
      - "capital fijo"
      - "parte fija"
    regex_hints:
      - "(capital\\s+fijo|parte\\s+fija)\\s*[:]?\\s*\\$?\\s*([0-9\\.,]+)"
    notes:
      - "En S.A. de C.V. comúnmente separa fijo y variable."

  - key: "capital_variable"
    type: "money"
    anchors:
      - "capital variable"
      - "parte variable"
    regex_hints:
      - "(capital\\s+variable|parte\\s+variable)\\s*[:]?\\s*\\$?\\s*([0-9\\.,]+)"
    notes:
      - "A veces dice 'ilimitado' para variable (reglas)."

  - key: "share_nominal_value"
    type: "money"
    anchors:
      - "valor nominal"
      - "cada acción"
      - "cada parte social"
    regex_hints:
      - "(valor\\s+nominal)\\s*[:]?\\s*\\$?\\s*([0-9\\.,]+)"
    notes:
      - "Muy útil para validar consistencia: (#acciones * valor_nominal) ~= capital."

  - key: "share_series"
    type: "list<object>"
    anchors:
      - "serie"
      - "acciones serie"
    regex_hints:
      - "serie\\s+([A-Z])\\s*(?:por|de)?\\s*([0-9\\.,]+)\\s*acciones"
    notes:
      - "No siempre aplica; pero en SAPI/SA puede haber series A/B."

# ------------------------------------------------------------
# 6) ADMINISTRACIÓN / GOBIERNO CORPORATIVO
# ------------------------------------------------------------
governance:
  - key: "administration_type"
    type: "enum"
    allowed_values:
      - "ADMIN_UNICO"
      - "CONSEJO_ADMIN"
      - "GERENTE_UNICO"
      - "GERENTES"
      - "OTHER"
    anchors:
      - "administrador único"
      - "administrador unico"
      - "consejo de administración"
      - "consejo de administracion"
      - "gerente"
      - "gerentes"
    regex_hints:
      - "(administrador\\s+[uú]nico|consejo\\s+de\\s+administraci[oó]n|gerente[s]?)"
    notes:
      - "SA suele ser administrador único o consejo; SRL suele ser gerentes."

  - key: "administrators"
    type: "list<object>"
    subfields: ["full_name", "role", "term", "is_board_member"]
    anchors:
      - "se designa"
      - "queda designado"
      - "nombrado"
      - "presidente"
      - "secretario"
      - "tesorero"
      - "vocal"
    regex_hints:
      - "(se\\s+designa|queda\\s+designado|nombrado)\\s+a\\s+([^\\n,\\.]+)"
    notes:
      - "Extrae dentro de la cláusula de administración."

  - key: "comisario"
    type: "object"
    subfields: ["full_name", "substitute_full_name"]
    anchors:
      - "comisario"
      - "comisario propietario"
      - "comisario suplente"
    regex_hints:
      - "comisario\\s+(propietario|suplente)\\s*[:]?\\s*([^\\n,\\.]+)"
    notes:
      - "En SA es frecuente; en SRL puede no existir."

# ------------------------------------------------------------
# 7) PODERES (súper relevante para licitaciones: quién firma)
# ------------------------------------------------------------
powers:
  - key: "powers_granted"
    type: "list<object>"
    subfields:
      - "grantee_name"
      - "power_type"  # pleitos_y_cobranzas, actos_de_administracion, actos_de_dominio, titulos_de_credito, laboral, etc.
      - "limitations"
    anchors:
      - "otorga poder"
      - "poder general"
      - "pleitos y cobranzas"
      - "actos de administración"
      - "actos de administracion"
      - "actos de dominio"
      - "para suscribir títulos de crédito"
      - "titulos de credito"
    regex_hints:
      - "(poder\\s+general\\s+para\\s+(pleitos\\s+y\\s+cobranzas|actos\\s+de\\s+administraci[oó]n|actos\\s+de\\s+dominio))"
    notes:
      - "Muchas actas incluyen poderes al administrador/gerente."
      - "Para licitar, tu app puede derivar un campo 'authorized_signers' con base en powers_granted."

  - key: "authorized_signers"
    type: "list<string>"
    anchors:
      - "podrá obligar a la sociedad"
      - "firma"
      - "representación legal"
      - "representacion legal"
    notes:
      - "No siempre textual; lo infieres desde 'poder' + 'administrador/gerente'. Guarda como 'derived' con confianza."

# ------------------------------------------------------------
# 8) REGLAS DE ASAMBLEAS / RESOLUCIONES / QUÓRUM
# ------------------------------------------------------------
meetings:
  - key: "meeting_types"
    type: "list<string>"
    anchors:
      - "asamblea general"
      - "asamblea ordinaria"
      - "asamblea extraordinaria"
      - "resoluciones"
    notes:
      - "Extrae si menciona ordinaria/extraordinaria."

  - key: "quorum_rules"
    type: "string"
    anchors:
      - "quórum"
      - "quorum"
      - "mayoría"
      - "mayoria"
      - "votación"
      - "votacion"
    notes:
      - "Suele ser texto largo; captura bloque por cláusula."

# ------------------------------------------------------------
# 9) EJERCICIO SOCIAL / UTILIDADES
# ------------------------------------------------------------
finance_rules:
  - key: "fiscal_year"
    type: "string"
    anchors:
      - "ejercicio social"
      - "cerrará"
      - "cerrara"
      - "del primero de enero"
      - "al treinta y uno de diciembre"
    notes:
      - "Casi siempre es anual calendario, pero no asumas; extrae."

  - key: "profit_distribution"
    type: "string"
    anchors:
      - "utilidades"
      - "reparto"
      - "dividendos"
      - "reserva legal"
    notes:
      - "Para licitaciones no siempre clave, pero sirve para perfil legal."

# ------------------------------------------------------------
# 10) DISOLUCIÓN / LIQUIDACIÓN
# ------------------------------------------------------------
dissolution:
  - key: "dissolution_causes"
    type: "string"
    anchors:
      - "disolución"
      - "disolucion"
      - "liquidación"
      - "liquidacion"
      - "liquidador"
    notes:
      - "Guarda como bloque."

# ------------------------------------------------------------
# 11) CLÁUSULA DE EXTRANJEROS / INVERSIÓN EXTRANJERA
# ------------------------------------------------------------
foreign_investment:
  - key: "foreigners_clause"
    type: "enum"
    allowed_values: ["CLAUSULA_CALVO", "ADMITE_EXTRANJEROS", "NO_DETECTADO"]
    anchors:
      - "cláusula de extranjeros"
      - "clausula de extranjeros"
      - "convención de extranjeros"
      - "calvo"
      - "se considerarán como nacionales"
      - "no invocar la protección de su gobierno"
    notes:
      - "Muy típica en actas mexicanas; útil para compliance en licitaciones."

# ------------------------------------------------------------
# 12) DOMICILIOS / NOTIFICACIONES (a veces separado del domicilio social)
# ------------------------------------------------------------
addresses:
  - key: "notification_address"
    type: "string"
    anchors:
      - "para oír y recibir notificaciones"
      - "para oir y recibir notificaciones"
    notes:
      - "Aparece mucho en datos de comparecientes; no confundir con domicilio social."

# ------------------------------------------------------------
# 13) RFC / DATOS FISCALES (no siempre están en acta)
# ------------------------------------------------------------
tax:
  - key: "rfc_company"
    type: "string"
    anchors:
      - "r.f.c."
      - "rfc"
      - "registro federal de contribuyentes"
    regex_hints:
      - "\\b([A-Z&Ñ]{3,4}\\d{6}[A-Z0-9]{3})\\b"
    notes:
      - "En acta constitutiva pura puede NO venir. Si no aparece, no inventes."

# ------------------------------------------------------------
# 14) ANEXOS / CERTIFICACIONES / TESTIMONIOS
# ------------------------------------------------------------
attachments_and_certifications:
  - key: "sre_name_authorization"
    type: "string"
    anchors:
      - "secretaría de relaciones exteriores"
      - "sre"
      - "permiso"
      - "uso de denominación"
      - "autorización"
    notes:
      - "A veces menciona un oficio/folio de permiso de denominación."

  - key: "certification_language"
    type: "string"
    anchors:
      - "doy fe"
      - "certifico"
      - "consta"
      - "testimonio"
    notes:
      - "Útil para identificar el cierre del documento y cortar extracción."

# ------------------------------------------------------------
# 15) CAMPOS DERIVADOS (para tu 'perfil' de licitaciones)
# ------------------------------------------------------------
derived_fields:
  - key: "is_company_validly_constituted"
    type: "boolean"
    derivation:
      - "true si detectas legal_name + company_type + instrument_number + notary_number (con confianza alta)"
    notes:
      - "No es dictamen legal; sólo heurística de completitud."

  - key: "key_signers_candidates"
    type: "list<object>"
    derivation:
      - "de powers_granted + administration_type + administrators"
    notes:
      - "Marca como derived + confidence y muestra evidencia (página/línea) en UI."

# ------------------------------------------------------------
# 16) ESTRATEGIA DE EXTRACCIÓN RECOMENDADA (orden)
# ------------------------------------------------------------
extraction_strategy_order:
  - "1) detect sections: header, comparecientes, clauses, closing"
  - "2) extract high-confidence with anchors+regex (instrument, notary, legal_name, company_type)"
  - "3) clause-block extraction for domicilio/objeto/duración/capital/administración/poderes"
  - "4) list extraction (founders, equity_table, administrators) con parser estructurado (ideal LLM) sobre bloques detectados"
  - "5) validate consistency: capital vs acciones/partes, fechas parseables, RFC pattern"
  - "6) store raw_evidence: snippet + page + bounding box (si tienes) + confidence"

confidence_scoring_hint:
  - "high: value found near strong anchor + matches regex + inside expected clause"
  - "medium: matches regex but anchor weak or OCR noisy"
  - "low: inferred/derived or only found once without context"
