Run No-Go Dates from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page maps every row to the taxonomy, scores and bands it with the amplifiers, lays out the coverage ladder and places a go/no-go date before every fee step-up - all free, in riskkit.js. The run writes the register or the emergency plan; the page then holds the reply to its own scores (riskreply.js). Not legal or insurance advice.
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":"no-go-dates"}), 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, register, 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 - register (the register for the decision dates) and emergency (the printable plan for the people on site). A missing or unknown task is answered as register. Both lanes send the same four fields.
The input
| Field | Required | What |
|---|---|---|
task | yes | register or emergency. If it is missing or neither, do register and set "task": "register". |
event | yes | the event, its format, size, date and pole, the money committed and absorbable, the amplifiers, insurance today, who decides, and the emergency-plan status and named contacts. |
register | yes | every risk row as the page scored it, and the cancellation-fee schedule with its dates and costs. |
facts | yes | the page's depth, taxonomy coverage, bands, coverage ladder, go/no-go mechanic, decision dates, re-score dates, emergency scenarios, readiness, the signals to record 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
- This is not legal or insurance advice. Never draft clause language, never state what a policy covers in a specific case, never confirm a policy responds to a loss. Contract and clause wording goes to counsel; policy wording, limits, exclusions and whether a loss is covered go to a licensed broker. A carrier, premium or limit is only ever an illustration of a category.
- Name risks from the fifteen-row taxonomy (demand shortfall, sponsor withdrawal, venue loss, marquee speaker loss, weather before and during, communicable disease, organizer financial capability, safety and medical, code-of-conduct or PR, technical failure, registration-platform breach, key-organizer loss, structural defection, organizer discretion). Never delete a row without saying why; rows 8, 14 and 15 are the ones organizers forget.
- Score 1-5 likelihood x 1-5 impact. Impact is measured against non-recoverable committed spend and reputation, because an event's date does not move. Outdoor elements, alcohol, rigging, minors, pyrotechnics, hands-on hardware, overnight duration and any single-source dependency raise impact. Green 1-4: accept and monitor. Yellow 5-9: a named owner and a pre-defined trigger that moves it up a band. Orange 10-15: escalate to the decision holder and write the contingency - if this fires, here is what we do. Red 16-25: immediate escalation, highest review frequency. Likelihood is time-phased: re-score at every decision date.
- Treatment: prevention by default; contingency or impact reduction after a risk fires; transfer (insurance, or a clause that moves the loss) for any risk that would end the entity, not just the edition; documented acceptance fits a green row. Depth: the scored register by default, per-risk contingency entries once any row is orange or red, a full memo only for the risk that ends the entity.
- Coverage: venue-required liability is the default and, for a community event with no committed spend, the ceiling - delete the rest rather than park them. Cancellation cover is promoted as non-recoverable spend grows (about a quarter of the budget, a working default this page sets, not an industry standard); its communicable-disease buy-back is the single highest-leverage decision and is recorded either way. Cyber for self-hosted registration, participant accident for hands-on hardware or multi-day activity, non-appearance only where one named person carries the event, parametric weather for anything outdoors. A parent organization's blanket policy may make rungs redundant.
- Go/no-go: a decision date just before every fee step-up in the contract, never at the event date; thresholds fixed in advance once committed spend exceeds what the team can absorb; a formally polled call (each area owner votes, a single no-go halts) when more than two people must agree or a sponsor or parent holds a veto. Waiting past a step-up has a price in percentage points of the contract.
- The emergency plan is a separate printed document for whoever is standing there: each named scenario written one by one and never ranked (fire with route and assembly point, power failure, medical emergency, theft, any other evacuation and who confirms the building is clear), the contacts with the hours each is on site, the non-emergency police line kept distinct from the emergency number, a printed copy on site, local emergency services told in advance, and for an overnight event one organizer awake on site at all times. Every threshold here is self-set, never an industry benchmark.
House rules
- Use only the input and the rules above. The page's names, scores, bands, statuses, dates and amounts are exact - copy them. Every number in a sentence must appear in the input.
- Label anything that is not one of the rules above, and is not in the input, as your own design.
- Never invent a risk, a person, a phone number, a policy, a premium, a limit or a date; where someone must be named and is not, give a role or say "to be named". Refer to people by name or as they - never infer anyone's gender from a name.
- 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
register
summary- one sentence, at most 35 words: the highest band, the next decision date, and the first thing to settle.disclaimer- one sentence: not legal or insurance advice; clauses to counsel, policies to a broker.depth-pick(list,scored,contingencyormemo, the page's pick),note(one sentence; name the memo risk when the page promotes one).rows- one object per row in the page's order:risk(the row's name exactly as the page lists it, before the first "|" - not its category),score(the page's score as a number, or null when unscored or deleted),band(the page's band, or "deleted"),owner(the page's owner, or "none"),next(one short sentence: for yellow the trigger, for orange or red the contingency, for green monitoring by the owner until the review date, for deleted the reason - the page's words where it has them; a missing trigger or contingency is named as missing).missing- the page's missing taxonomy rows, as short names;[]when none.coverage- one object per rung in the page's order:rung(the page's name),status(the page's status exactly),reason(one short sentence).buyback- one sentence: the buy-back decision as recorded, or the question to put to the broker.calendar- one object per decision date in order:date(the page's decision date),before(short: the fee step it precedes, as the page states it),cost(the page's cost of cancelling after that step, or null).[]when there is no fee schedule.signals- 2 or 3 short strings, the page's signals, each with what it would change next edition (your design).caveats- at most 4 short strings: every[fix]finding first, then the most important[check]findings.[]when there are none of either.
{
"task": "register",
"summary": "one sentence",
"disclaimer": "one sentence",
"depth": { "pick": "scored", "note": "one sentence" },
"rows": [ { "risk": "a risk", "score": 6, "band": "yellow", "owner": "a role", "next": "one sentence" } ],
"missing": [ "Organizer discretion" ],
"coverage": [ { "rung": "Venue-required liability", "status": "existing", "reason": "one sentence" } ],
"buyback": "one sentence",
"calendar": [ { "date": "YYYY-MM-DD", "before": "the 50% step on YYYY-MM-DD", "cost": 12000 } ],
"signals": [ "what to record and what it changes" ],
"caveats": [ "a caveat" ]
}
The page holds it to its own scores: every row in order with its score, band and owner, the missing taxonomy rows, every coverage status, the decision dates and their costs, a disclaimer, and never a statement that a policy covers a loss; no number may appear that the input does not hold.
emergency
title- a short title naming the event.scenarios- one object per scenario, in the page's order:scenario(the page's wording),steps(2 to 4 short imperative steps; anything beyond the rules is your design and is generic, never venue-specific facts you were not given),lead(who acts first: a named contact from the input, or a role).contacts- one object per contact the page lists, plus the non-emergency police line:role,name(from the input, or "to be named"),note(short: when they are on site, or what to fill in). No phone numbers.distribution- one or two sentences: printed, a copy on site, every volunteer has access.advance- one sentence: telling local emergency services about the event in advance.rota- one sentence on the overnight rota when the page names one, otherwise "".note- one sentence, at most 30 words, for the organizers: what to fill in before printing.
{
"task": "emergency",
"title": "Emergency plan - an event",
"scenarios": [ { "scenario": "the page's scenario", "steps": [ "a step" ], "lead": "a name or a role" } ],
"contacts": [ { "role": "venue security", "name": "a name or to be named", "note": "short" } ],
"distribution": "one or two sentences",
"advance": "one sentence",
"rota": "",
"note": "one sentence"
}
The page requires every scenario in its order with steps, the named contacts plus the non-emergency police line, no invented phone number, a printed copy on site, local emergency services told in advance, and the overnight rota when the page names one.
Worked examples - every lane, every sample
These are the page's three free samples (fictional events, venues and people). 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. Every sample has both lanes.
Lakeshore Infra Days (300, deposit paid) - register
Scored register plus per-risk contingency; 9 live rows, 6 taxonomy rows missing; first go/no-go 2026-11-14; 1 of 5 ready.
Input:
{
"task": "register",
"event": "Event: Lakeshore Infra Days; a single-day conference; headcount 300; date 2027-05-20; community-run; an annual event\nMoney: budget $60,000; non-recoverable committed spend $18,000; venue contract value $24,000; what the team could absorb $8,000\nAmplifiers present: alcohol service, a single-source dependency\nInsurance today: liability yes (venue requires it: yes); cancellation no; disease buy-back unknown; parent blanket policy no; in-house lawyer no; self-hosted registration no; marquee speaker no\nDecision: held by the conference chair; people who must agree 2; sponsor or parent veto no\nEmergency plan: a draft; venue security the venue's duty manager; first aid not named; on-duty organizer the operations lead",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nTicket sales below break-even | 1 Demand shortfall | L3 x I4 = 12 orange | owner ticketing lead | prevention | review 2027-02-01 | trigger: sales under 40% of break-even at T-90 | contingency: cut to one track and release the second room\nLead sponsor pulls out | 2 Sponsor withdrawal | L2 x I4->5 = 10 orange | owner sponsorship lead | prevention | review 2027-02-01\nVenue closes or changes terms | 3 Venue loss or forced change | L1 x I5 = 5 yellow | owner logistics lead | transfer | review 2027-02-01\nSpeaker dropouts | 4 Marquee speaker loss | L3 x I2->3 = 9 yellow | owner program lead | contingency | review 2027-04-01 | contingency: two standby talks\nDisease restriction | 7 Communicable disease or public-health restriction | L2 x I5 = 10 orange | owner none | transfer | review none\nHarassment or speaker backlash | 10 Code-of-conduct or PR incident | L2 x I3 = 6 yellow | owner CoC response owner | prevention | review 2027-04-15\nStream or AV fails | 11 Technical or production failure | L3 x I2 = 6 yellow | owner production lead | contingency | review 2027-05-01\nEvening social incident | 9 Safety, security, or medical incident | L2 x I2->3 = 6 yellow | owner operations lead | prevention | review 2027-05-01\nPayment provider not set up | 8 Organizer financial capability | L2 x I3 = 6 yellow | owner treasurer | prevention | review 2026-12-15\nCancellation-fee schedule: 180 days out (2026-11-21): 25% = $6,000; 90 days out (2027-02-19): 50% = $12,000; 30 days out (2027-04-20): 90% = $21,600",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; a per-risk memo for Lead sponsor pulls out; owner and review-date coverage 89%\nTaxonomy: 9 of 15 rows covered; missing 5, 6, 12, 13, 14, 15\nBands: red 0, orange 3, yellow 6, green 0\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - existing (the venue conditions doors opening on it, usually naming the venue as an additional insured); Event cancellation with the communicable-disease buy-back - buy (non-recoverable committed spend is 30% of the budget (the trigger is about a quarter, self-set)); Cyber for the registration platform - delete (registration runs on a platform that holds the data); Participant accident - delete (no hands-on hardware or multi-day activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - delete (nothing outdoors or weather-exposed); disease buy-back unknown\nGo/no-go: A date before every fee step-up; thresholds fixed in advance; decision holder the conference chair\nDecision dates (7 days before each step, self-set): 2026-11-14 - before the 25% step on 2026-11-21 ($6,000 if cancelled after it); 2027-02-12 - before the 50% step on 2027-02-19 ($12,000 if cancelled after it); 2027-04-13 - before the 90% step on 2027-04-20 ($21,600 if cancelled after it)\nRe-score the register at each decision date: 2026-11-14, 2027-02-12, 2027-04-13\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; An intoxicated attendee\nReadiness (1 of 5): Every taxonomy row covered or deleted with a reason MISSING; Every row owned and dated MISSING; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included MISSING; A go/no-go date before every fee step-up done\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 89% (self-set target: every row); Decision-date discipline: each go/no-go held before its step-up (self-set)\nFindings (22):\n[check] taxonomy (register): Taxonomy rows with no register row: 5 Adverse weather, pre-event; 6 Adverse weather, in-progress; 12 Registration-platform breach or data loss; 13 Key-organizer loss; 14 Structural or commercial defection; 15 Organizer discretion. Add each, or delete it with a stated reason. Rows 8, 14 and 15 are the ones organizers reliably forget.\n[check] unowned (register): 1 row lacks an owner or a review date (Disease restriction) - a row with neither is a note, not a managed risk.\n[fix] no_contingency (register): Lead sponsor pulls out is orange (10) with no written contingency - if this fires, here is what we do.\n[info] amplified (register): Lead sponsor pulls out: impact raised from 4 to 5 by a single-source dependency.\n[check] no_trigger (register): Venue closes or changes terms is yellow (5) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Speaker dropouts is yellow (9) with no pre-defined trigger to move it up a band.\n[info] amplified (register): Speaker dropouts: impact raised from 2 to 3 by a single-source dependency.\n[fix] no_contingency (register): Disease restriction is orange (10) with no written contingency - if this fires, here is what we do.\n[check] no_trigger (register): Harassment or speaker backlash is yellow (6) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Stream or AV fails is yellow (6) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Evening social incident is yellow (6) with no pre-defined trigger to move it up a band.\n[info] amplified (register): Evening social incident: impact raised from 2 to 3 by alcohol service.\n[check] no_trigger (register): Payment provider not set up is yellow (6) with no pre-defined trigger to move it up a band.\n[info] memo (register): Promote a per-risk assessment memo for Lead sponsor pulls out - its materialization ends the organizing entity, not just the edition.\n[check] transfer (register): Lead sponsor pulls out could end the entity (impact 5, committed spend above what the team can absorb) - promote transfer: insurance or a contract clause that moves the loss.\n[check] buyback (coverage): Record the communicable-disease buy-back decision either way - insurers excluded that peril market-wide from late January 2020, and it decided every documented COVID-era cancellation. Ask the broker explicitly.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to counsel.\n[info] lead (go/no-go): Each go/no-go date sits 7 days before its fee step-up (self-set) - never at the event date, never at a round interval that lands after a step.\n[info] thresholds (go/no-go): Committed spend ($18,000) exceeds what the team could absorb ($8,000): fix the thresholds for each polled area before the first date arrives.\n[check] contacts (emergency): Name first-aid provider for the emergency plan - with the hours each is reachable on site.\n[check] not_printed (emergency): The emergency plan is a draft - print it: a plan that lives only in a shared drive fails exactly when power, connectivity or phones fail.\n[check] gate (readiness): Register readiness: 1 of 5 - missing: Every taxonomy row covered or deleted with a reason; Every row owned and dated; Every yellow row has a trigger, every orange-or-red row a contingency; A coverage decision recorded against each rung, the buy-back included (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "register",
"summary": "The highest band is orange (3 rows), the next decision date is 2026-11-14 before the 25% cancellation step, and writing the 2 missing contingencies is the first thing to settle.",
"disclaimer": "This is not legal or insurance advice; clause wording goes to counsel and policy wording, limits, exclusions and coverage questions go to a licensed broker.",
"depth": {
"pick": "contingency",
"note": "The register is scored with per-risk contingency entries, and a full memo is promoted for Lead sponsor pulls out because its materialization would end the organizing entity, not just the edition."
},
"rows": [
{
"risk": "Ticket sales below break-even",
"score": 12,
"band": "orange",
"owner": "ticketing lead",
"next": "Cut to one track and release the second room."
},
{
"risk": "Lead sponsor pulls out",
"score": 10,
"band": "orange",
"owner": "sponsorship lead",
"next": "No contingency is written for this risk; it is missing."
},
{
"risk": "Venue closes or changes terms",
"score": 5,
"band": "yellow",
"owner": "logistics lead",
"next": "No trigger is defined for this risk; it is missing."
},
{
"risk": "Speaker dropouts",
"score": 9,
"band": "yellow",
"owner": "program lead",
"next": "No trigger is defined for this risk; it is missing."
},
{
"risk": "Disease restriction",
"score": 10,
"band": "orange",
"owner": "none",
"next": "No contingency is written for this risk; it is missing."
},
{
"risk": "Harassment or speaker backlash",
"score": 6,
"band": "yellow",
"owner": "CoC response owner",
"next": "No trigger is defined for this risk; it is missing."
},
{
"risk": "Stream or AV fails",
"score": 6,
"band": "yellow",
"owner": "production lead",
"next": "No trigger is defined for this risk; it is missing."
},
{
"risk": "Evening social incident",
"score": 6,
"band": "yellow",
"owner": "operations lead",
"next": "No trigger is defined for this risk; it is missing."
},
{
"risk": "Payment provider not set up",
"score": 6,
"band": "yellow",
"owner": "treasurer",
"next": "No trigger is defined for this risk; it is missing."
}
],
"missing": [
"Adverse weather, pre-event",
"Adverse weather, in-progress",
"Registration-platform breach or data loss",
"Key-organizer loss",
"Structural or commercial defection",
"Organizer discretion"
],
"coverage": [
{
"rung": "Venue-required liability",
"status": "existing",
"reason": "The venue conditions doors opening on it, usually naming the venue as an additional insured."
},
{
"rung": "Event cancellation with the communicable-disease buy-back",
"status": "buy",
"reason": "Non-recoverable committed spend is 30% of the budget, above the self-set trigger of about a quarter."
},
{
"rung": "Cyber for the registration platform",
"status": "delete",
"reason": "Registration runs on a platform that holds the data."
},
{
"rung": "Participant accident",
"status": "delete",
"reason": "There is no hands-on hardware or multi-day activity."
},
{
"rung": "Non-appearance (key speaker)",
"status": "delete",
"reason": "No single named person carries the event's value."
},
{
"rung": "Parametric weather",
"status": "delete",
"reason": "Nothing is outdoors or weather-exposed."
}
],
"buyback": "The event-cancellation rung is recorded as buy with the communicable-disease buy-back bundled in, but today's coverage still lists the buy-back as unknown, so put the buy-back question to the broker explicitly.",
"calendar": [
{
"date": "2026-11-14",
"before": "the 25% step on 2026-11-21",
"cost": 6000
},
{
"date": "2027-02-12",
"before": "the 50% step on 2027-02-19",
"cost": 12000
},
{
"date": "2027-04-13",
"before": "the 90% step on 2027-04-20",
"cost": 21600
}
],
"signals": [
"Surprise rate - risks that fired with no register row; any that show up next edition should be added to the taxonomy before scoring starts.",
"Owner and review-date coverage, currently 89%; falling short of every row next edition should trigger assigning an owner and date before the register is circulated.",
"Decision-date discipline - whether each go/no-go was held before its step-up; a miss next edition should move the decision date further ahead of the fee step."
],
"caveats": [
"Lead sponsor pulls out is orange (10) with no contingency written for if it fires.",
"Disease restriction is orange (10) with no contingency written for if it fires.",
"6 taxonomy rows are missing from the register, including 2 of the rows organizers most often forget (structural or commercial defection and organizer discretion).",
"Lead sponsor pulls out could end the organizing entity, since committed spend of $18,000 exceeds the $8,000 the team can absorb, and should be promoted to a transfer treatment."
]
}
The page's check: kept - nothing to flag
Lakeshore Infra Days (300, deposit paid) - emergency
Scored register plus per-risk contingency; 9 live rows, 6 taxonomy rows missing; first go/no-go 2026-11-14; 1 of 5 ready.
Input:
{
"task": "emergency",
"event": "Event: Lakeshore Infra Days; a single-day conference; headcount 300; date 2027-05-20; community-run; an annual event\nMoney: budget $60,000; non-recoverable committed spend $18,000; venue contract value $24,000; what the team could absorb $8,000\nAmplifiers present: alcohol service, a single-source dependency\nInsurance today: liability yes (venue requires it: yes); cancellation no; disease buy-back unknown; parent blanket policy no; in-house lawyer no; self-hosted registration no; marquee speaker no\nDecision: held by the conference chair; people who must agree 2; sponsor or parent veto no\nEmergency plan: a draft; venue security the venue's duty manager; first aid not named; on-duty organizer the operations lead",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nTicket sales below break-even | 1 Demand shortfall | L3 x I4 = 12 orange | owner ticketing lead | prevention | review 2027-02-01 | trigger: sales under 40% of break-even at T-90 | contingency: cut to one track and release the second room\nLead sponsor pulls out | 2 Sponsor withdrawal | L2 x I4->5 = 10 orange | owner sponsorship lead | prevention | review 2027-02-01\nVenue closes or changes terms | 3 Venue loss or forced change | L1 x I5 = 5 yellow | owner logistics lead | transfer | review 2027-02-01\nSpeaker dropouts | 4 Marquee speaker loss | L3 x I2->3 = 9 yellow | owner program lead | contingency | review 2027-04-01 | contingency: two standby talks\nDisease restriction | 7 Communicable disease or public-health restriction | L2 x I5 = 10 orange | owner none | transfer | review none\nHarassment or speaker backlash | 10 Code-of-conduct or PR incident | L2 x I3 = 6 yellow | owner CoC response owner | prevention | review 2027-04-15\nStream or AV fails | 11 Technical or production failure | L3 x I2 = 6 yellow | owner production lead | contingency | review 2027-05-01\nEvening social incident | 9 Safety, security, or medical incident | L2 x I2->3 = 6 yellow | owner operations lead | prevention | review 2027-05-01\nPayment provider not set up | 8 Organizer financial capability | L2 x I3 = 6 yellow | owner treasurer | prevention | review 2026-12-15\nCancellation-fee schedule: 180 days out (2026-11-21): 25% = $6,000; 90 days out (2027-02-19): 50% = $12,000; 30 days out (2027-04-20): 90% = $21,600",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; a per-risk memo for Lead sponsor pulls out; owner and review-date coverage 89%\nTaxonomy: 9 of 15 rows covered; missing 5, 6, 12, 13, 14, 15\nBands: red 0, orange 3, yellow 6, green 0\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - existing (the venue conditions doors opening on it, usually naming the venue as an additional insured); Event cancellation with the communicable-disease buy-back - buy (non-recoverable committed spend is 30% of the budget (the trigger is about a quarter, self-set)); Cyber for the registration platform - delete (registration runs on a platform that holds the data); Participant accident - delete (no hands-on hardware or multi-day activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - delete (nothing outdoors or weather-exposed); disease buy-back unknown\nGo/no-go: A date before every fee step-up; thresholds fixed in advance; decision holder the conference chair\nDecision dates (7 days before each step, self-set): 2026-11-14 - before the 25% step on 2026-11-21 ($6,000 if cancelled after it); 2027-02-12 - before the 50% step on 2027-02-19 ($12,000 if cancelled after it); 2027-04-13 - before the 90% step on 2027-04-20 ($21,600 if cancelled after it)\nRe-score the register at each decision date: 2026-11-14, 2027-02-12, 2027-04-13\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; An intoxicated attendee\nReadiness (1 of 5): Every taxonomy row covered or deleted with a reason MISSING; Every row owned and dated MISSING; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included MISSING; A go/no-go date before every fee step-up done\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 89% (self-set target: every row); Decision-date discipline: each go/no-go held before its step-up (self-set)\nFindings (22):\n[check] taxonomy (register): Taxonomy rows with no register row: 5 Adverse weather, pre-event; 6 Adverse weather, in-progress; 12 Registration-platform breach or data loss; 13 Key-organizer loss; 14 Structural or commercial defection; 15 Organizer discretion. Add each, or delete it with a stated reason. Rows 8, 14 and 15 are the ones organizers reliably forget.\n[check] unowned (register): 1 row lacks an owner or a review date (Disease restriction) - a row with neither is a note, not a managed risk.\n[fix] no_contingency (register): Lead sponsor pulls out is orange (10) with no written contingency - if this fires, here is what we do.\n[info] amplified (register): Lead sponsor pulls out: impact raised from 4 to 5 by a single-source dependency.\n[check] no_trigger (register): Venue closes or changes terms is yellow (5) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Speaker dropouts is yellow (9) with no pre-defined trigger to move it up a band.\n[info] amplified (register): Speaker dropouts: impact raised from 2 to 3 by a single-source dependency.\n[fix] no_contingency (register): Disease restriction is orange (10) with no written contingency - if this fires, here is what we do.\n[check] no_trigger (register): Harassment or speaker backlash is yellow (6) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Stream or AV fails is yellow (6) with no pre-defined trigger to move it up a band.\n[check] no_trigger (register): Evening social incident is yellow (6) with no pre-defined trigger to move it up a band.\n[info] amplified (register): Evening social incident: impact raised from 2 to 3 by alcohol service.\n[check] no_trigger (register): Payment provider not set up is yellow (6) with no pre-defined trigger to move it up a band.\n[info] memo (register): Promote a per-risk assessment memo for Lead sponsor pulls out - its materialization ends the organizing entity, not just the edition.\n[check] transfer (register): Lead sponsor pulls out could end the entity (impact 5, committed spend above what the team can absorb) - promote transfer: insurance or a contract clause that moves the loss.\n[check] buyback (coverage): Record the communicable-disease buy-back decision either way - insurers excluded that peril market-wide from late January 2020, and it decided every documented COVID-era cancellation. Ask the broker explicitly.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to counsel.\n[info] lead (go/no-go): Each go/no-go date sits 7 days before its fee step-up (self-set) - never at the event date, never at a round interval that lands after a step.\n[info] thresholds (go/no-go): Committed spend ($18,000) exceeds what the team could absorb ($8,000): fix the thresholds for each polled area before the first date arrives.\n[check] contacts (emergency): Name first-aid provider for the emergency plan - with the hours each is reachable on site.\n[check] not_printed (emergency): The emergency plan is a draft - print it: a plan that lives only in a shared drive fails exactly when power, connectivity or phones fail.\n[check] gate (readiness): Register readiness: 1 of 5 - missing: Every taxonomy row covered or deleted with a reason; Every row owned and dated; Every yellow row has a trigger, every orange-or-red row a contingency; A coverage decision recorded against each rung, the buy-back included (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "emergency",
"title": "Emergency plan - Lakeshore Infra Days",
"scenarios": [
{
"scenario": "Fire, with the evacuation route and assembly point",
"steps": [
"Pull the nearest fire alarm and call emergency services.",
"Direct attendees to the nearest marked exit along the evacuation route.",
"Lead everyone to the assembly point and take a headcount.",
"Do not re-enter the building until it is confirmed clear."
],
"lead": "the venue's duty manager"
},
{
"scenario": "Electrical or power failure",
"steps": [
"Check whether the outage affects the whole venue or one area.",
"Switch to battery-powered or mobile lighting where available.",
"Notify attendees calmly and pause any affected session.",
"Contact the venue's duty manager for a timeline before resuming."
],
"lead": "the venue's duty manager"
},
{
"scenario": "A medical emergency involving an attendee",
"steps": [
"Call emergency services if the situation looks serious.",
"Send someone to meet responders at the entrance and guide them in.",
"Keep the area clear and keep the attendee comfortable until help arrives.",
"Tell the on-duty organizer once the attendee is in care."
],
"lead": "the first aid provider"
},
{
"scenario": "Theft of equipment",
"steps": [
"Do not confront anyone directly.",
"Note what was taken and when it was last seen.",
"Report it to venue security and the on-duty organizer.",
"Decide together whether to call the non-emergency police line."
],
"lead": "the operations lead"
},
{
"scenario": "Evacuation for any other reason, and who confirms the building is clear",
"steps": [
"Direct attendees to the nearest exit and the assembly point.",
"Account for all attendees and staff at the assembly point.",
"Have the venue's duty manager confirm the building is clear before anyone re-enters."
],
"lead": "the venue's duty manager"
},
{
"scenario": "An intoxicated attendee",
"steps": [
"Move the attendee to a quiet area away from other guests.",
"Assess whether medical attention is needed and call for help if so.",
"Arrange safe transport home rather than letting them drive.",
"Tell the on-duty organizer so the incident is logged."
],
"lead": "the operations lead"
}
],
"contacts": [
{
"role": "Venue security",
"name": "the venue's duty manager",
"note": "On-site hours to be filled in."
},
{
"role": "First aid",
"name": "to be named",
"note": "Provider and on-site hours to be filled in before printing."
},
{
"role": "On-duty organizer",
"name": "the operations lead",
"note": "On-site hours to be filled in."
},
{
"role": "Non-emergency police line",
"name": "to be named",
"note": "Kept distinct from the emergency number; number to be filled in."
}
],
"distribution": "The plan is printed, with a copy kept on site, and every volunteer has access to it.",
"advance": "Tell local emergency services about the event in advance of the date.",
"rota": "",
"note": "The plan is still a draft; name the first-aid provider and their on-site hours, then print and distribute it before the event."
}
The page's check: kept - nothing to flag
Riverside Python Evenings (a free meetup) - register
Scored register plus per-risk contingency; 4 live rows, 10 taxonomy rows missing; first go/no-go no fee schedule; 2 of 5 ready.
Input:
{
"task": "register",
"event": "Event: Riverside Python Evenings; a meetup; headcount 60; date 2027-01-20; community-run; an annual event\nMoney: budget $800; non-recoverable committed spend $0; venue contract value -; what the team could absorb $500\nAmplifiers present: alcohol service, a single-source dependency\nInsurance today: liability no (venue requires it: no); cancellation no; disease buy-back unknown; parent blanket policy no; in-house lawyer no; self-hosted registration no; marquee speaker no\nDecision: held by the organizer on duty; people who must agree 1; sponsor or parent veto no\nEmergency plan: none; venue security the host office's reception; first aid the host office's first-aider; on-duty organizer not named",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nHost office withdraws the room | 3 Venue loss or forced change | L2 x I4->5 = 10 orange | owner organizer | contingency | review 2027-01-06 | trigger: host stops replying a week out | contingency: move to the library's free room\nOnly one organizer knows the setup | 13 Key-organizer loss | L3 x I4->5 = 15 orange | owner organizer | prevention | review 2026-12-15\nLow turnout | 1 Demand shortfall | L3 x I1 = 3 green | owner organizer | acceptance | review 2027-01-13\nSponsor withdrawal | 2 Sponsor withdrawal | DELETED - no sponsor money in this budget - the host gives the room\nOrganizers decide to pause the series | 15 Organizer discretion | L2 x I3 = 6 yellow | owner organizer | prevention | review 2027-01-06\nCancellation-fee schedule: not entered",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; owner and review-date coverage 100%\nTaxonomy: 5 of 15 rows covered; missing 4, 5, 6, 7, 8, 9, 10, 11, 12, 14\nBands: red 0, orange 2, yellow 1, green 1\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - buy (the baseline third-party cover - it covers none of the organizer's own losses); Event cancellation with the communicable-disease buy-back - delete (no non-recoverable committed spend to protect); Cyber for the registration platform - delete (registration runs on a platform that holds the data); Participant accident - delete (no hands-on hardware or multi-day activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - delete (nothing outdoors or weather-exposed); disease buy-back not live\nGo/no-go: No fee schedule yet - no decision dates; decision holder the organizer on duty\nDecision dates (7 days before each step, self-set): none - no fee schedule\nRe-score the register at each decision date: no dates yet\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; An intoxicated attendee\nReadiness (2 of 5): Every taxonomy row covered or deleted with a reason MISSING; Every row owned and dated done; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included done; A go/no-go date before every fee step-up MISSING\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 100% (self-set target: every row); Coverage-decision traceability, the buy-back included (self-set)\nFindings (11):\n[check] taxonomy (register): Taxonomy rows with no register row: 4 Marquee speaker loss; 5 Adverse weather, pre-event; 6 Adverse weather, in-progress; 7 Communicable disease or public-health restriction; 8 Organizer financial capability; 9 Safety, security, or medical incident; 10 Code-of-conduct or PR incident; 11 Technical or production failure; 12 Registration-platform breach or data loss; 14 Structural or commercial defection. Add each, or delete it with a stated reason. Rows 8, 14 and 15 are the ones organizers reliably forget.\n[info] amplified (register): Host office withdraws the room: impact raised from 4 to 5 by a single-source dependency.\n[fix] no_contingency (register): Only one organizer knows the setup is orange (15) with no written contingency - if this fires, here is what we do.\n[info] amplified (register): Only one organizer knows the setup: impact raised from 4 to 5 by a single-source dependency.\n[check] no_trigger (register): Organizers decide to pause the series is yellow (6) with no pre-defined trigger to move it up a band.\n[info] community (coverage): Community pole with no non-recoverable spend: venue-required liability is the ceiling - the other rungs are deleted, not parked. The risk that bites here is organizational: rows 8 and 13.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to counsel.\n[check] no_fees (go/no-go): Enter the venue's cancellation-fee schedule - the days-out step-ups and their percentages, verbatim from the contract. If you do not have them, getting them is the first task.\n[check] contacts (emergency): Name the on-duty organizer for the emergency plan - with the hours each is reachable on site.\n[check] no_plan (emergency): No emergency plan yet - a separate printed document, every named scenario written one by one, a copy on site.\n[check] gate (readiness): Register readiness: 2 of 5 - missing: Every taxonomy row covered or deleted with a reason; Every yellow row has a trigger, every orange-or-red row a contingency; A go/no-go date before every fee step-up (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "register",
"summary": "The highest band is orange, no decision date exists yet because no cancellation-fee schedule has been entered, and entering that schedule is the first thing to settle.",
"disclaimer": "This is not legal or insurance advice; clause wording goes to counsel and policy questions go to a licensed broker.",
"depth": {
"pick": "contingency",
"note": "The register holds scored rows plus per-risk contingency entries, with owner and review-date coverage at 100%."
},
"rows": [
{
"risk": "Host office withdraws the room",
"score": 10,
"band": "orange",
"owner": "organizer",
"next": "If the host stops replying a week out, move to the library's free room."
},
{
"risk": "Only one organizer knows the setup",
"score": 15,
"band": "orange",
"owner": "organizer",
"next": "No contingency has been written for this risk; it is missing."
},
{
"risk": "Low turnout",
"score": 3,
"band": "green",
"owner": "organizer",
"next": "Accepted and monitored, with review on 2027-01-13."
},
{
"risk": "Sponsor withdrawal",
"score": null,
"band": "deleted",
"owner": "none",
"next": "Deleted because there is no sponsor money in this budget and the host gives the room."
},
{
"risk": "Organizers decide to pause the series",
"score": 6,
"band": "yellow",
"owner": "organizer",
"next": "No pre-defined trigger has been set to move this risk up a band; it is missing."
}
],
"missing": [
"Marquee speaker loss",
"Adverse weather, pre-event",
"Adverse weather, in-progress",
"Communicable disease or public-health restriction",
"Organizer financial capability",
"Safety, security, or medical incident",
"Code-of-conduct or PR incident",
"Technical or production failure",
"Registration-platform breach or data loss",
"Structural or commercial defection"
],
"coverage": [
{
"rung": "Venue-required liability",
"status": "buy",
"reason": "It is the baseline third-party cover and covers none of the organizer's own losses."
},
{
"rung": "Event cancellation with the communicable-disease buy-back",
"status": "delete",
"reason": "There is no non-recoverable committed spend to protect."
},
{
"rung": "Cyber for the registration platform",
"status": "delete",
"reason": "Registration runs on a platform that holds the data."
},
{
"rung": "Participant accident",
"status": "delete",
"reason": "There is no hands-on hardware or multi-day activity."
},
{
"rung": "Non-appearance (key speaker)",
"status": "delete",
"reason": "No single named person carries the event's value."
},
{
"rung": "Parametric weather",
"status": "delete",
"reason": "Nothing outdoors or weather-exposed."
}
],
"buyback": "The disease buy-back is not live, in line with the cancellation rung itself being deleted since there is no non-recoverable committed spend to protect.",
"calendar": [],
"signals": [
"Surprise rate - risks that fired with no register row; a rise here next edition would mean widening taxonomy coverage before the event is scheduled.",
"Owner and review-date coverage, now 100% - falling below that next edition would mean assigning owners and dates earlier in planning.",
"Coverage-decision traceability, the buy-back included - a gap here next edition would mean writing down the broker conversation before registration opens."
],
"caveats": [
"No written contingency exists for Only one organizer knows the setup (orange, 15).",
"10 taxonomy rows are not yet covered, including organizer financial capability and structural or commercial defection.",
"The cancellation-fee schedule has not been entered, so no go/no-go dates exist yet.",
"Register readiness is 2 of 5, missing taxonomy coverage, triggers or contingencies, and go/no-go dates."
]
}
The page's check: kept - nothing to flag
Riverside Python Evenings (a free meetup) - emergency
Scored register plus per-risk contingency; 4 live rows, 10 taxonomy rows missing; first go/no-go no fee schedule; 2 of 5 ready.
Input:
{
"task": "emergency",
"event": "Event: Riverside Python Evenings; a meetup; headcount 60; date 2027-01-20; community-run; an annual event\nMoney: budget $800; non-recoverable committed spend $0; venue contract value -; what the team could absorb $500\nAmplifiers present: alcohol service, a single-source dependency\nInsurance today: liability no (venue requires it: no); cancellation no; disease buy-back unknown; parent blanket policy no; in-house lawyer no; self-hosted registration no; marquee speaker no\nDecision: held by the organizer on duty; people who must agree 1; sponsor or parent veto no\nEmergency plan: none; venue security the host office's reception; first aid the host office's first-aider; on-duty organizer not named",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nHost office withdraws the room | 3 Venue loss or forced change | L2 x I4->5 = 10 orange | owner organizer | contingency | review 2027-01-06 | trigger: host stops replying a week out | contingency: move to the library's free room\nOnly one organizer knows the setup | 13 Key-organizer loss | L3 x I4->5 = 15 orange | owner organizer | prevention | review 2026-12-15\nLow turnout | 1 Demand shortfall | L3 x I1 = 3 green | owner organizer | acceptance | review 2027-01-13\nSponsor withdrawal | 2 Sponsor withdrawal | DELETED - no sponsor money in this budget - the host gives the room\nOrganizers decide to pause the series | 15 Organizer discretion | L2 x I3 = 6 yellow | owner organizer | prevention | review 2027-01-06\nCancellation-fee schedule: not entered",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; owner and review-date coverage 100%\nTaxonomy: 5 of 15 rows covered; missing 4, 5, 6, 7, 8, 9, 10, 11, 12, 14\nBands: red 0, orange 2, yellow 1, green 1\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - buy (the baseline third-party cover - it covers none of the organizer's own losses); Event cancellation with the communicable-disease buy-back - delete (no non-recoverable committed spend to protect); Cyber for the registration platform - delete (registration runs on a platform that holds the data); Participant accident - delete (no hands-on hardware or multi-day activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - delete (nothing outdoors or weather-exposed); disease buy-back not live\nGo/no-go: No fee schedule yet - no decision dates; decision holder the organizer on duty\nDecision dates (7 days before each step, self-set): none - no fee schedule\nRe-score the register at each decision date: no dates yet\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; An intoxicated attendee\nReadiness (2 of 5): Every taxonomy row covered or deleted with a reason MISSING; Every row owned and dated done; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included done; A go/no-go date before every fee step-up MISSING\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 100% (self-set target: every row); Coverage-decision traceability, the buy-back included (self-set)\nFindings (11):\n[check] taxonomy (register): Taxonomy rows with no register row: 4 Marquee speaker loss; 5 Adverse weather, pre-event; 6 Adverse weather, in-progress; 7 Communicable disease or public-health restriction; 8 Organizer financial capability; 9 Safety, security, or medical incident; 10 Code-of-conduct or PR incident; 11 Technical or production failure; 12 Registration-platform breach or data loss; 14 Structural or commercial defection. Add each, or delete it with a stated reason. Rows 8, 14 and 15 are the ones organizers reliably forget.\n[info] amplified (register): Host office withdraws the room: impact raised from 4 to 5 by a single-source dependency.\n[fix] no_contingency (register): Only one organizer knows the setup is orange (15) with no written contingency - if this fires, here is what we do.\n[info] amplified (register): Only one organizer knows the setup: impact raised from 4 to 5 by a single-source dependency.\n[check] no_trigger (register): Organizers decide to pause the series is yellow (6) with no pre-defined trigger to move it up a band.\n[info] community (coverage): Community pole with no non-recoverable spend: venue-required liability is the ceiling - the other rungs are deleted, not parked. The risk that bites here is organizational: rows 8 and 13.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to counsel.\n[check] no_fees (go/no-go): Enter the venue's cancellation-fee schedule - the days-out step-ups and their percentages, verbatim from the contract. If you do not have them, getting them is the first task.\n[check] contacts (emergency): Name the on-duty organizer for the emergency plan - with the hours each is reachable on site.\n[check] no_plan (emergency): No emergency plan yet - a separate printed document, every named scenario written one by one, a copy on site.\n[check] gate (readiness): Register readiness: 2 of 5 - missing: Every taxonomy row covered or deleted with a reason; Every yellow row has a trigger, every orange-or-red row a contingency; A go/no-go date before every fee step-up (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "emergency",
"title": "Emergency plan - Riverside Python Evenings",
"scenarios": [
{
"scenario": "Fire, with the evacuation route and assembly point",
"steps": [
"Call out that there is a fire and begin evacuating the room.",
"Use the nearest marked exit to reach the assembly point.",
"Call emergency services once everyone is outside.",
"Confirm with the on-duty organizer that the building is clear."
],
"lead": "the on-duty organizer"
},
{
"scenario": "Electrical or power failure",
"steps": [
"Stay in place if it is safe to do so.",
"Check for emergency lighting and guide attendees toward exits if needed.",
"Report the failure to venue security."
],
"lead": "the host office's reception"
},
{
"scenario": "A medical emergency involving an attendee",
"steps": [
"Stay with the attendee and keep others back.",
"Call the on-site first aider.",
"Call emergency services if the first aider advises it."
],
"lead": "the host office's first-aider"
},
{
"scenario": "Theft of equipment",
"steps": [
"Do not confront anyone directly.",
"Note what is missing and when it was last seen.",
"Report it to venue security.",
"Call the non-emergency police line to file a report."
],
"lead": "the host office's reception"
},
{
"scenario": "Evacuation for any other reason, and who confirms the building is clear",
"steps": [
"Direct attendees to the nearest exit and the assembly point.",
"Sweep the room for anyone remaining.",
"Confirm with the on-duty organizer that the building is clear."
],
"lead": "the on-duty organizer"
},
{
"scenario": "An intoxicated attendee",
"steps": [
"Move the attendee to a quiet area away from alcohol service.",
"Stay with them and monitor their condition.",
"Call the first aider if their condition worsens.",
"Arrange safe transport home rather than letting them drive."
],
"lead": "the on-duty organizer"
}
],
"contacts": [
{
"role": "Venue security",
"name": "the host office's reception",
"note": "Hours on site to be filled in."
},
{
"role": "First aid",
"name": "the host office's first-aider",
"note": "Hours on site to be filled in."
},
{
"role": "On-duty organizer",
"name": "to be named",
"note": "Name and hours on site to be filled in."
},
{
"role": "Non-emergency police line",
"name": "to be named",
"note": "To be filled in before printing, kept distinct from the emergency number."
}
],
"distribution": "This plan must be printed, with a copy kept on site, and every volunteer given access to it.",
"advance": "Local emergency services have not yet been told about this event and should be notified in advance of 2027-01-20.",
"rota": "",
"note": "Before printing, name the on-duty organizer, add on-site hours for each contact, and fill in the non-emergency police line and the evacuation route and assembly point."
}
The page's check: kept - nothing to flag
Northgate Hardware Hack (company-run, overnight, minors) - register
Scored register plus per-risk contingency; 14 live rows, 0 taxonomy rows missing; first go/no-go 2026-10-30; 3 of 5 ready.
Input:
{
"task": "register",
"event": "Event: Northgate Hardware Hack; a hackathon; headcount 250; date 2027-03-06; company-run; an annual event\nMoney: budget $120,000; non-recoverable committed spend $70,000; venue contract value $50,000; what the team could absorb $20,000\nAmplifiers present: outdoor elements, minors present, hands-on hardware, overnight or multi-day duration\nInsurance today: liability yes (venue requires it: yes); cancellation considering; disease buy-back unknown; parent blanket policy no; in-house lawyer yes; self-hosted registration yes; marquee speaker no\nDecision: held by the head of developer relations; people who must agree 4; sponsor or parent veto yes\nEmergency plan: printed; venue security campus security; first aid the contracted first-aid team; on-duty organizer the overnight lead (rota)",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nRegistrations below plan | 1 Demand shortfall | L2 x I3 = 6 yellow | owner events manager | prevention | review 2026-12-01 | trigger: registrations under 60% of plan at T-60\nTitle sponsor withdraws | 2 Sponsor withdrawal | L2 x I4 = 8 yellow | owner partnerships lead | transfer | review 2026-12-01 | trigger: invoice unpaid 30 days after due\nCampus hall unavailable | 3 Venue loss or forced change | L1 x I5 = 5 yellow | owner events manager | transfer | review 2026-11-15 | trigger: campus facilities notice of works | contingency: move to the engineering atrium\nKeynote loss | 4 Marquee speaker loss | DELETED - no keynote - the program is a balanced set of workshops\nStorm before the event | 5 Adverse weather, pre-event | L2 x I3->4 = 8 yellow | owner events manager | contingency | review 2027-02-20 | trigger: severe-weather warning 72h out | contingency: shift the outdoor demo inside\nStorm during the outdoor demo | 6 Adverse weather, in-progress | L2 x I3->4 = 8 yellow | owner day lead | contingency | review 2027-03-06 | trigger: lightning within 10 km | contingency: stop the demo and move indoors\nDisease restriction | 7 Communicable disease or public-health restriction | L1 x I5 = 5 yellow | owner head of developer relations | transfer | review 2026-12-01 | trigger: a public-health order for the region | contingency: go virtual on the same dates\nPayment and refunds | 8 Organizer financial capability | L1 x I2 = 2 green | owner finance partner | prevention | review 2026-11-15\nSoldering-station injury | 9 Safety, security, or medical incident | L3 x I4->5 = 15 orange | owner safety lead | prevention | review 2027-02-20 | contingency: first-aid team on the floor; station closed\nConduct incident with minors present | 10 Code-of-conduct or PR incident | L2 x I4 = 8 yellow | owner CoC response owner | prevention | review 2027-02-20 | trigger: any report involving a minor\nVenue network blocks a third-party API | 11 Technical or production failure | L3 x I3 = 9 yellow | owner network lead | contingency | review 2027-02-27 | trigger: two teams report rate limits | contingency: backup uplink and per-team keys\nRegistration database breach | 12 Registration-platform breach or data loss | L2 x I4 = 8 yellow | owner platform owner | transfer | review 2027-01-15\nOne person holds the vendor accounts | 13 Key-organizer loss | L3 x I3 = 9 yellow | owner events manager | prevention | review 2026-12-15 | trigger: accounts not shared by T-30 | contingency: shared vault before T-30\nExhibitors move to their own events | 14 Structural or commercial defection | L1 x I2 = 2 green | owner head of developer relations | acceptance | review 2027-01-15\nTeam decides not to run | 15 Organizer discretion | L1 x I4 = 4 green | owner head of developer relations | prevention | review 2026-12-01\nCancellation-fee schedule: 120 days out (2026-11-06): 30% = $15,000; 60 days out (2027-01-05): 60% = $30,000; 14 days out (2027-02-20): 100% = $50,000",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; a per-risk memo for Campus hall unavailable; owner and review-date coverage 100%\nTaxonomy: 15 of 15 rows covered\nBands: red 0, orange 1, yellow 10, green 3\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - existing (the venue conditions doors opening on it, usually naming the venue as an additional insured); Event cancellation with the communicable-disease buy-back - buy (non-recoverable committed spend is 58% of the budget (the trigger is about a quarter, self-set)); Cyber for the registration platform - buy (self-hosted registration holds attendee data); Participant accident - buy (hands-on hardware or multi-day physical activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - buy (outdoor or weather-exposed elements - promoted); disease buy-back unknown\nGo/no-go: A date before every fee step-up; thresholds fixed in advance; a formally polled call; decision holder the head of developer relations\nDecision dates (7 days before each step, self-set): 2026-10-30 - before the 30% step on 2026-11-06 ($15,000 if cancelled after it); 2026-12-29 - before the 60% step on 2027-01-05 ($30,000 if cancelled after it); 2027-02-13 - before the 100% step on 2027-02-20 ($50,000 if cancelled after it)\nRe-score the register at each decision date: 2026-10-30, 2026-12-29, 2027-02-13\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; Severe weather during the event - shelter or stop; A lost or unaccompanied minor; An injury at a hands-on hardware station; overnight rota: one organizer awake on site at all times\nReadiness (3 of 5): Every taxonomy row covered or deleted with a reason done; Every row owned and dated done; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included MISSING; A go/no-go date before every fee step-up done\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 100% (self-set target: every row); Decision-date discipline: each go/no-go held before its step-up (self-set)\nFindings (13):\n[info] amplified (register): Storm before the event: impact raised from 3 to 4 by outdoor elements.\n[info] amplified (register): Storm during the outdoor demo: impact raised from 3 to 4 by outdoor elements.\n[info] amplified (register): Soldering-station injury: impact raised from 4 to 5 by outdoor elements, minors present, hands-on hardware, overnight or multi-day duration.\n[check] no_trigger (register): Registration database breach is yellow (8) with no pre-defined trigger to move it up a band.\n[info] memo (register): Promote a per-risk assessment memo for Campus hall unavailable - its materialization ends the organizing entity, not just the edition.\n[check] transfer (register): Soldering-station injury could end the entity (impact 5, committed spend above what the team can absorb) - promote transfer: insurance or a contract clause that moves the loss.\n[check] buyback (coverage): Record the communicable-disease buy-back decision either way - insurers excluded that peril market-wide from late January 2020, and it decided every documented COVID-era cancellation. Ask the broker explicitly.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to the in-house lawyer.\n[info] lead (go/no-go): Each go/no-go date sits 7 days before its fee step-up (self-set) - never at the event date, never at a round interval that lands after a step.\n[info] thresholds (go/no-go): Committed spend ($70,000) exceeds what the team could absorb ($20,000): fix the thresholds for each polled area before the first date arrives.\n[info] polled (go/no-go): More than two people must agree, or a sponsor or parent holds a veto: run a formally polled call - each area owner votes, a single no-go halts.\n[info] rota (emergency): Overnight: at least one organizer awake and alert on site at all times - write the rota before the event.\n[check] gate (readiness): Register readiness: 3 of 5 - missing: Every yellow row has a trigger, every orange-or-red row a contingency; A coverage decision recorded against each rung, the buy-back included (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "register",
"summary": "Highest band is orange (Soldering-station injury, score 15); next decision date is 2026-10-30, before the 30% cancellation-fee step; settle the communicable-disease buy-back first, since it is still unknown.",
"disclaimer": "This is not legal or insurance advice; clause wording goes to counsel, and policy wording, coverage and limits go to a licensed broker.",
"depth": {
"pick": "contingency",
"note": "The register also carries a dedicated risk-assessment memo for Campus hall unavailable, since its materialization would end the organizing entity rather than just the edition."
},
"rows": [
{
"risk": "Registrations below plan",
"score": 6,
"band": "yellow",
"owner": "events manager",
"next": "Trigger: registrations fall under 60% of plan at T-60."
},
{
"risk": "Title sponsor withdraws",
"score": 8,
"band": "yellow",
"owner": "partnerships lead",
"next": "Trigger: the sponsor invoice remains unpaid 30 days after due."
},
{
"risk": "Campus hall unavailable",
"score": 5,
"band": "yellow",
"owner": "events manager",
"next": "Trigger: a campus facilities notice of works."
},
{
"risk": "Keynote loss",
"score": null,
"band": "deleted",
"owner": "none",
"next": "Deleted: there is no keynote - the program is a balanced set of workshops."
},
{
"risk": "Storm before the event",
"score": 8,
"band": "yellow",
"owner": "events manager",
"next": "Trigger: a severe-weather warning 72 hours out."
},
{
"risk": "Storm during the outdoor demo",
"score": 8,
"band": "yellow",
"owner": "day lead",
"next": "Trigger: lightning within 10 km."
},
{
"risk": "Disease restriction",
"score": 5,
"band": "yellow",
"owner": "head of developer relations",
"next": "Trigger: a public-health order for the region."
},
{
"risk": "Payment and refunds",
"score": 2,
"band": "green",
"owner": "finance partner",
"next": "Green: the finance partner monitors until the 2026-11-15 review date."
},
{
"risk": "Soldering-station injury",
"score": 15,
"band": "orange",
"owner": "safety lead",
"next": "Contingency: the first-aid team takes the floor and the station is closed."
},
{
"risk": "Conduct incident with minors present",
"score": 8,
"band": "yellow",
"owner": "CoC response owner",
"next": "Trigger: any report involving a minor."
},
{
"risk": "Venue network blocks a third-party API",
"score": 9,
"band": "yellow",
"owner": "network lead",
"next": "Trigger: two teams report rate limits."
},
{
"risk": "Registration database breach",
"score": 8,
"band": "yellow",
"owner": "platform owner",
"next": "No trigger is recorded for this row; one is missing."
},
{
"risk": "One person holds the vendor accounts",
"score": 9,
"band": "yellow",
"owner": "events manager",
"next": "Trigger: the vendor accounts are not shared by T-30."
},
{
"risk": "Exhibitors move to their own events",
"score": 2,
"band": "green",
"owner": "head of developer relations",
"next": "Green: the head of developer relations monitors until the 2027-01-15 review date."
},
{
"risk": "Team decides not to run",
"score": 4,
"band": "green",
"owner": "head of developer relations",
"next": "Green: the head of developer relations monitors until the 2026-12-01 review date."
}
],
"missing": [],
"coverage": [
{
"rung": "Venue-required liability",
"status": "existing",
"reason": "The venue conditions doors opening on it, usually naming the venue as an additional insured."
},
{
"rung": "Event cancellation with the communicable-disease buy-back",
"status": "buy",
"reason": "Non-recoverable committed spend is 58% of the budget, above the self-set quarter trigger for promoting cancellation cover."
},
{
"rung": "Cyber for the registration platform",
"status": "buy",
"reason": "Self-hosted registration holds attendee data."
},
{
"rung": "Participant accident",
"status": "buy",
"reason": "Hands-on hardware and multi-day physical activity are both present."
},
{
"rung": "Non-appearance (key speaker)",
"status": "delete",
"reason": "No single named person carries the event's value."
},
{
"rung": "Parametric weather",
"status": "buy",
"reason": "Outdoor or weather-exposed elements promote this rung."
}
],
"buyback": "The communicable-disease buy-back is still unrecorded; ask the broker directly whether the cancellation cover includes or excludes it, since insurers excluded that peril market-wide from late January 2020 and it decided every documented COVID-era cancellation.",
"calendar": [
{
"date": "2026-10-30",
"before": "the 30% step on 2026-11-06",
"cost": 15000
},
{
"date": "2026-12-29",
"before": "the 60% step on 2027-01-05",
"cost": 30000
},
{
"date": "2027-02-13",
"before": "the 100% step on 2027-02-20",
"cost": 50000
}
],
"signals": [
"Surprise rate - any risk that fires with no matching register row; a nonzero rate next edition would add a new taxonomy entry before the kickoff review.",
"Owner and review-date coverage, currently 100% of rows; a drop next edition would pause planning until every row has both back.",
"Decision-date discipline - whether each go/no-go was actually held before its step-up; a miss would move next edition's dates further ahead of each fee step."
],
"caveats": [
"Registration database breach is yellow (score 8) with no pre-defined trigger to move it up a band.",
"Soldering-station injury (score 15, orange) could end the entity, since committed spend exceeds what the team can absorb; promote transfer by insurance or a contract clause.",
"The communicable-disease buy-back decision is still unrecorded; ask the broker explicitly, since insurers excluded that peril market-wide from late January 2020.",
"Register readiness is 3 of 5: missing a trigger or contingency on every yellow or orange-or-red row, and a coverage decision recorded against each rung including the buy-back."
]
}
The page's check: kept - nothing to flag
Northgate Hardware Hack (company-run, overnight, minors) - emergency
Scored register plus per-risk contingency; 14 live rows, 0 taxonomy rows missing; first go/no-go 2026-10-30; 3 of 5 ready.
Input:
{
"task": "emergency",
"event": "Event: Northgate Hardware Hack; a hackathon; headcount 250; date 2027-03-06; company-run; an annual event\nMoney: budget $120,000; non-recoverable committed spend $70,000; venue contract value $50,000; what the team could absorb $20,000\nAmplifiers present: outdoor elements, minors present, hands-on hardware, overnight or multi-day duration\nInsurance today: liability yes (venue requires it: yes); cancellation considering; disease buy-back unknown; parent blanket policy no; in-house lawyer yes; self-hosted registration yes; marquee speaker no\nDecision: held by the head of developer relations; people who must agree 4; sponsor or parent veto yes\nEmergency plan: printed; venue security campus security; first aid the contracted first-aid team; on-duty organizer the overnight lead (rota)",
"register": "Risk rows (impact shown as entered -> after amplifiers):\nRegistrations below plan | 1 Demand shortfall | L2 x I3 = 6 yellow | owner events manager | prevention | review 2026-12-01 | trigger: registrations under 60% of plan at T-60\nTitle sponsor withdraws | 2 Sponsor withdrawal | L2 x I4 = 8 yellow | owner partnerships lead | transfer | review 2026-12-01 | trigger: invoice unpaid 30 days after due\nCampus hall unavailable | 3 Venue loss or forced change | L1 x I5 = 5 yellow | owner events manager | transfer | review 2026-11-15 | trigger: campus facilities notice of works | contingency: move to the engineering atrium\nKeynote loss | 4 Marquee speaker loss | DELETED - no keynote - the program is a balanced set of workshops\nStorm before the event | 5 Adverse weather, pre-event | L2 x I3->4 = 8 yellow | owner events manager | contingency | review 2027-02-20 | trigger: severe-weather warning 72h out | contingency: shift the outdoor demo inside\nStorm during the outdoor demo | 6 Adverse weather, in-progress | L2 x I3->4 = 8 yellow | owner day lead | contingency | review 2027-03-06 | trigger: lightning within 10 km | contingency: stop the demo and move indoors\nDisease restriction | 7 Communicable disease or public-health restriction | L1 x I5 = 5 yellow | owner head of developer relations | transfer | review 2026-12-01 | trigger: a public-health order for the region | contingency: go virtual on the same dates\nPayment and refunds | 8 Organizer financial capability | L1 x I2 = 2 green | owner finance partner | prevention | review 2026-11-15\nSoldering-station injury | 9 Safety, security, or medical incident | L3 x I4->5 = 15 orange | owner safety lead | prevention | review 2027-02-20 | contingency: first-aid team on the floor; station closed\nConduct incident with minors present | 10 Code-of-conduct or PR incident | L2 x I4 = 8 yellow | owner CoC response owner | prevention | review 2027-02-20 | trigger: any report involving a minor\nVenue network blocks a third-party API | 11 Technical or production failure | L3 x I3 = 9 yellow | owner network lead | contingency | review 2027-02-27 | trigger: two teams report rate limits | contingency: backup uplink and per-team keys\nRegistration database breach | 12 Registration-platform breach or data loss | L2 x I4 = 8 yellow | owner platform owner | transfer | review 2027-01-15\nOne person holds the vendor accounts | 13 Key-organizer loss | L3 x I3 = 9 yellow | owner events manager | prevention | review 2026-12-15 | trigger: accounts not shared by T-30 | contingency: shared vault before T-30\nExhibitors move to their own events | 14 Structural or commercial defection | L1 x I2 = 2 green | owner head of developer relations | acceptance | review 2027-01-15\nTeam decides not to run | 15 Organizer discretion | L1 x I4 = 4 green | owner head of developer relations | prevention | review 2026-12-01\nCancellation-fee schedule: 120 days out (2026-11-06): 30% = $15,000; 60 days out (2027-01-05): 60% = $30,000; 14 days out (2027-02-20): 100% = $50,000",
"facts": "Register depth: contingency - Scored register plus per-risk contingency; a per-risk memo for Campus hall unavailable; owner and review-date coverage 100%\nTaxonomy: 15 of 15 rows covered\nBands: red 0, orange 1, yellow 10, green 3\nCoverage ladder (categories to ask a broker about; never a policy or a quote): Venue-required liability - existing (the venue conditions doors opening on it, usually naming the venue as an additional insured); Event cancellation with the communicable-disease buy-back - buy (non-recoverable committed spend is 58% of the budget (the trigger is about a quarter, self-set)); Cyber for the registration platform - buy (self-hosted registration holds attendee data); Participant accident - buy (hands-on hardware or multi-day physical activity); Non-appearance (key speaker) - delete (no single named person carries the event's value); Parametric weather - buy (outdoor or weather-exposed elements - promoted); disease buy-back unknown\nGo/no-go: A date before every fee step-up; thresholds fixed in advance; a formally polled call; decision holder the head of developer relations\nDecision dates (7 days before each step, self-set): 2026-10-30 - before the 30% step on 2026-11-06 ($15,000 if cancelled after it); 2026-12-29 - before the 60% step on 2027-01-05 ($30,000 if cancelled after it); 2027-02-13 - before the 100% step on 2027-02-20 ($50,000 if cancelled after it)\nRe-score the register at each decision date: 2026-10-30, 2026-12-29, 2027-02-13\nEmergency scenarios (unranked - the venue, the format and local protocol set their order): Fire, with the evacuation route and assembly point; Electrical or power failure; A medical emergency involving an attendee; Theft of equipment; Evacuation for any other reason, and who confirms the building is clear; Severe weather during the event - shelter or stop; A lost or unaccompanied minor; An injury at a hands-on hardware station; overnight rota: one organizer awake on site at all times\nReadiness (3 of 5): Every taxonomy row covered or deleted with a reason done; Every row owned and dated done; Every yellow row has a trigger, every orange-or-red row a contingency MISSING; A coverage decision recorded against each rung, the buy-back included MISSING; A go/no-go date before every fee step-up done\nSignals to record: Surprise rate: risks that fired with no register row (self-set); Owner and review-date coverage, now 100% (self-set target: every row); Decision-date discipline: each go/no-go held before its step-up (self-set)\nFindings (13):\n[info] amplified (register): Storm before the event: impact raised from 3 to 4 by outdoor elements.\n[info] amplified (register): Storm during the outdoor demo: impact raised from 3 to 4 by outdoor elements.\n[info] amplified (register): Soldering-station injury: impact raised from 4 to 5 by outdoor elements, minors present, hands-on hardware, overnight or multi-day duration.\n[check] no_trigger (register): Registration database breach is yellow (8) with no pre-defined trigger to move it up a band.\n[info] memo (register): Promote a per-risk assessment memo for Campus hall unavailable - its materialization ends the organizing entity, not just the edition.\n[check] transfer (register): Soldering-station injury could end the entity (impact 5, committed spend above what the team can absorb) - promote transfer: insurance or a contract clause that moves the loss.\n[check] buyback (coverage): Record the communicable-disease buy-back decision either way - insurers excluded that peril market-wide from late January 2020, and it decided every documented COVID-era cancellation. Ask the broker explicitly.\n[info] broker (coverage): Every rung here is a category to ask a licensed broker about - not a policy, a limit or a quote. Clause wording goes to the in-house lawyer.\n[info] lead (go/no-go): Each go/no-go date sits 7 days before its fee step-up (self-set) - never at the event date, never at a round interval that lands after a step.\n[info] thresholds (go/no-go): Committed spend ($70,000) exceeds what the team could absorb ($20,000): fix the thresholds for each polled area before the first date arrives.\n[info] polled (go/no-go): More than two people must agree, or a sponsor or parent holds a veto: run a formally polled call - each area owner votes, a single no-go halts.\n[info] rota (emergency): Overnight: at least one organizer awake and alert on site at all times - write the rota before the event.\n[check] gate (readiness): Register readiness: 3 of 5 - missing: Every yellow row has a trigger, every orange-or-red row a contingency; A coverage decision recorded against each rung, the buy-back included (thresholds self-set, not an industry benchmark)."
}
Reply:
{
"task": "emergency",
"title": "Emergency plan - Northgate Hardware Hack",
"scenarios": [
{
"scenario": "Fire, with the evacuation route and assembly point",
"steps": [
"Trigger the nearest fire alarm if it has not already sounded.",
"Evacuate using the posted route to the assembly point.",
"Keep fire lanes clear and do not use elevators.",
"Wait for campus security to confirm the building is clear before re-entry."
],
"lead": "campus security"
},
{
"scenario": "Electrical or power failure",
"steps": [
"Stop any hands-on hardware or soldering work immediately.",
"Switch off affected equipment at the source where it is safe to do so.",
"Keep attendees clear of exposed wiring or affected areas.",
"Call campus security to assess and restore power."
],
"lead": "campus security"
},
{
"scenario": "A medical emergency involving an attendee",
"steps": [
"Call the contracted first-aid team to the scene.",
"Keep the area clear and do not move the attendee unless there is further danger.",
"Send someone to guide the first-aid team to the location.",
"Escalate to emergency services if the first-aid team advises it."
],
"lead": "the contracted first-aid team"
},
{
"scenario": "Theft of equipment",
"steps": [
"Do not confront anyone suspected of the theft.",
"Report the theft to campus security immediately.",
"Note what was taken and when it was last seen.",
"Preserve the area until security has assessed it."
],
"lead": "campus security"
},
{
"scenario": "Evacuation for any other reason, and who confirms the building is clear",
"steps": [
"Direct attendees to the nearest exit and the assembly point.",
"Assist anyone who needs help evacuating.",
"Account for attendees at the assembly point.",
"Wait for campus security to confirm the building is clear."
],
"lead": "campus security"
},
{
"scenario": "Severe weather during the event - shelter or stop",
"steps": [
"Stop any outdoor activity immediately.",
"Move attendees to the designated indoor shelter area.",
"Monitor the weather situation before resuming.",
"Wait for the day lead to confirm it is safe to resume or end the activity."
],
"lead": "the day lead"
},
{
"scenario": "A lost or unaccompanied minor",
"steps": [
"Alert campus security immediately with a description of the minor.",
"Secure the exits where possible without blocking emergency routes.",
"Search the immediate area in pairs, never alone.",
"Notify the family or guardian once the minor is found."
],
"lead": "campus security"
},
{
"scenario": "An injury at a hands-on hardware station",
"steps": [
"Stop work at the station immediately.",
"Call the contracted first-aid team to treat the injury.",
"Have the safety lead close the station until it is reviewed.",
"Do not resume use of the station until it is cleared."
],
"lead": "the contracted first-aid team"
}
],
"contacts": [
{
"role": "venue security",
"name": "campus security",
"note": "On-site hours are not given; fill in before printing."
},
{
"role": "first aid",
"name": "the contracted first-aid team",
"note": "On-site hours are not given; fill in before printing."
},
{
"role": "on-duty organizer",
"name": "the overnight lead",
"note": "On site overnight, per the rota."
},
{
"role": "non-emergency police line",
"name": "to be named",
"note": "Kept distinct from the emergency number; fill in before printing."
}
],
"distribution": "This plan is printed, with a copy kept on site, and every volunteer has access to it.",
"advance": "Local emergency services should be told about the event in advance, including its date and location.",
"rota": "One organizer, the overnight lead, must be awake and alert on site at all times overnight, with the full rota written before the event.",
"note": "Before printing, add phone numbers, on-site hours for venue security and first aid, and a name for the non-emergency police line."
}
The page's check: kept - nothing to flag
The register CSV for the first sample
risk,category,likelihood,impact,impact_after_amplifiers,score,band,owner,treatment,review,trigger,contingency,status
Ticket sales below break-even,Demand shortfall,3,4,4,12,orange,ticketing lead,prevention,2027-02-01,sales under 40% of break-even at T-90,cut to one track and release the second room,open
Lead sponsor pulls out,Sponsor withdrawal,2,4,5,10,orange,sponsorship lead,prevention,2027-02-01,,,open
Venue closes or changes terms,Venue loss or forced change,1,5,5,5,yellow,logistics lead,transfer,2027-02-01,,,open
Speaker dropouts,Marquee speaker loss,3,2,3,9,yellow,program lead,contingency,2027-04-01,,two standby talks,open
Disease restriction,Communicable disease or public-health restriction,2,5,5,10,orange,,transfer,,,,open
Harassment or speaker backlash,Code-of-conduct or PR incident,2,3,3,6,yellow,CoC response owner,prevention,2027-04-15,,,open
Stream or AV fails,Technical or production failure,3,2,2,6,yellow,production lead,contingency,2027-05-01,,,open
Evening social incident,"Safety, security, or medical incident",2,2,3,6,yellow,operations lead,prevention,2027-05-01,,,open
Payment provider not set up,Organizer financial capability,2,3,3,6,yellow,treasurer,prevention,2026-12-15,,,open
Build the input yourself
Load the engine in node (global.window = global; require("./riskkit.js"); require("./riskreply.js")), then:
const K = RiskKit, R = RiskReply;
const f = K.form({ name: "My Conf", eventDate: "2027-05-20", budget: "60000", committed: "18000", contract: "24000", absorbable: "8000",
fees: "days,fee\n180,25\n90,50\n30,90", risks: fs.readFileSync("risks.csv", "utf8") });
// f.rows (cat, L, I, adjI, score, band, owner, trigger, contingency), f.missingCats, f.depth, f.cover (key, status, why)
// f.steps (days, fee, date, decide, cost), f.goMech, f.scenarios, f.gate, f.findings
K.registerCSV(f) // risk, category, likelihood, impact, ..., status
const b = K.buildInput(f, "register"); // or "emergency"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "register");
// 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://no-go-dates.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://no-go-dates.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"]
// no-go-dates.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "paste-your-token-here"; // from https://no-go-dates.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://no-go-dates.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
}
// NoGoDates.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 NoGoDates {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "paste-your-token-here"; // from https://no-go-dates.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://no-go-dates.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://no-go-dates.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://no-go-dates.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":"no-go-dates"}' | 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": "no-go-dates"})["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: "no-go-dates" })).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": "no-go-dates"}, 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", "no-go-dates"), 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: "no-go-dates" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "no-go-dates"])["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 = "no-go-dates" }))!["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": "register", "event": "Event: ...; a single-day conference ...", "register": "Risk rows (impact shown as entered ...): ...", "facts": "Register depth: ..."}
# - 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": "register", "event": "Event: ...; a single-day conference ...", "register": "Risk rows (impact shown as entered ...): ...", "facts": "Register depth: ..."}
# - 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: "register" or "emergency", event, register, 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 no-go-dates:<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 register carries summary, disclaimer, depth, rows, missing, coverage, buyback, calendar, signals and caveats; an emergency plan carries title, scenarios, contacts, distribution, advance, rota and note. The code below prints the headline parts of either (list items are plain strings).
KEY="no-go-dates:register:$(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 // .buyback, ((.signals // .caveats)[] | "\(.signal // .caveat): \(.text // .text)")' reply.json
jq -r '.distribution // .note // empty' reply.json # how the plan is distributed (emergency)
import hashlib, time
key = "no-go-dates:" + 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("buyback", ""))
for s in reply.get("signals") or reply.get("caveats") or []:
print(s.get("signal", s.get("caveat")), "-", s.get("text", s.get("text")))
if reply.get("distribution"):
print("distribution:", reply["distribution"])
import { createHash } from "node:crypto";
const key = `no-go-dates:${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.buyback);
for (const s of reply.signals || reply.caveats || []) console.log(s.signal ?? s.caveat, "-", s.text ?? s.text);
if (reply.distribution) console.log("distribution:", reply.distribution);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "no-go-dates:" + 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["signals"].([]any) // signals and caveats are plain strings
fmt.Println(j["charged_credits"], j["truncated"], reply["summary"])
fmt.Println(reply["note"], reply["buyback"])
for _, x := range items {
c := x.(map[string]any)
fmt.Println(c["signal"], "-", c["status"])
}
if fix, ok := reply["distribution"].(string); ok && fix != "" {
fmt.Println("distribution:", fix)
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "no-go-dates:" + 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("buyback").asText()));
for (JsonNode s : reply.has("signals") ? reply.path("signals") : reply.path("caveats")) System.out.println(s.path("signal").asText(s.path("caveat").asText()) + " - " + s.path("status").asText(s.path("text").asText()));
if (!reply.path("distribution").asText().isEmpty()) System.out.println("distribution: " + reply.get("distribution").asText());
require "digest"
key = "no-go-dates:#{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["buyback"]
(reply["signals"] || reply["caveats"] || []).each { |s| puts "#{s["signal"] || s["caveat"]} - #{s["text"] || s["text"]}" }
puts "distribution: #{reply["distribution"]}" unless reply["distribution"].to_s.empty?
$key = "no-go-dates:" . $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["buyback"] ?? "", "\n";
foreach ($reply["signals"] ?? $reply["caveats"] ?? [] as $s) echo $s["signal"] ?? $s["caveat"], " - ", $s["text"] ?? $s["text"], "\n";
if (!empty($reply["distribution"])) echo "distribution: ", $reply["distribution"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"no-go-dates:{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["buyback"]}");
foreach (var s in (reply["signals"] ?? reply["caveats"]) as JsonArray ?? new JsonArray()) Console.WriteLine($"{s!["signal"] ?? s["caveat"]} - {s["text"] ?? s["text"]}");
if (reply["distribution"] is JsonNode fix && fix.GetValue<string>() != "") Console.WriteLine("distribution: " + 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: no-go-dates:register:$(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": "register", "event": "Event: ...; a single-day conference ...", "register": "Risk rows (impact shown as entered ...): ...", "facts": "Register depth: ..."}
# - 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": "no-go-dates:register:" + 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": `no-go-dates:register:${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", "no-go-dates:register:"+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", "no-go-dates:register:" + 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" => "no-go-dates:register:#{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: no-go-dates:register:" . 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", $"no-go-dates:register:{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);