Two bugs discovered while verifying on kubic:
1. HTTP→MCP context propagation lost the full *agents.Agent struct
(only the bare name was copied via ContextWithAgentName). The
injection wrapper called agents.AgentFromContext and got nothing,
silently skipping the packet. Now propagate both: full struct for
middleware that needs the owner_id, name kept for backward-compat.
2. BuildContextPacket gated retrieval on `query != ""`, so my_status —
the highest-value injection target — always returned a nil packet.
FR-009 actually says "use recent owner activity as the implicit
query" in that case. Added recentMemoriesForOwner: a direct SQL
query over memory channels filtered by author owner, sorted by id
DESC. New search_mode "recent" surfaces the fallback path in the
packet so clients can tell it apart from semantic/fulltext.
Live verification on kubic (image v0.20.3-amd64):
- my_status as `claude-code` now returns relevant_context with 2
memories from algis-owned agents, packet sized exactly at the
500-token budget.
- memory_injections audit ring captures each packet (research-mcpproxy
→ search → 1 item; claude-code → my_status → 2 items).
- Cross-owner SC-008 holds: the recency query filters on
agents.owner_id, so an unrelated owner's agent sees nothing.
Dream worker autonomously fired 31 consolidation jobs (4 types × 2
owners × periodic ticks); all failed at the harness step with
"k8sjob: no Waiter configured" — expected, the claude-code agent has
no k8s_image set. Dispatch chain itself works end-to-end (job row →
token → harness.Execute → audit).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>