¿Qué hace swapit — Inventario de tóxicos domésticos + motor de intercambio?
Qué es esta habilidad
swapit convierte una preocupación vaga ("probablemente hay mucho plástico y BPA en mi casa") en un plan concreto, priorizado y rastreable. Es con estado: tu inventario del hogar vive en el disco y persiste entre sesiones. Es local primero: cero servicios de pago, nada sale de tu dispositivo a menos que optes explícitamente por el (M3) común.
Un pase produce:
- Un inventario de los artículos que posees, cada uno etiquetado con su clase de artículo genérica.
- Una puntuación de riesgo por artículo que refleja la exposición real — una sartén antiadherente rayada usada a diario a alta temperatura tiene una puntuación mucho más alta que un contenedor de plástico sin abrir en el garaje.
- Una lista ordenada de "intercambiar primero" — el 5% de cambios que reducen la mayor exposición.
- Seguimiento de intercambios — alternativa elegida, estado de abastecimiento, lista de verificación, marcadores.
- Un informe HTML compartible (y, en M2, un panel en vivo con
swapit serve).
Los tres ámbitos (y la invariante de privacidad)
| Ámbito | Qué contiene | Compartir |
|---|---|---|
| 1 · Conocimiento | peligros → clases de artículo → alternativas (hechos genéricos, citados) | compartible; almacenado en caché + (M3) sincronizado con el común |
| 2 · Inventario | tus artículos, habitaciones, cantidades, marcas, fotos, intercambios, marcadores | PRIVADO — nunca sale del dispositivo |
| 3 · Común (M3) | contribuciones anónimas que enriquecen el grafo de conocimiento compartido | opt-in, revisado, solo hechos genéricos |
Invariante de privacidad (vinculante): El inventario del Ámbito 2 (artículos, habitaciones, cantidades, marcas, fotos, información de compra, ubicación) nunca cruza el límite de sincronización. Solo los hechos genéricos del Ámbito 1 son compartibles, mediante opt-in explícito + un
swapit sync --dry-runrevisable. Aplicado por un serializador de listas permitidas (scripts/anonymize.py) en el cliente y un cortafuegos en el servidor común, más pruebas difusas que afirman que cada artículo real del inventario es rechazado por la puerta. Lista de campos prohibidos:anonymize.CONTRIBUTION_FORBIDDEN(el subconjunto estructural del inventario destate.PRIVATE_FIELDS).
Modelo de datos
El estado reside en ~/.config/swapit/ (se puede anular con $SWAPIT_HOME; respeta $XDG_CONFIG_HOME).
~/.config/swapit/
├── knowledge/ hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/ events.jsonl(registro de solo añadido) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl (M3)
├── sync/ config.json · sync-log.jsonl (M3)
└── photos/
Esquemas de nodo (consulta seed/*.jsonl para el conjunto de datos completo y citado):
- peligro —
id · nombre · alias · clase · mecanismo · rutas de exposición · regulatorio · gravedad(0-3) · fuerza de evidencia · fuentes - clase_de_artículo —
id · nombre · categoría · descripción · peligros[]{hazard_id, probabilidad_de_presencia, fundamento} · pistas_de_detección · fuentes - alternativa —
id · nombre · reemplaza[] · material · fundamento · compensaciones · advertencias · evita_peligros · preocupaciones_residuales · fuentes - opción_de_abastecimiento (dónde comprar, público) —
id · alternativa · clase_de_artículo · minorista · región(ISO-3166-1 a2) · área · url · precio_mín · precio_máx · moneda · a_fecha_de · disponibilidad · confianza · número_de_corroboraciones - artículo (privado) —
id · nombre · clase_de_artículo · habitación · cantidad · marca · estado · uso{frecuencia, contacto_alimentos, calor, contacto_infantil} · estado · notas · fotos - intercambio (privado) —
id · id_artículo · alternativa_elegida · abastecimiento{estado, costo, proveedor} · lista_de_verificación[] · marcadores[]
Modelo de riesgo
riesgo = gravedad × probabilidad_de_presencia × evidencia × relevancia_de_exposición × frecuencia × estado
- relevancia_de_exposición activa la ruta de un peligro según cómo se usa el artículo (contacto con alimentos + calor maximiza un peligro de ingestión/contacto con alimentos-calor; el contacto dérmico importa para el cuidado personal; la inhalación para limpieza/muebles; el contacto infantil lo amplifica).
- Puntuación del artículo = suma escalada del riesgo por peligro → banda alta / media / baja.
- Esta es la inteligencia de priorización — el análogo del "modo de fallo dominante" del
procurer: arregla los pocos artículos que impulsan la mayor exposición primero, no una lista de culpa de todo lo que es plástico.
Modos
| Modo | Qué hace |
|---|---|
init | crear estado + cargar el grafo de conocimiento semilla |
add | añadir un artículo del hogar (nombre, clase, habitación, estado, uso) → imprime su evaluación |
assess | evaluar un artículo o una clase de artículo ad hoc → peligros + riesgo + alternativas ordenadas |
list | listar inventario, filtrar por --habitación/--banda/--estado/--clase/--peligro, ordenar por riesgo |
swap | crear/actualizar un plan de intercambio: elegir alternativa, establecer estado, lista de verificación, marcador, costo |
score | resumen de exposición del hogar + la clasificación de intercambiar primero |
report | generar el informe HTML autocontenido (Categoría-C) |
procure | informe de traspaso al procurer + ofertas conocidas de dónde comprar para el objetivo de intercambio (filtrar por --región); registrar una oferta encontrada (--minorista/--url/--precio-*) al común público |
knowledge | navegar/buscar el grafo de conocimiento (list/search/show) |
rooms | listar/añadir habitaciones |
selfheal | validar bordes de conocimiento + referencias del inventario + fundamentación; salir con código no cero en errores |
serve | panel en vivo local en http://127.0.0.1:8731 — tablero kanban, lista de verificación, marcadores, estado; cada clic escribe de vuelta al estado |
contribute | poner en cola un hecho anónimo — producto / peligro (clase-de-artículo→peligro) / alternativa / abastecimiento (oferta pública de dónde comprar) / clase_de_artículo (nuevo nodo de taxonomía); aplicado localmente + filtrado para el común |
sync | enviar la cola de contribuciones + obtener conocimiento de la comunidad (opt-in); --dry-run previsualiza exactamente lo que se enviaría; --configure establece el punto final |
Flujo típico
swapit init
swapit add --nombre "Sartén Teflon vieja" --clase utensilios-de-cocina-antiadherentes --habitación cocina \
--estado rayada --frecuencia diaria --contacto-alimentos --calor
swapit score # qué intercambiar primero
swapit swap itm_xxxx --a sartén-de-hierro-fundido --estado abastecimiento --añadir-tarea "comprar sartén de 10 pulgadas"
swapit procure itm_xxxx # -> pasar el informe a la habilidad `procurer`
swapit report --abrir # HTML compartible
Combinación con otras habilidades
procurer—swapit procure <artículo>construye la necesidad ("reemplazar 3 botellas de policarbonato con vidrio/acero") y el aviso listo paraprocurer;procurerdevuelve fuentes citadas + un presupuesto.bookkeeping(P6) — un hallazgo nuevo y duradero de peligro/producto (por ejemplo, una clase de artículo recién caracterizada) se archiva proactivamente enresearch/entities/y luego puede fluir al común.health— contexto de exposición personal.content-creation— publicaciones educativas desde el grafo.
Disciplina de fundamentación
El conocimiento semilla cita solo organismos autorizados (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Cada registro lleva ≥1 fuente; verified: false marca estos como de referencia (no recién obtenidos) — ejecuta un pase con fuentes (o el común) para actualizar. selfheal falla si algún nodo pierde su cita. Esto es orientación al consumidor fundamentada en la ciencia de la salud pública, no consejo médico o legal.
Recursos
scripts/swapit.py— punto de entrada CLI + manejadores de comandosscripts/state.py— capa de estado de dos ámbitos (PRIVATE_FIELDSdefine el límite de sincronización)scripts/ops.py— la ruta de escritura de mutación de estado única (compartida por CLI + panel)scripts/knowledge.py— carga del grafo de conocimiento + resolución de bordesscripts/risk.py— motor de puntuación de riesgo de exposiciónscripts/report.py— generador de informe HTML autocontenido (Categoría-C)scripts/server.py— panel en vivoswapit serve(http.server de la stdlib, solo localhost)scripts/anonymize.py— la puerta de privacidad: constructores de hechos de listas permitidas + el escaneo de campos prohibidosscripts/sync.py— cliente de sincronización con el común (cola, vista previa--dry-run, envío/recepción, fusión)scripts/selfheal.py— validador de integridadtemplates/dashboard.html— el panel en vivo (CSS/JS en línea, Categoría-C)commons/— el servidor de referencia del común en red (FastAPI + SQLite; despliegue restringido)seed/{hazards,item-classes,alternatives}.jsonl— conocimiento inicial fundamentadotests/— pruebas de riesgo, conocimiento, auto-reparación, CLI, privacidad/anonimización, sincronización, informe y servidor
Colaboración (el común)
Las contribuciones son solo hechos genéricos — swapit contribute product|hazard|alternative|procurement|item-class construye un hecho anónimo (una asignación pública producto→clase de artículo, una corrección de borde de peligro, una alternativa, una oferta de dónde comprar, o un nuevo nodo de taxonomía), lo aplica localmente y lo pone en cola. swapit sync --dry-run muestra exactamente lo que se enviaría; swapit sync envía la cola y obtiene conocimiento de la comunidad (opt-in, después de --configure). Hechos idénticos de diferentes usuarios se corroboran (direccionados por contenido) en lugar de duplicarse; el común sirve un hecho solo cuando dos contribuyentes distintos lo corroboran (corroboration >= 2) — la moderación está filtrada por corroboración, no por confianza, porque confidence es suministrada por el llamante y un único remitente podría auto-aprobarse de otro modo. La invariante de privacidad se aplica en ambos lados (puerta anonymize del cliente + cortafuegos del servidor) — el inventario nunca cruza.
Común de dónde comprar (abastecimiento)
Un hecho procurement_option es una oferta pública: una alternativa más segura vendida por un minorista en una región (ISO-3166-1 alpha-2), con url, precio_mín/precio_máx + moneda + a_fecha_de, área y disponibilidad opcionales. Está direccionado por contenido en (alternativa, minorista, región) — la misma oferta se corrobora entre usuarios; una región diferente es un hecho diferente (el eje de escala geográfica). El precio/url/área son datos de mercado refinables: una corroboración con un a_fecha_de estrictamente más reciente actualiza el precio hacia adelante, sin retroceder datos más recientes. La costura de privacidad es nítida: la oferta pública usa minorista + precio_* y nunca el proveedor/costo privados (dónde compraste tú y qué pagaste tú se quedan en el Ámbito 2). swapit procure <artículo> --región <CC> muestra ofertas conocidas y registra nuevas que encuentres — creciendo un conjunto de datos abierto, detallado y geo-escalado que cualquiera puede usar.
Hoja de ruta
- M1 (enviado, 0.1.0) — modelo de datos, conocimiento semilla, CLI, motor de riesgo, informe HTML estático, auto-reparación.
- M2 (enviado, 0.2.0) —
swapit serve: panel en vivo local con lectura/escritura de vuelta al estado. - M3 (0.3.0) — colaboración anónima + común en red (
commons/, FastAPI + SQLite). Invariante de privacidad aplicada por serialización de listas permitidas + pruebas difusas tanto en cliente como en servidor. - M4 (esta versión, 0.4.0) — común de abastecimiento geo-escalado + crecimiento de taxonomía: los tipos de hecho
procurement_option(dónde comprar público, clave por(alternativa, minorista, región), actualización de precio solo hacia adelante) yitem_class(crecimiento de taxonomía filtrado por corroboración);procuremuestra + registra ofertas; ofertas semilla en EE.UU./CO/DE/GB; paridad de hash entre idiomas fijada por vectores anclados. El despliegue en vivo en la infraestructura de broomva.tech está restringido a una autorización explícita (credenciales/DNS); la habilidad es completamente funcional sin conexión sin él.