tane/docs/design/first-sprint.md
vjrj 1e2c66a982 docs: rename Tanemaki → Tane in design docs and notes
Product-name mentions → Tane; backup-file extension .tanemaki → .tane;
website tanemaki.app → tane.comunes.org. Etymology-bearing docs
(README, VISION, PLAN, CLAUDE, intros) handled separately.
2026-07-12 13:09:12 +02:00

4.9 KiB

Tane — Primer sprint (Fase 1: inventario)

Guía de arranque para desarrollar en Claude Code (en la máquina, donde Flutter corre y git funciona). Objetivo: un inventario usable, offline y cifrado. Nada de capa social todavía. Convenciones y decisiones en ../../CLAUDE.md y open-decisions.md.

Definición de "hecho" del sprint

Una persona puede: abrir la app, añadir una semilla en 20 s (etiqueta + foto + cantidad), verla en una lista por categorías, abrir su ficha, editarla con campos avanzados plegados, y que todo persista cifrado entre reinicios. Multilingüe (al menos ES/EN). Corre en un dispositivo/emulador real.

Cada historia se entrega con sus tests (unit/widget/integration) — casi-TDD, sin pruebas manuales como red de seguridad. Ver testing.md. Sin tests, la historia no está hecha.

Pasos

  1. Prerequisitos (máquina): Flutter SDK actualizado, un emulador o dispositivo. Quitar los locks del bare si hiciera falta (rm -f ~/repos/tane.git/*.lock).

  2. Scaffolding del workspace (pub workspaces):

    • pubspec.yaml raíz con workspace: listando packages/commons_core y apps/app_seeds.
    • packages/commons_core: paquete Dart puro (sin Flutter aún) — de momento casi vacío, solo la estructura y un TODO; no meter capa social todavía.
    • apps/app_seeds: flutter create con --org org.comunes --project-name tane (applicationId org.comunes.tane).
  3. Base de datos (Drift + SQLCipher):

    • Añadir drift, drift_flutter/sqlite3, y cifrado vía sqlcipher_flutter_libs.
    • Definir tablas de la Fase 1 desde data-model.md: Variety, Lot, Movement, Species, SpeciesCommonName, VarietyVernacularName, Attachment, ExternalLink, GerminationTest. Columnas comunes (UUIDv7, created_at, HLC updated_at, last_author, is_deleted, schema_row_version).
    • schemaVersion = 1. Exportar esquema a drift_schemas/drift_schema_v1.json. Dejar el andamio de migraciones step-by-step + test de migración.
    • Tipo Quantity compartido (kind + amount? + label); quantity_kind como enum estable (pod, cob, head, packet, handful, grams, count…), etiqueta localizada.
  4. Identidad y cifrado (mínimo para la Fase 1):

    • Generar una semilla raíz (compatible Duniter; curva a confirmar) al primer arranque; guardarla en el almacén del sistema. Todavía sin red.
    • Llave simétrica de la BD en el keystore; abrir la BD cifrada con ella. Nada en claro en disco.
    • (La derivación secp256k1/Nostr y el QR de recuperación pueden ser historias posteriores del sprint, pero deja el hueco en el diseño de identidad.)
  5. i18n: configurar flutter_localizations + intl (o slang). Ninguna cadena hardcodeada. Arrancar con ES y EN.

  6. UI del inventario (spec = mockups en ../mockups/):

    • Lista de inventario (06_inventory): ítems por categoría, con foto/inicial, buscar.
    • Alta rápida: etiqueta + foto (cámara) + cantidad cualitativa. 20 segundos. Resto plegado ("Añadir más…").
    • Ficha de ítem (07_inventory_item) con pestañas y edición (071): nombres (propio/vernáculos/científico opcional autocompletado del catálogo), lotes (año + unidad), notas, enlaces, adjuntos.
    • Progressive disclosure en todo: solo label obligatorio.
    • Accesibilidad: objetivos grandes, tipografía grande, icono + palabra.
  7. Catálogo de especies (semilla del bundle): empezar con un CSV/JSON pequeño curado (unas pocas hortícolas ibéricas) con scientific_name + wikidata_qid + gbif_key + nombres comunes ES/EN, para probar el autocompletado. La "varilla" y Kew SID vienen después.

  8. Tests y CI (transversal, no al final): ver testing.md. Como mínimo en este sprint: unit de commons_core (Quantity, columnas comunes, UUIDv7/HLC), test de migración Drift, test de "no hay texto en claro" en el fichero de BD, widget tests de la lista y del alta rápida, y un integration test del flujo "alta → persiste cifrada → reabrir → sigue ahí". Montar CI (analyze + test + cobertura) desde el primer commit de código.

  9. Verificación final: flutter analyze limpio, toda la suite en verde en emulador, cobertura publicada. Añadir el texto canónico de la licencia: curl -o LICENSE https://www.gnu.org/licenses/agpl-3.0.txt.

Fuera de alcance de este sprint (no hacer)

Ofertas, mensajería, relays, Nostr, red de confianza, Ğ1, sincronización entre dispositivos, backup completo (más allá de dejar el formato pensado), reconocimiento por foto. Todo eso es Bloque 2 / fases posteriores.

Orden sugerido de historias

1 → 2 → 4 → 5 (lista + alta rápida) → 3 (cifrado) → 5 (ficha/edición) → 6 (catálogo) → 7 (verificación). El cifrado (3) puede ir antes si se prefiere no reescribir la apertura de la BD después.