flower
/
All briefs
complete draft note flower
epic · UI Feedback/Requests /briefs view: 1) When/if the...

/briefs view UX — textarea auto-expand, remember project select, inline dispatch button, collapsible merge-into

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.

#19 done fresh flower · flower/90-briefs-ux
agent: claude
You are being dispatched from flower Brief #90: /briefs view UX — textarea auto-expand, remember project select, inline dispatch button, collapsible merge-into

Recall pointer:
- Use recall_brief with id 90 for the full folder if you need provenance.

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/90-briefs-ux
- worktree: not specified
- kind: fresh

Current brief spec:
(no spec yet)

This is a direct request, not a fully-specced plan. If it's clear, resolve it. If you hit a blocking ambiguity, call brief_ask (or brief_append) with your questions and flip the brief to `refining` before proceeding — don't guess.

Recent/key trace events:
[1] participant_joined flower-orchestrator: (no body)
[2] note_added flower-orchestrator: Child of #87 (Group A + new /briefs-view items). All work is on the `/briefs` view Livewire components — one worker, one PR, to avoid conflicts.

## Items
- **[1]** On focus of the new-brief textarea, expand its height to ~3–4× default (operator resizes it manually every time). CSS/Alpine on focus; keep expanded while it has content; collapsing when blurred+empty is fine.
- **[9]** Remember the last-used **project** select on the create-new-brief form and default to it on page load (session/localStorage). Same for the **feedback** composer's project/target select.
- **[NEW] Inline dispatch button on qualifying brief rows:** add a quick "Dispatch" action directly on a brief row in the list for briefs that are dispatchable (`is_dispatchable` / status planned + no blockers). Reuse the existing dispatch flow (`DispatchService` / the brief-detail Dispatch form) rather than duplicating logic. Note: this item has real backend-action surface (it triggers dispatch), not pure styling.
- **[NEW] Collapsible "merge into" select:** hide the merge-into select by default; reveal it when the user clicks a "Merge" button (toggle open). Keeps the row/detail UI uncluttered.

## Constraints
- bloom design system (`resources/views/components/ui/*`) + FluxUI; Livewire 4; keep `php artisan test` green; `./vendor/bin/pint`; verify in the real app. Markdown editor for this view is NOT here — it's Brief #81. Commit trailer `Brief: #<this-id>`.
[3] parent_set flower-orchestrator: Grouped under epic #87.
[4] status_change flower-orchestrator: (no body)

Recommended linked context:
{
    "todos": [],
    "scratchpads": []
}

Execution notes:
- Treat the brief as the source of truth.
- Keep work scoped to this dispatch request.
- Use brief_append / brief_update_status when reporting material progress; as your final dispatched-worker step, call brief_dispatch_complete with dispatch_request_id (or brief_id) and actor_ref.
- Codex workers should verify mutating Flower tools with tool_search query `brief_append brief_dispatch_complete flower_feedback` (limit 20) when tool availability is in doubt; report raw SEE/LOAD vs NOT visible instead of silently using local fallbacks.
- Add a git commit trailer `Brief: #90` to every commit for this brief so flower can exact-link commits back to the brief.

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. note added 2d ago

    MERGED to master on MAIN by orchestrator daemon 10 (proc 996). Worker 998 (flower-90-worker, flower-wt2) built commit 0ba9625; merged --no-ff as a4e3790 (merge-base 449a2e8; base was behind current master by #98+config but files disjoint → clean merge). Verified on MAIN: Briefs/IndexTest + Feedback/SubmitTest 26 pass, pint clean, GET /briefs → HTTP 200. Full interactive visual check (focus-expand, remembered select, inline dispatch, collapsible merge) left for operator eyeball on flower.test/briefs. All 4 items shipped; worker flagged that the /feedback composer has no project/target select (only a kind toggle, which got the sticky treatment) — noted for a possible follow-up. No migration/config/job → no config:clear/horizon. Worker 998 closed. Wave 1 (#98 + #90) complete.

    agent · flower-orchestrator
  4. status change 2d ago
    agent · flower-90-worker
  5. dispatched 2d ago

    Dispatch request #19 marked done.

    agent · flower-90-worker
  6. note added 2d ago

    Implemented on branch `flower/90-briefs-ux` (from master tip 449a2e8), commit **0ba9625**. All four items done; `php artisan test` green (642 tests, 1 pre-existing skip), pint clean. **[1] Textarea auto-expand** — `resources/views/livewire/briefs/index.blade.php`: the capture textarea grows to `min-h-[11rem]` (~3×) on focus and stays expanded while it has content; collapses when blurred+empty. Alpine-only (`x-data`/`x-on:focus`/`x-on:blur`), `resize-y` still lets the operator drag further. **[9] Remember selects** — create-brief project select now remembers the operator's last-used primary project in the session (`briefs.capture_project_id`) and defaults to it on load; an explicit `?project=` URL scope still wins (`app/Livewire/Briefs/Index.php`). NOTE: the `/feedback` composer has **no project/target select today** — its only sticky select is the bug/idea/note **kind toggle**, so I applied the same "remember last-used" treatment there (session `feedback.form_kind`, survives submit; `app/Livewire/Feedback/Index.php`). If you actually want a *project* select added to the feedback composer, that's a small follow-up (needs a storage decision — feedback has no project_id, only a JSON `context`). **[NEW] Inline dispatch** — added `dispatchInline()` to `Briefs/Index.php` that reuses `DispatchService::dispatch()` (same path as the brief-detail Dispatch form — no logic duplicated), resolving the target from the configured dispatch default else the brief's primary project. Button renders only on `is_dispatchable` rows; `wire:confirm` guards accidental clicks; server-side approval/dependency guards surface as a notice. **[NEW] Collapsible merge** — the per-row "merge into" select is hidden behind a "Merge" toggle (Alpine `x-show="merging"`, hidden by default). The select stays in the DOM so `mergeBrief` is unaffected. Tests added to `tests/Feature/Briefs/IndexTest.php` (+6: remember-project, query-param precedence, inline dispatch queues packet, button only on dispatchable rows, approval-gated dispatch, merge collapse, textarea expand) and `tests/Feature/Feedback/SubmitTest.php` (+2: kind remembered across loads, kind survives submit). Left for orchestrator: visual verification on MAIN after merge (no served instance in this worktree). Did NOT merge/push or run Horizon/daemons.

    agent · flower-90-worker
  7. participant joined 2d ago
    system · flower-90-worker
  8. dispatched 2d ago

    Dispatch request #19 queued for flower.

    agent · flower-orchestrator
  9. status change 2d ago
    agent · flower-orchestrator
  10. status change 2d ago
    agent · flower-orchestrator
  11. parent set 2d ago

    Grouped under epic #87.

    agent · flower-orchestrator
  12. note added 2d ago

    Child of #87 (Group A + new /briefs-view items). All work is on the `/briefs` view Livewire components — one worker, one PR, to avoid conflicts. ## Items - **[1]** On focus of the new-brief textarea, expand its height to ~3–4× default (operator resizes it manually every time). CSS/Alpine on focus; keep expanded while it has content; collapsing when blurred+empty is fine. - **[9]** Remember the last-used **project** select on the create-new-brief form and default to it on page load (session/localStorage). Same for the **feedback** composer's project/target select. - **[NEW] Inline dispatch button on qualifying brief rows:** add a quick "Dispatch" action directly on a brief row in the list for briefs that are dispatchable (`is_dispatchable` / status planned + no blockers). Reuse the existing dispatch flow (`DispatchService` / the brief-detail Dispatch form) rather than duplicating logic. Note: this item has real backend-action surface (it triggers dispatch), not pure styling. - **[NEW] Collapsible "merge into" select:** hide the merge-into select by default; reveal it when the user clicks a "Merge" button (toggle open). Keeps the row/detail UI uncluttered. ## Constraints - bloom design system (`resources/views/components/ui/*`) + FluxUI; Livewire 4; keep `php artisan test` green; `./vendor/bin/pint`; verify in the real app. Markdown editor for this view is NOT here — it's Brief #81. Commit trailer `Brief: #<this-id>`.

    agent · flower-orchestrator
  13. participant joined 2d ago
    system · flower-orchestrator

epic · dependencies

Relationships

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • flower-orchestrator participant · active
  • flower-90-worker participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #1619 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.