My work is technical discovery — going into environments nobody has properly documented, working out what actually constrains the business, and designing against what the data shows rather than what everyone assumes. These two projects are the same habit turned on my own work.
What follows is the reasoning as much as the architecture: what was built, what was deliberately left alone, and where each system is still weak.
01
Partner Qualification Workflow
The problem
Partner onboarding runs from signed agreement to first joint customer conversation, across eight steps. Onboarding consistently took longer than anyone expected, so I mapped the steps to find out where the time was actually going.
The answer was structural rather than anyone being slow. Everything early is fast — a kickoff and a discovery call take about a week. Everything after depends on a single artefact: account mapping needs a target account profile, field enablement needs positioning, and both come out of the enablement pack. That pack was written from a blank page for every partner. Two to three weeks of work each time, for a document that is roughly the same shape.
Why this step, not the obvious one
Account mapping is the more tempting problem. It is two lists and a matching algorithm — a satisfying thing to build. But it is not the constraint, so automating it would not have moved the date by a single day. The unglamorous drafting step is what everything else queues behind. That is the one worth building for.
How it works
Ready
Partner record written to Notion with the full pack, plus a milestone task scaffold.
Needs review
A record naming exactly what is missing — no polished draft resting on gaps.
The four gates
Each is binary, and judged only on evidence actually present in the inputs — absence of evidence means not passed. They are independent of the section scores, so a partnership can have excellent positioning and still fail every one.
Design principle
The system does not produce a confident-looking pack when the evidence is not there. Where the gates are not met it writes a review record naming precisely what is missing, rather than a polished draft resting on gaps.
+Design decisions
Gate-based routing rather than a score threshold. The first version routed on an averaged score. Averaging hides blockers — a partnership with a strong narrative and no support model is not 70% ready, it is not ready. Binary gates surface that; a weighted average buries it.
Section independence. Early runs scored everything 30–35 regardless of input quality, because commercial gaps were bleeding into every other section. One instruction — judge each section only on its own content, do not reduce one because another is thin — moved the value proposition score from 35 to 68 on identical input. The scores had been measuring the same weakness four times over.
Calibration by stage. A just-signed partnership is expected to have no pricing or support model; penalising it for that produces a score that says nothing. At just signed those gaps are recorded as open questions without reducing any score. At activated, the same gaps cut deeply. A score has to mean something different at each stage, or it means nothing at any of them.
Weighting. Value proposition and positioning carry 35% each, target profile 20%, commercial readiness 10% — because commercial readiness is already assessed separately and far more strictly by the gates. Someone can hold a useful customer conversation without a signed pricing model. They cannot hold one without positioning.
What stays human. The judgement. The workflow moves the starting line from a blank page to a reviewable draft in about an hour. It does not move the finish line — a person still reviews it, corrects it, and owns the output.
+Validation, and an unplanned result
Tested against a real partnership, entered with genuine background material, it scored strongly on positioning and technical validation and failed the commercial and support gates — routing to review with a list of gaps to chase. That matched the judgement actually made on that partnership at the time, which was the result worth having: it reproduces a human call rather than producing a generic checklist.
The more interesting result was unplanned. The structured form said one thing about how the deal was routed to market; the background material said the partner's own team wanted something different. It flagged the contradiction as a launch blocker and generated a task to resolve it. Those two routes carry completely different economics, so it genuinely mattered — and nothing in the prompt asked it to look for disagreements between sources.
An accident you can reproduce on purpose is a feature. Making contradiction detection explicit — its own field, its own instruction, its own test — is near the top of the list below.
+Known limitations and next steps
Stated plainly, because the limitations are as informative as the design.
- It creates duplicates. Every run makes a new record, so the database becomes untrustworthy within a week. Since re-running a partner as the gaps close and watching the score move is the entire point of the tool, this is the first thing to fix — upsert on partner name, with a score history.
- One model call is doing too much. Extraction, synthesis and self-assessment in a single call degrades quietly. Splitting it — one call to structure only what is actually stated, a second that sees only those structured facts — makes groundedness measurable, because every claim can then be traced to a source.
- A failed enrichment fetch poisons the run silently. An empty string reads to the model as "no evidence found" rather than "we could not look." It needs to fail loudly.
- Accuracy is not measured. The honest gap. A set of synthetic test partnerships with known verdicts is in development, to measure gate accuracy properly — including a starvation test: take a case that passes a gate, delete the evidence for it, and assert the gate flips. If it does not, the system is pattern-matching on companies that sound impressive rather than assessing evidence.
There is a reframe worth noting. The enablement pack is a first draft someone will rewrite anyway. The genuinely valuable output is the open questions and the gate assessment — give me a partner and I will tell you what you do not know yet, and what to ask them. Plenty of things draft documents. Almost nothing tells you where a partnership is thin.
02
Across the Stack — Research Pipeline
The problem
I write about enterprise technology, which means keeping up with far more sources than anyone can read. The bottleneck was never finding material — it was deciding what mattered, consistently, without giving a morning to it. Most filtering tools sort by popularity or recency. Neither is a proxy for significance.
The lens it judges against
So the interesting part is not the pipeline, it is the framework. That came first; the software exists to apply it at volume. Every item is read against five questions.
Underneath sit thirteen named structural forces. An item that cannot be placed against one of them usually is not significant; it is just news. That single test does most of the filtering work.
How it works
Signal library
Structured in Notion, filterable by force or industry — an editorial database that builds over time.
Morning digest
Emailed summary of what was kept, and why it was kept.
A companion web app runs the same classification on demand, for anything encountered during the day that the scheduled run would not have caught.
Operating record
The pipeline has run daily since deployment, with alerting on failure. The substantive engineering was not in getting it working, but in tuning the classification against live output until what it retained matched what would have been selected manually.
+Design decisions
Discard rather than store-and-sort. The obvious design keeps everything and ranks it. But a library you have to filter every time is the original problem with extra steps. Low-relevance items are dropped at ingest and never written. The value is in what is not there.
Batched classification. Items are assessed together in a bounded batch rather than one call each — materially cheaper, and it lets relative significance be judged across the set rather than in isolation.
Open vocabularies. Forces and industries create new values when something genuinely does not fit, rather than being forced into the nearest match. A closed taxonomy would quietly mislabel exactly the novel things worth noticing.
Structured output, not prose. Classification returns typed fields, which is what makes the library filterable later. A summary paragraph would have been easier and useless.
Cost. It runs for a few pounds a month. Worth stating, because the binding constraint on tools like this is rarely capability — it is whether the running cost stays below the value of the thing.
+Known limitations
- Relevance drifts. The classification reflects a point-in-time view of what mattered. Without periodic recalibration it slowly stops matching what would be kept now — currently checked by hand, which does not scale and is not measurement.
- No feedback loop. Nothing captures which stored items were later used and which were ignored. That signal is sitting there unused, and it is the obvious basis for tuning relevance properly rather than by intuition.
- Static source list. It does not notice when a source stops being useful, or when something worth following appears.