Norme de base / Cookwala Core 0.2 core Modifier sur GitHubMarkdown

Cette page a été traduite par une machine et n'a pas encore été révisée par une personne. L'anglais est la référence ; les corrections sont les bienvenues sur GitHub. English

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 #

ClasseDoit implémenter
Éditeur de recettesDocuments 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
CatalogueRecettes 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érificateurHashes, 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 #

DocumentSchéma
Recetterecipe.schema.json
Capacités de l'appareilcapabilities.schema.json
ExecuteRequest, ExecutionStatus, StopRequest, ExecutionLogcore.schema.json
SafetyLimits, Recall, IncidentReport, ConformanceVectorcore.schema.json
Types partagés (Quantity, Condition, Money, Signature, KeyRecord, Disclosure, AgentMandate)common.schema.json
Événementsevent.schema.json (CloudEvents)
Vocabulaires : opérations, unités et niveaux de chaleur, incidentsvocab/*.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.json possède une envelope. 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.tempC ou une target sur 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 dans vocab/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), puis time, puis human.
    • 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 Condition peut restreindre cela avec onSensorMissing.
  • 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 refused avec une raison avant de commencer.

4. Nombres et unités #

  • Les températures sont en °C sur le fil. Les affichages peuvent convertir.
  • Tolerances.
    • tolerance est relative et autorisée uniquement sur les unités à échelle de rapport.
    • toleranceAbs est absolue dans l'unité de la valeur, et est la seule tolérance autorisée sur °C.
    • Target.tolerance est 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 champs hash et signature. Le canoniseur de référence reproduit l'exemple RFC 8785 exactement.
  • Signature. Ed25519 (EdDSA) sur la chaîne de caractères hash ASCII. ES256 est autorisé pour les clés matérielles P-256. kid nomme un KeyRecord.
  • Keys. Un KeyRecord fournit la clé publique, son propriétaire, une fenêtre de validité et revokedAt. Une signature dont le signedAt tombe 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.
  • 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 seq et prev, 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.

6. Sécurité et règles de l'agent (normatif) #

  1. La sécurité est locale. Les exécuteurs appliquent un pack SafetyLimits sur 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.json est un point de départ provisoire que les fabricants d'appareils renforcent à partir de leur propre dossier de sécurité.
  2. 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 …/stop n'est jamais refusé pour autorisation une fois que l'appelant peut atteindre l'exécuteur.
  3. Les événements rapportent ; ils ne protègent jamais. Les événements cookwalalatency: local_safety rapportent 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.
  4. 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).
  5. Les agents agissent sous un mandate. Une requête envoyée par un agent porte un AgentMandate signé par le mandant : portées, plafonds de dépenses, fournisseurs autorisés, expiration, et actions nécessitant une confirmation.
    • irreversible et safety_override nécessitent toujours une confirmation, peu importe ce que dit le mandate.
    • Les exécuteurs refusent les requêtes hors du mandate (mandate_scope).
  6. Les opérations non surveillées nécessitent une personne. Les opérations dont l'envelope indique unattended: false nécessitent la présence d'une personne responsable, ou joignable en moins d'une minute.
  7. 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.
  8. 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_running arrête également les exécutions en cours de manière sécurisée.
  9. 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_human et stopping → stopped en cours de route ;
    • refused et failed sont finaux.
    • La table de transition complète se trouve dans core.schema.json#/$defs/ExecutionState et 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.
  • Événements :
    • La livraison est au moins une fois (at least once).
    • L' id de CloudEvents est la clé de déduplication.
    • cookwalaseq ordonne les événements par sujet et correspond au statut seq.
    • 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: none par défaut, research_only, ou open). 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é deprecated avec replacedBy.
  • Les Profiles versionnent indépendamment et déclarent la version Core dont ils ont besoin.

10. Profils et leur statut #

ProfilStatutNotes
Core (ce document)draft, normativeCible pour les premières implémentations de dispositifs
Humanitarian 0.2 (HUMANITARIAN-PROFILE.md)draftAucune 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)draftFaits domestiques en local-first ; seules les derived constraints sont transmises (RFC-0001)
Registry and Directory (REGISTRY.md)draftNamespaces prouvés, versions exactes, tombstones ; organisations sur demande (RFC-0002)
Conformance reports (CERTIFICATION.md)draftRapports signés derrière chaque affirmation de conformance (RFC-0008)
Federation (FEDERATION.md)draftFlux et relais ; vérification auprès de l'émetteur (RFC-0006)
Kitchens and production runs (KITCHENS-AND-FLEETS.md)experimentalRestaurants, communauté, école, catastrophe et cuisines robotisées (RFC-0005)
Supply signals (SUPPLY-SIGNALS.md)experimentalSignaux 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)experimentalEvent log + projection, transitions dans profiles/mission/transitions.json
Sessions and multi-device hub (session.schema.json, hub.openapi.yaml)experimental
Market and ecosystemexperimentalNécessite une revue du droit de la concurrence avant l'utilisation en production
Relief planning (relief.schema.json)experimentalFlux opérationnel déplacé vers le Humanitarian Profile
Reasoning and advice, health, flows, extensionsexperimental
GraphQL and AsyncAPI surfacesexperimentalL'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 #

OutilCe qu'il fait
tools/validate_specs.pyVé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.pyExé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.pyBibliothèque de référence et CLI : hash, verify, chain
tools/make_conformance.pyRégénère les vecteurs (examiner le diff)
tools/bundle_schemas.pyBundle de schémas hors ligne
tools/humanitarian_check.pyVérificateur de rule-pack du Humanitarian Profile et résumés d'impact
tools/make_profile_vectors.pyRégénère les vecteurs de profil dans conformance/profiles/

12. Changements par rapport à 0.1 #

Zone0.10.2
SchemasChamps inconnus acceptésStrict, avec extensions x-
Températures°C ou °F, tolérance relative autorisée°C uniquement ; tolérance absolue
ArgentNombreChaîne décimale
OpérationsDéfinitions en proseEnveloppes physiques, sensor ladders, niveaux de chaleur, vecteurs de test
SignaturesEdDSA fixe, clés sans cycle de vieEdDSA ou ES256, KeyRecords avec validité et révocation
MissionsUn document mutable, ledger à l'intérieurEvent log + projection, séquenceur unique, checkpoints témoins, mode hash-only
AgentsMandate uniquement à l'intérieur des MissionsAgentMandate 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éesPas de modèle de datasetExecutionLog consenti et sans données personnelles
ConformanceValidation de schéma uniquement106 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-.