Skip to content

merge: integrate upstream main c07575f57 into expbkmain - #173

Merged
tusharbhardwaj-bk merged 458 commits into
expbkmainfrom
t3code/volgograd
Sep 15, 2026
Merged

tusharbhardwaj-bk merged 458 commits into
expbkmainfrom
t3code/volgograd

Conversation

@tusharbhardwaj-bk

@tusharbhardwaj-bk tusharbhardwaj-bk commented Sep 14, 2026 •

Copy link
Copy Markdown
Collaborator

Why

The fork was stranded between an upstream regression and its fix.

Upstream #9840 (Sep 4) called setIgnoreMenuShortcuts(true) on every integrated-browser tab. On macOS the Edit menu's roles are the only thing that makes Cmd+C/V work inside Chromium content, so that killed copy, paste, cut and select-all in the desktop browser, and right-click too. Our last upstream merge point (be7796d86) is seven hours after that regression landed. Upstream fixed it in #10621 and #10670 on Sep 7 — two days after our merge point.

Both fixes land here, conflict-free. The fork was also 441 commits / 9 days behind, so this is the overdue weekly merge as well.

What

Merges origin/main at c07575f57, pinned to nightly tag v0.0.41-nightly.20260914.1687.

168 files conflicted across 489 hunks — roughly 3x the one-week calibration in the merge-upstream skill. Resolved by subsystem.

Things a clean merge would have silently dropped

These produced no conflict and would not have failed review by inspection:

  • Schema.TaggedErrorClass -> Schema.TaggedError. effect rc.112 removed the old name with no alias. 52 occurrences across 22 files, none of which conflicted. Verified against .repos/effect-smol (pinned at rc.112) and its rename-schema-error-constructors changeset. The same changeset renames three more symbols; all three have zero uses here, and every Schema.Error hit belongs to the unrelated AcpSchema namespace — a blind rename there would have corrupted packages/effect-acp.
  • The outbox relocation trap. The fork moved mobile's outbox model into client-runtime and left a re-export shim. Upstream then changed the original file, so git merged the shim happily and upstream's work had nowhere to land. Ported by hand: the queued-message context field (mobile already writes it, so it was being dropped on encode) and the rewritten retry classifier.
  • Other relocations repaired by hand: Normalizer's attachment loop, ChatView's envLocked and onInterrupt, rpc/client.ts's retry hooks.
  • Symbols upstream deleted as unused that the fork still consumes: listServerPairingLinks (+ its DateTime import), useEnvironmentConnectionState.

Other notable resolutions

  • effect beta.103 -> rc.112. Ported the fork's WebSocket ping/pong resilience (missedPongs >= 3, the suspend/throttle resumedFromSuspend probe) onto upstream's rc.112 patch. All 23 hunk headers machine-verified for arithmetic consistency.
  • Migrations. Upstream's 48-51 registered in the fork's 1000+ lane as 1031-1034; frozen block 33-42 verified unmoved; the 8 hardcoded id assertions in upstream's new tests remapped and marked.
  • routeTree.gen.ts was hand-merged across 11 hunks, then regenerated with the TanStack generator — output is byte-identical.
  • settings.projects.tsx was an added/added conflict (both sides created the route). Combined so the experimental flag selects between the fork's panel and upstream's new page; the fork's redirect was dropped because it would have hidden upstream's page from every default build.
  • apps/mobile/.../use-project-actions.ts deleted (upstream 5b68b2c8e). Verified zero dangling references and that both fork fields survive on the replacement outbox path.
  • planModeAvailable preserved over upstream's retired planModeEnabled, per the standing fork rule.

Audit

  • Zero conflict markers tree-wide.
  • Fork markers 3525 -> 3597. Every per-file drop is either a BEGIN/END pair collapsing to one inline marker or a documented upstream supersession; one file deleted, as above.

Deliberate behaviour changes, flagged for review

  1. MCP credentials — upstream replaced the all-or-nothing "browser access off => no credential" branch with per-capability gating. A thread with browser access off now still receives a credential carrying pull-requests.
  2. server.test.ts — 4-6 upstream tests dropped. They assert the inline dispatchBootstrapTurnStart path in ws.ts that the fork deliberately removed (dispatch lives in orchestration/dispatchCommand.ts). Keeping them would be guaranteed-red CI, not preserved coverage. Route/handler symbol diff confirms no fork route or WS handler was lost — additions only.
  3. ProviderCommandReactor now honours upstream's "start a turn without loading old message bodies" invariant. The fork's title cadence counts user messages through a fork-only countThreadUserMessages query instead of the detail read, and first-prompt naming hands its prompt straight to the regeneration worker. The first-prompt title model therefore receives the bare prompt (as upstream) rather than a USER:-labelled context. The fork's rule that a stop request always reaches the provider, which the merge had dropped, is restored.
  4. Durable bootstrap path — upstream's inline message context is added to the startThreadTurn branch only. The fork's legacy requestThreadBootstrap branch sends initialTurn without context records.

Post-merge CI repair

CI surfaced what the merge could not: 526 server and 51 web typecheck errors (one cause, a ForgejoCli layer leak, accounted for 483), a .gitmodules gap that killed actions/checkout, and a set of test failures that each traced to a fork behaviour the merge had silently dropped or that upstream's new tests contradicted:

  • Rangeless plan-review comments. Upstream moved <review_comment> parsing into packages/shared/composerContextLegacy.ts, which rejected a block without a line range and rendered raw XML. The fork's nullable range and author byline are re-ported there; ReviewCommentContextRecord widened additively; plan chips are labelled by plan title. Covered by composerContextLegacy.expbkt3.test.ts.
  • Auto-settle keys. Upstream retired sidebarAutoSettleOnMerge/AfterDays from client settings in favour of the server preference; the fork's PhaseGroupedSidebar and session manager now read primaryServerSettingsAtom.
  • Batched shell/thread state writes. The fork's retry-budget reset used Stream.tap, which re-chunks the RPC stream to single items; Stream.mapArrayEffect keeps upstream's batches intact.
  • Per-project thread shell query lacked upstream's new branch_pull_request_json column and failed to decode.
  • Device dismissals were discarded by the fork's right-panel persistence filter when a panel had no surfaces left.
  • Third-party licence notices declared for the fork's plan-editor and webhook packages; thread snapshot wire budget raised to 8,000 B for fork shell fields; web UI MCP catalog counts follow the current RPC surface; MOBILE_APP_VERSION takes upstream's 1.1.1.

Verification

Local verification is limited by design: the dev box must not run repo-wide suites. packages/shared/src/orchestrationTiming.test.ts was rewritten against the fork's execution-snapshot signature and runs green (30/30). Everything else is CI's job; the PR leaves draft only once CI is green.

The copy/paste fix cannot be verified by an expbkt3 deploy. It lives in apps/desktop (Electron main process); expbkt3 ships the server. It needs a desktop build.


Model: Claude Opus 5 (1M context). Harness: Claude Code in T3 Code.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

aravhawk and others added 30 commits September 7, 2026 22:46
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
…ut of credits" (pingdotgg#10473)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…tgg#10620)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…gg#10619)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
pingdotgg#10526)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
maria-rcks and others added 7 commits September 13, 2026 19:27
…onse streams (pingdotgg#11062)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Merges 441 upstream commits (be7796d..c07575f, pinned to nightly tag
v0.0.41-nightly.20260914.1687). 168 files conflicted across 489 hunks;
resolved by subsystem with the merge-upstream skill.

Motivation: the fork was stranded between an upstream regression and its fix.
Upstream pingdotgg#9840 (Sep 4) disabled menu accelerators on browser tabs, which killed
copy/paste in the desktop integrated browser; the fork merged 7 hours later.
Upstream fixed it in pingdotgg#10621 and pingdotgg#10670 (Sep 7), two days after our merge point.
Both fixes land here, conflict-free.

Notable resolutions:
- effect 4.0.0-beta.103 -> rc.112. Ported the fork's WebSocket ping/pong
  resilience (missedPongs, suspend/throttle probe) onto upstream's rc.112 patch.
  Renamed Schema.TaggedErrorClass -> Schema.TaggedError in 22 files; rc.112
  removed the old name and none of those files conflicted.
- Upstream migrations 48-51 registered in the fork's 1000+ lane as 1031-1034;
  frozen block 33-42 verified unmoved. Test id assertions remapped.
- Relocation traps repaired by hand, where git produced a clean merge that
  silently dropped upstream work: the outbox model (queued-message context and
  the retry classifier), Normalizer's attachment loop, ChatView's envLocked and
  onInterrupt, and rpc/client.ts's retry hooks.
- Restored fork-consumed symbols upstream deleted as unused:
  listServerPairingLinks, useEnvironmentConnectionState.
- routeTree.gen.ts regenerated with the TanStack generator; output is
  byte-identical to the hand-merge.
- apps/mobile use-project-actions.ts deleted (upstream 5b68b2c); both fork
  fields survive on the replacement outbox path.

Fork-marker audit: 3525 -> 3597 markers. Every per-file drop is a BEGIN/END pair
collapsing to an inline marker or an upstream supersession; the only deleted
file is the one above.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 14, 2026
@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 13.8 KiB — 15.1 KiB ✅
Codex Thread snapshot wire — 7.3 KiB — 7.8 KiB ✅
Codex Live turn WebSocket wire — 6.5 KiB — 7.8 KiB ✅
Codex Live turn WebSocket decoded — 57.1 KiB — 66.4 KiB ✅
Codex Live turn messages — 9 — 21 ✅
Claude Total thread wire — 13.9 KiB — 15.1 KiB ✅
Claude Thread snapshot wire — 7.3 KiB — 7.8 KiB ✅
Claude Live turn WebSocket wire — 6.5 KiB — 7.8 KiB ✅
Claude Live turn WebSocket decoded — 57.9 KiB — 66.4 KiB ✅
Claude Live turn messages — 10 — 21 ✅

Baseline: unavailable · PR result: fac5b15 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 114.9 KiB
  • Claude decoded thread snapshot: 115.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

tusharbhardwaj-bk and others added 16 commits September 14, 2026 05:52
actions/checkout runs `git submodule foreach` to strip credentials and died
with "No url found for submodule path '.repos/alchemy-effect/.vendor/astro'",
failing every job before it started. The upstream merge brought 11 new gitlinks
under the vendored alchemy-effect checkout and only one was declared. URLs are
copied from .repos/alchemy-effect/.gitmodules; `update = none` keeps CI from
ever fetching them.

Fork markers:
- settings.projects.tsx used a JSDoc block, which the checker does not accept;
  converted to the // BEGIN/END form.
- Normalizer.ts had an END whose BEGIN the merge consumed, plus a newly
  unmarked helper call. Both regions marked.
- The effect patch's baseline entry followed its beta.103 -> rc.112 rename.
  Same debt, new path, entry count unchanged.
- --write-baseline then dropped 7 files that are now fully marked: 166 -> 159.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…take upstream mobile version

Three keep-both resolutions produced duplicate import bindings, which oxlint
reports as errors:
- ThreadTerminalRouteScreen.tsx imported `AppText as Text` twice
- ProjectionPipeline.ts imported `effect/Schema` twice
- ChatView.tsx imported `randomUUID` from ~/lib/utils on two lines

SwiftLint (--strict, fork-owned .swiftlint.yml — upstream ships none) failed on
`updateAccessibilityElementsIfNeeded` at complexity 16. That function does not
exist upstream: it is part of the fork's ~208-line accessibility addition inside
an upstream-owned file. Split its geometry-only fast path into
`repositionAccessibilityElements`, which is behaviour-preserving and moves with
the code if that block is later extracted to a fork-owned Swift file.

Mobile version takes upstream's 1.1.1. The value lives in the fork-owned
apps/mobile/app-version.ts, which app.config.ts imports in one line, so taking
upstream's number costs no merge surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… pass

Three more symbols upstream un-exported that fork code imports — the same class
of silent merge loss as listServerPairingLinks, and none of these files
conflicted:
- makeDayFormatter (usageAggregation.ts) -> fork per-thread usage aggregation
- buildTimeClerkPublishableKey (cloud/publicConfig.ts) -> ClerkIdentityVerifier
- isThreadDetailEvent: ws.ts only imports it, so the fork test now imports from
  orchestration/threadDetailEvent.ts, its real owner, keeping the test off a
  merge hot-spot rather than re-exporting from ws.ts.

Also removes a duplicate threadId key in GitRunStackedActionInput (both sides
added it; upstream's documented copy kept) which failed tsc with TS1117.

knip: upstream widened knip:check's --exports pass from 2 workspaces to 10,
newly reporting ~180 unused exports across the fork's own feature surface. The
files are untouched by this merge and the fork tip simply was not checked, so
this is pre-existing debt rather than merge damage. Scoped off for fork sources
with a marked, greppable block and a note to remove it as the exports are
tidied; files and dependencies checks are unaffected.

Verified locally: both knip passes exit 0; threadUsage and decider.pullRequests
suites 24/24 green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…elds

packages/client-runtime typecheck: 14 errors -> 0.

- session.ts: upstream made executeAuthenticatedEnvironmentHttpRequest
  group-scoped. The fork's fetchOrchestrationUsers now passes group:
  "orchestration" and calls client.users(...) rather than
  client.orchestration.users(...). One change cleared all four errors there.
- threadCommands.ts: upstream's attachment id is optional, so `"id" in
  attachment` no longer proves it is a string and the queued attachment id
  became string | undefined. Uses an explicit undefined check with the existing
  fallback id.
- Test fixtures gained fields that are required but were absent: upstream's
  pullRequests on three thread fixtures, the fork's notifySessionSuspect on the
  supervisor mocks, and the fork's sentByUserId / sourceControlProfileId /
  ownerUserId / memberUserIds / rollingSummary / turnSummaries on upstream's new
  remotePerformance bench fixture.

knip.jsonc: the apps/web seam is back to a single line. Reformatting upstream's
one-line ignoreIssues into a multi-line object made git attribute two unrelated
upstream lines to the fork, which failed the marker check; keeping the line
shape identical keeps this a one-line conflict next merge.

contracts, shared and client-runtime all typecheck clean; marker check passes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/mobile typecheck: 16 errors -> 0.

Real drift:
- movePinnedThread was generalised upstream into moveThread, which infers the
  pinned section from the thread; the phase sidebar's reorder now calls it.
- ThreadSwipeable gained a required threadKey; the phase sidebar row passes the
  same environment:thread form the other thread lists use.
- ThreadFeed lost the ReviewInlineComment type when upstream extracted the
  file-review card into its own module; re-imported from its real owner.
- SegmentedControl's fork accessibility code reads props.role, which was never
  declared on the props type.
- ReviewSheet's selectedSection is nullable on this path.

codexFeedbackMessage: upstream pingdotgg#10398 replaced Codex feedback pseudo-messages
with composer banners and deleted the helper. The ordering test's subject is
buildThreadFeed's localMessages ordering, which still exists, so the two
messages the helper built are inlined rather than dropping the coverage.

Fixtures gained fields that are required but absent: durationMs on turn
fixtures (upstream's server-computed duration, null while running),
sentByUserId on message fixtures, and sourceControlProfileId / ownerUserId /
memberUserIds on the pending-thread shell, which now carries the queued
creation's chosen source-control profile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ture fields

apps/server typecheck: 526 errors -> 34.

Root cause of 483 of them: bin.ts imports server.ts for the serve command, which
reaches SourceControlRepositoryService -> SourceControlProviderRegistry ->
ForgejoSourceControlProvider, so the whole CLI effect requires ForgejoCli.
Upstream's CLI never reaches that service, which is why its CliRuntimeLayer
carries none of this and bin.ts is otherwise byte-identical to upstream.

Rather than grow bin.ts with three dependency imports, the wiring lives in a new
fork-owned module, sourceControl/forgejoCliRuntime.expbkt3.ts, exporting
ForgejoCliSelfContainedLive. Upstream entrypoints take one import and one layer
entry each. NodeServices sits in its own provide step there because merged
layers build in parallel, so VcsProcess would not see its ChildProcessSpawner.

Also restores isSessionCredentialInternalError, which the fork tip exported and
the merge dropped when it took upstream's version of that region — the seventh
symbol lost this way.

Remaining fixture work: pullRequests, sentByUserId and the McpInvocationScope
identity fields (principal, actorUserId) added where required.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 34 -> 18.

Adds the fork-required fields upstream's and the fork's fixtures both lack:
ownerUserId / memberUserIds on project shells, and sourceControlProfileId /
ownerUserId / memberUserIds on thread shells, plus rollingSummary /
turnSummaries on the read-model thread shape.

Note the two shapes differ: the server's OrchestrationThreadShell has no
rolling summary or turn summaries, while the decider read-model thread does.
Adding them to the former is a TS2353 'unknown property' error, which is why
they are applied per shape rather than uniformly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 18 -> 12; both remaining source-code errors cleared.

- CodexSessionRuntime: upstream added a paginated thread/turns/list path that
  does not set the fork's `state` on CodexThreadTurnSnapshot. Mapped the same
  way the non-paginated path already does.
- OpenCodeAdapter: the forked-session turn mapping had no `state` either. Its
  messages carry no completion evidence of their own, so they are "unknown" —
  which is exactly the distinction that field exists to record. The readThread
  derivation cannot be reused there; the forked message type has no time or
  error fields.
- Adapter tests and the web-UI registration fixture gained upstream's
  capabilities / clientCapabilities / clientInfo, and a projection upsert call
  gained the fork's sentByUserId.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The merge showed defaultThreadModelSelection as gpt-6-astra while the fork test
expected gpt-5.6-sol. The fork tip carried no T3-CUSTOM marker on DEFAULT_MODEL,
so that value was upstream's at the fork point rather than a deliberate pin —
upstream's bump wins. The test now reads the DEFAULT_MODEL constant instead of a
literal so the next bump does not fail it again.

Also marks the fork-owned ForgejoCli import in bin.ts, which the marker check
flagged.

contracts settings suite: 140/140 green; marker check passes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two Test Server 1 failures, 117/117 green after.

OpenCodeAdapter: upstream's new fork test crashed readThread with 'Cannot read
properties of undefined (reading completed)'. Entries OpenCode returns from a
forked session carry no `time`, and the fork's state derivation assumed it.

Guarding it to "in-progress" would have been wrong and the test says so: a
forked session's retained entries are history with no terminal proof, which is
exactly "unknown". Conflating that with a turn still running is what this field
exists to prevent, so the local snapshot type now carries "unknown" the same
way ProviderThreadTurnSnapshot does.

McpDeviceToolkit: an earlier automated pass added principal/actorUserId to an
assertion's objectContaining rather than to the invocation fixture, so the test
demanded those keys on tool output. Removed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 12 -> 0. contracts, shared, client-runtime, mobile and
server all typecheck clean.

Two are worth noting beyond fixture fields:

- Conditional spreads (`...(cond ? { uploadFeedback } : {})` and the three-way
  compaction spread) make an object literal a UNION of shapes, which
  exactOptionalPropertyTypes will not assign to ProviderAdapterShape. Naming each
  key once with an explicit undefined keeps it a single type; the two adapter
  fields now admit `| undefined` so that is expressible.
- GitManager's fork-added merge/review/check fields did the same thing on a
  spread of a mapped record, and are widened the same way.

The rest are fork-required fields absent from fixtures: sourceControlProfileId on
thread.create dispatches, ownerUserId/memberUserIds on project shells,
sentByUserId on an expected message, the fork's projection-query methods on a
stub, and the fork's activeTurnInput/durableResume on an adapter capability set.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/web typecheck: 51 -> 29.

Imports the merge dropped, each restored from its real owner: DEFAULT_RUNTIME_MODE,
RotateCcwIcon, EnvironmentMachineIcon, resolveEnvironmentMachineKind,
withoutPlanAgentSelection.

Renames followed:
- PendingUserInput.responseMode is upstream's derived `dismissible` flag.
- ProjectFavicon now takes the project record whole rather than environmentId /
  cwd / projectName / projectIcon separately, so the saved title, favicon and
  icon override travel together. Five fork call sites updated.

Two locals lost their binding in the merge: the plan-review button's bottom
offset is the published overlay height held in composerTimelineInset, and the
archive-reclaim section's ids come off scope, as its sibling call already does.

Plus fork-required fixture fields (sentByUserId, durationMs, pullRequests and
the ownership set).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/web had 29 typecheck errors left after the upstream merge: fork-required
fields (sentByUserId, ownerUserId/memberUserIds, durationMs, pullRequests)
missing from upstream test fixtures and new upstream code paths, plus the
planModeAvailable rename in composerProviderState tests.

Three test failures traced to fork behaviour that the merge had silently
dropped or that upstream's tests contradict:

- Rangeless plan-review comments: upstream moved <review_comment> parsing to
  packages/shared/composerContextLegacy.ts, which rejects a block without
  startIndex/endIndex. Re-port the fork's nullable range and author byline
  there, widen ReviewCommentContextRecord additively, and label plan chips by
  plan title. Covered by composerContextLegacy.expbkt3.test.ts.
- sidebarAutoSettleOnMerge/AfterDays: upstream retired these client keys in
  favour of the server preference; the fork's PhaseGroupedSidebar and
  SessionManagerPage now read primaryServerSettingsAtom.
- Turn settlement: the fork settles turns from execution transitions, not
  message completion, so the timeline row-reuse test expects the copy button
  to stay in streaming state until the turn event lands.

Claude Fable 5.1 via Claude Code

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…mobile, server

- client-runtime: the fork's retry-budget reset used Stream.tap, which
  re-chunks the RPC stream to single items and defeated upstream's batched
  shell/thread state writes; switch to Stream.mapArrayEffect so batches reach
  consumers intact.
- server: the fork's per-project thread shell query lacked upstream's new
  branch_pull_request_json column and failed to decode; migration test reads
  the fork's remapped id (1034); snapshot fixtures drop the legacy
  linkedPullRequest that upstream omits without link rows; web UI MCP
  catalog counts follow the current RPC surface (171 tools, 24 streams);
  thread snapshot wire budget allows for fork shell fields.
- desktop/mobile: fixtures follow the fork's frame-src, sentByUserId, and
  the retired client auto-settle keys.

Claude Fable 5.1 via Claude Code

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream's third-party license plugin now fails the web build for packages
without a distributable license or notice file. Declare the fork's plan
editor and webhook dependencies (@platejs/diff, khroma, slate*, jotai-x,
zustand-x, standardwebhooks) in third-party-licenses.config.json.

Mobile tests read MOBILE_APP_VERSION instead of a stale literal, and the
spawn-card expectation drops a durationMs field the row never carried.

Claude Fable 5.1 via Claude Code

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…sage bodies, persist device dismissals

ProviderCommandReactor: the merge re-applied upstream's "skip stop when the
projection says stopped" guard, dropping the fork's rule that a stop request
always reaches the provider. Restored. Upstream's new invariant that turn
start never decodes stored message bodies conflicted with the fork's title
cadence (which counted user messages via the detail read) and its first-prompt
naming (which re-read the conversation). The cadence now uses a fork-only
countThreadUserMessages query on ProjectionSnapshotQuery, and first-prompt
naming hands its prompt to the regeneration worker directly. Upstream test
mocks gain the one-line stub.

Right panel: the fork's persistence filter dropped thread entries with no
surfaces, discarding upstream's dismissedDeviceSurfaceIds after "close all".
Entries that only carry dismissals now persist.

Fork-marker check exempts third-party-licenses.config.json: JSON cannot hold a
marker comment, and the fork's package notices live beside upstream's.

Claude Fable 5.1 via Claude Code

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@tusharbhardwaj-bk
tusharbhardwaj-bk marked this pull request as ready for review September 15, 2026 09:31
@tusharbhardwaj-bk
tusharbhardwaj-bk merged commit 4e10241 into expbkmain Sep 15, 2026
27 of 28 checks passed
tusharbhardwaj-bk added a commit that referenced this pull request Sep 16, 2026
…bkmain

merge: promote expbkmain (upstream c07575f + #173/#174) to bkmain
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.