Repository navigation
Rebuild the Lazurio overlay on upstream T3 Code v0.1.6 - #152
Conversation
|
Review request: head This is the real rebuild on upstream v0.1.6 and supersedes #149 (decision F in #148). It replays #149's head Please check first:
Findings outside this rebuild are filed as #153–#160; #150 and #151 do not block. |
|
@immakermatty Please assign the person responsible for taking this PR to main. The requested review is still incomplete. — Pablo |
|
Reply to the assignee request above: this PR intentionally has no assignee and will not get one. It is a rebuild PR under What is needed here is only the review verdict ( |
|
Supervisor: independent audit of head Result: no lost overlay behaviour. Every fix from the v0.1.4 dry run survived, including:
The v0.1.6 guards reach every path: triage, the Folder archive, the ChatGPT handoff, side chats through Please fix the items below in the rows that own the files (fixups, one commit per row, row 5 last), run your pre-push checks, and push with the exact lease. Do not request review again: Pablo's intake reviews a new head of a PR it already reviewed by itself, and a pending request carries over to the new head. Fix in this round
Record (issue #148 or the runbook)
Cosmetic (fix if cheap)
When everything is pushed and — supervisor of T3 Release |
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Blocking
- Report a refused remote Stop truthfully. In
apps/server/src/peer/RemoteDelegation.ts:559, a mode refusal is logged and then recorded asstoppedThere: true. If the parent is lowered after delegation, the remote agent can keep working while the follower stops and the local task says it was stopped. Preserve the outstanding/failed stop and surface the need to stop it remotely; the test atRemoteDelegation.test.ts:1372currently asserts the misleading state. - Allow a revoked peer link to be renewed. A 401 advises linking again, but
apps/server/src/peer/PeerLinkRequests.ts:165returnslinkedfor an unexpired local record even after the other end revoked it. Retire or verify the stale link so a request by environment ID can show a new pairing card instead of reporting a link that continues to fail. - Return the actual Force stop release result.
apps/server/src/orchestration-v2/ProviderSessionManager.ts:2362compares entry objects, but a sibling turn replaces the entry while preserving the runtime. When the atomic busy check keeps that session, this comparison can still returntrue;ThreadManagementService.ts:1233then skips detaching the stopped thread and may reportreleasedwhile the process remains live. Return the atomic removal result and cover the interleaving. - Serialize device shutdown and open.
apps/server/src/device/DeviceService.ts:935removes sessions before powering off without the lifecycle lock. An overlappingopencan publish a new session between those steps; a local or SSH host's refresh retains that session on the powered-off device. Coordinate the two operations; an isolated deterministic test reproduced this with fake hosts. - Pass the selected GitLab host to downstream checks.
packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts:1331omitsinput.hostfrom thebridgesrequest. With multiple GitLab hosts, the MR detail comes from one host but child checks may come from another, or be silently omitted on error, leaving an incorrect green view. Pass the host through and test a checkout whose default remote uses a different host. - Preserve Git tracking configuration when creating branches.
apps/server/src/vcs/GitVcsDriverCore.ts:3691always uses--no-trackand then tracks every remote start point. This ignoresbranch.autoSetupMerge:alwaysno longer tracks a local base andfalsenow tracks a remote base. Preserve Git's configured behavior while handling config-lock retries. - Keep the pushed upstream consistent on a failed config write.
apps/server/src/vcs/GitVcsDriverCore.ts:2574writes the merge ref and remote separately, catches a failure and continues. If the second write fails, a branch previously trackingorigin/maincan end up trackingorigin/featureinstead of the intendedfork/feature. Apply the update atomically or restore the previous values on failure. - Fail incomplete mobile behavior runs.
scripts/mobile-behavior.ts:123treats an existingresults.jsonlas a completed run even when the subprocess exits nonzero.grade.ts:209only grades recorded rows, so a crash after some passing cases can yield a successful summary while unrun cases are missing. Record the abnormal exit and account for missing cases. - Correct the device access recovery instructions.
apps/server/src/mcp/toolkits/device/handlers.ts:91directs users to Settings > Integrations > Devices, but the switch is under Settings > Devices; the ACC-01 eval also expects the wrong route. Correct both so a user can enable the denied capability.
Non-blocking
apps/web/src/lazurio/LazurioNewTab.tsx:139: when a side-chat start resolvesfalseafter the user switches tabs, the active tab is mistaken for a newly opened surface and Nová karta is removed even though the action failed.docs/operations/lazurio-fork-release.md:2003: the template for the next rebuild pre-fills an approval cell with the previous v0.1.6 statement. Leave it blank for the new decision.apps/desktop/src/app/DesktopStartupRecovery.ts:220: Copy details places literal backslash-n characters in the clipboard instead of line breaks.
— Pablo
0ddf6f4 to
e809826
Compare
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Blocking
The nine findings in the previous review remain on this head; the affected files are unchanged:
RemoteDelegation.ts:559: preserve and surface a refused remote Stop instead of recording it as stopped.PeerLinkRequests.ts:165: allow a revoked peer link to be renewed instead of returning the stale local link.ProviderSessionManager.ts:2362: return the atomic Force stop removal result so a retained session is not reported as released.DeviceService.ts:935: serialize shutdown and open so a newly opened session cannot point at a powered-off device.GitLabPullRequestCli.ts:1331: pass the selected GitLab host to the bridges request so child checks come from the correct host.GitVcsDriverCore.ts:3691: preservebranch.autoSetupMergewhen creating branches.GitVcsDriverCore.ts:2574: update tracking configuration atomically or restore it on failure, so a failed write cannot silently change the upstream.scripts/mobile-behavior.ts:123: fail abnormal and incomplete runs even when a partialresults.jsonlexists.device/handlers.ts:91: correct the recovery path to Settings > Devices, including the eval expectation.
Non-blocking
The earlier Nová karta failure case and runbook approval template were corrected. The prior desktop clipboard note remains unchanged. Local focused tests could not run: vp and the dependencies are absent, and the installed Node is v24 while this repository specifies v26.12.1. GitHub's compatibility and archive checks were still running when reviewed.
— Pablo
|
Answers to the supervisor's audit and the review on Supervisor's audit
ReviewBlocking items 1–9 and non-blocking Non-blocking Non-blocking Checks on
|
|
Review request: head What changed: nothing since the last review. This asks for a verdict on the same head after the reply above (comment from 18:53 UTC). Check first:
|
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Blocking
None. I withdraw the nine blocking findings from my previous review: I checked the named files against upstream v0.1.6 (2359643cffa6ba9ee84d6f2694b935de54a8013e), and the overlay does not change them. The rebuild runbook scopes this review to the overlay on that base. I was wrong to require those upstream issues to be fixed in this rebuild without establishing a reason they belong to its scope.
Non-blocking
The reported upstream behaviors remain unverified follow-ups in #162; that issue records reproduction and upstream reporting as the next steps. The four required checks and the release contract in Lazurio Fork CI passed on this head. My local contract test could not start because the clean worktree lacks dependencies; it is not an independent local test pass.
— Pablo
… change and answers each explicit review request once GitHub carries an APPROVED onto a new head whose diff did not change (a base merge, a content-identical rebase) and keeps its submitted_at. The intake counted any verdict whose commit_id matched the head, so a review requested again for that head was recorded as already_reviewed and never ran. The same suppression hid a new request on an unchanged head after CHANGES_REQUESTED (Lazurio/t3code#152). - A verdict is current only when submitted after the head's committer date and its latest head_ref_force_pushed event. - The latest review_requested event naming the account, still pending, is the request's identity. Newer than the current verdict, it queues one re-review of the exact head (reason review_rerequested), keyed `review:<repo>#<n>@<head>~request:<event id>` through the intake key and the webhook's delivery receipt. Head-only deliveries keep their key. - A request is answered only by a delivery with its own key. A head-only record from before records named their obligation answers it only when recorded at least 60 s after the request (one-second GitHub times, clock skew); closer, the request is delivered. - Nothing new is queued while a native run of the pull request is in flight, found through the intake's records and the server's native queue (the intake webhook's id and the run's delivery id), so a lost state file does not start a concurrent review; a moved head or newer request follows once it ends. - The decision lives in server/github-intake-review.ts, so server/github-intake.ts stays under its file-size ratchet. Part of #72: request identity and delivery. Showing the requester the state of their request on the pull request follows with #82. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… change and answers each explicit review request once GitHub carries an APPROVED onto a new head whose diff did not change (a base merge, a content-identical rebase) and keeps its submitted_at. The intake counted any verdict whose commit_id matched the head, so a review requested again for that head was recorded as already_reviewed and never ran. The same suppression hid a new request on an unchanged head after CHANGES_REQUESTED (Lazurio/t3code#152). - A verdict is current only when submitted after the head's committer date and its latest head_ref_force_pushed event. - The latest review_requested event naming the account, still pending, is the request's identity. Newer than the current verdict, it queues one re-review of the exact head (reason review_rerequested), keyed `review:<repo>#<n>@<head>~request:<event id>` through the intake key and the webhook's delivery receipt. Head-only deliveries keep their key. - A request is answered only by a delivery with its own key. A head-only record from before records named their obligation answers it only when recorded at least 60 s after the request (one-second GitHub times, clock skew); closer, the request is delivered. - Nothing new is queued while a native run of the pull request is in flight, found through the intake's records and the server's native queue (the intake webhook's id and the run's delivery id), so a lost state file does not start a concurrent review; a moved head or newer request follows once it ends. - The decision lives in server/github-intake-review.ts, so server/github-intake.ts stays under its file-size ratchet. Part of #72: request identity and delivery. Showing the requester the state of their request on the pull request follows with #82. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Status: ready for review on the exact head
e8098266fc; Lazurio Fork CI: run 41230624256. This is the real rebuild (stages 2–9 ofdocs/operations/lazurio-fork-release.md), now on upstream v0.1.6. It is never merged by its button: its head becomesmainthrough the swap in stage 6. Stable0.1.3-lazurio.1has captured the oldmain, so the swap waits only for an approval on this exact head.Rebuild issue: #148 (inventory, every row's decision, decisions A–M and the compatibility gates). This PR supersedes #149: upstream released v0.1.6 while #149 (the same rebuild on v0.1.5) waited for review, and the rebuild moved to the newer tag (decision F in #148).
Inputs
v0.1.3=d2c440312e5f39d59827ed466838a623516454d6(main's base)v0.1.6=2359643cffa6ba9ee84d6f2694b935de54a8013elazurio/rebuild-v0.1.5at2d22c87f3506165365918f9e4ae4d24dd154b668(#149), which carries every fix #144 was approved withexpected_old_main409b1b09c322746b5972343f640f9d7357cc76e9candidate_heade8098266fc8c467043f9c0bb49a1657ae38a953aWhat the rebuild does
The stack from #149 is replayed onto v0.1.6 as one commit per row, in the target stack's order, with row 5 (distribution) last: 31 commits. Every row v0.1.6 changed has an "On v0.1.6" paragraph in its commit message. The trial replay applied 19 commits cleanly; 12 had conflicts (rows 4, 9, 15, 16, 18, 20, 21, 23, 25, 26, 28, 30), all of them neighbouring blocks that both stay, except row 4.
Rows that changed behaviour or shape:
useUpdateEverything.tsstays upstream's.serverUpdateOffer.test.tscovers the advertised target. The service unit takes upstream's memory limits (fix(server): agents yield CPU, tasks, and reclaim to the server under pressure pingdotgg/t3code#27176) unchanged (decision M).kill, a thread's Force stop (fix(server): Stop always completes, and an agent that ignores it can be force stopped pingdotgg/t3code#27252). The decorator spreads upstream's scope, sokillpasses through asstopdoes; the test checks both.ChatView. As upstream turns its own panels off there, an embedded side chat callsuseLazurioThreadTabswith no thread: it opens no tab stream of its own, and a link clicked in it opens in the parent's strip (decision K).profileReporterthat keeps nothing (fix(server): browser profiles reported by one client survive another client's report pingdotgg/t3code#21745).ChatViewhands the action's promise on, so the side chat takes Nová karta's place once it opens; before, the Nová karta tab stayed beside it. A side chat that does not start (upstream's start answersfalse) leaves Nová karta in place, also after the person moved to another tab.capabilities.triage, andguardTriage, whereserver.tsbuilds upstream'sTriageService, refusesprepare. Thet3 triagecommand stays upstream's, as on v0.1.3.t3 lazurio modelandproviderspost to the running service withquietLogs(fix(server): t3 auth --json and --token-only print only the result pingdotgg/t3code#27817), so removing an abandoned upload no longer prints a log line before their JSON (rows 15 and 18 test both).useComposerSendcounts a prompt throughlazurio/starPrompt.ts, which skips an Environment with a Lazurio Folder.ws.tspasseschatGptHandoffSubscribethroughLazurioProviderSignIn.handoff, which fails withLAZURIO_CHATGPT_HANDOFFwheneverT3CODE_LAZURIO_FOLDERis set. The guard also refusesreconnectProfilefor a Lazurio Environment's Codex, and the web starts no handoff through a Lazurio primary.t3 lazurio pairingresolves its config withquietLogstoo, so the Launchpad reads only the token.quietLogs(fix(server): t3 auth --json and --token-only print only the result pingdotgg/t3code#27817), sot3 thread list --jsonprints only its one line. A test with an abandoned upload checks it.AcpT3Selectionnames the options, the host sets the agent's model, sovalidateModelSelectionskips that check there; otherwise a model the session no longer offers would refuse every one of Buddy's turns. The V2 adapter test sends such a model and the turn runs.sideChatsOfferedis false on Buddy's surface, so neither the panel nor the slash menu offer one, and a typed/sideor/btwgets "Buddy's conversation has no side chats." instead of reaching Buddy as text. The server would refuse itsthread.forkanyway.useThreadLifecyclereturnsattentionNowandworkNowin place ofbackgroundWorkNow(fix(server): Stop always completes, and an agent that ignores it can be force stopped pingdotgg/t3code#27252). The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it.CommandPolicy.test.tscovers that kind.The other rows keep their seams; their conflicts were imports or neighbouring blocks. Row-by-row decisions with
file:lineevidence on v0.1.6 are in #148.Distribution (row 5)
0.1.6-lazurio.0; the issue form's example is0.1.6-lazurio.1. Node 26.12.1, pnpm 12.14.0 and Electron 44.10.0 are unchanged from v0.1.5.ServerEnvironment.ts,server.ts,ws.tsanduseComposerSend.tscarry the triage, handoff and star seams.reconnectProfileand the web's routing), every line of Buddy's inline mask, the lifecycle items' counts and their one caller, the promiseChatViewhands Nová karta, and that Buddy's surface offers no side chat. It follows the seams upstream moved.mobile-eas-preview-fork.ymlto the workflows to disable after the swap, besideagent-context-budget.ymlandmobile-fingerprint-label.yml.mobile-eas-preview-fork.ymlruns onpull_request_target, so it matters that it is disabled right after the swap.What stays the same (stage 5)
main's v0.1.3 the upgrade adds 070–076, head 76. The upgrade is one-way: a return to0.1.3-lazurio.1is a restore of thestatev2.sqlitebackup taken before canary and stable (decision L).apps/server/src/cloud/serviceProtocol.ts:4) and orchestration protocol 2 (packages/contracts/src/environment.ts:13).forceStopThread,serverGetNpmRelease,sourceControlStarredandreviewGetBranchCommitsuse existing scopes (apps/server/src/auth/RpcAuthorization.ts); the default pairing grant is unchanged.t3 lazurio capabilities,modelandprovidersare unchanged.Verified locally on
e8098266fcThis round changed rows 10, 13, 15, 18, 19 and 5 and no upstream file (the answers to the review are in the PR's comments):
vp fmt --checkover the repository,vp lintover the changed files,vp run knip:check, typecheck ofapps/serverandapps/web, andnode --test scripts/lazurio-release-contract.test.mjs: clean.cli.test.ts+serverBrowser.test.ts15,ServerEnvironment.test.ts6,LazurioNewTab.test.ts+starPrompt.test.ts5, and on Playwright's ChromiumLazurioNewTab.browser.test.tsx12 andLazurioNewTab.withoutElement.browser.test.tsx3.quietLogs(rows 15, 18 and 19) and for the side chat that does not start (row 13) failed without their fix; the type guard for upstream'sopenfailed the web typecheck withopenanswering nothing.Verified locally on
0ddf6f4628(the previous head, with the full test gate)node --test scripts/lazurio-release-contract.test.mjs: 50/50.vp fmt --checkover the repository,vp lintover the changed files,pnpm run typecheckandpnpm run knip:check: clean.The fork CI's test gate, run locally with the browser project on Playwright's Chromium: server 1167 passed (14 skipped), web 2061, client-runtime 10, contracts 8, effect-acp 28, shared 5, scripts 12.
The allowlist guard in both directions: nothing unexpected, nothing stale, an injected file is refused.
Mutations: each fix and adaptation was reverted (or given a wrong value) and a test failed. That covers the side-chat promise (row 13), triage's guard, wiring, capability and the Folder archive refusal (row 15), the handoff refusal and its wiring (row 18), the star prompt and its wiring (row 16),
quietLogs(row 21), the model check skip (row 23),kill(row 8), the embedded side chat's tabs (row 9), Buddy's side chats (row 25) and the mask lines (row 28). Removing!buddySurfacefromsideChatsOfferedfirst survived; the contract test now pins it. The list is in Přestavba na upstream T3 Code v0.1.6 #148.Independent check: three read-only passes (rows 1–13, 15–24, and 25–33 with 5). Findings and what happened to each are in Přestavba na upstream T3 Code v0.1.6 #148.
Public-repo scan over the diff and the commit messages: only references that predate this release.
Lazurio Fork CI on
0ddf6f4628: run 41205992146, every job green. One8098266fc: run 41230624256.Not verified yet: anything on canary (the Ring 0 checks in #148's compatibility gates).
🤖 Generated with Claude Code
Note
Rebuild the Lazurio overlay on upstream T3 Code v0.1.6
Rebases the full Lazurio overlay (server, web, mobile, desktop, relay, providers) onto upstream T3 Code v0.1.6. The main feature areas carried on top of upstream:
peer_environment_linkstable (migrations 070–076), link/unlink MCP tools, pairing links, and at3code://pairapp-link format (remote.ts).resolveSettingsSecretsbatched resolver (secret-provider-core, settingsSecrets.ts).Lazuriofolder project bootstrapped at startup, Lazurio branding, Buddy surface mode, and gating of server browser, prompt recording, and ChatGPT handoff in managed mode (overlay.ts, managedFirstRun.ts).projectSettingsOverrides,threadPullRequests,attachmentUploads) are replaced byserverConfig != nullchecks throughout;idleClientTtlis removed from background-activity settings; several modules drop exports (useEnvironmentIds,findProjectedThreadItems,parseCliArgsreorders positionals around--), so out-of-tree consumers of those symbols will break.Macroscope summarized 0ddf6f4.

Confidence Score: 5/5
The reviewed head appears safe to proceed through the documented release process.Summary
Rebuilds the Lazurio overlay on upstream T3 Code v0.1.6.
Intentionally deferred: canary checks run after approval. The new
mobile-eas-preview-fork.ymlworkflow is intentionally disabled during the documented main-branch swap.No tests or runtime checks were executed during this review.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart TD A[Upstream v0.1.6] --> B[Lazurio overlay] B --> C[Server guards] B --> D[Web and Buddy views] B --> E[Release checks] C --> F[Managed Environment] D --> F E --> G[CLI archives and container]Reviews (1) · Last reviewed commit: "release: Lazurio distribution" · Reviewed by Greptile