{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=jaylabs/audit-play@0.4.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/audit-play@0.4.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/audit-play@0.4.7","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/jaylabs/audit-play@0.4.7 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"After a few months of clicking yes, always, your Claude Code or Codex allow list is a list nobody has read. This tells you which entries you can delete. It reads your settings files and MCP servers for what you granted, reads your session transcripts for what actually ran, and subtracts one from the other. You get four lists: grants nothing ever used, the write-capable ones among them, rules that can reach past this machine, and MCP servers that sat idle the whole window. Each row names the file it came from, so you can trim the list yourself. Your settings files are only ever read from, a grant stays granted, and no socket is opened; the only thing it puts on disk is its own report, six files in an output directory you choose, and the only thing it needs is python3.","distribution":{"digest":"sha256:6f42c3df4382090f834d8c166a288b158b9a6f0754e5a4d9ea184b5220b22ad8","mediaType":"application/vnd.modiqo.rote-flow","size":73901,"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/audit-play@0.4.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/audit-play@0.4.7","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/jaylabs/audit-play@0.4.7.json"},"name":"audit-play","owner":{"kind":"org","slug":"jaylabs"},"parameters":[{"default":"all","description":"Which project to audit. The word all audits every project this machine records, which is what a bare run with no parameters does. A path narrows to one project, selecting its policy files and its transcript directory. A path inside the rote run workspace is the play's own scratch directory rather than a project, so it falls back to all with a warning.","example":"/Users/you/code/my-project","input":{"allowCustom":true,"choices":[],"label":"Project path"},"name":"project_path","required":false,"type":"string"},{"default":"72","description":"How far back to look, in hours, filtered per event on the record timestamp. 0 means the whole recorded history. Shorter than a weekend produces mostly false idleness.","example":"168","input":{"allowCustom":true,"choices":[],"label":"Window hours"},"name":"window_hours","required":false,"type":"string"},{"default":"claude","description":"Which agent harness wrote the transcripts and config. claude reads ~/.claude/projects, ~/.claude.json and the settings files. codex reads ~/.codex/sessions rollouts and ~/.codex/config.toml, where policy is an approval mode rather than a rule list, so the three rule-shaped finding classes read not applicable. Any other value is a hard fault rather than a silent empty report.","example":"codex","input":{"allowCustom":false,"choices":[{"label":"claude","value":"claude"},{"label":"codex","value":"codex"}],"label":"Harness"},"name":"harness","required":false,"type":"string","validValues":["claude","codex"]},{"default":"has been denied|Permission denied|permission was denied|was denied by|tool use was rejected|Sandbox\\(Denied","description":"Case insensitive regex that marks an errored tool result as a denial rather than an execution failure. Exposed because the harness wording is not a stable contract, and misreading it turns a control that worked into a control that was bypassed. The default carries the Claude Code phrasings and Codex's Sandbox(Denied marker.","example":"has been denied|rejected by policy","input":{"allowCustom":true,"choices":[],"label":"Denial patterns"},"name":"denial_patterns","required":false,"type":"string"},{"default":"true","description":"Whether to read subagent transcripts under each session's subagents directory alongside the session transcripts. They hold real tool calls, so excluding them makes every unused finding a floor.","example":"false","input":{"allowCustom":false,"choices":[{"label":"true","value":"true"},{"label":"false","value":"false"}],"label":"Include subagents"},"name":"include_subagents","required":false,"type":"string","validValues":["true","false"]},{"default":"user,project","description":"Comma separated settings scopes to union. Each scope reads its settings.json and settings.local.json.","example":"project","input":{"allowCustom":true,"choices":[],"label":"Policy scopes"},"name":"policy_scopes","required":false,"type":"string"},{"default":"findings","description":"findings prints the top items per class and omits the per-file array from traces.json; all prints every row in the least privilege profile and writes the per-file array. Neither setting changes a count.","example":"all","input":{"allowCustom":false,"choices":[{"label":"findings","value":"findings"},{"label":"all","value":"all"}],"label":"Report"},"name":"report","required":false,"type":"string","validValues":["findings","all"]},{"description":"Path to the shadow-diff.json an earlier run wrote. Given one, the report adds what moved since that run — grants newly dead, grants newly used, rules added or removed, servers newly idle or newly active, and blocks that started or stopped. Two runs taken over different windows, scopes or harnesses are reported as not comparable rather than subtracted. Empty means no comparison.","example":"/tmp/last-audit/shadow-diff.json","input":{"allowCustom":true,"choices":[],"label":"Since"},"name":"since","required":false,"type":"string"},{"description":"Audit one run instead of the machine. Takes a transcript file path or a session id; executed evidence then comes from that transcript and the subagents it spawned, and nothing else. The window still applies inside it. A machine-wide audit answers what a policy has authorised over months; this answers what one piece of work actually needed. A session that cannot be found is a hard fault rather than a silent fallback to everything.","example":"a1cafe13-0abf-4a91-b65f-00ff1db6f676","input":{"allowCustom":true,"choices":[],"label":"Session"},"name":"session","required":false,"type":"string"},{"description":"Path to the shadow-diff.json an earlier run wrote. Given one, the report says whether every count reproduces and, where a count moved, names the condition that moved underneath it — window bounds, transcript files enumerated, rules read, servers advertised, harness, scope, scan time. A count that moved while a condition moved was measuring something else, not failing to reproduce. Empty means no check.","example":"/tmp/last-audit/shadow-diff.json","input":{"allowCustom":true,"choices":[],"label":"Compare to"},"name":"compare_to","required":false,"type":"string"},{"description":"Where the six artifacts are written, five JSON files and one markdown profile. Empty means the run workspace working directory. traces.json records the command, file path or URL each call was made with, truncated, with credential-shaped spans masked; treat it as you would your shell history.","example":"/tmp/shadow-diff","input":{"allowCustom":true,"choices":[],"label":"Out dir"},"name":"out_dir","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/jaylabs/audit-play@0.4.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/audit-play@0.4.7","headlessCommandTemplate":"rote play run https://play.modiqo.ai/jaylabs/audit-play@0.4.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.78.0"},"publishedAt":"2026-09-04T12:10:25.432735+00:00","reference":"jaylabs/audit-play@0.4.7","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"localTools":["python3"],"roteCli":{"minimumVersion":"0.62.0"},"sessions":false},"resolution":"pinned","schema":"rote.play.v1","stats":{"downloads":6,"installs":0},"steps":{"count":6,"names":["drift","inventory_grants","join_diff","profile","read_policy","read_traces"]},"title":"audit-play","type":"play","version":"0.4.7","visibility":"public"}