flower
/
All briefs
complete draft feedback flower
from feedback #145 · signal_complete `result` param: schema says type "ob...

Close the auto-resolve gap for orchestrator-routed feedback (+ repair stranded planned records)

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.

#147 done fresh flower
You are being dispatched from flower Brief #276: Close the auto-resolve gap for orchestrator-routed feedback (+ repair stranded planned records)

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: choose an appropriate branch
- worktree: not specified
- kind: fresh

Current brief spec:
# Close the auto-resolve gap for orchestrator-routed feedback (+ repair stranded records)

## Problem
Feedback resolution is meant to be fully automatic (no manual operator step): when a brief carrying `briefs.feedback_id` reaches `complete`, `BriefObserver` → `FeedbackAutoCloseService::addressForCompletedBrief` (Brief #175) flips the source feedback to `addressed`. This works for the **brief-promote** path.

It does NOT work for the **route/signal-promote** path. `feedback_promote(orchestrator)` sets the feedback to `planned` and hands the work off as a `route_feedback` coordination signal, but creates **no brief with `feedback_id`**. So auto-close has no hook and the feedback stays `planned` forever — even after its fix ships. These accumulate as stranded `planned` records.

Impact is a **tracking/hygiene gap, not alarm noise**: `planned` is a separate bucket from `open`, so stranded items do not inflate the `system.open_feedback` health count. But "which feedback is actually resolved" is under-counted and nobody can tell shipped-from-in-flight without a manual code check.

## Root cause (VERIFIED IN CODE, MAIN @ 2eee38e)
- `app/Services/Feedback/FeedbackPromotionService.php`
  - `promoteToBrief()` (~L196) sets `'feedback_id' => $feedback->id` on the new brief (~L217) → those items auto-close. ✅ (verified: fb#139→brief266, #109→224, #110→227, #116→237 all `addressed` on brief-complete.)
  - `routeToOrchestrator()` (L268–360) sets `STATUS_PLANNED` (L336) and enqueues a `route_feedback` signal whose payload **already carries `feedback_id`** (`routeFeedbackSignalPayload`, L548) + a Solo todo + fix-spec scratchpad — but creates **no Brief and no `briefs.feedback_id`**. ❌ This is the gap.
- `app/Services/Feedback/FeedbackAutoCloseService.php` keys entirely off `briefs.feedback_id`; route-promoted feedback is invisible to it.

## Do NOT use "route_feedback signal done" as the auto-close trigger
The `route_feedback` signal is marked `done` when the orchestrator **accepts/dispatches** the route, NOT when the fix merges. Proof: fb#99 (FLOWER-1X, MySQL-1038 sort-mem in EmbedChunks::reconcileCommitChunks) has route signal #84 = `done` (2026-07-04) yet its root cause is still **UNFIXED** (live ops watch). Auto-closing on signal completion would false-close unshipped items. Resolution must track **actual work completion**, not signal acceptance.

## Forward fix (recommended: unify route path onto the brief lifecycle)
Make `routeToOrchestrator` guarantee that every route-promoted feedback ends up with a Brief carrying its `feedback_id`, so the proven Brief #175 auto-close covers it and resolution fires only when the work's brief reaches `complete` (via `brief_dispatch_complete`). This also gives routed work first-class brief provenance and makes both promote paths behave identically. Implementer/reviewer to choose the exact seam:
  - (a) route path creates a lightweight Brief with `feedback_id` at promote time (brief then dispatched like any other), OR
  - (b) the orchestrator stamps `feedback_id` on the work-brief it spins up when draining the `route_feedback` signal (payload already carries `feedback_id`).
  Invariant either way: **route-promoted feedback → brief with `feedback_id` → auto-address on brief `complete`.** Preserve idempotency + the cancelled/abandoned-never-address rule already in `FeedbackAutoCloseService`.

## Backfill / repair of existing stranded records (one-time)
Reconcile existing `planned` (also check `triaged`) feedback that has no completing brief but whose fix **has actually shipped** → mark `addressed` with a resolution note. This MUST verify real shipping per item (matching merge/commit, or the reported issue demonstrably resolved) — NOT a blanket "route signal done" sweep.
- Ship as an artisan reconcile command with `--dry-run` (default) that lists each candidate + the evidence (linked commit/PR, or "no shipped-evidence → skip").
- Only auto-address items with confirmable shipped-fix; report ambiguous ones for ops/operator review instead of force-closing.
- Known ground truth at authoring:
  - **fb#145** (signal_complete schema) — SHIPPED (merge 004b4d8 / commit 7746165). Should end up `addressed`. (Note: this very brief is linked to #145, so completing THIS brief auto-closes #145 via the restored mechanism — a live end-to-end check.)
  - **fb#137** (recall_search outage) — reported RESOLVED (Meili chunks reindexed, note #140). Verify → address.
  - **fb#104** (checkin --project mis-scope) — verify whether the fix shipped or only a workaround exists; address only if shipped.
  - **fb#99** (FLOWER-1X) — **UNFIXED. MUST remain open.** Guards against the false-close trap above; use as a negative test.

## Acceptance criteria
1. A route-promoted feedback auto-resolves to `addressed` when its work ships, with **zero manual steps** (parity with brief-promoted).
2. Reconcile repairs already-shipped stranded records (at minimum #145) and does **not** close genuinely-unshipped ones (#99 stays open).
3. Tests: (a) route-promote → work brief completes → feedback auto-`addressed`; (b) route-promote → work cancelled/abandoned → feedback NOT addressed; (c) reconcile `--dry-run` lists candidates with shipped-evidence and excludes the no-evidence/unfixed ones (#99).
4. `./vendor/bin/pint` clean on touched files; `php artisan test` green.

## Provenance
Surfaced by flower-ops (daemon 52) triaging fb#145 on 2026-07-05; operator (Mike) asked for a durable fix + repair of same-state records. Verified against MAIN @ 2eee38e. Ops watch #15.

Recent/key trace events:
[1] participant_joined flower-ops: (no body)
[2] note_added flower-ops: Seed (flower-ops, from triaging fb#145): feedback promoted via the route/signal path (feedback_promote→routeToOrchestrator) is set to `planned` but gets NO briefs.feedback_id link, so FeedbackAutoCloseService (Brief #175) never fires — route-promoted feedback stays `planned` forever even after its fix ships. Full spec follows.
[3] link_added flower-ops: (no body)
[4] plan_proposed flower-ops: # Close the auto-resolve gap for orchestrator-routed feedback (+ repair stranded records)

## Problem
Feedback resolution is meant to be fully automatic (no manual operator step): when a brief carrying `briefs.feedback_id` reaches `complete`, `BriefObserver` → `FeedbackAutoCloseService::addressForCompletedBrief` (Brief #175) flips the source feedback to `addressed`. This works for the **brief-promote** path.

It does NOT work for the **route/signal-promote** path. `feedback_promote(orchestrator)` sets the feedback to `planned` and hands the work off as a `route_feedback` coordination signal, but creates **no brief with `feedback_id`**. So auto-close has no hook and the feedback stays `planned` forever — even after its fix ships. These accumulate as stranded `planned` records.

Impact is a **tracking/hygiene gap, not alarm noise**: `planned` is a separate bucket from `open`, so stranded items do not inflate the `system.open_feedback` health count. But "which feedback is actually resolved" is under-counted and nobody can tell shipped-from-in-flight without a manual code check.

## Root cause (VERIFIED IN CODE, MAIN @ 2eee38e)
- `app/Services/Feedback/FeedbackPromotionService.php`
  - `promoteToBrief()` (~L196) sets `'feedback_id' => $feedback->id` on the new brief (~L217) → those items auto-close. ✅ (verified: fb#139→brief266, #109→224, #110→227, #116→237 all `addressed` on brief-complete.)
  - `routeToOrchestrator()` (L268–360) sets `STATUS_PLANNED` (L336) and enqueues a `route_feedback` signal whose payload **already carries `feedback_id`** (`routeFeedbackSignalPayload`, L548) + a Solo todo + fix-spec scratchpad — but creates **no Brief and no `briefs.feedback_id`**. ❌ This is the gap.
- `app/Services/Feedback/FeedbackAutoCloseService.php` keys entirely off `briefs.feedback_id`; route-promoted feedback is invisible to it.

## Do NOT use "route_feedback signal done" as the auto-close trigger
The `route_feedback` signal is marked `done` when the orchestrator **accepts/dispatches** the route, NOT when the fix merges. Proof: fb#99 (FLOWER-1X, MySQL-1038 sort-mem in EmbedChunks::reconcileCommitChunks) has route signal #84 = `done` (2026-07-04) yet its root cause is still **UNFIXED** (live ops watch). Auto-closing on signal completion would false-close unshipped items. Resolution must track **actual work completion**, not signal acceptance.

## Forward fix (recommended: unify route path onto the brief lifecycle)
Make `routeToOrchestrator` guarantee that every route-promoted feedback ends up with a Brief carrying its `feedback_id`, so the proven Brief #175 auto-close covers it and resolution fires only when the work's brief reaches `complete` (via `brief_dispatch_complete`). This also gives routed work first-class brief provenance and makes both promote paths behave identically. Implementer/reviewer to choose the exact seam:
  - (a) route path creates a lightweight Brief with `feedback_id` at promote time (brief then dispatched like any other), OR
  - (b) the orchestrator stamps `feedback_id` on the work-brief it spins up when draining the `route_feedback` signal (payload already carries `feedback_id`).
  Invariant either way: **route-promoted feedback → brief with `feedback_id` → auto-address on brief `complete`.** Preserve idempotency + the cancelled/abandoned-never-address rule already in `FeedbackAutoCloseService`.

## Backfill / repair of existing stranded records (one-time)
Reconcile existing `planned` (also check `triaged`) feedback that has no completing brief but whose fix **has actually shipped** → mark `addressed` with a resolution note. This MUST verify real shipping per item (matching merge/commit, or the reported issue demonstrably resolved) — NOT a blanket "route signal done" sweep.
- Ship as an artisan reconcile command with `--dry-run` (default) that lists each candidate + the evidence (linked commit/PR, or "no shipped-evidence → skip").
- Only auto-address items with confirmable shipped-fix; report ambiguous ones for ops/operator review instead of force-closing.
- Known ground truth at authoring:
  - **fb#145** (signal_complete schema) — SHIPPED (merge 004b4d8 / commit 7746165). Should end up `addressed`. (Note: this very brief is linked to #145, so completing THIS brief auto-closes #145 via the restored mechanism — a live end-to-end check.)
  - **fb#137** (recall_search outage) — reported RESOLVED (Meili chunks reindexed, note #140). Verify → address.
  - **fb#104** (checkin --project mis-scope) — verify whether the fix shipped or only a workaround exists; address only if shipped.
  - **fb#99** (FLOWER-1X) — **UNFIXED. MUST remain open.** Guards against the false-close trap above; use as a negative test.

## Acceptance criteria
1. A route-promoted feedback auto-resolves to `addressed` when its work ships, with **zero manual steps** (parity with brief-promoted).
2. Reconcile repairs already-shipped stranded records (at minimum #145) and does **not** close genuinely-unshipped ones (#99 stays open).
3. Tests: (a) route-promote → work brief completes → feedback auto-`addressed`; (b) route-promote → work cancelled/abandoned → feedback NOT addressed; (c) reconcile `--dry-run` lists candidates with shipped-evidence and excludes the no-evidence/unfixed ones (#99).
4. `./vendor/bin/pint` clean on touched files; `php artisan test` green.

## Provenance
Surfaced by flower-ops (daemon 52) triaging fb#145 on 2026-07-05; operator (Mike) asked for a durable fix + repair of same-state records. Verified against MAIN @ 2eee38e. Ops watch #15.
[5] status_change flower-ops: (no body)
[6] note_added flower-ops: Operator (Mike) greenlit this directly on 2026-07-05 ("write up the brief so the gap is closed moving forward + repair same-state records"). Not feature-class, needs_operator_approval=false. Set to `planned`/dispatchable and handing to flower-orchestrator (daemon 47) to dispatch into a clean worktree. Ops (daemon 52) will verify on completion: (1) a route-promoted feedback auto-addresses on work-completion, (2) reconcile repaired #145 (auto-closes via this brief's own feedback_id link) + any other shipped stranded items, and (3) #99 (FLOWER-1X, still unfixed) was NOT force-closed.

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: #276` to every commit for this brief so flower can exact-link commits back to the brief.
- Need an operator call while working this brief? A question ABOUT THIS BRIEF -> brief_ask(276, ...); a standalone decision not tied to the brief -> decision_ask(...). Both expose the full affordance set (confirm | single_choice | multi_choice | text, options + recommended, allow_write_in); prefer async questions over blocking and set is_blocking only when you truly cannot proceed.
- Cited-refs index (Brief #244): when a report / checkpoint / DONE summary cites numbered entities, append a compact `Refs:` block at the END mapping each `#N` to its REAL stored title + status — `#<num>: <title> (<status>)`, one per line (typed prefixes: bare `#N` = brief, `fb#N` feedback, `dec#N` decision, `sess#N` session, `dr#N` dispatch_request). Resolve any title you did not already pull with recall_refs instead of guessing; skip the block on trivial one-liners.

provenance · append-only

Trace

live
or paste a screenshot uploading…
  1. link added 2h ago
    agent · system:commit-trailer
  2. link added 2h ago
    agent · system:commit-trailer
  3. participant joined 2h ago
    system · system:commit-trailer
  4. comment 3h ago

    MERGED to master @ `d2f759b` (orchestrator, 2026-07-05). Branch flower/276-feedback-autoresolve (33c5e33) was built on cd04bdc (pre-#278) but merged CLEAN over master's #278 — git auto-merged the AgentConventions edits (no conflict). No migration in #276. Full suite **1327 tests, 1325 passed, 2 skipped, 0 failed** (8062 assertions). PromptTemplateSeeder run (AgentConventions charter text changed). pint clean. Worker proc 1200 closed. Local stash (bin/setup-worktree-db.sh) restored. DEFERRED reload (low urgency, like #248): #276 adds `ReconcileFeedbackResolution` (likely scheduled) + `FeedbackResolutionReconciler` + `FeedbackPromotionService`/`CommitFeedbackRefParser` changes + new route_feedback-carries-brief_id conventions in AgentConventions. Running daemons/scheduler cache old code, so the new reconciler won't FIRE + the new route_feedback behavior isn't live until the next daemon reset / scheduler restart. No Horizon reload needed (no queue-job code changed). Propagates on next reset.

    agent · flower-orchestrator
  5. status change 3h ago
    agent · flower-276-worker
  6. dispatched 3h ago

    Dispatch request #147 marked done.

    agent · flower-276-worker
  7. comment 3h ago

    BUILD complete on branch `flower/276-feedback-autoresolve` (commit 33c5e33, trailer `Brief: #276`). Not merged — orchestrator owns MAIN merges. ## Forward fix (seam a — unify route path onto the brief lifecycle) `FeedbackPromotionService::routeToOrchestrator` now creates a lightweight autonomous Brief carrying `feedback_id` (origin=feedback, `planned`), reusing any existing seeded brief. `BriefService::create` stamps `briefs.feedback_id` + seed link, so the proven Brief #175 auto-close (BriefObserver → FeedbackAutoCloseService) now covers route-promoted feedback: completing that brief auto-addresses the source feedback — zero manual steps, parity with promote-to-brief. The brief is NOT auto-dispatched (`auto_dispatch_on_planned` stays false → AutoDispatchService no-ops), so the `route_feedback` signal remains the single handoff (no double-dispatch). `brief_id` is threaded into the signal payload, routed context, the Solo todo body, and the fix-spec (instruction flipped from "mark feedback addressed" → "complete brief #N → auto-addresses it"). AgentConventions route_feedback drain note updated to match. Deliberately NOT keyed on "route_feedback signal done" (that fires on route acceptance, not merge — fb#99's signal is done yet unfixed). ## Backfill — `flower:reconcile-feedback-resolution` (idempotent, dry-run default) Repairs stranded `planned`/`triaged` feedback whose fix demonstrably shipped, keyed on hard evidence: a REACHABLE commit with an explicit `Feedback: #<id>` trailer (new `CommitFeedbackRefParser`, sibling of `CommitBriefRefParser`; scans the indexed `commits` table, excludes `unreachable`). Bare `#104` subjects / prose mentions are ignored → ambiguous refs never force-close. Verified against real MAIN history: fb#145 (commit 7746165) ✅ and fb#104 (commit dbe3040) ✅ both carry real `Feedback:` trailers → auto-address; fb#99 and fb#137 carry none → reported for review, NOT closed (the false-close guard). `--apply` required to write; addresses with a resolution citing the commit + a `reconciled_shipped` ledger entry. Live repair on MAIN is the orchestrator's to run. ## Tests / quality New: route-promote→brief-complete auto-addresses; route-promote→cancelled does NOT address; reconciler dry-run lists shipped candidates and excludes no-evidence/unreachable/unfixed (fb#99); parser trailer-vs-prose cases; command dry-run-default + apply. `MEILISEARCH_KEY=LARAVEL-HERD ANTHROPIC_API_KEY= ~/bin/php artisan test` → **1313 passed, 3 pre-existing skips, 0 failures**. `pint` clean on all touched files. Note: completing this dispatch flips #276 → complete, which (via the restored mechanism) auto-closes its linked fb#145 — the live end-to-end check the spec called for.

    agent · flower-276-worker
  8. participant joined 3h ago
    system · flower-276-worker
  9. dispatched 4h ago

    Dispatch request #147 queued for flower.

    agent · flower-orchestrator
  10. status change 4h ago
    agent · flower-orchestrator
  11. participant joined 4h ago
    system · flower-orchestrator
  12. note added 9h ago

    Operator (Mike) greenlit this directly on 2026-07-05 ("write up the brief so the gap is closed moving forward + repair same-state records"). Not feature-class, needs_operator_approval=false. Set to `planned`/dispatchable and handing to flower-orchestrator (daemon 47) to dispatch into a clean worktree. Ops (daemon 52) will verify on completion: (1) a route-promoted feedback auto-addresses on work-completion, (2) reconcile repaired #145 (auto-closes via this brief's own feedback_id link) + any other shipped stranded items, and (3) #99 (FLOWER-1X, still unfixed) was NOT force-closed.

    agent · flower-ops
  13. status change 9h ago
    agent · flower-ops
  14. plan proposed 9h ago

    # Close the auto-resolve gap for orchestrator-routed feedback (+ repair stranded records) ## Problem Feedback resolution is meant to be fully automatic (no manual operator step): when a brief carrying `briefs.feedback_id` reaches `complete`, `BriefObserver` → `FeedbackAutoCloseService::addressForCompletedBrief` (Brief #175) flips the source feedback to `addressed`. This works for the **brief-promote** path. It does NOT work for the **route/signal-promote** path. `feedback_promote(orchestrator)` sets the feedback to `planned` and hands the work off as a `route_feedback` coordination signal, but creates **no brief with `feedback_id`**. So auto-close has no hook and the feedback stays `planned` forever — even after its fix ships. These accumulate as stranded `planned` records. Impact is a **tracking/hygiene gap, not alarm noise**: `planned` is a separate bucket from `open`, so stranded items do not inflate the `system.open_feedback` health count. But "which feedback is actually resolved" is under-counted and nobody can tell shipped-from-in-flight without a manual code check. ## Root cause (VERIFIED IN CODE, MAIN @ 2eee38e) - `app/Services/Feedback/FeedbackPromotionService.php` - `promoteToBrief()` (~L196) sets `'feedback_id' => $feedback->id` on the new brief (~L217) → those items auto-close. ✅ (verified: fb#139→brief266, #109→224, #110→227, #116→237 all `addressed` on brief-complete.) - `routeToOrchestrator()` (L268–360) sets `STATUS_PLANNED` (L336) and enqueues a `route_feedback` signal whose payload **already carries `feedback_id`** (`routeFeedbackSignalPayload`, L548) + a Solo todo + fix-spec scratchpad — but creates **no Brief and no `briefs.feedback_id`**. ❌ This is the gap. - `app/Services/Feedback/FeedbackAutoCloseService.php` keys entirely off `briefs.feedback_id`; route-promoted feedback is invisible to it. ## Do NOT use "route_feedback signal done" as the auto-close trigger The `route_feedback` signal is marked `done` when the orchestrator **accepts/dispatches** the route, NOT when the fix merges. Proof: fb#99 (FLOWER-1X, MySQL-1038 sort-mem in EmbedChunks::reconcileCommitChunks) has route signal #84 = `done` (2026-07-04) yet its root cause is still **UNFIXED** (live ops watch). Auto-closing on signal completion would false-close unshipped items. Resolution must track **actual work completion**, not signal acceptance. ## Forward fix (recommended: unify route path onto the brief lifecycle) Make `routeToOrchestrator` guarantee that every route-promoted feedback ends up with a Brief carrying its `feedback_id`, so the proven Brief #175 auto-close covers it and resolution fires only when the work's brief reaches `complete` (via `brief_dispatch_complete`). This also gives routed work first-class brief provenance and makes both promote paths behave identically. Implementer/reviewer to choose the exact seam: - (a) route path creates a lightweight Brief with `feedback_id` at promote time (brief then dispatched like any other), OR - (b) the orchestrator stamps `feedback_id` on the work-brief it spins up when draining the `route_feedback` signal (payload already carries `feedback_id`). Invariant either way: **route-promoted feedback → brief with `feedback_id` → auto-address on brief `complete`.** Preserve idempotency + the cancelled/abandoned-never-address rule already in `FeedbackAutoCloseService`. ## Backfill / repair of existing stranded records (one-time) Reconcile existing `planned` (also check `triaged`) feedback that has no completing brief but whose fix **has actually shipped** → mark `addressed` with a resolution note. This MUST verify real shipping per item (matching merge/commit, or the reported issue demonstrably resolved) — NOT a blanket "route signal done" sweep. - Ship as an artisan reconcile command with `--dry-run` (default) that lists each candidate + the evidence (linked commit/PR, or "no shipped-evidence → skip"). - Only auto-address items with confirmable shipped-fix; report ambiguous ones for ops/operator review instead of force-closing. - Known ground truth at authoring: - **fb#145** (signal_complete schema) — SHIPPED (merge 004b4d8 / commit 7746165). Should end up `addressed`. (Note: this very brief is linked to #145, so completing THIS brief auto-closes #145 via the restored mechanism — a live end-to-end check.) - **fb#137** (recall_search outage) — reported RESOLVED (Meili chunks reindexed, note #140). Verify → address. - **fb#104** (checkin --project mis-scope) — verify whether the fix shipped or only a workaround exists; address only if shipped. - **fb#99** (FLOWER-1X) — **UNFIXED. MUST remain open.** Guards against the false-close trap above; use as a negative test. ## Acceptance criteria 1. A route-promoted feedback auto-resolves to `addressed` when its work ships, with **zero manual steps** (parity with brief-promoted). 2. Reconcile repairs already-shipped stranded records (at minimum #145) and does **not** close genuinely-unshipped ones (#99 stays open). 3. Tests: (a) route-promote → work brief completes → feedback auto-`addressed`; (b) route-promote → work cancelled/abandoned → feedback NOT addressed; (c) reconcile `--dry-run` lists candidates with shipped-evidence and excludes the no-evidence/unfixed ones (#99). 4. `./vendor/bin/pint` clean on touched files; `php artisan test` green. ## Provenance Surfaced by flower-ops (daemon 52) triaging fb#145 on 2026-07-05; operator (Mike) asked for a durable fix + repair of same-state records. Verified against MAIN @ 2eee38e. Ops watch #15.

    agent · flower-ops
  15. link added 9h ago
    agent · flower-ops
  16. note added 9h ago

    Seed (flower-ops, from triaging fb#145): feedback promoted via the route/signal path (feedback_promote→routeToOrchestrator) is set to `planned` but gets NO briefs.feedback_id link, so FeedbackAutoCloseService (Brief #175) never fires — route-promoted feedback stays `planned` forever even after its fix ships. Full spec follows.

    agent · flower-ops
  17. participant joined 9h ago
    system · flower-ops

epic · dependencies

Relationships

epic parent

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

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

trace · graph

Links

  • Commit #4090 execution
  • Commit #4092 execution
  • Feedback #145 seed

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.