{
  "schema": 1,
  "version": "0.6.2",
  "topics": [
    {
      "topic": "analytics",
      "title": "analytics — Trino SQL analytics interface",
      "stability": "evolving",
      "tagline": "Cyoda Cloud exposes entity data as Trino SQL tables through a Trino connector. The connector uses the Schema Management REST API to discover table definitions and the WebSocket (STOMP) messaging API to stream entity rows at query time.",
      "see_also": [
        "search",
        "models",
        "grpc",
        "errors.BAD_REQUEST"
      ]
    },
    {
      "topic": "cli",
      "title": "cyoda CLI — subcommand reference",
      "stability": "stable",
      "tagline": "cyoda is a Go binary that embeds the full platform: API server, schema engine, workflow runner, and storage plugins. Invoked with no subcommand, it starts the server using environment-provided configuration. Subcommands provide operational affordances — `init` for first-run bootstrap, `health` for liveness probes, `migrate` for schema migrations.",
      "see_also": [
        "config",
        "run",
        "quickstart"
      ]
    },
    {
      "topic": "cli.health",
      "title": "cyoda health — liveness probe",
      "stability": "stable",
      "tagline": "`cyoda health` sends an HTTP GET to `http://127.0.0.1:<port>/readyz` and exits 0 if the server responds with HTTP 200. Any non-200 response or connection error causes exit 1.",
      "see_also": [
        "telemetry"
      ]
    },
    {
      "topic": "cli.help",
      "title": "cyoda help — the help subsystem",
      "stability": "stable",
      "tagline": "`cyoda help` is the built-in documentation browser. Topics are organized in a dot-separated tree (`cli`, `cli.serve`, `config.database`, etc.). Invoking `cyoda help` with no arguments prints a summary of all top-level topics. Invoking it with one or more topic segments navigates the tree.",
      "see_also": [
        "cli"
      ]
    },
    {
      "topic": "cli.init",
      "title": "cyoda init — first-run bootstrap",
      "stability": "stable",
      "tagline": "`cyoda init` is the recommended first step for local desktop use. It writes a minimal user config file that sets `CYODA_STORAGE_BACKEND=sqlite`, enabling persistent local storage without requiring a database server.",
      "see_also": [
        "config",
        "cli.migrate"
      ]
    },
    {
      "topic": "cli.migrate",
      "title": "cyoda migrate — run storage migrations",
      "stability": "stable",
      "tagline": "`cyoda migrate` is a short-lived process that applies pending schema migrations for the configured storage backend, then exits cleanly — no admin listener, no background loops, no lingering goroutines.",
      "see_also": [
        "config",
        "cli.init"
      ]
    },
    {
      "topic": "cli.serve",
      "title": "cyoda serve — start the API server",
      "stability": "stable",
      "tagline": "Starting with no subcommand loads configuration from environment variables, validates the IAM mode, and binds the REST, gRPC, and admin listeners. The server is single-process, multi-tenant, and stateful — storage is provided by one of the pluggable backends (`memory`, `sqlite`, or `postgres`); see `cyoda help config` for backend selection.",
      "see_also": [
        "config",
        "run",
        "quickstart"
      ]
    },
    {
      "topic": "cloudevents",
      "title": "cloudevents — CloudEvent payload JSON Schemas",
      "stability": "stable",
      "tagline": "cyoda-go uses [CloudEvents v1.0](https://cloudevents.io) as the transport envelope for event-driven processing. Every payload carried inside a CloudEvent — workflow calculation requests, calculation responses, entity transaction events, snapshot state, model descriptors — is validated against a JSON Schema (Draft 2020-12).",
      "see_also": [
        "grpc",
        "workflows",
        "errors.DISPATCH_TIMEOUT",
        "errors.DISPATCH_FORWARD_FAILED"
      ]
    },
    {
      "topic": "config",
      "title": "cyoda configuration reference",
      "stability": "stable",
      "tagline": "Environment variables beat default values. The `_FILE` suffix variant takes precedence over the plain variable when both are set — for example, `CYODA_POSTGRES_URL_FILE=/etc/secrets/db-url` wins over `CYODA_POSTGRES_URL`. There are no command-line flags for configuration values; env vars are the sole configuration surface.",
      "see_also": [
        "cli",
        "run",
        "config.auth",
        "config.database",
        "config.grpc",
        "config.schema"
      ]
    },
    {
      "topic": "config.auth",
      "title": "auth configuration",
      "stability": "stable",
      "tagline": "config.auth — IAM mode, JWT issuer, HMAC secret, and admin bootstrap controls.",
      "see_also": [
        "config",
        "run"
      ]
    },
    {
      "topic": "config.database",
      "title": "database configuration",
      "stability": "stable",
      "tagline": "config.database — storage backend selection and per-backend connection settings.",
      "see_also": [
        "config",
        "run"
      ]
    },
    {
      "topic": "config.grpc",
      "title": "grpc configuration",
      "stability": "stable",
      "tagline": "config.grpc — gRPC listener settings and compute-node credentials.",
      "see_also": [
        "config",
        "grpc",
        "run"
      ]
    },
    {
      "topic": "config.schema",
      "title": "schema configuration",
      "stability": "stable",
      "tagline": "config.schema — schema-extension log tuning.",
      "see_also": [
        "config",
        "models",
        "run"
      ]
    },
    {
      "topic": "crud",
      "title": "crud — entity lifecycle API",
      "stability": "stable",
      "tagline": "Entities are instances of models. Each entity has a UUID, a model reference (`entityName`, `modelVersion`), and a lifecycle state managed by the workflow engine. Creating an entity requires the referenced model to be in `LOCKED` state. All write operations run within a Cyoda transaction and return a `transactionId` alongside the affected entity IDs.",
      "see_also": [
        "models",
        "search",
        "workflows",
        "errors.ENTITY_NOT_FOUND",
        "errors.MODEL_NOT_FOUND",
        "errors.MODEL_NOT_LOCKED",
        "errors.VALIDATION_FAILED",
        "errors.CONFLICT",
        "errors.IDEMPOTENCY_CONFLICT",
        "errors.TRANSITION_NOT_FOUND",
        "openapi"
      ]
    },
    {
      "topic": "errors",
      "title": "cyoda error reference",
      "stability": "stable",
      "tagline": "Every error response from the Cyoda REST API carries a structured `errorCode` in the `properties` object. Multiple codes may share the same HTTP status. Programmatic handling keys on `errorCode`, not HTTP status.",
      "see_also": [
        "openapi",
        "grpc",
        "config"
      ]
    },
    {
      "topic": "errors.BAD_REQUEST",
      "title": "BAD_REQUEST — malformed or invalid request",
      "stability": "stable",
      "tagline": "Fired when the server cannot parse or structurally process the incoming request. Common triggers include invalid JSON, missing required fields, unsupported format specifiers, or mutually exclusive parameters being set simultaneously.",
      "see_also": [
        "errors",
        "errors.VALIDATION_FAILED"
      ]
    },
    {
      "topic": "errors.CLUSTER_NODE_NOT_REGISTERED",
      "title": "CLUSTER_NODE_NOT_REGISTERED — target node is not in the cluster registry",
      "stability": "stable",
      "tagline": "The request was routed to or requires a specific cluster node that is not present in the registry. Occurs during startup, rolling restarts, or after a node failure before the gossip layer has converged.",
      "see_also": [
        "errors",
        "errors.COMPUTE_MEMBER_DISCONNECTED"
      ]
    },
    {
      "topic": "errors.COMPUTE_MEMBER_DISCONNECTED",
      "title": "COMPUTE_MEMBER_DISCONNECTED — compute member dropped from the cluster",
      "stability": "stable",
      "tagline": "The compute member responsible for executing a processor or workflow step disconnected before completing the operation. The task may or may not have been executed.",
      "see_also": [
        "errors",
        "errors.CLUSTER_NODE_NOT_REGISTERED",
        "errors.NO_COMPUTE_MEMBER_FOR_TAG"
      ]
    },
    {
      "topic": "errors.CONFLICT",
      "title": "CONFLICT — optimistic concurrency conflict",
      "stability": "stable",
      "tagline": "The server detected that the entity was modified by another writer between the time it was read and the time the current write was committed. Normal outcome under concurrent load.",
      "see_also": [
        "errors",
        "errors.TX_CONFLICT",
        "errors.IDEMPOTENCY_CONFLICT",
        "errors.EPOCH_MISMATCH"
      ]
    },
    {
      "topic": "errors.DISPATCH_FORWARD_FAILED",
      "title": "DISPATCH_FORWARD_FAILED — inter-node dispatch forwarding error",
      "stability": "stable",
      "tagline": "The cluster dispatcher attempted to forward a processor invocation or criteria evaluation to a peer node but the HTTP call to that peer failed (network error, peer crash, or connection refused). The operation has not been executed on the target node.",
      "see_also": [
        "errors",
        "errors.DISPATCH_TIMEOUT",
        "errors.COMPUTE_MEMBER_DISCONNECTED"
      ]
    },
    {
      "topic": "errors.DISPATCH_TIMEOUT",
      "title": "DISPATCH_TIMEOUT — dispatch to compute member timed out",
      "stability": "stable",
      "tagline": "A workflow processor or criteria evaluation was dispatched to a compute member but the response did not arrive within the dispatch timeout window. The underlying task may or may not have completed on the remote node.",
      "see_also": [
        "errors",
        "errors.DISPATCH_FORWARD_FAILED",
        "errors.NO_COMPUTE_MEMBER_FOR_TAG"
      ]
    },
    {
      "topic": "errors.ENTITY_NOT_FOUND",
      "title": "ENTITY_NOT_FOUND — entity does not exist",
      "stability": "stable",
      "tagline": "No entity with the given ID exists in the tenant's data store, or the entity existed at a point-in-time that precedes the requested snapshot. Also returned for audit log lookups when the specified event or message cannot be found.",
      "see_also": [
        "errors",
        "errors.MODEL_NOT_FOUND"
      ]
    },
    {
      "topic": "errors.EPOCH_MISMATCH",
      "title": "EPOCH_MISMATCH — shard ownership epoch has changed",
      "stability": "stable",
      "tagline": "Shard ownership is tracked by an epoch counter that increments whenever the cluster re-partitions. A write is rejected with this error when the writing node's cached epoch is stale — another node has since taken ownership of the shard. This prevents split-brain writes.",
      "see_also": [
        "errors",
        "errors.CONFLICT",
        "errors.TX_CONFLICT"
      ]
    },
    {
      "topic": "errors.FORBIDDEN",
      "title": "FORBIDDEN — caller lacks required role or permission",
      "stability": "stable",
      "tagline": "The request was authenticated successfully but the caller's JWT claims do not include the role required by the endpoint (for example, `admin` is required for administrative operations). Tenant mismatch — where the caller's tenant does not match the resource — also produces this error.",
      "see_also": [
        "errors",
        "errors.UNAUTHORIZED"
      ]
    },
    {
      "topic": "errors.HELP_TOPIC_NOT_FOUND",
      "title": "HELP_TOPIC_NOT_FOUND — help topic not found",
      "stability": "stable",
      "tagline": "Returned by `GET {ContextPath}/help/{topic}` when `{topic}` is well-formed (matches `[A-Za-z0-9._-]+`) but does not resolve to any topic in the tree. Clients should `GET {ContextPath}/help` to discover available topic paths.",
      "see_also": [
        "errors"
      ]
    },
    {
      "topic": "errors.IDEMPOTENCY_CONFLICT",
      "title": "IDEMPOTENCY_CONFLICT — duplicate request with conflicting payload",
      "stability": "stable",
      "tagline": "The idempotency key is supplied via the `Idempotency-Key` HTTP header on collection create and update requests. See `crud` for the request shape.",
      "see_also": [
        "errors",
        "errors.CONFLICT",
        "errors.TX_CONFLICT"
      ]
    },
    {
      "topic": "errors.MODEL_NOT_FOUND",
      "title": "MODEL_NOT_FOUND — entity model does not exist",
      "stability": "stable",
      "tagline": "The entity type or model name specified in the request does not exist in the tenant's model registry. Occurs when creating entities with an unknown type, importing data that references a missing model, or performing model lifecycle transitions on a model ID that does not exist.",
      "see_also": [
        "errors",
        "errors.ENTITY_NOT_FOUND",
        "errors.MODEL_NOT_LOCKED"
      ]
    },
    {
      "topic": "errors.MODEL_NOT_LOCKED",
      "title": "MODEL_NOT_LOCKED — model must be locked before writing entities",
      "stability": "stable",
      "tagline": "Entity creation and bulk write operations require the model to be in the `LOCKED` lifecycle state. Models in `DRAFT` or unlocked-for-editing state reject writes to prevent schema changes from affecting in-flight data.",
      "see_also": [
        "errors",
        "errors.MODEL_NOT_FOUND",
        "errors.CONFLICT"
      ]
    },
    {
      "topic": "errors.NOT_IMPLEMENTED",
      "title": "NOT_IMPLEMENTED — endpoint is not yet implemented",
      "stability": "stable",
      "tagline": "The route is defined and accepted by the server but the handler returns this error because the feature is pending implementation. Distinct from a `404` — the endpoint exists without a functional implementation.",
      "see_also": [
        "errors"
      ]
    },
    {
      "topic": "errors.NO_COMPUTE_MEMBER_FOR_TAG",
      "title": "NO_COMPUTE_MEMBER_FOR_TAG — no compute member registered for the required tag",
      "stability": "stable",
      "tagline": "Workflow processors are dispatched to nodes that advertise matching compute tags. When no node with the required tag is alive in the cluster within the configured wait timeout (`CYODA_DISPATCH_WAIT_TIMEOUT`), the operation is rejected with this error.",
      "see_also": [
        "errors",
        "errors.COMPUTE_MEMBER_DISCONNECTED",
        "errors.DISPATCH_TIMEOUT"
      ]
    },
    {
      "topic": "errors.POLYMORPHIC_SLOT",
      "title": "POLYMORPHIC_SLOT — payload does not satisfy polymorphic slot constraint",
      "stability": "stable",
      "tagline": "A model can define polymorphic slots — fields whose schema varies based on a discriminator value. This error fires when the payload's discriminator selects a variant whose schema the provided data fails to match, or when the discriminator value itself is unrecognised.",
      "see_also": [
        "errors",
        "errors.BAD_REQUEST",
        "errors.VALIDATION_FAILED"
      ]
    },
    {
      "topic": "errors.SEARCH_JOB_ALREADY_TERMINAL",
      "title": "SEARCH_JOB_ALREADY_TERMINAL — search job has already completed or failed",
      "stability": "stable",
      "tagline": "Search jobs are long-running asynchronous operations. Once a job reaches a terminal state it cannot be cancelled, resumed, or otherwise modified. This error is returned when such an operation is attempted on a finished job.",
      "see_also": [
        "errors",
        "errors.SEARCH_JOB_NOT_FOUND",
        "errors.SEARCH_SHARD_TIMEOUT"
      ]
    },
    {
      "topic": "errors.SEARCH_JOB_NOT_FOUND",
      "title": "SEARCH_JOB_NOT_FOUND — search job does not exist",
      "stability": "stable",
      "tagline": "Polling a search job by ID returns this error when the job ID is unknown or belongs to a different tenant. Jobs are tenant-scoped; a valid job ID from one tenant is not visible to another.",
      "see_also": [
        "errors",
        "errors.SEARCH_JOB_ALREADY_TERMINAL",
        "errors.SEARCH_SHARD_TIMEOUT"
      ]
    },
    {
      "topic": "errors.SEARCH_RESULT_LIMIT",
      "title": "SEARCH_RESULT_LIMIT — search result set exceeds the allowed limit",
      "stability": "stable",
      "tagline": "The server imposes an upper bound on the number of results returned per page and per job to protect cluster resources. Returned when the request exceeds this limit — either by requesting too large a page size or by the matched result count exceeding the cap.",
      "see_also": [
        "errors",
        "errors.SEARCH_JOB_NOT_FOUND",
        "errors.SEARCH_SHARD_TIMEOUT"
      ]
    },
    {
      "topic": "errors.SEARCH_SHARD_TIMEOUT",
      "title": "SEARCH_SHARD_TIMEOUT — a search shard did not respond in time",
      "stability": "stable",
      "tagline": "Distributed search fans out to multiple shards in parallel. If any shard does not return results before the search timeout expires, the job is marked failed and this error is returned. Occurs under high load, during partial cluster degradation, or with expensive queries.",
      "see_also": [
        "errors",
        "errors.SEARCH_JOB_NOT_FOUND",
        "errors.DISPATCH_TIMEOUT"
      ]
    },
    {
      "topic": "errors.SERVER_ERROR",
      "title": "SERVER_ERROR — unexpected internal server error",
      "stability": "stable",
      "tagline": "The server encountered an unclassified internal error. The response body contains a `ticket` UUID that correlates with the server-side error log. No internal details are exposed in the response.",
      "see_also": [
        "errors"
      ]
    },
    {
      "topic": "errors.TRANSACTION_EXPIRED",
      "title": "TRANSACTION_EXPIRED — transaction token has expired",
      "stability": "stable",
      "tagline": "Transaction tokens are short-lived bearer tokens issued when a transaction is opened. This error fires when the token's `exp` claim is in the past at the time the proxy validates it. The transaction itself may still be active server-side, but the token is no longer valid for routing.",
      "see_also": [
        "errors",
        "errors.TRANSACTION_NOT_FOUND",
        "errors.TRANSACTION_NODE_UNAVAILABLE"
      ]
    },
    {
      "topic": "errors.TRANSACTION_NODE_UNAVAILABLE",
      "title": "TRANSACTION_NODE_UNAVAILABLE — the node owning the transaction is unreachable",
      "stability": "stable",
      "tagline": "Transaction state is pinned to the node that opened it. If that node crashes or becomes unreachable while the transaction is in progress, subsequent requests using the transaction token are rejected with this error because the proxy cannot forward them to the owner.",
      "see_also": [
        "errors",
        "errors.TRANSACTION_EXPIRED",
        "errors.TRANSACTION_NOT_FOUND",
        "errors.CLUSTER_NODE_NOT_REGISTERED"
      ]
    },
    {
      "topic": "errors.TRANSACTION_NOT_FOUND",
      "title": "TRANSACTION_NOT_FOUND — transaction ID does not exist",
      "stability": "stable",
      "tagline": "The transaction ID supplied in the request does not correspond to an active transaction. The transaction may have been committed, rolled back, expired, or may never have existed. Also occurs when a request is mis-routed to a node that never opened the transaction.",
      "see_also": [
        "errors",
        "errors.TRANSACTION_EXPIRED",
        "errors.TRANSACTION_NODE_UNAVAILABLE"
      ]
    },
    {
      "topic": "errors.TRANSITION_NOT_FOUND",
      "title": "TRANSITION_NOT_FOUND — workflow transition does not exist",
      "stability": "stable",
      "tagline": "Entity workflow state machines define explicit transitions between states. This error fires when a transition is triggered that does not exist in the model's workflow definition for the entity's current state. Also occurs when the transition name is misspelled or when the entity is in a terminal state that allows no further transitions.",
      "see_also": [
        "errors",
        "errors.WORKFLOW_NOT_FOUND",
        "errors.WORKFLOW_FAILED"
      ]
    },
    {
      "topic": "errors.TX_CONFLICT",
      "title": "TX_CONFLICT — transaction serialization conflict",
      "stability": "stable",
      "tagline": "The underlying storage detected a serialization failure (e.g., PostgreSQL error 40001 or 40P01) and aborted the transaction. Normal occurrence under concurrent write load when using serializable or repeatable-read isolation.",
      "see_also": [
        "errors",
        "errors.CONFLICT",
        "errors.EPOCH_MISMATCH",
        "errors.IDEMPOTENCY_CONFLICT"
      ]
    },
    {
      "topic": "errors.TX_COORDINATOR_NOT_CONFIGURED",
      "title": "TX_COORDINATOR_NOT_CONFIGURED — distributed transaction coordinator is not enabled",
      "stability": "stable",
      "tagline": "Certain operations that span multiple storage shards require a distributed transaction coordinator. This error is returned when such an operation is attempted on a node where the coordinator component is disabled or misconfigured.",
      "see_also": [
        "errors",
        "errors.TX_REQUIRED",
        "errors.TX_NO_STATE"
      ]
    },
    {
      "topic": "errors.TX_NO_STATE",
      "title": "TX_NO_STATE — transaction has no state record",
      "stability": "stable",
      "tagline": "The two-phase commit coordinator tracks per-transaction state (prepared, committed, aborted). This error is returned when a commit or abort instruction references a transaction for which no state record exists, because the transaction was never prepared or was already cleaned up.",
      "see_also": [
        "errors",
        "errors.TX_REQUIRED",
        "errors.TX_COORDINATOR_NOT_CONFIGURED",
        "errors.TRANSACTION_NOT_FOUND"
      ]
    },
    {
      "topic": "errors.TX_REQUIRED",
      "title": "TX_REQUIRED — operation must be performed inside a transaction",
      "stability": "stable",
      "tagline": "Certain write operations that require atomic multi-step coordination mandate a transaction context. Returned when such an operation is called without a `transactionId` header or query parameter.",
      "see_also": [
        "errors",
        "errors.TX_CONFLICT",
        "errors.TX_COORDINATOR_NOT_CONFIGURED"
      ]
    },
    {
      "topic": "errors.UNAUTHORIZED",
      "title": "UNAUTHORIZED — authentication required or token invalid",
      "stability": "stable",
      "tagline": "Returned when the `Authorization` header is missing, the bearer token is expired, the token signature is invalid, or the token was issued by an untrusted issuer. Also returned when a request reaches a protected route with no identity context established by the auth middleware.",
      "see_also": [
        "errors",
        "errors.FORBIDDEN"
      ]
    },
    {
      "topic": "errors.VALIDATION_FAILED",
      "title": "VALIDATION_FAILED — payload fails model schema validation",
      "stability": "stable",
      "tagline": "Unlike `BAD_REQUEST` (which covers parse failures), this error is returned when the payload is parseable but violates the registered model schema — for example, a required field is missing, a value is out of the allowed range, or a workflow guard condition is not satisfied. The error detail includes the specific validation failure.",
      "see_also": [
        "errors",
        "errors.BAD_REQUEST",
        "errors.POLYMORPHIC_SLOT"
      ]
    },
    {
      "topic": "errors.WORKFLOW_FAILED",
      "title": "WORKFLOW_FAILED — workflow processor returned an error",
      "stability": "stable",
      "tagline": "During an entity create or transition operation the associated workflow processors (pre-processors, post-processors) or guard conditions ran but one of them signalled failure. The failure message from the processor is included in the error detail.",
      "see_also": [
        "errors",
        "errors.WORKFLOW_NOT_FOUND",
        "errors.TRANSITION_NOT_FOUND"
      ]
    },
    {
      "topic": "errors.WORKFLOW_NOT_FOUND",
      "title": "WORKFLOW_NOT_FOUND — workflow definition does not exist",
      "stability": "stable",
      "tagline": "Entity models reference a workflow by name to govern state transitions. This error is returned when the named workflow cannot be found in the tenant's workflow registry, during entity type registration or when a model references a workflow that was deleted.",
      "see_also": [
        "errors",
        "errors.TRANSITION_NOT_FOUND",
        "errors.WORKFLOW_FAILED"
      ]
    },
    {
      "topic": "grpc",
      "title": "grpc — gRPC service contract",
      "stability": "stable",
      "tagline": "cyoda-go exposes one gRPC service: `CloudEventsService` (package `org.cyoda.cloud.api.grpc`). All gRPC methods use the CloudEvents Protobuf envelope (`io.cloudevents.v1.CloudEvent`) as both request and response types. The event type string in the CloudEvent envelope selects the operation; the JSON payload in `text_data` (or `binary_data`) carries the operation-specific body.",
      "see_also": [
        "config.grpc",
        "workflows",
        "errors.COMPUTE_MEMBER_DISCONNECTED",
        "errors.NO_COMPUTE_MEMBER_FOR_TAG",
        "errors.DISPATCH_TIMEOUT",
        "errors.DISPATCH_FORWARD_FAILED"
      ]
    },
    {
      "topic": "helm",
      "title": "helm — Helm chart for Kubernetes deployment",
      "stability": "stable",
      "tagline": "The chart at `deploy/helm/cyoda` deploys cyoda-go on Kubernetes as a StatefulSet backed by an external PostgreSQL database. The chart requires Kubernetes `>=1.31.0`. Chart version: `0.1.0`. App version: `0.1.0` (synchronized to the binary by the `bump-chart-appversion.yml` CI workflow).",
      "see_also": [
        "run",
        "config",
        "config.database",
        "config.auth",
        "quickstart"
      ]
    },
    {
      "topic": "models",
      "title": "models — entity model schema system",
      "stability": "stable",
      "tagline": "A model is a named, versioned schema registered per tenant. Every entity in the system is an instance of exactly one model. Models are identified by `(entityName, modelVersion)`. The model ID is a deterministic UUID v5 derived from that key: `UUID.newSHA1(NameSpaceURL, \"{entityName}.{modelVersion}\")`.",
      "see_also": [
        "crud",
        "workflows",
        "search",
        "errors.MODEL_NOT_FOUND",
        "errors.VALIDATION_FAILED",
        "errors.CONFLICT",
        "openapi"
      ]
    },
    {
      "topic": "openapi",
      "title": "openapi — OpenAPI 3 spec and discovery endpoints",
      "stability": "stable",
      "tagline": "cyoda-go generates its OpenAPI 3.1 specification from the embedded `api/openapi.yaml` file compiled into the binary at build time. The spec is served at `/openapi.json` with runtime-patched server URLs. The Scalar API Reference UI is served at `/docs` and loads the spec from `/openapi.json`.",
      "see_also": [
        "crud",
        "models",
        "search",
        "workflows",
        "errors",
        "config.auth",
        "cli.serve"
      ]
    },
    {
      "topic": "quickstart",
      "title": "cyoda quickstart — minimum invocations",
      "stability": "stable",
      "tagline": "cyoda-go is a single-process, multi-tenant REST and gRPC API server backed by a pluggable embedded database management system. Storage backends are `memory`, `sqlite`, and `postgres`; authentication modes are `mock` and `jwt`. All configuration is via environment variables with a `CYODA_` prefix.",
      "see_also": [
        "cli",
        "cli.init",
        "config",
        "config.database",
        "config.auth",
        "run"
      ]
    },
    {
      "topic": "run",
      "title": "run — runtime modes and operational semantics",
      "stability": "stable",
      "tagline": "cyoda-go is a single-process, multi-tenant REST and gRPC API server. It starts in serving mode when invoked with no subcommand. All configuration is via environment variables with a `CYODA_` prefix. The binary, Docker image, and Helm chart run the same binary; only the environment configuration differs across run modes.",
      "see_also": [
        "cli",
        "cli.serve",
        "cli.init",
        "cli.health",
        "quickstart",
        "helm",
        "config",
        "config.database",
        "config.auth",
        "telemetry"
      ]
    },
    {
      "topic": "search",
      "title": "search — entity search API",
      "stability": "stable",
      "tagline": "Search operates against a specific entity model `(entityName, modelVersion)`. Two modes are supported:",
      "see_also": [
        "crud",
        "models",
        "analytics",
        "errors.SEARCH_JOB_NOT_FOUND",
        "errors.SEARCH_JOB_ALREADY_TERMINAL",
        "errors.SEARCH_RESULT_LIMIT",
        "errors.SEARCH_SHARD_TIMEOUT",
        "openapi"
      ]
    },
    {
      "topic": "telemetry",
      "title": "telemetry — OpenTelemetry emission",
      "stability": "evolving",
      "tagline": "cyoda-go integrates the OpenTelemetry Go SDK (`go.opentelemetry.io/otel`). When `CYODA_OTEL_ENABLED=true`, the binary initializes a trace provider and a meter provider at startup using OTLP HTTP exporters. When `CYODA_OTEL_ENABLED=false` (default), no OTel SDK is initialized and no spans or metrics are emitted; the global OTel provider remains a no-op.",
      "see_also": [
        "config",
        "cli.serve",
        "cli.health",
        "config.auth"
      ]
    },
    {
      "topic": "workflows",
      "title": "workflows — state machine definitions",
      "stability": "stable",
      "tagline": "A workflow definition is a named finite state machine attached to an entity model. Workflows are stored per model reference `(entityName, modelVersion)`. A model may have multiple workflow definitions; the engine selects the matching one per entity using the workflow-level `criterion` field evaluated at entity creation time. When no `criterion` matches, the engine uses the default built-in workflow.",
      "see_also": [
        "models",
        "crud",
        "grpc",
        "search",
        "errors.TRANSITION_NOT_FOUND",
        "errors.WORKFLOW_NOT_FOUND",
        "errors.WORKFLOW_FAILED",
        "errors.NO_COMPUTE_MEMBER_FOR_TAG",
        "errors.COMPUTE_MEMBER_DISCONNECTED"
      ]
    }
  ],
  "_url_convention": "topic IDs use dots and may contain uppercase (e.g. \"config.database\", \"errors.BAD_REQUEST\"); to build the URL, replace dots with slashes and lowercase the result, e.g. /help/config/database/ or /help/errors/bad_request/."
}
