CommunityProgramación y desarrollogithub.com

george-andrikopoulos/global

Disciplina de ingeniería que aplica a todo proyecto y lenguaje. Cubre: garantía necesita un lector; veredicto sobrevive al canal; verifica la afirmación heredada; vigencia de documentación; mide la afirmación no un subconjunto; sin gasto silencioso; prefiere por construcción; repara el artefacto mentiroso; señal necesita una consecuencia; verifica por ruta de producción; detector excluye sus propias definiciones; un objetivo de escritura ambiguo es una pregunta; ancla fuera del alcance de la parte verificada; delega un abanico; compara contra el estado conocido...

¿Qué es global?

Esta habilidad proporciona un conjunto de reglas de ingeniería de software universales, diseñadas para prevenir errores comunes y costosos en cualquier proyecto y lenguaje de programación. Las reglas cubren áreas críticas como la gestión de estado compartido, la verificación de afirmaciones heredadas, la prevención de colisiones de archivos, y la seguridad en sistemas multi-entorno. La habilidad es útil para agentes de IA como Claude Code, Cursor, Codex, y otros, ya que les permite aplicar estas reglas de forma sistemática para evitar efectos secundarios no deseados, garantizar la integridad de los datos y mejorar la fiabilidad del software. Se basa en principios documentados en publicaciones académicas (como SABench de NeurIPS 2026) y enfoques prácticos para la depuración y la revisión de código. La documentación SKILL.md describe cada regla en detalle, incluyendo modos de fallo y ejemplos, para que el agente pueda consultarlas y aplicarlas correctamente.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/george-andrikopoulos/relearn/tree/HEAD/claude-pack/skills/global

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

Reglas globales

Cuando la solicitud no especifica qué toca una escritura, pregunta antes de escribir [R:un-objetivo-de-escritura-ambiguo-es-una-pregunta]

Escrito a partir de "El éxito de la tarea no es suficiente: Evaluación consciente de efectos secundarios de agentes de modelo de lenguaje que usan herramientas" (SABench), póster NeurIPS 2026, https://neurips.cc/virtual/2026/poster/138911 (arXiv:2610.34167, listado en cs.AI 2026-10-27) -- resumen leído 2026-10-27.

Antes de cualquier acción que cambie el estado fuera de la copia de trabajo (enviar, publicar, invitar, editar un registro compartido, eliminar, cerrar), nombra los objetivos exactos que tocará y verifica que la solicitud nombre cada uno de ellos. Si no lo hace, pregunta. No resuelvas la ambigüedad eligiendo la lectura más plausible y procediendo.

Tres formas, todas el mismo error:

  • El objeto incorrecto. Dos calendarios, dos hilos, dos tickets coinciden con la descripción; se elige uno.
  • El alcance ampliado. "Responder a Sam" se convierte en un responder a todos; "corregir la fecha de este evento" se convierte en una edición de toda la serie recurrente.
  • El destinatario no intencionado. Un reenvío, una invitación o una mención llega a alguien que la solicitud nunca nombró.

Alcanzar el objetivo no lo aclara. La ejecución que envió el mensaje correcto y actualizó un segundo registro parece completa para cualquier verificación que califique la finalización, por lo que esta clase sobrevive a la revisión: la evidencia del éxito también es la cobertura del efecto secundario.

El costo es asimétrico, por lo que el umbral también lo es. Una pregunta cuesta un turno; una escritura en el objeto incorrecto suele ser irreversible y llega a alguien que no pidió nada. Cuando la acción es de solo lectura, o está confinada a archivos que la sesión posee y el control de versiones puede restaurar, está bien elegir una lectura y decirlo. Cuando llega a otras personas o al estado compartido, no lo está.

Verificación del modo de fallo, antes de la llamada: ¿qué objetos tocará esta escritura y dónde en la solicitud se nombra cada uno? Si la respuesta honesta para alguno de ellos es "era el probable", esa es la pregunta que hacer.

Vecina, deliberadamente separada: [R:sin-gasto-silencioso] es decidir por el usuario lo que vale una tarea; esta es decidir por el usuario de qué se trata una tarea.

Mantén el ancla de confianza de una verificación fuera del alcance de la parte que verifica [R:ancla-fuera-del-alcance-de-la-parte-verificada]

Toda verificación que protege algo contra una parte compara la entrada de esa parte con un ancla: una clave pública, una lista de permitidos, un permiso, una política, un encabezado de cadena hash. La verificación es tan sólida como la posición del ancla. Si la parte que se verifica puede escribir el ancla, la verificación confronta al adversario con los datos del adversario, y pasa para ellos exactamente como pasa para ti.

Por lo tanto, antes de confiar en dicha verificación, pregúntate: ¿quién puede escribir la cosa con la que se compara, y la parte verificada está entre ellos? Rastrea el acceso de escritura por cada ruta, no solo por la que ofrece la API. Una tabla para la que la interfaz no tiene un punto final sigue siendo escribible por cualquier proceso que pueda abrir el archivo; un archivo de configuración es escribible por cualquier cosa que se ejecute como el mismo usuario; un valor que un complemento almacena en su propio espacio de nombres es modificable por el complemento. Si la parte verificada puede alcanzar el ancla por cualquier ruta, la garantía no se mantiene, por muy correcta que sea la criptografía o la comparación.

Coloca el ancla donde la parte verificada no pueda alcanzarlo: en hardware (una clave protegida por TPM leída desde el dispositivo), en un dominio de confianza separado, en una fuente firmada o fuera de banda, o compilado en el binario que la parte verificada no controla. Donde aún no exista tal lugar, di en el modelo de amenazas qué partes no detiene la verificación, en lugar de permitir que la verificación implique que las detiene.

La señal es una garantía expresada en la forma "X no puede hacer Y porque Z se verifica": verifica dónde vive el valor de referencia de Z antes de escribir la oración. Una afirmación de infalsificabilidad es una afirmación sobre el acceso de escritura al ancla, y es falsa siempre que ese acceso de escritura no se haya rastreado.

Este es el hermano de diseño de seguridad de [R:artefacto-cableado]: esa regla detecta una verificación que acepta evidencia que cualquier cosa puede producir; esta detecta una verificación cuyo valor de referencia cualquier cosa a la que apunta la verificación puede producir. Misma familia que [R:garantía-necesita-un-lector] y [R:verifica-la-afirmación-heredada]: una garantía establecida sin una base rastreada.

Verificación del modo de fallo: ¿puede la parte que esta verificación restringe escribir, por cualquier ruta, el valor con el que se compara la verificación? Si es así, o si no lo has rastreado, la verificación aún no es un control.

Verifica si existe un archivo hermano con diferencia de mayúsculas antes de crear un archivo [R:colisión-de-mayúsculas]

También aplicado por el hook:sin-colisión-de-mayúsculas.

Antes de crear cualquier archivo, verifica si existe un archivo hermano cuyo nombre difiera solo por mayúsculas o por normalización Unicode. Cuando un repositorio se sincroniza entre un sistema de archivos sensible a mayúsculas y uno insensible, la semántica insensible a mayúsculas es la restricción vinculante: dos nombres así son un solo archivo, y el perdedor es el que se escribió en segundo lugar.

Fusiona en el archivo existente, con un encabezado de sección, en lugar de crear el nombre en conflicto. El instinto de crear un nuevo archivo con la capitalización adecuada es el fallo: la convención no vale una sobrescritura silenciosa en la otra máquina.

El daño es invisible desde donde se realizó el trabajo. En el sistema de archivos de creación, ambos archivos existen y todo parece correcto; la colisión aparece solo después de una sincronización, como contenido que desapareció sin un diff ni un error al que atribuirlo.

Esta regla ha sido graduada: un hook en tiempo de escritura ahora bloquea la colisión de manera determinista, por lo que la capa de instrucción ya no tiene que cargar con ella para esa ruta. Todavía se aplica a cada ruta de creación que el hook no ve (una redirección de shell, una operación de git, otra herramienta), por lo que la guía se mantiene en lugar de retirarse.

Verifica una afirmación heredada sobre el mundo antes de repetirla [R:verifica-la-afirmación-heredada]

Ha ocurrido 1 vez(es) desde que se escribió; más recientemente 2026-10-26.

Antes de repetir una afirmación fáctica de un documento sobre un estado vivo, consulta el estado.

Un documento puede decirte dos tipos diferentes de cosas, y no merecen la misma confianza. Una afirmación sobre intención (por qué un umbral es 18, qué fue rechazado y por qué, qué invariante existe para mantener un archivo) solo se registra en prosa, y el documento es la fuente autorizada. Una afirmación sobre el mundo (un sensor está ausente, un servicio está deshabilitado, un recuento es 23, una capacidad no se aplica) describe algo que se puede observar directamente, y el documento es una lectura en caché sin fecha de caducidad.

Repetir el segundo tipo sin observar es cómo una afirmación obsoleta o nunca cierta se blanquea en un informe fresco. Es peor que el error original, porque la afirmación llega ahora con la fecha de hoy y la autoridad de haber sido "verificada" recientemente, y porque el informe es lo que el lector toma en cuenta. Quien la escribió pudo haber tenido razón en ese momento, pudo haber estado adivinando, o pudo haberla copiado de otro lugar; nada de eso es visible cuando la estás leyendo, y una afirmación copiada en cuatro documentos parece corroborada cuatro veces mientras se basa en una afirmación no verificada.

Esta es la mitad del lector de [R:vigencia-de-documentación]. Esa regla le dice al escritor que actualice el documento en el mismo cambio que la cosa que describe, y a veces fallará, por lo que el lector es la última posición donde el error aún puede detectarse. También es el espejo de [R:mide-la-afirmación-no-un-subconjunto]: esa protege el momento en que estás a punto de sobrescribir una cifra registrada, esta el momento en que estás a punto de repetirla. Entre ambas, un número registrado nunca se transmite simplemente sin examinar en ninguna dirección.

La verificación es barata y está acotada. No estás rediseñando el documento; estás verificando puntualmente las afirmaciones específicas que estás a punto de poner bajo tu propio nombre, y solo aquellas que nombran un estado observable.

Verificación del modo de fallo: ¿es esta una afirmación sobre el mundo, y puedo observar el mundo? Si ambas, el documento es una hipótesis y tu informe necesita la observación, no la cita. Si no puedes observarla, repítela con su procedencia adjunta ("TODO.md registra X, no verificado") en lugar de afirmarla directamente.

Delega un abanico una vez que el trabajo se ha enumerado [R:delega-un-abanico]

La reparación impulsada por el compilador es genuinamente serial mientras aún estás derivando lo que está roto: cada corrección cambia el siguiente error. Deja de ser serial en el momento en que una compilación, una puerta de enlace o un plan ha enumerado N seguimientos independientes. A partir de ahí, las ediciones no dependen entre sí, y recorrerlas una por una no gana nada. El punto de abanico es después de que la lista existe, no antes.

La misma forma cubre un conjunto de documentación actualizado una vez por lanzamiento, una revisión que lee varios archivos contra un contrato, y una investigación que necesita varias fuentes independientes.

Cuando la delegación está deshabilitada, presenta la elección (no solo anuncies el costo). Esta regla se anula rutinariamente: la política de arnés de una sesión puede prohibir la delegación directamente, y esa política gana por defecto. Lo que no hace es hacer desaparecer el costo, y un aviso emitido después de que ya has elegido es información en lugar de una decisión. En el primer abanico real, expón la bifurcación en una línea (qué se delegaría, aproximadamente cuántos viajes de ida y vuelta seriales reemplaza, y qué lo activa), luego continúa serialmente a menos que se indique lo contrario, sin repetir la oferta. Señalar una opción de configuración no cuenta: un interruptor global que alguien debe ir a cambiar es un cambio de régimen, no una elección sobre esta tarea.

Verificación del modo de fallo: ¿algo ya ha listado este trabajo por mí? Si una compilación, una puerta de enlace o un plan produjo la lista, la caminata serial es una elección que estás tomando con el presupuesto de otra persona.

Hermana, deliberadamente no fusionada. [R:sin-gasto-silencioso] es la forma general (cada intercambio del tiempo del usuario con su dinero contra minuciosidad). Esta regla se mantiene para la instancia de delegación para que las dos tengan métricas separadas: dos reglas con superficies distintas pueden ser distinguidas por una revisión y cada una lleva su propia evidencia, donde una regla amplia que se activa por cualquier razón es falsificable por nada.

Un detector excluye sus propias definiciones de su escaneo [R:detector-excluye-sus-propias-definiciones]

Parcialmente aplicado por el hook:sin-auto-coincidencia-pkill (pkill -f y pgrep -f en una cadena de comando Bash o PowerShell, juzgado al hacer coincidir el patrón con el propio texto del comando); la mitad original de la regla (un escaneo sobre archivos que coinciden con su propia fuente, comentarios o documentación; ps | grep; un patrón tomado de una variable; un comparador dentro de un archivo de script en lugar de una cadena de comando se mantiene solo con esta instrucción).

Ha ocurrido 1 vez(es) desde que se escribió; más recientemente 2026-09-26.

Cualquier verificación cuyo tema es texto que debe contener en sí misma (un linter, un escáner de secretos, un grep de políticas, un barrido de reglas) coincide consigo misma por construcción. Excluye la fuente, los comentarios y las cadenas de documentación del propio detector de su escaneo, elimina los comentarios antes de coincidir, y normaliza las rutas a marcadores de posición para que la documentación sobre un patrón nunca se lea como una instancia del mismo.

La razón no es la pulcritud. Una verificación siempre roja se silencia, y una verificación silenciada es peor que ninguna, porque el sistema aún parece protegido. La fatiga de alarma tiene valor negativo, no neutral: gasta la atención que necesitará un hallazgo real, y entrena al lector a saltar exactamente la salida que un día importará.

Esto se extiende más allá del propio archivo del detector a cualquier cosa que cite el patrón por una razón legítima. Una nota de corrección que explica que se eliminó una cadena incorrecta, escrita con la cadena incorrecta, se convierte en un falso positivo permanente en el mismo barrido que se escribió para satisfacer (por lo tanto, describe la cadena, no la reproduzcas, y donde la reproducción sea genuinamente necesaria, colócala en algún lugar que el escaneo excluya por regla y no por suerte).

Pregunta antes de enviar cualquier escaneo: ¿aparece esta verificación en su propio corpus y, de ser así, cómo se ve su salida en un árbol limpio? Si la salida del árbol limpio no está vacía, la verificación aún no funciona, por muy correcta que sea su lógica.

La tabla de procesos también es un corpus. pkill -f PAT, pgrep -f PAT y ps | grep PAT coinciden con la línea de comando completa de cada proceso, incluido el shell que los ejecuta, cuyo argv contiene PAT tal cual siempre que el comando viaja como una cadena: bash -c, bash -lc, wsl.exe -- bash -lc, ssh host '...', y cada herramienta de agente que ejecuta un comando a través de un shell. Allí el daño no es la fatiga de alarma sino un shell que se mata a sí mismo, o un bucle de espera que se espera a sí mismo para siempre. Escribe el patrón para que su propio texto no pueda coincidir (por ejemplo, [p]atrón coincide con patrón pero no consigo mismo), o coincide un nombre de proceso exacto con pgrep -x, o un PID que registraste cuando iniciaste el proceso. La pregunta del árbol limpio se convierte en: antes de que se ejecute cualquier otra cosa, ¿qué encuentra este comparador? Si la respuesta no es nada, se encontró a sí mismo.

Cuando algo solía funcionar, prueba qué cambió desde entonces primero [R:diferencia-contra-el-estado-conocido-bueno]

Cuando algo solía funcionar, encuentra qué cambió desde entonces y prueba eso primero.

Una regresión tiene un estado conocido bueno detrás, y ese estado es el hecho más valioso en el diagnóstico: todo lo que no cambió entre ese estado y ahora está, para este síntoma, ya exonerado. Ajustar las partes que se mantuvieron iguales gasta esfuerzo donde la evidencia dice que la falla no está, y cada ajuste plausible que ayuda a medias hace la búsqueda más larga, porque parece progreso.

Por lo tanto, antes de ajustar cualquier cosa, anota las diferencias entre la configuración que funciona y la que falla (hardware, configuraciones, versiones, controladores, personas, clima) y clasifícalas por lo económicamente que se puede neutralizar cada una. Luego ejecuta el experimento más barato que recrea el estado conocido bueno para una diferencia a la vez: reviértela, omítela o fuerzala al comportamiento anterior. Un experimento así puede retirar toda una familia de teorías que el ajuste solo habría rozado.

Si el propietario ofrece un estado conocido bueno ("funcionó con el termostato antiguo", "estaba bien antes de la actualización"), trátalo como...

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

george-andrikopoulos/domain-java

Engineering discipline for working in java. Covers: a speculated path deoptimises when the input changes; a view is not a copy; a wrapper type is not free here; close what you open; design for inheritance or forbid it; equality is one contract; exceptions name what failed; identity is not equality for boxes; no reference to internals escapes; null is not a value; publish safely or not at all; seal the alternatives; serializable is a second constructor

george-andrikopoulos/domain-low-latency

Engineering discipline for working in low-latency. Covers: attack the design in a second pass; a measurement matches the regime it reports; a queue without a bound has no overload behaviour; a structure keeps the regime it was proved under; allocated is not resident; answer the requirement at its layer; no allocation on the hot path; no coordinated omission; no false sharing on a hot line; no retry loop on a contended path; no stall inside a publication window; no syscall on a bounded path;...

george-andrikopoulos/domain-rust

Engineering discipline for working in rust. Covers: design types first; borrow in signatures; module visibility is deliberate; must use on consequential returns; newtype liberally; parse wide then range check; seal closed trait sets; typestate builder for required fields; typestate for protocols; verify the abstraction compiled away; async all the way; errors name what failed; justify every clone; no let underscore on a local; parse dont validate; private fields only; xplat fixtures; no...

Skills relacionados