Propuesta IA: aflojar las restricciones que peleaban con una respuesta honesta

Medicion de 3 vueltas mas contra datos reales. El aplanado del commit anterior
NO redujo los reintentos: subieron de 3 a 10. Se mantiene porque quitar ese
nivel es correcto de todos modos, pero no cumplio su proposito.

Lo que si salio de esa medicion son dos restricciones mias que provocaban el
rechazo:

- min(5) en los textos de materiales, decisiones, menciones y red flags. Con una
  transcripcion pobre no hay nada que listar, asi que el modelo mete "N/A" o un
  guion para rellenar y falla. Ocurrio 4 veces SEGUIDAS en una vuelta. Baja a
  min(3), y el prompt ahora dice explicitamente que devolver el array vacio es la
  respuesta correcta y que no rellene.
- beneficios.etiqueta.max(40) se pasaba en 2 de 3 vueltas. Sube a 70.

Es el mismo patron que el tope de 40 partidas: el schema peleandose con la
realidad, no el modelo fallando.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
urieljareth
2026-07-28 21:25:20 -06:00
co-authored by Claude Opus 5
parent 0c127b44c4
commit 3a1eaf6e5b
2 changed files with 8 additions and 5 deletions
+2
View File
@@ -158,6 +158,8 @@ Reglas de este paso:
ser "por_validar". ser "por_validar".
- En quienLoDijo usa el ROL ("el socio", "quien atiende el WhatsApp"), no el nombre - En quienLoDijo usa el ROL ("el socio", "quien atiende el WhatsApp"), no el nombre
propio, salvo que sea el interlocutor comercial. propio, salvo que sea el interlocutor comercial.
- Si de alguna de estas listas no hay NADA que decir, devuelvela VACIA. Un array vacio
es la respuesta correcta; no metas "N/A", "ninguno" ni un guion para rellenar.
- En redFlags anota lo que deberia preocuparle al asesor: que pidan descuento antes de - En redFlags anota lo que deberia preocuparle al asesor: que pidan descuento antes de
entender el alcance, que no este presente quien decide, que no haya ninguna cifra del entender el alcance, que no este presente quien decide, que no haya ninguna cifra del
problema, o un "hagan todo y luego vemos".`; problema, o un "hagan todo y luego vemos".`;
+6 -5
View File
@@ -47,14 +47,14 @@ export const hechosSchema = z
) )
.max(40), .max(40),
materialesPendientes: z materialesPendientes: z
.array(z.object({ texto: z.string().min(5), bloqueaEntrega: z.boolean() })) .array(z.object({ texto: z.string().min(3), bloqueaEntrega: z.boolean() }))
.max(15), .max(15),
decisionesPendientes: z decisionesPendientes: z
.array(z.object({ texto: z.string().min(5), quienDecide: z.string() })) .array(z.object({ texto: z.string().min(3), quienDecide: z.string() }))
.max(15), .max(15),
mencionesFueraDeAlcance: z.array(z.string().min(5)).max(15), mencionesFueraDeAlcance: z.array(z.string().min(3)).max(15),
redFlags: z redFlags: z
.array(z.object({ senal: z.string().min(5), severidad: z.enum(["baja", "media", "alta"]) })) .array(z.object({ senal: z.string().min(3), severidad: z.enum(["baja", "media", "alta"]) }))
.max(10), .max(10),
}) })
.strict(); .strict();
@@ -172,7 +172,8 @@ export const redaccionSchema = z
beneficios: z beneficios: z
.array( .array(
z.object({ z.object({
etiqueta: z.string().min(3).max(40), // 70 y no 40: se pasaba en 2 de 3 vueltas contra datos reales.
etiqueta: z.string().min(3).max(70),
texto: z.string().min(20), texto: z.string().min(20),
hallazgoId: z hallazgoId: z
.string() .string()