Skip to content

Commit f6dbfe1

Browse files
committed
feat: agregar lógica para manejar ampliaciones automáticas y advertencias de sobre-escopado
1 parent 50ce29e commit f6dbfe1

3 files changed

Lines changed: 34 additions & 3 deletions

File tree

src/cli/chat/mod.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,10 @@ async fn run_turn(
812812
// diff contra lo pedido) y cuántas rondas de corrección por revisión llevamos.
813813
let mut changed_paths: std::collections::HashSet<String> = std::collections::HashSet::new();
814814
let mut review_forced = 0usize;
815+
// AMBIGÜEDAD: cuántas veces auto amplió el presupuesto en este turno. La 2ª
816+
// ampliación (≥16 rondas sin terminar) es señal inequívoca de over-scoping
817+
// en tarea ambigua → se inyecta un freno de alcance ("slice mínimo primero").
818+
let mut auto_extensions = 0usize;
815819
// Último `dpx:plan` del turno = criterios de aceptación para la autorrevisión.
816820
let mut latest_plan: Option<String> = None;
817821
// Checkpoint del turno: captura el estado de cada archivo antes de tocarlo
@@ -1124,7 +1128,7 @@ async fn run_turn(
11241128
// mitad"). En manual pregunta; en auto amplía solo hasta el tope duro.
11251129
if wants_more
11261130
&& round >= round_budget
1127-
&& !extend_rounds(&mut *ask, round, auto, &mut round_budget)
1131+
&& !extend_rounds(&mut *ask, round, auto, &mut round_budget, &mut auto_extensions)
11281132
{
11291133
// Si encima la verificación quedó en ROJO, no lo disfraces de pausa
11301134
// tranquila: dilo claro para que el usuario sepa que el build/tests
@@ -1242,6 +1246,18 @@ async fn run_turn(
12421246
tu respuesta final."
12431247
)
12441248
};
1249+
// SCOPE NUDGE: si auto amplió 2+ veces (≥16 rondas sin terminar),
1250+
// es señal inequívoca de over-scoping en tarea ambigua → freno.
1251+
if auto_extensions >= 2 {
1252+
to_send = format!(
1253+
"[SCOPE NUDGE: llevas {auto_extensions}+ ampliaciones de presupuesto ({round} \
1254+
rondas) y la tarea sigue sin terminar. POSIBLEMENTE SOBRE-ESCOPASTE. \
1255+
NO intentes la versión completa ni features avanzadas: construye AHORA el \
1256+
NÚCLEO MÍNIMO que compile y pase tests, y deja las extensiones para otro \
1257+
turno. Reduce drásticamente el alcance YA.]\n\n{to_send}"
1258+
);
1259+
auto_extensions = 0; // solo una vez, no saturar cada ronda
1260+
}
12451261
continue;
12461262
}
12471263
// 🟢 GREEN-GATE: el modelo no pidió más acciones → se da por terminado.
@@ -1384,6 +1400,7 @@ fn extend_rounds(
13841400
round: usize,
13851401
auto: crate::cli::AutoMode,
13861402
budget: &mut usize,
1403+
auto_extensions: &mut usize,
13871404
) -> bool {
13881405
// Guardrail de gasto: si se rebasó el presupuesto de tokens, el modo auto
13891406
// NO sigue solo — cae al prompt manual para que decidas si quemar más.
@@ -1397,6 +1414,7 @@ fn extend_rounds(
13971414
);
13981415
return false;
13991416
}
1417+
*auto_extensions += 1;
14001418
println!(
14011419
"\n{}",
14021420
ui::dim(&format!("auto {round} rondas y la tarea sigue · ampliando presupuesto"))

src/cli/chat/tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -723,11 +723,13 @@
723723
fn extend_rounds_en_auto_respeta_el_tope_duro() {
724724
let mut budget = MAX_TURN_ROUNDS;
725725
let mut ask = |_: &str| -> Option<String> { panic!("en auto no se pregunta") };
726+
let mut ext = 0usize;
726727
// Por debajo del tope: amplía solo.
727-
assert!(extend_rounds(&mut ask, 8, AutoMode::All, &mut budget));
728+
assert!(extend_rounds(&mut ask, 8, AutoMode::All, &mut budget, &mut ext));
728729
assert_eq!(budget, 16);
730+
assert_eq!(ext, 1);
729731
// En el tope duro: frena.
730-
assert!(!extend_rounds(&mut ask, AUTO_MAX_ROUNDS, AutoMode::All, &mut budget));
732+
assert!(!extend_rounds(&mut ask, AUTO_MAX_ROUNDS, AutoMode::All, &mut budget, &mut ext));
731733
}
732734

733735
#[test]

src/focus/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,17 @@ estar instalado (en Windows casi nunca lo está → \"no se reconoce como un com
444444
nombre de archivo y falla). Salir al shell a buscar quema rondas a lo tonto sin resultados.
445445
- Primero junta la información, después actúa: no alternes leer-actuar-leer sin necesidad.
446446
447+
## Disciplina de alcance — slice mínimo primero (NO sobre-escopes)
448+
- Ante una tarea ABIERTA o AMBIGUA (\"hazme un X, hazlo útil\", sin lista concreta de requisitos), \
449+
NO intentes la versión maximal: construye el NÚCLEO MÍNIMO que compile y funcione end-to-end, \
450+
y ofrece extenderlo. El harness te frenará si detecta que quemaste 16+ rondas sin verde \
451+
(el scope nudge).
452+
- Pasó de verdad: \"hazme un motor de plantillas, hazlo bien y útil\" disparó un clon de Jinja2 \
453+
(herencia, includes, condicionales, 8 módulos) que reventó en la ronda 32 con build rojo. \
454+
Con slice mínimo habría entregado `{{var}}` + filtros en 8 rondas, verde, y luego extendido.
455+
- Si la tarea toca 2+ archivos O tiene 2+ requisitos, ARRANCA con un plan en un bloque `dpx:plan` \
456+
ANTES de tocar código (no te lo saltes por creerla simple).
457+
447458
## Cambio mínimo y reversible
448459
- Haz el cambio MÁS PEQUEÑO que resuelve la tarea. No refactorices ni \"mejores\" código que \
449460
nadie te pidió tocar.

0 commit comments

Comments
 (0)