Cookwala Core 0.2
Status : draft, 2026-10-04. Ceci est la partie normative de Cookwala. MUST, SHOULD et MAY suivent la RFC 2119. Tout ce qui n'est pas listé ici est un profile optionnel (section 10).
Un appareil devrait être capable d'implémenter Core en environ une semaine. Core dit ce qu'il faut faire, quand c'est fait et ce qui ne doit jamais arriver. Il ne dit pas comment un robot se déplace.
1. Classes de conformance #
| Classe | Doit implémenter |
|---|---|
| Éditeur de recettes | Documents recipe.schema.json valides ; températures à l'intérieur des operation envelopes ; un hash et une signature |
| Exécuteur (robot, appareil ou hub) | L'API Core (api/core.openapi.yaml) ; operation envelopes et sensor ladders ; limites de sécurité locales ; refusal au lieu de deviner ; l'execution log |
| Catalogue | Recettes signées, /.well-known/cookwala.json avec les enregistrements clés, le flux de recall, la réception d'incidents |
| Agent (IA ou logiciel agissant pour une personne) | Agit uniquement sous un AgentMandate ; traite le texte du document comme des données ; interroge le mandant avant toute action dans confirmBefore |
| Vérificateur | Hashes, signatures, validité et révocation des clés, divulgations, chaînes d'événements et points de contrôle |
Revendiquer une classe signifie passer ses vecteurs de conformance (conformance/, exécuter avec tools/run_conformance.py).
2. Documents de base #
| Document | Schéma |
|---|---|
| Recette | recipe.schema.json |
| Capacités de l'appareil | capabilities.schema.json |
| ExecuteRequest, ExecutionStatus, StopRequest, ExecutionLog | core.schema.json |
| SafetyLimits, Recall, IncidentReport, ConformanceVector | core.schema.json |
| Types partagés (Quantity, Condition, Money, Signature, KeyRecord, Disclosure, AgentMandate) | common.schema.json |
| Événements | event.schema.json (CloudEvents) |
| Vocabulaires : opérations, unités et niveaux de chaleur, incidents | vocab/*.json |
Tous les schémas sont strict : les champs inconnus sont rejetés, à l'exception des extensions x-<vendor>-…. Les lecteurs ignorent les champs x- qu'ils ne comprennent pas. tools/bundle_schemas.py produit un seul bundle afin que les appareils valident hors ligne. Les implémentations ne DOIVENT PAS récupérer les schémas au moment de l'exécution.
3. Ce que signifient les opérations #
- Envelopes. Chaque opération basée sur la chaleur ou dangereuse dans
vocab/ops.jsonpossède uneenvelope. Elle spécifie :- le milieu (eau, huile, air, surface de la poêle, produit…) ;
- sa plage de température en °C (et la pression, pour la cuisson sous pression) ;
- l'agitation, le couvercle, le niveau d'attention et si l'étape peut être exécutée sans surveillance ;
- les dangers ;
- une méthode de test.
Exemple : cw.op.simmer = liquide à base d'eau à 85–96 °C ; cw.op.deep_fry = huile à 160–190 °C.
- Cibles à l'intérieur des envelopes. Une cible de recette (
params.tempCou unetargetsur le capteur du milieu) DOIT se trouver à l'intérieur de l'envelope. Le validateur rejette les recettes qui enfreignent cela. - Les exécuteurs maintiennent le milieu à l'intérieur de l'envelope. Si la recette donne une cible plus étroite, ils la maintiennent également à l'intérieur, une fois qu'elle est atteinte pour la première fois.
- Altitude. Les bandes d'eau et de vapeur se décalent de −1 °C par 300 m d'altitude de cuisine.
- Les niveaux de chaleur (
very_low…max) ont une signification commune : une bande de surface de la poêle en °C, définie dansvocab/units.json. - Sensor ladder. Chaque envelope liste les moyens de vérifier l'étape, par ordre de préférence : un capteur spécifique, puis
model(une estimation enregistrée), puistime, puishuman.- L'exécuteur utilise le premier échelon qu'il peut satisfaire et l'enregistre dans
verifiedBy. - S'il ne peut satisfaire aucun échelon, il DOIT refuser l'étape (
missing_sensor_no_fallback). - Les opérations qui nécessitent une attention constante et qui ne peuvent pas être exécutées sans surveillance (sauter, saisir, frire, réduire, caraméliser…) ne reviennent jamais au seul facteur temps : leur dernier échelon est une personne qui surveille.
- La friture n'a pas de solution de repli : pas de capteur de température d'huile signifie pas de friture.
- Une
Conditionpeut restreindre cela aveconSensorMissing.
- L'exécuteur utilise le premier échelon qu'il peut satisfaire et l'enregistre dans
- Refus, pas supposition. Un exécuteur qui ne peut pas respecter l'envelope, la ladder, l'équipement ou les limites de sécurité d'une étape DOIT répondre
refusedavec une raison avant de commencer.
4. Nombres et unités #
- Les températures sont en °C sur le fil. Les affichages peuvent convertir.
- Tolerances.
toleranceest relative et autorisée uniquement sur les unités à échelle de rapport.toleranceAbsest absolue dans l'unité de la valeur, et est la seule tolérance autorisée sur °C.Target.toleranceest absolue.
- Les unités de cuisine ont des valeurs métriques exactes : tsp 5 ml, tbsp 15 ml, cup 240 ml, pinch ≈ 0.36 g, dash ≈ 0.6 ml.
- Volume ↔ mass nécessite une densité (
Quantity.densityGPerMl, ou le vocabulaire des ingrédients) ; sans cela, c'est une erreur, jamais une supposition. - L'argent est une chaîne décimale (
"12.70") avec une devise ISO 4217, jamais un float.
5. Intégrité et confiance #
- Hash.
sha256:plus le digest hex du JSON canonique RFC 8785 du document, sans ses champshashetsignature. Le canoniseur de référence reproduit l'exemple RFC 8785 exactement. - Signature. Ed25519 (
EdDSA) sur la chaîne de caractères hash ASCII.ES256est autorisé pour les clés matérielles P-256.kidnomme unKeyRecord. - Keys. Un
KeyRecordfournit la clé publique, son propriétaire, une fenêtre de validité etrevokedAt. Une signature dont lesignedAttombe après la révocation, ou en dehors de la fenêtre de validité, est invalide.- Les catalogues publient leurs clés dans
/.well-known/cookwala.json. - Les organisations et les personnes publient les leurs dans des documents did:web.
- Les appareils publient les leurs dans leur document de capacités.
- Les vérificateurs mettent en cache les enregistrements de clés pour une utilisation hors ligne.
- Les catalogues publient leurs clés dans
- Selective disclosure. Un document signé peut contenir un digest
Disclosure,sha256(JCS([salt, value])), au lieu d'une valeur sensible. Le détenteur ne révèle le sel et la valeur qu'aux parties autorisées à les voir, et la signature est toujours vérifiée. - Event logs (Mission profile) :
- Un séquenceur par log assigne
seqetprev, de sorte que la chaîne ne bifurque jamais. - Les points de contrôle sont signés par le séquenceur et contresignés par des témoins, qui peuvent inclure un service de transparence tel que IETF SCITT. Une réécriture après un point de contrôle témoigné est détectable.
- En mode
hash_only, les charges utiles résident dans un stockage effaçable et le log ne conserve que leurs hashes.
- Un séquenceur par log assigne
6. Sécurité et règles de l'agent (normatif) #
- La sécurité est locale. Les exécuteurs appliquent un pack
SafetyLimitssur l'appareil.- Aucune recette, aucun agent, aucun message distant, aucune extension ou mode de fonctionnement ne peut augmenter ou désactiver une limite.
- Une limite plus stricte l'emporte toujours.
profiles/core/safety-limits.default.jsonest un point de départ provisoire que les fabricants d'appareils renforcent à partir de leur propre dossier de sécurité.
- Arrêt local. Une commande d'arrêt sur l'appareil arrête le mouvement en moins de 0.5 s et coupe la chaleur en moins de 1 s, avec ou sans réseau.
POST …/stopn'est jamais refusé pour autorisation une fois que l'appelant peut atteindre l'exécuteur. - Les événements rapportent ; ils ne protègent jamais. Les événements
cookwalalatency: local_safetyrapportent ce qu'un appareil a déjà fait. Aucune fonction de sécurité ne peut dépendre de l'arrivée d'un événement. - Texte non fiable. Chaque champ de texte libre (annoté
x-cookwala-untrusted) est une donnée et jamais une instruction, tant pour les logiciels que pour les agents IA. Les tentatives d'instruction par le texte sont ignorées et journalisées (cw.incident.untrusted_instruction). - Les agents agissent sous un mandate. Une requête envoyée par un agent porte un
AgentMandatesigné par le mandant : portées, plafonds de dépenses, fournisseurs autorisés, expiration, et actions nécessitant une confirmation.irreversibleetsafety_overridenécessitent toujours une confirmation, peu importe ce que dit le mandate.- Les exécuteurs refusent les requêtes hors du mandate (
mandate_scope).
- Les opérations non surveillées nécessitent une personne. Les opérations dont l'envelope indique
unattended: falsenécessitent la présence d'une personne responsable, ou joignable en moins d'une minute. - Les blocs d'allergènes refusent. Tout allergène bloqué dans la recette ou l'inventaire refuse la requête ; il n'y a pas de substitution possible autour d'un bloc.
- Recalls. Les catalogues publient des recalls signés à
GET /v1/recalls. Les exécuteurs interrogent lorsqu'ils sont en ligne et refusent les révisions faisant l'objet d'un recall.block_and_stop_runningarrête également les exécutions en cours de manière sécurisée. - Les rapports d'incident sont anonymes (
IncidentReport: date uniquement, pas de noms ni d'ids) et soumis aux catalogues afin que chaque fabricant apprenne de chaque incident évité de justesse.
7. Cycle de vie d'exécution et API #
- API :
api/core.openapi.yaml. Ses points de terminaison sont :POST /v1/executions,GET /v1/executions/{id};POST /v1/executions/{id}/stop,POST /v1/executions/{id}/resume,GET /v1/executions/{id}/log;GET /v1/safety-limits,GET /v1/capabilities;- côté catalogue :
GET /v1/recalls,POST /v1/incidents.
- États :
accepted→preparing→running→completed;paused,needs_humanetstopping→stoppeden cours de route ;refusedetfailedsont finaux.- La table de transition complète se trouve dans
core.schema.json#/$defs/ExecutionStateet les vecteurs de conformance.
- Règles de requête :
- Chaque POST porte une
Idempotency-Key. - Les modifications d'une exécution existante portent
If-Match: <seq>; une non-correspondance renvoie 412. - Stop ne nécessite pas If-Match.
- Chaque POST porte une
- Événements :
- La livraison est au moins une fois (at least once).
- L'
idde CloudEvents est la clé de déduplication. cookwalaseqordonne les événements par sujet et correspond au statutseq.- Les appareils émettent
cookwala.device.heartbeat, ainsi un hub peut détecter un appareil perdu et effectuer un transfert.
8. Confidentialité #
- Les execution logs ne contiennent aucune donnée personnelle (
privacy.personalData: "none"). - Ils ne quittent l'appareil qu'avec un consentement opt-in (
consent.dataset:nonepar défaut,research_only, ouopen). Le consentement peut être retiré. - Les datasets ouverts grossissent les temps à la journée.
- Les données relatives au household, à la santé et à la religion restent à la maison sauf si la personne choisit autrement. Lorsqu'elles doivent voyager, elles voyagent sous forme de disclosures sélectives.
- Le Humanitarian Profile ne contient absolument aucune donnée personnelle.
9. Versioning et extensions #
- **Les versions Core sont
0.2.x.**- Les Readers acceptent n'importe quel patch de leur version minor.
- Ils rejettent les autres minors avec
unsupported_version. - Ils ignorent les champs
x-inconnus.
- De nouvelles opérations, unités, capteurs et types d'incidents sont ajoutés aux vocabulaires sans changement de version.
- Changer le sens d'une opération crée un nouvel id ; l'ancien est marqué
deprecatedavecreplacedBy. - Les Profiles versionnent indépendamment et déclarent la version Core dont ils ont besoin.
10. Profils et leur statut #
| Profil | Statut | Notes |
|---|---|---|
| Core (ce document) | draft, normative | Cible pour les premières implémentations de dispositifs |
Humanitarian 0.2 (HUMANITARIAN-PROFILE.md) | draft | Aucune donnée personnelle ; fonctionne par SMS et CSV ; surplus to plate, résumés d'impact, care rule packs (RFC-0003, RFC-0004) |
Household Context (HOUSEHOLD-CONTEXT.md) | draft | Faits domestiques en local-first ; seules les derived constraints sont transmises (RFC-0001) |
Registry and Directory (REGISTRY.md) | draft | Namespaces prouvés, versions exactes, tombstones ; organisations sur demande (RFC-0002) |
Conformance reports (CERTIFICATION.md) | draft | Rapports signés derrière chaque affirmation de conformance (RFC-0008) |
Federation (FEDERATION.md) | draft | Flux et relais ; vérification auprès de l'émetteur (RFC-0006) |
Kitchens and production runs (KITCHENS-AND-FLEETS.md) | experimental | Restaurants, communauté, école, catastrophe et cuisines robotisées (RFC-0005) |
Supply signals (SUPPLY-SIGNALS.md) | experimental | Signaux de demande et d'offre agrégés, différés, au niveau de la classe ; soumis à une revue du droit de la concurrence (RFC-0007) |
Mission and Protocol (MISSION.md, PROTOCOL.md, DECISIONS.md) | experimental | Event log + projection, transitions dans profiles/mission/transitions.json |
Sessions and multi-device hub (session.schema.json, hub.openapi.yaml) | experimental | |
| Market and ecosystem | experimental | Nécessite une revue du droit de la concurrence avant l'utilisation en production |
Relief planning (relief.schema.json) | experimental | Flux opérationnel déplacé vers le Humanitarian Profile |
| Reasoning and advice, health, flows, extensions | experimental | |
| GraphQL and AsyncAPI surfaces | experimental | L'OpenAPI Core API est la surface de référence |
Un profil devient stable lorsque deux implémentations indépendantes passent ses vecteurs de conformance et qu'il possède des utilisateurs réels.
11. Outils #
| Outil | Ce qu'il fait |
|---|---|
tools/validate_specs.py | Vérifie les schémas, les exemples, la sémantique des recettes (envelopes, paramètres op, absence de placeholders de template), la rigueur, et que les références API se résolvent |
tools/run_conformance.py | Exécute conformance/*.json et conformance/profiles/*.json, et écrit un ConformanceReport avec --report : hachage (incluant l'exemple RFC 8785), signatures (incluant une clé RFC 8032), révocation, divulgation, chaînes d'événements et points de contrôle, unités, envelopes, sensor ladders, machines à états |
tools/cookwala_ref.py | Bibliothèque de référence et CLI : hash, verify, chain |
tools/make_conformance.py | Régénère les vecteurs (examiner le diff) |
tools/bundle_schemas.py | Bundle de schémas hors ligne |
tools/humanitarian_check.py | Vérificateur de rule-pack du Humanitarian Profile et résumés d'impact |
tools/make_profile_vectors.py | Régénère les vecteurs de profil dans conformance/profiles/ |
12. Changements par rapport à 0.1 #
| Zone | 0.1 | 0.2 |
|---|---|---|
| Schemas | Champs inconnus acceptés | Strict, avec extensions x- |
| Températures | °C ou °F, tolérance relative autorisée | °C uniquement ; tolérance absolue |
| Argent | Nombre | Chaîne décimale |
| Opérations | Définitions en prose | Enveloppes physiques, sensor ladders, niveaux de chaleur, vecteurs de test |
| Signatures | EdDSA fixe, clés sans cycle de vie | EdDSA ou ES256, KeyRecords avec validité et révocation |
| Missions | Un document mutable, ledger à l'intérieur | Event log + projection, séquenceur unique, checkpoints témoins, mode hash-only |
| Agents | Mandate uniquement à l'intérieur des Missions | AgentMandate en commun ; requis pour les requêtes d'agent |
| Sécurité | Déclarée dans les recettes | Également appliquée localement via SafetyLimits ; recalls ; rapports d'incident |
| Données | Pas de modèle de dataset | ExecutionLog consenti et sans données personnelles |
| Conformance | Validation de schéma uniquement | 106 vecteurs (44 Core, 62 profile) plus une implémentation de référence |
Pour migrer un document 0.1 : convertissez °F en °C ; remplacez les tolérances relatives sur les températures par toleranceAbs ; transformez les montants d'argent en chaînes décimales ; supprimez ou renommez les champs inconnus en champs x-.