You are browsing as a guest. Sign up (or log in) to start making projects!

icp-scout

  • 5 Devlogs
  • 34 Total hours

AI assistant for finding B2B sales opportunities. It analyzes company data, identifies potential customers, and prepares contact recommendations for sales teams.

Ship #1 Pending review

What did you make?
An assistant for a salesperson, not another lead list. You give it a customer profile, it walks the Czech public registers, and once a week it hands back a handful of companies with something that actually changed this week — each with a full dossier where every claim carries the exact quote it came from and a link to the page it was found on. Built as a take-home assignment for RTsoft (they sell custom shop-floor management software), and it’s live in production, not just running on my machine.

What was challenging?
Hallucination is the whole risk of this task, not a side concern — an invented fact about a company that a salesperson pastes into an email is worse than no output at all. So the model never gets to assert anything; it proposes a claim + a quote, and my code searches for that exact quote in the page text I archived. First time I ran a verifier that rechecked stored claims against their own archived pages, 100 of 172 supposedly-verified facts failed — all from one code path, the part reading the state register, which had been marking its own claims “verified” without ever passing them through the check. The other hard part: I assumed a good weighted score could rank “why this company.” Two separate experiments — a permutation test and a 1536-dim embedding of company sites — both came back at chance. The site text just doesn’t say who’s buying software. Had to throw the score out and rebuild ranking around what’s actually provable instead.

What are you proud of?
One line in the schema: claim.snapshot_id NOT NULL REFERENCES snapshot(id). A claim about a company physically cannot be inserted into the database unless it points at a stored page snapshot — “nothing without a source” isn’t a rule I have to remember, it’s a foreign key. Also proud that manual review keeps finding real bugs the statistics don’t: a solar-panel subsidy misfiled as “scaling up production,” a company ranked #1 whose own grant paperwork said they’d already bought the system — both caught by reading five actual cards, after two rigorous experiments said everything was fine.

What should people know so they can test it?
It only works for Czech companies — the sources are Czech state registers. python -m pipeline.run –check tells you exactly what’s missing before you run anything. The number that matters on every dossier is the last line — “N verified facts · N inferences · N discarded” — click a claim’s source link and check the quote is actually on that page; that’s the whole trust model, so it should be checkable, not taken on faith.

  • 5 devlogs
  • 34h
Try project → See source code →
Open comments for this post

7h 26m 39s logged

Wired up actual deploy: push to main, and a minute later the demo is running that commit. git archive straight over ssh into a receive script — no registry, no git pull on the server, so the server never holds credentials for this repo. The one thing it refuses to do is kill a run in progress: /api/run spawns the pipeline as a subprocess, and a container restart takes it down with it. Now the script asks first, and if a run is going it stops and exits non-zero — red, on purpose, because a deploy that shipped code but didn’t put it into service has no business looking green.Rebuilding the whole thing from nothing on a clean machine found what months of running it on my own box never did. All five delivered companies 404’d after the first real run — the candidate list gets loaded once at import, a run rewrites the files under it, and the process just kept serving eight-hour-old data until somebody restarted it by hand. The “what’s missing” preflight check was lying in both directions: it called the API key missing on a machine that had it as an env var instead of a .env file, and it reported success on a machine where the industry codebook never downloaded — which doesn’t crash anything, it just prints every industry as a bare five-digit code and calls that fine.README got rewritten to lead with the one sentence the tool actually stands on, plus an ARCHITECTURE.md the code can point to instead of explaining itself in comments, a Czech translation, and an MIT licence with the honest caveat: what’s verified is that a sentence was on a page, not that it’s true.

0
0
7
Open comments for this post

5h 34m 13s logged

Ran two experiments trying to find better weights for the outreach-order score — a permutation test on our own signals, and a 1536-dim embedding of company sites — both landed at chance (AUC 0.39, p≈0.8). Turns out public site text just doesn’t say whether a company is buying planning software; that’s a ceiling in the source, not something more features would fix, so scoring got replaced with an order read straight off the client’s own ICP document instead of invented weights. Then reading five actual weekly cards by hand caught two things neither experiment did: a solar-panel subsidy misfiled as “scaling up production,” and the #1 company on the list whose own grant description said “we’re buying a complete information system” — already a lost lead, not a hot one. Fixed the classifier — it was only reading project titles, never descriptions — and one signal class jumped from 214 to 1014 matches, 415 of which used to be pitched as reasons to call. Two rigorous measurements found nothing; two hours of eyeballing cards found the bugs sitting at the top of the list.

0
1
45
Open comments for this post

2h 55m 43s logged

The assistant now produces real company cards - every claim on one carries the exact quote it came from and a link to the source it was found in. To make sure that actually held, I wrote a check that re-verifies every stored fact against the archived page it supposedly came from, and ran it over the whole database.100 of 172 “facts” failed. Every single one came from my own code: the part that reads the state company register was writing claims marked “verified” without ever passing them through the verifier. The irony is that the register is the most trustworthy source in the entire project - it was just the only one asserting things instead of proving them. Now 177 of 177 pass.I also cut the weekly run from ~50 minutes to about 2, after finding an official API that lists which companies changed recently - 30 of mine in a week, instead of re-checking all 3,299.

0
0
65
Open comments for this post

11h 38m 58s logged

I started working on icp-scout - an AI assistant that helps find potential B2B customers.
The idea behind the project is simple: instead of a salesperson spending hours searching for companies, opening different websites, and collecting information manually, the assistant should handle this routine work. The goal is not just to provide a list of companies, but to explain why each company could be a good fit and why now might be the right time to contact them.
Right now, I’m working on the basic project architecture and thinking about how to make AI results more reliable. The biggest challenge with systems like this is that AI can confidently generate information that is not true. That’s why it is important that every important statement can be verified and has a clear source.

Next, I plan to connect public company data sources, build the first analysis pipeline, and test it with real examples.

0
0
14

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…