Skip to content

Upstream give-back backlog (hold until V2 merges upstream) #276

Description

@Jacksondr5

Fixes and improvements J5 carries that belong upstream. We hold them while V2 (pingdotgg#2829) is still under heavy construction, then offer them once it settles and merges. Check this list at every upstream advance and remove items upstream fixes on its own.

Activity

  1. Jacksondr5 commented on Sep 24, 2026

    @Jacksondr5
    OwnerAuthor

    More upstream candidates from the #262 live pass (evidence). Re-check them against upstream before offering:

    • A server restart cancels the running turn silently. The cancelled turn has no marker, and it shows the wrong duration ("Worked for 479ms" for about 24 s of work). While only a held queued run remains, the sidebar says "Working".
    • "New thread on " opens a draft on the worktree's temporary branch name (t3code/<id>), not the chosen branch.
    • A repo with no remote shows "From origin/master" as the base branch.
  2. Jacksondr5 commented on Sep 25, 2026

    @Jacksondr5
    OwnerAuthor

    Give-back candidate (Jackson, 2026-09-25): on environment-wide settings pages (upstream's Providers, and J5's Personas and Skills catalog), the new settings scope line still says "Applying settings for " when a project is selected, even though those settings can't be scoped to a project (only keys in PROJECT_SCOPED_SERVER_SETTING_KEYS can). Suggest that upstream hide or disable the project picker, or reword the line, on pages whose settings are environment-wide.

  3. Jacksondr5 commented on Sep 29, 2026

    @Jacksondr5
    OwnerAuthor

    Added: Dead agent-device daemon reused by the device hub (#364, PR #369). LocalDeviceHost.ensureAgentReady returns the cached agent-device endpoint without a health check, so after the daemon exits every device_open hands out a dead --config. The fix probes /health before reuse and restarts the daemon. Still present on upstream/main.

    🤖 Generated with Claude Code

  4. Jacksondr5 commented on Sep 30, 2026

    @Jacksondr5
    OwnerAuthor

    Update: the dead agent-device daemon fix (#364, #369) was closed without merging, so J5 isn't carrying it. It's no longer part of this give-back list.

    Posted by an AI agent on Jackson's behalf.

  5. Jacksondr5 commented on Oct 5, 2026

    @Jacksondr5
    OwnerAuthor

    Give-back candidate: A hung simctl breaks device listing, behind a generic error. Seen 2026-10-04 on Jackson's Mac, after CoreSimulatorService had been up for about 2 days and stopped answering. Every simctl call hung, including simctl help. Restarting the service fixed it.

    What the person saw:

    • The panel showed only "Device list failed: Could not communicate with device support. Try refreshing devices." The real cause, simctl not answering, never reached the person.
    • The iOS device list kept emptying and refilling. On refreshes where simctl failed instead of hanging, the hub returned simulators: [] with errors. refresh in DeviceService.ts replaced the host's devices with that empty list, then the next good call brought them back.
    • Stuck simctl list devices --json processes piled up, one every refresh. We counted 15, some orphaned (ppid 1) by earlier hub runs.

    Where it belongs:

    • expo-device-hub (expo/expo-device-hub): execSimctl calls execFile("xcrun", ["simctl", ...]) with no timeout, so a wedged CoreSimulator holds /api/devices open indefinitely. This is still the case in 0.12.0, the version upstream pins as of upstream/main a1d9d72aef. Suggest a timeout that kills the child, and an error saying simctl did not respond.
    • T3 Code (apps/server/src/device/DeviceService.ts and the request_failed text in packages/contracts/src/device.ts, unchanged on upstream/main a1d9d72aef):
      • hubJson maps a timeout, a bad status and a decode failure all to the same request_failed message. Telling a timeout apart ("The device hub did not answer within 15 s") would have pointed straight at the simulator service.
      • When the hub's list comes back empty and carries errors, consider keeping the host's last known devices, with the error as detail, instead of showing none.

    J5 carries no fix for this. The person-side fix is killall -9 com.apple.CoreSimulator.CoreSimulatorService (with Simulator.app quit). Re-check against upstream and expo-device-hub before offering.

    Posted by an AI agent on Jackson's behalf.

  6. Jacksondr5 commented on Oct 8, 2026

    @Jacksondr5
    OwnerAuthor

    Candidate: the welcome wizard forgets the folder selection when you jump back to a stage by name

    Not posted upstream. Recorded here for the give-back pass.

    • What happens: in the import step, change which folders are selected (for example "Select none", then tick one). Click the Providers stage in the header, then Continue. The selection is back to the defaults and the one you ticked is unticked.
    • Who hits it: only someone who jumps between stages by clicking a stage name. Going straight through the wizard never triggers it, and there is no Back button between those two stages.
    • Likely cause, not confirmed against upstream's source: the selected paths are local state inside the import step, which unmounts when the stage changes.
    • Why this is upstream's: J5's wizard is upstream's components/onboarding/WelcomeWizard.tsx since refactor(web): onboarding goes back to upstream's three stages #457, apart from branding and the "Providers" wording (FORK.md case 39). J5's older wizard kept the selection in its own import session, which refactor(web): onboarding goes back to upstream's three stages #457 removed.
    • Evidence: a tester reproduced it on 2026-10-04 on refactor(web): onboarding goes back to upstream's three stages #457's head against its base, with paired screenshots.
    • Not checked: whether upstream main still behaves this way, and whether upstream already tracks it.
  7. Jacksondr5 commented on Oct 10, 2026

    @Jacksondr5
    OwnerAuthor

    Candidate: revoking a client does not close the sockets it already has open

    Not posted upstream. Recorded here for the give-back pass. Found in review of #506.

    • What happens: revoke a client in Settings → Connections while it has a WebSocket open. Its next HTTP request gets a 401, but the open socket stays up and keeps serving every method its scopes allowed, until the socket closes for another reason.
    • Why: the socket's scopes are fixed at upgrade. apps/server/src/ws.ts authenticates once in the /ws route and builds the RPC server with RpcAuthorization.layer(session.scopes) (line 3202 in J5's copy), and nothing re-checks the session per request. SessionStore.revoke (apps/server/src/auth/SessionStore.ts, lines 995-1013 in J5's copy) marks the row revoked, drops the session from the connected-sessions map and publishes clientRemoved. The only subscriber turns that into an entry on the access stream for the Connections list; none closes a socket. Expiry is the same: it is checked when a ticket is verified, not afterwards.
    • How it was checked: read from the code, then reproduced on an isolated dev server with an empty home (the Move J5's client-facing actions onto WebSocket methods #506 branch, not a live install). A second session opened a socket, an admin session revoked it through POST /api/auth/clients/revoke (200, revoked: true), the revoked token then got 401 on POST /api/auth/websocket-ticket, and three seconds later the socket was still open and answered j5.crews.stop, j5.peers.addresses and j5.peers.issueCredential as before. Not reproduced on unmodified upstream, and not with an upstream method, though the path is the same for those.
    • Who hits it: anyone who revokes a client expecting it to stop at once, most likely for a lost device or a leaked pairing link. A client that is closed, or reconnects, is refused.
    • Why J5 cares: since Move J5's client-facing actions onto WebSocket methods #506, J5's client actions are socket methods and take this behavior (FORK.md case 64). Before, each was an HTTP request and re-authenticated. The sharpest case is j5.peers.issueCredential, which mints a long-lived peer credential under a new session id that revoking the client does not touch.
    • Smallest fix to offer: close a session's sockets when it is revoked (and when it expires), for example by having the /ws route end its scope on a clientRemoved change for its session.sessionId.
  8. Jacksondr5 commented on Oct 12, 2026

    @Jacksondr5
    OwnerAuthor

    Candidate: a server's name cannot be set, so two servers on one machine report the same name

    Not posted upstream. Recorded here for the give-back pass.

    Posted by an AI agent on Jackson's behalf.

  9. Jacksondr5 commented on Oct 12, 2026

    @Jacksondr5
    OwnerAuthor

    Candidate: node --watch src/bin.ts restarts the dev server when another pnpm worktree installs (not posted upstream): on Linux a bare --watch watches about 1,200 loaded files under node_modules/.pnpm that pnpm hardlinks from its shared store, so a second worktree's install or removal changes their link count and restarts the server; J5 narrowed it to --watch-path=src --watch-path=../../packages in #550 (issue #544, FORK.md case 66), measured there, and upstream main was not checked for an existing fix or issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions