# ScopeRail logging and redaction checklist

Version 1.0 · Public working artifact

Observability should explain the route without silently creating a second copy
of customer data. Hashing an identifier does not automatically make it
anonymous.

## Log the event, not the conversation

- [ ] Generate a request or trace identifier that contains no business meaning.
- [ ] Record the workflow and stage identifier.
- [ ] Record the policy outcome as a bounded category.
- [ ] Record source references and versions, not unrestricted source content.
- [ ] Record the eligible tool catalogue version.
- [ ] Record selected tool identifier and version.
- [ ] Record argument validation success or failure without secrets.
- [ ] Record result class: success, empty, partial, denied, timeout, malformed or
      failed.
- [ ] Record action state transitions.
- [ ] Record duration and resource use needed for operation.
- [ ] Record the model and provider identifier when a model was actually called.

## Do not log by default

- [ ] Full prompts or conversation history.
- [ ] Raw retrieved chunks.
- [ ] Full tool arguments or results.
- [ ] Access tokens, API keys, cookies, signatures or authorization headers.
- [ ] Passwords, reset links or one-time codes.
- [ ] Personal data unrelated to diagnosis.
- [ ] Cross-tenant identifiers in shared logs.
- [ ] Pending-action payloads containing sensitive business values.
- [ ] Turnstile, OAuth or other single-use verification tokens.

## Redaction order

1. **Avoid collection.** Do not create the field when it is unnecessary.
2. **Allowlist.** Emit only known operational fields.
3. **Classify.** Mark public, internal, confidential and restricted values.
4. **Transform.** Replace sensitive values before they reach the logger.
5. **Bound.** Limit length and cardinality.
6. **Review.** Test representative and adversarial payloads.

## Structured event example

```json
{
  "traceId": "opaque-reference",
  "workflow": "support-ticket-draft",
  "stage": "tool_result",
  "policyOutcome": "allowed",
  "tool": "ticket.context.read@2",
  "resultClass": "partial",
  "durationMs": 184,
  "recovery": "ask_for_missing_information"
}
```

This example is a shape, not a required taxonomy or performance target.

## Access and retention

- [ ] Name the team allowed to inspect traces.
- [ ] Separate operational access from product-data access.
- [ ] Define retention by purpose, not convenience.
- [ ] Delete or aggregate data when the purpose expires.
- [ ] Prevent traces from becoming a retrieval source by default.
- [ ] Audit exports and debugging tools.
- [ ] Document provider-side logging and retention separately.

## Test the redaction path

- [ ] Header injection and control characters.
- [ ] Credentials embedded in text.
- [ ] Personal data in tool errors.
- [ ] Oversized tool result.
- [ ] Nested objects and arrays.
- [ ] Unexpected fields after a provider or schema update.
- [ ] Failure inside the redactor itself.

On redaction failure, drop the unsafe field or event. Do not fall back to raw
logging.

## Related public references

- [NIST AI Risk Management Framework](https://www.nist.gov/publications/artificial-intelligence-risk-management-framework-ai-rmf-10)
- [OWASP Top 10 for LLM Applications 2025](https://owasp.org/www-project-top-10-for-large-language-model-applications/assets/PDF/OWASP-Top-10-for-LLMs-v2025.pdf)
- [MCP Security Best Practices](https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices)

---

# Checklist de journalisation et de masquage ScopeRail

Version 1.0 · Artefact public de travail

L’observabilité doit expliquer le parcours sans créer en silence une seconde
copie des données client. Hacher un identifiant ne le rend pas automatiquement
anonyme.

## Journaliser l’événement, pas la conversation

- [ ] Générer un identifiant de requête ou de trace sans signification métier.
- [ ] Noter le parcours et l’étape.
- [ ] Noter l’issue de la règle dans une catégorie bornée.
- [ ] Garder les références et versions de sources, pas leur contenu complet.
- [ ] Noter la version du catalogue d’outils éligibles.
- [ ] Noter l’identifiant et la version de l’outil retenu.
- [ ] Noter la réussite ou l’échec de validation des arguments sans conserver de
      secret.
- [ ] Noter la classe du résultat : succès, vide, partiel, refusé, délai dépassé,
      invalide ou en échec.
- [ ] Noter les transitions d’une action.
- [ ] Garder les durées et ressources nécessaires à l’exploitation.
- [ ] Noter le modèle et le fournisseur uniquement lorsqu’un modèle a été appelé.

## Ne pas journaliser par défaut

- [ ] Les prompts complets ou l’historique de conversation.
- [ ] Les passages documentaires bruts.
- [ ] Les arguments ou résultats complets des outils.
- [ ] Les jetons d’accès, clés API, cookies, signatures ou en-têtes
      d’autorisation.
- [ ] Les mots de passe, liens de réinitialisation ou codes temporaires.
- [ ] Les données personnelles sans utilité pour le diagnostic.
- [ ] Les identifiants entre tenants dans des journaux partagés.
- [ ] Les propositions d’action contenant des valeurs métier sensibles.
- [ ] Les jetons Turnstile, OAuth ou autres preuves à usage unique.

## Ordre de traitement

1. **Éviter la collecte.** Ne pas créer un champ inutile.
2. **Autoriser explicitement.** N’émettre que les champs opérationnels connus.
3. **Classer.** Distinguer public, interne, confidentiel et restreint.
4. **Transformer.** Remplacer les valeurs sensibles avant le logger.
5. **Borner.** Limiter longueur et cardinalité.
6. **Tester.** Utiliser des charges représentatives et hostiles.

## Accès et conservation

- [ ] Nommer l’équipe qui peut consulter les traces.
- [ ] Séparer l’accès opérationnel de l’accès aux données produit.
- [ ] Définir la conservation selon le besoin, pas selon la commodité.
- [ ] Supprimer ou agréger lorsque le besoin disparaît.
- [ ] Éviter que les traces deviennent automatiquement une source documentaire.
- [ ] Auditer les exports et outils de diagnostic.
- [ ] Documenter séparément la journalisation des fournisseurs.

En cas d’échec du masquage, supprimer le champ ou l’événement dangereux. Ne
jamais revenir au contenu brut.

