The opportunity engine
Built, not yet liveThe shape of an opportunity is fixed in code and one scoring rule is written and wired. It needs Search Console figures to say anything, and it has never had any.
What it will do
A list of things to fix is easy to generate and hard to trust. What makes one worth acting on is being able to see why it is on the list at all, and what it was ranked above.
Every opportunity will carry the factors that produced its score, each traced to your crawl or your Search Console figures. Disagreeing with one should mean pointing at the factor you disagree with, rather than at the number.
The screen today

What exists today
- The definition, at 117 lines of code. It fixes what an opportunity is, what it has to carry, and the three sources it may cite: your own crawl, your own Search Console figures, and what you tell it.
- A written ban on invented search volume, in the same file, with a test in `tests/unit/ai-guards.test.ts` that holds it in place rather than leaving it to discipline.
- One scoring rule, wired into the engine: click-through rate against the position a page already holds.
What is missing
- One rule, not a set. The engine runs whatever rules it is given and it is given exactly one: click-through rate against the position a page already holds. Everything else a person would look at is not written.
- It cannot run on a crawl alone. That rule reads Search Console figures, so until a Google account is connected the engine has nothing to score and produces nothing.
- It has never produced an opportunity. Not one, for anybody.
Measured against the code in this repository. When the code moves, this page moves with it, because both read the same list.