Runbook: Release Orchestrator - Resource Quota Exhausted
For platform and release on-call. Read this before treating any “quota exceeded” signal as the cause of a blocked release in Stella Ops. The short version: there is no live promotion-quota enforcement today — the quota surface that exists is an ingest source/tenant resource-consumption model whose management backend is not yet wired. If a release is blocked, the cause is a gate, workflow, or dependency, not a quota; this runbook shows you how to confirm that and where to go next.
Sprint: SPRINT_20260117_029_DOCS_runbook_coverage Task: RUN-004 - Release Orchestrator Runbooks
RECONCILIATION NOTICE (2026-05-30): This runbook was reconciled against source (
src/ReleaseOrchestrator,src/JobEngine,src/Cli, and the scope catalogStellaOpsScopes.cs). Many original commands and symptoms described a promotion rate-limiting feature that does not exist in code. The quota surface that is defined is an ingest source/tenant resource-consumption quota (api_calls, data_ingested_bytes, items_processed, backfills, concurrent_jobs, storage_bytes), and even that surface is only partially wired: the CLI commands exist, but the orchestrator-side management backend is NOT IMPLEMENTED (the/api/v1/jobengine/quotaswrite paths return501 Not Implementedfrom the release-orchestrator host, and a Platform compatibility layer answers the GET path with hardcoded demo data — values are mock, though this particular route does not carry anisDemoflag). Sections below are annotated INCORRECT / MISSING / NOT IMPLEMENTED accordingly. Treat the “roadmap” callouts as forward-looking, not operational.
Metadata
| Field | Value |
|---|---|
| Component | Release Orchestrator / JobEngine (Scheduler) |
| Severity | Medium |
| On-call scope | Platform team, Release team |
| Last updated | 2026-05-30 |
| Doctor check | None ground-truthed for quotas. The real release Doctor checks (plugin StellaOps.Doctor.Plugin.Release) are check.release.active, check.release.promotion.gates, check.release.environment.readiness, check.release.rollback.readiness, and check.release.environment.matches-approved (run with stella doctor run --check <id>). The previously documented check.orchestrator.quota-status does not exist in source. |
| Required scope | orch:quota (StellaOpsScopes.OrchQuota) for quota management; orch:read (OrchRead) for read-only views |
Reality check: what exists vs. what does not
Before triaging, understand the actual state of the quota subsystem in code.
Defined and wired (CLI layer):
stella orch quotas get/set/resetcommand group (CommandFactory.cs,CommandHandlers.HandleOrchQuotas{Get,Set,Reset}Async).- The quota model is a resource-consumption quota keyed by
tenantand optionalsource, with these resource types (QuotaResourceTypesinsrc/Cli/StellaOps.Cli/Services/Models/OrchestratorModels.cs):api_calls,data_ingested_bytes,items_processed,backfills,concurrent_jobs,storage_bytes. Periods (QuotaPeriods):hourly,daily,weekly,monthly(defaultmonthly). Each quota carrieslimit,used,remaining,warningThreshold(default 0.8),isWarning,isExceeded,resetAt. - Read-only quota evidence on individual JobEngine job runs (
JobEngineQuotaEvidenceinsrc/JobEngine/StellaOps.Scheduler.WebService/JobEngineJobs/), derived fromRunReason.QuotaProof. When no proof was recorded it reportsavailable=false,reason=quota_proof_not_recorded.
NOT IMPLEMENTED (backend / enforcement):
- There is no promotion-quota enforcement in the Release Orchestrator. A repo-wide search of
src/ReleaseOrchestratorfinds no “quota exceeded” rejection on promotions, no daily/hourly promotion limit, and noOrchestratorQuotaExceededalert. - The orchestrator WebApi explicitly returns
501 Not Implementedfor/api/v1/jobengine/quotas(and several sibling paths) viaJobEngineLegacyEndpoints.MapLegacyUnsupportedEndpoints— the comment states quotas are “not yet migrated from JobEngine”. - The feature doc that claims a JobEngine quota backend (
StellaOps.JobEngine.Core/Domain/Quota.cs,StellaOps.JobEngine.WebService/Endpoints/QuotaEndpoints.cs) is stale: those files do not exist. The live JobEngine web service isStellaOps.Scheduler.WebService, which exposes quota evidence (read) but no quota management (write/allocate) endpoints. - The only thing answering
GET /api/v1/jobengine/quotaswith a200is a Platform compatibility shim (QuotaCompatibilityEndpoints.cs) that returns hardcoded mock values (e.g.concurrentJobs {current:3, limit:10},dailyJobLimit {current:47, limit:500},queueDepth,averageJobDuration). The shim maps GET only on this path (root +/summary) —set/reset(POST) have no real handler. (The sibling/api/v1/authority/quotas/dashboardroute in the same shim is the one that carries an explicitisDemo = truemarker; the jobengine route does not.) - The
AuditEntryenum in the orchestrator persistence domain definesQuotaCreated/Updated/Paused/Resumed/Deleted(codes 400-404), but no orchestrator code path emits or acts on them today; they are reserved placeholders for the unmigrated feature.
Practical consequence: the CLI client (
JobEngineClient) builds its URLs against{backendUrl}/api/v1/jobengine, so:
get→GET /api/v1/jobengine/quotas(withtenant/source_id/resource_typequery params),set→POST /api/v1/jobengine/quotas,reset→POST /api/v1/jobengine/quotas:reset.If you run
stella orch quotas get, you will most likely receive the Platform mock payload (which does not match the CLI’s expectedquotas[]shape, so the CLI prints “No quotas configured.” whenresult.Quotas.Count == 0).stella orch quotas set/resetPOST to paths with no real handler (the Platform shim is GET-only; the orchestrator host answers501) and fail. Do not rely on these as a live operational control until the JobEngine quota backend is implemented.
Symptoms
INCORRECT (original): The original symptoms (“promotions failing with quota exceeded”,
OrchestratorQuotaExceededalert firing, “daily quota exhausted”, “new promotions rejected”) describe a promotion rate-limiter that is not implemented. If you see promotions failing, the cause is almost certainly a gate, workflow, or dependency issue — seeorchestrator-promotion-stuck.md,orchestrator-gate-timeout.md— not a quota.
What you may actually observe with the quota subsystem as it stands:
- [ ]
stella orch quotas getreturns demo/placeholder data or “No quotas configured.” - [ ]
stella orch quotas set/resetfails (no real backend; 501 or 404). - [ ] An ingest source’s resource counters approach
warningThreshold(0.8) in the quota evidence on a job run (isWarning=true) — informational only, not enforced. - [ ] Quota evidence on a run reports
available=false,reason=quota_proof_not_recorded(no proof captured for that run).
Impact
| Impact Type | Description |
|---|---|
| User-facing | None today: there is no live quota enforcement that blocks promotions or ingest. |
| Data integrity | No data loss. Quota counters/evidence are observational. |
| SLA impact | None attributable to quotas. If releases are blocked, look at gates/workflows, not quotas. |
Diagnosis
Quick checks
Confirm whether the quota path is even backed by a real service:
# Expect demo data (Platform shim) or a 501 (orchestrator host). stella orch quotas get --json- Demo payload (
concurrentJobs,dailyJobLimit, noquotas[]) ⇒ you are hitting the Platform compatibility shim; the value is not authoritative. 501 not_implemented⇒ you are hitting the release-orchestrator host; quota management is unmigrated.
- Demo payload (
Filter by resource type (real CLI flags):
stella orch quotas get --tenant <tenant> --resource-type concurrent_jobs # Valid resource types: api_calls, data_ingested_bytes, items_processed, # backfills, concurrent_jobs, storage_bytesIf a promotion is actually failing, run the real release Doctor checks:
stella doctor run --check check.release.active stella doctor run --check check.release.promotion.gates
Deep diagnosis
NOT IMPLEMENTED (original):
stella promotion list --last 24h --count,... --by-environment,... --by-actor,stella orch quota reset-time,stella orch quota analyze— none of these exist.stella promotiononly hasassemble,attest, andverifysubcommands (attestation tooling, not a promotion queue/history surface).stella orchonly hassources,backfill, andquotas.
Inspect quota evidence on a specific job run (read-only, the real surface): The JobEngine job detail (
GET /api/v1/jobengine/jobs/{jobId}/detailon the Scheduler web service) returns aquotaEvidenceblock sourced fromscheduler.runs.reason.quotaProof. Use it to confirm whether a quota decision was recorded for a run.Check ingest source health (sources, not promotions, are the consumers of these resource quotas):
stella orch sources list --tenant <tenant>
Resolution
NOT IMPLEMENTED (original): The original “immediate mitigation” and “root cause fix” steps assumed live promotion quotas and commands that do not exist:
stella orch quota request-increase,stella promotion priority set,stella promotion cancel,stella promotion create --test --dry-run,stella orch quota limits set,stella auth rate-limit set,stella orch config set ...,stella orch quota analyze. None of these are registered commands. They are retained below only as a description of the intended future capability (roadmap), clearly marked.
If a promotion is genuinely blocked (today’s real path)
Quotas are not the cause. Triage the actual orchestrator failure:
- Check active releases and gate state:
stella doctor run --check check.release.active stella doctor run --check check.release.promotion.gates - Follow the relevant runbook:
- Stuck promotion →
orchestrator-promotion-stuck.md - Gate timeout →
orchestrator-gate-timeout.md - Rollback failure →
orchestrator-rollback-failed.md - Missing evidence →
orchestrator-evidence-missing.md
- Stuck promotion →
Setting a resource quota (when the backend is wired)
The CLI is in place; the backend is not. Once the JobEngine quota backend lands, these are the real commands (note: quotas, plural — there is no stella orch quota status/limits form):
# Set a limit (requires orch:quota scope; --tenant, --resource-type, --limit are required)
stella orch quotas set \
--tenant <tenant> \
--resource-type concurrent_jobs \
--limit 50 \
--period daily \
--warning-threshold 0.8
# Reset a usage counter (audited; --reason recommended)
stella orch quotas reset \
--tenant <tenant> \
--resource-type api_calls \
--reason "Counter reset after false-positive spike"
Roadmap (NOT IMPLEMENTED — forward-looking only)
The following capabilities are described in older drafts but are not present in source. Do not attempt to run them:
- Promotion-rate quotas and an
OrchestratorQuotaExceededalert. - Temporary quota increase requests (
request-increase). - Per-environment promotion limits, promotion prioritization/cancellation.
- Quota usage analysis (
analyze) and reset-time queries. - Service-account promotion rate-limiting (
stella auth rate-limit set).
When the JobEngine quota backend (StellaOps.Scheduler.WebService quota management endpoints) is migrated, this section should be reconciled against the shipped command surface and the orch:quota enforcement path.
Verification
# Confirm what the quota path returns (demo shim vs. 501 vs. real data)
stella orch quotas get --json
# Confirm the release pipeline itself is healthy (the thing that actually blocks releases)
stella doctor run --check check.release.active
INCORRECT (original):
stella orch quota status,stella promotion list --status in_progress,stella promotion create --test --dry-run, andstella orch logs --filter "quota" ...are not real commands. There is nostella orch logssubcommand and nostella orch quota(singular) group.
Prevention
- [ ] Monitoring: Once enforcement exists, alert at the configured
warningThreshold(default 0.8). Today there is nothing to alert on. - [ ] Limits: When the backend ships, set per-tenant/per-source resource quotas via
stella orch quotas set. - [ ] Automation: Rate-limit ingest at the source/CI level; the platform does not yet enforce promotion quotas.
- [ ] Review: Track the JobEngine quota-backend migration; reconcile this runbook when
orch:quotaenforcement goes live.
Related Resources
- Scope catalog:
src/Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs. The four orchestrator scopes areorch:read(OrchRead),orch:operate(OrchOperate),orch:quota(OrchQuota),orch:backfill(OrchBackfill). Note: there is noorch:sourcesscope — source-management commands authorize underorch:read/orch:operate. - JobEngine architecture:
docs/modules/jobengine/architecture.md - Release Orchestrator architecture:
docs/modules/release-orchestrator/architecture.md - CLI quota commands:
src/Cli/StellaOps.Cli/Commands/CommandFactory.cs(orch quotasgroup),src/Cli/StellaOps.Cli/Commands/CommandHandlers.cs - Orchestrator 501 shim:
src/ReleaseOrchestrator/__Apps/StellaOps.ReleaseOrchestrator.WebApi/Endpoints/JobEngineLegacyEndpoints.cs - Platform demo shim:
src/Platform/StellaOps.Platform.WebService/Endpoints/QuotaCompatibilityEndpoints.cs - Related runbooks:
orchestrator-promotion-stuck.md,orchestrator-gate-timeout.md,orchestrator-rollback-failed.md,orchestrator-evidence-missing.md
INCORRECT (original):
docs/modules/release-jobengine/quotas.mdanddocs/operations/quota-management.mdwere referenced but do not exist. The module directory isdocs/modules/jobengine/(anddocs/modules/release-orchestrator/), and there is noquota-management.md.
