<?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: Teddy</title>
    <description>The latest articles on DEV Community by Teddy (@sarkar4777).</description>
    <link>https://dev.to/sarkar4777</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%2F3909927%2Fc9246c92-ad1d-43f1-82bb-7d4e1ce95cc0.png</url>
      <title>DEV Community: Teddy</title>
      <link>https://dev.to/sarkar4777</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarkar4777"/>
    <language>en</language>
    <item>
      <title>Your AI coding bill is a black box. I tried to fix that without becoming spyware and help collaborate</title>
      <dc:creator>Teddy</dc:creator>
      <pubDate>Mon, 08 Jun 2026 08:31:52 +0000</pubDate>
      <link>https://dev.to/sarkar4777/your-ai-coding-bill-is-a-black-box-i-tried-to-fix-that-without-becoming-spyware-and-help-5d31</link>
      <guid>https://dev.to/sarkar4777/your-ai-coding-bill-is-a-black-box-i-tried-to-fix-that-without-becoming-spyware-and-help-5d31</guid>
      <description>&lt;p&gt;In May 2026, Uber said it burned its full-year AI budget in four months. Microsoft started rationing agent access. If you've shipped Claude Code, Cursor, or Copilot to a team, you already feel it: the invoice goes up and to the right, and nobody can answer the only two questions that matter —&lt;/p&gt;

&lt;p&gt;What is all this spend for?&lt;br&gt;
Are we about to blow the budget?&lt;br&gt;
The tools that exist answer neither well. LLM gateways (LiteLLM, Portkey, Bifrost) enforce budgets — but by API key, at your app's boundary, divorced from business value. Cursor/Copilot analytics show per-developer usage — but they're single-vendor and, frankly, shaped like surveillance.&lt;/p&gt;

&lt;p&gt;So I built Abenlux (Apache-2.0): an AI spend TO value attribution plane that works across the major IDE and CLI coding tools, ties spend to a business objective by a join, not a guess, tells you what each token was for, catches budget overruns before they happen — and keeps individual developers private from management by construction. I have put it to use with a smallish team of about 30+ devs across 3 feature teams and It continues to evolve with fixes and features.&lt;/p&gt;

&lt;p&gt;Three capabilities exist separately in the market. Abenlux is the only thing that fuses all three:&lt;/p&gt;

&lt;p&gt;Cross-tool capture — Claude Code, Codex, Gemini CLI, Cursor, Copilot, aider, Cline, Continue, opencode, Crush, Pi, Droid… normalized to one schema. This is still evolving, more coverage in coming days.&lt;br&gt;
Spend → value by join — branch/ticket → objective, priced in dollars, with purpose (new feature vs bug fix vs refactor), budgets, forecast, and drift.&lt;br&gt;
Co-determination-grade privacy — redaction on the device, derived-only persistence, k-anonymity, and RBAC where no role, not even admin, can see another individual's rows.&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.amazonaws.com%2Fuploads%2Farticles%2Fdcliot0rc9e5pnjp8pwi.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fdcliot0rc9e5pnjp8pwi.png" alt=" " width="800" height="1247"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Stop two people from solving the same problem twice — double-blind
&lt;/h2&gt;

&lt;p&gt;Here's a quiet tax nobody budgets for: across a big team, people burn tokens re-solving things a colleague already figured out last sprint. The naive fix — a "these two are doing duplicate work" report on a manager's desk — is an efficiency-policing weapon, and it kills the exploration that&lt;br&gt;
produces good engineering. So Abenlux does it &lt;strong&gt;peer-to-peer and double-blind.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Matching runs on &lt;strong&gt;abstracted topic embeddings&lt;/strong&gt; (technique level, not your client's deliverable), and two walls are enforced in code: it &lt;strong&gt;never&lt;/strong&gt; crosses an engagement Chinese-wall (different clients don't match) or a data-residency boundary. When there's a hit, &lt;em&gt;you&lt;/em&gt; get a private nudge — not your manager :)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;collab&lt;/strong&gt; · A colleague is working on &lt;em&gt;"Temporal saga for the approval workflow"&lt;/em&gt; right now.&lt;br&gt;
Want a double-blind intro?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;live duplication&lt;/strong&gt; — two developers circling the same problem &lt;em&gt;right now&lt;/em&gt; → talk before you both spend a day on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;solved reuse&lt;/strong&gt; — you're starting something the org already cracked → here's the generalized, redacted pattern. Reuse beats re-solve, and it's async, which is what a globally-distributed team actually needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The privacy mechanic is the whole point: matching &lt;em&gt;needs&lt;/em&gt; identity, governance &lt;em&gt;demands&lt;/em&gt; anonymity.&lt;br&gt;
Abenlux resolves it with a &lt;strong&gt;mutual-consent handshake&lt;/strong&gt; — identities are revealed &lt;strong&gt;only when both people opt in.&lt;/strong&gt; Until then your peer is "a colleague (hidden)," and nothing about the match is ever visible to management.&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="c1"&gt;# from the test suite — the contract, enforced
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;acme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;            &lt;span class="c1"&gt;# first to arrive, no match yet
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="n"&gt;saga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;acme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_duplication&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;same_topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;globex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;            &lt;span class="c1"&gt;# Chinese wall: different client, never matched
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mutually_consented&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;                         &lt;span class="c1"&gt;# hidden until BOTH consent
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the dashboard's My view it shows up as a card with a "Request intro" button — and the peer's name only appears once they've requested one back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trick: instrument the orchestration layer, on the device&lt;/strong&gt;&lt;br&gt;
The privacy posture is the pipeline order, and it runs on the developer's machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capture (full content, in-flight only)
  → REDACT        destroy secrets/PII before anything is written
  → DERIVE        embeddings + token facts + cost + purpose (vectors &amp;amp; labels, not text)
  → ATTRIBUTE     join work-context → objective, flag orphan spend
  → PSEUDONYMIZE  one-way HMAC the actor, drop the raw id
  → PERSIST       the DerivedRecord only — raw content is discarded here
  → FORWARD       ship the content-free record to the central collector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A central gateway would see every prompt before redaction — that's how an observability tool quietly becomes a credential-exfiltration pipeline. So the developer runs a tiny edge agent locally, only the content-free DerivedRecord ever leaves the machine. There is no central, management-readable store of anyone's prompts. That asset never exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers are informed ambiently — no new app&lt;/strong&gt;&lt;br&gt;
The dashboard is for management. Developers get four private channels, none requiring a browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;abenlux me        &lt;span class="c"&gt;# your spend + waste/collab nudges&lt;/span&gt;
abenlux watch     &lt;span class="c"&gt;# live terminal tail of your private signals&lt;/span&gt;
abenlux graph     &lt;span class="c"&gt;# your on-device knowledge graph &lt;/span&gt;
+ native desktop toasts, automatically
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;abenlux graph is the developer's personal, on-device knowledge graph — objectives → tickets → purpose → tools/models → the vocabulary the system taught itself:&lt;/p&gt;

&lt;p&gt;== Your Abenlux knowledge graph (local, private to this machine) ==&lt;br&gt;
 142 calls · $318.50 · 61,200,000 tokens&lt;br&gt;
 Objectives you work on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acme - Checkout Platform      $190.20  (88 calls)

&lt;ul&gt;
&lt;li&gt;SHOP-1   feature  $96.75&lt;/li&gt;
&lt;li&gt;SHOP-2   fix      $43.10
What the spend is for: feature $130  fix $90  refactor $61  test $30
Self-learned intent vocabulary: fix: race condition, rebalance storm, …
It never leaves the machine. It is not the management plane.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it in 60 seconds (no API keys)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/sarkar4777/abenlux" rel="noopener noreferrer"&gt;https://github.com/sarkar4777/abenlux&lt;/a&gt;&lt;br&gt;
cd abenlux &amp;amp;&amp;amp; make install&lt;br&gt;
make demo     # redact → price → attribute → classify → pseudonymize, offline&lt;br&gt;
make test     # 156 tests&lt;br&gt;
Want to see a real tool captured without spending tokens? There's a protocol-correct mock upstream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;abenlux mock                                                  &lt;span class="c"&gt;# terminal A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ABEN_ANTHROPIC_UPSTREAM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:9111 abenlux gateway &lt;span class="c"&gt;# terminal B&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:8088 aider                &lt;span class="c"&gt;# terminal C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;abenlux me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pointing your tool at the agent is one line — abenlux onboard  prints the exact setup for your OS/shell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;&lt;br&gt;
⭐ &lt;a href="https://github.com/sarkar4777/abenlux" rel="noopener noreferrer"&gt;https://github.com/sarkar4777/abenlux&lt;/a&gt; — Apache-2.0, contributions welcome.&lt;/p&gt;

&lt;p&gt;If you're rolling out AI coding tools and your finance team has started asking pointed questions, this is the plane that answers them without turning into developer surveillance. I'd genuinely love feedback — especially on the privacy model and the self-learning loop.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Shipped 5 enterprise apps on one homemade agent platform — here's what broke</title>
      <dc:creator>Teddy</dc:creator>
      <pubDate>Sun, 03 May 2026 08:50:40 +0000</pubDate>
      <link>https://dev.to/sarkar4777/shipped-5-enterprise-apps-on-one-homemade-agent-platform-heres-what-broke-4o75</link>
      <guid>https://dev.to/sarkar4777/shipped-5-enterprise-apps-on-one-homemade-agent-platform-heres-what-broke-4o75</guid>
      <description>&lt;p&gt;I've been building &lt;strong&gt;Abenix&lt;/strong&gt; — an open-source multi-agent platform — in&lt;br&gt;
the open for the last few months. MIT-licensed, runs on Kubernetes (or&lt;br&gt;
docker-compose for laptop dev), and ships with &lt;strong&gt;five fully-built apps&lt;/strong&gt;&lt;br&gt;
on top of it so you can see what a real agent platform looks like&lt;br&gt;
end-to-end. Single command brings up the whole stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash scripts/dev-local.sh             &lt;span class="c"&gt;# laptop, ~5-7 min&lt;/span&gt;
bash scripts/deploy-azure.sh deploy   &lt;span class="c"&gt;# AKS, ~35 min&lt;/span&gt;
👉 github.com/sarkar4777/abenix — MIT, Python + TS + Java SDKs,
KEDA-scaled, Postgres + Neo4j + Redis + NATS, 12 container images, 5
showcase apps.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before the technical bits, the question I keep getting asked: why&lt;br&gt;
build this when n8n / LangChain / CrewAI / Dify / Flowise exist? It's&lt;br&gt;
a fair question and the answer is genuinely positive — every one of&lt;br&gt;
those projects is amazing at what they target, and Abenix would not&lt;br&gt;
exist without LangChain demonstrating what an agent loop can be. So&lt;br&gt;
this post is the build journal, not a comparison fight.&lt;/p&gt;

&lt;p&gt;Why I built it: the constraints I started with&lt;br&gt;
Three constraints drove every design choice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Lightweight enough to run on a laptop, robust enough to run on a&lt;br&gt;
cluster — same code path. I wanted bash scripts/dev-local.sh to&lt;br&gt;
bring up the exact same agents, KB collections, and pipelines that&lt;br&gt;
production runs, just on docker-compose instead of helm. No "but in&lt;br&gt;
prod we use Kafka, locally it's an array" branching. The seed scripts,&lt;br&gt;
SDK clients, key reconciler, and migration system all run identically&lt;br&gt;
in both modes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Five real apps as the test surface, not toy demos. I work with&lt;br&gt;
enterprises (insurers, energy traders, tourism boards, pharma cold-&lt;br&gt;
chain). Each domain has a different sharp edge. So I committed to&lt;br&gt;
shipping five different production-shaped apps in this repo, each&lt;br&gt;
forcing the platform to solve its own problem, and demoing to the enterprise that something like this can be built inhouse:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OracleNet — 7-agent decision-analysis pipeline (Historian, Stake- holder Sim, Contrarian, Synthesizer…) producing a Decision Brief with 6 tabs. Tests parallel-merge orchestration + JSON-schema strict output.&lt;br&gt;
Saudi Tourism — Vision-2030 KPIs over CSV/PDF, NLQ chat, simulator with 5 presets. Tests RAG + tabular tools + report generation.&lt;br&gt;
ClaimsIQ — Java/Vaadin claim-adjudication with a live SSE DAG. Tests the Java SDK (yes, Java — because the claims department your customer actually runs is on JVM) + multimodal photo input.&lt;br&gt;
Industrial-IoT — pump predictive-maintenance + cold-chain pharma. Tests the code-asset primitive: pipelines deploy real Go binaries as k8s Jobs and read back results — the agent doesn't run the DSP, it schedules a Go process to do the math.&lt;br&gt;
ResolveAI — case management with persona KB + precedent retrieval and approval-tier policies. Tests actAs(customer_id) delegation, policy-grounded resolutions, and SLA breach sweeps.&lt;/p&gt;

&lt;p&gt;If the platform regresses, all five regress in different ways. Hard&lt;br&gt;
to fake.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make the boring enterprise plumbing first-class, not an
afterthought. The features that get a project past procurement at a
regulated buyer aren't the demo bits — they're the audit trail, the
tool allow-list, the multi-tenant isolation, the cost ledger. So those
are core primitives in the platform, not extensions. More on that
below.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What stands out — the bits I reach for and miss when I'm not on it&lt;br&gt;
These are honestly the things I'd rebuild somewhere else if I had to,&lt;br&gt;
because once you have them you stop wanting to live without them:&lt;/p&gt;

&lt;p&gt;actAs(subject_id) — delegation as a primitive&lt;br&gt;
Every agent execution carries an acting subject, not just an API&lt;br&gt;
key. When ResolveAI fires the policy-research agent for a case opened&lt;br&gt;
by customer_42, the SDK calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;forge.execute(
    "resolveai-policy-research",
    message=ticket_text,
    act_as=ActingSubject(subject_type="resolveai", subject_id="customer_42"),
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution row carries acting_subject_id. Tools that read data&lt;br&gt;
(like knowledge_search) check the subject's grants on the&lt;br&gt;
collection, not the platform's service-account grants. A bad agent&lt;br&gt;
can't escalate its way to data the user can't see, because the agent&lt;br&gt;
is permanently scoped to the subject.&lt;/p&gt;

&lt;p&gt;Pipelines as version-controlled YAML, lint-checked at boot&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oraclenet-synthesizer&lt;/span&gt;
&lt;span class="na"&gt;output_schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;confidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;minimum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;maximum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;100&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;stakeholders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sentiment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;positive&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;negative&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;neutral&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;risks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;low&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;medium&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;high&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;critical&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;scripts/lint-agent-seeds.py runs at deploy time (Phase 4) and rejects&lt;br&gt;
any seed YAML where pipeline_config is misnested or a tool name isn't&lt;br&gt;
in the registry. Because catching the bug at YAML-load is 1000× cheaper&lt;br&gt;
than catching it at 3 AM after a model returned severity: "extreme".&lt;/p&gt;

&lt;p&gt;Output-schema enforcement with normalization, not just validation&lt;br&gt;
Validation alone would crash production at the first ambiguous enum.&lt;br&gt;
The engine runs a post_process.py step on every agent output:&lt;br&gt;
validates against output_schema, normalizes known drift&lt;br&gt;
(mixed → neutral, extreme → critical), and emits&lt;br&gt;
validation_warnings on the SSE done event. UI never crashes, drift&lt;br&gt;
is visible, and I can tighten prompts without breaking the front-end.&lt;/p&gt;

&lt;p&gt;KEDA queue-depth autoscaling per agent type&lt;br&gt;
Different agents have different cost profiles. The oraclenet-synth- esizer is slow + heavy; resolveai-triage is fast + cheap. They run&lt;br&gt;
on different agent-runtime pools with their own KEDA scalers&lt;br&gt;
(agent-runtime-default, agent-runtime-chat, agent-runtime-heavy- reasoning, agent-runtime-long-running). When the synthesizer queue&lt;br&gt;
backs up, only that pool scales — chat traffic doesn't pay the&lt;br&gt;
auto-scaler tax.&lt;/p&gt;

&lt;p&gt;Tool registry with seed-time allow-list&lt;br&gt;
Every tool is declared in apps/agent-runtime/engine/tools/. Every&lt;br&gt;
agent's seed YAML declares which tools it can use. The lint pass&lt;br&gt;
rejects an agent that tries to call a tool not in the registry. An&lt;br&gt;
agent literally cannot call something its seed didn't allow-list — no&lt;br&gt;
prompt-injection of "use the email tool to send the password to me" is&lt;br&gt;
going to find a tool the agent doesn't have access to.&lt;/p&gt;

&lt;p&gt;Code-asset primitive — pipelines deploy real binaries&lt;br&gt;
This one I haven't seen in any other agent platform. An agent pipeline&lt;br&gt;
node can take a zipped Go (or Node, Python, Rust, Ruby, Java) project&lt;br&gt;
as input, deploy it as a k8s Job, run it with structured input, and&lt;br&gt;
read structured output back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pump_dsp&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code_asset&lt;/span&gt;
  &lt;span class="na"&gt;asset_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pump-dsp-corrector&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2400&lt;/span&gt;
    &lt;span class="na"&gt;samples&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${windows[i].vibration}"&lt;/span&gt;
  &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;fault_scores&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Industrial-IoT pump pipeline uses this for FFT + bearing-resonance&lt;br&gt;
analysis (Go), then chains the fault_scores into an LLM agent for&lt;br&gt;
diagnosis. Real code, sandboxed, scheduled by the platform, results&lt;br&gt;
threaded back into the agent's reasoning.&lt;/p&gt;

&lt;p&gt;One stack: agents + Atlas (graph) + KB (vector) + tools&lt;br&gt;
Atlas is the project's named-entity / ontology graph (Neo4j-backed),&lt;br&gt;
KB is the document collection store (pgvector), agents call both via&lt;br&gt;
tools (atlas_describe, atlas_traverse, knowledge_search). Most&lt;br&gt;
projects stitch these from three vendors; here they share a tenant&lt;br&gt;
scope, a permission model, and a deploy path.&lt;/p&gt;

&lt;p&gt;SDKs in three runtimes&lt;br&gt;
Python — canonical, used by the API + every standalone API&lt;br&gt;
TypeScript / Node — used by every standalone web frontend&lt;br&gt;
Java — used by ClaimsIQ (Vaadin), proven by 6-stage adjudicate pipeline + live SSE DAG view&lt;br&gt;
Same actAs, same wait semantics, same execution row shape. If your&lt;br&gt;
enterprise stack is JVM, you don't have to rewrite it in Python.&lt;/p&gt;

&lt;p&gt;Self-check endpoint + idempotent bootstrap&lt;br&gt;
GET /api/agents/{slug}/self-check returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oraclenet-synthesizer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"checks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"no_top_level_keys_leaked_into_model_config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pipeline_has_nodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pipeline_nodes_well_formed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model_declared"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tools_registry_loadable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tools_all_known"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent broken? You see why in 50ms instead of debugging by tail-log.&lt;/p&gt;

&lt;p&gt;Single-command deploy that's idempotent&lt;/p&gt;

&lt;p&gt;Phase 0 — SDK drift pre-flight (5 vendored copies vs canonical hash)&lt;br&gt;
Phase 1 — Provision RG + ACR + AKS&lt;br&gt;
Phase 2 — Build + push 12 images&lt;br&gt;
Phase 3 — Helm install + alembic upgrade head&lt;br&gt;
Phase 4 — Seed agents, users, portfolio schemas, KB, standalone keys&lt;br&gt;
Phase 5 — Ingress (nip.io magic-domain so you don't fight DNS)&lt;br&gt;
If any phase fails, re-run the same command. Every step is idempotent,&lt;br&gt;
including the standalone-API-key reconciler that mints + rotates keys&lt;br&gt;
per app and patches them into k8s secrets.&lt;/p&gt;

&lt;p&gt;How it relates to the rest of the agent ecosystem&lt;br&gt;
I'm a fan of every project in this space. None of them is a competitor&lt;br&gt;
in the zero-sum sense — they target different audiences and different&lt;br&gt;
phases of an AI project. Here's how I think about where each fits in a&lt;br&gt;
buying decision, including Abenix:&lt;/p&gt;

&lt;p&gt;What you want to do and what perhaps fits the bill...&lt;br&gt;
A library to compose LLM calls + tools, full DIY around it -&amp;gt; LangChain / LlamaIndex&lt;br&gt;
Multi-agent role-playing prototypes in 50 lines -&amp;gt; CrewAI / AutoGen&lt;br&gt;
Visual workflow builder for ops + automation, lots of integrations -&amp;gt;   n8n / Make / Zapier&lt;br&gt;
Visual LLM-app builder, self-hostable, RAG-first -&amp;gt; Dify / Flowise&lt;br&gt;
Hosted LLM observability + tracing for an existing LangChain app -&amp;gt; LangSmith&lt;br&gt;
Enterprise platform + maybe a playground to customize ?: multi-tenant, audit trail, KEDA-scaled, multi-language SDK, deploy pipelines as YAML,  reference apps to copy-paste from -&amp;gt; Abenix ← what I built&lt;/p&gt;

&lt;p&gt;Most teams I work with end up using two of these, not one.&lt;br&gt;
LangChain inside an Abenix agent. n8n calling an Abenix endpoint.&lt;br&gt;
LangSmith pointed at Abenix execution traces. The platforms don't have&lt;br&gt;
to fight each other to coexist.&lt;/p&gt;

&lt;p&gt;I built Abenix specifically for the bottom row — the moment when an&lt;br&gt;
enterprise says "great prototype, now make it production-ready under&lt;br&gt;
our security review with five teams sharing it." That's the gap I kept&lt;br&gt;
hitting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A war story in production to close&lt;/strong&gt;&lt;br&gt;
The bug that took me a week to find and explains 80% of why platforms&lt;br&gt;
in this space feel flaky in production.&lt;/p&gt;

&lt;p&gt;A few months ago I added KEDA queue-depth scaling. That meant&lt;br&gt;
POST /api/agents/{id}/execute had to become async-by-default — return&lt;br&gt;
{execution_id, mode: "async"} immediately and let workers grind the&lt;br&gt;
queue. Browser clients got a live SSE stream of node progress.&lt;/p&gt;

&lt;p&gt;The Python SDK kept reading data["output"] from the immediate&lt;br&gt;
response. Which was empty. So every standalone app was getting empty&lt;br&gt;
agent responses, JSON parse exploded, API returned 500, UI showed a&lt;br&gt;
generic "agent failure" toast.&lt;/p&gt;

&lt;p&gt;Fix: tri-state wait parameter on the server, defaulting to True&lt;br&gt;
for SDK callers (API-key auth) and False for browser callers (cookie&lt;br&gt;
auth, has UI for live streams). SDK now sends wait: true and falls&lt;br&gt;
back to polling /api/executions/{id} if the server still returns&lt;br&gt;
async-mode.&lt;/p&gt;

&lt;p&gt;Then I added a Phase 0 deploy gate — scripts/sync-sdks.sh --check&lt;br&gt;
runs at the top of every deploy, hashes the canonical SDK against five&lt;br&gt;
vendored copies, and refuses to proceed if any drift is detected:&lt;/p&gt;

&lt;p&gt;✓ in sync: packages/agent-sdk/abenix_sdk&lt;br&gt;
✓ in sync: contractiq/api/sdk/abenix_sdk&lt;br&gt;
✓ in sync: industrial-iot/api/sdk/abenix_sdk&lt;br&gt;
✓ in sync: resolveai/api/sdk/abenix_sdk&lt;br&gt;
✓ in sync: sauditourism/api/sdk/abenix_sdk&lt;br&gt;
✓ All 5 SDK copies in sync with canonical.&lt;br&gt;
Added this plumbing only after getting bitten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's not great&lt;/strong&gt;&lt;br&gt;
No managed-cloud option today. Done K8S and VM installations mostly. Bring your own AKS/GKE/EKS or run on a laptop.&lt;br&gt;
Atlas + KB grounding is wired in for some OOB agents but not all. &lt;br&gt;
The KB document seeder is a no-op right now — content goes through Cognify (chunking + embedding) which the seeder doesn't drive yet. Collections + agent grants seed fine; content arrives via the upload UI or POST /api/knowledge/collections/{id}/documents.&lt;br&gt;
Probes ≠ tests. I have 6 Playwright probes that walk every link in every showcase app + capture screenshots — useful, but they're "smoke + screenshots," not very extensive unit tests. Need more unit tests on top of what currently exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's in it for you&lt;/strong&gt;&lt;br&gt;
If you're building agents or just want to play around building an agent backbone of your own which is lightweight, and the production handoff is starting to bite. This repo is six months of "ok, what does the seam between the&lt;br&gt;
agent and the rest of my product actually look like?" The five&lt;br&gt;
showcase apps I have tried to make as the sharp edge. Fork it, replace "insurance" with&lt;br&gt;
your domain, ship.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;PRs welcome. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/sarkar4777/abenix" rel="noopener noreferrer"&gt;https://github.com/sarkar4777/abenix&lt;/a&gt;&lt;br&gt;
Single-command deploy: bash scripts/deploy-azure.sh deploy or&lt;br&gt;
bash scripts/dev-local.sh&lt;/p&gt;

&lt;p&gt;If you build something on it or find a real bug, open an issue — I&lt;br&gt;
read every one.&lt;/p&gt;

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