Asymmetric Opportunity Screener
A weekly agent that searches arXiv, SSRN and the web and scores what it finds against a fixed rubric.
Why there is no measurement
Private repo, no backtest run — nothing to verify yet
No measurement
Why not
The repository is private, so nothing I claimed here could be checked even if I had a number. It does track cost and tool-call counts per run, and the snapshot mechanism exists precisely so that scoring changes can be replayed against past inputs — but I have not yet run that backtest, and the output is investment theses whose quality resolves over years rather than in a test suite. I would rather leave this blank than score my own picks.
Problem
Research agents are easy to demo and hard to trust. Run the same open-ended "find me something interesting" prompt twice and you get two different answers with no way to tell which was better, because nothing about the run was fixed: not the criteria, not the budget, not the record of what it looked at. The interesting engineering problem is not the searching. It is making a run comparable to the one before it.
Approach
Everything that could drift is pinned. Scoring is a fixed five-axis rubric with explicit numeric thresholds rather than a model's overall impression. Each agent loop runs under a hard cap on tool calls and a wall-clock budget, so a run cannot quietly cost ten times the last one. Results are deduplicated over a rolling window so the same thesis does not re-alert every week. Inputs are snapshotted to object storage so a past run can be replayed against changed scoring code. It runs unattended on a weekly cron and delivers to Telegram.
The constraint that shaped it
An agent with an open-ended research task will spend whatever you let it spend. The first version of this had no ceiling, and the run cost was a function of how interesting the model found the topic — which is not a budget.
So each loop now runs under two hard caps: a maximum number of tool calls, and a wall-clock budget. When either is hit the loop returns what it has. That is worse than an unbounded search on any single run, and much better across fifty of them, because the cost is now a known quantity rather than a discovery.
Fixed rubric over model judgement
Scoring is five axes, each 0–10, each with a stated meaning: how locked-in the demand is, how hard supply is to expand, how crowded the thesis already is, how investable the vehicles are, and how soon the gap should close.
Promotion thresholds are arithmetic — every axis above a floor and the total above a bar — rather than a model deciding whether something “feels compelling.” The thresholds are arguable. The point is that they are written down, so a change in output can be attributed either to the world changing or to me changing the bar, and not to the model having a different day.
Reproducibility
Search results are snapshotted before scoring. That is what makes the rubric changeable: if I move a threshold, I can re-score last quarter’s inputs instead of waiting a quarter to find out what the change did.
Eighty-seven unit tests cover the pure functions — scoring, promotion, deduplication, parsing. They deliberately make no API calls, so the suite is fast and its failures are always about my logic rather than someone’s rate limit.
What this is not
It is not advice, it is not a trading system, and it does not execute anything. It reads, it scores against a rubric I wrote, and it sends me a message.