<?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: Achir othmane</title>
    <description>The latest articles on DEV Community by Achir othmane (@othy19904eng).</description>
    <link>https://dev.to/othy19904eng</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%2F4135542%2Fbb7bdce4-d073-4128-ae68-5049de9fd32e.png</url>
      <title>DEV Community: Achir othmane</title>
      <link>https://dev.to/othy19904eng</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/othy19904eng"/>
    <language>en</language>
    <item>
      <title>Your AI Agent Passed the Approval Check. Did the Side Effect?</title>
      <dc:creator>Achir othmane</dc:creator>
      <pubDate>Tue, 22 Sep 2026 09:08:27 +0000</pubDate>
      <link>https://dev.to/othy19904eng/your-ai-agent-passed-the-approval-check-did-the-side-effect-3356</link>
      <guid>https://dev.to/othy19904eng/your-ai-agent-passed-the-approval-check-did-the-side-effect-3356</guid>
      <description>&lt;p&gt;Most AI agent safety systems ask a question like:&lt;/p&gt;

&lt;p&gt;«Is this action allowed?»&lt;/p&gt;

&lt;p&gt;That is necessary.&lt;/p&gt;

&lt;p&gt;But for action-taking agents, it may not be enough.&lt;/p&gt;

&lt;p&gt;Imagine that your intended production path looks like this:&lt;/p&gt;

&lt;p&gt;agent&lt;br&gt;
  ↓&lt;br&gt;
approval:P&lt;br&gt;
  ↓&lt;br&gt;
deploy_to_production&lt;/p&gt;

&lt;p&gt;You add the approval. You test it. The expected tool path respects it.&lt;/p&gt;

&lt;p&gt;Everything looks fine.&lt;/p&gt;

&lt;p&gt;But the same agent also has access to a shell.&lt;/p&gt;

&lt;p&gt;Now another path exists:&lt;/p&gt;

&lt;p&gt;agent&lt;br&gt;
  ↓&lt;br&gt;
shell&lt;br&gt;
  ↓&lt;br&gt;
gh workflow run deploy.yml&lt;br&gt;
  ↓&lt;br&gt;
production&lt;/p&gt;

&lt;p&gt;The approval system may be perfectly correct.&lt;/p&gt;

&lt;p&gt;The problem is that the consequence was reachable through another path.&lt;/p&gt;

&lt;p&gt;That is the problem I have been experimenting with in an open-source project called Agent Action Guard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/othy19904-eng/agent-action-guard" rel="noopener noreferrer"&gt;https://github.com/othy19904-eng/agent-action-guard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authorization correctness is not consequence completeness&lt;/p&gt;

&lt;p&gt;There are two different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Did the policy correctly authorize this action?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can the agent reach the same real-world consequence&lt;br&gt;
through another execution path?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those are not equivalent.&lt;/p&gt;

&lt;p&gt;I represent the second one as:&lt;/p&gt;

&lt;p&gt;expected:&lt;/p&gt;

&lt;p&gt;agent&lt;br&gt;
  -&amp;gt; approval:P&lt;br&gt;
  -&amp;gt; production_deploy&lt;/p&gt;

&lt;p&gt;versus:&lt;/p&gt;

&lt;p&gt;counterexample:&lt;/p&gt;

&lt;p&gt;agent&lt;br&gt;
  -&amp;gt; shell.exec&lt;br&gt;
  -&amp;gt; workflow:deploy.yml&lt;br&gt;
  -&amp;gt; production_deploy&lt;/p&gt;

&lt;p&gt;The static scanner in the project looks for that second path.&lt;/p&gt;

&lt;p&gt;It can return:&lt;/p&gt;

&lt;p&gt;COUNTEREXAMPLE_FOUND&lt;br&gt;
COVERED_WITHIN_MODEL&lt;br&gt;
UNKNOWN&lt;/p&gt;

&lt;p&gt;Importantly:&lt;/p&gt;

&lt;p&gt;COVERED_WITHIN_MODEL != proven safe&lt;br&gt;
UNKNOWN != impossible&lt;/p&gt;

&lt;p&gt;The scanner is deliberately conservative.&lt;/p&gt;

&lt;p&gt;But static analysis creates another problem.&lt;/p&gt;

&lt;p&gt;A route being possible does not mean the agent actually used it.&lt;/p&gt;

&lt;p&gt;So I added a second layer.&lt;/p&gt;

&lt;p&gt;Runtime Witness&lt;/p&gt;

&lt;p&gt;The runtime layer asks:&lt;/p&gt;

&lt;p&gt;«What path was actually observed when the protected consequence occurred?»&lt;/p&gt;

&lt;p&gt;That produces a different set of results:&lt;/p&gt;

&lt;p&gt;BOUNDARY_OBSERVED&lt;br&gt;
OBSERVED_BYPASS&lt;br&gt;
UNRESOLVED_TRACE&lt;/p&gt;

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

&lt;p&gt;root:agent&lt;br&gt;
  ↓&lt;br&gt;
boundary:approval:P&lt;br&gt;
  ↓&lt;br&gt;
tool:deploy&lt;br&gt;
  ↓&lt;br&gt;
consequence:production_deploy&lt;/p&gt;

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

&lt;p&gt;BOUNDARY_OBSERVED&lt;/p&gt;

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

&lt;p&gt;root:agent&lt;br&gt;
  ↓&lt;br&gt;
effect:shell.exec&lt;br&gt;
  ↓&lt;br&gt;
workflow:deploy.yml&lt;br&gt;
  ↓&lt;br&gt;
consequence:production_deploy&lt;/p&gt;

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

&lt;p&gt;OBSERVED_BYPASS&lt;/p&gt;

&lt;p&gt;There is an important third state.&lt;/p&gt;

&lt;p&gt;If the execution evidence is incomplete, the system does not infer safety and does not infer a bypass.&lt;/p&gt;

&lt;p&gt;It returns:&lt;/p&gt;

&lt;p&gt;UNRESOLVED_TRACE&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Absence of an approval event in a broken log is not evidence that approval was bypassed.&lt;/p&gt;

&lt;p&gt;Connecting it to OpenAI Agents SDK&lt;/p&gt;

&lt;p&gt;The project now has an experimental adapter for the OpenAI Agents SDK.&lt;/p&gt;

&lt;p&gt;It observes the real local tool lifecycle through "RunHooks".&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;p&gt;hooks = OpenAIAgentsWitnessHooks(&lt;br&gt;
    trace_path,&lt;br&gt;
    tool_consequences={&lt;br&gt;
        "write_marker": "local_file_write"&lt;br&gt;
    },&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;result = await Runner.run(&lt;br&gt;
    agent,&lt;br&gt;
    "Write the marker file.",&lt;br&gt;
    hooks=hooks,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;If the application observes the expected approval boundary:&lt;/p&gt;

&lt;p&gt;hooks.boundary("approval:P")&lt;/p&gt;

&lt;p&gt;After the run completes:&lt;/p&gt;

&lt;p&gt;hooks.finalize()&lt;/p&gt;

&lt;p&gt;Runtime Witness can then test whether the observed consequence path contained that boundary.&lt;/p&gt;

&lt;p&gt;Try the complete demo&lt;/p&gt;

&lt;p&gt;Clone the repository and install the optional adapter:&lt;/p&gt;

&lt;p&gt;python -m pip install ".[openai-agents]"&lt;/p&gt;

&lt;p&gt;Then run the guarded case:&lt;/p&gt;

&lt;p&gt;python examples/openai_agents_runtime_witness.py --mode guarded&lt;/p&gt;

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

&lt;p&gt;BOUNDARY_OBSERVED&lt;/p&gt;

&lt;p&gt;Now run exactly the same agent/tool pipeline without the approval boundary:&lt;/p&gt;

&lt;p&gt;python examples/openai_agents_runtime_witness.py --mode bypass&lt;/p&gt;

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

&lt;p&gt;OBSERVED_BYPASS&lt;/p&gt;

&lt;p&gt;The demo executes a real Python function tool that performs a temporary filesystem side effect.&lt;/p&gt;

&lt;p&gt;It does not require an OpenAI API key or a model request.&lt;/p&gt;

&lt;p&gt;The test uses the Agents SDK's deterministic testing model so that the actual Runner and tool orchestration can be exercised reproducibly.&lt;/p&gt;

&lt;p&gt;I intentionally do not record everything&lt;/p&gt;

&lt;p&gt;An execution-security tool can easily become a new data-leak surface.&lt;/p&gt;

&lt;p&gt;So the OpenAI Agents adapter currently records only minimal lifecycle evidence such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool name and tool-call identity&lt;/li&gt;
&lt;li&gt;observed boundary events&lt;/li&gt;
&lt;li&gt;successful tool completion&lt;/li&gt;
&lt;li&gt;mapped consequence&lt;/li&gt;
&lt;li&gt;trace-completeness attestation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not persist tool arguments, prompts, model outputs, stdout, or stderr by default.&lt;/p&gt;

&lt;p&gt;For many systems, those values may contain credentials, customer information, proprietary code, or other sensitive data.&lt;/p&gt;

&lt;p&gt;Why require trace completeness?&lt;/p&gt;

&lt;p&gt;Suppose this is all you see:&lt;/p&gt;

&lt;p&gt;agent&lt;br&gt;
  ↓&lt;br&gt;
tool&lt;br&gt;
  ↓&lt;br&gt;
production consequence&lt;/p&gt;

&lt;p&gt;Was approval bypassed?&lt;/p&gt;

&lt;p&gt;Maybe.&lt;/p&gt;

&lt;p&gt;Or perhaps the approval event simply disappeared because your telemetry pipeline dropped it.&lt;/p&gt;

&lt;p&gt;So an "OBSERVED_BYPASS" requires an explicit completed trace.&lt;/p&gt;

&lt;p&gt;Without sufficient evidence:&lt;/p&gt;

&lt;p&gt;UNRESOLVED_TRACE&lt;/p&gt;

&lt;p&gt;I would rather return “I don't know” than silently convert missing evidence into a security claim.&lt;/p&gt;

&lt;p&gt;Static evidence + runtime evidence&lt;/p&gt;

&lt;p&gt;The direction I am exploring is therefore:&lt;/p&gt;

&lt;p&gt;repository&lt;br&gt;
   ↓&lt;br&gt;
static consequence graph&lt;br&gt;
   ↓&lt;br&gt;
possible alternate path&lt;br&gt;
   ↓&lt;br&gt;
real agent execution&lt;br&gt;
   ↓&lt;br&gt;
runtime witness&lt;br&gt;
   ↓&lt;br&gt;
observed boundary verdict&lt;/p&gt;

&lt;p&gt;The static layer tells you:&lt;/p&gt;

&lt;p&gt;this bypass CAN exist&lt;/p&gt;

&lt;p&gt;The runtime layer tells you:&lt;/p&gt;

&lt;p&gt;this path WAS observed&lt;/p&gt;

&lt;p&gt;Neither is meant to replace authorization engines, guardrails, or approvals.&lt;/p&gt;

&lt;p&gt;The question is different:&lt;/p&gt;

&lt;p&gt;«After you created the safety boundary, is that boundary actually complete around the consequence you care about?»&lt;/p&gt;

&lt;p&gt;The project is still early and intentionally narrow.&lt;/p&gt;

&lt;p&gt;If you are building action-taking agents with OpenAI Agents SDK, I am particularly interested in real-world tests.&lt;/p&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/othy19904-eng/agent-action-guard" rel="noopener noreferrer"&gt;https://github.com/othy19904-eng/agent-action-guard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you test it, the most useful feedback is simple:&lt;/p&gt;

&lt;p&gt;Did it report a real path?&lt;br&gt;
Did it produce a false positive?&lt;br&gt;
Would this check be useful enough to keep in CI?&lt;/p&gt;

&lt;p&gt;That evidence will determine what gets built next.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your Shopify Store Can Be Selling While GA4 Is Wrong — I Built a Tool to Check</title>
      <dc:creator>Achir othmane</dc:creator>
      <pubDate>Mon, 21 Sep 2026 19:10:56 +0000</pubDate>
      <link>https://dev.to/othy19904eng/your-shopify-store-can-be-selling-while-ga4-is-wrong-i-built-a-tool-to-check-4475</link>
      <guid>https://dev.to/othy19904eng/your-shopify-store-can-be-selling-while-ga4-is-wrong-i-built-a-tool-to-check-4475</guid>
      <description>&lt;p&gt;Before changing the tracking stack again, I’d separate two different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How many Shopify orders were actually eligible to be attributed to Google Ads?&lt;/li&gt;
&lt;li&gt;Of the orders/conversions that should exist in the measurement layer, are any missing, duplicated, or carrying the wrong value?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those are different problems. 80 Shopify orders vs 16 Google Ads conversions does not by itself prove that 64 conversions were lost, because not every order necessarily came from an eligible Google Ads click.&lt;/p&gt;

&lt;p&gt;I’m building an open-source tool called ConversionGuard specifically to reconcile authoritative ecommerce orders against measured purchase records by transaction ID, value and currency.&lt;/p&gt;

&lt;p&gt;It can flag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing purchase records&lt;/li&gt;
&lt;li&gt;duplicate transaction IDs&lt;/li&gt;
&lt;li&gt;value/currency mismatches&lt;/li&gt;
&lt;li&gt;measured conversions with no corresponding order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the first 3 Shopify stores I’m doing the audit free to validate it on real data. No production credentials are required for the first pass — sanitized CSV exports are enough.&lt;/p&gt;

&lt;p&gt;Project:&lt;br&gt;
&lt;a href="https://github.com/othy19904-eng/conversionguard" rel="noopener noreferrer"&gt;https://github.com/othy19904-eng/conversionguard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pilot:&lt;br&gt;
&lt;a href="https://github.com/othy19904-eng/conversionguard/issues/1" rel="noopener noreferrer"&gt;https://github.com/othy19904-eng/conversionguard/issues/1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built a scanner for AI-agent approval bypass paths</title>
      <dc:creator>Achir othmane</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:31:23 +0000</pubDate>
      <link>https://dev.to/othy19904eng/i-built-a-scanner-for-ai-agent-approval-bypass-paths-l51</link>
      <guid>https://dev.to/othy19904eng/i-built-a-scanner-for-ai-agent-approval-bypass-paths-l51</guid>
      <description>&lt;p&gt;AI agents can have valid access to tools and APIs, but access is not the same thing as authority.&lt;/p&gt;

&lt;p&gt;Suppose an agent is expected to reach production only through an approval boundary:&lt;/p&gt;

&lt;p&gt;agent → approval → production deploy ✅&lt;/p&gt;

&lt;p&gt;But the same repository may contain another execution path:&lt;/p&gt;

&lt;p&gt;agent → shell → gh workflow run → production deploy ❌&lt;/p&gt;

&lt;p&gt;I built an early open-source scanner to look for this specific class of problem.&lt;/p&gt;

&lt;p&gt;It builds a modeled consequence path across Python and GitHub Actions and asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is there another modeled route to the same real-world consequence that does not cross the expected approval boundary?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When it can prove such a path, it returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COUNTEREXAMPLE_FOUND&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the path it followed&lt;/li&gt;
&lt;li&gt;source-code evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It deliberately does not claim full repository completeness.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UNKNOWN&lt;/code&gt; is not interpreted as safe, and &lt;code&gt;COVERED_WITHIN_MODEL&lt;/code&gt; is limited to what the current model could analyze.&lt;/p&gt;

&lt;p&gt;The current MVP is intentionally narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;production-deployment consequence paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First run:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
python -m pip install .
consequence-boundary . --consequence production_deploy --boundary P

Repository:
https://github.com/othy19904-eng/agent-action-guard

I’m specifically looking for people building action-taking AI agents or automated workflows who can run it on a real repository.

The most useful feedback would be:

Did you get COUNTEREXAMPLE_FOUND, COVERED_WITHIN_MODEL, or UNKNOWN?

If it found a path, was it real or a false positive?

Would a check like this be useful enough to keep in CI?

This is an early demand test before I add more features.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
