<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Agents on Narasimha Karthik J</title><link>https://jnk234.github.io/tags/agents/</link><description>Recent content in Agents on Narasimha Karthik J</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 28 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jnk234.github.io/tags/agents/index.xml" rel="self" type="application/rss+xml"/><item><title>Customer-Service Agent RL Environment</title><link>https://jnk234.github.io/projects/customer-service-agent-rl-environment/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid isPermaLink="false">https://jnk234.github.io/projects/customer-service-agent-rl-environment/#full</guid><description>&lt;p&gt;&lt;a href="https://github.com/JNK234/customer-service-agent-rl-env" target="_blank" rel="noreferrer"&gt;Code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-it-is" class="relative group"&gt;What it is &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-it-is" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Two LLMs talk to each other. A &lt;strong&gt;user simulator&lt;/strong&gt; plays a customer with a hidden goal and sees only what the agent says. An &lt;strong&gt;assistant agent&lt;/strong&gt; follows a written store policy and uses 13 tools that read and change an in-memory database built from the &lt;a href="https://github.com/sierra-research/tau2-bench" target="_blank" rel="noreferrer"&gt;τ²-bench&lt;/a&gt; retail data (25 users, 45 orders, 50 products).&lt;/p&gt;
&lt;p&gt;The tools check only data integrity, not policy. So a policy violation changes the database, and the reward can see it.&lt;/p&gt;
&lt;h2 id="the-reward" class="relative group"&gt;The reward &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-reward" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gate on state.&lt;/strong&gt; The agent&amp;rsquo;s database diff must match a correct outcome, and the agent must have made the required lookups. A confident transcript with a wrong write scores zero, and a do-nothing agent can&amp;rsquo;t pass tasks where the right answer is &amp;ldquo;no write&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficiency.&lt;/strong&gt; Fewer wasted tool calls score higher.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality, by an LLM judge.&lt;/strong&gt; The judge checks consent before each write and whether every claim of a finished action matches the tool log. It asks one yes/no question per call and quotes evidence before its verdict. Hard violations cap the reward below the floor of any clean run.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A pytest suite checks that golden runs pass and do-nothing runs fail, with no API calls.&lt;/p&gt;
&lt;h2 id="what-red-teaming-found" class="relative group"&gt;What red-teaming found &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-red-teaming-found" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Forged consent.&lt;/strong&gt; In a hand-written bad conversation, the customer&amp;rsquo;s text contained fake &amp;ldquo;AGENT: &amp;hellip; CUSTOMER: Yes&amp;rdquo; lines, and the judge passed the consent check. Feeding the judge speaker-tagged messages fixed it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unfair simulator.&lt;/strong&gt; The user simulator once agreed and sent its stop token in the same message, so a correct agent scored 0.&lt;/li&gt;
&lt;li&gt;Against a judge-aware hostile customer, a Sonnet agent scored 1.0 and a Haiku agent scored 0, after handing off to a human following a correct denial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These come from one or two runs per task, not pass rates.&lt;/p&gt;</description></item><item><title>Spec-Conformance Evals for an Account-Risk Attention Agent</title><link>https://jnk234.github.io/projects/spec-conformance-evals-for-an-account-risk-attention-agent/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid isPermaLink="false">https://jnk234.github.io/projects/spec-conformance-evals-for-an-account-risk-attention-agent/#full</guid><description>&lt;p&gt;&lt;a href="https://github.com/JNK234/signal-attention-evals-takehome" target="_blank" rel="noreferrer"&gt;Code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-it-is" class="relative group"&gt;What it is &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-it-is" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;An AI-engineer assessment from Signal Labs. A fictional company runs an agent that watches 180 customer accounts and decides which risk signals a human should see. The agent&amp;rsquo;s behavior is defined in a formal spec as a state machine with invariants, timing targets, policy rules and grounding rules. The data is 629 agent dossiers, 32,032 days of telemetry, 3,810 text artefacts, renewal outcomes, and labels from three annotators who disagree.&lt;/p&gt;
&lt;p&gt;I built a &lt;code&gt;SignalEvaluator&lt;/code&gt; that scores each dossier for quality, risk, whether it deserved attention, and the specific spec rules it broke. On top of it I wrote a violation report, an attention-budget analysis and a writeup.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spec to rules.&lt;/strong&gt; I transcribed the spec into a table of 29 rules, each with its spec identifier, section, severity class and owning check. Tests parse the LaTeX source of the spec and fail if a rule cites a section that does not exist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correct the data first.&lt;/strong&gt; The evaluator rebuilds telemetry before checking any claim: later backfill rows win over duplicates, a legacy collector&amp;rsquo;s double-counted API calls are halved, and a latency scale change is undone. Inspection found three more distortions the docs did not list, including zero rows that were collector outages, not dead accounts. Where the data is missing, the check refuses rather than scoring zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source-anchored checks.&lt;/strong&gt; Each numeric claim is recomputed from corrected telemetry. Each quoted piece of evidence is checked to exist, belong to the same account, and match verbatim. Text is read by rules plus a small local NLI model, with no external API calls inside &lt;code&gt;evaluate()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests.&lt;/strong&gt; A pytest suite includes 25 hand-derived golden dossiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="results" class="relative group"&gt;Results &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#results" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;259 of 629 dossiers state a percentage change that does not reproduce on corrected telemetry. In 58 of them the pipeline manufactured the decline; in 121 a real decline was overstated.&lt;/li&gt;
&lt;li&gt;Only one rule separated complaints: customer-visible plays on legal-hold or M&amp;amp;A-quiet-period accounts drew complaints at 32% (10 of 31), against 3% for the rest. No rule separated wasted escalations.&lt;/li&gt;
&lt;li&gt;On quality scores, the evaluator agreed with each annotator about as well as the annotators agreed with each other (Spearman 0.36 to 0.55, against 0.31 to 0.45 between humans). On &amp;ldquo;deserved attention&amp;rdquo; it fell below the human band.&lt;/li&gt;
&lt;li&gt;A spec-anchored routing policy under a 5-signals-per-owner-week cap routed 189 signals against the agent&amp;rsquo;s 294. Its routed signals churned more often (39% against 30%), but it missed 16 accounts with $3.02M of realised loss.&lt;/li&gt;
&lt;li&gt;Bursts in signal volume traced to a collector migration, a regional ingest gap, and four public holidays.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>job-hunt-kit</title><link>https://jnk234.github.io/projects/job-hunt-kit/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0000</pubDate><guid isPermaLink="false">https://jnk234.github.io/projects/job-hunt-kit/#full</guid><description>&lt;p&gt;&lt;a href="https://github.com/JNK234/job-hunt-kit" target="_blank" rel="noreferrer"&gt;Code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-it-is" class="relative group"&gt;What it is &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-it-is" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A Claude Code plugin with nine skills that cover a job search from start to finish: set up a profile, build master resumes from job-description research, tailor a resume to one posting, draft application answers, find the right person on the team, and write outreach.&lt;/p&gt;
&lt;p&gt;Everything lives in plain text and LaTeX files in a &lt;code&gt;job-hunt/&lt;/code&gt; folder that you own. The kit drafts. It never sends an email or submits a form.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One source of truth.&lt;/strong&gt; &lt;code&gt;profile.md&lt;/code&gt; holds every fact about you. Resumes, answers and emails may only state what is in it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live form schemas.&lt;/strong&gt; &lt;code&gt;ats.py&lt;/code&gt; reads the exact application form from the public Ashby, Greenhouse and Lever APIs, because the pages are rendered client-side and scraping returns only a title. It checks a posting is live by its presence on the job board, since Ashby returns HTTP 200 for any path. It flags field titles worth a human look: inverted sponsorship questions, export-control questions, and decoy prompts addressed to an LLM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A cheap gate, then a judge.&lt;/strong&gt; &lt;code&gt;gate.py&lt;/code&gt; is a deterministic check for stock phrases, compliance claims (HIPAA, SOC 2 and so on) that the profile never mentions, numbers absent from the profile, and leftover placeholders. &lt;code&gt;judge.py&lt;/code&gt; then asks yes/no rubric questions about each email or answer, and returns a fix for every NO.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claim checking per sentence.&lt;/strong&gt; The judge splits a draft into sentences and asks, for each one, whether its background facts are supported by the profile and resume text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resumable pipeline.&lt;/strong&gt; &lt;code&gt;pipeline.py&lt;/code&gt; tracks roles through sourcing, verification and drafting so a long batch can stop and pick up again.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-notable" class="relative group"&gt;What&amp;rsquo;s notable &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#whats-notable" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The claim-check threshold was set on planted true and false claims: false claims scored at most 0.21 and true ones at least 0.40, so the cutoff sits at 0.3. Each exemption in the deterministic gate is commented with the false positive that caused it.&lt;/p&gt;</description></item><item><title>Kyn: Multi-Agent Company Brain</title><link>https://jnk234.github.io/projects/kyn-multi-agent-company-brain/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid isPermaLink="false">https://jnk234.github.io/projects/kyn-multi-agent-company-brain/#full</guid><description>&lt;p&gt;&lt;a href="https://github.com/JNK234/KYN" target="_blank" rel="noreferrer"&gt;Code on GitHub&lt;/a&gt; · &lt;a href="https://kyn-xi.vercel.app/" target="_blank" rel="noreferrer"&gt;Live demo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-it-is" class="relative group"&gt;What it is &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-it-is" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A team build for the Nozomio Hackathon, Track 4 (&amp;ldquo;The Company Brain&amp;rdquo;, on Nia and Hyperspell). You describe a work problem, such as &amp;ldquo;why are payments failing?&amp;rdquo;, and a supervisor agent decides what context it needs, gathers it, acts, and records what it learned.&lt;/p&gt;
&lt;p&gt;I built the agent and backend: the supervisor and subagents, the tools, the seed corpus, the FastAPI server, and the wiring of the run-view UI to the live event stream. A teammate built the design system and the static UI mockup.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supervisor plus four subagents as tools&lt;/strong&gt;, using the OpenAI Agents SDK. Code context searches an indexed repo through Nia. Company context searches Slack, email, Notion, contracts and tickets through Hyperspell. Memory recalls similar past problems early and writes lessons back before the run ends. Action produces outputs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playbooks by intent.&lt;/strong&gt; The supervisor classifies the problem as an incident, a question, or a briefing. Only incidents open a PR and send messages; questions get a cited answer and no actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real actions.&lt;/strong&gt; For a code fix, the Action agent clones the target repo, runs Codex CLI with a small, size-capped instruction, commits, pushes, and opens a PR, then drafts a Gmail and posts to Slack. Evidence goes in the PR body, not the Codex prompt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seed corpus.&lt;/strong&gt; A fictional payments company with about six weeks of Slack, email, Notion, contract, PR and ticket data around one incident: a retry bug that amplifies a vendor&amp;rsquo;s rate limit. An early support ticket hints at the problem, so the agent can connect it where the humans in the story did not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server.&lt;/strong&gt; FastAPI streams run events over SSE, saves each run to disk, and can replay past runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-notable" class="relative group"&gt;What&amp;rsquo;s notable &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#whats-notable" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The repo includes artifacts from real runs: RCA skeletons, code-patch proposals and PR drafts for the rate-limit incident.&lt;/p&gt;</description></item><item><title>claude-kit</title><link>https://jnk234.github.io/projects/claude-kit/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid isPermaLink="false">https://jnk234.github.io/projects/claude-kit/#full</guid><description>&lt;p&gt;&lt;a href="https://github.com/JNK234/claude-kit" target="_blank" rel="noreferrer"&gt;Code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-it-is" class="relative group"&gt;What it is &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-it-is" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A plugin marketplace for Claude Code that bundles the skills, slash commands, agents and workflows I use every day. It has six bundles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;writing&lt;/strong&gt;: outreach email, LinkedIn and X posts, research blog posts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;research-vault&lt;/strong&gt;: decode papers into Obsidian notes, extract atomic zettels, build synthesis pages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;explainer-videos&lt;/strong&gt;: narrated Manim explainer videos from a spec.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;netlogo&lt;/strong&gt;: build and review NetLogo models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dev-tools&lt;/strong&gt;: GitHub operations, a timed take-home helper, planning and implementation commands, and coder and tester agents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;life&lt;/strong&gt;: Vedic astrology charts and PDF invoices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;install.sh&lt;/code&gt; clones the repo, adds the marketplace, installs the chosen bundles, writes a small env file with the vault paths, and copies the workflows into &lt;code&gt;~/.claude/workflows/&lt;/code&gt; with those paths filled in. It skips workflows that already exist unless you set &lt;code&gt;FORCE=1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The seven workflows coordinate several agents. For example, &lt;code&gt;feature-build&lt;/code&gt; has a coder implement a task, an implementation-blind tester try to break it, and the coder repair the cited failures, for up to three rounds.&lt;/p&gt;
&lt;h2 id="whats-notable" class="relative group"&gt;What&amp;rsquo;s notable &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#whats-notable" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;netlogo-review&lt;/strong&gt; checks a model in layers ordered by cost: style and config checks, then the headless NetLogo compiler as a blocking gate, then known &lt;code&gt;.nlogox&lt;/code&gt; traps. An LLM judge is opt-in, and a live provider call is required when a change touches a provider. It ships with self-test fixtures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;making-explainer-videos&lt;/strong&gt; includes scripts that check every on-screen word traces back to the approved spec, and falls back to macOS &lt;code&gt;say&lt;/code&gt; when no ElevenLabs key is set.&lt;/li&gt;
&lt;li&gt;The research-vault skills use &lt;a href="https://jnk234.github.io/projects/zettelkasten-automation/"&gt;zettelkasten-auto&lt;/a&gt; for semantic search over notes.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>