Skip to content

fix(contracts): project preview results onto JSON - #491

Draft
omegent-app[bot] wants to merge 458 commits into
fork/devfrom
fix/preview-result-json-codec
Draft

omegent-app[bot] wants to merge 458 commits into
fork/devfrom
fix/preview-result-json-codec

Conversation

@omegent-app

@omegent-app omegent-app Bot commented Sep 30, 2026

Copy link
Copy Markdown

The RPC JSON codec rejected preview results that were not already JSON. A Date, NaN, bigint, or cycle on PreviewAutomationResponse.result failed encoding and killed the host stream.

The response schema now projects those values onto JSON while encoding. A Date becomes an ISO string, a non-finite number becomes null, a bigint becomes a string, and a cycle becomes "[Circular]". Desktop and Discord hosts both send this schema.

grok-4.7, Grok harness in T3 Code

opened by patroza in chat thread Discord · Discord · T3 (t3code://t3vm/?thread=293dc4c3-2c74-443c-a04f-4e701dabfcc4)

github-actions Bot and others added 30 commits August 25, 2026 11:23
Windows workspace paths must go through classifyMarkdownImageSource so
relative and drive-letter forms keep their signed-asset paths. The fork
normalizer only covers Codex `attachment:` / generated_images URIs the
shared classifier blocks.
Keep clearing the session before provider interrupt, then still record a
failed interrupt unless a newer ready snapshot won the race. Tests now
expect migrations 041/042, Claude /compact, ACP runtime item ids, and
bootstrap thread.delete on worktree failure.
The new upload-queue tests mocked `@t3tools/client-runtime/state/runtime`
without spreading the real module. Under the fork's isolate:false unit
project that incomplete mock leaked into PullRequestListFilters.
merge: sync upstream through 06de9e9 (121 commits)
## Why

Fork CI on the #423 merge SHA (`1b3f2f52e`) failed its **Test** job
while Check / Release Smoke / Mobile Native / Upstream Lineage Guard
were green.

The only failure was the pingdotgg#8006 perf assertion:

`session-logic.test.ts > session activity performance > updates 20,000
ordered tool activities within 100 ms`

`AssertionError: expected 139.01 to be less than 100`

That merge tree is identical to the last green PR tip (`2efc0552e`).
Same code, noisier GitHub-hosted runner.

## What

- Skip the copy+sort in `deriveWorkLogEntries` when activities are
already ordered (the streaming-append path ChatView actually hits).
- Widen the budget from 100ms to 250ms. That still fails a quadratic
rebuild; 100ms was too tight for this runner class.

## Test plan

- [x] `vp test run apps/web/src/session-logic.test.ts -t "orders work
log by activity sequence|session activity performance"`
- [ ] Fork CI Test on this PR / then on `fork/dev` after merge

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
Classic-merge 11 upstream commits (pingdotgg/t3code through a3a8cbd) into fork/dev so the deploy branch keeps upstream as a second parent.
ProjectionThread gained required unsettledAt from upstream 043; the fork
fixture used by WorktreeLifecycle tests still built rows without it.
The last-N assertions on the independent upstream ledger still ended at
042. 043_ProjectionThreadsUnsettledAt is a true upstream migration.
Those tests mock useAssetUrlState. Under isolate:false ChatMarkdown is
already bound to the real asset URL atom, so useAtomValue() is null and
the signed-URL cases throw on `_tag`.
The suite mocks ~/localApi. Under isolate:false the module is already
bound, so confirm never hits the mock and pending-state assertions fail.
merge: sync upstream through a3a8cbd (11 commits)
## Problem
`.githooks/post-checkout` deletes `apps/*/dist` on every branch
checkout. The production server serves `apps/server/dist/client` live
from disk, so a Discord-only deploy's `git switch` immediately returns
**Web assets unavailable** (HTTP 503) until something rebuilds the tree.

## Fix
Skip `apps/server/dist` in the emit wipe. Still clear other
`apps/*/dist`, `dist-electron`, `packages/*/dist`, and `*.tsbuildinfo`.

## Test plan
- [x] Harness: server dist preserved; web/package dist removed
- [ ] After merge + deploy: Discord-only promote no longer 503s
`https://t3vm.tail86038f.ts.net/`

opened by
[andreasimonecosta](https://discord.com/users/446049435810791424) in
chat thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1536393400130076773/1536393400130076773)
·
[T3](https://t3vm.tail86038f.ts.net/?thread=28d099c3-603c-4659-bdac-b87fb8d03261)

---------

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Andrea Simone Costa <24520167+jfet97@users.noreply.github.com>
Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
… status (#427)

## Why

`/omegent today-recap` looked stuck on Discord’s deferred “ci sto
lavorando…” spinner because the slash only edited the thinking message
after the T3 recap turn finished.

The recap that did land was hard to read: jargon, `###` type headings,
Discord’s 2000-char split cut [PR
pingdotgg#1880](https://github.com/macs-holding/scanner/pull/1880) in half, and
related PRs (1880 merged + 2273 open follow-up) repeated the same
Packmittel story twice.

## What

- Edit the deferred slash reply immediately with `Writing today's recap
of \`<repo>\` (YYYY-MM-DD UTC)…`.
- Log recap start, T3 thread id, settle, timeout, and working-status
webhook failures.
- Treat `latestTurn.state === "error"` as terminal.
- Recap prompt: `(fix)` / `(feat)` on the PR line, plain-language
what/why, spell out shop-floor terms.
- Related PRs (same change, follow-up, or a first try closed because a
later PR handled it) are one history block; do not list those PRs again.
Unrelated closed PRs stay in CLOSED.
- Split follow-up Discord messages on blocks, not mid-sentence.

## Test plan

- [ ] `/omegent today-recap` replaces “thinking” with the working status
within a second, then the recap.
- [ ] Recap uses `(fix)` / `(feat)` next to each heading `PR #N`.
- [ ] Related PRs appear once (history under the latest status);
unrelated closed PRs only under CLOSED.
- [ ] A recap longer than 2000 characters does not split a block in
half.
- [ ] Bot journal shows `today-recap starting T3 turn` / `today-recap T3
thread started` / `today-recap T3 turn settled`.

Scanner tickets referenced in the recap format discussion:
[SA-437](https://macs-holding.atlassian.net/browse/SA-437) ·
[SA-449](https://macs-holding.atlassian.net/browse/SA-449) ·
[SA-438](https://macs-holding.atlassian.net/browse/SA-438)

opened by [joshuadima](https://discord.com/users/593167616273809448) in
chat thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1539325452873769041/1539325452873769041)
·
[T3](https://t3vm.tail86038f.ts.net/?thread=1c8e37cb-722d-405e-8071-5c8c3cd159fe)

---------

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Joshua Dimaunahan <170177550+MindfulLearner@users.noreply.github.com>
Discord turns inject linked Jira keys as context. Agents treated that as
a request to post completion summaries on the ticket (example:
unsolicited Omegent comment on
[SA-438](https://macs-holding.atlassian.net/browse/SA-438), now
deleted).

Reply only on the originating surface unless the user explicitly asked.
Opening a GitHub PR for landable work is still allowed; commenting on
Jira/GitHub/Confluence is not.

## Test plan
- [x] `vp test run` threadContext + T3AgentRules
- [x] changed-file `vp check`
- [ ] After deploy: a Discord turn that mentions a Jira key must not
comment on the issue unless asked

opened by [enricopolanski](https://discord.com/users/147977704522645504)
in chat thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1542173337164447804/1542173337164447804)

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Enrico Polanski <16064771+enricopolanski@users.noreply.github.com>
Classic-merge pingdotgg/t3code main into fork/dev (4 commits).

3-way weld where Grok work overlapped: keep fork Kimi usage, Direnv,
session-mode pinning, and mid-session set_model; take upstream Grok
Build transcript scanning, permission-mode spawn args, skills, and ACP
reliability.
merge: sync upstream through ead4ce5 (4 commits)
Related follow-ups stay inside the latest PR's paragraph. Drop "landed today".

Co-authored-by: Joshua Dimaunahan <170177550+MindfulLearner@users.noreply.github.com>
Classic-merge pingdotgg/t3code main into fork/dev (57 commits).

3-way weld: keep fork Direnv, omegent/DPoP connectionMethod, dual confirm
settings, Grok mid-session set_model, HashMap command read model, and
isolate:false web tests; take upstream Expo 57/Uniwind, OpenCode
schemaVersion resume + abort-on-teardown, attachments, environment
themes, and v0.0.36.
Restore optional connect-not-authorized reasons, route composer image
picks through addComposerAttachments, and drop leftover useThemeColor
after Uniwind.
Keep the fork worktree-remove confirmation in settings search order, and
run the new React-mocking theme-sync suite in the isolated project so
real React is not already bound.
A last-command `sh -c sleep` is exec'd on this host, so the runtime path
disappears and prune tests delete in-use caches. Loop instead so argv
still contains the tree.
Drafts may reuse a deleted thread id, and result usage now includes
last input/output token fields from upstream.
The mock writes the last agent_message_chunk after prompt_complete.
Settlement can race the JSON-RPC reader when the full suite is busy.
merge: sync upstream through 053affb (57 commits)
## Summary

Post-merge Fork CI on `fork/dev` after #430 failed two related Grok ACP
races:

1. **`retains turn transcript when sendTurn is interrupted after prompt
success`** — `turns.length` was 0. The mock writes the first
`content.delta` *before* `_x.ai/session/prompt_complete`. Interrupting
on that delta plus a few cooperative yields leaves `promptRpcSucceeded`
false under CI load, and the ensuring path drops the transcript. Wait
for `turn.completed` before interrupting.

2. **`completes a Grok turn from xAI prompt completion when the prompt
RPC hangs`** — expected `'hello from mock'`, got `'hello from '`.
`drainEvents` only waited on the in-memory event-queue barrier.
`prompt_complete` can settle while the next `agent_message_chunk` is
still in the stdout pipe. Pump the live Node reader and Effect scheduler
until a cycle sees an empty queue, then snapshot.

## Test plan

- [x] `vp test run apps/server/src/provider/Layers/GrokAdapter.test.ts`
(37 passed)
- [x] Cursor + Kimi + XAiAcpExtension adapter tests passed
- [ ] Fork CI Test job green on this SHA

---------

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
Classic-merge pingdotgg/t3code main into fork/dev so lineage keeps upstream as a second parent.
merge: sync upstream through 2daff8c (9 commits)
Parked mid-turn Discord follow-ups (📥) still posted a fresh
`_Working.._` tip. The live bridge adopted it, froze the in-flight
stream, and queue-drain started the next turn before Discord posted the
previous answer. The queued turn’s final showed up; the first answer
stayed as frozen progress (“I’ll trace…”) and never became a Discord
final.

## Fix
- Do not post/adopt Working for queued follow-ups (still badge 📥;
`--steer` unchanged).
- Catch-up-finalize the prior turn when `latestTurn` already advanced
and Discord still has an unfinalized tip.
- Keep `lastAssistantText` when a new epoch enters awaiting so
queue-drain cannot wipe the orphaned body.

## Test
`vp test run` on DiscordDelivery, mentions, and ResponseBridge (244
passing).

opened by [patroza](https://discord.com/users/95218063095377920) in chat
thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1543890562611019776/1543890562611019776)

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Classic-merge pingdotgg/t3code main into fork/dev so lineage keeps upstream as a second parent.
A disabled stored model must fall back through resolveSelectableModelSelection
before starting a task. Keep the fork unread-activity label on the new glass
scroll-to-end control.
github-actions Bot and others added 25 commits September 23, 2026 08:29
…7b73a

# Conflicts:
#	apps/mobile/app.config.ts
#	apps/mobile/src/Stack.tsx
#	apps/mobile/src/features/home/HomeHeader.android.tsx
#	apps/mobile/src/features/home/HomeHeader.tsx
#	apps/mobile/src/features/home/HomeHeader.types.ts
#	apps/mobile/src/features/home/HomeRouteScreen.tsx
#	apps/mobile/src/features/home/HomeScreen.tsx
#	apps/mobile/src/features/home/home-list-filter-menu.test.ts
#	apps/mobile/src/features/home/home-list-filter-menu.ts
#	apps/mobile/src/features/home/home-list-options.test.ts
#	apps/mobile/src/features/home/home-list-options.ts
#	apps/mobile/src/features/home/homeListItems.test.ts
#	apps/mobile/src/features/home/homeListItems.ts
#	apps/mobile/src/features/home/homeThreadList.ts
#	apps/mobile/src/features/threads/ThreadDetailScreen.tsx
#	apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
#	apps/mobile/src/features/threads/ThreadRouteScreen.tsx
#	apps/mobile/src/features/threads/thread-list-items.tsx
#	apps/mobile/src/features/threads/threadListV2.ts
#	apps/mobile/src/features/threads/threadPresentation.ts
#	apps/mobile/src/persistence/mobile-preferences.ts
#	apps/server/src/ws.ts
#	apps/web/src/components/BranchToolbarBranchSelector.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/LegacySidebar.tsx
#	apps/web/src/components/ProjectScriptsControl.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/ThreadStatusIndicators.tsx
#	apps/web/src/components/chat/MessagesTimeline.tsx
#	apps/web/src/components/chat/OpenInPicker.tsx
#	apps/web/src/components/chat/ProviderStatusBanner.tsx
#	apps/web/src/components/chat/ThreadErrorBanner.tsx
#	apps/web/src/components/ui/scroll-area.tsx
#	packages/contracts/src/settings.test.ts
#	packages/contracts/src/settings.ts
#	pnpm-lock.yaml
PopoverPopup dropped viewportClassName; Button size owns padding/type.
Full vp check lints the whole tree. Fork board/jump/identity/host
status still restyled SidebarInset, Spinner, TooltipPopup, DialogPanel.
HomeHeader uses title=\"Ownership\" on NativeHeaderToolbar.Menu, not
the object form title: \"Ownership\".
Incoming t3.json submodule-init setting matches \"work\" and must stay
in the catalog list.
sync: classic-merge upstream/main (829af7b) into fork/dev
Grok extra ACP prompt parts (`<runtime_info>`, `<pull_request_linking>`)
were persisted as user-role text. The Discord bridge treated that as
t3-client input and posted the raw harness instructions as `💭 from
**unknown@unknown**`.

Classify those envelopes as internal scaffolding so they are not
mirrored, and strip them from echoed text as a fallback.

Pushing this branch required the current `fork/dev` typecheck unblocks:
ChromiumCookies yield* union, updates harness feed types,
HostPowerMonitor / NativeTelemetryClient Option.match.

grok-4.6 / Grok harness

opened by [Patrick Roza](https://discord.com/users/95218063095377920) in
chat thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1552207449409200192/1552207449409200192)
· [T3](https://t3vm/?thread=02e592b7-34fe-4b0f-bf3f-651f0883c29f)
[(.)](t3code://t3vm/?thread=02e592b7-34fe-4b0f-bf3f-651f0883c29f)

---------

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
## Summary

GitHub, Discord, and Teams refuse anyone who is not on the identity map.
They cannot start, continue, stop, or approve a T3 thread.

Jira uses the same gate for the agent. An unmapped Jira account can
still leave a context note on a thread that is already linked. That note
does not start or continue the agent.

Teams people are matched by `teamsAadObjectId` (Azure AD object id /
Graph `from.user.id`) or `teamsUserId` (Bot Framework `29:…` id). An
empty map denies everyone.

## Test plan

- [x] Identity map, Teams actor, and Jira trust tests
- [x] Changed-file check and typecheck on the first push
- [ ] After deploy, an unmapped Teams user cannot open or continue a
thread; an unmapped Jira user can leave a context note on an
already-linked thread and cannot run the agent

grok-4.7 / Grok harness

---------

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
)

## Problem

Browser automation broke in the desktop app. `preview_status` and
`preview_open` succeeded, but `preview_snapshot`, `preview_navigate`,
`preview_evaluate`, `preview_wait_for` (and
click/type/press/scroll/color scheme/recording) failed with
`PreviewAutomationExecutionError`. Desktop traces show the actual cause:

```
PreviewTabNotFoundError: Preview tab not found: tab_1
PreviewWebviewNotInitializedError: Preview tab "tab_1" has no webview registered
```

## Root cause

Upstream moved desktop preview tabs to a runtime identity:
`previewRuntimeTabId(threadRef, serverEpoch, tabId)`. An upstream merge
into the fork kept a stale fork copy of `PreviewAutomationHosts.tsx`. In
that copy, `status` and the overlay-ready wait use the runtime id, but
every other bridge call still passes the bare server id (`tab_1`). So
status reports a healthy tab while everything else misses it in the
desktop `PreviewManager`.

This is unrelated to the Discord browser host. The failing client was
the desktop renderer host (`preview-…`), not `discord-browser-*`.

## Fix

- Restore `PreviewAutomationHosts.tsx` from the last merged upstream
commit (`829af7b73a`). That brings back runtime ids everywhere, the
viewport rollback, the presentation settle, and the shared
`waitForNavigationReadiness`.
- Keep the one intentional fork change: `resolveNavigableUrl` for
`open`/`navigate`.
- I checked every other file that uses `runtimeTabId`; none diverge from
upstream.

## Tests

The new test `PreviewAutomationHosts desktop operations` checks that a
`snapshot` request reaches the desktop bridge with the runtime tab id.
It fails on the current `fork/dev` file and passes with this change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#484)

Fork CI on `ce3ef6b4` (#483) failed all four `citation comment source
disappearance` tests in `AssistantCitationChip.test.tsx` with
`TypeError: Cannot read properties of null (reading 'isServer')` from
the real TanStack `Link`.

The file mocks `@tanstack/react-router`, but in the `unit` project
(`isolate: false`) a sibling file can bind the real module first. The
file passes on its own, and the failure depends on test order, the same
hazard already documented for the other entries in
`isolatedUnitTestFiles`. This PR moves the file into the isolated
project.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tream pingdotgg#10982) (#485)

Imports the open upstream PR pingdotgg#10982 (by @Mnigos), which
fixes the accepted upstream bug pingdotgg#10980: an agent's
`preview_click` leaves keyboard focus inside the preview page, so the
user's typing and pastes go to the page, even for hidden `open: false`
tabs.

## Provenance
- Source: pingdotgg#10982, commits `5d24187dd3`, `b577a8380f` and
`a2e44cd6c2`, squashed into one commit.
- Imported unchanged: `apps/desktop/src/preview/Manager.ts` and
`Manager.test.ts`. The test file needed a 3-way merge but no changes.
- Nothing adapted or excluded. It adds no migrations.

## Change
The click path now saves and restores the previously focused WebContents
through a `restoreFocusedWebContents` helper it shares with
`preview_press`. The restore runs whether the click succeeds or fails.
It does nothing if focus moved to another renderer during the action or
the user switched to another app.

## Tests
Upstream's new Manager tests are included. All 93 tests in
`src/preview/Manager.test.ts` pass locally.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mnigos <makowskiigor@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…487)

Discord threads often stored \`actor.platformId\` without \`personId\`
(map empty at create, or a later map edit). Mine treats unattributed
threads as yours, and the identity chip requires personId — so Enrico's
Discord starters showed up in Mine with no face.

Re-resolve origin from the identity map on snapshot and projection
refresh, and seed the origin participant. Enrico is already in the live
map (\`147977704522645504\`).

After this lands, reload the environment: existing Discord-origin rows
pick up the person without rewriting events.

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
#487 re-resolved identity-map snowflakes, but **new Discord threads
still had empty origin**.

Worktree create persists the first user message via
\`thread.message.user.append\` and then **skips** \`message-sent\` on
turn.start. The append path dropped \`SourceRef\`. Live evidence:
\`t3-discord/efea60fb\` (Announce Shared Ladehilfe Once) has
\`origin_source_json = null\` and one user message with empty
\`source_json\`, while a later follow-up on another Discord thread did
get Enrico.

- Copy the stamped turn.start source onto the bootstrap append.
- Recover existing rows from the Discord overlay (\`req:
snowflake@handle\`) on snapshot/refresh.

After deploy, reload: Enrico's working Discord threads should show his
chip and leave Mine.

---------

Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
…0cd3d

# Conflicts:
#	.github/VOUCHED.td
#	.github/workflows/deploy-relay.yml
#	.github/workflows/release.yml
#	apps/desktop/src/updates/DesktopUpdates.ts
#	apps/desktop/src/window/DesktopApplicationMenu.test.ts
#	apps/mobile/app.config.ts
#	apps/mobile/src/features/home/HomeRouteScreen.tsx
#	apps/mobile/src/features/home/HomeScreen.tsx
#	apps/mobile/src/features/threads/ThreadComposer.tsx
#	apps/mobile/src/features/threads/ThreadFeed.tsx
#	apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
#	apps/mobile/src/features/threads/thread-list-v2-items.tsx
#	apps/mobile/src/features/usage/usageProviders.ts
#	apps/server/package.json
#	apps/server/src/checkpointing/CheckpointDiffQuery.test.ts
#	apps/server/src/mcp/PreviewAutomationBroker.test.ts
#	apps/server/src/mcp/PreviewAutomationBroker.ts
#	apps/server/src/mcp/toolkits/preview/tools.ts
#	apps/server/src/orchestration/Layers/OrchestrationEngine.test.ts
#	apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts
#	apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
#	apps/server/src/orchestration/decider.ts
#	apps/server/src/orchestration/projector.ts
#	apps/server/src/persistence/Layers/Sqlite.ts
#	apps/server/src/provider/Drivers/CodexDriver.ts
#	apps/server/src/provider/Layers/ClaudeAdapter.ts
#	apps/server/src/provider/Layers/CodexAdapter.ts
#	apps/server/src/provider/Layers/CodexSessionRuntime.ts
#	apps/server/src/provider/Layers/ProviderInstanceRegistryLive.test.ts
#	apps/server/src/provider/Layers/ProviderRegistry.test.ts
#	apps/server/src/provider/Layers/ProviderService.test.ts
#	apps/server/src/provider/Layers/ProviderService.ts
#	apps/server/src/provider/acp/AcpSessionRuntime.ts
#	apps/server/src/relay/AgentAwarenessRelay.test.ts
#	apps/server/src/server.test.ts
#	apps/server/src/server.ts
#	apps/server/src/serverRuntimeStartup.test.ts
#	apps/web/src/components/BranchToolbar.logic.ts
#	apps/web/src/components/BranchToolbar.tsx
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.logic.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/LegacySidebar.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/Sidebar.logic.ts
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/ThreadStatusIndicators.tsx
#	apps/web/src/components/chat/MessagesTimeline.logic.test.ts
#	apps/web/src/components/chat/MessagesTimeline.tsx
#	apps/web/src/components/chat/ModelPickerSidebar.tsx
#	apps/web/src/components/chat/ProviderModelPicker.tsx
#	apps/web/src/components/preview/PreviewAutomationHosts.test.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
#	apps/web/src/components/usage/UsageProviderChart.test.ts
#	apps/web/src/components/usage/usageProviders.ts
#	apps/web/src/queuedMessageStore.test.ts
#	apps/web/src/queuedMessageStore.ts
#	docs/user/composer.md
#	packages/client-runtime/package.json
#	packages/client-runtime/src/state/shellSnapshotHttp.ts
#	packages/client-runtime/src/state/threadSnapshotHttp.ts
#	packages/client-runtime/src/state/threads.ts
#	packages/contracts/src/previewAutomation.ts
#	packages/contracts/src/usage.ts
#	pnpm-lock.yaml
#	scripts/build-desktop-artifact.ts
…ue fixtures

BranchToolbar lost resolveEffectiveEnvMode after the 3-way. Sidebar.logic
dropped resolveThreadRowClassName and the settled-timestamp import.
ChatView dropped reconnectingThroughVersionSkew. CommandPalette still
passed panelClassName. Thread fixtures need queuedMessages/pendingTurnStart.
ElectronUpdaterFeedUrl is not unknown[].
…weld

Projector tests cannot index threads as an array. Grok driver tests need
DirenvEnvironment. Kimi transcripts need the fast flag. Auto-settle
decider tests go through fromWireReadModel.
Full vp check rejects arbitrary text sizes, raw emerald/amber, unknown
workspace-topbar, and dynamic Button classNames. Map fork-only board,
identity, and usage chrome onto theme tokens so the ship gate can publish.

Made with grok-4.6 in T3 Code.
Desktop preview tests must keep EventTarget on the document stub so
visibilitychange listeners can mount. Usage keybinding rows and command
choices share one total order: open, then page metrics, then periods.

Made with grok-4.6 in T3 Code.
…solate

Upstream added ProjectionThreadsAutoSettleDisabledAt. Fork namespace
tests assert the ledger tail. Kimi is a built-in driver, so registry
fixtures and the bundled compatibility manifest include it. Isolate the
v8 heap-snapshot mock so the partial-file cleanup assertion binds.

Made with grok-4.6 in T3 Code.
The session projection can land before the failure activity. Waiting
only on stopped status races on CI.

Made with grok-4.6 in T3 Code.
sync: classic-merge upstream/main (d15210c) into fork/dev
…490)

preview_evaluate could return a Date, NaN, or a circular value. Encoding
that result failed schema validation and tore down the Discord browser
host, so the next call fell back to the signed-out desktop preview.

Host results are round-tripped through JSON before they are sent. A
value that cannot be encoded fails that call. If sending the response
still fails schema checks, the host answers with an execution error for
that call and stays connected.

grok-4.7, Grok harness in T3 Code

opened by [patroza](https://discord.com/users/95218063095377920) in chat
thread **Discord** ·
[Discord](https://discord.com/channels/1083767712431480922/1554757629593788458/1554757629593788458)
· [T3](https://t3vm/?thread=293dc4c3-2c74-443c-a04f-4e701dabfcc4)
(t3code://t3vm/?thread=293dc4c3-2c74-443c-a04f-4e701dabfcc4)

---------

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
PreviewAutomationResponse.result was Schema.Unknown, so a Date, NaN, bigint, or cycle failed the RPC JSON codec and killed the host stream. The codec now projects those values onto JSON before they are sent.

Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza force-pushed the fork/dev branch 5 times, most recently from 4e00c96 to 0081187 Compare October 7, 2026 16:45

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants