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
-
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 (
+
+
+ {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(
+ () => `
`,
+ [badgeUrl, reportUrl]
+ );
+ const md = useMemo(
+ () => `[](${reportUrl})`,
+ [badgeUrl, reportUrl]
+ );
+
+ return (
+
+
+
+ void copy(html)}>
+ Copy HTML
+
+ void copy(md)}>
+ Copy Markdown
+
+ void copy(badgeUrl)}>
+ Copy badge URL
+
+
+
+ );
+}
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"}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+ void navigator.clipboard?.writeText(fix.snippet)}
+ >
+ Copy
+
+
+
+ {fix.snippet}
+
+
+ {fix.links?.length ? (
+
+ ) : 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: