flower
/
All briefs
complete draft mcp flower
epic · Redesign /decisions feed to deliver decision context...

[#216 PR-1] /decisions Display seam — promote provenance + subject + trace onto the card face

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.

#101 done fresh flower · flower/220-decisions-display-seam
agent: claude
You are being dispatched from flower Brief #220: [#216 PR-1] /decisions Display seam — promote provenance + subject + trace onto the card face

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/220-decisions-display-seam
- 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-216-worker: (no body)
[2] note_added flower-216-worker: Child of Brief #216. Tracer-bullet PR — highest UX value, lowest risk. Design doc: `docs/design/216-decisions-feed-redesign.md` §"Sequenced delivery" PR-1 + §"Layout & components" + §"Provenance-chip vocabulary".

## Scope (≈ ≤300 lines)
Promote already-loaded context onto the `/decisions` card glance face. Three new Blade partials under `resources/views/components/decisions/`:
- **`x-decisions.provenance`** — routing row (card's first line): `flex flex-wrap items-center gap-2`. Chips: project (`num text-xs text-fg-muted`, from `briefs/show.blade.php:50`), origin back-link (from brief #N / from feedback #N / epic · title — mirror `briefs/show.blade.php:63-74` at `text-fg-muted`), role-being-asked (`mono-label text-fg-muted` "for · {{ assigned_to ?? 'anyone' }}"), blocking badge (existing `x-ui.badge variant=outline :dot`, `ms-auto` right edge). Takes `:decision` + `:context` array prop (default `['project','origin','role','blocking']`). Inter-chip `·` separators emitted by the container (`@if(!$loop->first)` → `<span class="text-fg-faint" aria-hidden>·</span>`), covering project/origin/role ONLY; blocking badge carved out with `ms-auto`, no separator.
- **`x-decisions.subject-brief`** — "what this is about" block. EXTRACT from the subject section of `detail.blade.php:103-116` so glance + detail share one source. Props `:excerpt-length` (glance 160 / detail 520) + `:bordered` (glance borderless / detail keeps card). Three subject branches: (1) Brief → title (`text-sm text-fg-muted`, normal weight — NEVER font-medium) + `line-clamp-2` spec, guard null spec as `detail.blade.php:112`; (2) non-Brief morph → faint `subject · ClassName #id`; (3) null → `standalone call · no linked subject`.
- **`x-decisions.trace-summary`** — one `mono-label text-fg-faint` line of link counts, bucketed by `class_basename(linkable_type)`: Session/Segment→sessions, Commit→commits (`git-branch`), Feedback→feedback (`inbox`), parent-Brief→epic (`layers`); subject-brief Reference self-link deduped out. Render only non-zero buckets; hide row when all zero.

Wire into `x-decisions.card`: add `:show-subject` (default true; cluster members pass false) + `:show-trace` (default true) props; reading order provenance→header→parent-quote→subject→trace→question→affordance→actions. Cluster banner (`cluster.blade`) calls `x-decisions.provenance :context="['project','origin']"` with uniform-id resolution computed in the CALLER.
In `detail.blade.php`: PR-1 ONLY adds the provenance row at top + swaps inline subject markup for the shared `x-decisions.subject-brief` partial. LEAVE the flat link list untouched (PR-3a regroups it — no collision).

## Plumbing (one eager-load extension, still zero per-card queries)
Add `brief.feedback` + `brief.parent` to BOTH `with()` sets in `app/Livewire/Decisions/Index.php` — the singles query (`:65`) AND the cluster group load (`:89`) — so the feedback/epic origin-chip variants don't lazy-load per card.

## No-regression gate
`x-decisions.affordance` + `AnswersDecisions` UNTOUCHED. Rank invariant: header > question > subject title > provenance/trace (question stays full-strength `text-fg`; subject title is muted/normal-weight). Contrast: every load-bearing element ≥ `text-fg-muted`; `text-fg-faint` only for `·` separators.

## Acceptance
Each card shows project + origin provenance + "what this is about" + role-being-asked BEFORE any click; blocking obvious via lamp+badge only (no danger-tinted body); standalone/non-Brief/no-links degrade gracefully; 80-char headers `line-clamp-2` w/o pushing the badge; `php artisan test` green; `pint` clean.
[3] parent_set flower-216-worker: Grouped under epic #216.

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: #220` 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 1d ago
    agent · system:commit-trailer
  2. participant joined 1d ago
    system · system:commit-trailer
  3. status change 1d ago
    agent · flower-orchestrator
  4. merged 1d ago

    Merged to master as f54c7ac (branch commit 6c0dfa4). #216 PR-1 Display seam: 3 new x-decisions Blade partials (provenance / subject-brief / trace-summary) promote project + origin back-link + role + subject "what this is about" + link-trace onto the /decisions card glance face; card/detail/cluster wiring + Decisions/Index.php eager-load (brief.feedback + brief.parent on BOTH with() sets — zero per-card queries). No-regression gate honored: x-decisions.affordance + AnswersDecisions untouched (diff-verified). Full suite green (1078 passed, 2 skips, +2 card-face tests); pint clean. npm run build ran in MAIN (new Tailwind line-clamp-2 / ms-auto → CSS regenerated; public/build gitignored). No migration, no horizon-reload. Minor follow-up flagged by worker: card API kept to 2 props so cluster members still render own provenance row (trivial future tweak if leaner wanted).

    agent · flower-orchestrator
  5. status change 1d ago
    agent · flower-220-worker
  6. dispatched 1d ago

    Dispatch request #101 marked done.

    agent · flower-220-worker
  7. note added 1d ago

    PR-1 Display seam complete. Branch `flower/220-decisions-display-seam` off master 1d73036; commit 6c0dfa4 (trailer `Brief: #220`, no push — orchestrator merges). Implemented per spec: - 3 new partials under resources/views/components/decisions/: `provenance` (routing row: project · origin back-link · role, blocking badge ms-auto right; :context array default project/origin/role/blocking, container-emitted middots over project/origin/role only; origin precedence feedback>epic>brief-link), `subject-brief` (extracted from detail.blade.php:103-116; :excerpt-length 160/520 + :bordered props; Brief / non-Brief morph / standalone branches; glance line-clamp-2, detail full excerpt), `trace-summary` (linkable_type buckets sessions/commits/feedback/epic, subject self-link deduped, hidden when all zero). - x-decisions.card: added :show-subject/:show-trace props; order provenance→header→parent-quote→subject→trace→question→affordance→actions; blocking badge relocated into provenance; header line-clamp-2. - detail.blade.php: provenance row at top (context minus 'blocking' — header already carries the badge, no dup); subject swapped to shared partial (bordered, 520); flat link list left untouched for PR-3a. - cluster.blade.php: uniform project/brief-id check in the caller → banner project+origin provenance line; members pass show-subject=false. - Index.php: brief.feedback + brief.parent added to BOTH with() sets (:65 singles + :89 cluster) — zero per-card queries. No-regression gate honored: x-decisions.affordance + AnswersDecisions UNTOUCHED (git diff confirms); rank header > question > subject-title (muted/normal-weight) > provenance/trace. Tests: full suite green — 1078 passed / 2 pre-existing skips / 0 fail (`MEILISEARCH_KEY=LARAVEL-HERD ANTHROPIC_API_KEY= ~/bin/php artisan test`). Added 2 card-face tests to IndexTest (provenance+subject+role promoted before any click; feedback-origin chip prefers brief.feedback over the bare brief link). Pint clean on touched PHP. NEW Tailwind utility classes introduced → orchestrator must run `npm run build` in MAIN on merge: `line-clamp-2`, `ms-auto` (both design-mandated; confirmed absent from resources/views before this PR). Scope note: kept the card API to exactly the two props the spec named (:show-subject/:show-trace) — did NOT add a show-provenance prop, so cluster members still render their own provenance row (useful per-member role/blocking; mild project/origin repeat under the banner). Flagging in case the orchestrator wants members leaner — trivial follow-up.

    agent · flower-220-worker
  8. participant joined 1d ago
    system · flower-220-worker
  9. link added 1d ago
    agent · system:brief-autolink
  10. link added 1d ago
    agent · system:brief-autolink
  11. link added 1d ago
    agent · system:brief-autolink
  12. link added 1d ago
    agent · system:brief-autolink
  13. link added 1d ago
    agent · system:brief-autolink
  14. comment 1d ago

    Target branch flower/220-decisions-display-seam is merged to the default branch; suggest marking the brief complete.

    system · system:brief-autolink
  15. participant joined 1d ago
    system · system:brief-autolink
  16. dispatched 1d ago

    Dispatch request #101 queued for flower.

    agent · flower-orchestrator
  17. status change 1d ago
    agent · flower-orchestrator
  18. participant joined 1d ago
    system · flower-orchestrator
  19. parent set 1d ago

    Grouped under epic #216.

    agent · flower-216-worker
  20. note added 1d ago

    Child of Brief #216. Tracer-bullet PR — highest UX value, lowest risk. Design doc: `docs/design/216-decisions-feed-redesign.md` §"Sequenced delivery" PR-1 + §"Layout & components" + §"Provenance-chip vocabulary". ## Scope (≈ ≤300 lines) Promote already-loaded context onto the `/decisions` card glance face. Three new Blade partials under `resources/views/components/decisions/`: - **`x-decisions.provenance`** — routing row (card's first line): `flex flex-wrap items-center gap-2`. Chips: project (`num text-xs text-fg-muted`, from `briefs/show.blade.php:50`), origin back-link (from brief #N / from feedback #N / epic · title — mirror `briefs/show.blade.php:63-74` at `text-fg-muted`), role-being-asked (`mono-label text-fg-muted` "for · {{ assigned_to ?? 'anyone' }}"), blocking badge (existing `x-ui.badge variant=outline :dot`, `ms-auto` right edge). Takes `:decision` + `:context` array prop (default `['project','origin','role','blocking']`). Inter-chip `·` separators emitted by the container (`@if(!$loop->first)` → `<span class="text-fg-faint" aria-hidden>·</span>`), covering project/origin/role ONLY; blocking badge carved out with `ms-auto`, no separator. - **`x-decisions.subject-brief`** — "what this is about" block. EXTRACT from the subject section of `detail.blade.php:103-116` so glance + detail share one source. Props `:excerpt-length` (glance 160 / detail 520) + `:bordered` (glance borderless / detail keeps card). Three subject branches: (1) Brief → title (`text-sm text-fg-muted`, normal weight — NEVER font-medium) + `line-clamp-2` spec, guard null spec as `detail.blade.php:112`; (2) non-Brief morph → faint `subject · ClassName #id`; (3) null → `standalone call · no linked subject`. - **`x-decisions.trace-summary`** — one `mono-label text-fg-faint` line of link counts, bucketed by `class_basename(linkable_type)`: Session/Segment→sessions, Commit→commits (`git-branch`), Feedback→feedback (`inbox`), parent-Brief→epic (`layers`); subject-brief Reference self-link deduped out. Render only non-zero buckets; hide row when all zero. Wire into `x-decisions.card`: add `:show-subject` (default true; cluster members pass false) + `:show-trace` (default true) props; reading order provenance→header→parent-quote→subject→trace→question→affordance→actions. Cluster banner (`cluster.blade`) calls `x-decisions.provenance :context="['project','origin']"` with uniform-id resolution computed in the CALLER. In `detail.blade.php`: PR-1 ONLY adds the provenance row at top + swaps inline subject markup for the shared `x-decisions.subject-brief` partial. LEAVE the flat link list untouched (PR-3a regroups it — no collision). ## Plumbing (one eager-load extension, still zero per-card queries) Add `brief.feedback` + `brief.parent` to BOTH `with()` sets in `app/Livewire/Decisions/Index.php` — the singles query (`:65`) AND the cluster group load (`:89`) — so the feedback/epic origin-chip variants don't lazy-load per card. ## No-regression gate `x-decisions.affordance` + `AnswersDecisions` UNTOUCHED. Rank invariant: header > question > subject title > provenance/trace (question stays full-strength `text-fg`; subject title is muted/normal-weight). Contrast: every load-bearing element ≥ `text-fg-muted`; `text-fg-faint` only for `·` separators. ## Acceptance Each card shows project + origin provenance + "what this is about" + role-being-asked BEFORE any click; blocking obvious via lamp+badge only (no danger-tinted body); standalone/non-Brief/no-links degrade gracefully; 80-char headers `line-clamp-2` w/o pushing the badge; `php artisan test` green; `pint` clean.

    agent · flower-216-worker
  21. participant joined 1d ago
    system · flower-216-worker

epic · dependencies

Relationships

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • flower-216-worker participant · active
  • flower-orchestrator participant · active
  • system:brief-autolink participant · active
  • flower-220-worker participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #4016 execution
  • Commit #3994 result
  • Commit #3996 result
  • Commit #3998 result
  • Commit #4000 result
  • Commit #4002 result

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.