Run Meet Match from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page decides whether the program runs at all, writes down what may not move, gates consent (only people whose consent covers matching or contact are matchable), re-ranks the four menus (matching mechanism, scheduling mechanic, quota commitment posture, no-show handling) with every deleted rung struck, writes the criterion as a sentence, lays the slots inside the block and never across a session, places a timetable that never double-books a person or a table, lists every unplaced pair with its reason, and holds each named meeting number against what the block can hold - all free, in matchkit.js. The run explains the design, or writes the one meeting brief and the confirmations; the page then holds the reply to its own board (matchreply.js). It never quotes a vendor or platform benchmark and never invents a person, an organization, a slot, a fill rate, a meeting count or a consent.
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":"meet-match"}), so no slug header is needed afterwards. Send it as Authorization: Bearer YOUR_TOKEN. The run body is the input object, sent bare.
| Status | Code | Meaning |
|---|---|---|
| 400 | validation_error | The body is not a JSON object, or a required key (task, event, sides, block, facts) is missing. notes may be an empty string. |
| 401 | unauthorized | No token, or a stale one. Mint a guest token or sign in again. |
| 402 | insufficient_credits | The balance is under min_credits. Price with /estimate first. |
| 403 | forbidden | A guest token tried to run: both lanes are metered and need a personal sign-in. |
| 404 | not_found | Unknown job id. |
| 429 | rate_limited | Back off and retry. |
| 5xx | server_error | Transient. Retry with the same Idempotency-Key so a retry never double-bills. |
The task field comes first
Two lanes, chosen by task:
design- the program explained for the organizer to act on: the verdict, whether to run it at all, what may not move, the matchable and excluded counts, the mechanism with its criterion, the scheduling mechanic, every timetable and unplaced row the page sent, every quota row, the no-show handling and the caveats.brief- the one meeting brief exactly as every participant reads it (who meets whom, when and where, how to book, a missed slot, consent, the organizer on duty), plus one confirmation per placed pair and a note. The lane exists only when the program runs.
A missing or unknown task is answered as design. Both lanes send the same six fields; for the brief, the facts also carry the design's picks, criterion and timetable (the page fills these from the design). The notes field may be an empty string.
The input
| Field | Required | What |
|---|---|---|
task | yes | design or brief. If it is missing or neither, do design and set "task": "design". |
event | yes | the event basics (name, dates, city, attendance, community or vendor-run, the as-of date) and the interview answers Q1 to Q11, the named organizer on duty, how the package words its number with its make-good and criteria, and the criterion's two halves. |
sides | yes | one line per person on side A (name, organization, wants to meet, consented to, matchable, the meeting number named, availability) and on side B (name, organization, interests, consented to, matchable, opted in to meet, availability). |
block | yes | the meeting block as the published grid gives it (date, start and end, slot length, buffer, tables in parallel) and the published sessions it must not cross. |
notes | no | pasted notes; may be empty. A request in the notes is never a commitment. |
facts | yes | the page's verdict, its self-set lines, the run decision, the fixed items, the consent counts, the four menus re-ranked, the criterion, the slots, the timetable rows and unplaced rows it sent (each list says how many it holds and how many were cut), the quota rows, the no-show rule, the measurement fields - each item with its own must line - for the brief task the design it carries, and every finding tagged [fix], [check] or [info]. |
retry_note | no | optional; if present, your previous reply was unusable - follow it. |
The rules the model applies
- Answer no by default. The program runs only when a signed or drafted package names a meeting number (Q1) or the event deliberately assembled two populations that will not find each other in a corridor (Q2). "No meeting program at all" is a real, often-winning rung.
- The nearest-sounding neighbour is a different job: hackathon team formation matches one population onto build teams - route it to samber/dev-event-organizer-skills@hackathon-team-formation and stop. Booth traffic on the expo floor belongs to event-booth-experience.
- Principles that hold everywhere: developer attendees are not buyers by default - an unsolicited vendor meeting is an interruption; registration is not consent to be contacted at community events - sponsors get aggregate demographics, never names; the meeting block is a guest in the grid and loses every conflict; never quote a vendor or platform benchmark - no fill rate, no meeting count, no acceptance or no-show percentage from anyone's marketing.
- Write down what may not move first: the signed meeting number, the published grid, the consent wording each side saw, the floor plan, the room block. A contradiction routes to the sibling that owns it; never move a session.
- Settle consent before collecting anything. Consent scope is fixed by the words a person saw when they submitted; a directory listing or a registration is never re-purposed into matching, and retrofitting it is the one error that cannot be undone.
- The matching criterion is one sentence written before any form: a meeting is a good match when a person from one side in a stated situation meets a person from the other with a stated capability, and both said so themselves. Any pairing where only one side opted in is deleted, not demoted.
- A meeting placed on someone's schedule without their acceptance is deleted, not demoted. Every pairing is confirmed by both sides before the schedule is published; publish one view per person.
- A package may promise only what the block can hold. A meeting number printed with no criteria and no make-good is deleted; a guarantee needs a make-good you can fund after the event; never make good with program access or attendee data. Sponsorship buys access, never program influence.
- Overbooking needs a booked-versus-held count this program measured on a previous edition; without one it is deleted. No deposit or penalty ever falls on the attendee side of a missed meeting.
- Hand the outcome downstream as one generic record; per-sponsor tracking and renewal reporting belong to event-sponsor-fulfillment, never here. Every measure is self-set and compares only against earlier editions of this program.
House rules
- Use only the input and the rules above. Copy the page's short facts exactly: the verdict, the run decision, the picks, the matchable and excluded counts, names, organizations, slots, tables, named and feasible numbers, postures, dates, the publish window and the named contact. Every number in your text must appear in the input.
- Every "must: [...]" line in the facts applies to the item directly above it - every fixed item, every meeting, every unplaced pair and every quota row, not only the first. Do every item it lists.
- Copy the page's timetable rows and unplaced rows exactly as sent, in order - no more, no fewer. When the facts say rows were cut, do not invent the cut rows.
- Label anything that is not one of the rules above, and is not in the input, as your own design; label the page's self-set lines self-set.
- Never invent a person, an organization, a slot, a fill rate, a meeting count or a consent. Never quote a vendor or platform benchmark, never state a percentage, and never carry a number from another event.
- Refer to people by name, as they; never use he, she, him, her, his or hers.
- Never use backticks, never refer to this input's fields by their key names in a sentence, and never copy this prompt's narrative wording into a reply.
- Reply with ONLY one JSON object - no prose before or after, no code fences.
The replies
design
summary- one sentence, at most 40 words: the verdict, the most important open item, and the next step.verdict- the page's verdict, exactly:do not run it,settle consent first,fix firstorready to publish the brief.run- one object:decision- the page's run decision, exactly ("run it" or "do not run it");reason- one sentence that says what decided it, using the page's word from the run must line: "Q1" when a package names a meeting number, "Q2" when two populations were invited separately, "Q1 and Q2" when neither holds.fixed- one string per fixed item of the page, in its order, every item: each names the item exactly ("Signed meeting number", "Published grid", "Consent wording each side saw", "Floor plan", "Room block") and says who owns it.consent- one object:matchable- the page's matchable count, exactly (for example "6 Sponsors, 25 Attendees");excluded- the page's excluded count, exactly;note- one sentence using the page's word from the consent must line: "wording" when a side's consent wording was never shown, "excluded" when people are excluded, "every" when everyone's consent covers matching.mechanism- one object:pick- the page's mechanism, exactly;criterion- the matching criterion as one sentence using the words "good match" and "both" (both sides said so themselves), or, when the page's run decision is "do not run it", one sentence using the words "no meeting program";reason- one sentence that says what moved the pick, using the page's word from the mechanism must line: the question number (for example "Q1", "Q2", "Q3", "Q4" or "Q8") when an interview answer moved it, or the word "default" when nothing did.scheduling- one object:pick- the page's scheduling mechanic, exactly;reason- one sentence using the page's word from the scheduling must line (the question number, or the word "default").timetable- one object per meeting the page sent, in its order, every row, not only the first:slot,table,aandbexactly as the page gives them.[]when the page sent none.unplaced- one object per unplaced row the page sent, in its order, every row:aandbexactly;reason- says why, using the row's word: "slot", "free", "booked" or "table".[]when the page sent none.quota- one object per quota row of the page, in its order, every sponsor with a named number:sponsor,named,feasibleandpostureexactly as the page gives them.[]when the page lists none.no_show- one object:pick- the page's no-show handling, exactly;reason- one sentence using the page's word from the no_show must line (the question number, or the word "default").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": "design",
"summary": "one sentence",
"verdict": "fix first",
"run": { "decision": "run it", "reason": "one sentence" },
"fixed": [ "Signed meeting number - one sentence" ],
"consent": { "matchable": "the page's count", "excluded": "the page's count", "note": "one sentence" },
"mechanism": { "pick": "the page's pick", "criterion": "one sentence", "reason": "one sentence" },
"scheduling": { "pick": "the page's pick", "reason": "one sentence" },
"timetable": [ { "slot": "the page's slot", "table": "the page's table", "a": "the page's name", "b": "the page's name" } ],
"unplaced": [ { "a": "the page's name", "b": "the page's name", "reason": "one sentence" } ],
"quota": [ { "sponsor": "the page's sponsor", "named": "10", "feasible": "3", "posture": "the page's posture" } ],
"no_show": { "pick": "the page's pick", "reason": "one sentence" },
"caveats": [ "a caveat" ]
}
The page holds it to its own board: the verdict and the run decision exactly, with the question that decided it ("Q1", "Q2") in the reason; the five fixed items in order; the matchable and excluded counts exactly with "wording", "excluded" or "every" in the note; the mechanism, scheduling and no-show picks exactly, each with the question that moved it or "default"; a criterion with "good match" and "both" (or "no meeting program"); every timetable row the page sent - slot, table and both names - in order; every unplaced row with its reason word ("slot", "free", "booked", "table"); every quota row's sponsor, named, feasible and posture; caveats when the page has a fix; and no number, percentage, benchmark, quote or pronoun the input does not hold. Required words are read tolerantly: "each side accepted" is both, "a named number" is Q1.
brief
title- one line; it must contain the event's name exactly.who_meets_whom- the matching criterion as one sentence, using the words "good match" and "both".when_and_where- one or two sentences: contains the block's date exactly and the page's publish window exactly (for example "14:00-14:55"), says where meetings happen, and says the block never crosses a session (the word "session").how_to_book- one short paragraph on how a pairing comes to exist and gets its slot, using the page's scheduling word: "book" for self-service booking, "introduction" for no booked slots, "accept" for hybrid, "confirm" for an organizer-assigned grid. Both sides accept every pairing.missed_slot- one or two sentences on what happens to a missed slot, using the page's no-show word: "remind" for reconfirm-and-remind, "standby" for standby refill, "missed" for nothing, "overbook" for slot overbooking. Never a deposit or a penalty.contact- the page's named organizer exactly, or the words "to be named".consent_note- one short paragraph: what is shared, with whom, on what trigger, how a person stops (the word "withdraw") and when the pool ends (the word "deleted").confirmations- one object per meeting the page sent, in its order, every row, not only the first:a,b,slotandtableexactly as the page gives them;message- one or two short sentences to both people asking them to confirm (the word "confirm") before the schedule is published.[]when the page sent none.note- one sentence: when the page's verdict is notready to publish the brief, begin with "Not ready to publish:" and say what to fix first; otherwise use the word "publish" and say what happens next.
{
"task": "brief",
"title": "the event's name - 1:1 meeting brief",
"who_meets_whom": "one sentence",
"when_and_where": "one or two sentences",
"how_to_book": "one paragraph",
"missed_slot": "one or two sentences",
"contact": "the page's named organizer",
"consent_note": "one paragraph",
"confirmations": [ { "a": "the page's name", "b": "the page's name", "slot": "the page's slot", "table": "the page's table", "message": "one or two sentences" } ],
"note": "one sentence"
}
The page requires the event's name in the title; "good match" and "both" in who meets whom; the block's date, the publish window and "session" in when and where; the scheduling word in how to book ("book", "introduction", "accept" or "confirm"); the no-show word in the missed slot ("remind", "standby", "missed" or "overbook"); the named contact or "to be named"; "withdraw" and "deleted" in the consent note; one confirmation per timetable row the page sent, exactly, each message asking both to "confirm"; and a note beginning "Not ready to publish:" unless the page is ready.
Worked examples - both lanes
Two of the page's four free samples (fictional events, organizations and people). 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 brief input carries its sample's saved design, as the handoff does.
A 700-person conference, 10 guaranteed meetings and a block the keynote overlaps - design
Verdict: fix first; ready to publish: no; run it; matchable: 6 Sponsors, 25 Attendees; mechanism: Mutual opt-in; scheduling: Self-service booking; 12 of 32 pairs placed in 12 seats, published as 14:00-14:55; quota: Best-efforts target; no-show: Standby refill; 5 fix-level findings.
Input:
{
"task": "design",
"event": "Event: \"Harbourline DevConf 2027\" | dates: 2027-09-14 to 2027-09-15 | city: \"Port Avel\" | attendance: 700 | run by: \"a community event\" | as of: 2027-07-01\nQ1 a meeting number in a package: \"a drafted package names a number\"\nQ2 the two sides: \"one audience with sponsors standing in it\" | invited specifically to meet each other: \"no\"\nQ3 expected pairs: \"more than a handful\"\nQ4 data held: \"an opt-in profile form the registration flow already collects, on both sides\" | a sponsor's own target list: no\nQ5 consent wording seen: Sponsors: \"recorded as shown\" | Attendees: \"recorded as shown\" | the wording: \"Join the 1:1 meeting pool: a sponsor you opt in to sees your name, company and interests once you both accept, you can withdraw any time, the pool is deleted 30 days after the event.\"\nQ6 where meetings happen: \"the mezzanine meeting lounge, booked by the organizers\" | room block contracted: no\nQ7 the block in the grid: \"placed and fixed in the published grid\"\nQ8 staffing during the block: \"someone is staffed at the meeting area during the block\"\nQ9 booking opens: 2027-08-01 | schedule stops moving: 2027-09-07\nQ10 edition: \"a one-off edition\" | measured on this program last edition: none\nQ11 effort ceiling: \"medium\" | political capital to tell a paying sponsor: \"yes\"\nNamed organizer on duty: \"Ines Varga, sponsor desk\"\nPackage wording: \"a number printed with no criteria and no make-good\" | make-good: \"not stated\" | criteria: \"not written\"\nCriterion halves: Sponsors situation: \"works on a product area and wants feedback from people running it in production\" | Attendees capability: \"runs or builds in that same area and said they want to talk about it\"",
"sides": "Sponsors (side A) - 6, one per line:\n- a 1: \"Mara Quist\" | organization: \"Brightpath Cloud\" | wants to meet: [observability; kubernetes] | consented to: \"matching\" | matchable: yes | meeting number named: 10 | available: \"the whole block\"\n- a 2: \"Tomas Ilves\" | organization: \"Corvane Data\" | wants to meet: [databases; data pipelines] | consented to: \"matching\" | matchable: yes | meeting number named: 10 | available: \"the whole block\"\n- a 3: \"Ines Duarte\" | organization: \"Delphin Labs\" | wants to meet: [security; identity] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 4: \"Kofi Mensah\" | organization: \"Equivane Dev\" | wants to meet: [developer tooling; ci; cd] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 5: \"Lena Park\" | organization: \"Fernhill AI\" | wants to meet: [machine learning; data pipelines] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 6: \"Ravi Nair\" | organization: \"Gridline Pay\" | wants to meet: [payments; apis] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\nAttendees (side B) - 40, one per line:\n- b 1: \"Ada Brennan\" | organization: \"Kelpwise\" | interests: [observability; kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud; equivane dev] | available: \"the whole block\"\n- b 2: \"Bo Lindqvist\" | organization: \"Northmark\" | interests: [databases] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 3: \"Cara Mbeki\" | organization: \"Tallowsoft\" | interests: [kubernetes; ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud; equivane dev] | available: \"the whole block\"\n- b 4: \"Dev Raman\" | organization: \"Saltgrid\" | interests: [data pipelines; machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data; fernhill ai] | available: \"the whole block\"\n- b 5: \"Elif Sahin\" | organization: \"Brooklarch Health\" | interests: [security] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 6: \"Femi Adeyemi\" | organization: \"Quaymarrow Bank\" | interests: [payments; security] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay; delphin labs] | available: \"the whole block\"\n- b 7: \"Gus Moreau\" | organization: \"Larchfield\" | interests: [observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 8: \"Hana Sato\" | organization: \"Moorgate Media\" | interests: [databases; apis] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data; gridline pay] | available: \"the whole block\"\n- b 9: \"Ivo Petrov\" | organization: \"Pinecrest\" | interests: [machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 10: \"Jade Okafor\" | organization: \"Riverbend\" | interests: [developer tooling] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 11: \"Kai Nakamura\" | organization: \"Stonefly\" | interests: [kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 12: \"Lu Chen\" | organization: \"Thornbury\" | interests: [data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 13: \"Mia Kowalski\" | organization: \"Umberly\" | interests: [identity] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 14: \"Nils Berg\" | organization: \"Vantor\" | interests: [apis] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 15: \"Omar Haddad\" | organization: \"Westray\" | interests: [observability; ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: \"any\" | available: \"the whole block\"\n- b 16: \"Pia Rossi\" | organization: \"Yarrowby\" | interests: [databases] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 17: \"Quinn Abara\" | organization: \"Zellmark\" | interests: [machine learning; data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai; corvane data] | available: \"the whole block\"\n- b 18: \"Rosa Ibarra\" | organization: \"Ashcombe\" | interests: [kubernetes; observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 19: \"Sami Virtanen\" | organization: \"Birchwood\" | interests: [security; identity] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 20: \"Tara Doyle\" | organization: \"Cobbleton\" | interests: [ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 21: \"Uma Iyer\" | organization: \"Dunmore\" | interests: [payments] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 22: \"Viktor Hale\" | organization: \"Elmstead\" | interests: [databases; data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 23: \"Wen Zhou\" | organization: \"Foxley\" | interests: [observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: [16:00-17:00]\n- b 24: \"Xena Laine\" | organization: \"Glenrock\" | interests: [machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 25: \"Yusuf Kaya\" | organization: \"Hawthorne\" | interests: [developer tooling; kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev; brightpath cloud] | available: \"the whole block\"\n- b 26: \"Zoe Grant\" | organization: \"Ivyhill\" | interests: [observability] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 27: \"Abel Moss\" | organization: \"Juniper Row\" | interests: [databases] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 28: \"Bree Holt\" | organization: \"Kestrel Bay\" | interests: [security] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 29: \"Cyril Vance\" | organization: \"Lowmoor\" | interests: [ci; cd] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 30: \"Dina Faro\" | organization: \"Marlow Works\" | interests: [machine learning] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 31: \"Edo Ferri\" | organization: \"Netherby\" | interests: [payments] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 32: \"Fay Lund\" | organization: \"Oakhurst\" | interests: [kubernetes] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 33: \"Gil Ortega\" | organization: \"Penhallow\" | interests: [data pipelines] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 34: \"Hal Kimura\" | organization: \"Quillon\" | interests: [identity] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 35: \"Iris Novak\" | organization: \"Redcliffe\" | interests: [developer tooling] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: \"any\" | available: \"the whole block\"\n- b 36: \"Jon Arden\" | organization: \"Seacombe\" | interests: [apis] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 37: \"Kim Soler\" | organization: \"Trevose\" | interests: [observability] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: \"any\" | available: \"the whole block\"\n- b 38: \"Leo Strand\" | organization: \"Underhill\" | interests: [databases] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 39: \"Mona Reyes\" | organization: \"Vellacott\" | interests: [machine learning] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 40: \"Ned Cole\" | organization: \"Wexcombe\" | interests: [security] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"",
"block": "Block: date: 2027-09-14 | as published: \"14:00-15:30\" | slot length: 15 min | buffer: 5 min | tables in parallel: 4\nPublished sessions it must not cross - 2: [15:00-15:45 Keynote: the state of the platform; 12:30-13:30 Lunch]",
"notes": "Gold prospectus draft, 2027-06-20: 10 guaranteed meetings for Brightpath Cloud and Corvane Data. Brightpath asked whether we can send them the attendee list.",
"facts": "Verdict: \"fix first\" | ready to publish the brief: no | fix-level findings: 5\nSelf-set lines: [the fit score is the count of shared tags; at most 20 timetable rows are sent; at most 10 unplaced rows are sent; booking opening within 14 days is soon; a summary cap of 40 words; at most 5 caveats; the criterion template is the page's wording]\nNever stated: [a vendor or platform benchmark; a fill rate; a no-show or acceptance percentage; a meeting count from another event; a person, an organization, a slot or a consent the input does not hold]\nRun at all (step 1): decision: \"run it\" | moved by: \"Q1\" | named numbers: 2 | two populations: no\n run must: [decision \"run it\" exactly; reason uses the word \"Q1\"]\nFixed (step 2) - what may not move, in this order - 5:\n- fixed 1: \"Signed meeting number\" | detail: Brightpath Cloud 10, Corvane Data 10 (a drafted package names a number) - an input to deliver | owner: \"event-sponsor-agreement\"\n must: [contains \"Signed meeting number\"]\n- fixed 2: \"Published grid\" | detail: the block 2027-09-14 14:00-15:30 among the sessions 15:00-15:45 Keynote: the state of the platform, 12:30-13:30 Lunch - the block is a guest, a session never moves | owner: \"event-schedule-design\"\n must: [contains \"Published grid\"]\n- fixed 3: \"Consent wording each side saw\" | detail: Sponsors recorded as shown, Attendees recorded as shown - scope is fixed when a person submits, never retrofitted | owner: \"the people who submitted\"\n must: [contains \"Consent wording each side saw\"]\n- fixed 4: \"Floor plan\" | detail: meetings happen at the mezzanine meeting lounge, booked by the organizers | owner: \"event-venue-sourcing\"\n must: [contains \"Floor plan\"]\n- fixed 5: \"Room block\" | detail: no room block contracted | owner: \"event-venue-sourcing\"\n must: [contains \"Room block\"]\nConsent (step 4): matchable: \"6 Sponsors, 25 Attendees\" | excluded: \"0 Sponsors, 15 Attendees\" | directory only: 15 | registration only: 0 | nothing: 0 | wording Sponsors: \"recorded as shown\" | wording Attendees: \"recorded as shown\"\n consent must: [matchable \"6 Sponsors, 25 Attendees\" exactly; excluded \"0 Sponsors, 15 Attendees\" exactly; note uses the word \"excluded\"]\nMatching mechanism menu (step 3), re-ranked - pick: \"Mutual opt-in\"\n- rung 1: \"Mutual opt-in\" | moved: made the pick by Q1: a package names a meeting number - promote the default to mutual opt-in\n- rung 2: \"Open directory\"\n- rung 3: \"Scored ranking\" | moved: promoted by Q4: structured, comparable profile data already exists on both sides from a form collected anyway\n- rung 4: \"Organizer brokering\" | moved: promoted by Q8: a named person is already staffed and can hand-pair\n- rung 5: \"No meeting program\" | moved: demoted by Q1: the program runs\n- deleted, not demoted: \"Any pairing where only one side opted in - handing a sponsor a list to book against\" | reason: the mechanic behind every ambushed-meeting complaint\n- notes: Two of the five axis orderings are argued, not asserted: effort tops at brokering because it never amortizes; compliance tops at scored ranking because it derives new facts about a person. Ten pairs, zero strict-dominance relations: relevance rewards human judgment, certainty rewards volume and structure.\nMechanism: pick: \"Mutual opt-in\" | moved by: \"Q1\" | candidate pairs: 32\nCriterion (the organizer's two halves): \"A meeting is a good match when a person from Sponsors who works on a product area and wants feedback from people running it in production meets a person from Attendees who runs or builds in that same area and said they want to talk about it, and both opted in to the pairing themselves.\"\n mechanism must: [pick \"Mutual opt-in\" exactly; reason uses the word \"Q1\"; criterion uses the words \"good match\" and \"both\"]\nScheduling mechanic menu (step 5), re-ranked - pick: \"Self-service booking\"\n- rung 1: \"Self-service booking\"\n- rung 2: \"No booked slots\"\n- rung 3: \"Hybrid\"\n- rung 4: \"Organizer-assigned grid\"\n- deleted, not demoted: \"A meeting placed on someone's schedule without their acceptance\" | reason: it manufactures quota out of people's time, and a meeting nobody accepted is a no-show already on the schedule\n- notes: The delivered-quota axis is rank-identical to inverse effort - a warning, not a result; attendee autonomy is the axis that carries this menu. No compliance-cost axis applies here. Six pairs, zero strict-dominance relations.\nScheduling: pick: \"Self-service booking\" | moved by: \"default\"\n scheduling must: [pick \"Self-service booking\" exactly; reason uses the word \"default\"]\nBlock (step 5): date: 2027-09-14 | as published: \"14:00-15:30\" | crosses sessions: 1 | slots laid: 3 | publish window: \"14:00-14:55\" | capacity: 12 meetings\nSlots - 3: [slot 1 \"14:00-14:15\"; slot 2 \"14:20-14:35\"; slot 3 \"14:40-14:55\"]\nTimetable (step 5) - placed: 12 of 32 candidate pairs | rows below: 12 of 12 | cut: 0 (at most 20 sent, self-set - the page's CSV holds every row) - in this order:\n- meeting 1: slot: \"14:00-14:15\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Ada Brennan\" | kind: draft placement - both book or confirm\n must: [slot \"14:00-14:15\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Ada Brennan\" exactly]\n- meeting 2: slot: \"14:00-14:15\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Viktor Hale\" | kind: draft placement - both book or confirm\n must: [slot \"14:00-14:15\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Viktor Hale\" exactly]\n- meeting 3: slot: \"14:00-14:15\" | table: \"Table 3\" | a: \"Ines Duarte\" | b: \"Sami Virtanen\" | kind: draft placement - both book or confirm\n must: [slot \"14:00-14:15\" exactly; table \"Table 3\" exactly; a \"Ines Duarte\" exactly; b \"Sami Virtanen\" exactly]\n- meeting 4: slot: \"14:00-14:15\" | table: \"Table 4\" | a: \"Kofi Mensah\" | b: \"Cara Mbeki\" | kind: draft placement - both book or confirm\n must: [slot \"14:00-14:15\" exactly; table \"Table 4\" exactly; a \"Kofi Mensah\" exactly; b \"Cara Mbeki\" exactly]\n- meeting 5: slot: \"14:20-14:35\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Rosa Ibarra\" | kind: draft placement - both book or confirm\n must: [slot \"14:20-14:35\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Rosa Ibarra\" exactly]\n- meeting 6: slot: \"14:20-14:35\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Bo Lindqvist\" | kind: draft placement - both book or confirm\n must: [slot \"14:20-14:35\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Bo Lindqvist\" exactly]\n- meeting 7: slot: \"14:20-14:35\" | table: \"Table 3\" | a: \"Lena Park\" | b: \"Dev Raman\" | kind: draft placement - both book or confirm\n must: [slot \"14:20-14:35\" exactly; table \"Table 3\" exactly; a \"Lena Park\" exactly; b \"Dev Raman\" exactly]\n- meeting 8: slot: \"14:20-14:35\" | table: \"Table 4\" | a: \"Ravi Nair\" | b: \"Femi Adeyemi\" | kind: draft placement - both book or confirm\n must: [slot \"14:20-14:35\" exactly; table \"Table 4\" exactly; a \"Ravi Nair\" exactly; b \"Femi Adeyemi\" exactly]\n- meeting 9: slot: \"14:40-14:55\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Cara Mbeki\" | kind: draft placement - both book or confirm\n must: [slot \"14:40-14:55\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Cara Mbeki\" exactly]\n- meeting 10: slot: \"14:40-14:55\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Dev Raman\" | kind: draft placement - both book or confirm\n must: [slot \"14:40-14:55\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Dev Raman\" exactly]\n- meeting 11: slot: \"14:40-14:55\" | table: \"Table 3\" | a: \"Ines Duarte\" | b: \"Elif Sahin\" | kind: draft placement - both book or confirm\n must: [slot \"14:40-14:55\" exactly; table \"Table 3\" exactly; a \"Ines Duarte\" exactly; b \"Elif Sahin\" exactly]\n- meeting 12: slot: \"14:40-14:55\" | table: \"Table 4\" | a: \"Kofi Mensah\" | b: \"Omar Haddad\" | kind: draft placement - both book or confirm\n must: [slot \"14:40-14:55\" exactly; table \"Table 4\" exactly; a \"Kofi Mensah\" exactly; b \"Omar Haddad\" exactly]\nUnplaced (step 5) - pairs both want, not placed: 20 | rows below: 10 of 20 | cut: 10 (at most 10 sent, self-set) - in this order:\n- unplaced 1: a: \"Mara Quist\" | b: \"Gus Moreau\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Gus Moreau\" exactly; reason uses the word \"booked\"]\n- unplaced 2: a: \"Tomas Ilves\" | b: \"Hana Sato\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Hana Sato\" exactly; reason uses the word \"booked\"]\n- unplaced 3: a: \"Mara Quist\" | b: \"Kai Nakamura\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Kai Nakamura\" exactly; reason uses the word \"booked\"]\n- unplaced 4: a: \"Tomas Ilves\" | b: \"Lu Chen\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Lu Chen\" exactly; reason uses the word \"booked\"]\n- unplaced 5: a: \"Mara Quist\" | b: \"Omar Haddad\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Omar Haddad\" exactly; reason uses the word \"booked\"]\n- unplaced 6: a: \"Tomas Ilves\" | b: \"Pia Rossi\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Pia Rossi\" exactly; reason uses the word \"booked\"]\n- unplaced 7: a: \"Mara Quist\" | b: \"Wen Zhou\" | why: \"no slot where both are free\"\n must: [a \"Mara Quist\" exactly; b \"Wen Zhou\" exactly; reason uses the word \"free\"]\n- unplaced 8: a: \"Tomas Ilves\" | b: \"Quinn Abara\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Quinn Abara\" exactly; reason uses the word \"booked\"]\n- unplaced 9: a: \"Mara Quist\" | b: \"Yusuf Kaya\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Yusuf Kaya\" exactly; reason uses the word \"booked\"]\n- unplaced 10: a: \"Lena Park\" | b: \"Quinn Abara\" | why: \"every table is taken in every slot both are free\"\n must: [a \"Lena Park\" exactly; b \"Quinn Abara\" exactly; reason uses the word \"table\"]\nQuota commitment posture menu (step 6), re-ranked - pick: \"Best-efforts target\"\n- rung 1: \"Best-efforts target\"\n- rung 2: \"No meeting promise\"\n- rung 3: \"Guaranteed count with criteria\"\n- rung 4: \"Guaranteed count\" | moved: demoted by Q10: no booked-versus-held count measured on a previous edition of this program - a guarantee would rest on nothing measured\n- deleted, not demoted: \"A meeting number printed in a prospectus with no criteria and no stated make-good\" | reason: the same commitment with the remedy left to be improvised in front of an unhappy sponsor\n- notes: The two guarantees tie on compliance cost, argued not dodged: both are a countersigned number to deliver or remedy. Price is rank-identical to inverse effort; renewal survivability makes this menu decidable. Six pairs, zero strict-dominance relations. Sponsorship buys access, never program influence.\nQuota (step 6) - sponsors with a named number: 2 | named in all: 20 | the block holds: 12 - in this order:\n- quota 1: sponsor: \"Brightpath Cloud\" | named: \"10\" | feasible: \"3\" | booked here: 3 | posture: \"Best-efforts target\" | status: over-committed by 7\n must: [sponsor \"Brightpath Cloud\" exactly; named \"10\" exactly; feasible \"3\" exactly; posture \"Best-efforts target\" exactly]\n- quota 2: sponsor: \"Corvane Data\" | named: \"10\" | feasible: \"3\" | booked here: 3 | posture: \"Best-efforts target\" | status: over-committed by 7\n must: [sponsor \"Corvane Data\" exactly; named \"10\" exactly; feasible \"3\" exactly; posture \"Best-efforts target\" exactly]\nNo-show handling menu (step 7), re-ranked - pick: \"Standby refill\"\n- rung 1: \"Standby refill\" | moved: made the pick by Q8: someone is already staffed at the meeting area during the block - the queue has someone to drain it\n- rung 2: \"Reconfirm-and-remind\"\n- rung 3: \"Nothing\"\n- deleted, not demoted: \"Slot overbooking\" | reason: Q10: no measured booked-versus-held count from a previous edition of this same program - and the event-level show-up bands are a different unit\n- deleted, not demoted: \"A deposit, a forfeited benefit, or any penalty on the attendee side of a missed meeting\" | reason: it puts a price on a conversation the attendee was invited to have\n- notes: Quota protected is rank-identical to inverse effort; counterpart experience does the work, and doing nothing outranks overbooking on it - an empty table disappoints one person, a collision turns away someone who did everything asked.\nNo-show: pick: \"Standby refill\" | moved by: \"Q8\" | the rule: every pairing confirmed by both sides before the schedule is published\n no_show must: [pick \"Standby refill\" exactly; reason uses the word \"Q8\"]\nMeasurement (step 9) - per pair: [booked; held; empty; replaced] | measures, all self-set: [Held against booked; Booked against promised; Mutual-acceptance rate; Empty-slot count; Unwanted-meeting complaints; Confirmation completeness]\nHand-off (step 10): one generic outcome record, one row per pairing, to event-sponsor-fulfillment; no per-sponsor tracking or renewal report here.\nDesign must: [summary at most 40 words; verdict \"fix first\" exactly; fixed carries the 5 items above, in this order; timetable copies the 12 rows above, in this order; unplaced copies the 10 rows above, in this order; quota copies the 2 rows above, in this order; caveats carry the fix findings first, at most 5]\nBrief must: [title contains \"Harbourline DevConf 2027\"; who_meets_whom uses the words \"good match\" and \"both\"; when_and_where contains \"2027-09-14\" and \"14:00-14:55\" and the word \"session\"; how_to_book uses the word \"book\"; missed_slot uses the word \"standby\"; contact \"Ines Varga, sponsor desk\" exactly; consent_note uses the words \"withdraw\" and \"deleted\"; confirmations copies the 12 rows above, in this order, each message uses the word \"confirm\"] | brief note must: [begin \"Not ready to publish:\" and say what to fix first]\nFindings (17):\n[fix] block_session_1 (block): The block 14:00-15:30 crosses the published session \"15:00-15:45 Keynote: the state of the platform\" by 30 minutes. The block is a guest in the grid and loses every conflict: the page lays no slot inside the session, so publish the block as \"14:00-14:55\" or route its placement to samber/dev-event-organizer-skills@event-schedule-design - never move the session.\n[fix] quota_over_1 (quota): \"Brightpath Cloud\": the package names 10 meetings; this block can hold at most 3 for it (3 slots it is free in, 8 counterparts who opted in and share a tag) - over-committed by 7. Never fill it with whoever is free: change the drafted number or its posture before the package is sold.\n[fix] quota_over_2 (quota): \"Corvane Data\": the package names 10 meetings; this block can hold at most 3 for it (3 slots it is free in, 7 counterparts who opted in and share a tag) - over-committed by 7. Never fill it with whoever is free: change the drafted number or its posture before the package is sold.\n[fix] quota_sum (quota): The named numbers add up to 20; the block holds 12 meetings in all (3 slots x 4 tables) - the packages promise more than the block can hold.\n[fix] pkg_bare (quota): The package prints a meeting number with no criteria and no make-good - the rung the skill deletes, not demotes. Rewrite it as Best-efforts target with written criteria; samber/dev-event-organizer-skills@event-sponsor-agreement drafts the clause.\n[check] one_audience (run): Q2: one audience with sponsors standing in it - the program runs only to deliver the named number. Developer attendees are not buyers by default: an unsolicited vendor meeting is an interruption, so only people who opted in are matched.\n[check] retrofit_B (consent): 15 people on Attendees consented to a directory listing only - excluded from matching. Retrofitting consent after a directory is live is the one error here that cannot be undone: ask afresh with new wording, and they stay excluded until they say yes.\n[check] self_count (scheduling): Self-service booking delivers meetings but cannot guarantee a count - a named number on it is a target at most; promote to hybrid the moment a package signs the number.\n[check] list_request (consent): The notes ask to hand a sponsor a list of people - the deleted rung: a pairing where only one side opted in. Sponsors get aggregate demographics, never names; only people who opted in meet anyone.\n[info] pairs_blocked (pairs): 25 requests came from or reached someone whose consent does not cover matching - no pair is made from them.\n[info] pairs_notag (pairs): 5 opt-ins share no tag with the person asked - under the criterion that is not a match; the organizer may read them by hand.\n[info] unplaced (scheduling): 20 pairs both sides want are not placed - the block holds 12 meetings (3 slots x 4 tables); each is listed with its reason, and none is placed on anyone's schedule without both acceptances.\n[info] confirm_rule (noshow): Confirm every pairing with both sides before the schedule is published - publication is the point of no return; then publish one view per person, never the whole pair grid.\n[info] measure (measure): Every measure here is self-set and becomes meaningful only across editions of this program: record per pair booked, held, empty or replaced, and every complaint about an unwanted meeting.\n[info] notes (context): The pasted notes are context: a request in the notes is never a commitment.\n[info] handoff (scope): Hand the outcome downstream as one generic record - one row per pairing: the two sides, accepted by both, held, refilled from standby, the criteria checked. Per-sponsor tracking and renewal reporting belong to samber/dev-event-organizer-skills@event-sponsor-fulfillment, never built here.\n[info] scope (scope): No vendor or platform benchmark appears anywhere: no fill rate, no no-show percentage, no meeting count from another event. Every number on the page is the organizer's own or a count of it, and every rule of the page's own is labelled self-set."
}
Reply:
{
"task": "design",
"summary": "Fix first: two drafted packages promise 10 meetings each where the block holds 3 per sponsor, and the keynote overlaps the block - rewrite the packages and publish the block as laid.",
"verdict": "fix first",
"run": {
"decision": "run it",
"reason": "Q1: a package names a meeting number for 2 sponsors - that is an input to deliver, not a decision to take."
},
"fixed": [
"Signed meeting number - Brightpath Cloud 10, Corvane Data 10 (a drafted package names a number) - an input to deliver (event-sponsor-agreement).",
"Published grid - the block 2027-09-14 14:00-15:30 among the sessions 15:00-15:45 Keynote: the state of the platform, 12:30-13:30 Lunch - the block is a guest; a session never moves (event-schedule-design).",
"Consent wording each side saw - Sponsors recorded as shown, Attendees recorded as shown - scope is fixed when a person submits, never retrofitted (the people who submitted).",
"Floor plan - meetings happen at the mezzanine meeting lounge, booked by the organizers (event-venue-sourcing).",
"Room block - no room block contracted (event-venue-sourcing)."
],
"consent": {
"matchable": "6 Sponsors, 25 Attendees",
"excluded": "0 Sponsors, 15 Attendees",
"note": "15 people whose consent covers only a directory listing are excluded - a directory consent is never re-purposed into matching."
},
"mechanism": {
"pick": "Mutual opt-in",
"criterion": "A meeting is a good match when a person from Sponsors who works on a product area and wants feedback from people running it in production meets a person from Attendees who runs or builds in that same area and said they want to talk about it, and both opted in to the pairing themselves.",
"reason": "Q1: a package names a meeting number - promote the default to mutual opt-in."
},
"scheduling": {
"pick": "Self-service booking",
"reason": "Nothing in the interview moved this menu, so the default stands: each side states when it is free, the counterpart books - every meeting on an attendee's day is one they chose; cannot guarantee a count."
},
"timetable": [
{
"slot": "14:00-14:15",
"table": "Table 1",
"a": "Mara Quist",
"b": "Ada Brennan"
},
{
"slot": "14:00-14:15",
"table": "Table 2",
"a": "Tomas Ilves",
"b": "Viktor Hale"
},
{
"slot": "14:00-14:15",
"table": "Table 3",
"a": "Ines Duarte",
"b": "Sami Virtanen"
},
{
"slot": "14:00-14:15",
"table": "Table 4",
"a": "Kofi Mensah",
"b": "Cara Mbeki"
},
{
"slot": "14:20-14:35",
"table": "Table 1",
"a": "Mara Quist",
"b": "Rosa Ibarra"
},
{
"slot": "14:20-14:35",
"table": "Table 2",
"a": "Tomas Ilves",
"b": "Bo Lindqvist"
},
{
"slot": "14:20-14:35",
"table": "Table 3",
"a": "Lena Park",
"b": "Dev Raman"
},
{
"slot": "14:20-14:35",
"table": "Table 4",
"a": "Ravi Nair",
"b": "Femi Adeyemi"
},
{
"slot": "14:40-14:55",
"table": "Table 1",
"a": "Mara Quist",
"b": "Cara Mbeki"
},
{
"slot": "14:40-14:55",
"table": "Table 2",
"a": "Tomas Ilves",
"b": "Dev Raman"
},
{
"slot": "14:40-14:55",
"table": "Table 3",
"a": "Ines Duarte",
"b": "Elif Sahin"
},
{
"slot": "14:40-14:55",
"table": "Table 4",
"a": "Kofi Mensah",
"b": "Omar Haddad"
}
],
"unplaced": [
{
"a": "Mara Quist",
"b": "Gus Moreau",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Tomas Ilves",
"b": "Hana Sato",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Mara Quist",
"b": "Kai Nakamura",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Tomas Ilves",
"b": "Lu Chen",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Mara Quist",
"b": "Omar Haddad",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Tomas Ilves",
"b": "Pia Rossi",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Mara Quist",
"b": "Wen Zhou",
"reason": "No slot where both are free."
},
{
"a": "Tomas Ilves",
"b": "Quinn Abara",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Mara Quist",
"b": "Yusuf Kaya",
"reason": "Every slot both are free is already booked for one of them."
},
{
"a": "Lena Park",
"b": "Quinn Abara",
"reason": "Every table is taken in every slot both are free."
}
],
"quota": [
{
"sponsor": "Brightpath Cloud",
"named": "10",
"feasible": "3",
"posture": "Best-efforts target"
},
{
"sponsor": "Corvane Data",
"named": "10",
"feasible": "3",
"posture": "Best-efforts target"
}
],
"no_show": {
"pick": "Standby refill",
"reason": "Q8: someone is already staffed at the meeting area during the block - the queue has someone to drain it."
},
"caveats": [
"The block 14:00-15:30 crosses the published session \"15:00-15:45 Keynote: the state of the platform\" by 30 minutes.",
"\"Brightpath Cloud\": the package names 10 meetings; this block can hold at most 3 for it (3 slots it is free in, 8 counterparts who opted in and share a tag) - over-committed by 7.",
"\"Corvane Data\": the package names 10 meetings; this block can hold at most 3 for it (3 slots it is free in, 7 counterparts who opted in and share a tag) - over-committed by 7.",
"The named numbers add up to 20; the block holds 12 meetings in all (3 slots x 4 tables) - the packages promise more than the block can hold.",
"The package prints a meeting number with no criteria and no make-good - the rung the skill deletes, not demotes."
]
}
The page's check: kept - nothing to flag
The same, block moved and the quota posture fixed - ready to publish - brief
Verdict: ready to publish the brief; ready to publish: yes; run it; matchable: 6 Sponsors, 25 Attendees; mechanism: Mutual opt-in; scheduling: Self-service booking; 16 of 32 pairs placed in 16 seats, published as 13:30-14:45; quota: Best-efforts target; no-show: Standby refill; 0 fix-level findings.
Input:
{
"task": "brief",
"event": "Event: \"Harbourline DevConf 2027\" | dates: 2027-09-14 to 2027-09-15 | city: \"Port Avel\" | attendance: 700 | run by: \"a community event\" | as of: 2027-07-01\nQ1 a meeting number in a package: \"a drafted package names a number\"\nQ2 the two sides: \"one audience with sponsors standing in it\" | invited specifically to meet each other: \"no\"\nQ3 expected pairs: \"more than a handful\"\nQ4 data held: \"an opt-in profile form the registration flow already collects, on both sides\" | a sponsor's own target list: no\nQ5 consent wording seen: Sponsors: \"recorded as shown\" | Attendees: \"recorded as shown\" | the wording: \"Join the 1:1 meeting pool: a sponsor you opt in to sees your name, company and interests once you both accept, you can withdraw any time, the pool is deleted 30 days after the event.\"\nQ6 where meetings happen: \"the mezzanine meeting lounge, booked by the organizers\" | room block contracted: no\nQ7 the block in the grid: \"placed and fixed in the published grid\"\nQ8 staffing during the block: \"someone is staffed at the meeting area during the block\"\nQ9 booking opens: 2027-08-01 | schedule stops moving: 2027-09-07\nQ10 edition: \"a one-off edition\" | measured on this program last edition: none\nQ11 effort ceiling: \"medium\" | political capital to tell a paying sponsor: \"yes\"\nNamed organizer on duty: \"Ines Varga, sponsor desk\"\nPackage wording: \"a best-efforts target, criteria written\" | make-good: \"not stated\" | criteria: \"an attendee who listed one of the sponsor's areas and opted in to that sponsor, not the sponsor's own staff or an existing customer, Ines Varga decides a borderline case by 2027-09-01\"\nCriterion halves: Sponsors situation: \"works on a product area and wants feedback from people running it in production\" | Attendees capability: \"runs or builds in that same area and said they want to talk about it\"",
"sides": "Sponsors (side A) - 6, one per line:\n- a 1: \"Mara Quist\" | organization: \"Brightpath Cloud\" | wants to meet: [observability; kubernetes] | consented to: \"matching\" | matchable: yes | meeting number named: 4 | available: \"the whole block\"\n- a 2: \"Tomas Ilves\" | organization: \"Corvane Data\" | wants to meet: [databases; data pipelines] | consented to: \"matching\" | matchable: yes | meeting number named: 4 | available: \"the whole block\"\n- a 3: \"Ines Duarte\" | organization: \"Delphin Labs\" | wants to meet: [security; identity] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 4: \"Kofi Mensah\" | organization: \"Equivane Dev\" | wants to meet: [developer tooling; ci; cd] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 5: \"Lena Park\" | organization: \"Fernhill AI\" | wants to meet: [machine learning; data pipelines] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\n- a 6: \"Ravi Nair\" | organization: \"Gridline Pay\" | wants to meet: [payments; apis] | consented to: \"matching\" | matchable: yes | meeting number named: not set | available: \"the whole block\"\nAttendees (side B) - 40, one per line:\n- b 1: \"Ada Brennan\" | organization: \"Kelpwise\" | interests: [observability; kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud; equivane dev] | available: \"the whole block\"\n- b 2: \"Bo Lindqvist\" | organization: \"Northmark\" | interests: [databases] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 3: \"Cara Mbeki\" | organization: \"Tallowsoft\" | interests: [kubernetes; ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud; equivane dev] | available: \"the whole block\"\n- b 4: \"Dev Raman\" | organization: \"Saltgrid\" | interests: [data pipelines; machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data; fernhill ai] | available: \"the whole block\"\n- b 5: \"Elif Sahin\" | organization: \"Brooklarch Health\" | interests: [security] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 6: \"Femi Adeyemi\" | organization: \"Quaymarrow Bank\" | interests: [payments; security] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay; delphin labs] | available: \"the whole block\"\n- b 7: \"Gus Moreau\" | organization: \"Larchfield\" | interests: [observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 8: \"Hana Sato\" | organization: \"Moorgate Media\" | interests: [databases; apis] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data; gridline pay] | available: \"the whole block\"\n- b 9: \"Ivo Petrov\" | organization: \"Pinecrest\" | interests: [machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 10: \"Jade Okafor\" | organization: \"Riverbend\" | interests: [developer tooling] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 11: \"Kai Nakamura\" | organization: \"Stonefly\" | interests: [kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 12: \"Lu Chen\" | organization: \"Thornbury\" | interests: [data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 13: \"Mia Kowalski\" | organization: \"Umberly\" | interests: [identity] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 14: \"Nils Berg\" | organization: \"Vantor\" | interests: [apis] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 15: \"Omar Haddad\" | organization: \"Westray\" | interests: [observability; ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: \"any\" | available: \"the whole block\"\n- b 16: \"Pia Rossi\" | organization: \"Yarrowby\" | interests: [databases] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 17: \"Quinn Abara\" | organization: \"Zellmark\" | interests: [machine learning; data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai; corvane data] | available: \"the whole block\"\n- b 18: \"Rosa Ibarra\" | organization: \"Ashcombe\" | interests: [kubernetes; observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 19: \"Sami Virtanen\" | organization: \"Birchwood\" | interests: [security; identity] | consented to: \"matching\" | matchable: yes | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 20: \"Tara Doyle\" | organization: \"Cobbleton\" | interests: [ci; cd] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 21: \"Uma Iyer\" | organization: \"Dunmore\" | interests: [payments] | consented to: \"matching\" | matchable: yes | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 22: \"Viktor Hale\" | organization: \"Elmstead\" | interests: [databases; data pipelines] | consented to: \"matching\" | matchable: yes | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 23: \"Wen Zhou\" | organization: \"Foxley\" | interests: [observability] | consented to: \"matching\" | matchable: yes | opted in to meet: [brightpath cloud] | available: [16:00-17:00]\n- b 24: \"Xena Laine\" | organization: \"Glenrock\" | interests: [machine learning] | consented to: \"matching\" | matchable: yes | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 25: \"Yusuf Kaya\" | organization: \"Hawthorne\" | interests: [developer tooling; kubernetes] | consented to: \"matching\" | matchable: yes | opted in to meet: [equivane dev; brightpath cloud] | available: \"the whole block\"\n- b 26: \"Zoe Grant\" | organization: \"Ivyhill\" | interests: [observability] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 27: \"Abel Moss\" | organization: \"Juniper Row\" | interests: [databases] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 28: \"Bree Holt\" | organization: \"Kestrel Bay\" | interests: [security] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 29: \"Cyril Vance\" | organization: \"Lowmoor\" | interests: [ci; cd] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [equivane dev] | available: \"the whole block\"\n- b 30: \"Dina Faro\" | organization: \"Marlow Works\" | interests: [machine learning] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 31: \"Edo Ferri\" | organization: \"Netherby\" | interests: [payments] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 32: \"Fay Lund\" | organization: \"Oakhurst\" | interests: [kubernetes] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [brightpath cloud] | available: \"the whole block\"\n- b 33: \"Gil Ortega\" | organization: \"Penhallow\" | interests: [data pipelines] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 34: \"Hal Kimura\" | organization: \"Quillon\" | interests: [identity] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"\n- b 35: \"Iris Novak\" | organization: \"Redcliffe\" | interests: [developer tooling] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: \"any\" | available: \"the whole block\"\n- b 36: \"Jon Arden\" | organization: \"Seacombe\" | interests: [apis] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [gridline pay] | available: \"the whole block\"\n- b 37: \"Kim Soler\" | organization: \"Trevose\" | interests: [observability] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: \"any\" | available: \"the whole block\"\n- b 38: \"Leo Strand\" | organization: \"Underhill\" | interests: [databases] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [corvane data] | available: \"the whole block\"\n- b 39: \"Mona Reyes\" | organization: \"Vellacott\" | interests: [machine learning] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [fernhill ai] | available: \"the whole block\"\n- b 40: \"Ned Cole\" | organization: \"Wexcombe\" | interests: [security] | consented to: \"a directory listing only\" | matchable: no - a directory listing only | opted in to meet: [delphin labs] | available: \"the whole block\"",
"block": "Block: date: 2027-09-14 | as published: \"13:30-15:00\" | slot length: 15 min | buffer: 5 min | tables in parallel: 4\nPublished sessions it must not cross - 2: [15:00-15:45 Keynote: the state of the platform; 12:30-13:30 Lunch]",
"notes": "The schedule team moved the meeting block to 13:30-15:00, clear of the keynote. The two Gold packages now say: we will aim to arrange 4 meetings with attendees matching the written criteria - a target, not a guarantee.",
"facts": "Verdict: \"ready to publish the brief\" | ready to publish the brief: yes | fix-level findings: 0\nSelf-set lines: [the fit score is the count of shared tags; at most 20 timetable rows are sent; at most 10 unplaced rows are sent; booking opening within 14 days is soon; a summary cap of 40 words; at most 5 caveats; the criterion template is the page's wording]\nNever stated: [a vendor or platform benchmark; a fill rate; a no-show or acceptance percentage; a meeting count from another event; a person, an organization, a slot or a consent the input does not hold]\nRun at all (step 1): decision: \"run it\" | moved by: \"Q1\" | named numbers: 2 | two populations: no\n run must: [decision \"run it\" exactly; reason uses the word \"Q1\"]\nFixed (step 2) - what may not move, in this order - 5:\n- fixed 1: \"Signed meeting number\" | detail: Brightpath Cloud 4, Corvane Data 4 (a drafted package names a number) - an input to deliver | owner: \"event-sponsor-agreement\"\n must: [contains \"Signed meeting number\"]\n- fixed 2: \"Published grid\" | detail: the block 2027-09-14 13:30-15:00 among the sessions 15:00-15:45 Keynote: the state of the platform, 12:30-13:30 Lunch - the block is a guest, a session never moves | owner: \"event-schedule-design\"\n must: [contains \"Published grid\"]\n- fixed 3: \"Consent wording each side saw\" | detail: Sponsors recorded as shown, Attendees recorded as shown - scope is fixed when a person submits, never retrofitted | owner: \"the people who submitted\"\n must: [contains \"Consent wording each side saw\"]\n- fixed 4: \"Floor plan\" | detail: meetings happen at the mezzanine meeting lounge, booked by the organizers | owner: \"event-venue-sourcing\"\n must: [contains \"Floor plan\"]\n- fixed 5: \"Room block\" | detail: no room block contracted | owner: \"event-venue-sourcing\"\n must: [contains \"Room block\"]\nConsent (step 4): matchable: \"6 Sponsors, 25 Attendees\" | excluded: \"0 Sponsors, 15 Attendees\" | directory only: 15 | registration only: 0 | nothing: 0 | wording Sponsors: \"recorded as shown\" | wording Attendees: \"recorded as shown\"\n consent must: [matchable \"6 Sponsors, 25 Attendees\" exactly; excluded \"0 Sponsors, 15 Attendees\" exactly; note uses the word \"excluded\"]\nMatching mechanism menu (step 3), re-ranked - pick: \"Mutual opt-in\"\n- rung 1: \"Mutual opt-in\" | moved: made the pick by Q1: a package names a meeting number - promote the default to mutual opt-in\n- rung 2: \"Open directory\"\n- rung 3: \"Scored ranking\" | moved: promoted by Q4: structured, comparable profile data already exists on both sides from a form collected anyway\n- rung 4: \"Organizer brokering\" | moved: promoted by Q8: a named person is already staffed and can hand-pair\n- rung 5: \"No meeting program\" | moved: demoted by Q1: the program runs\n- deleted, not demoted: \"Any pairing where only one side opted in - handing a sponsor a list to book against\" | reason: the mechanic behind every ambushed-meeting complaint\n- notes: Two of the five axis orderings are argued, not asserted: effort tops at brokering because it never amortizes; compliance tops at scored ranking because it derives new facts about a person. Ten pairs, zero strict-dominance relations: relevance rewards human judgment, certainty rewards volume and structure.\nMechanism: pick: \"Mutual opt-in\" | moved by: \"Q1\" | candidate pairs: 32\nCriterion (the organizer's two halves): \"A meeting is a good match when a person from Sponsors who works on a product area and wants feedback from people running it in production meets a person from Attendees who runs or builds in that same area and said they want to talk about it, and both opted in to the pairing themselves.\"\n mechanism must: [pick \"Mutual opt-in\" exactly; reason uses the word \"Q1\"; criterion uses the words \"good match\" and \"both\"]\nScheduling mechanic menu (step 5), re-ranked - pick: \"Self-service booking\"\n- rung 1: \"Self-service booking\"\n- rung 2: \"No booked slots\"\n- rung 3: \"Hybrid\"\n- rung 4: \"Organizer-assigned grid\"\n- deleted, not demoted: \"A meeting placed on someone's schedule without their acceptance\" | reason: it manufactures quota out of people's time, and a meeting nobody accepted is a no-show already on the schedule\n- notes: The delivered-quota axis is rank-identical to inverse effort - a warning, not a result; attendee autonomy is the axis that carries this menu. No compliance-cost axis applies here. Six pairs, zero strict-dominance relations.\nScheduling: pick: \"Self-service booking\" | moved by: \"default\"\n scheduling must: [pick \"Self-service booking\" exactly; reason uses the word \"default\"]\nBlock (step 5): date: 2027-09-14 | as published: \"13:30-15:00\" | crosses sessions: 0 | slots laid: 4 | publish window: \"13:30-14:45\" | capacity: 16 meetings\nSlots - 4: [slot 1 \"13:30-13:45\"; slot 2 \"13:50-14:05\"; slot 3 \"14:10-14:25\"; slot 4 \"14:30-14:45\"]\nTimetable (step 5) - placed: 16 of 32 candidate pairs | rows below: 16 of 16 | cut: 0 (at most 20 sent, self-set - the page's CSV holds every row) - in this order:\n- meeting 1: slot: \"13:30-13:45\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Ada Brennan\" | kind: draft placement - both book or confirm\n must: [slot \"13:30-13:45\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Ada Brennan\" exactly]\n- meeting 2: slot: \"13:30-13:45\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Viktor Hale\" | kind: draft placement - both book or confirm\n must: [slot \"13:30-13:45\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Viktor Hale\" exactly]\n- meeting 3: slot: \"13:30-13:45\" | table: \"Table 3\" | a: \"Ines Duarte\" | b: \"Sami Virtanen\" | kind: draft placement - both book or confirm\n must: [slot \"13:30-13:45\" exactly; table \"Table 3\" exactly; a \"Ines Duarte\" exactly; b \"Sami Virtanen\" exactly]\n- meeting 4: slot: \"13:30-13:45\" | table: \"Table 4\" | a: \"Kofi Mensah\" | b: \"Cara Mbeki\" | kind: draft placement - both book or confirm\n must: [slot \"13:30-13:45\" exactly; table \"Table 4\" exactly; a \"Kofi Mensah\" exactly; b \"Cara Mbeki\" exactly]\n- meeting 5: slot: \"13:50-14:05\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Rosa Ibarra\" | kind: draft placement - both book or confirm\n must: [slot \"13:50-14:05\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Rosa Ibarra\" exactly]\n- meeting 6: slot: \"13:50-14:05\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Bo Lindqvist\" | kind: draft placement - both book or confirm\n must: [slot \"13:50-14:05\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Bo Lindqvist\" exactly]\n- meeting 7: slot: \"13:50-14:05\" | table: \"Table 3\" | a: \"Lena Park\" | b: \"Dev Raman\" | kind: draft placement - both book or confirm\n must: [slot \"13:50-14:05\" exactly; table \"Table 3\" exactly; a \"Lena Park\" exactly; b \"Dev Raman\" exactly]\n- meeting 8: slot: \"13:50-14:05\" | table: \"Table 4\" | a: \"Ravi Nair\" | b: \"Femi Adeyemi\" | kind: draft placement - both book or confirm\n must: [slot \"13:50-14:05\" exactly; table \"Table 4\" exactly; a \"Ravi Nair\" exactly; b \"Femi Adeyemi\" exactly]\n- meeting 9: slot: \"14:10-14:25\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Cara Mbeki\" | kind: draft placement - both book or confirm\n must: [slot \"14:10-14:25\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Cara Mbeki\" exactly]\n- meeting 10: slot: \"14:10-14:25\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Dev Raman\" | kind: draft placement - both book or confirm\n must: [slot \"14:10-14:25\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Dev Raman\" exactly]\n- meeting 11: slot: \"14:10-14:25\" | table: \"Table 3\" | a: \"Ines Duarte\" | b: \"Elif Sahin\" | kind: draft placement - both book or confirm\n must: [slot \"14:10-14:25\" exactly; table \"Table 3\" exactly; a \"Ines Duarte\" exactly; b \"Elif Sahin\" exactly]\n- meeting 12: slot: \"14:10-14:25\" | table: \"Table 4\" | a: \"Kofi Mensah\" | b: \"Omar Haddad\" | kind: draft placement - both book or confirm\n must: [slot \"14:10-14:25\" exactly; table \"Table 4\" exactly; a \"Kofi Mensah\" exactly; b \"Omar Haddad\" exactly]\n- meeting 13: slot: \"14:30-14:45\" | table: \"Table 1\" | a: \"Mara Quist\" | b: \"Gus Moreau\" | kind: draft placement - both book or confirm\n must: [slot \"14:30-14:45\" exactly; table \"Table 1\" exactly; a \"Mara Quist\" exactly; b \"Gus Moreau\" exactly]\n- meeting 14: slot: \"14:30-14:45\" | table: \"Table 2\" | a: \"Tomas Ilves\" | b: \"Hana Sato\" | kind: draft placement - both book or confirm\n must: [slot \"14:30-14:45\" exactly; table \"Table 2\" exactly; a \"Tomas Ilves\" exactly; b \"Hana Sato\" exactly]\n- meeting 15: slot: \"14:30-14:45\" | table: \"Table 3\" | a: \"Lena Park\" | b: \"Quinn Abara\" | kind: draft placement - both book or confirm\n must: [slot \"14:30-14:45\" exactly; table \"Table 3\" exactly; a \"Lena Park\" exactly; b \"Quinn Abara\" exactly]\n- meeting 16: slot: \"14:30-14:45\" | table: \"Table 4\" | a: \"Ines Duarte\" | b: \"Femi Adeyemi\" | kind: draft placement - both book or confirm\n must: [slot \"14:30-14:45\" exactly; table \"Table 4\" exactly; a \"Ines Duarte\" exactly; b \"Femi Adeyemi\" exactly]\nUnplaced (step 5) - pairs both want, not placed: 16 | rows below: 10 of 16 | cut: 6 (at most 10 sent, self-set) - in this order:\n- unplaced 1: a: \"Mara Quist\" | b: \"Kai Nakamura\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Kai Nakamura\" exactly; reason uses the word \"booked\"]\n- unplaced 2: a: \"Tomas Ilves\" | b: \"Lu Chen\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Lu Chen\" exactly; reason uses the word \"booked\"]\n- unplaced 3: a: \"Mara Quist\" | b: \"Omar Haddad\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Mara Quist\" exactly; b \"Omar Haddad\" exactly; reason uses the word \"booked\"]\n- unplaced 4: a: \"Tomas Ilves\" | b: \"Pia Rossi\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Pia Rossi\" exactly; reason uses the word \"booked\"]\n- unplaced 5: a: \"Ravi Nair\" | b: \"Hana Sato\" | why: \"every table is taken in every slot both are free\"\n must: [a \"Ravi Nair\" exactly; b \"Hana Sato\" exactly; reason uses the word \"table\"]\n- unplaced 6: a: \"Mara Quist\" | b: \"Wen Zhou\" | why: \"no slot where both are free\"\n must: [a \"Mara Quist\" exactly; b \"Wen Zhou\" exactly; reason uses the word \"free\"]\n- unplaced 7: a: \"Tomas Ilves\" | b: \"Quinn Abara\" | why: \"every slot both are free is already booked for one of them\"\n must: [a \"Tomas Ilves\" exactly; b \"Quinn Abara\" exactly; reason uses the word \"booked\"]\n- unplaced 8: a: \"Kofi Mensah\" | b: \"Tara Doyle\" | why: \"every table is taken in every slot both are free\"\n must: [a \"Kofi Mensah\" exactly; b \"Tara Doyle\" exactly; reason uses the word \"table\"]\n- unplaced 9: a: \"Lena Park\" | b: \"Ivo Petrov\" | why: \"every table is taken in every slot both are free\"\n must: [a \"Lena Park\" exactly; b \"Ivo Petrov\" exactly; reason uses the word \"table\"]\n- unplaced 10: a: \"Ravi Nair\" | b: \"Nils Berg\" | why: \"every table is taken in every slot both are free\"\n must: [a \"Ravi Nair\" exactly; b \"Nils Berg\" exactly; reason uses the word \"table\"]\nQuota commitment posture menu (step 6), re-ranked - pick: \"Best-efforts target\"\n- rung 1: \"Best-efforts target\"\n- rung 2: \"No meeting promise\"\n- rung 3: \"Guaranteed count with criteria\"\n- rung 4: \"Guaranteed count\" | moved: demoted by Q10: no booked-versus-held count measured on a previous edition of this program - a guarantee would rest on nothing measured\n- deleted, not demoted: \"A meeting number printed in a prospectus with no criteria and no stated make-good\" | reason: the same commitment with the remedy left to be improvised in front of an unhappy sponsor\n- notes: The two guarantees tie on compliance cost, argued not dodged: both are a countersigned number to deliver or remedy. Price is rank-identical to inverse effort; renewal survivability makes this menu decidable. Six pairs, zero strict-dominance relations. Sponsorship buys access, never program influence.\nQuota (step 6) - sponsors with a named number: 2 | named in all: 8 | the block holds: 16 - in this order:\n- quota 1: sponsor: \"Brightpath Cloud\" | named: \"4\" | feasible: \"4\" | booked here: 4 | posture: \"Best-efforts target\" | status: holds\n must: [sponsor \"Brightpath Cloud\" exactly; named \"4\" exactly; feasible \"4\" exactly; posture \"Best-efforts target\" exactly]\n- quota 2: sponsor: \"Corvane Data\" | named: \"4\" | feasible: \"4\" | booked here: 4 | posture: \"Best-efforts target\" | status: holds\n must: [sponsor \"Corvane Data\" exactly; named \"4\" exactly; feasible \"4\" exactly; posture \"Best-efforts target\" exactly]\nNo-show handling menu (step 7), re-ranked - pick: \"Standby refill\"\n- rung 1: \"Standby refill\" | moved: made the pick by Q8: someone is already staffed at the meeting area during the block - the queue has someone to drain it\n- rung 2: \"Reconfirm-and-remind\"\n- rung 3: \"Nothing\"\n- deleted, not demoted: \"Slot overbooking\" | reason: Q10: no measured booked-versus-held count from a previous edition of this same program - and the event-level show-up bands are a different unit\n- deleted, not demoted: \"A deposit, a forfeited benefit, or any penalty on the attendee side of a missed meeting\" | reason: it puts a price on a conversation the attendee was invited to have\n- notes: Quota protected is rank-identical to inverse effort; counterpart experience does the work, and doing nothing outranks overbooking on it - an empty table disappoints one person, a collision turns away someone who did everything asked.\nNo-show: pick: \"Standby refill\" | moved by: \"Q8\" | the rule: every pairing confirmed by both sides before the schedule is published\n no_show must: [pick \"Standby refill\" exactly; reason uses the word \"Q8\"]\nMeasurement (step 9) - per pair: [booked; held; empty; replaced] | measures, all self-set: [Held against booked; Booked against promised; Mutual-acceptance rate; Empty-slot count; Unwanted-meeting complaints; Confirmation completeness]\nHand-off (step 10): one generic outcome record, one row per pairing, to event-sponsor-fulfillment; no per-sponsor tracking or renewal report here.\nDesign must: [summary at most 40 words; verdict \"ready to publish the brief\" exactly; fixed carries the 5 items above, in this order; timetable copies the 16 rows above, in this order; unplaced copies the 10 rows above, in this order; quota copies the 2 rows above, in this order; caveats carry the fix findings first, at most 5]\nBrief must: [title contains \"Harbourline DevConf 2027\"; who_meets_whom uses the words \"good match\" and \"both\"; when_and_where contains \"2027-09-14\" and \"13:30-14:45\" and the word \"session\"; how_to_book uses the word \"book\"; missed_slot uses the word \"standby\"; contact \"Ines Varga, sponsor desk\" exactly; consent_note uses the words \"withdraw\" and \"deleted\"; confirmations copies the 16 rows above, in this order, each message uses the word \"confirm\"] | brief note must: [use the word \"publish\" and say what happens next]\nCarried from the design: summary: \"Ready to publish the brief: the block sits clear of the keynote, both named targets of 4 fit the block, and every placed pair still needs both confirmations.\" | parts matching the page: 4 of 4\nFindings (11):\n[check] one_audience (run): Q2: one audience with sponsors standing in it - the program runs only to deliver the named number. Developer attendees are not buyers by default: an unsolicited vendor meeting is an interruption, so only people who opted in are matched.\n[check] retrofit_B (consent): 15 people on Attendees consented to a directory listing only - excluded from matching. Retrofitting consent after a directory is live is the one error here that cannot be undone: ask afresh with new wording, and they stay excluded until they say yes.\n[check] self_count (scheduling): Self-service booking delivers meetings but cannot guarantee a count - a named number on it is a target at most; promote to hybrid the moment a package signs the number.\n[info] pairs_blocked (pairs): 25 requests came from or reached someone whose consent does not cover matching - no pair is made from them.\n[info] pairs_notag (pairs): 5 opt-ins share no tag with the person asked - under the criterion that is not a match; the organizer may read them by hand.\n[info] unplaced (scheduling): 16 pairs both sides want are not placed - the block holds 16 meetings (4 slots x 4 tables); each is listed with its reason, and none is placed on anyone's schedule without both acceptances.\n[info] confirm_rule (noshow): Confirm every pairing with both sides before the schedule is published - publication is the point of no return; then publish one view per person, never the whole pair grid.\n[info] measure (measure): Every measure here is self-set and becomes meaningful only across editions of this program: record per pair booked, held, empty or replaced, and every complaint about an unwanted meeting.\n[info] notes (context): The pasted notes are context: a request in the notes is never a commitment.\n[info] handoff (scope): Hand the outcome downstream as one generic record - one row per pairing: the two sides, accepted by both, held, refilled from standby, the criteria checked. Per-sponsor tracking and renewal reporting belong to samber/dev-event-organizer-skills@event-sponsor-fulfillment, never built here.\n[info] scope (scope): No vendor or platform benchmark appears anywhere: no fill rate, no no-show percentage, no meeting count from another event. Every number on the page is the organizer's own or a count of it, and every rule of the page's own is labelled self-set."
}
Reply:
{
"task": "brief",
"title": "Harbourline DevConf 2027 - 1:1 meeting brief",
"who_meets_whom": "A meeting is a good match when a person from Sponsors who works on a product area and wants feedback from people running it in production meets a person from Attendees who runs or builds in that same area and said they want to talk about it, and both opted in to the pairing themselves.",
"when_and_where": "On 2027-09-14, 13:30-14:45, in the mezzanine meeting lounge, booked by the organizers. The block sits inside the published grid and never crosses a session.",
"how_to_book": "Opt in to the people you want to meet. Once both of you have opted in, book a slot in the block from the times you are both free - every meeting on your day is one you chose, and both sides accept it before it is published.",
"missed_slot": "If a confirmed meeting goes unfilled, the organizer on duty offers the slot to the next person on that side's standby list. Nobody pays a penalty for a missed meeting.",
"contact": "Ines Varga, sponsor desk",
"consent_note": "Your name, organization and interests are shown only to a counterpart once you both accept the pairing, and to the organizers. You can withdraw at any time, and your accepted pairings are cancelled when you do. The pool is deleted after the event.",
"confirmations": [
{
"a": "Mara Quist",
"b": "Ada Brennan",
"slot": "13:30-13:45",
"table": "Table 1",
"message": "Please confirm your 1:1 meeting at 13:30-13:45, Table 1. It appears on the schedule only once you both confirm."
},
{
"a": "Tomas Ilves",
"b": "Viktor Hale",
"slot": "13:30-13:45",
"table": "Table 2",
"message": "Please confirm your 1:1 meeting at 13:30-13:45, Table 2. It appears on the schedule only once you both confirm."
},
{
"a": "Ines Duarte",
"b": "Sami Virtanen",
"slot": "13:30-13:45",
"table": "Table 3",
"message": "Please confirm your 1:1 meeting at 13:30-13:45, Table 3. It appears on the schedule only once you both confirm."
},
{
"a": "Kofi Mensah",
"b": "Cara Mbeki",
"slot": "13:30-13:45",
"table": "Table 4",
"message": "Please confirm your 1:1 meeting at 13:30-13:45, Table 4. It appears on the schedule only once you both confirm."
},
{
"a": "Mara Quist",
"b": "Rosa Ibarra",
"slot": "13:50-14:05",
"table": "Table 1",
"message": "Please confirm your 1:1 meeting at 13:50-14:05, Table 1. It appears on the schedule only once you both confirm."
},
{
"a": "Tomas Ilves",
"b": "Bo Lindqvist",
"slot": "13:50-14:05",
"table": "Table 2",
"message": "Please confirm your 1:1 meeting at 13:50-14:05, Table 2. It appears on the schedule only once you both confirm."
},
{
"a": "Lena Park",
"b": "Dev Raman",
"slot": "13:50-14:05",
"table": "Table 3",
"message": "Please confirm your 1:1 meeting at 13:50-14:05, Table 3. It appears on the schedule only once you both confirm."
},
{
"a": "Ravi Nair",
"b": "Femi Adeyemi",
"slot": "13:50-14:05",
"table": "Table 4",
"message": "Please confirm your 1:1 meeting at 13:50-14:05, Table 4. It appears on the schedule only once you both confirm."
},
{
"a": "Mara Quist",
"b": "Cara Mbeki",
"slot": "14:10-14:25",
"table": "Table 1",
"message": "Please confirm your 1:1 meeting at 14:10-14:25, Table 1. It appears on the schedule only once you both confirm."
},
{
"a": "Tomas Ilves",
"b": "Dev Raman",
"slot": "14:10-14:25",
"table": "Table 2",
"message": "Please confirm your 1:1 meeting at 14:10-14:25, Table 2. It appears on the schedule only once you both confirm."
},
{
"a": "Ines Duarte",
"b": "Elif Sahin",
"slot": "14:10-14:25",
"table": "Table 3",
"message": "Please confirm your 1:1 meeting at 14:10-14:25, Table 3. It appears on the schedule only once you both confirm."
},
{
"a": "Kofi Mensah",
"b": "Omar Haddad",
"slot": "14:10-14:25",
"table": "Table 4",
"message": "Please confirm your 1:1 meeting at 14:10-14:25, Table 4. It appears on the schedule only once you both confirm."
},
{
"a": "Mara Quist",
"b": "Gus Moreau",
"slot": "14:30-14:45",
"table": "Table 1",
"message": "Please confirm your 1:1 meeting at 14:30-14:45, Table 1. It appears on the schedule only once you both confirm."
},
{
"a": "Tomas Ilves",
"b": "Hana Sato",
"slot": "14:30-14:45",
"table": "Table 2",
"message": "Please confirm your 1:1 meeting at 14:30-14:45, Table 2. It appears on the schedule only once you both confirm."
},
{
"a": "Lena Park",
"b": "Quinn Abara",
"slot": "14:30-14:45",
"table": "Table 3",
"message": "Please confirm your 1:1 meeting at 14:30-14:45, Table 3. It appears on the schedule only once you both confirm."
},
{
"a": "Ines Duarte",
"b": "Femi Adeyemi",
"slot": "14:30-14:45",
"table": "Table 4",
"message": "Please confirm your 1:1 meeting at 14:30-14:45, Table 4. It appears on the schedule only once you both confirm."
}
],
"note": "Publish the brief to both sides now, then send each pair its confirmation - nothing goes on the schedule until both confirm."
}
The page's check: kept - nothing to flag
The free brief skeleton for the resolved sample
# Harbourline DevConf 2027 - meeting brief (the page's skeleton)
_Verdict: ready to publish the brief._
## Who meets whom
A meeting is a good match when a person from Sponsors who works on a product area and wants feedback from people running it in production meets a person from Attendees who runs or builds in that same area and said they want to talk about it, and both opted in to the pairing themselves.
## When and where
- 2027-09-14, 13:30-14:45, the mezzanine meeting lounge, booked by the organizers - never across a published session (15:00-15:45 Keynote: the state of the platform, 12:30-13:30 Lunch)
## How to book
- Self-service booking: each side states when it is free, the counterpart books - every meeting on an attendee's day is one they chose; cannot guarantee a count
## A missed slot
- Standby refill: a per-counterpart standby queue drained on the day into an emptied slot - worthless unattended
## Consent
- What is shared, who sees it, what triggers it, what you get, how to withdraw, when the pool is deleted - in your line of sight before you submit.
## The organizer on duty
Ines Varga, sponsor desk
## Before anything is published
- [ ] Every pairing accepted by both sides
- [ ] One view per person, never the whole pair grid
Made with Meet Match - https://meet-match.skillsafe.ai/
Build the input yourself
Load the engine in node (global.window = global; require("./matchkit.js"); require("./matchreply.js")), then:
const K = MatchKit, R = MatchReply;
const f = K.form({ name: "My Conf 2027", q1: "drafted", q2: "one", q5A: "shown", q5B: "shown", labelA: "Sponsors", labelB: "Attendees",
sideA: "Mara Quist | Brightpath Cloud | observability | matching | 4 |",
sideB: "Ada Brennan | Kelpwise | observability | matching | Brightpath Cloud |",
blockDate: "2027-09-14", blockStart: "13:30", blockEnd: "15:00", slotLen: "15", buffer: "5", tables: "4", sessions: "15:00-15:45 Keynote" });
// f.run, f.fixed, f.consent, f.mechanism / f.criterion, f.sched, f.slots, f.placed, f.unplaced, f.quotaMenu / f.quota, f.noShow, f.verdict, f.findings
K.timetableCsv(f); K.timetableIcs(f); K.unplacedCsv(f); K.outcomeCsv(f); K.briefMd(f); K.board(f) // the free exports
const b = K.buildInput(f, "design"); // or "brief"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "design");
// R.check(reply, b) // {status: kept or flagged, notes}
// R.carryText(reply) // the lines the brief 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://meet-match.skillsafe.ai/tokens.html
api() { # api METHOD PATH [JSON-BODY]
curl -s -X "$1" "$BASE$2" -H "Content-Type: application/json" \
${TOKEN:+-H "Authorization: Bearer $TOKEN"} ${3:+--data "$3"}
}
import json, urllib.request
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://meet-match.skillsafe.ai/tokens.html
def api(method, path, body=None, headers=None):
req = urllib.request.Request(BASE + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Content-Type": "application/json", **({"Authorization": "Bearer " + TOKEN} if TOKEN else {}), **(headers or {})})
with urllib.request.urlopen(req) as r:
env = json.load(r)
if env.get("error"):
raise RuntimeError(env["error"])
return env["data"]
// meet-match.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "YOUR_TOKEN"; // from https://meet-match.skillsafe.ai/tokens.html
async function api(method, path, body, headers = {}) {
const r = await fetch(BASE + path, { method, headers: { "Content-Type": "application/json",
...(TOKEN ? { Authorization: "Bearer " + TOKEN } : {}), ...headers },
body: body === undefined ? undefined : JSON.stringify(body) });
const env = await r.json();
if (env.error) throw new Error(env.error.code + ": " + env.error.message);
return env.data;
}
package main
import ("bytes"; "encoding/json"; "fmt"; "net/http")
const base = "https://api.skillsafe.ai/v1/app-api"
var token = "YOUR_TOKEN" // from https://meet-match.skillsafe.ai/tokens.html
func api(method, path string, body any, headers map[string]string) (map[string]any, error) {
var buf bytes.Buffer
if body != nil { json.NewEncoder(&buf).Encode(body) }
req, _ := http.NewRequest(method, base+path, &buf)
req.Header.Set("Content-Type", "application/json")
if token != "" { req.Header.Set("Authorization", "Bearer "+token) }
for k, v := range headers { req.Header.Set(k, v) }
res, err := http.DefaultClient.Do(req)
if err != nil { return nil, err }
defer res.Body.Close()
var env struct { Data map[string]any; Error map[string]any }
json.NewDecoder(res.Body).Decode(&env)
if env.Error != nil { return nil, fmt.Errorf("%v", env.Error) }
return env.Data, nil
}
// MeetMatch.java -- Java 17+, with com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.*;
import java.net.URI; import java.net.http.*; import java.util.*;
public class MeetMatch {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "YOUR_TOKEN"; // from https://meet-match.skillsafe.ai/tokens.html
static final ObjectMapper M = new ObjectMapper();
static final HttpClient C = HttpClient.newHttpClient();
static JsonNode api(String method, String path, Object body, Map<String, String> headers) throws Exception {
var b = HttpRequest.newBuilder(URI.create(BASE + path)).header("Content-Type", "application/json");
if (!token.isEmpty()) b.header("Authorization", "Bearer " + token);
if (headers != null) headers.forEach(b::header);
b.method(method, body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(M.writeValueAsString(body)));
JsonNode env = M.readTree(C.send(b.build(), HttpResponse.BodyHandlers.ofString()).body());
if (env.hasNonNull("error")) throw new RuntimeException(env.get("error").toString());
return env.get("data");
}
}
require "json"
require "net/http"
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "YOUR_TOKEN" # from https://meet-match.skillsafe.ai/tokens.html
def api(method, path, body = nil, headers = {})
uri = URI(BASE + path)
req = Net::HTTPGenericRequest.new(method, !body.nil?, true, uri.request_uri,
{ "Content-Type" => "application/json" }.merge(TOKEN.empty? ? {} : { "Authorization" => "Bearer #{TOKEN}" }).merge(headers))
req.body = JSON.generate(body) unless body.nil?
env = JSON.parse(Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body)
raise env["error"].to_s if env["error"]
env["data"]
end
<?php
const BASE = "https://api.skillsafe.ai/v1/app-api";
$TOKEN = "YOUR_TOKEN"; // from https://meet-match.skillsafe.ai/tokens.html
function api(string $method, string $path, $body = null, array $headers = []) {
global $TOKEN;
$h = ["Content-Type: application/json"];
if ($TOKEN) $h[] = "Authorization: Bearer $TOKEN";
foreach ($headers as $k => $v) $h[] = "$k: $v";
$ch = curl_init(BASE . $path);
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $h, CURLOPT_RETURNTRANSFER => true]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$env = json_decode(curl_exec($ch), true);
if (!empty($env["error"])) throw new Exception(json_encode($env["error"]));
return $env["data"];
}
// Program.cs -- .NET 6+ console app
using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Nodes;
static class Api {
public const string Base = "https://api.skillsafe.ai/v1/app-api";
public static string Token = "YOUR_TOKEN"; // from https://meet-match.skillsafe.ai/tokens.html
static readonly HttpClient C = new();
public static async Task<JsonNode?> Call(string method, string path, object? body = null, Dictionary<string, string>? headers = null) {
var req = new HttpRequestMessage(new HttpMethod(method), Base + path);
if (Token != "") req.Headers.Add("Authorization", "Bearer " + Token);
if (headers != null) foreach (var h in headers) req.Headers.Add(h.Key, h.Value);
if (body != null) req.Content = JsonContent.Create(body);
var env = JsonNode.Parse(await (await C.SendAsync(req)).Content.ReadAsStringAsync())!;
if (env["error"] is JsonNode e && e.GetValueKind() != JsonValueKind.Null) throw new Exception(e.ToJsonString());
return env["data"];
}
}
Step 2 — a token
A guest token is enough for /me and /estimate. A run is metered, so it needs a personal token: sign in on /tokens.html and copy it from there.
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN=$(curl -s -X POST "$BASE/guest" -H "Content-Type: application/json" -d '{"slug":"meet-match"}' | jq -r '.data.token')
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = ""
TOKEN = api("POST", "/guest", {"slug": "meet-match"})["token"]
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = "";
TOKEN = (await api("POST", "/guest", { slug: "meet-match" })).token;
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = ""
g, err := api("POST", "/guest", map[string]string{"slug": "meet-match"}, nil)
if err != nil { panic(err) }
token = g["token"].(string)
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = "";
token = api("POST", "/guest", Map.of("slug", "meet-match"), null).get("token").asText();
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN.replace("")
TOKEN.replace(api("POST", "/guest", { slug: "meet-match" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "meet-match"])["token"];
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
Api.Token = "";
Api.Token = (await Api.Call("POST", "/guest", new { slug = "meet-match" }))!["token"]!.GetValue<string>();
Step 3 — GET /me
Who the token is (subject_type: user or guest) and the credit balance.
api GET /me | jq '.data | {subject_type, credits}'
me = api("GET", "/me")
print(me["subject_type"], me.get("credits"))
const me = await api("GET", "/me");
console.log(me.subject_type, me.credits);
me, _ := api("GET", "/me", nil, nil)
fmt.Println(me["subject_type"], me["credits"])
JsonNode me = api("GET", "/me", null, null);
System.out.println(me.get("subject_type") + " " + me.get("credits"));
me = api("GET", "/me")
puts [me["subject_type"], me["credits"]].inspect
$me = api("GET", "/me");
echo $me["subject_type"], " ", $me["credits"] ?? "", "\n";
var me = await Api.Call("GET", "/me");
Console.WriteLine($"{me!["subject_type"]} {me["credits"]}");
Step 4 — POST /estimate
Free. The body is the run input itself, the bare object (never wrapped in {"input": ...}). hold_credits is a reservation, not the price; min_credits is what the balance must cover; model_alias reads gpt-terra.
# input.json: the run input object - {"task": "design", "event": "Event: ... | dates: ... | city: ...", "sides": "Sponsors (side A) - 6 ...", "block": "Block: date: ... | as published: ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}'
inp = json.load(open("input.json")) # {"task": "design", "event": "Event: ... | dates: ... | city: ...", "sides": "Sponsors (side A) - 6 ...", "block": "Block: date: ... | as published: ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
est = api("POST", "/estimate", inp)
print(est["hold_credits"], est["min_credits"], est["model"], est.get("warnings"))
import { readFileSync } from "node:fs";
const input = JSON.parse(readFileSync("input.json", "utf8")); // {task: "design" or "brief", event, sides, block, notes, facts} (see the input table)
const est = await api("POST", "/estimate", input);
console.log(est.hold_credits, est.min_credits, est.model, est.warnings);
raw, _ := os.ReadFile("input.json") // add "os" to the imports
var input map[string]any
json.Unmarshal(raw, &input)
est, _ := api("POST", "/estimate", input, nil)
fmt.Println(est["hold_credits"], est["min_credits"], est["model"])
Map<String, Object> input = M.readValue(new java.io.File("input.json"), Map.class);
JsonNode est = api("POST", "/estimate", input, null);
System.out.println(est.get("hold_credits") + " " + est.get("min_credits") + " " + est.get("model"));
input = JSON.parse(File.read("input.json"))
est = api("POST", "/estimate", input)
puts [est["hold_credits"], est["min_credits"], est["model"]].inspect
$input = json_decode(file_get_contents("input.json"), true);
$est = api("POST", "/estimate", $input);
echo $est["hold_credits"], " ", $est["min_credits"], " ", $est["model"], "\n";
var input = JsonNode.Parse(File.ReadAllText("input.json"))!;
var est = await Api.Call("POST", "/estimate", input);
Console.WriteLine($"{est!["hold_credits"]} {est["min_credits"]} {est["model"]}");
Step 5 — POST /run, then poll the job
Send an Idempotency-Key built from the lane and the input: a retry with the same key never bills twice. The page uses meet-match:<task>:<inputHash>:a<attempt> - the lane is part of the key - and its one automatic reformat retry is a new attempt number, named in the page as one extra run. A design carries summary, verdict, run, fixed, consent, mechanism, scheduling, timetable, unplaced, quota, no_show and caveats; a brief carries title, who_meets_whom, when_and_where, how_to_book, missed_slot, contact, consent_note, confirmations and note. The code below prints the headline of either.
KEY="meet-match:design:$(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 // .title' reply.json
jq -r '.timetable[]? | "\(.slot) \(.table): \(.a) and \(.b)"' reply.json # a design; a brief has .confirmations
import hashlib, time
key = "meet-match:" + inp["task"] + ":" + hashlib.sha256(json.dumps(inp).encode()).hexdigest()[:16] + ":a1"
job = api("POST", "/run", inp, {"Idempotency-Key": key})
while True:
j = api("GET", "/jobs/" + job["job_id"])
if j["status"] in ("succeeded", "failed", "cancelled"):
break
time.sleep(2)
reply = json.loads(j["output"]["output"]) # the reply as one JSON object
print(j["charged_credits"], j.get("truncated"), reply.get("verdict") or reply.get("note"))
for row in reply.get("timetable") or reply.get("confirmations") or []:
print("-", row["slot"], row["table"], row["a"], row["b"])
import { createHash } from "node:crypto";
const key = `meet-match:${input.task}:${createHash("sha256").update(JSON.stringify(input)).digest("hex").slice(0, 16)}:a1`;
const job = await api("POST", "/run", input, { "Idempotency-Key": key });
let j;
do { await new Promise((r) => setTimeout(r, 2000)); j = await api("GET", "/jobs/" + job.job_id); }
while (!["succeeded", "failed", "cancelled"].includes(j.status));
const reply = JSON.parse(j.output.output);
console.log(j.charged_credits, j.truncated, reply.verdict ?? reply.note);
for (const row of reply.timetable || reply.confirmations || []) console.log("-", row.slot, row.table, row.a, row.b);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "meet-match:" + input["task"].(string) + ":" + hex.EncodeToString(sum[:8]) + ":a1"
job, _ := api("POST", "/run", input, map[string]string{"Idempotency-Key": key})
var j map[string]any
for {
time.Sleep(2 * time.Second)
j, _ = api("GET", "/jobs/"+job["job_id"].(string), nil, nil)
if s := j["status"]; s == "succeeded" || s == "failed" || s == "cancelled" { break }
}
var reply map[string]any
json.Unmarshal([]byte(j["output"].(map[string]any)["output"].(string)), &reply)
fmt.Println(j["charged_credits"], j["truncated"], reply["verdict"], reply["note"])
rows, _ := reply["timetable"].([]any) // a design's timetable; a brief has confirmations
for _, row := range rows {
fmt.Println("-", row.(map[string]any)["slot"], row.(map[string]any)["a"], row.(map[string]any)["b"])
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "meet-match:" + input.get("task") + ":" + HexFormat.of().formatHex(digest, 0, 8) + ":a1";
JsonNode job = api("POST", "/run", input, Map.of("Idempotency-Key", key)), j;
do { Thread.sleep(2000); j = api("GET", "/jobs/" + job.get("job_id").asText(), null, null); }
while (!Set.of("succeeded", "failed", "cancelled").contains(j.get("status").asText()));
JsonNode reply = M.readTree(j.get("output").get("output").asText());
System.out.println(j.get("charged_credits") + " " + reply.path("verdict").asText(reply.path("note").asText()));
for (JsonNode row : reply.path("timetable")) System.out.println("- " + row.path("slot").asText() + " " + row.path("a").asText() + " " + row.path("b").asText());
require "digest"
key = "meet-match:#{input["task"]}:#{Digest::SHA256.hexdigest(JSON.generate(input))[0, 16]}:a1"
job = api("POST", "/run", input, { "Idempotency-Key" => key })
j = nil
loop do
sleep 2
j = api("GET", "/jobs/#{job["job_id"]}")
break if %w[succeeded failed cancelled].include?(j["status"])
end
reply = JSON.parse(j["output"]["output"])
puts [j["charged_credits"], j["truncated"], reply["verdict"] || reply["note"]].inspect
(reply["timetable"] || []).each { |row| puts "- #{row["slot"]} #{row["a"]} #{row["b"]}" }
$key = "meet-match:" . $input["task"] . ":" . substr(hash("sha256", json_encode($input)), 0, 16) . ":a1";
$job = api("POST", "/run", $input, ["Idempotency-Key" => $key]);
do { sleep(2); $j = api("GET", "/jobs/" . $job["job_id"]); }
while (!in_array($j["status"], ["succeeded", "failed", "cancelled"]));
$reply = json_decode($j["output"]["output"], true);
echo $j["charged_credits"], " ", ($reply["verdict"] ?? $reply["note"] ?? ""), "\n";
foreach ($reply["timetable"] ?? [] as $row) echo "- ", $row["slot"], " ", $row["a"], " ", $row["b"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"meet-match:{input["task"]}:{Convert.ToHexString(digest, 0, 8).ToLowerInvariant()}:a1";
var job = await Api.Call("POST", "/run", input, new() { ["Idempotency-Key"] = key });
JsonNode j;
do { await Task.Delay(2000); j = (await Api.Call("GET", "/jobs/" + job!["job_id"]))!; }
while (!new[] { "succeeded", "failed", "cancelled" }.Contains(j["status"]!.GetValue<string>()));
var reply = JsonNode.Parse(j["output"]!["output"]!.GetValue<string>());
Console.WriteLine($"{j["charged_credits"]} {reply!["verdict"] ?? reply["note"]}");
foreach (var row in reply["timetable"] as JsonArray ?? new JsonArray()) Console.WriteLine("- " + row!["slot"] + " " + row["a"] + " " + row["b"]);
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: meet-match:design:$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json
rev = json.load(open("input.json")) # the same run input as input.json: {"task": "design", "event": "Event: ... | dates: ... | city: ...", "sides": "Sponsors (side A) - 6 ...", "block": "Block: date: ... | as published: ...", "notes": "", "facts": "Verdict: ..."}
# - see the input table
req = urllib.request.Request(BASE + "/run-stream", method="POST", data=json.dumps(rev).encode(),
headers={"Content-Type": "application/json", "Authorization": "Bearer " + TOKEN,
"Idempotency-Key": "meet-match:design:" + hashlib.sha256(json.dumps(rev).encode()).hexdigest()[:16] + ":a1"})
with urllib.request.urlopen(req) as r:
for line in r:
line = line.decode().strip()
if line.startswith("data:"):
print(line[5:].strip()[:200])
const rev = JSON.parse(readFileSync("input.json", "utf8"));
const r = await fetch(BASE + "/run-stream", { method: "POST", body: JSON.stringify(rev), headers: {
"Content-Type": "application/json", Authorization: "Bearer " + TOKEN,
"Idempotency-Key": `meet-match:design:${createHash("sha256").update(JSON.stringify(rev)).digest("hex").slice(0, 16)}:a1` } });
const dec = new TextDecoder();
for await (const chunk of r.body) for (const line of dec.decode(chunk).split("\n"))
if (line.startsWith("data:")) console.log(line.slice(5).trim().slice(0, 200));
rraw, _ := os.ReadFile("input.json") // add "bufio", "strings" to the imports
rs := sha256.Sum256(rraw)
req, _ := http.NewRequest("POST", base+"/run-stream", bytes.NewReader(rraw))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Idempotency-Key", "meet-match:design:"+hex.EncodeToString(rs[:8])+":a1")
res, _ := http.DefaultClient.Do(req)
sc := bufio.NewScanner(res.Body)
for sc.Scan() { if l := sc.Text(); strings.HasPrefix(l, "data:") { fmt.Println(l[5:]) } }
String rev = java.nio.file.Files.readString(java.nio.file.Path.of("input.json"));
var rd = java.security.MessageDigest.getInstance("SHA-256").digest(rev.getBytes());
var sreq = HttpRequest.newBuilder(URI.create(BASE + "/run-stream")).header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token).header("Idempotency-Key", "meet-match:design:" + HexFormat.of().formatHex(rd, 0, 8) + ":a1")
.POST(HttpRequest.BodyPublishers.ofString(rev)).build();
C.send(sreq, HttpResponse.BodyHandlers.ofLines()).body().filter(l -> l.startsWith("data:")).forEach(System.out::println);
rev = File.read("input.json")
uri = URI(BASE + "/run-stream")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json", "Authorization" => "Bearer #{TOKEN}",
"Idempotency-Key" => "meet-match:design:#{Digest::SHA256.hexdigest(rev)[0, 16]}:a1")
req.body = rev
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |h|
h.request(req) { |res| res.read_body { |chunk| chunk.each_line { |l| puts l if l.start_with?("data:") } } }
end
$rev = file_get_contents("input.json");
$ch = curl_init(BASE . "/run-stream");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $rev, CURLOPT_HTTPHEADER => [
"Content-Type: application/json", "Authorization: Bearer $TOKEN",
"Idempotency-Key: meet-match:design:" . substr(hash("sha256", $rev), 0, 16) . ":a1"],
CURLOPT_WRITEFUNCTION => function ($ch, $chunk) { foreach (explode("\n", $chunk) as $l) if (str_starts_with($l, "data:")) echo $l, "\n"; return strlen($chunk); }]);
curl_exec($ch);
var rev = File.ReadAllText("input.json");
var rd = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(rev));
var sreq = new HttpRequestMessage(HttpMethod.Post, Api.Base + "/run-stream") { Content = new StringContent(rev, System.Text.Encoding.UTF8, "application/json") };
sreq.Headers.Add("Authorization", "Bearer " + Api.Token);
sreq.Headers.Add("Idempotency-Key", $"meet-match:design:{Convert.ToHexString(rd, 0, 8).ToLowerInvariant()}:a1");
using var http = new HttpClient();
using var res = await http.SendAsync(sreq, HttpCompletionOption.ResponseHeadersRead);
using var rdr = new StreamReader(await res.Content.ReadAsStreamAsync());
for (string? l; (l = await rdr.ReadLineAsync()) != null;) if (l.StartsWith("data:")) Console.WriteLine(l);