<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hadeel Sharaf</title>
    <description>The latest articles on DEV Community by Hadeel Sharaf (@hadeelsharaf).</description>
    <link>https://dev.to/hadeelsharaf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F996202%2F1135346c-612f-4396-af5d-34d20e13f121.jpeg</url>
      <title>DEV Community: Hadeel Sharaf</title>
      <link>https://dev.to/hadeelsharaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hadeelsharaf"/>
    <language>en</language>
    <item>
      <title>Semantic Code Intelligence: Helping AI Agents Navigate Codebases</title>
      <dc:creator>Hadeel Sharaf</dc:creator>
      <pubDate>Sat, 24 Oct 2026 20:44:18 +0000</pubDate>
      <link>https://dev.to/hadeelsharaf/semantic-code-intelligence-helping-ai-agents-navigate-codebases-52p8</link>
      <guid>https://dev.to/hadeelsharaf/semantic-code-intelligence-helping-ai-agents-navigate-codebases-52p8</guid>
      <description>&lt;p&gt;&lt;em&gt;Finding code is easy. Finding the right code—and understanding what a change might affect—is harder.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine asking an AI coding agent to modify a payment retry policy.&lt;/p&gt;

&lt;p&gt;It finds the function responsible for retries, changes it, and reports success. But another module calls that function, a configuration controls its behavior, and existing tests depend on its current contract.&lt;/p&gt;

&lt;p&gt;The problem is not necessarily that the agent cannot write code. It may not have retrieved enough context to understand the change.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;semantic code intelligence&lt;/strong&gt; becomes useful: a collection of techniques that help developers and AI agents navigate code using its structure, symbols, relationships, and sometimes semantic similarity.&lt;/p&gt;

&lt;p&gt;It is a broad industry term rather than a single standardized technology. Different implementations provide different capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Text Search vs. Code Intelligence
&lt;/h2&gt;

&lt;p&gt;Suppose you want to find where &lt;code&gt;getUser&lt;/code&gt; is defined.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"getUser"&lt;/span&gt; src/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns textual matches, potentially including definitions, calls, comments, and tests.&lt;/p&gt;

&lt;p&gt;A language-aware tool can resolve the symbol and locate its definition, provided the language server supports that operation and has sufficient project information.&lt;/p&gt;

&lt;p&gt;The distinction is simple: &lt;strong&gt;text search finds matching text; symbol-aware navigation can identify code entities and their relationships.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both are useful. The challenge is choosing the right method for the question.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Main Building Blocks
&lt;/h2&gt;

&lt;p&gt;Semantic code intelligence combines several complementary techniques.&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax parsing
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://tree-sitter.github.io/tree-sitter/" rel="noopener noreferrer"&gt;Tree-sitter&lt;/a&gt; parses source code into syntax trees. It can identify functions, classes, expressions, and other structures, making it useful for structural queries and symbol-aware code chunking.&lt;/p&gt;

&lt;p&gt;Parsing alone does not resolve every symbol or establish the complete meaning of a program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symbol navigation and indexing
&lt;/h3&gt;

&lt;p&gt;Two important technologies are the Language Server Protocol (LSP) and SCIP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LSP&lt;/strong&gt; defines communication between development tools and language servers. Depending on the implementation, it supports go-to-definition, find-references, and rename.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SCIP&lt;/strong&gt; is a language-agnostic protocol for indexing source code to support code navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://microsoft.github.io/language-server-protocol/" rel="noopener noreferrer"&gt;LSP specification&lt;/a&gt; and the &lt;a href="https://github.com/scip-code/scip" rel="noopener noreferrer"&gt;SCIP project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These technologies serve different purposes: LSP defines a communication protocol, while SCIP defines an indexing format.&lt;/p&gt;

&lt;p&gt;Neither guarantees complete results across every language feature or repository. Accuracy depends on language support, index coverage, project configuration, and freshness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Embeddings and vector search
&lt;/h3&gt;

&lt;p&gt;Sometimes you know the behavior you are looking for but not which function implements it.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where do we retry failed payments?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Embedding-based retrieval represents code snippets and queries as vectors, then retrieves candidates based on similarity.&lt;/p&gt;

&lt;p&gt;This helps discover implementations when the query and source code use different terminology. However, similarity does not prove functional equivalence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use embeddings to discover candidates, not to guarantee exhaustive references or prove behavior.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code graphs
&lt;/h3&gt;

&lt;p&gt;Code graphs represent relationships such as function calls, imports, dependencies, and inheritance.&lt;/p&gt;

&lt;p&gt;They help investigate questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which functions call this method?&lt;/li&gt;
&lt;li&gt;Which modules depend on this interface?&lt;/li&gt;
&lt;li&gt;What might be affected by changing this component?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Static graphs may miss relationships involving dynamic dispatch, reflection, generated code, or runtime configuration. Dependency information also does not guarantee that a change is safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid retrieval
&lt;/h3&gt;

&lt;p&gt;A retrieval pipeline can combine lexical search, semantic similarity, and structural information.&lt;/p&gt;

&lt;p&gt;A typical workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Split source code into symbol-aware chunks.&lt;/li&gt;
&lt;li&gt;Index chunks using BM25 or another lexical retrieval method.&lt;/li&gt;
&lt;li&gt;Generate embeddings for semantic retrieval.&lt;/li&gt;
&lt;li&gt;Merge and rerank the retrieved candidates.&lt;/li&gt;
&lt;li&gt;Use symbol and dependency information to refine the results where available.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lexical retrieval finds relevant terms, embeddings surface conceptually related code, and reranking helps prioritize candidates.&lt;/p&gt;

&lt;p&gt;Hybrid retrieval is not automatically more accurate. Its effectiveness depends on indexing, chunking, ranking, and the quality of the underlying data.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A Practical Example: Changing a Payment Retry Policy
&lt;/h2&gt;

&lt;p&gt;Consider an agent asked to increase the maximum number of payment retries.&lt;/p&gt;

&lt;p&gt;A text search might find several occurrences of &lt;code&gt;retry&lt;/code&gt;, but the relevant behavior could be distributed across a service, configuration file, and test suite.&lt;/p&gt;

&lt;p&gt;Here is how different retrieval methods can help:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Lexical search&lt;/td&gt;
&lt;td&gt;Find retry-related identifiers and configuration keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Semantic retrieval&lt;/td&gt;
&lt;td&gt;Discover implementations described using unfamiliar terminology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Symbol indexing&lt;/td&gt;
&lt;td&gt;Locate definitions and references for the relevant functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dependency analysis&lt;/td&gt;
&lt;td&gt;Identify potentially affected callers and components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Test discovery and execution&lt;/td&gt;
&lt;td&gt;Check expected behavior and detect regressions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, a search for &lt;code&gt;retry&lt;/code&gt; might reveal &lt;code&gt;retry_payment()&lt;/code&gt;, &lt;code&gt;max_attempts&lt;/code&gt;, and &lt;code&gt;recover_transaction()&lt;/code&gt;. Symbol resolution can then distinguish the definition of &lt;code&gt;retry_payment()&lt;/code&gt; from its callers, while dependency analysis helps trace how the function is used.&lt;/p&gt;

&lt;p&gt;These are illustrative names, not measured search results.&lt;/p&gt;

&lt;p&gt;The key is that each step answers a different question. Semantic retrieval helps discover candidates; symbol indexing helps establish code relationships; tests provide evidence about behavior.&lt;/p&gt;

&lt;p&gt;None of these steps alone proves that every relevant component has been found or that the resulting change is correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why This Matters for AI Coding Agents
&lt;/h2&gt;

&lt;p&gt;AI coding agents need relevant context before modifying a codebase. Without effective retrieval, they may repeatedly search files, read unrelated sections, and manually reconstruct dependencies.&lt;/p&gt;

&lt;p&gt;This can lead to unnecessary token consumption, missed dependencies, incomplete changes, and repeated discovery work.&lt;/p&gt;

&lt;p&gt;Persistent indexes can make symbol and relationship information available across tasks, reducing repeated exploration. Their value depends on the repository, language support, indexing overhead, and how frequently the code changes.&lt;/p&gt;

&lt;p&gt;Better retrieval can improve the context available to an agent, but it does not guarantee correct reasoning or safe modifications. The agent must still inspect the source, validate assumptions, and test its changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Choosing the Right Tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engineering question&lt;/th&gt;
&lt;th&gt;Suitable approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where does this exact string appear?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;grep&lt;/code&gt; or lexical search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where is this function defined?&lt;/td&gt;
&lt;td&gt;LSP or a suitable symbol index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which references resolve to this symbol?&lt;/td&gt;
&lt;td&gt;LSP or SCIP-based indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where is this behavior implemented?&lt;/td&gt;
&lt;td&gt;Lexical and semantic retrieval, followed by source inspection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which components may be affected by a change?&lt;/td&gt;
&lt;td&gt;Dependency analysis and code graphs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which tests should be examined?&lt;/td&gt;
&lt;td&gt;Test discovery, dependency analysis, and coverage data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These capabilities can be exposed to AI agents through APIs, tools, or integrations such as the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt;. The agent should use only the capabilities actually supported by the integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Trade-offs to Consider
&lt;/h2&gt;

&lt;p&gt;Before introducing code intelligence, consider the operational costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Index freshness:&lt;/strong&gt; Outdated indexes can produce misleading results. Incremental updates or reindexing are essential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language support:&lt;/strong&gt; Indexing capabilities and precision vary across languages and frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure cost:&lt;/strong&gt; Persistent indexes require storage, compute, and maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval quality:&lt;/strong&gt; Embeddings and rerankers need evaluation; similarity scores alone do not establish correctness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analysis limitations:&lt;/strong&gt; Static analysis may not capture all runtime behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Code indexes and embedding stores can contain proprietary source information and require appropriate access controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a small repository, ordinary search and existing language-server features may be sufficient. For large monorepos or agent workflows involving frequent cross-file changes, additional indexing and dependency analysis may justify the complexity.&lt;/p&gt;

&lt;p&gt;Start with existing search, add symbol-aware navigation where needed, and introduce semantic retrieval or graph analysis when specific problems justify them. Evaluate the result using representative tasks, retrieval precision and recall, index freshness, latency, token consumption, and end-to-end task success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Semantic code intelligence is not a replacement for text search. It combines complementary techniques to retrieve code with different levels of structural and semantic information.&lt;/p&gt;

&lt;p&gt;Use lexical search for exact matches, symbol indexing for definitions and references, embeddings for discovering implementations by intent, and code graphs for exploring dependencies and potential impact.&lt;/p&gt;

&lt;p&gt;For AI coding agents, the objective is not to retrieve more code indiscriminately. It is to retrieve relevant evidence, understand its limitations, and validate the resulting changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is not to make every search semantic. It is to retrieve the right evidence for the question being asked.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>agents</category>
    </item>
    <item>
      <title>Ontology-Driven Observability for Agentic Monitoring</title>
      <dc:creator>Hadeel Sharaf</dc:creator>
      <pubDate>Tue, 20 Oct 2026 22:01:56 +0000</pubDate>
      <link>https://dev.to/hadeelsharaf/ontology-driven-observability-for-agentic-monitoring-2op0</link>
      <guid>https://dev.to/hadeelsharaf/ontology-driven-observability-for-agentic-monitoring-2op0</guid>
      <description>&lt;p&gt;Traditional observability tells us what is happening in our systems. Ontology-driven observability helps us understand how system components are connected — and gives AI agents better context to investigate incidents.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Is Ontology-Driven Observability?
&lt;/h2&gt;

&lt;p&gt;It starts with a shared model of the system: its services, databases, users, infrastructure, and their relationships.&lt;/p&gt;

&lt;p&gt;Instead of treating metrics, logs, and traces as isolated signals, telemetry is connected to a &lt;strong&gt;knowledge graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;checkout-service → depends_on → payments-db
checkout-service → runs_on → node-01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each statement is a triple: &lt;strong&gt;Subject → Predicate → Object&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result is a connected view of the system that supports dependency analysis, impact assessment, and root-cause investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use Case Without LLMs or AI Agents
&lt;/h2&gt;

&lt;p&gt;Ontology-driven observability is useful even without AI.&lt;/p&gt;

&lt;p&gt;Consider a payments database that becomes unavailable.&lt;/p&gt;

&lt;p&gt;A graph-based monitoring system can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify services that depend on the database.&lt;/li&gt;
&lt;li&gt;Calculate the potential blast radius of the failure.&lt;/li&gt;
&lt;li&gt;Apply predefined rules to correlate the incident with service health.&lt;/li&gt;
&lt;li&gt;Alert the responsible teams with dependency context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is deterministic, rule-based monitoring. The knowledge graph provides context, while predefined queries and rules perform the analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use Case for Agentic Monitoring
&lt;/h2&gt;

&lt;p&gt;Now introduce an LLM-powered agent.&lt;/p&gt;

&lt;p&gt;When checkout latency increases, a monitoring agent can query the knowledge graph to identify affected services and their dependencies. It can then investigate relevant metrics, logs, traces, and deployment events.&lt;/p&gt;

&lt;p&gt;A multi-agent workflow could delegate these investigations to specialized agents and combine their findings into an evidence-backed root-cause hypothesis.&lt;/p&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detect → Explore dependencies → Investigate telemetry → Correlate evidence → Recommend action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This approach aligns with Netflix's E2EGraph initiative, presented at &lt;a href="https://qconlondon.com/presentation/mar2026/ontology-driven-observability-building-e2e-knowledge-graph-netflix-scale" rel="noopener noreferrer"&gt;QCon London 2026&lt;/a&gt;, which explores knowledge-graph-backed observability and agent-assisted root-cause analysis at scale.&lt;/p&gt;

&lt;p&gt;Importantly, the graph provides structured context; it does not automatically prove causation. Agents must still validate their hypotheses against actual telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Should We Prefer This Approach?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It depends on system complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ontology-driven observability is particularly valuable when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incidents cross multiple services, infrastructure layers, and teams.&lt;/li&gt;
&lt;li&gt;Telemetry is scattered across different tools.&lt;/li&gt;
&lt;li&gt;Root-cause analysis requires understanding complex dependencies.&lt;/li&gt;
&lt;li&gt;AI agents need reliable, structured context rather than relying on raw logs alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For smaller systems, conventional observability with consistent instrumentation, useful tags, and distributed tracing may be sufficient. &lt;a href="https://opentelemetry.io/docs/concepts/semantic-conventions/" rel="noopener noreferrer"&gt;OpenTelemetry Semantic Conventions&lt;/a&gt; provide a practical starting point.&lt;/p&gt;

&lt;p&gt;A complete knowledge graph introduces additional costs: ontology design, data integration, graph maintenance, and governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Should Agentic Monitoring Run in a Sandbox?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Develop and test it in a sandbox or staging environment first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;However, the knowledge graph and observability pipeline do not inherently need to run in a sandbox. The critical security concern is the agent's execution environment and permissions.&lt;/p&gt;

&lt;p&gt;A practical rollout strategy is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; Test incident scenarios, graph queries, agent reasoning, and tool calls using synthetic or sanitized telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production read-only mode:&lt;/strong&gt; Allow agents to query approved production telemetry and propose explanations without changing the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlled remediation:&lt;/strong&gt; Introduce actions such as restarting services or rolling back deployments only with strict permissions, independent validation, and human approval where appropriate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sandboxing and least-privilege access help limit the consequences of incorrect reasoning or unintended tool calls. For further guidance, see &lt;a href="https://developers.openai.com/api/docs/guides/agents/guardrails-approvals" rel="noopener noreferrer"&gt;OpenAI's documentation on agent guardrails and human review&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Ontology-driven observability is not a replacement for traditional monitoring. It is a way to add &lt;strong&gt;shared context and connected system knowledge&lt;/strong&gt; to it.&lt;/p&gt;

&lt;p&gt;Rules can use the graph to perform deterministic analysis. LLM-powered agents can use the same graph to investigate incidents dynamically and coordinate more complex workflows.&lt;/p&gt;

&lt;p&gt;The strongest starting point is simple: establish &lt;strong&gt;reliable telemetry and system relationships&lt;/strong&gt; first, then introduce &lt;strong&gt;agentic analysis&lt;/strong&gt; where it provides measurable value.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>observability</category>
      <category>ai</category>
      <category>knowledgegraphs</category>
    </item>
  </channel>
</rss>
