O que swapit — Inventário de tóxicos domésticos + mecanismo de troca faz?
O que esta skill faz
swapit transforma uma preocupação vaga ("provavelmente tem muito plástico e BPA na minha casa") em um plano concreto, priorizado e rastreável. Ela é stateful: seu inventário doméstico vive no disco e persiste entre sessões. É local-first: zero serviços pagos, nada sai do seu dispositivo a menos que você opte explicitamente pelo commons (M3).
Uma passada produz:
- Um inventário dos itens que você possui, cada um etiquetado com sua classe de item genérica.
- Uma pontuação de risco por item que reflete a exposição real — uma frigideira antiaderente arranhada usada diariamente em alta temperatura tem classificação muito maior do que um pote de plástico lacrado na garagem.
- Uma lista ranqueada de "troque primeiro" — os 5% de mudanças que cortam a maior parte da exposição.
- Rastreamento de troca — alternativa escolhida, status de obtenção, lista de verificação, marcadores.
- Um relatório HTML compartilhável (e, no M2, um painel ao vivo em
swapit serve).
Os três reinos (e a invariante de privacidade)
| Reino | O que contém | Compartilhamento |
|---|---|---|
| 1 · Conhecimento | perigos → classes de itens → alternativas (fatos genéricos citados) | compartilhável; em cache + (M3) sincronizado com o commons |
| 2 · Inventário | seus itens, cômodos, quantidades, marcas, fotos, trocas, marcadores | PRIVADO — nunca sai do dispositivo |
| 3 · Commons (M3) | contribuições anônimas enriquecendo o grafo de conhecimento compartilhado | opt-in, revisado, apenas fatos genéricos |
Invariante de privacidade (vinculante): O inventário do Reino 2 (itens, cômodos, quantidades, marcas, fotos, informações de compra, localização) nunca cruza o limite de sincronização. Apenas fatos genéricos do Reino 1 são compartilháveis, mediante opt-in explícito + um
swapit sync --dry-runrevisável. Imposto por um serializador de allowlist (scripts/anonymize.py) no cliente e uma barreira de segurança no servidor commons, além de testes difusos que garantem que qualquer item de inventário real é rejeitado pela porta. Lista de campos proibidos:anonymize.CONTRIBUTION_FORBIDDEN(o subconjunto estrutural do inventário destate.PRIVATE_FIELDS).
Modelo de dados
O estado reside em ~/.config/swapit/ (substitua com $SWAPIT_HOME; respeita $XDG_CONFIG_HOME).
~/.config/swapit/
├── knowledge/ hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/ events.jsonl(append-only audit) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl (M3)
├── sync/ config.json · sync-log.jsonl (M3)
└── photos/
Esquemas de nós (veja seed/*.jsonl para o conjunto de dados completo e citado):
- perigo —
id · nome · sinônimos · classe · mecanismo · rotas de exposição · regulatório · gravidade(0-3) · força da evidência · fontes - classe_de_item —
id · nome · categoria · descrição · perigos[]{id_perigo, probabilidade_de_presença, justificativa} · dicas_de_detecção · fontes - alternativa —
id · nome · substitui[] · material · justificativa · compensações · ressalvas · evita_perigos · preocupações_residuais · fontes - opção_de_obtenção (onde-comprar, público) —
id · alternativa · classe_de_item · varejista · região(ISO-3166-1 a2) · área · url · preço_mín · preço_máx · moeda · data_de · disponibilidade · confiança · número_de_corroborações - item (privado) —
id · nome · classe_de_item · cômodo · quantidade · marca · condição · uso{frequência, contato_com_alimentos, calor, contato_com_crianças} · status · notas · fotos - troca (privado) —
id · id_item · alternativa_escolhida · obtenção{status, custo, fornecedor} · lista_de_verificação[] · marcadores[]
Modelo de risco
risco = gravidade × probabilidade_de_presença × evidência × relevância_da_exposição × frequência × condição
- relevância_da_exposição ativa a rota de um perigo contra como o item é usado (contato com alimentos + calor maximiza um perigo de ingestão/contato com alimentos/calor; dérmico importa para cuidados pessoais; inalação para limpeza/móveis; contato com crianças amplifica).
- Pontuação do item = soma escalada do risco por perigo → faixa alto / médio / baixo.
- Esta é a inteligência de priorização — o análogo do "modo de falha dominante" do
procurer: corrija os poucos itens que causam a maior parte da exposição primeiro, não uma lista de culpa de tudo que é plástico.
Modos
| Modo | O que faz |
|---|---|
init | criar estado + carregar o grafo de conhecimento inicial |
add | adicionar um item doméstico (nome, classe, cômodo, condição, uso) → imprime sua avaliação |
assess | avaliar um item ou uma classe de item ad-hoc → perigos + risco + alternativas ranqueadas |
list | listar inventário, filtrar por --cômodo/--faixa/--status/--classe/--perigo, ordenar por risco |
swap | criar/atualizar um plano de troca: escolher alternativa, definir status, lista de verificação, marcador, custo |
score | resumo de exposição doméstica + ranqueamento de "troque primeiro" |
report | gerar o relatório HTML autocontido (Categoria C) |
procure | resumo de passagem para o procurer + ofertas de onde-comprar conhecidas para o alvo da troca (filtrar por --região); registrar uma oferta encontrada (--varejista/--url/--preço-*) no commons público |
knowledge | navegar/pesquisar o grafo de conhecimento (list/search/show) |
rooms | listar/adicionar cômodos |
selfheal | validar arestas de conhecimento + referências do inventário + fundamentação; sair com código diferente de zero em erros |
serve | painel local ao vivo em http://127.0.0.1:8731 — quadro kanban, lista de verificação, marcadores, status; cada clique escreve de volta no estado |
contribute | enfileirar um fato anônimo — product / hazard (classe-de-item→perigo) / alternative / procurement (oferta pública de onde-comprar) / item-class (novo nó de taxonomia); aplicado localmente + controlado para o commons |
sync | enviar a fila de contribuição + puxar conhecimento da comunidade (opt-in); --dry-run mostra exatamente o que seria enviado; --configure define o endpoint |
Fluxo típico
swapit init
swapit add --name "Frigideira Teflon velha" --class nonstick-cookware --room kitchen \
--condition scratched --frequency daily --food-contact --heat
swapit score # o que trocar primeiro
swapit swap itm_xxxx --to cast-iron-skillet --status sourcing --add-task "comprar frigideira 10in"
swapit procure itm_xxxx # -> passar o resumo para a skill `procurer`
swapit report --open # HTML compartilhável
Combinação com outras skills
procurer—swapit procure <item>constrói a necessidade ("substitua 3 garrafas de policarbonato por vidro/aço") e o prompt pronto para oprocurer; oprocurerretorna fontes citadas + uma estimativa de orçamento.bookkeeping(P6) — uma descoberta nova e durável de perigo/produto (por exemplo, uma classe de item recém-caracterizada) é arquivada proativamente emresearch/entities/e pode depois fluir para o commons.health— contexto de exposição pessoal.content-creation— postagens educacionais a partir do grafo.
Disciplina de fundamentação
O conhecimento inicial cita apenas órgãos autoritativos (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Cada registro carrega ≥1 fonte; verified: false marca estes como de grau de referência (não obtidos recentemente) — execute uma passagem com fontes (ou o commons) para atualizar. selfheal falha se algum nó perder sua citação. Esta é uma orientação ao consumidor baseada na ciência da saúde pública, não aconselhamento médico ou jurídico.
Recursos
scripts/swapit.py— ponto de entrada da CLI + manipuladores de comandoscripts/state.py— camada de estado de dois reinos (PRIVATE_FIELDSdefine o limite de sincronização)scripts/ops.py— o caminho de gravação de mutação de estado único (compartilhado pela CLI + painel)scripts/knowledge.py— carregamento do grafo de conhecimento + resolução de arestasscripts/risk.py— mecanismo de pontuação de risco de exposiçãoscripts/report.py— gerador de relatório HTML autocontido (Categoria C)scripts/server.py— painel ao vivoswapit serve(http.server da stdlib, apenas localhost)scripts/anonymize.py— a porta de privacidade: construtores de fatos de allowlist + varredura de campos proibidosscripts/sync.py— cliente de sincronização commons (fila, prévia--dry-run, push/pull, merge)scripts/selfheal.py— validador de integridadetemplates/dashboard.html— o painel ao vivo (CSS/JS inline, Categoria C)commons/— servidor de referência commons em rede (FastAPI + SQLite; implantação controlada)seed/{hazards,item-classes,alternatives}.jsonl— conhecimento inicial fundamentadotests/— testes de risco, conhecimento, auto-cura, CLI, privacidade/anonymize, sincronização, relatório e servidor
Colaboração (o commons)
As contribuições são apenas fatos genéricos — swapit contribute product|hazard|alternative|procurement|item-class
constrói um fato anônimo (um mapeamento público produto→classe-de-item, uma correção de aresta de perigo, uma
alternativa, uma oferta de onde-comprar, ou um novo nó de taxonomia), aplica-o localmente e o enfileira.
swapit sync --dry-run mostra exatamente o que seria enviado; swapit sync envia a fila e puxa o conhecimento
da comunidade (opt-in, após --configure). Fatos idênticos de usuários diferentes corroboram
(endereçados por conteúdo) em vez de duplicar; o commons serve um fato assim que dois contribuidores distintos
o corroboram (corroboration >= 2) — a moderação é controlada por corroboração, não por confiança,
porque confidence é fornecido pelo chamador e um único submissor poderia, de outra forma, auto-aprovar. A invariante
de privacidade é imposta em ambos os lados (porta anonymize do cliente + barreira de segurança do servidor) — o inventário nunca cruza.
Commons de onde-comprar (obtenção)
Um fato procurement_option é uma oferta pública: uma alternativa mais segura vendida por um varejista em uma
região (ISO-3166-1 alpha-2), com url, preço_mín/preço_máx + moeda + data_de,
área e disponibilidade opcionais. É endereçado por conteúdo em (alternativa, varejista, região) — a
mesma oferta corrobora entre usuários; uma região diferente é um fato diferente (o eixo de escala geográfica).
Preço/url/área são dados de mercado refináveis: uma corroboração com data_de estritamente mais recente
atualiza o preço para frente, nunca regredindo dados mais recentes. A costura de privacidade é nítida — a oferta
pública usa varejista + preço_* e nunca o fornecedor/custo privados (onde você comprou e o que
você pagou permanecem no Reino 2). swapit procure <item> --região <CC> exibe ofertas conhecidas e
registra novas que você encontrar — crescendo um conjunto de dados aberto, detalhado e geo-escalado que qualquer um pode usar.
Roteiro
- M1 (lançado, 0.1.0) — modelo de dados, conhecimento inicial, CLI, mecanismo de risco, relatório HTML estático, auto-cura.
- M2 (lançado, 0.2.0) —
swapit serve: painel local ao vivo com leitura/gravação de volta ao estado. - M3 (0.3.0) — colaboração anônima + commons em rede (
commons/, FastAPI + SQLite). Invariante de privacidade imposta por serialização de allowlist + testes difusos no cliente e no servidor. - M4 (esta versão, 0.4.0) — commons de obtenção geo-escalado + crescimento de taxonomia: os
tipos de fato
procurement_option(onde-comprar público, chaveado por(alternativa, varejista, região), atualização de preço apenas para frente) eitem_class(crescimento de taxonomia controlado por corroboração);procureexibe + registra ofertas; ofertas iniciais nos EUA/CO/DE/GB; paridade de hash entre idiomas fixada por vetores fixos. A implantação ao vivo na infraestrutura broomva.tech está condicionada a autorização explícita (credenciais/DNS); a skill é totalmente funcional offline sem ela.