{
  "name": "ATLAS",
  "description": "The verified route layer for the AI ecosystem. Maps goals to evidence-backed routes, stacks, receipts, and outcomes for humans and AI agents.",
  "version": "0.8.0",
  "audience": [
    "humans",
    "ai-agents"
  ],
  "contact": "hello@atlas.vaultsparkstudios.com",
  "capabilities": [
    {
      "name": "verified-paths",
      "description": "Curated, evidence-backed routes from goals to recommended stacks",
      "endpoint": "/verified-paths",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "entities",
      "description": "AI tools, models, agents, and frameworks tracked by ATLAS",
      "endpoint": "/entities",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "route-generation",
      "description": "Generate a verified route from a natural-language goal and optional constraints. Constraints re-rank routes toward the ones that satisfy them (each ranked match reports constraintsMet/constraintsUnmet); matchStrength flags a weak-relevance match so an agent knows when the top route is a guess rather than a recommendation.",
      "endpoint": "/routes/generate",
      "format": "application/json",
      "methods": [
        "POST"
      ],
      "input": {
        "goal": "string",
        "constraints": "string[] (concept keys — see recognizedConcepts)",
        "topN": "number (optional, default 3)"
      },
      "output": {
        "route": "VerifiedPath",
        "receipt": "Receipt",
        "matchStrength": "{ weakMatch: boolean, topScore: number, strength: \"weak\"|\"moderate\"|\"strong\", advice: string|null }",
        "interpretedGoal": "{ budget, excluded, ambiguity: { ambiguous, missingDimensions, questions, answerSlots }, recommendedNextAction: \"clarify\"|\"route\" }",
        "rankedMatches": "[{ pathId, title, matchScore, matchReason, constraintsMet, constraintsUnmet, overBudget, budgetAssessment: { requestedBudget, pathCeiling, status: \"within\"|\"over\"|\"unknown\", overBy }, matchEvidence: { semantic, constraintCount, budgetStatus, excludedConflictCount }, excludedHits, caveats }]",
        "decisionTrace": "{ schemaVersion: \"1.0\", kind: \"route-decision-trace\", signed: false, verification: \"selection-context-only\", fingerprint: \"fnv1a32:...\", interpretedGoal, requestedConstraints, selected, alternatives, relevanceDisclosure, authoritativeEvidence }"
      },
      "recognizedConcepts": [
        "affordable",
        "ai_image",
        "ai_music",
        "ai_video",
        "ai_voice",
        "ai_writing",
        "animated",
        "api",
        "apiavailable",
        "audio",
        "avatar",
        "beginner",
        "beginner_to_intermediate",
        "budget",
        "business",
        "cinematic",
        "clip",
        "commercial",
        "commercial_rights",
        "copy",
        "developer",
        "footage",
        "high_quality",
        "illustration",
        "image",
        "music",
        "narration",
        "photo",
        "production",
        "professional",
        "sound",
        "soundtrack",
        "text",
        "trailer",
        "tts",
        "under",
        "video",
        "visual",
        "voice",
        "voiceover",
        "writing"
      ]
    },
    {
      "name": "receipt-generation",
      "description": "Generate an evidence receipt for a verified path",
      "endpoint": "/receipts/generate",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "signed-receipts",
      "description": "Generate and verify HMAC-signed path receipts when the Worker receipt secret is configured",
      "endpoint": "/paths/{pathId}/receipt",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "related": [
        "/receipts/verify"
      ]
    },
    {
      "name": "path-comparison",
      "description": "Compare 2 or 3 verified paths side by side and return a recommendation",
      "endpoint": "/paths/compare",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "terrain-diff",
      "description": "Show stack deltas and confidence changes between two paths. Diff items are enriched objects — iterate item.name, item.category, item.verificationStatus rather than treating items as raw strings.",
      "endpoint": "/terrain/diff",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "input": {
        "base": "string (pathId)",
        "compare": "string (pathId)"
      },
      "output": {
        "base": "{ id: string, routeConfidence: number }",
        "compare": "{ id: string, routeConfidence: number }",
        "diff": {
          "added": "[{ id: string, name: string, category: string|null, verificationStatus: string }]",
          "removed": "[{ id: string, name: string, category: string|null, verificationStatus: string }]",
          "shared": "[{ id: string, name: string, category: string|null, verificationStatus: string }]"
        },
        "confidenceDelta": "number",
        "diffedAt": "ISO8601"
      }
    },
    {
      "name": "outcomes",
      "description": "Record whether a path worked - closes the verification loop",
      "endpoint": "/outcomes",
      "format": "application/json",
      "methods": [
        "GET",
        "POST"
      ]
    },
    {
      "name": "api-contract",
      "description": "Complete manifest-derived route table and safe smoke profile for AI agents",
      "endpoint": "/api-contract.json",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "runtime-status",
      "description": "Non-secret runtime storage status; reports whether mutable write surfaces are durable or ephemeral",
      "endpoint": "/api/runtime/status",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "mcp-server",
      "description": "MCP server for AI agents - query verified paths, score stacks, generate routes, compare paths, and verify receipts",
      "endpoint": "/mcp",
      "protocol": "MCP v1 (stdio)",
      "tools": [
        "atlas.search_entities",
        "atlas.get_verified_path",
        "atlas.generate_route",
        "atlas.score_stack",
        "atlas.generate_receipt",
        "atlas.compare_paths",
        "atlas.verify_receipt",
        "atlas.get_runtime_status",
        "atlas.get_route_for_goal"
      ]
    }
  ],
  "primitives": [
    "Goal",
    "Route",
    "Evidence",
    "Stack",
    "Receipt",
    "Outcome",
    "Waypoint",
    "Trail"
  ],
  "trust": {
    "scoringModel": "weighted sum: 0.45*evidenceQuality + 0.25*freshness + 0.2*agentReadiness + 10 (0–100)",
    "stalenessPolicy": "display blocked when freshnessScore < 55; freshness decays to that threshold at each signal's window (pricing 14d, trend 7d, commercial_terms 30d, api_docs 60d, description 90d); entities default to the pricing signal (~14d)",
    "paidPlacement": "never affects score (SOUL commandment #7)"
  },
  "schema": "https://github.com/VaultSparkStudios/atlas/blob/main/ATLAS_v0.8_Windows_Safe_Export/ATLAS_v08/atlas/packages/schemas/src/entity.schema.json",
  "openapi": "/api-schema.json",
  "apiContract": "/api-contract.json",
  "requestLimits": {
    "maxJsonBodyBytes": 65536
  },
  "runtimeStatus": "/api/runtime/status",
  "persistenceReadiness": {
    "mode": "supabase",
    "status": "ready",
    "durableWrites": true,
    "requiredStore": "supabase",
    "criticalStores": [
      "entity-overrides",
      "admin-audit-log",
      "evidence-submissions",
      "outcomes",
      "path-subscriptions",
      "waitlist"
    ],
    "adapterReadyStores": [
      "waitlist",
      "outcomes",
      "path-subscriptions",
      "entity-overrides",
      "admin-audit-log",
      "evidence-submissions"
    ],
    "pendingStores": [],
    "statusEndpoint": "/api/runtime/status",
    "note": "S78 live staging proof: /api/runtime/status reports live-table-read probes ready for all six critical stores, durableWrites=true, and launchGate=ready. Production must be re-probed before promotion."
  },
  "x-api-routes": [
    {
      "id": "health",
      "endpoint": "/health",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "path-deltas-batch",
      "endpoint": "/paths/deltas",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "path-delta",
      "endpoint": "/paths/{pathId}/delta",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "entities-list",
      "endpoint": "/entities",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "entity-overrides",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "entities-batch",
      "endpoint": "/entities/batch",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "entity-detail",
      "endpoint": "/entities/{entityId}",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "entity-overrides",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "admin-review",
      "endpoint": "/api/admin/review/{entityId}",
      "methods": [
        "POST"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "entity-overrides",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "admin-or-obelisk",
        "rateLimit": "required",
        "durability": "durable-required",
        "retry": "unsafe",
        "sideEffect": "verification-review-and-audit"
      },
      "outputContract": null
    },
    {
      "id": "admin-log",
      "endpoint": "/api/admin/log",
      "methods": [
        "GET"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "admin-audit-log",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "admin-evidence-queue",
      "endpoint": "/api/admin/evidence-queue",
      "methods": [
        "GET",
        "POST"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "evidence-submissions",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "admin-or-obelisk",
        "rateLimit": "admin-gated",
        "durability": "durable-required-production",
        "retry": "optimistic-single-transition",
        "sideEffect": "review-state-and-audit-only",
        "scoreEffect": "none",
        "verificationEffect": "none-acknowledged-is-not-verified"
      },
      "outputContract": null
    },
    {
      "id": "admin-status",
      "endpoint": "/api/admin/status",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "runtime-status",
      "endpoint": "/api/runtime/status",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "obelisk-verify",
      "endpoint": "/api/obelisk-verify",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": false,
      "smokeSkipReason": "External Obelisk IdP fetch; covered by auth-contract source checks without network.",
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public-exchange",
        "rateLimit": "required",
        "durability": "external-identity",
        "retry": "unsafe",
        "sideEffect": "identity-token-exchange"
      },
      "outputContract": null
    },
    {
      "id": "verified-paths-list",
      "endpoint": "/verified-paths",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "verified-path-detail",
      "endpoint": "/verified-paths/{pathId}",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "evidence-list",
      "endpoint": "/evidence",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "evidence-submit",
      "endpoint": "/evidence/submit",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "evidence-submissions",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "durable-required",
        "retry": "idempotency-key",
        "sideEffect": "pending-human-review-evidence",
        "idempotency": {
          "header": "Idempotency-Key",
          "minLength": 8,
          "maxLength": 200,
          "replayStatus": 200,
          "conflictStatus": 409
        }
      },
      "outputContract": null
    },
    {
      "id": "evidence-submission-status",
      "endpoint": "/evidence/submissions/{submissionId}/status",
      "methods": [
        "GET"
      ],
      "authRequired": true,
      "safeToSmoke": false,
      "smokeSkipReason": "Requires an opaque id returned by a prior evidence submission; covered by the lifecycle privacy contract.",
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "score-entity",
      "endpoint": "/scoring/entity/{entityId}",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "score-path",
      "endpoint": "/scoring/path/{pathId}",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "generate-route",
      "endpoint": "/routes/generate",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "stateless",
        "retry": "safe",
        "sideEffect": "none"
      },
      "outputContract": {
        "decisionTrace": "versioned unsigned selection context; never a Trust Graph score, signed receipt, or verification claim",
        "authoritativeEvidence": "selected route links to the signed receipt and receipt-verification endpoints"
      }
    },
    {
      "id": "generate-receipt",
      "endpoint": "/receipts/generate",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "stateless",
        "retry": "safe",
        "sideEffect": "none"
      },
      "outputContract": null
    },
    {
      "id": "signed-path-receipt",
      "endpoint": "/paths/{pathId}/receipt",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "verify-receipt",
      "endpoint": "/receipts/verify",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "stateless",
        "retry": "safe",
        "sideEffect": "none"
      },
      "outputContract": null
    },
    {
      "id": "outcomes",
      "endpoint": "/outcomes",
      "methods": [
        "GET",
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "outcomes",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "durable-required-production",
        "retry": "idempotency-key-strongly-recommended",
        "sideEffect": "outcome-ledger-write",
        "idempotency": {
          "header": "Idempotency-Key",
          "minLength": 8,
          "maxLength": 200,
          "replayStatus": 200,
          "conflictStatus": 409,
          "uncertainty": "retry-with-same-key",
          "conflict": "surface-and-require-new-key"
        }
      },
      "outputContract": {
        "post": {
          "required": [
            "outcome",
            "persistence.durable",
            "persistence.mode",
            "persistence.source"
          ],
          "persistence": {
            "modes": [
              "supabase",
              "memory"
            ],
            "durableWhen": "persistence.mode === 'supabase'"
          },
          "createdStatus": 201,
          "replayStatus": 200,
          "conflictStatus": 409,
          "replayHeader": "Idempotency-Replayed: true|false when Idempotency-Key is present",
          "replayBody": "replayed boolean when Idempotency-Key is present",
          "retryContract": {
            "created": "201: remove any queued draft; the outcome is accepted",
            "replayed": "200 with Idempotency-Replayed true: remove any queued draft; the original outcome is accepted",
            "conflict": "409: do not retry this payload with the same key; surface the conflict and require a new key",
            "rateLimited": "429: retain the queued draft and stable key; retry after Retry-After when present",
            "serverUnavailable": "5xx: retain the queued draft and stable key; retry with backoff",
            "transportUnknown": "network failure before a response: retain the queued draft and stable key because the server may have accepted it",
            "rejected": "other 4xx: do not queue or retry automatically; surface validation guidance"
          },
          "signedReceipt": "optional; present only when the receipt-signing capability is configured"
        }
      }
    },
    {
      "id": "outcome-aggregate",
      "endpoint": "/outcomes/aggregate/{pathId}",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "outcomes",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": {
        "successDenominator": "resolved outcomes only (completed + failed + replaced)",
        "pendingStates": [
          "saved",
          "used"
        ],
        "unknownStates": "counted separately and never coerced to failure"
      }
    },
    {
      "id": "outcome-aggregates",
      "endpoint": "/outcomes/aggregates",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": {
        "maxIds": 20,
        "consistency": "all aggregates derive from one outcome snapshot",
        "freshMode": "fresh=1 is explicitly no-store for read-after-write convergence"
      }
    },
    {
      "id": "outcome-summary",
      "endpoint": "/outcomes/summary",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "outcomes",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": {
        "successDenominator": "resolved outcomes only (completed + failed + replaced)",
        "resolutionDenominator": "all measured outcome states",
        "seedRows": "excluded from every public aggregate"
      }
    },
    {
      "id": "compare-paths",
      "endpoint": "/paths/compare",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "terrain-diff",
      "endpoint": "/terrain/diff",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "client-errors",
      "endpoint": "/api/errors",
      "methods": [
        "GET",
        "POST"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "ephemeral-memory",
        "store": "client-errors",
        "launchCritical": false,
        "note": "Writes live in process/isolate memory only and do not survive restarts."
      },
      "mutationPolicy": {
        "auth": "public-write-admin-read",
        "rateLimit": "required",
        "durability": "best-effort-observability",
        "retry": "safe-deduplicated",
        "sideEffect": "sanitized-error-log-append",
        "privacy": "server-redacts-secrets-email-and-local-paths",
        "receipt": "{ id, fingerprint, deduplicated, count }"
      },
      "outputContract": null
    },
    {
      "id": "contact-status",
      "endpoint": "/api/contact/status",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "contact-send",
      "endpoint": "/api/contact",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "external-email",
        "retry": "unsafe",
        "sideEffect": "transactional-email"
      },
      "outputContract": null
    },
    {
      "id": "popular-goals",
      "endpoint": "/api/popular-goals",
      "methods": [
        "GET"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "waitlist",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "subscription-challenge",
      "endpoint": "/api/subscription/challenge",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required-fail-closed",
        "durability": "durable-required-production",
        "retry": "unsafe",
        "sideEffect": "challenge-create-and-email"
      },
      "outputContract": null
    },
    {
      "id": "subscription-verify",
      "endpoint": "/api/subscription/verify",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "one-time-token",
        "rateLimit": "required",
        "durability": "durable-required-production",
        "retry": "unsafe",
        "sideEffect": "challenge-consume-and-session-create"
      },
      "outputContract": {
        "sessionToken": "opaque bearer returned once after one-time challenge succeeds",
        "expiresAt": "24-hour session expiry",
        "pendingPathId": "server-bound path intent from the consumed challenge"
      }
    },
    {
      "id": "subscription-revoke",
      "endpoint": "/api/subscription/revoke",
      "methods": [
        "POST"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "stateless-derived",
        "store": null,
        "launchCritical": false
      },
      "mutationPolicy": {
        "auth": "subscription-bearer",
        "rateLimit": "required",
        "durability": "durable-required-production",
        "retry": "safe",
        "sideEffect": "session-revoke"
      },
      "outputContract": {
        "revoked": "true only when the hashed server session was removed"
      }
    },
    {
      "id": "subscribe",
      "endpoint": "/api/subscribe",
      "methods": [
        "GET",
        "POST",
        "DELETE"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "path-subscriptions",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "subscription-bearer",
        "rateLimit": "required",
        "durability": "durable-required-production",
        "retry": "safe",
        "sideEffect": "subscription-upsert-or-delete"
      },
      "outputContract": null
    },
    {
      "id": "waitlist-insights",
      "endpoint": "/api/admin/waitlist/insights",
      "methods": [
        "GET"
      ],
      "authRequired": true,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "waitlist",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": null,
      "outputContract": null
    },
    {
      "id": "waitlist",
      "endpoint": "/api/waitlist",
      "methods": [
        "POST"
      ],
      "authRequired": false,
      "safeToSmoke": true,
      "smokeSkipReason": null,
      "durability": {
        "class": "durable-adapter",
        "store": "waitlist",
        "launchCritical": true,
        "note": "Writes persist via Supabase REST when runtime credentials are configured; memory fallback otherwise. Verify live via /api/runtime/status."
      },
      "mutationPolicy": {
        "auth": "public",
        "rateLimit": "required",
        "durability": "durable-preferred",
        "retry": "safe",
        "sideEffect": "waitlist-upsert-and-welcome-on-first-write"
      },
      "outputContract": null
    }
  ],
  "x-capabilities": [
    {
      "name": "health",
      "description": "Manifest route: /health",
      "endpoint": "/health",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "path-deltas-batch",
      "description": "Manifest route: /paths/deltas",
      "endpoint": "/paths/deltas",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "path-delta",
      "description": "Manifest route: /paths/{pathId}/delta",
      "endpoint": "/paths/{pathId}/delta",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "entities-batch",
      "description": "Manifest route: /entities/batch",
      "endpoint": "/entities/batch",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "entity-detail",
      "description": "Manifest route: /entities/{entityId}",
      "endpoint": "/entities/{entityId}",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "admin-review",
      "description": "Manifest route: /api/admin/review/{entityId}",
      "endpoint": "/api/admin/review/{entityId}",
      "format": "application/json",
      "methods": [
        "POST"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "admin-log",
      "description": "Manifest route: /api/admin/log",
      "endpoint": "/api/admin/log",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "admin-evidence-queue",
      "description": "Manifest route: /api/admin/evidence-queue",
      "endpoint": "/api/admin/evidence-queue",
      "format": "application/json",
      "methods": [
        "GET",
        "POST"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "admin-status",
      "description": "Manifest route: /api/admin/status",
      "endpoint": "/api/admin/status",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "runtime-status",
      "description": "Manifest route: /api/runtime/status",
      "endpoint": "/api/runtime/status",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "obelisk-verify",
      "description": "Manifest route: /api/obelisk-verify (External Obelisk IdP fetch; covered by auth-contract source checks without network.)",
      "endpoint": "/api/obelisk-verify",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "verified-path-detail",
      "description": "Manifest route: /verified-paths/{pathId}",
      "endpoint": "/verified-paths/{pathId}",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "evidence-list",
      "description": "Manifest route: /evidence",
      "endpoint": "/evidence",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "evidence-submit",
      "description": "Manifest route: /evidence/submit",
      "endpoint": "/evidence/submit",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "evidence-submission-status",
      "description": "Manifest route: /evidence/submissions/{submissionId}/status (Requires an opaque id returned by a prior evidence submission; covered by the lifecycle privacy contract.)",
      "endpoint": "/evidence/submissions/{submissionId}/status",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "score-entity",
      "description": "Manifest route: /scoring/entity/{entityId}",
      "endpoint": "/scoring/entity/{entityId}",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "score-path",
      "description": "Manifest route: /scoring/path/{pathId}",
      "endpoint": "/scoring/path/{pathId}",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "verify-receipt",
      "description": "Manifest route: /receipts/verify",
      "endpoint": "/receipts/verify",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "outcome-aggregate",
      "description": "Manifest route: /outcomes/aggregate/{pathId}",
      "endpoint": "/outcomes/aggregate/{pathId}",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "outcome-aggregates",
      "description": "Manifest route: /outcomes/aggregates",
      "endpoint": "/outcomes/aggregates",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "outcome-summary",
      "description": "Manifest route: /outcomes/summary",
      "endpoint": "/outcomes/summary",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "client-errors",
      "description": "Manifest route: /api/errors",
      "endpoint": "/api/errors",
      "format": "application/json",
      "methods": [
        "GET",
        "POST"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "contact-status",
      "description": "Manifest route: /api/contact/status",
      "endpoint": "/api/contact/status",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "contact-send",
      "description": "Manifest route: /api/contact",
      "endpoint": "/api/contact",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "popular-goals",
      "description": "Manifest route: /api/popular-goals",
      "endpoint": "/api/popular-goals",
      "format": "application/json",
      "methods": [
        "GET"
      ]
    },
    {
      "name": "subscription-challenge",
      "description": "Manifest route: /api/subscription/challenge",
      "endpoint": "/api/subscription/challenge",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "subscription-verify",
      "description": "Manifest route: /api/subscription/verify",
      "endpoint": "/api/subscription/verify",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "subscription-revoke",
      "description": "Manifest route: /api/subscription/revoke",
      "endpoint": "/api/subscription/revoke",
      "format": "application/json",
      "methods": [
        "POST"
      ],
      "auth": "Authorization: Bearer <subscription session token>"
    },
    {
      "name": "subscribe",
      "description": "Manifest route: /api/subscribe",
      "endpoint": "/api/subscribe",
      "format": "application/json",
      "methods": [
        "GET",
        "POST",
        "DELETE"
      ],
      "auth": "Authorization: Bearer <subscription session token>"
    },
    {
      "name": "waitlist-insights",
      "description": "Manifest route: /api/admin/waitlist/insights",
      "endpoint": "/api/admin/waitlist/insights",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "auth": "X-Obelisk-Session or X-Admin-Token"
    },
    {
      "name": "waitlist",
      "description": "Manifest route: /api/waitlist",
      "endpoint": "/api/waitlist",
      "format": "application/json",
      "methods": [
        "POST"
      ]
    },
    {
      "name": "release-readiness",
      "description": "Machine-readable go/no-go release gate generated from PROJECT_STATUS without claiming launch approval. Read nextAgentActions before attempting launch-adjacent work.",
      "endpoint": "/release-gate.json",
      "format": "application/json",
      "methods": [
        "GET"
      ],
      "output": {
        "status": "go | blocked",
        "gateTaxonomy": "{ gates, founderOnly, credentialGated, agentAttemptable }",
        "nextAgentActions": "[{ rank, gateKey, gate, category, owner, action, safeToAttemptNow, blockedBy, sourceGates, agentProbe }]",
        "launchReadyPredicate": "{ blockersClear, remainingGatesClear, productionUrlConfigured, deployStatusProduction, stagingRedeployCurrent, durablePersistenceReady, migrationChannelReady, brandingCompliant, rateLimiterConfigured, mobileParityApproved }",
        "mobileParityEvidence": "{ structuralEvidence, visualReview, founderApproval, artifact, viewportEvidence, themeEvidence, gates, releaseApproved, blockingReasons }",
        "runtimeObservability": "{ statusEndpoint, rateLimiterConfigured, launchBlocking }"
      }
    },
    {
      "name": "get-route-for-goal",
      "description": "MCP one-call shortcut: natural-language goal to best route, evidence receipt, and ranked alternatives. Replaces 3 sequential MCP calls with one.",
      "tool": "atlas.get_route_for_goal",
      "protocol": "MCP v1",
      "input": {
        "goal": "string",
        "constraints": "string[] (concept keys - see recognizedConcepts)",
        "top_n": "number (optional, default 3)"
      },
      "output": {
        "route": "VerifiedPath",
        "receipt": "Receipt",
        "interpretedGoal": "{ budget, excluded, ambiguity, recommendedNextAction }",
        "rankedMatches": "[{ pathId, title, matchScore, matchReason, constraintsMet, constraintsUnmet, overBudget, budgetAssessment, matchEvidence, excludedHits, caveats }]",
        "decisionTrace": "{ schemaVersion, signed:false, fingerprint, selected, alternatives, authoritativeEvidence }"
      },
      "recognizedConcepts": [
        "affordable",
        "ai_image",
        "ai_music",
        "ai_video",
        "ai_voice",
        "ai_writing",
        "animated",
        "api",
        "apiavailable",
        "audio",
        "avatar",
        "beginner",
        "beginner_to_intermediate",
        "budget",
        "business",
        "cinematic",
        "clip",
        "commercial",
        "commercial_rights",
        "copy",
        "developer",
        "footage",
        "high_quality",
        "illustration",
        "image",
        "music",
        "narration",
        "photo",
        "production",
        "professional",
        "sound",
        "soundtrack",
        "text",
        "trailer",
        "tts",
        "under",
        "video",
        "visual",
        "voice",
        "voiceover",
        "writing"
      ]
    }
  ]
}
