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 Superseded
Replaced on the homepage by the August 1 – September 7 cycle — kept here in full.
*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.
September 24 – October 8, 2026 Current
Still live on the homepage today — logged here too, so it's covered the moment the next cycle replaces it.
Featured build
Connecting an AI agent to our MCP server used to mean a personal API token, a Node.js bridge and a hand-edited config file. Teams without a developer could not finish that, and the token opened the whole API, not just the agent tools.
Users see and revoke connected agents in their settings. Two of the six OAuth steps are merged; the rest are in review, behind one switch.
Read the full writeup →Featured build
An inventory of the API's endpoints looked at every operation the interface uses, not just the ones that looked risky. Every permission gap it found was first proved with a failing test, then fixed.
The permission tests run to about 700 lines, and every test seeds its own data, so none of these gaps can quietly come back.
A review of what reaches central logging, and what reaches AI chat transcripts, found places where credentials could end up. The logger now masks credentials in messages and exceptions before writing them. The repository's AI agent commands for releases, KPIs and reviews no longer ask anyone to paste a token into the chat: they read secrets from files created outside the agent, refuse files other users can read, and never print the value.
September 8 – 23, 2026 Superseded
Replaced on the homepage by the September 24 – October 8 cycle — kept here in full.
*Mostly the merged test-suite rewrite and a regenerated database baseline. About 46k lines are outside tests, fixtures and schema.
Featured build
A customer reported single sign-on failing at random. Two reasonable theories were checked and ruled out first: a misconfigured identity provider, then a token-refresh race. The real causes were elsewhere.
Every fix was mutation-tested: remove the guard and a test fails. What no test proves is listed as a known limit, not claimed.
Featured build
Last cycle this was an open pull request touching two thousand files. It merged on September 21: over sixteen thousand tests on five parallel workers, each with its own database, in about seventy seconds.
Review raised 26 items: 17 fixed, 6 did not survive checking, 3 folded in on request.
Read the full writeup →Configuration is moving out of runtime code and into the deployment environment, so every container behaves the same way. Runtime ini_set() calls are gone, but not blindly: removing one would have turned a three-record CSV into one garbled row, so line-ending handling got its own utility first. A settings class now reads each value from the environment, then the config file, then a default, without changing over 500 call sites. PATH lookups for system binaries became configured paths that fail loudly; one of them had let an upgrade skip a SQL file and still report success. The command-line tool is moving to Symfony Console, with its "did you mean" prompt switched off on purpose: it could turn a typo into a database reset. The first part has merged; the rest is in review.
August 1 – September 7, 2026 Superseded
Replaced on the homepage by the September 8 – 23 cycle — kept here in full.
*Dominated by the continuing test-suite rewrite — hand-authored business logic is a smaller slice of that total.
Featured build
What started as three phases across roughly two dozen modules kept growing. The branch now touches over two thousand files and runs sixteen thousand tests clean — and it's still an open pull request, not a merged one, because a change that size touching every test file earns a slow review, not a fast one.
instanceof against a class name that didn't exist — which PHP quietly evaluates as false. Fixing the typo immediately surfaced 29 files leaking fixture data into whatever test ran next.Mainline still runs the old suite while the branch waits on review — which is the point being made in the writeup: something this size doesn't get to skip review just because its own numbers look good.
Read the full writeup →Featured build
A Playwright end-to-end suite went live in CI this window. The interesting part wasn't adding it — it was that both of its early intermittent failures turned out to be real frontend bugs, not test flakiness.
Both root-caused and fixed at the source, not papered over with a retry.
Read the full writeup →A required static-analysis check had been failing on every mainline run — and blocking every open PR behind it — because the hosted scanner dropped support for the Java version it was bundled with. Traced and bumped to a supported runtime rather than just silencing the check. Separately, a pass to clean up log noise turned up a real bug along the way: two API models wired to the wrong entity meant a bank-accounts read silently returned empty and writes were silently dropped — found by chasing noise, not by looking for it, and covered with new tests.
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.