flower
/
All briefs
idea draft session_capture conductor-client
epic · Epic: Conductor multi-model + multi-app embedding (t...

Result-routing contract — Laravel side, config-gated (Track A)

Dispatch

canonical · plan

Spec

markdown

hand-off · dispatch

Dispatch

Auto-dispatch

when it reaches planned

Design-loop

design pass before build

kind

No dispatch requests yet — dispatch above to generate a copy-paste packet.

provenance · append-only

Trace

live
or paste a screenshot uploading…
  1. parent set 1d ago

    Grouped under epic #201.

    agent · conductor-claude
  2. plan proposed 1d ago

    # Result-routing contract — Laravel side, config-gated (Track A) Repos: **conductor-client** (consumer) + **conductor** (observability). Ships to PROD on the proven foundation, **gated OFF** (zero behavior change). The reusable Laravel half of Phase-4 multi-app result routing; the worker half is built in #205 (Track B). Basis: `_conductor-vodmanager-integration-plan.md` §4. ## Why / the problem Today every app reads the GLOBAL result stream (`embedding_results` / `text_embedding_results`) and XDELs every entry it reads (`ResultConsumer` xAck+xDel). A 2nd app (vodmanager) would race lounge and both mutually destroy each other's results (task_id-only correlation → a non-matching entry is a silent no-op, then XDEL). Fix = per-app result streams `results:{app}:{modality}`. ## conductor-client change (the core — ~6 lines, gated OFF) At `src/Console/ConsumeResultsCommand.php:41` (the single place the result-stream name is decided), behind a new default-false gate: ```php $resultStream = $config['results'] ?? null; // L41 today (global) if (config('conductor.route_results_per_app', false)) { // env CONDUCTOR_ROUTE_RESULTS_PER_APP $resultStream = \LegitPHP\Conductor\Envelope\TaskEnvelope::replyTo(config('conductor.app'), $modality); } // = "results:{app}:{modality}" ``` - **Reuse the producer's own derivation** `TaskEnvelope::replyTo()` (`TaskEnvelope.php:129-132`) — the identical string already stamped on every envelope's `reply_to` (`:108`), so consumer/worker can't drift. - `ResultConsumer` needs **NO edits** (already parameterized on `$stream`; `ensureGroupExists` MKSTREAM auto-creates the per-app stream). Group name can stay (`embedders`/`text_embedders`) since the stream key differs; `consumerName()` is already app-scoped (`:82`). - Add the config key; **unit-test BOTH gate states**. Default false = byte-for-byte today. ## conductor change (observability, additive) The global result-stream pair lives in **3 TRIPLICATED copies** of `streamModalities()` (WatchCommand.php:629, JanitorCommand.php:341, ConductorApiController.php:489) — health/`result_len`, PEL, status. **Refactor the triplication into ONE shared helper first**, then expand each modality's single `results` name into the per-app set so health/status see per-app streams. A distinct **4th surface** is the resolver's `defaultStreamIdentity()` (`GpuRuntimeProfileResolver.php:224/231/234` — the status *identity*, separate from the pod-env write-target at `conductor-runtimes.php` L147/L150/L219/L222) — decide whether status should show per-app too. Keep additive so single-app is unchanged. ## Prereqs (from plan §4) — capture, not necessarily build here - Per-app ACL user `app-vodmanager` on conductor-redis (ops step). - `EmbeddingModel` registry seed (per-adopter — belongs to #209). ## ORDERING (critical) Buildable + shippable NOW gated off (**no hard dependency**). But **do NOT flip `route_results_per_app` in prod until #205 ships worker-side `reply_to`** — the per-app stream is empty until a worker writes it. Gate the consumer and the worker together. ## Gotchas config cache on deploy (`config:clear`); a DB-profile `worker_tuning` can override env; colon-keyed stream + phpredis prefix — add an integration test (all existing streams are prefix-free single tokens). ## Status Draft (idea). **Promote-ready** (the thing originally targeted this session). Activation lockstep with #205.

    agent · conductor-claude
  3. note added 1d ago

    Per-app result routing (results:{app}:{modality}), Laravel side only, config-gated OFF (zero behavior change). ~6-line gated swap at ConsumeResultsCommand.php:41 + per-app stream enumeration in conductor observability. The reusable half of Phase-4; worker half rides Track B (#3). Ships to prod now. Full spec to follow.

    agent · conductor-claude
  4. participant joined 1d ago
    system · conductor-claude

epic · dependencies

Relationships

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • conductor-claude participant · active

trace · graph

Links

No links yet — they accrue as agents work the brief.

scope

Projects

  • conductor · consumer
  • conductor-client · primary

dogfood · read-only

Agent’s-eye view

The literal recall_brief payload an agent gets — same service path as the MCP tool.