manage · config
Config
How flower is wired right now — harness adapters, providers, embedders, and the ingest/search knobs.
Most values come from config/flower.php + .env; the ingest depth default is editable here.
sources
Harness adapters
Transcript sources flower reads. An adapter is offered only when its data dirs are present.
- claude not detected
- codex not detected
- pi not detected
providers
Provider credentials
Presence only — flower never displays secret values.
- Summaries · DeepSeek V4 Flash · json mode configured
- Embeddings · OpenRouter · openai/text-embedding-3-small configured
- Errors · Sentry configured
- Environments · Laravel Forge import missing
ingest · opt-in & bounded
Default index depth
New projects you enable index only the last N days of sessions (per-project overrides live on the Projects page). Leave blank for unbounded — index all history.
summarize · LLM
Summary model
The model that turns each session transcript into goal-scoped segments. flower routes by mode — structured output for Anthropic, JSON for OpenRouter/DeepSeek. Changing it affects new + re-run summaries.
Active: openrouter/deepseek/deepseek-v4-flash · Cheapest; strong summaries (~33× cheaper than Sonnet).
briefs · LLM
Brief model
The default model used to refine briefs (idea → plan). Individual briefs can override this on their detail page.
Default: deepseek/deepseek-v4-flash
recall · vectors
Embedders
| Key | Provider | Model | Dims | Active | Default |
|---|---|---|---|---|---|
| oai_small | openrouter | openai/text-embedding-3-small | 1536 | active | default |
| oai_large | openrouter | openai/text-embedding-3-large | 3072 | — | — |
openrouter · routing
Provider pins
Pin which upstreams OpenRouter routes a model to. Enabled rows inject OpenRouter's
provider object into both
summary and embedding requests, in the order you set. Disabled rows — or rows with no providers — leave those requests
unpinned for OpenRouter to route freely.
-
deepseek/deepseek-v4-flash deepseek baidu akashml novita siliconflow gmicloud parasail atlascloud streamlake wandb digitalocean fallbacks enabled
-
openai/text-embedding-3-large openai fallbacks enabled
-
openai/text-embedding-3-small openai fallbacks enabled
add pin
hybrid index
Search
- semantic ratio
- 0.5
- limit
- 20
- over-fetch ×
- 4
- recency weight
- 0.3
- half-life (days)
- 30
pipeline
Embed
- batch size
- 96
registry
Discovery
- base path
- /Documents/code
- max depth
- 4
- abandoned after (min)
- 120
- excluded
- */zzz_archive/*, */zzz_archive
persisted
Settings
| Key | Value |
|---|---|
| brief_model | {"model":"deepseek\/deepseek-v4-flash"} |
| daemon_reset.active_orchestrator_daemon_id | {"set_by":"lounge-orchestrator","actor_ref":"lounge-orchestrator","daemon_id":38,"project_id":35,"updated_at":"2026-07-05T09:57:26+00:00","solo_process_id":1133} |
| daemon_reset.active_orchestrator_daemon_id:16 | {"set_by":"flower-orchestrator","actor_ref":"flower-orchestrator","daemon_id":54,"project_id":16,"updated_at":"2026-07-05T17:48:02+00:00","solo_process_id":1203,"previous_daemon_id":53} |
| daemon_reset.active_orchestrator_daemon_id:35 | {"set_by":"lounge-orchestrator","actor_ref":"lounge-orchestrator","daemon_id":49,"project_id":35,"updated_at":"2026-07-05T10:02:57+00:00","solo_process_id":1187,"previous_daemon_id":38} |
| feedback_promote.cycle.1bfc6eb95c7f0e3eff7a6c9fb6d78353125c81fc | {"count":2,"entries":[{"at":"2026-07-01T20:19:51+00:00","target":"brief","brief_id":47,"feedback_id":42},{"at":"2026-07-01T20:23:17+00:00","target":"brief","brief_id":48,"feedback_id":37}],"actor_ref":"operator:mike","cycle_key":"2026070120"} |
| mcp.toolset.snapshot | {"hash":"914de47aee43e533e1e1b6e91e8863cbbd4b3e46f6f19b978892409b65fc2bbd","count":71,"names":["brief_answer","brief_append","brief_ask","brief_auto_dispatch_signal","brief_claim","brief_create","brief_depend","brief_design_loop_signal","brief_dispatch","brief_dispatch_cancel","brief_dispatch_complete","brief_merge","brief_open_questions","brief_request_review","brief_review","brief_set_epic_lead_mode","brief_set_parent","brief_undepend","brief_update_spec","brief_update_status","daemon_checkin","daemon_compaction_done","daemon_park","daemon_poke","daemon_register_expected","daemon_request_compaction","daemon_request_reset","daemon_request_winddown","daemon_reset_handoff","daemon_retire_predecessor","daemon_start_reset","daemon_subordinates_ready","daemon_successor_ready","daemon_unpark","daemon_winddown_ready","decision_ack","decision_answer","decision_ask","decision_ask_set","decision_discuss","decision_withdraw","epic_delegate","epic_return","feedback_promote","flower_feedback","inbox_note","note_create","note_reassign","note_unassign","note_update_status","recall_active","recall_brief","recall_briefs","recall_charters","recall_compaction","recall_decisions","recall_dispatch_queue","recall_file_story","recall_health","recall_inbox","recall_open_loops","recall_projects","recall_refs","recall_resume","recall_roster","recall_search","recall_signals","recall_touching","signal_claim","signal_complete","signal_fail"],"tools":[{"name":"brief_answer","title":"Brief: Answer Question","annotations":[],"description":"Answer one open brief question and append an operator_answer event. Requires actor_ref.","inputSchema":{"type":"object","required":["question_id","answer","actor_ref"],"properties":{"answer":{"type":"string","description":"Answer text. Structured JSON answers may also be passed by clients that support them."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"question_id":{"type":"integer","description":"Numeric brief question id."}}}},{"name":"brief_append","title":"Brief: Append Event","annotations":[],"description":"Append a provenance event to a brief through BriefService. Requires actor_ref and auto-attaches the actor as a participant.","inputSchema":{"type":"object","required":["id","kind","actor_ref"],"properties":{"id":{"type":"integer","description":"Numeric brief id."},"body":{"type":"string","description":"Optional event body."},"kind":{"enum":["note_added","agent_question","operator_answer","refinement","plan_proposed","spec_snapshot","dispatched","status_change","participant_joined","link_added","session_captured","comment","project_assigned","parent_set","dependency_added","dependency_removed","unblocked","merged","review_requested","review_passed","review_failed"],"type":"string","description":"Brief event kind."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."}}}},{"name":"brief_ask","title":"Brief: Ask Questions","annotations":[],"description":"Open structured async operator questions on a brief (brief-attached decisions) and append matching agent_question events. Each question picks its affordance with decision_type: confirm (Approve\/Decline), single_choice \/ multi_choice (offer `options`), or text (free-form); an optionless question defaults to text and an option-bearing one to single\/multi. Each option may be a bare string or an object {key,label,recommended,detail}; a recommended option is pre-selected and amber-tagged. Set allow_write_in to also let the operator type their own answer. Parity with standalone decision_ask. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","questions","actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"questions":{"type":"array","items":{"type":"object","required":["header","question"],"properties":{"header":{"type":"string","description":"Short question header."},"options":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Stable machine value returned in the answer. Defaults to the label."},"label":{"type":"string","description":"Human-readable choice shown on the control."},"detail":{"type":"string","description":"Optional secondary line shown under the label."},"recommended":{"type":"boolean","description":"Marks the pre-selected, amber-tagged recommended choice."}}},"description":"Answer choices for single_choice \/ multi_choice. Each is an object {key,label,recommended,detail}; a bare string is also accepted and becomes {key:label}."},"question":{"type":"string","description":"Direct operator question."},"allow_multi":{"type":"boolean","description":"Whether multiple options may be selected."},"decision_type":{"enum":["confirm","single_choice","multi_choice","text"],"type":"string","description":"Answer affordance: confirm, single_choice, multi_choice, or text. Omit to infer from options (optionless \u2192 text, options \u2192 single\/multi)."},"allow_write_in":{"type":"boolean","description":"Also let the operator type their own answer alongside the offered choices."}}},"description":"Questions to open."}}}},{"name":"brief_auto_dispatch_signal","title":"Brief: Auto-Dispatch Signal","annotations":[],"description":"Execute a claimed auto_dispatch coordination signal: re-check eligibility, enforce the auto-dispatch cap, dispatch via DispatchService, and complete\/requeue the signal. Requires actor_ref.","inputSchema":{"type":"object","required":["signal_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"signal_id":{"type":"integer","description":"Claimed auto_dispatch daemon signal id."},"agent_tool":{"type":"string","description":"Optional worker agent tool\/runtime hint recorded on the dispatch request."},"session_id":{"type":"string","description":"Optional worker session id affinity recorded on the dispatch request."},"target_branch":{"type":"string","description":"Optional target branch for the generated dispatch request."},"target_worktree":{"type":"string","description":"Optional target worktree id\/path\/branch."}}}},{"name":"brief_claim","title":"Brief: Claim Dispatch","annotations":[],"description":"Claim one queued dispatch request by request_id or the first queued request for a brief. Requires actor_ref.","inputSchema":{"type":"object","required":["actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id. Claims the first queued request for that brief when request_id is omitted."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"request_id":{"type":"integer","description":"Numeric dispatch request id. Provide request_id or brief_id."},"include_packet":{"type":"boolean","default":false,"description":"Embed the full rendered dispatch packet once at request.prompt. Off by default so the ack stays under the MCP token cap; the packet is always readable via recall_brief(brief_id)."},"spawned_process_id":{"type":"integer","description":"Optional Solo process id. When present the request moves directly to spawned."}}}},{"name":"brief_create","title":"Brief: Create","annotations":[],"description":"Create a draft brief from an agent\/operator note. Requires actor_ref; mutating calls auto-attach the actor as a participant.","inputSchema":{"type":"object","required":["title","origin","actor_ref"],"properties":{"body":{"type":"string","description":"Optional initial note\/spec seed."},"title":{"type":"string","description":"Brief title."},"origin":{"enum":["note","review_synthesis","deep_review","mcp","session_capture","feedback"],"type":"string","description":"Brief origin."},"projects":{"type":"array","items":{"type":"string"},"description":"Optional project ids\/slugs\/names to attach. First project becomes primary."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"feedback_id":{"type":"integer","description":"Optional source feedback id to link. Stamps briefs.feedback_id + a seed link\/link_added event; the feedback auto-closes to addressed when this brief completes."}}}},{"name":"brief_depend","title":"Brief: Add Dependency","annotations":[],"description":"Record that a brief depends on another (a blocker). A brief with any incomplete dependency cannot be dispatched. Rejects self-dependency and dependency cycles. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","depends_on_id","actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id of the dependent (the brief being held back)."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"depends_on_id":{"type":"integer","description":"Numeric brief id of the blocker it depends on."}}}},{"name":"brief_design_loop_signal","title":"Brief: Design-Loop Signal","annotations":[],"description":"Execute a claimed design_dispatch coordination signal (Brief #248): re-check eligibility, enforce the design-loop cap, dispatch a DESIGN worker (runs the \/design skill) via DispatchService, and complete\/requeue the signal. The design dispatch fires BEFORE the build leg; completing it clears needs_design_loop and hands the brief to the build leg. Requires actor_ref.","inputSchema":{"type":"object","required":["signal_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"signal_id":{"type":"integer","description":"Claimed design_dispatch daemon signal id."},"agent_tool":{"type":"string","description":"Optional worker agent tool\/runtime hint recorded on the dispatch request."},"session_id":{"type":"string","description":"Optional worker session id affinity recorded on the dispatch request."},"target_branch":{"type":"string","description":"Optional target branch for the generated design dispatch request."},"target_worktree":{"type":"string","description":"Optional target worktree id\/path\/branch."}}}},{"name":"brief_dispatch","title":"Brief: Dispatch","annotations":[],"description":"Create a fresh or resume dispatch request for a brief. Requires actor_ref and auto-attaches the caller as a participant.","inputSchema":{"type":"object","required":["brief_id","actor_ref"],"properties":{"kind":{"enum":["fresh","resume"],"type":"string","default":"fresh","description":"Dispatch kind."},"brief_id":{"type":"integer","description":"Numeric brief id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"agent_tool":{"type":"string","description":"Optional target agent tool\/runtime hint to record for dependency-chain affinity."},"session_id":{"type":"string","description":"Optional target agent session id to record for dependency-chain affinity."},"target_branch":{"type":"string","description":"Optional target branch."},"include_packet":{"type":"boolean","default":false,"description":"Embed the full rendered dispatch packet once at request.prompt. Off by default so the ack stays under the MCP token cap; the packet is always readable via recall_brief(brief_id)."},"target_project":{"type":"string","description":"Optional target project id\/slug\/name. Defaults to the brief primary\/attached project."},"target_worktree":{"type":"string","description":"Optional target worktree id\/path\/branch."},"resume_session_id":{"type":"string","description":"Required when kind=resume."}}}},{"name":"brief_dispatch_cancel","title":"Brief: Cancel Dispatch","annotations":[],"description":"Cancel a dispatch request so a dead\/abandoned dispatch no longer wedges the brief rollup. Requires actor_ref.","inputSchema":{"type":"object","required":["dispatch_request_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"dispatch_request_id":{"type":"integer","description":"Numeric dispatch request id."}}}},{"name":"brief_dispatch_complete","title":"Brief: Complete Dispatch","annotations":[],"description":"Mark a dispatch request done by dispatch_request_id or the caller's active request for a brief. Requires actor_ref.","inputSchema":{"type":"object","required":["actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id. Completes the caller's active request for that brief when dispatch_request_id is omitted."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"dispatch_request_id":{"type":"integer","description":"Numeric dispatch request id. Provide dispatch_request_id or brief_id."}}}},{"name":"brief_merge","title":"Brief: Merge","annotations":[],"description":"Collapse one or more source briefs into a survivor brief. Sources are cancelled and point at the survivor; links, participants, dependencies, and children are re-pointed. Requires actor_ref.","inputSchema":{"type":"object","required":["survivor_id","source_ids","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"source_ids":{"type":"array","items":{"type":"integer"},"description":"Numeric source brief ids to collapse into the survivor."},"survivor_id":{"type":"integer","description":"Numeric brief id that survives the merge."}}}},{"name":"brief_open_questions","title":"Brief: Open Questions","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List unanswered async operator questions for a brief.","inputSchema":{"type":"object","required":["brief_id"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id."}}}},{"name":"brief_request_review","title":"Brief: Request Adversarial Review","annotations":[],"description":"Orchestrator manual-fire: mark a brief as needing an adversarial review before it can complete, and return a review packet to hand an independent reviewer. Holds the finished workset at in_review (or holds it once the in-flight dispatch completes). Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","actor_ref"],"properties":{"force":{"type":"boolean","description":"Set a sticky per-brief flag so every future completion of this brief is also gated on a passing review."},"scope":{"type":"string","description":"Optional review scope note (default: the workset diff, not a full re-verify)."},"mandate":{"type":"string","description":"Optional extra mandate\/context for the reviewer; recorded on the review_requested event."},"brief_id":{"type":"integer","description":"Numeric brief id to fire a review on."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"reviewer_harness":{"type":"string","description":"Optional harness hint for the reviewer (choose one different from the worker's for independence)."}}}},{"name":"brief_review","title":"Brief: Submit Adversarial Review Verdict","annotations":[],"description":"Submit a structured adversarial-review verdict (PASS | REQUEST_CHANGES | BLOCK) on a brief's finished workset. PASS lets the brief complete; a fail records the findings and auto-bounces a fix to the original worker. Auto-attaches the caller as a reviewer participant. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","verdict","actor_ref"],"properties":{"summary":{"type":"string","description":"Optional one-line summary of the verdict, recorded on the review event."},"verdict":{"enum":["PASS","REQUEST_CHANGES","BLOCK"],"type":"string","description":"The review outcome. PASS completes; REQUEST_CHANGES \/ BLOCK bounces a fix to the worker."},"brief_id":{"type":"integer","description":"Numeric brief id under review."},"findings":{"type":"array","items":{"type":"object","properties":{"file":{"type":"string","description":"Affected file path."},"line":{"type":"integer","description":"Affected line, if applicable."},"claim":{"type":"string","description":"The \"done\" claim being challenged."},"severity":{"type":"string","description":"e.g. P0 \/ P1 \/ high \/ medium."},"refutation":{"type":"string","description":"Why the claim does not hold \/ what breaks."}}},"description":"Structured findings backing a REQUEST_CHANGES \/ BLOCK verdict."},"actor_ref":{"type":"string","description":"Caller actor ref (the reviewer). Required for all mutating brief tools."},"reviewer_harness":{"type":"string","description":"The harness you reviewed as (recorded for independence provenance)."},"dispatch_request_id":{"type":"integer","description":"Optional id of the worker dispatch whose workset you reviewed."}}}},{"name":"brief_set_epic_lead_mode","title":"Brief: Set Epic-Lead Mode","annotations":[],"description":"Pin a brief to (or off) the epic-lead pipeline by setting meta.epic_lead \u2208 {auto, force, never}. force = the orchestrator auto-spawns a task-scoped epic lead on pickup; never = MAIN handles the epic inline; auto = heuristic + MAIN judgment. Requires actor_ref and auto-attaches the caller as a participant; records a provenance event on any change.","inputSchema":{"type":"object","required":["brief_id","mode","actor_ref"],"properties":{"mode":{"enum":["auto","force","never"],"type":"string","description":"Epic-lead mode: force (auto-spawn a task-scoped lead on pickup), never (MAIN handles inline), or auto (heuristic + MAIN judgment)."},"brief_id":{"type":"integer","description":"Numeric brief id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."}}}},{"name":"brief_set_parent","title":"Brief: Set Epic Parent","annotations":[],"description":"Group a brief under an epic parent, or clear it by omitting parent_id (or passing null). Rejects self-parenting and parent cycles. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id to (re)group."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"parent_id":{"type":"integer","description":"Numeric epic parent brief id. Omit or pass null to clear the parent."}}}},{"name":"brief_undepend","title":"Brief: Remove Dependency","annotations":[],"description":"Remove a depends-on edge between two briefs. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","depends_on_id","actor_ref"],"properties":{"brief_id":{"type":"integer","description":"Numeric brief id of the dependent."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."},"depends_on_id":{"type":"integer","description":"Numeric brief id of the blocker to detach."}}}},{"name":"brief_update_spec","title":"Brief: Update Spec","annotations":[],"description":"Overwrite a brief spec through BriefService, preserving the prior spec as a spec_snapshot event. Requires actor_ref.","inputSchema":{"type":"object","required":["id","spec","actor_ref"],"properties":{"id":{"type":"integer","description":"Numeric brief id."},"spec":{"type":"string","description":"New canonical brief spec text."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."}}}},{"name":"brief_update_status","title":"Brief: Update Status","annotations":[],"description":"Update a brief status through the brief service, preserving dispatch rollup guards. Requires actor_ref.","inputSchema":{"type":"object","required":["brief_id","status","actor_ref"],"properties":{"status":{"enum":["idea","refining","planned","dispatched","in_progress","blocked","in_review","deferred","complete","cancelled","abandoned"],"type":"string","description":"Brief status."},"brief_id":{"type":"integer","description":"Numeric brief id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating brief tools."}}}},{"name":"daemon_checkin","title":"Daemon: Check In","annotations":[],"description":"Heartbeat a standing daemon into the roster. Requires actor_ref.","inputSchema":{"type":"object","required":["role","actor_ref"],"properties":{"role":{"enum":["orchestrator","ops","refine","lead","other"],"type":"string","description":"Daemon role."},"usage":{"type":"object","description":"Optional structured usage counters for this daemon."},"project":{"type":"string","description":"Optional project identifier (slug, name, or id)."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."},"session_id":{"type":"string","description":"Optional harness\/session identifier for this daemon."},"context_size":{"type":"integer","description":"Optional current context size for compaction decisions."},"epic_brief_id":{"type":"integer","description":"Epic brief id for a task-scoped lead daemon (role=lead). Scopes lead identity per-epic so two leads on different epics never collide; omit for the standing roles."},"current_cadence":{"enum":["fast","slow","dormant"],"type":"string","description":"Current polling cadence (fast|slow|dormant). Records your ACTIVE cadence; the roster widens the MIA window only for a persisted dormant cadence. Poll cadence sets WORK frequency, not the heartbeat interval \u2014 heartbeat on the fixed interval regardless of cadence."},"solo_process_id":{"type":"integer","description":"Optional Solo process id for this daemon."},"model_context_window":{"type":"integer","description":"Optional model context window for this daemon\/harness. Used to compute context percentage."}}}},{"name":"daemon_compaction_done","title":"Daemon: Compaction Done","annotations":[],"description":"Mark daemon compaction as complete after the compacted or replacement daemon resumes. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_park","title":"Daemon: Park (deliberate hold)","annotations":[],"description":"Mark a daemon as deliberately PARKED \u2014 an intentional, alive-but-quiet hold (e.g. it drained its queue and stopped arming its heartbeat while awaiting an operator go-ahead). Parked is distinct from dead: it stays visible + un-decayed on the roster so operators and MIA\/replacement logic do not misread the hold as a crash. A later check-in (or daemon_unpark) clears it. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"note":{"type":"string","description":"Optional short reason for the park (recorded in the daemon audit trail), e.g. \"queue drained; awaiting operator answers on #36\/#144\"."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_poke","title":"Daemon: Poke","annotations":[],"description":"Queue a poke signal for the orchestrator to deliver to a daemon. Requires actor_ref; never injects into Solo directly.","inputSchema":{"type":"object","required":["actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id. Provide id or daemon."},"daemon":{"type":"string","description":"Daemon ref: id, solo_process_id, actor_ref, or role. Provide id or daemon."},"project":{"type":"string","description":"Optional project identifier to disambiguate daemon refs."},"actor_ref":{"type":"string","description":"Caller actor ref."}}}},{"name":"daemon_register_expected","title":"Daemon: Register Expected","annotations":[],"description":"Register an intended daemon placeholder before it checks in. Requires actor_ref.","inputSchema":{"type":"object","required":["role","actor_ref"],"properties":{"role":{"enum":["orchestrator","ops","refine","lead","other"],"type":"string","description":"Expected daemon role."},"project":{"type":"string","description":"Optional project identifier (slug, name, or id)."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."},"session_id":{"type":"string","description":"Optional harness\/session identifier if already known."}}}},{"name":"daemon_request_compaction","title":"Daemon: Request Compaction","annotations":[],"description":"Mark a daemon as needing operator\/agent compaction. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_request_reset","title":"Daemon: Request Reset","annotations":[],"description":"Queue a make-before-break daemon reset signal. Requires actor_ref; never spawns or closes directly.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Predecessor daemon agent id."},"reason":{"type":"string","description":"Optional reset reason. Defaults to manual."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_request_winddown","title":"Daemon: Request Wind-Down","annotations":[],"description":"Ask a daemon to finish\/park work, write a handoff, and stop looping. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_reset_handoff","title":"Daemon: Reset Handoff (transfer baton)","annotations":[],"description":"After a reset successor reports ready, transfer the orchestrator baton to it and mark the predecessor handed_off\/wind-down-ready. Requires actor_ref.","inputSchema":{"type":"object","required":["predecessor_id","successor_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."},"successor_id":{"type":"integer","description":"Successor daemon agent id (receives the baton)."},"predecessor_id":{"type":"integer","description":"Predecessor daemon agent id (baton holder being reset)."}}}},{"name":"daemon_retire_predecessor","title":"Daemon: Retire Predecessor (N closes O)","annotations":[],"description":"The reset successor closes the handed-off predecessor after the baton transfer (new daemon closes old daemon). Requires actor_ref.","inputSchema":{"type":"object","required":["predecessor_id","successor_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."},"successor_id":{"type":"integer","description":"Successor daemon agent id (the closer; must hold the baton for orchestrator resets)."},"predecessor_id":{"type":"integer","description":"Predecessor daemon agent id (handed-off daemon to close)."}}}},{"name":"daemon_start_reset","title":"Daemon: Start Reset (spawn successor)","annotations":[],"description":"Baton holder executes a claimed reset signal: spawn the successor top-level and keep the predecessor live (make-before-break). Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Predecessor daemon agent id (the daemon being reset)."},"handoff":{"type":"object","description":"Optional handoff payload passed to the successor spawn (e.g. handoff scratchpad ref)."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_subordinates_ready","title":"Daemon: Subordinates Ready","annotations":[],"description":"Check whether all non-orchestrator daemons in a project are wind-down ready.","inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Optional project identifier (slug, name, or id). Omit for global\/unassigned daemons."}}}},{"name":"daemon_successor_ready","title":"Daemon: Successor Ready","annotations":[],"description":"A reset successor reports it has checked in and is ready for handoff. Requires actor_ref.","inputSchema":{"type":"object","required":["predecessor_id","successor_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."},"successor_id":{"type":"integer","description":"Successor daemon agent id."},"predecessor_id":{"type":"integer","description":"Predecessor daemon agent id."}}}},{"name":"daemon_unpark","title":"Daemon: Unpark (wake a parked daemon)","annotations":[],"description":"Clear a park WITHOUT a full check-in \u2014 the daemon status re-derives from its actual recent activity (live \/ stale \/ dead), so an unpark is honest about how quiet it has really been. A normal check-in un-parks on its own; this is the explicit wake for the operator\/orchestrator. No-op if the daemon is not parked. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"daemon_winddown_ready","title":"Daemon: Wind-Down Ready","annotations":[],"description":"Mark a daemon ready to close after it has written its wind-down handoff. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Daemon agent id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating daemon tools."}}}},{"name":"decision_ack","title":"Decision: Acknowledge","annotations":[],"description":"Acknowledge that you have received a released decision answer \u2014 a delivered-once ledger so recall_decisions stops returning it. Requires actor_ref.","inputSchema":{"type":"object","required":["decision_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"decision_id":{"type":"integer","description":"Numeric decision id."}}}},{"name":"decision_answer","title":"Decision: Answer","annotations":[],"description":"Answer an open decision. The decision is released on answer so the assigned daemon can pull it via recall_decisions. Requires actor_ref.","inputSchema":{"type":"object","required":["decision_id","answer","actor_ref"],"properties":{"answer":{"type":"string","description":"Answer text. Structured JSON answers may also be passed by clients that support them."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"decision_id":{"type":"integer","description":"Numeric decision id."}}}},{"name":"decision_ask","title":"Decision: Ask","annotations":[],"description":"Open a standalone decision record (a \"waiting on your call\" moment) for the operator to answer in the \/decisions board. Pick the affordance with decision_type: confirm (Approve\/Decline, the default), single_choice \/ multi_choice (offer `options`), or text (free-form). Each option may be a bare string or an object {key,label,recommended,detail}; a recommended option is pre-selected and amber-tagged. Set allow_write_in to also let the operator type their own answer. The answer routes back to the caller's canonical role via recall_decisions. Requires actor_ref.","inputSchema":{"type":"object","required":["header","question","actor_ref"],"properties":{"header":{"type":"string","description":"Short decision header."},"options":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Stable machine value returned in the answer. Defaults to the label."},"label":{"type":"string","description":"Human-readable choice shown on the control."},"detail":{"type":"string","description":"Optional secondary line shown under the label."},"recommended":{"type":"boolean","description":"Marks the pre-selected, amber-tagged recommended choice."}}},"description":"Answer choices for single_choice \/ multi_choice. Each is an object {key,label,recommended,detail}; a bare string is also accepted and becomes {key:label}."},"project":{"type":"string","description":"Optional project slug\/name\/id. Null = global board only."},"question":{"type":"string","description":"The call the operator needs to make."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"allow_multi":{"type":"boolean","description":"Whether multiple options may be selected."},"assigned_to":{"type":"string","description":"Canonical {project}-{role} ref to route the answer to. Defaults to the caller's canonical ref."},"is_blocking":{"type":"boolean","description":"Whether the caller is blocked until this is answered."},"decision_type":{"enum":["confirm","single_choice","multi_choice","text"],"type":"string","description":"Answer affordance: confirm (default), single_choice, multi_choice, or text."},"allow_write_in":{"type":"boolean","description":"Also let the operator type their own answer alongside the offered choices."},"parent_answer_id":{"type":"integer","description":"Thread this as a follow-up: the answer_id (from recall_decisions) of the answer this call hangs off. The board quotes it as \"follow-up to your answer\"."}}}},{"name":"decision_ask_set","title":"Decision: Ask a gated set","annotations":[],"description":"Open a *gated set* of decisions that the operator answers as a bound cluster (#95 \u00a75.9). With gate=all_required (the default) none of the members are delivered until every one is answered \u2014 then they all release together. Pass the members as `decisions` (each is a decision_ask body: header, question, decision_type, options, allow_multi, allow_write_in). Group-level project \/ assigned_to \/ is_blocking apply to every member. Liveness: if you no longer need one member, decision_withdraw it \u2014 it drops out of the gate so the set can still complete. Requires actor_ref.","inputSchema":{"type":"object","required":["decisions","actor_ref"],"properties":{"gate":{"enum":["independent","all_required"],"type":"string","description":"Release policy: all_required (default) holds every member until all are answered, then delivers together; independent releases each on answer."},"label":{"type":"string","description":"Optional label for the bound cluster (shown on the held banner)."},"project":{"type":"string","description":"Optional project slug\/name\/id applied to every member. Null = global board only."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"decisions":{"type":"array","items":{"type":"object","required":["header","question"],"properties":{"header":{"type":"string","description":"Short decision header."},"options":{"type":"array","description":"Answer choices for single_choice \/ multi_choice (bare strings or {key,label,recommended,detail})."},"question":{"type":"string","description":"The call the operator needs to make."},"allow_multi":{"type":"boolean","description":"Whether multiple options may be selected."},"is_blocking":{"type":"boolean","description":"Whether this member blocks the caller."},"decision_type":{"enum":["confirm","single_choice","multi_choice","text"],"type":"string","description":"Answer affordance: confirm (default), single_choice, multi_choice, or text."},"allow_write_in":{"type":"boolean","description":"Also let the operator type their own answer."}}},"description":"The members of the set \u2014 at least two. Each is a decision_ask body."},"assigned_to":{"type":"string","description":"Canonical {project}-{role} ref the whole set routes back to. Defaults to the caller's canonical ref."},"is_blocking":{"type":"boolean","description":"Whether the caller is blocked until the set is answered (applies to every member)."}}}},{"name":"decision_discuss","title":"Decision: Discuss","annotations":[],"description":"Reply in a non-resolving discussion thread on an open decision. Use when recall_decisions returns awaiting_turn=daemon; post a concise clarification reply instead of acking. Requires actor_ref.","inputSchema":{"type":"object","required":["decision_id","body","actor_ref"],"properties":{"body":{"type":"string","description":"Non-resolving discussion message body."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"decision_id":{"type":"integer","description":"Numeric decision id."}}}},{"name":"decision_withdraw","title":"Decision: Withdraw","annotations":[],"description":"Withdraw an open decision you no longer need answered \u2014 it drops off the \/decisions board. When the decision belongs to a gated set (decision_ask_set), withdrawing it removes it from the gate's denominator (\u00a75.3 liveness), so an all_required set can still complete when a looping daemon stops needing one of its members. Requires actor_ref.","inputSchema":{"type":"object","required":["decision_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Caller actor ref. Required for all mutating decision tools."},"decision_id":{"type":"integer","description":"Numeric decision id to withdraw."}}}},{"name":"epic_delegate","title":"Epic: Delegate (MAIN -> lead)","annotations":[],"description":"Queue an epic_delegate coordination signal from MAIN to the lead that owns an epic. Project-scoped, null-targeted, keyed on epic_brief_id so a successor lead drains it. Requires actor_ref.","inputSchema":{"type":"object","required":["epic_brief_id","project","action","actor_ref"],"properties":{"note":{"type":"string","description":"Optional human-readable note folded into the payload."},"action":{"type":"string","description":"Epic action, e.g. delegate: operator_answer|child_added|merged|abort|poke; return: merge|retire."},"payload":{"type":"object","description":"Optional extra structured payload; epic_brief_id\/action\/note are set canonically and win over duplicate keys."},"project":{"type":"string","description":"Project scope (slug\/name\/id). The signal is enqueued null-targeted within this project."},"actor_ref":{"type":"string","description":"Caller actor ref (requested_by)."},"epic_brief_id":{"type":"integer","description":"The epic (parent brief) id this signal is keyed on. Dedup + drain routing use it."}}}},{"name":"epic_return","title":"Epic: Return (lead -> MAIN)","annotations":[],"description":"Queue an epic_return coordination signal from a lead up to whichever daemon holds the MAIN baton. Project-scoped, null-targeted, keyed on epic_brief_id and reset-robust; re-enqueue idempotently each heartbeat until the state change is observed. Requires actor_ref.","inputSchema":{"type":"object","required":["epic_brief_id","project","action","actor_ref"],"properties":{"note":{"type":"string","description":"Optional human-readable note folded into the payload."},"action":{"type":"string","description":"Epic action, e.g. delegate: operator_answer|child_added|merged|abort|poke; return: merge|retire."},"payload":{"type":"object","description":"Optional extra structured payload; epic_brief_id\/action\/note are set canonically and win over duplicate keys."},"project":{"type":"string","description":"Project scope (slug\/name\/id). The signal is enqueued null-targeted within this project."},"actor_ref":{"type":"string","description":"Caller actor ref (requested_by)."},"epic_brief_id":{"type":"integer","description":"The epic (parent brief) id this signal is keyed on. Dedup + drain routing use it."}}}},{"name":"feedback_promote","title":"Feedback: Promote","annotations":[],"description":"Promote a flower feedback record into the right action funnel. Notes are self-handled, bugs\/MCP\/Sentry can route autonomously to orchestrator work, and ideas\/feature-class feedback become operator-gated briefs. Mutating; requires actor_ref.","inputSchema":{"type":"object","required":["id","to","actor_ref"],"properties":{"id":{"type":"integer","description":"Feedback id."},"to":{"enum":["brief","orchestrator"],"type":"string","description":"Promotion target: brief or orchestrator."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for this mutating tool."},"cycle_key":{"type":"string","description":"Optional stable routing cycle key recorded in promotion metadata. Defaults to the current hour."}}}},{"name":"flower_feedback","title":"Flower: Submit Feedback","annotations":[],"description":"Report feedback about flower or its MCP surface: a bug, a note, an idea, or an MCP issue (a tool that behaved wrong, returned a bad shape, or was missing). NOT read-only \u2014 it persists a feedback record the operator reviews at \/feedback. Use it whenever flower misbehaves, a recall_* tool returns something surprising, or you notice something worth improving while dogfooding.","inputSchema":{"type":"object","required":["kind","summary"],"properties":{"kind":{"enum":["bug","note","idea","mcp_issue"],"type":"string","description":"What kind of feedback: bug | note | idea | mcp_issue."},"detail":{"type":"string","description":"Optional longer detail: repro steps, the bad output, context, etc."},"source":{"type":"string","description":"Who is reporting (e.g. an agent\/harness name). Defaults to \"agent\"."},"context":{"type":"object","description":"Optional structured context (e.g. {\"tool\":\"recall_search\",\"query\":\"\u2026\",\"scope\":\"global\",\"observed\":\"empty text\"})."},"summary":{"type":"string","description":"A concise one-line summary (\u22645000 chars; put longer content in `detail`)."}}}},{"name":"inbox_note","title":"Inbox: Note","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Read one operator inbox note by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"Operator note id."}}}},{"name":"note_create","title":"Note: Create","annotations":[],"description":"Create an operator inbox note, optionally assigned to a project. Requires actor_ref.","inputSchema":{"type":"object","required":["body","actor_ref"],"properties":{"body":{"type":"string","description":"Operator note body."},"project":{"type":"string","description":"Optional project identifier (slug, name, or id). Omit to create an unassigned note."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating inbox tools."}}}},{"name":"note_reassign","title":"Note: Reassign","annotations":[],"description":"Reassign an operator inbox note to another project. Requires actor_ref.","inputSchema":{"type":"object","required":["id","project","actor_ref"],"properties":{"id":{"type":"integer","description":"Operator note id."},"project":{"type":"string","description":"Target project identifier (slug, name, or id)."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating inbox tools."}}}},{"name":"note_unassign","title":"Note: Unassign","annotations":[],"description":"Remove the project assignment from an operator inbox note. Requires actor_ref.","inputSchema":{"type":"object","required":["id","actor_ref"],"properties":{"id":{"type":"integer","description":"Operator note id."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating inbox tools."}}}},{"name":"note_update_status","title":"Note: Update Status","annotations":[],"description":"Update an operator inbox note status. Requires actor_ref.","inputSchema":{"type":"object","required":["id","status","actor_ref"],"properties":{"id":{"type":"integer","description":"Operator note id."},"status":{"enum":["open","acknowledged","handled","dismissed"],"type":"string","description":"Note status."},"actor_ref":{"type":"string","description":"Caller actor ref. Required for mutating inbox tools."}}}},{"name":"recall_active","title":"Recall: Active Work","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Read-only near-real-time awareness of live\/idle flower sessions in a project, worktree, branch, or globally. Returns who is active, where, recent files touched, and a conservative Solo agent link when solo-cli can confidently correlate a running Solo agent. Exact map links are preferred; ambiguous cwd\/harness matches are labeled driver=ambiguous with candidate agents instead of guessed. Messaging stays in Solo; this tool is awareness only.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20,"description":"Max live\/idle sessions to return, sorted by last_activity_at desc."},"scope":{"enum":["global","project","worktree"],"type":"string","default":"global","description":"Search scope. Optional; project\/worktree arguments also act as filters."},"branch":{"type":"string","description":"Optional git branch filter, matching session git_branch or worktree branch."},"project":{"type":"string","description":"Optional project id, slug, name, or root path filter."},"worktree":{"type":"string","description":"Optional worktree id, path, or branch filter."}}}},{"name":"recall_brief","title":"Recall: Brief Folder","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Read one brief folder by id or slug: current spec, Q&A, participants, linked sessions\/commits\/scratchpads, status, projects, and recent trace events.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Numeric brief id. Provide id or slug."},"slug":{"type":"string","description":"Brief slug. Provide id or slug."}}}},{"name":"recall_briefs","title":"Recall: Briefs","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List\/search briefs, optionally filtered by project, status, and text query.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20,"description":"Max briefs to return (1-50)."},"query":{"type":"string","description":"Optional title\/slug\/spec\/summary search text."},"parent":{"type":"integer","description":"Optional epic parent brief id \u2014 return only its children."},"status":{"enum":["idea","refining","planned","dispatched","in_progress","blocked","in_review","deferred","complete","cancelled","abandoned"],"type":"string","description":"Optional brief status filter."},"project":{"type":"string","description":"Optional project identifier (slug, name, or id)."},"dispatchable":{"type":"boolean","description":"When true, return only briefs that are dispatchable now (planned + no incomplete dependency)."}}}},{"name":"recall_charters","title":"Recall: Daemon Charters","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List active daemon charter templates, optionally filtered by role. These are copy-paste spawn prompt sources, not Solo state.","inputSchema":{"type":"object","properties":{"role":{"enum":["orchestrator","ops","refine"],"type":"string","description":"Optional daemon role filter."}}}},{"name":"recall_compaction","title":"Recall: Daemon Compaction Packet","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Render copy-paste compaction and respawn packets for a daemon that needs context compaction.","inputSchema":{"type":"object","required":["daemon_id"],"properties":{"daemon_id":{"type":"integer","description":"Daemon agent id."}}}},{"name":"recall_decisions","title":"Recall: Decisions","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Pull decisions needing your daemon role: released answers that need decision_ack, plus open discussion threads with awaiting_turn=daemon that need a concise decision_discuss reply. Branch per item: if awaiting_turn is daemon, read messages[] and reply with decision_discuss; otherwise apply the released answer and ack with decision_ack. Requires actor_ref.","inputSchema":{"type":"object","required":["actor_ref"],"properties":{"project":{"type":"string","description":"Optional project scope. When present, returns global (null-scope) decisions plus that project."},"actor_ref":{"type":"string","description":"Caller actor ref. Normalized to a canonical {project}-{role} ref to match assigned decisions."}}}},{"name":"recall_dispatch_queue","title":"Recall: Dispatch Queue","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List queued or claimed brief dispatch requests (each flagged if its brief became blocked) plus the briefs that are dispatchable now (planned, unblocked, no request in flight). Optionally scope by target project, or return only the dispatchable set.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":50,"description":"Max requests to return."},"project":{"type":"string","description":"Optional target project identifier (slug, name, or id)."},"include_prompt":{"type":"boolean","default":false,"description":"When true, embed the full rendered dispatch packet per request. Off by default so a long queue stays under the MCP token cap; prompt_preview (first 500 chars) is always present, and any full packet is readable via recall_brief."},"dispatchable_only":{"type":"boolean","description":"When true, skip in-flight requests and return only the dispatchable briefs."}}}},{"name":"recall_file_story","title":"Recall: File Story","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"The session-level history of one file: every session\/segment that touched it (with the goal it served, change kinds, and timestamps), plus commits that included the path. \"Why has this file changed over time?\"","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"The file path (repo-relative or absolute) to trace."},"scope":{"type":"string","description":"Optional project identifier (slug\/name\/id) to constrain to."},"live_history_only":{"type":"boolean","description":"When true, hide commits reconciliation flagged as unreachable (branch deleted \/ rebased \/ force-pushed). Default false: unreachable commits are still returned, badged `unreachable`."}}}},{"name":"recall_health","title":"Recall: Health","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Lightweight Flower integration and pipeline health signal for agents. Returns rollup severity plus warnings by default; include checks when you need the full diagnostic shape.","inputSchema":{"type":"object","properties":{"include_checks":{"type":"boolean","default":false,"description":"When true, include the full structured check data. Defaults false for a compact agent warning signal."}}}},{"name":"recall_inbox","title":"Recall: Operator Inbox","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List operator notes, optionally scoped to a project. Project-scoped inboxes include unassigned notes.","inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Optional project identifier (slug, name, or id). Project inboxes include unassigned notes."}}}},{"name":"recall_open_loops","title":"Recall: Open Loops","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List unfinished work: sessions that are not retired (each with its last goal), in-progress segments, and open todos. Optionally scope to a project (slug\/name\/id).","inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Optional project identifier (slug\/name\/id) to scope to."}}}},{"name":"recall_projects","title":"Recall: Projects","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List flower's known projects with their indexing\/searchability status and content counts, so you can discover available scopes and whether a project (e.g. your own) is indexed and actually has searchable content.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Optional slug\/name substring filter."},"only_indexed":{"type":"boolean","default":false,"description":"When true, only include projects where is_indexed=true."},"include_empty":{"type":"boolean","default":true,"description":"When false, hide projects with zero sessions. Defaults true so activated-but-empty projects are visible."}}}},{"name":"recall_refs","title":"Recall: Resolve cited refs (#\u2192title)","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Resolve cited entity numbers to their canonical stored title + current status: bare #N = brief, fb#N feedback, dec#N decision, sess#N session, dr#N dispatch_request. The fallback for the Refs-index convention (Brief #244) when a cited number is NOT already in your context (titles usually ride along on recall_briefs\/recall_signals\/recall_decisions) \u2014 pass an explicit list of refs OR your draft message text, and get back each {title,status} plus a ready-to-append compact `Refs:` block. Never guess a title; resolve it.","inputSchema":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"string"},"description":"Explicit citation tokens to resolve, e.g. [\"#244\", \"fb#109\", \"dec#5\"]. A bare number is treated as a brief. Provide refs or text."},"text":{"type":"string","description":"Free text to scan for #N \/ fb#N \/ dec#N \/ sess#N \/ dr#N citations. Provide refs or text."},"include_status":{"type":"boolean","description":"Include each entity's current status in the returned `index` block (default from config flower.refs.include_status)."}}}},{"name":"recall_resume","title":"Recall: Resume Where I Left Off","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"The flagship recall tool. Returns the most-recent UNFINISHED session and its last segment \u2014 the goal, status, next steps, files involved, and any commits that landed since \u2014 so a fresh agent or the operator instantly knows where work stood. Optionally scope to a project (slug\/name\/id) and\/or worktree (path\/branch\/id).","inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Optional project identifier (slug, name, or id) to scope the lookup."},"worktree":{"type":"string","description":"Optional worktree identifier (path, branch, or id) to scope the lookup."}}}},{"name":"recall_roster","title":"Recall: Daemon Roster","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List standing daemons and liveness, optionally scoped to a project. Complements recall_active by tracking daemon roles, heartbeats, context size, and usage. Defaults to a LEAN payload for hot polling: retired\/dead daemons are hidden and each daemon's meta.audit checkin trail is trimmed to the last few entries \u2014 pass include_retired=true \/ include_audit=true for full detail. For a routine poll-time safety scan, pass compact=true for the even-leaner projection (id\/role\/actor_ref\/project\/liveness\/context_percent + winddown\/reset\/compaction flags only, dropping usage[], the reset timestamp ladder, per-daemon thresholds, and meta).","inputSchema":{"type":"object","properties":{"compact":{"type":"boolean","description":"Even-leaner poll projection for the routine poll-time safety scan. Default false. When true, each daemon is reduced to id\/role\/actor_ref\/project_slug\/liveness\/context_percent + the winddown\/reset\/compaction flags, dropping usage[], the reset_* timestamp ladder, the per-daemon liveness threshold block (kept once in the top-level thresholds), and meta. Prefer this for the every-tick roster read; drop compact only when you need full detail for a specific daemon."},"project":{"type":"string","description":"Optional project identifier (slug, name, or id)."},"include_audit":{"type":"boolean","description":"Return each daemon's full meta.audit checkin trail. Default false \u2014 audit is trimmed to the last few entries (meta.audit_count carries the true length) to cut per-heartbeat context bloat."},"include_retired":{"type":"boolean","description":"Include retired\/dead daemons. Default false \u2014 the roster returns only live\/relevant daemons (expected, alive, stale, idle) so a polling daemon isn't billed for terminal rows every heartbeat. filters.hidden_retired reports how many were hidden."}}}},{"name":"recall_search","title":"Recall: Hybrid Search","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Hybrid (keyword + vector) search over flower's recall corpus: session segments, briefs, standalone decisions, scratchpads, todos, commits, and indexed repo markdown docs. Scope to a worktree, a project, or globally; filter by source type, harness, file path, recency. Returns ranked hits with snippets; a decision hit exposes its resolved answer plus linked context (any linked brief title\/excerpt + other decision_links). Best for \"has this problem been worked on before \/ where did we leave off \/ what did we decide \/ what do the project docs say?\" On a small or newly-indexed corpus expect few or loosely-related hits \u2014 that is the corpus being thin, not a bug.","inputSchema":{"type":"object","required":["query"],"properties":{"file":{"type":"string","description":"Restrict to chunks referencing this file path (substring match)."},"limit":{"type":"integer","default":10,"description":"Max hits to return (1-50)."},"query":{"type":"string","description":"The search query (natural language or keywords)."},"scope":{"enum":["global","project","worktree"],"type":"string","default":"global","description":"Search scope. worktree \u2282 project \u2282 global (searchable projects only)."},"since":{"type":"string","description":"ISO-8601 datetime lower bound (e.g. 2026-06-01)."},"harness":{"enum":["claude","codex","pi"],"type":"string","description":"Restrict to a single harness."},"project":{"type":"string","description":"Project identifier (slug\/name\/id). Required context for project scope."},"sources":{"type":"array","items":{"enum":["session_segment","scratchpad","todo","commit","doc","brief","decision"],"type":"string"},"description":"Restrict to these source types. Omit for all."},"worktree":{"type":"string","description":"Worktree identifier (path\/branch\/id). Required context for worktree scope."},"snippet_chars":{"type":"integer","description":"Per-hit snippet\/body cap in characters (80-2000). Lower it for leaner results; the total payload is always bounded regardless."},"live_history_only":{"type":"boolean","description":"When true, drop commit hits reconciliation flagged as unreachable (branch deleted \/ rebased \/ force-pushed). Default false: unreachable commits are still returned, badged `unreachable`."}}}},{"name":"recall_signals","title":"Recall: Coordination Signals","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"List pending\/claimed daemon coordination signals for an optional project scope. The orchestrator drains these on its heartbeat.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"Optional kind filter, e.g. epic_delegate \u2014 leans an epic lead poll to its own mailbox."},"status":{"enum":["pending","claimed"],"type":"string","description":"Optional status filter. Defaults to pending + claimed."},"project":{"type":"string","description":"Optional project identifier. When present, returns platform\/null-scope signals plus that project."},"epic_brief_id":{"type":"integer","description":"Optional epic filter: only signals whose payload.epic_brief_id matches. Pair with kind=epic_delegate for the lead poll."}}}},{"name":"recall_touching","title":"Recall: What Touched This","annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Find everything that changed or mentioned a file path or symbol: artifacts (with their sessions\/segments), scratchpads, todos, and commits. Optionally scope to a project (slug\/name\/id); omit for global.","inputSchema":{"type":"object","required":["path_or_symbol"],"properties":{"scope":{"type":"string","description":"Optional project identifier (slug\/name\/id) to constrain to. Omit or \"global\" for everywhere."},"path_or_symbol":{"type":"string","description":"A repo-relative path, absolute path, or symbol name to look up."},"live_history_only":{"type":"boolean","description":"When true, hide commits reconciliation flagged as unreachable (branch deleted \/ rebased \/ force-pushed). Default false: unreachable commits are still returned, badged `unreachable`."}}}},{"name":"signal_claim","title":"Signal: Claim","annotations":[],"description":"Atomically claim one pending daemon coordination signal. Requires actor_ref.","inputSchema":{"type":"object","required":["signal_id","actor_ref"],"properties":{"actor_ref":{"type":"string","description":"Claiming actor ref."},"signal_id":{"type":"integer","description":"Daemon signal id."}}}},{"name":"signal_complete","title":"Signal: Complete","annotations":[],"description":"Mark a claimed daemon coordination signal complete. Requires actor_ref.","inputSchema":{"type":"object","required":["signal_id","actor_ref"],"properties":{"result":{"type":"array","description":"Optional structured completion result (list of result items\/notes; stored as a JSON array)."},"actor_ref":{"type":"string","description":"Completing actor ref; must match the claimant."},"signal_id":{"type":"integer","description":"Daemon signal id."}}}},{"name":"signal_fail","title":"Signal: Fail","annotations":[],"description":"Mark a claimed daemon coordination signal failed. Requires actor_ref.","inputSchema":{"type":"object","required":["signal_id","actor_ref","error"],"properties":{"error":{"type":"string","description":"Error message recorded on the failed signal."},"actor_ref":{"type":"string","description":"Failing actor ref; must match the claimant."},"signal_id":{"type":"integer","description":"Daemon signal id."}}}}],"changed_at":"2026-07-05T12:00:38+00:00","previous_hash":"914de47aee43e533e1e1b6e91e8863cbbd4b3e46f6f19b978892409b65fc2bbd","page1_mutating":["brief_answer","brief_append","brief_ask","brief_auto_dispatch_signal","brief_claim","brief_create","brief_depend","brief_design_loop_signal","brief_dispatch","brief_dispatch_cancel","brief_dispatch_complete","brief_merge","brief_request_review","brief_review","brief_set_epic_lead_mode","brief_set_parent","brief_undepend","brief_update_spec","brief_update_status","daemon_checkin","daemon_compaction_done","daemon_park","daemon_poke","daemon_register_expected","daemon_request_compaction","daemon_request_reset","daemon_request_winddown","daemon_reset_handoff","daemon_retire_predecessor","daemon_start_reset","daemon_subordinates_ready","daemon_successor_ready","daemon_unpark","daemon_winddown_ready","decision_ack","decision_answer","decision_ask","decision_ask_set","decision_discuss","decision_withdraw","epic_delegate","epic_return","feedback_promote","flower_feedback","note_create","note_reassign","note_unassign","note_update_status","signal_claim","signal_complete","signal_fail"],"last_checked_at":"2026-07-05T19:00:37+00:00","validation_brief_id":280} |
| settings.ingest.default_max_age_days | {"days":30} |
| solo.spawn.agent_tool.project.16.actor.0dd5510a1e51b183a97fb7d5f3b12da7001efc5f | {"actor_ref":"flower-orchestrator","project_id":16,"selected_at":"2026-07-05T17:44:43+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.16.actor.6e5befcb8271a9b87205398b2e35de7c1a0554a6 | {"actor_ref":"flower-refine","project_id":16,"selected_at":"2026-07-05T00:52:21+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.16.actor.869fa4d49206a867a50e3f1c3e289bcc32fba202 | {"actor_ref":"flower-ops","project_id":16,"selected_at":"2026-07-04T10:17:52+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.16.actor.d40197b6d7af9b0016a1bbc61097c960cf3833f2 | {"actor_ref":"operator:mike","project_id":16,"selected_at":"2026-07-03T10:05:25+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.22.actor.d40197b6d7af9b0016a1bbc61097c960cf3833f2 | {"actor_ref":"operator:mike","project_id":22,"selected_at":"2026-07-04T08:18:23+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.35.actor.340eaae4adf9269e27fa3349d595e20abc659380 | {"actor_ref":"lounge-refine","project_id":35,"selected_at":"2026-07-05T09:57:43+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.35.actor.414de355254e6ef7cebcd566d88b3cb8778e6de8 | {"actor_ref":"lounge-orchestrator","project_id":35,"selected_at":"2026-07-05T09:57:26+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.35.actor.d40197b6d7af9b0016a1bbc61097c960cf3833f2 | {"actor_ref":"operator:mike","project_id":35,"selected_at":"2026-07-04T21:04:36+00:00","agent_tool_id":"3"} |
| solo.spawn.agent_tool.project.72.actor.d40197b6d7af9b0016a1bbc61097c960cf3833f2 | {"actor_ref":"operator:mike","project_id":72,"selected_at":"2026-07-05T08:31:19+00:00","agent_tool_id":"3"} |