Se rendre au contenu


Préconisation utilisation des Anthropic Agent Skills (au sens Agent Skills / MCP-compatible) pour la couche 1 “Canaux usager” de Synergia,

Voici une préconisation structurée et pragmatique de l’utilisation des Anthropic Agent Skills (au sens Agent Skills / MCP-compatible) pour la couche 1 “Canaux usager” de Synergia, en respectant strictement votre principe clé :

La couche 1 n’exécute pas de décisions métier.

Elle capte l’intention, structure les signaux, collecte les preuves.

Je distingue donc clairement :

  • Skills d’instrumentation (capture / structuration),
  • Skills d’analyse légère (sans décision),
  • Skills interdits à ce niveau (à réserver à la couche 2 Orchestration).


1. Principe général d’utilisation des Agent Skills Anthropic dans Synergia

Règle d’or

Dans la couche 1 :

  • ✅ Skills stateless, non décisionnels
  • ✅ Sorties JSON strictes, typées
  • ❌ Aucune orchestration métier
  • ❌ Aucun accès direct à Odoo en écriture

Les skills Anthropic servent ici de :

  • parseurs d’intention
  • extracteurs multimodaux
  • normalisateurs de signaux faibles

2. Cartographie des Skills Anthropic par sous-canal 

A. WebApp Nurse (smartphone – IDEL) > Transformer des interactions humaines (checklists, notes, photos, vitaux) en événements cliniques structurés.


Objectif

Transformer des interactions humaines (checklists, notes, photos, vitaux) en événements cliniques structurés.

Skills Anthropic recommandés

UsageSkill AnthropicRôle exactSortie
Texte libre / notesintent_extractionExtraire intention clinique sans jugerintent_type, confidence
Checklistsform_normalizerNormaliser checklist UI → JSONvisit_event
Photos (plaies, pilulier)vision_feature_extractionDécrire visuellement sans diagnosticvisual_observation[]
Bouton “personne à risque”risk_flag_parserStructurer le signal + justification humainerisk_flag{reason, free_text}
Vitaux saisismedical_value_parserValidation syntaxique + unitéobservation{value, unit}

Skills explicitement interdits

  • Diagnostic
  • Priorisation
  • Décision d’alerte

👉 Le skill ne fait que rendre la donnée exploitable.> c'est pour passer la "balle" aux médecins ( voir avec @Pascal )


B. WebApp Caregiver (aide à domicile) @antonio> Capteur de signaux faibles non médicaux.

Objectif

Capteur de signaux faibles non médicaux.

Skills Anthropic recommandés

UsageSkillRôleSortie
Texte incidentevent_classification_lightClassifier sans gravitécare_event_type
Besoin expriméneed_structuringStructurer demandeneed_request{category}
Journal quotidiendaily_log_normalizerStructuration narrative → événementscare_event[]

Point clé

Les skills ne savent pas ce qu’est une urgence.

Ils préparent la matière pour la couche 2.

C. App / Portail Famille @ArmelCanal émotionnel + consentement, sans médicalisation.


Objectif

Canal émotionnel + consentement, sans médicalisation.

Skills Anthropic recommandés

UsageSkillRôleSortie
Message textemessage_intent_taggingTagging sémantique simplefamily_message{topic}
Photo envoyéeimage_captioning_safeDescription neutremedia_post{caption}
Consentementconsent_statement_parserVérifier complétudeconsent_update{scope, explicit}

Important

  • Aucun enrichissement clinique
  • Pas d’inférence médicale sur les images

D. RCS / SMS / WhatsApp / WhatsUs @antonio >  réponses ultra-courtes en événements fiables.


Objectif

Transformer des réponses ultra-courtes en événements fiables.

Skills Anthropic recommandés

UsageSkillRôleSortie
OUI / NONbinary_reply_parserDésambiguïsation strictereply_yesno{value}
Confirmation RDVappointment_confirmation_parserParsing contextuelappointment_confirm{id}
Accusé réceptionacknowledgement_parserMarquer réceptionalert_ack{timestamp}

Note critique

Ici, la robustesse prime sur l’intelligence.

Skills très simples, très déterministes.

E. WebRTC (voix / visio) > @Finary + @Antonio Transformer une interaction riche en preuves exploitables.

Objectif

Transformer une interaction riche en preuves exploitables.

Skills Anthropic recommandés

UsageSkillRôleSortie
Voix → textespeech_to_textTranscription horodatéecall_transcript
Analyse conversationintent_candidate_extractionProposer intentions possiblesintent_candidates[]
Pièces évoquéesevidence_reference_extractorLier propos → preuvesevidence_snippets[]
Résuméneutral_call_summaryRésumé factuel, non interprétatifsummary_text

Règle stricte

Le résumé :

  • ❌ ne conclut rien
  • ❌ ne recommande rien
  • ✅ cite uniquement ce qui a été dit

F. IoT / Capteurs (mmWave, pilulier, wearables) @gabriel 2026


Objectif

Normaliser des flux temps réel → événements lisibles.

Skills Anthropic recommandés

UsageSkillRôleSortie
Événement capteursensor_event_normalizerUnification formatssensor_event{type}
Détection chutepattern_labelerÉtiquetage probabilistefall_suspect{confidence}
Observanceadherence_event_builderÉcart planifié / réeladherence{delta}

Important

  • Le skill ne déclenche jamais d’alerte
  • Il fournit un indice probabiliste

3. Tableau de synthèse – Skills autorisés par type

Type de skillAutorisé couche 1Justification
Intent extractionInstrumentation
Vision captioningObservation factuelle
Speech-to-textPreuve primaire
Classification légèrePré-tri
Résumé neutreLisibilité
RecommandationDécision
OrchestrationMétier
PriorisationResponsabilité
Appel API métierCouche 2 uniquement


4. Positionnement stratégique (important)

Skills Anthropic dans Synergia ≠ “plugins”

Ils sont utilisés comme :

  • drivers cognitifs
  • capteurs sémantiques
  • normalisateurs multimodaux

👉 La valeur métier commence après, dans la couche Orchestration Synergia.

Proposition  opérationnelle de Skill Manifest “Anthropic ↔ Synergia” (format YAML)

Ci-dessous une proposition opérationnelle de Skill Manifest “Anthropic Synergia” (format YAML) incluant :

  1. permissions déclaratives (policy layer)
  2. schémas JSON exacts (JSON Schema Draft 2020-12) pour inputs et outputs
  3. enveloppe d’audit standard (trace_id, actor, channel, evidence_refs)
  4. mappings Odoo (ce que la couche 2 écrira ensuite, sans l’autoriser en couche 1)

Vous pouvez l’utiliser comme base d’un registre interne et l’exposer via une interface MCP / Agent Skills.

0) Conventions Synergia (obligatoires)

0.1 Enveloppe d’entrée standard (SkillInputEnvelope)

{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://synergia.example/schemas/SkillInputEnvelope.json", "title": "SkillInputEnvelope", "type": "object", "additionalProperties": false, "required": ["meta", "payload"], "properties": { "meta": { "type": "object", "additionalProperties": false, "required": ["trace_id", "timestamp", "channel", "actor", "tenant_id"], "properties": { "trace_id": { "type": "string", "minLength": 12, "maxLength": 128 }, "timestamp": { "type": "string", "format": "date-time" }, "tenant_id": { "type": "string", "minLength": 2, "maxLength": 64 }, "channel": { "type": "string", "enum": ["webapp_nurse", "webapp_caregiver", "portal_family", "rcs_sms_whatsapp", "webrtc", "iot"] }, "actor": { "type": "object", "additionalProperties": false, "required": ["type", "id"], "properties": { "type": { "type": "string", "enum": ["human", "service", "device", "agent"] }, "id": { "type": "string", "minLength": 1, "maxLength": 128 }, "role": { "type": "string", "enum": ["idel", "caregiver", "coordinator", "family", "senior", "system"], "default": "system" } } }, "context": { "type": "object", "additionalProperties": true, "properties": { "senior_id": { "type": ["string", "null"], "maxLength": 128 }, "visit_id": { "type": ["string", "null"], "maxLength": 128 }, "locale": { "type": "string", "default": "fr-FR" } } } } }, "payload": { "type": "object" } } }

0.2 Enveloppe de sortie standard (SkillOutputEnvelope)

{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://synergia.example/schemas/SkillOutputEnvelope.json", "title": "SkillOutputEnvelope", "type": "object", "additionalProperties": false, "required": ["meta", "result"], "properties": { "meta": { "type": "object", "additionalProperties": false, "required": ["trace_id", "skill", "version", "status", "duration_ms"], "properties": { "trace_id": { "type": "string" }, "skill": { "type": "string" }, "version": { "type": "string" }, "status": { "type": "string", "enum": ["success", "error"] }, "duration_ms": { "type": "integer", "minimum": 0 }, "warnings": { "type": "array", "items": { "type": "string" } } } }, "result": { "type": "object" }, "error": { "type": "object", "additionalProperties": false, "required": ["code", "message"], "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "details": { "type": "object", "additionalProperties": true } } } } }

1) Permissions déclaratives Synergia (Policy Layer)

1.1 Vocabulaire de permissions (exemple minimal)

  • pii.read (lecture données identifiantes)
  • media.read / media.write (accès média)
  • transcript.write (stockage transcription)
  • classify.intent (extraction intention)
  • vision.describe (description visuelle non diagnostique)
  • sensor.normalize (normalisation IoT)
  • notify.send (envoi messages, couche 2 seulement)
  • odoo.write:* (interdit couche 1)

Règle : couche 1 = aucune permission odoo.write:* ni notify.send.

2) Skill Manifest (YAML) — “Anthropic ↔ Synergia”

Ce manifeste décrit des skills “d’instrumentation” utilisables par le runtime (Anthropic/Agent Skills) sur la couche 1.

La couche 2 consomme les sorties et écrit dans Odoo.

manifest_version: "1.0" namespace: "synergia" registry: "internal" defaults: output_envelope_schema: "https://synergia.example/schemas/SkillOutputEnvelope.json" input_envelope_schema: "https://synergia.example/schemas/SkillInputEnvelope.json" audit: required: true log_level: "info" redact: - "$.payload.raw_text" - "$.payload.transcript_text" - "$.payload.image_base64" skills: - id: "synergia.intent_extraction.v1" title: "Extraction d'intention (texte)" description: "Transforme un texte libre en intention normalisée (non décisionnelle)." channels: ["webapp_nurse", "webapp_caregiver", "portal_family", "rcs_sms_whatsapp", "webrtc"] permissions_required: ["classify.intent"] permissions_denied: ["odoo.write:*", "notify.send"] policy: require_human_approval: false pii_handling: "minimize" io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: false required: ["text"] properties: text: { type: "string", minLength: 1, maxLength: 4000 } hints: type: "object" additionalProperties: false properties: domain: { type: "string", enum: ["senior_care", "admin"], default: "senior_care" } allowed_intents: type: "array" items: { type: "string" } output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["intent_type", "confidence", "slots"] properties: intent_type: type: "string" enum: - "visit_event" - "observation" - "risk_flag" - "task_request" - "care_event" - "need_request" - "family_message" - "consent_update" - "reply_yesno" - "appointment_confirm" - "alert_ack" - "unknown" confidence: { type: "number", minimum: 0, maximum: 1 } slots: type: "object" additionalProperties: false properties: senior_ref: { type: ["string", "null"], maxLength: 128 } free_text: { type: ["string", "null"], maxLength: 2000 } date_time: { type: ["string", "null"], format: "date-time" } mapping_hint: odoo_targets: - model: "x_synergia_intent_event" mode: "create" fields: trace_id: "$.meta.trace_id" channel: "$.meta.channel" actor_id: "$.meta.actor.id" intent_type: "$.result.intent_type" confidence: "$.result.confidence" - id: "synergia.vision_feature_extraction.v1" title: "Description visuelle neutre (photo)" description: "Produit une description factuelle d'une image sans diagnostic." channels: ["webapp_nurse", "portal_family"] permissions_required: ["vision.describe", "media.read"] permissions_denied: ["odoo.write:*", "notify.send"] policy: require_human_approval: false medical_inference: "forbidden" io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: false required: ["image_ref"] properties: image_ref: type: "object" additionalProperties: false required: ["kind", "value"] properties: kind: { type: "string", enum: ["url", "odoo_attachment_id", "blob_id"] } value: { type: "string", minLength: 1, maxLength: 512 } prompt_guardrails: type: "object" additionalProperties: false properties: forbid: type: "array" items: { type: "string" } default: ["diagnosis", "treatment", "cause_of_injury"] output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["caption", "observations"] properties: caption: { type: "string", minLength: 1, maxLength: 800 } observations: type: "array" minItems: 0 maxItems: 20 items: type: "object" additionalProperties: false required: ["label", "evidence"] properties: label: { type: "string", maxLength: 80 } evidence: { type: "string", maxLength: 240 } safety_flags: type: "array" items: { type: "string" } mapping_hint: odoo_targets: - model: "x_synergia_evidence" mode: "create" fields: trace_id: "$.meta.trace_id" kind: "image_caption" content: "$.result.caption" ref: "$.payload.image_ref.value" - id: "synergia.risk_flag_parser.v1" title: "Structuration 'personne à risque' (UI)" description: "Convertit la sélection UI + justification en risk_flag structuré (sans décider)." channels: ["webapp_nurse"] permissions_required: ["classify.intent"] permissions_denied: ["odoo.write:*", "notify.send"] policy: require_human_approval: false requires_reason: true io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: false required: ["reason_code"] properties: reason_code: type: "string" enum: - "fall_risk" - "med_non_adherence" - "confusion_acute" - "dehydration_risk" - "social_isolation" - "unsafe_home" - "other" free_text: { type: ["string", "null"], maxLength: 800 } evidence_refs: type: "array" items: { type: "string", maxLength: 256 } output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["risk_flag"] properties: risk_flag: type: "object" additionalProperties: false required: ["reason_code", "statement", "confidence"] properties: reason_code: { type: "string" } statement: { type: "string", minLength: 1, maxLength: 900 } confidence: { type: "number", minimum: 0, maximum: 1 } mapping_hint: odoo_targets: - model: "x_synergia_risk_flag" mode: "create" fields: trace_id: "$.meta.trace_id" senior_id: "$.meta.context.senior_id" reason_code: "$.result.risk_flag.reason_code" statement: "$.result.risk_flag.statement" confidence: "$.result.risk_flag.confidence" - id: "synergia.binary_reply_parser.v1" title: "Parsing OUI/NON (RCS/SMS/WhatsApp)" description: "Désambiguïse une réponse courte en booléen + fiabilité." channels: ["rcs_sms_whatsapp"] permissions_required: ["classify.intent"] permissions_denied: ["odoo.write:*", "notify.send"] io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: false required: ["raw_reply"] properties: raw_reply: { type: "string", minLength: 1, maxLength: 80 } locale: { type: "string", default: "fr-FR" } output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["value", "confidence", "normalized"] properties: value: { type: ["boolean", "null"] } confidence: { type: "number", minimum: 0, maximum: 1 } normalized: { type: "string", enum: ["yes", "no", "unknown"] } - id: "synergia.call_transcript_builder.v1" title: "Transcription & segments horodatés (WebRTC)" description: "Construit une transcription horodatée segmentée, sans interprétation." channels: ["webrtc"] permissions_required: ["transcript.write"] permissions_denied: ["odoo.write:*", "notify.send"] policy: require_human_approval: false store_audio: "optional" io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: false required: ["audio_ref"] properties: audio_ref: type: "object" additionalProperties: false required: ["kind", "value"] properties: kind: { type: "string", enum: ["url", "blob_id"] } value: { type: "string", minLength: 1, maxLength: 512 } diarization: { type: "boolean", default: true } output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["segments", "language"] properties: language: { type: "string", default: "fr" } segments: type: "array" minItems: 1 items: type: "object" additionalProperties: false required: ["t0_ms", "t1_ms", "speaker", "text"] properties: t0_ms: { type: "integer", minimum: 0 } t1_ms: { type: "integer", minimum: 0 } speaker: { type: "string", maxLength: 64 } text: { type: "string", minLength: 1, maxLength: 600 } mapping_hint: odoo_targets: - model: "x_synergia_call_transcript" mode: "create" fields: trace_id: "$.meta.trace_id" visit_id: "$.meta.context.visit_id" segments_json: "$.result.segments" - id: "synergia.sensor_event_normalizer.v1" title: "Normalisation événements IoT" description: "Unifie le format des événements capteurs (mmWave, pilulier, wearables)." channels: ["iot"] permissions_required: ["sensor.normalize"] permissions_denied: ["odoo.write:*", "notify.send"] io: input_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "payload"] properties: meta: $ref: "https://synergia.example/schemas/SkillInputEnvelope.json#/properties/meta" payload: type: "object" additionalProperties: true required: ["source", "event_type", "ts"] properties: source: { type: "string", maxLength: 64 } event_type: { type: "string", maxLength: 64 } ts: { type: "string", format: "date-time" } output_schema: $schema: "https://json-schema.org/draft/2020-12/schema" type: "object" additionalProperties: false required: ["meta", "result"] properties: meta: $ref: "https://synergia.example/schemas/SkillOutputEnvelope.json#/properties/meta" result: type: "object" additionalProperties: false required: ["sensor_event"] properties: sensor_event: type: "object" additionalProperties: false required: ["type", "timestamp", "attributes"] properties: type: type: "string" enum: ["fall_suspect", "adherence", "presence", "vitals", "unknown"] timestamp: { type: "string", format: "date-time" } attributes: { type: "object", additionalProperties: true } confidence: { type: ["number", "null"], minimum: 0, maximum: 1 }

3) “Policy Set” minimal par canal (recommandation)

Vous pouvez définir une politique simple, réutilisable :

policy_sets: layer1_channels_default: allow_permissions: - "classify.intent" - "vision.describe" - "media.read" - "sensor.normalize" - "transcript.write" deny_permissions: - "odoo.write:*" - "notify.send" - "fs.read" - "fs.write" - "exec.run" require_audit: true require_redaction: true

4) Exemple d’appel (input) et réponse (output)

4.1 WebApp Nurse — “personne à risque”

Input

{ "meta": { "trace_id": "trc_20251219_134401_9K3D", "timestamp": "2025-12-19T13:44:01Z", "tenant_id": "smartco-ch", "channel": "webapp_nurse", "actor": { "type": "human", "id": "usr_idel_1029", "role": "idel" }, "context": { "senior_id": "rp_5561", "visit_id": "vst_8891", "locale": "fr-FR" } }, "payload": { "reason_code": "fall_risk", "free_text": "Instabilité observée au lever, appui mural.", "evidence_refs": ["photo:att_772", "note:obs_19"] } }

Output

{ "meta": { "trace_id": "trc_20251219_134401_9K3D", "skill": "synergia.risk_flag_parser.v1", "version": "1.0.0", "status": "success", "duration_ms": 83, "warnings": [] }, "result": { "risk_flag": { "reason_code": "fall_risk", "statement": "Risque de chute signalé : instabilité au lever (appui mural).", "confidence": 0.86 } } }


5) Point d’attention clé (architecture)

Dans ce manifest, les skills “Anthropic ↔ Synergia” sont volontairement limités à :

  • extraction,
  • normalisation,
  • description neutre,
  • transcription.

Tout ce qui suit (ex. déclencher une alerte IDEL, écrire dans Odoo, notifier famille, escalader) doit être défini comme Skills Synergia couche 2 avec :

  • permissions explicites odoo.write:x_synergia_*,
  • approvals si nécessaire,
  • audit trail renforcé.

En Skills synergia couche 2