Ahmet
Kazankaya

AI Automation Engineer · LLM agent systems

One human, several agents. I decide, review and debug. They type.

Agent orchestration, workflow automation, and the gates that keep both honest.

Rıfkı · ESP32-S3 · 3.3 V rail, battery powered

Everything I build runs on something that can fail quietly. This one failed loudly, for a month.

scroll to run the fault

Symptom

On battery the board browned out and boot looped. On USB power it was fine every time.

First guess · wrong

Servos stay passive during boot, so they cannot be the cause.

A month of config tweaks went into this assumption before I stopped defending it.

Signal

Watching the hardware instead of the logs: the servos twitch the instant the battery goes in.

Root cause

At reset the PWM pins float. Three SG90 servos each pull about 300 mA of inrush, and together with the WiFi power peak they take the boost rail under the brownout threshold.

2.43 V · brownout detector level 7 · rail never recovers before the next reset

Fix

Drive the servo and motor pins to OUTPUT LOW with pulldown in the first line of the board constructor.

No hardware change. The twitching stopped and the screen came up on the first try.

Summary

Open to full-time roles in Europe · on-site preferred, remote works · willing to relocate

I build the platform layer that makes LLM agents safe to run in production: execution runtimes, human approval gates, permission boundaries, run logging, and the evaluation harnesses that decide whether an agent is allowed to ship. I came to software through production work rather than a computer science degree, and my focus is now fully on systems and automation. Since early 2026 I have shipped, with Claude Code as the primary tool, a task management system that has been running for four months at a foundation operating schools in 66 countries, an automation line that lists and prices real products on Etsy, the robot above, and two open source skill sets other people install into their own agent setups.

Working modelOne human, several agents. I write the architecture and the constraints into per repository steering files, route each task to the cheapest model that can do it, and read every diff before it lands. What the agents cannot do is decide what is worth building, or work out why a system is lying to me. Because the automation carries the repetitive load, I run several of these lines at the same time rather than one after another.

Daily toolsClaude Code across a Windows and a macOS machine joined over Tailscale, so one session works on both. Claude Agent SDK inside my own applications. Codex CLI, Cursor, Antigravity and Gemini CLI alongside it; Ollama and OpenRouter for model routing; MCP servers for Blender, NotebookLM and my own tools.

Analysis, documentation, testingA 170 iteration research loop over trading data that rejected 87 hypotheses and returned the answer I did not want: no tradable edge was left in that space. An automation survey across 184 real tasks that yielded 31 candidates. A cross linked knowledge layer over what I read, with weekly lint runs that flag contradictions and stale claims. Verification runs headless: Unity batchmode builds, xcodebuild with simulator screenshots, pytest and vitest suites the agent has to pass before a task counts as done.

Risks and limitsI wrote guard-20 and audit-20 because the same twenty failure classes kept reappearing in generated code. I refuse blocklist style fixes: they patch the layer where the symptom shows, not the one that broke. Scaffolding has a ceiling too, and my own scaffold documents it.

Cases

Maarif Task Management

In production · running for four months

Türkiye Maarif Vakfı · Directorate of Communications

The director used to read every incoming email himself, decide who should do each job, then track every delivery personally. The system reads the mailbox, turns each message into a task definition with an LLM, assigns it, and puts the state of every job on an office TV board.

Symptom
Generated task documents drifted from the institution's templates, and a text diff showed nothing.
Root cause
The drift was visual, so the thing I was checking could not see it.
Fix
Compare delivered files against fixed templates visually, which made template stability measurable; move the watcher off raw mail to an LLM written job definition.

Python · FastAPI · SQLAlchemy · SQLite · Next.js · Swift · Microsoft Graph · Outlook 365 · Telegram

Etsy Factory and Demand Engine

Running daily

Own production business

Public domain museum works and locally generated art flow into Printify products and Etsy listings, through a Telegram approval gate, on a schedule, controllable from my phone over the tailnet. A pricing engine pulls Printify's own shipping table per variant and country and disables combinations that cannot be profitable.

Symptom
The scout agents kept producing near duplicate product ideas.
First guess
The model. Changing it changed nothing.
Root cause
The shape of the data handed to the agents.
Fix
Restructure the input.The clearest case I have of an AI failure that is not an AI problem.

Python · Swift · Etsy API · Printify · Telegram · launchd · Tailscale

Rıfkı · the speech side

Working prototype

ESP32-S3 · firmware and PC bridge

The power fault is the scene at the top of this page. The same machine had a second one, quieter: microphone to speech recognition to an LLM to speech synthesis to head and arm servos, and somewhere in there it started making things up.

Symptom
The pipeline invented a phrase out of silence.
First guess
Filter the phrase. Rejected: that patches the wrong layer.
Root cause
Torch's C++ file open corrupts the Turkish character in the project path, so the voice activity detector raised on every call and a broad except turned that into a warning. With it dead, endpointing never fired and the transcriber was handed pure silence.
Fix
Copy the model file to an ASCII cache path through Python and load it from there.

C++ · PlatformIO · ESP-IDF · Python · Deepgram · Groq · ElevenLabs

The robot on a workbench: 3D printed orange body, an OLED face showing two eyes, ultrasonic sensors below it, servo wiring running out the back.
The machine the fault was in
Wiring diagram of the robot: ESP32-S3 at the centre with servo, audio, display and sensor lines colour coded out to each peripheral.
Wiring, where the rail is shared

guard-20, audit-20 and Mythos Scaffold

Open source, installed by other people

claude-audit-20 · claude-mythos-scaffold

Twenty recurring AI coding failure classes turned into enforceable process. guard-20 states them as write time rules. audit-20 runs a twenty pass verification gate whose final pass exists only to falsify the findings of the previous nineteen, so the aggressive passes do not bury you in false positives. Mythos Scaffold externalises long task state into a mission file and enforces persistence with harness level hooks.

Symptom
The scaffold measurably degraded output on the newest model generation, the opposite of its purpose.
Root cause
Over scaffolding. The newer the model, the more the extra process costs it.
Fix
Model gating, the ceiling written into the documentation, and an eval harness that runs bare and scaffolded arms so the claim is measured rather than assumed.

Python · Claude Code skills · Stop and SessionStart hooks · eval harness

Cebimde Claude

Working prototype

Building iOS apps from the phone, without sitting at a Mac

Making an iOS app normally means a Mac with Xcode open in front of you. This turns the Mac into a build server you never look at: you describe the app from your phone, the agent scaffolds an XcodeGen SwiftUI project, compiles it, and sends back a simulator screenshot. A second command signs it and installs it on the phone in your hand. When a build fails the compiler output goes back to the agent, which fixes it and rebuilds without being asked.

Symptom
Every dropped connection left a ghost, writing output to a dead socket while a new agent started on the same project.
Root cause
No identity on the connection, no ownership rule per project.
Fix
A connection epoch, a stop rule for hanging agents, and session ids persisted to disk so a conversation survives the app being killed.

Swift · SwiftUI · TypeScript · Claude Agent SDK · WebSocket · XcodeGen · xcodebuild · devicectl

A timing fault in someone else's menu bar

Merged upstream

iMenu-MacOS#1 · opened 11 August, merged 23 August 2026

iMenu is a native macOS menu bar manager written by someone else. Hiding an item is not an API call there, the app synthesises a ⌘ drag and lets the system menu bar move the icon itself. That hide landed on an idle machine and missed under load, which is the signature of an ordering problem rather than a logic error, and it is the kind of bug a test suite cannot see.

Symptom
The same gesture worked sometimes and did nothing other times, with no error raised anywhere and the full suite green either way.
Root cause
The drag samples already paused between each other, but the four edges of the gesture did not. Key down, press, drop and key up were posted in a single run loop pass, so the menu bar was handed the next event before it had entered rearrange mode, picked the item up, or processed the drop against the item's new position.
Fix
Four settle delays, one per edge, named and documented separately so each can be tuned on its own. 270 ms added to a gesture that already spent about 120 ms in step delays, so it stays inside one user action.134 tests passed before and after, because they exercise geometry and seams rather than the timing of posted events. I said so in the pull request instead of claiming a verification I could not run on the maintainer's machine.

Swift · CGEvent synthesis · Accessibility API · unfamiliar codebase, upstream contribution

Coordinated security disclosure

Four findings, two vendors and my own code

security-research · full timeline and artifacts

Coordinated disclosures against open-source AI tooling, all filed privately through the vendor's own channel with no working exploit published. The largest covered 17 vulnerabilities in a wearable AI device backend, aggregate CVSS 10.0: remote code execution, authentication bypass, SSRF and a hardcoded production key. A second reported that a documented filesystem allowlist did not exist in the shipped Rust binary, so the hardening step the project told operators to take did nothing. The same audit turned inward and found a command injection in my own tool.

Symptom
Documentation instructed operators to restrict filesystem reach with a command line flag that the binary never reads.
Root cause
The flag survived a TypeScript to Rust rewrite in the docs but not in the code. Argument parsing accepts it silently and discards it.
Verification
The vendor's own hardening commit names the first disclosure in its title, so the outcome is checkable in their git history rather than only in my write-up.

Static source audit · local reproduction · GitHub Security Advisories · duplicate screening against published CVEs

Command injection in my own tool

Found and closed in Sift

sift#2 · merged 7 August 2026

Sift indexes local agent transcripts and can resume a session in the terminal. Resuming built a shell command in which the working directory and the binary path were quoted, but the session identifier was not. That identifier is read from a field inside the transcript file, so its value is whatever the file says.

Symptom
A transcript whose session id carried shell metacharacters turned one Resume click into arbitrary command execution in the user's own terminal.
Root cause
The escape layer in between only handled backslash and double quote, so semicolons, backticks and command substitution passed straight into the shell. CWE-78, local, driven by untrusted file content.
Fix
Quote each argument individually. One line. The sibling launcher in the same codebase already did exactly this, so the fix closed an oversight rather than changing a design.

Swift · shell argument quoting · CWE-78 · reported and fixed in the open

Secrets in AI agent instruction files

Reported privately, fixed by the maintainers

Public CLAUDE.md and AGENTS.md files across GitHub

Agent instruction files are a new place for credentials to leak, because they are written for a machine and reviewed like documentation. Nobody treats them as source, so a password pasted in for convenience survives review. I scanned public repositories for that class and reported what I found through each project's own issue tracker.

Symptom
A production database root credential sat in plain text inside an instruction file, in a public repository, reachable through a jump host.
Root cause
The file was written to make an agent's job easier and never entered the review path that covers source code, so no secret scanner and no reviewer ever looked at it.
Outcome
The maintainer rotated the credential and refactored it out of the file, and confirmed the report in the thread. A second exposure in another project was closed the same way.

Pattern scanning · responsible disclosure · maintainer-confirmed remediation

The machine

The page above says I run several agents. This is what that actually means: a task is scoped to one repository, routed to the cheapest model that can do it, checked against write time rules, put through a twenty pass CI gate, and stopped at a human approval point before anything ships. Nothing merges without me reading the diff.

Skills
160 procedures the agents load on demand rather than carrying in context. The bodies total 2.2 MB; the index that decides which one to open is 21 KB.
Scheduled work
17 cron jobs and 9 scheduled launchd agents. One of them audits open source AI tooling for vulnerabilities every day and has run 18 consecutive days.
Results
186 repositories inspected and 26 pull requests opened into other people's repositories, 11 of them merged. 4 security findings filed privately through vendor channels. 2 more were closed before sending: one duplicated a published CVE, the other did not reproduce when I ran the code.
Approval gate
Security reports, force pushes and anything touching production data stop and wait for a human. The agents can propose; they cannot send.
Audit trail
Every run writes a log. When a scheduled job silently failed for a day, the gap in that trail is how it was found, and a recovery watchdog now covers it.

What this is notThe agents do not decide what is worth building, and they are wrong often enough that the gates exist for a reason. Two of the six findings my own security loop produced were rejected by those gates before they reached a maintainer. That rejection rate is the argument for the architecture, not against it.

Stack

Everything below appears in code I have shipped.

Languages
Python, TypeScript, JavaScript, Swift, C++ (ESP32/Arduino), C#, SQL, MQL5, Shell, PowerShell
Backend, data
FastAPI, SQLAlchemy, SQLite, PostgreSQL, Prisma, Supabase, NestJS, Redis
Frontend, apps
Next.js, React, Tailwind, Vite, Turborepo, SwiftUI, Capacitor, Tauri, Expo, PySide6
Embedded
ESP-IDF, PlatformIO, Arduino, servo and audio hardware bring up
Infrastructure
Git, Docker, AWS EC2, Vercel, Netlify, Cloudflare Workers, Tailscale, launchd and cron, pm2
Integrations
REST APIs, Microsoft Graph, Outlook 365, Etsy, Printify, Telegram, WhatsApp, Deepgram, ElevenLabs, Groq, KIE.AI, OpenRouter, MetaTrader5
Testing
pytest, vitest, Jest, XCTest, Playwright, headless batchmode CI

History

AI Solutions Engineer, consultant · Türkiye Maarif VakfıInternal platforms and automation for the Directorate of Communications, a public foundation operating schools in 66 countries.

Producer and Photographer · Creww DigitalCommercial production for ecommerce clients, working directly with client teams through brief, review and delivery.

Photographer · Istanbul GovernorshipPublic sector visual communication.

News Editor · Skala Media SolutionsEditorial and digital PR.

EducationMechanical Engineering, Namık Kemal University, from 2012. I left before finishing the degree and learned the rest by building; the engineering years are where the habit of taking a system apart before judging it comes from.

Before softwareTen years in visual production, which is where the tooling instinct came from. I ran Stable Diffusion and ComfyUI on my own machines from 2023 and treated node based workflows and LoRA fine tuning as production tooling rather than demos. My focus now is software and automation; the visual work is background.

A crossing at rush hour, everyone around me blurred by the exposure, me standing still and looking back at the camera.

How the work actually goes

Every fix on this page started the same way. Stop moving, and look at the thing itself.