Repository navigation
feat(service,host): a task's planning conversation is followed through the shared live layer - #3267
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
luke-agent
Bot
changed the base branch from
main
to
luke/neon-realtime-scope-inbox
October 17, 2026 01:09
luke-agent
Bot
changed the base branch from
luke/neon-realtime-scope-inbox
to
luke/neon-realtime-service-wake
October 17, 2026 01:25
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 17, 2026 01:25
c5e0422 to
594058c
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-service-wake
branch
from
October 18, 2026 19:40
6c9622d to
f835f49
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
2 times, most recently
from
October 18, 2026 19:45
89c32e2 to
2463895
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-service-wake
branch
from
October 18, 2026 21:40
f835f49 to
2180711
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 18, 2026 21:40
2463895 to
62aaa52
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-service-wake
branch
from
October 19, 2026 18:52
2180711 to
e46eaf4
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 19, 2026 18:52
62aaa52 to
3fb748d
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-service-wake
branch
from
October 20, 2026 01:36
e46eaf4 to
b3338fd
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 20, 2026 01:36
3fb748d to
7f931ca
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-service-wake
branch
from
October 20, 2026 02:06
b3338fd to
a768591
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 20, 2026 02:06
7f931ca to
9f27a39
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 20, 2026 02:43
9f27a39 to
d860efb
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 20, 2026 23:30
d860efb to
fa9cf82
Compare
luke-agent
Bot
changed the base branch from
luke/neon-realtime-service-wake
to
luke/live-same-user
October 20, 2026 23:30
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 21, 2026 00:09
1035c4b to
50f0a36
Compare
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 21, 2026 00:24
50f0a36 to
abaa13b
Compare
github-merge-queue
Bot
removed this pull request from the merge queue due to a conflict with the base branch
Oct 21, 2026
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 21, 2026 00:42
abaa13b to
fae9fbf
Compare
…h the shared live layer The service seals the planning conversation's mark (its cursor and newest turn, keyed by the task) and its running workers' turns, a row each, as the live procedure taskConversation, named for the account it is read for, and answers the messages read in one look where hold=none asks. The host follows them through liveRows while the task is open, asking the conversation past its cursor in one look each time they move, in place of its own loop of held reads woken by the call's words: over Neon Realtime where LUKE_REALTIME is on, and on the held poll otherwise. Every statement passes the immutability check. The service's own held read of the conversation is kept. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…r's own, and ends once its task is gone taskConversation now refuses a read naming another account than the bearer's as signed out (sameUser), as every other live read does. The host marks a seal or poll the service answers not found or signed out as gone, so a task deleted while its conversation is polled ends the follow. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent
Bot
force-pushed
the
luke/neon-realtime-planning-conversation
branch
from
October 21, 2026 00:44
fae9fbf to
770f428
Compare
This branch was successfully deployed
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.
On
main. This moves the open task's planning conversation onto the shared live layer (liveRowsand the sealed live procedures), in place of the host's own loop of held reads woken by the call's words. Realtime is used only whereLUKE_REALTIME=on(#4267); otherwise the follow rides the held poll (#4272).What changes
taskConversationLiveStatements(brain-transcript.ts) holds two parts, every statement immutable:mark: one row keyed by the task, carrying the cursor (messageCursorNow) and the newest turn with its status;workers: the running worker turns, one row each keyed by turn id.live.taskConversation(GET /api/live/task-conversation?id=&userId=) reads the task as the account and seals both parts. It answers not-found for a task the account doesn't reach, signed-out for another account'suserId, and polled (held pastafter) like main's other live reads.messages.taskwithhold=noneanswersbrainPageNow, a single look. The service's own held read (brainPagePast) is unchanged.compose-tasks.tsand the newconversation-follow.ts):liveRows, and asked past its cursor in one look each time the mark or the workers move;wakeConversationand the parked-read machinery are gone;Tests
task-work.test.ts(PGlite): the live mark and workers equal the held read's own reads at each step of a planning turn, and every step moves them. A teammate sees the start and a stranger sees nothing.brainPageNowanswers at once.live-statements.test.ts: the conversation's statements passmutableFunctionsOfand the seal check.live-procedures.test.ts: sealed for the bearer and the task, not found for a stranger, and polled without Realtime.apps/web/tests/tasks-app.test.ts:hold=noneis accepted only withafter.compose-tasks.test.tswith scripted Realtime: