Skip to content
Live

Picton Mahoney's team signed in to an engine built for it alone 17 days after its first commit

A discovery engine in its own repository and a review queue in the firm's portal, written for one asset manager, and two faults we found by using it.

Client
Picton Mahoney
Sector
Asset management, employee-owned asset manager
System
Intelligence engine, Custom agents, Reporting
Live since
Aug 2026
Last measured
20 Aug 2026
Every commit on the engine written for Picton Mahoney, as a strip of marks over its first two months: a burst on the second day, the first sign-in from the firm 17 days after the first commit, and the first milestone live about six weeks in.

Every commit on the engine, replayed across its first sixty days, with the day the firm first signed in. Times only: no code, no messages.

  1. The work existed. It was a person, a browser, and a spreadsheet.

    Sourcing was done by hand, one firm at a time, and the judgement that mattered was buried under the hours of looking that came before it.

  2. Nothing recorded why a firm was passed over, so the same firm got looked at again.

The judgement was the job. The looking was the cost.

Picton Mahoney is an employee-owned asset manager. The work in question is the kind that every firm like it does and almost none of it enjoys: find the organisations worth a conversation, work out which ones are actually worth a conversation, and then have the conversation.

The first two of those are not judgement. They are hours. Someone opens a browser, reads, decides, writes a row in a spreadsheet, and does it again. The judgement that the firm is actually paying for arrives at the end, after the part that anyone could do.

And because the looking lived in a browser and a spreadsheet, the deciding did not survive. A firm that had been considered and passed over in March looked exactly like a firm nobody had ever opened, in June.

An engine in its own repository, and a place to argue with it

Two things, in two repositories, for two different reasons.

The engine is not a fork of our platform. It has its own repository and its own release history, because what it does is specific to one firm and grafting it into a product every other client rides would have been the wrong shape. It runs discovery, enrichment and scoring as one pipeline, and it writes what it finds somewhere a person can look at it.

The portal is a fork of the platform, and the routes written into it exist in no other client's copy and not in the platform itself. We know which, because we diffed this repository against the platform and against every other client rather than guessing.

They are almost all one idea: a queue, and everything a person needs to make a decision in it and have that decision stick. Pending, approved, rejected, and needs more information. A score with the reasoning behind it, so the number can be argued with rather than obeyed. Sort and filter, because a queue you cannot re-order is a list. Decisions in bulk, because reviewing a thousand things one at a time is not review, it is data entry. And an export, so an approved row leaves the portal and arrives in the system the team already works in.

The engine proposes. A person disposes.

Nothing the engine finds is treated as a conclusion. A run produces candidates and a score, and the score carries its reasoning, and both of those sit in a queue until a human being agrees or does not.

That ordering is deliberate and it is the whole design. An engine that decided would be wrong in ways nobody could see. An engine that proposes is wrong in ways that show up in a review queue, get rejected with a note, and change what the next run does.

We also took things out. The platform ships a new-user setup flow, a welcome modal and a product tour, all of which are useful for a company meeting the product for the first time and none of which belong in front of a team who were handed a tool and told to use it. They were suppressed in three separate layers. The education section came out of the navigation entirely. The workflows page leads with the engine rather than with a generic example.

The build, and the part that has not worked yet

111
commits on an engine repository that forks nothing

One hundred and eleven commits on an engine repository that is not a fork of anything. Thirty-one pull requests merged into the portal. A ten-page branded guide and a help centre inside the product. Seventeen days from the engine's first commit to the first sign-in from the firm, and about six weeks to its first milestone going live.

And one of five invited people signed in during the 30 days to 20 August.

We are printing that second number next to the first ones because leaving it out would make this page a lie of omission. Every deliverable was accepted. The engine runs. The people it was built for are not using it. That is a delivery failure and it is ours, not theirs, and the fix for it is not more code.

If you want the version of this story with a measured outcome at the end of it, read the knowledge brain case: eight of ten people used that one in its first month. If you want to know how we would approach a build like this one, the audit emails a plan inside five minutes, with the arithmetic attached.

What we measured

111commits on an engine repository that forks nothingBuild artefactby Advizr, Aug 2026
31pull requests merged into the portalBuild artefactby Advizr, Aug 2026
1 of 5invited people signed in, 30 days to 20 August 2026System loggedby Advizr, 20 Aug 2026
How this was measured

Four of the five accepted their invitations in July. Adoption is our job, and this number is our problem.

What broke, and how we know it is fixed

The default tab crashed once the queue filled up.

Why
The query asked for its rows by listing every identifier in the URL. Below a few hundred rows that is ugly and works. Past that it overran the URL length limit and the request never arrived. The smaller tabs rendered perfectly the whole time, which is why it read as intermittent rather than as a ceiling.
The fix
The read is chunked, so the queue is paged rather than demanded in one breath.
How we know
The tab that had been failing rendered its full contents. The underlying cap is documented in the pull request that fixed it, because the next person to write a large read needs to know the ceiling exists.

Every page of the help centre crashed in the browser, and every check we had said it was fine.

Why
One date in a document's frontmatter was written without quotes, so it parsed as a date object rather than a string and was rendered directly. That throws during hydration, in the browser, after the server has already sent correct HTML.
The fix
The value is quoted, and the renderer coerces rather than trusting the parse.
How we know
Opened in a real browser rather than fetched. That is the point of the failure: a raw fetch of the same URL returned a clean 200 and a correct page the whole time it was broken for every human being.

What we did not measure

We did not measure what the engine is worth to the firm. What it is pointed at, how it decides and what it has found are the client's to state and not ours, so the only numbers here are the ones about the thing we built. The honest gap is adoption: the engine runs, and the people invited to it are not using it yet.

Built by

  • Andy ChenEngineer of record

What we would do again

  • If a surface will hold thousands of rows, write the read that way on the first day. A query that lists every identifier in the URL works beautifully in testing and fails silently at the exact moment the product becomes useful.
  • A fetch is not a browser. A page can return 200 with correct HTML and still be broken for every human who opens it, because hydration runs somewhere your check does not.
  • Shipping is not adoption. We delivered a working engine and then watched four of five invited people stop signing in after July, which is a delivery failure even when every deliverable was accepted.

More stories

Every story

Run your whole company on AI.

Tell us how your business runs. If we're not the right fit, we'll say so on the call.

Your custom strategy and systems, delivered in under a month. Your named people using them every week by day 30. Or we keep working for free until both are true.

The page ends on a hand drawn chart of the sky that draws itself as it comes into view, with a small sail ship crossing its open sky from a far star to a beacon and a small planet.

© 2026 Advizr AI Inc. · Vancouver, BC, Canada

Delivered in under a month. Used by your named people every week by day 30. Or we work free until both are true.