flower
/
All briefs
complete draft note

On the /roster view under each orchestrator - can we list all active b

canonical · plan

Spec

markdown

hand-off · dispatch

Dispatch

Auto-dispatch

when it reaches planned

Design-loop

design pass before build

This brief is complete — dispatch is closed.

provenance · append-only

Trace

live
or paste a screenshot uploading…
  1. link added 2d ago
    agent · system:commit-trailer
  2. participant joined 2d ago
    system · system:commit-trailer
  3. status change 2d ago
    agent · flower-orchestrator
  4. note added 2d ago

    Build complete on branch flower/roster-daemon-pipeline — commit 2837268 (Brief: #79 trailer). NOT merged, NOT pushed (orchestrator merges). MAPPING RULE (the key decision) — daemon_agents has NO actor_ref column, so a daemon's identity in brief_participants is derived and UNIONed: 1. actor_ref match: canonical role ref `flower-<role>` (flower-orchestrator/ops/refine/other — role-scoped, what the heartbeat path uses), UNIONed with meta.last_actor_ref (the ref it last checked in with, e.g. agent:/mcp:/codex:) EXCEPT shared `operator:`/`system:` refs. Those are deliberately excluded: operator:/system: author a huge share of briefs, so matching them would dump every operator/system brief under a daemon AND across every daemon — the exact bleed we must avoid. 2. session match: brief_participants.session_id is a sessions.id FK (NOT the external id). I match it by joining sessions and comparing sessions.external_session_id == daemon.session_id (the external CLAUDE_CODE_SESSION_ID-style id daemons store). Catches session-scoped participation recorded under a one-off ref. Role-scoped refs + per-daemon session ids ⇒ no cross-daemon bleed (proven by test). Caveat noted below. ACTIVE = status ∉ {complete, cancelled, abandoned} (reuses BriefStatus::isTerminal — note: BriefStatus has no `merged` case; "merged" = merged_into_brief_id IS NOT NULL, handled as a separate WHERE). deferred/idea/refining/planned/dispatched/in_progress/blocked all show. Ordered by status priority (in_progress→blocked→dispatched→planned→refining→idea→deferred) then recency, capped at MAX_ITEMS=8 with a "+N more" indicator. ROUTE NAME USED: route('briefs.show', $id) — /briefs/{brief}, verified in routes/web.php:68. Titles link there. Files (6, +524/-1): - app/Services/Daemons/DaemonPipelineService.php (new) — for(Collection $daemons): array keyed by daemon id. Resolves ALL displayed daemons' pipelines in ONE query (participants⋈briefs⋈sessions⋈projects, ->toBase()), grouped+deduped in PHP. No N+1 across daemons. Public actorRefsForDaemon() documents/exposes the ref derivation for testing. - app/Livewire/Roster/Index.php — computes pipelines over the post-liveness-filter displayed set; sets $a->pipeline + $a->pipeline_total; passes BriefsIndex::STATUS_META. - resources/views/livewire/roster/index.blade.php — compact "pipeline (N)" group under each daemon's row (status dot + #id + title link + status badge + project slug when it differs from the daemon's project). Hidden when empty (chose hide over "no active briefs" for the dense roster). - Tests: DaemonPipelineServiceTest (role-ref mapping + terminal/merged exclusion + ordering, session-id mapping, no cross-daemon bleed, operator/system-ref-doesn't-bleed-via-meta, meta agent-ref IS used, cap+total, empty); Roster/IndexTest (pipeline renders w/ active brief + briefs.show link + terminal excluded; hidden when the daemon has none). Bumped /roster query-audit bound 4→5 (one bounded join), documented inline like the existing /briefs/{brief} note. PERF: exactly 1 added query for the whole roster regardless of daemon count (verified by the query-efficiency audit, now 5). REAL-TIME: v1 renders on load and refreshes via the existing 66e DaemonCheckedIn broadcast re-pull (so it updates whenever any daemon checks in). TRUE brief-change push (broadcasting when a brief's status/participants change, independent of check-ins) is OUT OF SCOPE for v1 — a natural follow-up. Tests: php artisan test → 587 passed, 1 skipped (pre-existing), 0 failures, 4029 assertions. Pint clean on changed PHP. Two design caveats worth a glance on merge: - Two daemons of the SAME role (e.g. two ops) share `flower-ops`, so they'd show the same role-tagged briefs; session-scoped briefs still separate them. Acceptable per the "same role = same lane" reading; flag if you want strict per-process isolation. - Participant status is NOT filtered (a brief shows if the daemon is any participant of an active brief). Brief status is the gate. Easy to tighten to active participants later if stale-participation shows up.

    agent · agent:flower-79-worker(proc-992)
  5. participant joined 2d ago
    system · agent:flower-79-worker(proc-992)
  6. status change 2d ago
    agent · flower-orchestrator
  7. participant joined 2d ago
    system · flower-orchestrator
  8. status change 2d ago
    agent · operator:mike
  9. note added 2d ago

    On the /roster view under each orchestrator - can we list all active briefs/items that are currently in progress/not done/closed that the orchestrator is tagged in? Like a running/real time view of what's currently in the pipeline? Same for ops? Same for refine?

    operator · operator:mike
  10. participant joined 2d ago
    system · operator:mike

epic · dependencies

Relationships

epic parent

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • operator:mike participant · active
  • flower-orchestrator participant · active
  • agent:flower-79-worker(proc-992) participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #1607 execution

scope

Projects

  • flower · primary

dogfood · read-only

Agent’s-eye view

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