{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=rajkaria/standing-cost@0.1.0","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/rajkaria/standing-cost@0.1.0","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/rajkaria/standing-cost@0.1.0","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/rajkaria/standing-cost@0.1.0 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Nobody schedules a meeting by its price. A 30-minute standup with nine people is four and a half person-hours every time it fires, and over a year that is a number no calendar will ever show you. Every fact needed to compute it is already in the calendar — who was invited, who accepted, how long it ran, how often it was cancelled — so this does the arithmetic and prints the denominators. The Play is two programs on purpose, and the seam between them is a file. One step reads a window of your calendar and writes a normalised JSON file into \u0060out_dir\u0060; that step is the only part of this package that opens a connection, it is one short file you can read before you run it, and it calls \u0060events.list\u0060 and nothing else. The second half — the arithmetic, the card and the report — is \u0060daily_core\u0060, which imports no networking module at all and only ever reads that file. If the file is not there, that is a labelled absence and the run still completes. What the arithmetic refuses to do is most of what makes it trustworthy","distribution":{"digest":"sha256:d214e160cd95f7040dbb52a1090e28a25739dd1949c163cb66317d8f072e85e7","mediaType":"application/vnd.modiqo.rote-flow","size":1027939,"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/rajkaria/standing-cost@0.1.0","inputPolicy":{"omittedValues":"inspect_full_parameters_before_collecting_values_or_consent","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/rajkaria/standing-cost@0.1.0","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/rajkaria/standing-cost@0.1.0.json"},"name":"standing-cost","owner":{"kind":"user","slug":"rajkaria"},"parameters":[{"default":"~/daily","description":"Created if missing. Everything this Play writes goes here and nowhere else.","example":"~/daily","input":{"allowCustom":true,"choices":[],"label":"Out dir"},"name":"out_dir","required":false,"type":"string"},{"default":"false","description":"true runs the whole Play against a bundled synthetic calendar of 439 events, so a first run needs nothing installed and no account.","example":"false","input":{"allowCustom":true,"choices":[],"label":"Demo"},"name":"demo","required":false,"type":"string"},{"default":".standing-cost-calendar.json","description":"Where the calendar step writes the normalised events and the report reads them. A relative name resolves inside out_dir.","example":".standing-cost-calendar.json","input":{"allowCustom":true,"choices":[],"label":"Partial"},"name":"partial","required":false,"type":"string"},{"default":"primary","description":"Which calendar to read. primary is the account's own. Only events.list is called; nothing is written back.","example":"primary","input":{"allowCustom":true,"choices":[],"label":"Calendar id"},"name":"calendar_id","required":false,"type":"string"},{"default":365,"description":"How many days back to fetch and price. A recurring meeting is worth judging over a year, not over a week.","example":365,"input":{"allowCustom":true,"choices":[],"label":"Days"},"name":"days","required":false,"type":"integer"},{"default":"GOOGLE_OAUTH_TOKEN","description":"The environment variable holding a Google OAuth access token with the calendar.readonly scope. No file is read for it, and if the variable is unset the Play says so and still runs.","example":"GOOGLE_OAUTH_TOKEN","input":{"allowCustom":true,"choices":[],"label":"Token env"},"name":"token_env","required":false,"type":"string"},{"default":90,"description":"How long an uninterrupted stretch has to be before it counts as one. It is what turns meeting times into the number of focus blocks they cut in half.","example":90,"input":{"allowCustom":true,"choices":[],"label":"Focus block minutes"},"name":"focus_block_minutes","required":false,"type":"integer"},{"default":"£","description":"Printed in front of every money figure. It changes the symbol, never the arithmetic.","example":"£","input":{"allowCustom":true,"choices":[],"label":"Currency"},"name":"currency","required":false,"type":"string"},{"default":"","description":"Leave empty and the Play reports person-hours and claims no money at all. Set it and every money figure is labelled assumed, because it is.","example":"75","input":{"allowCustom":true,"choices":[],"label":"Hourly rate"},"name":"hourly_rate","required":false,"type":"string"},{"default":"","description":"Your own address, for the case where the feed does not mark which attendee is you. Used to tell your time from everybody else's; never printed in full.","example":"you@example.com","input":{"allowCustom":true,"choices":[],"label":"Owner address"},"name":"owner_address","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/rajkaria/standing-cost@0.1.0 --json","effect":"read-only"},"step":1,"type":"inspect_local_readiness"},{"references":["/parameters"],"step":2,"type":"collect_parameters","whenValuesOmitted":"Run step 1 before collecting inputs or showing defaults; omittedFields are unknown values, not absent defaults or exhaustive choices."},{"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/rajkaria/standing-cost@0.1.0","headlessCommandTemplate":"rote play run https://play.modiqo.ai/rajkaria/standing-cost@0.1.0 <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-05T20:40:37.902366+00:00","reference":"rajkaria/standing-cost@0.1.0","requested":"rajkaria/standing-cost","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"hostToolRequirements":[{"command":"python3","required":true,"versionRequirement":null}],"localTools":["python3"],"roteCli":{"minimumVersion":"0.91.0"},"sessions":false},"resolution":"latest","schema":"rote.play.v1","stats":{"downloads":1,"installs":0},"steps":{"count":3,"names":["fetch_calendar","read_calendar","report"]},"title":"standing-cost","type":"play","version":"0.1.0","visibility":"public"}