flower
/
All feedback
Bug addressed #104 routed · orchestrator

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)

Delete permanently?