Inicio dice lo que ya se hizo: el plan se olvida al mover y se vuelve a pensar solo

Auditoría de «mover y reorganizar». El motor movía bien, pero el plan en memoria solo se olvidaba al aplicar
desde «Qué va a pasar»: tras «Hacer las N de una vez», apartar stock, juntar repetidos, reemplazar o deshacer,
Inicio seguía ofreciendo lo ya hecho («5 cambios · Ver y aplicar», «Plan listo: 7 de 9») o, tras deshacer,
daba por hecho lo que volvía a estar en desorden. Ahora cualquier movimiento olvida el plan y lo vuelve a
pensar en segundo plano; un plan sin nada marcado es «hecho», cada ficha dice cuándo se hizo y cuántos
movimientos, y el diagnóstico no cuenta como basura lo que ya está en _Para borrar.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-10-14 05:15:22 -05:00
padre 0c8caa0116
commit 91618474a0
Se han modificado 5 ficheros con 189 adiciones y 25 borrados

Ver fichero

@@ -228,6 +228,13 @@ def p_plan():
LOTES = {}
def acciones_quietas():
"""La lista de Inicio cuando el programa ha terminado de volver a pensar el plan tras mover algo."""
assert esperar(lambda: not get('/api/carpeta/acciones' + q(raiz=RAIZ))['calculando'], 60), 'el plan no se volvió a pensar'
a = get('/api/carpeta/acciones' + q(raiz=RAIZ))
return a, {x['clave']: x for x in a['acciones']}
def p_aplicar():
antes = arbol()
c, r = post('/api/aplicar', {'raiz': RAIZ, 'ids': [f['id'] for f in PLAN['filas'] if f['marcado']]})
@@ -241,7 +248,17 @@ def p_aplicar():
assert sorted(os.path.basename(x) for x in antes) == sorted(os.path.basename(x) for x in despues), 'se perdió algún archivo'
assert '10- Octubre' in os.listdir(os.path.join(RAIZ, '2026')), 'el mes sigue en minúsculas: %s' % os.listdir(os.path.join(RAIZ, '2026'))
assert not any('thumbs.db' in x and '_para borrar' not in x for x in despues), 'la basura sigue fuera'
return '%d movimientos, sin errores, «10- octubre» pasó a «10- Octubre»; el avance acabó en %d de %d' % (r['movimientos'], av['unidades'], av['unidades_total'])
# Inicio, sin que nadie vuelva a calcular: lo hecho sale como hecho (y cuándo), no como pendiente
a, por = acciones_quietas()
assert por['resto']['estado'] == 'hecho' and por['resto']['detalle'].startswith('Hecho hoy'), por['resto']
assert por['fechas']['estado'] != 'toca', por['fechas']
assert por['limpiar']['estado'] == 'hecho' and 'ya en' in por['limpiar']['detalle'], por['limpiar']
assert a['ultimo'] and a['ultimo']['lote'] == r['lote'], a['ultimo']
e = get('/api/carpeta/estado' + q(raiz=RAIZ))
assert e['plan'] and e['plan']['marcadas'] == 0, e['plan']
fr = e['diagnostico']['frases']
assert any('ya apartados' in f for f in fr) and not any('de basura de sistema' in f for f in fr), fr
return '%d movimientos, sin errores, «10- octubre» pasó a «10- Octubre»; el avance acabó en %d de %d; Inicio lo da por hecho' % (r['movimientos'], av['unidades'], av['unidades_total'])
def p_deshacer():
@@ -249,7 +266,11 @@ def p_deshacer():
assert c == 200 and not r['errores'], r
assert '10- octubre' in os.listdir(os.path.join(RAIZ, '2026')), 'deshacer no devolvió las minúsculas: %s' % os.listdir(os.path.join(RAIZ, '2026'))
assert os.path.isfile(os.path.join(RAIZ, '2026', '03- Marzo', 'Grabacion', 'Thumbs.db')), 'la basura no volvió'
return '%d movimientos deshechos' % r['deshechos']
# y en Inicio vuelve a estar todo por hacer (antes se quedaba con «lo seguro ya está hecho»)
a, por = acciones_quietas()
assert all(por[k]['estado'] == 'toca' for k in ('limpiar', 'fechas', 'resto')), {k: por[k]['estado'] for k in ('limpiar', 'fechas', 'resto')}
assert not a['ultimo'], a['ultimo']
return '%d movimientos deshechos, e Inicio vuelve a ofrecerlo todo' % r['deshechos']
def p_reaplicar():
@@ -448,7 +469,10 @@ def p_asistente():
assert esperar(lambda: not get('/api/estado')['asistente'].get('activo'), 120)
a = get('/api/estado')['asistente']
assert not a.get('error'), a.get('error')
return 'pasos + «hacer las N de una vez» terminan sin error'
# después, Inicio no vuelve a ofrecer lo que acaba de hacer
_, por = acciones_quietas()
assert por['fechas']['estado'] != 'toca' and por['resto']['estado'] != 'toca', {k: por[k] for k in ('fechas', 'resto')}
return 'pasos + «hacer las N de una vez» terminan sin error, e Inicio no lo vuelve a ofrecer'
def p_pieza():