# C4-05 livrée (RM-081/RC-081) — mémoires opérationnelles : provenance et continuité, canari :8792 14/14

- Publié : 2026-10-24T04:28:30Z
- Chantier : agent-conjoineur-c4-05
- Type : final_report · révision v1 · contenu sha256:6dba1e31fbc6dadd9…

Broker branché sur la base prod (canari :8792, ordre d'autorisation e2e), contrat de provenance v1 par les outils (100 % mission/outil/commit/source vs 7,1 % archivés), épistémique P3-06 adoptée additivement, APIs de graphe autorisées et paginées, leçons PULL ; critère final (deux agents, reprise, invalidations) TRUE in vivo ; bascule :8790 = GO opérateur.

## C4-05 — Mémoires opérationnelles : provenance et continuité du Knowledge Fabric

**Statut : done — critère final validé IN VIVO (canari :8792 branché sur la base prod, 14/14 PASS).**

### Ce qui a changé et où
- **A. Broker↔noyau** : Context Hub P3-04 déployé et validé — service canari `kf-hub.service` :8792 (loopback, user kfcore, durcissement identique au noyau), branché sur la MÊME base prod kf_prod_v1 ; tick 2 min (pompe outbox → distribution sélective) + backfill (reprise idempotente). Ordre IDENTITÉ→AUTORISATION→SOURCES→PERTINENCE→BUDGET→LIVRAISON vérifié e2e (401/403 en direct). Port 8791 évité (occupé par une mission parallèle C4-01 — jamais touché).
- **B. Provenance** : contrat v1 capturé PAR LES OUTILS (`operational_memory.provenance`, CLI HTTP pur, Idempotency-Key, Used jamais inventée) ; noyau : Used inconnue → 400 lisible (avant : 500 SQL) ; les remplacements de version portent désormais source+activité+Used (ReplaceIn).
- **C. Épistémique** : pose additive au registre sur kf_prod_v1 de `kf_q_*` (020, P3-06) ET `kf_promotion` (004, P3-08 — absent de prod, 500 latent sur /promote) ; les 7 états dérivés exposés (validation-state), une proposition d'agent ne devient jamais une décision.
- **D. Impact** : `GET /graph/objects/{id}/impact` (moteur P3-06, fermeture bornée d=5, cache par empreinte), jamais de révocation automatique (`never` énoncé dans la réponse).
- **E. Mémoire des erreurs** : `/context/lessons` (PULL uniquement — jamais d'avertissement non sollicité), autorisation AVANT sélection, budget de caractères, dégradable ; ingestion des échecs rendue dégradable.
- **F. APIs graphe** : 9 routes `/graph/*` (dépendances, origines, contradictions, décisions, missions, impact, validation, used-by) — autorisation avant réponse (`filtered_out` honnête), pagination, budgets, aucun LLM.
- **Corrections opportunistes** : FTS du hub muet en français (« simple » vs index « french ») — toute recherche française multi-terme échouait ; relations vivantes dans le flux (`kf.relation.proposed/decided` + pompe, double filtre par destinataire).
- Git : branche `mission/c4-05-operational-memory` (base P3-10, commits 17edc30, 0b740e7, 8bd81da), NON fusionnée. Production : DDL additif uniquement + pilotes `ops-memoire`. Le noyau :8790 INTACT.

### Ce qui a été testé (résultats observés)
- tests dédiés 19/19 ; non-régression : noyau 38, hub 13, qualité 24 (verts).
- **Canari in vivo avec 4 acteurs/jetons réels** : B enregistre une information SOURCÉE via le contrat v1 (empreinte sha256) ; A la récupère (budget+score), la RÉUTILISE après interruption (même version v1 re-servie) ; révocation → invalidation priorité 3 reçue par le lecteur ET l'abonné, RIEN pour l'acteur sans périmètre. **CRITÈRE FINAL : TRUE.**
- Mesures G : archives = 7,1 % sources avec empreinte, 0,1 % Used, 6,3 % mission, 0/8 relations sourcées → fenêtre contrat v1 = **100 %** mission/outil/commit/source, zéro donnée fictive (l'inconnu reste inconnu).

### Rapports
- RM-081 (publié, coffre + site) et RC-081 (coffre — frontière P3-02/P3-08 : publication publique d'un RC exige une version expurgée validée par l'opérateur).
- Livrables : docs/architecture/knowledge-fabric/phase-4/operational-memory/ (README + 00–08) — branche mission.

### Partiel / reste (assumé)
- Bascule prod :8790 = **GO opérateur** (runbook 08, une commande) ; le canari :8792 reste en service des pilotes.
- useless_context_ratio sans signification (le canari ne fait pas d'ack) ; knowledge_reused_across_missions prod = 0 (primitives prêtes).
- launcher_adapter en dry-run par défaut : brancher `--post` sur une mission réelle.

### Déployer / vérifier / annuler
- Vérifier : `curl 127.0.0.1:8792/internal/v1/kf/context/health` → up ; `systemctl is-active kf-hub kf-hub-tick.timer`.
- Bascule : runbook 08 (unité éditée 8792→8790 + restart kf-core).
- Rollback : `systemctl disable --now kf-hub kf-hub-tick.timer` (1) ; réinstaller l'unité antérieure du :8790 (2) ; `DROP TABLE kf_q_impact_cache, kf_q_failure, kf_promotion` (3, DDL additif réversible). Aucune donnée append-only détruite.