AEO decision board
Two audiences, one command. Humans get markdown. Agents get JSON with the same cells and no prose.
Do not open consumer LLM websites. This skill only reads evidence JSON produced by python3 -m aeo run.
When to use
- "Show me a table / scoreboard"
- "What should we do with this run?"
- "Analyze this AEO evidence"
/aeo-board
Steps
- Find the latest evidence file, or use the path they gave. Typical:
aeo-data/runs/<run_id>.jsonorexamples/xerj/aeo-data/example-run.json. - Run
python3 -m aeo board <file>(optional--format md|html|json). Default writes both:aeo-data/boards/<run_id>.md— for humans / decision makersaeo-data/boards/<run_id>.json— for agents (schema_version: aeo-cli-board-v1)
- Show the markdown board to the human.
- If asked to analyze: read the board JSON, not the raw answers first. Summarize only focus
gapandsearch-blindrows. Watchtraprows are expected — mention the tally, do not narrate each miss. Promote a watch query to focus only if evidence shows they started searching or mentioned the brand. - Never invent checkmarks. Recompute from evidence (
python3 -m aeo boardagain if unsure).
Calls
| Call | Meaning |
|---|---|
win |
Brand mentioned on search or knowledge. |
gap |
Focus, no brand, they did search. |
search-blind |
Focus, search allowed, they did not search. |
trap |
Watch, no brand (expected). |
⚠ = confirmation search (vendors already in the tool-call strings, brand was not). Not discovery.
Full rules: METHODOLOGY.md. Measurement skill: aeo. Turning a board into articles: aeo-playbook. Zero mentions after pages are already live: PLAYBOOK.md §11, not more articles.
A human run write-up is not the board itself. It must follow PLAYBOOK.md §10 (method, live URL check, per-engine×arm table, confirmation vs discovery, search-blind seeds, cannibalize map, waves, refuse list, --only-id re-run). After a zero-mention grid, reason with §9 before drafting. --format html is a view of the board, not a substitute for that artifact. Merge engine files with python3 -m aeo report --html --out report.html a.json b.json.
After the board, the post-run judge (scripts/judge_run.py) can extract vendors from every completed arm — including misses that only name an unlisted product (a surprise, vs the config seed list) — then scripts/render_judge_html.py. See PLAYBOOK.md §12.