{"kind":"web","tier":"cache","target":"paulstamatiou.com","scorecard_url":"https://anc.dev/score/paulstamatiou.com","markdown_url":"https://anc.dev/score/paulstamatiou.com/md","json_url":"https://anc.dev/score/paulstamatiou.com/json","freshness":{"cached":true,"scored_at":"2026-11-05T04:26:31.281Z","refresh_after":"2026-11-05T04:27:31.281Z"},"spec_version":"0.6.0","scorecard":{"schema_version":"0.5","spec_version":"0.6.0","target_url":"https://paulstamatiou.com/","mcp_endpoint":"https://paulstamatiou.com/mcp","mcp_discovery":[{"source":"/.well-known/mcp.json","status":404},{"source":"/.well-known/mcp/server-card.json","status":200,"shape":"sep-2127","endpoint":"https://paulstamatiou.com/mcp"},{"source":"/.well-known/ai-catalog.json","document":"ai-catalog","status":200,"shape":"ai-catalog"},{"source":"/.well-known/api-catalog","document":"api-catalog","status":200,"shape":"linkset"},{"source":"/mcp/server-card","document":"server-card","status":200,"shape":"sep-2127","endpoint":"https://paulstamatiou.com/mcp"}],"tool":{"name":"paulstamatiou.com","url":"https://paulstamatiou.com/"},"audience":null,"audit_profile":null,"site_type":null,"public_listing":true,"vantage":{"network":"public","credentialed":false},"follow_declarations":true,"declared_hosts":[],"summary":{"pass":37,"noncompliant":0,"broken":1,"absent":5,"n_a":25,"skip":0,"error":0},"coverage_summary":{"must":{"total":4,"verified":4},"should":{"total":32,"verified":26},"may":{"total":7,"verified":7}},"score_pct":89,"score":{"relative":89,"global":66},"categories":[{"id":"discoverability","name":"Discoverability","passed":6,"counted":7},{"id":"content-for-agents","name":"Content for agents","passed":5,"counted":8},{"id":"bot-crawl-policy","name":"Bot & crawl policy","passed":3,"counted":3},{"id":"api","name":"API","passed":2,"counted":4},{"id":"mcp","name":"MCP","passed":19,"counted":19},{"id":"agent-discovery-auth","name":"Agent discovery & auth","passed":2,"counted":2}],"results":[{"id":"openapi","label":"An OpenAPI description is published","category":"api","group":"P2","layer":"web","keyword":"must","tier":"required","principle":"P2","status":"pass","evidence":"https://paulstamatiou.com/openapi.json -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/openapi.json -> 200)"},{"id":"mcp-initialize","label":"initialize handshake returns serverInfo + protocolVersion","category":"mcp","group":"P2","layer":"web","keyword":"must","tier":"required","principle":"P2","status":"pass","evidence":"serverInfo paulstamatiou.com, protocol 2025-06-18","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (serverInfo paulstamatiou.com, protocol 2025-06-18)"},{"id":"mcp-server-discover","label":"server/discover answers with server identity on the modern lane","category":"mcp","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"pass","evidence":"supports 2026-07-28, serverInfo paulstamatiou.com","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (supports 2026-07-28, serverInfo paulstamatiou.com)"},{"id":"llms-txt","label":"/llms.txt present with a summary and link index","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"absent","evidence":"https://paulstamatiou.com/llms.txt -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not found (https://paulstamatiou.com/llms.txt -> 404 (status 404 not in [200]))","remediation":{"goal":"Serve /llms.txt with a title, summary, and categorized link index","fix":"Serve `/llms.txt` (llmstxt.org): an H1 title, a one-line summary blockquote, and a categorized\nindex of links to your most important pages as markdown. It is the canonical entry point an\nagent fetches to understand what a site offers and where to look next.","skill_url":"https://anc.dev/fix/llms-txt","resources":[{"label":"llmstxt.org","url":"https://llmstxt.org/"}],"evidence":"https://paulstamatiou.com/llms.txt -> 404 (status 404 not in [200])","host":"paulstamatiou.com","prompt":"Goal: Serve /llms.txt with a title, summary, and categorized link index\nFix: Serve `/llms.txt` (llmstxt.org): an H1 title, a one-line summary blockquote, and a categorized index of links to your most important pages as markdown. It is the canonical entry point an agent fetches to understand what a site offers and where to look next.\nSkill: https://anc.dev/fix/llms-txt\nDocs: https://llmstxt.org/\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/llms.txt -> 404 (status 404 not in [200])\n--- end evidence ---"}},{"id":"llms-full-txt","label":"/llms-full.txt present (single-fetch full corpus)","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"not a docs/content site","hosts":[],"result":"Not applicable (not a docs/content site)"},{"id":"accept-markdown","label":"Accept text/markdown content negotiation returns markdown","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"robots","label":"/robots.txt present","category":"discoverability","group":"P7","layer":"web","keyword":"should","tier":"recommended","principle":"P7","status":"pass","evidence":"https://paulstamatiou.com/robots.txt -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/robots.txt -> 200)"},{"id":"sitemap","label":"/sitemap.xml present","category":"discoverability","group":"P7","layer":"web","keyword":"may","tier":"optional","principle":"P7","status":"pass","evidence":"https://paulstamatiou.com/sitemap.xml -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/sitemap.xml -> 200)"},{"id":"oauth-discovery","label":"OAuth/OIDC discovery metadata published","category":"agent-discovery-auth","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"no auth surface detected","hosts":[],"result":"Not applicable (no auth surface detected)"},{"id":"mcp-resources-list","label":"resources/list returns at least one resource when advertised","category":"mcp","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"neither initialize nor server/discover advertises capabilities.resources","hosts":[],"result":"Not applicable (neither initialize nor server/discover advertises capabilities.resources)"},{"id":"mcp-modern-resources-miss","label":"modern resources/read with an unknown URI returns -32602","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"n_a","na_reason":"antecedent-unmet","evidence":"neither initialize nor server/discover advertises capabilities.resources","hosts":[],"result":"Not applicable (neither initialize nor server/discover advertises capabilities.resources)"},{"id":"mcp-auth-challenge","label":"a 401 names the RFC 9728 metadata in its WWW-Authenticate challenge","category":"mcp","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"MCP endpoint does not require sign-in","hosts":[],"result":"Not applicable (MCP endpoint does not require sign-in)"},{"id":"mcp-auth-servers","label":"protected-resource metadata lists public https authorization_servers","category":"mcp","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"MCP endpoint does not require sign-in","hosts":[],"result":"Not applicable (MCP endpoint does not require sign-in)"},{"id":"mcp-auth-enforced","label":"a tools/list without an access token is refused with 401","category":"mcp","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"MCP endpoint does not require sign-in","hosts":[],"result":"Not applicable (MCP endpoint does not require sign-in)"},{"id":"llms-txt-format","label":"llms.txt has H1, summary, and a link index","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"root llms.txt not present","hosts":[],"result":"Not applicable (root llms.txt not present)"},{"id":"llms-txt-links","label":"llms.txt links resolve","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"root llms.txt not present","hosts":[],"result":"Not applicable (root llms.txt not present)"},{"id":"llms-txt-when-to-use","label":"llms.txt has a when-to-use or programmatic-access section","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"root llms.txt not present","hosts":[],"result":"Not applicable (root llms.txt not present)"},{"id":"llms-txt-scoped","label":"Per-section llms.txt files resolve under content subdirectories","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"root llms.txt not present","hosts":[],"result":"Not applicable (root llms.txt not present)"},{"id":"llms-full-txt-scoped","label":"Per-section llms-full.txt files resolve under content subdirectories","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"antecedent-unmet","evidence":"root llms-full.txt not present","hosts":[],"result":"Not applicable (root llms-full.txt not present)"},{"id":"oauth-protected-resource","label":"OAuth Protected Resource Metadata published (RFC 9728)","category":"agent-discovery-auth","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"MCP endpoint does not challenge for auth","hosts":[],"result":"Not applicable (MCP endpoint does not challenge for auth)"},{"id":"auth-md","label":"Agent auth/registration metadata doc published","category":"agent-discovery-auth","group":"P1","layer":"web","keyword":"may","tier":"optional","principle":"P1","status":"n_a","na_reason":"antecedent-unmet","evidence":"no auth surface detected","hosts":[],"result":"Not applicable (no auth surface detected)"},{"id":"api-catalog","label":"/.well-known/api-catalog published (RFC 9727)","category":"api","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"pass","evidence":"https://paulstamatiou.com/.well-known/api-catalog -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/.well-known/api-catalog -> 200)"},{"id":"mcp-capabilities","label":"initialize advertises capabilities (tools / resources / prompts)","category":"mcp","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"pass","evidence":"serverInfo paulstamatiou.com, protocol 2025-06-18","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (serverInfo paulstamatiou.com, protocol 2025-06-18)"},{"id":"mcp-tools-list","label":"tools/list returns a tools array with input schemas","category":"mcp","group":"P2","layer":"web","keyword":"must","tier":"required","principle":"P2","status":"pass","evidence":"10 tools, 10 with input schema","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (10 tools, 10 with input schema)"},{"id":"json-errors","label":"API client errors return JSON, not HTML","category":"api","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"broken","evidence":"https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (non-JSON error body)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Present but broken (https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (non-JSON error body))","remediation":{"goal":"Return a JSON error body on client-error API responses so agents can parse the failure","fix":"On a client-error API response (4xx), return `Content-Type: application/json` and a JSON object\n(for example `{ \"error\": { \"code\": \"not_found\", \"message\": \"...\" } }`), not an HTML error page.\nAgents cannot recover from a soft-HTML 404. The audit probes a documented OpenAPI 4xx GET when\none exists, otherwise `GET /anc-web-audit-no-such-api`.","skill_url":"https://anc.dev/fix/json-errors","resources":[{"label":"RFC 9457 (problem+json)","url":"https://www.rfc-editor.org/rfc/rfc9457"}],"evidence":"https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (non-JSON error body)","host":"paulstamatiou.com","prompt":"Goal: Return a JSON error body on client-error API responses so agents can parse the failure\nFix: On a client-error API response (4xx), return `Content-Type: application/json` and a JSON object (for example `{ \"error\": { \"code\": \"not_found\", \"message\": \"...\" } }`), not an HTML error page. Agents cannot recover from a soft-HTML 404. The audit probes a documented OpenAPI 4xx GET when one exists, otherwise `GET /anc-web-audit-no-such-api`.\nSkill: https://anc.dev/fix/json-errors\nDocs: https://www.rfc-editor.org/rfc/rfc9457\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (non-JSON error body)\n--- end evidence ---"}},{"id":"rate-limit-headers","label":"API responses advertise rate-limit headers","category":"api","group":"P6","layer":"web","keyword":"should","tier":"recommended","principle":"P6","status":"absent","evidence":"https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (no rate-limit header)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not found (https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (no rate-limit header))","remediation":{"goal":"Advertise remaining quota on API responses so agents can back off instead of retrying blindly","fix":"Send IETF RateLimit headers (`RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`) or\nthe common `X-RateLimit-*` aliases on API responses. A 429 should also carry `Retry-After`.\nWithout them an agent has no budget and will retry until it is locked out.","skill_url":"https://anc.dev/fix/rate-limit-headers","resources":[{"label":"IETF RateLimit header draft","url":"https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/"}],"evidence":"https://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (no rate-limit header)","host":"paulstamatiou.com","prompt":"Goal: Advertise remaining quota on API responses so agents can back off instead of retrying blindly\nFix: Send IETF RateLimit headers (`RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`) or the common `X-RateLimit-*` aliases on API responses. A 429 should also carry `Retry-After`. Without them an agent has no budget and will retry until it is locked out.\nSkill: https://anc.dev/fix/rate-limit-headers\nDocs: https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/photostream/feed/anc-web-audit-no-such -> 404 (no rate-limit header)\n--- end evidence ---"}},{"id":"mcp-modern-tools-list","label":"header-routed tools/list (2026-07-28) returns tools without initialize","category":"mcp","group":"P2","layer":"web","keyword":"must","tier":"required","principle":"P2","status":"pass","evidence":"10 tools, 10 with input schema","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (10 tools, 10 with input schema)"},{"id":"mcp-unknown-method","label":"unknown JSON-RPC method returns -32601","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32601","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32601)"},{"id":"mcp-malformed-body","label":"a non-JSON body draws -32700 (or a typed HTTP 400/415 refusal)","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32700","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32700)"},{"id":"mcp-batch-reject","label":"a batch carrying a modern-envelope request is rejected -32600","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32600","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32600)"},{"id":"mcp-unknown-tool","label":"tools/call with an unknown tool name returns -32602","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32602","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32602)"},{"id":"mcp-modern-unknown-method","label":"an unknown method on the modern lane returns -32601","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32601","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32601)"},{"id":"mcp-modern-clientcaps","label":"_meta missing clientCapabilities is rejected (-32602 or -32600)","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32602","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32602)"},{"id":"mcp-modern-header-mismatch","label":"an Mcp-Method header disagreeing with the body method draws -32020","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32020","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32020)"},{"id":"mcp-modern-version-reject","label":"an unsupported protocol version is rejected -32022 with data.supported","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"error code -32022","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (error code -32022)"},{"id":"mcp-accept-json","label":"a JSON-only Accept is answered without SSE framing","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"https://paulstamatiou.com/mcp -> 406","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/mcp -> 406)"},{"id":"mcp-server-card","label":"An MCP server card is published","category":"mcp","group":"P8","layer":"web","keyword":"should","tier":"recommended","principle":"P8","status":"pass","evidence":"https://paulstamatiou.com/mcp/server-card -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/mcp/server-card -> 200)"},{"id":"mcp-accept-unsatisfiable","label":"an unsatisfiable Accept draws a 406 rather than an unasked-for type","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"https://paulstamatiou.com/mcp -> 406","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/mcp -> 406)"},{"id":"mcp-cors-preflight","label":"CORS preflight (OPTIONS) succeeds with Access-Control-Allow-* headers","category":"mcp","group":"P6","layer":"web","keyword":"should","tier":"recommended","principle":"P6","status":"pass","evidence":"preflight 204 allow-origin *; post 200 allow-origin *","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (preflight 204 allow-origin *; post 200 allow-origin *)"},{"id":"mcp-cors-actual","label":"POST response carries Access-Control-Allow-Origin","category":"mcp","group":"P6","layer":"web","keyword":"should","tier":"recommended","principle":"P6","status":"pass","evidence":"preflight 204 allow-origin *; post 200 allow-origin *","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (preflight 204 allow-origin *; post 200 allow-origin *)"},{"id":"webmcp","label":"Root HTML exposes WebMCP browser tools","category":"mcp","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/ -> 200 (no WebMCP markers in root HTML)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/ -> 200 (no WebMCP markers in root HTML))"},{"id":"mcp-get-fast-fail","label":"GET on the MCP endpoint answers fast (not a held-open hang)","category":"mcp","group":"P4","layer":"web","keyword":"should","tier":"recommended","principle":"P4","status":"pass","evidence":"https://paulstamatiou.com/mcp -> 405","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/mcp -> 405)"},{"id":"mcp-card-legacy-aliases","label":"Legacy MCP card paths redirect to the canonical card","category":"mcp","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/.well-known/mcp -> 404 (404 alias not published)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/.well-known/mcp -> 404 (404 alias not published))"},{"id":"markdown-agent-ua","label":"AI user-fetch User-Agent receives the markdown twin","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/))"},{"id":"agent-ua-reachable","label":"AI user-fetch User-Agent can reach the homepage","category":"bot-crawl-policy","group":"P7","layer":"web","keyword":"should","tier":"recommended","principle":"P7","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"markdown-vary","label":"Negotiated responses carry Vary Accept","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"absent","evidence":"https://paulstamatiou.com/ -> 200 (header vary no match /(?:^|[\\s,])(?:accept|\\*)(?:[\\s,]|$)/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not found (https://paulstamatiou.com/ -> 200 (header vary no match /(?:^|[\\s,])(?:accept|\\*)(?:[\\s,]|$)/))","remediation":{"goal":"Name every negotiated request header in Vary so shared caches never serve one client the wrong variant","fix":"When the same URL serves HTML or markdown depending on the request, emit a `Vary` header on\nevery response that names each request header the choice depends on: `Vary: Accept` when you\nnegotiate on `Accept` alone, and `Vary: Accept, User-Agent` when agent User-Agents also receive\nthe markdown twin. Without it a shared cache (a CDN or a corporate proxy) can store the markdown\ntwin under the bare URL and then hand it to a browser, or the reverse. If the CDN ignores or\nstrips Vary (Cloudflare's zone cache historically keeps only `Accept-Encoding`), do not give\nthat cache a long `s-maxage` on negotiated responses: HIT replies would then reach clients with\nno Vary, and the check still fails.","skill_url":"https://anc.dev/fix/markdown-vary","resources":[{"label":"RFC 9110 (Vary)","url":"https://www.rfc-editor.org/rfc/rfc9110#name-vary"}],"evidence":"https://paulstamatiou.com/ -> 200 (header vary no match /(?:^|[\\s,])(?:accept|\\*)(?:[\\s,]|$)/)","host":"paulstamatiou.com","prompt":"Goal: Name every negotiated request header in Vary so shared caches never serve one client the wrong variant\nFix: When the same URL serves HTML or markdown depending on the request, emit a `Vary` header on every response that names each request header the choice depends on: `Vary: Accept` when you negotiate on `Accept` alone, and `Vary: Accept, User-Agent` when agent User-Agents also receive the markdown twin. Without it a shared cache (a CDN or a corporate proxy) can store the markdown twin under the bare URL and then hand it to a browser, or the reverse. If the CDN ignores or strips Vary (Cloudflare's zone cache historically keeps only `Accept-Encoding`), do not give that cache a long `s-maxage` on negotiated responses: HIT replies would then reach clients with no Vary, and the check still fails.\nSkill: https://anc.dev/fix/markdown-vary\nDocs: https://www.rfc-editor.org/rfc/rfc9110#name-vary\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/ -> 200 (header vary no match /(?:^|[\\s,])(?:accept|\\*)(?:[\\s,]|$)/)\n--- end evidence ---"}},{"id":"markdown-frontmatter","label":"Markdown twin carries YAML frontmatter","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"root-meta-description","label":"Root HTML has a descriptive <meta name=\"description\">","category":"content-for-agents","group":"P3","layer":"web","keyword":"should","tier":"recommended","principle":"P3","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"schema-org-jsonld","label":"Root HTML embeds Schema.org JSON-LD","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/ -> 200 (body no match /application/ld\\+json/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/ -> 200 (body no match /application/ld\\+json/))"},{"id":"content-without-js","label":"Root HTML has an H1 and readable text without JavaScript","category":"content-for-agents","group":"P2","layer":"web","keyword":"should","tier":"recommended","principle":"P2","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"semantic-html","label":"Root HTML uses semantic landmarks","category":"content-for-agents","group":"P3","layer":"web","keyword":"may","tier":"optional","principle":"P3","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"noscript-fallback","label":"Root HTML has a <noscript> with machine entry points","category":"content-for-agents","group":"P1","layer":"web","keyword":"should","tier":"recommended","principle":"P1","status":"absent","evidence":"https://paulstamatiou.com/ -> 200 (body no match /<noscript/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not found (https://paulstamatiou.com/ -> 200 (body no match /<noscript/))","remediation":{"goal":"Give non-JS agents a noscript block listing your machine entry points","fix":"Add a `<noscript>` block to your root HTML that links your machine entry points: `llms.txt`,\nyour OpenAPI or MCP endpoint, and any `.well-known` cards. It hands a fetch-only crawler or a\nnon-JS agent a concrete, in-body list of where the structured surfaces live, so it never has to\nrun the client bundle or infer them from the visible page.","skill_url":"https://anc.dev/fix/noscript-fallback","resources":[{"label":"MDN noscript","url":"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/noscript"}],"evidence":"https://paulstamatiou.com/ -> 200 (body no match /<noscript/)","host":"paulstamatiou.com","prompt":"Goal: Give non-JS agents a noscript block listing your machine entry points\nFix: Add a `<noscript>` block to your root HTML that links your machine entry points: `llms.txt`, your OpenAPI or MCP endpoint, and any `.well-known` cards. It hands a fetch-only crawler or a non-JS agent a concrete, in-body list of where the structured surfaces live, so it never has to run the client bundle or infer them from the visible page.\nSkill: https://anc.dev/fix/noscript-fallback\nDocs: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/noscript\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/ -> 200 (body no match /<noscript/)\n--- end evidence ---"}},{"id":"agent-friendly-404","label":"Unknown paths return HTTP 404 or 410","category":"discoverability","group":"P8","layer":"web","keyword":"should","tier":"recommended","principle":"P8","status":"pass","evidence":"https://paulstamatiou.com/anc-web-audit-no-such-page -> 404","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/anc-web-audit-no-such-page -> 404)"},{"id":"link-headers","label":"Homepage sends RFC 8288 Link headers pointing at agent resources","category":"discoverability","group":"P3","layer":"web","keyword":"should","tier":"recommended","principle":"P3","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"root-link-rel","label":"Root HTML links to machine surfaces via <link rel>","category":"discoverability","group":"P3","layer":"web","keyword":"should","tier":"recommended","principle":"P3","status":"pass","evidence":"https://paulstamatiou.com/ -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/ -> 200)"},{"id":"markdown-cli-ua","label":"Bare CLI User-Agent receives the markdown twin","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/))"},{"id":"robots-ai-rules","label":"robots.txt declares AI-crawler rules (RFC 9309)","category":"bot-crawl-policy","group":"P7","layer":"web","keyword":"should","tier":"recommended","principle":"P7","status":"pass","evidence":"https://paulstamatiou.com/robots.txt -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/robots.txt -> 200)"},{"id":"content-signals","label":"robots.txt declares Content-Signal AI-usage preferences","category":"bot-crawl-policy","group":"P7","layer":"web","keyword":"should","tier":"recommended","principle":"P7","status":"pass","evidence":"https://paulstamatiou.com/robots.txt -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/robots.txt -> 200)"},{"id":"markdown-accept-plain","label":"Accept text/plain returns the markdown twin","category":"content-for-agents","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/ -> 200 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/))"},{"id":"dns-aid","label":"DNS for AI Discovery (DNS-AID) records under _agents (IETF draft)","category":"discoverability","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"pass","evidence":"_mcp._agents.paulstamatiou.com: 1 record(s) via https://cloudflare-dns.com/dns-query","hosts":[],"result":"Verified (_mcp._agents.paulstamatiou.com: 1 record(s) via https://cloudflare-dns.com/dns-query)"},{"id":"a2a-agent-card","label":"A2A Agent Card published for agent-to-agent discovery","category":"agent-discovery-auth","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/.well-known/agent-card.json -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/.well-known/agent-card.json -> 404 (status 404 not in [200]))"},{"id":"ai-catalog","label":"/.well-known/ai-catalog.json published (ARD)","category":"agent-discovery-auth","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"pass","evidence":"https://paulstamatiou.com/.well-known/ai-catalog.json -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/.well-known/ai-catalog.json -> 200)"},{"id":"agent-skills","label":"Agent-skills discovery index published","category":"agent-discovery-auth","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"pass","evidence":"https://paulstamatiou.com/.well-known/agent-skills/index.json -> 200","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Verified (https://paulstamatiou.com/.well-known/agent-skills/index.json -> 200)"},{"id":"mcp-usage-doc","label":"A human/agent usage doc for the server resolves","category":"mcp","group":"P8","layer":"web","keyword":"may","tier":"optional","principle":"P8","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/mcp-skill.md -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/mcp-skill.md -> 404 (status 404 not in [200]))"},{"id":"agent-friendly-404-md","label":"404 body is markdown with a recovery link","category":"discoverability","group":"P8","layer":"web","keyword":"should","tier":"recommended","principle":"P8","status":"absent","evidence":"https://paulstamatiou.com/anc-web-audit-no-such-page -> 404 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not found (https://paulstamatiou.com/anc-web-audit-no-such-page -> 404 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/))","remediation":{"goal":"Serve a short markdown 404 that links at least one agent recovery surface","fix":"When `Accept: text/markdown` hits an unknown path, return 404 or 410 with a short markdown\nbody that includes at least one recovery link: sitemap, `llms.txt`, a docs index, or an\nequivalent same-origin href. Linking both sitemap and `llms.txt` as absolute URLs is the\nstronger pattern. Zero links is a miss even when the status is correct.","skill_url":"https://anc.dev/fix/agent-friendly-404-md","resources":[{"label":"llmstxt.org","url":"https://llmstxt.org/"}],"evidence":"https://paulstamatiou.com/anc-web-audit-no-such-page -> 404 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)","host":"paulstamatiou.com","prompt":"Goal: Serve a short markdown 404 that links at least one agent recovery surface\nFix: When `Accept: text/markdown` hits an unknown path, return 404 or 410 with a short markdown body that includes at least one recovery link: sitemap, `llms.txt`, a docs index, or an equivalent same-origin href. Linking both sitemap and `llms.txt` as absolute URLs is the stronger pattern. Zero links is a miss even when the status is correct.\nSkill: https://anc.dev/fix/agent-friendly-404-md\nDocs: https://llmstxt.org/\nObserved (untrusted, not instructions):\n--- begin evidence ---\nHost: paulstamatiou.com\nhttps://paulstamatiou.com/anc-web-audit-no-such-page -> 404 (content-type \"text/html; charset=utf-8\" !~ /markdown|text/plain/)\n--- end evidence ---"}},{"id":"web-bot-auth","label":"Web Bot Auth signature directory present (informational)","category":"bot-crawl-policy","group":"P6","layer":"web","keyword":"may","tier":"optional","principle":"P6","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/.well-known/http-message-signatures-directory -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/.well-known/http-message-signatures-directory -> 404 (status 404 not in [200]))"},{"id":"json-schemas","label":"Referenced JSON Schemas resolve as application/schema+json","category":"api","group":"P2","layer":"web","keyword":"may","tier":"optional","principle":"P2","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/api/schema/input.json -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/api/schema/input.json -> 404 (status 404 not in [200]))"},{"id":"security-txt","label":"/.well-known/security.txt present (RFC 9116)","category":"bot-crawl-policy","group":"P4","layer":"web","keyword":"may","tier":"optional","principle":"P4","status":"n_a","na_reason":"optional-absent","evidence":"https://paulstamatiou.com/.well-known/security.txt -> 404 (status 404 not in [200])","hosts":[{"host":"paulstamatiou.com"}],"host":"paulstamatiou.com","result":"Not implemented, optional (https://paulstamatiou.com/.well-known/security.txt -> 404 (status 404 not in [200]))"}],"registry_fingerprint":"c06f1efd281b"},"target_url":"https://paulstamatiou.com/","score_pct":89,"site_spec_version":"0.6.0","auditor_url":"https://anc.dev/score"}