Was macht swapit — Inventar und Austauschmaschine für Haushaltsschadstoffe?
Was dieses Skill ist
swapit verwandelt eine vage Sorge („Da ist wahrscheinlich viel Plastik und BPA in meinem Haus“) in einen konkreten, priorisierten und nachverfolgbaren Plan. Es ist zustandsbehaftet: Ihr Haushaltsinventar lebt auf der Festplatte und bleibt über Sitzungen hinweg erhalten. Es ist lokal-first: null kostenpflichtige Dienste, nichts verlässt Ihr Gerät, es sei denn, Sie entscheiden sich explizit für die (M3) Commons.
Ein Durchlauf erzeugt:
- Ein Inventar der Gegenstände, die Sie besitzen, jeweils gekennzeichnet mit seiner generischen Artikelklasse.
- Eine Risikobewertung pro Gegenstand, die die tatsächliche Exposition widerspiegelt – eine zerkratzte Antihaftpfanne, die täglich bei hoher Hitze verwendet wird, liegt weit über einem ungeöffneten Plastikbehälter in der Garage.
- Eine sortierte „Austausch-zuerst“-Liste – die 5 % der Änderungen, die die meiste Exposition reduzieren.
- Austauschverfolgung – gewählte Alternative, Beschaffungsstatus, Checkliste, Lesezeichen.
- Einen teilbaren HTML-Bericht (und in M2 ein Live-Dashboard unter
swapit serve).
Die drei Bereiche (und das Datenschutz-Invarianz)
| Bereich | Was er enthält | Teilen |
|---|---|---|
| 1 · Wissen | Gefahren → Artikelklassen → Alternativen (generisch, zitierte Fakten) | teilbar; zwischengespeichert + (M3) Commons-synchronisiert |
| 2 · Inventar | Ihre Gegenstände, Räume, Mengen, Marken, Fotos, Tauschvorgänge, Lesezeichen | PRIVAT – verlässt nie das Gerät |
| 3 · Commons (M3) | Anonymisierte Beiträge, die das gemeinsame Wissensnetzwerk bereichern | Opt-in, überprüft, nur generische Fakten |
Datenschutz-Invarianz (bindend): Das Inventar aus Bereich 2 (Gegenstände, Räume, Mengen, Marken, Fotos, Kaufinformationen, Standort) überschreitet niemals die Synchronisationsgrenze. Nur generische Fakten aus Bereich 1 sind teilbar, und zwar über explizites Opt-in + einen überprüfbaren
swapit sync --dry-run. Durchgesetzt durch einen Allowlist-Serialisierer (scripts/anonymize.py) auf dem Client und eine Absicherung auf dem Commons-Server, plus Fuzz-Tests, die sicherstellen, dass jeder reale Inventargegenstand vom Gate abgelehnt wird. Liste der verbotenen Felder:anonymize.CONTRIBUTION_FORBIDDEN(die inventarstrukturelle Teilmenge vonstate.PRIVATE_FIELDS).
Datenmodell
Der Zustand befindet sich unter ~/.config/swapit/ (überschreibbar mit $SWAPIT_HOME; beachtet $XDG_CONFIG_HOME).
~/.config/swapit/
├── knowledge/ hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/ events.jsonl (anfügegeschützte Audit) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl (M3)
├── sync/ config.json · sync-log.jsonl (M3)
└── photos/
Knotenschemata (siehe seed/*.jsonl für den vollständigen, zitierten Datensatz):
- hazard –
id · name · aliases · class · mechanism · exposure_routes · regulatory · severity(0-3) · evidence_strength · sources - item_class –
id · name · category · description · hazards[]{hazard_id, presence_likelihood, rationale} · detection_hints · sources - alternative –
id · name · replaces[] · material · rationale · tradeoffs · caveats · avoids_hazards · residual_concerns · sources - procurement_option (wo zu kaufen, öffentlich) –
id · alternative · item_class · retailer · region(ISO-3166-1 a2) · area · url · price_min · price_max · currency · as_of · availability · confidence · corroboration_count - item (privat) –
id · name · item_class · room · quantity · brand · condition · usage{frequency, food_contact, heat, child_contact} · status · notes · photos - swap (privat) –
id · item_id · chosen_alternative · procurement{status, cost, vendor} · checklist[] · bookmarks[]
Risikomodell
risk = severity × presence_likelihood × evidence × exposure_relevance × frequency × condition
- exposure_relevance aktiviert den Expositionspfad einer Gefahr entsprechend der Nutzung des Gegenstands (Lebensmittelkontakt + Hitze maximiert einen Gefahrenpfad für Ingestion/Lebensmittelkontakt/Hitze; dermal ist für Körperpflege relevant; Inhalation für Reinigung/Möbel; Kinderkontakt verstärkt).
- Gegenstandswert = skalierte Summe des Risikos pro Gefahr → Band hoch / mittel / niedrig.
- Dies ist die Priorisierungsintelligenz – das Analogon zum „dominanten Fehlermodus“ des Beschaffers: Reparieren Sie zuerst die wenigen Gegenstände, die den Großteil der Exposition verursachen, nicht eine Schuldliste von allem aus Plastik.
Modi
| Modus | Was er tut |
|---|---|
init | Zustand erstellen + das Seed-Wissensnetzwerk laden |
add | Haushaltsgegenstand hinzufügen (Name, Klasse, Raum, Zustand, Nutzung) → zeigt seine Bewertung |
assess | Gegenstand oder eine Ad-hoc-Artikelklasse bewerten → Gefahren + Risiko + sortierte Alternativen |
list | Inventar auflisten, filtern nach --room/--band/--status/--class/--hazard, sortieren nach Risiko |
swap | Austauschplan erstellen/aktualisieren: Alternative wählen, Status setzen, Checkliste, Lesezeichen, Kosten |
score | Zusammenfassung der Haushaltsexposition + die Austausch-zuerst-Rangliste |
report | Eigenständigen HTML-Bericht erstellen (Kategorie-C) |
procure | Beschaffungsübergabe-Kurzfassung + bekannte Wo-zu-kaufen-Angebote für das Austauschziel (filtern nach --region); ein gefundenes Angebot (--retailer/--url/--price-*) im öffentlichen Commons aufzeichnen |
knowledge | Wissensnetzwerk durchsuchen/durchsuchen (list/search/show) |
rooms | Räume auflisten/hinzufügen |
selfheal | Wissensedges + Inventarreferenzen + Fundierung validieren; bei Fehlern mit Nicht-Null beenden |
serve | Lokales Live-Dashboard unter http://127.0.0.1:8731 – Kanban-Board, Checkliste, Lesezeichen, Status; jeder Klick schreibt zurück in den Zustand |
contribute | Anonymisierten Fakt in die Warteschlange stellen – product / hazard (item-class→hazard) / alternative / procurement (öffentliches Wo-zu-kaufen-Angebot) / item-class (neuer Taxonomie-Knoten); lokal angewendet + für die Commons geprüft |
sync | Beitragswarteschlange pushen + Community-Wissen pullen (Opt-in); --dry-run zeigt eine Vorschau, was genau gesendet würde; --configure setzt den Endpunkt |
Typischer Ablauf
swapit init
swapit add --name "Alte Teflon-Pfanne" --class nonstick-cookware --room kitchen \
--condition scratched --frequency daily --food-contact --heat
swapit score # was zuerst austauschen
swapit swap itm_xxxx --to cast-iron-skillet --status sourcing --add-task "10-Zoll-Pfanne kaufen"
swapit procure itm_xxxx # -> Übergabe an das `procurer`-Skill
swapit report --open # teilbares HTML
Kombination mit anderen Skills
procurer–swapit procure <item>erstellt den Bedarf („Ersetze 3 Polycarbonat-Flaschen durch Glas/Stahl“) und die fertige Beschaffungsaufforderung; der Beschaffer gibt zitierte Quellen + Budgetrahmen zurück.bookkeeping(P6) – eine neuartige, dauerhafte Gefahren-/Produktentdeckung (z. B. eine neu charakterisierte Artikelklasse) wird proaktiv inresearch/entities/abgelegt und kann später in die Commons fließen.health– persönlicher Expositionskontext.content-creation– lehrreiche Beiträge aus dem Graphen.
Fundierungsdisziplin
Das Seed-Wissen zitiert nur autoritative Stellen (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Jeder Datensatz trägt ≥1 Quelle; verified: false markiert diese als referenzfähig (nicht frisch abgerufen) – führen Sie einen Quellendurchlauf (oder die Commons) durch, um zu aktualisieren. selfheal schlägt fehl, wenn ein Knoten seine Zitation verliert. Dies ist eine Verbraucherberatung, die auf öffentlicher Gesundheitswissenschaft basiert, nicht medizinische oder rechtliche Beratung.
Ressourcen
scripts/swapit.py– CLI-Einstiegspunkt + Befehlshandlerscripts/state.py– Zwei-Bereich-Zustandsschicht (PRIVATE_FIELDSdefiniert die Synchronisationsgrenze)scripts/ops.py– Der einzige Schreibpfad für Zustandsänderungen (von CLI + Dashboard gemeinsam genutzt)scripts/knowledge.py– Laden des Wissensnetzwerks + Kantenauflösungscripts/risk.py– Expositions-Risiko-Bewertungs-Enginescripts/report.py– Generator für eigenständige HTML-Berichte (Kategorie-C)scripts/server.py–swapit serveLive-Dashboard (stdlib http.server, nur localhost)scripts/anonymize.py– Das Datenschutz-Gate: Allowlist-Fakt-Ersteller + der Scan nach verbotenen Feldernscripts/sync.py– Commons-Synchronisationsclient (Warteschlange,--dry-run-Vorschau, Push/Pull, Merge)scripts/selfheal.py– Integritätsvalidatortemplates/dashboard.html– Das Live-Dashboard (Inline-CSS/JS, Kategorie-C)commons/– Der vernetzte Commons-Referenzserver (FastAPI + SQLite; Bereitstellung geprüft)seed/{hazards,item-classes,alternatives}.jsonl– Abgesichertes Startwissentests/– Risiko-, Wissens-, Selbstheilungs-, CLI-, Datenschutz-/Anonymisierungs-, Sync-, Berichts- und Server-Tests
Zusammenarbeit (die Commons)
Beiträge sind nur generische Fakten – swapit contribute product|hazard|alternative|procurement|item-class erstellt einen anonymisierten Fakt (eine öffentliche Produkt→Artikelklasse-Zuordnung, eine Gefahren-Kantenkorrektur, eine Alternative, ein Wo-zu-kaufen-Angebot oder einen neuen Taxonomie-Knoten), wendet ihn lokal an und stellt ihn in die Warteschlange. swapit sync --dry-run zeigt genau, was gesendet würde; swapit sync pusht die Warteschlange und pullt Community-Wissen (Opt-in, nach --configure). Identische Fakten von verschiedenen Benutzern bestätigen sich gegenseitig (inhaltsadressiert) anstatt zu duplizieren; die Commons dienen einen Fakt erst dann aus, wenn zwei verschiedene Beitragende ihn bestätigen (corroboration >= 2) – die Moderation ist bestätigungsabhängig, nicht vertrauensabhängig, da confidence vom Aufrufer stammt und ein einzelner Einreicher sich sonst selbst genehmigen könnte. Die Datenschutz-Invarianz wird auf beiden Seiten durchgesetzt (Client anonymize-Gate + Server-Rückhalt) – das Inventar überschreitet niemals die Grenze.
Wo-zu-kaufen (Beschaffungs-) Commons
Ein procurement_option-Fakt ist ein öffentliches Angebot: eine sicherere alternative, die von einem retailer in einer region (ISO-3166-1 alpha-2) verkauft wird, mit optionalem url, price_min/price_max + currency + as_of, area und availability. Er ist inhaltsadressiert über (alternative, retailer, region) – dasselbe Angebot wird von verschiedenen Benutzern bestätigt; eine andere Region ist ein anderer Fakt (die geografische Skalenachse). Preis/URL/Bereich sind verfeinerbare Marktdaten: Eine Bestätigung mit einem streng neueren as_of frischt den Preis nach vorne, ohne neuere Daten zu verschlechtern. Die Datenschutz-Trennlinie ist scharf – das öffentliche Angebot verwendet retailer + price_* und niemals den privaten vendor/cost (wo Sie gekauft haben und was Sie bezahlt haben, bleibt in Bereich 2). swapit procure <item> --region <CC> zeigt bekannte Angebote an und zeichnet neue auf, die Sie finden – und erstellt so einen offenen, detaillierten, geografisch skalierten Datensatz, den jeder nutzen kann.
Roadmap
- M1 (ausgeliefert, 0.1.0) – Datenmodell, Seed-Wissen, CLI, Risiko-Engine, statischer HTML-Bericht, Selbstheilung.
- M2 (ausgeliefert, 0.2.0) –
swapit serve: Lokales Live-Dashboard mit Lese-/Schreibzugriff auf den Zustand. - M3 (0.3.0) – Anonymisierte Zusammenarbeit + vernetzte Commons (
commons/, FastAPI + SQLite). Datenschutz-Invarianz durch Allowlist-Serialisierung + Fuzz-Tests sowohl auf Client- als auch auf Serverseite durchgesetzt. - M4 (diese Version, 0.4.0) – Geografisch skalierte Beschaffungs-Commons + Taxonomie-Wachstum: die
procurement_option(öffentliches Wo-zu-kaufen, geschlüsselt nach(alternative, retailer, region), Vorwärts-Preisauffrischung) unditem_class(bestätigungsabhängiges Taxonomie-Wachstum) Fakt-Arten;procurezeigt Angebote an und zeichnet sie auf; Seed-Angebote in den USA/CO/DE/GB; sprachübergreifende Hash-Parität durch festgelegte Vektoren gesichert. Live-Bereitstellung auf der broomva.tech-Infrastruktur ist an eine explizite Freigabe gebunden (Zugangsdaten/DNS); das Skill ist auch offline voll funktionsfähig.