khursani.dev · semak

My AI twin killed my Chrome three days straight

Six small failures, one silent transit board, and what it took to make an autonomous pipeline honest about its own dead spots.

2026-10-19 · all posts

The setup

semak.khursani.dev tracks transit disruptions for Klang Valley riders. The reports come from two places: Rapid KL's official Facebook posts, and rider posts on Threads. A post like "LRT kelana jaya dah berhenti" should appear on the board within minutes of being posted.

There is no API for this. Prasarana publishes no realtime rail feed - the government's open data portal carries bus positions only. So the pipeline reads Threads the way a person does: with a real browser, driven by my AI twin.

The twin is a Claude Code agent. It runs the scraper, the review gates, the board, the deploys - on a shared server with no screen.

The week my Chrome died three times

Earlier this month the transit board went quiet. Not quiet as in calm - quiet as in empty. Riders were posting packed LRT platforms on Threads and the board showed nothing. The scraper logged zero captured posts, every check reported green, and nobody - not me, not the twin - flagged it for a day and a half.

When I finally dug in, the failures stacked up like this:

None of these logged an error. Every one of them looked like a quiet day.

The fixes

Each failure got a specific repair, verified against the live system:

After the last fix, the board captured 46 posts in a single pass, kept the real reports, and rendered them within minutes. The browser survived the pass. That sentence took three days to become true.

What still cannot be fixed

The official rail feed does not exist. Prasarana publishes bus positions through the national open data portal and nothing for rail - no service alerts, no vehicle positions, no API. Human reports plus official Facebook posts are the state of the art for Malaysian rail disruption data, and they will stay that way until an operator decides riders deserve a feed.

The point of a twin is not that it never breaks. It is that every break has a cause, every cause is findable, and every fix is a small honest change that ships with its evidence. The board went quiet because six small things were wrong at once. They were all findable. They are all fixed now, and each one has a monitor watching for its return.