Saltar al contenido
oracle

12 · Tareas y contexto de trabajo en Git#

Contrato, especificación y guía de uso del tracker local de tareas de Oracle.

1. El modelo#

Oracle organiza tareas y pendientes como carpetas dentro de tareas/ en la raíz del proyecto. Cada tarea es un directorio autónomo con un archivo central TAREA.md y cualquier adjunto local asociado (capturas, notas, esquemas, volcados de evidencia).

El formato privilegia la legibilidad y la edición manual:

mi-proyecto/
  tareas/
    README.md
    20260911-180000-investigar-sensor/
      TAREA.md
      captura.png
      notas.md
    20260911-181500-kb-timeout-arnes/
      TAREA.md

2. Descubrimiento de la raíz del tracker#

El tracker determina la raíz de trabajo aplicando el siguiente orden de precedencia estricto:

  1. Bandera explícita: --proyecto <ruta> en la línea de comandos.
  2. Variable de entorno: $ORACLE_PROYECTO.
  3. Búsqueda local ascendente: desde el directorio de trabajo actual (cwd), inspecciona cada directorio ascendiendo hacia la raíz del sistema de archivos buscando la presencia de un subdirectorio tareas/.
    • Límite Git: la búsqueda automática se detiene inmediatamente si encuentra un límite de repositorio Git (.git) y no continúa hacia directorios superiores, evitando saltar accidentalmente al tracker de un repositorio padre o contenedor.
    • Si no se encuentra tareas/ antes o al alcanzar el límite Git, la resolución falla informando que no hay tracker inicializado.

El comando oracle tarea init [ruta] [--sin-readme] inicializa el tracker creando el directorio tareas/ (y opcionalmente tareas/README.md, salvo que se especifique --sin-readme) en la ruta indicada o en el directorio actual. No exige la presencia de catalogos/ ni oracle.json.

3. Identidad de tareas y resolución de colisiones#

Cada tarea posee un identificador único basado en tiempo universal coordinado (UTC):

Seguridad y confinamiento de rutas#

Los títulos, etiquetas y nombres de adjuntos no admiten saltos de línea, incluidos separadores Unicode.

4. Anatomía y especificación de TAREA.md#

Un archivo TAREA.md se compone de tres partes ordenadas:

  1. Título (H1): la primera línea no vacía del documento debe ser un encabezado Markdown de nivel 1 (# Título de la tarea).
  2. Bloque de metadatos: situado inmediatamente después del título (permitiendo líneas en blanco intermedias), consiste en una lista contigua de elementos Markdown con la forma - CLAVE: VALOR.
    • ESTADO: obligatorio, toma exclusivamente los valores ABIERTA o CERRADA.
    • PRIORIDAD: obligatorio, un número entero (ej. 50, 100, 0). A mayor número, mayor prioridad en los listados. El valor por defecto al crear es 50.
    • ETIQUETAS: lista de etiquetas separadas por comas (ej. bug, sensor, urgente).
    • CIERRA CON: lista opcional de identificadores de medidas separados por comas (ej. dedos.flexion_digital, recarga.slot). Cada identificador tiene al menos dos segmentos separados por puntos; cada segmento comienza con una letra minúscula ASCII y continúa con letras minúsculas ASCII, dígitos o _. Se recortan espacios y se eliminan repeticiones conservando el orden. Ausente o vacío significa ninguna medida; elementos vacíos entre comas o identificadores inválidos invalidan la tarea. Se expone como cierra_con en JSON. El tracker sólo valida la declaración: no consulta el catálogo ni evalúa medidas al cerrar. Los cambios de estado y etiquetas preservan el campo original.
    • Campos adicionales: se admiten campos personalizados (ej. - ASIGNADO: brian) y se preservan intactos en operaciones de actualización.
    • Validación estricta: campos duplicados dentro del bloque de metadatos o estados desconocidos constituyen un error que invalida la tarea.
  3. Cuerpo libre: todo el texto posterior al bloque de metadatos, separado por al menos una línea en blanco.
    • El cuerpo admite cualquier contenido Markdown: secciones, listas, tablas, enlaces relativos y bloques de código.
    • Aislamiento: líneas dentro del cuerpo libre o dentro de bloques de código cercados (```) que se asemejen a metadatos (como - ESTADO: ABIERTA) se interpretan como texto plano y no alteran la cabecera.

Preservación en escrituras#

Los comandos de modificación de estado (cerrar, reabrir):

5. Comandos del CLI (oracle tarea)#

ComandoArgumentos / OpcionesDescripción
oracle tarea init[ruta] [--sin-readme]Inicializa tareas/ y opcionalmente tareas/README.md.
oracle tarea nueva<titulo> [--etiqueta/-e <etiqueta>]... [--prioridad <n>] [--sufijo <sufijo>] [--json]Crea una nueva tarea y devuelve su ID y ruta.
oracle tarea listar / ls[consulta] [--cerradas] [--todas] [--etiqueta/-e <e>] [--texto/-t <s>] [--por-id] [--invertir] [--explicar] [--json]Lista tareas abiertas (o cerradas/todas). Admite expresiones TQL, orden por ID descendente e inversión.
oracle tarea ver<id> [--ruta] [--json]Muestra detalles de la tarea. Admite prefijos y sufijos exactos inequívocos. Con --ruta imprime solo la ruta al archivo.
oracle tarea cerrar<id>Cambia el estado a CERRADA de forma atómica y preserva el resto.
oracle tarea reabrir<id>Cambia el estado a ABIERTA de forma atómica y preserva el resto.
oracle tarea revisar[--json]Audita la integridad del directorio tareas/: detecta carpetas sin TAREA.md, metadatos inválidos y omisiones.
oracle tarea anotar<id> [texto] [--url <url>] [--marca <marca>] [--json]Agrega una nota, enlace web o marca al cuerpo de la tarea sin descargar contenido remoto.
oracle tarea adjuntar<id> <archivo> [--permitir-grande] [--json]Copia un archivo regular al directorio de la tarea y lo vincula en TAREA.md.
oracle tarea buscar<texto> [--json]Búsqueda literal en documentos y notas de texto del tracker (omite binarios y archivos > 2 MiB).
oracle tarea referencias[id] [--json]Busca menciones textuales del ID canónico en tareas y código fuente. Sin ID, deduce la tarea desde el directorio actual.
oracle tarea resumen[--json]Reporta cantidades agregadas por estado y etiquetas a partir de registros válidos.
oracle tarea seguimiento[opciones]Diagnóstico de seguimiento y cobertura de tareas y adjuntos en Git.
oracle tarea hechos[--git] [--json]Emite evidencia relacional de tareas, inventario, referencias y omisiones en JSON.
oracle tarea etiquetar<id>... --etiqueta <e> [--json]Agrega una o más etiquetas a tareas existentes de forma atómica.
oracle tarea desetiquetar[<id>...] --etiqueta <e> [--consulta <tql>] [--cerradas] [--todas] [--json]Quita una o más etiquetas de tareas de forma atómica (por ID o por consulta TQL masiva).
oracle tarea grafo[--json]Emite el grafo de referencias entre tareas en formato DOT o JSON.

Todos los subcomandos aceptan --proyecto <ruta> para operar sobre un directorio explícito.

Reglas de captura y contexto (P2)#

Las consultas de texto omiten archivos cuyo nombre empieza con punto y registran esa omisión. Son observaciones de archivos locales durante la consulta; no bloquean editores ni otros procesos. El seguimiento en Git no comprueba que haya un backup remoto o que los enlaces sigan disponibles.

Evidencia relacional del tracker (P3)#

El comando oracle tarea hechos [--git] [--json] [--proyecto RUTA] emite un objeto JSON relacional estructurado directamente a stdout, concebido para ser consumido por el evaluador de políticas de Oracle (oracle juzgar --proyecto ejemplo/seguimiento-tareas --con <hechos.json>), basado en evaluar y el catálogo efectivo.

La salida no se escribe en el tracker ni en disco; se redirige típicamente mediante tuberías o redirección shell hacia un archivo fuera del árbol de tareas (oracle tarea hechos > /tmp/hechos.json).

El JSON relacional contiene siempre siete relaciones clave sin envoltorios adicionales:

  1. lectura_seguimiento (exactamente una fila):
    • esquema: "oracle.tareas.hechos/v1".
    • completa: booleano (true si no hubo omisiones en la lectura del tracker; false si se omitieron archivos o enlaces por tamaño, symlinks, codificación o rutas no seguras).
    • git: "no_solicitado" (sin bandera --git), "sin_repositorio" (si el proyecto no pertenece a un repositorio Git) o "comprobado" (si se auditó el repositorio con éxito).
    • head: identificador del commit HEAD o cadena vacía "" si no hay commits o no se solicitó Git.
  2. tarea_seguimiento (una fila por tarea válida registrada en el tracker, ordenada por id):
    • id: identificador canónico de la tarea.
    • titulo: título declarado en el primer encabezado de TAREA.md.
    • estado_declarado: estado textual en metadatos (ABIERTA o CERRADA).
    • prioridad_declarada: prioridad numérica entera.
    • ruta: ruta relativa POSIX al archivo TAREA.md desde la raíz del proyecto.
    • sha256_documento: hash SHA-256 en minúsculas de los bytes de TAREA.md.
  3. archivo_seguimiento (inventario recursivo de archivos bajo tareas/, ordenado por ruta):
    • tarea_id: identificador de la tarea para documentos y adjuntos; cadena vacía "" para archivos auxiliares (README.md, .gitignore).
    • ruta: ruta relativa POSIX desde la raíz del proyecto.
    • clase: "documento" (para TAREA.md), "adjunto" (para archivos dentro de carpetas de tareas) o "auxiliar" (para archivos documentados en la raíz de tareas/).
    • tipo: "regular", "enlace", "especial" (FIFOs, sockets, dispositivos) o "ausente" (archivos borrados del disco que aún constan en el índice o HEAD de Git).
    • tamano_bytes: tamaño en bytes (0 para archivos especiales o ausentes).
    • existe: booleano de presencia física en disco.
    • git_comprobado: booleano (false sin --git o sin repo; true si Git auditó la ruta).
    • en_indice, en_head, ignorado: booleanos del estado en Git.
    • indice, trabajo: caracteres de estado de Git (equivalentes a git status --porcelain).
  4. referencia_seguimiento (una fila por cada aparición de enlace o mención de recurso en Markdown, ordenada por origen, linea, destino_declarado):
    • tarea_id: identificador de la tarea asociada o "".
    • origen: ruta relativa POSIX del archivo Markdown donde aparece la referencia.
    • linea: número de línea (1-indexed).
    • destino_declarado: texto exacto del destino tal como fue escrito en el documento.
    • clase:
      • "local": rutas relativas a archivos o recursos locales.
      • "remota": URLs absolutas con esquema http o https (insensible a mayúsculas/minúsculas).
      • "ancla": referencias a fragmentos internos (#seccion).
      • "no_admitida": esquemas no reconocidos (mailto:, ftp:, file:) o rutas de red (//host).
    • estado:
      • "presente": el archivo local existe en disco dentro del proyecto.
      • "ausente": el archivo local de destino no existe en la ruta referenciada o navega a través de archivos no directorios con ...
      • "fuera_del_proyecto": la referencia apunta fuera de los límites del proyecto.
      • "no_comprobado": referencias remotas, anclas, esquemas no admitidos o rutas locales donde cualquier componente (incluso previo a ..) es un enlace simbólico.
  5. omision_seguimiento (inventario de elementos o sintaxis que no pudieron procesarse, ordenado por ruta, linea, motivo):
    • ruta: ruta relativa POSIX del archivo afectado o del documento donde ocurrió la omisión.
    • linea: número de línea (1-indexed) o 0 cuando la omisión afecta a la totalidad del archivo.
    • motivo: descripción clara de la causa (ej. adjunto Markdown > 2 MiB, enlace simbólico, bytes nulos, enlaces por referencia no resueltos, sintaxis incompleta o multilínea).

Garantías de límites, seguridad y gramática:

  1. commit_seguimiento (una fila por commit alcanzable desde HEAD, del más nuevo al más viejo; vacía sin --git o sin repositorio):

    • sha: el sha-1 completo del commit.
    • asunto: la primera línea del mensaje, tal cual.
    • nombra_tarea: booleano; true si el asunto tiene la forma <ID>: resumen.
    • tarea_nombrada: el ID nombrado, o "".
    • tarea_existe: booleano; si ese ID está hoy en tareas/.
    • estado_de_la_tarea: ABIERTA, CERRADA o "" si no existe.
    • es_cierre: booleano; true sólo si el resumen es exactamente done. Un asunto que sigue con cualquier otra cosa —una firma pegada, por ejemplo— no es el commit de cierre que la convención pide, y que se vea es el punto de medirlo.

    No ve el cuerpo del mensaje, ni el autor, ni la fecha, ni los archivos tocados, y no comprueba que el trabajo del commit tenga que ver con la tarea que nombra: eso no lo puede saber ninguna medida.

  2. tarea_cierre_medida (siempre presente, incluso []):

    • tarea_id: identificador canónico de la tarea, abierta o cerrada.
    • medida: cada identificador saneado de CIERRA CON, sin duplicados por tarea.
    • Orden: tareas por id, medidas en el orden declarado. Sin criterios no aporta filas.

El tracker no consulta catálogos ni evalúa medidas. La relación externa aceptacion_medida contiene {medida: texto, ok: booleano} y se obtiene de medidas[].id/ok de una corrida actual de oracle juzgar --json sobre el dominio. Sólo se admiten códigos 0/1 con informe válido; errores abortan sin reutilizar evidencia. no_aplicadas no aporta filas y un rojo perdonado por sombra conserva ok: false. El éxito de oracle test valida el corpus, incluidos rojos esperados; no acredita dominio verde.

La política optativa seguimiento.toda_tarea_cerrada_cumple_medidas_de_cierre exige un veredicto verde por cada criterio de una tarea CERRADA. Sin aceptacion_medida no aplica (compatibilidad); con [] aplica y rechaza cierres con criterios. Tareas abiertas o sin criterios no requieren veredictos. Medidas inexistentes o no evaluadas carecen de evidencia verde. Esto audita cierres; no bloquea tarea cerrar. El flujo ejecutable y copiable está en ejemplo/seguimiento-tareas/cierre_medidas.py, con instrucciones en el README del ejemplo.

Juzgar los hechos del tracker con oracle juzgar#

La evidencia emitida por oracle tarea hechos puede juzgarse directamente mediante el comando oracle juzgar (o su forma canónica oracle proyecto juzgar), pasando como proyecto el catálogo de políticas de seguimiento provisto en ejemplo/seguimiento-tareas:

oracle tarea hechos --git > hechos.json
oracle juzgar --proyecto ejemplo/seguimiento-tareas --con hechos.json

El evaluador carga el catálogo efectivo del proyecto, verifica que las relaciones requeridas estén presentes en la evidencia y emite un informe estructurado (Informe.texto() o Informe.a_json() con --json). Si todas las medidas aplicables resultan verdes, el comando finaliza con código 0; si alguna resulta roja o no hay medidas aplicables, finaliza con código 1.

Políticas de seguimiento del tracker#

El catálogo de ejemplo en ejemplo/seguimiento-tareas define seis políticas de auditoría:

  1. seguimiento.referencias_locales_presentes:
    • Qué comprueba: que ninguna referencia local reconocida apunte a un archivo ausente (donde r.clase == "local" y r.estado != "presente"). Exige que cada enlace local relativo ([captura](captura.png)) dentro de un documento TAREA.md apunte a un archivo físico existente en el árbol de la tarea.
    • Qué NO prueba: no prueba que el contenido del adjunto sea correcto ni legible (ej. una imagen corrupta pasa como presente), ni audita enlaces remotos (URLs HTTP/HTTPS), anclas internas o destinos fuera de la tarea.
  2. seguimiento.archivos_confirmados_sin_cambios:
    • Qué comprueba: que ningún archivo del tracker incumpla donde a.git_comprobado == false o a.en_head == false o a.indice != " " o a.trabajo != " ". Es decir, exige que la consulta Git haya sido efectuada (git_comprobado == true), que el archivo esté presente en el commit de HEAD (en_head == true), y que no tenga modificaciones pendientes en el índice (indice == " ") ni en el árbol de trabajo (trabajo == " ").
    • Qué NO prueba: no comprueba repositorios remotos (git push), copias de respaldo, autenticidad, confidencialidad ni calidad del contenido. Requiere consulta Git activa; sin filas o sin comprobación Git falla.
  3. seguimiento.lectura_sin_omisiones:
    • Qué comprueba: que la extracción de hechos haya sido íntegra (donde l.completa == false). Exige que no se hayan producido omisiones por archivos Markdown que superen el límite de 2 MiB, enlaces simbólicos externos, bytes nulos o codificación no UTF-8.
    • Qué NO prueba: no prueba que el extractor sea correcto ni amplía su alcance a texto no Markdown, URLs remotas o anclas.
  4. seguimiento.ningun_commit_nombra_una_tarea_inexistente:
    • Qué comprueba: que todo commit cuyo asunto empieza con un ID nombre una tarea que existe (donde c.nombra_tarea == true y c.tarea_existe == false). El ID es la única forma de ir del cambio a su razón; si no resuelve, el mensaje afirma algo que nadie puede comprobar.
    • Qué NO prueba: no comprueba que el trabajo del commit tenga que ver con esa tarea, ni dice nada de los commits que no nombran ninguna: la convención es posterior a la historia del proyecto y hacerla obligatoria hacia atrás pondría en rojo todo lo anterior.
  5. seguimiento.toda_tarea_cerrada_tiene_su_commit_de_cierre:
    • Qué comprueba: que ninguna tarea CERRADA se haya quedado sin su <ID>: done (se expresa con anti-junta sin commit_seguimiento c donde c.tarea_nombrada == t.id y c.es_cierre == true). Cerrar editando el documento y no commitear el cierre deja el estado sin punto en el árbol.
    • Qué NO prueba: no comprueba que el cierre fuera correcto ni que el trabajo estuviera hecho. Una tarea cerrada antes de que la convención existiera cuenta igual, que es deuda declarada y no un falso rojo: se tapa con una sombra con cota, como hace el propio Oracle.
  6. seguimiento.ningun_cierre_deja_la_tarea_abierta:
    • Qué comprueba: que ningún commit que dice done apunte a una tarea que hoy sigue abierta (donde c.es_cierre == true y c.tarea_existe == true y c.estado_de_la_tarea != "CERRADA"). O el cierre no se guardó, o alguien la reabrió sin decirlo en un commit.
    • Qué NO prueba: el tracker no guarda historia de estados, así que una tarea cerrada y reabierta a propósito aparece acá y hay que declararla.

Para restringir la evaluación a una política específica:

oracle juzgar --proyecto ejemplo/seguimiento-tareas --con hechos.json --medida seguimiento.referencias_locales_presentes

Lenguaje de consultas de tareas (TQL)#

El comando oracle tarea listar admite una expresión posicional de consulta en lenguaje TQL (Task Query Language) con vocabulario en español para filtrar tareas de forma expresiva:

oracle tarea listar ":bug y prioridad mayor 50"
oracle tarea listar "no :ui o [:backend y prioridad desde 70]"

Vocabulario y operadores#

  1. Etiquetas: :etiqueta evalúa si la tarea posee la etiqueta indicada. La comparación es insensible a mayúsculas y minúsculas (:bug coincide con bug y con Bug).
  2. Palabras clave primarias:
    • cualquiera: coincide con cualquier tarea (siempre verdadero). Una consulta vacía equivale a cualquiera.
    • etiquetada: verdadero si la tarea posee al menos una etiqueta declarada.
    • prioridad: evalúa al valor entero de prioridad de la tarea.
  3. Identificador exacto: un ID canónico de tarea (YYYYMMDD-HHMMSS[-slug]) coincide únicamente con la tarea que posea ese identificador.
  4. Constantes enteras: enteros con signo opcional (50, +10, -5).
  5. Comparadores de enteros:
    • menor: estrictamente menor.
    • hasta: menor o igual.
    • mayor: estrictamente mayor.
    • desde: mayor o igual.
    • igual: igualdad de enteros.
    • distinto: desigualdad de enteros.
    • No hay formas simbólicas (<, >…): en la shell < y > redirigen, que es por lo que tatr tampoco las usa. prioridad < 50 es un error de código 2.
  6. Operadores lógicos:
    • no <primaria>: negación booleana de la expresión primaria siguiente.
    • <izq> y <der>: conjunción lógica (ambas condiciones deben ser verdaderas).
    • <izq> o <der>: disyunción lógica (al menos una condición verdadera).
  7. Agrupamiento: corchetes [ consulta ] para delimitar subexpresiones y alterar la precedencia asociativa.

Precedencia de operadores#

De mayor a menor precedencia:

  1. Primarias: :etiqueta, cualquiera, etiquetada, prioridad, enteros, IDs, [ ... ] y no <primaria>.
  2. Comparaciones relacionales: menor, hasta, mayor, desde, igual, distinto.
  3. Conjunción: y (asociativa por izquierda).
  4. Disyunción: o (asociativa por izquierda).

Sistema de tipos estático en compilación#

TQL valida estáticamente los tipos en tiempo de compilación antes de evaluar cualquier tarea en disco:

Diagnóstico visual de errores (código 2)#

Ante un error léxico, sintáctico o de tipos, el compilador emite un mensaje de error en 3 líneas a stderr y finaliza con código 2:

:bug y menor 5
       ^
ERROR: se esperaba una expresión entera antes de «menor»

El puntero ^ se alinea exactamente con la columna del token conflictivo (contando caracteres Unicode, no bytes).

Explicación de consultas (--explicar)#

La opción --explicar en oracle tarea listar compila la consulta, imprime en stdout la secuencia de tokens y la representación textual del árbol sintáctico compilado, y finaliza exitosamente con código 0:

oracle tarea listar ":bug y prioridad mayor 50" --explicar

No requiere la existencia del directorio tareas/ ni la presencia de un tracker, ni lista tareas.

Alineación dinámica en listados#

El comando oracle tarea listar (o su alias ls) calcula dinámicamente el ancho de cada columna en función del contenido real de las tareas a mostrar:

Catálogo de etiquetas (tareas/etiquetas)#

El tracker admite un catálogo opcional de etiquetas y sus descripciones ubicado directamente en tareas/etiquetas.

Operaciones de etiquetado (etiquetar y desetiquetar)#

Los comandos etiquetar y desetiquetar permiten gestionar etiquetas sobre tareas existentes sin edición manual:

Grafo de referencias entre tareas (grafo)#

El comando oracle tarea grafo [--json] [--proyecto RUTA] construye el grafo dirigido de referencias existentes entre las tareas del tracker:

Tutorial del ciclo completo (P1 + P2 + P3)#

Con Oracle instalado y Git disponible, este recorrido crea un proyecto temporal y un registro de texto construido. Conservá el ID que devuelve nueva: lo reutilizan los pasos siguientes. El subshell mantiene el directorio de tu terminal y deja el proyecto temporal disponible para inspección.

(
proyecto_prueba="$(mktemp -d)"
cd "$proyecto_prueba"
oracle tarea init --proyecto .

# 1. Crear una tarea y conservar su ID real
id_tarea="$(oracle tarea nueva "Desincronización de eventos en sensor" \
  --etiqueta bug --etiqueta sensor --sufijo sinc --json --proyecto . \
  | python3 -c 'import json, sys; print(json.load(sys.stdin)["id"])')"

# 2. Guardar una URL construida con una marca; no se descarga el video
oracle tarea anotar "$id_tarea" "Ejemplo de nota sobre monotonic clock" \
  --url "https://youtube.com/watch?v=ejemplo&t=150s" \
  --marca "02:30" --proyecto .

# 3. Crear un registro construido y adjuntarlo
printf 'Registro construido para practicar adjuntos.\n' > registro-ejemplo.txt
oracle tarea adjuntar "$id_tarea" registro-ejemplo.txt --proyecto .

# 4. Buscar términos en todas las tareas y notas del tracker
oracle tarea buscar "monotonic clock" --proyecto .

# 5. Crear una mención externa y reencontrarla por el ID
printf 'Investigación relacionada: %s\n' "$id_tarea" > referencias.md
oracle tarea referencias "$id_tarea" --proyecto .

# 6. Ver el resumen global de estados y etiquetas
oracle tarea resumen --proyecto .

# 7. Diagnosticar Git: este proyecto temporal todavía no tiene repositorio
oracle tarea seguimiento --proyecto .

# 8. Extraer hechos; el JSON declara sin_repositorio
oracle tarea hechos --git --proyecto . > hechos-tareas.json

# 9. Cerrar la tarea al finalizar
oracle tarea cerrar "$id_tarea" --proyecto .
oracle tarea listar --cerradas --proyecto .
printf 'Proyecto de práctica: %s\n' "$proyecto_prueba"
oracle juzgar --proyecto /ruta/al/checkout/ejemplo/seguimiento-tareas --con "$proyecto_prueba/hechos-tareas.json"
)

Para usar una captura real, reemplazá registro-ejemplo.txt por un archivo existente. El archivo JSON queda dentro del directorio temporal del proyecto de práctica. En el último comando, reemplazá /ruta/al/checkout por la ruta absoluta al checkout de Oracle. La política de archivos confirmados fallará hasta que haya un repositorio con esos archivos confirmados en HEAD y sin cambios pendientes. El tutorial no hace commits.

Las opciones --cerradas y --todas de listar son incompatibles, al igual que --ruta y --json de ver; combinarlas devuelve código 1.

La auditoría admite README.md, README, .gitignore y etiquetas como archivos auxiliares directamente en tareas/. Otros archivos sueltos en esa raíz se diagnostican como anomalías. Guardá las capturas, notas y demás adjuntos dentro de la carpeta de su tarea.

Orden en los listados#

Por defecto, las tareas se listan ordenadas según:

  1. PRIORIDAD en orden descendente (mayor número primero).
  2. ID en orden ascendente (desempate cronológico y alfabético estable).

Modificadores de orden:

Reglas de diagnóstico y códigos de salida#


6. Ejemplos construidos de referencia#

Los siguientes ejemplos son construidos con propósitos de especificación y contrato.

Ejemplo 1: Tarea mínima#

Ubicación: tareas/20260911-190000-actualizar-documentacion/TAREA.md

# Actualizar documentación de inicio rápido

- ESTADO: ABIERTA
- PRIORIDAD: 50
- ETIQUETAS: docs

Revisar que el paso de instalación coincida con la versión 0.15.0.

Ejemplo 2: Investigación técnica con referencias#

Ubicación: tareas/20260911-191000-investigar-sensor/TAREA.md Archivos adjuntos en la misma carpeta: captura-error.png, fragmento.log

# Investigar desincronización de eventos en el sensor de procesos

- ESTADO: ABIERTA
- PRIORIDAD: 80
- ETIQUETAS: bug, sensor, investigacion
- IMPACTO: alto

## Síntoma observado

Al procesar trazas concurrentes en el arnés, algunos eventos de inicio
se registran con timestamp posterior al evento de fin.

Ver captura del analizador: ![Captura de error](captura-error.png)

## Referencias y evidencia local

- Registro de ejecución: [fragmento.log](fragmento.log)
- Archivo de configuración: `oracle.json`
- Sospecha: temporizador monotonic vs clock_gettime en Python 3.11.

Ejemplo 3: Nota de base de conocimiento (KB)#

Ubicación: tareas/20260911-192000-kb-aislamiento-de-tests/TAREA.md

# KB: Por qué `test_herramientas` requiere aislar la generación de bytecode

- ESTADO: ABIERTA
- PRIORIDAD: 20
- ETIQUETAS: kb, arquitectura, tests
- TIPO: nota-permanente

## Contexto

Cuando se ejecutan tests que mutan o reescriben archivos en el árbol, la
escritura de archivos `.pyc` en `__pycache__` puede dejar artefactos residuales
no versionados o competir entre procesos concurrentes.

Para evitar contaminar el árbol de trabajo y aislar las ejecuciones:
1. Usar siempre `python3 -B` para evitar escribir archivos de bytecode.
2. Las pruebas de integración que ejecutan subprocesos deben pasar `PYTHONDONTWRITEBYTECODE=1`.
3. Si existen cachés previas en disco, deben limpiarse antes de correr mutaciones.

Esta nota permanece abierta para referencia continua del equipo.

7. Diferencias con tatr#

Concepto / Operacióntatr (inglés)Oracle (español)
Disyunción lógicaoro
Conjunción lógicaandy
Negación booleananotno
Agrupamiento[ ... ][ ... ]
Menor estrictoltmenor
Menor o iguallehasta
Mayor estrictogtmayor
Mayor o igualgedesde
Igualdad de enteroseqigual
Desigualdad de enterosnedistinto
Todas las tareasanycualquiera
Tarea con etiquetastaggedetiquetada
Prioridadpriorityprioridad
Etiqueta:tag (sensible a mayúsculas):etiqueta (insensible a mayúsculas)
Listado por ID desc.tatr ls -idoracle tarea listar --por-id
Invertir orden finaltatr ls -aoracle tarea listar --invertir
Explicar consultatatr ls -debug (tokens y opcodes)oracle tarea listar --explicar (tokens y árbol compilado)
- Grafo: tatr graph escribe graph.dot y llama a neato para generar graph.svg; oracle tarea grafo sólo emite DOT por stdout, sin escribir archivos ni invocar Graphviz (`oracle tarea grafodot -Tsvg -o grafo.svg`).

Esta página se genera desde docs/12-tareas.md.