{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=chinmoy/link-rot@0.3.2","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/chinmoy/link-rot@0.3.2","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/chinmoy/link-rot@0.3.2","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/chinmoy/link-rot@0.3.2 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Requests every external URL a repository's documentation hands a reader and reports which no longer resolve. 6 probes read tracked docs and project manifests such as package.json homepage, pyproject [project.urls] and FUNDING.yml, then contact each URL with HEAD and fall back to GET, following redirects and recording the chain. It flags dead status codes, pages that redirect to the site root so the linked content is gone while the link still answers 200, and permanent moves the documentation should name instead. Placeholder hosts, template URLs carrying a {slot}, and rate-limited 429 responses are never reported as dead. It reports UNCHECKED-OFFLINE and an UNKNOWN verdict rather than a pass when the network is unavailable or no URL was found. It does not verify that a page contains what the link text promises, and it skips links behind a login or a bot challenge. Catches the dead Live Demo link a recruiter clicks months after the deployment was deleted.","distribution":{"digest":"sha256:12e50cced85b34fdb7ddb3e35f23cc7130ea3f282b9bfaffb244405ba901ec8c","mediaType":"application/vnd.modiqo.rote-flow","size":28600,"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/chinmoy/link-rot@0.3.2","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/chinmoy/link-rot@0.3.2","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/chinmoy/link-rot@0.3.2.json"},"name":"link-rot","owner":{"kind":"user","slug":"chinmoy"},"parameters":[{"default":".","description":"Work tree whose documentation is checked. The default '.' resolves to the directory the run started in, so a zero-argument run checks the repository you are standing in; pass an absolute path to check a checkout somewhere else. Only tracked files are read, because a scratch note that was never committed is not something a stranger receives.","input":{"allowCustom":true,"choices":[],"label":"Path"},"name":"path","required":false,"type":"string"},{"default":"README*,CONTRIBUTING*,docs/**,*.md","description":"Comma-separated globs naming the documents whose links a reader is handed. The default covers the files a newcomer opens first plus everything under docs/, and bare globs apply at the repository root only so a stray markdown file deep in a vendored tree is not treated as documentation. Pass an empty value to check manifest URLs alone.","input":{"allowCustom":true,"choices":[],"label":"Docs"},"name":"docs","required":false,"type":"string"},{"default":8000,"description":"Per-URL budget before a host is called unreachable. The default 8000 keeps a normal repository under half a minute, and a URL that times out is retried once at double the budget before being reported, because a slow-but-alive blog should not be listed as broken.","input":{"allowCustom":true,"choices":[],"label":"Timeout ms"},"name":"timeout_ms","required":false,"type":"integer"},{"default":8,"description":"How many URLs are requested at once, capped at 16. The default 8 is chosen so a README with fifty links finishes in seconds without looking like a scraper to any single host; lower it to 2 or 3 when every link points at one domain that rate-limits.","input":{"allowCustom":true,"choices":[],"label":"Concurrency"},"name":"concurrency","required":false,"type":"integer"},{"default":true,"description":"Whether shield and coverage badge images are contacted as well as ordinary links. The default true includes them, since a badge pointing at a deleted CI project is exactly the kind of quiet rot that makes a README look abandoned; set false to check only the links a reader would click.","input":{"allowCustom":true,"choices":[],"label":"Check badges"},"name":"check_badges","required":false,"type":"boolean"},{"default":200,"description":"Upper bound on how many URLs are contacted. The default 200 covers almost every repository, and when the bound is hit first-screen links are kept preferentially and the report states how many were counted but not checked, rather than quietly under-reporting.","input":{"allowCustom":true,"choices":[],"label":"Max urls"},"name":"max_urls","required":false,"type":"integer"},{"description":"Comma-separated hostnames to skip entirely. The default is empty because placeholder and loopback hosts are already excluded automatically; add a host here when it blocks automated requests and produces an inconclusive result you have already investigated.","input":{"allowCustom":true,"choices":[],"label":"Ignore hosts"},"name":"ignore_hosts","required":false,"type":"string"},{"default":false,"description":"Whether URLs inside fenced code blocks are contacted. The default false skips them, because a URL in an example command is usually illustrative and requesting it produces noise rather than a finding; set true when your documentation puts real endpoints in code fences.","input":{"allowCustom":true,"choices":[],"label":"In code"},"name":"in_code","required":false,"type":"boolean"},{"default":"all","description":"Which findings reach the report: all, or critical. The default all keeps the warnings and the inconclusive results, because a permanent redirect and a host that refuses automated requests are both worth seeing once; use critical for only what a reader will actually find broken.","input":{"allowCustom":true,"choices":[],"label":"Severity"},"name":"severity","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/chinmoy/link-rot@0.3.2 --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/chinmoy/link-rot@0.3.2","headlessCommandTemplate":"rote play run https://play.modiqo.ai/chinmoy/link-rot@0.3.2 <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-03T20:23:11.252599+00:00","reference":"chinmoy/link-rot@0.3.2","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"localTools":["git","python3"],"roteCli":{"minimumVersion":"0.62.0"},"sessions":false},"resolution":"pinned","schema":"rote.play.v1","stats":{"downloads":2,"installs":0},"steps":{"count":6,"names":["discover_docs","extract_urls","host_probe","manifest_urls","probe_urls","verdict"]},"title":"link-rot","type":"play","version":"0.3.2","visibility":"public"}