← Quiet Months
API
Tokens

Run Quiet Months from your own code

Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page routes what belongs elsewhere, picks the cadence against who has hours in the quiet months, the way attendees come back and the handoff posture, applies every delete rule, reads the accounts and the return numbers, and counts the gates - all free, in quietkit.js. The run writes the plan or the handoff document; the page then holds the reply to its own picks and rejects any number (quietreply.js).

Base URL and the response shape

Every endpoint lives under https://api.skillsafe.ai/v1/app-api, and every response has one shape:

{ "ok": true,  "data":  { ... } }
{ "ok": false, "error": { "code": "...", "message": "..." } }

The token is minted for this app (the guest call takes {"slug":"quiet-months"}), so no slug header is needed afterwards. Send it as Authorization: Bearer …. The run body is the input object, sent bare.

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

The task field comes first

Two lanes - brief (the between-editions plan for the organizing team) and handoff (the one-page handoff document for the community asset; it needs a standing space and its accounts listed). A missing or unknown task is answered as brief. Both lanes send the same four fields.

The input

FieldRequiredWhat
taskyesbrief or handoff. If it is missing or neither, do brief and set "task": "brief".
eventyesthe event, how often it runs, where the audience lives, the team's hours and plans, the hard date, whether a register exists, the return numbers and what else was asked about.
spaceyesthe standing space and its owner and account, what carries the audience, the member list's consent and retention, what is already proposed, and the accounts in order with their holders.
factsyesthe routing, the three menus with their picks, candidates in order and rungs, the local line, the gates, the signals and every finding tagged [fix], [check] or [info], most urgent first.
retry_notenooptional; if present, your previous reply was unusable - follow it.

The rules the model applies

House rules

The replies

brief

  1. summary - one sentence, at most 35 words: the recommended postures and the first thing to settle.
  2. routing - one object per topic the page routes out, in its order: topic (the page's), owner (the page's). [] when nothing is routed.
  3. cadence_candidates - one object per cadence candidate in the page's order: posture (dormant, pulse, light or heavy), tradeoff (one sentence: what it buys and what it costs here).
  4. cadence - the page's pick.
  5. cadence_owner - the space's named owner from the input, who is the quiet-months owner ("to be named" when none).
  6. conversion_candidates - one object per candidate in the page's order: posture (touchpoint, ladder, cohort or none), tradeoff (one sentence).
  7. conversion - the page's pick.
  8. handoff_candidates - one object per candidate in the page's order: posture (documented, successor, procedural or informal), tradeoff (one sentence).
  9. handoff - the page's pick.
  10. deleted - one object per rung the page marks deleted, cadence menu first, then conversion, then handoff, each in the page's rung order (a starved rung is not deleted - leave it out): rung (its name), reason (one sentence).
  11. local - one sentence: the page's local line (governance and stop, engagement only, or not applicable).
  12. register - one sentence: how the existing register is expressed in the quiet months, or that it must be set first.
  13. measurement - 2 to 4 short strings: carry rate beside newcomer share against a self-set band, and the gates or signals that matter here.
  14. flips - 2 to 4 objects: choice (cadence, conversion or handoff), flip (one sentence: the answer that would flip it).
  15. checks - one object per check the page lists, all of them in its order (the three gates are among them): check (the page's short name, exactly), pass (true or false, as the page says).
  16. caveats - at most 4 short strings in all: [fix] findings first in the page's order (only the first four when there are more), then [check] findings while room remains. [] when there are none of either.
{
  "task": "brief",
  "summary": "one sentence",
  "routing": [ { "topic": "Hiring and introduction requests", "owner": "the page's owner" } ],
  "cadence_candidates": [ { "posture": "dormant", "tradeoff": "one sentence" } ],
  "cadence": "dormant",
  "cadence_owner": "a name",
  "conversion_candidates": [ { "posture": "touchpoint", "tradeoff": "one sentence" } ],
  "conversion": "touchpoint",
  "handoff_candidates": [ { "posture": "documented", "tradeoff": "one sentence" } ],
  "handoff": "documented",
  "deleted": [ { "rung": "Close each edition and reopen fresh", "reason": "one sentence" } ],
  "local": "one sentence",
  "register": "one sentence",
  "measurement": [ "a self-set measure" ],
  "flips": [ { "choice": "cadence", "flip": "one sentence" } ],
  "checks": [ { "check": "Surface decided", "pass": true } ],
  "caveats": [ "a caveat" ]
}

The page holds it to its own picks: the routing, all three menus' candidates in order and picks, the quiet-months owner, every deleted rung named (and no starved one), the governance line when local groups would run under the name, and the gates; any digit is flagged, since every rate, period or count is the team's to set.

handoff

  1. title - the event's name and the words community handoff.
  2. date - exactly "to be filled in on signing".
  3. purpose - one sentence: what this page hands over and why it exists before anyone leaves.
  4. accounts - one object per account in the input's order: account (exactly), today (the holder today, exactly), after (the holder after, exactly, or "to be named" when the input has none), action (one short sentence: for an account on a personal account, moving ownership of record to an account the team holds; for any other, confirming access passes to the holder after, or naming that holder first when it is "to be named").
  5. member_list - owner (the quiet-months owner, or "to be named"), retention (when the input says a written decision exists, that it stands and is restated at this handoff, without inventing its content; otherwise that it is still to be decided by counsel, with no period named).
  6. posture - the page's handoff pick (documented, successor, procedural or informal).
  7. steps - 3 to 6 short strings: the handoff checklist at that posture.
  8. not_covered - one sentence: the team and its decision rights, and the learning log, hand over elsewhere.
  9. open - one short string per gap: each account with no holder after, each account on a personal account, and a missing retention decision. [] when there are none.
  10. note - one sentence, at most 30 words, for the organizers: what to settle before signing.
{
  "task": "handoff",
  "title": "an event community handoff",
  "date": "to be filled in on signing",
  "purpose": "one sentence",
  "accounts": [ { "account": "an account", "today": "a holder", "after": "a holder", "action": "one short sentence" } ],
  "member_list": { "owner": "a name", "retention": "one sentence" },
  "posture": "documented",
  "steps": [ "a step" ],
  "not_covered": "one sentence",
  "open": [ "a gap" ],
  "note": "one sentence"
}

The page requires every account in the input's order with no holder invented, ownership moved off personal accounts, the member list's owner and retention decision restated (never a period invented), the team and the learning log named as handed over elsewhere, every gap asked back, and no digit anywhere - the date is filled in on signing.

Worked examples - every lane, every sample

These are the page's three free samples (fictional events and people; no figures). Each input is exactly what the page sends; each reply is the saved reply the sample replays, shipped as the validating model wrote it; the last line is the page's own check. The chapters sample has no handoff document: no standing space is decided yet.

Fjordconf (the Discord is a graveyard eleven months a year) - brief

Occasional pulse; structured participation ladder; documented ownership and access transfer; 1 of 3 gates; 3 of 6 checks.

Input:

{
 "task": "brief",
 "event": "Event: Fjordconf; runs annually or less often; several editions so far\nAudience: several cities; local groups run by people outside the team no; a willing local person none named\nTeam: recurring hours in the quiet months yes; a funded moderator no; a next edition intended and compounding yes; a planned rotation of organizers before then no; a legal entity that must show who holds access no\nHard date: the next-edition announcement; register exists yes\nReturn numbers: carry rate 30%; newcomer share 62%; newcomer floor not set\nAlso asked about: people keep posting job ads in the general channel",
 "space": "Space: exists on a Discord server opened from last edition's channels; owner Mira Holt; registered to a personal account\nWhat carries the audience across the gap: an announcement list; already the audience's primary home no\nMember list: consent live; written retention decision no; dated handoff document no\nOn the table: cadence Continuous heavy; conversion No mechanism; handoff none\nAccounts, in order (account | holder today | holder after | on a personal account):\n  Discord server | Mira Holt | to be named | yes\n  Announcement list | Mira Holt | Mira Holt | no\n  Domain | Kai Brenner | NOT NAMED | no",
 "facts": "Routing: Hiring and introduction requests -> a bounded announcement round here, with the team's or sponsors' hiring sent to dev-event-hiring\nCadence: the page's pick is pulse; candidates in order pulse, dormant, light; rungs Dormant-but-open default; Occasional pulse promoted; Continuous light available; Continuous heavy starved; Close each edition and reopen fresh deleted\nConversion: the page's pick is ladder; candidates in order ladder, touchpoint; rungs Single re-engagement touchpoint default; Structured participation ladder promoted; Fed local cohort starved; No mechanism available; Auto-enroll every registrant deleted\nHandoff: the page's pick is documented; candidates in order documented, successor; rungs Documented ownership and access transfer default; Named successor with an overlap period available; Fully proceduralized transition starved; Informal handoff available; Successor as a second admin, personal account still owner deleted\nLocal groups: engagement only\nChecks (3 of 6): Surface decided (A standing space already exists - whether it should is decided elsewhere) passed; Named owner (A named owner for the quiet months, with recurring hours or a posture of dormancy by decision) passed; List integrity (The member list has a named owner and a written retention decision on the day the gap starts) MISSING; Handoff readiness (A dated access document names a living holder for every account, none left on a departing personal account) MISSING; Proposals survive (Every posture already proposed survives its delete rules) MISSING; Register (A register exists, so the off-season voice is its expression, not a new voice) passed\nSignals to record: Carry rate beside newcomer share, against a ratio band set before the gap; Cadence kept: posts planned against posts made - two missed cycles is a demotion signal; List integrity and handoff readiness, checked on a schedule rather than when someone resigns; Ladder movement: how many members moved a step, as a count\nFindings (15):\n[fix] no_retention (handoff): No written retention decision for the member list - it outlives its edition; name its owner and route the retention decision to counsel, restated at every handoff.\n[fix] personal_owner (handoff): Discord server sits on a personal account - move ownership of record to an account the team holds before anyone leaves.\n[fix] proposed_cadence_starved (cadence): The proposed continuous heavy cadence is starved - it needs the space to be the audience's primary home already, a funded moderator roster, and a compounding event, all three.\n[check] no_holder_after (handoff): No holder after the handoff for Domain - every account needs a named living holder.\n[check] no_band (measurement): Carry rate and newcomer share are measured - set the ratio band between them yourself, before the gap; either number alone rewards the wrong room.\n[check] gates (measurement): Gates: 1 of 3 (named owner, list integrity, handoff readiness) - every threshold self-set.\n[info] routed (scope): Routed out: hiring and introduction requests (a bounded announcement round here, with the team's or sponsors' hiring sent to dev-event-hiring).\n[info] reopen_deleted (cadence): Closing the space each edition and reopening fresh is deleted - it looks like cheap dormancy and discards the member list and archive.\n[info] pulse (cadence): Occasional pulse: a digest or spotlight on a rhythm Mira Holt can actually hold, nothing else.\n[info] autoenroll_deleted (conversion): Auto-enrolling every registrant as a member is deleted - it manufactures the membership number and spends a ticketing consent on a purpose it never granted.\n[info] ladder (conversion): The participation ladder: attendee, regular, contributor - each step with a stated way in and reward, and every step above the first climbable between editions; ask consent before naming anyone publicly.\n[info] secondadmin_deleted (handoff): Adding the successor as a second admin while a departing organizer's personal account stays owner of record is deleted - unrecoverable the day that account closes.\n[info] three_artifacts (handoff): A handover moves three artifacts: the team and its decision rights go to event-team-structure, the learning log to event-continuous-improvement, and only the community asset is written here.\n[info] engagement (local): Local groups stay engagement only while the team still owns the sub-space, thread or list segment they live in.\n[info] recruiting (recruiting): Give recruiting requests one bounded outlet - a short announcement round at each gathering and one pinned, dated thread per edition cycle - never the open floor."
}

Reply:

{
 "task": "brief",
 "summary": "The plan recommends an occasional pulse cadence, a participation ladder, and a documented handoff, with the member list's retention decision the first thing to settle.",
 "routing": [
  {
   "topic": "Hiring and introduction requests",
   "owner": "dev-event-hiring"
  }
 ],
 "cadence_candidates": [
  {
   "posture": "pulse",
   "tradeoff": "Buys a dated digest or spotlight on a rhythm Mira Holt can actually hold with the recurring hours already in place, at the cost of reading as a demotion signal if two cycles are missed."
  },
  {
   "posture": "dormant",
   "tradeoff": "Buys the baseline of paused programming, a kept archive, member list, and sub-channels, and one dated quiet notice, at no ongoing cost, but leaves the team's recurring hours unused while the event keeps compounding."
  },
  {
   "posture": "light",
   "tradeoff": "Buys continuous light programming for a compounding event, at the cost of committing beyond what one named owner with recurring hours, rather than a funded roster, can sustain."
  }
 ],
 "cadence": "pulse",
 "cadence_owner": "Mira Holt",
 "conversion_candidates": [
  {
   "posture": "ladder",
   "tradeoff": "Buys a stepped path from attendee to regular to contributor that keeps a compounding audience moving, at the cost of tracking each step and asking consent before naming anyone publicly."
  },
  {
   "posture": "touchpoint",
   "tradeoff": "Buys one simple re-engagement contact timed to the next opening with little ongoing effort, at the cost of no stepped path for members who want to go further between editions."
  }
 ],
 "conversion": "ladder",
 "handoff_candidates": [
  {
   "posture": "documented",
   "tradeoff": "Buys a one-page record of every account and the member list's retention decision, at the cost of no overlap period for whoever is named to hold the role after."
  },
  {
   "posture": "successor",
   "tradeoff": "Buys a named successor with an overlap period to learn the role before anyone leaves, at the cost of needing a successor already named instead of just a documented transfer."
  }
 ],
 "handoff": "documented",
 "deleted": [
  {
   "rung": "Close each edition and reopen fresh",
   "reason": "It discards the member list and archive the next edition needs, though it looks like cheap dormancy."
  },
  {
   "rung": "Auto-enroll every registrant",
   "reason": "It spends a ticketing consent on a purpose it never granted and manufactures the membership number."
  },
  {
   "rung": "Successor as a second admin, personal account still owner",
   "reason": "The departing organizer's personal account would stay owner of record, unrecoverable the day that account closes."
  }
 ],
 "local": "Local groups here stay engagement, since the team still owns the sub-space, thread, or list segment they live in.",
 "register": "The quiet months communications continue the event's existing register as their voice, rather than inventing a new one for the gap.",
 "measurement": [
  "Carry rate is read beside newcomer share, against a ratio band the team sets before the gap, never either number alone.",
  "Cadence kept: posts planned against posts made, with two missed cycles read as a demotion signal.",
  "List integrity and handoff readiness are checked on a schedule, not only when someone resigns, and both are currently missing gates.",
  "Ladder movement is counted as how many members moved a step each gap."
 ],
 "flips": [
  {
   "choice": "cadence",
   "flip": "If nobody retained recurring hours in the quiet months, the cadence would flip from occasional pulse down to dormant-but-open."
  },
  {
   "choice": "conversion",
   "flip": "If the event stopped compounding or nothing carried the audience between editions, conversion would flip down to a single re-engagement touchpoint."
  },
  {
   "choice": "handoff",
   "flip": "If a departing organizer's last month came into view while the event still compounds, handoff would flip to naming a successor with an overlap period."
  }
 ],
 "checks": [
  {
   "check": "Surface decided",
   "pass": true
  },
  {
   "check": "Named owner",
   "pass": true
  },
  {
   "check": "List integrity",
   "pass": false
  },
  {
   "check": "Handoff readiness",
   "pass": false
  },
  {
   "check": "Proposals survive",
   "pass": false
  },
  {
   "check": "Register",
   "pass": true
  }
 ],
 "caveats": [
  "No written retention decision exists for the member list, which outlives its edition; name its owner and route retention to counsel.",
  "The Discord server sits on a personal account; move ownership of record to an account the team holds before anyone leaves.",
  "The proposed continuous heavy cadence is starved - it needs the space to already be the audience's primary home, a funded moderator roster, and a compounding event, all three.",
  "No holder after the handoff is named for the domain; every account needs a named living holder."
 ]
}

The page's check: kept - nothing to flag

Fjordconf (the Discord is a graveyard eleven months a year) - handoff

Occasional pulse; structured participation ladder; documented ownership and access transfer; 1 of 3 gates; 3 of 6 checks.

Input:

{
 "task": "handoff",
 "event": "Event: Fjordconf; runs annually or less often; several editions so far\nAudience: several cities; local groups run by people outside the team no; a willing local person none named\nTeam: recurring hours in the quiet months yes; a funded moderator no; a next edition intended and compounding yes; a planned rotation of organizers before then no; a legal entity that must show who holds access no\nHard date: the next-edition announcement; register exists yes\nReturn numbers: carry rate 30%; newcomer share 62%; newcomer floor not set\nAlso asked about: people keep posting job ads in the general channel",
 "space": "Space: exists on a Discord server opened from last edition's channels; owner Mira Holt; registered to a personal account\nWhat carries the audience across the gap: an announcement list; already the audience's primary home no\nMember list: consent live; written retention decision no; dated handoff document no\nOn the table: cadence Continuous heavy; conversion No mechanism; handoff none\nAccounts, in order (account | holder today | holder after | on a personal account):\n  Discord server | Mira Holt | to be named | yes\n  Announcement list | Mira Holt | Mira Holt | no\n  Domain | Kai Brenner | NOT NAMED | no",
 "facts": "Routing: Hiring and introduction requests -> a bounded announcement round here, with the team's or sponsors' hiring sent to dev-event-hiring\nCadence: the page's pick is pulse; candidates in order pulse, dormant, light; rungs Dormant-but-open default; Occasional pulse promoted; Continuous light available; Continuous heavy starved; Close each edition and reopen fresh deleted\nConversion: the page's pick is ladder; candidates in order ladder, touchpoint; rungs Single re-engagement touchpoint default; Structured participation ladder promoted; Fed local cohort starved; No mechanism available; Auto-enroll every registrant deleted\nHandoff: the page's pick is documented; candidates in order documented, successor; rungs Documented ownership and access transfer default; Named successor with an overlap period available; Fully proceduralized transition starved; Informal handoff available; Successor as a second admin, personal account still owner deleted\nLocal groups: engagement only\nChecks (3 of 6): Surface decided (A standing space already exists - whether it should is decided elsewhere) passed; Named owner (A named owner for the quiet months, with recurring hours or a posture of dormancy by decision) passed; List integrity (The member list has a named owner and a written retention decision on the day the gap starts) MISSING; Handoff readiness (A dated access document names a living holder for every account, none left on a departing personal account) MISSING; Proposals survive (Every posture already proposed survives its delete rules) MISSING; Register (A register exists, so the off-season voice is its expression, not a new voice) passed\nSignals to record: Carry rate beside newcomer share, against a ratio band set before the gap; Cadence kept: posts planned against posts made - two missed cycles is a demotion signal; List integrity and handoff readiness, checked on a schedule rather than when someone resigns; Ladder movement: how many members moved a step, as a count\nFindings (15):\n[fix] no_retention (handoff): No written retention decision for the member list - it outlives its edition; name its owner and route the retention decision to counsel, restated at every handoff.\n[fix] personal_owner (handoff): Discord server sits on a personal account - move ownership of record to an account the team holds before anyone leaves.\n[fix] proposed_cadence_starved (cadence): The proposed continuous heavy cadence is starved - it needs the space to be the audience's primary home already, a funded moderator roster, and a compounding event, all three.\n[check] no_holder_after (handoff): No holder after the handoff for Domain - every account needs a named living holder.\n[check] no_band (measurement): Carry rate and newcomer share are measured - set the ratio band between them yourself, before the gap; either number alone rewards the wrong room.\n[check] gates (measurement): Gates: 1 of 3 (named owner, list integrity, handoff readiness) - every threshold self-set.\n[info] routed (scope): Routed out: hiring and introduction requests (a bounded announcement round here, with the team's or sponsors' hiring sent to dev-event-hiring).\n[info] reopen_deleted (cadence): Closing the space each edition and reopening fresh is deleted - it looks like cheap dormancy and discards the member list and archive.\n[info] pulse (cadence): Occasional pulse: a digest or spotlight on a rhythm Mira Holt can actually hold, nothing else.\n[info] autoenroll_deleted (conversion): Auto-enrolling every registrant as a member is deleted - it manufactures the membership number and spends a ticketing consent on a purpose it never granted.\n[info] ladder (conversion): The participation ladder: attendee, regular, contributor - each step with a stated way in and reward, and every step above the first climbable between editions; ask consent before naming anyone publicly.\n[info] secondadmin_deleted (handoff): Adding the successor as a second admin while a departing organizer's personal account stays owner of record is deleted - unrecoverable the day that account closes.\n[info] three_artifacts (handoff): A handover moves three artifacts: the team and its decision rights go to event-team-structure, the learning log to event-continuous-improvement, and only the community asset is written here.\n[info] engagement (local): Local groups stay engagement only while the team still owns the sub-space, thread or list segment they live in.\n[info] recruiting (recruiting): Give recruiting requests one bounded outlet - a short announcement round at each gathering and one pinned, dated thread per edition cycle - never the open floor."
}

Reply:

{
 "task": "handoff",
 "title": "Fjordconf community handoff",
 "date": "to be filled in on signing",
 "purpose": "This page records today's and tomorrow's holder for the Discord server, announcement list, domain, and member list, so Fjordconf's community survives when an organizer leaves, settled before that departure rather than after.",
 "accounts": [
  {
   "account": "Discord server",
   "today": "Mira Holt",
   "after": "to be named",
   "action": "Move ownership of record off Mira Holt's personal account to an account the team holds."
  },
  {
   "account": "Announcement list",
   "today": "Mira Holt",
   "after": "Mira Holt",
   "action": "Confirm access passes to Mira Holt."
  },
  {
   "account": "Domain",
   "today": "Kai Brenner",
   "after": "to be named",
   "action": "Name a holder for the domain before confirming access passes from Kai Brenner."
  }
 ],
 "member_list": {
  "owner": "Mira Holt",
  "retention": "No written retention decision exists yet; it is still to be decided by counsel, with no period named."
 },
 "posture": "documented",
 "steps": [
  "List every account on one page: the Discord server, the announcement list, and the domain.",
  "Record who holds each account today and who will hold it after.",
  "Move the Discord server off Mira Holt's personal account to one the team holds.",
  "Name who will hold the domain after Kai Brenner.",
  "Name the member list's owner and route its retention decision to counsel.",
  "Date the page when everyone signs."
 ],
 "not_covered": "The organizing team and its decision rights go to event-team-structure, and the learning log goes to event-continuous-improvement; only the community asset is handed over here.",
 "open": [
  "No named holder after the handoff for the Discord server.",
  "No named holder after the handoff for the domain.",
  "The Discord server sits on a personal account.",
  "No written retention decision for the member list."
 ],
 "note": "Before signing, name who holds the Discord server and domain after handoff, move the Discord server off a personal account, and route the member list's retention decision to counsel."
}

The page's check: kept - nothing to flag

Lakeshore Go Day (the founder owns the Slack and is leaving) - brief

Dormant-but-open; single re-engagement touchpoint; fully proceduralized transition; 2 of 3 gates; 4 of 6 checks.

Input:

{
 "task": "brief",
 "event": "Event: Lakeshore Go Day; runs annually or less often; several editions so far\nAudience: one city that does not travel; local groups run by people outside the team no; a willing local person none named\nTeam: recurring hours in the quiet months no; a funded moderator no; a next edition intended and compounding yes; a planned rotation of organizers before then no; a legal entity that must show who holds access yes\nHard date: a departing organizer's last month; register exists yes\nReturn numbers: carry rate not measured; newcomer share not measured; newcomer floor not set\nAlso asked about: nothing else",
 "space": "Space: exists on a Slack workspace; owner Dana Price; registered to a personal account\nWhat carries the audience across the gap: nothing; already the audience's primary home no\nMember list: consent live; written retention decision yes; dated handoff document no\nOn the table: cadence none; conversion No mechanism; handoff Successor as a second admin, personal account still owner\nAccounts, in order (account | holder today | holder after | on a personal account):\n  Slack workspace | Dana Price | Joel Varnholt | yes\n  Mailing list | Dana Price | Joel Varnholt | no\n  Ticketing account | Dana Price | NOT NAMED | no",
 "facts": "Routing: nothing to route\nCadence: the page's pick is dormant; candidates in order dormant, pulse, light; rungs Dormant-but-open default; Occasional pulse available; Continuous light promoted; Continuous heavy deleted; Close each edition and reopen fresh deleted\nConversion: the page's pick is touchpoint; candidates in order touchpoint, ladder; rungs Single re-engagement touchpoint default; Structured participation ladder available; Fed local cohort deleted; No mechanism available; Auto-enroll every registrant deleted\nHandoff: the page's pick is procedural; candidates in order procedural, documented, successor; rungs Documented ownership and access transfer default; Named successor with an overlap period promoted; Fully proceduralized transition promoted; Informal handoff available; Successor as a second admin, personal account still owner deleted\nLocal groups: not applicable - one city\nChecks (4 of 6): Surface decided (A standing space already exists - whether it should is decided elsewhere) passed; Named owner (A named owner for the quiet months, with recurring hours or a posture of dormancy by decision) passed; List integrity (The member list has a named owner and a written retention decision on the day the gap starts) passed; Handoff readiness (A dated access document names a living holder for every account, none left on a departing personal account) MISSING; Proposals survive (Every posture already proposed survives its delete rules) MISSING; Register (A register exists, so the off-season voice is its expression, not a new voice) passed\nSignals to record: Carry rate beside newcomer share, against a ratio band set before the gap; Cadence kept: posts planned against posts made - two missed cycles is a demotion signal; List integrity and handoff readiness, checked on a schedule rather than when someone resigns\nFindings (15):\n[fix] proposed_handoff_deleted (handoff): The proposed second-admin handoff is deleted - the departing personal account stays owner of record and the space is unrecoverable the day it closes.\n[fix] personal_owner (handoff): Slack workspace sits on a personal account - move ownership of record to an account the team holds before anyone leaves.\n[check] no_capacity (cadence): Nothing carries the audience and the event compounds, so continuous light is promoted - but nobody has recurring hours in the quiet months; the posture stays dormant rather than programming a gap nobody can hold.\n[check] no_holder_after (handoff): No holder after the handoff for Ticketing account - every account needs a named living holder.\n[check] gates (measurement): Gates: 2 of 3 (named owner, list integrity, handoff readiness) - every threshold self-set.\n[info] heavy_deleted (cadence): Continuous heavy is deleted: nobody is on duty in the gap, and an unmoderated standing space is a conduct obligation with no responder.\n[info] reopen_deleted (cadence): Closing the space each edition and reopening fresh is deleted - it looks like cheap dormancy and discards the member list and archive.\n[info] dormant (cadence): Dormant-but-open: freeze programming, keep the archive and member list, keep any per-project sub-channels, and post one dated notice that the space is quiet until next build-up.\n[info] autoenroll_deleted (conversion): Auto-enrolling every registrant as a member is deleted - it manufactures the membership number and spends a ticketing consent on a purpose it never granted.\n[info] cohort_deleted (conversion): A fed local cohort is deleted: one city that does not travel is just the audience, and animating it is the cadence's job.\n[info] touchpoint (conversion): One deliberate contact to last edition's attendees, timed to the next edition's opening, through the attendee list's existing consent.\n[info] secondadmin_deleted (handoff): Adding the successor as a second admin while a departing organizer's personal account stays owner of record is deleted - unrecoverable the day that account closes.\n[info] procedural (handoff): A legal entity stands behind the event and must show who holds what - the transition is fully proceduralized.\n[info] three_artifacts (handoff): A handover moves three artifacts: the team and its decision rights go to event-team-structure, the learning log to event-continuous-improvement, and only the community asset is written here.\n[info] no_carry (measurement): Carry rate - the share of one edition's attendees who register for the next - is this plan's outcome number; collect it, and a first-time-here field for newcomer share."
}

Reply:

{
 "task": "brief",
 "summary": "Recommends staying dormant-but-open in the gap, a single re-engagement touchpoint, and a fully proceduralized handoff, with moving the Slack workspace off a personal account the first thing to settle.",
 "routing": [],
 "cadence_candidates": [
  {
   "posture": "dormant",
   "tradeoff": "Buys the baseline of paused programming, a kept archive, member list, and sub-channels, and one dated quiet notice, at no ongoing cost, which fits a team with nobody scheduled for recurring hours in the gap."
  },
  {
   "posture": "pulse",
   "tradeoff": "Buys a dated digest or spotlight rhythm, at the cost of needing someone able to actually hold it, which the team does not currently have the hours for."
  },
  {
   "posture": "light",
   "tradeoff": "Buys continuous light programming for a compounding event that nothing else carries, at the cost of recurring hours the team does not have in the gap."
  }
 ],
 "cadence": "dormant",
 "cadence_owner": "Dana Price",
 "conversion_candidates": [
  {
   "posture": "touchpoint",
   "tradeoff": "Buys one deliberate re-engagement contact timed to the next opening through the attendee list's existing consent, at the cost of no stepped path for members who want to go further."
  },
  {
   "posture": "ladder",
   "tradeoff": "Buys a stepped path from attendee to regular to contributor for members who want to go further, at the cost of structure to maintain when nothing currently carries the audience between editions."
  }
 ],
 "conversion": "touchpoint",
 "handoff_candidates": [
  {
   "posture": "procedural",
   "tradeoff": "Buys a playbook, access checklist, moderation-role transfer, and signed-off retention that shows who holds what, at the cost of more upfront process than a one-page document, which the legal entity behind this event needs."
  },
  {
   "posture": "documented",
   "tradeoff": "Buys a one-page record of every account and the member list's retention decision, at the cost of no playbook or overlap period if the legal entity needs more formal process."
  },
  {
   "posture": "successor",
   "tradeoff": "Buys a named successor with an overlap period to learn the role before anyone leaves, at the cost of needing that successor already named, which is not yet the case here."
  }
 ],
 "handoff": "procedural",
 "deleted": [
  {
   "rung": "Continuous heavy",
   "reason": "Nobody is on duty in the gap, and an unmoderated standing space leaves a conduct obligation with no responder."
  },
  {
   "rung": "Close each edition and reopen fresh",
   "reason": "It discards the member list and archive the next edition needs, though it looks like cheap dormancy."
  },
  {
   "rung": "Fed local cohort",
   "reason": "One city that does not travel is just the audience, and animating it is the cadence's job, not conversion's."
  },
  {
   "rung": "Auto-enroll every registrant",
   "reason": "It spends a ticketing consent on a purpose it never granted and manufactures the membership number."
  },
  {
   "rung": "Successor as a second admin, personal account still owner",
   "reason": "The departing organizer's personal account would stay owner of record, unrecoverable the day that account closes."
  }
 ],
 "local": "Local groups do not apply here, since this is one city that does not travel rather than a multi-city audience.",
 "register": "The quiet months communications continue the event's existing register as their voice, rather than inventing a new one for the gap.",
 "measurement": [
  "Carry rate, the share of attendees who return for the next edition, is not yet collected; start measuring it against a self-set band.",
  "Newcomer share is not yet collected either; add a first-time-here field so it can be read beside carry rate.",
  "Cadence kept: posts planned against posts made, with two missed cycles read as a demotion signal.",
  "List integrity passed, but handoff readiness and whether every proposal survives its delete rules are still missing gates."
 ],
 "flips": [
  {
   "choice": "cadence",
   "flip": "If the team gained recurring hours someone could actually hold in the quiet months, the cadence would flip from dormant to continuous light."
  },
  {
   "choice": "conversion",
   "flip": "If something started carrying the audience between editions, conversion could move from a single touchpoint to a structured participation ladder."
  },
  {
   "choice": "handoff",
   "flip": "If no legal entity required showing who holds what, the handoff could rest on the simpler documented ownership and access transfer instead of the full procedural transition."
  }
 ],
 "checks": [
  {
   "check": "Surface decided",
   "pass": true
  },
  {
   "check": "Named owner",
   "pass": true
  },
  {
   "check": "List integrity",
   "pass": true
  },
  {
   "check": "Handoff readiness",
   "pass": false
  },
  {
   "check": "Proposals survive",
   "pass": false
  },
  {
   "check": "Register",
   "pass": true
  }
 ],
 "caveats": [
  "The proposed second-admin handoff is deleted - the departing personal account would stay owner of record, unrecoverable the day it closes.",
  "The Slack workspace sits on a personal account; move ownership of record to an account the team holds before anyone leaves.",
  "Nothing carries the audience and the event compounds, so continuous light is promoted, but nobody has recurring hours in the quiet months; the posture stays dormant.",
  "No holder after the handoff is named for the ticketing account; every account needs a named living holder."
 ]
}

The page's check: kept - nothing to flag

Lakeshore Go Day (the founder owns the Slack and is leaving) - handoff

Dormant-but-open; single re-engagement touchpoint; fully proceduralized transition; 2 of 3 gates; 4 of 6 checks.

Input:

{
 "task": "handoff",
 "event": "Event: Lakeshore Go Day; runs annually or less often; several editions so far\nAudience: one city that does not travel; local groups run by people outside the team no; a willing local person none named\nTeam: recurring hours in the quiet months no; a funded moderator no; a next edition intended and compounding yes; a planned rotation of organizers before then no; a legal entity that must show who holds access yes\nHard date: a departing organizer's last month; register exists yes\nReturn numbers: carry rate not measured; newcomer share not measured; newcomer floor not set\nAlso asked about: nothing else",
 "space": "Space: exists on a Slack workspace; owner Dana Price; registered to a personal account\nWhat carries the audience across the gap: nothing; already the audience's primary home no\nMember list: consent live; written retention decision yes; dated handoff document no\nOn the table: cadence none; conversion No mechanism; handoff Successor as a second admin, personal account still owner\nAccounts, in order (account | holder today | holder after | on a personal account):\n  Slack workspace | Dana Price | Joel Varnholt | yes\n  Mailing list | Dana Price | Joel Varnholt | no\n  Ticketing account | Dana Price | NOT NAMED | no",
 "facts": "Routing: nothing to route\nCadence: the page's pick is dormant; candidates in order dormant, pulse, light; rungs Dormant-but-open default; Occasional pulse available; Continuous light promoted; Continuous heavy deleted; Close each edition and reopen fresh deleted\nConversion: the page's pick is touchpoint; candidates in order touchpoint, ladder; rungs Single re-engagement touchpoint default; Structured participation ladder available; Fed local cohort deleted; No mechanism available; Auto-enroll every registrant deleted\nHandoff: the page's pick is procedural; candidates in order procedural, documented, successor; rungs Documented ownership and access transfer default; Named successor with an overlap period promoted; Fully proceduralized transition promoted; Informal handoff available; Successor as a second admin, personal account still owner deleted\nLocal groups: not applicable - one city\nChecks (4 of 6): Surface decided (A standing space already exists - whether it should is decided elsewhere) passed; Named owner (A named owner for the quiet months, with recurring hours or a posture of dormancy by decision) passed; List integrity (The member list has a named owner and a written retention decision on the day the gap starts) passed; Handoff readiness (A dated access document names a living holder for every account, none left on a departing personal account) MISSING; Proposals survive (Every posture already proposed survives its delete rules) MISSING; Register (A register exists, so the off-season voice is its expression, not a new voice) passed\nSignals to record: Carry rate beside newcomer share, against a ratio band set before the gap; Cadence kept: posts planned against posts made - two missed cycles is a demotion signal; List integrity and handoff readiness, checked on a schedule rather than when someone resigns\nFindings (15):\n[fix] proposed_handoff_deleted (handoff): The proposed second-admin handoff is deleted - the departing personal account stays owner of record and the space is unrecoverable the day it closes.\n[fix] personal_owner (handoff): Slack workspace sits on a personal account - move ownership of record to an account the team holds before anyone leaves.\n[check] no_capacity (cadence): Nothing carries the audience and the event compounds, so continuous light is promoted - but nobody has recurring hours in the quiet months; the posture stays dormant rather than programming a gap nobody can hold.\n[check] no_holder_after (handoff): No holder after the handoff for Ticketing account - every account needs a named living holder.\n[check] gates (measurement): Gates: 2 of 3 (named owner, list integrity, handoff readiness) - every threshold self-set.\n[info] heavy_deleted (cadence): Continuous heavy is deleted: nobody is on duty in the gap, and an unmoderated standing space is a conduct obligation with no responder.\n[info] reopen_deleted (cadence): Closing the space each edition and reopening fresh is deleted - it looks like cheap dormancy and discards the member list and archive.\n[info] dormant (cadence): Dormant-but-open: freeze programming, keep the archive and member list, keep any per-project sub-channels, and post one dated notice that the space is quiet until next build-up.\n[info] autoenroll_deleted (conversion): Auto-enrolling every registrant as a member is deleted - it manufactures the membership number and spends a ticketing consent on a purpose it never granted.\n[info] cohort_deleted (conversion): A fed local cohort is deleted: one city that does not travel is just the audience, and animating it is the cadence's job.\n[info] touchpoint (conversion): One deliberate contact to last edition's attendees, timed to the next edition's opening, through the attendee list's existing consent.\n[info] secondadmin_deleted (handoff): Adding the successor as a second admin while a departing organizer's personal account stays owner of record is deleted - unrecoverable the day that account closes.\n[info] procedural (handoff): A legal entity stands behind the event and must show who holds what - the transition is fully proceduralized.\n[info] three_artifacts (handoff): A handover moves three artifacts: the team and its decision rights go to event-team-structure, the learning log to event-continuous-improvement, and only the community asset is written here.\n[info] no_carry (measurement): Carry rate - the share of one edition's attendees who register for the next - is this plan's outcome number; collect it, and a first-time-here field for newcomer share."
}

Reply:

{
 "task": "handoff",
 "title": "Lakeshore Go Day community handoff",
 "date": "to be filled in on signing",
 "purpose": "This page records today's and tomorrow's holder for the Slack workspace, mailing list, ticketing account, and member list, so Lakeshore Go Day's community survives Dana Price's departure, settled before that departure rather than after.",
 "accounts": [
  {
   "account": "Slack workspace",
   "today": "Dana Price",
   "after": "Joel Varnholt",
   "action": "Move ownership of record off Dana Price's personal account to an account the team holds."
  },
  {
   "account": "Mailing list",
   "today": "Dana Price",
   "after": "Joel Varnholt",
   "action": "Confirm access passes to Joel Varnholt."
  },
  {
   "account": "Ticketing account",
   "today": "Dana Price",
   "after": "to be named",
   "action": "Name a holder for the ticketing account before confirming access passes from Dana Price."
  }
 ],
 "member_list": {
  "owner": "Dana Price",
  "retention": "A written retention decision already exists and stands, restated here at this handoff without adding to what it says."
 },
 "posture": "procedural",
 "steps": [
  "List every account on one page: the Slack workspace, the mailing list, and the ticketing account.",
  "Record who holds each account today and who holds it after.",
  "Move the Slack workspace off Dana Price's personal account to one the team or legal entity holds.",
  "Name who will hold the ticketing account, which has no name yet.",
  "Restate the member list's existing written retention decision here.",
  "Have the legal entity confirm every holder, then date the page when everyone signs."
 ],
 "not_covered": "The organizing team and its decision rights go to event-team-structure, and the learning log goes to event-continuous-improvement; only the community asset is handed over here.",
 "open": [
  "No named holder after the handoff for the ticketing account.",
  "The Slack workspace sits on a personal account."
 ],
 "note": "Before signing, name who holds the ticketing account after handoff, and move the Slack workspace off Dana Price's personal account to one the team or legal entity holds."
}

The page's check: kept - nothing to flag

Open Maps Camp (other cities want local versions) - brief

Dormant-but-open; fed local cohort; fully proceduralized transition; 0 of 3 gates; 0 of 6 checks.

Input:

{
 "task": "brief",
 "event": "Event: Open Maps Camp; runs annually or less often; several editions so far\nAudience: several cities; local groups run by people outside the team yes; a willing local person Tarun Velkai in Leeds\nTeam: recurring hours in the quiet months no; a funded moderator no; a next edition intended and compounding yes; a planned rotation of organizers before then yes; a legal entity that must show who holds access no\nHard date: no hard date; register exists no\nReturn numbers: carry rate 50%; newcomer share 28%; newcomer floor set by the team\nAlso asked about: people in other cities want to run a local version under our name",
 "space": "Space: no standing space decided; owner nobody named; registered to an organization's account\nWhat carries the audience across the gap: an archive; already the audience's primary home no\nMember list: consent unknown; written retention decision no; dated handoff document no\nOn the table: cadence Close each edition and reopen fresh; conversion Auto-enroll every registrant; handoff none\nAccounts, in order (account | holder today | holder after | on a personal account):\n  none listed",
 "facts": "Routing: Local chapters run by others under the event's name -> event-team-structure (peer network of independent communities)\nCadence: the page's pick is dormant; candidates in order dormant, pulse, light; rungs Dormant-but-open default; Occasional pulse available; Continuous light available; Continuous heavy deleted; Close each edition and reopen fresh deleted\nConversion: the page's pick is cohort; candidates in order cohort, touchpoint, ladder; rungs Single re-engagement touchpoint default; Structured participation ladder promoted; Fed local cohort promoted; No mechanism available; Auto-enroll every registrant deleted\nHandoff: the page's pick is procedural; candidates in order procedural, documented, successor; rungs Documented ownership and access transfer default; Named successor with an overlap period available; Fully proceduralized transition promoted; Informal handoff available; Successor as a second admin, personal account still owner deleted\nLocal groups: governance - outside this plan\nChecks (0 of 6): Surface decided (A standing space already exists - whether it should is decided elsewhere) MISSING; Named owner (A named owner for the quiet months, with recurring hours or a posture of dormancy by decision) MISSING; List integrity (The member list has a named owner and a written retention decision on the day the gap starts) MISSING; Handoff readiness (A dated access document names a living holder for every account, none left on a departing personal account) MISSING; Proposals survive (Every posture already proposed survives its delete rules) MISSING; Register (A register exists, so the off-season voice is its expression, not a new voice) MISSING\nSignals to record: Carry rate beside newcomer share, against a ratio band set before the gap; Cadence kept: posts planned against posts made - two missed cycles is a demotion signal; List integrity and handoff readiness, checked on a schedule rather than when someone resigns\nFindings (19):\n[fix] no_surface (scope): No standing space is decided - whether one belongs in the team's property set is event-portfolio-strategy's call; route there first and run it once the answer is yes.\n[fix] proposed_cadence_deleted (cadence): The proposed close-and-reopen is deleted - it discards the member list and archive the next edition needs.\n[fix] proposed_conversion_deleted (conversion): The proposed auto-enrollment is deleted - it spends a ticketing consent on a purpose it never granted.\n[fix] no_owner (cadence): No named owner for the quiet months - a cadence with nobody named reads as continuous in the plan and abandoned by month three; the posture is dormant by decision until someone is named.\n[fix] no_retention (handoff): No written retention decision for the member list - it outlives its edition; name its owner and route the retention decision to counsel, restated at every handoff.\n[fix] governance (local): The test: does anyone outside the organizing team run an event under this name as a result? Here yes - that is governance, event-team-structure's, not engagement; say so and stop.\n[check] no_register (scope): No register yet - route to event-cultural-identity first, and label anything written here as provisional; never invent a quieter off-season voice.\n[check] consent (conversion): The member list's consent is unknown - every rung reaches people through the attendee list, whose consent the email-sequence plan owns; confirm it before any contact.\n[check] no_inventory (handoff): List every account, admin role, invite link, domain and list, with who holds it today and after.\n[check] closing_in (measurement): Newcomer share is under the floor you set - a rising carry rate beside it reads as success and is a room closing in on its regulars.\n[check] gates (measurement): Gates: 0 of 3 (named owner, list integrity, handoff readiness) - every threshold self-set.\n[info] routed (scope): Routed out: local chapters run by others under the event's name (event-team-structure (peer network of independent communities)).\n[info] heavy_deleted (cadence): Continuous heavy is deleted: nobody is on duty in the gap, and an unmoderated standing space is a conduct obligation with no responder.\n[info] reopen_deleted (cadence): Closing the space each edition and reopening fresh is deleted - it looks like cheap dormancy and discards the member list and archive.\n[info] dormant (cadence): Dormant-but-open: freeze programming, keep the archive and member list, keep any per-project sub-channels, and post one dated notice that the space is quiet until next build-up.\n[info] autoenroll_deleted (conversion): Auto-enrolling every registrant as a member is deleted - it manufactures the membership number and spends a ticketing consent on a purpose it never granted.\n[info] secondadmin_deleted (handoff): Adding the successor as a second admin while a departing organizer's personal account stays owner of record is deleted - unrecoverable the day that account closes.\n[info] procedural (handoff): Planned rotation - the transition is fully proceduralized: playbook, access checklist, moderation-role transfer, retention signed off.\n[info] three_artifacts (handoff): A handover moves three artifacts: the team and its decision rights go to event-team-structure, the learning log to event-continuous-improvement, and only the community asset is written here."
}

Reply:

{
 "task": "brief",
 "summary": "Recommends dormant-but-open cadence, a fed local cohort for conversion, and a fully proceduralized handoff once a space exists, with whether a standing space belongs in the team's portfolio the first thing to settle.",
 "routing": [
  {
   "topic": "Local chapters run by others under the event's name",
   "owner": "event-team-structure (peer network of independent communities)"
  }
 ],
 "cadence_candidates": [
  {
   "posture": "dormant",
   "tradeoff": "Buys the baseline of paused programming, a kept archive, member list, and sub-channels, and one dated quiet notice, at no ongoing cost, which fits a team currently missing a named owner for the gap."
  },
  {
   "posture": "pulse",
   "tradeoff": "Buys a dated rhythm without full-time staffing, at the cost of still needing someone named to hold it, which nobody has recurring hours for yet."
  },
  {
   "posture": "light",
   "tradeoff": "Buys continuous light programming for a compounding, multi-city event, at the cost of recurring hours nobody on the team currently has."
  }
 ],
 "cadence": "dormant",
 "cadence_owner": "to be named",
 "conversion_candidates": [
  {
   "posture": "cohort",
   "tradeoff": "Buys a fed local cohort anchored by the willing local person already identified, at the cost of depending on one person's capacity to animate a multi-city audience."
  },
  {
   "posture": "touchpoint",
   "tradeoff": "Buys one simple re-engagement contact timed to the next opening, at the cost of no local anchor for an audience spread across several cities."
  },
  {
   "posture": "ladder",
   "tradeoff": "Buys a stepped path from attendee to regular to contributor, at the cost of structure to track across a multi-city audience before a local cohort is confirmed."
  }
 ],
 "conversion": "cohort",
 "handoff_candidates": [
  {
   "posture": "procedural",
   "tradeoff": "Buys a playbook, access checklist, moderation-role transfer, and signed-off retention for a planned rotation of organizers, at the cost of more upfront process than a simple document."
  },
  {
   "posture": "documented",
   "tradeoff": "Buys a one-page record of every account and the retention decision, at the cost of no playbook for the planned rotation already in view."
  },
  {
   "posture": "successor",
   "tradeoff": "Buys a named successor with an overlap period, at the cost of needing that successor already named ahead of a rotation that affects more than one role."
  }
 ],
 "handoff": "procedural",
 "deleted": [
  {
   "rung": "Continuous heavy",
   "reason": "Nobody is on duty in the gap, and an unmoderated standing space leaves a conduct obligation with no responder."
  },
  {
   "rung": "Close each edition and reopen fresh",
   "reason": "It discards the member list and archive the next edition needs, though it looks like cheap dormancy."
  },
  {
   "rung": "Auto-enroll every registrant",
   "reason": "It spends a ticketing consent on a purpose it never granted and manufactures the membership number."
  },
  {
   "rung": "Successor as a second admin, personal account still owner",
   "reason": "The departing organizer's personal account would stay owner of record, unrecoverable the day that account closes."
  }
 ],
 "local": "People outside the organizing team want to run local versions under this name, which is governance routed to team structure, not engagement handled here.",
 "register": "No register exists yet, so it must be set first, and everything in this plan stays provisional until it is.",
 "measurement": [
  "Newcomer share is under the floor the team set, and a rising carry rate beside it reads as success while the room is actually closing in on its regulars.",
  "Carry rate and newcomer share are read beside each other against a ratio band the team sets before the gap, never either number alone.",
  "Cadence kept: posts planned against posts made, with two missed cycles read as a demotion signal.",
  "List integrity and handoff readiness are checked on a schedule, not only when someone resigns, and every gate here is currently missing."
 ],
 "flips": [
  {
   "choice": "cadence",
   "flip": "If someone were named with recurring hours to hold a rhythm, the cadence could move from dormant to an occasional pulse or continuous light."
  },
  {
   "choice": "conversion",
   "flip": "If Tarun Velkai were unavailable or no longer willing, conversion would drop from a fed local cohort to a single re-engagement touchpoint."
  },
  {
   "choice": "handoff",
   "flip": "If the planned rotation of organizers fell away, the handoff could rest on a simpler documented ownership and access transfer instead of the full procedural transition."
  }
 ],
 "checks": [
  {
   "check": "Surface decided",
   "pass": false
  },
  {
   "check": "Named owner",
   "pass": false
  },
  {
   "check": "List integrity",
   "pass": false
  },
  {
   "check": "Handoff readiness",
   "pass": false
  },
  {
   "check": "Proposals survive",
   "pass": false
  },
  {
   "check": "Register",
   "pass": false
  }
 ],
 "caveats": [
  "No standing space is decided yet; whether one belongs in the team's property set is event-portfolio-strategy's call, to route there first and run this plan once the answer is yes.",
  "The proposed close-and-reopen cadence is deleted - it discards the member list and archive the next edition needs.",
  "The proposed auto-enrollment conversion is deleted - it spends a ticketing consent on a purpose it never granted.",
  "No named owner exists for the quiet months; a cadence with nobody named reads as continuous and abandoned, so the posture stays dormant until someone is named."
 ]
}

The page's check: kept - nothing to flag

The choices CSV for the first sample

menu,option,status,picked
cadence,Dormant-but-open,default,yes
cadence,Occasional pulse,available,
cadence,Continuous light,promoted,
cadence,Continuous heavy,deleted,
cadence,Close each edition and reopen fresh,deleted,
conversion,Single re-engagement touchpoint,default,yes
conversion,Structured participation ladder,available,
conversion,Fed local cohort,deleted,
conversion,No mechanism,available,
conversion,Auto-enroll every registrant,deleted,
handoff,Documented ownership and access transfer,default,yes
handoff,Named successor with an overlap period,available,
handoff,Fully proceduralized transition,starved,
handoff,Informal handoff,available,
handoff,"Successor as a second admin, personal account still owner",deleted,

Build the input yourself

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

const K = QuietKit, R = QuietReply;
const f = K.form({ name: "Platform Days", frequency: "annual", surface: "exists", owner: "to be named", gapHours: "yes", compounding: "yes",
  accounts: fs.readFileSync("accounts.txt", "utf8"), lastAttendees: "600", cameBack: "180" });
// f.routes, f.recCad, f.cadCandidates, f.cadRungs, f.recCon, f.recHan, f.accountsList, f.carry, f.newcomer, f.gateCount
// f.checks, f.findings
K.choicesCSV(f)                                // menu, option, status, picked
const b = K.buildInput(f, "brief");            // or "handoff"
const wire = K.toWire(b.input);                // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "brief");
// R.check(reply, b)                           // {status: kept or flagged, notes}

Get a token for the steps below from /tokens.html.

Step 1 — a tiny client helper

One function that sends JSON and unwraps the response. Paste a personal token from /tokens.html, or leave it empty and mint a guest token in step 2.

BASE="https://api.skillsafe.ai/v1/app-api"
TOKEN="paste-your-token-here"   # from https://quiet-months.skillsafe.ai/tokens.html
api() { # api METHOD PATH [JSON-BODY]
  curl -s -X "$1" "$BASE$2" -H "Content-Type: application/json" \
    ${TOKEN:+-H "Authorization: Bearer $TOKEN"} ${3:+--data "$3"}
}

Step 2 — a token

A guest token is enough for /me and /estimate. A run is metered, so it needs a personal token: sign in on /tokens.html and copy it from there.

# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN=$(curl -s -X POST "$BASE/guest" -H "Content-Type: application/json" -d '{"slug":"quiet-months"}' | jq -r '.data.token')

Step 3 — GET /me

Who the token is (subject_type: user or guest) and the credit balance.

api GET /me | jq '.data | {subject_type, credits}' 

Step 4 — POST /estimate

Free. The body is the run input itself, the bare object (never wrapped in {"input": ...}). hold_credits is a reservation, not the price; min_credits is what the balance must cover; model_alias reads gpt-terra.

# input.json: the run input object - {"task": "brief", "event": "Event: ...; runs annually or less often ...", "space": "Space: exists on ...; owner ...", "facts": "Routing: ...; Cadence: the page's pick is pulse ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}' 

Step 5 — POST /run, then poll the job

Send an Idempotency-Key built from the lane and the input: a retry with the same key never bills twice. The page uses quiet-months:<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 plan carries summary, routing, cadence_candidates, cadence, cadence_owner, conversion_candidates, conversion, handoff_candidates, handoff, deleted, local, register, measurement, flips, checks and caveats; a handoff document carries title, date, purpose, accounts, member_list, posture, steps, not_covered, open and note. Neither contains a digit. The code below prints the headline parts of either (list items are plain strings).

KEY="quiet-months:brief:$(shasum -a 256 input.json | cut -c1-16):a1"
JOB=$(curl -s -X POST "$BASE/run" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: $KEY" --data @input.json | jq -r '.data.job_id')
while :; do
  J=$(api GET "/jobs/$JOB"); S=$(echo "$J" | jq -r '.data.status')
  case "$S" in succeeded|failed|cancelled) break;; esac; sleep 2
done
echo "$J" | jq -r '.data.output.output' > reply.json   # one JSON object, the reply contract
echo "$J" | jq '.data | {charged_credits, truncated}'
jq -r '.summary // .format, .note // .cadence, ((.measurement // .caveats)[] | "\(.measure // .caveat): \(.text // .text)")' reply.json
jq -r '.purpose // .note // empty' reply.json   # what the handoff document hands over

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