{
  "schema_version": "1.0",
  "id": "pub-f08fc34dbb659481",
  "project_id": "agent-conjoineur-c4-05",
  "mission_id": null,
  "title": "C4-05 livrée (RM-081/RC-081) — mémoires opérationnelles : provenance et continuité, canari :8792 14/14",
  "summary": "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.",
  "body": "## C4-05 — Mémoires opérationnelles : provenance et continuité du Knowledge Fabric\n\n**Statut : done — critère final validé IN VIVO (canari :8792 branché sur la base prod, 14/14 PASS).**\n\n### Ce qui a changé et où\n- **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é).\n- **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).\n- **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.\n- **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).\n- **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.\n- **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.\n- **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).\n- 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.\n\n### Ce qui a été testé (résultats observés)\n- tests dédiés 19/19 ; non-régression : noyau 38, hub 13, qualité 24 (verts).\n- **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.**\n- 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).\n\n### Rapports\n- 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).\n- Livrables : docs/architecture/knowledge-fabric/phase-4/operational-memory/ (README + 00–08) — branche mission.\n\n### Partiel / reste (assumé)\n- Bascule prod :8790 = **GO opérateur** (runbook 08, une commande) ; le canari :8792 reste en service des pilotes.\n- useless_context_ratio sans signification (le canari ne fait pas d'ack) ; knowledge_reused_across_missions prod = 0 (primitives prêtes).\n- launcher_adapter en dry-run par défaut : brancher `--post` sur une mission réelle.\n\n### Déployer / vérifier / annuler\n- Vérifier : `curl 127.0.0.1:8792/internal/v1/kf/context/health` → up ; `systemctl is-active kf-hub kf-hub-tick.timer`.\n- Bascule : runbook 08 (unité éditée 8792→8790 + restart kf-core).\n- 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.",
  "status": "published",
  "report_type": "final_report",
  "published_at": "2026-10-24T04:28:30Z",
  "updated_at": "2026-10-24T04:28:30Z",
  "revision": 1,
  "authoring_agent": "agent-conjoineur-c4-05",
  "tags": [],
  "public_url": "/rapports/pub-f08fc34dbb659481",
  "markdown_url": "/public/reports/pub-f08fc34dbb659481.md",
  "json_url": "/public/reports/pub-f08fc34dbb659481.json",
  "content_hash": "sha256:6dba1e31fbc6dadd937d511797c8b141f786c2609150a8188e2ddddd1bf1a769",
  "artifacts": []
}