From 3742fc63fed41514aa01d4aa159596c66623337f Mon Sep 17 00:00:00 2001 From: IgorRachkov <89467086+igor04091968@users.noreply.github.com> Date: Sun, 14 Jun 2026 14:34:48 +0300 Subject: [PATCH] docs(portal): document request correlation contracts --- .../detmir-portal/src/production/request_context.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/adk-rust/crates/detmir-portal/src/production/request_context.rs b/adk-rust/crates/detmir-portal/src/production/request_context.rs index e3e561c..7ffb734 100644 --- a/adk-rust/crates/detmir-portal/src/production/request_context.rs +++ b/adk-rust/crates/detmir-portal/src/production/request_context.rs @@ -1,3 +1,11 @@ +//! Request correlation and route classification for portal observability. +//! +//! This module derives a low-cardinality route name, business module and role +//! label for each request. These fields are used by structured logs and metrics. +//! +//! CONTRACT: generated route names must not expose volatile identifiers such as +//! case IDs, candidate IDs or evidence IDs; use route templates instead. + use std::cell::RefCell; use std::sync::atomic::{AtomicU64, Ordering}; use std::time::{Instant, SystemTime, UNIX_EPOCH}; @@ -93,6 +101,9 @@ fn resolve_request_ids( } fn sanitize_request_token(value: String) -> String { + // SECURITY: log correlation tokens are accepted from reverse proxies and + // clients, so strip control characters and path separators before they reach + // logs or metric labels. Truncation bounds accidental high-cardinality input. value .chars() .filter(|ch| ch.is_ascii_alphanumeric() || matches!(ch, '-' | '_' | '.' | ':'))