{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=chinmoy/link-rot@0.4.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/chinmoy/link-rot@0.4.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/chinmoy/link-rot@0.4.0","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/chinmoy/link-rot@0.4.0 <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, and resolves every relative link and in-page anchor against the tracked file list with no network at all. 7 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. Offline it still reports a relative link or image pointing at a path git does not track, a path that differs from a tracked one only in case so it 404s on GitHub and Linux CI while working on a Mac, a file that exists only untracked, and an anchor no heading slugs to. Placeholder hosts, template URLs carrying a {slot}, and rate-limited 429 responses are never reported as dead. It does not verify t","distribution":{"digest":"sha256:c014b144bf46d0d1259dbf9103fdeffdc5c15e968a3ed7d15290de6fc6a8c5a8","mediaType":"application/vnd.modiqo.rote-flow","size":30988,"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.4.0","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.4.0","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/chinmoy/link-rot@0.4.0.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 repository-relative links, images and in-page anchors are resolved against the tracked file list. This is a real behaviour change, because through 0.3.2 this play stated in writing that relative links and anchors were never contacted, and the default true now decides them - a link or image pointing at a path git does not track, a path differing from a tracked one only in case so it works on macOS and 404s on GitHub and Linux CI, a path that exists only as an untracked file the author alone can see, and an anchor no heading in the document slugs to. None of it needs a network, so it answers on a plane and in CI with egress blocked. A link to a directory that exists, one carrying a query string, mailto and tel, and anything under .github/ are never reported. Set false to restore the 0.3.2 behaviour of checking external URLs alone.","input":{"allowCustom":true,"choices":[],"label":"Check relative"},"name":"check_relative","required":false,"type":"boolean"},{"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.4.0 --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.4.0","headlessCommandTemplate":"rote play run https://play.modiqo.ai/chinmoy/link-rot@0.4.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.78.0"},"publishedAt":"2026-09-04T07:54:05.232664+00:00","reference":"chinmoy/link-rot@0.4.0","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":4,"installs":0},"steps":{"count":7,"names":["discover_docs","extract_urls","host_probe","local_links","manifest_urls","probe_urls","verdict"]},"title":"link-rot","type":"play","version":"0.4.0","visibility":"public"}