{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=rajkaria/receipt-ledger@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/receipt-ledger@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/receipt-ledger@0.1.0","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/rajkaria/receipt-ledger@0.1.0 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Every purchase leaves a file somewhere. A PDF invoice, a saved confirmation page, an exported message. None of them are ever added up, because they are four formats sitting in one folder and opening them one at a time is nobody's evening. This reads all four. Email files are parsed with their headers, so the sender and the date are the real ones and not the file's. Saved pages are stripped to text. PDFs are decompressed and, where the fonts use their own encoding, decoded through the document's own ToUnicode table, then laid back out into lines from the coordinates each glyph was placed at, because a PDF has no concept of a line and reading one without reconstructing it gives you a column of single letters. A scanned receipt has no text at all and is reported as unreadable rather than guessed at. A document only counts as a receipt if it says it is one. An amount sitting on a line that says total, amount due or you paid is enough on its own; otherwise the document needs at least two of invoice number, order n","distribution":{"digest":"sha256:636baff43ef37b107e31ffbecc4e5ec58d9cfa427dbd1eb2f5c784da99f93cae","mediaType":"application/vnd.modiqo.rote-flow","size":66103,"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/receipt-ledger@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/receipt-ledger@0.1.0","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/rajkaria/receipt-ledger@0.1.0.json"},"name":"receipt-ledger","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 against bundled synthetic receipts in four formats, including one that must not count.","example":"false","input":{"allowCustom":true,"choices":[],"label":"Demo"},"name":"demo","required":false,"type":"string"},{"default":12,"description":"How far back to total. Receipts older than this are read and reported as outside the window.","example":12,"input":{"allowCustom":true,"choices":[],"label":"Months back"},"name":"months_back","required":false,"type":"integer"},{"default":"~/Downloads","description":"A folder of PDFs, .eml exports and saved pages. Searched recursively.","example":"~/Downloads","input":{"allowCustom":true,"choices":[],"label":"Receipts dir"},"name":"receipts_dir","required":false,"type":"string"},{"default":"~/Library/Mail","description":"Optional second folder. macOS protects this one; without Full Disk Access it is skipped by name.","example":"~/Library/Mail","input":{"allowCustom":true,"choices":[],"label":"Mail dir"},"name":"mail_dir","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/rajkaria/receipt-ledger@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/receipt-ledger@0.1.0","headlessCommandTemplate":"rote play run https://play.modiqo.ai/rajkaria/receipt-ledger@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-05T16:43:50.182585+00:00","reference":"rajkaria/receipt-ledger@0.1.0","requested":"rajkaria/receipt-ledger","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":["read_files","read_mail","report"]},"title":"receipt-ledger","type":"play","version":"0.1.0","visibility":"public"}