diff --git a/.ai/decisions.md b/.ai/decisions.md new file mode 100644 index 0000000..764851e --- /dev/null +++ b/.ai/decisions.md @@ -0,0 +1,3 @@ +# Decisions + +- Implemented report diffs, badge/cert, fix-it snippets; bumped spec_version to 1.2; added /badge/{domain}.svg. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 554d322..b95e992 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,3 +23,4 @@ jobs: - run: pnpm -C apps/web build - run: pnpm check:ai - run: pnpm -C apps/functions build + - run: ./scripts/smoke-live.sh diff --git a/apps/functions/src/brand/renderBadgeSvg.ts b/apps/functions/src/brand/renderBadgeSvg.ts new file mode 100644 index 0000000..3f8baba --- /dev/null +++ b/apps/functions/src/brand/renderBadgeSvg.ts @@ -0,0 +1,64 @@ +export type BadgeInput = { + domain: string; + score?: number | null; + grade?: string | null; + updatedAtISO?: string | null; + statusLabel?: string | null; +}; + +function escapeXml(value: string): string { + return value.replace(/[<>&'"]/g, (char) => { + switch (char) { + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + case "\"": + return """; + case "'": + return "'"; + default: + return char; + } + }); +} + +export function renderBadgeSvg({ + domain, + score, + grade, + updatedAtISO, + statusLabel, +}: BadgeInput): string { + const left = "Agentability"; + const right = + statusLabel ?? (score == null ? "Not evaluated" : `Score ${score}${grade ? ` (${grade})` : ""}`); + const date = updatedAtISO ? updatedAtISO.slice(0, 10) : ""; + const sub = date ? `updated ${date}` : ""; + + return ` + + + + + + + + + + + ${escapeXml(left)} + + ${escapeXml(right)} + + ${sub ? `${escapeXml(sub)}` : ""} + + ${escapeXml(domain)} +`; +} diff --git a/apps/functions/src/index.ts b/apps/functions/src/index.ts index a7c3187..c411156 100644 --- a/apps/functions/src/index.ts +++ b/apps/functions/src/index.ts @@ -9,8 +9,14 @@ import { getStorage } from "firebase-admin/storage"; import { onRequest } from "firebase-functions/v2/https"; import { logger } from "firebase-functions"; import { evaluatePublic } from "@agentability/evaluator"; -import { EvaluationInputSchema, EvaluationProfile, EvaluationResult } from "@agentability/shared"; +import { + EvaluationInputSchema, + EvaluationProfile, + EvaluationResult, + computeDiff, +} from "@agentability/shared"; import { SSR_ASSETS } from "./ssr/asset-manifest"; +import { renderBadgeSvg } from "./brand/renderBadgeSvg"; initializeApp(); @@ -588,11 +594,13 @@ async function runEvaluation( let evaluation: EvaluationResult | null = null; try { - const runRef = db - .collection("evaluations") - .doc(domain) - .collection("runs") - .doc(runId); + const domainRef = db.collection("evaluations").doc(domain); + const domainSnap = await domainRef.get(); + const previousRunId = domainSnap.exists + ? (domainSnap.data()?.latestRunId as string | undefined) + : undefined; + + const runRef = domainRef.collection("runs").doc(runId); const runRootRef = db.collection("runs").doc(runId); const baseRun = { @@ -602,13 +610,14 @@ async function runEvaluation( status: "running", input: { origin }, createdAt: new Date().toISOString(), + previousRunId, }; await runRef.set(baseRun); await runRootRef.set(baseRun); const finalizeEvaluation = async (result: EvaluationResult, evidence: unknown[]) => { - evaluation = { ...result, runId }; + evaluation = { ...result, runId, previousRunId }; const artifacts = { reportUrl: `${baseUrl}/reports/${result.domain}`, jsonUrl: `${baseUrl}/v1/evaluations/${result.domain}/latest.json`, @@ -619,17 +628,40 @@ async function runEvaluation( artifacts.evidenceBundleUrl = evidenceUpload.evidenceBundleUrl; } + let diffSummary = null; + if (previousRunId) { + const previousSnap = await runRef.parent.doc(previousRunId).get(); + if (previousSnap.exists) { + const previous = previousSnap.data() as EvaluationResult; + diffSummary = computeDiff( + { + score: previous.score, + grade: previous.grade, + pillarScores: previous.pillarScores, + checks: previous.checks, + }, + { + score: evaluation.score, + grade: evaluation.grade, + pillarScores: evaluation.pillarScores, + checks: evaluation.checks, + } + ); + } + } + evaluation = { ...evaluation, status: "complete", artifacts, completedAt: new Date().toISOString(), + diffSummary: diffSummary ?? undefined, }; await runRef.set(evaluation, { merge: true }); await runRootRef.set(evaluation, { merge: true }); - await db.collection("evaluations").doc(result.domain).set( + await domainRef.set( { domain: result.domain, latestRunId: runId, @@ -980,7 +1012,38 @@ app.get("/v1/evaluations/:domain/latest.json", async (req, res) => { if (!run.exists) { return sendError(res, 404, "Run not found", "not_found"); } - return res.json(run.data()); + const runData = run.data() as EvaluationResult; + let previousSummary: { + score: number; + grade: string; + pillarScores: EvaluationResult["pillarScores"]; + completedAt?: string; + } | null = null; + + if (runData.previousRunId) { + const previousRun = await db + .collection("evaluations") + .doc(domain) + .collection("runs") + .doc(runData.previousRunId) + .get(); + if (previousRun.exists) { + const previous = previousRun.data() as EvaluationResult; + previousSummary = { + score: previous.score, + grade: previous.grade, + pillarScores: previous.pillarScores, + completedAt: previous.completedAt ?? previous.createdAt, + }; + } + } + + return res.json({ + ...runData, + previousRunId: runData.previousRunId, + diff: runData.diffSummary ?? undefined, + previousSummary: previousSummary ?? undefined, + }); }); app.get("/v1/evaluations/:domain/:runId.json", async (req, res) => { @@ -998,6 +1061,50 @@ app.get("/v1/evaluations/:domain/:runId.json", async (req, res) => { return res.json(run.data()); }); +app.get("/badge/:domain.svg", async (req, res) => { + const domain = req.params.domain.toLowerCase(); + if (!/^[a-z0-9.-]+$/.test(domain)) { + const svg = renderBadgeSvg({ domain, statusLabel: "Invalid domain" }); + res.set("Content-Type", "image/svg+xml; charset=utf-8"); + res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=3600"); + return res.status(400).send(svg); + } + + const parent = await db.collection("evaluations").doc(domain).get(); + const latestRunId = parent.exists ? (parent.data()?.latestRunId as string | undefined) : undefined; + if (!latestRunId) { + const svg = renderBadgeSvg({ domain, statusLabel: "Not evaluated" }); + res.set("Content-Type", "image/svg+xml; charset=utf-8"); + res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=3600"); + return res.status(404).send(svg); + } + + const run = await db + .collection("evaluations") + .doc(domain) + .collection("runs") + .doc(latestRunId) + .get(); + if (!run.exists) { + const svg = renderBadgeSvg({ domain, statusLabel: "Not evaluated" }); + res.set("Content-Type", "image/svg+xml; charset=utf-8"); + res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=3600"); + return res.status(404).send(svg); + } + + const data = run.data() as EvaluationResult; + const updatedAt = data.completedAt ?? data.createdAt; + const svg = renderBadgeSvg({ + domain, + score: data.status === "complete" ? data.score : null, + grade: data.status === "complete" ? data.grade : null, + updatedAtISO: updatedAt, + }); + res.set("Content-Type", "image/svg+xml; charset=utf-8"); + res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=3600"); + return res.status(data.status === "complete" ? 200 : 404).send(svg); +}); + export const api = onRequest( { region: "us-central1", diff --git a/apps/functions/src/ssr/asset-manifest.ts b/apps/functions/src/ssr/asset-manifest.ts index 0232f8d..edc2123 100644 --- a/apps/functions/src/ssr/asset-manifest.ts +++ b/apps/functions/src/ssr/asset-manifest.ts @@ -1,4 +1,4 @@ export const SSR_ASSETS = { - "scriptSrc": "/assets/index-BwWXd1jY.js", - "cssHref": "/assets/index-DXsQJ1HL.css" + "scriptSrc": "/assets/index-BTJpqCVz.js", + "cssHref": "/assets/index-EQLOK5sA.css" } as const; diff --git a/apps/web/index.html b/apps/web/index.html index 329b7f4..0bf7ef7 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -2,6 +2,7 @@ + @@ -58,7 +59,7 @@ "@type": "Organization", "name": "Agentability", "url": "https://agentability.org", - "logo": "https://agentability.org/logo.png", + "logo": "https://agentability.org/logo.svg", "sameAs": ["https://github.com/khalidsaidi/agentability"] } diff --git a/apps/web/public/.well-known/ai-plugin.json b/apps/web/public/.well-known/ai-plugin.json index 977c1a5..4db12fc 100644 --- a/apps/web/public/.well-known/ai-plugin.json +++ b/apps/web/public/.well-known/ai-plugin.json @@ -12,7 +12,7 @@ "url": "https://agentability.org/.well-known/openapi.json", "is_user_authenticated": false }, - "logo_url": "https://agentability.org/logo.png", + "logo_url": "https://agentability.org/logo.svg", "contact_email": "hello@agentability.org", "legal_url": "https://agentability.org/legal/terms.md" } diff --git a/apps/web/public/.well-known/air.json b/apps/web/public/.well-known/air.json index c199dd6..388edef 100644 --- a/apps/web/public/.well-known/air.json +++ b/apps/web/public/.well-known/air.json @@ -1,5 +1,5 @@ { - "spec_version": "1.0", + "spec_version": "1.2", "canonical_base_url": "https://agentability.org", "product": { "name": "Agentability", diff --git a/apps/web/public/.well-known/openapi.json b/apps/web/public/.well-known/openapi.json index 376cfa5..60d5991 100644 --- a/apps/web/public/.well-known/openapi.json +++ b/apps/web/public/.well-known/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "Agentability Public API", - "version": "0.1.0", + "version": "0.2.0", "description": "Public-mode agent readiness evaluator API." }, "servers": [ @@ -390,7 +390,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EvaluationResult" + "$ref": "#/components/schemas/LatestEvaluation" } } } @@ -433,6 +433,43 @@ } } } + }, + "/badge/{domain}.svg": { + "get": { + "summary": "Fetch a shareable badge for a domain", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "SVG badge", + "content": { + "image/svg+xml": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "No evaluation found", + "content": { + "image/svg+xml": { + "schema": { + "type": "string" + } + } + } + } + } + } } }, "components": { @@ -570,6 +607,12 @@ "artifacts": { "$ref": "#/components/schemas/Artifacts" }, + "previousRunId": { + "type": "string" + }, + "diffSummary": { + "$ref": "#/components/schemas/DiffSummary" + }, "engine": { "$ref": "#/components/schemas/EngineInfo" }, @@ -668,6 +711,12 @@ "artifacts": { "$ref": "#/components/schemas/Artifacts" }, + "previousRunId": { + "type": "string" + }, + "diffSummary": { + "$ref": "#/components/schemas/DiffSummary" + }, "engine": { "$ref": "#/components/schemas/EngineInfo" }, @@ -684,6 +733,27 @@ } } }, + "LatestEvaluation": { + "allOf": [ + { + "$ref": "#/components/schemas/EvaluationResult" + }, + { + "type": "object", + "properties": { + "diff": { + "$ref": "#/components/schemas/DiffSummary" + }, + "previousRunId": { + "type": "string" + }, + "previousSummary": { + "$ref": "#/components/schemas/PreviousSummary" + } + } + } + ] + }, "CheckResult": { "type": "object", "required": [ @@ -818,6 +888,161 @@ }, "rulesetHash": { "type": "string" + }, + "specVersion": { + "type": "string" + } + } + }, + "PreviousSummary": { + "type": "object", + "required": [ + "score", + "grade", + "pillarScores" + ], + "properties": { + "score": { + "type": "number" + }, + "grade": { + "type": "string" + }, + "pillarScores": { + "$ref": "#/components/schemas/PillarScores" + }, + "completedAt": { + "type": "string", + "format": "date-time" + } + } + }, + "DiffIssue": { + "type": "object", + "required": [ + "checkId", + "to", + "severity" + ], + "properties": { + "checkId": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ], + "nullable": true + }, + "to": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ] + }, + "severity": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + } + } + }, + "DiffChange": { + "type": "object", + "required": [ + "checkId", + "to" + ], + "properties": { + "checkId": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ], + "nullable": true + }, + "to": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ] + } + } + }, + "DiffSummary": { + "type": "object", + "required": [ + "scoreDelta", + "pillarDelta", + "newIssues", + "fixedIssues", + "changed", + "counts" + ], + "properties": { + "scoreDelta": { + "type": "number" + }, + "gradeFrom": { + "type": "string" + }, + "gradeTo": { + "type": "string" + }, + "pillarDelta": { + "$ref": "#/components/schemas/PillarScores" + }, + "newIssues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffIssue" + } + }, + "fixedIssues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffIssue" + } + }, + "changed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffChange" + } + }, + "counts": { + "type": "object", + "required": [ + "pass", + "warn", + "fail" + ], + "properties": { + "pass": { + "type": "number" + }, + "warn": { + "type": "number" + }, + "fail": { + "type": "number" + } + } } } }, diff --git a/apps/web/public/.well-known/openapi.yaml b/apps/web/public/.well-known/openapi.yaml index c03cd5f..c1bad82 100644 --- a/apps/web/public/.well-known/openapi.yaml +++ b/apps/web/public/.well-known/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Agentability Public API - version: 0.1.0 + version: 0.2.0 description: Public-mode agent readiness evaluator API. servers: - url: https://agentability.org @@ -253,7 +253,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/EvaluationResult" + $ref: "#/components/schemas/LatestEvaluation" "404": description: Domain not found content: @@ -276,6 +276,28 @@ paths: value: message: "Evaluation failed" code: "evaluation_failed" + /badge/{domain}.svg: + get: + summary: Fetch a shareable badge for a domain + parameters: + - name: domain + in: path + required: true + schema: + type: string + responses: + "200": + description: SVG badge + content: + image/svg+xml: + schema: + type: string + "404": + description: No evaluation found + content: + image/svg+xml: + schema: + type: string components: schemas: EvaluationInput: @@ -375,6 +397,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -447,6 +473,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -457,6 +487,17 @@ components: format: date-time error: type: string + LatestEvaluation: + allOf: + - $ref: "#/components/schemas/EvaluationResult" + - type: object + properties: + diff: + $ref: "#/components/schemas/DiffSummary" + previousRunId: + type: string + previousSummary: + $ref: "#/components/schemas/PreviousSummary" CheckResult: type: object required: @@ -553,6 +594,116 @@ components: type: string rulesetHash: type: string + specVersion: + type: string + PreviousSummary: + type: object + required: + - score + - grade + - pillarScores + properties: + score: + type: number + grade: + type: string + pillarScores: + $ref: "#/components/schemas/PillarScores" + completedAt: + type: string + format: date-time + DiffIssue: + type: object + required: + - checkId + - to + - severity + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + severity: + type: string + enum: + - high + - medium + - low + DiffChange: + type: object + required: + - checkId + - to + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + DiffSummary: + type: object + required: + - scoreDelta + - pillarDelta + - newIssues + - fixedIssues + - changed + - counts + properties: + scoreDelta: + type: number + gradeFrom: + type: string + gradeTo: + type: string + pillarDelta: + $ref: "#/components/schemas/PillarScores" + newIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + fixedIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + changed: + type: array + items: + $ref: "#/components/schemas/DiffChange" + counts: + type: object + required: + - pass + - warn + - fail + properties: + pass: + type: number + warn: + type: number + fail: + type: number JsonRpcRequest: type: object required: diff --git a/apps/web/public/brand/favicon.svg b/apps/web/public/brand/favicon.svg new file mode 100644 index 0000000..ab6de1b --- /dev/null +++ b/apps/web/public/brand/favicon.svg @@ -0,0 +1,6 @@ + + + + diff --git a/apps/web/public/brand/logo-mark.svg b/apps/web/public/brand/logo-mark.svg new file mode 100644 index 0000000..2506363 --- /dev/null +++ b/apps/web/public/brand/logo-mark.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/apps/web/public/brand/logo.svg b/apps/web/public/brand/logo.svg new file mode 100644 index 0000000..4835d25 --- /dev/null +++ b/apps/web/public/brand/logo.svg @@ -0,0 +1,28 @@ + + + + + + + agentability + + + verified agent-readiness standard + + diff --git a/apps/web/public/brand/seal.svg b/apps/web/public/brand/seal.svg new file mode 100644 index 0000000..d691c79 --- /dev/null +++ b/apps/web/public/brand/seal.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + AGENTABILITY / CERTIFIED + + + + + + VERIFIED / EVIDENCE-BASED / VERSIONED + + + + + + + + + + + SPEC vX.Y - YYYY-MM-DD + + diff --git a/apps/web/public/cert-seal.svg b/apps/web/public/cert-seal.svg new file mode 100644 index 0000000..d691c79 --- /dev/null +++ b/apps/web/public/cert-seal.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + AGENTABILITY / CERTIFIED + + + + + + VERIFIED / EVIDENCE-BASED / VERSIONED + + + + + + + + + + + SPEC vX.Y - YYYY-MM-DD + + diff --git a/apps/web/public/discovery/audit/latest.json b/apps/web/public/discovery/audit/latest.json index f84679c..a3077ae 100644 --- a/apps/web/public/discovery/audit/latest.json +++ b/apps/web/public/discovery/audit/latest.json @@ -1 +1 @@ -{"generated_at":"2026-01-20T02:38:34.870Z","live_checked_at":"2026-01-20T02:38:32.263Z","strict_pretty":false,"spec_version":"1.0","engine":{"name":"agentability","version":"0.1.0"},"score_target":100,"discoverability_health":{"status":"pass","missing":[],"unreachable":[],"hash_mismatch_required":[],"hash_mismatch_optional":[]},"required_surfaces":["/.well-known/air.json","/.well-known/openapi.json","/.well-known/openapi.yaml","/.well-known/ai-plugin.json","/openapi.json","/openapi.yaml","/llms.txt","/llms-full.txt","/docs.md","/docs/api.md","/spec.md","/status.md","/legal/terms.md","/legal/privacy.md","/discovery/audit/index.html","/robots.txt","/sitemap.xml","/rss.xml"],"optional_surfaces":["/discovery/audit/latest.pretty.json","/logo.png","/og.png"],"live_sources":["https://agentability.org","https://agentability-prod-jenfjn.web.app","https://agentability-prod-jenfjn.firebaseapp.com"],"files":[{"path":"/.well-known/air.json","expected_content_type":"application/json; charset=utf-8","bytes":1779,"sha256":"fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa","bytes":1779},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa","bytes":1779},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa","bytes":1779}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa","live_bytes":1779,"live_hash_match":true},{"path":"/.well-known/openapi.json","expected_content_type":"application/json; charset=utf-8","bytes":27796,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","live_bytes":27796,"live_hash_match":true},{"path":"/.well-known/openapi.yaml","expected_content_type":"text/yaml; charset=utf-8","bytes":18645,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645}],"live_status":200,"live_content_type":"text/yaml; charset=utf-8","live_ok":true,"live_sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","live_bytes":18645,"live_hash_match":true},{"path":"/.well-known/ai-plugin.json","expected_content_type":"application/json; charset=utf-8","bytes":633,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","live_bytes":633,"live_hash_match":true},{"path":"/openapi.json","expected_content_type":"application/json; charset=utf-8","bytes":27796,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","bytes":27796}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757","live_bytes":27796,"live_hash_match":true},{"path":"/openapi.yaml","expected_content_type":"text/yaml; charset=utf-8","bytes":18645,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","bytes":18645}],"live_status":200,"live_content_type":"text/yaml; charset=utf-8","live_ok":true,"live_sha256":"0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8","live_bytes":18645,"live_hash_match":true},{"path":"/llms.txt","expected_content_type":"text/plain; charset=utf-8","bytes":523,"sha256":"a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d","bytes":523},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d","bytes":523},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d","bytes":523}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d","live_bytes":523,"live_hash_match":true},{"path":"/llms-full.txt","expected_content_type":"text/plain; charset=utf-8","bytes":1359,"sha256":"2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49","bytes":1359},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49","bytes":1359},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49","bytes":1359}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49","live_bytes":1359,"live_hash_match":true},{"path":"/docs.md","expected_content_type":"text/markdown; charset=utf-8","bytes":729,"sha256":"f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736","bytes":729},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736","bytes":729},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736","bytes":729}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736","live_bytes":729,"live_hash_match":true},{"path":"/docs/api.md","expected_content_type":"text/markdown; charset=utf-8","bytes":1203,"sha256":"1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1","bytes":1203},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1","bytes":1203},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1","bytes":1203}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1","live_bytes":1203,"live_hash_match":true},{"path":"/spec.md","expected_content_type":"text/markdown; charset=utf-8","bytes":1131,"sha256":"dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82","bytes":1131},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82","bytes":1131},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82","bytes":1131}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82","live_bytes":1131,"live_hash_match":true},{"path":"/status.md","expected_content_type":"text/markdown; charset=utf-8","bytes":278,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","live_bytes":278,"live_hash_match":true},{"path":"/legal/terms.md","expected_content_type":"text/markdown; charset=utf-8","bytes":481,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","live_bytes":481,"live_hash_match":true},{"path":"/legal/privacy.md","expected_content_type":"text/markdown; charset=utf-8","bytes":390,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","live_bytes":390,"live_hash_match":true},{"path":"/discovery/audit/index.html","expected_content_type":"text/html; charset=utf-8","bytes":1211,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":true,"live_sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","live_bytes":1211,"live_hash_match":true},{"path":"/robots.txt","expected_content_type":"text/plain; charset=utf-8","bytes":111,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","live_bytes":111,"live_hash_match":true},{"path":"/sitemap.xml","expected_content_type":"application/xml; charset=utf-8","bytes":2305,"sha256":"a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3","bytes":2305},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3","bytes":2305},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3","bytes":2305}],"live_status":200,"live_content_type":"application/xml; charset=utf-8","live_ok":true,"live_sha256":"a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3","live_bytes":2305,"live_hash_match":true},{"path":"/rss.xml","expected_content_type":"application/rss+xml; charset=utf-8","bytes":605,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605}],"live_status":200,"live_content_type":"application/rss+xml; charset=utf-8","live_ok":true,"live_sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","live_bytes":605,"live_hash_match":true},{"path":"/discovery/audit/latest.pretty.json","expected_content_type":"application/json; charset=utf-8","bytes":29822,"sha256":"f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0","bytes":29822},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0","bytes":29822},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0","bytes":29822}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0","live_bytes":29822,"live_hash_match":true},{"path":"/logo.png","expected_content_type":"image/png","bytes":3506,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506}],"live_status":200,"live_content_type":"image/png","live_ok":true,"live_sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","live_bytes":3506,"live_hash_match":true},{"path":"/og.png","expected_content_type":"image/png","bytes":29107,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107}],"live_status":200,"live_content_type":"image/png","live_ok":true,"live_sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","live_bytes":29107,"live_hash_match":true}]} +{"generated_at":"2026-01-24T01:30:36.792Z","live_checked_at":"2026-01-24T01:30:33.448Z","strict_pretty":false,"spec_version":"1.2","engine":{"name":"agentability","version":"0.1.0"},"score_target":100,"discoverability_health":{"status":"fail","missing":[],"unreachable":["/logo.svg","/logo-mark.svg","/favicon.svg","/brand/logo.svg","/brand/logo-mark.svg","/brand/favicon.svg","/brand/seal.svg","/cert-seal.svg"],"hash_mismatch_required":[],"hash_mismatch_optional":[]},"required_surfaces":["/.well-known/air.json","/.well-known/openapi.json","/.well-known/openapi.yaml","/.well-known/ai-plugin.json","/openapi.json","/openapi.yaml","/llms.txt","/llms-full.txt","/docs.md","/docs/api.md","/spec.md","/status.md","/legal/terms.md","/legal/privacy.md","/discovery/audit/index.html","/robots.txt","/sitemap.xml","/rss.xml","/logo.svg"],"optional_surfaces":["/discovery/audit/latest.pretty.json","/logo-mark.svg","/favicon.svg","/brand/logo.svg","/brand/logo-mark.svg","/brand/favicon.svg","/brand/seal.svg","/cert-seal.svg","/logo.png","/og.png"],"live_sources":["https://agentability.org","https://agentability-prod-jenfjn.web.app","https://agentability-prod-jenfjn.firebaseapp.com"],"files":[{"path":"/.well-known/air.json","expected_content_type":"application/json; charset=utf-8","bytes":1779,"sha256":"0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe","bytes":1779},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe","bytes":1779},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe","bytes":1779}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe","live_bytes":1779,"live_hash_match":true},{"path":"/.well-known/openapi.json","expected_content_type":"application/json; charset=utf-8","bytes":32934,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","live_bytes":32934,"live_hash_match":true},{"path":"/.well-known/openapi.yaml","expected_content_type":"text/yaml; charset=utf-8","bytes":22044,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044}],"live_status":200,"live_content_type":"text/yaml; charset=utf-8","live_ok":true,"live_sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","live_bytes":22044,"live_hash_match":true},{"path":"/.well-known/ai-plugin.json","expected_content_type":"application/json; charset=utf-8","bytes":633,"sha256":"9538a87c56b652f6fea86a2f0b5fe3391268cb0cea37ec7af908ebd6e0b24e2e","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","bytes":633}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d","live_bytes":633,"live_hash_match":true},{"path":"/openapi.json","expected_content_type":"application/json; charset=utf-8","bytes":32934,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","bytes":32934}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59","live_bytes":32934,"live_hash_match":true},{"path":"/openapi.yaml","expected_content_type":"text/yaml; charset=utf-8","bytes":22044,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/yaml; charset=utf-8","ok":true,"sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","bytes":22044}],"live_status":200,"live_content_type":"text/yaml; charset=utf-8","live_ok":true,"live_sha256":"d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c","live_bytes":22044,"live_hash_match":true},{"path":"/llms.txt","expected_content_type":"text/plain; charset=utf-8","bytes":610,"sha256":"66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881","bytes":610},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881","bytes":610},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881","bytes":610}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881","live_bytes":610,"live_hash_match":true},{"path":"/llms-full.txt","expected_content_type":"text/plain; charset=utf-8","bytes":1559,"sha256":"98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498","bytes":1559},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498","bytes":1559},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498","bytes":1559}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498","live_bytes":1559,"live_hash_match":true},{"path":"/docs.md","expected_content_type":"text/markdown; charset=utf-8","bytes":887,"sha256":"863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4","bytes":887},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4","bytes":887},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4","bytes":887}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4","live_bytes":887,"live_hash_match":true},{"path":"/docs/api.md","expected_content_type":"text/markdown; charset=utf-8","bytes":1436,"sha256":"6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810","bytes":1436},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810","bytes":1436},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810","bytes":1436}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810","live_bytes":1436,"live_hash_match":true},{"path":"/spec.md","expected_content_type":"text/markdown; charset=utf-8","bytes":1363,"sha256":"329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb","bytes":1363},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb","bytes":1363},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb","bytes":1363}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb","live_bytes":1363,"live_hash_match":true},{"path":"/status.md","expected_content_type":"text/markdown; charset=utf-8","bytes":278,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","bytes":278}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"e78555e4e90516b5cf47120bb42c7d7d4d562e97fa03b87170c1351774a341ef","live_bytes":278,"live_hash_match":true},{"path":"/legal/terms.md","expected_content_type":"text/markdown; charset=utf-8","bytes":481,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","bytes":481}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"b8bf1831cf0096654502a730a436079cf99271cf204b95bc2a9525045959c9dc","live_bytes":481,"live_hash_match":true},{"path":"/legal/privacy.md","expected_content_type":"text/markdown; charset=utf-8","bytes":390,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/markdown; charset=utf-8","ok":true,"sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","bytes":390}],"live_status":200,"live_content_type":"text/markdown; charset=utf-8","live_ok":true,"live_sha256":"71075d19b276572a5f212bfd39d026149feb3b129d9d4169d9e8acd04646813d","live_bytes":390,"live_hash_match":true},{"path":"/discovery/audit/index.html","expected_content_type":"text/html; charset=utf-8","bytes":1211,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":true,"sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","bytes":1211}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":true,"live_sha256":"8344d5632076c1ba841001f16c8822f65e22106cddda87ba45e8e31ebac6d160","live_bytes":1211,"live_hash_match":true},{"path":"/robots.txt","expected_content_type":"text/plain; charset=utf-8","bytes":111,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/plain; charset=utf-8","ok":true,"sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","bytes":111}],"live_status":200,"live_content_type":"text/plain; charset=utf-8","live_ok":true,"live_sha256":"d7922429965459ffa71fcff8f97e0937e7dd5dad1b573e1b0aa216a797e5e127","live_bytes":111,"live_hash_match":true},{"path":"/sitemap.xml","expected_content_type":"application/xml; charset=utf-8","bytes":2740,"sha256":"34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119","bytes":2740},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119","bytes":2740},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/xml; charset=utf-8","ok":true,"sha256":"34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119","bytes":2740}],"live_status":200,"live_content_type":"application/xml; charset=utf-8","live_ok":true,"live_sha256":"34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119","live_bytes":2740,"live_hash_match":true},{"path":"/rss.xml","expected_content_type":"application/rss+xml; charset=utf-8","bytes":605,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/rss+xml; charset=utf-8","ok":true,"sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","bytes":605}],"live_status":200,"live_content_type":"application/rss+xml; charset=utf-8","live_ok":true,"live_sha256":"7df18e94f2ea3576d9a0db69670cd1cb211fb55190e7204eff6d2290fd34e4a5","live_bytes":605,"live_hash_match":true},{"path":"/logo.svg","expected_content_type":"image/svg+xml","bytes":1259,"sha256":"989ec23791b6c4ece64be610b988044d4f2813e7d1c8d7f8a040942fbe141fd7","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/discovery/audit/latest.pretty.json","expected_content_type":"application/json; charset=utf-8","bytes":30400,"sha256":"265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf","bytes":30400},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf","bytes":30400},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"application/json; charset=utf-8","ok":true,"sha256":"265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf","bytes":30400}],"live_status":200,"live_content_type":"application/json; charset=utf-8","live_ok":true,"live_sha256":"265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf","live_bytes":30400,"live_hash_match":true},{"path":"/logo-mark.svg","expected_content_type":"image/svg+xml","bytes":565,"sha256":"4c67dbf4b305c31c0c451f679cd7c1d477def3fb6b7009809c5078b838d979ea","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/favicon.svg","expected_content_type":"image/svg+xml","bytes":391,"sha256":"b1e14396016eecdbb52bc8bfdffa198c90c475e73aed4027186702832525aae1","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/brand/logo.svg","expected_content_type":"image/svg+xml","bytes":1259,"sha256":"989ec23791b6c4ece64be610b988044d4f2813e7d1c8d7f8a040942fbe141fd7","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/brand/logo-mark.svg","expected_content_type":"image/svg+xml","bytes":565,"sha256":"4c67dbf4b305c31c0c451f679cd7c1d477def3fb6b7009809c5078b838d979ea","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/brand/favicon.svg","expected_content_type":"image/svg+xml","bytes":391,"sha256":"b1e14396016eecdbb52bc8bfdffa198c90c475e73aed4027186702832525aae1","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/brand/seal.svg","expected_content_type":"image/svg+xml","bytes":1837,"sha256":"7f1c385d96314a7d931c897c4aa4cb10e4b87bdb29ee7faef9d24d2312162497","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/cert-seal.svg","expected_content_type":"image/svg+xml","bytes":1837,"sha256":"7f1c385d96314a7d931c897c4aa4cb10e4b87bdb29ee7faef9d24d2312162497","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"text/html; charset=utf-8","ok":false,"sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","bytes":4315}],"live_status":200,"live_content_type":"text/html; charset=utf-8","live_ok":false,"live_sha256":"2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66","live_bytes":4315,"live_hash_match":true},{"path":"/logo.png","expected_content_type":"image/png","bytes":3506,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"image/png","ok":true,"sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","bytes":3506}],"live_status":200,"live_content_type":"image/png","live_ok":true,"live_sha256":"275d4ab9bb683a468ea2e43b4f27812c5a35a22d83cc8bb8cbc22f12774c19ca","live_bytes":3506,"live_hash_match":true},{"path":"/og.png","expected_content_type":"image/png","bytes":29107,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","live_checks":[{"base_url":"https://agentability.org","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107},{"base_url":"https://agentability-prod-jenfjn.web.app","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107},{"base_url":"https://agentability-prod-jenfjn.firebaseapp.com","status":200,"content_type":"image/png","ok":true,"sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","bytes":29107}],"live_status":200,"live_content_type":"image/png","live_ok":true,"live_sha256":"b57c348d0814dba8babb074a51210b9320771505570156f2345ee056ef6239cd","live_bytes":29107,"live_hash_match":true}]} diff --git a/apps/web/public/discovery/audit/latest.pretty.json b/apps/web/public/discovery/audit/latest.pretty.json index 7530b5e..7d57cc5 100644 --- a/apps/web/public/discovery/audit/latest.pretty.json +++ b/apps/web/public/discovery/audit/latest.pretty.json @@ -1,17 +1,26 @@ { - "generated_at": "2026-01-20T02:38:34.870Z", - "live_checked_at": "2026-01-20T02:38:32.263Z", + "generated_at": "2026-01-24T01:30:36.792Z", + "live_checked_at": "2026-01-24T01:30:33.448Z", "strict_pretty": false, - "spec_version": "1.0", + "spec_version": "1.2", "engine": { "name": "agentability", "version": "0.1.0" }, "score_target": 100, "discoverability_health": { - "status": "pass", + "status": "fail", "missing": [], - "unreachable": [], + "unreachable": [ + "/logo.svg", + "/logo-mark.svg", + "/favicon.svg", + "/brand/logo.svg", + "/brand/logo-mark.svg", + "/brand/favicon.svg", + "/brand/seal.svg", + "/cert-seal.svg" + ], "hash_mismatch_required": [], "hash_mismatch_optional": [] }, @@ -33,10 +42,18 @@ "/discovery/audit/index.html", "/robots.txt", "/sitemap.xml", - "/rss.xml" + "/rss.xml", + "/logo.svg" ], "optional_surfaces": [ "/discovery/audit/latest.pretty.json", + "/logo-mark.svg", + "/favicon.svg", + "/brand/logo.svg", + "/brand/logo-mark.svg", + "/brand/favicon.svg", + "/brand/seal.svg", + "/cert-seal.svg", "/logo.png", "/og.png" ], @@ -50,14 +67,14 @@ "path": "/.well-known/air.json", "expected_content_type": "application/json; charset=utf-8", "bytes": 1779, - "sha256": "fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa", + "sha256": "0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa", + "sha256": "0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe", "bytes": 1779 }, { @@ -65,7 +82,7 @@ "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa", + "sha256": "0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe", "bytes": 1779 }, { @@ -73,98 +90,98 @@ "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa", + "sha256": "0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe", "bytes": 1779 } ], "live_status": 200, "live_content_type": "application/json; charset=utf-8", "live_ok": true, - "live_sha256": "fe3faf0b7b508c73ce4513b420eabf8ec009cc09defa481406ff13556f6f46aa", + "live_sha256": "0d12e087ea5ba916782c6b88edbeb4b03132cb885d6a5bd48b8cb0027ad830fe", "live_bytes": 1779, "live_hash_match": true }, { "path": "/.well-known/openapi.json", "expected_content_type": "application/json; charset=utf-8", - "bytes": 27796, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", + "bytes": 32934, + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 } ], "live_status": 200, "live_content_type": "application/json; charset=utf-8", "live_ok": true, - "live_sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "live_bytes": 27796, + "live_sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "live_bytes": 32934, "live_hash_match": true }, { "path": "/.well-known/openapi.yaml", "expected_content_type": "text/yaml; charset=utf-8", - "bytes": 18645, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", + "bytes": 22044, + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 } ], "live_status": 200, "live_content_type": "text/yaml; charset=utf-8", "live_ok": true, - "live_sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "live_bytes": 18645, + "live_sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "live_bytes": 22044, "live_hash_match": true }, { "path": "/.well-known/ai-plugin.json", "expected_content_type": "application/json; charset=utf-8", "bytes": 633, - "sha256": "2a4e369d246092e7f0fcef92acb80bc1dfe4896142e8be7fafd39d94e181a92d", + "sha256": "9538a87c56b652f6fea86a2f0b5fe3391268cb0cea37ec7af908ebd6e0b24e2e", "live_checks": [ { "base_url": "https://agentability.org", @@ -201,267 +218,267 @@ { "path": "/openapi.json", "expected_content_type": "application/json; charset=utf-8", - "bytes": 27796, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", + "bytes": 32934, + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "bytes": 27796 + "sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "bytes": 32934 } ], "live_status": 200, "live_content_type": "application/json; charset=utf-8", "live_ok": true, - "live_sha256": "2d27a0f5d2636af3f485529d24a611827aaf3237b23558bcaca5838fb47aa757", - "live_bytes": 27796, + "live_sha256": "43af9b0067b2e4237082fa9894d6002b3cb05f5081f017f6ad39bd0ec7b99c59", + "live_bytes": 32934, "live_hash_match": true }, { "path": "/openapi.yaml", "expected_content_type": "text/yaml; charset=utf-8", - "bytes": 18645, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", + "bytes": 22044, + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/yaml; charset=utf-8", "ok": true, - "sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "bytes": 18645 + "sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "bytes": 22044 } ], "live_status": 200, "live_content_type": "text/yaml; charset=utf-8", "live_ok": true, - "live_sha256": "0349dba03ad9ea9fc22041fdbde2d2136dd99ea8be9879da9012339103a304e8", - "live_bytes": 18645, + "live_sha256": "d8faad57c24b16c87ff3602252bdf49e8445e7450319ebb50cb47a936c82c24c", + "live_bytes": 22044, "live_hash_match": true }, { "path": "/llms.txt", "expected_content_type": "text/plain; charset=utf-8", - "bytes": 523, - "sha256": "a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d", + "bytes": 610, + "sha256": "66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d", - "bytes": 523 + "sha256": "66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881", + "bytes": 610 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d", - "bytes": 523 + "sha256": "66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881", + "bytes": 610 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d", - "bytes": 523 + "sha256": "66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881", + "bytes": 610 } ], "live_status": 200, "live_content_type": "text/plain; charset=utf-8", "live_ok": true, - "live_sha256": "a8f42d7f1de4635c316e9256b0f091c87a99cf2596fb6259240f607f44a4c46d", - "live_bytes": 523, + "live_sha256": "66616aefcc5504b3f00e3db612553dcf712fdf8cd21d4a8a5f8f0d9d7543d881", + "live_bytes": 610, "live_hash_match": true }, { "path": "/llms-full.txt", "expected_content_type": "text/plain; charset=utf-8", - "bytes": 1359, - "sha256": "2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49", + "bytes": 1559, + "sha256": "98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49", - "bytes": 1359 + "sha256": "98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498", + "bytes": 1559 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49", - "bytes": 1359 + "sha256": "98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498", + "bytes": 1559 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/plain; charset=utf-8", "ok": true, - "sha256": "2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49", - "bytes": 1359 + "sha256": "98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498", + "bytes": 1559 } ], "live_status": 200, "live_content_type": "text/plain; charset=utf-8", "live_ok": true, - "live_sha256": "2653cd7805922cc01a957b1d1bf1235f97ec98f7ef5dcbb96294352810617d49", - "live_bytes": 1359, + "live_sha256": "98227e875df65e4f7c7529f7ff956264cc226765bf89a3d55f9bced58773d498", + "live_bytes": 1559, "live_hash_match": true }, { "path": "/docs.md", "expected_content_type": "text/markdown; charset=utf-8", - "bytes": 729, - "sha256": "f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736", + "bytes": 887, + "sha256": "863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736", - "bytes": 729 + "sha256": "863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4", + "bytes": 887 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736", - "bytes": 729 + "sha256": "863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4", + "bytes": 887 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736", - "bytes": 729 + "sha256": "863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4", + "bytes": 887 } ], "live_status": 200, "live_content_type": "text/markdown; charset=utf-8", "live_ok": true, - "live_sha256": "f710e1bea6456226efb44f05bca695cbea5a37dc6cd4fe75f537265069c55736", - "live_bytes": 729, + "live_sha256": "863ad525cc90d752a67238afbe1929a30bfcedcc83c002c82f908dd55c9c11f4", + "live_bytes": 887, "live_hash_match": true }, { "path": "/docs/api.md", "expected_content_type": "text/markdown; charset=utf-8", - "bytes": 1203, - "sha256": "1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1", + "bytes": 1436, + "sha256": "6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1", - "bytes": 1203 + "sha256": "6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810", + "bytes": 1436 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1", - "bytes": 1203 + "sha256": "6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810", + "bytes": 1436 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1", - "bytes": 1203 + "sha256": "6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810", + "bytes": 1436 } ], "live_status": 200, "live_content_type": "text/markdown; charset=utf-8", "live_ok": true, - "live_sha256": "1a8e2ea6fa640856a30afa2d2280bc8caddcb1916d25a7c457c9b16c9083a7d1", - "live_bytes": 1203, + "live_sha256": "6b789d6c6dd39bcb44cb9526e213fa4043ff8902fec96a55c6f0497fb403b810", + "live_bytes": 1436, "live_hash_match": true }, { "path": "/spec.md", "expected_content_type": "text/markdown; charset=utf-8", - "bytes": 1131, - "sha256": "dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82", + "bytes": 1363, + "sha256": "329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82", - "bytes": 1131 + "sha256": "329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb", + "bytes": 1363 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82", - "bytes": 1131 + "sha256": "329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb", + "bytes": 1363 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "text/markdown; charset=utf-8", "ok": true, - "sha256": "dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82", - "bytes": 1131 + "sha256": "329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb", + "bytes": 1363 } ], "live_status": 200, "live_content_type": "text/markdown; charset=utf-8", "live_ok": true, - "live_sha256": "dda46c80b79cdffe43e26ff429aacb2e56159a0d264825dcdc5dcb9eda560c82", - "live_bytes": 1131, + "live_sha256": "329c0bddc5daf9e40d475a60f0b423f4dc244460050b4d63ac3bb2b3bdf8f1bb", + "live_bytes": 1363, "live_hash_match": true }, { @@ -657,39 +674,39 @@ { "path": "/sitemap.xml", "expected_content_type": "application/xml; charset=utf-8", - "bytes": 2305, - "sha256": "a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3", + "bytes": 2740, + "sha256": "34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "application/xml; charset=utf-8", "ok": true, - "sha256": "a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3", - "bytes": 2305 + "sha256": "34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119", + "bytes": 2740 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "application/xml; charset=utf-8", "ok": true, - "sha256": "a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3", - "bytes": 2305 + "sha256": "34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119", + "bytes": 2740 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "application/xml; charset=utf-8", "ok": true, - "sha256": "a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3", - "bytes": 2305 + "sha256": "34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119", + "bytes": 2740 } ], "live_status": 200, "live_content_type": "application/xml; charset=utf-8", "live_ok": true, - "live_sha256": "a4383fd9eafcc70838487f02c800865ef78635d841105c7eaff070e4946859f3", - "live_bytes": 2305, + "live_sha256": "34f1b6410884d178cbfbf570f03afeb2e17c9f7147fb8dd2d4c1c6e257a9b119", + "live_bytes": 2740, "live_hash_match": true }, { @@ -730,42 +747,346 @@ "live_bytes": 605, "live_hash_match": true }, + { + "path": "/logo.svg", + "expected_content_type": "image/svg+xml", + "bytes": 1259, + "sha256": "989ec23791b6c4ece64be610b988044d4f2813e7d1c8d7f8a040942fbe141fd7", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, { "path": "/discovery/audit/latest.pretty.json", "expected_content_type": "application/json; charset=utf-8", - "bytes": 29822, - "sha256": "f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0", + "bytes": 30400, + "sha256": "265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf", "live_checks": [ { "base_url": "https://agentability.org", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0", - "bytes": 29822 + "sha256": "265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf", + "bytes": 30400 }, { "base_url": "https://agentability-prod-jenfjn.web.app", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0", - "bytes": 29822 + "sha256": "265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf", + "bytes": 30400 }, { "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", "status": 200, "content_type": "application/json; charset=utf-8", "ok": true, - "sha256": "f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0", - "bytes": 29822 + "sha256": "265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf", + "bytes": 30400 } ], "live_status": 200, "live_content_type": "application/json; charset=utf-8", "live_ok": true, - "live_sha256": "f3b8bc9cc14731b6fdb35d5ceea7bd42364f73cdb7eecd11c482cefe6ffff5d0", - "live_bytes": 29822, + "live_sha256": "265a8731dd300f99a3c7654718b4f211379987bf5c93b450f95ba46149013faf", + "live_bytes": 30400, + "live_hash_match": true + }, + { + "path": "/logo-mark.svg", + "expected_content_type": "image/svg+xml", + "bytes": 565, + "sha256": "4c67dbf4b305c31c0c451f679cd7c1d477def3fb6b7009809c5078b838d979ea", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/favicon.svg", + "expected_content_type": "image/svg+xml", + "bytes": 391, + "sha256": "b1e14396016eecdbb52bc8bfdffa198c90c475e73aed4027186702832525aae1", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/brand/logo.svg", + "expected_content_type": "image/svg+xml", + "bytes": 1259, + "sha256": "989ec23791b6c4ece64be610b988044d4f2813e7d1c8d7f8a040942fbe141fd7", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/brand/logo-mark.svg", + "expected_content_type": "image/svg+xml", + "bytes": 565, + "sha256": "4c67dbf4b305c31c0c451f679cd7c1d477def3fb6b7009809c5078b838d979ea", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/brand/favicon.svg", + "expected_content_type": "image/svg+xml", + "bytes": 391, + "sha256": "b1e14396016eecdbb52bc8bfdffa198c90c475e73aed4027186702832525aae1", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/brand/seal.svg", + "expected_content_type": "image/svg+xml", + "bytes": 1837, + "sha256": "7f1c385d96314a7d931c897c4aa4cb10e4b87bdb29ee7faef9d24d2312162497", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, + "live_hash_match": true + }, + { + "path": "/cert-seal.svg", + "expected_content_type": "image/svg+xml", + "bytes": 1837, + "sha256": "7f1c385d96314a7d931c897c4aa4cb10e4b87bdb29ee7faef9d24d2312162497", + "live_checks": [ + { + "base_url": "https://agentability.org", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.web.app", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + }, + { + "base_url": "https://agentability-prod-jenfjn.firebaseapp.com", + "status": 200, + "content_type": "text/html; charset=utf-8", + "ok": false, + "sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "bytes": 4315 + } + ], + "live_status": 200, + "live_content_type": "text/html; charset=utf-8", + "live_ok": false, + "live_sha256": "2921fd77561313ec03771fa24edcfd3fd60343cd4a588f36b01109cb07cffc66", + "live_bytes": 4315, "live_hash_match": true }, { diff --git a/apps/web/public/docs.md b/apps/web/public/docs.md index 577404e..6802590 100644 --- a/apps/web/public/docs.md +++ b/apps/web/public/docs.md @@ -12,12 +12,15 @@ Agentability evaluates public-facing agent readiness signals: discovery, callabl - Report UI: https://agentability.org/reports/{domain} - Latest JSON: https://agentability.org/v1/evaluations/{domain}/latest.json +- Badge: https://agentability.org/badge/{domain}.svg +- Certificate: https://agentability.org/cert/{domain} ## API - POST https://agentability.org/v1/evaluate - GET https://agentability.org/v1/runs/{runId} - POST https://agentability.org/mcp (MCP JSON-RPC) +- GET https://agentability.org/badge/{domain}.svg See https://agentability.org/docs/api.md for full request and response details. diff --git a/apps/web/public/docs/api.md b/apps/web/public/docs/api.md index ec2347b..116439b 100644 --- a/apps/web/public/docs/api.md +++ b/apps/web/public/docs/api.md @@ -45,6 +45,15 @@ Returns the latest run state. When complete, it returns a full evaluation result ## GET /v1/evaluations/{domain}/latest.json Returns the most recent evaluation for a domain. +May include: +- previousRunId +- diff (score + pillar deltas, issue changes) +- previousSummary (prior score snapshot) + +## GET /badge/{domain}.svg + +Returns a shareable SVG badge for the latest score. +Cache-Control: public, max-age=300. ## POST /mcp diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg new file mode 100644 index 0000000..ab6de1b --- /dev/null +++ b/apps/web/public/favicon.svg @@ -0,0 +1,6 @@ + + + + diff --git a/apps/web/public/llms-full.txt b/apps/web/public/llms-full.txt index b0d7ef2..91c0231 100644 --- a/apps/web/public/llms-full.txt +++ b/apps/web/public/llms-full.txt @@ -12,6 +12,8 @@ Verification: Reports: - https://agentability.org/reports/{domain} - https://agentability.org/v1/evaluations/{domain}/latest.json +- https://agentability.org/badge/{domain}.svg +- https://agentability.org/cert/{domain} Spec: - https://agentability.org/spec.md @@ -21,6 +23,8 @@ How to use the API: {"origin":"https://example.com","profile":"auto"} - Poll https://agentability.org/v1/runs/{runId} until status is complete - POST https://agentability.org/mcp (JSON-RPC) +- Embed badge: https://agentability.org/badge/{domain}.svg +- Certificate: https://agentability.org/cert/{domain} Pillars: - Discovery: machine entrypoints and canonical docs. diff --git a/apps/web/public/llms.txt b/apps/web/public/llms.txt index d9a1235..46b5218 100644 --- a/apps/web/public/llms.txt +++ b/apps/web/public/llms.txt @@ -12,6 +12,8 @@ Verification: Reports: - https://agentability.org/reports/{domain} - https://agentability.org/v1/evaluations/{domain}/latest.json +- https://agentability.org/badge/{domain}.svg +- https://agentability.org/cert/{domain} Spec: - https://agentability.org/spec.md diff --git a/apps/web/public/logo-mark.svg b/apps/web/public/logo-mark.svg new file mode 100644 index 0000000..2506363 --- /dev/null +++ b/apps/web/public/logo-mark.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/apps/web/public/logo.svg b/apps/web/public/logo.svg new file mode 100644 index 0000000..4835d25 --- /dev/null +++ b/apps/web/public/logo.svg @@ -0,0 +1,28 @@ + + + + + + + agentability + + + verified agent-readiness standard + + diff --git a/apps/web/public/openapi.json b/apps/web/public/openapi.json index 376cfa5..60d5991 100644 --- a/apps/web/public/openapi.json +++ b/apps/web/public/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "Agentability Public API", - "version": "0.1.0", + "version": "0.2.0", "description": "Public-mode agent readiness evaluator API." }, "servers": [ @@ -390,7 +390,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EvaluationResult" + "$ref": "#/components/schemas/LatestEvaluation" } } } @@ -433,6 +433,43 @@ } } } + }, + "/badge/{domain}.svg": { + "get": { + "summary": "Fetch a shareable badge for a domain", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "SVG badge", + "content": { + "image/svg+xml": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "No evaluation found", + "content": { + "image/svg+xml": { + "schema": { + "type": "string" + } + } + } + } + } + } } }, "components": { @@ -570,6 +607,12 @@ "artifacts": { "$ref": "#/components/schemas/Artifacts" }, + "previousRunId": { + "type": "string" + }, + "diffSummary": { + "$ref": "#/components/schemas/DiffSummary" + }, "engine": { "$ref": "#/components/schemas/EngineInfo" }, @@ -668,6 +711,12 @@ "artifacts": { "$ref": "#/components/schemas/Artifacts" }, + "previousRunId": { + "type": "string" + }, + "diffSummary": { + "$ref": "#/components/schemas/DiffSummary" + }, "engine": { "$ref": "#/components/schemas/EngineInfo" }, @@ -684,6 +733,27 @@ } } }, + "LatestEvaluation": { + "allOf": [ + { + "$ref": "#/components/schemas/EvaluationResult" + }, + { + "type": "object", + "properties": { + "diff": { + "$ref": "#/components/schemas/DiffSummary" + }, + "previousRunId": { + "type": "string" + }, + "previousSummary": { + "$ref": "#/components/schemas/PreviousSummary" + } + } + } + ] + }, "CheckResult": { "type": "object", "required": [ @@ -818,6 +888,161 @@ }, "rulesetHash": { "type": "string" + }, + "specVersion": { + "type": "string" + } + } + }, + "PreviousSummary": { + "type": "object", + "required": [ + "score", + "grade", + "pillarScores" + ], + "properties": { + "score": { + "type": "number" + }, + "grade": { + "type": "string" + }, + "pillarScores": { + "$ref": "#/components/schemas/PillarScores" + }, + "completedAt": { + "type": "string", + "format": "date-time" + } + } + }, + "DiffIssue": { + "type": "object", + "required": [ + "checkId", + "to", + "severity" + ], + "properties": { + "checkId": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ], + "nullable": true + }, + "to": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ] + }, + "severity": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + } + } + }, + "DiffChange": { + "type": "object", + "required": [ + "checkId", + "to" + ], + "properties": { + "checkId": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ], + "nullable": true + }, + "to": { + "type": "string", + "enum": [ + "pass", + "warn", + "fail" + ] + } + } + }, + "DiffSummary": { + "type": "object", + "required": [ + "scoreDelta", + "pillarDelta", + "newIssues", + "fixedIssues", + "changed", + "counts" + ], + "properties": { + "scoreDelta": { + "type": "number" + }, + "gradeFrom": { + "type": "string" + }, + "gradeTo": { + "type": "string" + }, + "pillarDelta": { + "$ref": "#/components/schemas/PillarScores" + }, + "newIssues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffIssue" + } + }, + "fixedIssues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffIssue" + } + }, + "changed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiffChange" + } + }, + "counts": { + "type": "object", + "required": [ + "pass", + "warn", + "fail" + ], + "properties": { + "pass": { + "type": "number" + }, + "warn": { + "type": "number" + }, + "fail": { + "type": "number" + } + } } } }, diff --git a/apps/web/public/openapi.yaml b/apps/web/public/openapi.yaml index c03cd5f..c1bad82 100644 --- a/apps/web/public/openapi.yaml +++ b/apps/web/public/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Agentability Public API - version: 0.1.0 + version: 0.2.0 description: Public-mode agent readiness evaluator API. servers: - url: https://agentability.org @@ -253,7 +253,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/EvaluationResult" + $ref: "#/components/schemas/LatestEvaluation" "404": description: Domain not found content: @@ -276,6 +276,28 @@ paths: value: message: "Evaluation failed" code: "evaluation_failed" + /badge/{domain}.svg: + get: + summary: Fetch a shareable badge for a domain + parameters: + - name: domain + in: path + required: true + schema: + type: string + responses: + "200": + description: SVG badge + content: + image/svg+xml: + schema: + type: string + "404": + description: No evaluation found + content: + image/svg+xml: + schema: + type: string components: schemas: EvaluationInput: @@ -375,6 +397,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -447,6 +473,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -457,6 +487,17 @@ components: format: date-time error: type: string + LatestEvaluation: + allOf: + - $ref: "#/components/schemas/EvaluationResult" + - type: object + properties: + diff: + $ref: "#/components/schemas/DiffSummary" + previousRunId: + type: string + previousSummary: + $ref: "#/components/schemas/PreviousSummary" CheckResult: type: object required: @@ -553,6 +594,116 @@ components: type: string rulesetHash: type: string + specVersion: + type: string + PreviousSummary: + type: object + required: + - score + - grade + - pillarScores + properties: + score: + type: number + grade: + type: string + pillarScores: + $ref: "#/components/schemas/PillarScores" + completedAt: + type: string + format: date-time + DiffIssue: + type: object + required: + - checkId + - to + - severity + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + severity: + type: string + enum: + - high + - medium + - low + DiffChange: + type: object + required: + - checkId + - to + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + DiffSummary: + type: object + required: + - scoreDelta + - pillarDelta + - newIssues + - fixedIssues + - changed + - counts + properties: + scoreDelta: + type: number + gradeFrom: + type: string + gradeTo: + type: string + pillarDelta: + $ref: "#/components/schemas/PillarScores" + newIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + fixedIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + changed: + type: array + items: + $ref: "#/components/schemas/DiffChange" + counts: + type: object + required: + - pass + - warn + - fail + properties: + pass: + type: number + warn: + type: number + fail: + type: number JsonRpcRequest: type: object required: diff --git a/apps/web/public/sitemap.xml b/apps/web/public/sitemap.xml index 7593768..ee910b2 100644 --- a/apps/web/public/sitemap.xml +++ b/apps/web/public/sitemap.xml @@ -20,6 +20,16 @@ monthly 0.7 + + https://agentability.org/legal/terms.md + monthly + 0.4 + + + https://agentability.org/legal/privacy.md + monthly + 0.4 + https://agentability.org/status.md monthly @@ -75,6 +85,11 @@ weekly 0.4 + + https://agentability.org/discovery/audit/latest.pretty.json + weekly + 0.4 + https://agentability.org/rss.xml weekly diff --git a/apps/web/public/spec.md b/apps/web/public/spec.md index 8b3ab21..4ddc670 100644 --- a/apps/web/public/spec.md +++ b/apps/web/public/spec.md @@ -1,6 +1,6 @@ -# Agentability Spec (Public Mode v1.0) +# Agentability Spec (Public Mode v1.2) -Spec version: 1.0 +Spec version: 1.2 ## Scope @@ -30,6 +30,13 @@ Each check yields pass/warn/fail with weights per profile. Pillar scores sum int Evaluation results are published at: - https://agentability.org/v1/evaluations/{domain}/latest.json - https://agentability.org/reports/{domain} +- https://agentability.org/badge/{domain}.svg +- https://agentability.org/cert/{domain} + +Latest evaluation responses may include: +- previousRunId +- diff (score + pillar deltas, issue changes) +- previousSummary (prior score snapshot) ## SSRF Policy (Public Mode) diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 754bce3..ee1d209 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -2,6 +2,7 @@ import { Routes, Route, Link } from "react-router-dom"; import { HomePage } from "@/pages/HomePage"; import { ReportPage } from "@/pages/ReportPage"; import { RunPage } from "@/pages/RunPage"; +import { CertificatePage } from "@/pages/CertificatePage"; import { Badge } from "@/components/ui/badge"; function App() { @@ -13,13 +14,13 @@ function App() {
- -
- A -
+ + Agentability
-
Agentability
-
Readiness Lab
+
agentability
+
+ Verified readiness standard +
@@ -37,6 +38,7 @@ function App() { } /> } /> + } /> } /> diff --git a/apps/web/src/components/brand/CertSeal.tsx b/apps/web/src/components/brand/CertSeal.tsx new file mode 100644 index 0000000..60d9260 --- /dev/null +++ b/apps/web/src/components/brand/CertSeal.tsx @@ -0,0 +1,23 @@ +type Props = { + specVersion?: string; + dateISO?: string; + className?: string; +}; + +export function CertSeal({ specVersion, dateISO, className }: Props) { + const date = (dateISO || "").slice(0, 10); + const line = [specVersion ? `SPEC ${specVersion}` : null, date ? date : null] + .filter(Boolean) + .join(" - "); + + return ( +
+ Agentability certified seal + {line ? ( +
+ {line} +
+ ) : null} +
+ ); +} diff --git a/apps/web/src/components/share/BadgeEmbed.tsx b/apps/web/src/components/share/BadgeEmbed.tsx new file mode 100644 index 0000000..9d3748c --- /dev/null +++ b/apps/web/src/components/share/BadgeEmbed.tsx @@ -0,0 +1,52 @@ +import { useMemo } from "react"; +import { Button } from "@/components/ui/button"; + +type Props = { + domain: string; +}; + +function copy(text: string) { + return navigator.clipboard.writeText(text); +} + +export function BadgeEmbed({ domain }: Props) { + const baseUrl = "https://agentability.org"; + const badgeUrl = useMemo( + () => `${baseUrl}/badge/${encodeURIComponent(domain)}.svg`, + [baseUrl, domain] + ); + const reportUrl = useMemo( + () => `${baseUrl}/reports/${encodeURIComponent(domain)}`, + [baseUrl, domain] + ); + const html = useMemo( + () => `Agentability score`, + [badgeUrl, reportUrl] + ); + const md = useMemo( + () => `[![Agentability Score](${badgeUrl})](${reportUrl})`, + [badgeUrl, reportUrl] + ); + + return ( +
+ +
+ + + +
+
+ ); +} diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts index 00e71d1..022463b 100644 --- a/apps/web/src/lib/api.ts +++ b/apps/web/src/lib/api.ts @@ -1,4 +1,4 @@ -import type { EvaluationResult } from "@agentability/shared"; +import type { DiffSummary, EvaluationResult, PillarScores } from "@agentability/shared"; const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ""; @@ -11,6 +11,32 @@ export type EvaluateResponse = { domain: string; }; +export type PreviousSummary = { + score: number; + grade: string; + pillarScores: PillarScores; + completedAt?: string; +}; + +export type LatestEvaluation = EvaluationResult & { + previousRunId?: string; + diff?: DiffSummary; + previousSummary?: PreviousSummary; +}; + +export type DiscoveryAudit = { + live_checked_at?: string; + strict_pretty?: boolean; + live_sources?: string[]; + discoverability_health?: { + status: "pass" | "degraded" | "fail"; + missing?: string[]; + unreachable?: string[]; + hash_mismatch_required?: string[]; + hash_mismatch_optional?: string[]; + }; +}; + export async function evaluateOrigin(origin: string, profile?: string): Promise { const response = await fetch(`${API_BASE}/v1/evaluate`, { method: "POST", @@ -35,7 +61,7 @@ export async function fetchRun(runId: string): Promise { return response.json(); } -export async function fetchLatest(domain: string): Promise { +export async function fetchLatest(domain: string): Promise { const response = await fetch(`${API_BASE}/v1/evaluations/${domain}/latest.json`); if (!response.ok) { const error = await response.json().catch(() => ({})); @@ -43,3 +69,11 @@ export async function fetchLatest(domain: string): Promise { } return response.json(); } + +export async function fetchDiscoveryAudit(): Promise { + const response = await fetch(`${API_BASE}/discovery/audit/latest.pretty.json`); + if (!response.ok) { + throw new Error("Audit not available"); + } + return response.json(); +} diff --git a/apps/web/src/pages/CertificatePage.tsx b/apps/web/src/pages/CertificatePage.tsx new file mode 100644 index 0000000..82f7277 --- /dev/null +++ b/apps/web/src/pages/CertificatePage.tsx @@ -0,0 +1,123 @@ +import { useQuery } from "@tanstack/react-query"; +import { Link, useParams } from "react-router-dom"; +import { fetchLatest } from "@/lib/api"; +import { DEFAULT_DESCRIPTION, useSeo } from "@/lib/seo"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { CertSeal } from "@/components/brand/CertSeal"; +import { BadgeEmbed } from "@/components/share/BadgeEmbed"; + +export function CertificatePage() { + const params = useParams(); + const domain = params.domain ?? ""; + + const query = useQuery({ + queryKey: ["certificate", domain], + queryFn: () => fetchLatest(domain), + enabled: Boolean(domain), + }); + + const title = domain ? `Agentability Certificate — ${domain}` : "Agentability Certificate"; + useSeo({ + title, + description: domain ? `Agentability certificate for ${domain}.` : DEFAULT_DESCRIPTION, + path: domain ? `/cert/${encodeURIComponent(domain)}` : "/cert", + type: "article", + }); + + if (query.isLoading) { + return
Loading certificate…
; + } + + if (query.isError || !query.data) { + return ( +
+

Certificate not found.

+ + Back to home + +
+ ); + } + + const report = query.data; + const baseUrl = typeof window !== "undefined" ? window.location.origin : "https://agentability.org"; + const reportUrl = report.artifacts?.reportUrl ?? `${baseUrl}/reports/${report.domain}`; + const jsonUrl = report.artifacts?.jsonUrl ?? `${baseUrl}/v1/evaluations/${report.domain}/latest.json`; + const verifiedOn = (report.completedAt ?? report.createdAt).split("T")[0]; + const specVersion = report.engine?.specVersion ?? "1.2"; + + return ( +
+ + + Agentability Certificate + Verified AI-native readiness signal. + + +
+
+
+
+

Domain

+

{report.domain}

+
+
+

Score

+

+ {report.score} ({report.grade}) +

+
+
+
+ Verified on {verifiedOn} +
+
+
+

Spec version

+

{specVersion}

+
+
+

Engine version

+

{report.engine?.version ?? "0.1.0"}

+
+
+

Ruleset hash

+

+ {report.engine?.rulesetHash ?? "n/a"} +

+
+
+
+ + + {report.artifacts?.evidenceBundleUrl ? ( + + ) : null} +
+
+
+ +
+
+
+
+ + + + Embed the badge + Share verification anywhere with a static badge. + + + + + +
+ ); +} diff --git a/apps/web/src/pages/HomePage.tsx b/apps/web/src/pages/HomePage.tsx index 9982b26..c6e0bfe 100644 --- a/apps/web/src/pages/HomePage.tsx +++ b/apps/web/src/pages/HomePage.tsx @@ -1,20 +1,25 @@ -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import { URLInputCard } from "@/components/URLInputCard"; -import { evaluateOrigin } from "@/lib/api"; +import { evaluateOrigin, fetchDiscoveryAudit } from "@/lib/api"; import { useSeo } from "@/lib/seo"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; export function HomePage() { useSeo({ - title: "Agent readiness evaluator", + title: "Agentability Standard for AI-Native Web Apps", description: - "Agentability audits public machine entrypoints, docs, and reliability to score agent readiness.", + "Agentability is the standard for AI-native web surfaces: discovery, callability, ingestion, trust, and reliability.", path: "/", }); const navigate = useNavigate(); + const auditQuery = useQuery({ + queryKey: ["discovery-audit"], + queryFn: fetchDiscoveryAudit, + }); const mutation = useMutation({ mutationFn: (origin: string) => evaluateOrigin(origin), onSuccess: (data) => { @@ -24,59 +29,81 @@ export function HomePage() { return (
-
+
- Agentability · Public Mode + Agentability · Authority Mode

- Agent readiness, scored in minutes. + Agentability Standard for AI‑Native Web Apps

- Agentability audits machine entrypoints, doc clarity, and repeatability to show how ready your surface is for - autonomous agents. -

-
-
-

- Public mode focuses on discoverability, callability signals, and LLM ingestion hygiene. No credentials or - private endpoints required. + Publish verifiable discovery surfaces, callable tools, and evidence‑backed trust signals. Agentability + grades how ready your web app is for autonomous agents.

-
-
-

Discovery

-

Find manifests, service descriptors, and canonical docs.

-
-
-

Reliability

-

Validate stability across repeated requests.

-
-
-

Ingestion

-

Measure the clarity and depth of published documentation.

-
+ + mutation.mutate(origin)} + loading={mutation.isPending} + error={mutation.isError ? (mutation.error instanceof Error ? mutation.error.message : "Request failed") : null} + />
-
- mutation.mutate(origin)} - loading={mutation.isPending} - error={mutation.isError ? (mutation.error instanceof Error ? mutation.error.message : "Request failed") : null} - /> + + + Verification proof + Live discovery audit across apex + Firebase hosting. + + + {auditQuery.isLoading ?

Loading audit…

: null} + {auditQuery.isError ?

Audit unavailable.

: null} + {auditQuery.data ? ( + <> +
+ Status + + {auditQuery.data.discoverability_health?.status ?? "unknown"} + +
+
+

+ Last checked:{" "} + + {auditQuery.data.live_checked_at ?? "n/a"} + +

+

+ Sources:{" "} + + {(auditQuery.data.live_sources ?? []).join(" + ") || "n/a"} + +

+ + View latest.pretty.json → + +
+ + ) : null} +
+
+
- - Showcase evaluation - See the public demo report for aistatusdashboard.com. - - - - View the example report → - + + Open source + Evidence‑based + Versioned methodology + Hash drift enforcement diff --git a/apps/web/src/pages/ReportPage.tsx b/apps/web/src/pages/ReportPage.tsx index 0d1420e..9cac030 100644 --- a/apps/web/src/pages/ReportPage.tsx +++ b/apps/web/src/pages/ReportPage.tsx @@ -2,6 +2,7 @@ import { useQuery } from "@tanstack/react-query"; import { Link, useParams } from "react-router-dom"; import { fetchLatest } from "@/lib/api"; import { DEFAULT_DESCRIPTION, useSeo } from "@/lib/seo"; +import { getFixIt } from "@agentability/shared"; import type { EvaluationProfile } from "@agentability/shared"; import { ScoreBadge } from "@/components/ScoreBadge"; import { PillarBreakdown } from "@/components/PillarBreakdown"; @@ -9,8 +10,11 @@ import { FailuresList } from "@/components/FailuresList"; import { EvidenceLinks } from "@/components/EvidenceLinks"; import { CopyLinks } from "@/components/CopyLinks"; import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"; +import { BadgeEmbed } from "@/components/share/BadgeEmbed"; const PILLAR_LABELS = { discovery: "Discovery", @@ -294,6 +298,8 @@ export function ReportPage() { } const report = query.data; + const diff = report.diff; + const previousSummary = report.previousSummary; const pillarEntries = Object.entries(report.pillarScores) as [PillarKey, number][]; const sortedPillars = [...pillarEntries].sort((a, b) => b[1] - a[1]); const strongest = sortedPillars.slice(0, 2); @@ -301,6 +307,15 @@ export function ReportPage() { const failCount = report.checks.filter((check) => check.status === "fail").length; const warnCount = report.checks.filter((check) => check.status === "warn").length; + const fixItChecks = report.checks.filter((check) => check.status !== "pass"); + const scoreDelta = diff?.scoreDelta ?? 0; + const scoreDeltaLabel = diff + ? scoreDelta === 0 + ? "No change" + : scoreDelta > 0 + ? `▲ +${scoreDelta.toFixed(1)}` + : `▼ ${scoreDelta.toFixed(1)}` + : null; const issueChecks = report.checks .filter((check) => check.status !== "pass") @@ -368,6 +383,8 @@ export function ReportPage() { ...coverageGaps.flatMap((pillar) => PILLAR_ACTIONS[pillar] ?? []), ]; const uniqueActions = Array.from(new Set(improvementActions)).slice(0, 6); + const baseUrl = typeof window !== "undefined" ? window.location.origin : "https://agentability.org"; + const certUrl = `${baseUrl}/cert/${report.domain}`; return (
@@ -396,6 +413,21 @@ export function ReportPage() { />
+ + + Badge & certificate + Embed your Agentability score anywhere. + + + + + + + Overview @@ -403,6 +435,95 @@ export function ReportPage() { Evidence + + + What changed since last run + Run-to-run delta and stability signals. + + + {!diff ? ( +

First run — no previous comparison.

+ ) : ( + <> +
+ Score delta + {scoreDeltaLabel} +
+ {previousSummary ? ( +

+ Previous:{" "} + + {previousSummary.score} ({previousSummary.grade}) + + {previousSummary.completedAt ? ` • ${previousSummary.completedAt}` : null} +

+ ) : null} +
+ {Object.entries(diff.pillarDelta).map(([pillar, delta]) => ( +
+ + {PILLAR_LABELS[pillar as PillarKey] ?? pillar} + + + {delta === 0 ? "0" : delta > 0 ? `+${delta.toFixed(1)}` : delta.toFixed(1)} + +
+ ))} +
+
+
+
New issues
+ {diff.newIssues.length ? ( +
    + {diff.newIssues.map((issue) => ( +
  • + {issue.checkId} →{" "} + {issue.to} ({issue.severity}) +
  • + ))} +
+ ) : ( +

No new issues detected.

+ )} +
+
+
Fixed
+ {diff.fixedIssues.length ? ( +
    + {diff.fixedIssues.map((issue) => ( +
  • + {issue.checkId} →{" "} + {issue.to} ({issue.severity}) +
  • + ))} +
+ ) : ( +

No fixes detected.

+ )} +
+
+ + + Changed details + + {diff.changed.length ? ( +
    + {diff.changed.map((issue) => ( +
  • + {issue.checkId} → {issue.to} +
  • + ))} +
+ ) : ( +

No additional changes.

+ )} +
+
+
+ + )} +
+
@@ -611,6 +732,65 @@ export function ReportPage() {
+ + + Fix-it snippets + Copy/paste remediations for failed or warned checks. + + + {fixItChecks.length === 0 ? ( +

No fixes needed. All checks passed.

+ ) : ( + + {fixItChecks.map((check) => { + const fix = getFixIt(check.id, check.recommendationId); + if (!fix) return null; + return ( + + + {fix.title} ({check.id}) + + +

{fix.whyItMatters}

+
    + {fix.steps.map((step) => ( +
  • {step}
  • + ))} +
+
+
+ + Snippet + + +
+
+                              {fix.snippet}
+                            
+
+ {fix.links?.length ? ( +
+ {fix.links.map((link) => ( + + {link} + + ))} +
+ ) : null} +
+
+ ); + })} +
+ )} +
+
diff --git a/firebase.json b/firebase.json index 81d3a59..16218cd 100644 --- a/firebase.json +++ b/firebase.json @@ -40,7 +40,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -61,7 +61,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -82,7 +82,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -103,7 +103,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -124,7 +124,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -145,7 +145,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -166,7 +166,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -187,7 +187,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -208,7 +208,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -229,7 +229,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -250,7 +250,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -271,7 +271,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -292,7 +292,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -313,7 +313,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -334,7 +334,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] }, @@ -355,7 +355,7 @@ }, { "key": "X-Agentability-Build", - "value": "2fac6ce" + "value": "2bea0a6" } ] } @@ -369,6 +369,10 @@ "source": "/mcp/**", "function": "api" }, + { + "source": "/badge/**", + "function": "api" + }, { "source": "/v1/**", "function": "api" diff --git a/packages/evaluator/src/evaluatePublic.ts b/packages/evaluator/src/evaluatePublic.ts index 653fab6..ab45f5e 100644 --- a/packages/evaluator/src/evaluatePublic.ts +++ b/packages/evaluator/src/evaluatePublic.ts @@ -10,6 +10,7 @@ import { import { FetchResult, safeFetch, SafeFetchOptions } from "./ssrf"; const ENGINE_VERSION = "0.1.0"; +const SPEC_VERSION = "1.2"; type Pillar = "discovery" | "callableSurface" | "llmIngestion" | "trust" | "reliability"; @@ -865,6 +866,7 @@ export async function evaluatePublic( engine: { version: ENGINE_VERSION, rulesetHash: buildRulesetHash(), + specVersion: SPEC_VERSION, }, createdAt, completedAt: new Date().toISOString(), diff --git a/packages/shared/package.json b/packages/shared/package.json index c4a8178..497b97b 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -5,13 +5,15 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "build": "tsc -p tsconfig.json" + "build": "tsc -p tsconfig.json", + "test": "vitest run" }, "dependencies": { "zod": "^3.23.8" }, "devDependencies": { "@types/node": "^20.14.10", - "typescript": "^5.5.4" + "typescript": "^5.5.4", + "vitest": "^2.1.9" } } diff --git a/packages/shared/src/diff.test.ts b/packages/shared/src/diff.test.ts new file mode 100644 index 0000000..ab0e757 --- /dev/null +++ b/packages/shared/src/diff.test.ts @@ -0,0 +1,69 @@ +import { describe, expect, it } from "vitest"; +import type { CheckResult } from "./index"; +import { computeDiff } from "./diff"; + +const baseChecks: CheckResult[] = [ + { id: "D1", status: "pass", severity: "high", summary: "ok", evidence: [] }, + { id: "L1", status: "pass", severity: "high", summary: "ok", evidence: [] }, +]; + +const baseRun = { + score: 80, + grade: "B", + pillarScores: { + discovery: 16, + callableSurface: 16, + llmIngestion: 16, + trust: 16, + reliability: 16, + }, + checks: baseChecks, +}; + +describe("computeDiff", () => { + it("returns null when there is no previous run", () => { + const result = computeDiff(null, baseRun); + expect(result).toBeNull(); + }); + + it("classifies regressions as new issues", () => { + const previous = { + ...baseRun, + checks: [{ ...baseChecks[0], status: "pass" }, baseChecks[1]], + }; + const current = { + ...baseRun, + checks: [{ ...baseChecks[0], status: "fail" }, baseChecks[1]], + }; + const diff = computeDiff(previous, current); + expect(diff?.newIssues).toHaveLength(1); + expect(diff?.newIssues[0]).toMatchObject({ checkId: "D1", from: "pass", to: "fail" }); + }); + + it("classifies improvements as fixed issues", () => { + const previous = { + ...baseRun, + checks: [{ ...baseChecks[0], status: "fail" }, baseChecks[1]], + }; + const current = { + ...baseRun, + checks: [{ ...baseChecks[0], status: "pass" }, baseChecks[1]], + }; + const diff = computeDiff(previous, current); + expect(diff?.fixedIssues).toHaveLength(1); + expect(diff?.fixedIssues[0]).toMatchObject({ checkId: "D1", from: "fail", to: "pass" }); + }); + + it("computes pillar deltas", () => { + const previous = { + ...baseRun, + pillarScores: { ...baseRun.pillarScores, discovery: 10 }, + }; + const current = { + ...baseRun, + pillarScores: { ...baseRun.pillarScores, discovery: 14 }, + }; + const diff = computeDiff(previous, current); + expect(diff?.pillarDelta.discovery).toBe(4); + }); +}); diff --git a/packages/shared/src/diff.ts b/packages/shared/src/diff.ts new file mode 100644 index 0000000..3020b64 --- /dev/null +++ b/packages/shared/src/diff.ts @@ -0,0 +1,98 @@ +import type { + CheckResult, + CheckStatus, + DiffChange, + DiffIssue, + DiffSummary, + PillarScores, +} from "./index"; + +export type DiffInput = { + score: number; + grade: string; + pillarScores: PillarScores; + checks: CheckResult[]; +}; + +const STATUS_ORDER: Record = { + pass: 0, + warn: 1, + fail: 2, +}; + +function countStatuses(checks: CheckResult[]): DiffSummary["counts"] { + return checks.reduce( + (acc, check) => { + acc[check.status] += 1; + return acc; + }, + { pass: 0, warn: 0, fail: 0 } + ); +} + +export function computeDiff(previous: DiffInput | null, current: DiffInput): DiffSummary | null { + if (!previous) return null; + + const previousById = new Map(previous.checks.map((check) => [check.id, check])); + const newIssues: DiffIssue[] = []; + const fixedIssues: DiffIssue[] = []; + const changed: DiffChange[] = []; + + for (const check of current.checks) { + const before = previousById.get(check.id); + const from = before?.status ?? null; + const to = check.status; + if (from === to) continue; + + const regression = + (from === null || from === "pass") && (to === "warn" || to === "fail"); + const escalated = from === "warn" && to === "fail"; + const improved = + (from === "warn" || from === "fail") && to === "pass"; + const softened = from === "fail" && to === "warn"; + + if (regression || escalated) { + newIssues.push({ + checkId: check.id, + from, + to, + severity: check.severity, + }); + continue; + } + + if (improved || softened) { + fixedIssues.push({ + checkId: check.id, + from, + to, + severity: before?.severity ?? check.severity, + }); + continue; + } + + changed.push({ checkId: check.id, from, to }); + } + + return { + scoreDelta: current.score - previous.score, + gradeFrom: previous.grade, + gradeTo: current.grade, + pillarDelta: { + discovery: current.pillarScores.discovery - previous.pillarScores.discovery, + callableSurface: + current.pillarScores.callableSurface - previous.pillarScores.callableSurface, + llmIngestion: current.pillarScores.llmIngestion - previous.pillarScores.llmIngestion, + trust: current.pillarScores.trust - previous.pillarScores.trust, + reliability: current.pillarScores.reliability - previous.pillarScores.reliability, + }, + newIssues, + fixedIssues, + changed, + counts: countStatuses(current.checks), + }; +} + +export function compareStatus(from: CheckStatus, to: CheckStatus): number { + return STATUS_ORDER[to] - STATUS_ORDER[from]; +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 33acb15..4a66be9 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -31,6 +31,21 @@ export const CheckResultSchema = z.object({ }); export type CheckResult = z.infer; +export const DiffIssueSchema = z.object({ + checkId: z.string(), + from: CheckStatusSchema.nullable(), + to: CheckStatusSchema, + severity: CheckSeveritySchema, +}); +export type DiffIssue = z.infer; + +export const DiffChangeSchema = z.object({ + checkId: z.string(), + from: CheckStatusSchema.nullable(), + to: CheckStatusSchema, +}); +export type DiffChange = z.infer; + export const EvidenceRecordSchema = z.object({ url: z.string().url(), method: z.string(), @@ -61,6 +76,22 @@ export const PillarScoresSchema = z.object({ }); export type PillarScores = z.infer; +export const DiffSummarySchema = z.object({ + scoreDelta: z.number(), + gradeFrom: z.string().optional(), + gradeTo: z.string().optional(), + pillarDelta: PillarScoresSchema, + newIssues: z.array(DiffIssueSchema), + fixedIssues: z.array(DiffIssueSchema), + changed: z.array(DiffChangeSchema), + counts: z.object({ + pass: z.number(), + warn: z.number(), + fail: z.number(), + }), +}); +export type DiffSummary = z.infer; + export const EvaluationResultSchema = z.object({ runId: z.string(), domain: z.string(), @@ -85,9 +116,12 @@ export const EvaluationResultSchema = z.object({ reportUrl: z.string().optional(), evidenceBundleUrl: z.string().optional(), }), + previousRunId: z.string().optional(), + diffSummary: DiffSummarySchema.optional(), engine: z.object({ version: z.string(), rulesetHash: z.string(), + specVersion: z.string().optional(), }), createdAt: z.string(), completedAt: z.string().optional(), @@ -96,3 +130,6 @@ export const EvaluationResultSchema = z.object({ export type EvaluationResult = z.infer; export type EvaluationMode = "public"; + +export * from "./diff"; +export * from "./recommendations"; diff --git a/packages/shared/src/recommendations.ts b/packages/shared/src/recommendations.ts new file mode 100644 index 0000000..a2ab5a4 --- /dev/null +++ b/packages/shared/src/recommendations.ts @@ -0,0 +1,113 @@ +export type FixIt = { + id: string; + title: string; + whyItMatters: string; + steps: string[]; + snippet: string; + links?: string[]; +}; + +export const FIX_IT_LIBRARY: Record = { + D1: { + id: "D1", + title: "Add machine discovery entrypoints", + whyItMatters: "Agents need stable, machine-readable entrypoints to avoid scraping HTML.", + steps: [ + "Publish /.well-known/air.json with product, entrypoints, legal, and verification fields.", + "Publish /llms.txt and /llms-full.txt with canonical links.", + "Ensure all entrypoints return 200 from static hosting.", + ], + snippet: `# .well-known/air.json\n{\n \"spec_version\": \"1.2\",\n \"canonical_base_url\": \"https://example.com\",\n \"product\": {\"name\": \"Example\", \"description\": \"...\", \"home_url\": \"https://example.com\"},\n \"entrypoints\": {\"web_app\": \"https://example.com\", \"api_base\": \"https://example.com/v1\"},\n \"callable_surface\": {\"openapi\": \"https://example.com/.well-known/openapi.json\", \"mcp_endpoint\": \"https://example.com/mcp\"},\n \"llm_entrypoints\": {\"llms_txt\": \"https://example.com/llms.txt\", \"llms_full_txt\": \"https://example.com/llms-full.txt\"},\n \"legal\": {\"terms_url\": \"https://example.com/legal/terms\", \"privacy_url\": \"https://example.com/legal/privacy\"},\n \"verification\": {\"discovery_audit_json\": \"https://example.com/discovery/audit/latest.json\"}\n}\n`, + links: ["https://agentability.org/spec.md"], + }, + D2: { + id: "D2", + title: "Serve entrypoints with correct content-types", + whyItMatters: "Agents reject unstable or mis-typed surfaces (HTML where JSON is expected).", + steps: [ + "Serve JSON/YAML/Markdown with explicit Content-Type headers.", + "Avoid SPA rewrites for machine surfaces.", + "Use caching headers to stabilize responses.", + ], + snippet: `# Firebase Hosting headers example\n{\n \"source\": \"/.well-known/*.json\",\n \"headers\": [{\"key\": \"Content-Type\", \"value\": \"application/json; charset=utf-8\"}]\n}\n`, + links: ["https://agentability.org/spec.md"], + }, + C2: { + id: "C2", + title: "Publish an example-rich OpenAPI", + whyItMatters: "Callable APIs need examples and clear servers to be usable by agents.", + steps: [ + "Publish OpenAPI JSON/YAML under /.well-known/.", + "Include servers pointing to your domain.", + "Add response examples for critical endpoints.", + ], + snippet: `openapi: 3.1.0\ninfo:\n title: Example API\n version: 1.0.0\nservers:\n - url: https://example.com\npaths:\n /v1/status:\n get:\n responses:\n \"200\":\n content:\n application/json:\n examples:\n ok:\n value: {\"status\": \"ok\"}\n`, + links: ["https://agentability.org/spec.md"], + }, + C3: { + id: "C3", + title: "Expose an MCP endpoint", + whyItMatters: "MCP provides a direct tool surface for agents beyond HTTP scraping.", + steps: [ + "Expose POST /mcp for JSON-RPC 2.0.", + "Implement initialize and tools/list.", + "Return helpful guidance on GET /mcp.", + ], + snippet: `POST /mcp\n{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"initialize\",\n \"params\": {\"protocolVersion\": \"2024-11-05\"}\n}\n`, + links: ["https://agentability.org/spec.md"], + }, + L1: { + id: "L1", + title: "Publish canonical docs entrypoints", + whyItMatters: "Agents need stable, linkable documentation for ingestion.", + steps: [ + "Publish /docs.md with a concise product overview.", + "Link to deeper docs like /docs/api.md.", + "Keep markdown clean and stable.", + ], + snippet: `# docs.md\n\n## Quickstart\n- Base URL: https://example.com\n- OpenAPI: https://example.com/.well-known/openapi.json\n- MCP: https://example.com/mcp\n`, + links: ["https://agentability.org/spec.md"], + }, + T1: { + id: "T1", + title: "Complete air.json with legal + verification", + whyItMatters: "Trust requires machine-readable provenance and legal endpoints.", + steps: [ + "Add canonical_base_url and contact.email.", + "Include legal terms + privacy URLs.", + "Include verification discovery audit URLs.", + ], + snippet: `\"legal\": {\n \"terms_url\": \"https://example.com/legal/terms\",\n \"privacy_url\": \"https://example.com/legal/privacy\"\n}\n`, + links: ["https://agentability.org/spec.md"], + }, + T2: { + id: "T2", + title: "Add an AI plugin manifest", + whyItMatters: "Plugin manifests provide a standard, trusted handshake for tools.", + steps: [ + "Publish /.well-known/ai-plugin.json.", + "Point to OpenAPI and legal URLs.", + "Include contact_email.", + ], + snippet: `{\n \"schema_version\": \"v1\",\n \"name_for_model\": \"example\",\n \"api\": {\"type\": \"openapi\", \"url\": \"https://example.com/.well-known/openapi.json\"},\n \"contact_email\": \"support@example.com\",\n \"legal_url\": \"https://example.com/legal/terms\"\n}\n`, + links: ["https://agentability.org/spec.md"], + }, + R3: { + id: "R3", + title: "Stabilize critical surfaces", + whyItMatters: "Agents need repeatable responses for deterministic tool use.", + steps: [ + "Avoid dynamic timestamps in core discovery surfaces.", + "Use caching headers for stability.", + "Verify repeated fetches are consistent.", + ], + snippet: `Cache-Control: public, max-age=3600\nETag: \"\"\n`, + links: ["https://agentability.org/spec.md"], + }, +}; + +export function getFixIt(checkId?: string, recommendationId?: string): FixIt | null { + const key = recommendationId || checkId; + if (!key) return null; + return FIX_IT_LIBRARY[key] ?? null; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 287ac20..a2af71f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,6 +165,9 @@ importers: typescript: specifier: ^5.5.4 version: 5.9.3 + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@20.19.30) packages: @@ -255,102 +258,204 @@ packages: resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.27.2': resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.27.2': resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.27.2': resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.27.2': resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.27.2': resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.27.2': resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.27.2': resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.27.2': resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.27.2': resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.27.2': resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.27.2': resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.27.2': resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.27.2': resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.27.2': resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.27.2': resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} @@ -363,6 +468,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} @@ -375,6 +486,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} @@ -387,24 +504,48 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.27.2': resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.27.2': resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.27.2': resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.27.2': resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} @@ -1081,6 +1222,35 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1138,6 +1308,10 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -1223,10 +1397,18 @@ packages: caniuse-lite@1.0.30001764: resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1326,6 +1508,10 @@ packages: supports-color: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1381,6 +1567,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -1389,6 +1578,11 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -1454,6 +1648,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1466,6 +1663,10 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + express@4.22.1: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} @@ -1865,6 +2066,9 @@ packages: long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2028,9 +2232,16 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2288,6 +2499,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2296,10 +2510,16 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} @@ -2364,6 +2584,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -2371,6 +2594,18 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2487,6 +2722,42 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2527,6 +2798,31 @@ packages: yaml: optional: true + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -2546,6 +2842,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2709,81 +3010,150 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.27.2': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.27.2': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.27.2': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.27.2': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.27.2': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.27.2': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.27.2': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.27.2': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.27.2': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.27.2': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.27.2': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.27.2': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.27.2': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.27.2': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.27.2': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.27.2': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.27.2': optional: true '@esbuild/netbsd-arm64@0.27.2': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.27.2': optional: true '@esbuild/openbsd-arm64@0.27.2': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.27.2': optional: true '@esbuild/openharmony-arm64@0.27.2': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.27.2': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.27.2': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.27.2': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.27.2': optional: true @@ -3499,6 +3869,46 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.30))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@20.19.30) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -3555,6 +3965,8 @@ snapshots: arrify@2.0.1: optional: true + assertion-error@2.0.1: {} + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -3649,11 +4061,21 @@ snapshots: caniuse-lite@1.0.30001764: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + check-error@2.1.3: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3739,6 +4161,8 @@ snapshots: dependencies: ms: 2.1.3 + deep-eql@5.0.2: {} + deep-is@0.1.4: {} delayed-stream@1.0.0: @@ -3788,6 +4212,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -3800,6 +4226,32 @@ snapshots: hasown: 2.0.2 optional: true + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -3916,6 +4368,10 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} etag@1.8.1: {} @@ -3923,6 +4379,8 @@ snapshots: event-target-shim@5.0.1: optional: true + expect-type@1.3.0: {} + express@4.22.1: dependencies: accepts: 1.3.8 @@ -4402,6 +4860,8 @@ snapshots: long@5.3.2: {} + loupe@3.2.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4537,8 +4997,12 @@ snapshots: path-to-regexp@0.1.12: {} + pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@2.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4825,12 +5289,18 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + source-map-js@1.2.1: {} source-map@0.7.6: {} + stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@3.10.0: {} + stream-events@1.0.5: dependencies: stubs: 3.0.0 @@ -4933,6 +5403,8 @@ snapshots: dependencies: any-promise: 1.3.0 + tinybench@2.9.0: {} + tinyexec@0.3.2: {} tinyglobby@0.2.15: @@ -4940,6 +5412,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5048,6 +5526,33 @@ snapshots: vary@1.1.2: {} + vite-node@2.1.9(@types/node@20.19.30): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.21(@types/node@20.19.30) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@20.19.30): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.55.1 + optionalDependencies: + '@types/node': 20.19.30 + fsevents: 2.3.3 + vite@7.3.1(@types/node@24.10.9)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -5063,6 +5568,41 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + vitest@2.1.9(@types/node@20.19.30): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@20.19.30)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.21(@types/node@20.19.30) + vite-node: 2.1.9(@types/node@20.19.30) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.30 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + webidl-conversions@3.0.1: optional: true @@ -5084,6 +5624,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: diff --git a/scripts/build-artifacts.ts b/scripts/build-artifacts.ts index ce8ee94..5a506b0 100644 --- a/scripts/build-artifacts.ts +++ b/scripts/build-artifacts.ts @@ -57,6 +57,8 @@ function buildLlmsTxt(): string { "Reports:", "- https://agentability.org/reports/{domain}", "- https://agentability.org/v1/evaluations/{domain}/latest.json", + "- https://agentability.org/badge/{domain}.svg", + "- https://agentability.org/cert/{domain}", "", "Spec:", "- https://agentability.org/spec.md", @@ -73,6 +75,8 @@ function buildLlmsFullTxt(): string { " {\"origin\":\"https://example.com\",\"profile\":\"auto\"}", "- Poll https://agentability.org/v1/runs/{runId} until status is complete", "- POST https://agentability.org/mcp (JSON-RPC)", + "- Embed badge: https://agentability.org/badge/{domain}.svg", + "- Certificate: https://agentability.org/cert/{domain}", "", "Pillars:", "- Discovery: machine entrypoints and canonical docs.", diff --git a/scripts/check-ai-surfaces.ts b/scripts/check-ai-surfaces.ts index bc367af..b3db20e 100644 --- a/scripts/check-ai-surfaces.ts +++ b/scripts/check-ai-surfaces.ts @@ -31,6 +31,8 @@ const requiredPaths = [ "/robots.txt", "/sitemap.xml", "/rss.xml", + "/logo.svg", + "/favicon.svg", "/logo.png", "/og.png", ]; diff --git a/scripts/generate-discovery-audit.ts b/scripts/generate-discovery-audit.ts index fdd134a..367d558 100644 --- a/scripts/generate-discovery-audit.ts +++ b/scripts/generate-discovery-audit.ts @@ -72,10 +72,18 @@ const requiredSurfaces: Surface[] = [ { path: "/robots.txt", expectedContentType: "text/plain; charset=utf-8" }, { path: "/sitemap.xml", expectedContentType: "application/xml; charset=utf-8" }, { path: "/rss.xml", expectedContentType: "application/rss+xml; charset=utf-8" }, + { path: "/logo.svg", expectedContentType: "image/svg+xml" }, ]; const optionalSurfaces: Surface[] = [ { path: "/discovery/audit/latest.pretty.json", expectedContentType: "application/json; charset=utf-8" }, + { path: "/logo-mark.svg", expectedContentType: "image/svg+xml" }, + { path: "/favicon.svg", expectedContentType: "image/svg+xml" }, + { path: "/brand/logo.svg", expectedContentType: "image/svg+xml" }, + { path: "/brand/logo-mark.svg", expectedContentType: "image/svg+xml" }, + { path: "/brand/favicon.svg", expectedContentType: "image/svg+xml" }, + { path: "/brand/seal.svg", expectedContentType: "image/svg+xml" }, + { path: "/cert-seal.svg", expectedContentType: "image/svg+xml" }, { path: "/logo.png", expectedContentType: "image/png" }, { path: "/og.png", expectedContentType: "image/png" }, ]; @@ -318,7 +326,7 @@ export async function generateDiscoveryAudit(repoRoot = process.cwd()): Promise< generated_at: new Date().toISOString(), live_checked_at: liveCheckedAt, strict_pretty: strictPretty, - spec_version: "1.0", + spec_version: "1.2", engine: { name: "agentability", version: engineVersion, diff --git a/scripts/smoke-live.sh b/scripts/smoke-live.sh new file mode 100755 index 0000000..e2669c6 --- /dev/null +++ b/scripts/smoke-live.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +check_header() { + local url="$1" + local header="$2" + local value="$3" + local headers + headers="$(curl -sSIL "$url" | tr -d '\r')" + echo "$headers" | grep -qi "HTTP/2 200" + echo "$headers" | grep -qi "${header}: ${value}" +} + +check_header "https://agentability.org/badge/agentability.org.svg" "content-type" "image/svg+xml" +check_header "https://agentability.org/discovery/audit/latest.pretty.json" "content-type" "application/json" + +echo "Live smoke checks passed." diff --git a/spec/openapi.yaml b/spec/openapi.yaml index c03cd5f..c1bad82 100644 --- a/spec/openapi.yaml +++ b/spec/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Agentability Public API - version: 0.1.0 + version: 0.2.0 description: Public-mode agent readiness evaluator API. servers: - url: https://agentability.org @@ -253,7 +253,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/EvaluationResult" + $ref: "#/components/schemas/LatestEvaluation" "404": description: Domain not found content: @@ -276,6 +276,28 @@ paths: value: message: "Evaluation failed" code: "evaluation_failed" + /badge/{domain}.svg: + get: + summary: Fetch a shareable badge for a domain + parameters: + - name: domain + in: path + required: true + schema: + type: string + responses: + "200": + description: SVG badge + content: + image/svg+xml: + schema: + type: string + "404": + description: No evaluation found + content: + image/svg+xml: + schema: + type: string components: schemas: EvaluationInput: @@ -375,6 +397,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -447,6 +473,10 @@ components: $ref: "#/components/schemas/EvidenceIndex" artifacts: $ref: "#/components/schemas/Artifacts" + previousRunId: + type: string + diffSummary: + $ref: "#/components/schemas/DiffSummary" engine: $ref: "#/components/schemas/EngineInfo" createdAt: @@ -457,6 +487,17 @@ components: format: date-time error: type: string + LatestEvaluation: + allOf: + - $ref: "#/components/schemas/EvaluationResult" + - type: object + properties: + diff: + $ref: "#/components/schemas/DiffSummary" + previousRunId: + type: string + previousSummary: + $ref: "#/components/schemas/PreviousSummary" CheckResult: type: object required: @@ -553,6 +594,116 @@ components: type: string rulesetHash: type: string + specVersion: + type: string + PreviousSummary: + type: object + required: + - score + - grade + - pillarScores + properties: + score: + type: number + grade: + type: string + pillarScores: + $ref: "#/components/schemas/PillarScores" + completedAt: + type: string + format: date-time + DiffIssue: + type: object + required: + - checkId + - to + - severity + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + severity: + type: string + enum: + - high + - medium + - low + DiffChange: + type: object + required: + - checkId + - to + properties: + checkId: + type: string + from: + type: string + enum: + - pass + - warn + - fail + nullable: true + to: + type: string + enum: + - pass + - warn + - fail + DiffSummary: + type: object + required: + - scoreDelta + - pillarDelta + - newIssues + - fixedIssues + - changed + - counts + properties: + scoreDelta: + type: number + gradeFrom: + type: string + gradeTo: + type: string + pillarDelta: + $ref: "#/components/schemas/PillarScores" + newIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + fixedIssues: + type: array + items: + $ref: "#/components/schemas/DiffIssue" + changed: + type: array + items: + $ref: "#/components/schemas/DiffChange" + counts: + type: object + required: + - pass + - warn + - fail + properties: + pass: + type: number + warn: + type: number + fail: + type: number JsonRpcRequest: type: object required: