|
""" |
|
Patrones comunes de ambigüedad en historias de usuario. |
|
""" |
|
|
|
AMBIGUITY_PATTERNS = { |
|
"lexicos": { |
|
|
|
"fácil", "simple", "rápido", "eficiente", |
|
"mejor", "adecuado", "apropiado", |
|
"flexible", "dinámico", "intuitivo", |
|
"amigable", "óptimo", "robusto", |
|
|
|
|
|
"algunos", "varios", "muchos", "pocos", |
|
"más", "menos", "suficiente", |
|
"bastante", "demasiado", "aproximadamente", |
|
|
|
|
|
"pronto", "rápidamente", "periódicamente", |
|
"regularmente", "ocasionalmente", "frecuentemente", |
|
"en tiempo real", "instantáneamente", "ágilmente", |
|
|
|
|
|
"moderno", "innovador", "avanzado", |
|
"inteligente", "sofisticado", "elegante", |
|
|
|
|
|
"user-friendly", "intuitivo", "natural", |
|
"seamless", "fluido", "sin problemas" |
|
}, |
|
|
|
"sintacticos": { |
|
|
|
r"(.*?) y (.*?) con (.*?)", |
|
r"no (.*?) y (.*?)", |
|
r"(.*?) o (.*?) y (.*?)", |
|
r"(.*?) pero (.*?) si (.*?)", |
|
r"(.*?) cuando (.*?) o (.*?)", |
|
r"(.*?) excepto (.*?) y (.*?)", |
|
r"(.*?) antes de (.*?) y (.*?)", |
|
r"(.*?) después de (.*?) o (.*?)", |
|
}, |
|
|
|
"semanticos": { |
|
|
|
"si es posible", |
|
"cuando sea necesario", |
|
"si se requiere", |
|
"según corresponda", |
|
"como sea apropiado", |
|
"en caso de ser necesario", |
|
"dependiendo del caso", |
|
"si aplica", |
|
"cuando corresponda", |
|
"si es factible", |
|
"en la medida de lo posible", |
|
"siempre que sea posible" |
|
}, |
|
|
|
"contextuales": { |
|
|
|
r"(?i)similar a (.*?)", |
|
r"(?i)como en (.*?)", |
|
r"(?i)igual que (.*?)", |
|
|
|
|
|
r"(?i)de la manera usual", |
|
r"(?i)como siempre", |
|
r"(?i)de forma estándar", |
|
|
|
|
|
r"(?i)esto", |
|
r"(?i)eso", |
|
r"(?i)aquello", |
|
r"(?i)lo mismo" |
|
} |
|
} |
|
|
|
|
|
TECHNICAL_TERMS = { |
|
|
|
"OAuth", "autenticación", "autorización", |
|
"token", "JWT", "SSO", "2FA", "MFA", |
|
|
|
|
|
"base de datos", "SQL", "NoSQL", "cache", |
|
"índice", "backup", "restauración", |
|
|
|
|
|
"responsive", "CSS", "HTML", "JavaScript", |
|
"React", "Angular", "Vue", "DOM", |
|
|
|
|
|
"API", "REST", "GraphQL", "webhook", |
|
"microservicio", "contenedor", "Docker", |
|
|
|
|
|
"logging", "monitoreo", "alertas", |
|
"deployment", "CI/CD", "pipeline", |
|
|
|
|
|
"ROI", "KPI", "SLA", "métrica", |
|
"dashboard", "reporte", "análisis" |
|
} |
|
|
|
|
|
USER_STORY_PATTERNS = { |
|
'estandar': r"(?i)^como\s+(.+?),?\s+quiero\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$", |
|
'modal': r"(?i)^(?:un|una|el|la)\s+(.+?)\s+(?:puede|debe|debería)\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$", |
|
'pasiva': r"(?i)^(?:el|la|los|las)\s+(.+?)\s+(?:debe|deben|debería|deberían)\s+(?:ser|estar)\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$", |
|
'declarativa': r"(?i)^(?:los|las)\s+(.+?)\s+(?:deben|deberían)\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$", |
|
'necesidad': r"(?i)^(?:necesito|necesitamos|se\s+necesita)\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$", |
|
'deseo': r"(?i)^(?:deseo|deseamos|se\s+desea)\s+(.+?)(?:\s+para\s+(?:que\s+)?(.+))?$" |
|
} |
|
|
|
|
|
PATRONES_AMBIGUEDAD_LEXICA = [ |
|
{ |
|
"patron": r"\b(rápido|eficiente|fácil|simple|intuitivo|amigable|flexible|robusto)\b(?![^{]*\})", |
|
"tipo": "adjetivo_subjetivo", |
|
"descripcion": "Uso de adjetivos subjetivos que pueden interpretarse de diferentes maneras" |
|
}, |
|
{ |
|
"patron": r"\b(varios|algunos|muchos|pocos|diversos|múltiples)\b(?!\s+(?:formatos?|tipos?|archivos?|reportes?)\s+(?:como|:|\(|\{))", |
|
"tipo": "cuantificador_ambiguo", |
|
"descripcion": "Uso de cuantificadores ambiguos que no especifican una cantidad concreta" |
|
}, |
|
{ |
|
"patron": r"\b(etc|etcétera|entre otros|y más|y otros)\b", |
|
"tipo": "enumeracion_incompleta", |
|
"descripcion": "Uso de expresiones que dejan la enumeración incompleta o abierta" |
|
}, |
|
{ |
|
"patron": r"\b(sistema|aplicación|plataforma|herramienta|solución)\b(?!\s+(?:debe|debería|tiene que|ha de))", |
|
"tipo": "termino_generico", |
|
"descripcion": "Uso de términos genéricos que no especifican la funcionalidad concreta" |
|
} |
|
] |
|
|
|
|
|
PATRONES_AMBIGUEDAD_SINTACTICA = [ |
|
{ |
|
"patron": r"(?i)(?<![\w{])(y|o|y/o)(?!\s+(?:\d+|\{|\w+\s*[=:<>]))", |
|
"tipo": "coordinacion_ambigua", |
|
"descripcion": "Uso de coordinaciones que pueden crear ambigüedad en la interpretación" |
|
}, |
|
{ |
|
"patron": r"(?i)\b(esto|eso|aquello|el cual|la cual|lo cual|que)\b(?!\s+(?:significa|implica|requiere|incluye))", |
|
"tipo": "referencia_ambigua", |
|
"descripcion": "Uso de referencias ambiguas que pueden tener múltiples antecedentes" |
|
}, |
|
{ |
|
"patron": r"(?i)\b(si|cuando|mientras|después|antes|luego)\b(?!\s+(?:el|la|los|las|se)\s+(?:\w+\s+){0,3}(?:\d+|específico|definido))", |
|
"tipo": "condicion_temporal_ambigua", |
|
"descripcion": "Uso de condiciones o referencias temporales ambiguas" |
|
}, |
|
{ |
|
"patron": r"(?i)(poder|deber|necesitar|querer)\s+\w+\s+(y|o)\s+\w+(?!\s+(?:en|durante|cada|por)\s+(?:\d+|un|una)\s+(?:segundo|minuto|hora)s?)", |
|
"tipo": "alcance_verbo_modal", |
|
"descripcion": "Ambigüedad en el alcance de verbos modales con múltiples acciones" |
|
} |
|
] |
|
|
|
|
|
SUGERENCIAS_MEJORA = { |
|
"adjetivo_subjetivo": [ |
|
"Especificar métricas o criterios medibles (ej: tiempo de respuesta en segundos)", |
|
"Definir valores concretos o rangos aceptables", |
|
"Usar términos más específicos y cuantificables" |
|
], |
|
"cuantificador_ambiguo": [ |
|
"Especificar cantidades exactas o rangos definidos", |
|
"Listar explícitamente los elementos o tipos", |
|
"Definir límites mínimos y máximos" |
|
], |
|
"enumeracion_incompleta": [ |
|
"Listar todos los elementos requeridos", |
|
"Especificar criterios de inclusión/exclusión", |
|
"Definir el alcance completo de la funcionalidad" |
|
], |
|
"termino_generico": [ |
|
"Especificar la funcionalidad concreta", |
|
"Describir las características técnicas específicas", |
|
"Detallar los componentes o módulos involucrados" |
|
], |
|
"coordinacion_ambigua": [ |
|
"Separar en historias de usuario independientes", |
|
"Usar listas numeradas o viñetas para clarificar", |
|
"Especificar la relación entre los elementos" |
|
], |
|
"referencia_ambigua": [ |
|
"Repetir el sustantivo al que se hace referencia", |
|
"Usar referencias específicas y directas", |
|
"Evitar pronombres ambiguos" |
|
], |
|
"condicion_temporal_ambigua": [ |
|
"Especificar intervalos de tiempo exactos", |
|
"Definir el orden preciso de las acciones", |
|
"Usar referencias temporales específicas (ej: cada 5 minutos)" |
|
], |
|
"alcance_verbo_modal": [ |
|
"Separar las acciones en requisitos independientes", |
|
"Especificar las condiciones para cada acción", |
|
"Definir la prioridad o secuencia de las acciones" |
|
] |
|
} |