Repository navigation
feat(server): push agent questions and results straight to phones through Expo - #230
Merged
Merged
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
jayleaton
force-pushed
the
feat/push-registration-20261113
branch
from
November 14, 2026 03:41
98f9e6b to
0d4dfa9
Compare
jayleaton
force-pushed
the
feat/push-notifier-20261113
branch
from
November 14, 2026 03:41
3d403e7 to
d87cbe9
Compare
…ough Expo A PushNotifier watches domain events, projects each thread with projectThreadAwarenessV2, and decides pushes with a pure policy: only top-level threads (no parent of any kind, not delegated) push; a child's question or approval goes out as its top-level thread's, finishes and failures only from top-level threads, no finish while snoozed, nothing on the first sighting, and a 5-second hold so a run's continuation stays quiet. Payloads carry thread title, project title, environment id, thread id and kind, never message content. Tokens Expo reports as DeviceNotRegistered, in tickets or 15-minute receipts, are deleted. T3CODE_EXPO_PUSH_URL points it at a fake for testing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jayleaton
force-pushed
the
feat/push-notifier-20261113
branch
from
November 14, 2026 04:05
d87cbe9 to
cc4ade5
Compare
This was referenced Nov 14, 2026
jayleaton
marked this pull request as ready for review
November 14, 2026 04:21
jayleaton
changed the base branch from
feat/push-registration-20261113
to
main
November 14, 2026 04:21
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Sits on #229. The server pushes to registered phones straight through Expo's push service.
Rule (JJ, 2026-11-14): only top-level threads push, meaning no parent of any kind and not delegated from another machine. They push when they need the user (input or approval), finish, or fail. Child chats, subagents and side chats never push on their own; their questions go out as their top-level thread's.
Payload:
{ to, title: <top-level thread title>, body: "<Needs your input|Needs approval|Finished|Failed> · <project>", sound, data: { environmentId, threadId, kind } }. No message content.T3CODE_EXPO_PUSH_URLoverrideshttps://exp.hostfor testing.AgentAwarenessThreadgainssnoozedUntilanddelegatedFrom. Desktop and web notifications (ThreadNotificationCoordinator) are not touched; a separate PR changes them.Evidence
pushPolicy.test.ts: 17 rows covering phase pairs × child, snoozed, stale, and repeat waits.PushNotifier.test.ts: real store, fake Expo HTTP. It checks:DeviceNotRegistereddeletes the row;The child-chat step fails on the previous routing, which sent under the child's own title.
vp run devwithT3CODE_EXPO_PUSH_URLpointing at a local fake Expo, one registration, andt3 thread start --provider devReplay. The fake Expo received:vp run check:changedon this layer: all pass.Merge Danger
Door: two-way. It adds no persisted state beyond #229's table, and a revert stops pushes.
Blast Radius: service. It reads one thread snapshot per relevant event and calls exp.host only when a push is due and a phone is registered. Thread and project titles pass through Expo and Apple. Expo's access-token requirement stays off by decision.
🤖 Generated with Claude Code