{
  "service": "sluice-pwa",
  "version": "0.2.0",
  "description": "Progressive web app and edge gateway for Sluice: recordings of things in, reviewed items out.",
  "origin": "https://sluice.starlightglobal.industries",
  "milestone": "M1",
  "authentication": {
    "configured": true,
    "providers": [
      "starlight"
    ],
    "planned": [
      "github"
    ],
    "available": [
      "starlight"
    ],
    "partners": [
      "scan",
      "account",
      "iris",
      "mcp",
      "exchange",
      "streamline",
      "cadence"
    ]
  },
  "authorization": {
    "store": true,
    "roles": [
      "member",
      "operator",
      "ci-test"
    ],
    "capabilities": {
      "session:open": {
        "summary": "Open an ingest session: declare a recording, receive the upload targets and the estimate.",
        "fields": [
          "ingest.sessions.open",
          "ingest.sessions.complete"
        ],
        "roles": [
          "member",
          "operator",
          "ci-test"
        ]
      },
      "job:read": {
        "summary": "Read a job’s status document and follow its event stream.",
        "fields": [
          "jobs.status",
          "jobs.events"
        ],
        "roles": [
          "member",
          "operator",
          "ci-test"
        ]
      },
      "job:forget": {
        "summary": "Forget a recording: its job, its session and its evidence rows, and the work still queued for it.",
        "fields": [
          "jobs.forget"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "job:remedy": {
        "summary": "Ask for what a job is missing to be drawn again, when its document names the gap and the fix costs nothing.",
        "fields": [
          "jobs.gaps"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "job:run": {
        "summary": "Stop a job, continue it later, or move its remaining work to a rented GPU host.",
        "fields": [
          "jobs.stop",
          "jobs.continue",
          "jobs.move"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "job:words": {
        "summary": "Change the words Sluice looks for in a recording, and confirm them so it looks closely.",
        "fields": [
          "jobs.vocabulary"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "project:read": {
        "summary": "Read a project’s evidence: the clips, crops and frames a job derived.",
        "fields": [
          "assets.clip"
        ],
        "roles": [
          "member",
          "operator",
          "ci-test"
        ]
      },
      "focus:request": {
        "summary": "Ask for finer levels of one track than the guided tier runs on its own.",
        "fields": [
          "jobs.focus"
        ],
        "roles": [
          "operator"
        ]
      },
      "account:read": {
        "summary": "Read your balance, your top-off settings and the newest entries on your ledger.",
        "fields": [
          "accounts.read"
        ],
        "roles": [
          "member",
          "operator",
          "ci-test"
        ]
      },
      "account:update": {
        "summary": "Change your top-off amount and low-balance threshold.",
        "fields": [
          "accounts.update"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "compose:run": {
        "summary": "Turn a description of work into a project with stages and tasks, for a Starlight app acting on your behalf.",
        "fields": [
          "partner.compose"
        ],
        "roles": [
          "member",
          "operator"
        ]
      },
      "mesh:request": {
        "summary": "Ask for a 3D preview of a track or a family.",
        "fields": [
          "jobs.mesh"
        ],
        "roles": [
          "operator"
        ]
      }
    }
  },
  "ingest": {
    "configured": true,
    "implemented": true,
    "service": "sluice",
    "repository": "apps/sluice"
  },
  "push": {
    "configured": true,
    "public_key": "BOji_D5Ox7_t_K0cN7GmmydNkTt0OKqvAQD5jTmHnMGrqRKpxVuBoolT5RKAv7RI8TSwJOCt9297-nvyBjWvWts"
  },
  "billing": {
    "configured": true,
    "mode": "live"
  },
  "endpoints": {
    "health": {
      "method": "GET",
      "path": "/api/health",
      "tier": "public"
    },
    "hooks": {
      "method": "POST",
      "path": "/api/v1/hooks/{event}",
      "tier": "upload-token",
      "status": "proxied"
    },
    "hosts": {
      "method": "POST",
      "path": "/api/v1/hosts/{resource}",
      "tier": "host-token",
      "status": "proxied"
    },
    "admin": {
      "method": "POST",
      "path": "/api/v1/admin/{resource}",
      "tier": "api-key",
      "status": "proxied"
    },
    "stripe_webhook": {
      "method": "POST",
      "path": "/api/v1/hooks/stripe",
      "tier": "stripe-signature",
      "status": "proxied"
    },
    "rate_card": {
      "method": "GET",
      "path": "/api/v1/rate-card",
      "tier": "public",
      "status": "proxied"
    },
    "figures": {
      "method": "GET",
      "path": "/api/v1/figures",
      "tier": "public",
      "status": "proxied"
    },
    "prompts": {
      "method": "GET",
      "path": "/api/v1/prompts",
      "tier": "public",
      "status": "proxied"
    },
    "me": {
      "method": "GET",
      "path": "/api/me",
      "tier": "session"
    },
    "terms_history": {
      "method": "GET",
      "path": "/api/me/terms",
      "tier": "session"
    },
    "push_subscribe": {
      "method": "PUT",
      "path": "/api/me/push",
      "tier": "session"
    },
    "push_unsubscribe": {
      "method": "DELETE",
      "path": "/api/me/push",
      "tier": "session"
    },
    "push_received": {
      "method": "POST",
      "path": "/api/me/push/received",
      "tier": "session"
    },
    "notify": {
      "method": "POST",
      "path": "/api/notify",
      "tier": "api-key"
    },
    "evidence": {
      "method": "GET",
      "path": "/api/v1/evidence/{key}",
      "tier": "signed-url"
    },
    "sign_in": {
      "method": "GET",
      "path": "/api/auth/{provider}/start",
      "tier": "public"
    },
    "sign_in_callback": {
      "method": "GET",
      "path": "/api/auth/{provider}/callback",
      "tier": "public"
    },
    "sign_out": {
      "method": "POST",
      "path": "/api/auth/signout",
      "tier": "public"
    },
    "control_plane_health": {
      "method": "GET",
      "path": "/api/v1/health",
      "tier": "capability",
      "capability": "project:read",
      "status": "proxied"
    },
    "ingest_session_open": {
      "method": "POST",
      "path": "/api/v1/ingest/sessions",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied",
      "partner": true
    },
    "ingest_session_read": {
      "method": "GET",
      "path": "/api/v1/ingest/sessions/{id}",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied",
      "partner": true
    },
    "ingest_session_cancel": {
      "method": "DELETE",
      "path": "/api/v1/ingest/sessions/{id}",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied",
      "partner": true
    },
    "ingest_session_terms": {
      "method": "POST",
      "path": "/api/v1/ingest/sessions/{id}/terms",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied"
    },
    "ingest_session_marks": {
      "method": "POST",
      "path": "/api/v1/ingest/sessions/{id}/marks",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied"
    },
    "ingest_session_complete": {
      "method": "POST",
      "path": "/api/v1/ingest/sessions/{id}/complete",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied",
      "partner": true
    },
    "batch": {
      "method": "GET",
      "path": "/api/v1/batches/{id}",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "batch_close": {
      "method": "POST",
      "path": "/api/v1/batches/{id}/close",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied"
    },
    "jobs": {
      "method": "GET",
      "path": "/api/v1/jobs",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "jobs_events": {
      "method": "GET",
      "path": "/api/v1/jobs/events",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "job": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "job_summary": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/summary",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "estimate": {
      "method": "GET",
      "path": "/api/v1/estimate",
      "tier": "capability",
      "capability": "session:open",
      "status": "proxied",
      "partner": true
    },
    "job_forget": {
      "method": "DELETE",
      "path": "/api/v1/jobs/{id}",
      "tier": "capability",
      "capability": "job:forget",
      "status": "proxied"
    },
    "jobs_forget": {
      "method": "DELETE",
      "path": "/api/v1/jobs",
      "tier": "capability",
      "capability": "job:forget",
      "status": "proxied"
    },
    "jobs_forget_selected": {
      "method": "POST",
      "path": "/api/v1/jobs/forget",
      "tier": "capability",
      "capability": "job:forget",
      "status": "proxied"
    },
    "job_gap_fix": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/gaps/{code}",
      "tier": "capability",
      "capability": "job:remedy",
      "status": "proxied",
      "partner": true
    },
    "job_stop": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/stop",
      "tier": "capability",
      "capability": "job:run",
      "status": "proxied"
    },
    "job_continue": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/continue",
      "tier": "capability",
      "capability": "job:run",
      "status": "proxied"
    },
    "job_move": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/move",
      "tier": "capability",
      "capability": "job:run",
      "status": "proxied"
    },
    "job_vocabulary": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/vocabulary",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "job_vocabulary_write": {
      "method": "PUT",
      "path": "/api/v1/jobs/{id}/vocabulary",
      "tier": "capability",
      "capability": "job:words",
      "status": "proxied"
    },
    "projects": {
      "method": "GET",
      "path": "/api/v1/projects",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "job_evidence": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/evidence",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "job_export": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/export",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "job_pictures": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/pictures",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "items": {
      "method": "GET",
      "path": "/api/v1/items",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "item_words": {
      "method": "GET",
      "path": "/api/v1/items/words",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "item_search": {
      "method": "POST",
      "path": "/api/v1/search",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied",
      "partner": true
    },
    "job_events": {
      "method": "GET",
      "path": "/api/v1/jobs/{id}/events",
      "tier": "capability",
      "capability": "job:read",
      "status": "proxied"
    },
    "focus": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/focus",
      "tier": "capability",
      "capability": "focus:request",
      "status": "not_implemented"
    },
    "mesh": {
      "method": "POST",
      "path": "/api/v1/jobs/{id}/mesh",
      "tier": "capability",
      "capability": "mesh:request",
      "status": "not_implemented"
    },
    "clip": {
      "method": "GET",
      "path": "/api/v1/assets/{id}/clip",
      "tier": "capability",
      "capability": "project:read",
      "status": "not_implemented"
    },
    "account_read": {
      "method": "GET",
      "path": "/api/v1/accounts/me",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_update": {
      "method": "PATCH",
      "path": "/api/v1/accounts/me",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied"
    },
    "billing_checkout": {
      "method": "POST",
      "path": "/api/v1/billing/checkout",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "account_usage": {
      "method": "GET",
      "path": "/api/v1/accounts/me/usage",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_jobs": {
      "method": "GET",
      "path": "/api/v1/accounts/me/jobs",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_job_usage": {
      "method": "GET",
      "path": "/api/v1/accounts/me/usage/{id}",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_payments": {
      "method": "GET",
      "path": "/api/v1/accounts/me/payments",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_charges": {
      "method": "GET",
      "path": "/api/v1/accounts/me/charges",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_invoice": {
      "method": "GET",
      "path": "/api/v1/accounts/me/invoice",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_billing_day_preview": {
      "method": "GET",
      "path": "/api/v1/accounts/me/billing-day",
      "tier": "capability",
      "capability": "account:read",
      "status": "not_implemented",
      "partner": true
    },
    "account_billing_day": {
      "method": "POST",
      "path": "/api/v1/accounts/me/billing-day",
      "tier": "capability",
      "capability": "account:update",
      "status": "not_implemented",
      "partner": true
    },
    "billing_portal": {
      "method": "POST",
      "path": "/api/v1/billing/portal",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "account_statement": {
      "method": "GET",
      "path": "/api/v1/accounts/me/statement",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_daily": {
      "method": "GET",
      "path": "/api/v1/accounts/me/daily",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_last_view_read": {
      "method": "GET",
      "path": "/api/v1/accounts/me/last-view",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "account_last_view_record": {
      "method": "POST",
      "path": "/api/v1/accounts/me/last-view",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "partner_usage": {
      "method": "POST",
      "path": "/api/v1/partner/usage",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "partner_account": {
      "method": "GET",
      "path": "/api/v1/partner/account",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "partner_grant": {
      "method": "GET",
      "path": "/api/v1/partner/grant",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "identity_resolve": {
      "method": "POST",
      "path": "/api/v1/partner/identity",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "identities_read": {
      "method": "GET",
      "path": "/api/v1/partner/identities",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "identity_link": {
      "method": "POST",
      "path": "/api/v1/partner/identities",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "identity_unlink": {
      "method": "DELETE",
      "path": "/api/v1/partner/identities/{id}",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "grants_read": {
      "method": "GET",
      "path": "/api/v1/partner/grants",
      "tier": "capability",
      "capability": "account:read",
      "status": "proxied",
      "partner": true
    },
    "grant_create": {
      "method": "POST",
      "path": "/api/v1/partner/grants",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "grant_revoke": {
      "method": "POST",
      "path": "/api/v1/partner/grants/{id}/revoke",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "oauth_code": {
      "method": "POST",
      "path": "/api/v1/partner/oauth/code",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "oauth_refresh": {
      "method": "POST",
      "path": "/api/v1/partner/oauth/refresh",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "oauth_revoke": {
      "method": "POST",
      "path": "/api/v1/partner/oauth/revoke",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "single_use_claim": {
      "method": "POST",
      "path": "/api/v1/partner/single-use",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "sessions_end": {
      "method": "POST",
      "path": "/api/v1/partner/sessions/end",
      "tier": "capability",
      "capability": "account:update",
      "status": "proxied",
      "partner": true
    },
    "partner_compose_status": {
      "method": "GET",
      "path": "/api/v1/partner/compose",
      "tier": "capability",
      "capability": "compose:run",
      "status": "proxied",
      "partner": true
    },
    "partner_compose": {
      "method": "POST",
      "path": "/api/v1/partner/compose",
      "tier": "capability",
      "capability": "compose:run",
      "status": "proxied",
      "partner": true
    }
  }
}