Revisa la sesión que resolvió el problema. Entrega dos archivos: LEARNED.md y learned_quiz.py (un cuestionario de terminal).
- Identifica la sesión. Usa los chats recientes para encontrar el chat que coincide con el problema. Si hay más de uno plausible, pregunta al usuario cuál. Si la sesión pertenece a un proyecto, revisa también los otros chats de ese proyecto.
- Lee toda la sesión, no solo un resumen. Anota dónde el humano y la IA pasaron por alto algo antes de resolver el problema. También anota conceptos que el humano tuvo que aceptar sin pruebas, preguntó más de una vez, o entendió mal: estos necesitan un análisis más profundo.
- Investiga enlaces antes de escribir. Para cada lección encuentra al menos un enlace. Para cada lección humana, y cualquier concepto del paso 2, encuentra de 1 a 3 enlaces de análisis profundo que expliquen los fundamentos desde los principios básicos. Prefiere, en orden: documentación oficial o especificaciones, notas de aplicación o manuales del proveedor, tutoriales o libros de texto conocidos, luego blogs o Q&A de buena reputación. Usa WebSearch, luego abre cada enlace con WebFetch para confirmar que carga y cubre el punto. Descarta cualquier enlace que falle o esté fuera de tema. Nunca inventes una URL.
- Escribe LEARNED.md con estas secciones, en este orden:
- Qué pasó: de 3 a 5 frases, más el estado (resuelto o no). Si no está resuelto, enumera los puntos abiertos.
- Lecciones aprendidas: divididas en Humano, IA y Compartidas. Para cada lección da el punto, qué se pasó por alto, la lección en una frase y un Enlace (fuente nombrada). Debajo de cada lección humana que necesite contexto, añade una sublista de "Análisis profundo": cada entrada es Título, la fuente y una línea sobre qué enseña y por qué ayuda aquí.
- Preguntas de prueba: de 3 a 5 preguntas clave tituladas "Preguntas de prueba", seguidas de una clave de respuestas. Nota que el conjunto completo de preguntas está en learned_quiz.py.
- Enlaces: cada enlace usado, agrupado por lección, con la fuente nombrada. Indica que los enlaces fueron verificados en la fecha de ejecución y deben ser verificados antes de usar.
- Prompt de una sola línea sugerido: un prompt conciso que habría evitado los problemas de esta sesión.
- Etiqueta las afirmaciones. Marca las afirmaciones no verificadas como no verificadas. Marca las afirmaciones tomadas de resultados de búsqueda como reportadas, y enlaza la fuente.
- No presentes conjeturas como hallazgos. Si la causa de un problema no fue confirmada, dímelo.
- Escribe learned_quiz.py a partir de la plantilla de abajo. Reglas:
- Solo biblioteca estándar de Python 3. Debe ejecutarse en terminales macOS, Linux y Windows. Sin interfaz gráfica.
- Cubre cada concepto, no solo las 3 a 5 preguntas de prueba: al menos 2 preguntas por lección humana, al menos 1 por lección de IA y Compartida, más 1 por concepto de análisis profundo. Normalmente de 10 a 25 preguntas. Mezcla preguntas de recuerdo, "¿qué revisarías primero?" y "encuentra el error".
- Cada pregunta: tema (Humano, IA, Compartida, o un nombre corto de concepto), 4 opciones con distractores plausibles, el índice correcto, un porqué de 1 a 2 frases, y el enlace verificado más relevante.
- Rellena solo TITLE, SOURCE y QUESTIONS. No cambies el motor.
- Antes de enviar, ejecuta python3 -c "import ast,sys;ast.parse(open(sys.argv[1]).read())" learned_quiz.py, luego python3 learned_quiz.py --list, y corrige cualquier error. Verifica que cada índice de respuesta apunte a la opción correcta.
- Mantén LEARNED.md conciso. No uses guiones largos en ninguno de los archivos.
- Envía ambos archivos con SendUserFile. En la respuesta da el comando de ejecución: python3 learned_quiz.py (opciones: -r revisión tipo flashcard, -t TEMA filtro, -n N límite, --list imprimir todo, --seed N orden fijo).
Plantilla del cuestionario (copia exactamente, reemplaza los marcadores y la pregunta de ejemplo):
#!/usr/bin/env python3
"""Cuestionario LEARNED: <TEMA>. Ejecuta: python3 learned_quiz.py [-r] [-t TEMA] [-n N] [--list]"""
import argparse, random, sys, textwrap
TITLE = "<TEMA>"
SOURCE = "LEARNED.md, <FECHA>"
QUESTIONS = [
{"topic": "Humano", "q": "¿Pregunta de ejemplo?",
"choices": ["Respuesta correcta", "Incorrecta 1", "Incorrecta 2", "Incorrecta 3"], "answer": 0,
"why": "Una o dos frases sobre el porqué.", "link": "https://ejemplo.com"},
]
def wrap(s, ind=" "):
return textwrap.fill(s, 78, initial_indent=ind, subsequent_indent=ind)
def ask(prompt, valid):
while True:
try:
a = input(prompt).strip().lower()
except (EOFError, KeyboardInterrupt):
print(); sys.exit(0)
if a in valid:
return a
def run(qs, review):
missed = []
for i, q in enumerate(qs, 1):
order = list(range(len(q["choices"])))
random.shuffle(order)
letters = "abcdefgh"[:len(order)]
print(f"\n[{i}/{len(qs)}] ({q['topic']})")
print(wrap(q["q"], ""))
for L, idx in zip(letters, order):
print(wrap(f"{L}) {q['choices'][idx]}"))
right = letters[order.index(q["answer"])]
if review:
if ask(" Enter para revelar, q para salir: ", {"", "q"}) == "q":
sys.exit(0)
ok = True
else:
a = ask(f" Respuesta [{letters}], q para salir: ", set(letters) | {"q"})
if a == "q":
break
ok = a == right
print(" Correcto." if ok else f" No es correcto. Respuesta: {right}")
if review or not ok:
print(wrap(f"{right}) {q['choices'][q['answer']]}"))
print(wrap(q["why"]))
if q.get("link"):
print(wrap("Más: " + q["link"]))
if not ok:
missed.append(q)
return missed
def main():
p = argparse.ArgumentParser(description=f"Cuestionario: {TITLE}")
p.add_argument("-r", "--review", action="store_true", help="modo flashcard, sin puntuación")
p.add_argument("-t", "--topic", help="solo este tema (Humano, IA, Compartida, ...)")
p.add_argument("-n", type=int, help="haz como máximo N preguntas")
p.add_argument("--list", action="store_true", help="imprime todas las Q&A y sale")
p.add_argument("--seed", type=int, help="orden fijo")
a = p.parse_args()
random.seed(a.seed)
qs = [q for q in QUESTIONS if not a.topic or q["topic"].lower() == a.topic.lower()]
if not qs:
sys.exit(f"No hay preguntas para el tema {a.topic!r}.")
if a.list:
for i, q in enumerate(qs, 1):
print(f"{i}. ({q['topic']}) {q['q']}\n{wrap('A: ' + q['choices'][q['answer']])}\n{wrap(q['why'])}")
if q.get("link"):
print(wrap("Más: " + q["link"]))
return
random.shuffle(qs)
qs = qs[:a.n] if a.n else qs
print(f"{TITLE}\nFuente: {SOURCE}\n{len(qs)} preguntas.")
while qs:
missed = run(qs, a.review)
if a.review:
break
print(f"\nPuntuación: {len(qs) - len(missed)}/{len(qs)}")
if not missed or ask("¿Reintentar las falladas? [s/n]: ", {"s", "n"}) == "n":
for q in missed:
print(wrap(f"Revisa: {q['q']}", "- ") + ("\n" + wrap(q["link"]) if q.get("link") else ""))
break
qs = missed
if __name__ == "__main__":
main()