Seven years,
as a trace

Machine learning in Kathmandu, document extraction in Canberra, data platforms in Sydney, and an AI team in Wollongong. Laid out the way the systems I build are instrumented — because the two things a résumé cannot show are what ran at the same time, and why anything was decided the way it was.

Every entry opens on the decision, not the task. 15 of 19 are verified against the code, the pull requests and the configuration; the rest say plainly that they are not.

What I actually believe about building this

A system that cannot say “I don’t know” is worse than no system

Fail loudly on an unmapped field instead of coercing it into something that matches. Refuse a total that cannot honestly be computed, and give the reason. Say why the report will not open rather than rendering nothing. One wrong number destroys trust permanently; a refusal costs almost nothing.

Fail closed to the known-good path, not to “off”

For an ordinary feature gate, a failed read means the new thing stays hidden. On a migration it has to mean traffic stays on the path that has been working for months. The new stack is never the fallback.

Ship the switch before the thing it switches

The riskiest part of replacing a live system is rarely the new code — it is the plumbing that decides who gets it. That plumbing can be proven in production while it is still structurally incapable of changing an answer.

Measure before you design, and let the measurement win

Three tickets in two months were reversed by their own baselines: a sampling rate that would have saved nothing, a database already pegged at its ceiling rather than approaching it, and a queue that was never the constraint. A ticket is a hypothesis.

Engineer against silent failure specifically

Four of seven touchpoints failed silently. An undeclared column lands in storage and stays invisible to the query engine. A moved subnet shows up as a bill rather than an error. A retry loop logged success on a call that had never once succeeded.

Write down why, including what you got wrong

Premises corrected rather than quietly carried forward. Deviations from acceptance criteria argued rather than hidden. One criterion declared unmeetable rather than faked, with a note so nobody later mistakes the test for something it is not.

The trace

2019
2020
2021
2022
2023
2024
2025
2026
  1. Machine learning
    Feb 19zoomed to Fusemachines Nepal · 4 projectsAug 22
  2. Software
    June 22zoomed to WebTec Solutions · 1 projectJan 23
  3. Data
    Nov 22zoomed to CloudShuttle · 2 projectsSept 25
  4. AI engineering
    July 25zoomed to Accelo · 9 projectsOct 26
  5. Study

    Master of Computer Science — Machine Learning and Big Data · Graded 80%

  6. Software
    Feb 26zoomed to Opal Cabs · 3 projectsOct 26

Bars are drawn to real dates, so the overlaps are the point — the master’s and the side project both ran alongside full-time work. Opening a role zooms its projects onto that role’s own dates, because on a seven-year axis a three-week project is invisible.

Wollongong, NSW · Senior AI/ML Engineer → promoted to Tech Lead, AI Team

Accelo

Joined on the platform side — getting models out of notebooks and onto ECS, and standing up change-data-capture into ClickHouse. Moved onto the Forecast product's AI team in early 2026 and went from shipping a chat agent, to owning the platform underneath every agent, to leading it. The arc in one line: make one model serve, make one agent work, make the agent platform trustworthy, make it safe to sell.

  • Tech Lead for the AI team, owning end-to-end delivery of production AI products
  • Replaced three hand-wired agents with a declarative harness — an agent is now one markdown file — and rolled it out per-company behind a fail-closed switch with nothing on the other side
  • Built the observability platform: self-hosted Langfuse on ECS over PrivateLink to ClickHouse Cloud, with salted tenant masking gating every vendor-bound trace
  • Shipped the commercial gate — entitlement, a transactional credit ledger, and a budget check that fails open on purpose
  • Reversed three tickets with measurement: trace sampling, Aurora capacity, and the Langfuse worker's real constraint

Select a project on the trace above for the full detail.