Een salesagent in Obsidian
Ik bouwde een local-first salesagent voor Story by Numbers.
Hij vindt Nederlandse bedrijven die passen bij het soort werk dat ik verkoop, scoort ze tegen mijn dienstenwiggen en schrijft elke dag een korte briefing in Obsidian.
Hoe signalen werken
Een signaal is een klein, waarneembaar feit over een bedrijf. Heeft het een productcatalogus? Een archief? Een gepubliceerde onderzoekscollectie? Een B2B-portaal? Redactionele output?
Elk feit beweegt een score omhoog of omlaag. Sommige signalen zijn poorten. Ze wijzen kandidaten af voordat er een model wordt aangeroepen. Andere zijn gewichten. Ze kantelen vergelijkbare kandidaten naar verschillende wiggen.
Een groothandel met een diepe catalogus en een B2B-portaal scoort hoog in de ene richting. Een onderzoeksstichting met een gedigitaliseerd archief scoort hoog in een andere. Dezelfde agent bekijkt beide, maar leest ze heel verschillend.
Ik houd mijn volledige signaalset privé. Het is de gecodeerde versie van mijn aanbod en mijn smaak, en het verandert naarmate ik bijleer.
Filteren vóór het model
Het opschonen gebeurt voordat het taalmodel erbij komt. Sectoren waar ik nooit aan verkoop, zijn weg voordat er ook maar een redeneerstap plaatsvindt. Bedrijven buiten het dienstenmodel worden afgewezen op de regelenlaag. Alleen de overlevenden krijgen een gestructureerde beoordeling.
Zo houdt het model alleen de oordeelskwesties over, en blijft de bedrijfskost voorspelbaar.
Obsidian als feedbacklus
De briefing landt in Obsidian, waar ik toch al mijn notities bijhoud.
Ik markeer bedrijven als afgewezen, geparkeerd, verloren of gewonnen. Die aantekeningen worden bij de volgende run teruggelezen in de lokale database. Een reflectiestap stelt scoringsaanpassingen voor op basis van recente uitkomsten. Ik beoordeel ze met de hand voordat er iets van kracht wordt.
De agent verbetert. Het uiteindelijke oordeel blijft bij mij.
Klein, lokaal, inspecteerbaar
De stack is bewust eenvoudig. Python, SQLite, publieke bronnen, markdown, Obsidian.
Het geheel draait op mijn laptop. De redeneerstap roept Claude aan via de CLI, die mijn maandabonnement gebruikt, dus er is geen API-rekening per run om over na te denken. Een cronjob start elke ochtend een run terwijl ik koffie zet.
Geen dashboard, geen gehoste dienst, geen geautomatiseerde outreach. Elke fase schrijft naar een lokale database, zodat runs kunnen worden hervat en beslissingen later kunnen worden ingezien.
De agent is nuttig omdat hij smal is. Hij codeert mijn commerciële context en geeft me elke week een klein aantal plausibele bedrijven.
Voor een studio als de mijne is dat genoeg.