# A11oy — Data Model & API Contract A11oy is a public, demo-grade artifact. Every visible surface is backed by a real HTTP endpoint on `@workspace/api-server`. No mock data, no GraphQL auth-walls. ## Routes All routes live under the `/api/a11oy/` prefix and are exempt from `globalAuthEnforcer` via `PUBLIC_PREFIXES` in `artifacts/api-server/src/middlewares/global-auth-enforcer.ts`. Mutating routes self-enforce auth + CSRF at the route level (`routes/doctrine-crud.ts`). | Surface (frontend) | Endpoint | Source file | | ------------------------------- | ------------------------------------------------- | ------------------------------------------ | | `HomePage` hero / metrics strip | `GET /api/a11oy/dashboard` | `routes/a11oy-dashboard-api.ts` (new) | | `NowPage` live ticker | `GET /api/a11oy/now` | `routes/a11oy-now-api.ts` | | Capability Fabric panels | `GET /api/a11oy/fabric/*` | `routes/a11oy-fabric-api.ts` | | Doctrine V6 readouts | `GET /api/a11oy/doctrine/*` | `routes/doctrine-api.ts` | | Doctrine CRUD (admin) | `POST/PUT/DELETE /api/a11oy/doctrine/*` | `routes/doctrine-crud.ts` (auth + CSRF) | | `GovernancePanels` | `GET /api/a11oy/fabric/proof-packets`, `/policy` | `routes/a11oy-fabric-api.ts` (preserved) | ## `GET /api/a11oy/dashboard` Returns `AlloyDashboardStats` aggregated from the alloy_* drizzle tables (`alloyWorkflows`, `alloyWorkflowRuns`, `alloyApprovals`, `alloyAuditLog`). Falls back to a zero-filled response when the tables are empty so the HomePage hero never renders nulls. ```json { "ok": true, "data": { "totalWorkflows": 0, "totalRuns": 0, "runningRuns": 0, "pendingApprovals": 0, "failedRuns": 0, "successRate": 100, "avgDurationMs": null, "workflowsByStatus": [], "recentActivity": [] }, "meta": { "timestamp": "2026-05-16T02:33:17.057Z", "source": "db", "visibility": "public", "doctrine": "V6" } } ``` The frontend hook (`useDashboardSnapshot` in `pages/HomePage.tsx`) treats `successRate` as already-percent (0–100); the resolver converts the raw 0–1 ratio before returning. ## Notes - The legacy GraphQL `alloyDashboard` resolver (`graphql/domains/alloy.ts`) remains for parity but is no longer used by HomePage — it required a session and 401'd anonymous demo loads. - `GovernancePanels` was already payload-grounded on `/api/a11oy/fabric/proof-packets` + `/api/a11oy/fabric/policy` and is preserved unchanged.