Idea
When a session's thread gets new human messages while the agent is idle, give the agent a cheap observe turn: it may only emit a compact proposal chip β e.g. "π‘ I could fix this β run?" β which a human one-taps to approve (approve = real steer turn). It never acts or posts prose uninvited.
Why
- Preserves the converged overhear + explicit address model (agents read everything via ~/context/channel/chat.md but only get turns when addressed) while adding consent-preserving proactivity.
- Field research (2026-07): the winning proactive pattern everywhere is proposal object where the accept action already lives (incident.io "Code it up" button, Sentry Seer stopping-point dial, draft-in-drafts-folder). Nobody ships this inside team chat β unclaimed.
Sketch
- Trigger: N new thread messages while session idle > X (debounced), budget-capped per hour (Devin-style rate caps).
- Runtime: new turn kind ("observe") whose only allowed output is a structured proposal (title + one-liner + proposed steer text); rendered as a chip on the session's activity row, not a message.
- Approve = sends the proposed steer as a normal turn (attributed "suggested by agent β accepted by "); dismiss teaches nothing in v1.
- Guardrails: never fires in channels the session isn't bound to; per-session toggle default ON for spawner, mutable by driver.
Depends on
The agent-mode composer / thread-attached session work (steer-from-thread, activity ticker) currently in flight.
Idea
When a session's thread gets new human messages while the agent is idle, give the agent a cheap observe turn: it may only emit a compact proposal chip β e.g. "π‘ I could fix this β run?" β which a human one-taps to approve (approve = real steer turn). It never acts or posts prose uninvited.
Why
Sketch
Depends on
The agent-mode composer / thread-attached session work (steer-from-thread, activity ticker) currently in flight.