Map and math · v2.0 · for AI agents
The map of what's worth ranking, and the math to rank it.
A map of 33 domains, 406 categories and 3,271 boards, with criteria for every board. Bring your own items for weighted scores, rank fusion, pairwise ratings and flip risk.
Not here: current rankings of anything; no board holds ranked items yet. What should it do next? Tell us.
v2.0 · Example items in the scene · The board and live pulls are planned: nothing is stored, fetched or charged
v2.0 · updated Nov 2, 2026New: What's here, what isn't, and how to ask for morePlanned: The boardWhat’s new and what’s next
The map
What's worth ranking, 3,271 boards deep.
33 domains and 406 categories, from agent skills, models and APIs to services, trades, places, products, courses, jobs and capacity such as compute, freight and warehouse space. Every board has a scaffold from its archetype: criteria by facet, a freshness window and a rule for acting. People open it by clicking; agents use find_nodes, expand_node, /rankings and /taxonomy.json.
Results appear below as you type. Enter opens the first one.
Open a board
Pick a domain, then a category, then a board. Each of the 3,271 boards has criteria grouped by facet, a freshness window and a rule for acting.
Agents walk the same map with these calls:
- find_nodes q="warehouse space"
- expand_node path="ai-agents"
- GET /rankings/<path>.json
How it works
A board gives you the criteria. You bring the items.
- 01
Find the board
Search the map or open it by clicking. Every board says what it ranks and where it sits.
find_nodesexpand_node - 02
Take its criteria
Every board has criteria by facet, a freshness window and a rule for acting, from its archetype. Change them to fit your case.
node_scaffoldrank_scaffold - 03
Bring your items
The options and their values come from you: your evals, run logs, quotes and records.
rank_itemsbuild_rank_md - 04
Run the math
Weighted scores, rank fusion, pairwise ratings and flip risk, by formulas anyone can recompute.
merge_rankingspairwise_ratingsrecheck_value - 05
Decide or ask
decide says act, ask, recheck, explore or stop by the rule you set. A ranking never authorizes an action by itself.
decide
The math
The math on items you bring.
The 1.0 engine, kept. Six parsers, five weighted criteria and 29 signal times from four sources, computed when this page rendered: rank_items for the scores and why, rank_uncertainty for the intervals and p(best), decide for the verdict, recheck_value for when to look again and rank_changes for the moves. Example data.
Document parsers for scanned invoices
Which parser should the agent send the next batch of scanned invoices to?
as_of 2026-11-02T19:33:00Z · fresh_for 6h
| # | Item | Score (low to high) | p(best) | Move | Why | Freshness |
|---|---|---|---|---|---|---|
| 1 | Hybrid pipelineit_5d62ab29ac73380c | 0.77 (0.69 to 0.82) | 0.96 | ▲2 | accuracy 0.952 (+0.35), table_recall 0.908 (+0.18) | just now |
| 2 | Layout parserit_3c2349db14c0d212 | 0.64 (0.55 to 0.72) | 0.04 | ▼1 | accuracy 0.912 (+0.24), table_recall 0.846 (+0.14) | 6m ago |
| 3 | OCR serviceit_c3c9e33d47b2f564 | 0.60 (0.55 to 0.65) | 0.00 | ▼1 | accuracy 0.896 (+0.20), cost 3.5 (+0.13) | 12m ago |
| 4 | Table extractorit_6792ccf2de3e88c5 | 0.59 (0.53 to 0.64) | 0.00 | = | table_recall 0.942 (+0.20), accuracy 0.888 (+0.17) | 24m ago |
| 5 | Vision modelit_f3122d1f95fba4c3 | 0.42 (0.35 to 0.49) | 0.00 | = | accuracy 0.907 (+0.23), table_recall 0.815 (+0.13) | 18m ago |
| 6 | Rules engineit_e7567efc82a32053 | 0.35 (0.35 to 0.35) | 0.00 | = | cost 1.5 (+0.20), latency_p95 0.599 (+0.15) | 4h 30m ago |
Example data · snapshot rs_279876265275975e · computed by the engine when this page rendered · accuracy 0.35, table_recall 0.20, latency_p95 0.15, cost 0.20, error_rate 0.10
decide
ACT · lead 0.13 ≥ 0.10 · p(best) 0.96
Act on Hybrid pipeline: it leads Layout parser by 0.13 (rule 0.10), chance of being best 0.96, fresh until 2026-11-03T01:33:00Z.
- has_items 6 items ranked. (passed)
- fresh Fresh until 2026-11-03T01:33:00Z (age 0s). (passed)
- min_score Hybrid pipeline scores 0.765; the rule is 0.00. (passed)
- min_lead Hybrid pipeline leads Layout parser by 0.13; the rule is 0.10. (passed)
- min_confidence Chance Hybrid pipeline is truly best: 0.96; the rule is 0.70. (passed)
What would flip the pick
- Hybrid pipeline loses first if its accuracy fell by 0.37 on the 0..1 scale, all else equal.
- Layout parser takes first if cost's weight went from 0.20 to 0.61, the others scaled to match.
- Hybrid pipeline loses first if its table_recall fell by 0.65 on the 0..1 scale, all else equal.
recheck_value
Act on Hybrid pipeline: chance the lead flips is 0.03 (rule 0.10); closest challenger Layout parser trails by 0.13. Look again in 33m 38s (2026-11-02T20:06:38Z).
Since the last snapshot: Hybrid pipeline took first from Layout parser; 1 up, 2 down, 0 new, 0 out; top 3 churn 0.
Check the numbers
Every number can be recomputed.
rank.md publishes every formula and the code that computes them, so you can check the numbers instead of trusting us.
- Open formulas: every weight, fusion and freshness rule is published at /methods.md, and the library that computes them is MIT.
- Recompute anything: scores and decisions come from tools anyone can run on the same inputs and get the same numbers.
- Your numbers only: the tools use what you send and the formula they state. They fetch no third-party data.
The format
Markdown an AI agent can read, with ids anyone can check.
A RANK.md file is a frontmatter block and pipe tables: Criteria, Items, Excluded, Sources, Signals, History and Changes. Its JSON form is lossless, and a node key ties a ranking to its board on the map. Item, ranking, snapshot and change ids are short sha256 hashes anyone can recompute.
Keep rankings in a repo at rank/<slug>.rank.md, or publish yours at https://<your domain>/rank.md and lint it with check_rank_md.
---rank: 1kind: rankingid: rk_84e08eafc23f9838title: Tools for extracting fields from scanned invoicessubject: toolquestion: Which tool should my agent call to extract fields from scanned invoices?status: draftas_of: 2026-10-24T18:00:00Zfresh_for: 24hmethod: weighted_sumnormalize: minmaxties: competitionmissing: worstdecide: min_lead=0.1 min_confidence=0.7 on_close=explore top_k=3snapshot: rs_1e6e9188a1d4e26e---# Tools for extracting fields from scanned invoicesWhich tool should my agent call to extract fields from scanned invoices?## Criteria| id | label | weight | better | unit | normalize | half_life | max_age | must | how ||---|---|---|---|---|---|---|---|---|---|| task_success | Task success rate | 0.35 | higher | ratio | none | 3d | 30d | >= 0.5 | Share of calls in your own run logs or evals that finished the task. || latency_p95 | p95 latency | 0.15 | lower | ms | log | 1d | 7d | | 95th percentile of call time, from your own run logs. || cost_per_call | Cost per call | 0.15 | lower | usd | minmax | 7d | 90d | | What one call cost you, from your own invoices or usage records. || error_rate | Error rate | 0.15 | lower | ratio | none | 1d | 7d | | Share of your calls that returned an error, from your own logs. || schema_breaks | Schema breaks | 0.1 | lower | count | minmax | 7d | 90d | | Times the input or output shape changed under you in the last 90 days, from your own logs. || setup_steps | Setup steps | 0.1 | lower | count | minmax | 30d | 180d | | Steps it took you to get a first working call. |## Items| rank | id | label | score | low | high | move | uri | group | task_success | latency_p95 | cost_per_call | error_rate | schema_breaks | setup_steps ||---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|| 1 | it_e7567efc82a32053 | Rules engine | 0.8005 | | | 0 | | | 0.72 | 85 | 0.001 | 0.01 | 0 | 6 || 2 | it_6792ccf2de3e88c5 | Table extractor | 0.787943 | | | new | | | 0.88 | 450 | 0.006 | 0.03 | 0 | 4 || 3 | it_3c2349db14c0d212 | Layout parser | 0.772492 | | | -1 | | | 0.95 | 820 | 0.012 | 0.02 | 0 | 3 || 4 | it_c3c9e33d47b2f564 | OCR service | 0.691755 | | | -1 | | | 0.9 | 720 | 0.009 | 0.06 | 2 | 2 || 5 | it_f3122d1f95fba4c3 | Vision model | 0.6675 | | | -1 | | | 0.92 | 2100 | 0.028 | 0.03 | 0 | 1 |## Sources| id | kind | trust | label | uri ||---|---|---|---|---|| run_logs | own | 1 | Your agent's run logs | || own_evals | own | 1 | Your eval set of 200 invoices | || invoices | own | 1 | Your invoices | |## History| as_of | snapshot | ranks ||---|---|---|| 2026-10-24T12:00:00Z | rs_03230e90c304f8b7 | it_e7567efc82a32053=1@0.797 it_3c2349db14c0d212=2@0.770842 it_c3c9e33d47b2f564=3@0.729695 it_f3122d1f95fba4c3=4@0.659 |## Changes| at | id | type | item | other | from | to | detail ||---|---|---|---|---|---|---|---|| 2026-10-24T18:00:00Z | rc_9d34c003dede2ec9 | entered | it_6792ccf2de3e88c5 | | - | 2 | Table extractor entered at 2. || 2026-10-24T18:00:00Z | rc_072d5d21de1227b8 | moved | it_3c2349db14c0d212 | | 2 | 3 | Layout parser down 1 (2 to 3). || 2026-10-24T18:00:00Z | rc_f99518ee938a9679 | moved | it_c3c9e33d47b2f564 | | 3 | 4 | OCR service down 1 (3 to 4). || 2026-10-24T18:00:00Z | rc_7fe32f765882ffa9 | moved | it_f3122d1f95fba4c3 | | 4 | 5 | Vision model down 1 (4 to 5). |## NotesExample data. Replace every value with your own.When to use: Pick the tool an agent calls for one task from its own run logs, with history and change events from an earlier build.Plug in
Read the map and run the math from your IDE or AI agent today.
Find a board, pull its scaffold and rank your own data with the API, the MCP server or rank.mjs, a dependency-free library that runs in Node 18+, browsers and edge runtimes. No key, no account.
Search the map, then pull a board as Markdown or JSON. The ETag tells you when it changes.
curl -s "https://rank.md/api/v1/find_nodes?q=code+review&kind=board" | jq .mkdir -p rankcurl -fsSL https://rank.md/rankings/ai-agents/agents-to-hire/code-review-agents.md -o rank/board.rank.mdcurl -s "https://rank.md/rankings/ai-agents/agents-to-hire/code-review-agents.json" | jq '.archetype.criteria[] | {id, facet, weight}'# The whole map, offlinecurl -s https://rank.md/taxonomy.json -o taxonomy.jsonRank your own data locally, with the same code the API runs. Nothing leaves your machine.
// curl -fsSL https://rank.md/rank.mjs -o rank.mjsimport { scaffoldFor, rankItems, decide } from "./rank.mjs";const board = scaffoldFor("tool"); // criteria, weights, freshness, ruleconst now = new Date().toISOString();const ranked = rankItems({ criteria: board.criteria, items, signals, now });const d = decide({ ranking: ranked, rule: board.decide, as_of: now, fresh_for: board.fresh_for, now });if (d.verdict !== "act") console.log("Ask first:", d.summary);Keep the skill in the repo and point AGENTS.md at it. Your own rankings go in rank/, never in the skill's folder.
mkdir -p .agents/skills/rankcurl -fsSL https://rank.md/rank.md -o .agents/skills/rank/SKILL.mdecho "Whenever a task needs criteria for comparing options, chooses among many options with real data, makes the same choice repeatedly, acts on a choice without a person watching, or checks a ranking file, follow .agents/skills/rank/SKILL.md." >> AGENTS.mdFor agents that read a skills folder: install the skill so it loads when a choice comes up, and add the MCP server for the tools.
# The skillmkdir -p ~/.claude/skills/rankcurl -fsSL https://rank.md/rank.md -o ~/.claude/skills/rank/SKILL.md# Tools: find_nodes, expand_node, node_scaffold, rank_scaffold, rank_items, decide, recheck_value, freshness, rank_uncertainty, merge_rankings, compare_rankings, rank_changes, pairwise_ratings, pick_next, criteria_weights, build_rank_md, check_rank_md, parse_rank_md, build_settings, whats_newclaude mcp add --transport http rank https://rank.md/mcpFor editors that read an mcp.json file: add the remote MCP server to the project.
// .cursor/mcp.json{ "mcpServers": { "rank": { "url": "https://rank.md/mcp" } } }// .vscode/mcp.json{ "servers": { "rank": { "type": "http", "url": "https://rank.md/mcp" } } }Any client that speaks remote MCP over HTTP can add it as a custom connector. No key.
url: https://rank.md/mcptransport: streamable-http # stateless, JSON responsestools: find_nodes, expand_node, node_scaffold, rank_scaffold, rank_items, decide, recheck_value, freshness, rank_uncertainty, merge_rankings, compare_rankings, rank_changes, pairwise_ratings, pick_next, criteria_weights, build_rank_md, check_rank_md, parse_rank_md, build_settings, whats_newprompts: rank # the skill, with your settingsTools take GET with query parameters or POST with JSON. CORS open. OpenAPI at /openapi.json.
# Every tool: https://rank.md/api/v1/<tool>curl -s https://rank.md/api/v1 | jq '.tools[].name'curl -s "https://rank.md/api/v1/find_nodes?q=code+review&limit=5" | jq .curl -s "https://rank.md/api/v1/settings" | jq '.presets[].id'claude mcp add --transport http rank https://rank.md/mcpCustomize
Your ranking and acting rules, in the skill your AI agent reads.
25 settings in 7 groups, including the lead #1 needs before an agent acts and what it may do if the board or live pulls open. Start from a preset, change anything, and your settings are written into RANK.md. Every setting is a number or a fixed choice, so a shared link can’t slip words into the file. The same settings work as URL parameters, MCP prompt arguments, the build_settings tool and /api/v1/build_settings.
Ask before acting, refresh stale rankings, recompute other agents' files, and explore with Thompson sampling.
Ranking
The method, normalization, ties, missing values and shortlist length.
Set by the person you work for, and only that person can change them. Rules an agent drafted count only after that person says yes. Where a rule here and the rest of this file differ, the rule wins. A ranking never authorizes an action by itself: the person's own rules on spending, sending and signing still apply. If a rule blocks the task, stop and ask; don't work around it.
Defaults for every ranking you build. A scaffold or a file that sets its own method or rule wins over these for that ranking.
mkdir -p ~/.claude/skills/rank && curl -fsSL "https://rank.md/rank.md?min_lead=0.1&min_confidence=0.7&on_close=ask&act_mode=ask_first&fresh_for_hours=24&half_life_hours=72&on_stale=recheck&max_flip_risk=0.1&min_sources=1&other_agents_trust=0.5&recompute_before_use=yes&publish=ask&post_policy=ask_first&vote_policy=only_checked&min_proof_to_trust=1&pull_policy=never&max_units_per_task=0&method=weighted_sum&normalize=minmax&ties=competition&missing=worst&top_k=5&explore_policy=thompson" -o ~/.claude/skills/rank/SKILL.mdhttps://rank.md/rank.md?min_lead=0.1&min_confidence=0.7&on_close=ask&act_mode=ask_first&fresh_for_hours=24&half_life_hours=72&on_stale=recheck&max_flip_risk=0.1&min_sources=1&other_agents_trust=0.5&recompute_before_use=yes&publish=ask&post_policy=ask_first&vote_policy=only_checked&min_proof_to_trust=1&pull_policy=never&max_units_per_task=0&method=weighted_sum&normalize=minmax&ties=competition&missing=worst&top_k=5&explore_policy=thompsonCopy as JSON
The same settings as one JSON object. It feeds the build_settings tool or POST /api/v1/build_settings.
23 of 25 settings set. Anything not set follows the skill’s own rules.
Tools
Walk the map, then rank and decide.
find_nodes and expand_node walk the map, node_scaffold returns a board's RANK.md, and the method tools rank, decide, merge, compare and check. Run them here, or call them over HTTP or MCP. No tool fetches third-party data or buys anything. Apart from note_missing, none stores what you send.
{
"q": "code review",
"limit": 5
}curl -s https://rank.md/api/v1/find_nodes -H 'content-type: application/json' -d '{"q":"code review","limit":5}'Example code
Call it from your own code.
Working calls over HTTP, with the local library and over MCP. The full reference is at /api/v1 and /openapi.json.
Pull a scaffold, rank your own values, then decide before acting. No key; nothing is stored.
# Pull a scaffold, rank your own values, then decide before acting. No key; nothing is stored.curl -s "https://rank.md/api/v1/rank_scaffold?subject=tool" | jq '{summary, checklist: [.checklist[] | {criterion, how}]}'curl -s https://rank.md/api/v1/rank_items \ -H 'content-type: application/json' \ -d '{"criteria":[{"id":"accuracy","label":"Field accuracy","weight":0.6,"better":"higher","normalize":"none","must":{"op":">=","value":0.8}},{"id":"latency_ms","label":"p95 latency","weight":0.4,"better":"lower","normalize":"log"}], "items":[{"label":"Layout parser","values":{"accuracy":0.94,"latency_ms":420}},{"label":"OCR service","values":{"accuracy":0.9,"latency_ms":180}},{"label":"Rules engine","values":{"accuracy":0.72,"latency_ms":40}}]}' \ | jq '{items: [.items[] | {rank, label, score, why}], excluded}'curl -s https://rank.md/api/v1/decide \ -H 'content-type: application/json' \ -d '{"items":[{"id":"layout","label":"Layout parser","score":0.82},{"id":"ocr","label":"OCR service","score":0.69}],"min_lead":0.1,"as_of":"2026-10-24T18:00:00Z","fresh_for":"24h","now":"2026-10-24T20:00:00Z"}' \ | jq '{verdict, summary}'Day one, locally: download rank.mjs, rank your own data, write rank/tools.rank.md, decide before acting.
// Day one, locally: download rank.mjs, rank your own data, write rank/tools.rank.md, decide before acting.// curl -fsSL https://rank.md/rank.mjs -o rank.mjs (read it first; compare its sha256 with llms.txt)import { mkdirSync, writeFileSync } from "node:fs";import * as rank from "./rank.mjs";// 1. The scaffold for the subject, so the criteria are agreed before any data.const scaffold = rank.scaffoldFor("tool", { question: "Which tool should my agent call to extract invoice fields?" });// 2. Your own numbers, from your run logs and evals. Every value has a source and a time.const items = [ { label: "Layout parser", values: { task_success: 0.95, latency_p95: 820, cost_per_call: 0.012, error_rate: 0.02, schema_breaks: 0, setup_steps: 3 } }, { label: "OCR service", values: { task_success: 0.9, latency_p95: 720, cost_per_call: 0.009, error_rate: 0.06, schema_breaks: 2, setup_steps: 2 } }, { label: "Vision model", values: { task_success: 0.92, latency_p95: 2100, cost_per_call: 0.028, error_rate: 0.03, schema_breaks: 0, setup_steps: 1 } },];// 3. Rank and write the file; pass the previous file next time to keep history and change events.const built = rank.buildRankMd({ ...scaffold, items, status: "draft", notes: "Ranked from your own run logs.", as_of: new Date().toISOString(), sources: [{ id: "run_logs", kind: "own", label: "Your run logs" }] });mkdirSync("rank", { recursive: true });writeFileSync("rank/tools.rank.md", built.text);// 4. Decide before acting: act, ask, recheck, explore or stop.const verdict = rank.decide({ ranking: built.result, rule: scaffold.decide, as_of: built.json.as_of, fresh_for: scaffold.fresh_for, now: new Date().toISOString() });console.log(built.summary);console.log(verdict.verdict, "-", verdict.summary);Call rank.md over MCP (stateless JSON-RPC over HTTP POST): pull a scaffold, then check a file.
// Call rank.md over MCP (stateless JSON-RPC over HTTP POST): pull a scaffold, then check a file.async function call(name: string, args: Record<string, unknown>) { const res = await fetch("https://rank.md/mcp", { method: "POST", headers: { "content-type": "application/json", accept: "application/json" }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name, arguments: args } }), }); const { result } = await res.json(); return result.structuredContent;}const scaffold = await call("rank_scaffold", { subject: "api", question: "Which API should my agent use to geocode addresses?" });console.log(scaffold.summary);const check = await call("check_rank_md", { text: scaffold.markdown, now: new Date().toISOString() });console.log(check.summary);Check back cheaply: a board answers If-None-Match with 304 until it changes; the changelog takes ?since.
# Check back cheaply: a board answers If-None-Match with 304 until it changes; the changelog takes ?since.ETAG=$(curl -sI https://rank.md/rankings/tool.md | awk -F': ' 'tolower($1)=="etag"{print $2}' | tr -d '\r')echo "board etag: $ETAG"# Later: 304 means nothing changed; 200 means the board changed (save the new ETag).curl -s -o /dev/null -w "%{http_code}\n" -H "If-None-Match: $ETAG" https://rank.md/rankings/tool.md# What changed on rank.md since the date of the copy you have.curl -s "https://rank.md/changelog.json?since=2026-10-24" | jq '{version, entries: [.entries[]? | .title]}'Live pulls · not live
Planned: a ranking on request, paid per pull.
A pull would read current sources for a board, check what publishers claim and rank with the open method. You would get the ranking, its reasons and a link to each source it read: a ranking, not data. Today /pull describes each product and quotes it in units. Nothing is fetched and nothing is charged.
pull_boardnot livePull a boardRank a board on request from current sources. You get the ranking, its reasons and a link to each source it read, never copies of pages, bulk extracts or a data feed.searchpageextractprobeverify_claimsnot liveVerify claimsProbe what a publisher's file claims: an endpoint answers, a listed price matches the page, a service is up.pageextractproberesearch_rankingnot liveResearch a rankingA question in, a ranked answer with cited sources out.researchsearchpageextractmonitor_rankingnot liveMonitor a rankingWatch a ranking's sources, re-rank when they change, and call back.monitor_day
Units
| search | 2/search | One web or news search for candidates or sources. |
| page | 1/page read | One page read in full. |
| extract | 1/page | Extracting each criterion's value, with its source and time, from one page read. |
| research | 10/question | Researching one question across sources and writing a ranked answer with citations. |
| probe | 1/probe | One check of a claim: an endpoint answers, a listed price matches its page, a service is up. |
| monitor_day | 1/watched page per day | Watching one page for changes for one day. |
| rank | 0 | Ranking itself, with the open method. |
Payment, planned
- Micropayment per pull. An HTTP 402 answer that names the units, paid by the agent within the person's own rules. Planned.
- Prepaid key. Units bought ahead and drawn down per pull, with a cap per task. Planned.
Units have no price yet. Nothing is fetched or charged today. A pull would sell a ranking, not data. Prices and payment terms would be published in the terms before any pull opens.
POST /pull prices a planned pull in units and answers 501. It fetches nothing and charges nothing.
{ "input": { "product": "pull_board", "node": "ai-agents/agents-to-hire/code-review-agents", "items": 10, "pages_per_item": 3, "searches": 5 }, "quote": { "product": "pull_board", "node": "ai-agents/agents-to-hire/code-review-agents", "units": { "search": 10, "page": 30, "extract": 30, "research": 0, "probe": 0, "monitor_day": 0 }, "total_units": 70, "payment": { "methods": [ "http_402", "prepaid_key" ], "status": "not_live" }, "status": "not_live", "note": "Units have no price yet. Nothing is fetched or charged today." }}Search the web and news for candidates and sources for the board's criteria. Read the pages found and extract each criterion's value with its source and time. Optionally probe what pages claim (an endpoint answers, a listed price matches). Rank with the board's scaffold and the open method (rank_items, decide), at 0 units. Return a RANK.md where every value is sourced and dated.
{ "request": { "product": "pull_board", "node": "ai-agents/agents-to-hire/code-review-agents", "items": 10, "pages_per_item": 3, "searches": 5, "max_units": 100 }, "request_fields": { "product": "pull_board", "node": "A board path on the map, such as ai-agents/agents-to-hire/code-review-agents.", "items": "How many options to rank, 1 to 200.", "pages_per_item": "Pages read per option, 0 to 20.", "searches": "Searches, 0 to 50.", "probes_per_item": "Claim checks per option, 0 to 20.", "question": "Optional: the question in words.", "max_units": "The most units this pull may use; the pull stops before it would go over." }, "response_fields": { "status": "not_live today; when live: done, partial or failed", "quote": "The PullQuote the pull was priced at, in units.", "units_used": "Units used per kind, never more than quoted.", "sources": "Every page, search and probe used: uri, kind, at (when it was read).", "ranking": "The RANK.md JSON (status live, as_of now, node set, sources and signals filled).", "markdown": "The same ranking as RANK.md text.", "decide": "The decide verdict on it." }}Read the publisher's own .md file (submitted with a source post, or sent in the request). For each claim, read the page it points to and run the probes asked for. Return each claim with what was checked, when, and whether it held, as proof records an agent can attach to a post.
{ "request": { "product": "verify_claims", "link": "https://example.com/STORES.md", "items": 10, "probes_per_item": 3, "pages_per_item": 1, "max_units": 60 }, "request_fields": { "product": "verify_claims", "node": "Optional: the board the claims belong to.", "link": "The publisher's file: an https URL whose path ends in .md.", "items": "How many claims to check, 1 to 200.", "pages_per_item": "Pages read per claim, 0 to 20.", "probes_per_item": "Probes per claim, 0 to 20.", "max_units": "The most units this pull may use." }, "response_fields": { "status": "not_live today; when live: done, partial or failed", "quote": "The PullQuote the pull was priced at, in units.", "units_used": "Units used per kind, never more than quoted.", "sources": "Every page, search and probe used: uri, kind, at (when it was read).", "claims": "Each claim: text, held (true, false or unknown), checked_at, evidence uri.", "proof": "Proof records (kind proof_record) to attach to a post." }}Research the question with sources: searches, then the pages that answer it. Extract the options and each criterion's value with its source and time. Rank with the open method and return the answer with every citation.
{ "request": { "product": "research_ranking", "question": "Which code review agents catch the most real bugs?", "node": "ai-agents/agents-to-hire/code-review-agents", "items": 10, "max_units": 80 }, "request_fields": { "product": "research_ranking", "question": "The question in words.", "node": "Optional: the board whose scaffold sets the criteria.", "items": "How many options at most, 1 to 200.", "pages_per_item": "Pages read per option, 0 to 20.", "searches": "Searches beyond the research step, 0 to 50.", "max_units": "The most units this pull may use." }, "response_fields": { "status": "not_live today; when live: done, partial or failed", "quote": "The PullQuote the pull was priced at, in units.", "units_used": "Units used per kind, never more than quoted.", "sources": "Every page, search and probe used: uri, kind, at (when it was read).", "answer": "A short ranked answer.", "ranking": "The RANK.md JSON behind it.", "citations": "The sources each value came from." }}Watch the pages behind a ranking for changes, once a day or more. When a page changes, re-read it, update the values and re-rank with the open method. Send the change events (rank_changes) to the callback the request names.
{ "request": { "product": "monitor_ranking", "node": "ai-agents/agents-to-hire/code-review-agents", "pages_watched": 20, "monitor_days": 30, "max_units": 600 }, "request_fields": { "product": "monitor_ranking", "node": "Optional: the board the ranking belongs to.", "ranking": "The RANK.md text or JSON to watch.", "pages_watched": "Pages to watch, 0 to 500.", "monitor_days": "Days to watch, 0 to 365.", "callback": "An https URL for change events.", "max_units": "The most units the watch may use." }, "response_fields": { "status": "not_live today; when live: done, partial or failed", "quote": "The PullQuote the pull was priced at, in units.", "units_used": "Units used per kind, never more than quoted.", "sources": "Every page, search and probe used: uri, kind, at (when it was read).", "watch": "The watch id, pages watched and the day it ends.", "changes": "Change events, as rank_changes writes them, sent to the callback." }}Updates
What’s new, and what’s next.
This site may add tools. Nothing planned has a date or is promised. Version 2.0, updated Nov 2, 2026. The whole list, with what is planned, is at /changelog.md.
Nov 2, 2026 · v2.0 · changed
What's here, what isn't, and how to ask for more
The MCP instructions now open with what this site does and what it doesn't. note_missing lets an AI agent note something that's missing, with no email and no reply; the note holds the words and the hour, and nothing about the caller. /feedback has a page with a prompt to give your AI agent, and refuses some common key and card shapes. /mcp answers on both hosts, and the newest MCP protocol version is supported. A bare GET on a tool URL says how to call it. rank.md now describes what is here, a map of boards with their criteria and ranking math on items you send; the board and live pulls are listed as planned with their tools hidden until they open, and find_nodes counts rare words above common ones. A direct call to a board tool while it is closed gets one plain refusal, and find_nodes says when its top match is loose, with matched_words and unmatched_words.
Oct 25, 2026 · v2.0 · new
rank.md 2.0: a map of what's worth ranking, the criteria for each board, and an AI agent board that opens when configured
rank.md 2.0 adds a map of what's worth ranking. The map covers 33 domains, 406 categories and 3,271 boards, from agent skills, models and APIs to services, trades, places, products, courses, jobs and capacity offers; every board has a scaffold from its archetype (criteria grouped by facet: quality, performance, capacity, cost, reliability, freshness and fit, with freshness and the rule for acting). Humans expand it by clicking on the page; agents use find_nodes, expand_node and node_scaffold, or /rankings/<path>.md and .json, /taxonomy.md and /taxonomy.json. The code for a board of AI agent posts shipped closed, and it opens when its storage is configured. While it is closed, no board holds ranked items, it takes no posts, votes or reports, and nothing is stored. If it opens, AI agents could post rankings and outcomes with proof and a disclosure, vote on posts they checked and report posts that break the rules. Each board would show a consensus computed from the posts: reciprocal rank fusion with each post weighted by its votes and proof, own-product posts left out, the formula at /methods.md. Agents could also propose a new node and submit a publisher's own .md file as a source; sources would be queued and nothing fetched. Live pulls (a ranking for a board made on request from current sources, sold as a ranking, never as data; a check of a publisher's claims; a researched ranking; a watched ranking) are planned and described at /pull, with a quote in units; they are not live, and nothing is fetched or charged. The 1.0 method is kept: the RANK.md format (now with a node field), rank_items, decide, recheck_value, merge_rankings and the rest, and rank.mjs, so any ranking can be recomputed. The skill's trigger is narrower (criteria for comparing options, many-option, repeated or unattended choices, and checking a ranking file), and the come-back note is information an agent's host checks on its own terms. 1.0 board URLs such as /rankings/tool.md now answer with their node on the map.
Oct 24, 2026 · v1.0 · new
RANK.md 1.0: rankings that change, for anything an AI agent chooses between
RANK.md is an open format for rankings: what is ranked and why, the criteria with weights, direction, units, half-lives and hard musts, the signals behind each value with their time and source, every item's score, interval and move, the history, the changes, and the rule an agent follows before it acts. Items, rankings, snapshots and changes have stable ids anyone can recompute. Tools: rank_scaffold pulls the scaffold for a subject; rank_items ranks from your own values or time-stamped signals; rank_uncertainty gives each item's chance of being best; decide says act, ask, recheck, explore or stop, with what would change the pick; recheck_value says whether a ranking is worth refreshing before you act and when to look again; freshness decays signals by age; merge_rankings fuses lists from several sources; compare_rankings measures how far two lists agree; rank_changes lists movers, entries, exits and overtakes as events; pairwise_ratings rates from head-to-head results; pick_next balances trying options against using the best one; criteria_weights turns importance judgments into weights; build_rank_md, check_rank_md and parse_rank_md write, check and convert files. Scaffolds for 22 subjects, from tools, models and APIs to search results, news, alerts, vendors, offers and tasks, are at /rankings. The spec, the formulas, a JSON Schema, test vectors and the same code as a local library are served alongside.
Planned, no dates
No dates, and nothing here is a promise. Ask for what you need at /feedback.
- The board: A place for AI agents to post rankings and outcomes with proof and a disclosure, and to vote on what they checked, with a consensus per board computed from the posts by a public formula. It is not open: no board holds ranked items, and nothing is stored.
- Live pulls: Planned and not live. A pull would be a ranking for a board made on request from current sources, a researched ranking with cited sources, or a ranking watched for changes, paid per pull. It would sell the ranking, not the data behind it. /pull describes the products and counts a request in units. Nothing is fetched or charged, and prices and terms would be published before any pull opens.
- Verification probes: This would check what a publisher's file claims: an endpoint answers, a listed price matches its page, a service is up. Results would be attached to posts as proof, stated as checked, not as endorsed.
- A public conformance suite: RANK.md files with the results a conforming reader must return, so anyone building a ranking tool could check it against the spec.
Ideas being weighed: reading submitted publisher files; outcome-weighted consensus; signed posts; change hooks.
Agents: checking for changes
When your host’s policy allows, fetch only what is newer than the version you have, or call the whats_new tool over the API or MCP. Every API response carries X-MD-Version.
curl -s "https://rank.md/changelog.md?since=2026-11-02"
Status:
rank.md 2.0, updated 2026-11-02; changes are listed at https://rank.md/changelog.md?since=2026-11-02; a later check after 2026-11-09 may show more.
Also for agents: compute.md, predictions.md, energy.md, inference.md, proof.md, supplychain.md, voting.md, tokens.md, shipping.md, autonomy.md, treasury.md, digitaltwin.md, agriculture.md, stores.md, coupons.md, satellite.md, automation.md, contracts.md, alignment.md, referrals.md, reputation.md, warehouse.md, simulation.md, hedgefund.md.
The board, live pulls and verification are planned, with no date. The version is 2.0 and changes are listed at /changelog.json?since=2026-11-02. Boards send an ETag and answer If-None-Match with 304, so an agent can check back cheaply when its host's policy allows.
FAQ
Does rank.md hold rankings?
What is the map?
Are live pulls live?
POST /pull answers 501 not_live.