Skip to content
View Somay-kousis's full-sized avatar

Highlights

  • Pro

Block or report Somay-kousis

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Somay-kousis/README.md

Somay Kousis, I build agent systems, and the checks that keep them honest.

Co-founder of aye aye. The person shipping a risky AI-written change explains it out loud, and an independent judge checks the answer against the real diff. I also freelance for Standout, where I shipped a live LinkedIn networking product from an empty repo in 7 days as the only engineer. Third year of CS at ABV-IIITM Gwalior.

Right now I am writing an AI control paper and getting fixes merged upstream.


merged upstream since Oct 13          25

NVIDIA     NeMo Agent Toolkit         18
NVIDIA     garak                       1
Google     ADK                         3
Microsoft  Agent Framework             1
Intel      OpenVINO GenAI              1
CNCF       krkn                        1

NVIDIA NeMo Agent Toolkit #2365. Agents ran one tool call past max_tool_calls, and no recursion_limit could stop it, because the graph counts node steps, not tool calls. All four agent types now stop before call N+1.

NVIDIA garak #2315. The WebSocket generator ignored --target_name, so a scan of your own endpoint sent every prompt to a public echo server and scored the echoes.

NVIDIA NeMo Agent Toolkit #2325. ${VAR} was spliced into raw YAML before parsing, so a # in a secret cut it short. Merged as a breaking change.

Google ADK 7541. Memory search never found a stored word starting with a capital dotted İ, because lowercasing it adds a combining dot that split the token.

Microsoft Agent Framework #9428. Declarative SetValue accepted a variable field the executor never read, so the workflow ran and the value stayed unset.

20 more
Repo Fix What was broken
NeMo Agent Toolkit #2410 The Semantic Kernel clients ignored temperature, top_p, seed and max_retries from the LLM config.
NeMo Agent Toolkit #2408 Turning on thinking turned off automatic retries, because the second patch replaced the first on the same methods.
NeMo Agent Toolkit #2406 ADK clients ignored the retry and thinking options that every other framework wrapper honoured.
NeMo Agent Toolkit #2404 The reasoning agent ignored its configured description, so calling agents always saw a hard-coded one.
NeMo Agent Toolkit #2394 An interrupted nat eval lost every finished item and started over. Items now stay on disk and --resume runs only the rest.
NeMo Agent Toolkit #2377 The ReAct and ReWOO agents reported word counts as token usage instead of what the model reported.
NeMo Agent Toolkit #2369 nat serve sent the A365 auth token to its workers as **********, because it was masked when the config was copied for them.
NeMo Agent Toolkit #2371 The router agent sent web_search requests to the search branch, because it took the first name that matched.
NeMo Agent Toolkit #2367 The per-user ReAct agent ignored raise_on_parsing_failure and use_native_tool_calling.
NeMo Agent Toolkit #2361 The MCP client dropped an explicit null for a required tool argument, so the server got a call missing a required key.
NeMo Agent Toolkit #2354 The profiler paired each LLM end event with the latest start, so two overlapping 10 s calls became one 9 s sample.
NeMo Agent Toolkit #2352 An eval run where no evaluator returned a result wrote no workflow_output.json.
NeMo Agent Toolkit #2344 An eval output section without dir ignored output_dir, so cleanup: true deleted the wrong folder.
NeMo Agent Toolkit #2332 The JSON dataset loader turned "001" into 1, so .json and .jsonl gave different eval inputs.
NeMo Agent Toolkit #2327 --override 0.7 was rejected for a setting written as 0 in YAML.
NeMo Agent Toolkit #2320 Resuming an eval crashed on items whose output was a list.
Google ADK 7577 The SQLite session store turned state integers beyond 64 bits into floats, even on later unrelated writes.
Google ADK 7561 Client token-usage metrics came back empty when the last streamed response had no usage data.
OpenVINO GenAI #4627 A single-string stop_strings in generation_config.json was dropped, so those models never stopped on it.
krkn (CNCF) #1632 Container chaos scenarios without expected_recovery_time crashed before injecting any fault.

Every merged PR · Google ADK commits. Google lands outside PRs through Copybara, so they show as closed.

Agent safety

What does an agent do when nobody is checking, and how would you know? Pocket Change limits what it can take. Apocalypse checks whether it stays contained after it breaks out. Perceived Oversight asks whether it behaves differently when it thinks it is being watched. Every number here comes with the command that produced it.

Spending authority for AI agents. Ed25519 Biscuit tokens attenuate down a delegation tree, so a sub-agent can never hold more than its parent was given. 7 bounds, checked deterministically across trees of 121 agents.

$ pytest tests/attacks -q
400 attacks, 394 blocked, 6 known limits (282 agent, 38 seller, 80 network)
396 passed, 6 xfailed in 21.11s

$ pytest -q
825 passed, 6 xfailed in 27.23s

No model calls and no API keys, so anyone can clone it and get the same output. The 6 xfails are the known limits, written down instead of hidden.

The bug I learned the most from never failed a test. I made a payment agent the parent of a page-reading agent, and the payment agent quietly inherited read access to attacker-controlled text, because a parent has to hold everything it hands down. Isolation has to sit sideways, not stack. I found it weeks later re-reading my own threat model.

Runs on Cloud Run with Vertex AI. Live demo.

Apart x CeSIA AI Incident Response Sprint, team of 3, top 10%. The July 2026 frontier-model sandbox escape had no standard you could test a lab against, so we wrote 9 containment rules, each mapped to a documented step of the real attack, and built a broken lab with the real misconfiguration next to a fixed one. I wrote rules 4, 5 and 9, the scorecard runner and the architecture.

The same runner on both labs, trimmed to my three rules:

$ python -m validation.run_checks --target environments/fixed_lab/configs
  [PASS] rule 4: Loader refuses external refs
  [PASS] rule 5: No template eval on untrusted config
  [PASS] rule 9: Origin-scoped credentials + blast-radius bound
  9/9 controls PASS

$ python -m validation.run_checks --target environments/broken_lab/configs
  [FAIL] rule 4: loader followed external refs and leaked 2 value(s)
  [FAIL] rule 5: SSTI reached Python internals (17076 chars of subclass list)
  [FAIL] rule 9: credential is 'raw', not an attenuated capability token
  0/9 controls PASS

Offline, runs in seconds on a laptop. 118 tests.

The paper. Does an untrusted agent reveal more of a hidden objective to an overseer it thinks is a collaborator than to one it knows is a monitor? The real monitoring never changes, only what the agent believes about its partner. Built on SHADE-Arena through ControlArena, and scoped to detection, so the real monitor can act on a flagged attack. No results yet, so none claimed.

Also built

PaperPlanes, 3rd at the CockroachDB Hackathon, solo. Research memory where a superseded fact is closed with valid_to instead of overwritten. 25 concurrent writers on one counter: all 25 held under SERIALIZABLE retries, where a flat file kept 1.

RabbitHole. A LangGraph courtroom that, asked for 2 perspectives, kept generating 6 to 8 and hit Groq's rate limit. Prompt rewording never fixed it. Moving the count into a state schema the moderator schedules against did, and time to verdict went from 19.8s to 9.8s.

podman-flake-agent. Prototype for the LFX Mentorship on CI flake triage. Sending only the failing block cuts payload 76% to 93% before inference, and unknown is a valid verdict, because calling a real race condition a flake tells a maintainer to re-run a genuine bug.

Something. My first startup, Apr to Jun 2026. 573 people on the waitlist in the first month with no paid distribution. It did not become a company, and the code is open now.

Older

On the record

  • Top 10%, Apart x CeSIA AI Incident Response Sprint
  • Winner, Egoistic Ideathon 2026, captain of a team of 4
  • 3rd, CockroachDB Hackathon, solo
  • 6th of 500 on our problem statement, Smart India Hackathon 2025
  • 2nd, Hacksagon 2024, hardware track
  • Agentic AI domain lead, GDG on Campus ABV-IIITM
  • Published poetry in Camas (Linfield University)

I also teach math and English to kids every week with the SGM social initiative.

Still getting DSA wrong. I open a problem, get an idea, and build that instead. Most of the list above started that way.


LinkedIn · Insta · somaykousis@gmail.com

Pinned Loading

  1. Apocalypse Apocalypse Public

    Python 2

  2. Aye-aye Aye-aye Public

    1

  3. PaperPlanes PaperPlanes Public

    Python 1

  4. Perceived-Oversight Perceived-Oversight Public

    Python 1

  5. Pocket-Change Pocket-Change Public

    Python 1 1

  6. pixels pixels Public

    macOS desktop pets that remind you to drink water and take walks

    Swift