flower
/
All briefs
complete draft note flower
epic · Let's figure out we can turn your "waiting on your a...

#95 PR-2 — Events, broadcasts, auto-participant + auto-link (decision_links)

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.

#60 done fresh flower · flower/95-pr2-events-autolink
agent: claude 2 scratchpads claimed by flower-118
You are being dispatched from flower Brief #118: #95 PR-2 — Events, broadcasts, auto-participant + auto-link (decision_links)

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/95-pr2-events-autolink
- worktree: not specified
- kind: fresh

Current brief spec:
## PR-2 — Events, broadcasts, auto-participant + auto-link (child of #95)
`DecisionPosted` / `DecisionAnswered` / `DecisionReleased` (ShouldBroadcast, on `decisions` +
`project.{id}` + `briefs.{id}`-for-Brief). `decision_links` table + model (brief_links template) +
`DecisionAutoLinkService`. Auto-participant on every mutating call. Live pop-in on the board via Echo with
a `wire:poll.30s` fallback.
Deps: PR-1 (#117). Design ref: #95 §5.4 / §5.6 / §8. `php artisan test` green + pint. `Brief: #118` trailer.

Recent/key trace events:
[1] participant_joined flower-refine: (no body)
[2] note_added flower-refine: Child of #95. PR-2 of the 9-PR plan (§8 of the #95 design doc). Full spec via brief_update_spec.
[3] plan_proposed flower-refine: ## PR-2 — Events, broadcasts, auto-participant + auto-link (child of #95)
`DecisionPosted` / `DecisionAnswered` / `DecisionReleased` (ShouldBroadcast, on `decisions` +
`project.{id}` + `briefs.{id}`-for-Brief). `decision_links` table + model (brief_links template) +
`DecisionAutoLinkService`. Auto-participant on every mutating call. Live pop-in on the board via Echo with
a `wire:poll.30s` fallback.
Deps: PR-1 (#117). Design ref: #95 §5.4 / §5.6 / §8. `php artisan test` green + pint. `Brief: #118` trailer.
[4] parent_set flower-refine: Grouped under epic #95.
[5] dependency_added flower-refine: Now depends on #117 (#95 PR-1 — Tracer: decisions spine (standalone confirm: ask→board→answer→pull→ack)).
[6] status_change flower-refine: (no body)
[7] link_added flower-refine: (no body)
[8] link_added flower-refine: (no body)
[9] participant_joined flower-117: (no body)
[10] unblocked flower-117: Unblocked — #117 reached complete.

Recommended linked context:
{
    "todos": [],
    "scratchpads": [
        {
            "id": 364,
            "solo_scratchpad_id": "1055",
            "name": "flower-refine — reset handoff (2026-07-03)",
            "archived": false,
            "revision": 1
        },
        {
            "id": 375,
            "solo_scratchpad_id": "1067",
            "name": "flower-refine — reset handoff (2026-07-03 #2)",
            "archived": false,
            "revision": 2
        }
    ]
}

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: #118` 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. link added 1d ago
    agent · system:commit-trailer
  3. participant joined 1d ago
    system · system:commit-trailer
  4. merged 1d ago

    #118 (#95 PR-2 events/broadcasts/auto-link) merged to master (affd2c7). MAIN follow-up 4d7d228: the decision_links unique-index auto-name (68 chars) exceeded MySQL's 64-char identifier limit — the ADD UNIQUE ALTER failed mid-migration (columns+PK+FK auto-committed, 4 indexes missing, migration unrecorded) while the worker's sqlite tests passed. Fixed by naming the index explicitly (decision_links_unique); dropped the empty 0-row orphan table (operator-approved) and re-ran migrate → [53] Ran with all 4 indexes + FK. Suite 797/799 green, pint clean, build OK. Worker 1062 closed. Follow-up flagged by worker: smoke-test /decisions live-refresh on MAIN with Reverb (broadcasts verified via Event::fake).

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

    Dispatch request #60 marked done.

    agent · flower-118
  7. note added 1d ago

    PR-2 shipped on flower/95-pr2-events-autolink @ 71ebc9b (Brief: #118 trailer). Every layer exercised. - Events (net-new, ShouldBroadcast): DecisionPosted / DecisionAnswered / DecisionReleased, fanning out on `decisions` + `project.{id}` (when scoped) + `briefs.{id}` (Brief-subject) via a shared DecisionChannels helper. Dispatched from DecisionService (covers every entry point: MCP tools, board, brief shims). Retained BriefQuestionPosted/Answered still fire on briefs.{id} for the brief-detail view. Broadcast payload = new RecallService::decisionSummary (aligned with the MCP decisionPayload). - decision_links: table (brief_links template) + DecisionLink model (reuses BriefLinkRelation) + Decision::links(). DecisionAutoLinkService (bounded): a Brief-subject decision auto-links its subject brief as a `reference` link so PR-4 view-more + PR-9 chunk-weaving read a uniform decision_links surface (PR-9 spec explicitly weaves "linked brief title/excerpt" from decision_links — this feeds it). Standalone decisions link nothing. Idempotent. - Auto-participant on every mutating call: closed the gap — ack on a brief-subject decision now attaches the acker as a brief participant (ask/answer already did via BriefService). - Live board: Decisions\Index subscribes to the `decisions` channel and re-renders on every Decision broadcast (mirrors Roster/DaemonCheckedIn), with a wire:poll.30s blade fallback. New `decisions` + `project.{id}` channel auth (open, like briefs/roster). GATE: `MEILISEARCH_KEY=LARAVEL-HERD ANTHROPIC_API_KEY= ~/bin/php artisan test` → 799 tests, 796 passed / 3 skipped (same PR-1 skips) / 0 failed; pint clean. +9 new tests (DecisionEventsTest, DecisionAutoLinkServiceTest). Migration 2026_07_03_240000_create_decision_links_table applies clean on sqlite (RefreshDatabase across the suite). HANDOFF (orchestrator on MAIN): live Echo pop-in is verified in the worktree only via Event::fake (dispatch + channel fan-out) — the actual Reverb broadcast + browser live-update can only be confirmed on MAIN with Reverb up (analogous to PR-1's Flux-live-render skip). Please smoke the /decisions board live-refresh on MAIN after merge. No new daemons run in the worktree; MAIN's Reverb/Horizon untouched.

    agent · flower-118
  8. link added 1d ago
    agent · flower-118
  9. link added 1d ago
    agent · flower-118
  10. comment 1d ago

    Target branch flower/95-pr2-events-autolink is merged to the default branch; suggest marking the brief complete.

    system · system:brief-autolink
  11. participant joined 1d ago
    system · system:brief-autolink
  12. link added 1d ago
    agent · flower-118
  13. link added 1d ago
    agent · flower-118
  14. status change 1d ago
    agent · flower-118
  15. link added 1d ago
    agent · flower-118
  16. link added 1d ago
    agent · flower-118
  17. dispatched 1d ago

    Dispatch request #60 claimed.

    agent · flower-118
  18. participant joined 1d ago
    system · flower-118
  19. dispatched 1d ago

    Dispatch request #60 queued for flower.

    agent · flower-orchestrator
  20. status change 1d ago
    agent · flower-orchestrator
  21. participant joined 1d ago
    system · flower-orchestrator
  22. unblocked 1d ago

    Unblocked — #117 reached complete.

    system · flower-117
  23. participant joined 1d ago
    system · flower-117
  24. link added 2d ago
    agent · flower-refine
  25. link added 2d ago
    agent · flower-refine
  26. status change 2d ago
    agent · flower-refine
  27. dependency added 2d ago

    Now depends on #117 (#95 PR-1 — Tracer: decisions spine (standalone confirm: ask→board→answer→pull→ack)).

    agent · flower-refine
  28. parent set 2d ago

    Grouped under epic #95.

    agent · flower-refine
  29. plan proposed 2d ago

    ## PR-2 — Events, broadcasts, auto-participant + auto-link (child of #95) `DecisionPosted` / `DecisionAnswered` / `DecisionReleased` (ShouldBroadcast, on `decisions` + `project.{id}` + `briefs.{id}`-for-Brief). `decision_links` table + model (brief_links template) + `DecisionAutoLinkService`. Auto-participant on every mutating call. Live pop-in on the board via Echo with a `wire:poll.30s` fallback. Deps: PR-1 (#117). Design ref: #95 §5.4 / §5.6 / §8. `php artisan test` green + pint. `Brief: #118` trailer.

    agent · flower-refine
  30. note added 2d ago

    Child of #95. PR-2 of the 9-PR plan (§8 of the #95 design doc). Full spec via brief_update_spec.

    agent · flower-refine
  31. participant joined 2d ago
    system · flower-refine

epic · dependencies

Relationships

depends on

agents · waves

Participants

  • flower-refine participant · active
  • flower-117 participant · active
  • flower-orchestrator participant · active
  • flower-118 participant · active
  • system:brief-autolink participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #1740 execution
  • Commit #1744 execution
  • Commit #1733 result
  • Commit #1731 result
  • Session #3439 execution
  • Session #3451 execution
  • Session #3453 execution
  • dispatch_request #60 execution
  • Scratchpad #375 execution
  • Scratchpad #364 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.