ADIT: a mock enterprise app for testing AI agents
I have worked on enterprise software for about 10 years, lately on AI innovation and new products, and I wanted to try some things with AI agents on a big, dense enterprise application. It had to be one I could publish and hand to anyone, so I made one up.
ADIT is an exploration management system for a mining company called Kestrel Range Resources, sold by a vendor called Brannock Geosystems. None of them exist. It has 14 projects across 5 commodities (gold, lithium, potash, copper and nickel), 7 users with different jobs, 9 sections along the top and about 60 screens.
It does not matter that it is about mining. If you have used the software at any large company you will recognize all of it: a home page with a list of things that need attention, records with tabs and a comments box where you can @-mention a colleague, approval requests that move from one person's inbox to the next with a due date on each step, notifications, an admin section full of settings, and an audit log of who did what. There is even a user manual from the vendor, 13 sections long, which opens in a new tab and explains what each page shows and how the common jobs are done.
Try it below. The account menu at the top right switches between the 7 users (that stands in for signing in). Open Approvals, approve or return something, then switch to the person who raised it and look at their notifications. Nothing you do is saved anywhere except your own browser, and Admin has a button to reset the whole tenant.
All of the data is invented in the browser when the page loads, from a fixed random seed: 273 drillholes, 113 lab batches, about 19,700 samples, 44 approval requests, and the comments, notifications and audit trail that go with them. There is no server. Nothing has to be right, it only has to hold together when you click through it.
.example address.How I made it
An AI agent built ADIT from a single prompt, overnight. My requirements were as follows:
- A specialized application built for experts, dense with data and not self-explanatory, that a non-expert would find believable. Convincing a geologist was not the goal.
- Multiple users with different roles, notifications, and places on each record to comment and enter information.
- Workflows with approvals, and stage outcomes at the end of each stage: closed, or on to the next one.
- The planning stages of a project, and the logistics of getting a team into the field and assigning work to it.
- Domain entities for the types of exploration and the material found, across five different commodities.
- Forecasts of how much there is and what it is worth, with analytics, dashboards, budgets and an optimization interface.
- An admin panel with system settings, and user settings for each account.
- A vendor's user manual that opens in a new tab, looks different from the application, and describes each page and how the important jobs are done.
- The ARIA labels and DOM of a real application, no AI assistant, and nothing in the app about why it exists.
The vendor, the tenant, the projects, the record ids and the text of the manual were the agent's to invent.
I built the design system with impeccable, a set of skills and tools for agents doing front-end design. I prompted for the system and made the design choices, and impeccable was the tool that turned them into something coherent.
The code is at github.com/alejandroerickson/mockent.
The ADIT optimizer
Most of ADIT is records and workflows, but the optimizer page does a computation: it picks which of 14 candidate drill targets to fund next season. Here is a copy of it. Move the budget and the rig days and it tells you how many targets get funded. Filled dots are funded; hollow ones did not fit.
- expected value, USD
- targets funded
- Gold
- Lithium
- Potash
- Copper
- Nickel
- not funded
Funded:
Neither this copy nor the page in ADIT is a real way to plan a drilling season, and the page in ADIT says so under its own numbers. It only has to look like it knows what it is doing.
Enter the AI
I wrote every one of the 99 posts before this one by hand. The last of them went up in February 2022, about nine months before ChatGPT came out. Three of them mark periods of my life, so here they are before I get to the point.
During my PhD in Victoria I got hooked on Hexastix, sculptures of interlocked sticks, and in 2011 I wrote up how to make one.
As a postdoc in Durham I taught myself to paint so that I could paint the Petersen graph, and it took about 40 practice paintings to get to the final five.
In 2016, while preparing for job interviews, I solved a practice question in 10 minutes and then spent two days implementing and benchmarking 9 sorting algorithms.
Today an AI would do most of those two days of work. In coding and in writing, execution isn't the bottleneck any more. The hard part is deciding what to build. So what makes a blog post interesting to me now is the idea behind it, not the effort that went into writing it.
I expect the posts here to lean that way: an idea, built and written up with AI's help.
Decommissioning Geoburst.ca
From around 2010 to 2013 I ran a small volunteer organization called Geoburst. Geoburst.ca continued to function for a long time afterward and now it’s time to take it down. Find Geoburst’s “About” page below.
Geoburst.ca's Banner
About Geoburst
The problem with mathematics
Dozens of books have been written about math education, and not in error, but GeoBurst’s philosophy can be summarized in a single sentence. We must teach that mathematics has intrinsic value, for being beautiful, fun, surprising, and expansive.
When kids practice their multiplication tables, we think of this as a pianist practicing scales. When the pianist is ready, however, he or she plays beautiful music. That is why we help kids take a break from their multiplication tables, to remind them of what beautiful mathematics they are preparing for.
GeoBurst’s Mission
GeoBurst mission is to Create Zest for Mathematics. By sharing our love for this subject, we hope to spread an enthusiasm for mathematics that will shine a positive light on a challenging subject for all of us.
By seeding positive early experiences with mathematics, GeoBurst’s activities can soothe the tension that some students feel about mathematics, encourage kids to pursue science and engineering, and ultimately increase the amount of beautiful mathematics that Canadians do.
GeoBurst’s Vision
We want every school in British Columbia to be equipped with a clearly labelled treasure chest of fun mathematical activities, and every student to experience at least two special presentations on mathematics by the time they finish grade 7. In the interest of creating equal opportunities, we are donor funded, and provide our services free of charge whenever possible.
GeoBurst
Math Catcher
Mathematics through aboriginal story telling
We work closely with Math Catcher through consulting and the integration of our interactive shows into their program. This partnership benefits our programs mutually, and has helped GeoBurst develop its mission and activities by providing a raison-d’être and an audience at an early stage in our development.
GeoBurst is proud to work closely with award winning math professor, Dr. Veselin Jungic, and First Nations role models to bring a much needed enhancement to mathematics education for remotely located and urban Aboriginal students. GeoBurst is an integral part of their school visiting program, and Math Catcher’s influence and contributions continue to be indispensable to the formation of our values, and the operation of our program.
Newport 30 mkii Mast Base Organizer Plate
My main sheet and vang used to connect to a simple eye near the base of the mast until one day the threads gave way and it popped out.
Broken Main Sheet and Vang Eye
Whether it was my fault or not I don’t know, since I didn’t see it happen, but now that I have to fix it I’d like to make it and the halyard organizer more robust, by replacing them both with a mast-base organizer plate. I envision something like the plate pictured below, but without the hinge.
Halyard organizer plate (hinged)
From the picture of my own mast base, it looks like I already have some sort of aluminum casting at the foot of my mast, so if I unstep the mast and successfully remove the casting, I should be able to slip a plate underneath it… Let’s hope I can get it off!
I’ll update this post as the project moves forward.
Polishing Fuel with the Water Separator
There is a place in English Bay, near Vancouver, called Point Atkinson, which is notorious for causing engine troubles. The guy from C-Tow joked that it was something of a local Bermuda triangle. He said that to me after towing me to my slip at Lynnwood for around $400 CAD and added, “One time at Point Atkinson I changed my own fuel filter 3 times.”
The Saltire in False Creek.
My engine had failed there too, shortly before getting towed, while I was sailing single-handedly. After thinking about what the tow-dude said I read up on cleaning and maintaining fuel and decided to not only change the fuel filters, but to also polish the fuel using the existing water separator.
I disconnected the Racor 215 series water separator from The Saltire’s fuel lines and screwed in 5/16th hose diameter connectors. I connected the intake to a fuel-line hose and a matching metal tube made of automotive brake-line for vacuuming inside the tank. I connected the exit to a Mr Gasket 12V diesel fuel pump, purchased for $60 CAD at an automotive parts supplier; I have supplied a link to it but any such pump will do the job. Part of the time I had a prefilter before the water separator but eventually it clogged up and I removed it.
Existing primary filter setup.
Fuel gauge float port.
Initially I tried to polish using the existing Racor R15T 10 micron filter, but it was so clogged with gunk that no fuel would pump through. That pretty much explains the issue I had on the water, and I will be carrying a spare Racor from now on!
Pumping about 110L of fuel out into jerry cans and back into the tank took about 4 hours. The pump is rated to move it faster than that, but various things slowed me down.
Rusty fuel filter.
Dirty fuel filter.
I separated about 600mL (over a pint!) of water from the fuel, and the tank looked pretty clean on the inside afterwards.
600ml water from fuel.
A quick tour of my fuel polishing system