tane/docs/design/first-sprint.md

4.2 KiB

Tanemaki — 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.

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. Verificación: flutter analyze limpio, flutter test (incl. test de migración), y arrancar en dispositivo. 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.