{"$schema":"https://schemas.agentskills.io/discovery/0.2.0/schema.json","skills":[{"description":"iOS universal-links manifest (AASA). Apple is famously strict about the Content-Type, JSON validity, appID format (TEAMID.bundle.id), and the paths array. These modes break each of those expectations.","digest":"sha256:d84a5691822dd05b39e9f79aa87b003fc9fe64e896b48582ac3d0759738f426a","name":"bots-aasa","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/app-linking/bots-aasa/index.md"},{"description":"Android App Links manifest. Android verifies app links by checking SHA-256 fingerprints, package_name, and relation strings against a strict schema. These modes break each of those.","digest":"sha256:3450d0a248945a4829cc4e35b995acb34306cda4cd0b0d1981985a094ac30f03","name":"bots-assetlinks","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/app-linking/bots-assetlinks/index.md"},{"description":"PWA web app manifest. Wide tooling consumption — Chrome, Lighthouse, browser PWA installers all parse this and complain when it's wrong. Modes break required icons, start_url, display modes, colors, or name fields.","digest":"sha256:d52043c7d19ec2a2f1d5c3cde8f65b6876bab7f89fc7e7c9380b5dcebed08813","name":"bots-manifest","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/app-linking/bots-manifest/index.md"},{"description":"An IAB ads.txt with internally contradictory authorized-seller declarations, fictitious ad networks, or malformed lines that ads.txt crawlers should reject.","digest":"sha256:ca8bcf3ac3b9796c53627d00437fad98c713e9c701ea1d3581d892a890bcae3e","name":"bots-ads-txt","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-ads-txt/index.md"},{"description":"An ai.txt — the AI-scraping equivalent of robots.txt — that contradicts itself, references AI bots that don't exist, or returns malformed directives.","digest":"sha256:752a7d14e7fd971ba8dfa7ef4df32c65e8bfb17ff91d692a0a250ad0f2cdb420","name":"bots-ai-txt","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-ai-txt/index.md"},{"description":"A humans.txt that contradicts itself, recursively references itself for every field, or contains time-paradox dates.","digest":"sha256:9bb2f928f987b47c19cd74e43066c7d93b2091eb09999d8952a4492c1af11358","name":"bots-humans","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-humans/index.md"},{"description":"An llms.txt (the proposed convention for telling LLMs about site structure) that lists pages that 404, contradicts itself, or embeds prompt-injection content. Tests whether AI agents that ingest llms.txt sanitise it before acting.","digest":"sha256:5353ad64dcd516343186c96ac4814e70e3484781d58c0784152259cf79c9b269","name":"bots-llms","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-llms/index.md"},{"description":"A robots.txt that contradicts itself, sets impossible crawl delays, or returns malformed directives. Crawlers that parse strictly should reject; lenient crawlers will produce unpredictable behaviour.","digest":"sha256:7913dc10ece1460f1219319bf0c6f90b0d9d557ceba8c64fd3de042ab5d41e8a","name":"bots-robots","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-robots/index.md"},{"description":"An RFC 9116 security.txt with broken required fields: an Expires date in the past, dead Contact URLs, total nonsense in every field, or a Canonical that doesn't include the served URL.","digest":"sha256:7f379e4de4be1661079d5ca038ab85d237f55159e2aa68ee1b4d1701c9d3608f","name":"bots-security","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-security/index.md"},{"description":"A sitemap that crawlers will follow into bad places: 404 URLs, future-dated lastmod values, circular sitemap-index references, or a body that claims gzip encoding but isn't gzipped.","digest":"sha256:a783e1e39d7fb699cf6a39d129b2b44c6a2e608679b07482fab06b6218bbd650","name":"bots-sitemap","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/crawler-files/bots-sitemap/index.md"},{"description":"Claims the canonical agent URL is https://agents.catastrophic.io/echo. Also served at /.well-known/agent.json for the older Google A2A path.","digest":"sha256:478f4de77b46c5881b516728d48fc7a046464b47841317659fffd1a4fbb3001d","name":"agent-card","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/agent-card/index.md"},{"description":"Parametric chaos for the Agent Skills Discovery v0.2.0 index. Four modes covering digest mismatch, missing schema reference, dead skill URLs, and stale schema-version declarations. The spec is at v0.2.0 (cloudflare/agent-skills-discovery-rfc) — less volatile than MCP but still pre-1.0; modes target the stable core shape.","digest":"sha256:2a307bb8c371eaa117e477b25a624b98320e5b7183d195c377b86547f0f6447c","name":"agent-skills-index","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/agent-skills-index/index.md"},{"description":"Parametric chaos for the SEP-1649 MCP Server Card. Four modes covering transport-omission, protocol-version mismatch, dead transport URLs, and schema-invalid documents. The spec is still moving (modelcontextprotocol#2127); these modes target the stable core shape and may need realignment when 1.0 lands.","digest":"sha256:a747e9b05cdbab8e322fc401b007ca61680b63b3cfc225eabae1594792788217","name":"mcp-server-card","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/mcp-server-card/index.md"},{"description":"Claims the OAuth issuer is https://identity.catastrophic.io. Disagrees with the OIDC document above and with the agent card.","digest":"sha256:7340362c4dff1ff0838c348e46720a157fb07939bc6db7eac70deec222d0131c","name":"oauth-authorization-server","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/oauth-authorization-server/index.md"},{"description":"Fourth sibling in the discovery quartet (OIDC + AS + agent-card + this). RFC 9728 Protected Resource Metadata describes the resource-server side of the OAuth dance. The default mode joins the conflicting-discovery group; an agent walking all four wells-known finds four contradictory authority claims to reconcile.","digest":"sha256:8252e6aa2e5f1f296e7e39699b0825cf34e4132e11297cf61daf4239e3e5fc1d","name":"oauth-protected-resource","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/oauth-protected-resource/index.md"},{"description":"Claims the OIDC issuer is https://catastrophic.io. Compare against the sibling OAuth AS document and the agent card — they each claim a different authoritative host.","digest":"sha256:dc9de4b662fd17681fa23811855c20b5c274243611a5736e02cf12a74e5d433b","name":"openid-configuration","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/discovery-siblings/openid-configuration/index.md"},{"description":"AT Protocol (Bluesky) handle verification. A domain proves it owns a DID by returning the DID identifier in this file. Modes return malformed DIDs, multiple lines (spec says single), wrong DID methods, or empty content.","digest":"sha256:3b0c7c9a118e91a1969f1f58f1e8f9faaf99595f1e6685f6c4ff4211d5daa333","name":"bots-atproto-did","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/federated-identity/bots-atproto-did/index.md"},{"description":"Fediverse server discovery document. Mastodon, Pleroma, Misskey, and other federated software fetch this to advertise their identity. Modes break the link's rel value, claim impossible versions, or point at other hosts.","digest":"sha256:9685445af54af4c3db7dc6f8a6aef85a28e6db46f3b6e1a0375047e90af352e3","name":"bots-nodeinfo","type":"skill-md","url":"https://catastrophic.io/bots/endpoints/federated-identity/bots-nodeinfo/index.md"},{"description":"Token-keyed retry chaos. The first call for a given id returns version 1; any subsequent call for the same id within a 60-second window returns version 2 — same response shape, different data. Tests whether retry logic silently picks up changed data without noticing.","digest":"sha256:a1bbdd27c516492b37fe3eb2e1519e208166b1411b41ab5beea0fa192118d4b8","name":"retry-mismatch","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/agent/retry-mismatch/index.md"},{"description":"Returns a structurally-valid JSON response matching one of six common discovery schemas, where every URL points at something that doesn't exist and every claim about capabilities is a lie. The shape passes schema validators; the values fail any consumer that actually tries to resolve them. Set ?ai=true to have an edge LLM generate a fresh, different drifted document on every call.","digest":"sha256:d4e5fa24c7118c4ffda4ca2b30218a930501c33ba50f7f52c5723791f8c7f675","name":"semantic-drift","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/agent/semantic-drift/index.md"},{"description":"Returns 401 with a WWW-Authenticate challenge when no Authorization header is present. If any Authorization header is sent — regardless of its value — returns 200. This lets clients exercise the full challenge-response cycle without needing real credentials.","digest":"sha256:4c3f5a26a27bec2a371bf90065bffda7fb1591beae4fa4e34d755988a0ba29d4","name":"auth-required","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/auth/auth-required/index.md"},{"description":"Returns 401 with WWW-Authenticate challenges that contradict each other, omit required attributes, violate quoting rules, or use undefined schemes. Tests how auth clients cope when the challenge itself is broken.","digest":"sha256:94532c296ba56923ed814504ca59caf1d72a71c0d28e46f0a602741fde4c2a60","name":"auth","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/auth/auth/index.md"},{"description":"Returns 200 with a JWT the server claims to have accepted, demonstrating broken token-validation logic. The chaos is server acceptance of tokens that should be rejected. Default accepts alg:none tokens with no signature.","digest":"sha256:5625e8a318ee7819a9ebfb29ad75812b6b80d04e2f782605a237e5bcfcaeb6d5","name":"jwt","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/auth/jwt/index.md"},{"description":"Sends broken or missing CORS headers in four distinct modes. Handles OPTIONS preflight as well as regular methods, so behavior is testable end-to-end from a browser.","digest":"sha256:05d0f298514b4bc37a7dbbb97d4df5cdc1fa6d2a0e353811c11fab690034caa4","name":"cors-broken","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/cors/cors-broken/index.md"},{"description":"Sends a Content-Type: application/json header and an opening fragment of a JSON object, then closes the stream cleanly after N bytes. No Content-Length, so there's no size mismatch to detect — the stream just ends before the body is complete. The result will fail JSON.parse() but doesn't look like a network error.","digest":"sha256:a126d9fd8a6404180ae36bdf876610658298a40e3f92388d96038c95e5a2e61c","name":"partial-stream","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/delivery/partial-stream/index.md"},{"description":"Sends a Content-Length header claiming the full payload size, but closes the stream early. Tests how clients handle responses that end before they should.","digest":"sha256:f6393de71711e78cf17b90fe628e694b64da2a3ebea5ab102e7087875ec2e0e2","name":"truncate","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/delivery/truncate/index.md"},{"description":"Third sibling. Claims the canonical agent lives at https://agents.catastrophic.io/echo — yet another host. Also served at /.well-known/agent.json for the older Google A2A path.","digest":"sha256:fea50b2920163688f4b2893de3448836ec09c34e43fea0855bddac33ac64f5c1","name":"agent-card","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/agent-card/index.md"},{"description":"Parametric chaos for the Agent Skills Discovery v0.2.0 index — the well-known document AI agents check to learn what skills a host advertises. Default mode is an index whose declared sha256 digest doesn't match the skill body it references; other modes cover missing schema reference, 404 skill URLs, and stale schema versions.","digest":"sha256:7d36384851e0b0375e448be89e503eb1746f368c638a7e9f94b652e08ee9f07b","name":"agent-skills-index","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/agent-skills-index/index.md"},{"description":"Parametric chaos for the SEP-1649 MCP Server Card — the well-known document AI agents check to learn what tools, prompts, and resources an MCP server claims to offer. Default mode is a card with capabilities but no transport field; other modes cover protocol-version mismatch, dead transport URLs, and schema-invalid documents.","digest":"sha256:6c8562e56f98eb1af4423362927b7c6cadce22ae19be4fcc8e89cb293bcd81db","name":"mcp-server-card","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/mcp-server-card/index.md"},{"description":"Second sibling. Claims the OAuth issuer is https://identity.catastrophic.io — a different host than the OIDC document above. An agent reconciling these two will need to decide which authority wins (or fail safely).","digest":"sha256:0b3bb4797879ff4bfb22959dc3e3e7d2172aa29d991fdad78b069da6d8b2ddb1","name":"oauth-authorization-server","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/oauth-authorization-server/index.md"},{"description":"RFC 9728 Protected Resource Metadata for the OAuth client-server chaos quartet. Default mode joins the conflicting-discovery group with an issuer that disagrees with the OIDC and AS documents; other modes exercise resource-server-specific flaws (unreachable AS, unregistered bearer methods, mismatched resource identifier).","digest":"sha256:b2da9f2e1f1e13718ab0b8bc223a5c10f444613ed9bcbec66bc7a6e136efcdad","name":"oauth-protected-resource","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/oauth-protected-resource/index.md"},{"description":"First of three sibling discovery documents that deliberately contradict each other. Claims the OIDC issuer is https://catastrophic.io. Compare against the OAuth AS doc and the agent card.","digest":"sha256:650cc146e72dcf7ad612326e8bdcc909daecab4a4928af02361d4e60b0ce5caf","name":"openid-configuration","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/openid-configuration/index.md"},{"description":"Parametric chaos for well-known discovery schemas. Pick a schema (openid-configuration, oauth-authorization-server, webfinger, jwks, host-meta, agent-card) and a mode (semantic, missing-fields, wrong-types). The response is served with the correct Content-Type for the chosen schema, so clients that key on Content-Type behave as they would against a real server. Set ?ai=true to have an edge LLM generate a fresh source on each call — the mode transformation is then applied on top.","digest":"sha256:69a4b20fdd62f983a7a361f23d9608d81048dade183a377a6de17ed93126ae48","name":"well-known-chaos","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/discovery/well-known-chaos/index.md"},{"description":"Returns a failure response with probability p, otherwise 200. Both outcomes include X-Chaos-Flaky-Failed and X-Chaos-Flaky-Probability headers so clients can distinguish a chaos failure from a real one.","digest":"sha256:27db4371479e73e9c9a0b6e455089d8a592959b0cf8928055f4dff6ef4001346","name":"flaky","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/fault-injection/flaky/index.md"},{"description":"Selects one chaos endpoint at random and returns its response. The selected path is reported in X-Chaos-Random-From so failing clients can pin down which scenario tripped them. Streaming endpoints (/slow, /drip, /partial-stream) are excluded so each pick returns promptly.","digest":"sha256:7dd52e793fade5d4dd527e9fbd9cbd11d5bf039a6fa0c2c3b86b29092093d38c","name":"random","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/fault-injection/random/index.md"},{"description":"Returns ActivityStreams 2.0 / ActivityPub objects with spec violations. Default omits the required @context. Use ?mode= to isolate other violations: a type outside the AS2 vocabulary, a non-URI actor, or an object whose shape doesn't match its activity type. Consumed by Mastodon, Misskey, and other Fediverse servers during federation.","digest":"sha256:88c581e6c3827769f86659ec16339505517c2ef90226f45dc4f7e8bccd92c100","name":"activitystreams","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/activitystreams/index.md"},{"description":"Returns Atom 1.0 feeds (RFC 4287) with spec violations. Default omits the required entry id element. Use ?mode= to isolate other violations: wrong date format, missing author, or incorrect rel=self link.","digest":"sha256:f3608b52ea1b358660969a015fbbc9158f3580c2c747fa75b91f0de318b9ae3e","name":"atom","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/atom/index.md"},{"description":"Returns CloudEvents 1.0 envelopes with spec violations. Default claims specversion 0.3 instead of 1.0. Use ?mode= to isolate other violations: `type` as an integer, a datacontenttype mismatch, or both `data` and `data_base64` present.","digest":"sha256:34b8c961c0062af14e7475d5e8212733aa2a30916c1bc4a2e44105c193fb2d4c","name":"cloudevents","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/cloudevents/index.md"},{"description":"Returns CSV with RFC 4180 corner-case violations: unquoted commas, embedded newlines, UTF-8 BOM at start, ragged column counts. Targets data pipelines, BI tools, and ML preprocessing — anywhere CSV is the lingua franca and parsers vary in strictness.","digest":"sha256:53df635acc5456ae57836843de8e1dc93cab0a66467668067d879f906759c71a","name":"csv","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/csv/index.md"},{"description":"Returns GeoJSON documents with RFC 7946 violations. Default returns a Polygon whose ring does not close. Use ?mode= to isolate other violations: lat/lon axis swap, type/coordinates mismatch, or absent `properties` member.","digest":"sha256:5b52171452322c762f85b04f9e468d0b4becc24fb7918e2c4188de0b456892ec","name":"geojson","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/geojson/index.md"},{"description":"Returns HTML documents with deliberate structural flaws. Useful for testing browser parsers, scraper robustness, and ML preprocessing pipelines that ingest HTML. Default mode produces visible misnesting on a bare GET; other modes target charset, doctype, or unterminated-tag handling.","digest":"sha256:d2b2ef08fa8593a94b69c33b97310653bd0181552db60fbeb4bdf9863418ae38","name":"html","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/html/index.md"},{"description":"Image responses where the declared MIME type, magic bytes, embedded dimensions, chunk framing, or format metadata disagree with the actual content. Seven modes across PNG, JPEG, WebP, GIF, and AVIF test how image pipelines handle metadata-vs-bytes mismatches.","digest":"sha256:8db1d941db5be0e5366dcfa2ab9592af51584c19ba5382529679053d36eaae9e","name":"image","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/image/index.md"},{"description":"Returns JSON Feed 1.1 documents with semantic violations that parse as valid JSON but break spec compliance. Default sends a bare version string instead of the required URL. Use ?mode= to isolate other violations.","digest":"sha256:8a113d24608719b55e323805a904568af87cdfe8797cced4ef7c03dc39ca9c14","name":"json-feed","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/json-feed/index.md"},{"description":"Returns syntactically invalid JSON with a Content-Type of application/json. Default bundles three flaws in one payload (missing closing brace, unquoted key, trailing comma). Use ?mode= to isolate a single failure mode for targeted parser testing.","digest":"sha256:241d47cee0b662b0549e2f4daca04f42cae0f9e954a69cf8ce98193210411f4d","name":"json","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/json/index.md"},{"description":"Returns JSON:API responses with spec-level violations. Default returns `data` as an array when a single resource is expected. Use ?mode= to isolate other violations: orphaned included resources, missing `id`, or missing `type`.","digest":"sha256:bdfc75873229e2d6f21304b069ab4c5f366cf3ccb585a2a5822df9dbb06632af","name":"jsonapi","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/jsonapi/index.md"},{"description":"Returns JSON Lines (NDJSON) streams with stream-level violations. Targets ML pipelines, log aggregators, and AI chat exports — anywhere line-delimited JSON is consumed. Default mode is schema drift mid-stream; other modes cover blank lines, partial final records, and BOM start.","digest":"sha256:ddc5fdc2640708ca78a7cec4ff3cc6cbafcc7738accac727b3e7caae139048b5","name":"jsonl","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/jsonl/index.md"},{"description":"Returns JSON-RPC 2.0 responses with spec-level violations. Default omits the required `jsonrpc` version field. Use ?mode= to isolate other violations: mismatched response id, both result and error present, or a reserved-but-unassigned error code.","digest":"sha256:92cd2d60394319d29daf4968fd2dbf74ee8ed837cfa2efd4432e14587189cca3","name":"jsonrpc","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/jsonrpc/index.md"},{"description":"Returns JWT payload (claims) objects with RFC 7519 violations. Default sends `exp` as a string instead of a NumericDate. Use ?mode= to isolate other violations: malformed iss, mixed-type aud array, or a reserved claim with the wrong type. Distinct from /jwt (token-validation flaws) and /auth (challenge framing).","digest":"sha256:cc35e9da7a5566fbd30c1458285ba5990cf9c0ff607cee0a821fa94d051e6f13","name":"jwt-payload","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/jwt-payload/index.md"},{"description":"Returns a multipart/form-data response with RFC 7578 parser-adversity. Default declares one boundary in the Content-Type and uses a different one in the body. Use ?mode= to isolate other violations: missing terminating CRLF, ambiguous Content-Disposition `name=` parameters, or nested multipart bodies.","digest":"sha256:b9ca6c1c2f92026e66710b26d39bbd5c059d62f7406d1d7311c89042ebf36d91","name":"multipart","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/multipart/index.md"},{"description":"Returns RFC 6749 §5.1 token responses with schema violations. Default returns `expires_in` as a string instead of an integer. Use ?mode= to isolate other violations: comma-delimited scope, nonstandard token_type, or id_token without the openid scope.","digest":"sha256:12366d1d2d8b34cc0ce6ca71485ba15249ad8541b547615caa4b96ee88d83e7d","name":"oauth-token","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/oauth-token/index.md"},{"description":"Office Open XML container responses (DOCX, XLSX, PPTX) where one structural part of the package deliberately lies — wrong content type declaration, missing referenced part, dangling image relationship, or [Content_Types].xml claiming the package is multiple formats simultaneously. Macro-enabled containers, encrypted OOXML, and embedded OLE objects are deliberately not served — see the note below.","digest":"sha256:e55c96d09e145480be57a2288d50123dc75cec85ca8aadc2d02f47589d11cd7e","name":"ooxml","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/ooxml/index.md"},{"description":"Returns a structurally flawed PDF where one element of the object graph deliberately lies — wrong xref byte offsets, a page tree claiming 100 pages when only one exists, a trailer referencing a nonexistent encryption dictionary, or a JavaScript OpenAction that fires on open. Default mode ships wrong xref offsets, the most fundamental structural lie.","digest":"sha256:5241df4368c72f69921940a6d3c5ba01775dcd3bfefa20840c5cca74bdbfcc39","name":"pdf","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/pdf/index.md"},{"description":"Returns RFC 9457 Problem Details objects with spec violations. Default drops the required `type` field. Use ?mode= to isolate other violations: `status` as a string, a non-URI `instance`, or a Content-Type that claims application/json instead of application/problem+json.","digest":"sha256:084353c9b833a1de955ed98f9999837f8e1ac629d128d19ef042efbd03ab99af","name":"problem-details","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/problem-details/index.md"},{"description":"Returns RSS 2.0 feeds with spec violations. Default omits the required channel title. Use ?mode= to isolate other violations: wrong date format, non-URL guid marked as permalink, or enclosure MIME type lie.","digest":"sha256:84375559c1a3d9aa580d7cc815e189a9af0c78d4425af3e5b382ae2602571a43","name":"rss","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/rss/index.md"},{"description":"Returns Schema.org / JSON-LD documents with vocabulary and context violations. Default points @context at a non-existent IRI. Use ?mode= to isolate other violations: unknown @type, missing required properties, or a context array that shadows a schema.org term.","digest":"sha256:5c1e38a6d6eb0a12a17bca3f7a201915e793abfa847a84a520016aac085fc207","name":"schema-org","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/schema-org/index.md"},{"description":"Returns a Server-Sent Events stream with WHATWG EventSource spec violations. Default sends payload lines with no `data:` prefix. Use ?mode= to isolate other violations: named events with no listeners, discontinuous id ordering, or mixed CRLF/LF line endings.","digest":"sha256:af1fd2a61fb0734b27df5b0cf949b73045924b1a70a76435ad4ccee3ee404d4f","name":"sse","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/sse/index.md"},{"description":"Returns SVG documents that misbehave for browser renderers, image processors, and XML-strict parsers. SVG is an XML+rendering hybrid so chaos modes span both worlds: malformed XML structure, external-resource references, recursive \u003cuse\u003e chains, and non-conformant namespaces.","digest":"sha256:cbba940daa786f3265cdf438b0c937363849f8a94b63c46109049baf669b5f45","name":"svg","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/svg/index.md"},{"description":"Returns TOML documents with TOML 1.0 spec violations and parser ambiguity. Default mixes int, string, and float in a single array. Use ?mode= to isolate other violations: unquoted datetime, duplicate tables, illegal nesting, impossible offsets, dotted-key/table collisions, or trailing commas in inline tables.","digest":"sha256:16ac370810d146deb13d4bc843ca76b651d4a6111b215f49b9ced234a2723028","name":"toml","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/toml/index.md"},{"description":"Returns W3C Web Annotation objects with spec violations. Default omits the required `id` field. Use ?mode= to isolate other violations: wrong body type, invalid motivation vocabulary, or inconsistent target shape.","digest":"sha256:71fa063d2402796cf89510e880ad57b0968b3c71e81beab77ad470291655ecba","name":"web-annotation","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/web-annotation/index.md"},{"description":"Returns XML documents with parser-attack or well-formedness flaws. Targets SOAP, B2B, RSS/sitemap, and config-file ingestion pipelines. Default mode is visible misnesting; other modes cover entity-expansion DoS, external-entity references, and declaration-vs-body encoding mismatch.","digest":"sha256:7a36d4061f13d6a7051488fe68e8c9ee069d543ee4cd19c5d635510e503802fa","name":"xml","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/xml/index.md"},{"description":"Returns YAML documents that exploit the YAML 1.1 vs 1.2 split and parser ambiguity. Default sends the Norway problem: bare `NO/YES/ON/OFF` scalars that YAML 1.1 parsers coerce to booleans while YAML 1.2 parsers leave as strings. Use ?mode= to isolate other violations: recursive anchors, duplicate keys, or tag lies.","digest":"sha256:c508013617b83c69708ae5c13e1c7fc1b259f71c821bc17c72e7988cc5e9b64e","name":"yaml","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/yaml/index.md"},{"description":"ZIP archive responses with a deliberate structural flaw — wrong CRC32, central-directory-vs-local-header disagreement, ZIP64 size lie, or truncated central directory. Tests how archive extractors, package managers, and scanners handle metadata-vs-bytes contradictions. Zip-slip and zip-bomb are deliberately not served — see the note below.","digest":"sha256:37bf96ffe1dcf260debac7d2099e04d44a63b04d20ff5174e6b42a05284841ac","name":"zip","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/format/zip/index.md"},{"description":"Returns binary byte payloads with Content-Length or Content-Type lies. Default claims twice as many bytes as it sends, hanging clients that wait for the full declared body. Use ?mode= to isolate other violations.","digest":"sha256:3fa3b79c1e17babe331a5bb358cfbb329aa3d13e153a2d1cc319dc70730a1088","name":"bytes","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/bytes/index.md"},{"description":"Sends contradictory Cache-Control directives. Default bundles three contradictions in one header (no-store with max-age, no-cache with immutable, private with s-maxage). Use ?mode= to test how a specific RFC 9111 conflict is resolved by your cache or proxy.","digest":"sha256:fd434c67e725d8bf8f06bb8269e429f4b3a3067950ef0676b407f9eed15c9b1d","name":"cache-confused","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/cache-confused/index.md"},{"description":"Returns responses where Content-Encoding lies about the body's actual compression state, or where the body is gzip-compressed but the header doesn't say so. Tests how clients and proxies handle disagreement between encoding metadata and bytes.","digest":"sha256:60f8e174169dba0f9116f0d35886a46b9cf1ac4043ea83778c107e0097fa2cd9","name":"compression","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/compression/index.md"},{"description":"Returns malformed Set-Cookie headers that real-world clients silently drop, accept differently, or argue about. Ten modes covering SameSite, expiry, prefix, folding, domain, and CHIPS violations.","digest":"sha256:c15083e58f65ad8e65e6ffd913346fed1080c292357faeea8747298489c01098","name":"cookie","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/cookie/index.md"},{"description":"Returns ETag and Last-Modified headers that break HTTP conditional-request semantics. Tests caches, CDNs, and clients that rely on validators.","digest":"sha256:c999e40d57563a496c6cd02da2c7cb87c102818a3e578ebdff33b2d031897164","name":"etag","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/etag/index.md"},{"description":"Returns N custom response headers. Tests header size limits in clients, proxies, and load balancers. Many stacks reject or silently drop responses above a threshold.","digest":"sha256:e8138cecfc6f1768a9fbc058182fa5d245d49eeb049e233521de47510231dc95","name":"header-flood","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/header-flood/index.md"},{"description":"Returns HTTP Range responses that misbehave. Tests clients that rely on partial-content semantics: resumable downloads, video streaming, CDN slicing. Default sends a 206 with the correct Content-Range header but the wrong body bytes.","digest":"sha256:6436824ca0fd782d1c7f9c63f37e7c1480cf464811ad4b7c52ad62da2c6cb7ad","name":"range","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/range/index.md"},{"description":"Returns a body whose declared Content-Type does not match its actual format. Default sends a JSON body labelled text/html. Other modes mismatch JSON-as-PNG, XML-as-JSON, HTML-as-JSON, or omit the Content-Type entirely. The X-Chaos-Body-Format header exposes the body's real format so clients can detect the mismatch programmatically.","digest":"sha256:87940006f976ae1d3426041b80770104008fad192a189d72ec34c219c96c73a2","name":"wrong-content-type","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/headers-and-caching/wrong-content-type/index.md"},{"description":"Starts responding immediately but streams the body in small chunks with a configurable delay between each chunk. Unlike /slow, the response headers arrive right away — only the body trickles.","digest":"sha256:7fb9a04425dbff781e6fecd108c2bb64c81e122df351a7126ee45f29da4ff609","name":"drip","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/latency/drip/index.md"},{"description":"Sleeps for the specified number of milliseconds, then returns 200 with a JSON body confirming the delay.","digest":"sha256:55a4f5943f4d5b20274b1d51710c137f9860fa12aa6b09c82c676a46df793c74","name":"slow","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/latency/slow/index.md"},{"description":"An endpoint that claims (via Allow or OPTIONS) to support GET/POST/PUT/PATCH/DELETE/OPTIONS but only actually handles GET. The chaos varies by mode: lying Allow header, silent success on wrong method, 405 without Allow, or OPTIONS that contradicts reality.","digest":"sha256:2677d7ab01c37ccaf7027dcd80c931d7467a1c4eb9096e038b9f78d1a7b13251","name":"method","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/method-handling/method/index.md"},{"description":"Returns paginated collections whose total_items lies, whose pages overlap each other, whose Link headers loop back to page 1, or whose returned size drifts from what the client requested.","digest":"sha256:5dd9bef61ece96ab276e9e6cf25ae3e28e5f503c82656e80f337434ef6eafc3a","name":"pagination","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/pagination/pagination/index.md"},{"description":"Always returns 429 Too Many Requests with Retry-After and X-RateLimit-* headers. Use ?lie=true to send a deceptive Retry-After value — the response body reports the real requested value so you can verify whether your client respected the header.","digest":"sha256:f7c27fdc549a813913099b41af1cff1df9bd78314777edff6b377212adf2e4da","name":"rate-limit","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/rate-limiting/rate-limit/index.md"},{"description":"Redirects N times via 302 before returning a final 200. Each hop decrements the counter in the query string. Tests redirect-following limits, history tracking, and loop detection.","digest":"sha256:cab888894e27940e31be8695f91b68c739aabf4120e32577cd3f7139bdf30b84","name":"redirect-chain","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/redirects/redirect-chain/index.md"},{"description":"Returns the requested HTTP status code. Body is JSON describing the response, except for 204 and 304 which return no body per RFC 9110.","digest":"sha256:99c04a0f605967a178896f1c0de57070e5a146e5580b8d605cfaa5304034e670","name":"status-code","type":"skill-md","url":"https://catastrophic.io/chaos/endpoints/status-codes/status-code/index.md"},{"description":"Returns a discovery document whose URLs all resolve to real stubs on this same subdomain. Counterpart to the chaos /semantic-drift endpoint, where the shape passes validation but every claimed URL is dead.","digest":"sha256:663fa148597e4d34fd9241d2bdf0424cd3e30810ad830fda5e4acbc438d56580","name":"semantic-drift","type":"skill-md","url":"https://catastrophic.io/not/endpoints/agent/semantic-drift/index.md"},{"description":"iOS universal-links manifest. Served as application/json with a single applinks block, an appID in TEAMID.bundle format, and a non-empty paths array. Apple's verifier should accept without warnings.","digest":"sha256:c8a90e8f5d214e0ef0a2eb4607cf6624f5df64c84945031467631dfae916674e","name":"not-aasa","type":"skill-md","url":"https://catastrophic.io/not/endpoints/app-linking/not-aasa/index.md"},{"description":"Android App Links manifest. Single statement asserting delegate_permission with a get_login_creds relation, a well-formed android_app target including SHA-256 fingerprint in the standard colon-delimited 64-byte hex format.","digest":"sha256:b288cfb814407e788b78ca12ab2420f687bc5b7f1e6207cd80b63172a338b4d1","name":"not-assetlinks","type":"skill-md","url":"https://catastrophic.io/not/endpoints/app-linking/not-assetlinks/index.md"},{"description":"PWA web app manifest with all required fields populated, a non-empty icons array, internally consistent display modes, valid colour values, and matching name/short_name. PWA installers should offer the install prompt.","digest":"sha256:cace38bd1fa7743715a381c22a53936bf74ce19034fc087151cbb3057f96de18","name":"not-manifest","type":"skill-md","url":"https://catastrophic.io/not/endpoints/app-linking/not-manifest/index.md"},{"description":"Returns 401 with a JSON body listing every check a correct JWT validator applies: alg pinned to RS256, alg:none rejected, exp checked, nbf checked, kid sanitized before key lookup, signature required. Counterpart to /jwt, which accepts tokens that fail these checks.","digest":"sha256:7953b0f4879c7d5634c42673ce6685aaa206796fc21afd12526f090aa999480a","name":"jwt","type":"skill-md","url":"https://catastrophic.io/not/endpoints/auth/jwt/index.md"},{"description":"Minimal valid IAB ads.txt. Single authorized-seller line with a real-format domain, publisher account ID, and DIRECT relationship. Not operationally meaningful (catastrophic.io doesn't sell ads) but parses without complaint.","digest":"sha256:f9cd28c330a71d506def0a876df4b305435b416a928b870336bead5b8b7d8feb","name":"not-ads-txt","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-ads-txt/index.md"},{"description":"Well-formed ai.txt with non-contradictory directives. Allows the major real AI crawlers explicitly, sets no impossible delays, no fake bot names.","digest":"sha256:aa69ab51f2a0b6895361f8c922976c4bbd079bb1392038c14d20f4ffbca9f794","name":"not-ai-txt","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-ai-txt/index.md"},{"description":"Standard humanstxt.org format. /* TEAM */ and /* SITE */ sections, real-looking field values, no recursion, no time paradoxes.","digest":"sha256:088035d9045f9ab4ea22f1667f57c4952a5c41bf1a2e6ee54d5b69f598a4c67e","name":"not-humans","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-humans/index.md"},{"description":"answer.ai-format llms.txt with a one-H1 heading, brief description, and only resolvable links. Lightweight version of the hub's llms.txt — points at this control surface, not the whole catalog.","digest":"sha256:ab083f3bf7104f27e337d1e1043cecbf2dc41f93717d7c5a05e081b685e8759d","name":"not-llms","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-llms/index.md"},{"description":"Standards-compliant robots.txt with a clean Allow-all, named explicit allows for major AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, Bytespider), and a sitemap reference. Mirrors the hub's operational robots.txt.","digest":"sha256:e566a87247dce7badf01ef632083d42da49dc8649eb24b5019c8fda197f02196","name":"not-robots","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-robots/index.md"},{"description":"RFC 9116 compliant security.txt. Expires field is in the future, Contact URL resolves, Canonical matches the served URL. Validators should accept without warnings.","digest":"sha256:a44da0dc258e84d62753c96d1b082f80830a77071dd6a76d56e286b39ba304d1","name":"not-security","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-security/index.md"},{"description":"Valid XML sitemap with sane recent lastmod dates and URLs that all resolve. Minimal — lists this host's well-known control endpoints, not an exhaustive crawl.","digest":"sha256:5b8ebf3210571688ac618610fd5376078d388ee5b86fa1941ad71c50de0e7dfb","name":"not-sitemap","type":"skill-md","url":"https://catastrophic.io/not/endpoints/crawler-files/not-sitemap/index.md"},{"description":"Returns a complete, well-formed JSON body — no early close. Counterpart to the chaos /partial-stream endpoint, which sends a Content-Type: application/json header and an opening JSON fragment, then closes mid-payload.","digest":"sha256:2e1896f1b16a8b36d731c69224248176144887ae92c48b6aef4a2c9e299a5825","name":"partial-stream","type":"skill-md","url":"https://catastrophic.io/not/endpoints/delivery/partial-stream/index.md"},{"description":"Returns a body of `at` bytes with a Content-Length header that matches the actual bytes sent. Counterpart to the chaos /truncate endpoint, which lies about its body length.","digest":"sha256:7c3efaefcee3dbc54026d54e7a419e90530791889aa8d0e7fc521448e29d0c9f","name":"truncate","type":"skill-md","url":"https://catastrophic.io/not/endpoints/delivery/truncate/index.md"},{"description":"Agent card whose URL matches the issuer claimed by the OIDC and OAuth discovery docs. The three sibling .well-known documents agree on a single authority.","digest":"sha256:a98f554dfcb8c5a5c0f6e5262fef75c4afdfc9f8cdec71aa902e94edac0c2185","name":"agent-card","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/agent-card/index.md"},{"description":"Agent Skills Discovery v0.2.0 index control. References a single skill stub at not.catastrophic.io/.well-known/agent-skills/echo.json so the discovery chain resolves end-to-end. The sha256 digest is all-zeros — obviously fake but format-correct, same pattern AASA and assetlinks use on this host. Build against this baseline; flip hostname to chaos to exercise the failure modes.","digest":"sha256:ee530bc9ff547f3a4bdd23c5837a9945db2263b2872d5eab3b7705a56663f4c9","name":"agent-skills-index","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/agent-skills-index/index.md"},{"description":"SEP-1649 MCP Server Card control. Self-consistent: serverInfo + protocolVersion that matches the capabilities + transport URL that actually resolves on this same host (to a minimal MCP error stub at /mcp returning a valid JSON-RPC 'Method not found' response). Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the failure modes.","digest":"sha256:74d933efcdefa3269773fb63859b51ffb870edc6862127013ce321ddd22d7121","name":"mcp-server-card","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/mcp-server-card/index.md"},{"description":"OAuth Authorization Server metadata claiming the same issuer as the OIDC discovery doc above. Counterpart to the chaos document, which deliberately disagrees with its siblings.","digest":"sha256:94f3152d9d8ddc984dca742da890cdde991afc1f6ff36b51f85f34c160f12dc2","name":"oauth-authorization-server","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/oauth-authorization-server/index.md"},{"description":"RFC 9728 Protected Resource Metadata control. resource matches the URL the document is served from; authorization_servers points at not.catastrophic.io/.well-known/oauth-authorization-server (a well-formed AS doc on this same host) so the discovery chain resolves end-to-end. bearer_methods_supported uses only IANA-registered values.","digest":"sha256:ae9fe9a953488a63a581e15f7970b733bb9b0b307a70de58761fcfac09297260","name":"oauth-protected-resource","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/oauth-protected-resource/index.md"},{"description":"OIDC discovery doc whose issuer is `https://not.catastrophic.io` and whose endpoint URLs all resolve to real stubs on this same subdomain. Self-consistent with the OAuth AS and agent-card docs.","digest":"sha256:21a10bc442a0b7a27bdcd3be694f041fcb4d741be6c6194e7d62653a99d8fc28","name":"openid-configuration","type":"skill-md","url":"https://catastrophic.io/not/endpoints/discovery/openid-configuration/index.md"},{"description":"AT Protocol (Bluesky) handle verification. Returns a single line in valid DID format using the did:web method, pointing at this same host — so the binding is self-consistent.","digest":"sha256:c6dc595f7c8bd182ed107e3fbbb11a3db74e490b49cc6267923b25fc487a2111","name":"not-atproto-did","type":"skill-md","url":"https://catastrophic.io/not/endpoints/federated-identity/not-atproto-did/index.md"},{"description":"Backing nodeinfo 2.0 document linked from /.well-known/nodeinfo. Minimal valid shape — software name, version, usage stats, openness flags — so the link chain from /.well-known/nodeinfo actually resolves.","digest":"sha256:fed30cffd057a6bc433763b481102239f251cb0ca569cf3d935b1870db765d42","name":"not-nodeinfo-doc","type":"skill-md","url":"https://catastrophic.io/not/endpoints/federated-identity/not-nodeinfo-doc/index.md"},{"description":"Fediverse server discovery document with a valid links array. The rel value matches the standard nodeinfo schema URL; the href points at a real /nodeinfo/2.0 endpoint on the same host.","digest":"sha256:9beda01dd14ea5afbfa539a9d240480e0927bb7711d0ec8e2d67ae764d3a6865","name":"not-nodeinfo","type":"skill-md","url":"https://catastrophic.io/not/endpoints/federated-identity/not-nodeinfo/index.md"},{"description":"Returns a well-formed ActivityStreams 2.0 / ActivityPub object: @context present, `type` from the AS2 vocabulary, `actor` a dereferenceable URI, `object` consistent with the activity type. Served as application/activity+json. Counterpart to /activitystreams, which ships one of four violations.","digest":"sha256:26eb7d5ca328cbb74bfd83449c1838b93c27e12a538a49e0c8333a857c695030","name":"activitystreams","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/activitystreams/index.md"},{"description":"Returns a well-formed Atom 1.0 feed: every entry has an id, updated uses RFC 3339, author is present at feed level, and rel=self points to this feed's own URL. Counterpart to /atom, which ships one of four violations.","digest":"sha256:e62d49280c0cba4019e1e72f71e3f176f5aba72ee0f235d5365a50731bfe758b","name":"atom","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/atom/index.md"},{"description":"Returns a well-formed CloudEvents 1.0 envelope: `specversion` is \"1.0\", `type` is a non-empty string, `datacontenttype` matches the `data` shape, only `data` present (no `data_base64`). Served as application/cloudevents+json. Counterpart to the chaos /cloudevents endpoint.","digest":"sha256:758111691ff99ecedc3e1e1f5049c308279d73af76f81dd38d22ddc2018f4479","name":"cloudevents","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/cloudevents/index.md"},{"description":"RFC 4180 compliant CSV control. Header + 3 rows, all 3 columns, no BOM, fields containing commas are quoted, CRLF line endings throughout. Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the four failure modes.","digest":"sha256:e7e4fe88f8fdc69cdab09544d72801bd6031c88708164f91368f192c34daea92","name":"csv","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/csv/index.md"},{"description":"Returns a well-formed GeoJSON Feature: Polygon ring closed (first and last positions identical), coordinates in [longitude, latitude] order, `type` consistent with `coordinates` shape, `properties` member present. Served as application/geo+json. Counterpart to the chaos /geojson endpoint.","digest":"sha256:9a4b67f598d1315fe178fc7aa58162b74445dbb3046773ad9be7ee8f2a787a95","name":"geojson","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/geojson/index.md"},{"description":"Well-formed HTML control. Tags nest correctly, declared charset matches body bytes, doctype matches the markup version, no tag is left open. Use this as the parser-passes baseline; flip hostname to chaos.catastrophic.io to exercise the four failure modes.","digest":"sha256:7496d12d572b103fbfc0d7d1dfa718f21b27bab9b9fe85fcb70716973166eb92","name":"html","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/html/index.md"},{"description":"Returns a real 1×1 PNG whose magic bytes, Content-Type, Content-Length, and IHDR dimensions all agree. Counterpart to the chaos /image endpoint, which deliberately ships images whose metadata contradicts the bytes.","digest":"sha256:4d2d7b285fdd4aab6a2c0d4e6f7bced3e71ad8f59e1b58788d929eb1f8a3c615","name":"image","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/image/index.md"},{"description":"Returns a spec-compliant JSON Feed 1.1 document: `version` is the full URL, item `id` values are unique, item `url` values are absolute, and `feed_url` matches this feed's own URL. Counterpart to /json-feed, which ships one of four violations.","digest":"sha256:db14ff31a412f65deaf232f7a660f01cc5d62006531c1491aa65517b1230009a","name":"json-feed","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/json-feed/index.md"},{"description":"Returns syntactically valid JSON with a Content-Type of application/json. Counterpart to the chaos /json endpoint, which deliberately ships invalid JSON.","digest":"sha256:bf16644b084ab18a02a5131388e8d574bf0fbe23f8eff1766b47b95290ebf9e7","name":"json","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/json/index.md"},{"description":"Returns a well-formed JSON:API response: single resource object with `type`, `id`, `attributes`, and `relationships`; all `included` resources referenced by a relationship. Served as application/vnd.api+json. Counterpart to the chaos /jsonapi endpoint.","digest":"sha256:554d9b7cba720d610a3c50f3878261a4f231c99a8e784a541e133fa2078d3605","name":"jsonapi","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/jsonapi/index.md"},{"description":"Conformant NDJSON control. One valid JSON object per line, consistent schema across all records, LF line endings, trailing newline, no BOM. Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the four failure modes.","digest":"sha256:6744b4c05bc483b4aca167b94ecd0643a67d537def810afa02f23a0bae043bca","name":"jsonl","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/jsonl/index.md"},{"description":"Returns a well-formed JSON-RPC 2.0 response: `jsonrpc` version present, `id` matching the implied request, `result` present without `error`. Counterpart to the chaos /jsonrpc endpoint.","digest":"sha256:051c92f7d54ae31bbd3461b13697b51fa2e13ebc521d29352cf0020798bb3935","name":"jsonrpc","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/jsonrpc/index.md"},{"description":"Returns a well-formed JWT payload (claim set): `iss` is a URI, `sub` is a string principal identifier, `aud` is a homogeneous array of StringOrURI values, `exp` and `iat` are NumericDate integers. Counterpart to /jwt-payload, which ships one of four RFC 7519 violations.","digest":"sha256:3ff6dcb9c33b9ec7fd92475c416d7d22417c9231f7c339229b53ff8434b999a1","name":"jwt-payload","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/jwt-payload/index.md"},{"description":"Returns a well-formed multipart/form-data response: declared boundary matches body delimiter, every part has a single Content-Disposition `name=` parameter, closing boundary has the trailing CRLF, no nested multipart. Two parts: a text field and a file field. Counterpart to /multipart.","digest":"sha256:2cf35f85fe1dbfea7d42bf89d7f9d8d2ed80626d58969a7e4dafed013c039112","name":"multipart","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/multipart/index.md"},{"description":"Returns a well-formed RFC 6749 §5.1 token response: `expires_in` as integer, `scope` space-delimited, `token_type` as \"Bearer\", `refresh_token` present. Cache-Control: no-store. Counterpart to the chaos /oauth-token endpoint.","digest":"sha256:a8d05dd2d8bab87eb0a7c8d2ca3c88a5a70a466b8156e3c556d54d1e0fe6a023","name":"oauth-token","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/oauth-token/index.md"},{"description":"Returns a well-formed Office Open XML package (DOCX, XLSX, or PPTX) where [Content_Types].xml, every relationship, and every referenced part are present and self-consistent. Counterpart to the chaos /ooxml endpoint, which deliberately ships packages where one structural field lies.","digest":"sha256:c256527d3acc184373348cf74800e7d78d30cf05081c2730d45c3ac065aca07c","name":"ooxml","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/ooxml/index.md"},{"description":"Returns a well-formed PDF: five-object document (Catalog, Pages node, Page, content stream with Helvetica text, and a link annotation to catastrophic.io). xref offsets accurate, page count honest, no encryption reference, no JavaScript actions. Counterpart to the chaos /pdf endpoint.","digest":"sha256:b2949f2a1c06c1f0a9ee64a522a87119b1950b6e0dc3c1697061138e61b1d24a","name":"pdf","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/pdf/index.md"},{"description":"Returns a well-formed RFC 9457 Problem Details object: `type` URI present, `status` as integer 404, `detail` string, `instance` as a URI reference. Counterpart to the chaos /problem-details endpoint.","digest":"sha256:f539433f6024f4b10f667478cb6120a458bdc2175542dacfa340531239d128a3","name":"problem-details","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/problem-details/index.md"},{"description":"Returns a well-formed RSS 2.0 feed: channel title present, pubDate in RFC 822 format, guid is a valid permalink URL, no enclosure type lies. Counterpart to /rss, which ships one of four violations.","digest":"sha256:7f1effe1fd4582dff899ef0bce8cdf5f2bde94ff4a8cdccc17ef06ed493ba2c0","name":"rss","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/rss/index.md"},{"description":"Returns a well-formed Schema.org / JSON-LD document: @context is https://schema.org, @type is in the vocabulary, all required properties for the type are present, no context-array shadowing. Served as application/ld+json. Counterpart to /schema-org, which ships one of four violations.","digest":"sha256:37beb12629978ce97c70da823407b9299a74060a4a3a546c7ef066a3572f0e5d","name":"schema-org","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/schema-org/index.md"},{"description":"Returns a well-formed Server-Sent Events stream: `data:`, `event:`, `id:`, and `retry:` fields all correctly framed, blank-line event separators, four events then close. Served as text/event-stream. Counterpart to /sse, which ships one of four WHATWG EventSource violations.","digest":"sha256:c8414ffdb7be2f1d62abaf8dd8e6982749ad4b7d40b98014ee59827cba008d90","name":"sse","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/sse/index.md"},{"description":"Conformant SVG control. Declared SVG namespace, correctly nested tags, no external references, no \u003cuse\u003e cycles. Renders identically in every browser and SVG processor. Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the failure modes.","digest":"sha256:60884a78e9575354584bd02f828292e78606cd4c884163a21c0185ba8eeeda6c","name":"svg","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/svg/index.md"},{"description":"Returns a well-formed TOML 1.0 document: top-level scalars, sub-table, arrays of tables, RFC 3339 datetime, homogeneous arrays. Served as application/toml. Counterpart to /toml, which ships one of seven TOML 1.0 violations.","digest":"sha256:b3eabcb3119fe7ed08c1b72e38f87f82bf6797774d9e2c105c6e8ba98209ad45","name":"toml","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/toml/index.md"},{"description":"Returns a spec-compliant W3C Web Annotation object: `id` present, `body` is a TextualBody object, `motivation` is from the standard vocabulary, `target` is a URI string. Counterpart to /web-annotation, which ships one of four violations.","digest":"sha256:3b30703ef5c9b7c3d9b724c02e4f9bfb8449466a93698c0b1068e14c0b83dcce","name":"web-annotation","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/web-annotation/index.md"},{"description":"Well-formed XML control. Declaration is honest, tags nest correctly, no entity declarations, no external references, body bytes match the declared encoding. Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the failure modes.","digest":"sha256:1089ef8b2c27d1706ceef50ef01dd787f1a5daafdda186b3b932d64d6571e795","name":"xml","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/xml/index.md"},{"description":"Returns a well-formed YAML 1.2 document: scalars, mapping, sequence, and a sane anchor + merge-key. No Norway-problem scalars, no cycles, no duplicate keys, no tag lies. Served as application/yaml. Counterpart to /yaml.","digest":"sha256:86487958ee5c21bb44886292e71b20200848f8cb2b21dff77bb5ef858a82d70e","name":"yaml","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/yaml/index.md"},{"description":"Returns a well-formed STORED ZIP archive: single entry hello.txt, correct CRC32, declared sizes match the body, central directory entries agree with the local file header, EOCD present. Counterpart to the chaos /zip endpoint, which deliberately ships archives where one structural field lies.","digest":"sha256:9d8cc1617b300fd8ef4ac5ee511da15c9182e92f9c4ada610329873246b238da","name":"zip","type":"skill-md","url":"https://catastrophic.io/not/endpoints/format/zip/index.md"},{"description":"Returns n random bytes with accurate Content-Length and Content-Type: application/octet-stream. Deterministic by ?seed= for reproducibility. Counterpart to /bytes, which lies about byte count or MIME type.","digest":"sha256:1773695774d53a1ca395c1f54900ac602c6cec9ae03294ebe1fd9129345e6878","name":"bytes","type":"skill-md","url":"https://catastrophic.io/not/endpoints/headers/bytes/index.md"},{"description":"Returns a single, sensible Cache-Control directive (`public, max-age=300`). Counterpart to the chaos /cache-confused endpoint, which combines mutually contradictory directives.","digest":"sha256:a4bee4ae7cf6f0357f240668a38dc84f77144d758748e44fabcc8378ad2835c3","name":"cache-confused","type":"skill-md","url":"https://catastrophic.io/not/endpoints/headers/cache-confused/index.md"},{"description":"Returns correct HTTP Range responses: 206 with the exact requested bytes and an accurate Content-Range header, 416 for unsatisfiable ranges, 200 + full body on If-Range ETag mismatch. Counterpart to /range, which lies about which bytes it returns.","digest":"sha256:1f417106a6f8db03ba5e23c2105f1bd2db0a683914bbdc798690423923c9d5ef","name":"range","type":"skill-md","url":"https://catastrophic.io/not/endpoints/headers/range/index.md"},{"description":"Returns a JSON body labelled application/json — the Content-Type matches the body. Counterpart to the chaos /wrong-content-type endpoint, which mismatches the two on purpose.","digest":"sha256:2738b8cd338aa38ebc89ad70efc415035438284046405399beb80376c02309c6","name":"wrong-content-type","type":"skill-md","url":"https://catastrophic.io/not/endpoints/headers/wrong-content-type/index.md"},{"description":"Deterministic well-formed comment HTML for any path tail. Links to author, parent post, and sibling/related comments.","digest":"sha256:75b4d7ed9fe3974984a30463f6b37d374b796a4ee5403ff29d913e63c9f5a648","name":"infinite-html-comments","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/html-comments/index.md"},{"description":"Deterministic well-formed post HTML for any path tail. Links to author, comments on this post, and related posts.","digest":"sha256:e7a79b9a841c62b4ab9506088ab0fe1247f31edb51df68244b62084a41671717","name":"infinite-html-posts","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/html-posts/index.md"},{"description":"Deterministic well-formed product HTML for any path tail. Links to related products and reviewing users.","digest":"sha256:3d47ae04d52fc262d0de959a1814c61b9dd0b945ec86e26740a2b246de547ad2","name":"infinite-html-products","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/html-products/index.md"},{"description":"Deterministic well-formed user HTML for any path tail. Links to the user's posts, comments, and followed users.","digest":"sha256:55347fa9a9e4283a78534a527cc7124c3547df03f71bdf140e1b143120ff56d4","name":"infinite-html-users","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/html-users/index.md"},{"description":"Deterministic well-formed comment JSON for any path tail.","digest":"sha256:31d2d19f1c06182197c479349120f0e9eeecf7f9ac9327b5ff8a349655ba80ea","name":"infinite-json-comments","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/json-comments/index.md"},{"description":"Deterministic well-formed post JSON for any path tail.","digest":"sha256:d135bac8af55e9c68e0443101733884f407bd22a7c05ab9ae787389f59e8ae7c","name":"infinite-json-posts","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/json-posts/index.md"},{"description":"Deterministic well-formed product JSON for any path tail.","digest":"sha256:f3f75b8bf67095888cb38d3229a8364dda33a34f1b0efc4467a8b286e8e05cff","name":"infinite-json-products","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/json-products/index.md"},{"description":"Deterministic well-formed user JSON for any path tail.","digest":"sha256:6f4a9e59174e407410f0100b892d0bf2c6072956c61b0e4203bc707db3ed7e2c","name":"infinite-json-users","type":"skill-md","url":"https://catastrophic.io/not/endpoints/infinite/json-users/index.md"}]}