{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=adnandev/test-gap@0.1.3","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/adnandev/test-gap@0.1.3","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/adnandev/test-gap@0.1.3","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/adnandev/test-gap@0.1.3 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Finds every git repository on this machine and ranks them by how much code ships with no tests at all. On the machine this was built on, two of three repositories contained no test file of any kind, and source outweighed tests fourteen lines to one across 15,531 lines. Three DAG steps: one reader that discovers repositories and their last commit, one that classifies every source file as production or test, and one join that ranks repos by exposure and names the directories with no sibling tests. Classification is deliberately generous, so a gap is understated rather than invented, and finding no repositories prints INDETERMINATE instead of a confident zero. It measures whether tests exist, never whether they pass. Read-only toward your code: it runs no test, changes no file you already have, makes no network call, carries no credentials, and needs only python3 and git. The one thing it writes is its own test-gap.json report, inside the run workspace.","distribution":{"digest":"sha256:b371d3206c611f60f6ece188fee40a8d03582173f743c7c2890e235d81890b3a","mediaType":"application/vnd.modiqo.rote-flow","size":16436,"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/adnandev/test-gap@0.1.3","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/adnandev/test-gap@0.1.3","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/adnandev/test-gap@0.1.3.json"},"name":"test-gap","owner":{"kind":"user","slug":"adnandev"},"parameters":[{"description":"Directory to scan. Defaults to your home directory, which is what most people want. Point it at a projects folder to narrow the sweep, or at a checkout to look at one tree. It is never written to.","input":{"allowCustom":true,"choices":[],"label":"Root"},"name":"root","required":false,"type":"string"},{"default":"4","description":"How many directory levels below each scan root to search for repositories. Raising it finds more deeply nested checkouts and costs time on large home directories. A repository's own subdirectories are never descended into, so nested submodules are not double counted.","input":{"allowCustom":true,"choices":[],"label":"Scan depth"},"name":"scan_depth","required":false,"type":"string"},{"default":"15","description":"How many repositories to list in the exposure table. This never changes a count, only how much of the ranking is shown.","input":{"allowCustom":true,"choices":[],"label":"Top n"},"name":"top_n","required":false,"type":"string"},{"default":"findings","description":"findings prints the exposure ranking alone. all additionally prints every source directory that has no sibling test directory, per repository. Neither setting changes a count.","input":{"allowCustom":true,"choices":[],"label":"Report"},"name":"report","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/adnandev/test-gap@0.1.3 --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/adnandev/test-gap@0.1.3","headlessCommandTemplate":"rote play run https://play.modiqo.ai/adnandev/test-gap@0.1.3 <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-04T09:36:30.367464+00:00","reference":"adnandev/test-gap@0.1.3","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"localTools":["python3","git"],"roteCli":{"minimumVersion":"0.62.0"},"sessions":false},"resolution":"pinned","schema":"rote.play.v1","stats":{"downloads":5,"installs":0},"steps":{"count":3,"names":["classify_files","discover_repos","report_gaps"]},"title":"test-gap","type":"play","version":"0.1.3","visibility":"public"}