Run Speaker Scout from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page reads the trigger and the pole, checks every slot brief, re-ranks the channel and depth menus, holds every claim to a source link and a date seen, scores each candidate Hot, Warm, Cold or Skip, ranks the survivors within each slot, runs the travel gates and lists the referral asks - all free, in scoutkit.js. The run writes the shortlist with the why behind each name, or the handoff packet; the page then holds the reply to its own board (scoutreply.js). It never searches the web, never writes the invitation (that is Speaker Ask), never invents a speaker fee or a long-list multiplier, and never reads anyone's identity from a name.
Base URL and the response shape
Every endpoint lives under https://api.skillsafe.ai/v1/app-api, and every response has one shape:
{ "ok": true, "data": { ... } }
{ "ok": false, "error": { "code": "...", "message": "..." } }
The token is minted for this app (the guest call takes {"slug":"speaker-scout"}), so no slug header is needed afterwards. Send it as Authorization: Bearer YOUR_TOKEN. The run body is the input object, sent bare.
| Status | Code | Meaning |
|---|---|---|
| 400 | validation_error | The body is not a JSON object, or a required key (task, event, slots, candidates, facts) is missing. notes may be an empty string. |
| 401 | unauthorized | No token, or a stale one. Mint a guest token or sign in again. |
| 402 | insufficient_credits | The balance is under min_credits. Price with /estimate first. |
| 403 | forbidden | A guest token tried to run: both lanes are metered and need a personal sign-in. |
| 404 | not_found | Unknown job id. |
| 429 | rate_limited | Back off and retry. |
| 5xx | server_error | Transient. Retry with the same Idempotency-Key so a retry never double-bills. |
The task field comes first
Two lanes, chosen by task:
shortlist- explain the shortlist slot by slot, for validation: the verdict, the trigger and its consequence, a line per slot brief, the two channel picks and the depth with a reason each, every slot's ranking (rank, name, score, the why behind it, its sources), the dropped names, the travel gates and the caveats.packet- the handoff to cold outreach (Speaker Ask): per slot the brief verbatim, the ranked names with the why, the evidence (claim, source, date seen) and the contact route, and the invited-review lane; then a referral ask per person or group to ask, a next step and a note.
A missing or unknown task is answered as shortlist. Both lanes send the same six fields; for the packet, the facts also carry the shortlist's summary, ranking and whys (the page fills these from the shortlist). The notes field may be an empty string.
The input
| Field | Required | What |
|---|---|---|
task | yes | shortlist or packet. If it is missing or neither, do shortlist and set "task": "shortlist". |
event | yes | the event basics and the interview, Q1 to Q9: name, dates, city, region, whether it sits outside the region's main hub, audience, languages, the as-of date, the trigger chosen and the call-closing date, the pole, the topic scope and missing themes, the shortlist-ready and confirm-by dates and whether the date is hard, one-off or compounding, the effort ceiling, the reach requirement and who is accountable, the budget line, the assets, the invited-review lane and the people to ask for referrals. |
slots | yes | the slot briefs, one per line. |
candidates | yes | the long list, each candidate with its slot, channel, availability, travel, contact route, the organizer's own why and notes, followed by its claims (source and date seen). |
notes | no | pasted notes such as a referral reply; may be empty. |
facts | yes | the page's verdict and readiness, the self-set lines, the trigger, the briefs with a must line under each, the two menus with their picks, moves and deletions and a must line for each reason, each candidate's qualification and score, the shortlist ranked per slot with sources, claim dates, contact route and a must line under every name, the dropped names, the gates, the long-list ratio, the review lane, the budget line, the referral asks with a must line under each, for the packet task the shortlist carried over, and every finding tagged [fix], [check] or [info]. |
retry_note | no | optional; if present, your previous reply was unusable - follow it. |
The rules the model applies
- Boundaries: this produces a ranked shortlist with the reasoning attached to every name - not a message, not a booking. The invitation belongs to event-speaker-cold-outreach (Speaker Ask); the open call to event-cfp-design; how many invited slots exist to event-format-selection; the invited lane's review to event-talk-selection.
- Two triggers: a supplement to a live call is ordinary practice - source against the gaps already named and re-check after the call closes. A replacement (the event closer than roughly ten weeks, or the call closing inside six weeks of it) means the whole program goes invited on the shortest timeline: vouched, fast-answering channels beat thorough ones.
- The pole: a community conference trades on the audience and the peer group, and a sponsor never buys a speaker slot; at a vendor or user conference invited content is the main intake and the offer can carry real budget. The evidence does not change.
- Gaps before people: every gap is a slot brief (theme, format, audience level, what success looks like) before any name. A name with no slot is a name, not a shortlist entry.
- Channels: use at least two, one reaching outside your circle; referral asks can never be the only channel. A hard date deletes the slow rung; a compounding mandate promotes it. Paid speaker-bureau booking is deleted whenever the budget cannot confirm a fee. A directory listing is consent to be found, not consent to be pitched: use the contact route the person published, never a community channel.
- Qualification: every claim carries a source link and the date it was seen. Delivery evidence (a recorded talk, a transcript, a long written piece) is the default for anyone on the shortlist; an organizer reference is the only rung that predicts reliability. Follower counts and audience-size metrics are deleted from the rubric.
- Scoring: Hot - strong fit, direct delivery evidence, available; Warm - good fit with evidence one step removed or availability unknown; Cold - loose fit or thin evidence; Skip - unavailable, a sponsor or independence conflict, a lead time the calendar cannot absorb, or a code-of-conduct concern. Skip leaves the list. Rank within each slot, never across the program.
- The why: the specific evidence, not an adjective - it is what the invitation is personalized with. Never fame, followers, audience size or draw.
- Travel: speakers need roughly four to six weeks to arrange travel - the floor, not the target. Visa and entry requirements are checked, never assumed; an answer after the confirm-by date is a Skip for this edition. When travel is unconfirmed, the candidate is being asked to fund their own trip - say so.
- Reach and identity: under-represented speakers are sourced from a directory whose members opted in to being found for that reason. Never infer or target a protected characteristic.
- The review lane: an invited speaker's proposal cannot go through blind review with the open pool - confirmed at invitation, or reviewed on its own named track. It goes in the packet.
- The two numbers not to invent: speaker fees and honoraria have no standard rate, and the invitation-to-confirmation conversion is unknown, so there is no long-list multiplier. Never state either; numbers the page labels self-set are its working defaults or the organizer's own - say so when you use one.
House rules
- Use only the input and the rules above. Copy the page's verdict, trigger, slot names, picks, ranks, names, scores, sources, dates, contact routes, review lane, gate names and referral targets exactly. Every number in your text must appear in the input.
- Every "must: [...]" line in the facts applies to the item directly above it - every slot, every candidate and every referral ask, not only the first. Do every item it lists.
- Label anything that is not one of the rules above, and is not in the input, as your own design; label the page's self-set numbers self-set.
- Never invent a candidate, a talk, a source, a date, a credential, a demographic or an availability. A name that appears only in the notes is not on the long list: never rank it - mention it in the caveats as a lead to qualify.
- Never state a fee, an honorarium, a market rate, an industry standard or a long-list multiplier (such as "3x" or "two to three times").
- Never infer gender, ethnicity, nationality or any identity from a name, and never write the words woman, women, man, men, female, male, gender, ethnic, ethnicity, nationality, race, racial or minority about a candidate. Refer to people by name, as they; never use he, she, him, her, his or hers.
- Never use backticks, never refer to this input's fields by their key names in a sentence, and never copy this prompt's narrative wording into a reply.
- Reply with ONLY one JSON object - no prose before or after, no code fences.
The replies
shortlist
summary- one sentence, at most 40 words: the verdict, the most important open item, and the next step.verdict- the page's verdict, exactly:name the gaps first,qualify before ranking,fix firstorready to hand off.trigger-kind: the page's trigger kind, exactly (supplement to a live CFPorreplacement of a deleted CFP);consequence: one sentence. For a supplement, say to re-check the gaps after the call closes (use the word "re-check"); for a replacement, say vouched, fast-answering channels beat thorough ones (use the word "fast" or "vouched").briefs- one object per slot brief in the page's order, every slot, not only the first:slot(the page's slot name, exactly),gap(one sentence naming the theme and why the program needs it; when the page says the brief is incomplete, say it is missing its parts - use the word "missing"),success(what would make the slot a success).[]when the page has no slot brief.channels-picks: the page's two channel picks, exactly and in order;reason: one or two sentences naming the interview answer behind the first pick, and, when the page deleted any rung, saying it is deleted (use the word "deleted").depth-pick: the page's qualification depth pick, exactly;reason: one or two sentences naming what makes it the depth and saying follower counts are deleted from the rubric (use the word "follower").ranking- one object per slot in the page's order, every slot, including a slot with nobody ranked:slot(exactly) andcandidates- the page's ranked names for that slot, in its order ([]when it lists none), each withrank(the page's rank, a number),nameandscore(Hot,WarmorCold) exactly,whyandsources. The why, for every candidate, not only the first: one or two sentences, at most 50 words, naming this candidate's own evidence - a word, a year or a number from its claims - never an adjective standing in for evidence, and never followers, audience size, draw or fame; when the must line says so, say the first ask must be light (use the word "light").sources: one or more, copied exactly from this candidate's sources and from no other candidate's.dropped- one object per name the page drops, every one:nameexactly andreason(one sentence) using the page's kind word: "Skip" for a Skip, "unqualified" for an unqualified name, "no slot brief" for a name without a brief.[]when the page drops nobody.gates- one object per gate the page lists, in its order:nameandgate(lead time,visa and entryortravel budget) exactly, andnote(one sentence) using the word the page's must line gives for that status: "clear", "floor", "Skip", "open", "covered", "fund" or "unconfirmed".[]when the page lists none.caveats- at most 5 short strings: the[fix]findings first in the page's order, then the most important[check]findings. Never empty when the page has a[fix]finding;[]otherwise when there is nothing to say.
{
"task": "shortlist",
"summary": "one sentence",
"verdict": "fix first",
"trigger": { "kind": "supplement to a live CFP", "consequence": "one sentence" },
"briefs": [ { "slot": "the page's slot", "gap": "one sentence", "success": "one sentence" } ],
"channels": { "picks": [ "the page's first pick", "the page's second pick" ], "reason": "one or two sentences" },
"depth": { "pick": "the page's pick", "reason": "one or two sentences" },
"ranking": [ { "slot": "the page's slot", "candidates": [ { "rank": 1, "name": "the page's name", "score": "Hot", "why": "the evidence, in one or two sentences", "sources": [ "the candidate's source" ] } ] } ],
"dropped": [ { "name": "the page's name", "reason": "one sentence" } ],
"gates": [ { "name": "the page's name", "gate": "lead time", "note": "one sentence" } ],
"caveats": [ "a caveat" ]
}
The page holds it to its own board: the verdict and the trigger kind exactly, with "re-check" for a supplement or "fast" or "vouched" for a replacement; one brief per slot ("missing" where the brief is incomplete); the two channel picks exactly and in order, never a deleted rung, with "deleted" in the reason when the menu deleted one; the depth pick exactly with "follower" in its reason; every slot's ranking exactly - rank, name and score - with a why of at most 50 words that names the candidate's own evidence (never adjectives, followers, audience size or draw; "light" for a quiet practitioner) and sources only from that candidate's own; the dropped names with "Skip", "unqualified" or "no slot brief"; every gate with its status word; caveats when the page has a fix; and no number, fee, multiplier, pronoun or identity the input does not hold.
packet
packet- one object per slot in the page's order, every slot, including a slot with nobody ranked;[]when the page has no slot brief:slot- the page's slot name, exactly.brief- the slot brief verbatim as ranked against: its kind, theme, format, audience level and success; it must contain the page's theme exactly.candidates- the page's ranked names for that slot, in its order ([]when it lists none), each withrank,nameandscoreexactly;why- for every candidate, not only the first, the same rules as the shortlist's why (use the carried why when the page carries one and it follows them);evidence- one or more objects, each withclaim(the claim in a few words),source(copied exactly from this candidate's sources) anddate(a date seen on this candidate's claims, YYYY-MM-DD);contact_route- the page's contact route, exactly ("none published" when the page says so).review_lane- the page's review lane; it must contain the words the page gives after "the packet's review lane must contain".referral_asks- one object per referral ask the page lists, in its order, every one;[]when the page lists none:to(the page's target, exactly) andmessage(at most 80 words) that names the page's theme for that ask exactly, says what kind of person the slot needs, asks for two or three names, and never names any candidate.next_step- one sentence naming event-speaker-cold-outreach or Speaker Ask.note- one sentence: when the page says "ready to hand off: no", begin with "Not ready to hand off:" and say what to fix first; otherwise say what happens next.
{
"task": "packet",
"packet": [ { "slot": "the page's slot", "brief": "kind - theme - format - audience level - success", "candidates": [ { "rank": 1, "name": "the page's name", "score": "Hot", "why": "the evidence", "evidence": [ { "claim": "a few words", "source": "the candidate's source", "date": "YYYY-MM-DD" } ], "contact_route": "the page's route" } ], "review_lane": "the page's review lane" } ],
"referral_asks": [ { "to": "the page's target", "message": "at most 80 words" } ],
"next_step": "one sentence",
"note": "one sentence"
}
The page requires one entry per slot with the slot's theme verbatim in the brief, the page's ranking with the same why rules, evidence whose every source and date come from that candidate's own claims, the page's contact route and review lane; one referral ask per target the page lists, naming its theme exactly, at most 80 words and never naming a candidate; a next step naming event-speaker-cold-outreach or Speaker Ask; and a note beginning "Not ready to hand off:" unless the page is ready.
Worked examples - every lane, every sample
These are the page's four free samples (fictional events, organizations, people, links and places). Each input is exactly what the page sends; each reply is the saved reply the sample replays, shipped unedited; the last line is the page's own check. The meetup's packet carries ranked names and a referral ask; the vendor summit's carries slots with empty candidate lists; the early sample's carries no slot and no ask.
A community conference, the call running thin - shortlist
Verdict: fix first; ready to hand off: no; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Organizer reference; 3 slots, 8 names, 6 ranked, 2 dropped; 6 fix-level findings.
Input:
{
"task": "shortlist",
"event": "Event: \"Riverbend Buildfair 2027\" | dates: 2027-04-15 to 2027-04-16 (2 days) | city: \"Riverbend\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 350 developers, mostly practitioners\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-01-15 | days from the as-of date to the event: 156\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Web and cloud engineering\" | missing themes: [\"supply-chain security\"; \"observability for beginners\"; \"accessibility testing\"]\nQ4 shortlist ready by: 2027-01-31 | confirm by: 2027-03-10 | a hard date: no\nQ5 edition: a compounding annual asset\nQ6 organizer hours for sourcing: 30 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: yes | speakers outside your country: no | accountable: \"Mira Solbrisk\"\nQ8 budget line: \"a ticket and travel\"\nQ9 assets: past speakers who would refer peers: yes | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"confirmed at invitation\" | people to ask for referrals: [\"Speakers from Buildfair 2026\"; \"Organizers of the Riverbend Cloud meetup\"]",
"slots": "Slot briefs (3), one per line:\n- slot 1: \"Opening keynote\" | kind: keynote | theme: \"Platform teams after year two\" | format: \"30 min talk, single track, no Q&A\" | audience level: \"senior practitioners and engineering managers\" | success: \"attendees leave with a shared vocabulary for the stall the rest of the day assumes\"\n- slot 2: \"Security session\" | kind: session | theme: \"Software supply-chain security in practice\" | format: \"40 min talk with Q&A\" | audience level: \"intermediate developers\" | success: \"every attendee leaves with one check to add to their build pipeline\"\n- slot 3: \"Beginner workshop\" | kind: workshop | theme: \"First steps with observability\" | format: \"90 min hands-on workshop, 30 seats\" | audience level: \"beginners with no tracing experience\" | success: \"every participant instruments a small service and reads a first trace\"",
"candidates": "Long list (8), each followed by its claims:\n- candidate 1: \"Dana Okafane\" | slot named: \"Opening keynote\" | channel: \"prior-talk review\" | availability: \"available on the dates (asked 2026-11-02)\" | travel: \"no\" | contact route: \"email published on okafane.example\" | organizer's why: \"Lived the year-two platform stall at a 400-engineer company and named it in the Devharrow 2026 recording\" | notes: \"none\"\n - claim 1: \"Keynote on platform teams after the honeymoon, Devharrow 2026, recorded; watched the first 12 minutes\" | source: \"https://devharrow.example/2026/okafane\" | date seen: 2026-10-20 | confidence: not labelled\n - claim 2: \"Long write-up on the platform adoption plateau\" | source: \"https://okafane.example/plateau\" | date seen: 2026-09-02 | confidence: not labelled\n- candidate 2: \"Lee Parlowe\" | slot named: \"Opening keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the Buildfair 2026 speaker list\" | organizer's why: \"Great speaker, very engaging and well known\" | notes: \"none\"\n - claim 1: \"Referral from Tomas Bergsell: ran platform engineering at a logistics firm\" | source: \"https://buildfair.example/2026/speakers\" | date seen: 2026-11-05 | confidence: not labelled\n- candidate 3: \"Ines Duarvel\" | slot named: \"Security session\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"yes, Westland, visa not needed\" | contact route: \"email on duarvel.example/contact\" | organizer's why: \"Ran the supply-chain workshop at Harborlight 2026 that ended with every attendee adding a provenance check\" | notes: \"none\"\n - claim 1: \"Supply-chain workshop on signing what you ship, Harborlight 2026, recorded\" | source: \"https://harborlight.example/2026/duarvel\" | date seen: 2026-10-28 | confidence: not labelled\n- candidate 4: \"Omar Haddrin\" | slot named: \"Security session\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"Maintains a software bill-of-materials tool the city services use\" | notes: \"none\"\n - claim 1: \"Directory profile lists talks on software supply-chain security\" | source: \"https://speakers-directory.example/haddrin\" | date seen: 2026-11-01 | confidence: not labelled\n - claim 2: \"Blog series on dependency pinning\" | source: \"https://haddrin.example/blog\" | date seen: none | confidence: not labelled\n- candidate 5: \"Priya Ramorel\" | slot named: \"Beginner workshop\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email published on ramorel.example\" | organizer's why: \"The OpenTrail Day 2026 recording shows a room of first-timers reading their first trace\" | notes: \"none\"\n - claim 1: \"Beginner observability workshop on tracing, OpenTrail Day 2026, recorded\" | source: \"https://opentrail.example/2026/ramorel\" | date seen: 2026-10-15 | confidence: not labelled\n - claim 2: \"Organizer reference: the OpenTrail Day organizer confirms the workshop arrived ready and adapted to the room\" | source: \"OpenTrail Day organizer, call\" | date seen: 2026-10-30 | confidence: not labelled\n- candidate 6: \"Sam Whitmarrow\" | slot named: \"Beginner workshop\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on the directory listing\" | organizer's why: \"Wrote the observability primer many beginners start from\" | notes: \"none\"\n - claim 1: \"Observability primer, a long-form guide\" | source: \"https://whitmarrow.example/primer\" | date seen: none | confidence: not labelled\n - claim 2: \"Directory listing: workshop facilitator\" | source: \"https://speakers-directory.example/whitmarrow\" | date seen: 2026-11-01 | confidence: not labelled\n- candidate 7: \"Grace Liuvane\" | slot named: \"Security session\" | channel: \"prior-talk review\" | availability: \"not available - speaking elsewhere that week\" | travel: \"no\" | contact route: \"email published on liuvane.example\" | organizer's why: \"The recorded dependency-confusion talk at SecConf 2026\" | notes: \"none\"\n - claim 1: \"Talk on dependency confusion attacks, SecConf 2026, recorded\" | source: \"https://secconf.example/2026/liuvane\" | date seen: 2026-09-12 | confidence: not labelled\n- candidate 8: \"Victor Lindquell\" | slot named: \"Lightning talks\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on lindquell.example\" | organizer's why: \"Build caching that cut the meetup's demo build from minutes to seconds\" | notes: \"none\"\n - claim 1: \"Recorded lightning talk on build caching, Riverbend Cloud meetup\" | source: \"https://riverbendcloud.example/talks/lindquell\" | date seen: 2026-10-02 | confidence: not labelled",
"notes": "Referral reply from Tomas Bergsell (Buildfair 2026 speaker): Ines Duarvel ran the supply-chain workshop at Harborlight and the room stayed to the end. Also worth asking Kenji Morivane.",
"facts": "Verdict: \"fix first\" | ready to hand off: no | fix-level findings: 6\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-15.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [\"Opening keynote\"; \"Security session\"; \"Beginner workshop\"]\n- brief 1: \"Opening keynote\" | kind: keynote | theme: \"Platform teams after year two\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Security session\" | kind: session | theme: \"Software supply-chain security in practice\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 3: \"Beginner workshop\" | kind: workshop | theme: \"First steps with observability\" | complete: yes | missing parts: [none]\n brief 3 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q9: past speakers who would refer peers\n- rung 2: \"Directory search\" | moved: promoted by Q7: the program must reach beyond your circle - a directory reaches outside it\n- rung 3: \"Community scouting\" | moved: promoted by Q5: a compounding mandate promotes the slow rungs - the pool outlives this edition; promoted by Q7: a stated under-represented-speakers goal with someone accountable (Mira Solbrisk)\n- rung 4: \"Prior-talk review\" | moved: promoted by a keynote slot concentrates the risk - prior-talk review one rung ahead of directory search\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel. Under-represented speakers: source from a directory whose members opted in to being found for that reason (speakerinnen.org for women+ speakers, for one) - never infer or target a protected characteristic, and never read anyone's identity from a name. Compounding: re-invite the strongest past deliverers before running any channel, with a ceiling on the returning share you write down, and keep one running roster across editions.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [prior-talk review 3; referral asks 3; directory search 2] | distinct channels used: 3\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Organizer reference\"\n- rung 1: \"Organizer reference\" | moved: made the pick by a keynote or headline slot; Q8: a candidate flown at real cost\n- rung 2: \"Fit screen\"\n- rung 3: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Dana Okafane\" | slot: \"Opening keynote\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 2: \"Lee Parlowe\" | slot: \"Opening keynote\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"one step removed\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed, availability unknown\n- candidate 3: \"Ines Duarvel\" | slot: \"Security session\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: yes | score: \"Warm\" | reason: good fit, direct delivery evidence; capped at Warm: the travel lead time sits inside the four-to-six-week floor\n- candidate 4: \"Omar Haddrin\" | slot: \"Security session\" | channel: directory search | complete claims: 1 of 2 | fit: strong | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Cold\" | reason: evidence too thin - the invitation would be guessing\n- candidate 5: \"Priya Ramorel\" | slot: \"Beginner workshop\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: yes | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 6: \"Sam Whitmarrow\" | slot: \"Beginner workshop\" | channel: directory search | complete claims: 1 of 2 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Cold\" | reason: loose fit: no sourced claim touches the brief's theme\n- candidate 7: \"Grace Liuvane\" | slot: \"Security session\" | channel: prior-talk review | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: unavailable | travels: no | score: \"Skip\" | reason: unavailable on the dates\n- candidate 8: \"Victor Lindquell\" | slot: \"no slot brief\" | channel: referral asks | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"none\" | reason: names the slot \"Lightning talks\", which has no brief - a name, not a shortlist entry\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Opening keynote\" | shortlisted: 2\n - rank 1 | name: \"Dana Okafane\" | score: \"Hot\" | sources: [\"https://devharrow.example/2026/okafane\"; \"https://okafane.example/plateau\"] | claim dates: [2026-10-20; 2026-09-02] | contact route: \"email published on okafane.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Lee Parlowe\" | score: \"Warm\" | sources: [\"https://buildfair.example/2026/speakers\"] | claim dates: [2026-11-05] | contact route: \"email via the Buildfair 2026 speaker list\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 2: \"Security session\" | shortlisted: 2\n - rank 1 | name: \"Ines Duarvel\" | score: \"Warm\" | sources: [\"https://harborlight.example/2026/duarvel\"] | claim dates: [2026-10-28] | contact route: \"email on duarvel.example/contact\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Omar Haddrin\" | score: \"Cold\" | sources: [\"https://speakers-directory.example/haddrin\"] | claim dates: [2026-11-01] | contact route: \"contact form on the directory listing\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 3: \"Beginner workshop\" | shortlisted: 2\n - rank 1 | name: \"Priya Ramorel\" | score: \"Hot\" | sources: [\"https://opentrail.example/2026/ramorel\"; \"OpenTrail Day organizer, call\"] | claim dates: [2026-10-15; 2026-10-30] | contact route: \"email published on ramorel.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Sam Whitmarrow\" | score: \"Cold\" | sources: [\"https://speakers-directory.example/whitmarrow\"] | claim dates: [2026-11-01] | contact route: \"email on the directory listing\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\nDropped (Skip, unqualified and no slot brief) - 2:\n- name: \"Grace Liuvane\" | kind: \"Skip\" | reason: unavailable on the dates\n must: [the reason uses the words \"Skip\"]\n- name: \"Victor Lindquell\" | kind: \"no slot brief\" | reason: names the slot \"Lightning talks\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 3:\n- name: \"Ines Duarvel\" | gate: \"lead time\" | status: floor | detail: 36 days from the confirm-by date 2027-03-10 to the event - inside the four-to-six-week floor, the minimum and not the target\n must: [the note uses the word \"floor\"]\n- name: \"Ines Duarvel\" | gate: \"visa and entry\" | status: clear | detail: checked: no visa needed for this route\n must: [the note uses the word \"clear\"]\n- name: \"Ines Duarvel\" | gate: \"travel budget\" | status: covered | detail: the budget line covers ticket and travel\n must: [the note uses the word \"covered\"]\nLong list: 8 names for 3 slots (2.7 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 3 of 6 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReach beyond the network (self-set): 4 of 6 shortlisted names came from a channel other than referrals.\nReview lane: \"confirmed at invitation\" | the packet's review lane must contain: \"confirmed at invitation\"\nBudget line (Q8): \"a ticket and travel\" | fee: none confirmed\nReferral asks - 2, in this order:\n- to: \"Speakers from Buildfair 2026\" | for slot: \"Opening keynote\" | theme: \"Platform teams after year two\" | audience level: \"senior practitioners and engineering managers\" | format: \"30 min talk, single track, no Q&A\"\n must: [name the theme \"Platform teams after year two\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\n- to: \"Organizers of the Riverbend Cloud meetup\" | for slot: \"Security session\" | theme: \"Software supply-chain security in practice\" | audience level: \"intermediate developers\" | format: \"40 min talk with Q&A\"\n must: [name the theme \"Software supply-chain security in practice\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nFindings (16):\n[fix] evidence_2 (qualify): \"Lee Parlowe\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[fix] why_adj_2 (why): \"Lee Parlowe\": the why \"Great speaker, very engaging and well known\" is adjectives, not evidence - name the talk, the piece or the work it rests on (word list self-set).\n[fix] claims_4 (qualify): \"Omar Haddrin\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Blog series on dependency pinning\") - every claim carries both, or it is not evidence.\n[fix] evidence_4 (qualify): \"Omar Haddrin\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[fix] claims_6 (qualify): \"Sam Whitmarrow\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Observability primer, a long-form guide\") - every claim carries both, or it is not evidence.\n[fix] evidence_6 (qualify): \"Sam Whitmarrow\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[check] theme_unbriefed (briefs): Q3: a missing theme has no slot brief yet: \"accessibility testing\" - brief it, or say it stays unfilled this edition.\n[check] floor_3 (gates): \"Ines Duarvel\": 36 days from the confirm-by date 2027-03-10 to the event - inside the four-to-six-week floor, the minimum and not the target - capped at Warm.\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-15.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] keynote_risk (briefs): A keynote concentrates the risk: prior-talk review moves ahead of directory search, and an organizer reference is sought for it.\n[info] validate (ranking): Present the shortlist slot by slot for validation before any invitation goes out - a name sent by mistake has already been asked.\n[info] reach_under (reach): Q7: under-represented speakers - source from a directory whose members opted in to being found for that reason; the page never reads anyone's identity from a name, and neither does the run.\n[info] reach_share (reach): Reach beyond the network (self-set measure, because Q7 set a goal): 4 of 6 shortlisted names came from a channel other than referrals - count it again on confirmed speakers.\n[info] longlist (longlist): Long list: 8 names for 3 slots (2.7 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "shortlist",
"summary": "Fix first: date two undated claims, replace one adjective-only why with evidence, and bring the names without delivery evidence up to it before the shortlist goes to outreach.",
"verdict": "fix first",
"trigger": {
"kind": "supplement to a live CFP",
"consequence": "Ordinary practice, not a crisis: source against the gaps already named and re-check them after the call closes on 2027-01-15."
},
"briefs": [
{
"slot": "Opening keynote",
"gap": "The program has nobody yet for Platform teams after year two, a 30 min talk, single track, no Q&A for senior practitioners and engineering managers.",
"success": "Attendees leave with a shared vocabulary for the stall the rest of the day assumes."
},
{
"slot": "Security session",
"gap": "The program has nobody yet for Software supply-chain security in practice, a 40 min talk with Q&A for intermediate developers.",
"success": "Every attendee leaves with one check to add to their build pipeline."
},
{
"slot": "Beginner workshop",
"gap": "The program has nobody yet for First steps with observability, a 90 min hands-on workshop, 30 seats for beginners with no tracing experience.",
"success": "Every participant instruments a small service and reads a first trace."
}
],
"channels": {
"picks": [
"Referral asks",
"Directory search"
],
"reason": "Q9: past speakers who would refer peers. Paid speaker-bureau booking is deleted: the budget cannot confirm a fee."
},
"depth": {
"pick": "Organizer reference",
"reason": "A keynote or headline slot. Follower counts are deleted from the rubric: they measure reach, not the talk."
},
"ranking": [
{
"slot": "Opening keynote",
"candidates": [
{
"rank": 1,
"name": "Dana Okafane",
"score": "Hot",
"why": "Lived the year-two platform stall at a 400-engineer company and named it in the recorded Devharrow 2026 keynote; the plateau write-up carries the argument this keynote has to open on.",
"sources": [
"https://devharrow.example/2026/okafane",
"https://okafane.example/plateau"
]
},
{
"rank": 2,
"name": "Lee Parlowe",
"score": "Warm",
"why": "Ran platform engineering at a logistics firm, per a referral from Tomas Bergsell; no recorded talk or write-up is sourced yet, so delivery is unproven.",
"sources": [
"https://buildfair.example/2026/speakers"
]
}
]
},
{
"slot": "Security session",
"candidates": [
{
"rank": 1,
"name": "Ines Duarvel",
"score": "Warm",
"why": "Ran the recorded supply-chain workshop at Harborlight 2026 on signing what you ship - the practical check this session has to leave with every attendee.",
"sources": [
"https://harborlight.example/2026/duarvel"
]
},
{
"rank": 2,
"name": "Omar Haddrin",
"score": "Cold",
"why": "A directory profile lists talks on software supply-chain security; no recorded talk or long piece is sourced and dated yet.",
"sources": [
"https://speakers-directory.example/haddrin"
]
}
]
},
{
"slot": "Beginner workshop",
"candidates": [
{
"rank": 1,
"name": "Priya Ramorel",
"score": "Hot",
"why": "The recorded beginner observability workshop at OpenTrail Day 2026 shows first-timers reading a first trace, and the OpenTrail Day organizer confirms it arrived ready.",
"sources": [
"https://opentrail.example/2026/ramorel",
"OpenTrail Day organizer, call"
]
},
{
"rank": 2,
"name": "Sam Whitmarrow",
"score": "Cold",
"why": "Listed in a directory as a workshop facilitator; the observability primer has no date seen yet, so nothing sourced shows the workshop itself.",
"sources": [
"https://speakers-directory.example/whitmarrow"
]
}
]
}
],
"dropped": [
{
"name": "Grace Liuvane",
"reason": "Skip: unavailable on the dates."
},
{
"name": "Victor Lindquell",
"reason": "No slot brief: names the slot \"Lightning talks\", which has no brief - a name, not a shortlist entry."
}
],
"gates": [
{
"name": "Ines Duarvel",
"gate": "lead time",
"note": "Inside the floor: 36 days from the confirm-by date 2027-03-10 to the event - inside the four-to-six-week floor, the minimum and not the target."
},
{
"name": "Ines Duarvel",
"gate": "visa and entry",
"note": "Clear: checked: no visa needed for this route."
},
{
"name": "Ines Duarvel",
"gate": "travel budget",
"note": "Covered: the budget line covers ticket and travel."
}
],
"caveats": [
"\"Lee Parlowe\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.",
"\"Lee Parlowe\": the why \"Great speaker, very engaging and well known\" is adjectives, not evidence - name the talk, the piece or the work it rests on (word list self-set).",
"\"Omar Haddrin\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Blog series on dependency pinning\") - every claim carries both, or it is not evidence.",
"\"Omar Haddrin\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.",
"\"Sam Whitmarrow\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Observability primer, a long-form guide\") - every claim carries both, or it is not evidence."
]
}
The page's check: kept - nothing to flag
A community conference, the call running thin - packet
Verdict: fix first; ready to hand off: no; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Organizer reference; 3 slots, 8 names, 6 ranked, 2 dropped; 6 fix-level findings.
Input:
{
"task": "packet",
"event": "Event: \"Riverbend Buildfair 2027\" | dates: 2027-04-15 to 2027-04-16 (2 days) | city: \"Riverbend\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 350 developers, mostly practitioners\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-01-15 | days from the as-of date to the event: 156\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Web and cloud engineering\" | missing themes: [\"supply-chain security\"; \"observability for beginners\"; \"accessibility testing\"]\nQ4 shortlist ready by: 2027-01-31 | confirm by: 2027-03-10 | a hard date: no\nQ5 edition: a compounding annual asset\nQ6 organizer hours for sourcing: 30 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: yes | speakers outside your country: no | accountable: \"Mira Solbrisk\"\nQ8 budget line: \"a ticket and travel\"\nQ9 assets: past speakers who would refer peers: yes | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"confirmed at invitation\" | people to ask for referrals: [\"Speakers from Buildfair 2026\"; \"Organizers of the Riverbend Cloud meetup\"]",
"slots": "Slot briefs (3), one per line:\n- slot 1: \"Opening keynote\" | kind: keynote | theme: \"Platform teams after year two\" | format: \"30 min talk, single track, no Q&A\" | audience level: \"senior practitioners and engineering managers\" | success: \"attendees leave with a shared vocabulary for the stall the rest of the day assumes\"\n- slot 2: \"Security session\" | kind: session | theme: \"Software supply-chain security in practice\" | format: \"40 min talk with Q&A\" | audience level: \"intermediate developers\" | success: \"every attendee leaves with one check to add to their build pipeline\"\n- slot 3: \"Beginner workshop\" | kind: workshop | theme: \"First steps with observability\" | format: \"90 min hands-on workshop, 30 seats\" | audience level: \"beginners with no tracing experience\" | success: \"every participant instruments a small service and reads a first trace\"",
"candidates": "Long list (8), each followed by its claims:\n- candidate 1: \"Dana Okafane\" | slot named: \"Opening keynote\" | channel: \"prior-talk review\" | availability: \"available on the dates (asked 2026-11-02)\" | travel: \"no\" | contact route: \"email published on okafane.example\" | organizer's why: \"Lived the year-two platform stall at a 400-engineer company and named it in the Devharrow 2026 recording\" | notes: \"none\"\n - claim 1: \"Keynote on platform teams after the honeymoon, Devharrow 2026, recorded; watched the first 12 minutes\" | source: \"https://devharrow.example/2026/okafane\" | date seen: 2026-10-20 | confidence: not labelled\n - claim 2: \"Long write-up on the platform adoption plateau\" | source: \"https://okafane.example/plateau\" | date seen: 2026-09-02 | confidence: not labelled\n- candidate 2: \"Lee Parlowe\" | slot named: \"Opening keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the Buildfair 2026 speaker list\" | organizer's why: \"Great speaker, very engaging and well known\" | notes: \"none\"\n - claim 1: \"Referral from Tomas Bergsell: ran platform engineering at a logistics firm\" | source: \"https://buildfair.example/2026/speakers\" | date seen: 2026-11-05 | confidence: not labelled\n- candidate 3: \"Ines Duarvel\" | slot named: \"Security session\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"yes, Westland, visa not needed\" | contact route: \"email on duarvel.example/contact\" | organizer's why: \"Ran the supply-chain workshop at Harborlight 2026 that ended with every attendee adding a provenance check\" | notes: \"none\"\n - claim 1: \"Supply-chain workshop on signing what you ship, Harborlight 2026, recorded\" | source: \"https://harborlight.example/2026/duarvel\" | date seen: 2026-10-28 | confidence: not labelled\n- candidate 4: \"Omar Haddrin\" | slot named: \"Security session\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"Maintains a software bill-of-materials tool the city services use\" | notes: \"none\"\n - claim 1: \"Directory profile lists talks on software supply-chain security\" | source: \"https://speakers-directory.example/haddrin\" | date seen: 2026-11-01 | confidence: not labelled\n - claim 2: \"Blog series on dependency pinning\" | source: \"https://haddrin.example/blog\" | date seen: none | confidence: not labelled\n- candidate 5: \"Priya Ramorel\" | slot named: \"Beginner workshop\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email published on ramorel.example\" | organizer's why: \"The OpenTrail Day 2026 recording shows a room of first-timers reading their first trace\" | notes: \"none\"\n - claim 1: \"Beginner observability workshop on tracing, OpenTrail Day 2026, recorded\" | source: \"https://opentrail.example/2026/ramorel\" | date seen: 2026-10-15 | confidence: not labelled\n - claim 2: \"Organizer reference: the OpenTrail Day organizer confirms the workshop arrived ready and adapted to the room\" | source: \"OpenTrail Day organizer, call\" | date seen: 2026-10-30 | confidence: not labelled\n- candidate 6: \"Sam Whitmarrow\" | slot named: \"Beginner workshop\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on the directory listing\" | organizer's why: \"Wrote the observability primer many beginners start from\" | notes: \"none\"\n - claim 1: \"Observability primer, a long-form guide\" | source: \"https://whitmarrow.example/primer\" | date seen: none | confidence: not labelled\n - claim 2: \"Directory listing: workshop facilitator\" | source: \"https://speakers-directory.example/whitmarrow\" | date seen: 2026-11-01 | confidence: not labelled\n- candidate 7: \"Grace Liuvane\" | slot named: \"Security session\" | channel: \"prior-talk review\" | availability: \"not available - speaking elsewhere that week\" | travel: \"no\" | contact route: \"email published on liuvane.example\" | organizer's why: \"The recorded dependency-confusion talk at SecConf 2026\" | notes: \"none\"\n - claim 1: \"Talk on dependency confusion attacks, SecConf 2026, recorded\" | source: \"https://secconf.example/2026/liuvane\" | date seen: 2026-09-12 | confidence: not labelled\n- candidate 8: \"Victor Lindquell\" | slot named: \"Lightning talks\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on lindquell.example\" | organizer's why: \"Build caching that cut the meetup's demo build from minutes to seconds\" | notes: \"none\"\n - claim 1: \"Recorded lightning talk on build caching, Riverbend Cloud meetup\" | source: \"https://riverbendcloud.example/talks/lindquell\" | date seen: 2026-10-02 | confidence: not labelled",
"notes": "Referral reply from Tomas Bergsell (Buildfair 2026 speaker): Ines Duarvel ran the supply-chain workshop at Harborlight and the room stayed to the end. Also worth asking Kenji Morivane.",
"facts": "Verdict: \"fix first\" | ready to hand off: no | fix-level findings: 6\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-15.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [\"Opening keynote\"; \"Security session\"; \"Beginner workshop\"]\n- brief 1: \"Opening keynote\" | kind: keynote | theme: \"Platform teams after year two\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Security session\" | kind: session | theme: \"Software supply-chain security in practice\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 3: \"Beginner workshop\" | kind: workshop | theme: \"First steps with observability\" | complete: yes | missing parts: [none]\n brief 3 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q9: past speakers who would refer peers\n- rung 2: \"Directory search\" | moved: promoted by Q7: the program must reach beyond your circle - a directory reaches outside it\n- rung 3: \"Community scouting\" | moved: promoted by Q5: a compounding mandate promotes the slow rungs - the pool outlives this edition; promoted by Q7: a stated under-represented-speakers goal with someone accountable (Mira Solbrisk)\n- rung 4: \"Prior-talk review\" | moved: promoted by a keynote slot concentrates the risk - prior-talk review one rung ahead of directory search\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel. Under-represented speakers: source from a directory whose members opted in to being found for that reason (speakerinnen.org for women+ speakers, for one) - never infer or target a protected characteristic, and never read anyone's identity from a name. Compounding: re-invite the strongest past deliverers before running any channel, with a ceiling on the returning share you write down, and keep one running roster across editions.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [prior-talk review 3; referral asks 3; directory search 2] | distinct channels used: 3\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Organizer reference\"\n- rung 1: \"Organizer reference\" | moved: made the pick by a keynote or headline slot; Q8: a candidate flown at real cost\n- rung 2: \"Fit screen\"\n- rung 3: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Dana Okafane\" | slot: \"Opening keynote\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 2: \"Lee Parlowe\" | slot: \"Opening keynote\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"one step removed\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed, availability unknown\n- candidate 3: \"Ines Duarvel\" | slot: \"Security session\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: yes | score: \"Warm\" | reason: good fit, direct delivery evidence; capped at Warm: the travel lead time sits inside the four-to-six-week floor\n- candidate 4: \"Omar Haddrin\" | slot: \"Security session\" | channel: directory search | complete claims: 1 of 2 | fit: strong | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Cold\" | reason: evidence too thin - the invitation would be guessing\n- candidate 5: \"Priya Ramorel\" | slot: \"Beginner workshop\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: yes | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 6: \"Sam Whitmarrow\" | slot: \"Beginner workshop\" | channel: directory search | complete claims: 1 of 2 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"Cold\" | reason: loose fit: no sourced claim touches the brief's theme\n- candidate 7: \"Grace Liuvane\" | slot: \"Security session\" | channel: prior-talk review | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: unavailable | travels: no | score: \"Skip\" | reason: unavailable on the dates\n- candidate 8: \"Victor Lindquell\" | slot: \"no slot brief\" | channel: referral asks | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"none\" | reason: names the slot \"Lightning talks\", which has no brief - a name, not a shortlist entry\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Opening keynote\" | shortlisted: 2\n - rank 1 | name: \"Dana Okafane\" | score: \"Hot\" | sources: [\"https://devharrow.example/2026/okafane\"; \"https://okafane.example/plateau\"] | claim dates: [2026-10-20; 2026-09-02] | contact route: \"email published on okafane.example\" | carried why: \"Lived the year-two platform stall at a 400-engineer company and named it in the recorded Devharrow 2026 keynote; the plateau write-up carries the argument this keynote has to open on.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Lee Parlowe\" | score: \"Warm\" | sources: [\"https://buildfair.example/2026/speakers\"] | claim dates: [2026-11-05] | contact route: \"email via the Buildfair 2026 speaker list\" | carried why: \"Ran platform engineering at a logistics firm, per a referral from Tomas Bergsell; no recorded talk or write-up is sourced yet, so delivery is unproven.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 2: \"Security session\" | shortlisted: 2\n - rank 1 | name: \"Ines Duarvel\" | score: \"Warm\" | sources: [\"https://harborlight.example/2026/duarvel\"] | claim dates: [2026-10-28] | contact route: \"email on duarvel.example/contact\" | carried why: \"Ran the recorded supply-chain workshop at Harborlight 2026 on signing what you ship - the practical check this session has to leave with every attendee.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Omar Haddrin\" | score: \"Cold\" | sources: [\"https://speakers-directory.example/haddrin\"] | claim dates: [2026-11-01] | contact route: \"contact form on the directory listing\" | carried why: \"A directory profile lists talks on software supply-chain security; no recorded talk or long piece is sourced and dated yet.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 3: \"Beginner workshop\" | shortlisted: 2\n - rank 1 | name: \"Priya Ramorel\" | score: \"Hot\" | sources: [\"https://opentrail.example/2026/ramorel\"; \"OpenTrail Day organizer, call\"] | claim dates: [2026-10-15; 2026-10-30] | contact route: \"email published on ramorel.example\" | carried why: \"The recorded beginner observability workshop at OpenTrail Day 2026 shows first-timers reading a first trace, and the OpenTrail Day organizer confirms it arrived ready.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Sam Whitmarrow\" | score: \"Cold\" | sources: [\"https://speakers-directory.example/whitmarrow\"] | claim dates: [2026-11-01] | contact route: \"email on the directory listing\" | carried why: \"Listed in a directory as a workshop facilitator; the observability primer has no date seen yet, so nothing sourced shows the workshop itself.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\nDropped (Skip, unqualified and no slot brief) - 2:\n- name: \"Grace Liuvane\" | kind: \"Skip\" | reason: unavailable on the dates\n must: [the reason uses the words \"Skip\"]\n- name: \"Victor Lindquell\" | kind: \"no slot brief\" | reason: names the slot \"Lightning talks\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 3:\n- name: \"Ines Duarvel\" | gate: \"lead time\" | status: floor | detail: 36 days from the confirm-by date 2027-03-10 to the event - inside the four-to-six-week floor, the minimum and not the target\n must: [the note uses the word \"floor\"]\n- name: \"Ines Duarvel\" | gate: \"visa and entry\" | status: clear | detail: checked: no visa needed for this route\n must: [the note uses the word \"clear\"]\n- name: \"Ines Duarvel\" | gate: \"travel budget\" | status: covered | detail: the budget line covers ticket and travel\n must: [the note uses the word \"covered\"]\nLong list: 8 names for 3 slots (2.7 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 3 of 6 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReach beyond the network (self-set): 4 of 6 shortlisted names came from a channel other than referrals.\nReview lane: \"confirmed at invitation\" | the packet's review lane must contain: \"confirmed at invitation\"\nBudget line (Q8): \"a ticket and travel\" | fee: none confirmed\nReferral asks - 2, in this order:\n- to: \"Speakers from Buildfair 2026\" | for slot: \"Opening keynote\" | theme: \"Platform teams after year two\" | audience level: \"senior practitioners and engineering managers\" | format: \"30 min talk, single track, no Q&A\"\n must: [name the theme \"Platform teams after year two\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\n- to: \"Organizers of the Riverbend Cloud meetup\" | for slot: \"Security session\" | theme: \"Software supply-chain security in practice\" | audience level: \"intermediate developers\" | format: \"40 min talk with Q&A\"\n must: [name the theme \"Software supply-chain security in practice\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nCarried from the shortlist: summary: \"Fix first: date two undated claims, replace one adjective-only why with evidence, and bring the names without delivery evidence up to it before the shortlist goes to outreach.\" | slots matching the page: 3 of 3\nFindings (16):\n[fix] evidence_2 (qualify): \"Lee Parlowe\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[fix] why_adj_2 (why): \"Lee Parlowe\": the why \"Great speaker, very engaging and well known\" is adjectives, not evidence - name the talk, the piece or the work it rests on (word list self-set).\n[fix] claims_4 (qualify): \"Omar Haddrin\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Blog series on dependency pinning\") - every claim carries both, or it is not evidence.\n[fix] evidence_4 (qualify): \"Omar Haddrin\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[fix] claims_6 (qualify): \"Sam Whitmarrow\": 1 claim of 2 lacks a date seen (YYYY-MM-DD) (\"Observability primer, a long-form guide\") - every claim carries both, or it is not evidence.\n[fix] evidence_6 (qualify): \"Sam Whitmarrow\" has no delivery evidence (a recorded talk, a transcript or a long written piece, sourced and dated) - a name goes to outreach with evidence or it does not go.\n[check] theme_unbriefed (briefs): Q3: a missing theme has no slot brief yet: \"accessibility testing\" - brief it, or say it stays unfilled this edition.\n[check] floor_3 (gates): \"Ines Duarvel\": 36 days from the confirm-by date 2027-03-10 to the event - inside the four-to-six-week floor, the minimum and not the target - capped at Warm.\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-15.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] keynote_risk (briefs): A keynote concentrates the risk: prior-talk review moves ahead of directory search, and an organizer reference is sought for it.\n[info] validate (ranking): Present the shortlist slot by slot for validation before any invitation goes out - a name sent by mistake has already been asked.\n[info] reach_under (reach): Q7: under-represented speakers - source from a directory whose members opted in to being found for that reason; the page never reads anyone's identity from a name, and neither does the run.\n[info] reach_share (reach): Reach beyond the network (self-set measure, because Q7 set a goal): 4 of 6 shortlisted names came from a channel other than referrals - count it again on confirmed speakers.\n[info] longlist (longlist): Long list: 8 names for 3 slots (2.7 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "packet",
"packet": [
{
"slot": "Opening keynote",
"brief": "keynote - Platform teams after year two - 30 min talk, single track, no Q&A - senior practitioners and engineering managers - success: attendees leave with a shared vocabulary for the stall the rest of the day assumes",
"candidates": [
{
"rank": 1,
"name": "Dana Okafane",
"score": "Hot",
"why": "Lived the year-two platform stall at a 400-engineer company and named it in the recorded Devharrow 2026 keynote; the plateau write-up carries the argument this keynote has to open on.",
"evidence": [
{
"claim": "Keynote on platform teams after the honeymoon, Devharrow 2026, recorded; watched the first 12 minutes",
"source": "https://devharrow.example/2026/okafane",
"date": "2026-10-20"
},
{
"claim": "Long write-up on the platform adoption plateau",
"source": "https://okafane.example/plateau",
"date": "2026-09-02"
}
],
"contact_route": "email published on okafane.example"
},
{
"rank": 2,
"name": "Lee Parlowe",
"score": "Warm",
"why": "Ran platform engineering at a logistics firm, per a referral from Tomas Bergsell; no recorded talk or write-up is sourced yet, so delivery is unproven.",
"evidence": [
{
"claim": "Referral from Tomas Bergsell: ran platform engineering at a logistics firm",
"source": "https://buildfair.example/2026/speakers",
"date": "2026-11-05"
}
],
"contact_route": "email via the Buildfair 2026 speaker list"
}
],
"review_lane": "Confirmed at invitation"
},
{
"slot": "Security session",
"brief": "session - Software supply-chain security in practice - 40 min talk with Q&A - intermediate developers - success: every attendee leaves with one check to add to their build pipeline",
"candidates": [
{
"rank": 1,
"name": "Ines Duarvel",
"score": "Warm",
"why": "Ran the recorded supply-chain workshop at Harborlight 2026 on signing what you ship - the practical check this session has to leave with every attendee.",
"evidence": [
{
"claim": "Supply-chain workshop on signing what you ship, Harborlight 2026, recorded",
"source": "https://harborlight.example/2026/duarvel",
"date": "2026-10-28"
}
],
"contact_route": "email on duarvel.example/contact"
},
{
"rank": 2,
"name": "Omar Haddrin",
"score": "Cold",
"why": "A directory profile lists talks on software supply-chain security; no recorded talk or long piece is sourced and dated yet.",
"evidence": [
{
"claim": "Directory profile lists talks on software supply-chain security",
"source": "https://speakers-directory.example/haddrin",
"date": "2026-11-01"
}
],
"contact_route": "contact form on the directory listing"
}
],
"review_lane": "Confirmed at invitation"
},
{
"slot": "Beginner workshop",
"brief": "workshop - First steps with observability - 90 min hands-on workshop, 30 seats - beginners with no tracing experience - success: every participant instruments a small service and reads a first trace",
"candidates": [
{
"rank": 1,
"name": "Priya Ramorel",
"score": "Hot",
"why": "The recorded beginner observability workshop at OpenTrail Day 2026 shows first-timers reading a first trace, and the OpenTrail Day organizer confirms it arrived ready.",
"evidence": [
{
"claim": "Beginner observability workshop on tracing, OpenTrail Day 2026, recorded",
"source": "https://opentrail.example/2026/ramorel",
"date": "2026-10-15"
},
{
"claim": "Organizer reference: the OpenTrail Day organizer confirms the workshop arrived ready and adapted to the room",
"source": "OpenTrail Day organizer, call",
"date": "2026-10-30"
}
],
"contact_route": "email published on ramorel.example"
},
{
"rank": 2,
"name": "Sam Whitmarrow",
"score": "Cold",
"why": "Listed in a directory as a workshop facilitator; the observability primer has no date seen yet, so nothing sourced shows the workshop itself.",
"evidence": [
{
"claim": "Directory listing: workshop facilitator",
"source": "https://speakers-directory.example/whitmarrow",
"date": "2026-11-01"
}
],
"contact_route": "email on the directory listing"
}
],
"review_lane": "Confirmed at invitation"
}
],
"referral_asks": [
{
"to": "Speakers from Buildfair 2026",
"message": "Hello - we are filling the Opening keynote at Riverbend Buildfair 2027: Platform teams after year two, a 30 min talk, single track, no Q&A for senior practitioners and engineering managers. Could you suggest two or three people who have done this work and can carry the room? A name and where they published it is plenty; we qualify every suggestion ourselves."
},
{
"to": "Organizers of the Riverbend Cloud meetup",
"message": "Hello - we are filling the Security session at Riverbend Buildfair 2027: Software supply-chain security in practice, a 40 min talk with Q&A for intermediate developers. Could you suggest two or three people who have done this work and can carry the room? A name and where they published it is plenty; we qualify every suggestion ourselves."
}
],
"next_step": "Once the fixes are in, hand the packet to event-speaker-cold-outreach (Speaker Ask) to write each invitation.",
"note": "Not ready to hand off: date the undated claims, replace the adjective-only why with evidence, and qualify every shortlisted name to delivery evidence first."
}
The page's check: kept - nothing to flag
A vendor summit, the call deleted 8 weeks out - shortlist
Verdict: qualify before ranking; ready to hand off: no; trigger: replacement of a deleted CFP; channel picks: Referral asks and Directory search; depth: Organizer reference; 4 slots, 5 names, 0 ranked, 5 dropped; 0 fix-level findings.
Input:
{
"task": "shortlist",
"event": "Event: \"Lumivane Cloud Summit 2027\" | dates: 2027-01-05 to 2027-01-06 (2 days) | city: \"Port Arden\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 600 customers and partners running Lumivane in production\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"replacement of a deleted CFP\" | call closes: not set | days from the as-of date to the event: 56\nQ2 who owns the event: \"vendor or user conference\"\nQ3 topic scope: \"Running Lumivane in production\" | missing themes: [\"migrations\"; \"cost control\"]\nQ4 shortlist ready by: 2026-11-20 | confirm by: 2026-12-04 | a hard date: yes\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 12 | who watches recorded talks: nobody | network to spend on referral asks: plenty\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"a ticket, travel and lodging\"\nQ9 assets: past speakers who would refer peers: no | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"reviewed on its own named track: Customer stories\" | people to ask for referrals: [\"The customer advisory board\"; \"The partner team\"]",
"slots": "Slot briefs (4), one per line:\n- slot 1: \"Day 1 keynote\" | kind: keynote | theme: \"Ten years of running Lumivane in production\" | format: \"25 min talk, main stage\" | audience level: \"every attendee, mixed levels\" | success: \"the room hears an honest production story, failures included, from a customer\"\n- slot 2: \"Migration session\" | kind: session | theme: \"Migrating a monolith onto Lumivane\" | format: \"35 min talk with Q&A\" | audience level: \"platform engineers mid-migration\" | success: \"attendees leave with the order of steps one customer actually used\"\n- slot 3: \"Cost session\" | kind: session | theme: \"Cost control at scale\" | format: \"35 min talk\" | audience level: \"engineering managers\" | success: \"one cost practice the audience can try the next week\"\n- slot 4: \"Partner panel seat\" | kind: panel | theme: \"Operating Lumivane for regulated industries\" | format: \"one of four seats on a 45 min panel\" | audience level: \"architects in finance and health\" | success: \"a practitioner voice beside the partner voices\"",
"candidates": "Long list (5), each followed by its claims:\n- candidate 1: \"Aiko Tanakoro\" | slot named: \"Day 1 keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the customer advisory board\" | organizer's why: \"Referred by the customer advisory board\" | notes: \"none\"\n - no claims recorded\n- candidate 2: \"Ben Okonvel\" | slot named: \"Migration session\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"yes, Eastland\" | contact route: \"email on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 3: \"Carla Mendavio\" | slot named: \"Cost session\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the partner team\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 4: \"David Brandmere\" | slot named: \"Partner panel seat\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 5: \"Elena Petrovane\" | slot named: \"Migration session\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the account team\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded",
"notes": "",
"facts": "Verdict: \"qualify before ranking\" | ready to hand off: no | fix-level findings: 0\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"replacement of a deleted CFP\" | chosen: \"replacement of a deleted CFP\" | the dates say: \"replacement of a deleted CFP\" | because: the event is 56 days away - closer than roughly ten weeks (70 days) | consequence: The whole program goes invited, sourced on the shortest possible timeline: vouched, fast-answering channels beat thorough ones.\n trigger consequence must: [say vouched, fast-answering channels beat thorough ones (the word \"fast\" or \"vouched\")]\nPole (Q2): \"vendor or user conference\" | note: Content is mostly invited by design, so this is the main intake rather than the backup channel: candidates weighted toward customers, partners and practitioners who use the technology, and the invitation can usually carry real budget. The evidence does not change; the pool and the offer do.\nSlot briefs - in this order: [\"Day 1 keynote\"; \"Migration session\"; \"Cost session\"; \"Partner panel seat\"]\n- brief 1: \"Day 1 keynote\" | kind: keynote | theme: \"Ten years of running Lumivane in production\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Migration session\" | kind: session | theme: \"Migrating a monolith onto Lumivane\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 3: \"Cost session\" | kind: session | theme: \"Cost control at scale\" | complete: yes | missing parts: [none]\n brief 3 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 4: \"Partner panel seat\" | kind: panel | theme: \"Operating Lumivane for regulated industries\" | complete: yes | missing parts: [none]\n brief 4 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q1: a replacement - vouched, fast-answering channels beat thorough ones; promoted by Q4: a hard date promotes the fast channels; promoted by Q6: a network you are willing to spend\n- rung 2: \"Directory search\" | moved: promoted by Q1: a replacement - a query returns names within a day; promoted by Q4: a hard date promotes the fast channels\n- rung 3: \"Prior-talk review\" | moved: demoted by Q4: a hard date - real hours per candidate; demoted by Q6: nobody will watch the recorded talks; promoted by a keynote slot concentrates the risk - prior-talk review one rung ahead of directory search\n- deleted, not demoted: \"Community scouting\" | reason: Q4: a hard date deletes the slow rung outright - weeks of reading a community before a name surfaces\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [referral asks 3; directory search 2] | distinct channels used: 2\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Organizer reference\"\n- rung 1: \"Organizer reference\" | moved: demoted by Q1: the shortest timeline - a reference call costs the most per candidate; made the pick by a keynote or headline slot; Q8: a candidate flown at real cost\n- rung 2: \"Fit screen\"\n- rung 3: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Aiko Tanakoro\" | slot: \"Day 1 keynote\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 2: \"Ben Okonvel\" | slot: \"Migration session\" | channel: directory search | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: yes | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 3: \"Carla Mendavio\" | slot: \"Cost session\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 4: \"David Brandmere\" | slot: \"Partner panel seat\" | channel: directory search | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 5: \"Elena Petrovane\" | slot: \"Migration session\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Day 1 keynote\" | shortlisted: 0 | candidates: none - an empty list\n- slot 2: \"Migration session\" | shortlisted: 0 | candidates: none - an empty list\n- slot 3: \"Cost session\" | shortlisted: 0 | candidates: none - an empty list\n- slot 4: \"Partner panel seat\" | shortlisted: 0 | candidates: none - an empty list\nDropped (Skip, unqualified and no slot brief) - 5:\n- name: \"Aiko Tanakoro\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Ben Okonvel\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Carla Mendavio\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"David Brandmere\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Elena Petrovane\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 5 names for 4 slots (1.3 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 0 of 0 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"reviewed on its own named track: Customer stories\" | the packet's review lane must contain: \"Customer stories\"\nBudget line (Q8): \"a ticket, travel and lodging\" | fee: none confirmed\nReferral asks - 2, in this order:\n- to: \"The customer advisory board\" | for slot: \"Day 1 keynote\" | theme: \"Ten years of running Lumivane in production\" | audience level: \"every attendee, mixed levels\" | format: \"25 min talk, main stage\"\n must: [name the theme \"Ten years of running Lumivane in production\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\n- to: \"The partner team\" | for slot: \"Migration session\" | theme: \"Migrating a monolith onto Lumivane\" | audience level: \"platform engineers mid-migration\" | format: \"35 min talk with Q&A\"\n must: [name the theme \"Migrating a monolith onto Lumivane\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nFindings (6):\n[info] trigger_replacement (trigger): Q1: replacement of a deleted CFP (the event is 56 days away - closer than roughly ten weeks (70 days)). The whole program goes invited, sourced on the shortest possible timeline: vouched, fast-answering channels beat thorough ones.\n[info] pole_vendor (pole): Q2: a vendor or user conference - Content is mostly invited by design, so this is the main intake rather than the backup channel.\n[info] hard_date (dates): Q4: a hard date - the fast channels are promoted and the slow one deleted outright.\n[info] keynote_risk (briefs): A keynote concentrates the risk: prior-talk review moves ahead of directory search, and an organizer reference is sought for it.\n[info] longlist (longlist): Long list: 5 names for 4 slots (1.3 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "shortlist",
"summary": "Qualify before ranking: five names on the long list and none with a sourced, dated claim yet - ask the advisory board and the partner team, then qualify each name before the hard date.",
"verdict": "qualify before ranking",
"trigger": {
"kind": "replacement of a deleted CFP",
"consequence": "The whole lineup is invited on the shortest timeline, so vouched, fast-answering channels beat thorough ones."
},
"briefs": [
{
"slot": "Day 1 keynote",
"gap": "The program has nobody yet for Ten years of running Lumivane in production, a 25 min talk, main stage for every attendee, mixed levels.",
"success": "The room hears an honest production story, failures included, from a customer."
},
{
"slot": "Migration session",
"gap": "The program has nobody yet for Migrating a monolith onto Lumivane, a 35 min talk with Q&A for platform engineers mid-migration.",
"success": "Attendees leave with the order of steps one customer actually used."
},
{
"slot": "Cost session",
"gap": "The program has nobody yet for Cost control at scale, a 35 min talk for engineering managers.",
"success": "One cost practice the audience can try the next week."
},
{
"slot": "Partner panel seat",
"gap": "The program has nobody yet for Operating Lumivane for regulated industries, a one of four seats on a 45 min panel for architects in finance and health.",
"success": "A practitioner voice beside the partner voices."
}
],
"channels": {
"picks": [
"Referral asks",
"Directory search"
],
"reason": "Q1: a replacement - vouched, fast-answering channels beat thorough ones. Community scouting is deleted: a hard date deletes the slow rung outright; Paid speaker-bureau booking is deleted: the budget cannot confirm a fee."
},
"depth": {
"pick": "Organizer reference",
"reason": "A keynote or headline slot. Follower counts are deleted from the rubric: they measure reach, not the talk."
},
"ranking": [
{
"slot": "Day 1 keynote",
"candidates": []
},
{
"slot": "Migration session",
"candidates": []
},
{
"slot": "Cost session",
"candidates": []
},
{
"slot": "Partner panel seat",
"candidates": []
}
],
"dropped": [
{
"name": "Aiko Tanakoro",
"reason": "Unqualified: no claim recorded yet - a guess someone else would act on."
},
{
"name": "Ben Okonvel",
"reason": "Unqualified: no claim recorded yet - a guess someone else would act on."
},
{
"name": "Carla Mendavio",
"reason": "Unqualified: no claim recorded yet - a guess someone else would act on."
},
{
"name": "David Brandmere",
"reason": "Unqualified: no claim recorded yet - a guess someone else would act on."
},
{
"name": "Elena Petrovane",
"reason": "Unqualified: no claim recorded yet - a guess someone else would act on."
}
],
"gates": [],
"caveats": []
}
The page's check: kept - nothing to flag
A vendor summit, the call deleted 8 weeks out - packet
Verdict: qualify before ranking; ready to hand off: no; trigger: replacement of a deleted CFP; channel picks: Referral asks and Directory search; depth: Organizer reference; 4 slots, 5 names, 0 ranked, 5 dropped; 0 fix-level findings.
Input:
{
"task": "packet",
"event": "Event: \"Lumivane Cloud Summit 2027\" | dates: 2027-01-05 to 2027-01-06 (2 days) | city: \"Port Arden\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 600 customers and partners running Lumivane in production\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"replacement of a deleted CFP\" | call closes: not set | days from the as-of date to the event: 56\nQ2 who owns the event: \"vendor or user conference\"\nQ3 topic scope: \"Running Lumivane in production\" | missing themes: [\"migrations\"; \"cost control\"]\nQ4 shortlist ready by: 2026-11-20 | confirm by: 2026-12-04 | a hard date: yes\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 12 | who watches recorded talks: nobody | network to spend on referral asks: plenty\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"a ticket, travel and lodging\"\nQ9 assets: past speakers who would refer peers: no | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"reviewed on its own named track: Customer stories\" | people to ask for referrals: [\"The customer advisory board\"; \"The partner team\"]",
"slots": "Slot briefs (4), one per line:\n- slot 1: \"Day 1 keynote\" | kind: keynote | theme: \"Ten years of running Lumivane in production\" | format: \"25 min talk, main stage\" | audience level: \"every attendee, mixed levels\" | success: \"the room hears an honest production story, failures included, from a customer\"\n- slot 2: \"Migration session\" | kind: session | theme: \"Migrating a monolith onto Lumivane\" | format: \"35 min talk with Q&A\" | audience level: \"platform engineers mid-migration\" | success: \"attendees leave with the order of steps one customer actually used\"\n- slot 3: \"Cost session\" | kind: session | theme: \"Cost control at scale\" | format: \"35 min talk\" | audience level: \"engineering managers\" | success: \"one cost practice the audience can try the next week\"\n- slot 4: \"Partner panel seat\" | kind: panel | theme: \"Operating Lumivane for regulated industries\" | format: \"one of four seats on a 45 min panel\" | audience level: \"architects in finance and health\" | success: \"a practitioner voice beside the partner voices\"",
"candidates": "Long list (5), each followed by its claims:\n- candidate 1: \"Aiko Tanakoro\" | slot named: \"Day 1 keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the customer advisory board\" | organizer's why: \"Referred by the customer advisory board\" | notes: \"none\"\n - no claims recorded\n- candidate 2: \"Ben Okonvel\" | slot named: \"Migration session\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"yes, Eastland\" | contact route: \"email on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 3: \"Carla Mendavio\" | slot named: \"Cost session\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the partner team\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 4: \"David Brandmere\" | slot named: \"Partner panel seat\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded\n- candidate 5: \"Elena Petrovane\" | slot named: \"Migration session\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email via the account team\" | organizer's why: \"none written\" | notes: \"none\"\n - no claims recorded",
"notes": "",
"facts": "Verdict: \"qualify before ranking\" | ready to hand off: no | fix-level findings: 0\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"replacement of a deleted CFP\" | chosen: \"replacement of a deleted CFP\" | the dates say: \"replacement of a deleted CFP\" | because: the event is 56 days away - closer than roughly ten weeks (70 days) | consequence: The whole program goes invited, sourced on the shortest possible timeline: vouched, fast-answering channels beat thorough ones.\n trigger consequence must: [say vouched, fast-answering channels beat thorough ones (the word \"fast\" or \"vouched\")]\nPole (Q2): \"vendor or user conference\" | note: Content is mostly invited by design, so this is the main intake rather than the backup channel: candidates weighted toward customers, partners and practitioners who use the technology, and the invitation can usually carry real budget. The evidence does not change; the pool and the offer do.\nSlot briefs - in this order: [\"Day 1 keynote\"; \"Migration session\"; \"Cost session\"; \"Partner panel seat\"]\n- brief 1: \"Day 1 keynote\" | kind: keynote | theme: \"Ten years of running Lumivane in production\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Migration session\" | kind: session | theme: \"Migrating a monolith onto Lumivane\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 3: \"Cost session\" | kind: session | theme: \"Cost control at scale\" | complete: yes | missing parts: [none]\n brief 3 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 4: \"Partner panel seat\" | kind: panel | theme: \"Operating Lumivane for regulated industries\" | complete: yes | missing parts: [none]\n brief 4 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q1: a replacement - vouched, fast-answering channels beat thorough ones; promoted by Q4: a hard date promotes the fast channels; promoted by Q6: a network you are willing to spend\n- rung 2: \"Directory search\" | moved: promoted by Q1: a replacement - a query returns names within a day; promoted by Q4: a hard date promotes the fast channels\n- rung 3: \"Prior-talk review\" | moved: demoted by Q4: a hard date - real hours per candidate; demoted by Q6: nobody will watch the recorded talks; promoted by a keynote slot concentrates the risk - prior-talk review one rung ahead of directory search\n- deleted, not demoted: \"Community scouting\" | reason: Q4: a hard date deletes the slow rung outright - weeks of reading a community before a name surfaces\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [referral asks 3; directory search 2] | distinct channels used: 2\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Organizer reference\"\n- rung 1: \"Organizer reference\" | moved: demoted by Q1: the shortest timeline - a reference call costs the most per candidate; made the pick by a keynote or headline slot; Q8: a candidate flown at real cost\n- rung 2: \"Fit screen\"\n- rung 3: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Aiko Tanakoro\" | slot: \"Day 1 keynote\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 2: \"Ben Okonvel\" | slot: \"Migration session\" | channel: directory search | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: yes | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 3: \"Carla Mendavio\" | slot: \"Cost session\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 4: \"David Brandmere\" | slot: \"Partner panel seat\" | channel: directory search | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\n- candidate 5: \"Elena Petrovane\" | slot: \"Migration session\" | channel: referral asks | complete claims: 0 of 0 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no claim recorded yet - a guess someone else would act on\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Day 1 keynote\" | shortlisted: 0 | candidates: none - an empty list\n- slot 2: \"Migration session\" | shortlisted: 0 | candidates: none - an empty list\n- slot 3: \"Cost session\" | shortlisted: 0 | candidates: none - an empty list\n- slot 4: \"Partner panel seat\" | shortlisted: 0 | candidates: none - an empty list\nDropped (Skip, unqualified and no slot brief) - 5:\n- name: \"Aiko Tanakoro\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Ben Okonvel\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Carla Mendavio\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"David Brandmere\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\n- name: \"Elena Petrovane\" | kind: \"unqualified\" | reason: no claim recorded yet - a guess someone else would act on\n must: [the reason uses the words \"unqualified\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 5 names for 4 slots (1.3 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 0 of 0 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"reviewed on its own named track: Customer stories\" | the packet's review lane must contain: \"Customer stories\"\nBudget line (Q8): \"a ticket, travel and lodging\" | fee: none confirmed\nReferral asks - 2, in this order:\n- to: \"The customer advisory board\" | for slot: \"Day 1 keynote\" | theme: \"Ten years of running Lumivane in production\" | audience level: \"every attendee, mixed levels\" | format: \"25 min talk, main stage\"\n must: [name the theme \"Ten years of running Lumivane in production\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\n- to: \"The partner team\" | for slot: \"Migration session\" | theme: \"Migrating a monolith onto Lumivane\" | audience level: \"platform engineers mid-migration\" | format: \"35 min talk with Q&A\"\n must: [name the theme \"Migrating a monolith onto Lumivane\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nCarried from the shortlist: summary: \"Qualify before ranking: five names on the long list and none with a sourced, dated claim yet - ask the advisory board and the partner team, then qualify each name before the hard date.\" | slots matching the page: 4 of 4\nFindings (6):\n[info] trigger_replacement (trigger): Q1: replacement of a deleted CFP (the event is 56 days away - closer than roughly ten weeks (70 days)). The whole program goes invited, sourced on the shortest possible timeline: vouched, fast-answering channels beat thorough ones.\n[info] pole_vendor (pole): Q2: a vendor or user conference - Content is mostly invited by design, so this is the main intake rather than the backup channel.\n[info] hard_date (dates): Q4: a hard date - the fast channels are promoted and the slow one deleted outright.\n[info] keynote_risk (briefs): A keynote concentrates the risk: prior-talk review moves ahead of directory search, and an organizer reference is sought for it.\n[info] longlist (longlist): Long list: 5 names for 4 slots (1.3 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "packet",
"packet": [
{
"slot": "Day 1 keynote",
"brief": "keynote - Ten years of running Lumivane in production - 25 min talk, main stage - every attendee, mixed levels - success: the room hears an honest production story, failures included, from a customer",
"candidates": [],
"review_lane": "Reviewed on its own named track: Customer stories"
},
{
"slot": "Migration session",
"brief": "session - Migrating a monolith onto Lumivane - 35 min talk with Q&A - platform engineers mid-migration - success: attendees leave with the order of steps one customer actually used",
"candidates": [],
"review_lane": "Reviewed on its own named track: Customer stories"
},
{
"slot": "Cost session",
"brief": "session - Cost control at scale - 35 min talk - engineering managers - success: one cost practice the audience can try the next week",
"candidates": [],
"review_lane": "Reviewed on its own named track: Customer stories"
},
{
"slot": "Partner panel seat",
"brief": "panel - Operating Lumivane for regulated industries - one of four seats on a 45 min panel - architects in finance and health - success: a practitioner voice beside the partner voices",
"candidates": [],
"review_lane": "Reviewed on its own named track: Customer stories"
}
],
"referral_asks": [
{
"to": "The customer advisory board",
"message": "Hello - we are filling the Day 1 keynote at Lumivane Cloud Summit 2027: Ten years of running Lumivane in production, a 25 min talk, main stage for every attendee, mixed levels. Could you suggest two or three people who have done this work and can carry the room? A name and where they published it is plenty; we qualify every suggestion ourselves."
},
{
"to": "The partner team",
"message": "Hello - we are filling the Migration session at Lumivane Cloud Summit 2027: Migrating a monolith onto Lumivane, a 35 min talk with Q&A for platform engineers mid-migration. Could you suggest two or three people who have done this work and can carry the room? A name and where they published it is plenty; we qualify every suggestion ourselves."
}
],
"next_step": "Once the fixes are in, hand the packet to event-speaker-cold-outreach (Speaker Ask) to write each invitation.",
"note": "Not ready to hand off: qualify the long list first - every name needs a sourced claim with a date seen before it can be ranked against a slot."
}
The page's check: kept - nothing to flag
A small meetup, ready to hand off - shortlist
Verdict: ready to hand off; ready to hand off: yes; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Delivery evidence; 2 slots, 4 names, 4 ranked, 0 dropped; 0 fix-level findings.
Input:
{
"task": "shortlist",
"event": "Event: \"Harbourside Go Meetup - March 2027\" | dates: 2027-03-18 (1 day) | city: \"Harbourside\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 60 Go developers\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-01-20 | days from the as-of date to the event: 128\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Go in production\" | missing themes: [\"testing\"; \"profiling\"]\nQ4 shortlist ready by: 2027-01-10 | confirm by: 2027-02-01 | a hard date: no\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 15 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"nothing beyond a ticket\"\nQ9 assets: past speakers who would refer peers: yes | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"confirmed at invitation\" | people to ask for referrals: [\"Organizers of the Northgate Go meetup\"]",
"slots": "Slot briefs (2), one per line:\n- slot 1: \"Main talk\" | kind: session | theme: \"Table-driven testing that scales\" | format: \"30 min talk with Q&A\" | audience level: \"intermediate Go developers\" | success: \"attendees leave with one testing pattern to apply on Monday\"\n- slot 2: \"Lightning workshop\" | kind: workshop | theme: \"Profiling Go services with pprof\" | format: \"45 min hands-on, 20 seats\" | audience level: \"developers who have never opened a profile\" | success: \"every participant reads one flame graph of their own\"",
"candidates": "Long list (4), each followed by its claims:\n- candidate 1: \"Rosa Albescor\" | slot named: \"Main talk\" | channel: \"prior-talk review\" | availability: \"available on the dates (asked 2026-11-03)\" | travel: \"no\" | contact route: \"email on albescor.example\" | organizer's why: \"Showed table-driven tests over a 900-case suite at GopherDay 2026\" | notes: \"none\"\n - claim 1: \"Talk on table-driven testing, GopherDay 2026, recorded; watched in full\" | source: \"https://gopherday.example/2026/albescor\" | date seen: 2026-10-12 | confidence: not labelled\n - claim 2: \"Write-up on testing a 900-case parser\" | source: \"https://albescor.example/tables\" | date seen: 2026-09-30 | confidence: not labelled\n- candidate 2: \"Tom Beckwyn\" | slot named: \"Main talk\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on beckwyn.example\" | organizer's why: \"Wrote the table-driven testing guide our members already cite\" | notes: \"none\"\n - claim 1: \"Long-form guide on table-driven testing in Go\" | source: \"https://beckwyn.example/testing-guide\" | date seen: 2026-08-14 | confidence: not labelled\n - claim 2: \"Referral from the Northgate Go meetup organizers\" | source: \"https://northgate-go.example/past-talks\" | date seen: 2026-11-04 | confidence: not labelled\n- candidate 3: \"Yusuf Demiroth\" | slot named: \"Lightning workshop\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on demiroth.example\" | organizer's why: \"Ran the pprof workshop at Go Day Eastland 2026 where every seat read a flame graph\" | notes: \"none\"\n - claim 1: \"Profiling workshop with pprof, Go Day Eastland 2026, recorded\" | source: \"https://godayeastland.example/2026/demiroth\" | date seen: 2026-10-05 | confidence: not labelled\n- candidate 4: \"Hana Kimsoro\" | slot named: \"Lightning workshop\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on kimsoro.example\" | organizer's why: \"Profiling write-up on cutting p99 latency in half with pprof\" | notes: \"quiet practitioner, first talk\"\n - claim 1: \"Blog post on profiling a Go service with pprof\" | source: \"https://kimsoro.example/pprof\" | date seen: 2026-07-21 | confidence: not labelled",
"notes": "",
"facts": "Verdict: \"ready to hand off\" | ready to hand off: yes | fix-level findings: 0\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-20.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [\"Main talk\"; \"Lightning workshop\"]\n- brief 1: \"Main talk\" | kind: session | theme: \"Table-driven testing that scales\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Lightning workshop\" | kind: workshop | theme: \"Profiling Go services with pprof\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q9: past speakers who would refer peers\n- rung 2: \"Directory search\"\n- rung 3: \"Prior-talk review\"\n- rung 4: \"Community scouting\"\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [prior-talk review 2; referral asks 2] | distinct channels used: 2\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Delivery evidence\"\n- rung 1: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- rung 2: \"Fit screen\"\n- rung 3: \"Organizer reference\"\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Rosa Albescor\" | slot: \"Main talk\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 2: \"Tom Beckwyn\" | slot: \"Main talk\" | channel: referral asks | complete claims: 2 of 2 | fit: strong | evidence: \"one step removed\" | delivery evidence: yes | organizer reference: no | availability: unknown | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed, availability unknown\n- candidate 3: \"Yusuf Demiroth\" | slot: \"Lightning workshop\" | channel: prior-talk review | complete claims: 1 of 1 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 4: \"Hana Kimsoro\" | slot: \"Lightning workshop\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"one step removed\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Main talk\" | shortlisted: 2\n - rank 1 | name: \"Rosa Albescor\" | score: \"Hot\" | sources: [\"https://gopherday.example/2026/albescor\"; \"https://albescor.example/tables\"] | claim dates: [2026-10-12; 2026-09-30] | contact route: \"email on albescor.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Tom Beckwyn\" | score: \"Warm\" | sources: [\"https://beckwyn.example/testing-guide\"; \"https://northgate-go.example/past-talks\"] | claim dates: [2026-08-14; 2026-11-04] | contact route: \"email on beckwyn.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 2: \"Lightning workshop\" | shortlisted: 2\n - rank 1 | name: \"Yusuf Demiroth\" | score: \"Hot\" | sources: [\"https://godayeastland.example/2026/demiroth\"] | claim dates: [2026-10-05] | contact route: \"email on demiroth.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Hana Kimsoro\" | score: \"Warm\" | sources: [\"https://kimsoro.example/pprof\"] | claim dates: [2026-07-21] | contact route: \"email on kimsoro.example\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words; say the first ask must be light (the word \"light\")]\nDropped (Skip, unqualified and no slot brief) - 0: none - an empty list\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 4 names for 2 slots (2 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 4 of 4 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"confirmed at invitation\" | the packet's review lane must contain: \"confirmed at invitation\"\nBudget line (Q8): \"nothing beyond a ticket\" | fee: none confirmed\nReferral asks - 1, in this order:\n- to: \"Organizers of the Northgate Go meetup\" | for slot: \"Main talk\" | theme: \"Table-driven testing that scales\" | audience level: \"intermediate Go developers\" | format: \"30 min talk with Q&A\"\n must: [name the theme \"Table-driven testing that scales\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [say what happens next]\nFindings (6):\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-20.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] quiet_4 (why): \"Hana Kimsoro\": a quiet practitioner - the first ask must be light (a short format, a co-speaker seat or a call to shape the topic).\n[info] validate (ranking): Present the shortlist slot by slot for validation before any invitation goes out - a name sent by mistake has already been asked.\n[info] longlist (longlist): Long list: 4 names for 2 slots (2 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "shortlist",
"summary": "Ready to hand off: both slots have a Hot and a Warm candidate on sourced, dated evidence; present the shortlist slot by slot, then send it to cold outreach.",
"verdict": "ready to hand off",
"trigger": {
"kind": "supplement to a live CFP",
"consequence": "Ordinary practice, not a crisis: source against the gaps already named and re-check them after the call closes on 2027-01-20."
},
"briefs": [
{
"slot": "Main talk",
"gap": "The program has nobody yet for Table-driven testing that scales, a 30 min talk with Q&A for intermediate Go developers.",
"success": "Attendees leave with one testing pattern to apply on Monday."
},
{
"slot": "Lightning workshop",
"gap": "The program has nobody yet for Profiling Go services with pprof, a 45 min hands-on, 20 seats for developers who have never opened a profile.",
"success": "Every participant reads one flame graph of their own."
}
],
"channels": {
"picks": [
"Referral asks",
"Directory search"
],
"reason": "Q9: past speakers who would refer peers. Paid speaker-bureau booking is deleted: the budget cannot confirm a fee."
},
"depth": {
"pick": "Delivery evidence",
"reason": "Step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go. Follower counts are deleted from the rubric: they measure reach, not the talk."
},
"ranking": [
{
"slot": "Main talk",
"candidates": [
{
"rank": 1,
"name": "Rosa Albescor",
"score": "Hot",
"why": "The recorded GopherDay 2026 talk on table-driven testing, watched in full, and the write-up on testing a 900-case parser show the pattern at the scale this slot promises.",
"sources": [
"https://gopherday.example/2026/albescor",
"https://albescor.example/tables"
]
},
{
"rank": 2,
"name": "Tom Beckwyn",
"score": "Warm",
"why": "Wrote the long-form guide on table-driven testing in Go that the Northgate Go meetup organizers point to; no recorded talk yet, so delivery rests on the writing.",
"sources": [
"https://beckwyn.example/testing-guide",
"https://northgate-go.example/past-talks"
]
}
]
},
{
"slot": "Lightning workshop",
"candidates": [
{
"rank": 1,
"name": "Yusuf Demiroth",
"score": "Hot",
"why": "Ran the recorded pprof profiling workshop at Go Day Eastland 2026 - the same hands-on format this slot needs.",
"sources": [
"https://godayeastland.example/2026/demiroth"
]
},
{
"rank": 2,
"name": "Hana Kimsoro",
"score": "Warm",
"why": "A blog post on profiling a Go service with pprof; a first talk, so the first ask must be light - a short format or a co-speaker seat.",
"sources": [
"https://kimsoro.example/pprof"
]
}
]
}
],
"dropped": [],
"gates": [],
"caveats": []
}
The page's check: kept - nothing to flag
A small meetup, ready to hand off - packet
Verdict: ready to hand off; ready to hand off: yes; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Delivery evidence; 2 slots, 4 names, 4 ranked, 0 dropped; 0 fix-level findings.
Input:
{
"task": "packet",
"event": "Event: \"Harbourside Go Meetup - March 2027\" | dates: 2027-03-18 (1 day) | city: \"Harbourside\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 60 Go developers\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-01-20 | days from the as-of date to the event: 128\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Go in production\" | missing themes: [\"testing\"; \"profiling\"]\nQ4 shortlist ready by: 2027-01-10 | confirm by: 2027-02-01 | a hard date: no\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 15 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"nothing beyond a ticket\"\nQ9 assets: past speakers who would refer peers: yes | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"confirmed at invitation\" | people to ask for referrals: [\"Organizers of the Northgate Go meetup\"]",
"slots": "Slot briefs (2), one per line:\n- slot 1: \"Main talk\" | kind: session | theme: \"Table-driven testing that scales\" | format: \"30 min talk with Q&A\" | audience level: \"intermediate Go developers\" | success: \"attendees leave with one testing pattern to apply on Monday\"\n- slot 2: \"Lightning workshop\" | kind: workshop | theme: \"Profiling Go services with pprof\" | format: \"45 min hands-on, 20 seats\" | audience level: \"developers who have never opened a profile\" | success: \"every participant reads one flame graph of their own\"",
"candidates": "Long list (4), each followed by its claims:\n- candidate 1: \"Rosa Albescor\" | slot named: \"Main talk\" | channel: \"prior-talk review\" | availability: \"available on the dates (asked 2026-11-03)\" | travel: \"no\" | contact route: \"email on albescor.example\" | organizer's why: \"Showed table-driven tests over a 900-case suite at GopherDay 2026\" | notes: \"none\"\n - claim 1: \"Talk on table-driven testing, GopherDay 2026, recorded; watched in full\" | source: \"https://gopherday.example/2026/albescor\" | date seen: 2026-10-12 | confidence: not labelled\n - claim 2: \"Write-up on testing a 900-case parser\" | source: \"https://albescor.example/tables\" | date seen: 2026-09-30 | confidence: not labelled\n- candidate 2: \"Tom Beckwyn\" | slot named: \"Main talk\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on beckwyn.example\" | organizer's why: \"Wrote the table-driven testing guide our members already cite\" | notes: \"none\"\n - claim 1: \"Long-form guide on table-driven testing in Go\" | source: \"https://beckwyn.example/testing-guide\" | date seen: 2026-08-14 | confidence: not labelled\n - claim 2: \"Referral from the Northgate Go meetup organizers\" | source: \"https://northgate-go.example/past-talks\" | date seen: 2026-11-04 | confidence: not labelled\n- candidate 3: \"Yusuf Demiroth\" | slot named: \"Lightning workshop\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on demiroth.example\" | organizer's why: \"Ran the pprof workshop at Go Day Eastland 2026 where every seat read a flame graph\" | notes: \"none\"\n - claim 1: \"Profiling workshop with pprof, Go Day Eastland 2026, recorded\" | source: \"https://godayeastland.example/2026/demiroth\" | date seen: 2026-10-05 | confidence: not labelled\n- candidate 4: \"Hana Kimsoro\" | slot named: \"Lightning workshop\" | channel: \"referral\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on kimsoro.example\" | organizer's why: \"Profiling write-up on cutting p99 latency in half with pprof\" | notes: \"quiet practitioner, first talk\"\n - claim 1: \"Blog post on profiling a Go service with pprof\" | source: \"https://kimsoro.example/pprof\" | date seen: 2026-07-21 | confidence: not labelled",
"notes": "",
"facts": "Verdict: \"ready to hand off\" | ready to hand off: yes | fix-level findings: 0\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-20.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [\"Main talk\"; \"Lightning workshop\"]\n- brief 1: \"Main talk\" | kind: session | theme: \"Table-driven testing that scales\" | complete: yes | missing parts: [none]\n brief 1 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\n- brief 2: \"Lightning workshop\" | kind: workshop | theme: \"Profiling Go services with pprof\" | complete: yes | missing parts: [none]\n brief 2 must: [slot copied exactly; gap: one sentence naming the theme and why the program needs it; success: what would make this slot a success]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\" | moved: promoted by Q9: past speakers who would refer peers\n- rung 2: \"Directory search\"\n- rung 3: \"Prior-talk review\"\n- rung 4: \"Community scouting\"\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [prior-talk review 2; referral asks 2] | distinct channels used: 2\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Delivery evidence\"\n- rung 1: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- rung 2: \"Fit screen\"\n- rung 3: \"Organizer reference\"\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Rosa Albescor\" | slot: \"Main talk\" | channel: prior-talk review | complete claims: 2 of 2 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 2: \"Tom Beckwyn\" | slot: \"Main talk\" | channel: referral asks | complete claims: 2 of 2 | fit: strong | evidence: \"one step removed\" | delivery evidence: yes | organizer reference: no | availability: unknown | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed, availability unknown\n- candidate 3: \"Yusuf Demiroth\" | slot: \"Lightning workshop\" | channel: prior-talk review | complete claims: 1 of 1 | fit: strong | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Hot\" | reason: strong fit, direct delivery evidence, available on the dates\n- candidate 4: \"Hana Kimsoro\" | slot: \"Lightning workshop\" | channel: referral asks | complete claims: 1 of 1 | fit: strong | evidence: \"one step removed\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"Warm\" | reason: good fit, evidence one step removed\nShortlist - ranked within each slot, never across the program:\n- slot 1: \"Main talk\" | shortlisted: 2\n - rank 1 | name: \"Rosa Albescor\" | score: \"Hot\" | sources: [\"https://gopherday.example/2026/albescor\"; \"https://albescor.example/tables\"] | claim dates: [2026-10-12; 2026-09-30] | contact route: \"email on albescor.example\" | carried why: \"The recorded GopherDay 2026 talk on table-driven testing, watched in full, and the write-up on testing a 900-case parser show the pattern at the scale this slot promises.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Tom Beckwyn\" | score: \"Warm\" | sources: [\"https://beckwyn.example/testing-guide\"; \"https://northgate-go.example/past-talks\"] | claim dates: [2026-08-14; 2026-11-04] | contact route: \"email on beckwyn.example\" | carried why: \"Wrote the long-form guide on table-driven testing in Go that the Northgate Go meetup organizers point to; no recorded talk yet, so delivery rests on the writing.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n- slot 2: \"Lightning workshop\" | shortlisted: 2\n - rank 1 | name: \"Yusuf Demiroth\" | score: \"Hot\" | sources: [\"https://godayeastland.example/2026/demiroth\"] | claim dates: [2026-10-05] | contact route: \"email on demiroth.example\" | carried why: \"Ran the recorded pprof profiling workshop at Go Day Eastland 2026 - the same hands-on format this slot needs.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words]\n - rank 2 | name: \"Hana Kimsoro\" | score: \"Warm\" | sources: [\"https://kimsoro.example/pprof\"] | claim dates: [2026-07-21] | contact route: \"email on kimsoro.example\" | carried why: \"A blog post on profiling a Go service with pprof; a first talk, so the first ask must be light - a short format or a co-speaker seat.\"\n must: [the why names this candidate's own evidence - a word, a year or a number from its claims; no adjective standing in for evidence and nothing about followers, audience size or draw; sources copied only from this candidate's sources; at most 50 words; say the first ask must be light (the word \"light\")]\nDropped (Skip, unqualified and no slot brief) - 0: none - an empty list\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 4 names for 2 slots (2 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 4 of 4 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"confirmed at invitation\" | the packet's review lane must contain: \"confirmed at invitation\"\nBudget line (Q8): \"nothing beyond a ticket\" | fee: none confirmed\nReferral asks - 1, in this order:\n- to: \"Organizers of the Northgate Go meetup\" | for slot: \"Main talk\" | theme: \"Table-driven testing that scales\" | audience level: \"intermediate Go developers\" | format: \"30 min talk with Q&A\"\n must: [name the theme \"Table-driven testing that scales\" exactly; say what kind of person the slot needs; ask for two or three names; never name any candidate; at most 80 words]\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [say what happens next]\nCarried from the shortlist: summary: \"Ready to hand off: both slots have a Hot and a Warm candidate on sourced, dated evidence; present the shortlist slot by slot, then send it to cold outreach.\" | slots matching the page: 2 of 2\nFindings (6):\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-01-20.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] quiet_4 (why): \"Hana Kimsoro\": a quiet practitioner - the first ask must be light (a short format, a co-speaker seat or a call to shape the topic).\n[info] validate (ranking): Present the shortlist slot by slot for validation before any invitation goes out - a name sent by mistake has already been asked.\n[info] longlist (longlist): Long list: 4 names for 2 slots (2 per slot). How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "packet",
"packet": [
{
"slot": "Main talk",
"brief": "session - Table-driven testing that scales - 30 min talk with Q&A - intermediate Go developers - success: attendees leave with one testing pattern to apply on Monday",
"candidates": [
{
"rank": 1,
"name": "Rosa Albescor",
"score": "Hot",
"why": "The recorded GopherDay 2026 talk on table-driven testing, watched in full, and the write-up on testing a 900-case parser show the pattern at the scale this slot promises.",
"evidence": [
{
"claim": "Talk on table-driven testing, GopherDay 2026, recorded; watched in full",
"source": "https://gopherday.example/2026/albescor",
"date": "2026-10-12"
},
{
"claim": "Write-up on testing a 900-case parser",
"source": "https://albescor.example/tables",
"date": "2026-09-30"
}
],
"contact_route": "email on albescor.example"
},
{
"rank": 2,
"name": "Tom Beckwyn",
"score": "Warm",
"why": "Wrote the long-form guide on table-driven testing in Go that the Northgate Go meetup organizers point to; no recorded talk yet, so delivery rests on the writing.",
"evidence": [
{
"claim": "Long-form guide on table-driven testing in Go",
"source": "https://beckwyn.example/testing-guide",
"date": "2026-08-14"
},
{
"claim": "Referral from the Northgate Go meetup organizers",
"source": "https://northgate-go.example/past-talks",
"date": "2026-11-04"
}
],
"contact_route": "email on beckwyn.example"
}
],
"review_lane": "Confirmed at invitation"
},
{
"slot": "Lightning workshop",
"brief": "workshop - Profiling Go services with pprof - 45 min hands-on, 20 seats - developers who have never opened a profile - success: every participant reads one flame graph of their own",
"candidates": [
{
"rank": 1,
"name": "Yusuf Demiroth",
"score": "Hot",
"why": "Ran the recorded pprof profiling workshop at Go Day Eastland 2026 - the same hands-on format this slot needs.",
"evidence": [
{
"claim": "Profiling workshop with pprof, Go Day Eastland 2026, recorded",
"source": "https://godayeastland.example/2026/demiroth",
"date": "2026-10-05"
}
],
"contact_route": "email on demiroth.example"
},
{
"rank": 2,
"name": "Hana Kimsoro",
"score": "Warm",
"why": "A blog post on profiling a Go service with pprof; a first talk, so the first ask must be light - a short format or a co-speaker seat.",
"evidence": [
{
"claim": "Blog post on profiling a Go service with pprof",
"source": "https://kimsoro.example/pprof",
"date": "2026-07-21"
}
],
"contact_route": "email on kimsoro.example"
}
],
"review_lane": "Confirmed at invitation"
}
],
"referral_asks": [
{
"to": "Organizers of the Northgate Go meetup",
"message": "Hello - we are filling the Main talk at Harbourside Go Meetup - March 2027: Table-driven testing that scales, a 30 min talk with Q&A for intermediate Go developers. Could you suggest two or three people who have done this work and can carry the room? A name and where they published it is plenty; we qualify every suggestion ourselves."
}
],
"next_step": "Hand this packet to event-speaker-cold-outreach (Speaker Ask) to write each invitation, one candidate per slot at a time.",
"note": "Present the shortlist slot by slot for validation this week, then hand the packet to Speaker Ask for the first invitations."
}
The page's check: kept - nothing to flag
Names entered before any slot brief - shortlist
Verdict: name the gaps first; ready to hand off: no; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Delivery evidence; 0 slots, 3 names, 0 ranked, 3 dropped; 2 fix-level findings.
Input:
{
"task": "shortlist",
"event": "Event: \"Northgate Data Day 2027\" | dates: 2027-06-10 (1 day) | city: \"Northgate\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 200 data engineers\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-03-01 | days from the as-of date to the event: 212\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Data engineering\" | missing themes: [\"data quality\"]\nQ4 shortlist ready by: 2027-03-15 | confirm by: 2027-04-15 | a hard date: no\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 20 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"nothing beyond a ticket\"\nQ9 assets: past speakers who would refer peers: no | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"not decided\" | people to ask for referrals: [\"Past speakers of Northgate Data Day\"]",
"slots": "Slot briefs: none written yet.",
"candidates": "Long list (3), each followed by its claims:\n- candidate 1: \"Maya Torrevane\" | slot named: \"keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on torrevane.example\" | organizer's why: \"Built the city's open-data pipeline\" | notes: \"none\"\n - claim 1: \"Talk on the Northgate open-data pipeline, recorded\" | source: \"https://datadays.example/2026/torrevane\" | date seen: 2026-09-20 | confidence: not labelled\n- candidate 2: \"Felix Granvesk\" | slot named: \"none\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - claim 1: \"Directory profile: data engineering talks\" | source: \"https://speakers-directory.example/granvesk\" | date seen: 2026-11-01 | confidence: not labelled\n- candidate 3: \"Lina Oseiro\" | slot named: \"data quality talk\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on oseiro.example\" | organizer's why: \"The data-contracts talk at Datavesper 2026 walked through a real rollback\" | notes: \"none\"\n - claim 1: \"Data contracts talk, Datavesper 2026, recorded\" | source: \"https://datavesper.example/2026/oseiro\" | date seen: 2026-10-01 | confidence: not labelled",
"notes": "",
"facts": "Verdict: \"name the gaps first\" | ready to hand off: no | fix-level findings: 2\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-03-01.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [none - no slot brief written]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\"\n- rung 2: \"Directory search\"\n- rung 3: \"Prior-talk review\"\n- rung 4: \"Community scouting\"\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [referral asks 1; directory search 1; prior-talk review 1] | distinct channels used: 3\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Delivery evidence\"\n- rung 1: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- rung 2: \"Fit screen\"\n- rung 3: \"Organizer reference\"\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Maya Torrevane\" | slot: \"no slot brief\" | channel: referral asks | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: names the slot \"keynote\", which has no brief - a name, not a shortlist entry\n- candidate 2: \"Felix Granvesk\" | slot: \"no slot brief\" | channel: directory search | complete claims: 1 of 1 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no slot named - a name, not a shortlist entry\n- candidate 3: \"Lina Oseiro\" | slot: \"no slot brief\" | channel: prior-talk review | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"none\" | reason: names the slot \"data quality talk\", which has no brief - a name, not a shortlist entry\nShortlist - ranked within each slot, never across the program:\n- no slot brief, so nothing is ranked\nDropped (Skip, unqualified and no slot brief) - 3:\n- name: \"Maya Torrevane\" | kind: \"no slot brief\" | reason: names the slot \"keynote\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\n- name: \"Felix Granvesk\" | kind: \"no slot brief\" | reason: no slot named - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\n- name: \"Lina Oseiro\" | kind: \"no slot brief\" | reason: names the slot \"data quality talk\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 3 names for 0 slots. How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 0 of 0 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"not decided\" | the packet's review lane must contain: \"not decided\"\nBudget line (Q8): \"nothing beyond a ticket\" | fee: none confirmed\nReferral asks - 0, in this order: none - an empty list\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nFindings (7):\n[fix] no_brief (briefs): Names before gaps: 3 candidates are entered and no slot brief - write each gap as a brief (theme, format, audience level, what success looks like) before naming anyone; an impressive list nobody can place produces invitations that cannot answer why me, why this event, why now.\n[fix] lane_undecided (lane): Decide the invited-review lane now: an invited speaker's proposal cannot go through blind review with the open pool - confirmed at invitation, or reviewed on its own named track. Write it into the packet.\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-03-01.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] longlist (longlist): Long list: 3 names for 0 slots. How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] asks_nobrief (referral): No complete slot brief to attach - a referral ask without the brief returns names nobody can place.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "shortlist",
"summary": "Name the gaps first: three people are entered and no slot brief exists, so nobody can be placed - write the briefs, then decide the review lane.",
"verdict": "name the gaps first",
"trigger": {
"kind": "supplement to a live CFP",
"consequence": "Ordinary practice, not a crisis: source against the gaps already named and re-check them after the call closes on 2027-03-01."
},
"briefs": [],
"channels": {
"picks": [
"Referral asks",
"Directory search"
],
"reason": "Vouched names within a day - the efficient default, and it returns your network's network. Paid speaker-bureau booking is deleted: the budget cannot confirm a fee."
},
"depth": {
"pick": "Delivery evidence",
"reason": "Step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go. Follower counts are deleted from the rubric: they measure reach, not the talk."
},
"ranking": [],
"dropped": [
{
"name": "Maya Torrevane",
"reason": "No slot brief: names the slot \"keynote\", which has no brief - a name, not a shortlist entry."
},
{
"name": "Felix Granvesk",
"reason": "No slot brief: no slot named - a name, not a shortlist entry."
},
{
"name": "Lina Oseiro",
"reason": "No slot brief: names the slot \"data quality talk\", which has no brief - a name, not a shortlist entry."
}
],
"gates": [],
"caveats": [
"Names before gaps: 3 candidates are entered and no slot brief - write each gap as a brief (theme, format, audience level, what success looks like) before naming anyone; an impressive list nobody can place produces invitations that cannot answer why me, why this event, why now.",
"Decide the invited-review lane now: an invited speaker's proposal cannot go through blind review with the open pool - confirmed at invitation, or reviewed on its own named track."
]
}
The page's check: kept - nothing to flag
Names entered before any slot brief - packet
Verdict: name the gaps first; ready to hand off: no; trigger: supplement to a live CFP; channel picks: Referral asks and Directory search; depth: Delivery evidence; 0 slots, 3 names, 0 ranked, 3 dropped; 2 fix-level findings.
Input:
{
"task": "packet",
"event": "Event: \"Northgate Data Day 2027\" | dates: 2027-06-10 (1 day) | city: \"Northgate\" | region: \"Eastland\" | outside the region's main hub: no | audience: \"about 200 data engineers\" | languages: \"English\" | as of: 2026-11-10\nQ1 trigger chosen: \"supplement to a live CFP\" | call closes: 2027-03-01 | days from the as-of date to the event: 212\nQ2 who owns the event: \"community conference\"\nQ3 topic scope: \"Data engineering\" | missing themes: [\"data quality\"]\nQ4 shortlist ready by: 2027-03-15 | confirm by: 2027-04-15 | a hard date: no\nQ5 edition: a one-off edition\nQ6 organizer hours for sourcing: 20 | who watches recorded talks: an organizer, in the hours above | network to spend on referral asks: some\nQ7 reach beyond the circle: new voices: no | under-represented speakers: no | speakers outside your country: no | accountable: \"nobody named\"\nQ8 budget line: \"nothing beyond a ticket\"\nQ9 assets: past speakers who would refer peers: no | an archive of last edition's talks: no | an active community you moderate: no | a program chair with a public reputation: no | last edition's late cancellation still fresh: no\nInvited-review lane: \"not decided\" | people to ask for referrals: [\"Past speakers of Northgate Data Day\"]",
"slots": "Slot briefs: none written yet.",
"candidates": "Long list (3), each followed by its claims:\n- candidate 1: \"Maya Torrevane\" | slot named: \"keynote\" | channel: \"referral\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"email on torrevane.example\" | organizer's why: \"Built the city's open-data pipeline\" | notes: \"none\"\n - claim 1: \"Talk on the Northgate open-data pipeline, recorded\" | source: \"https://datadays.example/2026/torrevane\" | date seen: 2026-09-20 | confidence: not labelled\n- candidate 2: \"Felix Granvesk\" | slot named: \"none\" | channel: \"directory\" | availability: \"not asked yet\" | travel: \"no\" | contact route: \"contact form on the directory listing\" | organizer's why: \"none written\" | notes: \"none\"\n - claim 1: \"Directory profile: data engineering talks\" | source: \"https://speakers-directory.example/granvesk\" | date seen: 2026-11-01 | confidence: not labelled\n- candidate 3: \"Lina Oseiro\" | slot named: \"data quality talk\" | channel: \"prior-talk review\" | availability: \"available on the dates\" | travel: \"no\" | contact route: \"email on oseiro.example\" | organizer's why: \"The data-contracts talk at Datavesper 2026 walked through a real rollback\" | notes: \"none\"\n - claim 1: \"Data contracts talk, Datavesper 2026, recorded\" | source: \"https://datavesper.example/2026/oseiro\" | date seen: 2026-10-01 | confidence: not labelled",
"notes": "",
"facts": "Verdict: \"name the gaps first\" | ready to hand off: no | fix-level findings: 2\nSelf-set lines: an evidence freshness window of 24 months - claims seen before 2024-11-09 count one step removed | a low effort ceiling under 10 organizer hours | a summary cap of 40 words | a why cap of 50 words | a referral ask cap of 80 words | the adjective list behind the adjective-only flag | fit read from the brief's theme words. The skill's own: a replacement when the event is closer than roughly ten weeks (70 days) or the call would close inside six weeks (42 days) of it | the travel lead-time floor of four to six weeks (28 to 42 days), the minimum and not the target. Never invented: a long-list multiplier or target, and any fee, honorarium or market rate.\nTrigger (Q1): kind: \"supplement to a live CFP\" | chosen: \"supplement to a live CFP\" | the dates say: \"supplement to a live CFP\" | consequence: Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-03-01.\n trigger consequence must: [say to re-check the gaps after the call closes (the word \"re-check\")]\nPole (Q2): \"community conference\" | note: An invitation trades on the audience and the peer group, because that is all it has. A sponsor never buys a speaker slot: a name that arrives through a sponsor relationship is qualified on the same evidence as any other, or it does not enter the shortlist.\nSlot briefs - in this order: [none - no slot brief written]\nSourcing channels - pick: \"Referral asks\"\n- rung 1: \"Referral asks\"\n- rung 2: \"Directory search\"\n- rung 3: \"Prior-talk review\"\n- rung 4: \"Community scouting\"\n- deleted, not demoted: \"Paid speaker-bureau booking\" | reason: Q8: the budget cannot confirm a fee - a bureau's whole mechanism is a negotiated fee, so it is unexecutable, not cheap\n- notes: Use at least two; no single channel reaches a whole program, and one of them has to reach outside your circle - referral asks can never be the only channel.\nChannel picks (the first two live rungs, in order): [\"Referral asks\"; \"Directory search\"] | the long list came through: [referral asks 1; directory search 1; prior-talk review 1] | distinct channels used: 3\n channel reason must: [name the interview answer behind the first pick; say a ruled-out rung is deleted (the word \"deleted\")]\nQualification depth - pick: \"Delivery evidence\"\n- rung 1: \"Delivery evidence\" | moved: made the pick by step 5: every shortlisted name is promoted to delivery evidence - it goes to outreach with evidence or it does not go\n- rung 2: \"Fit screen\"\n- rung 3: \"Organizer reference\"\n- deleted, not demoted: \"Follower counts and audience-size metrics\" | reason: deleted from the rubric, not ranked: follower counts measure reach, not the talk, and left anywhere on the page they become the tiebreak\n- notes: A reference call is a discussion about a named person with a third party: keep it factual, keep it to what the organizer observed, and never write down an opinion you would not repeat to the candidate.\n depth reason must: [name what makes this the depth; say follower counts are deleted from the rubric (the word \"follower\")]\nCandidates qualified, in input order:\n- candidate 1: \"Maya Torrevane\" | slot: \"no slot brief\" | channel: referral asks | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: names the slot \"keynote\", which has no brief - a name, not a shortlist entry\n- candidate 2: \"Felix Granvesk\" | slot: \"no slot brief\" | channel: directory search | complete claims: 1 of 1 | fit: loose | evidence: \"thin\" | delivery evidence: no | organizer reference: no | availability: unknown | travels: no | score: \"none\" | reason: no slot named - a name, not a shortlist entry\n- candidate 3: \"Lina Oseiro\" | slot: \"no slot brief\" | channel: prior-talk review | complete claims: 1 of 1 | fit: loose | evidence: \"direct delivery evidence\" | delivery evidence: yes | organizer reference: no | availability: available | travels: no | score: \"none\" | reason: names the slot \"data quality talk\", which has no brief - a name, not a shortlist entry\nShortlist - ranked within each slot, never across the program:\n- no slot brief, so nothing is ranked\nDropped (Skip, unqualified and no slot brief) - 3:\n- name: \"Maya Torrevane\" | kind: \"no slot brief\" | reason: names the slot \"keynote\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\n- name: \"Felix Granvesk\" | kind: \"no slot brief\" | reason: no slot named - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\n- name: \"Lina Oseiro\" | kind: \"no slot brief\" | reason: names the slot \"data quality talk\", which has no brief - a name, not a shortlist entry\n must: [the reason uses the words \"no slot brief\"]\nGates - every travelling candidate with a slot and a sourced claim, in this order - 0: none - an empty list\nLong list: 3 names for 0 slots. How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\nShortlist evidence completeness (self-set): 0 of 0 shortlisted names carry delivery evidence with a dated source - every name, or the shortlist is not finished.\nReview lane: \"not decided\" | the packet's review lane must contain: \"not decided\"\nBudget line (Q8): \"nothing beyond a ticket\" | fee: none confirmed\nReferral asks - 0, in this order: none - an empty list\nPacket next step must: [name \"event-speaker-cold-outreach\" or \"Speaker Ask\"] | packet note must: [begin \"Not ready to hand off:\" and say what to fix first]\nCarried from the shortlist: summary: \"Name the gaps first: three people are entered and no slot brief exists, so nobody can be placed - write the briefs, then decide the review lane.\" | slots matching the page: 0 of 0\nFindings (7):\n[fix] no_brief (briefs): Names before gaps: 3 candidates are entered and no slot brief - write each gap as a brief (theme, format, audience level, what success looks like) before naming anyone; an impressive list nobody can place produces invitations that cannot answer why me, why this event, why now.\n[fix] lane_undecided (lane): Decide the invited-review lane now: an invited speaker's proposal cannot go through blind review with the open pool - confirmed at invitation, or reviewed on its own named track. Write it into the packet.\n[info] trigger_supplement (trigger): Q1: supplement to a live CFP. Ordinary, expected practice, not a crisis: source against the gaps you can already name and re-check them after the call closes on 2027-03-01.\n[info] pole_community (pole): Q2: a community conference - An invitation trades on the audience and the peer group, because that is all it has.\n[info] longlist (longlist): Long list: 3 names for 0 slots. How much larger than the slot count has no defensible general answer: the lead-generation multiplier is a sales number, not a speaker benchmark, so the page sets no target. Your own past ratio: not entered - unknown. Record this edition's real ratio for the next one.\n[info] asks_nobrief (referral): No complete slot brief to attach - a referral ask without the brief returns names nobody can place.\n[info] no_search (scope): The page never searches the web and never writes the invitation: it qualifies what you enter, and the packet goes to event-speaker-cold-outreach (Speaker Ask)."
}
Reply:
{
"task": "packet",
"packet": [],
"referral_asks": [],
"next_step": "Once the fixes are in, hand the packet to event-speaker-cold-outreach (Speaker Ask) to write each invitation.",
"note": "Not ready to hand off: write a slot brief for each program gap and decide the invited-review lane before any name is ranked."
}
The page's check: kept - nothing to flag
The free handoff packet for the meetup sample
# Harbourside Go Meetup - March 2027 - speaker shortlist handoff packet
_For event-speaker-cold-outreach (Speaker Ask, https://speaker-ask.skillsafe.ai/). Verdict: ready to hand off. Present it slot by slot for validation before any invitation goes out._
## Main talk
**Slot brief (verbatim, as ranked against):** session - Table-driven testing that scales - 30 min talk with Q&A - intermediate Go developers - success: attendees leave with one testing pattern to apply on Monday
| Rank | Name | Score | Why | Evidence | Availability | Travel and lead time | Contact route |
|---|---|---|---|---|---|---|---|
| 1 | Rosa Albescor | Hot | The recorded GopherDay 2026 talk on table-driven testing, watched in full, and the write-up on testing a 900-case parser show the pattern at the scale this slot promises. | Talk on table-driven testing, GopherDay 2026, recorded; watched in full, seen 2026-10-12 (https://gopherday.example/2026/albescor); Write-up on testing a 900-case parser, seen 2026-09-30 (https://albescor.example/tables) | available (available on the dates (asked 2026-11-03)) | no travel | email on albescor.example |
| 2 | Tom Beckwyn | Warm | Wrote the long-form guide on table-driven testing in Go that the Northgate Go meetup organizers point to; no recorded talk yet, so delivery rests on the writing. | Long-form guide on table-driven testing in Go, seen 2026-08-14 (https://beckwyn.example/testing-guide); Referral from the Northgate Go meetup organizers, seen 2026-11-04 (https://northgate-go.example/past-talks) | unknown (not asked yet) | no travel | email on beckwyn.example |
Paste into Speaker Ask (name | score | why | evidence | contact route | travels | notes):
```
Rosa Albescor | Hot | The recorded GopherDay 2026 talk on table-driven testing, watched in full, and the write-up on testing a 900-case parser show the pattern at the scale this slot promises. | Talk on table-driven testing, GopherDay 2026, recorded; watched in full, seen 2026-10-12 (https://gopherday.example/2026/albescor); Write-up on testing a 900-case parser, seen 2026-09-30 (https://albescor.example/tables) | email on albescor.example | no | available on the dates
Tom Beckwyn | Warm | Wrote the long-form guide on table-driven testing in Go that the Northgate Go meetup organizers point to; no recorded talk yet, so delivery rests on the writing. | Long-form guide on table-driven testing in Go, seen 2026-08-14 (https://beckwyn.example/testing-guide); Referral from the Northgate Go meetup organizers, seen 2026-11-04 (https://northgate-go.example/past-talks) | email on beckwyn.example | no | availability unknown
```
## Lightning workshop
**Slot brief (verbatim, as ranked against):** workshop - Profiling Go services with pprof - 45 min hands-on, 20 seats - developers who have never opened a profile - success: every participant reads one flame graph of their own
| Rank | Name | Score | Why | Evidence | Availability | Travel and lead time | Contact route |
|---|---|---|---|---|---|---|---|
| 1 | Yusuf Demiroth | Hot | Ran the recorded pprof profiling workshop at Go Day Eastland 2026 - the same hands-on format this slot needs. | Profiling workshop with pprof, Go Day Eastland 2026, recorded, seen 2026-10-05 (https://godayeastland.example/2026/demiroth) | available (available on the dates) | no travel | email on demiroth.example |
| 2 | Hana Kimsoro | Warm | A blog post on profiling a Go service with pprof; a first talk, so the first ask must be light - a short format or a co-speaker seat. | Blog post on profiling a Go service with pprof, seen 2026-07-21 (https://kimsoro.example/pprof) | available (available on the dates) | no travel | email on kimsoro.example |
Paste into Speaker Ask (name | score | why | evidence | contact route | travels | notes):
```
Yusuf Demiroth | Hot | Ran the recorded pprof profiling workshop at Go Day Eastland 2026 - the same hands-on format this slot needs. | Profiling workshop with pprof, Go Day Eastland 2026, recorded, seen 2026-10-05 (https://godayeastland.example/2026/demiroth) | email on demiroth.example | no | available on the dates
Hana Kimsoro | Warm | A blog post on profiling a Go service with pprof; a first talk, so the first ask must be light - a short format or a co-speaker seat. | Blog post on profiling a Go service with pprof, seen 2026-07-21 (https://kimsoro.example/pprof) | email on kimsoro.example | no | available on the dates, quiet practitioner - the first ask must be light
```
## For every slot
- Budget offer, honestly stated: nothing beyond a ticket; fee: none
- Invited-review lane: confirmed at invitation
- Long list: 4 names for 2 slots (2 per slot) - your own past ratio: unknown
- Channels used: Prior-talk review (2), Referral asks (2)
Made with Speaker Scout - https://speaker-scout.skillsafe.ai/
Build the input yourself
Load the engine in node (global.window = global; require("./scoutkit.js"); require("./scoutreply.js")), then:
const K = ScoutKit, R = ScoutReply;
const f = K.form({ name: "My Meetup 2027", start: "2027-05-20", city: "Ourtown", region: "Ourland", asOf: "2027-02-01", trigger: "supplement", cfpClose: "2027-03-15",
reviewLane: "confirmed", slots: "Main talk | session | Testing at scale | 30 min talk | intermediate | one pattern to apply on Monday",
candidates: "A. Name | Main talk | prior-talk review | available | no | email on their site | their recorded talk on testing\n- Recorded talk on testing at scale | https://example.org/talk | 2027-01-10" });
// f.trigger, f.slots, f.channels, f.picks, f.depth, f.cands, f.shortlist, f.dropped, f.gates, f.longlist, f.lane, f.asks, f.verdict, f.findings
K.shortlistCsv(f); K.packetMd(f) // the free shortlist and handoff packet
const b = K.buildInput(f, "shortlist"); // or "packet"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "shortlist");
// R.check(reply, b) // {status: kept or flagged, notes}
// R.carryText(reply) // the lines the packet lane carries - set them as the carry field
Get a token for the steps below from /tokens.html.
Step 1 — a tiny client helper
One function that sends JSON and unwraps the response. Paste a personal token from /tokens.html, or leave it empty and mint a guest token in step 2.
BASE="https://api.skillsafe.ai/v1/app-api"
TOKEN="YOUR_TOKEN" # from https://speaker-scout.skillsafe.ai/tokens.html
api() { # api METHOD PATH [JSON-BODY]
curl -s -X "$1" "$BASE$2" -H "Content-Type: application/json" \
${TOKEN:+-H "Authorization: Bearer $TOKEN"} ${3:+--data "$3"}
}
import json, urllib.request
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://speaker-scout.skillsafe.ai/tokens.html
def api(method, path, body=None, headers=None):
req = urllib.request.Request(BASE + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Content-Type": "application/json", **({"Authorization": "Bearer " + TOKEN} if TOKEN else {}), **(headers or {})})
with urllib.request.urlopen(req) as r:
env = json.load(r)
if env.get("error"):
raise RuntimeError(env["error"])
return env["data"]
// speaker-scout.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "YOUR_TOKEN"; // from https://speaker-scout.skillsafe.ai/tokens.html
async function api(method, path, body, headers = {}) {
const r = await fetch(BASE + path, { method, headers: { "Content-Type": "application/json",
...(TOKEN ? { Authorization: "Bearer " + TOKEN } : {}), ...headers },
body: body === undefined ? undefined : JSON.stringify(body) });
const env = await r.json();
if (env.error) throw new Error(env.error.code + ": " + env.error.message);
return env.data;
}
package main
import ("bytes"; "encoding/json"; "fmt"; "net/http")
const base = "https://api.skillsafe.ai/v1/app-api"
var token = "YOUR_TOKEN" // from https://speaker-scout.skillsafe.ai/tokens.html
func api(method, path string, body any, headers map[string]string) (map[string]any, error) {
var buf bytes.Buffer
if body != nil { json.NewEncoder(&buf).Encode(body) }
req, _ := http.NewRequest(method, base+path, &buf)
req.Header.Set("Content-Type", "application/json")
if token != "" { req.Header.Set("Authorization", "Bearer "+token) }
for k, v := range headers { req.Header.Set(k, v) }
res, err := http.DefaultClient.Do(req)
if err != nil { return nil, err }
defer res.Body.Close()
var env struct { Data map[string]any; Error map[string]any }
json.NewDecoder(res.Body).Decode(&env)
if env.Error != nil { return nil, fmt.Errorf("%v", env.Error) }
return env.Data, nil
}
// SpeakerScout.java -- Java 17+, with com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.*;
import java.net.URI; import java.net.http.*; import java.util.*;
public class SpeakerScout {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "YOUR_TOKEN"; // from https://speaker-scout.skillsafe.ai/tokens.html
static final ObjectMapper M = new ObjectMapper();
static final HttpClient C = HttpClient.newHttpClient();
static JsonNode api(String method, String path, Object body, Map<String, String> headers) throws Exception {
var b = HttpRequest.newBuilder(URI.create(BASE + path)).header("Content-Type", "application/json");
if (!token.isEmpty()) b.header("Authorization", "Bearer " + token);
if (headers != null) headers.forEach(b::header);
b.method(method, body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(M.writeValueAsString(body)));
JsonNode env = M.readTree(C.send(b.build(), HttpResponse.BodyHandlers.ofString()).body());
if (env.hasNonNull("error")) throw new RuntimeException(env.get("error").toString());
return env.get("data");
}
}
require "json"
require "net/http"
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://speaker-scout.skillsafe.ai/tokens.html
def api(method, path, body = nil, headers = {})
uri = URI(BASE + path)
req = Net::HTTPGenericRequest.new(method, !body.nil?, true, uri.request_uri,
{ "Content-Type" => "application/json" }.merge(TOKEN.empty? ? {} : { "Authorization" => "Bearer #{TOKEN}" }).merge(headers))
req.body = JSON.generate(body) unless body.nil?
env = JSON.parse(Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body)
raise env["error"].to_s if env["error"]
env["data"]
end
<?php
const BASE = "https://api.skillsafe.ai/v1/app-api";
$TOKEN = "YOUR_TOKEN"; // from https://speaker-scout.skillsafe.ai/tokens.html
function api(string $method, string $path, $body = null, array $headers = []) {
global $TOKEN;
$h = ["Content-Type: application/json"];
if ($TOKEN) $h[] = "Authorization: Bearer $TOKEN";
foreach ($headers as $k => $v) $h[] = "$k: $v";
$ch = curl_init(BASE . $path);
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $h, CURLOPT_RETURNTRANSFER => true]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$env = json_decode(curl_exec($ch), true);
if (!empty($env["error"])) throw new Exception(json_encode($env["error"]));
return $env["data"];
}
// Program.cs -- .NET 6+ console app
using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Nodes;
static class Api {
public const string Base = "https://api.skillsafe.ai/v1/app-api";
public static string Token = "YOUR_TOKEN"; // from https://speaker-scout.skillsafe.ai/tokens.html
static readonly HttpClient C = new();
public static async Task<JsonNode?> Call(string method, string path, object? body = null, Dictionary<string, string>? headers = null) {
var req = new HttpRequestMessage(new HttpMethod(method), Base + path);
if (Token != "") req.Headers.Add("Authorization", "Bearer " + Token);
if (headers != null) foreach (var h in headers) req.Headers.Add(h.Key, h.Value);
if (body != null) req.Content = JsonContent.Create(body);
var env = JsonNode.Parse(await (await C.SendAsync(req)).Content.ReadAsStringAsync())!;
if (env["error"] is JsonNode e && e.GetValueKind() != JsonValueKind.Null) throw new Exception(e.ToJsonString());
return env["data"];
}
}
Step 2 — a token
A guest token is enough for /me and /estimate. A run is metered, so it needs a personal token: sign in on /tokens.html and copy it from there.
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN=$(curl -s -X POST "$BASE/guest" -H "Content-Type: application/json" -d '{"slug":"speaker-scout"}' | jq -r '.data.token')
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = ""
TOKEN = api("POST", "/guest", {"slug": "speaker-scout"})["token"]
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = "";
TOKEN = (await api("POST", "/guest", { slug: "speaker-scout" })).token;
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = ""
g, err := api("POST", "/guest", map[string]string{"slug": "speaker-scout"}, nil)
if err != nil { panic(err) }
token = g["token"].(string)
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = "";
token = api("POST", "/guest", Map.of("slug", "speaker-scout"), null).get("token").asText();
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN.replace("")
TOKEN.replace(api("POST", "/guest", { slug: "speaker-scout" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "speaker-scout"])["token"];
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
Api.Token = "";
Api.Token = (await Api.Call("POST", "/guest", new { slug = "speaker-scout" }))!["token"]!.GetValue<string>();
Step 3 — GET /me
Who the token is (subject_type: user or guest) and the credit balance.
api GET /me | jq '.data | {subject_type, credits}'
me = api("GET", "/me")
print(me["subject_type"], me.get("credits"))
const me = await api("GET", "/me");
console.log(me.subject_type, me.credits);
me, _ := api("GET", "/me", nil, nil)
fmt.Println(me["subject_type"], me["credits"])
JsonNode me = api("GET", "/me", null, null);
System.out.println(me.get("subject_type") + " " + me.get("credits"));
me = api("GET", "/me")
puts [me["subject_type"], me["credits"]].inspect
$me = api("GET", "/me");
echo $me["subject_type"], " ", $me["credits"] ?? "", "\n";
var me = await Api.Call("GET", "/me");
Console.WriteLine($"{me!["subject_type"]} {me["credits"]}");
Step 4 — POST /estimate
Free. The body is the run input itself, the bare object (never wrapped in {"input": ...}). hold_credits is a reservation, not the price; min_credits is what the balance must cover; model_alias reads gpt-terra.
# input.json: the run input object - {"task": "shortlist", "event": "Event: ... | dates: ... | region: ...", "slots": "Slot briefs (3) ...", "candidates": "Long list (8) ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}'
inp = json.load(open("input.json")) # {"task": "shortlist", "event": "Event: ... | dates: ... | region: ...", "slots": "Slot briefs (3) ...", "candidates": "Long list (8) ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
est = api("POST", "/estimate", inp)
print(est["hold_credits"], est["min_credits"], est["model"], est.get("warnings"))
import { readFileSync } from "node:fs";
const input = JSON.parse(readFileSync("input.json", "utf8")); // {task: "shortlist" or "packet", event, slots, candidates, notes, facts} (see the input table)
const est = await api("POST", "/estimate", input);
console.log(est.hold_credits, est.min_credits, est.model, est.warnings);
raw, _ := os.ReadFile("input.json") // add "os" to the imports
var input map[string]any
json.Unmarshal(raw, &input)
est, _ := api("POST", "/estimate", input, nil)
fmt.Println(est["hold_credits"], est["min_credits"], est["model"])
Map<String, Object> input = M.readValue(new java.io.File("input.json"), Map.class);
JsonNode est = api("POST", "/estimate", input, null);
System.out.println(est.get("hold_credits") + " " + est.get("min_credits") + " " + est.get("model"));
input = JSON.parse(File.read("input.json"))
est = api("POST", "/estimate", input)
puts [est["hold_credits"], est["min_credits"], est["model"]].inspect
$input = json_decode(file_get_contents("input.json"), true);
$est = api("POST", "/estimate", $input);
echo $est["hold_credits"], " ", $est["min_credits"], " ", $est["model"], "\n";
var input = JsonNode.Parse(File.ReadAllText("input.json"))!;
var est = await Api.Call("POST", "/estimate", input);
Console.WriteLine($"{est!["hold_credits"]} {est["min_credits"]} {est["model"]}");
Step 5 — POST /run, then poll the job
Send an Idempotency-Key built from the lane and the input: a retry with the same key never bills twice. The page uses speaker-scout:<task>:<inputHash>:a<attempt> - the lane is part of the key - and its one automatic reformat retry is a new attempt number, named in the page as one extra run. A shortlist carries summary, verdict, trigger, briefs, channels, depth, ranking, dropped, gates and caveats; a packet carries packet, referral_asks, next_step and note. The code below prints the headline of either.
KEY="speaker-scout:shortlist:$(shasum -a 256 input.json | cut -c1-16):a1"
JOB=$(curl -s -X POST "$BASE/run" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $KEY" --data @input.json | jq -r '.data.job_id')
while :; do
J=$(api GET "/jobs/$JOB"); S=$(echo "$J" | jq -r '.data.status')
case "$S" in succeeded|failed|cancelled) break;; esac; sleep 2
done
echo "$J" | jq -r '.data.output.output' > reply.json # one JSON object, the reply contract
echo "$J" | jq '.data | {charged_credits, truncated}'
jq -r '.verdict // .note, .summary // .next_step // empty' reply.json
jq -r '.ranking[]?.candidates[]? | "\(.rank) \(.name): \(.score)"' reply.json # a shortlist; a packet has .packet and .referral_asks
import hashlib, time
key = "speaker-scout:" + inp["task"] + ":" + hashlib.sha256(json.dumps(inp).encode()).hexdigest()[:16] + ":a1"
job = api("POST", "/run", inp, {"Idempotency-Key": key})
while True:
j = api("GET", "/jobs/" + job["job_id"])
if j["status"] in ("succeeded", "failed", "cancelled"):
break
time.sleep(2)
reply = json.loads(j["output"]["output"]) # the reply as one JSON object
print(j["charged_credits"], j.get("truncated"), reply.get("verdict") or reply.get("note"))
for s in reply.get("ranking") or reply.get("packet") or []:
for c in s["candidates"]:
print("-", s["slot"], c["rank"], c["name"], c["score"])
import { createHash } from "node:crypto";
const key = `speaker-scout:${input.task}:${createHash("sha256").update(JSON.stringify(input)).digest("hex").slice(0, 16)}:a1`;
const job = await api("POST", "/run", input, { "Idempotency-Key": key });
let j;
do { await new Promise((r) => setTimeout(r, 2000)); j = await api("GET", "/jobs/" + job.job_id); }
while (!["succeeded", "failed", "cancelled"].includes(j.status));
const reply = JSON.parse(j.output.output);
console.log(j.charged_credits, j.truncated, reply.verdict ?? reply.note);
for (const s of reply.ranking || reply.packet || []) for (const c of s.candidates) console.log("-", s.slot, c.rank, c.name, c.score);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "speaker-scout:" + input["task"].(string) + ":" + hex.EncodeToString(sum[:8]) + ":a1"
job, _ := api("POST", "/run", input, map[string]string{"Idempotency-Key": key})
var j map[string]any
for {
time.Sleep(2 * time.Second)
j, _ = api("GET", "/jobs/"+job["job_id"].(string), nil, nil)
if s := j["status"]; s == "succeeded" || s == "failed" || s == "cancelled" { break }
}
var reply map[string]any
json.Unmarshal([]byte(j["output"].(map[string]any)["output"].(string)), &reply)
fmt.Println(j["charged_credits"], j["truncated"], reply["verdict"], reply["note"])
slots, _ := reply["ranking"].([]any) // a shortlist's slots; a packet has packet and referral_asks
for _, s := range slots {
for _, c := range s.(map[string]any)["candidates"].([]any) {
fmt.Println("-", s.(map[string]any)["slot"], c.(map[string]any)["name"], c.(map[string]any)["score"])
}
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "speaker-scout:" + input.get("task") + ":" + HexFormat.of().formatHex(digest, 0, 8) + ":a1";
JsonNode job = api("POST", "/run", input, Map.of("Idempotency-Key", key)), j;
do { Thread.sleep(2000); j = api("GET", "/jobs/" + job.get("job_id").asText(), null, null); }
while (!Set.of("succeeded", "failed", "cancelled").contains(j.get("status").asText()));
JsonNode reply = M.readTree(j.get("output").get("output").asText());
System.out.println(j.get("charged_credits") + " " + reply.path("verdict").asText(reply.path("note").asText()));
for (JsonNode s : reply.path("ranking")) for (JsonNode c : s.path("candidates")) System.out.println("- " + s.path("slot").asText() + " " + c.path("name").asText() + " " + c.path("score").asText());
require "digest"
key = "speaker-scout:#{input["task"]}:#{Digest::SHA256.hexdigest(JSON.generate(input))[0, 16]}:a1"
job = api("POST", "/run", input, { "Idempotency-Key" => key })
j = nil
loop do
sleep 2
j = api("GET", "/jobs/#{job["job_id"]}")
break if %w[succeeded failed cancelled].include?(j["status"])
end
reply = JSON.parse(j["output"]["output"])
puts [j["charged_credits"], j["truncated"], reply["verdict"] || reply["note"]].inspect
(reply["ranking"] || reply["packet"] || []).each { |s| s["candidates"].each { |c| puts "- #{s["slot"]} #{c["name"]} #{c["score"]}" } }
$key = "speaker-scout:" . $input["task"] . ":" . substr(hash("sha256", json_encode($input)), 0, 16) . ":a1";
$job = api("POST", "/run", $input, ["Idempotency-Key" => $key]);
do { sleep(2); $j = api("GET", "/jobs/" . $job["job_id"]); }
while (!in_array($j["status"], ["succeeded", "failed", "cancelled"]));
$reply = json_decode($j["output"]["output"], true);
echo $j["charged_credits"], " ", ($reply["verdict"] ?? $reply["note"] ?? ""), "\n";
foreach ($reply["ranking"] ?? $reply["packet"] ?? [] as $s) foreach ($s["candidates"] as $c) echo "- ", $s["slot"], " ", $c["name"], " ", $c["score"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"speaker-scout:{input["task"]}:{Convert.ToHexString(digest, 0, 8).ToLowerInvariant()}:a1";
var job = await Api.Call("POST", "/run", input, new() { ["Idempotency-Key"] = key });
JsonNode j;
do { await Task.Delay(2000); j = (await Api.Call("GET", "/jobs/" + job!["job_id"]))!; }
while (!new[] { "succeeded", "failed", "cancelled" }.Contains(j["status"]!.GetValue<string>()));
var reply = JsonNode.Parse(j["output"]!["output"]!.GetValue<string>());
Console.WriteLine($"{j["charged_credits"]} {reply!["verdict"] ?? reply["note"]}");
foreach (var s in (reply["ranking"] ?? reply["packet"]) as JsonArray ?? new JsonArray()) foreach (var c in s!["candidates"]!.AsArray()) Console.WriteLine("- " + s["slot"] + " " + c!["name"] + " " + c["score"]);
Step 6 — POST /run-stream
The same run as Server-Sent Events, with the same input.json. Browsers receive progress ticks rather than text deltas; the final done event carries the reply.
# Server-Sent Events: tick/delta events while the job runs, then a final event with the job
curl -N -s -X POST "$BASE/run-stream" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: speaker-scout:shortlist:$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json
rev = json.load(open("input.json")) # the same run input as input.json: {"task": "shortlist", "event": "Event: ... | dates: ... | region: ...", "slots": "Slot briefs (3) ...", "candidates": "Long list (8) ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
req = urllib.request.Request(BASE + "/run-stream", method="POST", data=json.dumps(rev).encode(),
headers={"Content-Type": "application/json", "Authorization": "Bearer " + TOKEN,
"Idempotency-Key": "speaker-scout:shortlist:" + hashlib.sha256(json.dumps(rev).encode()).hexdigest()[:16] + ":a1"})
with urllib.request.urlopen(req) as r:
for line in r:
line = line.decode().strip()
if line.startswith("data:"):
print(line[5:].strip()[:200])
const rev = JSON.parse(readFileSync("input.json", "utf8"));
const r = await fetch(BASE + "/run-stream", { method: "POST", body: JSON.stringify(rev), headers: {
"Content-Type": "application/json", Authorization: "Bearer " + TOKEN,
"Idempotency-Key": `speaker-scout:shortlist:${createHash("sha256").update(JSON.stringify(rev)).digest("hex").slice(0, 16)}:a1` } });
const dec = new TextDecoder();
for await (const chunk of r.body) for (const line of dec.decode(chunk).split("\n"))
if (line.startsWith("data:")) console.log(line.slice(5).trim().slice(0, 200));
rraw, _ := os.ReadFile("input.json") // add "bufio", "strings" to the imports
rs := sha256.Sum256(rraw)
req, _ := http.NewRequest("POST", base+"/run-stream", bytes.NewReader(rraw))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Idempotency-Key", "speaker-scout:shortlist:"+hex.EncodeToString(rs[:8])+":a1")
res, _ := http.DefaultClient.Do(req)
sc := bufio.NewScanner(res.Body)
for sc.Scan() { if l := sc.Text(); strings.HasPrefix(l, "data:") { fmt.Println(l[5:]) } }
String rev = java.nio.file.Files.readString(java.nio.file.Path.of("input.json"));
var rd = java.security.MessageDigest.getInstance("SHA-256").digest(rev.getBytes());
var sreq = HttpRequest.newBuilder(URI.create(BASE + "/run-stream")).header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token).header("Idempotency-Key", "speaker-scout:shortlist:" + HexFormat.of().formatHex(rd, 0, 8) + ":a1")
.POST(HttpRequest.BodyPublishers.ofString(rev)).build();
C.send(sreq, HttpResponse.BodyHandlers.ofLines()).body().filter(l -> l.startsWith("data:")).forEach(System.out::println);
rev = File.read("input.json")
uri = URI(BASE + "/run-stream")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json", "Authorization" => "Bearer #{TOKEN}",
"Idempotency-Key" => "speaker-scout:shortlist:#{Digest::SHA256.hexdigest(rev)[0, 16]}:a1")
req.body = rev
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |h|
h.request(req) { |res| res.read_body { |chunk| chunk.each_line { |l| puts l if l.start_with?("data:") } } }
end
$rev = file_get_contents("input.json");
$ch = curl_init(BASE . "/run-stream");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $rev, CURLOPT_HTTPHEADER => [
"Content-Type: application/json", "Authorization: Bearer $TOKEN",
"Idempotency-Key: speaker-scout:shortlist:" . substr(hash("sha256", $rev), 0, 16) . ":a1"],
CURLOPT_WRITEFUNCTION => function ($ch, $chunk) { foreach (explode("\n", $chunk) as $l) if (str_starts_with($l, "data:")) echo $l, "\n"; return strlen($chunk); }]);
curl_exec($ch);
var rev = File.ReadAllText("input.json");
var rd = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(rev));
var sreq = new HttpRequestMessage(HttpMethod.Post, Api.Base + "/run-stream") { Content = new StringContent(rev, System.Text.Encoding.UTF8, "application/json") };
sreq.Headers.Add("Authorization", "Bearer " + Api.Token);
sreq.Headers.Add("Idempotency-Key", $"speaker-scout:shortlist:{Convert.ToHexString(rd, 0, 8).ToLowerInvariant()}:a1");
using var http = new HttpClient();
using var res = await http.SendAsync(sreq, HttpCompletionOption.ResponseHeadersRead);
using var rdr = new StreamReader(await res.Content.ReadAsStreamAsync());
for (string? l; (l = await rdr.ReadLineAsync()) != null;) if (l.StartsWith("data:")) Console.WriteLine(l);