Prepared for Joseph A. Horsch

Agentic Coding Track

A 30-day, hands-on path from skeptical to genuinely capable with AI coding agents — built around your own C++/Vulkan work, not a to-do app.

  • 6Parts
  • 4Weeks
  • 19Exercises

Four weeks from now, you should be able to walk into a room full of skeptical senior engineers and say something true and specific about agentic AI — not because you read about it, but because you ran it against your own code, caught it lying, made it fix a real bug, shipped something with it you couldn't have shipped alone that fast, and then built one yourself from scratch. That's the track. No hype, no slogans — just a loop you run, verify, and eventually build.

If you're carrying any version of "AI is going to take this job from me" — that's a reasonable thing to wonder and a bad thing to leave unexamined. Part 5 gives you the honest, specific answer. The short version: these tools are compressing the value of typing code and raising the value of judging it — knowing what's worth building, catching what's wrong, understanding a system well enough to tell when a green test isn't actually proof of anything. That's exactly the skill a Vulkan renderer and a shipped capstone already trained in you. This track is how you prove that to yourself first, and to an interviewer second.

This is not a second job running in parallel with your portfolio project. It is a multiplier on it.

Read this section before Day 1. It is the difference between finishing the track and quietly abandoning it in week two.

You have one flagship project to build (the Portfolio & Proof document specs it) and one job search to run. If you treat this track as a separate 30-day commitment stacked on top of those, one of the three will quietly collapse — and it will be the job search, because it's the one with no deadline attached.

So run it this way instead: every exercise in this track takes your flagship project as its input. When Part 2 says "point an agent at a codebase," that codebase is your project. When Part 3 says "make it fix a real bug," that's a real bug in your project. When Part 4 says "ship something you couldn't have shipped that fast alone," that's a feature of your project. You are not building throwaway practice repos. You are building the one thing you'll show employers, and learning the tooling on the way through. Same weeks, same hours, two outcomes.

The measurable result is that your project ships faster and better than it would have without the agent — and you can say exactly how, with specifics, in an interview. That sentence is worth more than a certificate.

The one thing that will actually sink you

Leaning on an agent hard enough that you stop being able to do the work yourself.

There is one failure mode here and it is not subtle. Entry-level technical screens are still, overwhelmingly, you and a problem and no assistant. A candidate who can direct an agent beautifully but can't reason through a pointer bug, explain their own architecture, or write a function on a whiteboard gets found out in under fifteen minutes — and it reads worse than never having touched AI at all, because it looks like a shortcut that didn't work.

The rule: you never accept code from an agent that you could not have written yourself, and could not explain line by line right now. If it produces something you don't understand, that's not a win you keep — it's a thing you stop and learn, or you throw away. Use the agent to go faster on what you know and to explore what you don't. Never to skip the understanding. Your fundamentals are the asset; this is leverage on the asset, and leverage on zero is zero.

Part 1 01 / 06

What agentic coding actually is

The real distinction

Three different things get called "AI coding" and they are not the same tool wearing different skins.

Autocomplete no loop

Classic Copilot-style, most IDE inline suggestions: predicts the next few tokens or lines as you type. It has no memory of your goal beyond the current file, runs nothing, checks nothing. It's a much smarter version of predictive text. You stay the author of every decision.

Chat-assisted coding you are the loop

You ask a question or paste code into a chat pane, it answers or generates something, and you copy it in, you run it, you come back and report what happened. The model never touches your filesystem or a terminal. Every loop iteration passes through your hands.

Agentic coding the loop closes itself

The model is given a goal and a set of tools — read a file, edit a file, run a shell command, run the test suite, search the repo — and it plans a sequence of actions, executes them itself, reads the real result (compiler output, test pass/fail, a stack trace), and decides the next action. In a loop. Without you relaying each step.

The defining feature isn't "the AI writes code." Chat-assisted does that too. It's that the loop closes without a human in the middle of every iteration.

The loop, precisely

  1. Perceive. Read the relevant files, run the build and tests, see the actual current state, not a description of it.
  2. Plan. Decide the next concrete action given the goal and the current state.
  3. Act. Call a tool: edit a file, run a command, search, run tests.
  4. Observe. Read the real output of that action.
  5. Repeat until the goal is met, a boundary is hit (max iterations, needs permission), or it's stuck and has to ask you.

This is not magic, and it is not reasoning the way a person reasons. It is a control loop.

The analogy: this is a game AI whose "game" is your codebase

You've built something structurally identical to this before, just in a different domain. An NPC or a bot that runs a sense to think to act cycle every tick: query the world state, run it through a behavior tree or state machine, execute an action, re-sense next tick. Agentic coding tools run that same loop, just slower, against a different world.

Game AIAgentic coding tool
World state = game state (positions, health, triggers)World state = your repo (file contents, compiler output, test results)
Action space = {move, attack, path-to, interact}Action space = {read_file, edit_file, run_command, search}
Reward / goal signal = score function, win conditionReward / goal signal = test suite, build success, linter
Perception is only as good as what the bot queriesPerception is only as good as what's actually in its context

Which means the failure modes are ones you already know how to think about from AI programming. A bad world-state read produces a confidently wrong plan — exactly like a bot acting on stale perception data. A poorly-scoped action space produces thrashing. A missing feedback signal (no tests, no build step) means the loop can't tell success from failure, and it will confidently report both as success.

You are the level designer and the QA here. You decide what it can perceive, what it can touch, and what "success" is measured against.

That's the whole professional skill, and it's what Weeks 1 through 3 train.

The industry vocabulary for this, if you want it

This is loosely what the industry calls the "ReAct" pattern (reason + act, interleaved) or an "agent loop" with "tool use" / "function calling." Different vendors brand it differently — Anthropic calls the primitive "tool use," OpenAI calls it "function calling" — but the mechanism underneath (model proposes a structured call, your code executes it, the result goes back into context) is the same shape everywhere.

Why this matters for how you'll learn it

Because the loop is mechanical, the way to get good at it is not "chat with it more." It's: control what it can see, control what it can do, and control how success is measured — then read its mistakes the way you'd read a bot's replay log. That's Week 1.

Part 2 02 / 06

The landscape, honestly assessed

Not finished yet, and not padded to look finished

What lands here is a verified assessment of Claude Code, Cursor, GitHub Copilot, Windsurf, Cline, Aider, Zed, OpenAI's coding agents, Google's coding agents, and the open-source agent frameworks, each one cited to a primary source with the date it was checked, and every price taken from the vendor's own pricing page rather than from memory. Memory is not reliable for this category; these tools re-price every few months.

Exercise 1.1 points here for the recommended $0 stack.

Part 3 03 / 06

The 30-day track

Every week ends with something real: a document, a merged change, a small tested library, or a working piece of software — not a completed checklist. The exercises assume you have (or can get to) your Full Sail capstone repo (the Vulkan/C++ engine and gameplay/AI systems from Quantex Games) or an equivalent C++ project of a few hundred lines or more that you wrote and can verify against your own memory. If your original repo isn't handy, any real C++ project you've personally written works — the point is code where you, not the agent, are the ground truth.

Your progress

0 of 23 done

Week 10/6
Week 20/5
Week 30/6
Week 40/6

Checkmarks, quiz answers and anything you type into this page are saved in this browser only. Close the tab and come back. It will be here.

Week 1

Driving

0 of 6

Get the tools running. Use an agent on code you know cold. Learn to write a spec instead of a wish. Learn exactly where it lies.

Why it matters. Every mistake you catalogue this week is a mistake you'll recognize instantly for the rest of your career. This is the week that kills blind trust — in both directions. You'll see it do genuinely useful things and genuinely wrong things, often in the same session, and you'll start being able to tell which is which without needing a test to prove it.

Exercise 1.1

Set Up Your $0 Stack

GoalGet one agentic tool actually running against a real repo on your machine before doing anything else.

Steps
  1. Install the tool recommended in Part 2's $0 stack.
  2. Point it at your capstone repo (or equivalent), not a fresh empty project.
  3. Ask it to do the smallest possible real thing first: summarize what the repo does, or list the files it thinks are most important. This is a smoke test, not the real exercise.
  4. Confirm you can see exactly what file(s) it read and what, if anything, it changed. If you can't tell what it touched, stop and find that setting before continuing — you cannot verify what you can't see.

Exercise 1.2

Cold-Read Your Own Engine, and Start the Lies File

GoalCatalogue every mistake the agent makes explaining or working on code you already understand perfectly.

Steps
  1. Create a new document called LIES_FILE.md. This travels with you for all four weeks.
  2. Pick a piece of your engine you understand cold — a synchronization point (a fence or semaphore wait), a command buffer submission, or a state machine transition — and ask the agent, with no hints, to explain exactly what it does and why it's written that way.
  3. Read its explanation line by line against what you actually know is true.
  4. For every inaccuracy, however small, however confidently stated, log it: what it claimed, what's actually true, and how confident it sounded (was there any hedge, or did it state the wrong thing as flatly as the right things?).
  5. Repeat on two more pieces of code of increasing obscurity (e.g., something Vulkan-specific and version-sensitive, or an edge case in your state machine).
LIES_FILE.md: the shape of one entry
# LIES_FILE.md

## Entry
- Date / session:
- Code under discussion:
- What it claimed:
- What is actually true:
- How confident it sounded (any hedge, or flat?):
- Category: confidently correct | confidently wrong | correctly hedged

You'll know it clicked when you notice it sounds exactly as confident when it's wrong as when it's right. That's the actual lesson — not "it makes mistakes," but "it gives you no signal that it's making one."

Exercise 1.3

Same Task, Two Prompts

GoalProve to yourself, with your own evidence, that prompt and spec quality is the highest-leverage thing you control.

Steps
  1. Pick one small, real, well-defined change your engine could use (e.g., a debug wireframe toggle, a config-driven camera speed, a validation-layer warning fix).
  2. Session A: ask for it in one vague sentence.
  3. Session B (fresh context, same repo): ask for it as a real spec — the exact function/file, the exact behavior, constraints, and a definition of done.
  4. Diff the two results. Note where B was better and why, mechanically — what did the spec remove that the vague prompt left the agent to guess?
Session A: the vague version
make the renderer more configurable
Session B: the four things a real spec names
FILE / FUNCTION:  the exact file and function to change

BEHAVIOR:         exactly what it should do afterward

CONSTRAINTS:      no new dependencies
                  must not change the public API

DEFINITION OF DONE:
                  what has to be true for this to be finished

Exercise 1.4

Ship One Real Fix, Fully Agentic

GoalLet it run the entire loop — read, edit, build, iterate — on one real, small, merge-worthy change, and review it like you'd review anyone else's pull request.

Steps
  1. Pick one genuinely useful, small fix or feature for your engine (not a toy).
  2. Give it the spec from 1.3's method, let it use full agentic capability: reading files, editing, running the build, iterating on compiler errors itself.
  3. Do not accept the first result blind. Read the full diff before you decide anything.
  4. Build and run it yourself, independent of whatever the agent reported.
  5. Commit it only once you've verified it — this is now a real, shipped, agent-assisted change to your own engine.

Exercise 1.5

Probe the Edges

GoalExtend the Lies File with a harder, more targeted category: confidently wrong answers about specific, versioned, obscure facts.

Steps
  1. Ask it something about a specific Vulkan extension behavior, a specific validation-layer message meaning, or a subtle language rule (e.g., a C++ object lifetime or aliasing edge case) that has one objectively correct answer.
  2. Before checking, write down your own confidence that its answer is right.
  3. Verify against the primary source (the Vulkan spec, the validation layer source/docs, cppreference).
  4. Log the result in the Lies File with a category tag: "confidently correct," "confidently wrong," "correctly hedged."

Week 1 artifact

LIES_FILE.md (v1, at least 8 to 10 logged cases across three categories), plus one real, tested, merged commit to your own engine that an agent helped build end to end.

Week 2

Verifying

0 of 5

The actual professional skill. Reviewing agent output, testing it, catching the confident-but-wrong before it ships.

Why it matters. Anyone can prompt an agent. What separates an engineer who uses AI well from one who's about to ship a production incident is whether they have a real process for catching what the agent got wrong — before a user, a test in CI three weeks from now, or a senior engineer in code review does. This week builds that process, using bugs deliberately planted so you know exactly what "catching it" feels like.

Exercise 2.1

Plant the Bug, Then Find It

GoalMake an agent write something subtly broken, then find the break yourself, without being told where it is.

Steps
  1. Ask the agent to implement a small, real concurrency-adjacent utility relevant to a game engine: a fixed-size thread-safe job queue, or an object pool used from more than one thread. Don't mention anything about wanting it to be broken.
  2. Do not review the code yet. First, write down what you'd need to test to be convinced it's correct under concurrent access. This is the professional habit: deciding your verification criteria before you look.
  3. Now review the implementation line by line against your own list. Concurrency bugs that agents commonly produce: a non-atomic check-then-act, a missing memory barrier or ordering guarantee, a lock held for too short a window, an assumption that a standard container operation is thread-safe when it isn't.
  4. Write a small stress test that actually exercises concurrent access (multiple threads hammering the structure) rather than a single-threaded happy-path test — a happy-path test will pass on nearly any version of this bug.
  5. Document the actual root cause once you find it (or confirm you didn't, and why you're confident it's actually correct).
Stuck finding the bug?

Ask the agent, in a fresh session, to review its own prior output for thread-safety issues, and compare what it finds under direct questioning to what a real stress test reveals. This itself is data for the Lies File: does it default to reassuring you it's fine unless directly pushed?

Exercise 2.2

Tests First, Agent Second

GoalRun a real test-first agentic workflow, where the check exists before the implementation does.

Steps
  1. Pick a small, pure-logic module (a math utility, a state machine transition table, a spatial query like AABB overlap).
  2. Write the tests yourself — the actual assertions, including edge cases — before the agent writes any implementation.
  3. Hand the agent only the test file and the function signature, and ask it to make the tests pass. Do not let it edit the tests.
  4. Watch it iterate: run tests, read failures, adjust, re-run. Note any point where it looks tempted to change the test instead of the code (a real and common failure mode). If it happens, that's a Lies File entry.
  5. For every red to green transition, explain to yourself why it went green, not just that it did.

Exercise 2.3

Review It Like You'd Review a Junior's PR

GoalBuild a personal code-review checklist you actually trust, by using it for real.

Steps
  1. Ask the agent for a moderately complex, real change — a refactor of your input handling into a cleaner state machine, or restructuring a rendering pass.
  2. Before looking at the diff, write your own review checklist: correctness against intent, edge cases, resource lifetime and RAII correctness (a classic C++ blind spot for generated code — watch for leaked handles, double-frees, dangling references), and performance regressions.
  3. Review the actual diff against your checklist, not your gut.
  4. Revise the checklist based on what you missed the first pass and only caught on a second read.

You'll know it clicked when you write the checklist once and then genuinely reuse it, unprompted, on the next exercise — because you trust it more than your first instinct.

Exercise 2.4

The Silent Regression Trap

GoalCatch a case where "it still works" and "it behaves identically" are not the same claim.

Steps
  1. Ask the agent to "optimize" or "refactor" a working piece of code (a hot loop, a rendering pass, a data structure) without changing its behavior.
  2. Before accepting it, define what "identical behavior" actually means for this code. A full test suite still green is a floor, not proof, for anything touching rendering: for a graphics change, compare actual rendered output (a screenshot diff or a frame hash) against the pre-change baseline, not just "it compiles and runs."
  3. Run that comparison. If everything matches, dig for what changed anyway (allocation pattern, a subtly different edge-case path) and log whether it was truly invisible or whether your check just wasn't strict enough.

Week 2 artifact

A documented bug-hunt report (the planted concurrency bug: root cause, fix, how you found it), one module with tests written first and an implementation that earned a green build against them, and a personal code-review checklist with at least one entry you only added after missing it once.

Week 3

Building

0 of 6

Ship something real with agentic assistance that you could not have shipped this fast alone — with the emphasis on scoping, decomposition, and context management, not on typing speed.

Why it matters. This is the actual job. Anyone can get an agent to write one function. The skill that shows up on a resume as "shipped X" is deciding how to break a real system into units an agent can hold correctly, and knowing when its picture of your codebase has quietly gone stale. Both are things you do, not things you prompt for.

The project

A small, reusable behavior-tree / hierarchical state machine library in C++

Extending your existing engine. This is deliberately dual-purpose: the same node/tick/transition structure that drives game AI (which you already have direct experience with from your capstone) is the same structure used to sequence industrial and robotics control logic, which is directly relevant to the Ohio manufacturing and automation employers you're targeting. Ship it as a real addition to your engine's repo where an existing entity or object can be driven by it.

No easy place to attach this in your existing engine?

Build it standalone with a small console harness that drives a handful of simulated "agents" or "stations" instead. The library and every exercise below work identically either way; only the integration target changes.

Exercise 3.1

Write the Spec Before Any Code

GoalDo the scoping work yourself before the agent writes a line.

Steps
  1. Write a one-page design spec: the public API (what a Node, a Sequence, a Selector, a Condition/Action leaf look like), what "tick" returns (Success/Failure/Running), what you are explicitly not building this week (a visual editor, a networked/replicated version), and your test plan.
  2. Have the agent critique the spec before you build anything — ask it to poke holes, not to write code yet. Note what a good critique catches versus what it misses.

Exercise 3.2

Decompose Into Agent-Sized Units

GoalBreak the build into units small enough that an agent can hold each one correctly, and sequence them so each stage is independently testable.

Steps
  1. Order the build: node interface, then composite nodes (Sequence, Selector), then leaf nodes (Condition, Action), then the tick scheduler, then a simple text/JSON tree-definition loader, then the integration point into your engine.
  2. Build and test each unit before starting the next. Don't let three untested units stack up.
  3. At each handoff to the agent, explicitly state which files are in scope for this unit and which existing files are constraints it must not silently change.

Exercise 3.3

Break Your Own Context, On Purpose

GoalDirectly observe context degradation, rather than just being told it exists.

Steps
  1. After modules 1 to 3 are done and tested, go back and change something structural in module 1 — change the tick return type's meaning, or rename the core virtual method.
  2. Open a fresh agent session (don't reuse the conversation that built modules 2 and 3) and ask it only to add a new leaf node type. Do not mention your module 1 change.
  3. Observe: does it generate against the old, now-wrong signature? Does it silently produce something that breaks modules 2 and 3? Does anything in its output flag the mismatch, or does it proceed with total confidence?
  4. Write down why this happened, in your own words, tied back to Part 1's loop: its "perception" is only what's actually in its current context, not what's real in the world.
  5. Redo it correctly: re-point it explicitly at the changed file first, and confirm the new output is now correct.
Step 2: the whole prompt, nothing else
add a new leaf node type

You'll know it clicked when you stop being surprised by this, and you start doing step 5 by default on every real project, without the exercise telling you to.

Exercise 3.4

Time-Box a Real Build Day

GoalProduce a real, defensible "how much faster" number, not a marketing claim.

Steps
  1. Pick one full remaining unit of work (the tree-definition loader, or a small debug visualizer for the tree state).
  2. Start a timer. Keep a running build log: every prompt, what the agent did, what you fixed by hand, timestamps.
  3. At the end, record actual elapsed time.
  4. Separately and honestly, estimate how long that same unit would have taken you solo at your normal pace, using your Week 1 and 2 experience as a reference point.
  5. Compute the ratio. Write it down — this is real evidence you'll use in Part 4.

Exercise 3.5

Docs Pass With a Human Editor

GoalUse the agent for real "boring but necessary" work, with the same verification discipline as everything else.

Steps
  1. Have the agent draft the README and API documentation for the library.
  2. Edit it yourself. Correct anything technically imprecise, and cut anything that oversells what the library does.
  3. Note anywhere the draft was confidently wrong about your own library's behavior. Yes, this still happens, and it's still a Lies File entry.

Week 3 artifact

A tested, documented behavior-tree / state-machine C++ library integrated into (or built alongside) your engine, with a working demo, on GitHub — plus an honest, evidence-based solo-versus-assisted time estimate from Exercise 3.4.

Week 4

Automating, and going agentic

0 of 6

Build something that is an agent — a small, well-scoped tool that calls an LLM API with real tool calls, in a loop, against real feedback.

Why it matters. This is the week that separates you from almost everyone else applying for the same job, because it proves you understand the mechanism from Part 1 well enough to build it, not just drive it. "I used Cursor" is a claim anyone can make. "I designed the tool contract, wrote the loop, and guardrailed it myself" is a different category of claim entirely, and it's the one that survives a technical follow-up question.

The project

"Build Doctor"

A small CLI agent that takes a real, broken C++ build and, using a handful of tools you define yourself, called against a model API directly, diagnoses and repairs the error, re-checks, and iterates up to a hard cap. No framework required; a direct API call and a plain loop is the better teacher here and is genuinely what this scale of task calls for.

Exercise 4.1

Design the Tool Contract

GoalDefine the smallest tool set that could plausibly fix a real compiler error, and justify every exclusion.

Steps
  1. Choose 3 to 5 tools.
  2. Write the exact schema for each tool in the format your chosen API expects.
  3. Write a short system prompt: the goal, the allowed tools, and explicit stop conditions (success = clean build; hard cap = a fixed number of iterations, e.g. 6).
  4. In one paragraph, explain why you deliberately excluded a delete_file or an arbitrary-shell-execution tool. This is the actual safety-scoping skill.
A starting tool set
list_files(dir)
read_file(path)
apply_edit(path, new_content)
run_build()          # returns stdout / stderr

Exercise 4.2

Write the Loop

GoalImplement the mechanical loop from Part 1 yourself, end to end.

Steps
  1. Write the control loop: call the model with the message history and tool schemas; if the response is a tool call, execute the real corresponding function and append the result to the message history as a tool result; call the model again; if the response is final text, stop.
  2. Test the loop mechanics first against a trivial seeded error (a missing semicolon) before testing anything harder. You're debugging your own harness, not the model, at this stage.
  3. Log every iteration (the tool called, its arguments, and its real result) to a file as it runs.
Skeleton only: fill in your provider's client and tool schema format
messages = [{"role": "user", "content": build_task_prompt(error_log)}]
for iteration in range(MAX_ITERATIONS):
    response = call_model(messages, tools=TOOL_SCHEMAS)
    if response.stop_reason == "tool_use":
        result = execute_tool(response.tool_call)   # your real function, not the model's
        log_iteration(iteration, response.tool_call, result)
        messages.append(tool_result_message(response.tool_call, result))
    else:
        log_final(response.text)
        break
else:
    log_final("Hit MAX_ITERATIONS without a clean build.")

Exercise 4.3

Add Guardrails

GoalProve to yourself the difference between a prompt-only limit and a code-enforced one.

Steps
  1. Add the iteration cap as actual enforced code, not just an instruction in the prompt.
  2. Test the difference directly: tell the model in the prompt to "stop after 3 attempts" but do not code-enforce it, and observe whether it actually stops at 3 every time, or whether the limit is closer to a suggestion.
  3. Add a confirmation step before any file write outside the one file it was explicitly asked to fix.
  4. Write one paragraph on what could go wrong without these two guardrails specifically, grounded in what you actually observed in step 2.

Exercise 4.4

Break It on Purpose, on Camera

GoalWatch the full loop converge on a real bug with no hand-holding, and document exactly where it succeeds or flails.

Steps
  1. Seed a real, specific compiler error in a safe branch or throwaway file: a type mismatch, a missing include, a misused struct field.
  2. Run Build Doctor against it with a screen or terminal recording on (a phone video or a free tool like asciinema both work).
  3. Note the exact moment(s) it does something you wouldn't have predicted, good or bad.
  4. If it fails to converge, that is real and useful data. Document precisely where it got stuck. A well-understood failure is more credible in an interview than a suspiciously perfect run.

Exercise 4.5

Record the Demo and Write the Design Note

GoalTurn the working loop into a demonstrable artifact, not just a repo someone has to run to believe you.

Steps
  1. Cut a 2 to 3 minute recording: broken build, agent runs, clean build.
  2. Write a one-page design note: the tool contract and why each tool is there (and isn't), the loop, the guardrails, and one real failure you observed and what it taught you.
  3. Put the code, the recording, and the note in the same repo.

You'll know it clicked when the loop converges on a real induced bug with no hand-holding, and you can explain, out loud and without notes, why each tool is in the contract, why one isn't, and why the iteration cap exists. If you can't explain why a tool is deliberately absent, you don't understand the contract yet.

Week 4 artifact

A small, working, documented autonomous coding agent (source in a public repo), a recorded demo, and a design writeup — your single strongest interview artifact.

Part 4 04 / 06

The interview payload

Everything below is earned by finishing the track, not claimed on top of it. Fill in the specific library and tool names you actually used and built once you've named them.

Resume bullets

The gold fields are editable. Type your real numbers and names in, then copy the finished line straight into your resume.

  • Built and shipped a C++ behavior-tree/state-machine library extending a Vulkan-based capstone engine, using agentic AI tooling under a self-imposed test-first and independent-verification process — completed in roughly a week what solo estimation put at .
  • Designed and built a small autonomous coding agent — a tool-calling loop with a hard-scoped, explicitly guardrailed action set — that diagnoses and repairs real C++ build failures without human intervention.
  • Systematically evaluated agentic coding tools against a real C++/Vulkan codebase, cataloguing failure modes (stale context, confidently wrong technical claims) to build a disciplined verification workflow — not just "used AI," built a process for trusting it correctly.

LinkedIn framing

  • Headline addition. C++ / Systems Programmer — Vulkan, Game & Simulation AI, Agentic Tooling
  • About paragraph, direction. I build real-time systems in C++ — most recently a Vulkan renderer and the AI/state-machine systems for a shipped capstone game. I've also gone deep on agentic AI coding tools: not just using them, but building the verification discipline to trust them on production-grade code, and building a small autonomous agent of my own to understand the mechanism from the inside.

Featured section: pin the Build Doctor demo video and a link to the behavior-tree library repo. A working demo beats a bullet point every time.

Interview questions you'll have earned

"How do you use AI in your work?"

The weak answer is "I use it to write code faster." It says nothing and every other candidate says it too. The strong answer names the actual process:

"I treat it like a fast, confident junior engineer: good at producing a first draft and iterating against real feedback, unreliable at knowing when it's wrong. My process is test-first where I can — I specify the check before I let it generate. I keep a standing habit of independently verifying anything it tells me about behavior I can't directly observe, because I've personally catalogued real cases where it was completely fluent and completely wrong about code I wrote myself. On , I used it heavily for mechanical decomposition and did the architecture and verification myself. On , I went a level further and built the loop myself — the tool contract, the guardrails, the iteration cap — so I understand exactly what it can and can't see and touch, not just how to prompt it."

"Aren't you worried AI will replace your job?"

Use Part 5's honest position, in your own words, anchored to your own evidence: the Lies File, the planted bug you found. Not slogans.

"Tell me about a time you found a bug."

The concurrency bug from Exercise 2.1 is real material. The finding and root-causing is a completely real, transferable skill regardless of how the bug got there, and it's fine to be direct that it was a deliberate training exercise if asked.

"How do you approach a project you've never done before?"

Week 3's spec-first, decomposed-into-units approach, with the context-management lesson from Exercise 3.3 as the specific, memorable detail.

"What's something you built that you're proud of?"

Build Doctor. Lead with the tool contract and guardrail decisions, not just "it works." That's the detail that proves depth.

Part 5 05 / 06

The honest limits

This section is what makes you credible in a room full of skeptical senior engineers, including the Ohio manufacturing and automation engineers you're likely to interview with, many of whom have good reason to be skeptical of anything that sounds like a pitch. Lead with this section in that room, not with Part 1's optimism. Naming the failure modes precisely earns more trust than enthusiasm does.

Long-context degradation

As a session or a codebase grows, agents lose track of decisions made many turns or files ago. You demonstrated this directly in Exercise 3.3. The fix is discipline (explicit re-orientation, tightly scoped sessions), not a belief that a bigger context window solves it on its own.

Confidently-wrong output

The central failure mode. Models produce fluent, structurally correct-looking answers about things they don't actually know, with no difference in tone between the right answer and the wrong one. This is the entire premise of your Lies File, and it's why independent verification is the actual professional skill, not a footnote to it.

Security and licensing

Generated code can contain real vulnerabilities — unchecked bounds, unsafe casts, time-of-check/time-of-use races, all live risks in C++ — and can reproduce patterns from training data that carry license obligations nobody asked about. Treat agent-generated code exactly like a pull request from a contributor you haven't vetted yet: review it, and be deliberate about where any non-trivial chunk of logic might have come from before it ships in anything that matters.

Novel, unusual, and hardware-adjacent codebases

Training data is overwhelmingly web and application code. Real-time engines, GPU synchronization, embedded and firmware work, and other low-level or unusual-shape code are underrepresented, so agents are measurably weaker exactly there. That happens to be exactly where your actual skill set sits: Vulkan, systems programming, state machines. This is a genuinely credible, non-fanboy thing to say. It's the honest version of "you are not behind," backed by where the tooling's real weak points are, not by wishful thinking.

Why senior judgment is still the binding constraint

An agent can execute a loop, but it can't yet reliably decide what's worth building, which tradeoff is right for this system, or when a green test suite isn't actually proof of correctness in a domain where some failures — a race condition, a synchronization bug — don't reliably show up in a quick test run. That judgment is the actual job. It's exactly what four weeks of deliberate verification practice is training in you.

Part 6 06 / 06

Where to go next

Also still open

A short, curated set of currently-live, primary-source resources (vendor docs, official guides, communities) for continuing past day 30, verified live and cited with URLs, lands here once confirmed. A few excellent primary sources, not a long listicle-style dump.

Self-assessment Did it land?

Ten questions. Answer from memory first.

Say your answer out loud or write it down before you open the real one. Then grade yourself honestly. The score is only useful if the grading is. Your read is at the bottom of this section and unlocks once all ten are graded. Nothing here is sent anywhere; it's saved in this browser so you can come back and beat it.

  1. 01

    What's the actual technical difference between chat-assisted coding and agentic coding?

    Show the answer

    In chat-assisted coding, the model only produces text or code in a conversation; a human copies it in, runs it, and reports back what happened — the human closes every loop iteration. In agentic coding, the model is given tools (read/edit files, run commands, run tests) and closes the loop itself: it acts, observes the real result, and decides the next action, iterating without a human relaying each step.

  2. 02

    In the sense-think-act framing, what plays the role of "world state," and what plays the role of the "reward signal"?

    Show the answer

    World state = the repo's actual current contents plus real command output (compiler messages, test results). Reward signal = the test suite, build, or linter — whatever tells the agent (and you) whether an action actually worked, versus merely looking plausible.

  3. 03

    Why does a vague prompt reliably produce worse results than a scoped spec?

    Show the answer

    A vague prompt leaves the agent to guess your goal, constraints, and definition of success — and it guesses confidently rather than asking, so it optimizes for a plausible interpretation, not necessarily yours. A scoped spec removes the guessing, which is the single highest-leverage thing you control.

  4. 04

    What makes a confidently-wrong agent answer more dangerous than an ordinary compiler error?

    Show the answer

    A compiler error tells you something is wrong. A confidently-wrong agent answer is fluent and structurally indistinguishable from a correct one — it carries no signal of its own uncertainty, so catching it depends entirely on your independent verification.

  5. 05

    What is "test-first agentic," and why does it change what the agent can get away with?

    Show the answer

    Writing (or fully specifying) the test before the agent writes the implementation. It matters because the agent now has to satisfy a check you defined and can't quietly redefine, instead of you having to eyeball whether the output "looks right" after the fact.

  6. 06

    In the "break your own context" exercise, why did the agent generate code against a stale assumption even though you had already changed the relevant file?

    Show the answer

    Because the agent's working knowledge is limited to what's actually in its current context or session. A change you made in reality isn't automatically visible to it. You have to put it in front of the model again, explicitly.

  7. 07

    What's the difference between "using an agent" and "building an agent"?

    Show the answer

    Using one means working inside a loop someone else designed. Building one means defining the tool contract (exactly what it can perceive and touch), writing the loop that calls the model and executes its tool calls, and setting the guardrails yourself — you own the action space and the stop conditions, not just the prompt.

  8. 08

    Name two reasons agentic coding tools are measurably weaker on a Vulkan, embedded, or real-time codebase than on a typical web app.

    Show the answer

    Any two of: training data is dominated by web and app code, so low-level and unusual-shape code is underrepresented; correctness often depends on constraints invisible from source text alone (GPU synchronization timing, memory layout, hardware behavior); feedback signals are weaker or slower — a race condition or a GPU validation issue may not surface in a quick test run the way a unit test failure does.

  9. 09

    Give the weak version and the strong version of an answer to "how do you use AI in your work?"

    Show the answer

    Weak: "I use it to write code." Strong: names the actual process — where you use it (mechanical, decomposable work), what you verify and how (test-first, independent checks, a documented history of catching it wrong on your own code), and a concrete artifact that proves judgment rather than just usage.

  10. 10

    Why is senior judgment still the binding constraint even once the tooling is excellent?

    Show the answer

    The loop can execute and iterate, but it can't yet reliably decide what's worth building, which tradeoff is right for a specific system, or whether a passing test suite actually proves correctness in a domain where some failures don't reliably show up in tests. That decision-making is the actual senior skill, and it's what 30 days of verification practice is training in you.

0 / 10

0 of 10 graded

Grade all ten to see the read.

Answer each one from memory first, then open the real answer and grade yourself against it. Guessing generously here only costs you later, in a room where someone else is doing the grading.