Complete the execution cluster under the active UI instead of leaving JobEngine, Scheduler, and Scanner support flows split across stale aliases or half-wired pages.
Keep operator workflows usable end to end: inspect jobs, open DAG context, follow scheduler runs, and finish scanner-support actions without console-only placeholders.
Execution quotas and dead-letter browse/replay were withdrawn on 2026-10-01 (SPRINT_20260928_008 PCD-129): their clients called /api/v1/jobengine/{quotas,deadletter,pack-runs,sources}, which no service publishes.
The dead-letter routes that then rendered only an unavailable state were withdrawn on 2026-10-09 (SPRINT_20261007_015 CCP-032): /ops/operations/dead-letter, its queue and entry/:entryId children, and the /ops/jobengine/dead-letter*, /platform-ops/dead-letter* and /platform/ops/dead-letter* aliases. The canonical paths now resolve to the normal Page Not Found page; the legacy alias bookmarks follow the legacy alias catch-all to the JobEngine page. No page links there.
Jobs & Queues is the execution overview, not a dead-end card deck. It must deep-link into JobEngine, Scheduler, and related operator pages. (/ops/operations/jobs-queues currently redirects to the JobEngine page.)
Jobs & Queues must not advertise fake row-level mutations. If the overview cannot perform run, pause, drain, or replay locally, its visible actions must be relabeled as honest handoffs into the canonical downstream surfaces that own those operations.
Overview filters inside Jobs & Queues must be functional on every tab they appear on. Inert search/select controls are treated as a behavioral defect, not acceptable placeholder chrome.
JobEngine owns queue health, job detail, and DAG context.
Scheduler owns run monitoring, schedule management, worker fleet, and run-stream drill-in.
There is no dead-letter surface: no service publishes a dead-letter queue or a replay operation, so no page, link or helper tip offers dead-letter recovery. A run’s dead-letter proof, when Scheduler recorded one, appears only as deadLetterEvidence in the run evidence payload that the job detail shows under Payload (available: false when none was recorded).
The supported job recovery is the Scheduler run retry on the JobEngine Runs tab. A Scheduler operator (scheduler:operate) can retry a failed or cancelled run that belongs to a schedule; a run without a schedule shows “Not retryable: this run belongs to no schedule.” and offers no control. Scheduler retries a source run at most once: the first request returns 201 and the Console reports “Retry queued as”; a repeated request returns the recorded retry with 200 and the Console reports that the run was already retried, with that retry’s status, and queues nothing. The retry run carries retryOf, and the source job’s detail lists it as a retry child. To try again after a retry ends, retry the retry run.
A failed run states its failure class from the reason code its owner recorded (features/scheduler-ops/scheduler-run-failure.ts); the recorded error is always shown unchanged as “Recorded error”. Scheduler stores the reason as text only; the classifier reads the Authority token-client form (“Token request failed with status ().”) and a job’s HTTP-call answer (“Response status code does not indicate success: ”, the HttpClient timeout), per service for database-maintenance. An authorization or configuration failure (OAuth invalid_scope, unauthorized_client, invalid_client, invalid_grant, invalid_request, unsupported_grant_type; a call refused with 401/403, misaddressed with 404 or rejected with another 4xx) names the failed contract and the repair owner, links Access > Clients when a client registration is the repair, links the job’s runbook when one exists, and offers no Retry (“Retry withheld”); no repair text asks for an administrator role or a broader grant. A temporary failure (OAuth temporarily_unavailable, server_error, slow_down; 408, 429, 5xx, timeout) keeps Retry with “Retry the run when … is available.” An error with no recognized reason code is “Unclassified failure” and keeps the Scheduler retry contract unchanged; an Authority answer whose recorded OAuth code the Console does not classify (for example access_denied or use_dpop_nonce) is also unclassified, and the next step names that code. A refused retry or cancel (401/403) says repeating will not change the answer, a rejected one (other 4xx) points to Refresh, and a temporary one to trying again later. Refresh only re-reads runs.
The Scheduled Jobs page states a refused read (401/403) as an access result without Retry in the summary, on the Runs tab, on the Schedules tab and for the schedule run-history read; an unavailable read keeps Retry, which only re-reads.
A failed run is one record in every execution view. The Runs tab reads it from Scheduler (GET /api/v1/scheduler/runs/); the Jobs list and the job detail read the same run through JobEngine (GET /api/v1/jobengine/jobs, /jobs/{id}/detail, /dag/job/{id}/parents and /children). The run id, failed state, tenant, created, started (job detail: Leased) and finished (job detail: Completed) times and the recorded error (job detail: Reason) are the same in all three views, and the Detail link of a Jobs list row opens that run’s job detail. The Jobs list shortens the job id, so two runs created in the same second can look alike there; the Detail link and the job detail carry the full id. The Jobs list shows the newest 200 jobs without a time window. Open defect (SPRINT_20261007_001 CCP-003): the Runs tab reads only the first page of runs that Scheduler returns and ignores its next-page cursor, so the 1 hour, 24 hours, 7 days and 30 days ranges cover only the runs on that page (on 2026-10-10 the page held 50 runs back to 2026-10-09T13:13:31Z, and 39 completed runs of the 24-hour window were not shown). Neither the run nor the job offers a dead-letter or replay control. An empty run list and empty parent or child edges are stated as successful empty reads; a failed run read, a failed jobs read, a failed job detail read and an unknown job id are stated as such. The Jobs list states a failed jobs read as “JobEngine jobs could not be loaded”, never as an empty list; its Retry only re-reads and is not offered for a 401, 403, 404 or 501 answer (in source since 2026-10-10; the Console deployed on 2026-10-10 still shows a failed jobs read as an empty list). Verified against a failed nightly database-maintenance run on 2026-10-10 (SPRINT_20261007_001 CCP-003); pinned by src/Web/StellaOps.Web/src/tests/platform-ops/operational-incident-reconciliation.spec.ts.
Scanner Ops remains scanner-owned, but its supporting actions must be honest and usable because it is part of the same operator journey.
Repaired canonical route helpers, navigation targets, and legacy aliases for JobEngine, Scheduler, and Scanner Ops entry points (the dead-letter helpers and aliases were withdrawn on 2026-10-09).
Replaced placeholder JobEngine dashboards with working summary, list, detail, and DAG flows backed by the existing clients (the quota flow was withdrawn on 2026-10-01).
Added a route-backed Scheduler Run Stream page and kept scheduler schedules and worker-fleet links inside the canonical execution subtree.
Completed dead-letter batch replay, batch resolve, export, entry-detail replay handoff, and canonical job deep links (withdrawn on 2026-10-01: no service serves their routes).
Replaced scanner-support console.log actions with honest local verification, export, promote, and refresh flows.