From e4ccffe1680c97942d6b1e1569a18ecc445db6d3 Mon Sep 17 00:00:00 2001 From: vjrj Date: Tue, 7 Jul 2026 11:06:38 +0200 Subject: [PATCH] Fix naming (Seedks->Tanemaki) in PLAN; reconcile data-model with core/domain boundary (Plantare->Pledge, Movement->LedgerEntry notes); fix quantity_label type nit; note social layer as one indivisible block in VISION; add seedks.ttf asset --- PLAN.md | 6 +++--- VISION.md | 2 +- docs/design/data-model.md | 8 +++++++- docs/design/g1-integration.md | 6 +++--- seedks.ttf | Bin 0 -> 11016 bytes 5 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 seedks.ttf diff --git a/PLAN.md b/PLAN.md index 140e424..8a44180 100644 --- a/PLAN.md +++ b/PLAN.md @@ -1,4 +1,4 @@ -# Seedks — Plan de análisis y desarrollo +# Tanemaki — Plan de análisis y desarrollo *App descentralizada para la gestión personal y la compartición de semillas y plantel* @@ -9,7 +9,7 @@ Licencia sugerida del documento y del proyecto: copyleft (ver §7) ## 0. Resumen ejecutivo -Seedks es una app **local-first, multilingüe y descentralizada** para que personas y colectivos gestionen su banco de semillas y plantel, decidan qué ofrecen, y lo compartan localmente sin un intermediario central. La motivación es política además de práctica: contrarrestar el monopolio de las semillas privativas y sostener las variedades tradicionales, en la línea de [Plantare](http://plantare.ourproject.org/) y del relato "Las semillas del conocimiento libre" que ya escribiste en *Diagonal* (2005). +Tanemaki es una app **local-first, multilingüe y descentralizada** para que personas y colectivos gestionen su banco de semillas y plantel, decidan qué ofrecen, y lo compartan localmente sin un intermediario central. La motivación es política además de práctica: contrarrestar el monopolio de las semillas privativas y sostener las variedades tradicionales, en la línea de [Plantare](http://plantare.ourproject.org/) y del relato "Las semillas del conocimiento libre" que ya escribiste en *Diagonal* (2005). La decisión de partida acordada: @@ -281,7 +281,7 @@ El mayor riesgo de este proyecto no es técnico, es de *continuidad*. Los proyec - **Descartar** el intento en Meteor (`meteor-old`, `seedks/`): Meteor es cliente-servidor centralizado, justo lo contrario de local-first, y el ecosistema está en declive. No arrastres esa base. - **Conservar y tratar como oro** los **mockups** (`docs/mockups/`) — como tú mismo dices, es lo valioso. Ya definen: inicio, menús, búsqueda con tarjetas y precio/trueque, inventario por categorías con miembros del banco, ítem con historial/docs/comentarios, perfil público con mapa y valoraciones, chat. Son un *product spec* casi completo de las capas 1–3. - **Conservar** los iconos SVG propios (`docs/icons.svg`, la fuente `seedks.ttf`) y el logo — identidad visual ya hecha. -- El nombre **"seedks"** ya lo elegiste (frente a seedbank, seeks, etc.). Mantenerlo. +- El nombre **Tanemaki** (apodo **Tane**) ya está decidido — ver §5-ter para el razonamiento y las alternativas descartadas. El antiguo nombre de trabajo "seedks" queda solo como nombre heredado de algún asset (p.ej. la fuente `seedks.ttf`), no como nombre del proyecto. **Nota operativa sobre esta carpeta:** está sincronizada con Seafile. Para el desarrollo con git, tu idea de un *bare repo* en `~/repos` es la correcta: evita meter un `.git` dentro de una carpeta sincronizada por Seafile (conflictos entre los dos sistemas de sincronización). Trabaja el código en un clon fuera de Seafile, con el bare repo como origen. Puedo ayudarte a montarlo. diff --git a/VISION.md b/VISION.md index 1d94ad9..6bd8ec1 100644 --- a/VISION.md +++ b/VISION.md @@ -73,7 +73,7 @@ Bajo Tanemaki hay un motor común (`commons_core`) que resuelve lo difícil: ide ## Estado y camino -En diseño temprano. El orden previsto: primero un **inventario usable** (útil desde el día uno, aunque no exista aún la parte de compartir); luego la **oferta y el Plantare digital**; después, como investigación, la **compartición local descentralizada**; y por último la **red de confianza**. Cada fase deja algo que ya merece la pena usar. +En diseño temprano. El orden previsto: primero un **inventario usable** (útil desde el día uno, aunque no exista aún la parte de compartir); luego la **oferta y el Plantare digital**; después, como investigación, la **compartición local descentralizada**; y por último la **red de confianza**. Cada fase deja algo que ya merece la pena usar. Con un matiz importante que se ve mejor abajo: mientras el **inventario** es un hito entregable en solitario, la **capa social** (ofertas + mensajería + relays + confianza) es un **salto grande e indivisible**, no un incremento pequeño — conviene leer las dos como los dos bloques reales del proyecto. ## Cómo participar diff --git a/docs/design/data-model.md b/docs/design/data-model.md index 9a93442..c729932 100644 --- a/docs/design/data-model.md +++ b/docs/design/data-model.md @@ -4,6 +4,8 @@ > Status: draft for discussion. Nothing here is frozen; it is the starting point for the first Drift schema (`schemaVersion = 1`). +> **Core/domain split.** This model is presented *flat* for readability. Which of these tables live in the generic engine (`commons_core`) vs. the seeds domain (`app_seeds`) is decided in [core-domain-boundary.md](core-domain-boundary.md). In short: `Variety`, `Lot`, `Movement`, `Species` and the seed-specific fields are **domain**; `Offer`, `Party`, `SeedBank`→`Group`, trust, identity and the signed-return promise are **core**. Two entities below are the seeds view of a generalized core concept — see the notes on `Movement` (§2.4) and `Plantare` (§2.7). + ## 0. Design constraints (why the model looks like this) - **Local-first & offline.** The whole model lives in local SQLite. No server is required. Online only enriches. @@ -86,11 +88,13 @@ Quantity is deliberately *rough and human*, not precise. But the informal vocabu - **Plant-form natural units:** a **cob** (mazorca, maize), a **flower head** (cabezuela, sunflower), a **pod** (vaina, legumes), an **ear/spike** (espiga, cereals), a **fruit's worth** (tomato, pepper, squash), a **bulb**, a **tuber**, a **seed head**, a **bunch**. - **Precise (optional):** grams or seed count (`quantity_precise` + `quantity_unit`). -Modelling: store `quantity_kind` (a stable enum key like `pod`, `cob`, `head`, `packet`, `handful`, `grams`, `count`) + an optional numeric `quantity_label`/`quantity_precise`. The **display label is localized** from the key, so "pod"→"vaina"/"beina"… Units are *labels for a rough amount*, generally **not convertible** between each other or to grams — and that's fine. Suggestion logic (e.g. Poaceae → ear/cob, Fabaceae → pod, Helianthus → flower head) lives in the catalog mapping, not hardcoded, so it stays extensible and translatable. **To think through further:** the full starter list per family, and whether users can add their own unit keys (probably yes, as free `quantity_label` text when no key fits). +Modelling: store `quantity_kind` (a stable enum key like `pod`, `cob`, `head`, `packet`, `handful`, `grams`, `count`) + an optional numeric `quantity_precise` (and a free-text `quantity_label` for a rough amount when no key fits). The **display label is localized** from the key, so "pod"→"vaina"/"beina"… Units are *labels for a rough amount*, generally **not convertible** between each other or to grams — and that's fine. Suggestion logic (e.g. Poaceae → ear/cob, Fabaceae → pod, Helianthus → flower head) lives in the catalog mapping, not hardcoded, so it stays extensible and translatable. **To think through further:** the full starter list per family, and whether users can add their own unit keys (probably yes, as free `quantity_label` text when no key fits). ### 2.4 `Movement` — the append-only event log Immutable events on a `Lot`. Entries/exits are just types. This *is* the history tab and the provenance chain. +> The append-only *mechanic* is the generic `LedgerEntry` of `commons_core` (see [core-domain-boundary.md](core-domain-boundary.md) §2, §4.3); `Movement` is its seeds-domain shape. At v0 it lives whole in `app_seeds` (per that doc's §8 conservative start); it may be split later. + | Column | Type | Notes | |---|---|---| | `id` | UUID | | @@ -119,6 +123,8 @@ Immutable events on a `Lot`. Entries/exits are just types. This *is* the history ### 2.7 `Plantare` — the signed seed-IOU (§5-bis) The digital version of the paper Plantare. Bilateral, signed, held by both parties. +> `Plantare` is the seeds-domain name for the generic `Pledge` (return promise) of `commons_core` — see [core-domain-boundary.md](core-domain-boundary.md) §2, §5. The generalization uses `Pledge.return_kind = similar` for seeds (return *something alike*) vs. `same_item` for a lent tool. The columns below map onto that core entity. + | Column | Type | Notes | |---|---|---| | `id` | UUID | | diff --git a/docs/design/g1-integration.md b/docs/design/g1-integration.md index 07f70b4..9d92826 100644 --- a/docs/design/g1-integration.md +++ b/docs/design/g1-integration.md @@ -78,11 +78,11 @@ Empezar por los niveles **1 y 2** (precio en Ğ1 + enlace a la cartera): casi gr - **WoT propia pero compatible con Duniter** (no dependiente, no independiente-desde-cero): mismo primitivo de identidad + mismo modelo de certificación + import unidireccional de la WoT de Ğ1. - **Una sola clave para todo**, tipo Duniter-v2/Substrate (perfil, ofertas, mensajes, certificaciones, Ğ1). Sin claves por función. Clave seudónima distinta = solo opción avanzada para publicar algo sensible. -**Consecuencia honesta (a mirar):** una sola clave Duniter/Substrate **debilita el encaje de Nostr** como transporte — la identidad de Nostr *es* su clave secp256k1, y no es la nuestra. O bien Nostr queda como transporte "tonto" con nuestro propio sobre firmado (perdiendo el ecosistema NIP), o bien conviene **apoyar ofertas/mensajería en el ecosistema Duniter** (datapods/indexadores firmados con la misma clave) o en un transporte **agnóstico a la clave**. Se replantea en la ronda social (no bloquea la Fase 1). → [open-decisions.md](open-decisions.md) D7. +**Resuelto — "una sola clave" *y* Nostr, vía derivación:** los datapods de Duniter **no están en servicio**, así que para el transporte (Nostr) sí necesitamos una clave **secp256k1**. La solución que mantiene "una sola identidad": la secp256k1 se **deriva determinísticamente** de la semilla raíz Ğ1 (como las carteras multi-cadena derivan claves de varias curvas de una misma mnemónica; precedente: Cesium deriva sus claves de cifrado de la de firma). El usuario respalda **una sola cosa** (el QR de la semilla Ğ1); la secp256k1 se regenera cuando hace falta. Así **Nostr vuelve a ser transporte viable** (NIP-99/17/85) sin gestionar dos claves ni depender de infraestructura muerta. La derivación es **unidireccional**: desde la secp256k1 pública no se puede llegar a la identidad Ğ1 (aunque el uso simultáneo podría correlacionarse — para eso queda la clave seudónima aparte del peor caso). ## A decidir (pendiente) -- **Transporte de la capa social** dado "una sola clave Duniter": ¿datapod/indexador estilo Duniter, transporte agnóstico, o Nostr como mero relay? (Revisar; sustituye la inclinación previa "Nostr primero".) +- **Transporte de la capa social:** Nostr vuelve a ser viable (secp256k1 **derivada** de la semilla Ğ1). Confirmar Nostr para ofertas/mensajería/WoT y su madurez. (Datapods de Duniter descartados: no están en servicio.) +- Ruta/dominio de derivación de la secp256k1 desde la semilla raíz (que sea estándar y unidireccional). - ¿Nivel 3 (import de la WoT de Ğ1) entra en la primera ronda de la capa social o en una posterior? -- ¿`sr25519` o `ed25519` (lo que use Duniter v2) para la clave única? - Formato de certificación propio, mapeable al modelo Duniter. diff --git a/seedks.ttf b/seedks.ttf new file mode 100644 index 0000000000000000000000000000000000000000..47a1bb3c0271203ea8805b5839ab01e8616f5bed GIT binary patch literal 11016 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 literal 0 HcmV?d00001