--- name: init_paper kind: pipeline lang: bash domain: pipelines version: "1.0.0" purity: impure signature: "init_paper(slug: string, [--title ] [--domain ] [--tags ]) -> void" description: "Scaffold de un paper académico reproducible en papers//. Calcula el siguiente número incremental escaneando papers/, crea las subcarpetas (experiments data figures reviews out), copia las plantillas paper.md (IMRaD) + preregistration.md (anti-HARKing) rellenando el frontmatter (title, slug, date de hoy, phase=question, status=draft) y crea references.md. NO hace git init: el paper arranca en fase interna local (papers/ gitignored). Grupo de capacidad papers." tags: [papers, scaffold, paper, pipeline, bash, launcher] uses_functions: - next_numbered_dir_bash_io - slugify_ascii_py_core uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: slug desc: "identificador legible del paper; se slugifica a ASCII (espacios/acentos se normalizan) y se prefija con el siguiente NNNN incremental" - name: "--title" desc: "título del paper (string); si se omite, usa el slug limpio. No debe contener el carácter '|'" - name: "--domain" desc: "dominio del paper escrito en el frontmatter (default datascience)" - name: "--tags" desc: "tags CSV que se escriben en el frontmatter de paper.md (opcional)" output: "sin salida directa; crea papers// con paper.md, preregistration.md, references.md y las subcarpetas experiments/ data/ figures/ reviews/ out/. Imprime el resumen y los pasos siguientes a stdout." tested: false tests: [] test_file_path: "" file_path: "bash/functions/pipelines/init_paper.sh" --- ## Ejemplo ```bash # Scaffold de un paper nuevo (numera 0001, 0002, ... automáticamente) fn run init_paper mi-primer-paper --title "Mi primer paper" fn run init_paper reactive-loop-calls --domain datascience --tags registry,telemetria # El slug se slugifica: "Áreas de Mejora" -> papers/0003-areas-de-mejora/ fn run init_paper "Áreas de Mejora" ``` ## Cuando usarla Cuando empiezas un paper académico nuevo dentro de `fn_registry` y necesitas el esqueleto del artefacto (`papers//`) con las plantillas IMRaD y de pre-registro listas para rellenar. Es el paso 1 del grupo de capacidad `papers` (ver `docs/capabilities/papers.md`), antes de la revisión de literatura y del pre-registro de la hipótesis. ## Flujo 1. Parsea `` (posicional) + flags `--title` / `--domain` / `--tags`. Falla con exit ≠ 0 si falta el slug. 2. `slugify_ascii` — normaliza el slug a ASCII lowercase sin diacríticos (reutiliza la función del registry, solo stdlib). 3. `next_numbered_dir papers/` — calcula el siguiente NNNN de 4 dígitos sin colisión. 4. Crea `papers//` con las subcarpetas `experiments/ data/ figures/ reviews/ out/`. 5. Copia `docs/templates/paper.md` + `docs/templates/preregistration.md` y rellena el frontmatter por clave de línea (title, slug, date de hoy, domain, tags; phase=question y status=draft vienen de la plantilla). 6. Crea `references.md` vacío. ## Gotchas - **NO hace `git init`.** El paper arranca en fase interna local; `papers/` está gitignored en el repo padre (solo `papers/.gitkeep` se versiona). Promocionar a sub-repo Gitea (fase publishable) es manual. - **El `--title` no debe contener el carácter `|`** (se usa como delimitador de sed al rellenar el frontmatter; los `&` y `\` sí se escapan). - **No indexa el paper en `registry.db`** — los artefactos `papers//` no se indexan en esta fase (KISS); sí se indexa este pipeline. - Requiere `python3` (del venv del registry o del sistema) para slugificar; `slugify_ascii` solo usa stdlib, así que el venv no es obligatorio. - Idempotencia: si el directorio destino ya existiera, aborta con exit ≠ 0 en vez de sobrescribir. ## Notas Cada paper es un artefacto independiente (mismo patrón que `apps/` y `analysis/`, pero para investigación). El pipeline usa `set -euo pipefail`: cualquier fallo detiene la ejecución. Parte del grupo de capacidad `papers` — diseño completo en `reports/0001-2026-06-30-papers-system-design.md`.