Proyectos
Los proyectos son esfuerzos con un objetivo definido y un estado final — a diferencia de las Áreas, que son continuas. Un proyecto es una carpeta en la bóveda emparejada con un proyecto en el backend de tareas: la carpeta contiene lo que significa el proyecto, el backend mantiene sus tareas (tasks.md). Cada llamada de tarea es una operación de tasks.md, ejecutada según el adaptador para TASKS.
Capa base
Lee antes de actuar, cada una como ../../para/<file>.md relativo al directorio base de esta habilidad — contienen las reglas compartidas, no las repitas de memoria:
../../para/paths.md— siempre, incluyendo «Idioma»: las cadenas a continuación provienen delang/<LANG>.md../../para/tasks.md— siempre: las operaciones, el emparejamiento, qué es una tarea../../para/find-target.md— paraoverviewytask../../para/note-format.md— paracreate; para cada subcomando, «Campos heredados»../../para/project-id.md— paracreate../../para/dod.md— paracreate(escribir la secciónproject.dod) yoverview../../para/thresholds.md— paralistyoverview: orden de proyectos, obsolescencia, horizontes, recuentos de tareas, tamaño de salida../../para/confirm.md—createytaskescriben (Nivel 1);listyoverviewno escriben nada../../para/move.md— paracreate, antes de escribir una carpeta que pueda colisionar
Subcomandos
La primera palabra de $ARGUMENTS elige el subcomando: list, create, overview, task. Si no es ninguno de esos, determina cuál se quiere a partir de la frase y di cuál elegiste. Si $ARGUMENTS está vacío → ejecuta list, luego pregunta qué hacer.
Cada subcomando se encuentra con proyectos que son anteriores al backend de tareas: status, Tasks/ (note-format.md indica cuándo eso es legacy), sin campo tasks_ref. Léelos como dice note-format.md «Campos heredados» — informa, nunca reescribas.
create <descripción> — iniciar un proyecto
Entrada: qué es el proyecto, su objetivo, fecha límite, primeros pasos. Vacío → pregunta qué es el proyecto y su objetivo.
-
Lee
Templates/Project.mddel disco, textualmente. -
Deriva un título según
note-format.md. Se usa de tres maneras: comotitley el H1 sin el prefijo de id, y — con el prefijo — como nombre de carpeta y nombre del archivo de resumen. Propónshortsegúnnote-format.md. -
Emite el id según
project-id.md. -
Crea la estructura de carpetas bajo
Projects/:PROJ-xxxx <título>/ ├── PROJ-xxxx <título>.md ← resumen, desde Templates/Project.md ├── Notes/ ├── Resources/ └── Results/Las tres subcarpetas, incluso vacías. Sin
Tasks/(bajoTASKS = filesel adaptador la crea con la primera tarea). -
Rellena el frontmatter según la fila de Proyecto en
note-format.md.createdes hoy.deadlinesolo si la descripción proporciona una.tasks_refse queda en blanco hasta el paso 7 (bajopairing: noneel campo se omite). -
Rellena el cuerpo:
- la sección
project.goal— el objetivo / estado final deseado. Obligatorio. - la sección
project.value— qué gana el usuario, medible o inequívoco (note-format.md, "Tres secciones sobre el resultado"). Obligatorio. Si esto oproject.goalno queda claro a partir de la entrada, pregunta por ambos en una sola pregunta (confirm.md, Nivel 1.5) antes de escribir. - la sección
project.problem— qué motivó el proyecto. - la sección
project.expected_result— los artefactos concretos y dónde viven. - la sección
project.scope— solo los elementos que el usuario nombró. Generalmente vacía: la tarea de investigación la llena (tasks.md«La tarea de investigación»). - la sección
project.dod— casillas de verificación segúndod.md. Si la descripción no permite derivar comprobaciones reales, pregunta — como si faltaraproject.goal. - la sección
common.links— wikilinks a notas claramente relacionadas, de lo contrario el-de la plantilla.
- la sección
-
Crea el par según
tasks.md«Emparejamiento»:project.createcon el título y el id. Bajopairing: separate, escribe elrefdevuelto entasks_ref:; si la llamada falla, dila: la carpeta se queda, sin emparejar, y/projects taskofrecerá emparejarla después. Bajopairing: noneno hay par nitasks_ref: omite la escritura. -
Primeras tareas en el nuevo proyecto, sin fechas:
- la tarea de investigación según
tasks.md«La tarea de investigación», siempre, a menos que el usuario ya haya nombrado el alcance completo — entonces escríbela en la secciónproject.scope; - pasos que el usuario nombró explícitamente, agregados con
task.addy redactados según «Qué es una tarea». Un paso que no puede expresarse como una acción es una pregunta para la investigación, no una tarea.
Nunca inventes pasos que el usuario no haya nombrado.
- la tarea de investigación según
-
Informa la ruta de la carpeta, id, título,
short(ofreciendo cambiarlo), fecha límite, objetivo, la línea de valor, el nombre del proyecto en el backend y las tareas creadas.
Si la entrada describe una responsabilidad continua sin fin, esto no es un proyecto — dilo y ofrece /areas create en su lugar. Si es una idea que el usuario no ha decidido asumir, di que aún no es un proyecto (tasks.md «Emparejamiento») y ofrece dejarla en la bandeja de entrada (inbox.name).
task <proyecto> <tarea> — agregar una tarea
- Encuentra el proyecto según
find-target.md, operación «Agregar una tarea a un proyecto». El destino también puede ser un proyecto de área deAREA_TASK_PROJECTSenareas.md— verifica por nombre. - Resuelve dónde va: un proyecto de área →
area; de lo contrario, eltasks_refdel resumen →project_ref(bajopairing: nonela carpeta del proyecto es elrefy este paso es solo el proyecto).pairing: separatey sintasks_refen el resumen → di la cadenatask.unpairedy ofrece crearlo (paso 7 decreate). Si acepta, crea el par, luego continúa. Nunca escribas la tarea en la bóveda en su lugar.
- Redacta la tarea según
tasks.md«Qué es una tarea». Si la redacción del usuario ya encaja, mantenla; de lo contrario, propón la versión reformulada en el anuncio. Si no puede ser una acción, pregunta por el siguiente paso (Nivel 1.5). task.addconproject_refoarea(bajoTASKS = filesun nombre base tomado es una colisión:note-format.md«Colisiones de nombres», pregunta, sin sufijo silencioso): el texto, una descripción para cualquier cosa más larga,durationsolo si se da. La regla de fecha estasks.md«Campos».- Informa la tarea y el proyecto.
overview <proyecto> — dónde está el proyecto
Solo lectura. No escribe nada — ni en la bóveda, ni en el backend. Si el resumen saca a la luz algo que vale la pena arreglar, dilo y deja que el usuario decida.
-
Encuentra el proyecto según
find-target.md, operación "Informar sobre". Sin argumento, lista los proyectos y pregunta. -
Lee la nota de resumen: frontmatter y las secciones
project.goal,project.value,project.expected_result,project.dod,common.links. Un campo en blanco se informa como en blanco, nunca se rellena por inferencia. -
Lee las tareas (
task.list, abiertas): sus fechas y duraciones. Calcula los recuentos segúnthresholds.md«Recuentos de tareas». Bajopairing: separate, sin par → salta, y di la cadenatask.unpaired. -
Lee
Notes/(yResults/, si tiene algo) por completo, hasta el límite enthresholds.md— aquí es donde realmente viven las decisiones y los riesgos. -
Legado. Si el resumen lleva
status/priority/value/estimate, o la carpeta tiene unTasks/heredado (note-format.md), agrega una línea, la cadenaoverview.legacycon{fields}comostatus, Tasks/ (3 files)(el recuento de carpetas es la cadenaoverview.legacy_tasks), nombrando solo lo que está presente. No leas notas de tareas para obtener progreso; la migración decide qué sobrevive. -
Señales — informa solo aquellas que se activen:
- la
deadlinedel proyecto pasada, o dentro del horizonte enthresholds.md; - tareas vencidas — di por cuántos días;
- nada programado mientras la fecha límite está dentro del horizonte;
- tareas con fecha pero sin duración;
- inactividad mayor que el umbral del proyecto en
thresholds.md, medido como indica (project.activitycuando está emparejado, mtime en caso contrario, segúnthresholds.md); - wikilinks rotos en la sección
common.links; - cada criterio de aceptación marcado mientras el proyecto sigue en
Projects/— terminado y no cerrado.
- la
-
Renderiza al chat, en
LANG. Las etiquetas son cadenas delang/<LANG>.md, nombradas en la plantilla a continuación por clave entre llaves; mostradas aquí con las cadenas en inglés:## PROJ-0001 · Proyecto A **{overview.area}** Área A · **{overview.deadline}** 2026-10-31 — 14 días **{overview.tasks}** {count.scheduled} 3 · {count.overdue} 1 · {count.backlog} 6 **{overview.acceptance}** ☑☐☐ 1/3 ### {overview.essence} <El objetivo, 1–2 frases.> <El resultado esperado — una línea.> <El valor — una línea.> ### {overview.scheduled} - **Escribir un correo al proveedor** — Mar 21-10, 30 min - **Rellenar el formulario** — vencido hace 2 días, 1 h ### {overview.backlog} - Pedir cita - …y 3 más ### {overview.digest} - <Una decisión o conclusión clave de Notes/ — en tus propias palabras.> ### {overview.signals} - Fecha límite en 14 días, nada programadoLas llaves son claves, no texto literal: imprime la cadena que representa cada clave. Las fechas usan el formato
common.date(2026-10-31;10-31en la forma cortacommon.date_short, usada con un día de la semana decommon.weekdaysen una línea de tarea); los días hasta la fecha límite se indican concommon.days; las abreviaturas de unidades soncommon.unit.*; una tarea vencida lleva la cadenatask.overdue_by; la cola del backlog es la cadenaoverview.backlog_more({n}= tareas no mostradas). La secciónoverview.backlogmuestra las tareas más antiguas sin fecha hasta el límite enthresholds.md. Elimina cualquier sección o campo que quedaría vacío. UnResults/vacío es un estado normal.
list — los proyectos
Solo lectura. Una línea por proyecto — el índice, no un resumen: nunca abre Notes/.
-
Enumera las carpetas directamente bajo
Projects/. Los proyectos archivados no se listan — eso es/archive list. -
Lee el frontmatter del resumen:
id,title,area,deadline, y bajopairing: separatetasks_ref. Una carpeta sin frontmatter es preconvención — imprímela por nombre de carpeta con la cadenacommon.no_metadata. -
Lee las tareas de cada proyecto que tenga un
ref(task.listconproject_ref, abiertas), contadas segúnthresholds.md«Recuentos de tareas». -
Ordena según
thresholds.md«Orden de proyectos». -
Renderiza, en
LANG, con las cadenaslist.*,count.*ytask.unpaired— la línea es ajustada, así que el recuento del backlog escount.backlog_short(encabezadolist.header, fecha límitelist.untilcon la fecha encommon.date_shorty, dentro del horizonte dethresholds.md,(14 d)después: los días restantes ycommon.unit.day); mostrada aquí con las cadenas en inglés:**Proyectos (4)** 1. PROJ-0008 Proyecto A — Área A · hasta 10-31 (14 d) · programadas 2 · backlog 3 2. PROJ-0020 Proyecto B — hasta 10-31 (14 d) · programadas 0 · backlog 3 3. PROJ-0009 Proyecto C — Área B · hasta 02-28 · sin par en el gestor de tareas · formato antiguo 4. PROJ-0027 Proyecto D — backlog vacío Sin par en la bóveda: «Proyecto E»- Una fecha límite pasada: la cadena
list.deadline_passed. - La cadena
list.legacycuando hay campos heredados, o unTasks/heredado. - Un proyecto cuyo backlog está vacío: la cadena
list.backlog_empty. - La última línea (
list.orphans) nombra proyectos del backend a los que ningún resumen apunta, encontrados comotasks.md«Notas sobre la tabla»,project.list, dice. Elimínala cuando esté vacía o cuando el adaptador no soporteproject.list. - Elimina cualquier campo en blanco en lugar de imprimir un marcador de posición. Un
Projects/vacío es una respuesta válida: dilo sin más.
- Una fecha límite pasada: la cadena
Proyectos archivados y preconvención
Los proyectos en Archive/ pueden ser anteriores a las convenciones: sin frontmatter, sin prefijo PROJ-xxxx, sin subcarpetas. Lee la sección project.goal de la nota, omite la sección de tareas y overview.acceptance, y declara claramente que está archivado y en el formato antiguo.
Notas
- Calcula, no estimes: los recuentos de días, recuentos de tareas y plazos vencidos provienen del backend, los archivos y la fecha del sistema de hoy. Si algo no se puede calcular porque un campo está en blanco, di que está en blanco en lugar de adivinar.
- Un resumen informa sobre el estado; no juzga al usuario. "Vencido hace 5 días", no "abandonaste el proyecto".
- Todo en
LANG, tareas incluidas.