Run Sponsor Terms from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page decides which exhibit rows may enter the contract, picks the payment, withdrawal, force-majeure and insurance positions with the deleted ones, checks exclusivity and flags every section decided, open, for counsel or not applicable - all free, in termkit.js. The run writes the term sheet or the brief; the page then holds the reply to its own sections and exhibit (termreply.js). Nothing here is a contract or legal 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":"sponsor-terms"}), 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, deal, exhibit, 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 - terms (the term sheet for counsel) and counsel (the brief sent to counsel with it). A missing or unknown task is answered as terms. Both lanes send the same four fields.
The input
| Field | Required | What |
|---|---|---|
task | yes | terms or counsel. If it is missing or neither, do terms and set "task": "terms". |
deal | yes | the event, the parties, the jurisdiction and counsel, what was sold, the deal's own positions, the risk profile and the exclusivity terms. |
exhibit | yes | every deliverable row with specification, surface, hard deadline, responsible party and source, with unsourced rows, non-deadlines and attendee data marked. |
facts | yes | the four menus with the term sheet's position, their rungs, picks and deleted rungs, the cure period, every section in order with its flag and, for an open one, why it is open, the checks, the signals and every finding tagged [fix], [check] or [info], most urgent first. |
retry_note | no | optional; if present, your previous reply was unusable - follow it. |
The rules the model applies
- What you write is a term sheet for a qualified lawyer in the event's jurisdiction - never a contract, never legal advice, never something to sign. Say so at the top and again at the handoff. Unincorporated organizers carry personal exposure that no clause drafts around.
- You formalize a deal already closed: never re-price a tier, invent a benefit or widen a cap. Every exhibit row traces to the rate card or the accepted proposal, with a real hard deadline (the printer's date, not the event date) and a named responsible party, the sponsor's own asset duties included. An attendee-data perk enters only where a consented lead benefit was sold.
- Courts read force-majeure and cancellation clauses narrowly and literally: every branch names its remedy in words. Payment: 100% at signing by default; a staged deposit plus balance when procurement cannot release the fee upfront or signature is more than a year out; invoicing after the event is out. An express late-payment interest clause (published rates run 12-18% per annum) and a non-payment clause are always drafted.
- Sponsor withdrawal: a two-tier dated cutoff by default; hard no-refund is legitimate; a graduated ladder for long lead times or negotiated top deals; an undated discretionary refund is out. Organizer cancellation is a separate, narrower clause (pro-rata net of incurred expenses), never one mutual section.
- Force majeure: name the triggers expressly, pandemic and epidemic included, then the remedy - pro-rata net of documented expenses by default; sponsor-elected credit or refund within a dated window when a next edition is confirmed, the template is reusable or counsel negotiates; a flat refund only if the organizer can survive returning the whole fee; no obligation is legitimate but most likely struck. Silence is out.
- Insurance: none for meetups and hackathons without staffed space (say so explicitly); $1M per occurrence / $2M aggregate CGL once sponsors staff a booth or bring demos, the organizer named additional insured, the certificate due by a date tied to signature; layered cover (auto, workers' compensation, product or liquor) when alcohol, physical demos, vehicles or the venue contract call for it. A requirement with no certificate deadline and gate is out.
- Exclusivity only if sold, and then all three elements or none: a category definition naming inclusions and exclusions (with venue-concession and media-partner carve-outs), a duration and channel scope, and a breach remedy. Never "exclusive" at a tier that admits several sponsors.
- Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund; editorial independence - no say over speakers, topics or content, with the right to refuse sponsor content without refund; reciprocal, promotion-only logo licences that expire with the agreement. Cure period 30 days by default, 3 days close to the event; never attribute a 15-day cure period to the PSF. Indemnity scope, governing law, data protection and the signature block always go to counsel. Confidentiality and the general provisions (entire agreement, amendments, assignment, severability, notices) stay open: counsel usually has a house position, so list what needs deciding rather than drafting language.
House rules
- Use only the input and the rules above. The page's sections, flags, picks, perks, deadlines and figures are exact - copy them. Every number in a sentence must appear in the input or in the rules above.
- Label anything that is not one of the rules above, and is not in the input, as your own design.
- Never invent a party, a figure, a date, a benefit, a case or a commitment; where one must be named and is not, write "to be named". Refer to people by name or as they - never infer anyone's gender from a name.
- 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
terms
constraint- one or two sentences at the top: a term sheet for review by a qualified lawyer in the event's jurisdiction, not a contract, not legal advice, not to be signed.parties- one sentence: the organizer's contracting entity (or that none exists yet), the sponsor, the event, and what was sold at what fee.sections- one object per page section, in the page's order:n(the page's number),section(exactly),flag(decided,open,counselorna, as the page says),choice(a few words, by the page's flag: for the four menu sections, the page's term-sheet position - the deal's own unless the page replaced a deleted one; for any other decided section, the position taken; for an open section, what is still owed, from the page's reason; "for counsel" for a counsel section; "not applicable - " and the page's reason for one that does not apply),text(at most 60 words: example clause language for a decided section; the options and the trade-off for an open one; the question for counsel for a counsel one; empty for not applicable).exhibit- one object per exhibit row that may enter the contract, in the page's order (leave out unsourced rows and attendee data no lead benefit was sold for):perk(exactly),deadline(exactly, or "to be named" where the page marks it as not a real deadline),responsible(exactly),source(exactly).checks- one object per term-sheet check in the page's order:check(the page's short name, exactly),pass(true or false, as the page says).handoff- one or two sentences: who reviews it next (the page's counsel, or "to be named"), and again that this is not a contract and not legal advice.caveats- at most 4 short strings:[fix]findings first in the page's order (the first four when there are more), then[check]findings in the page's order.[]when there are none of either.
{
"task": "terms",
"constraint": "one or two sentences",
"parties": "one sentence",
"sections": [ { "n": 4, "section": "Payment schedule", "flag": "decided", "choice": "100% at signing", "text": "at most 60 words" } ],
"exhibit": [ { "perk": "a perk", "deadline": "a date", "responsible": "Sponsor", "source": "Gold tier - rate card" } ],
"checks": [ { "check": "Remedy explicitness", "pass": false } ],
"handoff": "one or two sentences",
"caveats": [ "a caveat" ]
}
The page holds it to its own sections and exhibit: the not-a-contract constraint at the top and at the handoff, every section in order with its flag and the four menu picks, an exhibit of only the rows that may enter the contract, and the checks; no 15-day cure period attributed to the PSF and no figure the input does not hold.
counsel
intro- one or two sentences: what is attached, that it is not a contract and not legal advice, and what the organizer needs back.fixes- one short string per[fix]finding, in the page's order: what the organizer must correct before counsel's time is spent.[]when there are none.open- one object per section the page flagsopen, in the page's order:section(exactly),decision(one sentence: what the organizer still owes),options(one sentence: the options from the input and the rules, with the trade-off).questions- one object per section the page flagscounsel, in the page's order:section(exactly),question(one sentence, specific to this deal's jurisdiction and facts).drafted- 2 to 4 short strings: which positions came from a published example shape in the rules, so counsel knows what was borrowed and what was decided.note- one sentence, at most 30 words, for the organizer: the one thing to do before sending.
{
"task": "counsel",
"intro": "one or two sentences",
"fixes": [ "a correction" ],
"open": [ { "section": "Confidentiality", "decision": "one sentence", "options": "one sentence" } ],
"questions": [ { "section": "Governing law, jurisdiction, dispute resolution", "question": "one sentence" } ],
"drafted": [ "a borrowed position" ],
"note": "one sentence"
}
The page requires the constraint, one correction per fix finding, every open section and every counsel section in order, and two to four borrowed positions.
Worked examples - every lane, every sample
These are the page's three free samples (fictional events and companies; every figure is illustrative). 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.
Fjord JS - Gold (a community conference with drafting gaps) - terms
Gold at 12,000 EUR; 4 of 6 exhibit rows may enter; payment 100% at signing; force majeure pro-rata net of documented expenses; insurance $1M per occurrence / $2M aggregate CGL; 1 of 6 checks.
Input:
{
"task": "terms",
"deal": "Event: Fjord JS, edition 4, September 9-10; attendance 600; community-run; 8 months from signature to the event\nParties: organizer contracts as an incorporated non-profit; sponsor Nordvikr Cloud; jurisdiction and governing law Norway; counsel a lawyer\nSold: tier Gold at 12,000 EUR; tier cap 3, 2 sold at this tier; category exclusivity sold yes (as an exclusive tier); consented lead retrieval sold no\nDeal positions: payment 100% at signing; late-payment interest NONE; sponsor withdrawal refunds at the organizer's discretion, undated; one mutual cancellation section yes; force-majeure remedy NONE STATED; triggers named: act of God, fire, flood\nRisk: sponsor booth or staffed space yes; alcohol, physical demos or vehicles no; venue contract requires sponsor cover no; insurance certificate deadline and gate no\nContext: reusable template no; a volunteer with a template; sponsor procurement cannot release the full fee upfront no; next edition confirmed no; cure period not given\nExclusivity: category cloud hosting; excluded NOT DEFINED; duration and channels the two event days and the website; breach remedy NOT STATED",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Logo on event website | Sponsor page - tier-sized placement | Website | Asset due June 1 - live June 8 | Organizer (placement) and Sponsor (asset) | Gold tier - rate card\n2. Logo on printed lanyard | Single colour - vector | Print | event (NOT A REAL DEADLINE) | Sponsor | Gold tier - rate card\n3. Booth space | 3x2m - power 2kW | On-site | Setup September 9 07:00-09:00 | Organizer | Gold tier - rate card\n4. Full-access passes | 4 - non-transferable | Registration | Codes issued August 15 | Organizer | Gold tier - rate card\n5. Attendee email list | Opted-in attendees | Document | Event + 7 days | Organizer | accepted proposal | ATTENDEE DATA\n6. Keynote slot | 20 minutes | Main stage | September 9 | Organizer | NONE (UNSOURCED)",
"facts": "Payment schedule: the term sheet's position is upfront (100% at signing) - the deal's own; the page's pick is upfront; rungs 100% at signing default; Staged deposit plus balance not yet; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is twotier (Two-tier cutoff) - replacing the deal's deleted position; the page's pick is twotier; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier not yet; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is prorata (Pro-rata net of documented expenses) - replacing the deal's deleted position; the page's pick is prorata; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund not yet; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is cgl ($1M per occurrence / $2M aggregate CGL); the page's pick is cgl; rungs No sponsor-carried insurance available; $1M per occurrence / $2M aggregate CGL default; Layered coverage not yet; a requirement with no certificate deadline and gate deleted\nCure period: 30 days by default (3 days close to the event)\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - open (an unsourced perk to drop; unsold attendee data to drop); 4 Payment schedule - open (no late-payment interest rate); 5 Sponsor withdrawal - open (discretionary refunds replaced; the cutoff date to set); 6 Organizer cancellation - open (one mutual section to split into two); 7 Force majeure - open (no remedy stated, pro-rata proposed; pandemic and epidemic to name); 8 Liability and indemnification - for counsel; 9 Insurance - open (a certificate deadline and booth gate to set); 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - open (missing a category definition with what it includes and excludes, a breach remedy; exclusive at a shared tier); 14 Attendee data - not applicable (no consented lead benefit was sold); 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (1 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) MISSING; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) MISSING; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) MISSING; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) MISSING; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) MISSING\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (15):\n[fix] silent_fm (force majeure): A force-majeure clause with no stated remedy is deleted - silence is a decision to refund nothing, discovered in the worst week; NetOne denied a refund on silent text, Sanders ordered one back on explicit text.\n[fix] discretion (withdrawal): An undated \"refunds at the organizer's discretion\" clause is deleted - every published example names a date or names none; a discretionary promise is read against whoever hoped it meant more.\n[fix] symmetric (cancellation): One mutual cancellation section makes organizer-cancels as generous as sponsor-withdraws - draft two separate clauses; the organizer remedy is narrower (pro-rata net of incurred expenses).\n[fix] excl_wider (exclusivity): \"Exclusive\" at a tier that admits 3 sponsors contradicts the published cap - the word means one to the sponsor's counsel; sell category exclusivity as a separate add-on instead.\n[fix] excl_elements (exclusivity): Exclusivity is missing a category definition with what it includes and excludes, a breach remedy - draft all three enforceability elements or none.\n[fix] data_unsold (data): Attendee email list hands over attendee data no consented lead benefit was sold for - drop it; the sponsor gets aggregate demographics instead.\n[fix] unsourced (exhibit): No rate-card or accepted-proposal source for: Keynote slot - a perk with no upstream origin does not enter the contract.\n[fix] no_gate (insurance): Insurance is required but no certificate deadline or booth gate is set - a requirement nobody collects against creates a false belief the exposure moved; require the certificate by a named date tied to signature, or state that none is required.\n[check] deadlines (exhibit): No real hard deadline for: Logo on printed lanyard - use the printer's or the platform's date, not the event date.\n[check] no_late (payment): No express late-payment interest - without one there is no contractual right to interest, to hold perks or to terminate for late payment; published rates run 12-18% per annum.\n[check] no_pandemic (force majeure): The trigger list does not name pandemic or epidemic - post-COVID practice names them rather than relying on \"act of God\".\n[check] checks (measurement): Term-sheet checks: 1 of 6 (all self-set).\n[info] carveouts (exclusivity): Write the venue-operated concessions and pre-existing media partnerships carve-outs into the category definition - the two most common causes of a mid-event refund dispute.\n[info] cure_default (termination): No cure period given - the most common verified length is 30 days, with a compressed 3-day variant for breaches found close to the event.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content), and reciprocal promotion-only logo licences that expire with the agreement."
}
Reply:
{
"task": "terms",
"constraint": "This document is a term sheet for review by a qualified lawyer licensed in Norway; it is not a contract, carries no legal advice, and must not be signed by either party.",
"parties": "The organizer contracts as an incorporated non-profit (entity name to be named) for Fjord JS, edition 4, with sponsor Nordvikr Cloud having purchased the Gold tier for EUR 12,000.",
"sections": [
{
"n": 1,
"section": "Parties and event",
"flag": "decided",
"choice": "Incorporated non-profit, Nordvikr Cloud, Norway law",
"text": "This term sheet concerns Fjord JS, edition 4, September 9-10, between the Organizer, an incorporated non-profit in Norway (name to be named), and Nordvikr Cloud as Sponsor, governed by the laws of Norway, for review before any signature."
},
{
"n": 2,
"section": "Sponsorship package and fee",
"flag": "decided",
"choice": "Gold tier, EUR 12,000",
"text": "Sponsor purchases the Gold sponsorship tier of Fjord JS, edition 4, for a fee of EUR 12,000, one of three Gold slots offered and two sold, entitling Sponsor to the deliverables set out in the attached exhibit."
},
{
"n": 3,
"section": "Deliverables exhibit",
"flag": "open",
"choice": "Drop unsourced perk and unsold attendee data",
"text": "The keynote slot has no rate-card or proposal source and should not enter the contract; the attendee email list was not sold as a consented lead benefit and should be dropped, with Sponsor offered aggregate demographics instead."
},
{
"n": 4,
"section": "Payment schedule",
"flag": "open",
"choice": "100% at signing",
"text": "No late-payment interest rate is set; published rates run 12-18% per annum. Without an express rate there is no contractual right to interest, to hold perks, or to terminate for non-payment; counsel should set a rate in that range."
},
{
"n": 5,
"section": "Sponsor withdrawal",
"flag": "open",
"choice": "Two-tier cutoff",
"text": "The organizer's undated discretionary-refund position is deleted as illegitimate; a two-tier dated cutoff is proposed as the default, with hard no-refund also available; a specific cutoff date before the event still needs to be set."
},
{
"n": 6,
"section": "Organizer cancellation",
"flag": "open",
"choice": "Split the mutual clause into two",
"text": "A single mutual cancellation section currently makes organizer-cancels as generous as sponsor-withdraws; it should be split into two clauses, with the organizer's remedy narrower - pro-rata net of incurred expenses - rather than mirroring sponsor withdrawal."
},
{
"n": 7,
"section": "Force majeure",
"flag": "open",
"choice": "Pro-rata net of documented expenses",
"text": "No remedy is currently stated, which silently means no refund; pro-rata net of documented expenses is proposed as the default. The trigger list names act of God, fire and flood only; pandemic and epidemic should be added expressly."
},
{
"n": 8,
"section": "Liability and indemnification",
"flag": "counsel",
"choice": "for counsel",
"text": "What indemnity scope, including caps and carve-outs, should bind each party given a sponsor booth, this sponsorship fee, and Norwegian liability law?"
},
{
"n": 9,
"section": "Insurance",
"flag": "open",
"choice": "$1M per occurrence / $2M aggregate CGL",
"text": "The sponsor staffs a booth, so CGL cover of $1M per occurrence / $2M aggregate is proposed, with the organizer as additional insured; a certificate deadline tied to signature and a booth-access gate still need to be set."
},
{
"n": 10,
"section": "Code of conduct and ejection right",
"flag": "decided",
"choice": "Code of conduct binds sponsor staff, ejection right, no refund",
"text": "Sponsor's staff and representatives must comply with the event code of conduct; the Organizer may eject any individual in breach, with no refund of the sponsorship fee for the ejection."
},
{
"n": 11,
"section": "Editorial independence",
"flag": "decided",
"choice": "Organizer retains full editorial control",
"text": "Sponsor has no say over speakers, topics, or content; the Organizer may refuse any sponsor-provided content without obligation to refund the sponsorship fee."
},
{
"n": 12,
"section": "Logo and brand licensing",
"flag": "decided",
"choice": "Reciprocal, promotion-only logo licence expiring with agreement",
"text": "Each party grants the other a reciprocal, non-exclusive licence to use its logo solely to promote the event and the sponsorship, expiring automatically when this agreement terminates or expires."
},
{
"n": 13,
"section": "Category exclusivity",
"flag": "open",
"choice": "Add category definition, breach remedy; resolve exclusive-tier conflict",
"text": "Cloud-hosting exclusivity is sold but the category's exclusions, carve-outs for venue concessions and media partners, and a breach remedy are not yet defined; exclusive cannot stand at a tier capped at three sponsors with two sold - sell exclusivity as a separate add-on."
},
{
"n": 14,
"section": "Attendee data",
"flag": "na",
"choice": "not applicable - no consented lead benefit was sold",
"text": ""
},
{
"n": 15,
"section": "Confidentiality",
"flag": "open",
"choice": "Counsel's house position on confidentiality terms",
"text": "Confidentiality scope and duration are left open for counsel's standard position; the organizer should confirm whether mutual confidentiality obligations and survival terms follow counsel's usual template or need deal-specific carve-outs."
},
{
"n": 16,
"section": "Term, cure period, termination, renewal",
"flag": "decided",
"choice": "30-day cure period, 3 days near the event",
"text": "The agreement runs for the term of this sponsorship; either party may cure a breach within 30 days of notice, shortened to 3 days where the breach is found close to the event; renewal is not addressed here."
},
{
"n": 17,
"section": "Governing law, jurisdiction, dispute resolution",
"flag": "counsel",
"choice": "for counsel",
"text": "Should Norwegian courts have exclusive jurisdiction, or should the parties agree to arbitration seated in Norway, given the sponsor's location and the EUR 12,000 fee at stake?"
},
{
"n": 18,
"section": "General provisions",
"flag": "open",
"choice": "Counsel's house template for general provisions",
"text": "Entire agreement, amendments, assignment, severability, and notices clauses are left to counsel's usual house template; the organizer should confirm whether its standard non-profit template already covers these or counsel should supply them."
},
{
"n": 19,
"section": "Signature block",
"flag": "counsel",
"choice": "for counsel",
"text": "Who are the authorized signatories for the organizer's non-profit entity and for Nordvikr Cloud, and what signature format does counsel require?"
}
],
"exhibit": [
{
"perk": "Logo on event website",
"deadline": "Asset due June 1 - live June 8",
"responsible": "Organizer (placement) and Sponsor (asset)",
"source": "Gold tier - rate card"
},
{
"perk": "Logo on printed lanyard",
"deadline": "to be named",
"responsible": "Sponsor",
"source": "Gold tier - rate card"
},
{
"perk": "Booth space",
"deadline": "Setup September 9 07:00-09:00",
"responsible": "Organizer",
"source": "Gold tier - rate card"
},
{
"perk": "Full-access passes",
"deadline": "Codes issued August 15",
"responsible": "Organizer",
"source": "Gold tier - rate card"
}
],
"checks": [
{
"check": "Remedy explicitness",
"pass": false
},
{
"check": "Upstream fidelity",
"pass": false
},
{
"check": "Clause coverage",
"pass": false
},
{
"check": "Counsel target",
"pass": true
},
{
"check": "Payment protected",
"pass": false
},
{
"check": "Insurance gated",
"pass": false
}
],
"handoff": "This term sheet should be reviewed by counsel qualified in Norwegian law before Nordvikr Cloud or the organizer signs; it is not a contract and does not constitute legal advice.",
"caveats": [
"[fix] silent_fm: a force-majeure clause with no stated remedy reads as refusing any refund - state pro-rata net of documented expenses instead.",
"[fix] discretion: an undated organizer-discretion refund clause is illegitimate - set a dated two-tier cutoff instead.",
"[fix] symmetric: one mutual cancellation clause wrongly makes organizer-cancels as generous as sponsor-withdraws - split into two, with the organizer's remedy narrower.",
"[fix] excl_wider: exclusivity cannot stand at a Gold tier capped at three sponsors with two sold - sell it as a separate add-on instead."
]
}
The page's check: kept - nothing to flag
Fjord JS - Gold (a community conference with drafting gaps) - counsel
Gold at 12,000 EUR; 4 of 6 exhibit rows may enter; payment 100% at signing; force majeure pro-rata net of documented expenses; insurance $1M per occurrence / $2M aggregate CGL; 1 of 6 checks.
Input:
{
"task": "counsel",
"deal": "Event: Fjord JS, edition 4, September 9-10; attendance 600; community-run; 8 months from signature to the event\nParties: organizer contracts as an incorporated non-profit; sponsor Nordvikr Cloud; jurisdiction and governing law Norway; counsel a lawyer\nSold: tier Gold at 12,000 EUR; tier cap 3, 2 sold at this tier; category exclusivity sold yes (as an exclusive tier); consented lead retrieval sold no\nDeal positions: payment 100% at signing; late-payment interest NONE; sponsor withdrawal refunds at the organizer's discretion, undated; one mutual cancellation section yes; force-majeure remedy NONE STATED; triggers named: act of God, fire, flood\nRisk: sponsor booth or staffed space yes; alcohol, physical demos or vehicles no; venue contract requires sponsor cover no; insurance certificate deadline and gate no\nContext: reusable template no; a volunteer with a template; sponsor procurement cannot release the full fee upfront no; next edition confirmed no; cure period not given\nExclusivity: category cloud hosting; excluded NOT DEFINED; duration and channels the two event days and the website; breach remedy NOT STATED",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Logo on event website | Sponsor page - tier-sized placement | Website | Asset due June 1 - live June 8 | Organizer (placement) and Sponsor (asset) | Gold tier - rate card\n2. Logo on printed lanyard | Single colour - vector | Print | event (NOT A REAL DEADLINE) | Sponsor | Gold tier - rate card\n3. Booth space | 3x2m - power 2kW | On-site | Setup September 9 07:00-09:00 | Organizer | Gold tier - rate card\n4. Full-access passes | 4 - non-transferable | Registration | Codes issued August 15 | Organizer | Gold tier - rate card\n5. Attendee email list | Opted-in attendees | Document | Event + 7 days | Organizer | accepted proposal | ATTENDEE DATA\n6. Keynote slot | 20 minutes | Main stage | September 9 | Organizer | NONE (UNSOURCED)",
"facts": "Payment schedule: the term sheet's position is upfront (100% at signing) - the deal's own; the page's pick is upfront; rungs 100% at signing default; Staged deposit plus balance not yet; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is twotier (Two-tier cutoff) - replacing the deal's deleted position; the page's pick is twotier; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier not yet; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is prorata (Pro-rata net of documented expenses) - replacing the deal's deleted position; the page's pick is prorata; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund not yet; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is cgl ($1M per occurrence / $2M aggregate CGL); the page's pick is cgl; rungs No sponsor-carried insurance available; $1M per occurrence / $2M aggregate CGL default; Layered coverage not yet; a requirement with no certificate deadline and gate deleted\nCure period: 30 days by default (3 days close to the event)\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - open (an unsourced perk to drop; unsold attendee data to drop); 4 Payment schedule - open (no late-payment interest rate); 5 Sponsor withdrawal - open (discretionary refunds replaced; the cutoff date to set); 6 Organizer cancellation - open (one mutual section to split into two); 7 Force majeure - open (no remedy stated, pro-rata proposed; pandemic and epidemic to name); 8 Liability and indemnification - for counsel; 9 Insurance - open (a certificate deadline and booth gate to set); 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - open (missing a category definition with what it includes and excludes, a breach remedy; exclusive at a shared tier); 14 Attendee data - not applicable (no consented lead benefit was sold); 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (1 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) MISSING; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) MISSING; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) MISSING; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) MISSING; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) MISSING\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (15):\n[fix] silent_fm (force majeure): A force-majeure clause with no stated remedy is deleted - silence is a decision to refund nothing, discovered in the worst week; NetOne denied a refund on silent text, Sanders ordered one back on explicit text.\n[fix] discretion (withdrawal): An undated \"refunds at the organizer's discretion\" clause is deleted - every published example names a date or names none; a discretionary promise is read against whoever hoped it meant more.\n[fix] symmetric (cancellation): One mutual cancellation section makes organizer-cancels as generous as sponsor-withdraws - draft two separate clauses; the organizer remedy is narrower (pro-rata net of incurred expenses).\n[fix] excl_wider (exclusivity): \"Exclusive\" at a tier that admits 3 sponsors contradicts the published cap - the word means one to the sponsor's counsel; sell category exclusivity as a separate add-on instead.\n[fix] excl_elements (exclusivity): Exclusivity is missing a category definition with what it includes and excludes, a breach remedy - draft all three enforceability elements or none.\n[fix] data_unsold (data): Attendee email list hands over attendee data no consented lead benefit was sold for - drop it; the sponsor gets aggregate demographics instead.\n[fix] unsourced (exhibit): No rate-card or accepted-proposal source for: Keynote slot - a perk with no upstream origin does not enter the contract.\n[fix] no_gate (insurance): Insurance is required but no certificate deadline or booth gate is set - a requirement nobody collects against creates a false belief the exposure moved; require the certificate by a named date tied to signature, or state that none is required.\n[check] deadlines (exhibit): No real hard deadline for: Logo on printed lanyard - use the printer's or the platform's date, not the event date.\n[check] no_late (payment): No express late-payment interest - without one there is no contractual right to interest, to hold perks or to terminate for late payment; published rates run 12-18% per annum.\n[check] no_pandemic (force majeure): The trigger list does not name pandemic or epidemic - post-COVID practice names them rather than relying on \"act of God\".\n[check] checks (measurement): Term-sheet checks: 1 of 6 (all self-set).\n[info] carveouts (exclusivity): Write the venue-operated concessions and pre-existing media partnerships carve-outs into the category definition - the two most common causes of a mid-event refund dispute.\n[info] cure_default (termination): No cure period given - the most common verified length is 30 days, with a compressed 3-day variant for breaches found close to the event.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content), and reciprocal promotion-only logo licences that expire with the agreement."
}
Reply:
{
"task": "counsel",
"intro": "Attached is the Gold-tier term sheet between the organizer and Nordvikr Cloud for Fjord JS, prepared for review by a qualified lawyer in Norway - it is not a contract and not legal advice. We need you to resolve the open items below, answer the flagged questions, and confirm it is ready for signature.",
"fixes": [
"Add a stated remedy to the force-majeure clause - silence currently reads as refusing any refund.",
"Remove the undated 'refunds at the organizer's discretion' withdrawal clause - it must name a date or name none.",
"Split the single mutual cancellation section into two clauses, with a narrower organizer-cancels remedy of pro-rata net of incurred expenses.",
"Drop the exclusive label at the Gold tier, which admits 3 sponsors with 2 already sold - sell category exclusivity as a separate add-on instead.",
"Add the missing category definition (inclusions and exclusions) and a breach remedy for exclusivity, or draft none of the three elements.",
"Drop the Attendee email list perk - no consented lead benefit was sold for it; offer aggregate demographics instead.",
"Drop the Keynote slot - it has no rate-card or accepted-proposal source.",
"Set a certificate deadline tied to signature and a booth gate for the required insurance, or state plainly that none is required."
],
"open": [
{
"section": "Deliverables exhibit",
"decision": "The organizer still needs to drop the Keynote slot, which has no rate-card or accepted-proposal source, and the Attendee email list, for which no consented lead benefit was sold.",
"options": "The only options are removing both rows now or, for the Keynote slot alone, finding and citing its source before it can enter the contract, since an unsourced perk and unsold attendee data cannot go in regardless."
},
{
"section": "Payment schedule",
"decision": "The organizer still needs to set an express late-payment interest rate, since the deal names none.",
"options": "Published rates for this clause run from 12 to 18 percent per annum, with a rate at the low end easier for Nordvikr Cloud's counsel to accept and a rate at the high end giving the organizer more leverage against late payment."
},
{
"section": "Sponsor withdrawal",
"decision": "The organizer still needs to set the dated cutoff for the two-tier withdrawal clause that replaced the undated discretionary-refund position.",
"options": "Setting the cutoff further from the event date gives the organizer more time to resell the Gold slot, while setting it closer to the event gives Nordvikr Cloud more flexibility to withdraw with a partial refund."
},
{
"section": "Organizer cancellation",
"decision": "The organizer still needs to split the single mutual cancellation section into two clauses, since the same terms cannot cover both sponsor withdrawal and organizer cancellation.",
"options": "The sponsor-withdrawal terms stay as already set under the two-tier cutoff, while the organizer-cancellation clause must be the narrower remedy of pro-rata refund net of incurred expenses, trading a simpler single clause for the two separate clauses the rules require."
},
{
"section": "Force majeure",
"decision": "The organizer still needs to confirm the pro-rata net of documented expenses remedy proposed in place of the deal's unstated one, and add pandemic and epidemic to the named triggers alongside act of God, fire and flood.",
"options": "Since no next edition is confirmed and no reusable template exists, pro-rata is the strongest fit, though a flat cash refund remains available if the organizer can survive returning the full fee, and no refund obligation remains available but is likely to be struck in negotiation."
},
{
"section": "Insurance",
"decision": "The organizer still needs to set a certificate deadline tied to signature and a booth-access gate for the required $1M per occurrence / $2M aggregate CGL coverage, since Nordvikr Cloud will staff a booth.",
"options": "The certificate deadline can be set soon after signature, giving more time to chase a missing certificate, or closer to the September 9 setup window, which is easier for Nordvikr Cloud but leaves less time to enforce the gate."
},
{
"section": "Category exclusivity",
"decision": "The organizer still needs a category definition naming what is included and excluded within cloud hosting, plus a breach remedy, and must resolve that the Gold tier is sold as exclusive while its cap of 3 allows more than the 2 already sold.",
"options": "The options are drafting all three exclusivity elements - the category definition with carve-outs, the duration and channel scope of the two event days and the website already set, and a breach remedy - or dropping exclusivity and selling it going forward as a separate add-on, since exclusive cannot describe a tier that admits several sponsors."
},
{
"section": "Confidentiality",
"decision": "The organizer still needs counsel's standard confidentiality position, since the deal sets none.",
"options": "The options are a one-way clause protecting only the organizer's negotiated rate and what was sold, or a mutual clause also protecting Nordvikr Cloud's business terms, trading broader protection for the organizer against a reciprocal promise sponsors may expect."
},
{
"section": "General provisions",
"decision": "The organizer still needs counsel's standard template for entire agreement, amendments, assignment, severability and notices, none of which the deal addresses.",
"options": "The options are adopting counsel's house boilerplate as written or negotiating individual terms such as whether assignment needs consent, trading speed against sponsor-specific terms."
}
],
"questions": [
{
"section": "Liability and indemnification",
"question": "Under Norwegian law, what indemnification scope and liability caps should the incorporated non-profit organizer and Nordvikr Cloud each carry for this Gold sponsorship, given the staffed booth?"
},
{
"section": "Governing law, jurisdiction, dispute resolution",
"question": "With Norway already agreed as the governing law and jurisdiction, should disputes between the organizer and Nordvikr Cloud go to Norwegian courts or to arbitration?"
},
{
"section": "Signature block",
"question": "Who are the authorized signatories for Nordvikr Cloud and for the organizer's contracting entity, to be named, before the signature block can be completed?"
}
],
"drafted": [
"The two-tier dated cutoff for sponsor withdrawal is the rules' default shape, used because the deal's own undated discretionary refund was not a legitimate option.",
"The pro-rata net of documented expenses force-majeure remedy is the rules' default shape, used because the deal did not state one.",
"The 30-day cure period (3 days close to the event) is the rules' default shape, since the deal did not give one.",
"The code-of-conduct, editorial-independence and logo-licensing clauses are drafted from the rules' always-drafted shapes rather than anything the deal specified."
],
"note": "Drop the unsourced Keynote slot and the unsold Attendee email list, add stated remedies for withdrawal and force majeure, and fix the exclusivity tier conflict before sending this to counsel."
}
The page's check: kept - nothing to flag
Hack the Harbour - Supporter (a small fiscally sponsored hackathon) - terms
Supporter at 1,500 GBP; 3 of 3 exhibit rows may enter; payment 100% at signing; force majeure sponsor-elected credit or refund; insurance No sponsor-carried insurance; 6 of 6 checks.
Input:
{
"task": "terms",
"deal": "Event: Hack the Harbour, edition 2, November 15; attendance 80; community-run; 5 months from signature to the event\nParties: organizer contracts as a fiscal sponsor; sponsor Tidewren Labs; jurisdiction and governing law England and Wales; counsel the fiscal sponsor's legal team\nSold: tier Supporter at 1,500 GBP; tier cap 6, 4 sold at this tier; category exclusivity sold no; consented lead retrieval sold no\nDeal positions: payment 100% at signing; late-payment interest 12% per annum; sponsor withdrawal Two-tier cutoff (cutoff 30 days out); one mutual cancellation section no; force-majeure remedy Pro-rata net of documented expenses; triggers named: fire, flood, epidemic, pandemic, government order, venue destruction\nRisk: sponsor booth or staffed space no; alcohol, physical demos or vehicles no; venue contract requires sponsor cover no; insurance certificate deadline and gate no\nContext: reusable template yes; a volunteer with a template; sponsor procurement cannot release the full fee upfront no; next edition confirmed no; cure period 30 days; sponsor-affiliated speaker cap 1\nExclusivity: none sold",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Logo on the hackathon page | Supporter row | Website | Asset due October 1 | Sponsor | Supporter tier - rate card\n2. Prize category naming | One challenge prize | On-site and website | Prize brief due October 15 | Sponsor | Supporter tier - rate card\n3. Aggregate audience report | Role and experience mix - no names | Document | Event + 14 days | Organizer | Supporter tier - rate card",
"facts": "Payment schedule: the term sheet's position is upfront (100% at signing) - the deal's own; the page's pick is upfront; rungs 100% at signing default; Staged deposit plus balance not yet; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is twotier (Two-tier cutoff) - the deal's own; the page's pick is twotier; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier not yet; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is prorata (Pro-rata net of documented expenses) - the deal's own; the page's pick is credit; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund promoted; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is none (No sponsor-carried insurance); the page's pick is none; rungs No sponsor-carried insurance default; $1M per occurrence / $2M aggregate CGL available; Layered coverage not yet; a requirement with no certificate deadline and gate deleted\nCure period: 30 days\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - decided; 4 Payment schedule - decided; 5 Sponsor withdrawal - decided; 6 Organizer cancellation - decided; 7 Force majeure - decided; 8 Liability and indemnification - for counsel; 9 Insurance - decided; 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - not applicable (no exclusivity was sold); 14 Attendee data - not applicable (no consented lead benefit was sold); 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (6 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) passed; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) passed; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) passed; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) passed; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) passed\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (5):\n[info] fiscal (parties): A fiscal sponsor contracts: its own templates and legal team may govern - start from its paper.\n[info] fm_differs (force majeure): The deal uses Pro-rata net of documented expenses; the page's pick is Sponsor-elected credit or refund (a confirmed next edition, a reusable template or negotiating counsel promote the credit).\n[info] ins_none (insurance): No sponsor-carried insurance: say so in the term sheet so counsel sees it was decided, not forgotten.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content) with a self-set cap of 1 sponsor-affiliated speakers, and reciprocal promotion-only logo licences that expire with the agreement.\n[info] checks (measurement): Term-sheet checks: 6 of 6 (all self-set)."
}
Reply:
{
"task": "terms",
"constraint": "This document is a term sheet for review by the fiscal sponsor's legal team under the laws of England and Wales; it is not a contract, carries no legal advice, and must not be signed by either party.",
"parties": "The organizer contracts through its fiscal sponsor for Hack the Harbour, edition 2, with sponsor Tidewren Labs having purchased the Supporter tier for GBP 1,500.",
"sections": [
{
"n": 1,
"section": "Parties and event",
"flag": "decided",
"choice": "Fiscal sponsor organizer, Tidewren Labs, England and Wales law",
"text": "This term sheet concerns Hack the Harbour, edition 2, November 15, between the Organizer, acting through its fiscal sponsor, and Tidewren Labs as Sponsor, governed by the laws of England and Wales, for review before signature."
},
{
"n": 2,
"section": "Sponsorship package and fee",
"flag": "decided",
"choice": "Supporter tier, GBP 1,500",
"text": "Sponsor purchases the Supporter sponsorship tier of Hack the Harbour, edition 2, for a fee of GBP 1,500, one of six Supporter slots offered and four sold, entitling Sponsor to the deliverables set out in the attached exhibit."
},
{
"n": 3,
"section": "Deliverables exhibit",
"flag": "decided",
"choice": "All three sourced Supporter-tier deliverables included",
"text": "Sponsor receives a logo on the hackathon page, naming of one challenge prize, and an aggregate, no-names audience report by role and experience mix; all three trace to the Supporter tier rate card with named deadlines and responsible parties."
},
{
"n": 4,
"section": "Payment schedule",
"flag": "decided",
"choice": "100% at signing",
"text": "Sponsor shall pay the full GBP 1,500 Supporter fee upon signing this agreement. Late payment accrues interest at 12% per annum from the due date, and the Organizer may suspend delivery of perks or terminate for continued non-payment."
},
{
"n": 5,
"section": "Sponsor withdrawal",
"flag": "decided",
"choice": "Two-tier cutoff",
"text": "If Sponsor withdraws more than 30 days before the event, a partial refund applies under the two-tier schedule; withdrawal within 30 days of the event forfeits the fee entirely. Organizer cancellation is addressed in a separate, narrower clause."
},
{
"n": 6,
"section": "Organizer cancellation",
"flag": "decided",
"choice": "Separate narrower pro-rata remedy",
"text": "If the Organizer cancels the event, Sponsor receives a pro-rata refund of the fee net of expenses already incurred on Sponsor's behalf, in a clause distinct from and narrower than the sponsor-withdrawal remedy."
},
{
"n": 7,
"section": "Force majeure",
"flag": "decided",
"choice": "Pro-rata net of documented expenses",
"text": "On fire, flood, epidemic, pandemic, government order, or venue destruction, the event may be cancelled or altered; Sponsor receives a pro-rata refund of its fee net of documented expenses already incurred by the Organizer."
},
{
"n": 8,
"section": "Liability and indemnification",
"flag": "counsel",
"choice": "for counsel",
"text": "What indemnity scope and caps should apply between the Organizer, acting as fiscal sponsor, and Tidewren Labs, given the laws of England and Wales and the fiscal sponsor's own legal team?"
},
{
"n": 9,
"section": "Insurance",
"flag": "decided",
"choice": "No sponsor-carried insurance",
"text": "Sponsor does not staff a booth or bring physical demos, so no sponsor-carried insurance is required for this sponsorship; this is stated as a decided position, not an oversight."
},
{
"n": 10,
"section": "Code of conduct and ejection right",
"flag": "decided",
"choice": "Code of conduct binds sponsor staff, ejection right, no refund",
"text": "Sponsor's representatives must comply with the event code of conduct; the Organizer may eject any individual in breach, with no refund of the sponsorship fee for the ejection."
},
{
"n": 11,
"section": "Editorial independence",
"flag": "decided",
"choice": "Organizer retains full editorial control",
"text": "Sponsor has no say over speakers, topics, or content, and no more than one sponsor-affiliated speaker may appear; the Organizer may refuse any sponsor-provided content without refunding the fee."
},
{
"n": 12,
"section": "Logo and brand licensing",
"flag": "decided",
"choice": "Reciprocal, promotion-only logo licence expiring with agreement",
"text": "Each party grants the other a reciprocal, non-exclusive licence to use its logo solely to promote the event and the sponsorship, expiring automatically when this agreement terminates or expires."
},
{
"n": 13,
"section": "Category exclusivity",
"flag": "na",
"choice": "not applicable - no exclusivity was sold",
"text": ""
},
{
"n": 14,
"section": "Attendee data",
"flag": "na",
"choice": "not applicable - no consented lead benefit was sold",
"text": ""
},
{
"n": 15,
"section": "Confidentiality",
"flag": "open",
"choice": "Counsel's house position on confidentiality terms",
"text": "Confidentiality scope and duration are left open for the fiscal sponsor's legal team's standard position; the organizer should confirm whether its usual template already covers mutual confidentiality or needs sponsorship-specific terms."
},
{
"n": 16,
"section": "Term, cure period, termination, renewal",
"flag": "decided",
"choice": "30-day cure period",
"text": "The agreement runs for the term of this sponsorship; either party may cure a breach within 30 days of notice. Renewal is not addressed here."
},
{
"n": 17,
"section": "Governing law, jurisdiction, dispute resolution",
"flag": "counsel",
"choice": "for counsel",
"text": "Should the courts of England and Wales have exclusive jurisdiction, or should the fiscal sponsor's legal team prefer arbitration, given the GBP 1,500 fee at stake?"
},
{
"n": 18,
"section": "General provisions",
"flag": "open",
"choice": "Counsel's house template for general provisions",
"text": "Entire agreement, amendments, assignment, severability, and notices clauses are left to the fiscal sponsor's legal team's house template; the organizer should confirm whether it already covers community events like this one."
},
{
"n": 19,
"section": "Signature block",
"flag": "counsel",
"choice": "for counsel",
"text": "Who are the authorized signatories for the organizer's fiscal sponsor and for Tidewren Labs, and does the fiscal sponsor's legal team require wet-ink or electronic signature?"
}
],
"exhibit": [
{
"perk": "Logo on the hackathon page",
"deadline": "Asset due October 1",
"responsible": "Sponsor",
"source": "Supporter tier - rate card"
},
{
"perk": "Prize category naming",
"deadline": "Prize brief due October 15",
"responsible": "Sponsor",
"source": "Supporter tier - rate card"
},
{
"perk": "Aggregate audience report",
"deadline": "Event + 14 days",
"responsible": "Organizer",
"source": "Supporter tier - rate card"
}
],
"checks": [
{
"check": "Remedy explicitness",
"pass": true
},
{
"check": "Upstream fidelity",
"pass": true
},
{
"check": "Clause coverage",
"pass": true
},
{
"check": "Counsel target",
"pass": true
},
{
"check": "Payment protected",
"pass": true
},
{
"check": "Insurance gated",
"pass": true
}
],
"handoff": "This term sheet should be reviewed by the fiscal sponsor's legal team before Tidewren Labs or the organizer signs; it is not a contract and does not constitute legal advice.",
"caveats": []
}
The page's check: kept - nothing to flag
Hack the Harbour - Supporter (a small fiscally sponsored hackathon) - counsel
Supporter at 1,500 GBP; 3 of 3 exhibit rows may enter; payment 100% at signing; force majeure sponsor-elected credit or refund; insurance No sponsor-carried insurance; 6 of 6 checks.
Input:
{
"task": "counsel",
"deal": "Event: Hack the Harbour, edition 2, November 15; attendance 80; community-run; 5 months from signature to the event\nParties: organizer contracts as a fiscal sponsor; sponsor Tidewren Labs; jurisdiction and governing law England and Wales; counsel the fiscal sponsor's legal team\nSold: tier Supporter at 1,500 GBP; tier cap 6, 4 sold at this tier; category exclusivity sold no; consented lead retrieval sold no\nDeal positions: payment 100% at signing; late-payment interest 12% per annum; sponsor withdrawal Two-tier cutoff (cutoff 30 days out); one mutual cancellation section no; force-majeure remedy Pro-rata net of documented expenses; triggers named: fire, flood, epidemic, pandemic, government order, venue destruction\nRisk: sponsor booth or staffed space no; alcohol, physical demos or vehicles no; venue contract requires sponsor cover no; insurance certificate deadline and gate no\nContext: reusable template yes; a volunteer with a template; sponsor procurement cannot release the full fee upfront no; next edition confirmed no; cure period 30 days; sponsor-affiliated speaker cap 1\nExclusivity: none sold",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Logo on the hackathon page | Supporter row | Website | Asset due October 1 | Sponsor | Supporter tier - rate card\n2. Prize category naming | One challenge prize | On-site and website | Prize brief due October 15 | Sponsor | Supporter tier - rate card\n3. Aggregate audience report | Role and experience mix - no names | Document | Event + 14 days | Organizer | Supporter tier - rate card",
"facts": "Payment schedule: the term sheet's position is upfront (100% at signing) - the deal's own; the page's pick is upfront; rungs 100% at signing default; Staged deposit plus balance not yet; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is twotier (Two-tier cutoff) - the deal's own; the page's pick is twotier; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier not yet; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is prorata (Pro-rata net of documented expenses) - the deal's own; the page's pick is credit; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund promoted; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is none (No sponsor-carried insurance); the page's pick is none; rungs No sponsor-carried insurance default; $1M per occurrence / $2M aggregate CGL available; Layered coverage not yet; a requirement with no certificate deadline and gate deleted\nCure period: 30 days\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - decided; 4 Payment schedule - decided; 5 Sponsor withdrawal - decided; 6 Organizer cancellation - decided; 7 Force majeure - decided; 8 Liability and indemnification - for counsel; 9 Insurance - decided; 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - not applicable (no exclusivity was sold); 14 Attendee data - not applicable (no consented lead benefit was sold); 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (6 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) passed; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) passed; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) passed; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) passed; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) passed\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (5):\n[info] fiscal (parties): A fiscal sponsor contracts: its own templates and legal team may govern - start from its paper.\n[info] fm_differs (force majeure): The deal uses Pro-rata net of documented expenses; the page's pick is Sponsor-elected credit or refund (a confirmed next edition, a reusable template or negotiating counsel promote the credit).\n[info] ins_none (insurance): No sponsor-carried insurance: say so in the term sheet so counsel sees it was decided, not forgotten.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content) with a self-set cap of 1 sponsor-affiliated speakers, and reciprocal promotion-only logo licences that expire with the agreement.\n[info] checks (measurement): Term-sheet checks: 6 of 6 (all self-set)."
}
Reply:
{
"task": "counsel",
"intro": "Attached is the Supporter-tier term sheet between the fiscal sponsor and Tidewren Labs for Hack the Harbour, prepared for review by the fiscal sponsor's legal team - it is not a contract and not legal advice. We need you to confirm the two open positions below, answer the flagged questions, and clear it for signature.",
"fixes": [],
"open": [
{
"section": "Confidentiality",
"decision": "The organizer still needs a confidentiality position, since the deal sets none and the fiscal sponsor's own templates may already cover it.",
"options": "The options are adopting the fiscal sponsor's existing confidentiality language as a starting point or negotiating a one-way clause protecting only the organizer's terms, trading consistency with the fiscal sponsor's paper against sponsor-specific protection."
},
{
"section": "General provisions",
"decision": "The organizer still needs a standard template for entire agreement, amendments, assignment, severability and notices, since the deal does not set them.",
"options": "The options are starting from the fiscal sponsor's own template, consistent with its legal team reviewing this term sheet, or drafting bespoke provisions just for this sponsorship, trading consistency against customization."
}
],
"questions": [
{
"section": "Liability and indemnification",
"question": "Under England and Wales law, what indemnification scope should apply between the fiscal sponsor and Tidewren Labs for this Supporter-tier sponsorship, given the fiscal sponsor structure?"
},
{
"section": "Governing law, jurisdiction, dispute resolution",
"question": "With England and Wales already agreed as governing law and jurisdiction, should disputes between the fiscal sponsor and Tidewren Labs go to the courts or to arbitration?"
},
{
"section": "Signature block",
"question": "Who is authorized to sign on behalf of the organizer's fiscal sponsor, to be named, and on behalf of Tidewren Labs?"
}
],
"drafted": [
"The force-majeure remedy keeps the deal's own pro-rata net of documented expenses position rather than the reusable template's usual sponsor-elected credit or refund, since pro-rata remains a legitimate choice.",
"The code-of-conduct, editorial-independence and logo-licensing clauses are drafted from the rules' always-drafted shapes rather than anything specific to this deal.",
"No sponsor-carried insurance is drafted because Tidewren Labs has no booth or staffed space, matching the rules' position for meetups and hackathons without one.",
"Payment at 100% at signing and the two-tier withdrawal cutoff are the deal's own choices, which also match the rules' default shapes."
],
"note": "This term sheet is otherwise clean, so just confirm the confidentiality and general-provisions positions with your own templates before sending it to Tidewren Labs."
}
The page's check: kept - nothing to flag
Vanmere Summit - Platinum (company-run, a negotiated top deal) - terms
Platinum at 150,000 USD; 5 of 5 exhibit rows may enter; payment Staged deposit plus balance; force majeure sponsor-elected credit or refund; insurance Layered coverage; 4 of 6 checks.
Input:
{
"task": "terms",
"deal": "Event: Vanmere Summit, edition 6, May 20-21; attendance 3000; company- or foundation-run; 14 months from signature to the event\nParties: organizer contracts as a company; sponsor Quarvex Analytics; jurisdiction and governing law Delaware, USA; counsel a lawyer\nSold: tier Platinum at 150,000 USD; tier cap 1, 1 sold at this tier; category exclusivity sold yes (as a category add-on); consented lead retrieval sold yes\nDeal positions: payment invoiced after the event; late-payment interest 18% per annum; sponsor withdrawal Graduated multi-tier; one mutual cancellation section no; force-majeure remedy Flat cash refund; triggers named: fire, flood, earthquake, epidemic, pandemic, government order, terrorism, strike\nRisk: sponsor booth or staffed space yes; alcohol, physical demos or vehicles yes; venue contract requires sponsor cover yes; insurance certificate deadline and gate yes\nContext: reusable template yes; a lawyer with time to negotiate; sponsor procurement cannot release the full fee upfront yes; next edition confirmed yes; cure period 30 days; sponsor-affiliated speaker cap 2\nExclusivity: category observability platforms; excluded logging-only and APM-only tools; duration and channels both summit days - website - livestream - newsletter; breach remedy NOT STATED",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Keynote sponsor slot | 15-minute product-free talk - content reviewed by the program committee | Main stage | Talk title due March 1 | Sponsor | accepted proposal\n2. Premium booth | 6x4m - power 6kW - rigging | Expo hall | Build May 19 12:00-20:00 | Sponsor (build) and Organizer (space) | Platinum tier - rate card\n3. Consented lead retrieval | Badge scans of attendees who opt in at the booth | On-site app | Scanner accounts April 30 | Organizer | Platinum tier - rate card | ATTENDEE DATA\n4. Evening reception naming | Hosted bar - venue-operated | Reception | Menu sign-off April 15 | Organizer | accepted proposal\n5. Passes | 20 full-access | Registration | Codes issued April 1 | Organizer | Platinum tier - rate card",
"facts": "Payment schedule: the term sheet's position is staged (Staged deposit plus balance) - replacing the deal's deleted position; the page's pick is staged; rungs 100% at signing default; Staged deposit plus balance promoted; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is graduated (Graduated multi-tier) - the deal's own; the page's pick is graduated; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier promoted; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is flat (Flat cash refund) - the deal's own; the page's pick is credit; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund promoted; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is layered (Layered coverage); the page's pick is layered; rungs No sponsor-carried insurance available; $1M per occurrence / $2M aggregate CGL available; Layered coverage promoted; a requirement with no certificate deadline and gate deleted\nCure period: 30 days\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - decided; 4 Payment schedule - open (post-event invoicing replaced); 5 Sponsor withdrawal - decided; 6 Organizer cancellation - decided; 7 Force majeure - decided; 8 Liability and indemnification - for counsel; 9 Insurance - decided; 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - open (missing a breach remedy); 14 Attendee data - for counsel; 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (4 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) passed; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) passed; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) MISSING; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) MISSING; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) passed\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (7):\n[fix] post_event (payment): Invoicing after the event is deleted - it hands away the only leverage once the perks are delivered; a sponsor who cannot pay before doors open gets a staged schedule.\n[fix] excl_elements (exclusivity): Exclusivity is missing a breach remedy - draft all three enforceability elements or none.\n[check] checks (measurement): Term-sheet checks: 4 of 6 (all self-set).\n[info] fm_differs (force majeure): The deal uses Flat cash refund; the page's pick is Sponsor-elected credit or refund (a confirmed next edition, a reusable template or negotiating counsel promote the credit).\n[info] flat (force majeure): A flat cash refund is the sponsor-favorable end - only where the organizer can survive returning the whole fee.\n[info] carveouts (exclusivity): Write the venue-operated concessions and pre-existing media partnerships carve-outs into the category definition - the two most common causes of a mid-event refund dispute.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content) with a self-set cap of 2 sponsor-affiliated speakers, and reciprocal promotion-only logo licences that expire with the agreement."
}
Reply:
{
"task": "terms",
"constraint": "This document is a term sheet for review by a qualified lawyer licensed in Delaware; it is not a contract, carries no legal advice, and must not be signed by either party.",
"parties": "The organizer contracts as a company for Vanmere Summit, edition 6, with sponsor Quarvex Analytics having purchased the sole Platinum tier for USD 150,000, including a category exclusivity add-on and consented lead retrieval.",
"sections": [
{
"n": 1,
"section": "Parties and event",
"flag": "decided",
"choice": "Organizer (company), Quarvex Analytics, Delaware law",
"text": "This term sheet concerns Vanmere Summit, edition 6, May 20-21, between the Organizer, a company (name to be named), and Quarvex Analytics as Sponsor, governed by the laws of Delaware, for review before any signature."
},
{
"n": 2,
"section": "Sponsorship package and fee",
"flag": "decided",
"choice": "Platinum tier, USD 150,000",
"text": "Sponsor purchases the Platinum sponsorship tier of Vanmere Summit, edition 6, for a fee of USD 150,000, the sole Platinum slot offered and sold, entitling Sponsor to the deliverables in the attached exhibit, plus the sold category exclusivity and consented lead retrieval."
},
{
"n": 3,
"section": "Deliverables exhibit",
"flag": "decided",
"choice": "Five sourced Platinum deliverables, lead retrieval opt-in only",
"text": "Sponsor receives a reviewed keynote slot, a premium booth, consented badge-scan lead retrieval limited to attendees who opt in, evening reception naming, and 20 full-access passes; all trace to the rate card or the accepted proposal with named deadlines."
},
{
"n": 4,
"section": "Payment schedule",
"flag": "open",
"choice": "Staged deposit plus balance",
"text": "Invoicing after the event is deleted as it surrenders leverage once perks are delivered; because Sponsor's procurement cannot release the full fee upfront, a staged deposit-plus-balance schedule is proposed instead, with 18% per annum late-payment interest."
},
{
"n": 5,
"section": "Sponsor withdrawal",
"flag": "decided",
"choice": "Graduated multi-tier",
"text": "If Sponsor withdraws, refunds follow a graduated multi-tier schedule keyed to how far before the event notice is given, reflecting the 14-month lead time and this negotiated Platinum deal. Organizer cancellation is addressed in a separate, narrower clause."
},
{
"n": 6,
"section": "Organizer cancellation",
"flag": "decided",
"choice": "Separate narrower pro-rata remedy",
"text": "If the Organizer cancels the event, Sponsor receives a pro-rata refund of the fee net of expenses already incurred on Sponsor's behalf, in a clause distinct from and narrower than the sponsor-withdrawal remedy."
},
{
"n": 7,
"section": "Force majeure",
"flag": "decided",
"choice": "Flat cash refund",
"text": "On fire, flood, earthquake, epidemic, pandemic, government order, terrorism, or strike, the event may be cancelled or altered; Sponsor receives a flat cash refund of the full fee, reflecting the Organizer's ability to absorb returning it."
},
{
"n": 8,
"section": "Liability and indemnification",
"flag": "counsel",
"choice": "for counsel",
"text": "What indemnity scope and caps should apply between the Organizer and Quarvex Analytics given a staffed booth, alcohol and physical demos on-site, and Delaware liability law?"
},
{
"n": 9,
"section": "Insurance",
"flag": "decided",
"choice": "Layered coverage",
"text": "Because the sponsor stages a booth with alcohol, physical demos, and a venue contract requiring sponsor cover, layered coverage - CGL plus auto, workers' compensation, and product or liquor liability as applicable - is required, with the Organizer named as additional insured and a certificate deadline tied to signature."
},
{
"n": 10,
"section": "Code of conduct and ejection right",
"flag": "decided",
"choice": "Code of conduct binds sponsor staff, ejection right, no refund",
"text": "Sponsor's staff and representatives must comply with the event code of conduct; the Organizer may eject any individual in breach, with no refund of the sponsorship fee for the ejection."
},
{
"n": 11,
"section": "Editorial independence",
"flag": "decided",
"choice": "Organizer retains full editorial control",
"text": "Sponsor has no say over speakers, topics, or content beyond its own reviewed keynote slot, and no more than two sponsor-affiliated speakers may appear; the Organizer may refuse sponsor content without refunding the fee."
},
{
"n": 12,
"section": "Logo and brand licensing",
"flag": "decided",
"choice": "Reciprocal, promotion-only logo licence expiring with agreement",
"text": "Each party grants the other a reciprocal, non-exclusive licence to use its logo solely to promote the event and the sponsorship, expiring automatically when this agreement terminates or expires."
},
{
"n": 13,
"section": "Category exclusivity",
"flag": "open",
"choice": "Add missing breach remedy",
"text": "Observability-platform exclusivity is defined, excluding logging-only and APM-only tools, for both summit days across the website, livestream, and newsletter; a breach remedy is not yet stated and must be drafted before the category definition is enforceable."
},
{
"n": 14,
"section": "Attendee data",
"flag": "counsel",
"choice": "for counsel",
"text": "What data-protection terms should govern the Organizer's collection and handoff of opt-in badge-scan data to Quarvex Analytics, given the consented lead-retrieval benefit sold?"
},
{
"n": 15,
"section": "Confidentiality",
"flag": "open",
"choice": "Counsel's house position on confidentiality terms",
"text": "Confidentiality scope and duration are left open for counsel's standard position; the organizer should confirm whether its company template already covers mutual confidentiality or needs terms specific to this negotiated Platinum deal."
},
{
"n": 16,
"section": "Term, cure period, termination, renewal",
"flag": "decided",
"choice": "30-day cure period; next edition confirmed",
"text": "The agreement runs for the term of this sponsorship; either party may cure a breach within 30 days of notice. A next edition is confirmed, which may inform renewal discussions, though renewal terms are not otherwise addressed here."
},
{
"n": 17,
"section": "Governing law, jurisdiction, dispute resolution",
"flag": "counsel",
"choice": "for counsel",
"text": "Should Delaware courts have exclusive jurisdiction, or should the parties agree to arbitration, given the negotiated USD 150,000 fee and counsel's time to negotiate on this deal?"
},
{
"n": 18,
"section": "General provisions",
"flag": "open",
"choice": "Counsel's house template for general provisions",
"text": "Entire agreement, amendments, assignment, severability, and notices clauses are left to counsel's usual house template; the organizer should confirm whether its reusable sponsorship template already covers these or counsel should supply them."
},
{
"n": 19,
"section": "Signature block",
"flag": "counsel",
"choice": "for counsel",
"text": "Who are the authorized signatories for the organizer company and for Quarvex Analytics, and what signature format does counsel require for this negotiated Platinum deal?"
}
],
"exhibit": [
{
"perk": "Keynote sponsor slot",
"deadline": "Talk title due March 1",
"responsible": "Sponsor",
"source": "accepted proposal"
},
{
"perk": "Premium booth",
"deadline": "Build May 19 12:00-20:00",
"responsible": "Sponsor (build) and Organizer (space)",
"source": "Platinum tier - rate card"
},
{
"perk": "Consented lead retrieval",
"deadline": "Scanner accounts April 30",
"responsible": "Organizer",
"source": "Platinum tier - rate card"
},
{
"perk": "Evening reception naming",
"deadline": "Menu sign-off April 15",
"responsible": "Organizer",
"source": "accepted proposal"
},
{
"perk": "Passes",
"deadline": "Codes issued April 1",
"responsible": "Organizer",
"source": "Platinum tier - rate card"
}
],
"checks": [
{
"check": "Remedy explicitness",
"pass": true
},
{
"check": "Upstream fidelity",
"pass": true
},
{
"check": "Clause coverage",
"pass": false
},
{
"check": "Counsel target",
"pass": true
},
{
"check": "Payment protected",
"pass": false
},
{
"check": "Insurance gated",
"pass": true
}
],
"handoff": "This term sheet should be reviewed by counsel qualified in Delaware law before Quarvex Analytics or the organizer signs; it is not a contract and does not constitute legal advice.",
"caveats": [
"[fix] post_event: invoicing after the event is deleted - it surrenders leverage once perks are delivered, so procurement that cannot pay upfront gets a staged schedule instead.",
"[fix] excl_elements: category exclusivity is missing a breach remedy - draft all three enforceability elements or none.",
"[check] checks: term-sheet checks stand at 4 of 6 (all self-set)."
]
}
The page's check: kept - nothing to flag
Vanmere Summit - Platinum (company-run, a negotiated top deal) - counsel
Platinum at 150,000 USD; 5 of 5 exhibit rows may enter; payment Staged deposit plus balance; force majeure sponsor-elected credit or refund; insurance Layered coverage; 4 of 6 checks.
Input:
{
"task": "counsel",
"deal": "Event: Vanmere Summit, edition 6, May 20-21; attendance 3000; company- or foundation-run; 14 months from signature to the event\nParties: organizer contracts as a company; sponsor Quarvex Analytics; jurisdiction and governing law Delaware, USA; counsel a lawyer\nSold: tier Platinum at 150,000 USD; tier cap 1, 1 sold at this tier; category exclusivity sold yes (as a category add-on); consented lead retrieval sold yes\nDeal positions: payment invoiced after the event; late-payment interest 18% per annum; sponsor withdrawal Graduated multi-tier; one mutual cancellation section no; force-majeure remedy Flat cash refund; triggers named: fire, flood, earthquake, epidemic, pandemic, government order, terrorism, strike\nRisk: sponsor booth or staffed space yes; alcohol, physical demos or vehicles yes; venue contract requires sponsor cover yes; insurance certificate deadline and gate yes\nContext: reusable template yes; a lawyer with time to negotiate; sponsor procurement cannot release the full fee upfront yes; next edition confirmed yes; cure period 30 days; sponsor-affiliated speaker cap 2\nExclusivity: category observability platforms; excluded logging-only and APM-only tools; duration and channels both summit days - website - livestream - newsletter; breach remedy NOT STATED",
"exhibit": "Deliverables exhibit, in order (perk | specification | surface | hard deadline | responsible | source):\n1. Keynote sponsor slot | 15-minute product-free talk - content reviewed by the program committee | Main stage | Talk title due March 1 | Sponsor | accepted proposal\n2. Premium booth | 6x4m - power 6kW - rigging | Expo hall | Build May 19 12:00-20:00 | Sponsor (build) and Organizer (space) | Platinum tier - rate card\n3. Consented lead retrieval | Badge scans of attendees who opt in at the booth | On-site app | Scanner accounts April 30 | Organizer | Platinum tier - rate card | ATTENDEE DATA\n4. Evening reception naming | Hosted bar - venue-operated | Reception | Menu sign-off April 15 | Organizer | accepted proposal\n5. Passes | 20 full-access | Registration | Codes issued April 1 | Organizer | Platinum tier - rate card",
"facts": "Payment schedule: the term sheet's position is staged (Staged deposit plus balance) - replacing the deal's deleted position; the page's pick is staged; rungs 100% at signing default; Staged deposit plus balance promoted; Invoicing after the event deleted; late-payment interest and non-payment clauses always drafted\nSponsor withdrawal: the term sheet's position is graduated (Graduated multi-tier) - the deal's own; the page's pick is graduated; rungs Two-tier cutoff default; Hard no-refund available; Graduated multi-tier promoted; undated discretionary refunds deleted; organizer cancellation is a separate, narrower clause\nForce-majeure remedy: the term sheet's position is flat (Flat cash refund) - the deal's own; the page's pick is credit; rungs Pro-rata net of documented expenses default; Sponsor-elected credit or refund promoted; Flat cash refund available; No obligation to refund available; a silent clause deleted\nInsurance: the term sheet's position is layered (Layered coverage); the page's pick is layered; rungs No sponsor-carried insurance available; $1M per occurrence / $2M aggregate CGL available; Layered coverage promoted; a requirement with no certificate deadline and gate deleted\nCure period: 30 days\nSections, in order: 1 Parties and event - decided; 2 Sponsorship package and fee - decided; 3 Deliverables exhibit - decided; 4 Payment schedule - open (post-event invoicing replaced); 5 Sponsor withdrawal - decided; 6 Organizer cancellation - decided; 7 Force majeure - decided; 8 Liability and indemnification - for counsel; 9 Insurance - decided; 10 Code of conduct and ejection right - decided; 11 Editorial independence - decided; 12 Logo and brand licensing - decided; 13 Category exclusivity - open (missing a breach remedy); 14 Attendee data - for counsel; 15 Confidentiality - open (counsel's house position); 16 Term, cure period, termination, renewal - decided; 17 Governing law, jurisdiction, dispute resolution - for counsel; 18 General provisions - open (counsel's house template); 19 Signature block - for counsel\nChecks (4 of 6): Remedy explicitness (Every withdrawal, cancellation and force-majeure branch names its remedy in words) passed; Upstream fidelity (Every exhibit row traces to the rate card or the accepted proposal, with no widened cap and no unsold benefit) passed; Clause coverage (Every section is decided, open, for counsel or not applicable with a reason - none silently skipped) MISSING; Counsel target (A contracting entity exists and a named counsel will review the term sheet before anyone signs) passed; Payment protected (The fee is collected before the event, with an express late-payment interest rate) MISSING; Insurance gated (Insurance is either required with a certificate deadline and a gate, or stated as not required) passed\nSignals to record: Remedy explicitness: branches without a named remedy (self-set target: zero); Counsel-review lead time: the term sheet reaches counsel before the first sponsor is asked to sign (self-set); Payment-to-signature lag: days from countersignature to first payment (self-set)\nFindings (7):\n[fix] post_event (payment): Invoicing after the event is deleted - it hands away the only leverage once the perks are delivered; a sponsor who cannot pay before doors open gets a staged schedule.\n[fix] excl_elements (exclusivity): Exclusivity is missing a breach remedy - draft all three enforceability elements or none.\n[check] checks (measurement): Term-sheet checks: 4 of 6 (all self-set).\n[info] fm_differs (force majeure): The deal uses Flat cash refund; the page's pick is Sponsor-elected credit or refund (a confirmed next edition, a reusable template or negotiating counsel promote the credit).\n[info] flat (force majeure): A flat cash refund is the sponsor-favorable end - only where the organizer can survive returning the whole fee.\n[info] carveouts (exclusivity): Write the venue-operated concessions and pre-existing media partnerships carve-outs into the category definition - the two most common causes of a mid-event refund dispute.\n[info] defaults (clauses): Always drafted: a code-of-conduct clause binding sponsor staff with an ejection right and no refund, an editorial-independence clause (no say over speakers, topics or content) with a self-set cap of 2 sponsor-affiliated speakers, and reciprocal promotion-only logo licences that expire with the agreement."
}
Reply:
{
"task": "counsel",
"intro": "Attached is the Platinum-tier term sheet between the organizer and Quarvex Analytics for Vanmere Summit, prepared for review by a qualified lawyer in Delaware - it is not a contract and not legal advice. We need you to confirm the open positions below, answer the flagged questions on liability and attendee data, and clear it for signature.",
"fixes": [
"Drop invoicing after the event, which hands away all leverage once perks are delivered, and move to the staged deposit-plus-balance schedule proposed instead.",
"Add a breach remedy to the category exclusivity clause for observability platforms - draft all three enforceability elements or none."
],
"open": [
{
"section": "Payment schedule",
"decision": "The organizer still needs to confirm the staged deposit-plus-balance schedule that replaced the deal's invoiced-after-the-event term, and set the deposit and balance amounts and dates.",
"options": "The options are the staged schedule, fitting that Quarvex Analytics' procurement cannot release the full 150,000 USD fee upfront, or 100% at signing, trading faster collection against the sponsor's stated inability to pay the full fee before signing."
},
{
"section": "Category exclusivity",
"decision": "The organizer still needs a breach remedy for the category exclusivity sold over observability platforms, since the category definition, its exclusions and the duration and channel scope are already set.",
"options": "The option is drafting the breach remedy to complete all three enforceability elements, since exclusivity cannot stand on only two of the three required elements."
},
{
"section": "Confidentiality",
"decision": "The organizer still needs counsel's standard confidentiality position, since the deal sets none.",
"options": "The options are a mutual clause covering both the organizer's and Quarvex Analytics' business terms or a one-way clause protecting only the organizer's rate and sponsor list, trading reciprocity against narrower protection."
},
{
"section": "General provisions",
"decision": "The organizer still needs counsel's standard template for entire agreement, amendments, assignment, severability and notices, none of which the deal sets.",
"options": "The options are adopting counsel's house boilerplate as written, consistent with having a lawyer with time to negotiate, or negotiating individual provisions line by line with Quarvex Analytics, trading speed against a more tailored agreement."
}
],
"questions": [
{
"section": "Liability and indemnification",
"question": "Under Delaware law, what indemnification scope and liability caps should apply between the company organizer and Quarvex Analytics, given the booth, physical demos and alcohol at the reception?"
},
{
"section": "Attendee data",
"question": "What data-protection obligations apply to the consented badge-scan lead retrieval Quarvex Analytics purchased, given attendees opt in at the booth and the organizer administers the scanner accounts?"
},
{
"section": "Governing law, jurisdiction, dispute resolution",
"question": "With Delaware already agreed as governing law, should disputes between the organizer and Quarvex Analytics be litigated in Delaware courts or resolved by arbitration?"
},
{
"section": "Signature block",
"question": "Who are the authorized signatories for the organizer's contracting company, to be named, and for Quarvex Analytics?"
}
],
"drafted": [
"The staged deposit-plus-balance payment schedule follows the rules' shape for when a sponsor's procurement cannot release the full fee upfront, replacing the deal's deleted post-event invoicing.",
"The graduated multi-tier withdrawal ladder and the layered insurance coverage are the deal's own decided choices, fitting a long lead time, a negotiated top deal and a venue contract that calls for added cover.",
"The flat cash refund for force majeure keeps the deal's own position rather than the reusable template's usual sponsor-elected credit or refund, legitimate here because a next edition is already confirmed and the organizer can survive returning the fee.",
"The code-of-conduct, editorial-independence and logo-licensing clauses are drafted from the rules' always-drafted shapes, with a self-set cap of 2 sponsor-affiliated speakers for editorial independence."
],
"note": "Fix the payment schedule and the exclusivity breach remedy, and confirm the open confidentiality and general-provisions positions before sending this to counsel."
}
The page's check: kept - nothing to flag
The exhibit CSV for the first sample
perk,specification,surface,hard_deadline,responsible,source
Logo on event website,Sponsor page - tier-sized placement,Website,Asset due June 1 - live June 8,Organizer (placement) and Sponsor (asset),Gold tier - rate card
Logo on printed lanyard,Single colour - vector,Print,event,Sponsor,Gold tier - rate card
Booth space,3x2m - power 2kW,On-site,Setup September 9 07:00-09:00,Organizer,Gold tier - rate card
Full-access passes,4 - non-transferable,Registration,Codes issued August 15,Organizer,Gold tier - rate card
Attendee email list,Opted-in attendees,Document,Event + 7 days,Organizer,accepted proposal
Keynote slot,20 minutes,Main stage,September 9,Organizer,
Build the input yourself
Load the engine in node (global.window = global; require("./termkit.js"); require("./termreply.js")), then:
const K = TermKit, R = TermReply;
const f = K.form({ sponsor: "Acme", tier: "Gold", fee: "12000", currency: "EUR", jurisdiction: "Norway", counsel: "lawyer", lateInterest: "12",
fmRemedy: "prorata", fmTriggers: "fire, pandemic", exhibit: fs.readFileSync("exhibit.csv", "utf8") });
// f.exhibit (sourced, vagueDeadline, data), R.admitted(f), f.sections (flag), f.exclMissing
// f.recPay, f.recWd, f.recFm, f.recIns and their rungs, f.checks, f.findings
K.exhibitCSV(f) // perk, specification, surface, hard_deadline, responsible, source
const b = K.buildInput(f, "terms"); // or "counsel"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "terms");
// 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://sponsor-terms.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://sponsor-terms.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"]
// sponsor-terms.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "paste-your-token-here"; // from https://sponsor-terms.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://sponsor-terms.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
}
// SponsorTerms.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 SponsorTerms {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "paste-your-token-here"; // from https://sponsor-terms.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://sponsor-terms.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://sponsor-terms.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://sponsor-terms.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":"sponsor-terms"}' | 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": "sponsor-terms"})["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: "sponsor-terms" })).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": "sponsor-terms"}, 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", "sponsor-terms"), 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: "sponsor-terms" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "sponsor-terms"])["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 = "sponsor-terms" }))!["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": "terms", "deal": "Event: ...; Parties: ...; Sold: tier Gold at 12,000 EUR ...", "exhibit": "Deliverables exhibit, in order ...", "facts": "Payment schedule: ..."}
# - 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": "terms", "deal": "Event: ...; Parties: ...; Sold: tier Gold at 12,000 EUR ...", "exhibit": "Deliverables exhibit, in order ...", "facts": "Payment schedule: ..."}
# - 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: "terms" or "counsel", deal, exhibit, 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 sponsor-terms:<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 term sheet carries constraint, parties, sections, exhibit, checks, handoff and caveats; a counsel brief carries intro, fixes, open, questions, drafted and note. Neither is a contract or legal advice. The code below prints the headline parts of either (list items are plain strings).
KEY="sponsor-terms:terms:$(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 '.constraint // .format, .note // .parties, ((.signals // .caveats)[] | "\(.signal // .caveat): \(.text // .text)")' reply.json
jq -r '.handoff // .note // empty' reply.json # the handoff to counsel (terms)
import hashlib, time
key = "sponsor-terms:" + 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("constraint"))
print(reply.get("note") or reply.get("parties", ""))
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("handoff"):
print("handoff:", reply["handoff"])
import { createHash } from "node:crypto";
const key = `sponsor-terms:${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.constraint);
console.log(reply.note ?? reply.parties);
for (const s of reply.signals || reply.caveats || []) console.log(s.signal ?? s.caveat, "-", s.text ?? s.text);
if (reply.handoff) console.log("handoff:", reply.handoff);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "sponsor-terms:" + 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["constraint"])
fmt.Println(reply["note"], reply["parties"])
for _, x := range items {
c := x.(map[string]any)
fmt.Println(c["signal"], "-", c["status"])
}
if fix, ok := reply["handoff"].(string); ok && fix != "" {
fmt.Println("handoff:", fix)
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "sponsor-terms:" + 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("constraint"));
System.out.println(reply.path("note").asText(reply.path("parties").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("handoff").asText().isEmpty()) System.out.println("handoff: " + reply.get("handoff").asText());
require "digest"
key = "sponsor-terms:#{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["constraint"]].inspect
puts reply["note"] || reply["parties"]
(reply["signals"] || reply["caveats"] || []).each { |s| puts "#{s["signal"] || s["caveat"]} - #{s["text"] || s["text"]}" }
puts "handoff: #{reply["handoff"]}" unless reply["handoff"].to_s.empty?
$key = "sponsor-terms:" . $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["constraint"] ?? ""), "\n";
echo $reply["note"] ?? $reply["parties"] ?? "", "\n";
foreach ($reply["signals"] ?? $reply["caveats"] ?? [] as $s) echo $s["signal"] ?? $s["caveat"], " - ", $s["text"] ?? $s["text"], "\n";
if (!empty($reply["handoff"])) echo "handoff: ", $reply["handoff"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"sponsor-terms:{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!["constraint"]}");
Console.WriteLine($"{reply["note"] ?? reply["parties"]}");
foreach (var s in (reply["signals"] ?? reply["caveats"]) as JsonArray ?? new JsonArray()) Console.WriteLine($"{s!["signal"] ?? s["caveat"]} - {s["text"] ?? s["text"]}");
if (reply["handoff"] is JsonNode fix && fix.GetValue<string>() != "") Console.WriteLine("handoff: " + 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: sponsor-terms:terms:$(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": "terms", "deal": "Event: ...; Parties: ...; Sold: tier Gold at 12,000 EUR ...", "exhibit": "Deliverables exhibit, in order ...", "facts": "Payment schedule: ..."}
# - 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": "sponsor-terms:terms:" + 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": `sponsor-terms:terms:${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", "sponsor-terms:terms:"+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", "sponsor-terms:terms:" + 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" => "sponsor-terms:terms:#{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: sponsor-terms:terms:" . 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", $"sponsor-terms:terms:{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);