# 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`](../../CLAUDE.md) y [`open-decisions.md`](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`](testing.md). Sin tests, la historia no está hecha.

## Pasos

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

1. **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`).

2. **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`](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.

3. **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.)

4. **i18n:** configurar `flutter_localizations` + `intl` (o `slang`). **Ninguna cadena hardcodeada.** Arrancar con ES y EN.

5. **UI del inventario** (spec = mockups en [`../mockups/`](../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.

6. **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.

7. **Tests y CI (transversal, no al final):** ver [`testing.md`](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.
8. **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.
