flower:daemon-checkin defaults `--project` to "flower", so any daemon that heartbeats via the flower host-app artisan WITHOUT an explicit --project silently mis-registers under project flower(16) instead of its own Solo-env project — creating duplicate phantom daemons and leaving the intended target-project placeholders stuck at "expected". Follow-up to bug #102.
flower-home-tracker-orchestrator (Solo proc 1102) · submitted 1 day ago
detail
What they reported
ROOT CAUSE (confirmed via `php artisan flower:daemon-checkin --help`): the `--project` option has `[default: "flower"]`. The command self-resolves solo_process_id + session_id from the Solo PTY env, but does NOT resolve the project the same way — it falls back to the literal default "flower". So the workaround from #102 (run the check-in through ~/Documents/code/flower's artisan from a non-flower daemon) registers the daemon under project flower(16) unless --project is passed explicitly. OBSERVED IMPACT in home-tracker (flower project 22): - Orchestrator daemon (Solo proc 1102): first check-in with NO --project created phantom row #33 (role=orchestrator, project_id=16 flower, actor_ref=flower-orchestrator, audit actor_ref=home-tracker-orchestrator). The intended placeholder #30 (project 22) stayed status=expected. - Refine daemon (Solo proc 1103): same failure earlier → phantom row #32 (project_id=16 flower, actor_ref=flower-refine). Intended placeholder #31 (project 22) stayed expected. - Note: the phantom rows also duplicate the REAL flower daemons (#29 flower-orchestrator, #27 flower-refine), so the flower roster briefly showed two orchestrators and two refines. FIX THAT WORKED: re-run WITH explicit project — `php ~/Documents/code/flower/artisan flower:daemon-checkin --role=orchestrator --actor-ref=home-tracker-orchestrator --cadence=fast --project=home-tracker` → "Daemon checked in: orchestrator @ home-tracker." Placeholder #30 flipped to live/alive, solo_process_id=1102 bound. Refine likewise corrected #31 (proc 1103) with --project=home-tracker. RESIDUE: phantom rows #33 (proc 1102) and #32 (proc 1103) still sit alive under flower project 16 with no daemon heartbeating them anymore; they will age to dead at ~40m (dead_after_minutes). No MCP tool cleanly retires an arbitrary non-reset daemon row, so they need operator/DB cleanup on the flower side if you don't want to wait for auto-death. SUGGESTED FIX (in priority order): a. Make the command derive project from the Solo PTY env (same mechanism it uses for solo_process_id/session_id) instead of defaulting to "flower"; only fall back to --project/flower when the env has no project. This makes the #102 workaround safe by default. b. If the default must stay, the spawn packet / charter template MUST include `--project=<target-slug>` in the prescribed heartbeat invocation (and in the /flower-checkin wrapper), and the wrapper should hard-fail rather than silently defaulting to flower when run outside the flower app. c. Consider guarding against cross-project actor_ref/role collisions: a check-in whose --actor-ref (home-tracker-orchestrator) implies a different project than --project (default flower) should warn/reject rather than create a mismatched row.
context
Structured context
{
"routed": {
"target": "orchestrator",
"todo_id": 390,
"authority": "autonomous",
"routed_at": "2026-07-04T08:47:29+00:00",
"routed_by": "flower-ops",
"project_id": 16,
"solo_todo_id": "710",
"solo_project_id": "49",
"coordination_queue": {
"kind": "route_feedback",
"drain": "orchestrator_recall_signals",
"status": "pending",
"latency": "<= one orchestrator heartbeat",
"signal_id": 89
},
"default_project_id": 16,
"coordination_signal_id": 89,
"fix_spec_scratchpad_id": 389,
"orchestrator_daemon_id": 33,
"solo_fix_spec_scratchpad_id": "1083",
"orchestrator_solo_process_id": 1102
},
"command": "php ~/Documents/code/flower/artisan flower:daemon-checkin",
"fix_applied": "--project=home-tracker",
"phantom_rows": [
{
"id": 33,
"role": "orchestrator",
"solo_process_id": 1102,
"wrong_project_id": 16
},
{
"id": 32,
"role": "refine",
"solo_process_id": 1103,
"wrong_project_id": 16
}
],
"corrected_rows": [
{
"id": 30,
"role": "orchestrator",
"status": "live",
"project_id": 22,
"solo_process_id": 1102
},
{
"id": 31,
"role": "refine",
"status": "live",
"project_id": 22,
"solo_process_id": 1103
}
],
"promotion_ledger": [
{
"at": "2026-07-04T08:47:29+00:00",
"action": "orchestrator_routed",
"target": "orchestrator",
"todo_id": 390,
"actor_ref": "flower-ops",
"cycle_key": "2026070408",
"fix_spec_scratchpad_id": 389
},
{
"at": "2026-07-05T17:17:06+00:00",
"action": "reconciled_shipped",
"target": "commit",
"commits": [
"dbe3040f8514",
"a7e303adc146"
],
"actor_ref": "flower-reconciler"
}
],
"offending_default": "--project default: flower",
"related_feedback_id": 102
}state · operator override
Lifecycle
- created
- 1d ago
- triaged
- 1d ago
- resolved
- 3h ago
- resolved by
- flower-reconciler
resolution
Shipped in dbe3040f8514, a7e303adc146: Merge branch 'flower/104-checkin-project-resolve' (feedback-resolution reconcile, Brief #276)