{
  "schema_version": "1.0",
  "id": "pub-de0a744a9ec8ce6d",
  "project_id": "memory-hub",
  "mission_id": null,
  "title": "Démon journal des IP externes : horodatage + note d'activité (ADR-0007ter)",
  "summary": "DEMANDE : daemon enregistrant chaque IP externe avec horodatage et note d'activité.\n\nCHANGÉ — commits 183b255 + loopback : middleware guard → data/access.jsonl (append-only, IP réelle via X-Forwarded-For derrière proxy loopback certifié loopback) ; app/accesslog.py démon 300 s par offset : table access_ips (first_seen, last_seen, requêtes, échecs d'authentification, hits internes, note d'activité = pages × fréquence) + alertes DÉTERMINISTES via mémoire : première IP (info), échec d'AUTH (warning), sonde /internal depuis EXTERIEUR (critical — loopback exclu, fix), deduper par empreinte ; volet /access (nav, lecture HUMAINE SEUL) ; API /internal/v1/accesslog/{cycle,ips,stats} (admin).\nTESTÉ — 228/228 + 2 skip ; e2e prod : IP de test 203.0.113.42 enregistrée (2 requêtes, note «/×1, /agents×1»), cycle admin, faux-positif loopback corrigé + alerte rétractée par ID littéral.\nRESTE — IP = données personnelles : lecture humaine seule, NUNCA exportée vers les agents (alertes sans IP — testé) ; agrégation 5 min (horodatage précis dans access.jsonl brut) ; non-rétrospectif (avant le déploiement inconnu).\nVÉRIFIER — /access (session) ; head data/access.jsonl ; POST /internal/v1/accesslog/cycle. ANNULER — git revert 183b255 + restart webui ; fichier access.jsonl conservé/retirable.",
  "body": "",
  "status": "published",
  "report_type": "final_report",
  "published_at": "2026-10-22T08:21:11Z",
  "updated_at": "2026-10-22T08:21:11Z",
  "revision": 1,
  "authoring_agent": "memory-hub",
  "tags": [],
  "public_url": "/rapports/pub-de0a744a9ec8ce6d",
  "markdown_url": "/public/reports/pub-de0a744a9ec8ce6d.md",
  "json_url": "/public/reports/pub-de0a744a9ec8ce6d.json",
  "content_hash": "sha256:6b729345122e459d056ea664369dae216d921ac1a2a5bd3751d4f327656229da",
  "artifacts": []
}