CommunityProgramación y desarrollogithub.com

erikvallow-qt/dont-let-me-slide

Ejecuta después de solucionar un problema con IA para revisar la sesión, registrar lecciones aprendidas y evaluar al usuario sobre los puntos clave.

¿Qué es dont-let-me-slide?

Esta habilidad está diseñada para consolidar el aprendizaje después de resolver un problema con ayuda de IA. Su propósito es evitar que tanto el humano como la IA repitan los mismos errores, documentando las lecciones aprendidas en un archivo LEARNED.md y generando un cuestionario interactivo en terminal (learned_quiz.py) para reforzar los conceptos. La habilidad revisa automáticamente la sesión del chat relevante, identifica lo que cada parte pasó por alto, investiga enlaces de verificación, y produce contenido estructurado que incluye lecciones humanas, de IA y compartidas, preguntas de prueba y un prompt de una sola línea para evitar problemas similares. Funciona en cualquier sistema que soporte Python 3 y se integra con herramientas de IA como Claude Code, Cursor o Codex. Es ideal para equipos de desarrollo que quieran mejorar su proceso de resolución de problemas y evitar sesgos de repetición.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erikvallow-qt/dont-let-me-slide/tree/HEAD/dont-let-me-slide

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Revisa la sesión que resolvió el problema. Entrega dos archivos: LEARNED.md y learned_quiz.py (un cuestionario de terminal).

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. No presentes conjeturas como hallazgos. Si la causa de un problema no fue confirmada, dímelo.
  7. 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.
  8. Mantén LEARNED.md conciso. No uses guiones largos en ninguno de los archivos.
  9. 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()

Skills relacionados