flower
/
All briefs
complete mcp flower

recall_active: guard against harness-mismatch driver attribution

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.

#3 done fresh flower · flower/recall-active-harness-guard
You are being dispatched from flower Brief #21: recall_active: guard against harness-mismatch driver attribution

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

Target:
- project: flower (/Users/mikeferrara/Documents/code/flower)
- branch: flower/recall-active-harness-guard
- worktree: not specified
- kind: fresh

Current brief spec:
## Problem
`recall_active` confidently mis-attributes a live session to the WRONG Solo process.
Observed (flower_feedback mcp_issue #31, source flower-tda-orchestrator, 2026-07-01):
the live **codex** session #3266 (thedarkroom_automation) was returned with
`driver:"solo"` linked to Solo **pid 984** — which is the **claude**
`flower-tda-orchestrator` daemon, a different harness entirely. It was a confident
exact link (`driver:"solo"`), NOT `driver:"ambiguous"` with candidates.
Secondary observation: session #3266 also read `live` ~2h after its last activity
despite completed work (lifecycle staleness — likely a separate issue; note but do
not necessarily fix here).

## Fix
In the recall_active -> Solo correlation path (solo-cli correlation / whatever resolves
`driver` + the linked Solo agent), add a **harness-mismatch guard**: a candidate Solo
agent must not be returned as the confident `driver:"solo"` owner of a session whose
harness differs from the Solo agent's harness (a codex session cannot be owned by a
claude Solo process, and vice-versa). On mismatch, downgrade to `driver:"ambiguous"`
(with candidates) or no link — never a confident wrong link.

## Acceptance
- A codex session is never returned with a confident `driver:"solo"` link to a claude
  Solo process (and vice-versa); mismatches degrade to ambiguous/none.
- Add a regression test covering the harness-mismatch case.
- Keep `php artisan test` green; run pint on changed files.
- Add a `Brief: #<id>` trailer to every commit; report material progress via brief_append.

## Provenance
flower_feedback mcp_issue #31 during the 2026-07-01 thedarkroom_automation daemon-spawn dogfood.

Recent/key trace events:
[1] participant_joined flower-orchestrator: (no body)
[2] note_added flower-orchestrator: Filed from flower_feedback mcp_issue #31 (flower-tda-orchestrator). recall_active confidently linked a live codex session to a claude Solo process.
[3] plan_proposed flower-orchestrator: ## Problem
`recall_active` confidently mis-attributes a live session to the WRONG Solo process.
Observed (flower_feedback mcp_issue #31, source flower-tda-orchestrator, 2026-07-01):
the live **codex** session #3266 (thedarkroom_automation) was returned with
`driver:"solo"` linked to Solo **pid 984** — which is the **claude**
`flower-tda-orchestrator` daemon, a different harness entirely. It was a confident
exact link (`driver:"solo"`), NOT `driver:"ambiguous"` with candidates.
Secondary observation: session #3266 also read `live` ~2h after its last activity
despite completed work (lifecycle staleness — likely a separate issue; note but do
not necessarily fix here).

## Fix
In the recall_active -> Solo correlation path (solo-cli correlation / whatever resolves
`driver` + the linked Solo agent), add a **harness-mismatch guard**: a candidate Solo
agent must not be returned as the confident `driver:"solo"` owner of a session whose
harness differs from the Solo agent's harness (a codex session cannot be owned by a
claude Solo process, and vice-versa). On mismatch, downgrade to `driver:"ambiguous"`
(with candidates) or no link — never a confident wrong link.

## Acceptance
- A codex session is never returned with a confident `driver:"solo"` link to a claude
  Solo process (and vice-versa); mismatches degrade to ambiguous/none.
- Add a regression test covering the harness-mismatch case.
- Keep `php artisan test` green; run pint on changed files.
- Add a `Brief: #<id>` trailer to every commit; report material progress via brief_append.

## Provenance
flower_feedback mcp_issue #31 during the 2026-07-01 thedarkroom_automation daemon-spawn dogfood.
[4] status_change flower-orchestrator: (no body)

Recommended linked context:
{
    "todos": [],
    "scratchpads": []
}

Execution notes:
- Treat the brief as the source of truth.
- Keep work scoped to this dispatch request.
- Use brief_append / brief_update_status when reporting material progress.
- Add a git commit trailer `Brief: #21` 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 4d ago
    agent · system:commit-trailer
  2. link added 4d ago
    agent · system:commit-trailer
  3. participant joined 4d ago
    system · system:commit-trailer
  4. status change 4d ago
    agent · flower-orchestrator
  5. status change 4d ago
    agent · flower-orchestrator
  6. dispatched 4d ago

    Dispatch request #3 marked done.

    agent · flower-orchestrator
  7. note added 4d ago

    Completed parts 2/3 of the recall_active harness guard on branch flower/recall-active-harness-guard. Commit 4955ed9 (Brief: #21) makes heuristic Solo candidate matching prefer candidates whose harness matches the session harness over null/unresolved harness candidates, and adds harness_match_rank before solo_process_id in ordering. Added regression: shared cwd with unresolved orchestrator pid 984 and codex worker pid 1002 now links the codex session confidently to the codex worker. Verification: pint passed for app/Services/Recall/ActiveSessionService.php and tests/Feature/Mcp/RecallActiveToolTest.php; RecallActiveToolTest passed (6 tests, 94 assertions); tests/Feature/Mcp passed (43 tests, 679 assertions); FoundationTest passed (5 tests, 67 assertions). Full suite was attempted with ANTHROPIC_API_KEY blank to avoid the pre-existing live Anthropic network test; it still has two unrelated baseline failures: QueryEfficiencyAuditTest roster query budget 6 > 4 and QueueTimeoutAlignmentTest expecting supervisor-long balance=simple while current config returns auto.

    agent · flower-backend
  8. comment 4d ago

    Implemented recall_active harness-mismatch guard on branch flower/recall-active-harness-guard. Commit 9d79fcd adds Solo process harness inference from command/tool_type fields and a regression proving a codex session with an exact map to a claude Solo process returns driver=unknown instead of confident driver=solo. Focused MCP tests and FoundationTest passed; Pint passed.

    agent · flower-backend
  9. participant joined 4d ago
    system · flower-backend
  10. link added 4d ago
    agent · flower-orchestrator
  11. link added 4d ago
    agent · flower-orchestrator
  12. dispatched 4d ago

    Dispatch request #3 queued for flower.

    agent · flower-orchestrator
  13. status change 4d ago
    agent · flower-orchestrator
  14. status change 4d ago
    agent · flower-orchestrator
  15. plan proposed 4d ago

    ## Problem `recall_active` confidently mis-attributes a live session to the WRONG Solo process. Observed (flower_feedback mcp_issue #31, source flower-tda-orchestrator, 2026-07-01): the live **codex** session #3266 (thedarkroom_automation) was returned with `driver:"solo"` linked to Solo **pid 984** — which is the **claude** `flower-tda-orchestrator` daemon, a different harness entirely. It was a confident exact link (`driver:"solo"`), NOT `driver:"ambiguous"` with candidates. Secondary observation: session #3266 also read `live` ~2h after its last activity despite completed work (lifecycle staleness — likely a separate issue; note but do not necessarily fix here). ## Fix In the recall_active -> Solo correlation path (solo-cli correlation / whatever resolves `driver` + the linked Solo agent), add a **harness-mismatch guard**: a candidate Solo agent must not be returned as the confident `driver:"solo"` owner of a session whose harness differs from the Solo agent's harness (a codex session cannot be owned by a claude Solo process, and vice-versa). On mismatch, downgrade to `driver:"ambiguous"` (with candidates) or no link — never a confident wrong link. ## Acceptance - A codex session is never returned with a confident `driver:"solo"` link to a claude Solo process (and vice-versa); mismatches degrade to ambiguous/none. - Add a regression test covering the harness-mismatch case. - Keep `php artisan test` green; run pint on changed files. - Add a `Brief: #<id>` trailer to every commit; report material progress via brief_append. ## Provenance flower_feedback mcp_issue #31 during the 2026-07-01 thedarkroom_automation daemon-spawn dogfood.

    agent · flower-orchestrator
  16. note added 4d ago

    Filed from flower_feedback mcp_issue #31 (flower-tda-orchestrator). recall_active confidently linked a live codex session to a claude Solo process.

    agent · flower-orchestrator
  17. participant joined 4d ago
    system · flower-orchestrator

epic · dependencies

Relationships

epic parent

depends on

No dependencies — dispatchable once planned.

agents · waves

Participants

  • flower-orchestrator participant · active
  • flower-backend participant · active
  • system:commit-trailer participant · active

trace · graph

Links

  • Commit #1162 execution
  • Commit #1163 execution
  • Scratchpad #346 execution
  • Scratchpad #351 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.