<?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: Diana Aliya</title>
    <description>The latest articles on DEV Community by Diana Aliya (@evaaliya).</description>
    <link>https://dev.to/evaaliya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4078423%2F9a396bb2-d49b-467b-9187-8af09be35e19.gif</url>
      <title>DEV Community: Diana Aliya</title>
      <link>https://dev.to/evaaliya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evaaliya"/>
    <language>en</language>
    <item>
      <title>Build, Ship, Shape: Amazon Developer Hackathon</title>
      <dc:creator>Diana Aliya</dc:creator>
      <pubDate>Tue, 13 Oct 2026 21:38:35 +0000</pubDate>
      <link>https://dev.to/evaaliya/build-ship-shape-amazon-developer-hackathon-aid</link>
      <guid>https://dev.to/evaaliya/build-ship-shape-amazon-developer-hackathon-aid</guid>
      <description>&lt;h1&gt;
  
  
  Alguard: a two-tier trust layer for agentic purchases
&lt;/h1&gt;

&lt;p&gt;I just submitted &lt;a href="https://github.com/evaaliya/Alguard" rel="noopener noreferrer"&gt;Alguard&lt;/a&gt; to the&lt;br&gt;
Amazon Developer Hackathon (Alexa+ track). This is a short write-up of the&lt;br&gt;
architecture and the reasoning behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;An agent that can spend money is an agent that can be prompt-injected.&lt;br&gt;
Classic defenses (LLM guardrails, prompting) are &lt;strong&gt;advisory&lt;/strong&gt; — a&lt;br&gt;
sufficiently clever injection gets around them. If Alexa+ can "just buy&lt;br&gt;
it," the failure mode is real money lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The invariant
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The system that requests a risky action is never the system that&lt;br&gt;
approves it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a structural rule, not a prompt. It shapes the whole server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two tiers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tier 1 — the MCP server&lt;/strong&gt; (&lt;code&gt;mcp_server/server.py&lt;/code&gt;). Exposes exactly&lt;br&gt;
three tools over Streamable HTTP (MCP spec 2025-11-25):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;attempt_purchase&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_session_status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_audit_trail&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No approve tool. Not hidden, not guarded — absent from the schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2 — the human channel&lt;/strong&gt; (&lt;code&gt;web_api/resolve_action.py&lt;/code&gt;). A separate&lt;br&gt;
FastAPI service on port 8010, behind its own OAuth audience and its own&lt;br&gt;
&lt;code&gt;approve&lt;/code&gt; scope. The only place a HALTED action can be resolved.&lt;/p&gt;

&lt;p&gt;There is no network path from Tier 1 to Tier 2. The customer carries an&lt;br&gt;
&lt;code&gt;action_id&lt;/code&gt; by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The risk engine
&lt;/h2&gt;

&lt;p&gt;Every attempt is scored on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Category severity&lt;/strong&gt; — gift cards, crypto, wire transfers are High;
groceries are Low&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anomalies&lt;/strong&gt; — new merchant, amount spike vs. history, frequency
spike, retry-after-halt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner trust&lt;/strong&gt; — bumped +0.03 on approval, -0.15 on denial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus hard rules that no amount of trust bypasses: &amp;gt;$1000 single purchase,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;$1500/h, &amp;gt;$3000/24h, High-severity category, retry-after-halt within 24h,&lt;br&gt;
$250 at an unapproved merchant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What made this hard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concurrency.&lt;/strong&gt; Two concurrent approvals must yield exactly one winner.&lt;br&gt;
The resolver is a single conditional UPDATE with a &lt;code&gt;rowcount == 1&lt;/code&gt; check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crash consistency.&lt;/strong&gt; If the process dies between "approved" and&lt;br&gt;
"fulfilled," &lt;code&gt;reconcile_unfulfilled()&lt;/code&gt; heals it on startup — idempotently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-process dedup.&lt;/strong&gt; The in-process lock is a fast path, not the&lt;br&gt;
guarantee. &lt;code&gt;insert_action_if_not_duplicate()&lt;/code&gt; runs check + insert inside&lt;br&gt;
&lt;code&gt;BEGIN IMMEDIATE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock is non-critical.&lt;/strong&gt; The explanation text is generated by&lt;br&gt;
&lt;code&gt;converse&lt;/code&gt;, but a Bedrock failure never changes the decision — the&lt;br&gt;
fallback template is honest about what it is (&lt;code&gt;source = local-fallback&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Red-team
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;demo/showcase.py&lt;/code&gt; runs 15 attacks a hostile agent would try — category&lt;br&gt;
lying, laundering a halt by retrying, session_id rotation, NaN amounts,&lt;br&gt;
serial overspend. All caught. &lt;code&gt;ALL ATTACKS HANDLED&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Wire &lt;code&gt;resolve_pending_action&lt;/code&gt; to a real charge (Checkout /
&lt;code&gt;ChargePermissionId&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Replace the text-heuristic category inference with MCC data&lt;/li&gt;
&lt;li&gt;Split the shared SQLite into per-tier stores&lt;/li&gt;
&lt;li&gt;Add EWMA-based drift detection (the current check catches spikes, not
slow upward drift)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/evaaliya/Alguard" rel="noopener noreferrer"&gt;Repo:&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>mcp</category>
      <category>aishopping</category>
    </item>
    <item>
      <title>Agents for Humans</title>
      <dc:creator>Diana Aliya</dc:creator>
      <pubDate>Sun, 13 Sep 2026 18:02:46 +0000</pubDate>
      <link>https://dev.to/evaaliya/agents-for-humans-1id6</link>
      <guid>https://dev.to/evaaliya/agents-for-humans-1id6</guid>
      <description>&lt;h2&gt;
  
  
  The Problem, In One Sentence
&lt;/h2&gt;

&lt;p&gt;Data catalogs are excellent at telling you your data is broken. They are considerably worse at actually fixing it. Someone still has to write the SQL, get it reviewed, and ship it. Albugent tries to close that specific gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;It scans SQLite datasets, finds the classics—negative billing amounts, NULL patient names, exposed PII—and generates a targeted fix for each. No giant, all-or-nothing SQL script. Just one isolated fix per problem, where you click Approve or Reject and move on. There's also a full CLI mode where an agent investigates everything on its own and opens a GitHub PR with a written report.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2fk7tg7pxohy3qchpen1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2fk7tg7pxohy3qchpen1.jpeg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And Here's the Part I Actually Care About
&lt;/h2&gt;

&lt;p&gt;The agent never touches the database. Not because it was told not to in a system prompt, but because it cannot. No write-access function is exposed to its runtime. Only a plain Python function, triggered strictly by a human clicking Approve, can execute any writes.&lt;br&gt;
I went back and forth on whether this was overkill for a hackathon demo. It was not. The one time I let a patch auto-apply, it overwrote a legitimately empty column—a delivery date for an order still in transit—with a default value, because the logic hadn't yet learned the difference between "this is broken" and "this is just what normal looks like sometimes." Small bug on a demo dataset, but absolutely unacceptable in production.&lt;br&gt;
The point is: don't ask the model to be careful. Just don't give it the capabilities to be careless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things That Actually Broke (Said With Love)
&lt;/h2&gt;

&lt;p&gt;A risk-scoring function had a parameter mismatch that silently zeroed out risk scores for a while, and I didn't notice because the flat numbers looked fine. A date-matching check happily paired two unrelated date columns together because it only asked "does this look like a date," never "should these two go together." Neither of these is a dramatic bug, but both would've been mortifying to demo if I hadn't caught them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Tell Someone Doing This Next
&lt;/h2&gt;

&lt;p&gt;Don't let the LLM do arithmetic or decide what "risky" means through vibes and a hopeful prompt when you can just compute it. Save the model for what's genuinely hard to hardcode—prioritizing the investigation or writing summaries humans actually want to read. Everything else with exactly one correct answer belongs in code, not in a model that is confidently wrong exactly as often as it is confidently right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt;&lt;br&gt;
Special thanks to AWS for hosting this hackathon, providing access to Bedrock, and building the infrastructure around Strands and MCP that made integrating agentic workflows into this architecture so seamless.&lt;br&gt;
Project Links&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/evaaliya/albugent_v2.0w" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/bugIL_5iie8?si=mQ3jqZMPOx0g3lDf" rel="noopener noreferrer"&gt;3-Minute Demo Video&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/evaaliya"&gt;Engineering Retrospective on DEV.to&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>mcp</category>
      <category>bedrock</category>
      <category>ai</category>
    </item>
    <item>
      <title>Albuget WebMCP</title>
      <dc:creator>Diana Aliya</dc:creator>
      <pubDate>Mon, 07 Sep 2026 17:32:23 +0000</pubDate>
      <link>https://dev.to/evaaliya/albuget-webmcp-ajk</link>
      <guid>https://dev.to/evaaliya/albuget-webmcp-ajk</guid>
      <description>&lt;p&gt;Submitted my entry for the WebMCP Challenge: &lt;strong&gt;Albugent WebMCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Traditional data governance tools usually require shipping sensitive datasets to external servers to scan for PII and compliance risks. I wanted to see if we could do the entire pipeline locally, right inside the browser.&lt;/p&gt;

&lt;p&gt;Albugent runs SQLite WASM inside a Web Worker. All SQL queries, anomaly profiling, and data masking happen strictly in browser RAM—zero data leaves the client. The AI agent registers tools natively using the &lt;code&gt;document.modelContext&lt;/code&gt; WebMCP API, scans for unmasked PII, and proposes SQL remediation scripts. The human engineer always stays in the loop to review and approve the SQL before anything executes.&lt;/p&gt;

&lt;p&gt;Building a zero-backend governance engine with reactive state sync between WASM worker threads and React was definitely an intense engineering sprint, but really rewarding to see working end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s Next:&lt;/strong&gt;&lt;br&gt;
Albugent was built as a privacy-first proof-of-concept to show what’s possible when WASM and AI agents run entirely on the client. To turn this into a fully usable, zero-cost utility for everyone, the next step on the roadmap is adding a &lt;strong&gt;BYOK (Bring Your Own Key)&lt;/strong&gt; option and local model support (via Ollama/WebLLM), along with drag-and-drop CSV and SQLite file loading.&lt;/p&gt;

&lt;p&gt;If you'd like to try it out or look through the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live App: &lt;a href="https://albugent-webmcp-6mwn.vercel.app/" rel="noopener noreferrer"&gt;albugent&lt;/a&gt;
• GitHub: &lt;a href="https://github.com/evaaliya/albugent-webmcp" rel="noopener noreferrer"&gt;evaaliya&lt;/a&gt;
• Demo Video: &lt;a href="https://youtu.be/-gdDc3IR6iU?si=36hQwHRK0ZU3AiH4" rel="noopener noreferrer"&gt;matricula&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to the team behind the WebMCP Challenge for organizing this!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Built this as a true human-AI collaboration — shoutout to AI coding tools for acting as a 24/7 pair programmer throughout the build.&lt;/p&gt;

&lt;h1&gt;
  
  
  BuildInPublic
&lt;/h1&gt;

</description>
      <category>webmcp</category>
      <category>ai</category>
      <category>mcp</category>
      <category>openai</category>
    </item>
  </channel>
</rss>
