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
| Usage | Skill Anthropic | Rôle exact | Sortie |
| Texte libre / notes | intent_extraction | Extraire intention clinique sans juger | intent_type, confidence |
| Checklists | form_normalizer | Normaliser checklist UI → JSON | visit_event |
| Photos (plaies, pilulier) | vision_feature_extraction | Décrire visuellement sans diagnostic | visual_observation[] |
| Bouton “personne à risque” | risk_flag_parser | Structurer le signal + justification humaine | risk_flag{reason, free_text} |
| Vitaux saisis | medical_value_parser | Validation 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
| Usage | Skill | Rôle | Sortie |
| Texte incident | event_classification_light | Classifier sans gravité | care_event_type |
| Besoin exprimé | need_structuring | Structurer demande | need_request{category} |
| Journal quotidien | daily_log_normalizer | Structuration narrative → événements | care_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 @Armel> Canal émotionnel + consentement, sans médicalisation.
Objectif
Canal émotionnel + consentement, sans médicalisation.
Skills Anthropic recommandés
| Usage | Skill | Rôle | Sortie |
| Message texte | message_intent_tagging | Tagging sémantique simple | family_message{topic} |
| Photo envoyée | image_captioning_safe | Description neutre | media_post{caption} |
| Consentement | consent_statement_parser | Vérifier complétude | consent_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
| Usage | Skill | Rôle | Sortie |
| OUI / NON | binary_reply_parser | Désambiguïsation stricte | reply_yesno{value} |
| Confirmation RDV | appointment_confirmation_parser | Parsing contextuel | appointment_confirm{id} |
| Accusé réception | acknowledgement_parser | Marquer réception | alert_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
| Usage | Skill | Rôle | Sortie |
| Voix → texte | speech_to_text | Transcription horodatée | call_transcript |
| Analyse conversation | intent_candidate_extraction | Proposer intentions possibles | intent_candidates[] |
| Pièces évoquées | evidence_reference_extractor | Lier propos → preuves | evidence_snippets[] |
| Résumé | neutral_call_summary | Résumé factuel, non interprétatif | summary_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
| Usage | Skill | Rôle | Sortie |
| Événement capteur | sensor_event_normalizer | Unification formats | sensor_event{type} |
| Détection chute | pattern_labeler | Étiquetage probabiliste | fall_suspect{confidence} |
| Observance | adherence_event_builder | Écart planifié / réel | adherence{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 skill | Autorisé couche 1 | Justification |
| Intent extraction | ✅ | Instrumentation |
| Vision captioning | ✅ | Observation factuelle |
| Speech-to-text | ✅ | Preuve primaire |
| Classification légère | ✅ | Pré-tri |
| Résumé neutre | ✅ | Lisibilité |
| Recommandation | ❌ | Décision |
| Orchestration | ❌ | Métier |
| Priorisation | ❌ | Responsabilité |
| Appel API métier | ❌ | Couche 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 :
- permissions déclaratives (policy layer)
- schémas JSON exacts (JSON Schema Draft 2020-12) pour inputs et outputs
- enveloppe d’audit standard (trace_id, actor, channel, evidence_refs)
- 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é.