Initiative Brief: Operator Feature Parity in the Workspaces Orchestrator App
COMPLETEDIntent— the specification (9,581 chars); the plan below decomposes it into work items. Click to expand.
# Initiative Brief: Operator Feature Parity in the Workspaces Orchestrator App ## Desired outcome The Orchestrator workspace app is the single place an operator does operator work. Everything reachable today only in the standalone control-plane UI — release planning and cutting, the operational dashboard, and the cross-initiative question queue — is available in the workspace app, consumed over the canonical `/orchestrator/*` API, authenticated as the real acting principal and scoped to an org and workspace. The standalone UI stays deployed. Its pages become a break-glass surface rather than the primary one, and it continues to host the control-plane API unchanged. ## Motivation Operator surfaces are split across two UIs with no rule about which gets new work, and the split is widening rather than closing. The release-management layer — the newest and largest operator capability built — landed entirely in the standalone UI, which was otherwise being treated as legacy. An operator now switches surfaces mid-task, and the workspace app cannot answer "what is being released?" at all. The cost is not only navigation. The standalone UI attributes every action to a single static operator identity and is reachable by anyone who can reach the host; the workspace app authenticates a real principal and scopes to an org and workspace. Work that matters — publishing a GitHub release, answering a blocking question — is better done where the record says who did it. ## Current state - The workspace app (`Xyence/workspaces`, `apps/orchestrator`) has: home, initiatives list and detail, brief revision, work-item detail, initiatives/new, workers list and worker detail. - The standalone UI (`Xyence/orchestrator`, `apps/web`) has: home, initiatives detail, initiatives/new, **`/ops`**, **`/questions`**, **`/release-plans`**, **`/release-plans/[id]`**, **`/releases`**, **`/releases/[id]`**. - Only the standalone UI has releases, ops and a cross-initiative question queue. Only the workspace app has worker pages and work-item detail. - `apps/web` is also the control plane: it serves 125 `/api/*` routes (worker claim, heartbeat, progress, GitHub webhooks, admin/ops JSON) and 21 `/orchestrator/*` routes. It cannot be removed; only its pages are candidates for removal. - The canonical `/orchestrator/*` surface today covers initiatives, waves, work items, questions **within one initiative**, release *readiness* for one initiative, and workers. It exposes **nothing** for release plans, release publishing, or the operational dashboard. - The standalone pages are server components that read the database directly (`getDatabase()`, `buildOperationalDashboard`, `listQuestions`). The workspace app is in a different repository behind an HTTP boundary and cannot do this; every surface it gains needs a canonical endpoint. - Approximate sizes: release UI ~1,220 lines across 7 components plus ~240 lines of pages; ops ~426 lines plus a 30-line page; questions ~112 lines plus a 232-line card component. - `/api/admin/ops/dashboard` already serves the same aggregation the ops page renders, so the ops surface is closer to a re-host than a rebuild. - Release mutations are the only genuinely new authorization surface: create, add initiatives, set repositories, prepare, edit notes, publish, retry, cancel, and target ordering — roughly fourteen endpoints, today answering as the static operator actor. ## Product principles - One operator UI for everyday work; the operator should never have to know which app owns a task. - No capability regresses during the migration. A surface appears in the workspace app before anyone is asked to stop using its counterpart. - Break-glass access survives. An operator must retain a way to act when platform auth or the Console gateway is unavailable. - Read-only surfaces can move quickly; anything that mutates production waits for real principal attribution. ## Architectural principles - The workspace app consumes `/orchestrator/*` over HTTP and never reaches the orchestrator database directly. - The controller adapts to the canonical contract, not the client. Vocabulary translation, status mapping and shape changes belong on the controller side, as established when the worker surface was made canonical. - New canonical endpoints are principal-scoped: the acting operator is derived from the platform session, not a static actor. - The canonical surface publishes an empty result distinctly from an absent one, so "nothing to show" and "not implemented" never look the same to a client. - No new credential surfaces. The workspace app reuses its existing authenticated, scoped API client. ## Domain concepts - **Workspace app**: `Xyence/workspaces`, `apps/orchestrator`; the Orchestrator workspace served at `orchestrator.workspaces.xyence.io`, authenticated and org/workspace scoped. - **Standalone control-plane UI**: `Xyence/orchestrator`, `apps/web` pages; the admin surface at `orchestrator.xyence.io`, attributed to a static operator actor. - **Canonical surface**: the `/orchestrator/*` API the workspace app is written against; the stable contract for automation and MCP intake as well as this frontend. - **Break-glass**: operating the platform when platform auth or the Console gateway is down. - **Release plan**: the publish lifecycle object (`/api/release-plans/*`); distinct from **release targets** (`/api/releases/*`), which drive deploys. ## Decisions - The standalone UI stays deployed for now; this initiative does not remove it. — Operator decision, 2026-08-14. - The workspace app is the operator UI going forward; new operator surfaces belong there. — Follows from the split this initiative exists to close. - `apps/web` remains the control-plane API host regardless of what happens to its pages. — It serves the worker endpoints, webhooks and the canonical surface itself. - Release *services* stay in `Xyence/orchestrator`. Only the operator interface moves. — The service owns the database and the GitHub integration. ## Rejected / deferred alternatives - Delete `apps/web` once the pages move. Rejected — it is the control plane, not just a UI. - Delete the standalone pages as each surface lands. Deferred, not rejected — break-glass has real value while the Console gateway is still proxying incompletely. Revisit when parity is complete and the gateway is sound. - Have the workspace app read the orchestrator database directly. Rejected — it is a separate repository and deployment; the HTTP contract is the boundary. - Move the release service code into Workspaces. Rejected — it owns the schema, the audit trail and the GitHub release integration. - Publish `@xyence/` packages to consume the shell from `Xyence/orchestrator`. Rejected for this initiative — the surfaces move toward the workspace app, not the reverse. ## Constraints - Two repositories change: `Xyence/workspaces` (the app and its API client) and `Xyence/orchestrator` (new canonical routes only — no page changes). - `.github/workflows/**` is a protected path in both repositories. - No new credentials, tokens or auth schemes; reuse the existing scoped client and platform session. - Existing standalone URLs keep working while the standalone UI remains deployed. - Release publishing acts on real GitHub releases; behaviour must not change as a side effect of exposing it canonically. ## Invariants - A publish, retry or cancel performed from the workspace app records the real acting principal, never a static operator actor. - Backend authorization stays authoritative: the workspace app renders what it is allowed to see, and never decides access itself. - Partial-failure semantics of release publishing are preserved exactly — per-repository outcomes, `retryable` classification, and retry that skips what already published. - No workspace-scoped surface leaks data across orgs or workspaces. - Nothing in this initiative alters the worker protocol, the review gate, or deploy behaviour. ## Repository scope - `Xyence/workspaces` — `apps/orchestrator` (pages, components, nav), `packages/api-client`. - `Xyence/orchestrator` — `apps/web/src/app/orchestrator/**` (new canonical routes), `apps/web/src/server/**` (projections). No changes to `apps/web` pages. ## Expected behavior - An operator opens the Orchestrator workspace and sees release plans: their state, participating repositories, pinned commits, notes and per-repository publish outcomes. - Preparing, editing notes, publishing, retrying a failed publish and cancelling are all possible from the workspace app, with the acting operator recorded. - An operational dashboard shows component health, worker presence, current executions and active incidents, matching what the standalone `/ops` page shows today. - A single queue lists every open question across initiatives, and answering from it behaves exactly as answering from within an initiative does. - The standalone UI continues to work unchanged throughout. ## Open questions - Should release mutations require an admin role, or is any workspace member with access sufficient? The canonical auth layer already distinguishes admin from viewer. - Should the operational dashboard be visible to any member, or restricted to admins? It exposes worker identities, incidents and execution state. - Is the cross-initiative question queue a workspace-scoped view, or genuinely global? Questions belong to initiatives, which belong to workspaces. - How long does break-glass remain? Naming a condition for retiring the standalone pages — rather than a date — would keep the decision honest.
Repository scope
targets the work spans — independent of where the brief was authoredPrimary repository: workspaces` — `apps
- workspaces` — `appsexpected · primary
- orchestrator` — `appsexpected
- outshine` — a service-authenticated path to raise a gating work item from a trusted producer, and the projection that keeps it in sync with the Orchestrator question.expected
- console` — a gateway route only if the workspace shell cannot otherwise reach `expected
- workspaces` — `appsexpected
- workspacesdiscovered
- orchestratordiscovered
- outshinediscovered
- consolediscovered
brief revision 4 assessed as delivered
assessed with 72% confidenceThe initiative’s operator-parity outcome is met end to end in the assembled system, not just as individual stories: the Orchestrator workspace app now renders on the canonical host composition; exposes release plans (read + full action surface) and the operational dashboard over principal‑scoped canonical /orchestrator/* routes; and cross‑initiative questions are handled via the platform Work Queue (projection from Orchestrator to OutShine with exactly‑once resolution back), with the queue reachable from the workspace shell via the Console gateway’s /api/work proxy. Backend authorization remains authoritative and all mutations attribute the real acting principal. Partial‑failure semantics for publishing are preserved exactly and visible in the UI. The standalone UI remains deployed and its control‑plane routes are untouched. Evidence highlights: - Host composition adoption and bespoke conversation region removed (workspaces #133) with tests showing no route rewrites and platform‑owned composition; ADR recorded (#132). - Ops parity: canonical principal‑scoped read in orchestrator (#419); client + UI page in workspaces (#134, #135). - Release plans parity: canonical list/detail reads (#420), client library (#136), read‑only UI (#137). Full mutation set implemented canonically (#421, #422), with client methods (#138) and UI wiring including prepare/edit notes/publish/retry/cancel/reorder (#139). Tests pin acting‑principal attribution and partial‑failure preservation. - Questions to Work Queue: trusted‑producer intake in OutShine (#454); Orchestrator projection + durable mapping and idempotency (#423); exactly‑once resolution callback from OutShine to Orchestrator with HMAC auth (#424). Console gateway exposes /api/work for the shell Work Queue region (#174), demonstrating the route exists (not 404) and reaches the auth gate. - Constraints/invariants respected: no local auth scheme changes (workspace uses scoped session; service‑to‑service paths reuse existing patterns), routing topology preserved (no /w/:id), and no changes to worker protocol/review/deploy behaviour. Where capability lives across repos is cited; surfaces behind other repositories are consumed over their published interfaces, matching the brief’s boundary decisions.
Plan waves — 1 approved wave
planning closed- Wave 1completeAPPROVED16 work items
Deliver operator feature parity in the Orchestrator workspace app by: (1) migrating the app onto the canonical Workspace Host composition; (2) exposing principal-scoped canonical /orchestrator endpoints for releases (read + mutations) and ops; (3) building corresponding UI in apps/orchestrator that consumes those endpoints via the shared API client; (4) projecting Orchestrator questions into the platform Work Queue (OutShine) through a trusted producer path and resolving them back via a service callback; and (5) ensuring the Work Queue is reachable from the workspace shell (gateway route if needed). Break-glass via the standalone UI remains unchanged.
Work items
| # | Title | Repository | State | Issue | PR / CI | Review | |
|---|---|---|---|---|---|---|---|
| 0 | ADR: Canonical host composition adoption and operator-UI boundary (control plane stays; workspace app is the operator UI) | workspaces | COMPLETED | #132 | #140merged · CI passed | c1: approve | |
| 1 ⛓ | Migrate apps/orchestrator onto WorkspaceHostShell and remove bespoke conversation region | workspaces | COMPLETED | #133 | #141merged · CI passed | c1: approve | |
| 2 ⛓ | Canonical principal-scoped ops dashboard read endpoint (controller-side projection) | orchestrator | COMPLETED | #419 | #431merged · CI passed | c1: approve | |
| 3 ⛓ | API client: add ops dashboard canonical method(s) | workspaces | COMPLETED | #134 | #143merged · CI passed | c1: approve | |
| 4 ⛓ | Operational Dashboard page in apps/orchestrator consuming canonical ops endpoint | workspaces | COMPLETED | #135 | #144merged · CI passed | c1: approve | |
| 5 ⛓ | Canonical principal-scoped release plans read endpoints (list + detail) | orchestrator | COMPLETED | #420 | #436merged · CI passed | c1: approve | |
| 6 ⛓ | API client: add release plans read methods (list + detail) | workspaces | COMPLETED | #136 | #145merged · CI passed | c1: comment | |
| 7 ⛓ | Release Plans UI (read-only): list and detail pages consuming canonical endpoints | workspaces | COMPLETED | #137 | #146merged · CI passed | c1: approve | |
| 8 ⛓ | Canonical release mutation endpoints I: plan create, add initiatives, set repositories, target ordering, edit notes, prepare | orchestrator | COMPLETED | #421 | #437merged · CI passed | c1: approve | |
| 9 ⛓ | Canonical release mutation endpoints II: publish, retry, cancel (preserve partial-failure semantics) | orchestrator | COMPLETED | #422 | #438merged · CI passed | c1: approve | |
| 10 ⛓ | API client: add release mutation methods (setup + publish/retry/cancel) | workspaces | COMPLETED | #138 | #147merged · CI passed | c1: approve | |
| 11 ⛓ | Release Plans UI: wire prepare, notes edit, publish, retry, and cancel actions | workspaces | COMPLETED | #139 | #148merged · CI passed | c1: approve | |
| 12 ⛓ | Trusted producer endpoint: create gating WorkItems from Orchestrator (service-auth) | outshine | COMPLETED | #454 | #455merged · CI passed | c1: approve | |
| 13 ⛓ | Projection: raise/sync OutShine WorkItems when Orchestrator questions need a human | orchestrator | COMPLETED | #423 | #430merged · CI passed | c1: approve | |
| 14 ⛓ | Callback: resolve Orchestrator questions from OutShine WorkItem resolution (exactly-once) | orchestrator | COMPLETED | #424 | #434merged · CI passed | c1: approve | |
| 15 ⛓ | Ensure Workspace shell can reach /api/work/*: add/prove gateway proxy route | console | COMPLETED | #174 | #176merged · CI passed | c1: approve |
Release candidate
ELIGIBLEAll work complete — merged, reviewed, and unblocked. Release and deployment remain manual.
502ef67674 · review approve64284ce734 · review approved4ab9564bd · review approveaade4839d3 · review approve486f45544a · review approve143ae57af1 · review approve1e0e8177f6 · review commente4cecf7330 · review approve66a013f7b1 · review approvef018c7de30 · review approvefb46730539 · review approve0d0871050d · review approve69e3c4d061 · review approve4765a94231 · review approvea49cec8d0a · review approveac8f9dc075 · review approveRelease planning
Releases are cut in the Release planning section. Associating this initiative requires an admin role.
Associating an initiative to a release only records the link — it never changes the initiative’s own state or work. Releases are optional.
Questions
agent:openai · 8/14/2026, 12:38:47 PM
Is the cross-initiative question queue a workspace-scoped view only, or should a global view (cross-workspace) also exist, and who can see it?
Authorization and visibility policies for sensitive operator capabilities (release mutations, ops dashboard visibility, and the scope of the cross-initiative question queue) must be decided by the operator. These are product/security posture decisions that materially affect endpoint guards and cannot be safely inferred. We proceed with read-only surfaces while decisions are made.
agent:openai · 8/14/2026, 12:38:47 PM
Should the operational dashboard be visible to any member, or restricted to admins?
Authorization and visibility policies for sensitive operator capabilities (release mutations, ops dashboard visibility, and the scope of the cross-initiative question queue) must be decided by the operator. These are product/security posture decisions that materially affect endpoint guards and cannot be safely inferred. We proceed with read-only surfaces while decisions are made.
agent:openai · 8/14/2026, 12:38:47 PM
Should release mutations (prepare, publish, retry, cancel, create/edit plan) require an admin role, or are workspace members with access sufficient?
Authorization and visibility policies for sensitive operator capabilities (release mutations, ops dashboard visibility, and the scope of the cross-initiative question queue) must be decided by the operator. These are product/security posture decisions that materially affect endpoint guards and cannot be safely inferred. We proceed with read-only surfaces while decisions are made.
Timeline
No events yet.