Discovered while working #2183 (CDO Phase 1 creative tool registry).
The creative tool registry deliberately omits pipeline_enqueueComicCover. The bare enqueueComicCover() service only queues the render job — the completed cover is attached by the filename hook only if the issue's active cover slot already carries the returned jobId, and that slot write lives in the route factory (routes/pipeline/covers.js#makeCoverRenderHandler: buildRenderSlot + slotKeyForVariant + issuesSvc.updateStageWithLatest + the script-gate patch), not in the service. Wrapping the bare service in a creative tool would silently drop orchestrated covers.
Task: extract the enqueue+persist cover-render flow from makeCoverRenderHandler into a shared service entry point (e.g. renderComicCover(issueId, opts) returning { jobId, slot, ... } and persisting the slot), have the four cover-render routes call it, then add pipeline_enqueueComicCover (and any sibling volume/back-cover render tools) to server/services/creative/tools/pipeline.js as a conductor over that service — so both the route and the orchestrator share one code path.
Do the same audit for any other creative-suite render/generate action whose route handler performs slot/id persistence the bare service omits (the universe render preflight was already inlined into universe_renderUniverseJobs in #2183).
Context: docs/plans/2026-07-04-creative-director-orchestrator.md, part of epic #2182.
Discovered while working #2183 (CDO Phase 1 creative tool registry).
The creative tool registry deliberately omits
pipeline_enqueueComicCover. The bareenqueueComicCover()service only queues the render job — the completed cover is attached by the filename hook only if the issue's active cover slot already carries the returnedjobId, and that slot write lives in the route factory (routes/pipeline/covers.js#makeCoverRenderHandler:buildRenderSlot+slotKeyForVariant+issuesSvc.updateStageWithLatest+ the script-gate patch), not in the service. Wrapping the bare service in a creative tool would silently drop orchestrated covers.Task: extract the enqueue+persist cover-render flow from
makeCoverRenderHandlerinto a shared service entry point (e.g.renderComicCover(issueId, opts)returning{ jobId, slot, ... }and persisting the slot), have the four cover-render routes call it, then addpipeline_enqueueComicCover(and any sibling volume/back-cover render tools) toserver/services/creative/tools/pipeline.jsas a conductor over that service — so both the route and the orchestrator share one code path.Do the same audit for any other creative-suite render/generate action whose route handler performs slot/id persistence the bare service omits (the universe render preflight was already inlined into
universe_renderUniverseJobsin #2183).Context:
docs/plans/2026-07-04-creative-director-orchestrator.md, part of epic #2182.