experiment Number 2: coming soon!

Recent tech advances mean building digital products is easier than ever. And yet, the foundational challenge of picking meaningful and promising problems to solve remains. Here, I share my experiments with new product ideas. These experiments are deliberately NOT related to my ā€˜day job’ in the life sciences and are on personal interest topics. Rolling up the sleeves to directly build and experiment with product ideas is an increasingly important skill both professionally and personally. I’m delighted (and amused) to share the journey.


Warp & Weft: A Vintage Menswear Authentication Concept

Can curated reference data help an AI accurately date vintage menswear or just make it look like it should?

The Setting

As a sartorially inclined gentleman, I've long had an interest in vintage menswear. The fabrics and craftsmanship of bygone eras are truly fascinating to behold. As an ex-materials science product manager, I've long had an interest in the circular economy. Questions around material creation, their use, and recycling streams are phenomenally complicated to ponder.

These two domains, vintage menswear and the circular economy, directly collide at the humble charity shop.

Establishing provenance is critical for properly assessing vintage clothing value. However, dating and authenticating a garment is a seriously hard problem. A typical process goes like this: a Woolmark logo says "not before 1964," a care-symbol block says "not before the mid-70s," and a union label says "up to the 1990s." Since modern vision-language models are already shockingly good at this, I wanted to explore a deeper hypothesis. If I fed a model a curated table of datable marks and brand facts, does this measurably improve its dating, or is the model already good enough that the lookup is just theater?

Garment authentication is a huge market, but it's focused on luxury counterfeit detection. I wasn't interested in fake Louis Vuitton bags but rather "what is this, and when was it made?" for a cut-label chore coat with no brand to match against. This is the kind of question that underserved vintage menswear resellers face. Some apps treat dating as a byproduct of price with no scoring or abstention when evidence runs thin. A confidently wrong date is worse than an honest "I don't know." Dating and authentication as a first-class, properly-hedged claim, on exactly the pieces the luxury-reference models can't see, is where my experiment began.

Many "AI + your proprietary data" pitches assume that data earns its keep. I thus set off on a small, honest test of that assumption in the sphere of vintage menswear.

The Setup

I wandered charity shops in London looking for three specific vintage menswear areas: outerwear, tailoring, and workwear. I photographed the garments, their care tags, brand labels, and other identifying marks. I also browsed relevant eBay listings. With these photos, I created a gold set of authenticated garments by manually authenticating each piece. After 60 garments, I had enough to begin the technical analysis. Not all 60 fed into the scored runs. A frozen slice and holdout (see below) were a deliberately chosen subset, with the hardest, sparsest-evidence pieces parked.

I’m not a leather jacket guy but holy smokes this was a sexy jacket!

The experiment design was straightforward: one contender, measured against a baseline, on data the model couldn't peek at. The baseline dated each garment from photographs alone. The contender is the same model handed a curated and authenticated data set, a document of dating facts pulled in alongside the photos. Thus, any difference comes from that reference data, not the model. The primary metric was 'era correct to within a decade', scored as net garments flipped: pieces the reference data newly gets right, minus those it breaks.

Two sub-datasets kept me honest. I iterated on a frozen 25-garment slice, then scored the final run on a sealed 8-garment holdout I never tuned on, which was the real test of whether my changes generalised. The pass/fail bars were locked in advance on a kill/pivot/persevere gate, so a marginal result couldn't be counted as a win.

The one key design detail was having two independent evidence sources. Standardized marks (e.g., Woolmark, care symbols, union labels, registration numbers)  give hard date bounds. Brand-archives (e.g., label-art era, a concession details) give a soft point estimate. Because the two are independent, I could attribute per garment which cue did the work. That attribution turned out to be the whole story.

Screenshot from my manually curated Gold Set used as the authentication reference.

The Result

The first run was a +2 net, no regressions on the frozen slice marginal pass below my "keep investing" bar. Only one of the two "wins" was real. An Aquascutum piece the baseline had misdated was recovered by a genuine brand-archive fact, on a garment from before standardized marks existed. That's the experiment working as designed: the archive reaching where the marks can't. The second "win" was the model committing to a decade it had hedged on before. The model gave slightly different answers each run, so that's noise, not the reference data earning its keep. Discounted honestly, the real signal was +1: a single garment.

The marks were accurate but redundant. Six pieces resolved on a correctly-fired mark, and every one was already dated right by the model's eye. Not wrong, just superfluous. On a slice where the base model is near ceiling, structured lookup has almost no headroom to work in. That's the finding I didn't expect and value most.

Then came the sealed holdout. It regressed! It was one worse, and that broken piece is the sharpest result in the project.

It was a pair of Levi Strauss Signature jeans, a mass-market sub-brand that didn't launch until 2003. The baseline dated them correctly to the 2000s. But they carry an old "WPL" registration number, and my reference table treated that number as a bounded 1941–1959 window. The resolver handed the model that window, told it to commit, and the model, against its own stated judgment, output the 1950s. A fifty-year error! Reading its reasoning back, it had flagged the contradiction itself and been overridden anyway.

The cause was a real domain fact: WPL numbers don't expire. They're a not-before mark, not a bounded window, so the same number turns up for decades. One wrong ceiling in my data turned a correct answer into a confident, badly wrong one.

The piece that ā€˜broke’ the project.

What I Actually Learned

Curated data doesn't simply "help or not help" but rather helps in a narrow seam: early pieces where no datable mark exists and an archival fact is the only signal. It sits redundant when the model already knows. And it actively regresses the model when a bound is wrong, overriding a correct hedge with false confidence. Curation quality isn't a detail of the system, it is the system. A concrete design rule would be needed: a hard lookup should surface a conflict with strong model evidence, never silently override it.

For this particular use case, the evaluation itself is the product. If I wanted to take this further, what would I do? For starters, a scaled-up gold set of more diverse pieces would be needed, focused on garments with no datable marks. Other, more sophisticated approaches could also be relevant: matching garments against a library of reference images (using techniques like CLIP or SigLIP embeddings), giving the model tools it can call on its own (agentic orchestration), or even infrared spectroscopy to anaylze fabric composition directly.

For fun, I created a mockup of the product concept. I call it 'Warp & Weft', from the two directions of fabric strands on a loom. You're very welcome to explore this prototype!

Tooling: a custom Python evaluation harness with pre-registered scoring, per-piece cue attribution, and contamination diagnostics. Dating references were hand-curated from standardized textile marks and brand-archive sources. Analysis was done using Claude Cowork, with Claude Opus 4.8 as the vision-language comparator, and Lovable as the prototype generator.