flower
/
All briefs
complete draft note flower

Default daemons to auto-arm their loop after check-in (remove the operator-go-ahead gate); fix refine self-parking

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.

#79 done fresh flower · flower/155-199-auto-dispatch-autonomy
agent: claude 4 scratchpads
You are being dispatched from flower Brief #155: Default daemons to auto-arm their loop after check-in (remove the operator-go-ahead gate); fix refine self-parking

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/155-199-auto-dispatch-autonomy
- worktree: not specified
- kind: fresh

Current brief spec:
## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP=4)
Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (raised to 4) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off, regardless of the order things happened. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain).

## Changes
1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away.
2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap.
3. **Raise the concurrency cap 2 → 4.** Change the `flower.dispatch.auto_max_concurrent` default in `config/flower.php` from 2 to 4 (env `FLOWER_DISPATCH_AUTO_MAX_CONCURRENT` still overrides). Rationale recorded: ~5 worktrees exist + serial merge from MAIN, so 4 = 2x throughput with headroom; 6+ should wait for on-demand worktree provisioning (separate follow-on).
4. **Orchestrator dispatch discretion (operator directive 2026-07-04).** Add to the orchestrator charter/conventions that the orchestrator is FREE to GROUP and ORDER the briefs qualified for dispatch however it judges best / most logical / most token-economical: reuse an agent that already has relevant context, or group related tasks into a chain for a single agent to take on, rather than one-brief-one-fresh-agent. The cap bounds concurrent AGENTS, not briefs — a grouped chain counts as one agent.
5. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default.
6. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice.

## Acceptance
- Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default.
- Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs AND explicitly grant group/order/chain/context-reuse discretion.
- `auto_max_concurrent` default is 4.
- DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN.

## Coordinate with #199 (auto-dispatch reconciler) — grouped with this brief into one worker. Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap=4 + grouping-discretion decisions 2026-07-04.

Recent/key trace events:
[2] note_added flower-orchestrator: Operator directive (2026-07-03): daemons should NOT gate their looping on the operator's explicit go-ahead. **By default, once a daemon is started and checked in, it should auto-arm its recurring heartbeat/poll loop** (appropriate cadence — fast when active, slow/dormant when idle) and keep running, rather than parking and going quiet.

CONTEXT: refine daemon 15 self-parked ~14:55 because its charter gates loop-arming on operator go-ahead and the operator was asleep — it drained its queue, didn't arm its loop, went quiet, and read "dead" on the roster for ~6h (feedback #70). The orchestrator spawn packet carries the same gate ("remain on HOLD … do not arm a loop until the operator explicitly enables it").

CHANGE:
- Update the daemon charter DEFAULTS (app/Support/DaemonCharterDefaults.php + any per-role charter text / spawn-packet rendering, and AgentConventions if relevant) so the default post-check-in behavior is to **auto-arm the recurring loop — no operator go-ahead required**. Apply to all roles (orchestrator, ops, refine, other).
- Refine specifically: after check-in it should arm a slow/dormant idle loop that auto-picks-up new refinable work (and answers on its blocked briefs) without waiting for the operator; it stops looping only on wind-down/reset flags, not on "operator away".
- KEEP the safety flags intact: wind-down / reset / compaction still stop or hand off the loop. This change is only about the DEFAULT initial loop-arming gate.
- Preserve an explicit-park escape hatch (an operator can still ask a daemon to HOLD), but it's opt-in, not the default.

ACCEPTANCE: charter defaults / spawn packets no longer instruct daemons to hold until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away; DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + pint. `Brief: #<id>` trailer.

Provenance: operator directive 2026-07-03. Related: feedback #70 (parked-reads-as-dead).
[3] status_change flower-orchestrator: (no body)
[4] participant_joined flower-refine: (no body)
[5] note_added flower-refine: Folded in from #157 (operator:mike, 2026-07-03) per operator directive to consolidate the daemon loop/park lifecycle into this brief. #155's original slice — remove the go-ahead gate → auto-arm the loop after check-in — stays as-is and dispatch-ready. #157 adds the broader **parked-daemon lifecycle** (design follow-on, beyond the gate-removal slice):

1. **First-class parked-daemon support in the UI + ops flows** — surface a "parked" state (distinct from live/idle/stale/dead), not just an implicit gap.
2. **Configurable auto-park trigger** — a time gate or N consecutive idle polls with no work and no operator action (e.g. ~10 idle loops, or ~4h) → the daemon self-parks.
3. **Super-slow loop mode** — daemons drop to a ~50-minute loop/check-in (keeps the Claude session cache warm), then auto-park after ~6–7h of no operator action.
4. **Wake-on-operator-action** — any operator UI action wakes the relevant daemon(s); consider making the **orchestrator daemon never park** (super-slow mode instead) so it can be the platform-wide waker across all projects.

Suggested sequencing: dispatch the gate-removal slice first (already planned/ready); items 1–4 need design decisions (thresholds, cadences, wake mechanism, orchestrator-as-waker) and are likely worth their own refinement pass or child briefs rather than blocking the ready fix. Source: operator note #157 (now merged into this brief).
[6] merged flower-refine: Merged source briefs: #157 Parked/Parking Daemons

Right now we've got a refine daemon that is pa
[7] link_added flower-orchestrator: (no body)
[8] link_added flower-refine: (no body)
[9] link_added flower-orchestrator: (no body)
[10] link_added flower-orchestrator: (no body)
[11] plan_proposed flower-orchestrator: ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP)
Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (=2) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain).

## Changes
1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away.
2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap.
3. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default.
4. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice.

## Acceptance
- Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default.
- Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs.
- DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN.

## Coordinate with #199 (auto-dispatch reconciler). Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap decision 2026-07-04.
[12] spec_snapshot flower-orchestrator: ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP)
Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (=2) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain).

## Changes
1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away.
2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap.
3. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default.
4. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice.

## Acceptance
- Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default.
- Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs.
- DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN.

## Coordinate with #199 (auto-dispatch reconciler). Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap decision 2026-07-04.
[13] refinement flower-orchestrator: ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP=4)
Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (raised to 4) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off, regardless of the order things happened. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain).

## Changes
1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away.
2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap.
3. **Raise the concurrency cap 2 → 4.** Change the `flower.dispatch.auto_max_concurrent` default in `config/flower.php` from 2 to 4 (env `FLOWER_DISPATCH_AUTO_MAX_CONCURRENT` still overrides). Rationale recorded: ~5 worktrees exist + serial merge from MAIN, so 4 = 2x throughput with headroom; 6+ should wait for on-demand worktree provisioning (separate follow-on).
4. **Orchestrator dispatch discretion (operator directive 2026-07-04).** Add to the orchestrator charter/conventions that the orchestrator is FREE to GROUP and ORDER the briefs qualified for dispatch however it judges best / most logical / most token-economical: reuse an agent that already has relevant context, or group related tasks into a chain for a single agent to take on, rather than one-brief-one-fresh-agent. The cap bounds concurrent AGENTS, not briefs — a grouped chain counts as one agent.
5. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default.
6. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice.

## Acceptance
- Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default.
- Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs AND explicitly grant group/order/chain/context-reuse discretion.
- `auto_max_concurrent` default is 4.
- DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN.

## Coordinate with #199 (auto-dispatch reconciler) — grouped with this brief into one worker. Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap=4 + grouping-discretion decisions 2026-07-04.

Recommended linked context:
{
    "todos": [],
    "scratchpads": [
        {
            "id": 346,
            "solo_scratchpad_id": "1026",
            "name": "Orchestrator HANDOFF — flower build (live state)",
            "archived": false,
            "revision": 100
        },
        {
            "id": 378,
            "solo_scratchpad_id": "1070",
            "name": "flower-refine — reset handoff (2026-07-04)",
            "archived": false,
            "revision": 2
        },
        {
            "id": 381,
            "solo_scratchpad_id": "1073",
            "name": "flower-orchestrator — reset handoff (2026-07-04)",
            "archived": false,
            "revision": 1
        },
        {
            "id": 386,
            "solo_scratchpad_id": "1078",
            "name": "flower-orchestrator (daemon 25) — reset handoff (2026-07-04 #3)",
            "archived": false,
            "revision": 1
        }
    ]
}

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: #155` to every commit for this brief so flower can exact-link commits back to the brief.

provenance · append-only

Trace

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

    Merged to master (commit 8c58c6f, grouped with #199). Charter prompt_templates RESEEDED to v4 (mandatory P1 gate per review — else newly-spawned daemons get stale v3 'wait for GO' bodies). Full suite green. Independent Claude adversarial review = PASS (cap enforced in code + tested; charter auto-arm doesn't break boot; heartbeat protected from sweep exceptions). config.dispatch.auto_max_concurrent now defaults to 4 (takes effect in the flower MCP server on its next restart; effective cap=2 until then). Auto-arm + auto-spawn-to-cap + group/order/chain discretion now the charter default.

    agent · flower-orchestrator
  4. status change 1d ago
    agent · flower-155-199-worker
  5. dispatched 1d ago

    Dispatch request #79 marked done.

    agent · flower-155-199-worker
  6. note added 1d ago

    Built on branch flower/155-199-auto-dispatch-autonomy (worktree foundation / Solo 54), grouped with #199. Commit 8c58c6f (Brief: #155). Charter defaults (DaemonCharterDefaults, version 3→4 so the seeder re-plants): orchestrator/ops/refine bodies auto-arm their loop after check-in — no operator go-ahead. Orchestrator loop item now drains auto_dispatch signals and AUTO-SPAWNS workers up to flower.dispatch.auto_max_concurrent with explicit GROUP/ORDER/CHAIN + context-reuse discretion (cap bounds AGENTS, not briefs). Ops BOOT step 4 no longer says "do not enable the loop until ... GO". Refine Loop/Cadence: keep looping on slow/dormant idle cadence, do NOT self-park when the operator is away. Kept wind-down/reset/compaction safety + an opt-in HOLD invariant. AgentConventions: reframed the heartbeat-vs-work-loop line — work loop auto-arms by default; HOLD is an opt-in escape hatch ("not the default post-check-in state"). Auto-dispatch line now encodes AUTO-SPAWN-to-cap + GROUP/ORDER/CHAIN + the flower:reconcile-auto-dispatch sweep. Spawn packets: default kickoff (SpawnPacketService) auto-arms ("auto-arm by default, no operator go-ahead required"); SpawnDaemonBridge flipped from hard-coded hold:true to auto-arm, adding an opt-in bool $hold param (escape hatch) threaded into render()+safety.hold_mode. /roster spawn now auto-arms; docblock updated. Config: flower.dispatch.auto_max_concurrent default 2→4 (env FLOWER_DISPATCH_AUTO_MAX_CONCURRENT still overrides). Tests (all green): DaemonCharterDefaultsTest (new), AgentConventionsTest (+3 cases), DispatchAutoConfigTest (cap→4), SpawnPacketServiceTest + SpawnDaemonBridgeTest (auto-arm default + HOLD escape hatch, version→4), AutoDispatchServiceTest pins cap=2 explicitly (env-robust). Updated 3 test SpawnDaemonBridge fakes for the new spawn() signature. Refine self-parking (folded from #157): fixed via the refine charter no-self-park loop text. The broader parked-daemon lifecycle (UI state, auto-park trigger, super-slow mode, wake-on-action) remains follow-on, not this slice. ⚠️ MAIN action after merge: re-seed PromptTemplateSeeder so the v4 charter bodies land in prompt_templates (charters live in the DB, not just code). Full suite 935 passed / 1 skipped / 0 failed. pint clean. Not merged — awaiting Phase-2 review.

    agent · flower-155-199-worker
  7. participant joined 1d ago
    system · flower-155-199-worker
  8. dispatched 1d ago

    Dispatch request #79 queued for flower.

    agent · flower-orchestrator
  9. status change 1d ago
    agent · flower-orchestrator
  10. refinement 1d ago

    ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP=4) Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (raised to 4) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off, regardless of the order things happened. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain). ## Changes 1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away. 2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap. 3. **Raise the concurrency cap 2 → 4.** Change the `flower.dispatch.auto_max_concurrent` default in `config/flower.php` from 2 to 4 (env `FLOWER_DISPATCH_AUTO_MAX_CONCURRENT` still overrides). Rationale recorded: ~5 worktrees exist + serial merge from MAIN, so 4 = 2x throughput with headroom; 6+ should wait for on-demand worktree provisioning (separate follow-on). 4. **Orchestrator dispatch discretion (operator directive 2026-07-04).** Add to the orchestrator charter/conventions that the orchestrator is FREE to GROUP and ORDER the briefs qualified for dispatch however it judges best / most logical / most token-economical: reuse an agent that already has relevant context, or group related tasks into a chain for a single agent to take on, rather than one-brief-one-fresh-agent. The cap bounds concurrent AGENTS, not briefs — a grouped chain counts as one agent. 5. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default. 6. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice. ## Acceptance - Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default. - Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs AND explicitly grant group/order/chain/context-reuse discretion. - `auto_max_concurrent` default is 4. - DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN. ## Coordinate with #199 (auto-dispatch reconciler) — grouped with this brief into one worker. Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap=4 + grouping-discretion decisions 2026-07-04.

    agent · flower-orchestrator
  11. spec snapshot 1d ago

    ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP) Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (=2) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain). ## Changes 1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away. 2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap. 3. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default. 4. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice. ## Acceptance - Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default. - Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs. - DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN. ## Coordinate with #199 (auto-dispatch reconciler). Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap decision 2026-07-04.

    system · flower-orchestrator
  12. plan proposed 1d ago

    ## Objective (operator-confirmed 2026-07-04: AUTO-SPAWN TO CAP) Remove the operator-go-ahead gate so daemons run autonomously by default, AND make the orchestrator AUTO-SPAWN workers for flagged+planned briefs up to `flower.dispatch.auto_max_concurrent` (=2) with NO operator confirmation. Operator's explicit target: `auto_dispatch_on_planned=true` + planned flows all the way to a RUNNING agent, hands-off. Pairs with #199 (auto-dispatch reconciler, which guarantees the signals exist to drain). ## Changes 1. **Remove the go-ahead gate / auto-arm the loop.** Update daemon charter DEFAULTS (`app/Support/DaemonCharterDefaults.php` + per-role charter text / spawn-packet rendering + `AgentConventions`) so the default post-check-in behavior is to auto-arm the recurring heartbeat/poll loop — no operator go-ahead. All roles (orchestrator, ops, refine, other). A freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away. 2. **Orchestrator auto-drains + auto-spawns to cap.** Encode (charter + conventions + spawn-packet text) that on each heartbeat the orchestrator drains auto_dispatch coordination signals and, up to `auto_max_concurrent`, BOTH creates the dispatch_request (brief_auto_dispatch_signal) AND spawns the worker (Solo spawn_agent into a clean worktree, pinned per bug #86) — not merely staging a packet. Respect blocked / needs_operator_approval guards and the cap. 3. **Keep safety flags intact:** wind-down / reset / compaction still stop or hand off the loop. Preserve an explicit-park escape hatch (operator can still ask a daemon to HOLD) — opt-in, not default. 4. **Fix refine self-parking** (folded from #157). The broader parked-daemon lifecycle (items 1–4 of the #157 note: first-class parked-state UI, auto-park trigger, super-slow mode, wake-on-operator-action) are FOLLOW-ON child briefs, NOT this slice. ## Acceptance - Charter defaults / spawn packets no longer instruct daemons to HOLD until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default. - Orchestrator charter/conventions direct auto-spawn-to-cap for flagged+planned briefs. - DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + `./vendor/bin/pint`. `Brief: #155` trailer. Worktree-pinned; never edit MAIN. ## Coordinate with #199 (auto-dispatch reconciler). Provenance: operator directive 2026-07-03 (feedback #70) + auto-spawn-to-cap decision 2026-07-04.

    agent · flower-orchestrator
  13. link added 1d ago
    agent · flower-orchestrator
  14. link added 1d ago
    agent · flower-orchestrator
  15. link added 1d ago
    agent · flower-refine
  16. link added 1d ago
    agent · flower-orchestrator
  17. merged 1d ago

    Merged source briefs: #157 Parked/Parking Daemons Right now we've got a refine daemon that is pa

    agent · flower-refine
  18. note added 1d ago

    Folded in from #157 (operator:mike, 2026-07-03) per operator directive to consolidate the daemon loop/park lifecycle into this brief. #155's original slice — remove the go-ahead gate → auto-arm the loop after check-in — stays as-is and dispatch-ready. #157 adds the broader **parked-daemon lifecycle** (design follow-on, beyond the gate-removal slice): 1. **First-class parked-daemon support in the UI + ops flows** — surface a "parked" state (distinct from live/idle/stale/dead), not just an implicit gap. 2. **Configurable auto-park trigger** — a time gate or N consecutive idle polls with no work and no operator action (e.g. ~10 idle loops, or ~4h) → the daemon self-parks. 3. **Super-slow loop mode** — daemons drop to a ~50-minute loop/check-in (keeps the Claude session cache warm), then auto-park after ~6–7h of no operator action. 4. **Wake-on-operator-action** — any operator UI action wakes the relevant daemon(s); consider making the **orchestrator daemon never park** (super-slow mode instead) so it can be the platform-wide waker across all projects. Suggested sequencing: dispatch the gate-removal slice first (already planned/ready); items 1–4 need design decisions (thresholds, cadences, wake mechanism, orchestrator-as-waker) and are likely worth their own refinement pass or child briefs rather than blocking the ready fix. Source: operator note #157 (now merged into this brief).

    agent · flower-refine
  19. participant joined 1d ago
    system · flower-refine
  20. status change 2d ago
    agent · flower-orchestrator
  21. note added 2d ago

    Operator directive (2026-07-03): daemons should NOT gate their looping on the operator's explicit go-ahead. **By default, once a daemon is started and checked in, it should auto-arm its recurring heartbeat/poll loop** (appropriate cadence — fast when active, slow/dormant when idle) and keep running, rather than parking and going quiet. CONTEXT: refine daemon 15 self-parked ~14:55 because its charter gates loop-arming on operator go-ahead and the operator was asleep — it drained its queue, didn't arm its loop, went quiet, and read "dead" on the roster for ~6h (feedback #70). The orchestrator spawn packet carries the same gate ("remain on HOLD … do not arm a loop until the operator explicitly enables it"). CHANGE: - Update the daemon charter DEFAULTS (app/Support/DaemonCharterDefaults.php + any per-role charter text / spawn-packet rendering, and AgentConventions if relevant) so the default post-check-in behavior is to **auto-arm the recurring loop — no operator go-ahead required**. Apply to all roles (orchestrator, ops, refine, other). - Refine specifically: after check-in it should arm a slow/dormant idle loop that auto-picks-up new refinable work (and answers on its blocked briefs) without waiting for the operator; it stops looping only on wind-down/reset flags, not on "operator away". - KEEP the safety flags intact: wind-down / reset / compaction still stop or hand off the loop. This change is only about the DEFAULT initial loop-arming gate. - Preserve an explicit-park escape hatch (an operator can still ask a daemon to HOLD), but it's opt-in, not the default. ACCEPTANCE: charter defaults / spawn packets no longer instruct daemons to hold until operator go-ahead; a freshly spawned + checked-in daemon arms its loop by default; refine no longer self-parks when the operator is away; DaemonCharterDefaults / AgentConventions tests updated. `php artisan test` green + pint. `Brief: #<id>` trailer. Provenance: operator directive 2026-07-03. Related: feedback #70 (parked-reads-as-dead).

    agent · flower-orchestrator
  22. participant joined 2d ago
    system · flower-orchestrator

epic · dependencies

Relationships

epic parent

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • flower-orchestrator participant · active
  • operator:mike participant · active
  • flower-refine participant · active
  • flower-155-199-worker participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #3961 execution
  • Scratchpad #386 execution
  • Scratchpad #381 execution
  • Scratchpad #378 execution
  • Scratchpad #346 execution

scope

Projects

  • flower · primary

dogfood · read-only

Agent’s-eye view

The literal recall_brief payload an agent gets — same service path as the MCP tool.