[ 
https://issues.apache.org/jira/browse/CAMEL-25499?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Luigi De Masi reassigned CAMEL-25499:
-------------------------------------

    Assignee: Luigi De Masi

> camel-semantic: Design audit SPI, TUI history and observability hooks
> ---------------------------------------------------------------------
>
>                 Key: CAMEL-25499
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25499
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-ai, camel-jbang, camel-telemetry
>            Reporter: Luigi De Masi
>            Assignee: Luigi De Masi
>            Priority: Major
>         Attachments: camel-semantic-audit-tui.png, 
> camel-semantic-audit-tui.svg
>
>
> h2. Purpose and status
> Design discussion for pluggable semantic auditing and an Audit view in Camel 
> TUI, building on CAMEL-25491 / [PR 
> #27602|https://github.com/apache/camel/pull/27602]. This issue captures a 
> brainstorm and its open questions; it does not claim an implemented audit 
> API, accepted upstream design or scheduled release.
> The implementation baseline inspected on 9 October 2026 is PR #27602 at 
> {{0dcb5c2f15078331c0df2aad860d71c32e276c75}} (open at the time of 
> inspection). It provides contract-driven Definitions, Experts and 
> Relationships views, runtime metadata, explicit named-definition sample 
> evaluation and direct expert calls, and bounded asynchronous 
> connector/console evaluation.
> The starting observation is [Claus's CAMEL-25311 
> comment|https://issues.apache.org/jira/browse/CAMEL-25311?focusedCommentId=18123470&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-18123470]:
>  the expert's result, the policy applied and the action enforced by the 
> caller must remain distinct. The same runtime evidence could support 
> monitoring and an audit trail, with different consumers and delivery 
> requirements.
> h2. Relationship to existing work
> * CAMEL-25491 / PR #27602 supplies the concrete runtime, connector and TUI 
> baseline. Extend its Semantic tooling with a fourth Audit view.
> * CAMEL-25357 already proposes a recent-evaluation recorder, bounded buffer 
> and console-backed view. Coordinate with and reuse/refine that recorder; do 
> not introduce a competing recent-evaluation mechanism. This issue develops 
> the pluggable backend contract, linked route-decision records, enablement 
> semantics and shared observation lifecycle beyond that proposal.
> * CAMEL-23369 tracks broader GenAI observability. The common semantic hooks 
> proposed here should feed that effort through existing Camel telemetry 
> infrastructure, rather than create an independent OpenTelemetry SDK/exporter 
> configuration.
> * CAMEL-25382 supplies expert-owned contracts, shared validation and typed 
> result semantics.
> * CAMEL-25311 supplies the Wolf Defender example and the original 
> observability discussion. The proposed audit API must remain 
> provider-independent and also support ordinary business 
> classification/scoring.
> h2. Working requirements from the brainstorm
> * Audit capture runs in the integration and continues without a connected TUI.
> * Audit backends are pluggable. Writing and querying are separate 
> capabilities so a write-only destination does not have to implement browsing.
> * Auditing and OpenTelemetry can be enabled independently. Audit enabled with 
> OpenTelemetry disabled is a supported combination.
> * A master audit setting supplies the default. An explicit per-expert value 
> overrides it in either direction. Experts without an override inherit the 
> master value.
> * Overrides identify configured expert instances by their registry bean name, 
> not by provider class or static annotation identity.
> * Disabling audit capture does not disable inference, erase retained records 
> or prevent reading existing history.
> * The UI is a screen inside the existing Camel TUI. No webpage is proposed.
> * Configuration placement remains open: application properties, semantic DSL, 
> or both. The examples below describe alternatives, not existing supported 
> syntax.
> h2. Record model: evaluation evidence and route decisions
> Use immutable, append-only records with two principal categories:
> * *Evaluation*: which expert operation ran, its typed result and documented 
> meaning, optional probability/confidence, duration and execution status. 
> Camel captures this at the semantic runtime boundary.
> * *Decision*: the route/policy's explicit action (for example allow, block, 
> review, quarantine or continue), policy identity and reason, referencing the 
> evaluation record(s) that supported it.
> An expert returning {{true}} for an injection operation does not prove that 
> the route blocked a request. A permitted tool call does not establish 
> successful tool execution. A policy can use several evaluations or make a 
> decision without one; keep those relationships explicit. A later decision 
> references earlier evaluation records instead of mutating them.
> Provide a route-facing API usable through normal Camel Java and YAML/XML bean 
> invocation to record application decisions. Do not infer business policy 
> meaning from an arbitrary Choice/Switch branch. The API shape and how a route 
> obtains the relevant invocation references remain design questions.
> h3. Table fields and their ownership
> ||Field||Meaning / source||
> |Timestamp|Event occurrence time, stored in UTC; display timezone is a 
> presentation choice.|
> |Decision / action|Explicit route/policy action; absent for an evaluation 
> alone.|
> |Category|Evaluation or decision. Lifecycle/request observations may require 
> an additional discriminator.|
> |Operation|Application operation such as {{tools/call}}; keep the expert 
> operation, such as {{injection}}, separately.|
> |Target|Logical tool, resource or business target supplied by the 
> application. An evaluation row can display its definition name as its target.|
> |Namespace|Optional application/tenant namespace from trusted application 
> context or configuration; do not infer it from arbitrary inbound headers.|
> |Reason code|Stable runtime or application-policy code; keep explanatory text 
> separate. A code such as {{governance_no_match}} cannot determine allow/block 
> by itself.|
> |Correlation ID|Application correlation identifier. Keep Camel exchange 
> identifiers and tracing identifiers as distinct fields.|
> |Details|Structured evidence and linked records, shown in the TUI inspector.|
> Additional detail fields:
> * Schema version, unique event ID, invocation ID, optional batch/attempt 
> identifiers, and links to supporting evaluation events.
> * Application/Camel context, route and processor IDs where available.
> * Named definition when present, expert bean reference and static 
> provider/operation identity.
> * Origin: route execution, definition sample, or direct expert call. Do not 
> claim a particular client identity unless it was propagated and is known.
> * Typed result and its meaning, optional scalar/label probabilities and 
> confidence, with expert-defined semantics. Missing values stay absent.
> * Allowlisted provider/model/revision metadata and supplied policy 
> ID/version/rule.
> * Duration, execution status and sanitized failure code. Failures, invalid 
> results and uncertain outcomes retain their declared semantics; they do not 
> become benign answers.
> Capture the permitted result semantics needed to interpret historical 
> records. In particular, PR #27602's {{scoreLevelsParameter}} and submitted 
> level descriptions must not be replaced by today's edited definition when 
> displaying an older score. Sensitive descriptions can be omitted/redacted.
> h2. Proposed runtime and backend boundary
> Illustrative names and signatures, subject to discussion:
> {code:java}
> public interface SemanticAuditSink extends Service {
>     void append(SemanticAuditRecord record) throws Exception;
> }
> public interface SemanticAuditReader {
>     SemanticAuditPage query(SemanticAuditQuery query);
>     Optional<SemanticAuditRecord> get(String eventId);
> }
> {code}
> Register configured backends as ordinary Camel beans. A context-managed audit 
> service handles lifecycle and dispatch. Multiple sinks can receive the same 
> record; configure the reader used by the TUI explicitly. The sink 
> acknowledgment/durability contract, threading requirements and pagination 
> contract need definition before implementation.
> Candidate initial backends:
> * A bounded in-memory recorder/reader for recent TUI history, coordinated 
> with CAMEL-25357. Report capacity and evictions; this is not durable storage.
> * Structured JSON logging to integrate with existing collection 
> infrastructure.
> * The SPI permits database, messaging and external audit-service integrations 
> without provider-specific changes. Which persistent backend belongs in the 
> first implementation remains open.
> h3. Capture points in PR #27602
> * {{SemanticLanguage}} has named-expression/batch execution and a separate 
> {{evaluate(SemanticEvaluation, Object)}} direct path. Cover both, including 
> common validation failures; instrumenting only {{SemanticEvaluateConsole}} 
> would miss normal routes.
> * Preserve input validation before batch provider calls. Distinguish 
> completed members, failed groups and members never executed if a later group 
> fails. Do not split a provider's optimized batch into individual calls merely 
> to audit it.
> * Give repeated expressions, nested evaluations and redelivery attempts 
> distinct invocation identities. Export retries retain the same event ID.
> * {{SemanticEvaluateConsole}} supplies sample/direct origin and request 
> identity. Completion must not be recorded twice merely because both the 
> console and language observe it.
> * Startup validation and metadata discovery do not perform inference or 
> produce fabricated evaluation records.
> * Console timeout/disconnect requests cancellation but may not stop 
> native/remote inference. Record the request outcome separately from observed 
> provider completion, linked by invocation ID. Define late-completion handling 
> explicitly.
> h3. Data handling and delivery
> * Create safe immutable snapshots before asynchronous dispatch. Do not retain 
> the live {{Exchange}}, mutable provider objects, message body, input text, 
> headers, credentials or unfiltered exception messages.
> * Apply allowlisting/redaction and size bounds before records reach any sink, 
> query endpoint or telemetry consumer. Provider metadata is not a blanket 
> permission to persist arbitrary data.
> * Proposed initial delivery is bounded and asynchronous, with visible backend 
> errors, dropped-record counters and lifecycle-aware shutdown. Observer 
> failures must not rewrite expert results or route policy actions.
> * Document whether a successful append means queued, written or durably 
> committed. A memory record does not prove another sink persisted it. Retries 
> and deduplication must use stable event IDs.
> * Guaranteed recording before a protected side effect would require a 
> separate explicit delivery mode. It is not promised by this brainstorm's 
> asynchronous baseline. Crash behavior, partial delivery, backpressure and 
> retention are open design details.
> h2. Audit enablement semantics
> The master setting is a default that explicit expert settings can override, 
> not an unconditional disable-all control:
> ||Master||Expert override||Effective evaluation audit||
> |false|omitted|disabled|
> |false|true|enabled|
> |false|false|disabled|
> |true|omitted|enabled|
> |true|true|enabled|
> |true|false|disabled|
> For example, master enabled + {{security=true}} + {{decisions=false}} audits 
> the security expert but not the decision expert. Setting the master to false 
> still audits {{security}} because its explicit true wins. Removing that 
> override restores inheritance.
> Use cases include retaining guardrail evidence without all routine 
> classifications, reducing volume from frequently invoked experts, and 
> enabling targeted investigation for one configured instance. Per-expert 
> filtering concerns evaluation records. The treatment of explicitly recorded 
> route decisions, particularly decisions based on multiple experts, must be 
> specified independently; do not arbitrarily inherit one supporting expert's 
> filter.
> h3. Open point: configuration placement
> Both properties and the semantic DSL are valid candidates. No choice was made 
> in the brainstorm.
> * Properties support deployment-specific settings and centralized operator 
> overrides, but separate audit choices from the route definitions they affect.
> * DSL settings make the relationship visible and versioned with declarations, 
> but couple operational capture choices to route resources and their reload 
> behavior.
> * Supporting both needs a documented precedence and reload model. Avoid 
> multiple conflicting authorities.
> Properties illustration (*proposed audit keys; not available in PR #27602*):
> {code:properties}
> camel.semantic.audit.enabled=true
> camel.semantic.audit.experts.security.enabled=true
> camel.semantic.audit.experts.decisions.enabled=false
> # Independent existing Camel OpenTelemetry2 setting
> camel.opentelemetry2.enabled=false
> {code}
> Alternative DSL illustration (*proposed syntax; not available in PR #27602*):
> {code:yaml}
> - semantic:
>     audit:
>       enabled: true
>       experts:
>         security:
>           enabled: true
>         decisions:
>           enabled: false
>     evaluation:
>       screenPrompt:
>         expert: security
>         operation: injection
>         state: "${body}"
> {code}
> The audit settings belong to the semantic framework, not provider bean 
> properties or the static {{@SemanticExpert}} contract. The default value when 
> nothing is configured, whether changes are live, and validation of 
> unknown/late-registered expert references remain open.
> h2. Shared foundation for observability
> Use provider-independent semantic lifecycle hooks and a shared safe metadata 
> model. Audit recording and OpenTelemetry instrumentation consume those hooks 
> independently:
> {noformat}
> Semantic evaluation start / completion + explicit route decision
>     |-- audit consumer --> configured sinks --> reader --> TUI
>     `-- telemetry consumer --> Camel telemetry / configured SDK exporters
> {noformat}
> Completed records can supply structured events and counters. Full tracing 
> also needs start/completion hooks and parent context propagation, including 
> across the bounded executor boundaries introduced by #27602. Hook names and 
> interfaces remain illustrative; keep OpenTelemetry types/dependencies outside 
> the generic semantic API.
> * Support audit on / telemetry off, audit off / telemetry on, and both on.
> * The agreed audit master and expert overrides govern audit capture. 
> Telemetry uses its own configuration; trace sampling must not suppress audit 
> records.
> * Reuse Camel telemetry / {{camel-opentelemetry2}} integration and coordinate 
> with CAMEL-23369. Do not introduce another independently configured SDK or 
> OTLP client.
> * Preserve expert results and caller actions separately in telemetry. 
> Successful detection of injection is not an inference failure.
> * Keep high-cardinality correlation IDs out of metric labels. Preserve them 
> in records/traces where appropriate.
> * Apply guardrail conventions only to relevant operations, not all business 
> classifications/scores.
> [OpenTelemetry guardrail PR 
> #427|https://github.com/open-telemetry/semantic-conventions-genai/pull/427] 
> is still open at inspected head {{7b8e842f84db31d0c8784ff26390d0eba9414593}}. 
> Its [current event 
> definition|https://github.com/open-telemetry/semantic-conventions-genai/blob/7b8e842f84db31d0c8784ff26390d0eba9414593/model/gen-ai/events.yaml]
>  uses {{gen_ai.guardrail.result}}; names have evolved since the original 
> comment. Keep the mapping versioned and isolated from the audit schema 
> instead of treating draft names as a stable Camel API.
> h2. TUI integration and mockup
> Add *Audit* alongside *Definitions*, *Experts* and *Relationships* in the 
> Semantic screen from #27602. The attached mockup follows those screens' 
> orange focus accents, blue selection, terminal frame and keyboard hints. It 
> uses illustrative data and is not an implemented screen.
> !camel-semantic-audit-tui.png|width=1200!
> Attachments: [PNG preview|^camel-semantic-audit-tui.png] and [editable 
> SVG|^camel-semantic-audit-tui.svg].
> * A chronological table shows the fields above, with a selected-record 
> inspector separating route decision from linked evaluation evidence.
> * Filter by time, category, action, expert, route, namespace and correlation 
> ID. Use bounded cursor-based queries and preserve selected event identity 
> during refresh.
> * Show effective audit master/expert settings, telemetry state, selected 
> backend, retention/evictions and delivery problems. Disabled capture and 
> empty history must be distinguishable.
> * Use text labels as well as colors. Adapt columns to terminal width, moving 
> secondary fields into details when needed.
> * Query through {{SemanticTab}} / a focused {{SemanticAuditView}}, 
> {{MonitorContext.executeIndependentAction}}, a new {{semantic-audit}} 
> connector action and a read-only {{SemanticAuditConsole}} backed by the 
> configured reader.
> * Keep audit query state separate from the definition metadata snapshot. 
> Browsing history must not require that an old definition still exists or run 
> an expert.
> * Extend {{LocalCliConnector}}'s request-specific asynchronous dispatch for 
> potentially slow audit queries, with bounds independent of inference workers. 
> Preserve its stop/disconnect behavior and avoid blocking normal 
> polling/control actions.
> * Reuse {{SemanticResultView}} formatting helpers using captured semantics; 
> remove playground-specific draft/retry instructions from historical records.
> * Extend the existing TUI MCP inspection surface with visible audit rows, 
> filters and selected details. This is inspection, not inference replay.
> h2. Proposed validation and completion criteria
> Before implementation, settle API/data ownership, configuration placement, 
> delivery/acknowledgment semantics and coordination with CAMEL-25357 / 
> CAMEL-23369.
> An implementation should then demonstrate:
> # Named, direct, nested and batch evaluations produce correctly correlated 
> records without changing provider invocation count, policy interpretation or 
> normal Camel error handling.
> # Input/result failures, provider errors, redelivery, timeouts, cancellation 
> requests and late completion are represented accurately without stale or 
> duplicate outcomes.
> # All six master/override combinations above work by expert instance, and 
> audit-only / telemetry-only operation works independently.
> # Explicit decisions can reference multiple evaluations; their recording 
> policy is documented separately from expert filtering.
> # No submitted content, secrets, mutable exchange state or unfiltered 
> provider metadata leaks through storage, querying, TUI or telemetry.
> # Bounded capacity, concurrency, sink failure, partial delivery, retry 
> identities and shutdown/restart behavior match the documented contract. No 
> durability claim exceeds backend guarantees.
> # The TUI remains responsive during slow inference/backend queries, handles 
> paging/eviction/disconnection and shows historical result semantics correctly.
> # Relevant documentation, console descriptors/catalog mirrors and tests are 
> updated without expanding the static expert contract into an audit-backend 
> contract.
> _Generated by OpenAI Codex on behalf of @luigidemasi._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to