threadify-scheduler-showdown · git:20261021.4ba512c · 2026-10-21 · sha256 6d346f66ec18dd7c
threadify-scheduler-showdown git:20261021.4ba512cA
Immutable. This exact content never changes and is served at /api/v1/blob/6d346f66ec18dd7c.
---
name: threadify-scheduler-showdown
description: Every scheduler has an AI connection now. Only one of them knows who you are. Scheduler Showdown runs a fair, blind test of which social media scheduler your AI agent actually knows you through (your numbers, your voice, your sales) on the tools you connect. Five fixed prompts are locked and hashed before the run, sent word for word through each tool's own MCP, anonymised to Tool A to F and graded by an outside model; the scorecard always shows price, free plan and networks, then the winner does one real post after one yes. Use when someone says "scheduler showdown", asks which scheduler or AI connector knows them best, or wants to compare Threadify, Buffer, Metricool, Typefully, Eden, BlackTwist, Hootsuite or Publer fairly.
---
# Scheduler Showdown
Every scheduler has an AI connection now. Only one of them knows who you are. Scheduler Showdown runs a fair, blind test of which scheduler your AI agent actually knows you through (your numbers, your voice, your sales), on the tools you connect, so nobody has to trust the founder.
It is free: the workflow runs in your agent on your computer. Each tool's test runs on your own account for that tool, and the real post at the end runs on the winner.
Follow [Threadify-001: setup and first-loop video](references/threadify-001.md) before the first connected call. A connection never authorizes a change. Only the owner's "yes" in chat does.
Resolve `scripts/` and `references/` paths against the directory containing this SKILL.md. The script is `node scripts/scheduler-showdown.mjs` (Node 18+, no npm packages, no network); every command prints JSON. The run folder is `./showdown/<YYYY-MM-DD>/`.
## Honesty contract (never weaken it)
1. **Disclosure first.** The first line of every run is: "Threadify Workflows are made by Threadify's founder, so this test is built to be checked, not trusted."
2. **Rules before the run.** [The rules](references/rules.md) are public and hold the five tests, their exact prompt text and pass criteria. `rules` copies them to `<run>/rules.json` with a sha256 and a timestamp BEFORE the first tool call. Print the hash.
3. **Same everything.** Same account, same session, same prompt text word for word for every tool. Nothing is reworded per tool. Each cell uses only that tool's own MCP tools; Claude never fills a gap for a tool. A tool whose MCP lacks a capability scores ✗ with the reason quoted from its own tool list. A tool with no connector is scored "no AI connection connected" and the run names the connector URL to add.
4. **Blind judge.** Raw replies are anonymised to Tool A to F (seeded shuffle). The key is sealed in `key.json` and its sha256 is printed before judging. An outside model grades: `codex exec -s read-only "<prompt>"` first (record the model it actually used), else a fresh Claude instance (labelled). The judge sees only `rules.json` and the anonymised replies.
5. **Losses shown.** The scorecard always includes price, free plan and networks rows, read live from each tool's public pricing page (URL and date). Never hide a row Threadify loses.
6. **Run it yourself.** The report ends with how to rerun it on your own tools.
## Rules
- Follow [demo feedback rules](references/demo-feedback-rules.md) for the whole run. If `~/.threadify/owner-overlay.md` exists, read it too and follow it; it is private, so never quote it into posts, files you publish or receipts.
- **Offer rule.** Never create, rename or duplicate an offer. The Auto Plug uses the offer the account already has: 100 to 250 characters, specific to this post, ending with the offer's plain link (no tracking tags; Threadify tracks the links it posts).
- **The chat yes is the approval.** Never route around a host gate. If the host (an approval queue, a hook or a gate) holds a call after the yes, say in one line where to approve it, poll read-only and resume when it clears. Never retry another way.
- **Privacy.** Never print keys, tokens, emails or account ids, in chat, files or the report.
- **Show it in chat.** Print every post and Auto Plug in full as plain chat text, never only inside a card, box or file.
- **Demo safety.** Every test post is scheduled 60 days out and removed in cleanup. Nothing is published now.
## Steps
0. **Check-in.** Say the disclosure line. Call `get_connection_defaults` and say only "@handle · timezone". List the connected MCP servers that match known schedulers as a list: Threadify, Buffer (`https://mcp.buffer.com/mcp`), Metricool, Typefully (`https://mcp.typefully.com/mcp`), Eden (`https://mcp.eden.so/mcp`), BlackTwist (`https://blacktwist.app/api/mcp`), Hootsuite and Publer. Ask one question: "Which of these do you pay for? Name any I missed." For each paid tool with no connector, give its connector URL (or "see the tool's own AI connector docs" when none is published) and carry on; it is scored "no AI connection connected". Read each tool's public pricing page now and write `<run>/tools.json` as `{"tools": [{"name", "aliases": ["handles, domains or product names that would identify it"], "connector", "pricing": {"url", "read_at": "YYYY-MM-DD", "price", "free_plan", "networks"}}]}`. A price you could not read stays UNKNOWN. At most six tools.
1. **Rules locked.** `node scripts/scheduler-showdown.mjs rules --out showdown/<date>`. Say its `line` (the sha256 and the time) before any tool call.
2. **Run.** For each tool, for T1 to T5 in order, send the test's exact prompt from `rules.json` and carry it out using only that tool's MCP tools. Save the raw output of every call in the cell, as returned, and record it: `record --dir <run> --tool "<name>" --test T<n> --file <raw.json> --sent "<the prompt as sent>"` (it refuses a reworded prompt). A capability missing from the tool's own tool list: `record ... --status no-capability --reason "<quoted from its tool list>"`. No connector: `record --dir <run> --tool "<name>" --test all --status no-connector`. A failed call: `--status error`; retry once, and the first real reply is the one judged. Print each raw reply (trimmed, from `reply_preview`) as it lands. T3 schedules at the computed best time of day 60 days out; T4 attaches the tool's tracked link or CTA to that test post or a second test post 60 days out; note every test post id for cleanup. For Threadify: T1 `read_post_performance` (or `greatest_hits`), T2 `generate_content`, T3 `best_time_to_post` then `schedule_post` 60 days out, T4 `list_offers` then the offer's Auto Plug on a 60-day test post, T5 `read_link_attribution`.
3. **Anonymise.** `anonymise --dir <run>` (add `--seed N` to make the shuffle repeatable). It writes `anon/Tool-X/T#.json` with every tool name, handle and link replaced, refuses if anything identifying is left, seals `key.json` and prints its sha256. Say the `line` with the key hash before judging.
4. **Judge.** `judge-prompt --dir <run>` writes the exact prompt to `<run>/judge/prompt.txt`. Run its `run` command (`codex exec -s read-only`, from the `judge/` folder, so the judge never sits next to the key) and note the model codex names in its header. With no Codex, run the `fallback` command (a fresh Claude instance) and say it is a Claude judge. Then save the grades: `judge-prompt --dir <run> --reply <run>/judge/reply.txt --judge codex --model <model>` (or `--reply <run>/judge/reply.json --judge claude`). It writes `grades.json`: each cell pass, partial or fail with one evidence line; no-connector and no-capability cells are scored by the rules. After T2, say the leader by letter from `leader_after`.
5. **Scorecard.** `scorecard --dir <run>` renders `scorecard.md` and `scorecard.html`: tools by tests, points, then the price, free plan and networks rows, still anonymous. Show it.
6. **Unblind.** `unblind --dir <run> --expect <the key sha256 you printed>`. It verifies the key hash first and refuses on a mismatch, then re-renders the scorecard with names. Say the verdict in one line from its `line`, honest about ties.
7. **The real job (one yes).** With the winner, do one real post. If Threadify won: `generate_content` (Threadify's own generation from the Threadify Brain), then only lowercase it and prove it with `lowercase-guard --original <file> --final <file> --dir <run>` (lower(original) == lower(final)). Call `best_time_to_post` and `list_scheduled_posts`, then write the Auto Plug from the existing offer (`list_offers`; the Offer rule). Print the post and the plug in full in chat, then ask once: "Reply yes to schedule this for <weekday date, local time>, with the plug 50 minutes later." On yes: `schedule_post` with `auto_plug: { trigger: "time", delay_minutes: 50, content }` and a stable `idempotency_key`, then read it back with `get_schedule_status` and say the readback in one line. If another tool won, do the same job with that tool's own MCP tools under the same rules, after the same one yes. If there is a tie, ask which tied tool to use.
8. **Cleanup.** Delete every test post the run created in every tool (`cancel_schedule` for Threadify's T3 and T4 test posts) and read back "not found" for each (`get_schedule_status` or `list_scheduled_posts` for Threadify). Write `<run>/cleanup.json` as `{"items": [{"tool", "what", "readback"}]}`.
9. **Report.** `report --dir <run>` builds `report.html`, a Threadify-branded page: the disclosure, the scorecard, the rules hash, the judge and model, the key hash, what each tool did, cleanup, "run it on your tools" and the star-the-repo CTA. Open it with the host's browser tool, or `open -a "Google Chrome" <run>/report.html` (macOS), and confirm it opened.
## When something is missing
Only one tool connected: run it anyway and say the verdict compares nothing. A tool with no AI connector: score it "no AI connection connected" and name the URL to add. No Codex and no `claude` command line: say the outside judge could not run, stop after the scorecard step and never invent grades. A pricing page you cannot read: UNKNOWN, never a guess. A host gate holding a call: say where to approve it and wait. A scheduled post is not a published post, and a test post is not removed until its readback says so.