<?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: Indu Das</title>
    <description>The latest articles on DEV Community by Indu Das (@indu_das_e14b18dd167a8cf7).</description>
    <link>https://dev.to/indu_das_e14b18dd167a8cf7</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%2F3749583%2Fb5324956-6c5c-41fe-a6b9-09cdc0bba748.jpg</url>
      <title>DEV Community: Indu Das</title>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/indu_das_e14b18dd167a8cf7"/>
    <language>en</language>
    <item>
      <title>Your AI agent says the tool failed. What if the action actually happened?</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Sat, 12 Sep 2026 15:26:44 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/your-ai-agent-says-the-tool-failed-what-if-the-action-actually-happened-3k47</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/your-ai-agent-says-the-tool-failed-what-if-the-action-actually-happened-3k47</guid>
      <description>&lt;p&gt;A tool call returning an error does not necessarily mean the action failed.&lt;/p&gt;

&lt;p&gt;That sounds obvious if you have spent time around distributed systems.&lt;/p&gt;

&lt;p&gt;It gets much more dangerous when an AI agent is the thing deciding what to do next.&lt;/p&gt;

&lt;p&gt;Imagine this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent decides to make a payment.&lt;/li&gt;
&lt;li&gt;The payment request reaches the provider.&lt;/li&gt;
&lt;li&gt;The provider creates the payment.&lt;/li&gt;
&lt;li&gt;The response times out.&lt;/li&gt;
&lt;li&gt;The agent receives an error.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the agent's point of view:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAYMENT FAILED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the provider's point of view:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAYMENT HAPPENED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now the agent has to decide what to do next.&lt;/p&gt;

&lt;p&gt;Retry?&lt;/p&gt;

&lt;p&gt;If it retries blindly, you may now have two payments.&lt;/p&gt;

&lt;p&gt;That is the problem I have been thinking about.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tool response is not always evidence of the effect
&lt;/h2&gt;

&lt;p&gt;We tend to collapse several things into one event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent calls tool
      ↓
tool returns result
      ↓
agent decides what happened
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But consequential systems do not always work like that.&lt;/p&gt;

&lt;p&gt;The real sequence can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent calls tool
      ↓
provider accepts request
      ↓
real-world state changes
      ↓
response is lost
      ↓
tool reports an error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool may be completely honest.&lt;/p&gt;

&lt;p&gt;The transport really did fail.&lt;/p&gt;

&lt;p&gt;But the external effect also really happened.&lt;/p&gt;

&lt;p&gt;Both facts can be true at the same time.&lt;/p&gt;

&lt;p&gt;That makes the response useful evidence about the call, but not necessarily authoritative evidence about the final effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idempotency helps, but it does not answer the whole question
&lt;/h2&gt;

&lt;p&gt;The obvious answer is idempotency.&lt;/p&gt;

&lt;p&gt;And yes, consequential tools should use idempotency wherever the underlying system supports it.&lt;/p&gt;

&lt;p&gt;If the same payment request is repeated with the same idempotency key, the provider should not create a second payment.&lt;/p&gt;

&lt;p&gt;That prevents one very important class of failure.&lt;/p&gt;

&lt;p&gt;But the agent still has a question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the first action actually happen?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before deciding whether to retry, escalate, compensate, or stop, something has to establish the downstream state.&lt;/p&gt;

&lt;p&gt;That may mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading the provider state;&lt;/li&gt;
&lt;li&gt;checking a transaction receipt;&lt;/li&gt;
&lt;li&gt;querying the resource independently;&lt;/li&gt;
&lt;li&gt;observing the physical side effect;&lt;/li&gt;
&lt;li&gt;reconciling against another authoritative system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where I think agent testing needs to go further than checking the model output or tool response.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are at least three different questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Was the action allowed?
&lt;/h3&gt;

&lt;p&gt;This is an authorization problem.&lt;/p&gt;

&lt;p&gt;Can this agent perform this action against this resource under this policy?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Was the evidence behind the action still current?
&lt;/h3&gt;

&lt;p&gt;This is the problem FreshCtx addresses.&lt;/p&gt;

&lt;p&gt;An agent may make a correct decision at 10:01.&lt;/p&gt;

&lt;p&gt;Reality changes at 10:03.&lt;/p&gt;

&lt;p&gt;The action executes at 10:04.&lt;/p&gt;

&lt;p&gt;The original reasoning was not necessarily bad. It was simply no longer valid when execution happened.&lt;/p&gt;

&lt;p&gt;FreshCtx revalidates the declared evidence immediately before the consequential action.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CURRENT
→ proceed

STALE_REASONING
→ block

UNVERIFIABLE
→ block under the default policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is intentionally a narrow job.&lt;/p&gt;

&lt;p&gt;FreshCtx does not claim that an authorized action will execute correctly.&lt;/p&gt;

&lt;p&gt;And it does not claim that a tool response proves what happened afterward.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What actually happened?
&lt;/h3&gt;

&lt;p&gt;This is a different assurance problem.&lt;/p&gt;

&lt;p&gt;Once the action crosses the execution boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the effect occur?&lt;/li&gt;
&lt;li&gt;Did it occur once?&lt;/li&gt;
&lt;li&gt;Did the agent report the same thing reality shows?&lt;/li&gt;
&lt;li&gt;Can we establish the result independently?&lt;/li&gt;
&lt;li&gt;If we repair the problem, does the same execution path now behave correctly?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not want to keep expanding FreshCtx until it became an authorization system, observability platform, execution tester and audit system at the same time.&lt;/p&gt;

&lt;p&gt;So I separated the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  That became Revera
&lt;/h2&gt;

&lt;p&gt;Revera is the system I built for the execution side of this problem.&lt;/p&gt;

&lt;p&gt;The question it tries to answer is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did the AI agent actually execute?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The workflow is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;discover consequential action
        ↓
reproduce execution
        ↓
observe actual effect
        ↓
diagnose
        ↓
remediate where supported
        ↓
rerun the exact path
        ↓
produce evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One design principle became especially important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system under test should not be the only authority on whether its own action succeeded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the agent reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PAYMENT FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while an independent observation establishes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PAYMENT EXECUTED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I want both facts preserved.&lt;/p&gt;

&lt;p&gt;Not one silently replacing the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable state is sometimes "we don't know"
&lt;/h2&gt;

&lt;p&gt;There is another case that matters just as much.&lt;/p&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the tool returned an error;&lt;/li&gt;
&lt;li&gt;the provider cannot currently be queried;&lt;/li&gt;
&lt;li&gt;no authoritative receipt is available;&lt;/li&gt;
&lt;li&gt;the effect may have happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calling that &lt;code&gt;FAILED&lt;/code&gt; is dangerous.&lt;/p&gt;

&lt;p&gt;Calling it &lt;code&gt;SUCCESS&lt;/code&gt; is equally dishonest.&lt;/p&gt;

&lt;p&gt;The safest answer may simply be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UNVERIFIABLE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;or, depending on the system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAY_HAVE_EXECUTED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That state changes what the agent is allowed to do next.&lt;/p&gt;

&lt;p&gt;Blind automatic retry may be exactly the wrong response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why exact retesting matters
&lt;/h2&gt;

&lt;p&gt;There is one more place where I think agent security work often stops too early.&lt;/p&gt;

&lt;p&gt;A failure is reproduced.&lt;/p&gt;

&lt;p&gt;Someone generates a patch.&lt;/p&gt;

&lt;p&gt;The code looks correct.&lt;/p&gt;

&lt;p&gt;And the issue is marked fixed.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;patch generated != fix proven&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a consequential execution problem, I want the repaired path to actually run again under the relevant execution conditions.&lt;/p&gt;

&lt;p&gt;Then observe what happened.&lt;/p&gt;

&lt;p&gt;And also verify that legitimate behavior still works.&lt;/p&gt;

&lt;p&gt;That is why Revera includes an exact retest step rather than treating remediation generation as the end of the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  FreshCtx and Revera solve different problems
&lt;/h2&gt;

&lt;p&gt;The distinction I use now is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FreshCtx
Is the evidence still current before the action?

Revera
What actually executed, what effect occurred, and can the repair be proven?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FreshCtx remains open source.&lt;/p&gt;

&lt;p&gt;Revera is the separate verification product.&lt;/p&gt;

&lt;p&gt;I think keeping that boundary explicit makes both systems more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  I want to test Revera on real external systems, not just examples we built ourselves.
&lt;/h2&gt;

&lt;p&gt;Revera is live now:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reveralab.com" rel="noopener noreferrer"&gt;https://reveralab.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this stage, I am not trying to maximize signups.&lt;/p&gt;

&lt;p&gt;I want a small number of external developers building agents that actually change something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payments;&lt;/li&gt;
&lt;li&gt;infrastructure;&lt;/li&gt;
&lt;li&gt;customer records;&lt;/li&gt;
&lt;li&gt;access;&lt;/li&gt;
&lt;li&gt;deployments;&lt;/li&gt;
&lt;li&gt;bookings;&lt;/li&gt;
&lt;li&gt;approvals;&lt;/li&gt;
&lt;li&gt;workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have one public repository, MCP tool, or consequential action where a wrong execution would matter, send it to me.&lt;/p&gt;

&lt;p&gt;Especially if you think Revera will get the answer wrong.&lt;/p&gt;

&lt;p&gt;That is much more useful right now than another test against a system we built ourselves.&lt;/p&gt;

&lt;p&gt;And I am curious about one thing from other builders:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is one action in your agent that you would absolutely not trust it to retry blindly?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>devtool</category>
    </item>
    <item>
      <title>MCP Connects AI Agents to Tools. Who Checks the Evidence Before the Tool Acts?</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Sun, 06 Sep 2026 04:29:08 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/mcp-connects-ai-agents-to-tools-who-checks-the-evidence-before-the-tool-acts-1joi</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/mcp-connects-ai-agents-to-tools-who-checks-the-evidence-before-the-tool-acts-1joi</guid>
      <description>&lt;p&gt;An AI agent reads a customer record and decides to issue a refund.&lt;/p&gt;

&lt;p&gt;Before it acts, the work is delegated to another agent. That agent eventually calls a payment tool through MCP.&lt;/p&gt;

&lt;p&gt;But the customer record changed in the meantime.&lt;/p&gt;

&lt;p&gt;The reasoning may have been valid when it was produced. The tool call may also be technically correct. Yet the action is now based on evidence that is no longer current.&lt;/p&gt;

&lt;p&gt;That gap exists between reasoning and execution—and it becomes harder to see when work crosses agent boundaries.&lt;/p&gt;

&lt;p&gt;A2A and MCP solve different parts of the system&lt;/p&gt;

&lt;p&gt;Agent-to-Agent Protocol (A2A) gives agents a standard way to delegate work.&lt;/p&gt;

&lt;p&gt;Model Context Protocol (MCP) gives agents a standard way to discover and call tools.&lt;/p&gt;

&lt;p&gt;These protocols make increasingly capable agent systems possible, but they do not automatically prove that the evidence behind a delegated decision is still current when a consequential tool executes.&lt;/p&gt;

&lt;p&gt;The sequence can look like this:&lt;/p&gt;

&lt;p&gt;Agent A reads evidence&lt;br&gt;
        ↓&lt;br&gt;
Agent A forms a decision&lt;br&gt;
        ↓&lt;br&gt;
Agent A delegates through A2A&lt;br&gt;
        ↓&lt;br&gt;
Agent B or Agent C receives the task&lt;br&gt;
        ↓&lt;br&gt;
An MCP tool is about to execute&lt;/p&gt;

&lt;p&gt;The evidence can change anywhere between the first and final steps.&lt;/p&gt;

&lt;p&gt;The boundary I wanted&lt;/p&gt;

&lt;p&gt;I wanted the final tool boundary to answer one narrow question:&lt;/p&gt;

&lt;p&gt;Is the declared evidence behind this specific action still current?&lt;/p&gt;

&lt;p&gt;The result should be unambiguous:&lt;/p&gt;

&lt;p&gt;CURRENT: the selected evidence has not changed, so the tool may proceed.&lt;/p&gt;

&lt;p&gt;STALE_REASONING: required evidence changed, so the tool is blocked.&lt;/p&gt;

&lt;p&gt;UNVERIFIABLE: the evidence cannot be checked reliably, so the tool is blocked.&lt;/p&gt;

&lt;p&gt;CURRENT does not mean the agent selected the right source, interpreted it correctly, or made a safe decision. It means only that the declared evidence remained unchanged.&lt;/p&gt;

&lt;p&gt;That distinction is deliberate.&lt;/p&gt;

&lt;p&gt;What I built&lt;/p&gt;

&lt;p&gt;FreshCtx 0.14.0 carries a signed, expiring, recipient-bound evidence receipt across A2A delegation.&lt;/p&gt;

&lt;p&gt;The receiving agent validates that receipt before delegated execution reaches MCP’s native tools/call boundary.&lt;/p&gt;

&lt;p&gt;The receipt preserves:&lt;/p&gt;

&lt;p&gt;the observation linked to the decision;&lt;/p&gt;

&lt;p&gt;parent and root correlation across delegation;&lt;/p&gt;

&lt;p&gt;the intended recipient;&lt;/p&gt;

&lt;p&gt;issue and expiry times;&lt;/p&gt;

&lt;p&gt;integrity protection against tampering.&lt;/p&gt;

&lt;p&gt;It deliberately excludes prompts, credentials, source contents, tool arguments, and business payloads.&lt;/p&gt;

&lt;p&gt;If a receipt is missing, expired, modified, or presented to the wrong recipient, execution is rejected before the receiving agent runs the protected action.&lt;/p&gt;

&lt;p&gt;A three-agent demonstration&lt;/p&gt;

&lt;p&gt;The repository includes an executable path with three agents:&lt;/p&gt;

&lt;p&gt;Originating agent&lt;br&gt;
        ↓ A2A&lt;br&gt;
Delegated agent&lt;br&gt;
        ↓ A2A&lt;br&gt;
Executing agent&lt;br&gt;
        ↓ MCP tools/call&lt;br&gt;
Consequential tool&lt;/p&gt;

&lt;p&gt;It demonstrates three outcomes:&lt;/p&gt;

&lt;p&gt;Evidence unchanged       → MCP tool executes once&lt;br&gt;
Evidence changed         → tool does not execute&lt;br&gt;
Evidence cannot be read  → tool does not execute&lt;/p&gt;

&lt;p&gt;It also tests missing, expired, tampered, and wrong-recipient delegation receipts.&lt;/p&gt;

&lt;p&gt;The point is not to create another agent framework. It is to keep the same evidence-validity rule intact as execution travels through different frameworks and protocols.&lt;/p&gt;

&lt;p&gt;The same invariant across multiple runtimes&lt;/p&gt;

&lt;p&gt;FreshCtx now maps this boundary across:&lt;/p&gt;

&lt;p&gt;MCP&lt;/p&gt;

&lt;p&gt;A2A&lt;/p&gt;

&lt;p&gt;Agno&lt;/p&gt;

&lt;p&gt;LangGraph&lt;/p&gt;

&lt;p&gt;OpenAI Agents SDK&lt;/p&gt;

&lt;p&gt;Google ADK&lt;/p&gt;

&lt;p&gt;ElevenLabs Python tools&lt;/p&gt;

&lt;p&gt;Each platform exposes a different interception mechanism, but the operating rule remains:&lt;/p&gt;

&lt;p&gt;Observe → Reason → Revalidate → Act&lt;/p&gt;

&lt;p&gt;If required evidence is stale or cannot be verified, the consequential action does not execute.&lt;/p&gt;

&lt;p&gt;Where I would value scrutiny&lt;/p&gt;

&lt;p&gt;The receiving A2A AgentExecutor is currently the enforcement point before delegated execution continues.&lt;/p&gt;

&lt;p&gt;I would particularly value feedback from people operating A2A or MCP systems:&lt;/p&gt;

&lt;p&gt;Is the receiving executor the correct universal boundary?&lt;/p&gt;

&lt;p&gt;Can delegated execution bypass it in a real architecture?&lt;/p&gt;

&lt;p&gt;Which consequential MCP tool should this be tested against next?&lt;/p&gt;

&lt;p&gt;What audit evidence would your production review require?&lt;/p&gt;

&lt;p&gt;I maintain FreshCtx, and I am looking for concrete implementations and failure cases—not general endorsements.&lt;/p&gt;

&lt;p&gt;Install the current release:&lt;/p&gt;

&lt;p&gt;python -m pip install "freshctx[a2a-mcp]==0.14.0"&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PyPI: &lt;a href="https://pypi.org/project/freshctx/0.14.0/" rel="noopener noreferrer"&gt;https://pypi.org/project/freshctx/0.14.0/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your agents delegate work before calling tools, I would be interested in seeing where this boundary holds—and where it does not.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>a2a</category>
      <category>automation</category>
    </item>
    <item>
      <title>When an AI agent takes a consequential action, blocking stale reasoning is only part of the control problem.</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:32:21 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/when-an-ai-agent-takes-a-consequential-action-blocking-stale-reasoning-is-only-part-of-the-control-k4e</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/when-an-ai-agent-takes-a-consequential-action-blocking-stale-reasoning-is-only-part-of-the-control-k4e</guid>
      <description>&lt;p&gt;When an AI agent takes a consequential action, blocking stale reasoning is only part of the control problem.&lt;/p&gt;

&lt;p&gt;Organizations also need to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What evidence supported the decision?&lt;/li&gt;
&lt;li&gt;Was it revalidated immediately before execution?&lt;/li&gt;
&lt;li&gt;Which action was allowed or blocked?&lt;/li&gt;
&lt;li&gt;Can the resulting record be verified later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FreshCtx 0.11.0 introduces a consistent evidence-to-action trail across MCP, Agno, LangGraph, the OpenAI Agents SDK, Google ADK and ElevenLabs.&lt;/p&gt;

&lt;p&gt;Every protected action can now produce the same versioned correlation record, connecting the action to its declared evidence, validation result and policy decision—without copying tool arguments, credentials or business payloads.&lt;/p&gt;

&lt;p&gt;The release also introduces bounded evidence attestation. Applications can create a time-limited integrity receipt for an exact correlation record and detect tampering, mismatched records, invalid signatures and expired receipts.&lt;/p&gt;

&lt;p&gt;FreshCtx keeps the claim deliberately precise: verification establishes record integrity, key possession and the configured time bound. It does not pretend to prove source truth, reasoning correctness, authorization or compliance.&lt;/p&gt;

&lt;p&gt;FreshCtx 0.11.0 is open source, Apache-2.0, local-first and available now.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;python -m pip install freshctx==0.11.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://pypi.org/project/freshctx/0.11.0/" rel="noopener noreferrer"&gt;https://pypi.org/project/freshctx/0.11.0/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  AIAgents #AgenticAI #AIInfrastructure #EnterpriseAI #MCP #OpenSource #Python #AIEngineering #ResponsibleAI #AIGovernance
&lt;/h1&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>FreshCtx 0.8.0 is live with Google ADK support.</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Tue, 01 Sep 2026 23:13:01 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-080-is-live-with-google-adk-support-44n2</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-080-is-live-with-google-adk-support-44n2</guid>
      <description>&lt;p&gt;FreshCtx 0.8.0 is live with Google ADK support.&lt;br&gt;
FreshCtx now maps the same pre-action freshness boundary across Agno, LangGraph, OpenAI Agents SDK and Google ADK.&lt;br&gt;
We also recorded a new independent four-source research-brief rerun. An unsupported claim remained excluded until a defensible source was supplied, then re-entered the dependency map.&lt;br&gt;
&lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>opensource</category>
      <category>googleaichallenge</category>
    </item>
    <item>
      <title>FreshCtx 0.7.0: One freshness boundary across Agno, LangGraph, and OpenAI Agents</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:05:17 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-070-one-freshness-boundary-across-agno-langgraph-and-openai-agents-2728</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-070-one-freshness-boundary-across-agno-langgraph-and-openai-agents-2728</guid>
      <description>&lt;p&gt;AI agents can make a sound decision from information that was accurate when read, then execute after that information has changed.&lt;/p&gt;

&lt;p&gt;That is not primarily a model-quality problem. It is an action-boundary problem.&lt;/p&gt;

&lt;p&gt;FreshCtx 0.7.0 is now available on PyPI. This release adds a native integration for custom function tools in the OpenAI Agents SDK, alongside the existing Agno and LangGraph integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the OpenAI Agents SDK integration does
&lt;/h2&gt;

&lt;p&gt;FreshCtx runs as an input guardrail immediately before a custom function tool executes.&lt;/p&gt;

&lt;p&gt;The application declares the evidence that influenced the agent's decision. At the action boundary, FreshCtx checks that evidence again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the evidence is still current, the tool can run.&lt;/li&gt;
&lt;li&gt;If it has changed, the action is stopped.&lt;/li&gt;
&lt;li&gt;If the evidence cannot be verified under a blocking policy, the action is also stopped.&lt;/li&gt;
&lt;li&gt;The SDK receives its native input-tool tripwire instead of a FreshCtx-specific exception.&lt;/li&gt;
&lt;li&gt;Tool name and call ID can be recorded for audit evidence, while raw tool arguments are not persisted by FreshCtx.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the decision boundary explicit: FreshCtx does not decide whether the reasoning is correct. It checks whether the declared evidence is still valid when the application is about to act.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this release matters
&lt;/h2&gt;

&lt;p&gt;FreshCtx now demonstrates the same invariant across three different agent runtimes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agno&lt;/li&gt;
&lt;li&gt;LangGraph&lt;/li&gt;
&lt;li&gt;OpenAI Agents SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework changes. The model changes. The tool system changes.&lt;/p&gt;

&lt;p&gt;The freshness boundary does not.&lt;/p&gt;

&lt;p&gt;That is the architectural point of the project. FreshCtx is not trying to become another workflow engine. It provides a small, framework-neutral control that applications can place immediately before consequential actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s1"&gt;'freshctx[openai-agents]==0.7.0'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package and integration were verified through protected CI across Python 3.10 through 3.13, package validation, and a clean installation from public PyPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bounded example
&lt;/h2&gt;

&lt;p&gt;Consider an agent that reads a subscription record, decides to grant access, and then calls a function tool.&lt;/p&gt;

&lt;p&gt;Between reasoning and execution, the subscription status changes.&lt;/p&gt;

&lt;p&gt;Without an action-boundary check, the tool may still grant access based on the old state. With FreshCtx, the declared subscription dependency is revalidated immediately before the tool body runs. If it changed, the tripwire fires and the action does not execute.&lt;/p&gt;

&lt;p&gt;The same pattern applies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventory and pricing changes&lt;/li&gt;
&lt;li&gt;approvals that have been revoked or replaced&lt;/li&gt;
&lt;li&gt;files and database records that changed mid-workflow&lt;/li&gt;
&lt;li&gt;tool outputs that are no longer current&lt;/li&gt;
&lt;li&gt;research sources that moved after a claim was prepared&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deliberate scope
&lt;/h2&gt;

&lt;p&gt;The 0.7.0 integration covers custom function tools in the OpenAI Agents SDK. Hosted tools, built-in execution tools, handoffs, and &lt;code&gt;Agent.as_tool()&lt;/code&gt; are not presented as covered by this release.&lt;/p&gt;

&lt;p&gt;That boundary is intentional. A reliability control should state exactly where it runs and what it protects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try one concrete test
&lt;/h2&gt;

&lt;p&gt;If you use the OpenAI Agents SDK, change one declared dependency after the agent reasons but before a consequential function tool executes. Then check whether the stop happens at the point your workflow expects.&lt;/p&gt;

&lt;p&gt;FreshCtx is open source and Apache-2.0 licensed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.7.0" rel="noopener noreferrer"&gt;FreshCtx 0.7.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/freshctx/0.7.0/" rel="noopener noreferrer"&gt;PyPI package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>openai</category>
    </item>
    <item>
      <title>FreshCtx 0.6.0: Stop AI agents from acting on stale data</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Tue, 01 Sep 2026 03:44:42 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-060-stop-ai-agents-from-acting-on-stale-data-3nl4</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-060-stop-ai-agents-from-acting-on-stale-data-3nl4</guid>
      <description>&lt;p&gt;AI agents do not need to hallucinate to make the wrong decision.&lt;/p&gt;

&lt;p&gt;They can read accurate information, reason correctly, and still take the wrong action because the information changed before execution.&lt;/p&gt;

&lt;p&gt;That is the problem FreshCtx is built to address.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same failure keeps appearing in different systems
&lt;/h2&gt;

&lt;p&gt;Developer feedback around FreshCtx surfaced several versions of the same underlying problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A subscription status changed in Stripe, but an application acted on its old snapshot.&lt;/li&gt;
&lt;li&gt;A deployment worker continued after another worker had already claimed the job.&lt;/li&gt;
&lt;li&gt;An agent relied on remembered database action items instead of checking their current status.&lt;/li&gt;
&lt;li&gt;A research source changed after a claim had been prepared.&lt;/li&gt;
&lt;li&gt;A voice workflow reached an outdated business record after correctly understanding the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different industries and different tools, but the same gap:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reasoning was valid when produced, but stale when executed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in FreshCtx 0.6.0
&lt;/h2&gt;

&lt;p&gt;FreshCtx now provides the same pre-action freshness boundary across several practical environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe Subscription validation&lt;/li&gt;
&lt;li&gt;An Agno pre-tool integration&lt;/li&gt;
&lt;li&gt;Synchronous LangGraph action-node wrappers&lt;/li&gt;
&lt;li&gt;Asynchronous LangGraph action-node wrappers&lt;/li&gt;
&lt;li&gt;Selective revalidation of only the evidence an action declared&lt;/li&gt;
&lt;li&gt;Audit evidence explaining why an action was allowed or blocked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The LangGraph integration checks the evidence an action depends on immediately before the node runs. If a required dependency changed or cannot be verified, FreshCtx blocks before the node body starts.&lt;/p&gt;

&lt;p&gt;FreshCtx does not replace LangGraph routing, retries, checkpointing, transactions, or idempotency. It adds the missing freshness check at the point where reasoning becomes action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why framework neutrality matters
&lt;/h2&gt;

&lt;p&gt;Agno and LangGraph have different execution models. Stripe is not an agent framework at all.&lt;/p&gt;

&lt;p&gt;The integration changes, but the control remains consistent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An action declares the evidence it depends on.&lt;/li&gt;
&lt;li&gt;FreshCtx checks that evidence again at the action boundary.&lt;/li&gt;
&lt;li&gt;Changed or unverifiable evidence prevents the action from silently continuing.&lt;/li&gt;
&lt;li&gt;The application retains control over what happens next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The framework can change. The model can change. The tool system can change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The freshness boundary does not.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try FreshCtx 0.6.0
&lt;/h2&gt;

&lt;p&gt;Install the core package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;freshctx&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install it with LangGraph support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s1"&gt;'freshctx[langgraph]==0.6.0'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/freshctx/0.6.0/" rel="noopener noreferrer"&gt;https://pypi.org/project/freshctx/0.6.0/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Release notes: &lt;a href="https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.6.0" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.6.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building an agent that changes records, triggers workflows, approves transactions, or operates tools, what evidence would you want checked one last time before the action runs?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>langgraph</category>
    </item>
    <item>
      <title>FreshCtx 0.5.0: protecting Agno tools from stale external evidence</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Mon, 31 Aug 2026 17:55:05 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-050-protecting-agno-tools-from-stale-external-evidence-4o8p</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-050-protecting-agno-tools-from-stale-external-evidence-4o8p</guid>
      <description>&lt;p&gt;FreshCtx 0.5.0 is now public.&lt;/p&gt;

&lt;p&gt;This release adds an optional integration for Agno 2.9. The integration places FreshCtx at Agno's actual tool boundary, where it can re-check the external evidence that an application declared when it made a decision.&lt;/p&gt;

&lt;p&gt;The problem is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent reads a deployment state, account status, API response, approval, or other mutable source.&lt;/li&gt;
&lt;li&gt;It reasons from that source.&lt;/li&gt;
&lt;li&gt;The source changes before the tool executes.&lt;/li&gt;
&lt;li&gt;The old decision still looks locally reasonable, but it is no longer based on current evidence.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What the Agno hook does
&lt;/h2&gt;

&lt;p&gt;FreshCtx now provides synchronous and asynchronous Agno hooks.&lt;/p&gt;

&lt;p&gt;The hook runs immediately before the tool body. If a declared dependency changed, or cannot be verified under the configured blocking policy, FreshCtx stops execution before the side effect occurs.&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s1"&gt;'freshctx[agno]==0.5.0'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A tool can attach the boundary directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;freshctx.integrations.agno&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;agno_tool_hook&lt;/span&gt;

&lt;span class="n"&gt;freshness_hook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agno_tool_hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;depends_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;audit_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;freshctx-agno-audit.jsonl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_hooks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;freshness_hook&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployed:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is deliberately narrow. FreshCtx does not repair Agno's internal run state and does not replace transactions, idempotency, concurrency control, or approval logic. It protects the application-declared external evidence behind a tool call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;Before publishing, the release passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;87 regression tests&lt;/li&gt;
&lt;li&gt;protected CI across Python 3.10 through 3.13&lt;/li&gt;
&lt;li&gt;Windows onboarding and package checks&lt;/li&gt;
&lt;li&gt;wheel and source-distribution validation&lt;/li&gt;
&lt;li&gt;a clean installation from the public PyPI index&lt;/li&gt;
&lt;li&gt;an installed Agno example using Agno's real tool chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the bounded example, the dependency changes after the decision is created. FreshCtx returns STALE_REASONING, the Agno run is stopped, and the tool body is not executed.&lt;/p&gt;

&lt;p&gt;Release: &lt;a href="https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.5.0" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.5.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are already using Agno for a consequential tool call, I would value an honest run against one bounded scenario - including anything the integration does not model correctly.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>FreshCtx 0.3.0: What changed after developers tested the stale-context boundary</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Mon, 31 Aug 2026 00:37:49 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-030-what-changed-after-developers-tested-the-stale-context-boundary-2lf1</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/freshctx-030-what-changed-after-developers-tested-the-stale-context-boundary-2lf1</guid>
      <description>&lt;p&gt;&lt;strong&gt;FreshCtx 0.3.0 is now public.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first release started with a narrow problem:&lt;/p&gt;

&lt;p&gt;An AI agent can make a reasonable decision from accurate information, then act incorrectly because that information changed before execution.&lt;/p&gt;

&lt;p&gt;The early implementation proved that FreshCtx could declare the evidence used during reasoning, revalidate it at the action boundary and block an action when the evidence was no longer current.&lt;/p&gt;

&lt;p&gt;The questions developers asked after launch were more practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when several dependencies must be checked?&lt;/li&gt;
&lt;li&gt;Does revalidation add too much latency?&lt;/li&gt;
&lt;li&gt;What if a source is slow or rate-limited?&lt;/li&gt;
&lt;li&gt;Can it work inside an async agent?&lt;/li&gt;
&lt;li&gt;What happens when the local database is upgraded or damaged?&lt;/li&gt;
&lt;li&gt;How can an independent developer record what a test actually proved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version 0.3.0 turns those questions into working features and tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What FreshCtx does
&lt;/h2&gt;

&lt;p&gt;A FreshCtx workflow has three important moments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The application observes the evidence used by the agent.&lt;/li&gt;
&lt;li&gt;It declares which evidence the reasoning depends on.&lt;/li&gt;
&lt;li&gt;FreshCtx revalidates that evidence immediately before the protected action.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;freshctx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FreshnessBlocked&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reasoning&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;approval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approval.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;release_payment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prepare_payment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;send_payment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;depends_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;FreshnessBlocked&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;blocked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;approval.json&lt;/code&gt; changes before &lt;code&gt;send_payment&lt;/code&gt; runs, the action is blocked.&lt;/p&gt;

&lt;p&gt;FreshCtx does not decide whether the payment is sensible. It checks whether the declared evidence behind that decision is still current.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native async support
&lt;/h2&gt;

&lt;p&gt;Agent services increasingly run inside asynchronous applications. FreshCtx 0.3.0 adds an async context manager, async validation and protected async actions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;approval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approval.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confirm_booking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;booking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prepare_booking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;confirm_booking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;booking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;depends_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Synchronous adapter validation is moved away from the event-loop thread. The same blocking, audit and fail-closed behavior still applies.&lt;/p&gt;

&lt;p&gt;The original synchronous API remains unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concurrent dependency validation
&lt;/h2&gt;

&lt;p&gt;Checking dependencies one at a time can become expensive when an action depends on several independent sources.&lt;/p&gt;

&lt;p&gt;FreshCtx now supports bounded concurrent validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;validation_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;validation_budget_ms&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Concurrency is opt-in. The default remains one worker for compatibility.&lt;/p&gt;

&lt;p&gt;An adapter must explicitly declare that it is thread-safe before FreshCtx runs it concurrently. Adapters that do not make that declaration remain sequential.&lt;/p&gt;

&lt;p&gt;This matters because an application-supplied client, MCP session or transport may not be safe to call from multiple threads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation budgets
&lt;/h2&gt;

&lt;p&gt;A source may be slow, unavailable or rate-limited.&lt;/p&gt;

&lt;p&gt;FreshCtx now supports a total decision-validity budget. If validation does not finish within that budget, unfinished evidence becomes &lt;code&gt;UNVERIFIABLE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is not silently treated as current.&lt;/p&gt;

&lt;p&gt;FreshCtx also records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-dependency validation duration&lt;/li&gt;
&lt;li&gt;Total validation duration&lt;/li&gt;
&lt;li&gt;Worker count&lt;/li&gt;
&lt;li&gt;Configured validation budget&lt;/li&gt;
&lt;li&gt;Whether validation ran sequentially or concurrently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The budget is not unsafe thread cancellation. A validator that has already started is allowed to reach its adapter-specific timeout, but its late result is discarded. No validator is left running after the check returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bounded performance result
&lt;/h2&gt;

&lt;p&gt;We tested both wide and deep synthetic graphs containing 128 dependencies.&lt;/p&gt;

&lt;p&gt;With eight validation workers, the observed p95 results were:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Graph&lt;/th&gt;
&lt;th&gt;Sequential p95&lt;/th&gt;
&lt;th&gt;Concurrent p95&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wide&lt;/td&gt;
&lt;td&gt;181 ms&lt;/td&gt;
&lt;td&gt;29 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;29 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both paths evaluated all 128 dependencies and returned &lt;code&gt;CURRENT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These numbers are an engineering baseline, not a production latency claim. Real performance will depend on source behavior, network latency, timeouts, adapter implementation and the structure of the protected workflow.&lt;/p&gt;

&lt;p&gt;The benchmark is included so anyone can reproduce it or change the graph size:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python scripts/benchmark_validation.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--width&lt;/span&gt; 128 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workers&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--delay-ms&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--iterations&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Store migration and integrity checks
&lt;/h2&gt;

&lt;p&gt;FreshCtx uses a local SQLite store by default.&lt;/p&gt;

&lt;p&gt;Version 0.3.0 adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactional schema versioning&lt;/li&gt;
&lt;li&gt;Forward migration of existing stores&lt;/li&gt;
&lt;li&gt;Integrity checking&lt;/li&gt;
&lt;li&gt;Rejection of unsupported future schemas&lt;/li&gt;
&lt;li&gt;Clear corruption and migration errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A store created by the original v0.1 API can be opened without rewriting its existing observation and reasoning objects.&lt;/p&gt;

&lt;p&gt;If a store is damaged, FreshCtx does not guess or treat its contents as current.&lt;/p&gt;

&lt;h2&gt;
  
  
  New command-line tools
&lt;/h2&gt;

&lt;p&gt;FreshCtx now installs a command-line interface.&lt;/p&gt;

&lt;p&gt;Check the installation and local store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;freshctx doctor &lt;span class="nt"&gt;--store&lt;/span&gt; .freshctx/freshctx.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check a stored subject:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;freshctx check SUBJECT_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--store&lt;/span&gt; .freshctx/freshctx.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Summarize an audit trail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;freshctx audit &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--audit&lt;/span&gt; .freshctx/audit.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commands operate locally. They do not require an account or upload evidence to a hosted service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adapter conformance now fails closed
&lt;/h2&gt;

&lt;p&gt;FreshCtx adapters must return one of three results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;equivalent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;changed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;indeterminate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version 0.3.0 adds a shared conformance layer.&lt;/p&gt;

&lt;p&gt;If an adapter returns an invalid type or unsupported outcome, FreshCtx converts it to &lt;code&gt;UNVERIFIABLE&lt;/code&gt; instead of accepting an ambiguous result.&lt;/p&gt;

&lt;p&gt;This protects the enforcement boundary from an incorrectly implemented extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recording independent results
&lt;/h2&gt;

&lt;p&gt;The release also includes a portable validation-report schema.&lt;/p&gt;

&lt;p&gt;An external test can now record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact FreshCtx version&lt;/li&gt;
&lt;li&gt;Whether installation came from PyPI, a wheel or source&lt;/li&gt;
&lt;li&gt;The tested environment&lt;/li&gt;
&lt;li&gt;Expected and observed behavior&lt;/li&gt;
&lt;li&gt;Pass, fail or inconclusive verdict&lt;/li&gt;
&lt;li&gt;Evidence locations&lt;/li&gt;
&lt;li&gt;Limitations&lt;/li&gt;
&lt;li&gt;Validator identity, when provided&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is deliberately a bounded result format.&lt;/p&gt;

&lt;p&gt;A successful test of one scenario is evidence for that scenario. It is not automatically a security certification, production validation or proof that every agent integration is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release verification
&lt;/h2&gt;

&lt;p&gt;FreshCtx 0.3.0 passed all of its defined release gates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;68 automated tests&lt;/li&gt;
&lt;li&gt;Python 3.10, 3.11, 3.12 and 3.13&lt;/li&gt;
&lt;li&gt;Windows onboarding&lt;/li&gt;
&lt;li&gt;Static analysis&lt;/li&gt;
&lt;li&gt;Dependency audit&lt;/li&gt;
&lt;li&gt;Package and metadata verification&lt;/li&gt;
&lt;li&gt;Clean installation from public PyPI&lt;/li&gt;
&lt;li&gt;Async, payment, booking, voice-agent and manual preflight scenarios&lt;/li&gt;
&lt;li&gt;Wide and deep 128-dependency benchmarks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The public package was then installed into a brand-new environment and verified again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;freshctx&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.3.0
freshctx demo
freshctx doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PyPI:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pypi.org/project/freshctx/0.3.0/" rel="noopener noreferrer"&gt;https://pypi.org/project/freshctx/0.3.0/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hyperwise-LLC/freshctx" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.3.0" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx/releases/tag/v0.3.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;This completes the current FreshCtx Core milestone.&lt;/p&gt;

&lt;p&gt;We are testing the published package against real agent workflows involving mutable files, APIs, databases, approvals, bookings and MCP resources.&lt;/p&gt;

&lt;p&gt;If you operate an agent that revalidates information before a write, I would be interested in one specific question:&lt;/p&gt;

&lt;p&gt;Where do you currently place that boundary - inside every tool, inside the agent harness or in a separate control layer?&lt;/p&gt;

&lt;p&gt;I am looking for developers willing to run one bounded scenario from a clean &lt;code&gt;pip install freshctx==0.3.0&lt;/code&gt; environment and publish the result either way.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aiops</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>An AI agent can make a reasonable decision from accurate information—and still take the wrong action.</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Fri, 28 Aug 2026 19:16:30 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/an-ai-agent-can-make-a-reasonable-decision-from-accurate-information-and-still-take-the-wrong-4opn</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/an-ai-agent-can-make-a-reasonable-decision-from-accurate-information-and-still-take-the-wrong-4opn</guid>
      <description>&lt;p&gt;&lt;strong&gt;The problem is timing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Business systems do not pause while an agent reads data, calls tools, reasons, waits for approval, or prepares an action.&lt;/p&gt;

&lt;p&gt;During that interval:&lt;/p&gt;

&lt;p&gt;An account can be frozen.&lt;/p&gt;

&lt;p&gt;A payment authorization can be withdrawn.&lt;/p&gt;

&lt;p&gt;Inventory can be sold.&lt;/p&gt;

&lt;p&gt;A price can change.&lt;/p&gt;

&lt;p&gt;A policy can be revised.&lt;/p&gt;

&lt;p&gt;A configuration file can be updated.&lt;/p&gt;

&lt;p&gt;An API or database can become unreachable.&lt;/p&gt;

&lt;p&gt;The agent may still be holding a conclusion derived from the earlier state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap between checking and acting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most production systems already have important controls.&lt;/p&gt;

&lt;p&gt;Payment workflows have rules and approvals. Healthcare operations have authorization and access controls. E-commerce platforms have inventory and fulfillment checks. Engineering teams use GitHub, pull requests, branch protection, and CI/CD.&lt;/p&gt;

&lt;p&gt;Those controls remain necessary.&lt;/p&gt;

&lt;p&gt;But many of them establish whether something was valid when it was checked. An AI-supported workflow also needs to know whether the evidence supporting its current conclusion is still valid when the action is about to happen.&lt;/p&gt;

&lt;p&gt;That is the reasoning-to-action freshness gap.&lt;/p&gt;

&lt;p&gt;It resembles a time-of-check-to-time-of-use problem, but it also affects the reasoning derived from the changed source—not only the source itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three examples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Payments&lt;/p&gt;

&lt;p&gt;An agent reviews an account, beneficiary status, risk result, and approval records before preparing a payment.&lt;/p&gt;

&lt;p&gt;Before execution, a fraud signal changes or the account is placed on legal hold.&lt;/p&gt;

&lt;p&gt;The earlier reasoning may have been reasonable when it was produced. But the evidence supporting it is no longer current, so the payment should not proceed on the old conclusion.&lt;/p&gt;

&lt;p&gt;Healthcare operations&lt;/p&gt;

&lt;p&gt;An automated workflow reads an authorization or scheduling record. The authorization changes—or its source becomes unreachable—while the workflow is underway.&lt;/p&gt;

&lt;p&gt;The workflow should not silently treat its earlier snapshot as current.&lt;/p&gt;

&lt;p&gt;Freshness validation can complement operational and compliance controls. It does not replace clinical judgment, authorization policy, privacy safeguards, or regulatory review.&lt;/p&gt;

&lt;p&gt;E-commerce&lt;/p&gt;

&lt;p&gt;An agent prepares an order using inventory, price, fraud, and delivery-capacity evidence.&lt;/p&gt;

&lt;p&gt;Before fulfillment, the inventory falls below the requested quantity.&lt;/p&gt;

&lt;p&gt;The inventory observation is now stale. The fulfillment reasoning that depended on it must also be reconsidered. An unrelated fraud result, however, may still be current.&lt;/p&gt;

&lt;p&gt;That distinction matters. Invalidating everything is safe but inefficient. Invalidating nothing is dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What FreshCtx does&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, I’m releasing FreshCtx™ v0.1, an Apache-2.0 open-source freshness and dependency-validation runtime for AI agents.&lt;/p&gt;

&lt;p&gt;FreshCtx records the declared sources an agent observed, connects downstream reasoning to those observations, and revalidates the dependencies at a protected action boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It produces four explicit states:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CURRENT: every reachable, declared dependency was successfully revalidated as equivalent.&lt;/p&gt;

&lt;p&gt;STALE_SOURCE: an observed source changed.&lt;/p&gt;

&lt;p&gt;STALE_REASONING: reasoning depends on stale evidence.&lt;/p&gt;

&lt;p&gt;UNVERIFIABLE: FreshCtx could not safely determine whether the dependency is still current.&lt;/p&gt;

&lt;p&gt;UNVERIFIABLE never silently becomes CURRENT.&lt;/p&gt;

&lt;p&gt;The configured policy can block, warn, allow, or perform one bounded refresh. Blocking is the default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FreshCtx supports Python 3.10 through 3.13.&lt;/p&gt;

&lt;p&gt;python -m pip install freshctx==0.1.0&lt;/p&gt;

&lt;p&gt;To use the optional Postgres adapter:&lt;/p&gt;

&lt;p&gt;python -m pip install 'freshctx[postgres]==0.1.0'&lt;/p&gt;

&lt;p&gt;No account is required, and the runtime sends no telemetry.&lt;/p&gt;

&lt;p&gt;A minimal example&lt;/p&gt;

&lt;p&gt;Imagine an agent selecting a deployment target from a configuration file:&lt;/p&gt;

&lt;p&gt;from pathlib import Path&lt;br&gt;
from tempfile import TemporaryDirectory&lt;/p&gt;

&lt;p&gt;from freshctx import MemoryStore, guard, observe, reasoning&lt;/p&gt;

&lt;p&gt;def deploy(target: str) -&amp;gt; None:&lt;br&gt;
    print(f"DEPLOYED to {target}")&lt;/p&gt;

&lt;p&gt;with TemporaryDirectory() as directory:&lt;br&gt;
    root = Path(directory)&lt;br&gt;
    config = root / "deployment.env"&lt;br&gt;
    audit = root / "freshctx-audit.jsonl"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config.write_text("TARGET=staging\n", encoding="utf-8")

with guard(
    policy="block",
    store=MemoryStore(),
    audit_path=audit,
) as ctx:
    source = observe(config)

    with reasoning(
        "choose_target",
        depends_on=[source],
    ) as decision:
        target = "staging"

    ctx.run(
        deploy,
        target,
        depends_on=[decision],
    )

print(f"FreshCtx state: {ctx.result.state.value}")
print(f"Audit file: {audit}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Expected output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DEPLOYED to staging&lt;br&gt;
FreshCtx state: CURRENT&lt;br&gt;
Audit file: /.../freshctx-audit.jsonl&lt;/p&gt;

&lt;p&gt;Before deploy() runs, FreshCtx revalidates the declared dependency.&lt;/p&gt;

&lt;p&gt;If the configuration changes after observation, the source becomes STALE_SOURCE, the dependent decision becomes STALE_REASONING, and the protected action is blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency-aware invalidation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FreshCtx does not automatically invalidate every conclusion whenever anything changes.&lt;/p&gt;

&lt;p&gt;Suppose an audit contains three findings:&lt;/p&gt;

&lt;p&gt;retention policy ──&amp;gt; retention finding&lt;br&gt;
access evidence  ──&amp;gt; access finding&lt;br&gt;
backup evidence  ──&amp;gt; backup finding&lt;/p&gt;

&lt;p&gt;If only the retention policy changes, FreshCtx can mark the retention observation STALE_SOURCE and its dependent finding STALE_REASONING.&lt;/p&gt;

&lt;p&gt;The access and backup findings can remain CURRENT.&lt;/p&gt;

&lt;p&gt;FreshCtx follows the declared dependency graph rather than treating the entire workflow as one undifferentiated cache entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What CURRENT does—and does not—prove&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CURRENT means that every reachable, declared dependency was successfully revalidated as equivalent under its configured adapter at check time.&lt;/p&gt;

&lt;p&gt;It does not prove:&lt;/p&gt;

&lt;p&gt;The source itself is true.&lt;/p&gt;

&lt;p&gt;The agent’s reasoning is correct.&lt;/p&gt;

&lt;p&gt;The action is authorized.&lt;/p&gt;

&lt;p&gt;The action is safe or compliant.&lt;/p&gt;

&lt;p&gt;Every relevant dependency was declared.&lt;/p&gt;

&lt;p&gt;The wider world has not changed.&lt;/p&gt;

&lt;p&gt;FreshCtx validates the freshness of declared dependencies. It is not a truth engine, authorization system, policy engine, or compliance certification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why CI/CD is not enough&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CI/CD establishes that a particular commit passed its configured checks.&lt;/p&gt;

&lt;p&gt;FreshCtx answers a different question:&lt;/p&gt;

&lt;p&gt;Is the evidence supporting this specific action still current now?&lt;/p&gt;

&lt;p&gt;A CI pipeline can verify a commit. FreshCtx can revalidate the declared Git path, file, API response, database row, or MCP resource supporting an agent’s current action.&lt;/p&gt;

&lt;p&gt;GitHub and CI/CD remain essential. FreshCtx operates at the reasoning-to-action boundary they do not cover.&lt;/p&gt;

&lt;p&gt;Similarly, memory tells an agent what it previously knew. FreshCtx checks whether that knowledge is still current.&lt;/p&gt;

&lt;p&gt;Adapters in v0.1&lt;/p&gt;

&lt;p&gt;FreshCtx v0.1 includes adapters for:&lt;/p&gt;

&lt;p&gt;Filesystem&lt;/p&gt;

&lt;p&gt;Git&lt;/p&gt;

&lt;p&gt;HTTP&lt;/p&gt;

&lt;p&gt;Postgres&lt;/p&gt;

&lt;p&gt;MCP&lt;/p&gt;

&lt;p&gt;The runtime is local-first, model-neutral, and framework-neutral. It does not require OpenAI, Anthropic, LangChain, or any other particular model or agent framework.&lt;/p&gt;

&lt;p&gt;It also includes local JSONL audit events, SQLite and in-memory stores, machine-readable schemas, a documented adapter contract, security semantics, and executable reference scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try the drift demos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clone the repository and run the three reference demonstrations:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/Hyperwise-LLC/freshctx.git" rel="noopener noreferrer"&gt;https://github.com/Hyperwise-LLC/freshctx.git&lt;/a&gt;&lt;br&gt;
cd freshctx&lt;/p&gt;

&lt;p&gt;python -m venv .venv&lt;br&gt;
source .venv/bin/activate&lt;/p&gt;

&lt;p&gt;python -m pip install .&lt;br&gt;
python examples/coding_file_drift.py&lt;br&gt;
python examples/configuration_api_drift.py&lt;br&gt;
python examples/audit_reasoning_drift.py&lt;/p&gt;

&lt;p&gt;The examples demonstrate:&lt;/p&gt;

&lt;p&gt;A file changing after an agent observes it.&lt;/p&gt;

&lt;p&gt;An API-backed configuration changing while reasoning is underway.&lt;/p&gt;

&lt;p&gt;Evidence supporting only one audit finding changing while unrelated findings remain current.&lt;/p&gt;

&lt;p&gt;Project links&lt;/p&gt;

&lt;p&gt;FreshCtx repository&lt;/p&gt;

&lt;p&gt;README and quickstart&lt;/p&gt;

&lt;p&gt;FreshCtx v0.1.0 release&lt;/p&gt;

&lt;p&gt;PyPI package&lt;/p&gt;

&lt;p&gt;Versioned specification&lt;/p&gt;

&lt;p&gt;Adapter contract&lt;/p&gt;

&lt;p&gt;Security model&lt;/p&gt;

&lt;p&gt;Validated reference scenarios&lt;/p&gt;

&lt;p&gt;FreshCtx™ is an independent Apache-2.0 open-source project owned and stewarded by Hyperwise LLC.&lt;/p&gt;

&lt;p&gt;If you build AI-supported workflows that act on mutable systems, I would be interested to hear where the reasoning-to-action freshness gap appears in your architecture—and which sources your agent would need to revalidate.&lt;/p&gt;

&lt;p&gt;_Disclosure: I am associated with the team releasing FreshCtx. AI-assisted editing was used to improve the structure of this article. The technical claims, examples, and final text were reviewed against the released FreshCtx v0.1.0 implementation and documentation.  &lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Missing Layer in Modern Supply Chains: Execution</title>
      <dc:creator>Indu Das</dc:creator>
      <pubDate>Tue, 03 Feb 2026 04:44:20 +0000</pubDate>
      <link>https://dev.to/indu_das_e14b18dd167a8cf7/the-missing-layer-in-modern-supply-chains-execution-5e25</link>
      <guid>https://dev.to/indu_das_e14b18dd167a8cf7/the-missing-layer-in-modern-supply-chains-execution-5e25</guid>
      <description>&lt;p&gt;Why visibility, planning, and control towers still fail without an execution layer&lt;/p&gt;

&lt;p&gt;For the last decade, supply chains have invested heavily in visibility, analytics, and planning systems.&lt;/p&gt;

&lt;p&gt;We can see disruptions in real time.&lt;br&gt;
We can simulate scenarios.&lt;br&gt;
We can forecast demand with increasing accuracy.&lt;/p&gt;

&lt;p&gt;Yet supply chains still break at the same point: execution.&lt;/p&gt;

&lt;p&gt;When a disruption occurs, the hard questions are not analytical—they are operational:&lt;br&gt;
    • Who reallocates inventory?&lt;br&gt;
    • Which orders get substituted?&lt;br&gt;
    • Which constraints apply?&lt;br&gt;
    • Which partners act first?&lt;br&gt;
    • How do we confirm the decision was executed?&lt;/p&gt;

&lt;p&gt;Most organizations answer these questions manually, through meetings, spreadsheets, and escalations. That’s not a tooling failure. It’s a missing system layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The execution gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visibility tells you what happened.&lt;br&gt;
Planning tells you what should happen.&lt;br&gt;
Control towers tell you where attention is needed.&lt;/p&gt;

&lt;p&gt;None of them ensure coordinated action across a multi-tier supply chain network.&lt;/p&gt;

&lt;p&gt;This gap becomes more severe as supply chains grow more complex:&lt;br&gt;
    • Multiple suppliers&lt;br&gt;
    • Distributed warehouses&lt;br&gt;
    • External logistics partners&lt;br&gt;
    • Regulatory and contractual constraints&lt;br&gt;
    • Shared responsibility across organizations&lt;/p&gt;

&lt;p&gt;At that point, execution can’t remain informal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a supply chain execution layer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A supply chain execution layer is the operational software layer that coordinates and enforces real-time decisions across multi-hierarchical supply chain networks.&lt;/p&gt;

&lt;p&gt;It translates plans, constraints, and signals into executable actions across suppliers, warehouses, distributors, and retailers—and tracks what actually happened.&lt;/p&gt;

&lt;p&gt;This layer sits above existing systems like ERP, WMS, TMS, and POS.&lt;br&gt;
Those systems remain in place. The execution layer operates across them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it differs from existing systems&lt;/strong&gt;&lt;br&gt;
    • ERP systems record transactions and internal processes.&lt;br&gt;
    • Planning systems optimize forecasts and scenarios.&lt;br&gt;
    • Control towers provide visibility and alerts.&lt;/p&gt;

&lt;p&gt;An execution layer does something different:&lt;br&gt;
    • Validates decisions against constraints&lt;br&gt;
    • Orchestrates actions across parties&lt;br&gt;
    • Coordinates timing and responsibility&lt;br&gt;
    • Creates accountability for outcomes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution is not a feature.&lt;br&gt;
It’s a system role.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern supply chains are no longer linear or single-owner systems. They are shared networks.&lt;/p&gt;

&lt;p&gt;In shared networks:&lt;br&gt;
    • Decisions have downstream effects&lt;br&gt;
    • Constraints vary by partner&lt;br&gt;
    • Accountability is distributed&lt;br&gt;
    • Manual coordination does not scale&lt;/p&gt;

&lt;p&gt;Without an execution layer, organizations end up with excellent insight and inconsistent action.&lt;/p&gt;

&lt;p&gt;Resilience is not achieved at planning time.&lt;br&gt;
It is achieved at execution time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A practical example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a late supplier shipment.&lt;/p&gt;

&lt;p&gt;Visibility tools detect it.&lt;br&gt;
Planning tools recalculate scenarios.&lt;/p&gt;

&lt;p&gt;But execution requires:&lt;br&gt;
    • Reallocating inventory across nodes&lt;br&gt;
    • Substituting SKUs within constraints&lt;br&gt;
    • Rerouting fulfillment paths&lt;br&gt;
    • Coordinating approvals across organizations&lt;br&gt;
    • Confirming actions were completed&lt;/p&gt;

&lt;p&gt;Without an execution layer, this work happens outside the system.&lt;br&gt;
With one, it becomes coordinated, auditable, and repeatable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where this fits in practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At Opsis, we’re building systems designed to operate as this execution layer—coordinating real-time decisions across multi-hierarchical supply chain networks while operating above existing enterprise systems.&lt;/p&gt;

&lt;p&gt;For a concrete explanation of how this layer works in practice, see:&lt;br&gt;
👉 &lt;a href="https://opsisone.com/execution-layer" rel="noopener noreferrer"&gt;https://opsisone.com/execution-layer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>supplychain</category>
      <category>architecture</category>
      <category>enterprise</category>
      <category>operations</category>
    </item>
  </channel>
</rss>
