Run Event Pitch from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page places the event on the governance spectrum, maps the alternatives, runs the only-this-event test, ranks the category ladder with its deleted rung, picks the levers, runs the rebrand gate and the promise check, and drafts the statement and contrast from the organizer's own words - all free, in pitchkit.js. The run writes the brief or the charter; the page then holds the reply to its own picks and rejects any number (pitchreply.js).
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":"event-pitch"}), so no slug header is needed afterwards. Send it as Authorization: Bearer …. 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, market, facts) is missing. |
| 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 - brief (the positioning brief the team validates) and charter (the one page every organizer signs; it needs a statement, so one attribute must pass the only-this-event test with its value theme). A missing or unknown task is answered as brief. Both lanes send the same four fields.
The input
| Field | Required | What |
|---|---|---|
task | yes | brief or charter. If it is missing or neither, do brief and set "task": "brief". |
event | yes | the event, its kind, what is on the table, the governance, the team's assets and constraints, and the scope. |
market | yes | the best-fit attendee and level, any named targets, the alternatives in order, the attributes in order, the category and the proposed frame, the archetype and any drafted contrast, the headline promise with its editions, and the sponsor segments and activities. |
facts | yes | the governance claims, the alternatives coverage, the attribute test results, the category ladder with its pick, candidates in order and rungs, the levers, the rebrand verdict, the draft statement and contrast, the sponsor layer, the gates, the re-run triggers and every finding tagged [fix], [check] or [info], most urgent first. |
retry_note | no | optional; if present, your previous reply was unusable - follow it. |
The rules the model applies
- Governance comes first and gates every claim: community or volunteer-run (not for profit, credibility from that structure), foundation-run (neutrality is structural), media-run (credibility, never foundation governance), vendor-owned (a product purpose in builder language). Warm language is open to every pole, so it never proves community governance. Claim only the neutrality the governance can structurally back; a program that is largely one vendor's content forfeits it.
- Positioning is context, not messaging: attendees judge the event against alternatives - direct rivals, adjacent events repurposed, doing the job without an event, sending a delegate, doing nothing - classified by ownership and money flow, never by tone. Differentiation claimed before interviewing the happiest repeat attendees and sponsors rests on guesses.
- The only-this-event test: an attribute passes only if no nearby alternative already runs it; a copied format or activity fails however well executed. Each passing attribute chains to a value theme.
- One narrow best-fit attendee segment, never the whole audience, with its audience level decided: make the strong stronger, make everyone aware, or both kept apart at twice the program work. A session called both too technical and not technical enough is a level-split signal. Several target audiences are for conferences only, each with content of its own at every edition, or dropped. Organizers who name different audiences are the first finding.
- Market category: a subcategory of an existing category by default (a modifier shifts evaluation toward the unique attributes); head-to-head only when the event can credibly out-execute the leader; a new category is starved - its education tax needs multi-edition runway, sponsor relationships and a distinctive brand, and a first edition already carries the unproven tag. Positioning for everyone is deleted, not demoted.
- The statement: "For [best-fit attendee], [event] is the [event category] that [unique value theme]." The contrast: "There are many [archetype] events. This is not one of them." - an archetype, never a named rival.
- Levers: publish the track-structure declaration and the contrast sentence together by default; lineup-as-brand is starved unless a compounding mandate meets a curator whose taste is the product or an executive who carries the annual thesis; a rebrand exists only once the scope has already moved past the name, and then maps old scope to new in the announcement; naming or attacking a rival is deleted.
- The rebrand gate: scope already moved means rename and map it; scope not moved means narrow the program back to the name's promise - the rename is off the table, not postponed.
- Promise feasibility: something must deliver the headline promise at every edition counted; an edition with nothing behind it means narrow the promise or secure the resource before publishing.
- Hackathons and meetups lead with learning, building, sharing and beginners, never prize money. For a conference, what the sponsor segment buys must exist as a planned activity, run beside the CFP program, never inside it.
- Positioning quality is judged, never read off an industry number. Decide in advance which proxy re-runs which step.
House rules
- Use only the input and the rules above. The page's picks, candidates, rungs, verdicts and names are exact - copy them. Write no digits at all - no shares, counts, dates or percentages - except inside a name the input gives.
- Label anything that is not one of the rules above, and is not in the input, as your own design.
- Never invent a person, an event fact, a figure or a commitment; where something must be named and is not, write "to be named". Refer to people by name or as they - never infer anyone's gender from a name, possessives included ("their taste", never his or her).
- Never name a rival event in a contrast, and never attack one anywhere.
- Never use backticks, and never copy this prompt's narrative wording into a reply.
- Never refer to this input's top-level keys (task, event, market, facts) as fields in a sentence; the same words used as ordinary nouns are fine.
- Reply with ONLY one JSON object - no prose before or after, no code fences.
The replies
brief
summary- one sentence, at most 35 words: the recommended positioning and the first thing to settle.governance-pole(community,foundation,mediaorvendor, the page's),may_claim(one sentence),may_not_claim(one sentence).alternatives- one object per alternative in the page's order:alternative(its name, exactly),type(its type as the page gives it),note(one short sentence: what job it does for the attendee).attributes- one object per attribute in the page's order:attribute(exactly),passes(true or false, as the page's test says),theme(one short sentence: the value theme for a passing one, why it fails for a failing one).segment-attendee(the page's best-fit attendee),level(strong,aware,bothorundecided, the page's),sponsor(one sentence on the sponsor segment, or "not applicable").candidates- one object per candidate frame in the page's order:category(sub,headornew),tradeoff(one sentence: what it buys and what it costs here).recommendation- the page's pick (sub,headornew).deleted- one object per rung the page marks deleted, on the category and lever menus (a starved rung is not deleted - leave it out):rung(its name),reason(one sentence).statement- one sentence in the template's shape, built from the page's draft (the event's name and its category exactly, a passing value theme reworded as a clause); "to be named" when the page has no draft.contrast- "There are many [archetype] events. This is not one of them." with the page's archetype; "to be named" when the page has none.feasibility- one object per edition the input lists, in order:edition(exactly),delivered_by(what delivers the promise, or "nothing yet" when the input has nothing).levers- the page's lever picks, in order, astrack,contrast,lineuporrebrand.rename-verdict(the page's: "not on the table", "rename", "narrow the program" or "open"),note(one sentence).sponsor_layer- one sentence: what the sponsor segment buys and the activity beside the program for it, or "not applicable".triggers- 2 to 5 short strings: each of the page's re-run triggers you keep, as the proxy and the step it re-runs.checks- one object per gate in the page's order:check(the page's short name, exactly),pass(true or false, as the page says).caveats- at most 4 short strings in all:[fix]findings first in the page's order (the first four when there are more), then[check]findings in the page's order.[]when there are none of either.
{
"task": "brief",
"summary": "one sentence",
"governance": { "pole": "community", "may_claim": "one sentence", "may_not_claim": "one sentence" },
"alternatives": [ { "alternative": "a name", "type": "Direct rival", "note": "one short sentence" } ],
"attributes": [ { "attribute": "an attribute", "passes": true, "theme": "one short sentence" } ],
"segment": { "attendee": "the best-fit attendee", "level": "strong", "sponsor": "one sentence" },
"candidates": [ { "category": "sub", "tradeoff": "one sentence" } ],
"recommendation": "sub",
"deleted": [ { "rung": "Positioning for everyone", "reason": "one sentence" } ],
"statement": "For ..., ... is the ... that ...",
"contrast": "There are many ... events. This is not one of them.",
"feasibility": [ { "edition": "an edition", "delivered_by": "what delivers it" } ],
"levers": [ "track", "contrast" ],
"rename": { "verdict": "not on the table", "note": "one sentence" },
"sponsor_layer": "one sentence",
"triggers": [ "a proxy and the step it re-runs" ],
"checks": [ { "check": "Honest claim", "pass": true } ],
"caveats": [ "a caveat" ]
}
The page holds it to its own picks: the governance pole, every attribute test result, the level, the category candidates in order and the pick, every deleted rung named, a statement carrying the event and its category, a contrast that names an archetype and never a rival, the edition with nothing behind the promise, the levers, the rebrand verdict and the gates; any digit is flagged, since every share or count would be invented.
charter
title- the event's name and the word charter.statement- the statement, as in the brief.contrast- the contrast sentence, as in the brief.for_whom- one or two sentences: the best-fit attendee, the audience level, and who the event is not for.we_claim- one or two sentences: what the governance and the passing attributes let the event say.we_do_not_claim- one or two sentences: what the event will not claim - the neutrality its governance cannot back, a rename before the scope moved, positioning for everyone - only what the page's governance and findings call for.promise_check- one sentence: the headline promise and whether something delivers it at every edition listed, naming any edition with nothing behind it.triggers- 2 to 4 short strings: which proxy re-runs which step.open- one short string per[fix]finding in the page's order (the first four when there are more): what to settle before publishing.[]when there are none.note- one sentence, at most 30 words, for the organizers: what to settle before circulating it.
{
"task": "charter",
"title": "an event charter",
"statement": "For ..., ... is the ... that ...",
"contrast": "There are many ... events. This is not one of them.",
"for_whom": "one or two sentences",
"we_claim": "one or two sentences",
"we_do_not_claim": "one or two sentences",
"promise_check": "one sentence",
"triggers": [ "a proxy and the step it re-runs" ],
"open": [ "what to settle" ],
"note": "one sentence"
}
The page requires the statement in the template's shape, an archetype contrast with no rival named, what the event will not claim (the neutrality its governance cannot back, an early rename), a promise check that names any edition with nothing behind it, and no digit anywhere.
Worked examples - every lane, every sample
These are the page's three free samples (fictional events and organizers; no figures). Each input is exactly what the page sends; each reply is the saved reply the sample replays, shipped as the validating model wrote it; the last line is the page's own check. The rename sample has no charter here: its contrast archetype is missing, so its open items come first.
Northgate Platform Days (a new community conference) - brief
Community/volunteer-run; subcategory of an existing category (practitioner-first platform engineering conference); levers track-structure declaration, contrast sentence, lineup-as-brand; rebrand not on the table; 7 of 9 gates.
Input:
{
"task": "brief",
"event": "Event: Northgate Platform Days; a conference; on the table: positioning a new event from scratch\nGovernance: Community/volunteer-run; wants to claim vendor neutrality yes; single-vendor share of the program measured\nTeam: every organizer names the same audience yes; a hard public date near yes; a compounding annual asset; multi-edition runway no; sponsor relationships to draw on yes; a distinctive brand or name equity no; a curator whose taste is the product yes; an executive to carry the annual thesis no\nScope: tied to one language or framework no",
"market": "Best-fit attendee: platform engineers running internal developer platforms at mid-size companies; audience level make the strong stronger; feedback called one session both too technical and not technical enough no\nAlternatives, in order (alternative | type | owner | what it runs) - from interviews with repeat attendees and sponsors:\n Vellmark Cloud Summit | Direct rival | Vendor-owned | keynotes, expo hall, hiring corner\n Kubernetes meetup | Adjacent event repurposed | Community/volunteer-run | lightning talks, pizza networking\n Vendor webinars and docs | Doing the job without an event | Vendor-owned | product demos\n Send one lead and share notes | Sending a delegate | not classified | not recorded\n Skip it this year | Doing nothing | not classified | not recorded\nAttributes, in order (attribute | value theme | nearby events already run it):\n Postmortem-only talks | lets attendees hear what broke in production and how it was fixed, not product pitches | no\n Curated by a practitioner whose platform reading list is widely followed | makes the lineup read as one trusted practitioner's taste | no\n Hiring corner | lets sponsors meet candidates | yes - Vellmark Cloud Summit\nCategory: platform engineering conference; subcategory modifier practitioner-first; an existing frame describes the concept yes; can out-execute the category leader no; proposed frame Subcategory of an existing category\nContrast: archetype vendor-day cloud; proposed sentence none\nHeadline promise: every talk is a production story told by the practitioner who lived it; editions (edition | delivered by): First edition | the curator's invited speaker list; Second edition | an open CFP reviewed by practitioners; Third edition | NOTHING YET\nSponsor segments (segment | buys): Infrastructure startups | recruiting; Observability vendors | feedback\nPlanned sponsor activities (activity | placement): Hiring corner | beside the coffee | nearby events run it\nProspectus claims: recruiting, feedback",
"facts": "Governance: Community/volunteer-run; may claim not for individual or corporate profit, surplus to the next edition or a charity; credibility that comes from that structure, not from tone; may not claim neutrality over a program past the single-vendor line\nAlternatives: types covered Direct rival, Adjacent event repurposed, Doing the job without an event, Sending a delegate, Doing nothing; missing none\nOnly-this-event test: passes Postmortem-only talks, Curated by a practitioner whose platform reading list is widely followed; fails Hiring corner\nCategory: the page's pick is sub; candidates in order sub, head; rungs Subcategory of an existing category default; Head-to-head in an existing category not credible; New category starved; Positioning for everyone deleted; frame practitioner-first platform engineering conference\nLevers: the page's picks are track, contrast, lineup; rungs Track-structure declaration default; Contrast sentence default; Lineup-as-brand promoted; Rebrand deleted; Naming or attacking a specific rival deleted\nRebrand gate: not on the table\nDraft statement: For platform engineers running internal developer platforms at mid-size companies, Northgate Platform Days is the practitioner-first platform engineering conference that lets attendees hear what broke in production and how it was fixed, not product pitches.\nDraft contrast: There are many vendor-day cloud events. This is not one of them.\nSponsor layer: Hiring corner for Infrastructure startups; Hands-on product feedback session for Observability vendors; every activity beside the program, never in the CFP\nChecks (7 of 9): Honest claim (The event claims only the neutrality its governance structurally backs) passed; Alternatives mapped (Alternatives are mapped across all five types, each classified by ownership) passed; Only this event (At least one attribute passes the only-this-event test and is chained to a value theme) passed; Narrow segment (One narrow attendee segment, with its audience level decided and every organizer agreeing) passed; Category fits runway (The category on the table is one the team can pay for) passed; Promise deliverable (The headline promise has something behind it at every edition counted) MISSING; Contrast not attack (The contrast names an archetype, never a rival event) passed; Rename gate (A rename is on the table only once the scope has already moved past the name) passed; Sponsor layer (What the sponsor segment buys exists as a planned activity, beside the CFP program) MISSING\nRe-run triggers to record: Misdescription watch (attendees or sponsors describing the event wrongly, arrivals expecting what it does not deliver, ticket or sponsor cycles far longer than category peers', CFP submissions assuming missing capabilities) - any one re-runs the category step; Alignment rubric (every organizer describes the positioning identically, new attendees get it at once) - a failing score re-runs the statement; Promise delivery, yes or no per edition - two misses in a row re-run the feasibility check; Level-split signal (a rising share of sessions drawing both 'too technical' and 'not technical enough') - re-opens the audience-level decision; Neutrality audit (the single-vendor share of program content against the forfeit line) - crossing it re-runs the governance claim; Lineup legibility (sampled attendees can say why these speakers are together) - a shrug re-opens the lineup lever\nFindings (8):\n[fix] promise_gap (promise): Nothing delivers the promise at Third edition - narrow the promise or secure the resource before publishing.\n[fix] claim_without_activity (sponsors): The prospectus claims feedback, and no activity stages it - renewals fail on access the program never staged.\n[check] copied_attribute (attributes): Hiring corner (Vellmark Cloud Summit runs it) fails the only-this-event test - nearby events already run it, however well it is executed.\n[check] unplanned (sponsors): Segments buy what no planned activity delivers: Hands-on product feedback session (Observability vendors).\n[check] checks (measurement): Positioning gates: 7 of 9 (set before publishing, never read off an industry number).\n[info] lineup (levers): Lineup-as-brand is promoted: a compounding mandate and a curator whose taste is the product - can attendees say why these speakers are together?\n[info] deadline_levers (levers): A near public date promotes the cheap rungs - publish the contrast sentence and the track-structure rationale together.\n[info] local_copy (sponsors): Nearby events already run Hiring corner - an activity no local alternative runs differentiates for sponsors and attendees alike."
}
Reply:
{
"task": "brief",
"summary": "Position Northgate Platform Days as the practitioner-first subcategory conference for platform engineers at mid-size companies; settle first what delivers the headline promise at the third edition.",
"governance": {
"pole": "community",
"may_claim": "The event may claim it is not run for individual or corporate profit, with any surplus going to the next edition or a charity, and that its credibility comes from that structure, not from tone.",
"may_not_claim": "It may not claim neutrality over a program that crosses the single-vendor line."
},
"alternatives": [
{
"alternative": "Vellmark Cloud Summit",
"type": "Direct rival",
"note": "Gives attendees keynotes, an expo hall, and a hiring corner in one trip."
},
{
"alternative": "Kubernetes meetup",
"type": "Adjacent event repurposed",
"note": "Offers lightning talks and casual networking over pizza."
},
{
"alternative": "Vendor webinars and docs",
"type": "Doing the job without an event",
"note": "Lets attendees watch product demos without attending an event."
},
{
"alternative": "Send one lead and share notes",
"type": "Sending a delegate",
"note": "Covers the event for the team through one colleague's notes."
},
{
"alternative": "Skip it this year",
"type": "Doing nothing",
"note": "Meets the need by attending nothing at all."
}
],
"attributes": [
{
"attribute": "Postmortem-only talks",
"passes": true,
"theme": "Lets attendees hear what broke in production and how it was fixed, not product pitches."
},
{
"attribute": "Curated by a practitioner whose platform reading list is widely followed",
"passes": true,
"theme": "Makes the lineup read as one trusted practitioner's taste."
},
{
"attribute": "Hiring corner",
"passes": false,
"theme": "Fails the only-this-event test because Vellmark Cloud Summit already runs it."
}
],
"segment": {
"attendee": "platform engineers running internal developer platforms at mid-size companies",
"level": "strong",
"sponsor": "The sponsor segment is infrastructure startups buying recruiting access and observability vendors buying feedback."
},
"candidates": [
{
"category": "sub",
"tradeoff": "A subcategory of the platform engineering conference buys ready-made attendee understanding, at the cost of differentiating only on the practitioner-first attributes."
},
{
"category": "head",
"tradeoff": "Head-to-head positioning would claim the category leader's ground outright, but costs credibility since the event cannot out-execute that leader."
}
],
"recommendation": "sub",
"deleted": [
{
"rung": "Positioning for everyone",
"reason": "A broad everyone positioning is removed outright, not softened, now that one narrow best-fit segment has been chosen."
},
{
"rung": "Rebrand",
"reason": "Renaming stays off this lever menu since nothing about the event's scope has shifted beyond what its current name already promises."
},
{
"rung": "Naming or attacking a specific rival",
"reason": "Calling out a specific competitor is removed from the lever menu; any contrast here points at an archetype instead."
}
],
"statement": "For platform engineers running internal developer platforms at mid-size companies, Northgate Platform Days is the practitioner-first platform engineering conference that lets attendees hear what broke in production and how it was fixed, not product pitches.",
"contrast": "There are many vendor-day cloud events. This is not one of them.",
"feasibility": [
{
"edition": "First edition",
"delivered_by": "the curator's invited speaker list"
},
{
"edition": "Second edition",
"delivered_by": "an open CFP reviewed by practitioners"
},
{
"edition": "Third edition",
"delivered_by": "nothing yet"
}
],
"levers": [
"track",
"contrast",
"lineup"
],
"rename": {
"verdict": "not on the table",
"note": "The scope has not moved past the event's name, so a rename stays off the table."
},
"sponsor_layer": "Infrastructure startups buy recruiting access through the hiring corner, and observability vendors buy feedback through a hands-on product feedback session, both placed beside the program and never inside the CFP.",
"triggers": [
"Misdescription watch - re-runs the category step",
"Alignment rubric - re-runs the statement",
"Promise delivery per edition - re-runs the feasibility check",
"Level-split signal - re-opens the audience-level decision",
"Neutrality audit - re-runs the governance claim"
],
"checks": [
{
"check": "Honest claim",
"pass": true
},
{
"check": "Alternatives mapped",
"pass": true
},
{
"check": "Only this event",
"pass": true
},
{
"check": "Narrow segment",
"pass": true
},
{
"check": "Category fits runway",
"pass": true
},
{
"check": "Promise deliverable",
"pass": false
},
{
"check": "Contrast not attack",
"pass": true
},
{
"check": "Rename gate",
"pass": true
},
{
"check": "Sponsor layer",
"pass": false
}
],
"caveats": [
"Nothing delivers the promise at the third edition - narrow the promise or secure the resource before publishing.",
"The prospectus claims feedback, and no activity stages it - renewals fail on access the program never staged.",
"Hiring corner fails the only-this-event test because Vellmark Cloud Summit already runs it.",
"Observability vendors are sold a hands-on product feedback session that no planned activity delivers."
]
}
The page's check: kept - nothing to flag
Northgate Platform Days (a new community conference) - charter
Community/volunteer-run; subcategory of an existing category (practitioner-first platform engineering conference); levers track-structure declaration, contrast sentence, lineup-as-brand; rebrand not on the table; 7 of 9 gates.
Input:
{
"task": "charter",
"event": "Event: Northgate Platform Days; a conference; on the table: positioning a new event from scratch\nGovernance: Community/volunteer-run; wants to claim vendor neutrality yes; single-vendor share of the program measured\nTeam: every organizer names the same audience yes; a hard public date near yes; a compounding annual asset; multi-edition runway no; sponsor relationships to draw on yes; a distinctive brand or name equity no; a curator whose taste is the product yes; an executive to carry the annual thesis no\nScope: tied to one language or framework no",
"market": "Best-fit attendee: platform engineers running internal developer platforms at mid-size companies; audience level make the strong stronger; feedback called one session both too technical and not technical enough no\nAlternatives, in order (alternative | type | owner | what it runs) - from interviews with repeat attendees and sponsors:\n Vellmark Cloud Summit | Direct rival | Vendor-owned | keynotes, expo hall, hiring corner\n Kubernetes meetup | Adjacent event repurposed | Community/volunteer-run | lightning talks, pizza networking\n Vendor webinars and docs | Doing the job without an event | Vendor-owned | product demos\n Send one lead and share notes | Sending a delegate | not classified | not recorded\n Skip it this year | Doing nothing | not classified | not recorded\nAttributes, in order (attribute | value theme | nearby events already run it):\n Postmortem-only talks | lets attendees hear what broke in production and how it was fixed, not product pitches | no\n Curated by a practitioner whose platform reading list is widely followed | makes the lineup read as one trusted practitioner's taste | no\n Hiring corner | lets sponsors meet candidates | yes - Vellmark Cloud Summit\nCategory: platform engineering conference; subcategory modifier practitioner-first; an existing frame describes the concept yes; can out-execute the category leader no; proposed frame Subcategory of an existing category\nContrast: archetype vendor-day cloud; proposed sentence none\nHeadline promise: every talk is a production story told by the practitioner who lived it; editions (edition | delivered by): First edition | the curator's invited speaker list; Second edition | an open CFP reviewed by practitioners; Third edition | NOTHING YET\nSponsor segments (segment | buys): Infrastructure startups | recruiting; Observability vendors | feedback\nPlanned sponsor activities (activity | placement): Hiring corner | beside the coffee | nearby events run it\nProspectus claims: recruiting, feedback",
"facts": "Governance: Community/volunteer-run; may claim not for individual or corporate profit, surplus to the next edition or a charity; credibility that comes from that structure, not from tone; may not claim neutrality over a program past the single-vendor line\nAlternatives: types covered Direct rival, Adjacent event repurposed, Doing the job without an event, Sending a delegate, Doing nothing; missing none\nOnly-this-event test: passes Postmortem-only talks, Curated by a practitioner whose platform reading list is widely followed; fails Hiring corner\nCategory: the page's pick is sub; candidates in order sub, head; rungs Subcategory of an existing category default; Head-to-head in an existing category not credible; New category starved; Positioning for everyone deleted; frame practitioner-first platform engineering conference\nLevers: the page's picks are track, contrast, lineup; rungs Track-structure declaration default; Contrast sentence default; Lineup-as-brand promoted; Rebrand deleted; Naming or attacking a specific rival deleted\nRebrand gate: not on the table\nDraft statement: For platform engineers running internal developer platforms at mid-size companies, Northgate Platform Days is the practitioner-first platform engineering conference that lets attendees hear what broke in production and how it was fixed, not product pitches.\nDraft contrast: There are many vendor-day cloud events. This is not one of them.\nSponsor layer: Hiring corner for Infrastructure startups; Hands-on product feedback session for Observability vendors; every activity beside the program, never in the CFP\nChecks (7 of 9): Honest claim (The event claims only the neutrality its governance structurally backs) passed; Alternatives mapped (Alternatives are mapped across all five types, each classified by ownership) passed; Only this event (At least one attribute passes the only-this-event test and is chained to a value theme) passed; Narrow segment (One narrow attendee segment, with its audience level decided and every organizer agreeing) passed; Category fits runway (The category on the table is one the team can pay for) passed; Promise deliverable (The headline promise has something behind it at every edition counted) MISSING; Contrast not attack (The contrast names an archetype, never a rival event) passed; Rename gate (A rename is on the table only once the scope has already moved past the name) passed; Sponsor layer (What the sponsor segment buys exists as a planned activity, beside the CFP program) MISSING\nRe-run triggers to record: Misdescription watch (attendees or sponsors describing the event wrongly, arrivals expecting what it does not deliver, ticket or sponsor cycles far longer than category peers', CFP submissions assuming missing capabilities) - any one re-runs the category step; Alignment rubric (every organizer describes the positioning identically, new attendees get it at once) - a failing score re-runs the statement; Promise delivery, yes or no per edition - two misses in a row re-run the feasibility check; Level-split signal (a rising share of sessions drawing both 'too technical' and 'not technical enough') - re-opens the audience-level decision; Neutrality audit (the single-vendor share of program content against the forfeit line) - crossing it re-runs the governance claim; Lineup legibility (sampled attendees can say why these speakers are together) - a shrug re-opens the lineup lever\nFindings (8):\n[fix] promise_gap (promise): Nothing delivers the promise at Third edition - narrow the promise or secure the resource before publishing.\n[fix] claim_without_activity (sponsors): The prospectus claims feedback, and no activity stages it - renewals fail on access the program never staged.\n[check] copied_attribute (attributes): Hiring corner (Vellmark Cloud Summit runs it) fails the only-this-event test - nearby events already run it, however well it is executed.\n[check] unplanned (sponsors): Segments buy what no planned activity delivers: Hands-on product feedback session (Observability vendors).\n[check] checks (measurement): Positioning gates: 7 of 9 (set before publishing, never read off an industry number).\n[info] lineup (levers): Lineup-as-brand is promoted: a compounding mandate and a curator whose taste is the product - can attendees say why these speakers are together?\n[info] deadline_levers (levers): A near public date promotes the cheap rungs - publish the contrast sentence and the track-structure rationale together.\n[info] local_copy (sponsors): Nearby events already run Hiring corner - an activity no local alternative runs differentiates for sponsors and attendees alike."
}
Reply:
{
"task": "charter",
"title": "Northgate Platform Days Charter",
"statement": "For platform engineers running internal developer platforms at mid-size companies, Northgate Platform Days is the practitioner-first platform engineering conference that lets attendees hear what broke in production and how it was fixed, not product pitches.",
"contrast": "There are many vendor-day cloud events. This is not one of them.",
"for_whom": "This charter is for platform engineers running internal developer platforms at mid-size companies, with the program built to make the strong stronger. It is not for newcomers seeking a broad introduction to platform engineering or for a general audience wanting awareness alone.",
"we_claim": "As a community and volunteer-run event, Northgate Platform Days claims credibility from that structure, not from tone, and claims it is not run for individual or corporate profit, with any surplus carried to the next edition or a charity. Its program claims postmortem-only talks that let attendees hear what broke in production and how it was fixed, not product pitches, curated by a practitioner whose platform reading list is widely followed.",
"we_do_not_claim": "Northgate Platform Days does not claim vendor neutrality once the program crosses the single-vendor line, and it will not rename itself since its scope has not moved past the name it already carries. It does not position itself for everyone; the program is built for one narrow best-fit segment, not a general audience.",
"promise_check": "The promise that every talk is a production story told by the practitioner who lived it is delivered by the curator's invited speaker list in the first edition and an open CFP reviewed by practitioners in the second edition, but nothing yet delivers it for the third edition.",
"triggers": [
"Misdescription watch re-runs the category step.",
"Alignment rubric re-runs the statement.",
"Promise delivery, yes or no per edition, re-runs the feasibility check after two misses in a row.",
"Neutrality audit re-runs the governance claim."
],
"open": [
"Narrow the promise or secure the resource behind the third edition before publishing.",
"Stage a planned activity for the feedback claim made to sponsors, or renewals will fail on access the program never staged."
],
"note": "Settle the third edition's promise delivery and the unstaged feedback claim before circulating this charter, so every organizer signs the same accurate description."
}
The page's check: kept - nothing to flag
OpsMoot Harbour (a rename on the table) - brief
Media-run; subcategory of an existing category (regional reliability engineering conference); levers track-structure declaration, contrast sentence; rebrand narrow the program; 4 of 9 gates.
Input:
{
"task": "brief",
"event": "Event: OpsMoot Harbour; a conference; on the table: judging a rename\nGovernance: Media-run; wants to claim vendor neutrality yes; single-vendor share of the program not measured\nTeam: every organizer names the same audience no; a hard public date near no; a compounding annual asset; multi-edition runway yes; sponsor relationships to draw on yes; a distinctive brand or name equity yes; a curator whose taste is the product no; an executive to carry the annual thesis no\nScope: tied to one language or framework no; audience or content scope already moved past the name no",
"market": "Best-fit attendee: site reliability engineers in the harbour region; audience level both, kept apart; feedback called one session both too technical and not technical enough yes\nNamed targets (target | own content every edition): Site reliability engineers | yes; Engineering managers | no\nAlternatives, in order (alternative | type | owner | what it runs) - the organizers' guesses, not interviews:\n Vellmark Cloud Summit | Direct rival | Vendor-owned | keynotes, expo hall\n Quaymark Tech Week | Adjacent event repurposed | Media-run | panels, startup pitches\n Online incident-review clubs | Doing the job without an event | Community/volunteer-run | incident reviews\nAttributes, in order (attribute | value theme | nearby events already run it):\n Live incident-review theatre | lets attendees practise a real incident response in the room | no\n Panels | gives a broad overview | yes - Quaymark Tech Week\nCategory: reliability engineering conference; subcategory modifier regional; an existing frame describes the concept yes; can out-execute the category leader no; proposed frame New category\nContrast: archetype not named; proposed sentence Unlike Vellmark Cloud Summit, we put engineers before sales pitches.\nHeadline promise: the region's reliability practitioners in one room; editions (edition | delivered by): Next edition | local speaker bench; The one after | local speaker bench\nSponsors: no sponsor offer on the table",
"facts": "Governance: Media-run; may claim scale, access and earned credibility; neutrality language only as credibility, never as governance; may not claim structural neutrality - no foundation owns the governance\nAlternatives: types covered Direct rival, Adjacent event repurposed, Doing the job without an event; missing Sending a delegate, Doing nothing\nOnly-this-event test: passes Live incident-review theatre; fails Panels\nCategory: the page's pick is sub; candidates in order sub, head; rungs Subcategory of an existing category default; Head-to-head in an existing category not credible; New category starved; Positioning for everyone deleted; frame regional reliability engineering conference\nLevers: the page's picks are track, contrast; rungs Track-structure declaration default; Contrast sentence default; Lineup-as-brand starved; Rebrand deleted; Naming or attacking a specific rival deleted\nRebrand gate: narrow the program\nDraft statement: For site reliability engineers in the harbour region, OpsMoot Harbour is the regional reliability engineering conference that lets attendees practise a real incident response in the room.\nDraft contrast: NONE - no archetype named\nSponsor layer: not applicable\nChecks (4 of 9): Honest claim (The event claims only the neutrality its governance structurally backs) passed; Alternatives mapped (Alternatives are mapped across all five types, each classified by ownership) MISSING; Only this event (At least one attribute passes the only-this-event test and is chained to a value theme) passed; Narrow segment (One narrow attendee segment, with its audience level decided and every organizer agreeing) MISSING; Category fits runway (The category on the table is one the team can pay for) MISSING; Promise deliverable (The headline promise has something behind it at every edition counted) passed; Contrast not attack (The contrast names an archetype, never a rival event) MISSING; Rename gate (A rename is on the table only once the scope has already moved past the name) MISSING; Sponsor layer (What the sponsor segment buys exists as a planned activity, beside the CFP program) passed\nRe-run triggers to record: Misdescription watch (attendees or sponsors describing the event wrongly, arrivals expecting what it does not deliver, ticket or sponsor cycles far longer than category peers', CFP submissions assuming missing capabilities) - any one re-runs the category step; Alignment rubric (every organizer describes the positioning identically, new attendees get it at once) - a failing score re-runs the statement; Promise delivery, yes or no per edition - two misses in a row re-run the feasibility check; Level-split signal (a rising share of sessions drawing both 'too technical' and 'not technical enough') - re-opens the audience-level decision; Per-target coverage (each named target got content of its own and held its share of attendees) - a target shrinking two editions running re-opens the several-targets decision\nFindings (14):\n[fix] misaligned (segment): The organizers would not all name the same audience - that misalignment is the finding; settle it before any statement.\n[fix] rename_early (rename): The scope has not moved past the current name - narrow the program back to the name's promise; the rename is off the table, not postponed.\n[fix] proposed_new (category): The proposed new category is starved here - an existing frame already describes the concept; start as a subcategory.\n[fix] names_rival (levers): The contrast names Vellmark Cloud Summit - attacking a specific rival is deleted: it invites rebuttal and expires when the rival pivots; contrast with an archetype.\n[fix] target_dropped (segment): Engineering managers gets no content of its own at every edition - drop it from the statement rather than keep it on the landing page.\n[check] neutral_media (governance): A media-run event can borrow neutrality language only as earned credibility - no foundation owns its governance, so never present it as structural.\n[check] alt_types (alternatives): The alternatives map is missing: sending a delegate, doing nothing.\n[check] guesses (alternatives): The alternatives are guesses until the happiest repeat attendees and sponsors are interviewed - not prospects, and one list per segment.\n[check] copied_attribute (attributes): Panels (Quaymark Tech Week runs it) fails the only-this-event test - nearby events already run it, however well it is executed.\n[check] no_archetype (levers): Name the archetype for the contrast sentence - the kind of event this is not, drawn from the alternatives map.\n[check] checks (measurement): Positioning gates: 4 of 9 (set before publishing, never read off an industry number).\n[info] level_both (segment): Both levels, kept apart - separate formats or alternating editions, at twice the program work.\n[info] several_targets (segment): Several targets: name each in the attendee clause, check the promise once per target, and hand the content split to format selection.\n[info] lineup_starved (levers): A compounding mandate, but no curator whose taste is the product and no executive to carry the thesis - lineup-as-brand stays starved."
}
Reply:
{
"task": "brief",
"summary": "Recommend narrowing OpsMoot Harbour to the regional reliability engineering conference for harbour-region site reliability engineers, but first settle that organizers do not yet agree on the audience.",
"governance": {
"pole": "media",
"may_claim": "The event may claim scale, access, and credibility it has earned, using neutrality language only as that earned credibility, never as governance.",
"may_not_claim": "It may not claim structural neutrality, since no foundation owns its governance."
},
"alternatives": [
{
"alternative": "Vellmark Cloud Summit",
"type": "Direct rival",
"note": "Gives attendees keynotes and an expo hall in one trip."
},
{
"alternative": "Quaymark Tech Week",
"type": "Adjacent event repurposed",
"note": "Offers panels and startup pitches on an existing event's stage."
},
{
"alternative": "Online incident-review clubs",
"type": "Doing the job without an event",
"note": "Lets practitioners review incidents together without attending an event."
}
],
"attributes": [
{
"attribute": "Live incident-review theatre",
"passes": true,
"theme": "Lets attendees practise a real incident response in the room."
},
{
"attribute": "Panels",
"passes": false,
"theme": "Fails the only-this-event test because Quaymark Tech Week already runs panels."
}
],
"segment": {
"attendee": "site reliability engineers in the harbour region",
"level": "both",
"sponsor": "not applicable"
},
"candidates": [
{
"category": "sub",
"tradeoff": "A subcategory of the reliability engineering conference buys a ready-made evaluation frame, at the cost of not owning a distinct category outright."
},
{
"category": "head",
"tradeoff": "Head-to-head positioning would contest the category leader directly, but costs credibility the event cannot back since it cannot out-execute that leader."
}
],
"recommendation": "sub",
"deleted": [
{
"rung": "Positioning for everyone",
"reason": "A broad everyone positioning is removed outright, not softened, now that one narrow best-fit segment has been chosen."
},
{
"rung": "Rebrand",
"reason": "Renaming stays off this lever menu because the event's scope has not shifted past what the current name already promises, so the program narrows back to that promise instead."
},
{
"rung": "Naming or attacking a specific rival",
"reason": "Calling out a specific competitor is removed from the lever menu; the draft that named Vellmark Cloud Summit needs an archetype in its place."
}
],
"statement": "For site reliability engineers in the harbour region, OpsMoot Harbour is the regional reliability engineering conference that lets attendees practise a real incident response in the room.",
"contrast": "to be named",
"feasibility": [
{
"edition": "Next edition",
"delivered_by": "local speaker bench"
},
{
"edition": "The one after",
"delivered_by": "local speaker bench"
}
],
"levers": [
"track",
"contrast"
],
"rename": {
"verdict": "narrow the program",
"note": "The event's scope has not moved past the name OpsMoot Harbour, so the program should narrow back to what the name promises rather than rename."
},
"sponsor_layer": "not applicable",
"triggers": [
"Misdescription watch - re-runs the category step",
"Alignment rubric - re-runs the statement",
"Promise delivery per edition - re-runs the feasibility check",
"Level-split signal - re-opens the audience-level decision",
"Per-target coverage - re-opens the several-targets decision"
],
"checks": [
{
"check": "Honest claim",
"pass": true
},
{
"check": "Alternatives mapped",
"pass": false
},
{
"check": "Only this event",
"pass": true
},
{
"check": "Narrow segment",
"pass": false
},
{
"check": "Category fits runway",
"pass": false
},
{
"check": "Promise deliverable",
"pass": true
},
{
"check": "Contrast not attack",
"pass": false
},
{
"check": "Rename gate",
"pass": false
},
{
"check": "Sponsor layer",
"pass": true
}
],
"caveats": [
"Organizers do not all name the same audience - settle that misalignment before any statement.",
"The scope has not moved past the current name - narrow the program back to the name's promise; the rename stays off the table, not postponed.",
"The proposed new category is starved here since an existing frame already describes the concept - start as a subcategory.",
"The contrast names Vellmark Cloud Summit - attacking a specific rival is deleted; contrast with an archetype instead."
]
}
The page's check: kept - nothing to flag
Riverbend Hack Weekend (a prize-led student hackathon) - brief
Community/volunteer-run; subcategory of an existing category (beginner-first student hackathon); levers track-structure declaration, contrast sentence; rebrand not on the table; 8 of 9 gates.
Input:
{
"task": "brief",
"event": "Event: Riverbend Hack Weekend; a hackathon; on the table: positioning a new event from scratch\nGovernance: Community/volunteer-run; wants to claim vendor neutrality no\nTeam: every organizer names the same audience yes; a hard public date near no; a one-off edition bet; multi-edition runway no; sponsor relationships to draw on no; a distinctive brand or name equity no; a curator whose taste is the product no; an executive to carry the annual thesis no\nScope: tied to one language or framework no; leads with prize money yes",
"market": "Best-fit attendee: students and first-time builders in Riverbend; audience level make everyone aware; feedback called one session both too technical and not technical enough no\nAlternatives, in order (alternative | type | owner | what it runs) - the organizers' guesses, not interviews:\n Brightfold Hack Prize | Direct rival | Vendor-owned | prize pitches, overnight coding\n Online tutorials | Doing the job without an event | not classified | video courses\nAttributes, in order (attribute | value theme | nearby events already run it):\n Mentor pairs for every first-time team | keeps every first-time team from getting stuck alone on day one | no\n Overnight coding | gives a long build window | yes - Brightfold Hack Prize\nCategory: student hackathon; subcategory modifier beginner-first; an existing frame describes the concept no; can out-execute the category leader no; proposed frame Subcategory of an existing category\nContrast: archetype prize-chasing; proposed sentence none\nHeadline promise: every first-time team ships something it can show; editions (edition | delivered by): This weekend | volunteer mentors from the university club\nSponsors: the business-oriented layer does not apply to a hackathon",
"facts": "Governance: Community/volunteer-run; may claim not for individual or corporate profit, surplus to the next edition or a charity; credibility that comes from that structure, not from tone; may not claim neutrality over a program past the single-vendor line\nAlternatives: types covered Direct rival, Doing the job without an event; missing Adjacent event repurposed, Sending a delegate, Doing nothing\nOnly-this-event test: passes Mentor pairs for every first-time team; fails Overnight coding\nCategory: the page's pick is sub; candidates in order sub, head; rungs Subcategory of an existing category default; Head-to-head in an existing category not credible; New category starved; Positioning for everyone deleted; frame beginner-first student hackathon\nLevers: the page's picks are track, contrast; rungs Track-structure declaration default; Contrast sentence default; Lineup-as-brand starved; Rebrand deleted; Naming or attacking a specific rival deleted\nRebrand gate: not on the table\nDraft statement: For students and first-time builders in Riverbend, Riverbend Hack Weekend is the beginner-first student hackathon that keeps every first-time team from getting stuck alone on day one.\nDraft contrast: There are many prize-chasing events. This is not one of them.\nSponsor layer: not applicable\nChecks (8 of 9): Honest claim (The event claims only the neutrality its governance structurally backs) passed; Alternatives mapped (Alternatives are mapped across all five types, each classified by ownership) MISSING; Only this event (At least one attribute passes the only-this-event test and is chained to a value theme) passed; Narrow segment (One narrow attendee segment, with its audience level decided and every organizer agreeing) passed; Category fits runway (The category on the table is one the team can pay for) passed; Promise deliverable (The headline promise has something behind it at every edition counted) passed; Contrast not attack (The contrast names an archetype, never a rival event) passed; Rename gate (A rename is on the table only once the scope has already moved past the name) passed; Sponsor layer (What the sponsor segment buys exists as a planned activity, beside the CFP program) passed\nRe-run triggers to record: Misdescription watch (attendees or sponsors describing the event wrongly, arrivals expecting what it does not deliver, ticket or sponsor cycles far longer than category peers', CFP submissions assuming missing capabilities) - any one re-runs the category step; Alignment rubric (every organizer describes the positioning identically, new attendees get it at once) - a failing score re-runs the statement; Promise delivery, yes or no per edition - two misses in a row re-run the feasibility check; Level-split signal (a rising share of sessions drawing both 'too technical' and 'not technical enough') - re-opens the audience-level decision; Neutrality audit (the single-vendor share of program content against the forfeit line) - crossing it re-runs the governance claim\nFindings (7):\n[fix] prize_led (segment): Prize-led hackathon positioning cedes the learn-build-share ground and attracts the wrong room - lead with learning, building and beginners.\n[check] alt_types (alternatives): The alternatives map is missing: adjacent event repurposed, sending a delegate, doing nothing.\n[check] guesses (alternatives): The alternatives are guesses until the happiest repeat attendees and sponsors are interviewed - not prospects, and one list per segment.\n[check] copied_attribute (attributes): Overnight coding (Brightfold Hack Prize runs it) fails the only-this-event test - nearby events already run it, however well it is executed.\n[check] checks (measurement): Positioning gates: 8 of 9 (set before publishing, never read off an industry number).\n[info] start_sub (category): No existing frame describes the concept, but a new category's education tax needs multi-edition runway, sponsor relationships and a distinctive brand - start as a subcategory and evolve once traction exists.\n[info] layer_conference (sponsors): The business-oriented layer is a conference decision - a hackathon keeps sponsors to supporting the community."
}
Reply:
{
"task": "brief",
"summary": "Position Riverbend Hack Weekend as the beginner-first student hackathon for first-time builders, but first drop the prize-money framing so it leads with learning, building, and beginners.",
"governance": {
"pole": "community",
"may_claim": "The event may claim it is not run for individual or corporate profit, with any surplus going to the next edition or a charity, and that its credibility comes from that structure, not from tone.",
"may_not_claim": "It may not claim neutrality over a program that crosses the single-vendor line."
},
"alternatives": [
{
"alternative": "Brightfold Hack Prize",
"type": "Direct rival",
"note": "Runs prize pitches and overnight coding for the same weekend-hackathon crowd."
},
{
"alternative": "Online tutorials",
"type": "Doing the job without an event",
"note": "Lets first-time builders learn through video courses on their own."
}
],
"attributes": [
{
"attribute": "Mentor pairs for every first-time team",
"passes": true,
"theme": "Keeps every first-time team from getting stuck alone on day one."
},
{
"attribute": "Overnight coding",
"passes": false,
"theme": "Fails the only-this-event test because Brightfold Hack Prize already runs overnight coding."
}
],
"segment": {
"attendee": "students and first-time builders in Riverbend",
"level": "aware",
"sponsor": "not applicable"
},
"candidates": [
{
"category": "sub",
"tradeoff": "A subcategory of the student hackathon buys attendees an existing frame to evaluate against, at the cost of not owning a distinct category outright."
},
{
"category": "head",
"tradeoff": "Head-to-head positioning would contest the category leader directly, but costs credibility the event cannot back since it cannot out-execute that leader."
}
],
"recommendation": "sub",
"deleted": [
{
"rung": "Positioning for everyone",
"reason": "A broad everyone positioning is removed outright, not softened, now that one narrow best-fit segment has been chosen."
},
{
"rung": "Rebrand",
"reason": "Renaming stays off this lever menu for a first-time event with no established name or scope to have moved past."
},
{
"rung": "Naming or attacking a specific rival",
"reason": "Calling out a specific competitor is removed from the lever menu; any contrast here points at an archetype instead."
}
],
"statement": "For students and first-time builders in Riverbend, Riverbend Hack Weekend is the beginner-first student hackathon that keeps every first-time team from getting stuck alone on day one.",
"contrast": "There are many prize-chasing events. This is not one of them.",
"feasibility": [
{
"edition": "This weekend",
"delivered_by": "volunteer mentors from the university club"
}
],
"levers": [
"track",
"contrast"
],
"rename": {
"verdict": "not on the table",
"note": "There is no existing name or scope to move past, so a rename is not on the table for a first edition."
},
"sponsor_layer": "not applicable",
"triggers": [
"Misdescription watch - re-runs the category step",
"Alignment rubric - re-runs the statement",
"Promise delivery per edition - re-runs the feasibility check",
"Level-split signal - re-opens the audience-level decision",
"Neutrality audit - re-runs the governance claim"
],
"checks": [
{
"check": "Honest claim",
"pass": true
},
{
"check": "Alternatives mapped",
"pass": false
},
{
"check": "Only this event",
"pass": true
},
{
"check": "Narrow segment",
"pass": true
},
{
"check": "Category fits runway",
"pass": true
},
{
"check": "Promise deliverable",
"pass": true
},
{
"check": "Contrast not attack",
"pass": true
},
{
"check": "Rename gate",
"pass": true
},
{
"check": "Sponsor layer",
"pass": true
}
],
"caveats": [
"Prize-led hackathon positioning cedes the learn-build-share ground and attracts the wrong room - lead with learning, building, and beginners.",
"The alternatives map is missing adjacent event repurposed, sending a delegate, and doing nothing.",
"The alternatives are guesses until the happiest repeat attendees and sponsors are interviewed, not prospects.",
"Overnight coding fails the only-this-event test because Brightfold Hack Prize already runs it."
]
}
The page's check: kept - nothing to flag
Riverbend Hack Weekend (a prize-led student hackathon) - charter
Community/volunteer-run; subcategory of an existing category (beginner-first student hackathon); levers track-structure declaration, contrast sentence; rebrand not on the table; 8 of 9 gates.
Input:
{
"task": "charter",
"event": "Event: Riverbend Hack Weekend; a hackathon; on the table: positioning a new event from scratch\nGovernance: Community/volunteer-run; wants to claim vendor neutrality no\nTeam: every organizer names the same audience yes; a hard public date near no; a one-off edition bet; multi-edition runway no; sponsor relationships to draw on no; a distinctive brand or name equity no; a curator whose taste is the product no; an executive to carry the annual thesis no\nScope: tied to one language or framework no; leads with prize money yes",
"market": "Best-fit attendee: students and first-time builders in Riverbend; audience level make everyone aware; feedback called one session both too technical and not technical enough no\nAlternatives, in order (alternative | type | owner | what it runs) - the organizers' guesses, not interviews:\n Brightfold Hack Prize | Direct rival | Vendor-owned | prize pitches, overnight coding\n Online tutorials | Doing the job without an event | not classified | video courses\nAttributes, in order (attribute | value theme | nearby events already run it):\n Mentor pairs for every first-time team | keeps every first-time team from getting stuck alone on day one | no\n Overnight coding | gives a long build window | yes - Brightfold Hack Prize\nCategory: student hackathon; subcategory modifier beginner-first; an existing frame describes the concept no; can out-execute the category leader no; proposed frame Subcategory of an existing category\nContrast: archetype prize-chasing; proposed sentence none\nHeadline promise: every first-time team ships something it can show; editions (edition | delivered by): This weekend | volunteer mentors from the university club\nSponsors: the business-oriented layer does not apply to a hackathon",
"facts": "Governance: Community/volunteer-run; may claim not for individual or corporate profit, surplus to the next edition or a charity; credibility that comes from that structure, not from tone; may not claim neutrality over a program past the single-vendor line\nAlternatives: types covered Direct rival, Doing the job without an event; missing Adjacent event repurposed, Sending a delegate, Doing nothing\nOnly-this-event test: passes Mentor pairs for every first-time team; fails Overnight coding\nCategory: the page's pick is sub; candidates in order sub, head; rungs Subcategory of an existing category default; Head-to-head in an existing category not credible; New category starved; Positioning for everyone deleted; frame beginner-first student hackathon\nLevers: the page's picks are track, contrast; rungs Track-structure declaration default; Contrast sentence default; Lineup-as-brand starved; Rebrand deleted; Naming or attacking a specific rival deleted\nRebrand gate: not on the table\nDraft statement: For students and first-time builders in Riverbend, Riverbend Hack Weekend is the beginner-first student hackathon that keeps every first-time team from getting stuck alone on day one.\nDraft contrast: There are many prize-chasing events. This is not one of them.\nSponsor layer: not applicable\nChecks (8 of 9): Honest claim (The event claims only the neutrality its governance structurally backs) passed; Alternatives mapped (Alternatives are mapped across all five types, each classified by ownership) MISSING; Only this event (At least one attribute passes the only-this-event test and is chained to a value theme) passed; Narrow segment (One narrow attendee segment, with its audience level decided and every organizer agreeing) passed; Category fits runway (The category on the table is one the team can pay for) passed; Promise deliverable (The headline promise has something behind it at every edition counted) passed; Contrast not attack (The contrast names an archetype, never a rival event) passed; Rename gate (A rename is on the table only once the scope has already moved past the name) passed; Sponsor layer (What the sponsor segment buys exists as a planned activity, beside the CFP program) passed\nRe-run triggers to record: Misdescription watch (attendees or sponsors describing the event wrongly, arrivals expecting what it does not deliver, ticket or sponsor cycles far longer than category peers', CFP submissions assuming missing capabilities) - any one re-runs the category step; Alignment rubric (every organizer describes the positioning identically, new attendees get it at once) - a failing score re-runs the statement; Promise delivery, yes or no per edition - two misses in a row re-run the feasibility check; Level-split signal (a rising share of sessions drawing both 'too technical' and 'not technical enough') - re-opens the audience-level decision; Neutrality audit (the single-vendor share of program content against the forfeit line) - crossing it re-runs the governance claim\nFindings (7):\n[fix] prize_led (segment): Prize-led hackathon positioning cedes the learn-build-share ground and attracts the wrong room - lead with learning, building and beginners.\n[check] alt_types (alternatives): The alternatives map is missing: adjacent event repurposed, sending a delegate, doing nothing.\n[check] guesses (alternatives): The alternatives are guesses until the happiest repeat attendees and sponsors are interviewed - not prospects, and one list per segment.\n[check] copied_attribute (attributes): Overnight coding (Brightfold Hack Prize runs it) fails the only-this-event test - nearby events already run it, however well it is executed.\n[check] checks (measurement): Positioning gates: 8 of 9 (set before publishing, never read off an industry number).\n[info] start_sub (category): No existing frame describes the concept, but a new category's education tax needs multi-edition runway, sponsor relationships and a distinctive brand - start as a subcategory and evolve once traction exists.\n[info] layer_conference (sponsors): The business-oriented layer is a conference decision - a hackathon keeps sponsors to supporting the community."
}
Reply:
{
"task": "charter",
"title": "Riverbend Hack Weekend Charter",
"statement": "For students and first-time builders in Riverbend, Riverbend Hack Weekend is the beginner-first student hackathon that keeps every first-time team from getting stuck alone on day one.",
"contrast": "There are many prize-chasing events. This is not one of them.",
"for_whom": "This charter is for students and first-time builders in Riverbend, with the program built to make everyone aware. It is not for experienced competitors chasing prize money or for a narrow group of specialists seeking advanced-only content.",
"we_claim": "As a community and volunteer-run event, Riverbend Hack Weekend claims credibility from that structure, not from tone, and claims it is not run for individual or corporate profit, with any surplus carried to the next edition or a charity. Its program claims mentor pairs for every first-time team, keeping every first-time team from getting stuck alone on day one.",
"we_do_not_claim": "Riverbend Hack Weekend does not claim vendor neutrality, and it will not rename itself since its scope has not moved past the name it already carries. It does not position itself for everyone, and it does not lead with prize money; the program leads with learning, building, sharing and welcoming first-time builders instead.",
"promise_check": "The promise that every first-time team ships something it can show is delivered this weekend by volunteer mentors from the university club, with no edition left without something behind it.",
"triggers": [
"Misdescription watch re-runs the category step.",
"Alignment rubric re-runs the statement.",
"Level-split signal re-opens the audience-level decision.",
"Neutrality audit re-runs the governance claim."
],
"open": [
"Decide to lead with learning, building, sharing and beginners instead of prize money before publishing this charter."
],
"note": "Settle the prize-money framing before circulating this charter, so every organizer describes Riverbend Hack Weekend the same way."
}
The page's check: kept - nothing to flag
The choices CSV for the first sample
menu,option,status,picked
category,Subcategory of an existing category,default,yes
category,Head-to-head in an existing category,not credible,
category,New category,starved,
category,Positioning for everyone,deleted,
lever,Track-structure declaration,default,yes
lever,Contrast sentence,default,yes
lever,Lineup-as-brand,promoted,yes
lever,Rebrand,deleted,
lever,Naming or attacking a specific rival,deleted,
attribute,Postmortem-only talks,passes,yes
attribute,Curated by a practitioner whose platform reading list is widely followed,passes,yes
attribute,Hiring corner,copied,
Build the input yourself
Load the engine in node (global.window = global; require("./pitchkit.js"); require("./pitchreply.js")), then:
const K = PitchKit, R = PitchReply;
const f = K.form({ name: "Platform Days", kind: "conference", pole: "community", attendee: "platform engineers", level: "strong",
category: "platform engineering conference", modifier: "practitioner-first", archetype: "vendor-day",
alternatives: fs.readFileSync("alternatives.txt", "utf8"), attributes: fs.readFileSync("attributes.txt", "utf8") });
// f.mayClaim, f.mayNot, f.attributes, f.recCat, f.candidates, f.catRungs, f.recLevers, f.renameVerdict, f.statement
// f.checks, f.findings
K.choicesCSV(f) // menu, option, status, picked
const b = K.buildInput(f, "brief"); // or "charter"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "brief");
// R.check(reply, b) // {status: kept or flagged, notes}
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="paste-your-token-here" # from https://event-pitch.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 = "paste-your-token-here" # from https://event-pitch.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"]
// event-pitch.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "paste-your-token-here"; // from https://event-pitch.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 = "paste-your-token-here" // from https://event-pitch.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
}
// EventPitch.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 EventPitch {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "paste-your-token-here"; // from https://event-pitch.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 = "paste-your-token-here" # from https://event-pitch.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 = "paste-your-token-here"; // from https://event-pitch.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 = "paste-your-token-here"; // from https://event-pitch.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":"event-pitch"}' | 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": "event-pitch"})["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: "event-pitch" })).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": "event-pitch"}, 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", "event-pitch"), 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: "event-pitch" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "event-pitch"])["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 = "event-pitch" }))!["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": "brief", "event": "Event: ...; a conference; on the table: positioning a new event ...", "market": "Best-fit attendee: ...", "facts": "Governance: Community/volunteer-run; may claim ..."}
# - 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": "brief", "event": "Event: ...; a conference; on the table: positioning a new event ...", "market": "Best-fit attendee: ...", "facts": "Governance: Community/volunteer-run; may claim ..."}
# - 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: "brief" or "charter", event, market, 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 event-pitch:<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 brief carries summary, governance, alternatives, attributes, segment, candidates, recommendation, deleted, statement, contrast, feasibility, levers, rename, sponsor_layer, triggers, checks and caveats; a charter carries title, statement, contrast, for_whom, we_claim, we_do_not_claim, promise_check, triggers, open and note. Neither contains a digit. The code below prints the headline parts of either (list items are plain strings).
KEY="event-pitch:brief:$(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 '.summary // .format, .note // .recommendation, ((.triggers // .caveats)[] | "\(.trigger // .caveat): \(.text // .text)")' reply.json
jq -r '.statement // .note // empty' reply.json # the statement (both lanes)
import hashlib, time
key = "event-pitch:" + 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("summary"))
print(reply.get("note") or reply.get("recommendation", ""))
for s in reply.get("triggers") or reply.get("caveats") or []:
print(s.get("trigger", s.get("caveat")), "-", s.get("text", s.get("text")))
if reply.get("statement"):
print("statement:", reply["statement"])
import { createHash } from "node:crypto";
const key = `event-pitch:${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.summary);
console.log(reply.note ?? reply.recommendation);
for (const s of reply.triggers || reply.caveats || []) console.log(s.trigger ?? s.caveat, "-", s.text ?? s.text);
if (reply.statement) console.log("statement:", reply.statement);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "event-pitch:" + 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)
items, _ := reply["triggers"].([]any) // triggers and caveats are plain strings
fmt.Println(j["charged_credits"], j["truncated"], reply["summary"])
fmt.Println(reply["note"], reply["recommendation"])
for _, x := range items {
c := x.(map[string]any)
fmt.Println(c["trigger"], "-", c["status"])
}
if fix, ok := reply["statement"].(string); ok && fix != "" {
fmt.Println("statement:", fix)
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "event-pitch:" + 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.get("summary"));
System.out.println(reply.path("note").asText(reply.path("recommendation").asText()));
for (JsonNode s : reply.has("triggers") ? reply.path("triggers") : reply.path("caveats")) System.out.println(s.path("trigger").asText(s.path("caveat").asText()) + " - " + s.path("status").asText(s.path("text").asText()));
if (!reply.path("statement").asText().isEmpty()) System.out.println("statement: " + reply.get("statement").asText());
require "digest"
key = "event-pitch:#{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["summary"]].inspect
puts reply["note"] || reply["recommendation"]
(reply["triggers"] || reply["caveats"] || []).each { |s| puts "#{s["trigger"] || s["caveat"]} - #{s["text"] || s["text"]}" }
puts "statement: #{reply["statement"]}" unless reply["statement"].to_s.empty?
$key = "event-pitch:" . $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["summary"] ?? ""), "\n";
echo $reply["note"] ?? $reply["recommendation"] ?? "", "\n";
foreach ($reply["triggers"] ?? $reply["caveats"] ?? [] as $s) echo $s["trigger"] ?? $s["caveat"], " - ", $s["text"] ?? $s["text"], "\n";
if (!empty($reply["statement"])) echo "statement: ", $reply["statement"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"event-pitch:{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!["summary"]}");
Console.WriteLine($"{reply["note"] ?? reply["recommendation"]}");
foreach (var s in (reply["triggers"] ?? reply["caveats"]) as JsonArray ?? new JsonArray()) Console.WriteLine($"{s!["trigger"] ?? s["caveat"]} - {s["text"] ?? s["text"]}");
if (reply["statement"] is JsonNode fix && fix.GetValue<string>() != "") Console.WriteLine("statement: " + fix);
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: event-pitch:brief:$(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": "brief", "event": "Event: ...; a conference; on the table: positioning a new event ...", "market": "Best-fit attendee: ...", "facts": "Governance: Community/volunteer-run; may claim ..."}
# - 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": "event-pitch:brief:" + 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": `event-pitch:brief:${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", "event-pitch:brief:"+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", "event-pitch:brief:" + 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" => "event-pitch:brief:#{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: event-pitch:brief:" . 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", $"event-pitch:brief:{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);