{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=jaylabs/meeting-prep@0.1.7","method":"GET","rel":"https://rote.dev/rels/bootstrap-and-run","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"inspect":{"command":"rote play inspect https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7","effect":"read-only"},"installCliOnly":{"effect":"installs the rote CLI, nothing else","href":"https://play.modiqo.ai/install","method":"GET","rel":"https://rote.dev/rels/install-cli","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"run":{"command":"rote play run https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"authenticationPreflight":{"credentialValues":"local_only","enforcedBeforeAdapterCalls":true,"mode":"declared","readiness":"inspect_locally","steps":[{"endpoint":"adapter/calendar","name":"ensure_calendar","onExpired":"refresh","onMissing":"authorize","onUnreadable":"reauthorize"},{"endpoint":"adapter/gmail","name":"ensure_gmail","onExpired":"refresh","onMissing":"authorize","onUnreadable":"reauthorize"}]},"description":"Reads your Gmail and Calendar before a meeting and writes one page per meeting: the sentences you wrote that read like commitments, the ones they wrote that read like asks, and which asks you never replied to, each traced to a message id. It builds on two Modiqo Plays, adding the join and the bodies neither exposes. Silence is provable; whether a reply answered the question is not, so it claims only what it shows. It connects your gmail and calendar adapters through rote; the credential stays in your vault, never read from your environment. Pass mode=sample for a bundled fictional inbox. It writes the pages and their JSON, and deletes only its own stale session folders.","distribution":{"digest":"sha256:2c23353c519f854c608f638a515a66fa0cd5f9ed10c068a301cd282c6885ad17","mediaType":"application/vnd.modiqo.rote-flow","size":89590,"verifiedBy":"rote verifies the downloaded archive against this digest before it runs"},"effects":{"credentialsProvidedBy":"runner","credentialsRemainLocal":true,"declaredWrites":[],"publisherReceivesCredentials":false},"id":"https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7","inputPolicy":{"optionalWithDefault":"show_default_and_accept_override","optionalWithoutDefault":"omit_unless_supplied","required":"ask","secrets":"collect_locally_outside_conversation"},"links":{"docs":"https://rote.dev","page":"https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7.json"},"name":"meeting-prep","owner":{"kind":"org","slug":"jaylabs"},"parameters":[{"default":"auto","description":"Which world the run reads. The value auto always reads live, because a run that quietly served a fictional inbox to somebody who asked for their own meetings would be worse than one that asks them to connect an account. The value sample reads the calendar and inbox bundled with this play and must be asked for by name; it is never a fallback. The value sample reads the calendar and inbox bundled with this play, makes no network call and needs no credential, so a stranger can run it cold. The value live runs the two published Modiqo Plays for calendar events and message ids, then reads the message bodies behind those ids through a rote adapter session. That session is the only live route, and the credential stays in your local rote vault, never read into this play.","example":"sample","input":{"allowCustom":false,"choices":[{"label":"auto","value":"auto"},{"label":"live","value":"live"},{"label":"sample","value":"sample"}],"label":"Mode"},"name":"mode","required":false,"type":"string","validValues":["auto","live","sample"]},{"default":"24","description":"How far ahead to read the calendar, in hours from now. Must be a whole number; clamped to 1..336. Run it the night before with the default and you get tomorrow.","example":"24","input":{"allowCustom":true,"choices":[],"label":"Hours"},"name":"hours","required":false,"type":"string"},{"default":"30","description":"How far back to read mail for each attendee, in days. Must be a whole number; clamped to 1..365. It is also the number quoted when a person has no recent mail, so the empty answer stays a measured statement rather than a bare no.","example":"30","input":{"allowCustom":true,"choices":[],"label":"Lookback days"},"name":"lookback_days","required":false,"type":"string"},{"description":"The address of the account being read, which names you on every page and is excluded from the attendee lookups. Live mode resolves it through the gmail adapter session when this is empty. Set it when the mailbox and the calendar belong to different addresses. If the adapter profile disagrees with this override, every page carries a warning naming both addresses; if that check cannot be made, every page says so rather than staying quiet.","example":"you@example.com","input":{"allowCustom":true,"choices":[],"label":"Me"},"name":"me","required":false,"type":"string"},{"default":"primary","description":"Which calendar to read. primary is the one attached to the account the calendar credential belongs to. Sample mode reads the bundled calendar and ignores this.","example":"primary","input":{"allowCustom":true,"choices":[],"label":"Calendar id"},"name":"calendar_id","required":false,"type":"string"},{"default":"8","description":"How many people on one invitation get a mail lookup, ordered by acceptance and then alphabetically. Must be a whole number; clamped to 1..50. A twenty-person invitation is a broadcast, and looking every recipient up costs more than it tells you. Anyone dropped is counted on the receipt.","example":"8","input":{"allowCustom":true,"choices":[],"label":"Max attendees per meeting"},"name":"max_attendees_per_meeting","required":false,"type":"string"},{"default":"5","description":"How many recent messages to read per person, newest first. Must be a whole number; clamped to 1..50. It also caps how many commitment and ask sentences a page shows for that person, and the number dropped is stated.","example":"5","input":{"allowCustom":true,"choices":[],"label":"Max messages per attendee"},"name":"max_messages_per_attendee","required":false,"type":"string"},{"default":"60","description":"A hard ceiling on the message reads one run may spend, so a busy week cannot turn into a very long run. Must be a whole number; clamped to 1..500. People beyond the budget are named on their page as skipped rather than quietly left out.","example":"60","input":{"allowCustom":true,"choices":[],"label":"Max gmail calls"},"name":"max_gmail_calls","required":false,"type":"string"},{"description":"Where the prep pages go. Empty means a folder inside the run workspace. Anything else must sit inside your home directory and outside this play package, because the pages quote private mail. Every run gets its own timestamped subfolder under this, live or sample, so one run's pages are never mixed with another's.","example":"meeting-prep-pages","input":{"allowCustom":true,"choices":[],"label":"Out dir"},"name":"out_dir","required":false,"type":"string"},{"default":"false","description":"Recorded on the receipt so a wrapper script knows whether you wanted the first page opened. This play itself only writes the files.","example":"false","input":{"allowCustom":false,"choices":[{"label":"true","value":"true"},{"label":"false","value":"false"}],"label":"Open page"},"name":"open_page","required":false,"type":"string","validValues":["true","false"]},{"description":"The zone label printed on each page in live mode. Empty uses the zone the calendar payload reports, falling back to this machine. Sample runs are always labelled Asia/Kolkata, which is the zone the bundled window was written in.","example":"Asia/Kolkata","input":{"allowCustom":true,"choices":[],"label":"Time zone"},"name":"time_zone","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7 --json","effect":"read-only"},"step":1,"type":"inspect_local_readiness"},{"references":["/parameters"],"step":2,"type":"collect_parameters"},{"references":["/parameters","/requirements","/effects"],"step":3,"type":"review"},{"consentBoundary":"the user approves the exact play and parameter values","references":["/parameters","/requirements","/effects"],"step":4,"type":"obtain_run_consent"},{"action":{"command":"rote play run https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7","headlessCommandTemplate":"rote play run https://play.modiqo.ai/jaylabs/meeting-prep@0.1.7 <name=value...> --yes"},"preservesAcquisitionBoundaries":["adapter_selection","oauth_dcr","google_discovery","static_token_setup","runtime_security_checks"],"requiresConsent":true,"step":5,"type":"run"}],"producedBy":{"roteVersion":"0.79.0"},"publishedAt":"2026-09-04T03:18:24.319537+00:00","reference":"jaylabs/meeting-prep@0.1.7","requirements":{"adapters":[{"bindingStatus":"resolved","credentialDemand":{"requirements":[{"description":"Google OAuth 2.0 token","kind":"bearer","name":"CALENDAR_TOKEN","protocol":"google_discovery","protocolSource":"declared","setup":{"drivenBy":"rote","interaction":"browser_or_device","type":"oauth"}}],"status":"required"},"displayName":"Calendar API","fingerprint":"mcp_39UEoxu3DX9zayEgtzXN8HtJxnxy","id":"calendar","purpose":"Calendar and event scheduling - meetings, appointments, schedule management, event creation","requirement":"modiqo/calendar@0.0.4","version":"0.0.4"},{"bindingStatus":"resolved","credentialDemand":{"requirements":[{"description":"Google OAuth 2.0 token","kind":"bearer","name":"GMAIL_TOKEN","protocol":"google_discovery","protocolSource":"declared","setup":{"drivenBy":"rote","interaction":"browser_or_device","type":"oauth"}}],"status":"required"},"displayName":"Gmail API","fingerprint":"mcp_2kLwgdDQH7fxkyDYysCHsbCXLooH","id":"gmail","purpose":"Email management for personal and professional communication - send, read, organize messages, manage inbox and filters","requirement":"modiqo/gmail@0.0.3","version":"0.0.3"}],"browser":{"dependencies":[],"runtime":false,"signIn":false},"localTools":["python3","rote"],"roteCli":{"minimumVersion":"0.62.0"},"sessions":false},"resolution":"pinned","schema":"rote.play.v1","stats":{"downloads":0,"installs":0},"steps":{"count":11,"names":["extract","list_mail_ids","list_meetings","live_reads","mode_gate","plan_lookups","read_full","render","resolve_me","sample_reads","validate_inputs"]},"title":"meeting-prep","type":"play","version":"0.1.7","visibility":"public"}