Full history
The homepage only shows the latest cycle. This page is the complete record — every cycle logged here permanently the moment it's replaced on the homepage, so nothing that shipped ever just disappears.
Agentic Engineering Archive
The homepage's "Agentic Engineering" section only stays up while it has 2-3 strong entries. When it drops below that, entries move here rather than disappearing.
Featured build
Built an AI agent, plus two purpose-built subagents, that helps colleagues with day-to-day company-tool problems — first searching an internal knowledge base and the web for an existing answer, then escalating by name to the actual person responsible if that doesn't resolve it. Orchestrated entirely on the company's internal agent-orchestration platform; the underlying tools and integrations are the platform's, the orchestration design and instruction text are what I built.
The interesting failure mode wasn't the AI reasoning — it was a nested subagent needing to ask a human for permission mid-task with no human actually present in that call. That shaped which actions live on the main, human-facing agent versus a subagent, more than any prompt-engineering choice did.
July 10 – July 31, 2026 Current
Still live on the homepage today — logged here too, so it's covered the moment the next cycle replaces it.
*Dominated by a large, mostly-mechanical test-suite migration — hand-authored business logic is a smaller slice of that total.
Featured build
Last cycle's migration got every module speaking one test format. This phase went after what that migration didn't fix on its own: parts of the suite were still partially skipped and non-blocking in CI, quietly hiding bugs of their own — 230 commits over three weeks turned that into a required, fully green gate.
The migration itself moved the format; this phase is what made the result something you can actually rely on — a suite that fails loudly instead of one that quietly stops meaning anything.
Featured build
An enterprise client running SAP alongside TEAMBOX needed the same alphanumeric client codes in both systems — a change that touches nearly everything client-numbering ever touches: two frontend stacks, a decades-old payment-reference format, and the assumption, baked in for years, that a client ID is just a number.
Still in progress, behind a feature flag, with a permanent end-to-end test suite added alongside it — the kind of change where "ship it behind a flag and watch closely" is the responsible call, not a hedge.
Featured build
Making a proper schema-migration tool the only way schema changes happen — no more parallel legacy upgrade paths — turned up problems the old tooling had been quietly getting away with for years.
None of these bugs were the point of the migration — they were what the migration had to survive finding, on its way to becoming the one real path for schema changes.
A cluster of independent CI failures, each traced and fixed the day it appeared: a build step referencing a branch just deleted in an unrelated merge, a test-cleanup step failing on a database column with no default value, a code-scanner dropping support for the Java version it depended on, and warning noise dense enough to bury real test failures. None of these block a feature on their own — but left unfixed, any one of them blocks every open PR.
Enabling a new AI-integration module setting crashed the personal-settings screen blank for every affected client — a loader gap, fixed with a small patch and a regression test. A second report — an integration endpoint returning a server error for another client — turned out to be a missing config section in a legacy template, not an API logic bug: a one-line fix once actually found.
Continued moving installation settings out of hardcoded environment config: timezone, country, and language are now per-installation database values instead of static-file constants, with a migration script for existing installs and admin UI so they're actually editable going forward.
June 26 – July 17, 2026 Superseded
Replaced on the homepage by the July 10 – 31 cycle — kept here in full.
*Dominated by a large, mostly-mechanical test-suite rewrite — hand-authored business logic is a smaller slice of that total.
Featured build
Migrated the entire PHP test suite to Pest 3 across two dozen modules, collapsing a custom dual-runner setup — separate "live" and unit test classes, two bespoke base classes — into one unified test format. The line count went down once duplicate test variants were folded together, but nearly every module gave up at least one previously-invisible bug the moment its tests stopped running in isolation.
The rewrite itself is done across all two dozen modules. The bugs it surfaced weren't the point of the exercise — but they were the real payoff.
Featured build
Built and shipped, solo, a full replacement of a homegrown YAML-driven schema and upgrade system with Doctrine Migrations: hundreds of YAML schema files and legacy upgrade scripts, plus several schema classes, deleted outright — a net reduction of thousands of lines across hundreds of files, as one continuous piece of work. Along the way, found that the CLI framework's long-flag parsing had never actually worked anywhere in the codebase, silently falling back to defaults instead of erroring out — an untrimmed-whitespace bug that had gone unnoticed for years behind a short-flag fallback path, the kind any long-lived codebase accumulates.
Deleting a bespoke system wholesale and rebuilding it on Doctrine is what made this migration pipeline fundamentally different from what came before — the flag parsing, table-existence checks, and connection reuse are what made it safe to actually run against production.
Continued building out the Playwright e2e suite from the previous cycle: swapped the test environment's application server to match production exactly, fixed a content-security-policy mismatch, and added a fallback so the app doesn't hang if translation loading fails. Shipped a container permission fix, then reverted it the same day when it didn't hold up under real use — and the suite itself caught a genuine navigation race condition in the invoicing flow, now a tracked bug instead of an intermittent complaint.
A ticketing tool's built-in GitHub integration couldn't be configured and was flooding tickets with noise, so I replaced it with a small purpose-built automation that only comments on genuinely relevant events and keeps one clean status block per ticket. The first version needed a same-day rollback once real usage surfaced problems testing hadn't shown; the relanded version added failure-visibility — a notification if the sync itself breaks — and fixed the edge cases a review had flagged.
Rewrote evaluation feedback to be constructive rather than just critical, and confirmed a prior security finding was actually resolved. Added dependency review, automated security scanning, and bot-managed dependency updates to CI — improvements that stand on their own regardless of which way the vendor decision goes.
Removed a legacy CI build system — its Ant build, checkstyle tooling, and every stale build file that depended on it — thousands of lines removed for a handful added. Part of a coordinated release-process modernisation, done as a clean deletion rather than a slow deprecation nobody gets around to finishing.
A wide exception-handling change touching auth, transport, sync, and file storage across roughly 60 files finally merged — after an earlier all-at-once attempt was judged too risky and got reworked into a staged, module-by-module rollout instead. The design had already been written up as an architecture decision record; this cycle it shipped exactly as planned, deliberately rather than all at once.
Featured build
Most "AI wrote some code" stories stop at code review. This one runs unattended against production. Once a week, a Claude Code command connects to our log aggregator, pulls the highest-volume error patterns, and works through them like a careful on-call engineer would — not a script that just counts lines.
The hard part wasn't the log analysis — it was making it deterministic. The same command, run by a different AI session or a different teammate months from now, has to produce the identical dashboard from identical inputs. That meant writing out the exact fingerprint algorithm, the exact API quirks, and the exact layout rules as if onboarding a new engineer with zero context, because in practice, that's exactly what it is.
Featured build
Sprint retros used to run on gut feel and whichever ticket someone happened to remember. This is a Claude Code command that turns raw ticket history into a dashboard the team actually opens — not because it's flashy, but because two rounds of "that number's wrong" feedback got taken seriously and fixed instead of explained away.
Some of it was about restraint, not features: a stacked-bar chart got built, tested against real data, and then dropped because its rounded segments visually misrepresented small proportions. The donut chart stayed; the flashier option didn't make the cut.
June 18 – July 9, 2026 Superseded
The site's first published cycle — replaced on the homepage on July 17, 2026, preserved here in full.
Featured build
Most "AI wrote some code" stories stop at code review. This one runs unattended against production. Once a week, a Claude Code command connects to our log aggregator, pulls the highest-volume error patterns, and works through them like a careful on-call engineer would — not a script that just counts lines.
The hard part wasn't the log analysis — it was making it deterministic. The same command, run by a different AI session or a different teammate months from now, has to produce the identical dashboard from identical inputs. That meant writing out the exact fingerprint algorithm, the exact API quirks, and the exact layout rules as if onboarding a new engineer with zero context, because in practice, that's exactly what it is.
Featured build
Sprint retros used to run on gut feel and whichever ticket someone happened to remember. This is a Claude Code command that turns raw ticket history into a dashboard the team actually opens — not because it's flashy, but because two rounds of "that number's wrong" feedback got taken seriously and fixed instead of explained away.
Some of it was about restraint, not features: a stacked-bar chart got built, tested against real data, and then dropped because its rounded segments visually misrepresented small proportions. The donut chart stayed; the flashier option didn't make the cut.
Stood up our first real end-to-end suite against a legacy ExtJS/React hybrid frontend — and it caught a genuine race condition (a stale setTimeout navigating an unmounted modal) that intermittently left users staring at an invisible editor. Now it's a tracked bug instead of an occasional complaint.
Evaluated a third-party AI agent development platform against our actual CI and security requirements, not a sandbox demo — then wrote up a structured, specific feedback doc (missing ticketing-system adapter, a false-positive test gate, settings pollution) instead of a vague verdict. Picked up hardened CI along the way: dependency review, security scanning, an IAM fix — independent of what we decide about the platform.
Shipped a broad exception-handling audit across ~60 files, watched it get reverted the same day during a rebase (and take unrelated infra code down with it), tracked down and restored the collateral damage, and kept the design as an architecture decision record instead of forcing the merge. Sometimes the honest outcome is "documented, not yet landed."
Several enterprise clients lost document upload at once via an OCR integration. Root cause was two compounding issues — a missing config guard and a subtle typo in an API-token check — found and fixed same day, with structured error logging added so telemetry catches the next one before four separate client reports do.
Kept a multi-week Docker infrastructure migration merging cleanly into an active release branch — recurring conflict resolution, a CI pipeline fix, release prep. Small diffs, but this is the work that decides whether an infra migration ships quietly or breaks the release train.