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

#95 PR-8 — Delivery polish + push nudge + orphaned handoff

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.

#122 done fresh flower · flower/124-delivery-polish
agent: claude 3 scratchpads
You are being dispatched from flower Brief #124: #95 PR-8 — Delivery polish + push nudge + orphaned handoff

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/124-delivery-polish
- worktree: not specified
- kind: fresh

Current brief spec:
## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95)
Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator
drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon
death). Keep the `is_blocking` flag provisioned but **no escalation behavior in v1** (deferred post-v1 per
operator — #95 Q21).
**Auto-expire / `expires_at` DROPPED** (operator — #95 Q23: no sensible action on expiry). Decisions stay
open until answered or manually withdrawn/dismissed (manual withdraw already exists via §5.3). Do not add
`expires_at` or a sweep.
Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8 + Q21/Q23 resolutions.
`php artisan test` green + pint. `Brief: #124` trailer.

Recent/key trace events:
[3] plan_proposed flower-refine: ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95)
Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator
drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon
death). Provision `expires_at` sweep + optional `is_blocking` escalation (**behavior deferred — provision
+ flag only** for v1).
Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8. `php artisan test`
green + pint. `Brief: #124` trailer.
[4] parent_set flower-refine: Grouped under epic #95.
[5] dependency_added flower-refine: Now depends on #118 (#95 PR-2 — Events, broadcasts, auto-participant + auto-link (decision_links)).
[6] dependency_added flower-refine: Now depends on #121 (#95 PR-5 — Gated sets (decision_groups, all_required)).
[7] status_change flower-refine: (no body)
[8] spec_snapshot flower-refine: ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95)
Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator
drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon
death). Provision `expires_at` sweep + optional `is_blocking` escalation (**behavior deferred — provision
+ flag only** for v1).
Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8. `php artisan test`
green + pint. `Brief: #124` trailer.
[9] refinement flower-refine: ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95)
Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator
drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon
death). Keep the `is_blocking` flag provisioned but **no escalation behavior in v1** (deferred post-v1 per
operator — #95 Q21).
**Auto-expire / `expires_at` DROPPED** (operator — #95 Q23: no sensible action on expiry). Decisions stay
open until answered or manually withdrawn/dismissed (manual withdraw already exists via §5.3). Do not add
`expires_at` or a sweep.
Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8 + Q21/Q23 resolutions.
`php artisan test` green + pint. `Brief: #124` trailer.
[10] link_added flower-refine: (no body)
[11] link_added flower-refine: (no body)
[12] link_added flower-refine: (no body)
[13] participant_joined flower-121: (no body)
[14] unblocked flower-121: Unblocked — #121 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
        },
        {
            "id": 378,
            "solo_scratchpad_id": "1070",
            "name": "flower-refine — reset handoff (2026-07-04)",
            "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: #124` 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 20h ago
    agent · system:commit-trailer
  2. participant joined 20h ago
    system · system:commit-trailer
  3. merged 21h ago

    Merged flower/124-delivery-polish (#95 PR-8 — DecisionService::redeliverTo/orphaned canonical-ref inheritance + checkin re-delivery + recall_health orphaned-decisions check) to master by flower-orchestrator (daemon 40). Combined suite green 1221/1219 pass/2 skip. No jobs/migrations. Additive daemon-checkin re-delivery — standing daemons pick it up on next reset.

    agent · flower-orchestrator
  4. status change 21h ago
    agent · flower-124-worker
  5. dispatched 21h ago

    Dispatch request #122 marked done.

    agent · flower-124-worker
  6. note added 21h ago

    PR-8 landed on branch `flower/124-delivery-polish` (commit c7f40bf, off master @ 6ec9ea5). NOT merged — orchestrator merges. Scope note: the `decision_released` push nudge + `is_blocking` provisioning already shipped early via #179 (Feedback #79 — wakeAssignee→enqueueDecisionWake→KIND_DECISION_WAKE, orchestrator-drained), and auto-expire/`expires_at` was dropped per operator (#95 Q23). So PR-8 delivers the remaining orphaned-handoff piece + surfacing. What landed: - `DecisionService::redeliverTo(daemon)` — canonical-ref inheritance. A daemon that (re)fills a role via check-in re-enqueues a decision_wake for each released-but-unacked decision addressed to its canonical `{project}-{role}` ref (operator #95 Q20 — successor inherits). Closes the handoff latency gap #179 closed for the live case; decision-id fingerprint dedupes across heartbeats. Guarded to live, process-bearing daemons only. - `DecisionService::orphaned(?project)` — released + unacked + no live reachable assignee; operator/system refs never orphaned. - `DaemonRosterService::checkin()` — best-effort re-delivers inherited decisions after the roster broadcast (swallows errors, mirrors broadcastCheckin; never fails a heartbeat). - `HealthService` — new `system.orphaned_decisions` check surfaces stranded answered work via `recall_health` (warn/stranded with count) for ops/the operator. - Shared `enqueueWake()` helper unifies release-time + check-in wake paths; `DecisionReleased` doc updated. Tests: new `tests/Feature/Decisions/OrphanedHandoffTest.php` (6 cases: checkin re-delivers inherited decision end-to-end; dedupe across repeat check-ins; no-op for stale/processless daemon; skips acked/operator-assigned; orphaned() lists only stranded; recall_health surfaces orphaned). Full suite green: 1215 passed / 2 pre-existing skips. Pint clean. Job/view changes: NONE — no `app/Jobs/*` touched (no horizon-reload needed). BUT the daemon check-in path (`flower:daemon-checkin` command + `DaemonCheckinTool` MCP) now re-delivers on check-in — since the flower MCP/command caches code at boot, standing daemons pick this up on their next reset (not live-on-merge). No migrations; no schema rename.

    agent · flower-124-worker
  7. participant joined 21h ago
    system · flower-124-worker
  8. dispatched 21h ago

    Dispatch request #122 queued for flower.

    agent · flower-orchestrator
  9. status change 21h ago
    agent · flower-orchestrator
  10. participant joined 21h ago
    system · flower-orchestrator
  11. unblocked 1d ago

    Unblocked — #121 reached complete.

    system · flower-121
  12. participant joined 1d ago
    system · flower-121
  13. link added 1d ago
    agent · flower-refine
  14. link added 2d ago
    agent · flower-refine
  15. link added 2d ago
    agent · flower-refine
  16. refinement 2d ago

    ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95) Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon death). Keep the `is_blocking` flag provisioned but **no escalation behavior in v1** (deferred post-v1 per operator — #95 Q21). **Auto-expire / `expires_at` DROPPED** (operator — #95 Q23: no sensible action on expiry). Decisions stay open until answered or manually withdrawn/dismissed (manual withdraw already exists via §5.3). Do not add `expires_at` or a sweep. Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8 + Q21/Q23 resolutions. `php artisan test` green + pint. `Brief: #124` trailer.

    agent · flower-refine
  17. spec snapshot 2d ago

    ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95) Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon death). Provision `expires_at` sweep + optional `is_blocking` escalation (**behavior deferred — provision + flag only** for v1). Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8. `php artisan test` green + pint. `Brief: #124` trailer.

    system · flower-refine
  18. status change 2d ago
    agent · flower-refine
  19. dependency added 2d ago

    Now depends on #121 (#95 PR-5 — Gated sets (decision_groups, all_required)).

    agent · flower-refine
  20. dependency added 2d ago

    Now depends on #118 (#95 PR-2 — Events, broadcasts, auto-participant + auto-link (decision_links)).

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

    Grouped under epic #95.

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

    ## PR-8 — Delivery polish + push nudge + orphaned handoff (child of #95) Optional `decision_released` `DaemonSignal` kind on release (CoordinationQueue dedupe + orchestrator drain → poke). Orphaned-daemon handoff hardening (canonical-ref inheritance, `orphaned` state on daemon death). Provision `expires_at` sweep + optional `is_blocking` escalation (**behavior deferred — provision + flag only** for v1). Deps: PR-2 (#118, release) + PR-5 (#121, gated groups). Design ref: #95 §5.7 / §8. `php artisan test` green + pint. `Brief: #124` trailer.

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

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

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

epic · dependencies

Relationships

depends on

agents · waves

Participants

  • flower-refine participant · active
  • flower-121 participant · active
  • flower-orchestrator participant · active
  • flower-124-worker participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #4054 execution
  • Scratchpad #378 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.