← Speaker Ask
API
Tokens

Run Speaker Ask from your own code

Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page checks the sourcing packet, reads the pole, checks the travel gate, re-ranks the channel, the depth and the cadence for the candidate, lists what the first invitation must state, audits any pasted draft, dates the follow-ups with the angle each carries, reads the reply and writes the close-the-loop record - all free, in askkit.js. The run writes the invitation, or the follow-ups and the answer to a yes-but; the page then holds the reply to its own board (askreply.js). It writes the message, not the search, and never invents a fee, a market rate or a fact about the candidate. Run every invitation past a humanizer pass before sending.

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-ask"}), so no slug header is needed afterwards. Send it as Authorization: Bearer YOUR_TOKEN. The run body is the input object, sent bare.

StatusCodeMeaning
400validation_errorThe body is not a JSON object, or a required key (task, event, candidate, facts) is missing. draft and reply may be empty strings.
401unauthorizedNo token, or a stale one. Mint a guest token or sign in again.
402insufficient_creditsThe balance is under min_credits. Price with /estimate first.
403forbiddenA guest token tried to run: both lanes are metered and need a personal sign-in.
404not_foundUnknown job id.
429rate_limitedBack off and retry.
5xxserver_errorTransient. Retry with the same Idempotency-Key so a retry never double-bills.

The task field comes first

Two lanes, chosen by task:

A missing or unknown task is answered as invite. Both lanes send the same six fields; for the followup, the candidate field also carries the invitation's subject and the angles it already used (the page fills these from the invitation). The draft and reply fields may be empty strings.

The input

FieldRequiredWhat
taskyesinvite or followup. If it is missing or neither, do invite and set "task": "invite".
eventyesthe event basics and the interview, Q2 to Q9: name, dates, city, whether it is outside the region's main hub, format, audience, the slot and its length, recording, any reach figure, the slot brief and the review lane, the pole, the queue and approach, the send date, answer date and last usable yes, one-off or annual, the effort ceiling, the honest budget line with what it covers and does not, the negotiable list, and who has authority.
candidateyesthe candidate being written to now: name, score, whether they travel, the packet's why, evidence, published contact route and notes, how you found them, any warm connection, the other candidates for this slot (never named in a message), and - for the follow-ups - the subject and the angles carried from the invitation.
draftnoan existing draft invitation to rewrite; may be empty.
replynothe candidate's reply so far; may be empty.
factsyesthe page's verdict, the packet check, the pole, the travel gate, the three menus with their picks and deletions, the disclosure list with what each item must state and the words the message must carry, the message rules, the draft audit, the follow-up schedule with each touch's date, channel, angle and detail, the reply reading with each condition and its negotiable flag, the close-the-loop record, the labels the references attach, and every finding tagged [fix], [check] or [info].
retry_notenooptional; if present, your previous reply was unusable - follow it.

The rules the model applies

House rules

The replies

invite

  1. summary - one sentence, at most 40 words: the verdict, the most important open item, and the next step.
  2. verdict - the page's verdict, exactly: travel gate blocks, fix before writing, rewrite the draft, ready to send, follow up, answer the yes-but or close the loop.
  3. channel - pick: the page's first-touch channel pick, exactly; reason: one sentence naming the packet's route or the interview answer behind it.
  4. depth - pick: the page's personalization depth pick, exactly; reason: one sentence.
  5. subject - under 50 characters, leading with the specific theme or audience. Never "invitation to speak", "speaking invitation", "speaker invitation", "call for speakers", "call for papers" or "speaking opportunity", and none of the banned vocabulary.
  6. message - the invitation itself, at most 150 words counting the greeting and the sign-off, in the five-part structure, with line breaks between paragraphs: Greet by the first name in the packet ("Hi Alex,"). Never "Mr", "Ms", "Mrs", "Miss" or "Mx". The first sentence after the greeting says how you found them, naming their specific work in the words of the packet's why or the line saying how you found them. Make the ask in one sentence within the first three sentences: the slot, the event, the date. Say why this audience or room is worth their time, and give proof as evidence: the audience size in digits and, if the page gives one, the reach figure exactly as written. State the event's start date and the answer date, each as the page writes it (YYYY-MM-DD) or as a day and month ("4 June" or "June 4"), and name the city. Honest terms in plain words, taken from the budget line: the message must contain each word in the page's "words the message must carry" list (travel may be written as flights or trains; lodging as hotel, night or accommodation; ticket as pass). That list always includes "fee": say plainly whether a speaker fee is paid. If the budget is unconfirmed, use the word "unconfirmed". When the page's travel gate says the message must name the travel lead time, include a sentence containing the word "travel" and one of "weeks", "lead time", "arrange" or "book". End with one question that proposes the next step with a weekday or a date (for example "Would a 20-minute call on Thursday work?"). Never use the banned vocabulary, the phrases "let me know if", "came across your profile", "bumping this up", "did you see my email", "just following up", "circling back" or "just checking in", a superlative about the candidate ("leading expert", "foremost authority", "renowned speaker", "world-class", "recognized expert", "top name"), a link, a URL, the words "attached", "attachment", "logo" or "brochure", or another candidate's name. Sign off with a short signature: name, role, event. If a draft is pasted, the message is its rewrite: keep what the page's draft audit marks present, fix what it marks MISSING. If the verdict is "travel gate blocks", still write it, with the travel lead time named. If it is "fix before writing", write the best invitation the packet allows without inventing what is missing, and say what to fix in the caveats.
  7. disclosures - one object per item in the page's disclosure list, in its order: item (the page's item name exactly) and where (a short quote, a few words copied word for word from your message, that states it). Only when the verdict is "fix before writing" and an item cannot be stated without inventing it, set its where to "not stated" and say why in the caveats.
  8. words - the number of words in your message; the page recounts and accepts a count within 15 of its own.
  9. humanize_note - one sentence recommending a humanizer pass before sending; it must contain the word "humanizer".
  10. 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": "invite",
  "summary": "one sentence",
  "verdict": "ready to send",
  "channel": { "pick": "the page's channel pick", "reason": "one sentence" },
  "depth": { "pick": "the page's depth pick", "reason": "one sentence" },
  "subject": "under 50 characters",
  "message": "the invitation",
  "disclosures": [ { "item": "the page's item", "where": "a few words from the message" } ],
  "words": 120,
  "humanize_note": "one sentence",
  "caveats": [ "a caveat" ]
}

The page holds it to its own board: the verdict and both picks exactly (never a deleted rung); a subject under 50 characters that is not a generic "invitation to speak"; a message within 150 words whose first sentence after the greeting names how you found them, that states the event date, the city, the audience size, every word on the page's money list (always "fee", and "unconfirmed" when it is), the answer date, the travel lead time when the gate says so and a closing question with a weekday or a date; none of the banned vocabulary or phrases, no link, attachment, honorific, superlative or other candidate's name; one disclosure per page item in order, each quoting the message; a word count within 15 of the page's; a humanizer note; caveats when the page has fixes; and no number, market rate or gender the input does not hold.

followup

  1. schedule - one object per follow-up touch the page lists ("touch N | date ..."), in its order; [] when the page lists none (a single ask, the candidate has answered, or no new angle): touch (the page's touch number, as a string such as "2"), date, channel and angle - each exactly as the page writes it. message - at most 150 words. It carries the touch's angle using the page's detail for it (names and numbers copied exactly) and adds nothing untrue. Never a bump, never the banned vocabulary or phrases, never another candidate's name, and no link unless the input gives one. The touch the page marks "close-out: yes" closes out: say you will stop writing (use the word "stop" or "last note"), separate no to this slot from no to this event, and keep the door open for "next year" or "next edition" - no guilt, no deadline theatre.
  2. yes_but - null unless the page reads the reply as "yes, but". Then an object: conditions - one object per condition the page lists, in its order: condition (the page's name exactly), negotiable (yes or no, exactly as the page marks it) and answer (one sentence). When it is no, the answer says plainly that it is not available, using "no", "not", "can't", "cannot" or "don't"; when it is yes, say what you can offer from the negotiable list. reply_message - the reply to send, at most 150 words, answering every condition. When a fee is asked for, use the word "fee" and answer from the budget line ("We don't have a speaker-fee budget this year - I'd rather say that plainly than negotiate around it" is the shape when there is none); never a market rate; if the candidate named a number, ask what it covers. authority_note - when the page says "authority note needed: yes", one sentence naming the person (the page's "who" up to any comma) and the turnaround exactly as quoted; otherwise "".
  3. close - record and referral_ask: When the page reads the reply as "yes" or "yes, but": record is the written confirmation in one or two sentences - the slot, the date, the length, the format, what the event pays and, with the words "does not", what it does not pay, the travel and lodging terms, the recording terms (use the word "recording"), the title and abstract deadline, and the review lane exactly as the page writes it; for a yes-but, with the agreed conditions written in. referral_ask is "". When it is "no": record contains the page's decline reason exactly (timing, topic, budget, travel, format or "no reason given") and says it goes back to sourcing; referral_ask is one sentence asking whether they would suggest someone else (use "suggest" or "recommend"), thanking them for a name they already gave. Otherwise (nothing pasted yet, no answer, or unclear): record says silence past the page's release date (copied as YYYY-MM-DD) is recorded as a no and the slot is released; referral_ask is "".
  4. opt_out_note - one sentence: an opt-out is honored the moment it arrives, mid-sequence; it must contain "opt-out" or "stop".
  5. caveats - at most 5 short strings, as in the invite task; never empty when the page has a [fix] finding.
  6. note - one sentence: when the page's verdict is "travel gate blocks", "fix before writing" or "rewrite the draft", begin with "Not ready to send:" and say what to fix first; otherwise say what happens next.
{
  "task": "followup",
  "schedule": [ { "touch": "2", "date": "the page's date", "channel": "the page's channel", "angle": "the page's angle", "message": "the follow-up" } ],
  "yes_but": { "conditions": [ { "condition": "the page's condition", "negotiable": "no", "answer": "one sentence" } ], "reply_message": "the reply to send", "authority_note": "" },
  "close": { "record": "one or two sentences", "referral_ask": "" },
  "opt_out_note": "one sentence",
  "caveats": [ "a caveat" ],
  "note": "one sentence"
}

The page requires every follow-up touch it lists with its touch number, date, channel and angle exactly, each message within 150 words carrying its angle's detail and the last one closing out ("stop" or "last note", and "next year" or "next edition"); yes_but null unless the page reads a yes-but, and then every condition with the page's negotiable flag, a plain refusal where it is not negotiable, a reply message using "fee" when a fee was asked, and the decider and turnaround when someone else decides; a record that fits the reply (the recording terms, what the event does not pay and the review lane on a yes; the decline reason and a referral ask on a no; the release date otherwise); an opt-out note; and a note that begins "Not ready to send:" when the verdict is travel gate blocks, fix before writing or rewrite the draft.

Worked examples - every lane, every sample

These are the page's seven free samples (fictional events, organizations, people and addresses). 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 invite lane is not offered once a reply is pasted.

Lakeport Rust Days (the draft buries the budget) - invite

Verdict: rewrite the draft; writing to Dana Okafor (Warm); travel gate: clear - six weeks or more; reply: nothing pasted yet; 2 follow-up touches; 7 fix-level findings.

Input:

{
 "task": "invite",
 "event": "Event: \"Lakeport Rust Days 2027\" | dates: 2027-03-11 to 2027-03-12 | city: \"Lakeport\" | outside the region's main hub: yes | format: in person | audience: 300\nSlot (Q3): \"35-minute talk, day 1 afternoon track\" | kind: talk | length: 35 minutes | recording: recorded and published | reach of last edition: \"2,140 views on last edition's talks, on the event's video channel\"\nSlot brief (Q1): \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\" | invited-review lane: \"light review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 2 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2026-12-31 | answer by: 2027-01-21 | last usable yes: 2027-01-28 | checked as of: 2026-12-30\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: \"Sam Ortiz, program chair\" | hours per invitation: 3 | own name spent on referral asks: some\nBudget line (Q7): \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | covers: [a ticket; travel; lodging] | does not cover: [a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery; travel dates; a companion ticket; recording terms] | not negotiable: [the date; format; a co-speaker seat; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: 2027-02-04",
 "candidate": "Candidate: \"Dana Okafor\" | score: Warm | travels: yes\nWhy (from the packet): \"their Harborconf 2026 talk on cancellation-safe async code\"\nEvidence: \"Harborconf 2026 talk, recorded 2026-09-10\"\nPublished contact route: \"email: dana@okafor.example (published on their site)\"\nPacket notes: \"maintains the retry-backoff crate\"\nHow you found them: \"their Harborconf 2026 talk on cancellation-safe async code\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Sven Aalto\"; \"Ruth Mbeki\"]",
 "draft": "Subject: Speaking Invitation - Lakeport Rust Days 2027 Call for Speakers\n\nHi Dana,\n\nI'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference. As a thought leader in async Rust you would be a fantastic addition to our lineup!\n\nI watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\n\nWe'd like you to give a 35-minute talk on 11 March 2027 in Lakeport, to around 300 practitioners.\n\nLet me know if you're interested!\n\nBest,\nSam\n\nP.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January.",
 "reply": "",
 "facts": "Verdict: \"rewrite the draft\" | invitation ready to send: no | fix-level findings: 7\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 49 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Dana Okafor\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Fresh-work personalization\"\n- rung 3: \"Slot-brief line\"\n- rung 4: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-03-11 to 2027-03-12 | city \"Lakeport\" | audience 300\n- \"how you found them\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"the specific angle\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"why this audience\" | state: \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\"\n- \"honest terms\" | state: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-01-21\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: words 97 of 150 | subject: \"Speaking Invitation - Lakeport Rust Days 2027 Call for Speakers\" (63 characters)\n- \"event basics\" | present | excerpt: \"I'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference.\"\n- \"how you found them\" | MISSING | why: stated, but not in the first line | excerpt: \"I watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\"\n- \"the specific angle\" | present | excerpt: \"I watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\"\n- \"why this audience\" | present | excerpt: \"I'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference.\"\n- \"honest terms\" | MISSING | why: buried after the sign-off or in a postscript (travel, lodging, fee) - terms go up front | excerpt: \"P.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January. Sam\"\n- \"answer deadline\" | MISSING | why: buried after the sign-off or in a postscript | excerpt: \"P.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January. Sam\"\n- \"next step\" | MISSING | why: an open-ended let me know instead of a dated next step | excerpt: \"Let me know if you're interested!\"\n- five-part structure: [part 1 MISSING; part 2 MISSING; part 3 present; part 4 present; part 5 MISSING] | banned vocabulary found: [\"cutting-edge\"; \"thought leader\"] | banned phrases found: [\"let me know if\"] | link or attachment: none\nFollow-up schedule from touch 1 on 2026-12-31 (Three-touch angle cadence), 2 follow-up touches:\n- touch 2 | date: 2027-01-03 | channel: \"Direct email to a published address\" | angle: \"A confirmed co-speaker\" | detail: \"Mira Lind, confirmed for the same afternoon on async runtimes\" | close-out: no\n- touch 3 | date: 2027-01-07 | channel: \"Direct email to a published address\" | angle: \"A narrowed ask\" | detail: \"slot length or remote delivery\" | close-out: yes\nAngles available: [A confirmed co-speaker; A program detail; A narrowed ask] | release date (silence past it is a no): 2027-01-21 | next candidate: \"Sven Aalto\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-01-21\" | then: \"record a no, release the slot and move to Sven Aalto\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (12):\n[fix] d_found (draft): The draft: how you found them - stated, but not in the first line.\n[fix] d_terms (draft): The draft: honest terms - buried after the sign-off or in a postscript (travel, lodging, fee) - terms go up front.\n[fix] d_deadline (draft): The draft: answer deadline - buried after the sign-off or in a postscript.\n[fix] d_next (draft): The draft: next step - an open-ended let me know instead of a dated next step.\n[fix] d_banned_cutting_edge (draft): The draft uses \"cutting-edge\" - banned vocabulary (invitation-message-craft.md): it reads as marketing copy and none of it is evidence.\n[fix] d_banned_thought_leader (draft): The draft uses \"thought leader\" - banned vocabulary (invitation-message-craft.md): it reads as marketing copy and none of it is evidence.\n[fix] d_phrase_let_me_know_if (draft): The draft says \"let me know if\" - an open-ended ask - propose a next step with a date instead (part 5).\n[check] d_subject_long (draft): The subject is 63 characters - keep it under 50.\n[check] d_subject_generic (draft): The subject promises the honour, not the slot (\"Speaking Invitation - Lakeport Rust Days 2027 Call for...\") - lead with the theme and the audience.\n[check] d_part2 (draft): Five-part structure, part 2 (The ask, in one sentence): the ask arrives after a build-up (sentence 4).\n[info] reach_hypothesis (message): A reach figure is a hypothesis to test with your own decline reasons, not a finding - state it as one verifiable number with where to check it, in the second touch if it needs a link.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "invite",
 "summary": "Rewrite the draft: open on the Harborconf talk, put the budget and the 21 January answer date in the body, and end on a dated call instead of an open-ended ask.",
 "verdict": "rewrite the draft",
 "channel": {
  "pick": "Direct email to a published address",
  "reason": "The packet's published route for Dana Okafor is an email address on their own site, and no referrer or shared event is named."
 },
 "depth": {
  "pick": "Sourced-why personalization",
  "reason": "A Warm score keeps the default: open on the Harborconf 2026 talk the packet already recorded."
 },
 "subject": "Cancellation-safe async, for a room of 300",
 "message": "Hi Dana,\n\nI watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having in the hallway.\n\nI'd like to invite you to give the 35-minute talk on that theme at Lakeport Rust Days on 11 March in Lakeport. It's the day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services, and last edition's talks drew 2,140 views on the event's video channel.\n\nWe cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees, and I'd rather say that now than after you've blocked the week. I need an answer by 21 January.\n\nWould a 20-minute call on Tuesday or Wednesday work?\n\nSam Ortiz\nProgram chair, Lakeport Rust Days",
 "disclosures": [
  {
   "item": "event basics",
   "where": "on 11 March in Lakeport"
  },
  {
   "item": "how you found them",
   "where": "I watched your Harborconf 2026 talk"
  },
  {
   "item": "the specific angle",
   "where": "cancellation-safe async code"
  },
  {
   "item": "why this audience",
   "where": "300 practitioners running Rust services"
  },
  {
   "item": "honest terms",
   "where": "we don't pay speaker fees"
  },
  {
   "item": "answer deadline",
   "where": "I need an answer by 21 January"
  },
  {
   "item": "next step",
   "where": "Would a 20-minute call on Tuesday or Wednesday work?"
  }
 ],
 "words": 127,
 "humanize_note": "Run this past a humanizer pass in your preferred humanizer skill before sending - a model-shaped invitation is the fastest way to be ignored.",
 "caveats": [
  "The draft opened on the organizers, not on the Harborconf talk - the first line now names it.",
  "The budget and the answer date sat in a P.S. - both are in the body now.",
  "The draft used cutting-edge and thought leader - both are banned vocabulary and are gone.",
  "The draft ended on an open-ended let me know - it now proposes a dated call."
 ]
}

The page's check: kept - nothing to flag

Lakeport Rust Days (the draft buries the budget) - followup

Verdict: rewrite the draft; writing to Dana Okafor (Warm); travel gate: clear - six weeks or more; reply: nothing pasted yet; 2 follow-up touches; 7 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Lakeport Rust Days 2027\" | dates: 2027-03-11 to 2027-03-12 | city: \"Lakeport\" | outside the region's main hub: yes | format: in person | audience: 300\nSlot (Q3): \"35-minute talk, day 1 afternoon track\" | kind: talk | length: 35 minutes | recording: recorded and published | reach of last edition: \"2,140 views on last edition's talks, on the event's video channel\"\nSlot brief (Q1): \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\" | invited-review lane: \"light review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 2 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2026-12-31 | answer by: 2027-01-21 | last usable yes: 2027-01-28 | checked as of: 2026-12-30\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: \"Sam Ortiz, program chair\" | hours per invitation: 3 | own name spent on referral asks: some\nBudget line (Q7): \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | covers: [a ticket; travel; lodging] | does not cover: [a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery; travel dates; a companion ticket; recording terms] | not negotiable: [the date; format; a co-speaker seat; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: 2027-02-04",
 "candidate": "Candidate: \"Dana Okafor\" | score: Warm | travels: yes\nWhy (from the packet): \"their Harborconf 2026 talk on cancellation-safe async code\"\nEvidence: \"Harborconf 2026 talk, recorded 2026-09-10\"\nPublished contact route: \"email: dana@okafor.example (published on their site)\"\nPacket notes: \"maintains the retry-backoff crate\"\nHow you found them: \"their Harborconf 2026 talk on cancellation-safe async code\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Sven Aalto\"; \"Ruth Mbeki\"]\nCarried from the invitation: subject: \"Cancellation-safe async, for a room of 300\" | angles already used: [none]",
 "draft": "Subject: Speaking Invitation - Lakeport Rust Days 2027 Call for Speakers\n\nHi Dana,\n\nI'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference. As a thought leader in async Rust you would be a fantastic addition to our lineup!\n\nI watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\n\nWe'd like you to give a 35-minute talk on 11 March 2027 in Lakeport, to around 300 practitioners.\n\nLet me know if you're interested!\n\nBest,\nSam\n\nP.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January.",
 "reply": "",
 "facts": "Verdict: \"rewrite the draft\" | invitation ready to send: no | fix-level findings: 7\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 49 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Dana Okafor\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Fresh-work personalization\"\n- rung 3: \"Slot-brief line\"\n- rung 4: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-03-11 to 2027-03-12 | city \"Lakeport\" | audience 300\n- \"how you found them\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"the specific angle\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"why this audience\" | state: \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\"\n- \"honest terms\" | state: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-01-21\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: words 97 of 150 | subject: \"Speaking Invitation - Lakeport Rust Days 2027 Call for Speakers\" (63 characters)\n- \"event basics\" | present | excerpt: \"I'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference.\"\n- \"how you found them\" | MISSING | why: stated, but not in the first line | excerpt: \"I watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\"\n- \"the specific angle\" | present | excerpt: \"I watched your Harborconf 2026 talk on cancellation-safe async code, and it is exactly the conversation our attendees keep having.\"\n- \"why this audience\" | present | excerpt: \"I'm one of the organizers of Lakeport Rust Days, a cutting-edge community conference.\"\n- \"honest terms\" | MISSING | why: buried after the sign-off or in a postscript (travel, lodging, fee) - terms go up front | excerpt: \"P.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January. Sam\"\n- \"answer deadline\" | MISSING | why: buried after the sign-off or in a postscript | excerpt: \"P.S. We cover travel and two nights' lodging but can't pay a fee. We need an answer by 21 January. Sam\"\n- \"next step\" | MISSING | why: an open-ended let me know instead of a dated next step | excerpt: \"Let me know if you're interested!\"\n- five-part structure: [part 1 MISSING; part 2 MISSING; part 3 present; part 4 present; part 5 MISSING] | banned vocabulary found: [\"cutting-edge\"; \"thought leader\"] | banned phrases found: [\"let me know if\"] | link or attachment: none\nFollow-up schedule from touch 1 on 2026-12-31 (Three-touch angle cadence), 2 follow-up touches:\n- touch 2 | date: 2027-01-03 | channel: \"Direct email to a published address\" | angle: \"A confirmed co-speaker\" | detail: \"Mira Lind, confirmed for the same afternoon on async runtimes\" | close-out: no\n- touch 3 | date: 2027-01-07 | channel: \"Direct email to a published address\" | angle: \"A narrowed ask\" | detail: \"slot length or remote delivery\" | close-out: yes\nAngles available: [A confirmed co-speaker; A program detail; A narrowed ask] | release date (silence past it is a no): 2027-01-21 | next candidate: \"Sven Aalto\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-01-21\" | then: \"record a no, release the slot and move to Sven Aalto\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (12):\n[fix] d_found (draft): The draft: how you found them - stated, but not in the first line.\n[fix] d_terms (draft): The draft: honest terms - buried after the sign-off or in a postscript (travel, lodging, fee) - terms go up front.\n[fix] d_deadline (draft): The draft: answer deadline - buried after the sign-off or in a postscript.\n[fix] d_next (draft): The draft: next step - an open-ended let me know instead of a dated next step.\n[fix] d_banned_cutting_edge (draft): The draft uses \"cutting-edge\" - banned vocabulary (invitation-message-craft.md): it reads as marketing copy and none of it is evidence.\n[fix] d_banned_thought_leader (draft): The draft uses \"thought leader\" - banned vocabulary (invitation-message-craft.md): it reads as marketing copy and none of it is evidence.\n[fix] d_phrase_let_me_know_if (draft): The draft says \"let me know if\" - an open-ended ask - propose a next step with a date instead (part 5).\n[check] d_subject_long (draft): The subject is 63 characters - keep it under 50.\n[check] d_subject_generic (draft): The subject promises the honour, not the slot (\"Speaking Invitation - Lakeport Rust Days 2027 Call for...\") - lead with the theme and the audience.\n[check] d_part2 (draft): Five-part structure, part 2 (The ask, in one sentence): the ask arrives after a build-up (sentence 4).\n[info] reach_hypothesis (message): A reach figure is a hypothesis to test with your own decline reasons, not a finding - state it as one verifiable number with where to check it, in the second touch if it needs a link.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [
  {
   "touch": "2",
   "date": "2027-01-03",
   "channel": "Direct email to a published address",
   "angle": "A confirmed co-speaker",
   "message": "Hi Dana,\n\nOne thing that landed since my note: Mira Lind is confirmed for the same afternoon on async runtimes, so the track would put cancellation and runtimes side by side.\n\nThe answer date is still 21 January. Would a 20-minute call on Tuesday work?\n\nSam"
  },
  {
   "touch": "3",
   "date": "2027-01-07",
   "channel": "Direct email to a published address",
   "angle": "A narrowed ask",
   "message": "Hi Dana,\n\nThis is my last note, and then I'll stop. If the trip is the blocker rather than the topic, the slot length can move, or you could give the talk as remote delivery.\n\nIf the timing doesn't work, that's completely fine - I'd rather know than guess. Either way, I'd like to have you in the room next year.\n\nSam"
  }
 ],
 "yes_but": null,
 "close": {
  "record": "Silence past 2027-01-21 is recorded as a no for this slot, and the slot is released to the next candidate in the packet.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [
  "Not ready to send: the draft buries the budget and the answer date in a P.S. and uses banned vocabulary - rewrite it before touch 1.",
  "Touch 2 goes only because the co-speaker is new information; without it, the gap is the message."
 ],
 "note": "Not ready to send: rewrite the draft first - the budget, the answer date and the Harborconf talk belong in the body - then follow with the co-speaker on 2027-01-03 and the narrowed ask on 2027-01-07."
}

The page's check: kept - nothing to flag

Lakeport Rust Days (yes, but a fee and remote) - invite: not offered - a reply is pasted, so the invitation is already out - the first invitation is written once; plan the follow-ups and the answer instead.

Lakeport Rust Days (yes, but a fee and remote) - followup

Verdict: answer the yes-but; writing to Dana Okafor (Warm); travel gate: clear - six weeks or more; reply: yes, but; 0 follow-up touches; 0 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Lakeport Rust Days 2027\" | dates: 2027-03-11 to 2027-03-12 | city: \"Lakeport\" | outside the region's main hub: yes | format: in person | audience: 300\nSlot (Q3): \"35-minute talk, day 1 afternoon track\" | kind: talk | length: 35 minutes | recording: recorded and published | reach of last edition: \"2,140 views on last edition's talks, on the event's video channel\"\nSlot brief (Q1): \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\" | invited-review lane: \"light review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 2 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2026-12-31 | answer by: 2027-01-21 | last usable yes: 2027-01-28 | checked as of: 2027-01-10\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: \"Sam Ortiz, program chair\" | hours per invitation: 3 | own name spent on referral asks: some\nBudget line (Q7): \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | covers: [a ticket; travel; lodging] | does not cover: [a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery; travel dates; a companion ticket; recording terms] | not negotiable: [the date; format; a co-speaker seat; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: 2027-02-04",
 "candidate": "Candidate: \"Dana Okafor\" | score: Warm | travels: yes\nWhy (from the packet): \"their Harborconf 2026 talk on cancellation-safe async code\"\nEvidence: \"Harborconf 2026 talk, recorded 2026-09-10\"\nPublished contact route: \"email: dana@okafor.example (published on their site)\"\nPacket notes: \"maintains the retry-backoff crate\"\nHow you found them: \"their Harborconf 2026 talk on cancellation-safe async code\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Sven Aalto\"; \"Ruth Mbeki\"]\nCarried from the invitation: subject: \"Cancellation-safe async, for a room of 300\" | angles already used: [none]",
 "draft": "",
 "reply": "Thanks so much - yes, I'd love to, but I'd need a speaker fee and a remote option, since travel in March is hard for me.",
 "facts": "Verdict: \"answer the yes-but\" | invitation ready to send: yes | fix-level findings: 0\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 49 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Dana Okafor\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Fresh-work personalization\"\n- rung 3: \"Slot-brief line\"\n- rung 4: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-03-11 to 2027-03-12 | city \"Lakeport\" | audience 300\n- \"how you found them\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"the specific angle\" | state: \"their Harborconf 2026 talk on cancellation-safe async code\"\n- \"why this audience\" | state: \"Day 1 afternoon track on async Rust in production, for about 300 practitioners running Rust services\"\n- \"honest terms\" | state: \"We cover travel, two nights' lodging and a conference ticket; we don't pay speaker fees.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-01-21\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2026-12-31 (Three-touch angle cadence), no follow-up touch | stopped: the candidate answered - the sequence stops:\nAngles available: [A confirmed co-speaker; A program detail; A narrowed ask] | release date (silence past it is a no): 2027-01-21 | next candidate: \"Sven Aalto\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"yes, but\"\n- condition: \"a speaker fee\" | negotiable: no | basis: the budget line covers no fee - answer from it; there is no rate card and no benchmark to invent\n- condition: \"remote delivery\" | negotiable: yes | basis: on the negotiable list fixed at Q8\n- authority note needed: no - the organizer writing decides\nClose the loop (step 10): slot: \"35-minute talk, day 1 afternoon track\" | date: \"2027-03-11 to 2027-03-12\" | start time: \"to be set in the confirmation\" | length: \"35 minutes\" | format: \"in person, talk\" | what the event pays: \"a ticket, travel and lodging\" | what it does not pay: \"a speaker fee\" | travel and lodging: \"who books what - to be agreed in writing\" | recording terms: \"recorded and published\" | title and abstract deadline: \"2027-02-04\" | review lane: \"light review\" | conditions agreed from the Q8 list: \"remote delivery\" | hand-offs: [the confirmed speaker to event-speaker-experience; the review lane to event-talk-selection]\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (2):\n[info] reach_hypothesis (message): A reach figure is a hypothesis to test with your own decline reasons, not a finding - state it as one verifiable number with where to check it, in the second touch if it needs a link.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [],
 "yes_but": {
  "conditions": [
   {
    "condition": "a speaker fee",
    "negotiable": "no",
    "answer": "We don't have a speaker-fee budget, so a fee is not available this year."
   },
   {
    "condition": "remote delivery",
    "negotiable": "yes",
    "answer": "Remote delivery is on our negotiable list, so the talk can be given remotely."
   }
  ],
  "reply_message": "Hi Dana,\n\nThank you - that's great to hear. We don't have a speaker-fee budget this year, and I'd rather say that plainly than negotiate around it.\n\nRemote delivery is something we can do: you would give the 35-minute talk remotely, and the travel question goes away.\n\nIf a fee is the condition, I understand completely and I'd still like to keep talking for next edition. Would a 20-minute call on Thursday work to set up the remote session?\n\nSam",
  "authority_note": ""
 },
 "close": {
  "record": "To confirm in writing the same day: the 35-minute talk, day 1 afternoon track on 2027-03-11, delivered remotely; the event pays a conference ticket, travel and lodging where needed and does not pay a speaker fee; recording terms: recorded and published; title and abstract by 2027-02-04; review lane: light review; condition written in: remote delivery.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [
  "The fee is not on the budget line - answer from it and never counter with a made-up market rate."
 ],
 "note": "Send the reply today: the fee is not available, remote delivery is, and the written confirmation follows as soon as Dana agrees."
}

The page's check: kept - nothing to flag

Arcwell Platform Summit (vendor keynote) - invite

Verdict: ready to send; writing to Jordan Ilesanmi (Hot); travel gate: clear - six weeks or more; reply: nothing pasted yet; 2 follow-up touches; 0 fix-level findings.

Input:

{
 "task": "invite",
 "event": "Event: \"Arcwell Platform Summit 2027\" | dates: 2027-04-20 to 2027-04-21 | city: \"Rotterdam\" | outside the region's main hub: no | format: hybrid | audience: 1200\nSlot (Q3): \"Opening keynote, day 1\" | kind: keynote | length: 40 minutes | recording: recorded and published | reach of last edition: none given\nSlot brief (Q1): \"Opening keynote on running feature flags across a fleet, for 1,200 platform engineers and their leads\" | invited-review lane: \"no review\"\nPole (Q2): vendor or user conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-01-11 | answer by: 2027-02-15 | last usable yes: 2027-02-22 | checked as of: 2027-01-08\nEdition (Q5): a compounding annual program\nEffort ceiling (Q6): writer: \"Noor Abbas, events lead\" | hours per invitation: 6 | own name spent on referral asks: some\nBudget line (Q7): \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | covers: [a ticket; travel; lodging; a speaker fee] | does not cover: [nothing] | status: confirmed\nNegotiable (Q8): [slot length; travel dates; a companion ticket; recording terms; session time of day] | not negotiable: [the date; format; remote delivery; a co-speaker seat; an introduction]\nAuthority (Q9): someone else agrees fees and conditions | who: \"Lars Eklund, events director\" | turnaround: \"3 working days\"\nTitle and abstract deadline: 2027-03-01",
 "candidate": "Candidate: \"Jordan Ilesanmi\" | score: Hot | travels: yes\nWhy (from the packet): \"their Platform Days 2026 keynote on flags without fear\"\nEvidence: \"keynote recording 2026-05, and a follow-up post on flag debt in 2026-10\"\nPublished contact route: \"agent: Lumen Speakers bureau, bookings@lumenspeakers.example (published)\"\nPacket notes: \"needs employer sign-off for paid talks\"\nHow you found them: \"their Platform Days 2026 keynote on flags without fear\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Ana Ferreira\"]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"ready to send\" | invitation ready to send: yes | fix-level findings: 0\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"vendor or user conference\" | what the invitation can honestly offer: [invitation is the main intake here, not the backup channel; a real budget - the ask can carry a fee and full travel] | budget line: \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | notes: The offer changes; nothing about the disclosure rules or the cadence does. Published organizer guidance is written for the community pole, so every vendor-pole adjustment here is judged, not established practice.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 64 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Jordan Ilesanmi\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: The published route is an agent or bureau - their address is a published address (judged). Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Program-shaped ask\"\n- rung 1: \"Program-shaped ask\" | moved: promoted by Q5: a compounding annual mandate - a candidate who declines with the relationship intact is next year's first call; made the pick by Q3: a keynote\n- rung 2: \"Fresh-work personalization\" | moved: promoted by Q5: a compounding annual mandate; made the pick by a Hot score - promote every Hot candidate to this rung\n- rung 3: \"Sourced-why personalization\"\n- rung 4: \"Slot-brief line\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\n- notes: The two deep rungs go past the packet's recorded evidence into fresh research on a named individual - the line between reading their public work and assembling a file on them is yours to hold.\nFollow-up cadence (step 8) - pick: \"Long-runway cadence\"\n- rung 1: \"Long-runway cadence\" | moved: made the pick by a candidate who needs internal approval\n- rung 2: \"Three-touch angle cadence\"\n- rung 3: \"Single ask, then stop\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-04-20 to 2027-04-21 | city \"Rotterdam\" | audience 1200\n- \"how you found them\" | state: \"their Platform Days 2026 keynote on flags without fear\"\n- \"the specific angle\" | state: \"their Platform Days 2026 keynote on flags without fear\"\n- \"why this audience\" | state: \"Opening keynote on running feature flags across a fleet, for 1,200 platform engineers and their leads\"\n- \"honest terms\" | state: \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-02-15\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-01-11 (Long-runway cadence), 2 follow-up touches:\n- touch 2 | date: 2027-01-23 | channel: \"Direct email to a published address\" | angle: \"A program detail\" | detail: \"the opening day now ends with a platform leads' roundtable straight after the keynote\" | close-out: no\n- touch 3 | date: 2027-02-04 | channel: \"Direct email to a published address\" | angle: \"A narrowed ask\" | detail: \"slot length\" | close-out: yes\nAngles available: [A program detail; An audience question; A narrowed ask] | release date (silence past it is a no): 2027-02-15 | next candidate: \"Ana Ferreira\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-02-15\" | then: \"record a no, release the slot and move to Ana Ferreira\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure | Every vendor-pole adjustment - judged, not established practice\nFindings (2):\n[info] angle_cospeaker (cadence): A confirmed co-speaker is the strongest angle available - use it the moment a relevant name confirms, and only if it is true.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "invite",
 "summary": "Ready to send through the agent's published address: the keynote fee, travel, lodging and the 15 February answer date are all in the first message.",
 "verdict": "ready to send",
 "channel": {
  "pick": "Direct email to a published address",
  "reason": "The packet lists the Lumen Speakers bureau address as the published route, so the first touch is a direct email to that address."
 },
 "depth": {
  "pick": "Program-shaped ask",
  "reason": "A keynote with a Hot candidate earns the program-shaped ask: the invitation is built around a talk on running flags across a fleet."
 },
 "subject": "Opening keynote: flags at fleet scale",
 "message": "Hi Jordan,\n\nYour Platform Days 2026 keynote on flags without fear, and the follow-up post on flag debt, are why I'm writing.\n\nI'd like to invite you to give the opening keynote at Arcwell Platform Summit 2027 in Rotterdam on 20 April: a 40-minute talk on running feature flags across a fleet, the gap in our program your work fills. The room is 1,200 platform engineers and their leads, all running flags at fleet scale.\n\nWe pay a keynote fee of USD 5,000 plus travel and three nights' lodging. I need an answer by 15 February.\n\nWould a 20-minute call on Thursday work to shape the talk together?\n\nNoor Abbas\nEvents lead, Arcwell Platform Summit",
 "disclosures": [
  {
   "item": "event basics",
   "where": "in Rotterdam on 20 April"
  },
  {
   "item": "how you found them",
   "where": "Your Platform Days 2026 keynote on flags without fear"
  },
  {
   "item": "the specific angle",
   "where": "running feature flags across a fleet"
  },
  {
   "item": "why this audience",
   "where": "1,200 platform engineers and their leads"
  },
  {
   "item": "honest terms",
   "where": "We pay a keynote fee of USD 5,000"
  },
  {
   "item": "answer deadline",
   "where": "I need an answer by 15 February"
  },
  {
   "item": "next step",
   "where": "Would a 20-minute call on Thursday work"
  }
 ],
 "words": 115,
 "humanize_note": "Run this past a humanizer pass in your preferred humanizer skill before sending - a model-shaped invitation is the fastest way to be ignored.",
 "caveats": []
}

The page's check: kept - nothing to flag

Arcwell Platform Summit (vendor keynote) - followup

Verdict: ready to send; writing to Jordan Ilesanmi (Hot); travel gate: clear - six weeks or more; reply: nothing pasted yet; 2 follow-up touches; 0 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Arcwell Platform Summit 2027\" | dates: 2027-04-20 to 2027-04-21 | city: \"Rotterdam\" | outside the region's main hub: no | format: hybrid | audience: 1200\nSlot (Q3): \"Opening keynote, day 1\" | kind: keynote | length: 40 minutes | recording: recorded and published | reach of last edition: none given\nSlot brief (Q1): \"Opening keynote on running feature flags across a fleet, for 1,200 platform engineers and their leads\" | invited-review lane: \"no review\"\nPole (Q2): vendor or user conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-01-11 | answer by: 2027-02-15 | last usable yes: 2027-02-22 | checked as of: 2027-01-08\nEdition (Q5): a compounding annual program\nEffort ceiling (Q6): writer: \"Noor Abbas, events lead\" | hours per invitation: 6 | own name spent on referral asks: some\nBudget line (Q7): \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | covers: [a ticket; travel; lodging; a speaker fee] | does not cover: [nothing] | status: confirmed\nNegotiable (Q8): [slot length; travel dates; a companion ticket; recording terms; session time of day] | not negotiable: [the date; format; remote delivery; a co-speaker seat; an introduction]\nAuthority (Q9): someone else agrees fees and conditions | who: \"Lars Eklund, events director\" | turnaround: \"3 working days\"\nTitle and abstract deadline: 2027-03-01",
 "candidate": "Candidate: \"Jordan Ilesanmi\" | score: Hot | travels: yes\nWhy (from the packet): \"their Platform Days 2026 keynote on flags without fear\"\nEvidence: \"keynote recording 2026-05, and a follow-up post on flag debt in 2026-10\"\nPublished contact route: \"agent: Lumen Speakers bureau, bookings@lumenspeakers.example (published)\"\nPacket notes: \"needs employer sign-off for paid talks\"\nHow you found them: \"their Platform Days 2026 keynote on flags without fear\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Ana Ferreira\"]\nCarried from the invitation: subject: \"Opening keynote: flags at fleet scale\" | angles already used: [none]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"ready to send\" | invitation ready to send: yes | fix-level findings: 0\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"vendor or user conference\" | what the invitation can honestly offer: [invitation is the main intake here, not the backup channel; a real budget - the ask can carry a fee and full travel] | budget line: \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | notes: The offer changes; nothing about the disclosure rules or the cadence does. Published organizer guidance is written for the community pole, so every vendor-pole adjustment here is judged, not established practice.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 64 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Jordan Ilesanmi\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: The published route is an agent or bureau - their address is a published address (judged). Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Program-shaped ask\"\n- rung 1: \"Program-shaped ask\" | moved: promoted by Q5: a compounding annual mandate - a candidate who declines with the relationship intact is next year's first call; made the pick by Q3: a keynote\n- rung 2: \"Fresh-work personalization\" | moved: promoted by Q5: a compounding annual mandate; made the pick by a Hot score - promote every Hot candidate to this rung\n- rung 3: \"Sourced-why personalization\"\n- rung 4: \"Slot-brief line\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\n- notes: The two deep rungs go past the packet's recorded evidence into fresh research on a named individual - the line between reading their public work and assembling a file on them is yours to hold.\nFollow-up cadence (step 8) - pick: \"Long-runway cadence\"\n- rung 1: \"Long-runway cadence\" | moved: made the pick by a candidate who needs internal approval\n- rung 2: \"Three-touch angle cadence\"\n- rung 3: \"Single ask, then stop\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-04-20 to 2027-04-21 | city \"Rotterdam\" | audience 1200\n- \"how you found them\" | state: \"their Platform Days 2026 keynote on flags without fear\"\n- \"the specific angle\" | state: \"their Platform Days 2026 keynote on flags without fear\"\n- \"why this audience\" | state: \"Opening keynote on running feature flags across a fleet, for 1,200 platform engineers and their leads\"\n- \"honest terms\" | state: \"We pay a keynote fee of USD 5,000 plus travel and three nights' lodging.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-02-15\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-01-11 (Long-runway cadence), 2 follow-up touches:\n- touch 2 | date: 2027-01-23 | channel: \"Direct email to a published address\" | angle: \"A program detail\" | detail: \"the opening day now ends with a platform leads' roundtable straight after the keynote\" | close-out: no\n- touch 3 | date: 2027-02-04 | channel: \"Direct email to a published address\" | angle: \"A narrowed ask\" | detail: \"slot length\" | close-out: yes\nAngles available: [A program detail; An audience question; A narrowed ask] | release date (silence past it is a no): 2027-02-15 | next candidate: \"Ana Ferreira\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-02-15\" | then: \"record a no, release the slot and move to Ana Ferreira\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure | Every vendor-pole adjustment - judged, not established practice\nFindings (2):\n[info] angle_cospeaker (cadence): A confirmed co-speaker is the strongest angle available - use it the moment a relevant name confirms, and only if it is true.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [
  {
   "touch": "2",
   "date": "2027-01-23",
   "channel": "Direct email to a published address",
   "angle": "A program detail",
   "message": "Hi Jordan,\n\nA program detail that landed since my note: the opening day now ends with a platform leads' roundtable straight after the keynote, so the conversation your talk starts carries on in the same room.\n\nThe answer date is 15 February. Would a 20-minute call on Thursday work?\n\nNoor"
  },
  {
   "touch": "3",
   "date": "2027-02-04",
   "channel": "Direct email to a published address",
   "angle": "A narrowed ask",
   "message": "Hi Jordan,\n\nThis is my last note on the keynote, and then I'll stop. If 40 minutes is the blocker, the slot length can move.\n\nIf the timing doesn't work, that's fine - I'd rather know than guess, and I'd still like you in the room next edition.\n\nNoor"
  }
 ],
 "yes_but": null,
 "close": {
  "record": "Silence past 2027-02-15 is recorded as a no for this slot, and the slot is released to the next candidate in the packet.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [],
 "note": "Send the invitation through the agent's published address on 2027-01-11, then the program detail on 2027-01-23 and the last note on 2027-02-04; Lars Eklund answers fee questions within 3 working days."
}

The page's check: kept - nothing to flag

Southgate Data Night (inside the travel floor) - invite

Verdict: travel gate blocks; writing to Kai Brennan (Cold); travel gate: under the four-week floor - blocks; reply: nothing pasted yet; 0 follow-up touches; 1 fix-level findings.

Input:

{
 "task": "invite",
 "event": "Event: \"Southgate Data Night - March 2027\" | dates: 2027-03-10 | city: \"Southgate\" | outside the region's main hub: yes | format: in person | audience: 90\nSlot (Q3): \"20-minute talk\" | kind: talk | length: 20 minutes | recording: not recorded | reach of last edition: none given\nSlot brief (Q1): \"A 20-minute talk on data contracts for 90 analysts and engineers\" | invited-review lane: \"no review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-02-08 | answer by: 2027-02-20 | last usable yes: 2027-02-24 | checked as of: 2027-02-08\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 2 | own name spent on referral asks: some\nBudget line (Q7): \"We cover a ticket and train travel; no lodging and no fee.\" | covers: [a ticket; travel] | does not cover: [lodging; a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery] | not negotiable: [the date; format; travel dates; a co-speaker seat; a companion ticket; recording terms; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Kai Brennan\" | score: Cold | travels: yes\nWhy (from the packet): \"a meetup talk on data contracts\"\nEvidence: \"slides from a 2026 meetup\"\nPublished contact route: \"email: kai@brennan.example\"\nPacket notes: \"lives two hours away by train\"\nHow you found them: \"their meetup talk on data contracts\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Lena Roth\"]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"travel gate blocks\" | invitation ready to send: no | fix-level findings: 1\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover a ticket and train travel; no lodging and no fee.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 18 | result: \"under the four-week floor - blocks\" | the message must name the travel lead time: yes | candidates in the packet who do not travel: [\"Lena Roth\"]\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\" | moved: promoted by Q4: a hard answer date (12 days away, hard at 14 or fewer - self-set) promotes the fast rungs\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Kai Brennan\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Slot-brief line\"\n- rung 3: \"Fresh-work personalization\" | moved: demoted by a Cold score - effort scales with fit\n- rung 4: \"Program-shaped ask\" | moved: demoted by a Cold score - effort scales with fit\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Single ask, then stop\"\n- rung 1: \"Single ask, then stop\" | moved: promoted by Q3 and Q4: a viable next candidate is queued behind this slot and the answer date is hard\n- rung 2: \"Three-touch angle cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\n- deleted, not demoted: \"Long-runway cadence\" | reason: Q4: a hard answer date (12 days away, hard at 14 or fewer - self-set) deletes the long cadence outright\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"travel lead time\"; \"next step\"]\n- \"event basics\" | state: dates 2027-03-10 | city \"Southgate\" | audience 90\n- \"how you found them\" | state: \"their meetup talk on data contracts\"\n- \"the specific angle\" | state: \"a meetup talk on data contracts\"\n- \"why this audience\" | state: \"A 20-minute talk on data contracts for 90 analysts and engineers\"\n- \"honest terms\" | state: \"We cover a ticket and train travel; no lodging and no fee.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-02-20\n- \"travel lead time\" | state: the travel lead time - four to six weeks\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-02-08 (Single ask, then stop), no follow-up touch | stopped: single ask: silence is a no after 2027-02-20:\nAngles available: [A narrowed ask] | release date (silence past it is a no): 2027-02-20 | next candidate: \"Lena Roth\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-02-20\" | then: \"record a no, release the slot and move to Lena Roth\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (4):\n[fix] travel_gate (gate): The travel gate: Kai Brennan has to travel and the answer date 2027-02-20 is 18 days before the event - under the four-week floor, so this invitation can only be declined. Move to a candidate who does not travel (Lena Roth), move the answer date earlier, or name the constraint in the message yourself.\n[check] last_yes_floor (gate): Q4: the last usable yes 2027-02-24 is under four weeks before the event - for a travelling candidate a yes that late is rarely usable.\n[check] regional_terms (pole): The event is outside the region's main hub: travel plus lodging belongs in the offer itself - hub-based speakers rarely travel to regional events otherwise, and a speaker who cannot get home the same evening needs the night covered.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "invite",
 "summary": "The travel gate blocks: Kai Brennan has to travel and the 20 February answer date leaves under four weeks, so move to a candidate who does not travel or send this with the constraint named.",
 "verdict": "travel gate blocks",
 "channel": {
  "pick": "Direct email to a published address",
  "reason": "The packet's published route for Kai Brennan is an email address, and no referrer or shared event is named."
 },
 "depth": {
  "pick": "Sourced-why personalization",
  "reason": "A Cold score keeps the shallow default: open on the meetup talk the packet recorded, nothing deeper."
 },
 "subject": "Data contracts for 90 analysts in Southgate",
 "message": "Hi Kai,\n\nI read the slides from your meetup talk on data contracts, and they are the conversation our analysts keep starting.\n\nI'd like to invite you to give a 20-minute talk on data contracts at Southgate Data Night on 10 March in Southgate. The room is 90 analysts and engineers who own the pipelines those contracts protect.\n\nWe cover a ticket and train travel; there is no lodging and no speaker fee. I need an answer by 20 February, and I know that leaves under four weeks to arrange travel - if the timing does not work, I would rather hear that than have you rush.\n\nWould a 20-minute call on Monday work?\n\nOrganizer, Southgate Data Night",
 "disclosures": [
  {
   "item": "event basics",
   "where": "on 10 March in Southgate"
  },
  {
   "item": "how you found them",
   "where": "your meetup talk on data contracts"
  },
  {
   "item": "the specific angle",
   "where": "data contracts"
  },
  {
   "item": "why this audience",
   "where": "90 analysts and engineers"
  },
  {
   "item": "honest terms",
   "where": "there is no lodging and no speaker fee"
  },
  {
   "item": "answer deadline",
   "where": "I need an answer by 20 February"
  },
  {
   "item": "travel lead time",
   "where": "leaves under four weeks to arrange travel"
  },
  {
   "item": "next step",
   "where": "Would a 20-minute call on Monday work?"
  }
 ],
 "words": 117,
 "humanize_note": "Run this past a humanizer pass in your preferred humanizer skill before sending - a model-shaped invitation is the fastest way to be ignored.",
 "caveats": [
  "The travel gate blocks: the answer date is under four weeks before the event, so this invitation can only be declined unless the constraint is named - Lena Roth does not travel.",
  "The event is outside the region's main hub and the budget covers no lodging - say so plainly, as the message does."
 ]
}

The page's check: kept - nothing to flag

Southgate Data Night (inside the travel floor) - followup

Verdict: travel gate blocks; writing to Kai Brennan (Cold); travel gate: under the four-week floor - blocks; reply: nothing pasted yet; 0 follow-up touches; 1 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Southgate Data Night - March 2027\" | dates: 2027-03-10 | city: \"Southgate\" | outside the region's main hub: yes | format: in person | audience: 90\nSlot (Q3): \"20-minute talk\" | kind: talk | length: 20 minutes | recording: not recorded | reach of last edition: none given\nSlot brief (Q1): \"A 20-minute talk on data contracts for 90 analysts and engineers\" | invited-review lane: \"no review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-02-08 | answer by: 2027-02-20 | last usable yes: 2027-02-24 | checked as of: 2027-02-08\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 2 | own name spent on referral asks: some\nBudget line (Q7): \"We cover a ticket and train travel; no lodging and no fee.\" | covers: [a ticket; travel] | does not cover: [lodging; a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery] | not negotiable: [the date; format; travel dates; a co-speaker seat; a companion ticket; recording terms; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Kai Brennan\" | score: Cold | travels: yes\nWhy (from the packet): \"a meetup talk on data contracts\"\nEvidence: \"slides from a 2026 meetup\"\nPublished contact route: \"email: kai@brennan.example\"\nPacket notes: \"lives two hours away by train\"\nHow you found them: \"their meetup talk on data contracts\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Lena Roth\"]\nCarried from the invitation: subject: \"Data contracts for 90 analysts in Southgate\" | angles already used: [none]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"travel gate blocks\" | invitation ready to send: no | fix-level findings: 1\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover a ticket and train travel; no lodging and no fee.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 18 | result: \"under the four-week floor - blocks\" | the message must name the travel lead time: yes | candidates in the packet who do not travel: [\"Lena Roth\"]\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\" | moved: promoted by Q4: a hard answer date (12 days away, hard at 14 or fewer - self-set) promotes the fast rungs\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Kai Brennan\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Slot-brief line\"\n- rung 3: \"Fresh-work personalization\" | moved: demoted by a Cold score - effort scales with fit\n- rung 4: \"Program-shaped ask\" | moved: demoted by a Cold score - effort scales with fit\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Single ask, then stop\"\n- rung 1: \"Single ask, then stop\" | moved: promoted by Q3 and Q4: a viable next candidate is queued behind this slot and the answer date is hard\n- rung 2: \"Three-touch angle cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\n- deleted, not demoted: \"Long-runway cadence\" | reason: Q4: a hard answer date (12 days away, hard at 14 or fewer - self-set) deletes the long cadence outright\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"travel lead time\"; \"next step\"]\n- \"event basics\" | state: dates 2027-03-10 | city \"Southgate\" | audience 90\n- \"how you found them\" | state: \"their meetup talk on data contracts\"\n- \"the specific angle\" | state: \"a meetup talk on data contracts\"\n- \"why this audience\" | state: \"A 20-minute talk on data contracts for 90 analysts and engineers\"\n- \"honest terms\" | state: \"We cover a ticket and train travel; no lodging and no fee.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-02-20\n- \"travel lead time\" | state: the travel lead time - four to six weeks\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-02-08 (Single ask, then stop), no follow-up touch | stopped: single ask: silence is a no after 2027-02-20:\nAngles available: [A narrowed ask] | release date (silence past it is a no): 2027-02-20 | next candidate: \"Lena Roth\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-02-20\" | then: \"record a no, release the slot and move to Lena Roth\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (4):\n[fix] travel_gate (gate): The travel gate: Kai Brennan has to travel and the answer date 2027-02-20 is 18 days before the event - under the four-week floor, so this invitation can only be declined. Move to a candidate who does not travel (Lena Roth), move the answer date earlier, or name the constraint in the message yourself.\n[check] last_yes_floor (gate): Q4: the last usable yes 2027-02-24 is under four weeks before the event - for a travelling candidate a yes that late is rarely usable.\n[check] regional_terms (pole): The event is outside the region's main hub: travel plus lodging belongs in the offer itself - hub-based speakers rarely travel to regional events otherwise, and a speaker who cannot get home the same evening needs the night covered.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [],
 "yes_but": null,
 "close": {
  "record": "Silence past 2027-02-20 is recorded as a no for this slot, and the slot is released to the next candidate in the packet.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [
  "The travel gate blocks: the answer date is under four weeks before the event - move to a candidate who does not travel, or name the constraint and expect a no."
 ],
 "note": "Not ready to send: the 2027-02-20 answer date sits under the four-week travel floor - move to a candidate in the packet who does not travel, or send it with the constraint named and a single ask."
}

The page's check: kept - nothing to flag

Harbor JS Conf (no why, guessed address) - invite

Verdict: fix before writing; writing to Theo Marsh (Warm); travel gate: clear - six weeks or more; reply: nothing pasted yet; 0 follow-up touches; 5 fix-level findings.

Input:

{
 "task": "invite",
 "event": "Event: \"Harbor JS Conf 2027\" | dates: 2027-06-03 | city: \"Harborview\" | outside the region's main hub: no | format: in person | audience: 450\nSlot (Q3): \"30-minute talk\" | kind: talk | length: 30 minutes | recording: recorded and published | reach of last edition: none given\nSlot brief (Q1): \"A 30-minute talk on build tooling for 450 front-end developers\" | invited-review lane: \"not stated\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: in parallel | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-02-01 | answer by: 2027-03-01 | last usable yes: 2027-03-15 | checked as of: 2027-01-28\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 4 | own name spent on referral asks: some\nBudget line (Q7): \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | covers: [a ticket] | does not cover: [travel; lodging; a speaker fee] | status: unconfirmed\nNegotiable (Q8): [nothing] | not negotiable: [the date; slot length; format; remote delivery; travel dates; a co-speaker seat; a companion ticket; recording terms; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Theo Marsh\" | score: Warm | travels: yes\nWhy (from the packet): \"none\"\nEvidence: \"none\"\nPublished contact route: \"guessed: theo.marsh@bigcorp.example\"\nPacket notes: none\nHow you found them: \"not set\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Ines Varela\"]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"fix before writing\" | invitation ready to send: no | fix-level findings: 5\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why MISSING; the why's evidence MISSING; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route MISSING; the invited-review lane MISSING]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 94 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"none available\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Theo Marsh\n- deleted, not demoted: \"Direct email to a published address\" | reason: not available: no published address in the packet - a guessed one is deleted, not a fallback\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Fresh-work personalization\"\n- rung 1: \"Fresh-work personalization\"\n- rung 2: \"Slot-brief line\"\n- rung 3: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\n- deleted, not demoted: \"Sourced-why personalization\" | reason: not available: the packet has no why for Theo Marsh - back to sourcing\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-06-03 | city \"Harborview\" | audience 450\n- \"how you found them\" | state: \"not set\"\n- \"the specific angle\" | state: \"none\"\n- \"why this audience\" | state: \"A 30-minute talk on build tooling for 450 front-end developers\"\n- \"honest terms\" | state: \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | words the message must carry: [ticket; fee; unconfirmed]\n- \"answer deadline\" | state: 2027-03-01\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-02-01 (Three-touch angle cadence), no follow-up touch:\n- skipped: Day 3 (2027-02-04) | why: no new information for it - no touch, the gap is the message\n- skipped: Day 7 (2027-02-08) | why: no new information for it - no touch, the gap is the message\nAngles available: [] | release date (silence past it is a no): 2027-03-01 | next candidate: \"Ines Varela\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-03-01\" | then: \"record a no, release the slot and move to Ines Varela\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (12):\n[fix] no_why (packet): Theo Marsh arrives without the packet's why - the why is the message: send the name back to sourcing rather than writing around the gap (Q1).\n[fix] no_route (packet): Theo Marsh has no published contact route - a guessed or scraped address and the candidate's community space are deleted, not a fallback; send the name back to sourcing for the route the person published.\n[fix] no_found (packet): Nothing says how you found Theo Marsh - it goes in the first line, and it is the consent-respecting move: a public profile is consent to be found, never consent to be pitched.\n[fix] parallel_no_plan (slot): Q3: parallel threads for one slot with nothing decided for two yeses - sequential asks cost time, parallel asks cost a retraction; decide now which second yes you can honestly place elsewhere.\n[fix] no_channel (channel): No first-touch channel is left for Theo Marsh - every rung is deleted or unavailable; go back to sourcing for a published route.\n[check] no_evidence (packet): Theo Marsh: the why has no evidence recorded - the first line has to name the specific work.\n[check] no_review_lane (packet): Q1: the packet does not state the invited-review lane - the confirmation has to state it, not guess it.\n[check] no_negotiable (packet): Q8: nothing is marked negotiable - fix that list before the first message, never during the negotiation.\n[check] parallel (slot): Parallel approach: one candidate per thread, never CC two candidates for the same slot, and never let them see each other.\n[check] no_angle (cadence): No follow-up has a new angle to carry - no touch is better than a bump; silence past 2027-03-01 is a no.\n[info] budget_unconfirmed (packet): Q7: the budget is unconfirmed - the invitation says unconfirmed rather than staying vague.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "invite",
 "summary": "Fix before writing: the packet has no why and only a guessed address for Theo Marsh, and the parallel threads have no two-yes plan - send the name back to sourcing.",
 "verdict": "fix before writing",
 "channel": {
  "pick": "none available",
  "reason": "No rung is available: the only route in the packet is a guessed address, which is deleted, not a fallback."
 },
 "depth": {
  "pick": "Fresh-work personalization",
  "reason": "The packet has no why for Theo Marsh, so the sourced-why rung is unavailable and nothing deeper can be written without inventing it."
 },
 "subject": "Build tooling for 450 front-end developers",
 "message": "Hi Theo,\n\nI'm writing about the 30-minute talk slot on build tooling at Harbor JS Conf on 3 June in Harborview.\n\nIt is a room of 450 front-end developers, and we would like to invite you to give that talk.\n\nOur budget is unconfirmed: a conference ticket is covered, we expect to cover travel but cannot confirm it yet, and there is no speaker fee. I need an answer by 1 March.\n\nWould a 20-minute call on Friday work?\n\nOrganizer, Harbor JS Conf",
 "disclosures": [
  {
   "item": "event basics",
   "where": "on 3 June in Harborview"
  },
  {
   "item": "how you found them",
   "where": "not stated"
  },
  {
   "item": "the specific angle",
   "where": "not stated"
  },
  {
   "item": "why this audience",
   "where": "450 front-end developers"
  },
  {
   "item": "honest terms",
   "where": "Our budget is unconfirmed"
  },
  {
   "item": "answer deadline",
   "where": "I need an answer by 1 March"
  },
  {
   "item": "next step",
   "where": "Would a 20-minute call on Friday work?"
  }
 ],
 "words": 83,
 "humanize_note": "Run this past a humanizer pass in your preferred humanizer skill before sending - a model-shaped invitation is the fastest way to be ignored.",
 "caveats": [
  "Theo Marsh arrives without a why - send the name back to sourcing; how you found them and the specific angle are not stated rather than invented.",
  "The only contact route is a guessed address - deleted; sourcing needs the route Theo Marsh published.",
  "Parallel threads for one slot with no two-yes plan - decide which second yes you can place elsewhere first."
 ]
}

The page's check: kept - nothing to flag

Harbor JS Conf (no why, guessed address) - followup

Verdict: fix before writing; writing to Theo Marsh (Warm); travel gate: clear - six weeks or more; reply: nothing pasted yet; 0 follow-up touches; 5 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Harbor JS Conf 2027\" | dates: 2027-06-03 | city: \"Harborview\" | outside the region's main hub: no | format: in person | audience: 450\nSlot (Q3): \"30-minute talk\" | kind: talk | length: 30 minutes | recording: recorded and published | reach of last edition: none given\nSlot brief (Q1): \"A 30-minute talk on build tooling for 450 front-end developers\" | invited-review lane: \"not stated\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: in parallel | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-02-01 | answer by: 2027-03-01 | last usable yes: 2027-03-15 | checked as of: 2027-01-28\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 4 | own name spent on referral asks: some\nBudget line (Q7): \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | covers: [a ticket] | does not cover: [travel; lodging; a speaker fee] | status: unconfirmed\nNegotiable (Q8): [nothing] | not negotiable: [the date; slot length; format; remote delivery; travel dates; a co-speaker seat; a companion ticket; recording terms; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Theo Marsh\" | score: Warm | travels: yes\nWhy (from the packet): \"none\"\nEvidence: \"none\"\nPublished contact route: \"guessed: theo.marsh@bigcorp.example\"\nPacket notes: none\nHow you found them: \"not set\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Ines Varela\"]\nCarried from the invitation: subject: \"Build tooling for 450 front-end developers\" | angles already used: [none]",
 "draft": "",
 "reply": "",
 "facts": "Verdict: \"fix before writing\" | invitation ready to send: no | fix-level findings: 5\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why MISSING; the why's evidence MISSING; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route MISSING; the invited-review lane MISSING]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 94 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"none available\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Theo Marsh\n- deleted, not demoted: \"Direct email to a published address\" | reason: not available: no published address in the packet - a guessed one is deleted, not a fallback\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Fresh-work personalization\"\n- rung 1: \"Fresh-work personalization\"\n- rung 2: \"Slot-brief line\"\n- rung 3: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\n- deleted, not demoted: \"Sourced-why personalization\" | reason: not available: the packet has no why for Theo Marsh - back to sourcing\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-06-03 | city \"Harborview\" | audience 450\n- \"how you found them\" | state: \"not set\"\n- \"the specific angle\" | state: \"none\"\n- \"why this audience\" | state: \"A 30-minute talk on build tooling for 450 front-end developers\"\n- \"honest terms\" | state: \"Unconfirmed - we expect to cover travel but cannot confirm it yet.\" | words the message must carry: [ticket; fee; unconfirmed]\n- \"answer deadline\" | state: 2027-03-01\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-02-01 (Three-touch angle cadence), no follow-up touch:\n- skipped: Day 3 (2027-02-04) | why: no new information for it - no touch, the gap is the message\n- skipped: Day 7 (2027-02-08) | why: no new information for it - no touch, the gap is the message\nAngles available: [] | release date (silence past it is a no): 2027-03-01 | next candidate: \"Ines Varela\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"nothing pasted yet\"\nClose the loop (step 10): silence past: \"2027-03-01\" | then: \"record a no, release the slot and move to Ines Varela\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (12):\n[fix] no_why (packet): Theo Marsh arrives without the packet's why - the why is the message: send the name back to sourcing rather than writing around the gap (Q1).\n[fix] no_route (packet): Theo Marsh has no published contact route - a guessed or scraped address and the candidate's community space are deleted, not a fallback; send the name back to sourcing for the route the person published.\n[fix] no_found (packet): Nothing says how you found Theo Marsh - it goes in the first line, and it is the consent-respecting move: a public profile is consent to be found, never consent to be pitched.\n[fix] parallel_no_plan (slot): Q3: parallel threads for one slot with nothing decided for two yeses - sequential asks cost time, parallel asks cost a retraction; decide now which second yes you can honestly place elsewhere.\n[fix] no_channel (channel): No first-touch channel is left for Theo Marsh - every rung is deleted or unavailable; go back to sourcing for a published route.\n[check] no_evidence (packet): Theo Marsh: the why has no evidence recorded - the first line has to name the specific work.\n[check] no_review_lane (packet): Q1: the packet does not state the invited-review lane - the confirmation has to state it, not guess it.\n[check] no_negotiable (packet): Q8: nothing is marked negotiable - fix that list before the first message, never during the negotiation.\n[check] parallel (slot): Parallel approach: one candidate per thread, never CC two candidates for the same slot, and never let them see each other.\n[check] no_angle (cadence): No follow-up has a new angle to carry - no touch is better than a bump; silence past 2027-03-01 is a no.\n[info] budget_unconfirmed (packet): Q7: the budget is unconfirmed - the invitation says unconfirmed rather than staying vague.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [],
 "yes_but": null,
 "close": {
  "record": "Silence past 2027-03-01 is recorded as a no for this slot, and the slot is released to the next candidate in the packet.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [
  "Theo Marsh has no why and only a guessed address - back to sourcing.",
  "Parallel threads with no two-yes plan - decide it before anything goes out."
 ],
 "note": "Not ready to send: send Theo Marsh back to sourcing for the why and a published route, and decide what happens on two yeses before any thread opens."
}

The page's check: kept - nothing to flag

Midvale Python Day (no answer yet) - invite: not offered - a reply is pasted, so the invitation is already out - the first invitation is written once; plan the follow-ups and the answer instead.

Midvale Python Day (no answer yet) - followup

Verdict: follow up; writing to Omar Castell (Warm); travel gate: no travel; reply: no answer yet; 2 follow-up touches; 0 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Midvale Python Day 2027\" | dates: 2027-05-14 | city: \"Midvale\" | outside the region's main hub: no | format: in person | audience: 220\nSlot (Q3): \"25-minute talk on testing\" | kind: talk | length: 25 minutes | recording: recorded, not published | reach of last edition: none given\nSlot brief (Q1): \"A 25-minute talk on testing practice for 220 Python developers\" | invited-review lane: \"light review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-01-04 | answer by: 2027-02-01 | last usable yes: 2027-02-08 | checked as of: 2027-01-05\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 3 | own name spent on referral asks: some\nBudget line (Q7): \"We cover a ticket and up to USD 400 of travel; no lodging and no fee.\" | covers: [a ticket; travel] | does not cover: [lodging; a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery; session time of day] | not negotiable: [the date; format; travel dates; a co-speaker seat; a companion ticket; recording terms; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Omar Castell\" | score: Warm | travels: no\nWhy (from the packet): \"their PyCon 2026 talk on property-based testing\"\nEvidence: \"talk recording, 2026-05\"\nPublished contact route: \"email: omar@castell.example\"\nPacket notes: \"lives in Midvale\"\nHow you found them: \"their PyCon 2026 talk on property-based testing\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Bea Lindqvist\"]\nCarried from the invitation: subject: \"Property tests that survive code review\" | angles already used: [none]",
 "draft": "",
 "reply": "No answer yet",
 "facts": "Verdict: \"follow up\" | invitation ready to send: yes | fix-level findings: 0\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover a ticket and up to USD 400 of travel; no lodging and no fee.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: no | days from the answer date to the event start: 102 | result: \"no travel\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Omar Castell\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Fresh-work personalization\"\n- rung 3: \"Slot-brief line\"\n- rung 4: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-05-14 | city \"Midvale\" | audience 220\n- \"how you found them\" | state: \"their PyCon 2026 talk on property-based testing\"\n- \"the specific angle\" | state: \"their PyCon 2026 talk on property-based testing\"\n- \"why this audience\" | state: \"A 25-minute talk on testing practice for 220 Python developers\"\n- \"honest terms\" | state: \"We cover a ticket and up to USD 400 of travel; no lodging and no fee.\" | words the message must carry: [travel; fee]\n- \"answer deadline\" | state: 2027-02-01\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-01-04 (Three-touch angle cadence), 2 follow-up touches:\n- touch 2 | date: 2027-01-07 | channel: \"Direct email to a published address\" | angle: \"A confirmed co-speaker\" | detail: \"Hana Mori, confirmed on fuzzing in the same session\" | close-out: no\n- touch 3 | date: 2027-01-11 | channel: \"Direct email to a published address\" | angle: \"A narrowed ask\" | detail: \"slot length or remote delivery\" | close-out: yes\nAngles available: [A confirmed co-speaker; An audience question; A narrowed ask] | release date (silence past it is a no): 2027-02-01 | next candidate: \"Bea Lindqvist\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"no answer yet\"\nClose the loop (step 10): silence past: \"2027-02-01\" | then: \"record a no, release the slot and move to Bea Lindqvist\"\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (1):\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [
  {
   "touch": "2",
   "date": "2027-01-07",
   "channel": "Direct email to a published address",
   "angle": "A confirmed co-speaker",
   "message": "Hi Omar,\n\nNew since my note: Hana Mori is confirmed on fuzzing in the same session, so property-based testing and fuzzing would sit side by side.\n\nI still need an answer by 1 February. Would a 20-minute call on Friday work?\n\nThe Midvale Python Day team"
  },
  {
   "touch": "3",
   "date": "2027-01-11",
   "channel": "Direct email to a published address",
   "angle": "A narrowed ask",
   "message": "Hi Omar,\n\nThis is my last note, and then I'll stop. If the size of the ask is the problem, the slot length can move, or the talk could be remote delivery.\n\nIf the timing doesn't work, that's completely fine - I'd rather know than guess, and I'd like to have you in the room next year.\n\nThe Midvale Python Day team"
  }
 ],
 "yes_but": null,
 "close": {
  "record": "Silence past 2027-02-01 is recorded as a no for this slot, and the slot is released to the next candidate in the packet.",
  "referral_ask": ""
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [],
 "note": "Send touch 2 on 2027-01-07 with the confirmed co-speaker and the last note on 2027-01-11; silence past 2027-02-01 is a no."
}

The page's check: kept - nothing to flag

Westbrook Cloud Native Day (a no, with a referral) - invite: not offered - a reply is pasted, so the invitation is already out - the first invitation is written once; plan the follow-ups and the answer instead.

Westbrook Cloud Native Day (a no, with a referral) - followup

Verdict: close the loop; writing to Rafa Oyelaran (Warm); travel gate: clear - six weeks or more; reply: no; 0 follow-up touches; 0 fix-level findings.

Input:

{
 "task": "followup",
 "event": "Event: \"Westbrook Cloud Native Day 2027\" | dates: 2027-04-08 | city: \"Westbrook\" | outside the region's main hub: no | format: in person | audience: 400\nSlot (Q3): \"30-minute talk on cost\" | kind: talk | length: 30 minutes | recording: recorded and published | reach of last edition: none given\nSlot brief (Q1): \"A 30-minute talk on keeping cluster costs inside a budget, for 400 platform engineers\" | invited-review lane: \"light review\"\nPole (Q2): community conference\nQueue (Q3): candidates queued behind this one: 1 | approach: one at a time | two-yes plan: none\nDates (Q4): touch 1 sent or to send on 2027-01-18 | answer by: 2027-02-15 | last usable yes: 2027-02-22 | checked as of: 2027-01-25\nEdition (Q5): a one-off edition\nEffort ceiling (Q6): writer: not named | hours per invitation: 3 | own name spent on referral asks: some\nBudget line (Q7): \"We cover a ticket, travel and one night's lodging; we don't pay speaker fees.\" | covers: [a ticket; travel; lodging] | does not cover: [a speaker fee] | status: confirmed\nNegotiable (Q8): [slot length; remote delivery] | not negotiable: [the date; format; travel dates; a co-speaker seat; a companion ticket; recording terms; session time of day; an introduction]\nAuthority (Q9): the organizer writing agrees fees and conditions\nTitle and abstract deadline: to be agreed",
 "candidate": "Candidate: \"Rafa Oyelaran\" | score: Warm | travels: yes\nWhy (from the packet): \"their KubeCon 2026 talk on cluster cost budgets\"\nEvidence: \"talk recording, 2026-11\"\nPublished contact route: \"email: rafa@oyelaran.example\"\nPacket notes: none\nHow you found them: \"their KubeCon 2026 talk on cluster cost budgets\"\nWarm connection: none\nOther candidates for this slot - never named in any message: [\"Chen Wu\"]\nCarried from the invitation: subject: \"Cluster cost budgets, for 400 platform engineers\" | angles already used: [none]",
 "draft": "",
 "reply": "Thanks for thinking of me, but I have to say no - I'm already committed to another conference that week. You might ask Leila Haddad, who has been writing about the same topic.",
 "facts": "Verdict: \"close the loop\" | invitation ready to send: yes | fix-level findings: 0\nSelf-set lines: a hard answer date at 14 days or fewer from the send date | a low effort ceiling under 2 hours per invitation | the proposed call length 20 minutes | the follow-up word cap 150 (the reference caps only the first email) | the long-runway touch placement. The reference's own: first email cap 150 words (roughly 150, read as 150) | subject under 50 characters | travel floor four to six weeks (28 to 42 days) | at most 3 touches.\nPacket (Q1): [ranked candidates present; the slot brief present; each candidate's why present; the why's evidence present; Hot/Warm/Cold/Skip score present; availability and travel constraints present; the honest budget line present; the published contact route present; the invited-review lane present]\nPole (Q2): \"community conference\" | what the invitation can honestly offer: [the audience and the peer group - genuinely all a community event has; the honest budget line, stated in the first message] | budget line: \"We cover a ticket, travel and one night's lodging; we don't pay speaker fees.\" | notes: Budget is usually thin, which makes the honesty rule load-bearing: an invitation vague about money asks someone to block a weekend on a guess. A sponsor never buys a speaker slot: a candidate arriving through a sponsor relationship is invited on the same terms as anyone else or not at all. Reimbursing travel is normal; a speaking fee is not, and offering lodging does not imply one.\nTravel gate (step 2): candidate travels: yes | days from the answer date to the event start: 52 | result: \"clear - six weeks or more\" | the message must name the travel lead time: no\nFirst-touch channel (step 3) - pick: \"Direct email to a published address\"\n- rung 1: \"Direct email to a published address\"\n- deleted, not demoted: \"Guessed or scraped address\" | reason: the skill: a guessed work address is not a cheap last resort, it is out\n- deleted, not demoted: \"The candidate's community space\" | reason: the skill: soliciting inside a project forum, chat or issue tracker breaches many codes of conduct, publicly and irreversibly\n- deleted, not demoted: \"Referrer-relayed introduction\" | reason: not available: no referrer, mutual contact or program chair is named for Rafa Oyelaran\n- deleted, not demoted: \"Published DM or social contact route\" | reason: not available: no published DM or social route\n- deleted, not demoted: \"In-person ask\" | reason: not available: no event you both attend before the answer date (Q4)\n- notes: Unsolicited written contact to a named individual is consent and e-marketing territory (GDPR, CAN-SPAM and kin) whichever pipe carries it.\nPersonalization depth (step 4) - pick: \"Sourced-why personalization\"\n- rung 1: \"Sourced-why personalization\"\n- rung 2: \"Fresh-work personalization\"\n- rung 3: \"Slot-brief line\"\n- rung 4: \"Program-shaped ask\"\n- deleted, not demoted: \"Merge-field blast to the whole shortlist\" | reason: the skill: one template mail-merged to every candidate makes the whole shortlist worthless, one slip from the CC failure\nFollow-up cadence (step 8) - pick: \"Three-touch angle cadence\"\n- rung 1: \"Three-touch angle cadence\"\n- rung 2: \"Single ask, then stop\"\n- rung 3: \"Long-runway cadence\"\n- deleted, not demoted: \"The bump\" | reason: the skill: never bump, always add an angle - a bumped invitation costs the event's name more than the slot is worth\nDisclosure list (step 5) - every item the first invitation must state, in this order: [\"event basics\"; \"how you found them\"; \"the specific angle\"; \"why this audience\"; \"honest terms\"; \"answer deadline\"; \"next step\"]\n- \"event basics\" | state: dates 2027-04-08 | city \"Westbrook\" | audience 400\n- \"how you found them\" | state: \"their KubeCon 2026 talk on cluster cost budgets\"\n- \"the specific angle\" | state: \"their KubeCon 2026 talk on cluster cost budgets\"\n- \"why this audience\" | state: \"A 30-minute talk on keeping cluster costs inside a budget, for 400 platform engineers\"\n- \"honest terms\" | state: \"We cover a ticket, travel and one night's lodging; we don't pay speaker fees.\" | words the message must carry: [travel; lodging; fee]\n- \"answer deadline\" | state: 2027-02-15\n- \"next step\" | state: a 20-minute call (call length self-set) on a proposed day or date\nMessage rules: word cap 150 | subject under 50 characters | banned vocabulary: [\"revolutionary\"; \"disruptive\"; \"game-changing\"; \"best-in-class\"; \"cutting-edge\"; \"thought leader\"; \"rockstar\"; \"ninja\"; \"guru\"] | banned phrases: [\"let me know if\"; \"came across your profile\"; \"bumping this up\"; \"did you see my email\"; \"just following up\"; \"circling back\"; \"just checking in\"] | no links, attachments, images or logo in the first email | no honorific guessed from a name | no superlative about the candidate | never name another candidate\nDraft audit: no draft pasted\nFollow-up schedule from touch 1 on 2027-01-18 (Three-touch angle cadence), no follow-up touch | stopped: the candidate answered - the sequence stops:\nAngles available: [A narrowed ask] | release date (silence past it is a no): 2027-02-15 | next candidate: \"Chen Wu\" | opt-out rule: honored the moment it arrives, mid-sequence\nReply (step 9): \"no\" | reason: \"timing\" | referral named: \"Leila Haddad\" | opt-out: no\nClose the loop (step 10): reason: \"timing\" | referral: \"Leila Haddad\" | opt-out: \"no\" | next: \"Chen Wu\" | hand-offs: [the reason and any referral to event-speaker-sourcing]\nLabels the references attach: Direct email above a published DM on value - a judged ordering, not a measured one | Trading conditions when money is not available (the Q8 list) - ordinary concessions with a real cost and a real value - not a convention of event practice | Published flat honoraria at two community events - calibration for what a small honorarium looks like, never a rate to counter-offer with | A well-watched video channel makes speakers want to come - an organizers' belief - a hypothesis to test with your own decline reasons, never a finding | Quiet practitioners accept a lighter first ask - organizers report it - reported, not measured | Acceptance rate, time-to-answer by channel, slot-holding time - self-set: quote your own numbers, never an imported sales figure\nFindings (2):\n[info] reply_no (reply): A no: record the reason (timing), ask whether they would suggest someone else, and never re-approach the same person for the same slot.\n[info] humanize (message): Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored."
}

Reply:

{
 "task": "followup",
 "schedule": [],
 "yes_but": null,
 "close": {
  "record": "Recorded a no for this slot - reason: timing, already committed to another conference that week; the reason and the referral go back to sourcing, and Rafa Oyelaran is not re-approached for this slot.",
  "referral_ask": "Thank you for suggesting Leila Haddad - is there anyone else you would recommend for a talk on cluster cost budgets?"
 },
 "opt_out_note": "An opt-out is honored the moment it arrives, mid-sequence: no further touch goes out after it, and the sequence stops.",
 "caveats": [],
 "note": "Close the loop today: thank Rafa Oyelaran, record the timing reason and the referral, and move to the next candidate."
}

The page's check: kept - nothing to flag

The free invitation checklist for the vendor-keynote sample

# Arcwell Platform Summit 2027 - Jordan Ilesanmi - first invitation checklist

**Verdict: ready to send**

_Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored._

## What the first invitation must state

| Item | State | Why |
|---|---|---|
| event basics | dates 2027-04-20 to 2027-04-21 / city "Rotterdam" / audience 1200 | size, location, dates - a speaker cannot evaluate an invitation without knowing when and where |
| how you found them | "their Platform Days 2026 keynote on flags without fear" | in the first line - their talk, their post, a referral; a public profile is consent to be found, never consent to be pitched |
| the specific angle | "their Platform Days 2026 keynote on flags without fear" | drawn from the packet's why - their own recent work, not a compliment about their reputation |
| why this audience | "Opening keynote on running feature flags across a fleet, for 1,200 platform engineers and their leads" | why this slot, this audience, this stage - aimed at the speaker's incentive, not the organizer's need |
| honest terms | "We pay a keynote fee of USD 5,000 plus travel and three nights' lodging." / words the message must carry: [travel; lodging; fee] | what the budget covers, including nothing beyond a ticket or unconfirmed - up front, never a footnote |
| answer deadline | 2027-02-15 | the date you need an answer by |
| next step | a 20-minute call (call length self-set) on a proposed day or date | a specific, low-friction next step with a proposed day or date - never an open-ended let me know |

## Message rules

- Five parts: one line proving you did the homework; the ask in one sentence; why it matters to them; proof as evidence; a specific, low-friction ask with a date.
- At most 150 words. Subject under 50 characters, leading with the specific.
- Banned vocabulary: revolutionary, disruptive, game-changing, best-in-class, cutting-edge, thought leader, rockstar, ninja, guru. Banned phrases: "let me know if", "came across your profile", "bumping this up", "did you see my email", "just following up", "circling back", "just checking in".
- No links, attachments, images or logo. No honorific guessed from a name. No superlative about the candidate. A short signature.

## Channel, depth, cadence

- Channel: Direct email to a published address
- Depth: Program-shaped ask
- Cadence: Long-runway cadence
- Travel gate: clear - six weeks or more

## What the page flagged

- **info** A confirmed co-speaker is the strongest angle available - use it the moment a relevant name confirms, and only if it is true.
- **info** Run the invitation past a humanizer pass in your preferred humanizer skill before sending (workflow step 6): a model-shaped invitation to a practitioner who reads model-shaped email all day is the fastest way to be ignored.

Build the input yourself

Load the engine in node (global.window = global; require("./askkit.js"); require("./askreply.js")), then:

const K = AskKit, R = AskReply;
const f = K.form({ name: "My Meetup 2027", start: "2027-05-20", city: "Ourtown", audience: "120", slotName: "25-minute talk", slotLen: "25",
  sendDate: "2027-03-01", answerBy: "2027-03-29", asOf: "2027-03-01", budgetLine: "We cover a ticket and travel; no fee.", covTravel: "yes", negRemote: "yes",
  candidates: "A. Name | Warm | their talk on X | recording, 2026-10 | email: a@example.org | no |", foundVia: "their talk on X", reviewLane: "light" });
// f.packet, f.pole, f.gate, f.channel, f.depth, f.cadence, f.required, f.audit, f.schedule, f.reply, f.close, f.verdict, f.findings
K.checklistMd(f); K.scheduleCsv(f); K.ics(f)   // the free checklist, schedule and calendar
const b = K.buildInput(f, "invite");          // or "followup"
const wire = K.toWire(b.input);               // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "invite");
// R.check(reply, b)                          // {status: kept or flagged, notes}
// R.carryText(reply, f)                      // the lines the followup 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-ask.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"}
}

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-ask"}' | jq -r '.data.token')

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}' 

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": "invite", "event": "Event: ... | dates: ... | city: ...", "candidate": "Candidate: ... | score: Warm | travels: yes", "draft": "", "reply": "", "facts": "Verdict: ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}' 

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-ask:<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. An invitation carries summary, verdict, channel, depth, subject, message, disclosures, words, humanize_note and caveats; a followup carries schedule, yes_but, close, opt_out_note, caveats and note. The code below prints the headline of either.

KEY="speaker-ask:invite:$(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 // empty' reply.json
jq -r '.subject // empty, .message // empty' reply.json   # an invitation; a followup has .schedule

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-ask:invite:$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json