Skip to content

feat(web): configurable browser defaults in Settings → Integrations - #7082

Merged
juliusmarminge merged 8 commits into
mainfrom
browser-viewport-defaults
Aug 16, 2026
Merged

feat(web): configurable browser defaults in Settings → Integrations#7082
juliusmarminge merged 8 commits into
mainfrom
browser-viewport-defaults

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Aug 15, 2026

Copy link
Copy Markdown
Member

Adds a Settings → Integrations page whose first section is Browser, holding the defaults a preview tab opens at.

The preview browser always opened in fill mode, at 100% zoom, following the system appearance, with no way to say otherwise. That's rarely what you want if you work in responsive mode against a handful of known viewports.

What's configurable

Setting Options
Default viewport Fill panel, Responsive (custom W×H), or any device preset — with an orientation toggle
Default zoom Chrome's zoom ladder, 25%–500%
Default appearance System / Light / Dark
Auto-show floating preview Whether an agent-opened preview pops the floating player into view

Notes for review

Defaults apply at creation, not after. The viewport travels with preview.open and zoom/appearance with createTab. Applying them post-registration would paint one frame at 100%/system first — a visible flash on every tab open.

Both entry points collapse onto one setting. This removes an existing inconsistency where hand-opened tabs fell back to 1024×768 and agent-opened tabs to 1280×800. Agents keep a 1280×800 fallback, but only when no default is configured: a fill-mode tab is sized by whatever the panel happens to be, and agents assert against what they open.

Rotation preserves preset identity. resolvePreviewViewport already stores rotated presets as the id plus swapped dimensions, so a rotated iPad Mini stays an iPad Mini rather than decaying into a custom size.

Dimensions commit on blur, via onValueCommitted. Typing 2560 passes through 256, itself a legal dimension, so a change-handler would persist that intermediate size and rewrite settings on every keystroke.

Web clients get the defaults disabled, framed as one dimmed block. They're client-local settings for a Chromium guest only the desktop app hosts — editing them from a browser tab would write preferences belonging to a different client, reading as though the desktop app had been configured when it hadn't. Disabled rather than hidden so the reason is visible.

Testing

Typecheck and lint clean; full suite passing. Exercised in a running dev instance: all controls work, values round-trip through a reload, and settings search indexes every row.

Not covered: a desktop tab actually opening at the configured size. The preview is desktop-only and I verified the settings layer in a web build. The consumption path is traced — registerWebview re-asserts from tab state and navigate preserves both fields, so only closeTab resets — but that's inspection, not a runtime check.

Note

Add configurable browser defaults (viewport, zoom, appearance, floating preview) to Settings → Integrations

  • Adds a new /settings/integrations route and IntegrationsSettingsPanel with a Browser section where users can configure default viewport, zoom, appearance, and auto-show floating preview behavior; controls are disabled outside Electron.
  • Stores the four new browser defaults in ClientSettingsSchema and includes them in the "Restore Defaults" flow and settings search.
  • New preview sessions (opened via automation or manually) now use the user's configured default viewport instead of always defaulting to fill; shouldOpenPreviewMiniPlayer respects the autoShowFloatingPreview preference when the agent doesn't explicitly specify open/show.
  • acquireDesktopTab delays tab creation until client settings are hydrated and passes initial zoom and color scheme to createTab, so tabs no longer start at 100% zoom with the system appearance before defaults are applied.
  • normalizePreviewOpenInput no longer forces open: true by default — both open and show remain unset when neither is provided by the agent.

Macroscope summarized 6489255.


Note

Medium Risk
Touches preview open/automation, desktop IPC tab creation, and server MCP normalization across many entry points; behavior changes for agent floating preview and initial viewport sizing, though defaults are conservative and explicit agent flags still win.

Overview
Adds Settings → Integrations → Browser so users can set default preview viewport, zoom, appearance, and whether agent opens should auto-show the floating preview. These live in new client settings fields and apply when a tab is opened without its own size or visibility.

Defaults are applied at creation so tabs do not flash at 100% zoom / system theme or reflow from fill mode: viewport goes on preview.open, zoom and color scheme on desktop createTab (with zoom clamped to the preset ladder). Imperative open paths await client settings hydration before reading defaults.

Hand-opened tabs and agent preview_open both use the same configured viewport; the server no longer defaults open to true, so unstated agent visibility follows browserAutoShowFloatingPreview on the desktop client. Agent tabs still get a fixed 1280×800 fallback only when the session is still in fill mode after open.

Device-toolbar toggle from fill mode now uses the configured default viewport when set; restore-dirty detection uses structural viewport equality. Web builds show the controls disabled in a framed block; settings search and restore include the new rows.

Reviewed by Cursor Bugbot for commit 6489255. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Aug 15, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 527f8926-ffd2-424c-a26f-9e42bbb43f03

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 15, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One layout finding in the new Integrations settings panel. Everything else (primitive usage, variants, ScreenRotationIcon extraction, notice styling, route/nav wiring) matches the existing settings patterns.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/settings/IntegrationsSettings.tsx Outdated
@juliusmarminge
juliusmarminge force-pushed the browser-viewport-defaults branch from 7e59042 to ab6e0ed Compare August 15, 2026 12:56
Comment thread apps/web/src/components/preview/PreviewAutomationHosts.tsx

/** Non-hook accessor for imperative open paths (menu actions, automation hosts). */
export function getBrowserDefaults(): BrowserDefaults {
return toBrowserDefaults(getClientSettings());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium browser/browserDefaults.ts:47

A preview opened before client-settings hydration completes is created with DEFAULT_CLIENT_SETTINGS for its viewport, zoom, and appearance, and never receives the user's persisted creation defaults. getBrowserDefaults() synchronously reads getClientSettings() while the snapshot still contains built-in values; wait for hydration before this one-shot creation path, or gate preview opening during startup.

🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/web/src/browser/browserDefaults.ts around line 47:

A preview opened before client-settings hydration completes is created with `DEFAULT_CLIENT_SETTINGS` for its viewport, zoom, and appearance, and never receives the user's persisted creation defaults. `getBrowserDefaults()` synchronously reads `getClientSettings()` while the snapshot still contains built-in values; wait for hydration before this one-shot creation path, or gate preview opening during startup.

@github-actions

github-actions Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 12.6 KiB 12.6 KiB +10 B (+0.1%) 15.1 KiB
Codex Thread snapshot wire 6.3 KiB 6.3 KiB +2 B (+0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.3 KiB 6.3 KiB +8 B (+0.1%) 7.8 KiB
Codex Live turn WebSocket decoded 51.8 KiB 51.8 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 16 16 0 (0.0%) 21
Claude Total thread wire 12.6 KiB 12.6 KiB +9 B (+0.1%) 15.1 KiB
Claude Thread snapshot wire 6.3 KiB 6.3 KiB +1 B (+0.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.3 KiB 6.3 KiB +8 B (+0.1%) 7.8 KiB
Claude Live turn WebSocket decoded 52.7 KiB 52.7 KiB 0 B (0.0%) 66.4 KiB
Claude Live turn messages 16 16 0 (0.0%) 21

Baseline: ad11723 · PR result: 6489255 · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UI consistency review of the new Integrations settings panel and the extracted ScreenRotationIcon. Two findings on apps/web/src/components/settings/IntegrationsSettings.tsx; the viewport-row minimum-width overflow flagged in the previous run is still present and unaddressed (not re-posted here).

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/settings/IntegrationsSettings.tsx Outdated
Comment thread apps/web/src/components/settings/IntegrationsSettings.tsx Outdated
juliusmarminge and others added 6 commits August 15, 2026 16:26
The preview browser always opened in fill mode, at 100% zoom, following the
system appearance. That is rarely what you want if you work in responsive mode
against a handful of known viewports, and there was no way to say otherwise.

Adds a Settings → Integrations page whose first section is Browser, holding the
defaults a preview tab opens at: viewport (fill, responsive, or a device
preset), zoom, and appearance. They apply to every entry point that opens a tab
without stating its own size — a hand-opened browser panel and an agent calling
`preview_open` alike.

The viewport travels with `preview.open` and zoom/appearance with `createTab`,
so a tab is born configured rather than reflowing a frame later.

Agents keep their 1280x800 fallback, but only when no default is configured:
a fill-mode tab would otherwise be sized by whatever the panel happens to be,
and agents assert against what they open.

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

Three follow-ups to the browser defaults:

The dimension inputs were bare `Input type=number` at w-16, which clipped
4-digit values ("1280" rendered as "128("). They are now `NumberField`, the
repo's real numeric control, widened to fit and with grouping switched off so
a height reads "1024" rather than "1,024".

They commit on blur via `onValueCommitted` instead of per keystroke. Typing
"2560" passes through "256", which is itself a legal dimension, so a
change-handler would persist that intermediate size and rewrite settings on
every key.

Adds an orientation control next to the dimensions, reusing the device
toolbar's rotate affordance — its icon moves to a shared module rather than
being duplicated. Rotating a preset keeps the preset: `resolvePreviewViewport`
already stores rotated presets as the id plus swapped dimensions, so a rotated
iPad Mini stays an iPad Mini instead of decaying into a custom size.

Adds `browserAutoShowFloatingPreview` (on by default) for whether an
agent-opened preview pops the floating player into view. An explicit
`open`/`show` on `preview_open` still wins: that is the agent deliberately
surfacing or hiding its work, which shouldn't be overridden by a default.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The preview browser is a Chromium guest the desktop app hosts, so its defaults
mean nothing in a web client. They are also client-local, which is why these
are disabled rather than hidden: editing them from a browser tab would write
preferences belonging to a different client, reading as though the desktop app
had been configured when it hadn't.

Follows the pattern Keybindings already uses for a desktop-only concern — an
inline notice above the affected controls. Reset affordances are withheld too,
since there is nothing to reset from here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Disabling each control on its own left labels and descriptions at full
strength, so the group still read as editable. The defaults now sit in a
bordered, dimmed block with the reason at its top.

The explanation stays outside the dimmed area: the one part that must remain
readable is the part saying why the rest isn't.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two sentences explaining where the browser runs, when one clause says it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`preview.open` now carries the configured default viewport and `createTab`
carries the zoom/appearance defaults, so the call-shape assertions had to move
with them.

PreviewView's test stubs `browserDefaults` directly rather than deepening the
`state/session` mock: the component now reaches `useSettings`, which pulls in
`state/server`, and a test about browser chrome shouldn't drag the settings and
connection graph along with it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@juliusmarminge
juliusmarminge force-pushed the browser-viewport-defaults branch from ab6e0ed to cca9dc8 Compare August 15, 2026 14:27
@juliusmarminge
juliusmarminge marked this pull request as ready for review August 15, 2026 14:29

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit cca9dc8. Configure here.

Comment thread packages/contracts/src/settings.ts
@macroscopeapp

macroscopeapp Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. This PR introduces a new feature (browser defaults in Settings → Integrations) with new UI components, new routes, new settings schema fields, and runtime behavior changes to how preview tabs are created and configured. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

juliusmarminge and others added 2 commits August 15, 2026 16:34
Three findings from the UI-consistency check, all in the new panel:

The viewport cluster forced a hard minimum width — `min-w-36` on the select
plus a non-shrinking group of two `w-24` fields and the rotate button — so the
row overflowed at narrow widths once a non-fill default was set. The cluster
now wraps and the fields are narrower.

Control heights were mixed in one `items-center` row: a default-size select
beside `sm` number fields and an `icon-sm` button. The select is now `sm` too,
so all three measure 28px.

The wrapper's `opacity-64` compounded with each primitive's own
`disabled:opacity-64`, dimming the controls to roughly 0.41 alpha — dimmer
than disabled controls anywhere else in Settings. The wrapper now dims only
the row text, leaving each control at the standard disabled opacity.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three ways the configured browser defaults were not reaching a tab:

Restore defaults skipped them entirely. They are unified settings like every
other preference on that button, so they now take part in both the dirty
labels and the reset. The viewport is a tagged union, so comparing it needs
structural equality — identity would have reported a freshly decoded copy of
the default as changed.

`browserAutoShowFloatingPreview: false` was ignored for `preview_open`.
`normalizePreviewOpenInput` filled an omitted `open` with `true` on the server,
so by the time the renderer asked "did the agent state a preference?" the
answer was always yes. The server now leaves unstated visibility unstated,
which is the only thing it can honestly say — the preference is desktop-local
and unreadable from there.

A preview opened before client settings hydrated was born at the schema
defaults and never corrected. The three imperative open paths now await
hydration, which costs nothing: they were already async.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 16, 2026
fontSizePrompt: DEFAULT_UNIFIED_SETTINGS.fontSizePrompt,
fontSizeCode: DEFAULT_UNIFIED_SETTINGS.fontSizeCode,
fontSizeTerminal: DEFAULT_UNIFIED_SETTINGS.fontSizeTerminal,
browserDefaultViewport: DEFAULT_UNIFIED_SETTINGS.browserDefaultViewport,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium settings/SettingsPanels.tsx:667

restoreDefaults persists the four browser defaults for web clients even though the Integrations controls disable those settings there, so Restore defaults bypasses that platform restriction and changes web-only stored settings. Guard these assignments with the desktop/platform capability (or omit them for web clients) before calling useUpdatePrimarySettings.

🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/web/src/components/settings/SettingsPanels.tsx around line 667:

`restoreDefaults` persists the four browser defaults for web clients even though the Integrations controls disable those settings there, so Restore defaults bypasses that platform restriction and changes web-only stored settings. Guard these assignments with the desktop/platform capability (or omit them for web clients) before calling `useUpdatePrimarySettings`.

@juliusmarminge
juliusmarminge merged commit 949feb6 into main Aug 16, 2026
20 checks passed
@juliusmarminge
juliusmarminge deleted the browser-viewport-defaults branch August 16, 2026 23:59
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 17, 2026
## What's Changed
* fix(pull-requests): protect provider API budgets by @Bil0000 in pingdotgg/t3code#6466
* feat(web): configurable browser defaults in Settings → Integrations by @juliusmarminge in pingdotgg/t3code#7082


**Full Changelog**: pingdotgg/t3code@v0.0.34-nightly.20260816.1112...v0.0.34-nightly.20260817.1113

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34-nightly.20260817.1113
torturado pushed a commit to torturado/t3code that referenced this pull request Aug 17, 2026
…ingdotgg#7082)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 17, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's round-9 work into the v2-owned surfaces:

- settings: main's Integrations page (#7082) coexists with the branch's
  Scheduled Tasks page in the path union, section labels, icons, and
  search catalog
- contracts: main's preview appearance/zoom/viewport settings imports
  restored beside the branch's modelSelection home for ModelSelection
- mobile: main's built-in themes (#6619) re-applied to the v2 thread
  screens and work log (useThemeColor over hand-rolled color-scheme
  ternaries)
- MessagesTimeline: main's #7157 cleanup adopted (toolCallExpandedBody
  class name unexported, implementation-detail test dropped)
- ChangedFilesTree: main's styled tooltip (#7209) carrying the v2 runId
- pullRequestDetail tests: branch's row-action coverage renamed onto
  main's buildAddSelectionToAgentHandoff (#6597)
- lint: migrated the six branch-owned native title tooltips that main's
  new no-native-title-tooltip rule (#7209) flags to styled Tooltips
  (GitActionsControl, QueuedRunsControl, TimelineSystemDivider,
  MessagesTimeline intent badge and MCP tool logo)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
frankdavidcorona pushed a commit to frankdavidcorona/t3code that referenced this pull request Aug 17, 2026
…ingdotgg#7082)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
radroid added a commit to radroid/t3code that referenced this pull request Aug 17, 2026
The design docs were written against merge-base 196c8ea (2026-08-14).
upstream/main has since moved to a4cc136 — 116 commits in three days —
so re-measure everything load-bearing before turning the design into a
plan, rather than assuming it still holds.

It holds. The beachhead is unclaimed: session_crons, ScheduleWakeup and
CronCreate return zero hits across apps/server and packages/contracts,
options.hooks is set nowhere in ClaudeAdapter, mcp/toolkits/ still holds
only preview, and not one of the 116 commits mentions a loop, cron,
schedule or automation. ProviderSessionReaper, ThreadBackgroundLiveness,
rightPanelStore.ts and the _chat route are unchanged; Sidebar.logic.ts
is still zero-diff; pinning survives intact, so Direction A is still free.

Three findings change the docs:

pingdotgg#5127 settles pending user-inputs as EMPTY answers on session stop.
AskUserQuestion still blocks, so that finding stands, but a question
nobody answers is no longer merely stranded — the agent now receives {},
a thing shaped like a decision that carries none, and proceeds on it.
That strengthens the case for a durable raise_blocker, and it means the
console cannot derive its list from hasPendingUserInput, which reads
false afterwards. BACKEND gains 9.1b; TESTS gains 7b (5 cases, 157->162).

pingdotgg#4466 disables hooks on capability probes — which confirms, by its own
stated reason, that user hooks DO run in ordinary sessions.

pingdotgg#7082 shipped /settings/integrations: a three-day-old worked example of
the exact operation the Loops settings section needs. It prices decision
3 at two small additive seam rows and shows which two expensive rows to
avoid. Caveat: settingsSearch.ts has taken 3 commits in 3 days, so it is
no longer the quiet file the earlier estimate assumed.

Also de-cite ClaudeAdapter line numbers, which drifted ~600 lines in
three days. Cite the structural anchor instead — line numbers in a
churn-12 file are a liability in a document meant to outlive a sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
radroid added a commit to radroid/t3code that referenced this pull request Aug 17, 2026
The design docs were written against merge-base 196c8ea (2026-08-14).
upstream/main has since moved to a4cc136 — 116 commits in three days —
so re-measure everything load-bearing before turning the design into a
plan, rather than assuming it still holds.

It holds. The beachhead is unclaimed: session_crons, ScheduleWakeup and
CronCreate return zero hits across apps/server and packages/contracts,
options.hooks is set nowhere in ClaudeAdapter, mcp/toolkits/ still holds
only preview, and not one of the 116 commits mentions a loop, cron,
schedule or automation. ProviderSessionReaper, ThreadBackgroundLiveness,
rightPanelStore.ts and the _chat route are unchanged; Sidebar.logic.ts
is still zero-diff; pinning survives intact, so Direction A is still free.

Three findings change the docs:

pingdotgg#5127 settles pending user-inputs as EMPTY answers on session stop.
AskUserQuestion still blocks, so that finding stands, but a question
nobody answers is no longer merely stranded — the agent now receives {},
a thing shaped like a decision that carries none, and proceeds on it.
That strengthens the case for a durable raise_blocker, and it means the
console cannot derive its list from hasPendingUserInput, which reads
false afterwards. BACKEND gains 9.1b; TESTS gains 7b (5 cases, 157->162).

pingdotgg#4466 disables hooks on capability probes — which confirms, by its own
stated reason, that user hooks DO run in ordinary sessions.

pingdotgg#7082 shipped /settings/integrations: a three-day-old worked example of
the exact operation the Loops settings section needs. It prices decision
3 at two small additive seam rows and shows which two expensive rows to
avoid. Caveat: settingsSearch.ts has taken 3 commits in 3 days, so it is
no longer the quiet file the earlier estimate assumed.

Also de-cite ClaudeAdapter line numbers, which drifted ~600 lines in
three days. Cite the structural anchor instead — line numbers in a
churn-12 file are a liability in a document meant to outlive a sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
radroid added a commit to radroid/t3code that referenced this pull request Aug 17, 2026
Main was force-rewritten under this branch while the plan was being
written — the daily sync landed its 116-commit rebase, so the branch's
base df027ec stopped being an ancestor of main and the two shared only
the upstream merge-base. That is the documented force-landing hazard,
and opening a PR from it would have shown 175 commits and a conflict
that cannot be resolved on the branch. Rebased the nine docs commits
onto the new main instead; they touch only docs/coil/loops-v2, so it was
clean. Recovery tag coil/pre-rebase-loops-20260817.

The landing is good news twice over. Main now sits on merge-base
a4cc136 — exactly the tree UPSTREAM-DELTA measured against — and is
zero commits behind upstream, so those findings describe the fork's
current main rather than a future one. And the plan's only sequencing
constraint dissolved: phase 4's settingsSearch.ts row had to wait for
the sync carrying pingdotgg#7082 or it would collide with the integrations entry
on the way in. That entry is now in the tree, so the row lands beside it.

Re-ran every load-bearing claim against the fork's own post-sync tree,
which is a stronger check than against upstream, because it is the tree
the work would be built on. Nothing moved: the beachhead is still empty
(session_crons, ScheduleWakeup, CronCreate all zero across server and
contracts; options.hooks unset; toolkits still only preview), the
mcpServers spread anchor is present, Sidebar.logic.ts is still zero-diff,
the overlay row is still +10/-6 as costed, pinnedAt is still in contracts,
and phase 0's debt is still two scope-auth mirrors. Recorded as
UPSTREAM-DELTA section 7 so a reviewer can see the check rather than
take the claim.

One number did move: the seam ledger re-baselined to 53 files,
+2590/-1042. Phase costs are re-quoted against it. The line counts fell
across a 116-commit range, which is upstream absorbing fork work.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
…ingdotgg#7082)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
radroid added a commit to radroid/t3code that referenced this pull request Aug 18, 2026
The design docs were written against merge-base 196c8ea (2026-08-14).
upstream/main has since moved to a4cc136 — 116 commits in three days —
so re-measure everything load-bearing before turning the design into a
plan, rather than assuming it still holds.

It holds. The beachhead is unclaimed: session_crons, ScheduleWakeup and
CronCreate return zero hits across apps/server and packages/contracts,
options.hooks is set nowhere in ClaudeAdapter, mcp/toolkits/ still holds
only preview, and not one of the 116 commits mentions a loop, cron,
schedule or automation. ProviderSessionReaper, ThreadBackgroundLiveness,
rightPanelStore.ts and the _chat route are unchanged; Sidebar.logic.ts
is still zero-diff; pinning survives intact, so Direction A is still free.

Three findings change the docs:

pingdotgg#5127 settles pending user-inputs as EMPTY answers on session stop.
AskUserQuestion still blocks, so that finding stands, but a question
nobody answers is no longer merely stranded — the agent now receives {},
a thing shaped like a decision that carries none, and proceeds on it.
That strengthens the case for a durable raise_blocker, and it means the
console cannot derive its list from hasPendingUserInput, which reads
false afterwards. BACKEND gains 9.1b; TESTS gains 7b (5 cases, 157->162).

pingdotgg#4466 disables hooks on capability probes — which confirms, by its own
stated reason, that user hooks DO run in ordinary sessions.

pingdotgg#7082 shipped /settings/integrations: a three-day-old worked example of
the exact operation the Loops settings section needs. It prices decision
3 at two small additive seam rows and shows which two expensive rows to
avoid. Caveat: settingsSearch.ts has taken 3 commits in 3 days, so it is
no longer the quiet file the earlier estimate assumed.

Also de-cite ClaudeAdapter line numbers, which drifted ~600 lines in
three days. Cite the structural anchor instead — line numbers in a
churn-12 file are a liability in a document meant to outlive a sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
radroid added a commit to radroid/t3code that referenced this pull request Aug 18, 2026
Main was force-rewritten under this branch while the plan was being
written — the daily sync landed its 116-commit rebase, so the branch's
base df027ec stopped being an ancestor of main and the two shared only
the upstream merge-base. That is the documented force-landing hazard,
and opening a PR from it would have shown 175 commits and a conflict
that cannot be resolved on the branch. Rebased the nine docs commits
onto the new main instead; they touch only docs/coil/loops-v2, so it was
clean. Recovery tag coil/pre-rebase-loops-20260817.

The landing is good news twice over. Main now sits on merge-base
a4cc136 — exactly the tree UPSTREAM-DELTA measured against — and is
zero commits behind upstream, so those findings describe the fork's
current main rather than a future one. And the plan's only sequencing
constraint dissolved: phase 4's settingsSearch.ts row had to wait for
the sync carrying pingdotgg#7082 or it would collide with the integrations entry
on the way in. That entry is now in the tree, so the row lands beside it.

Re-ran every load-bearing claim against the fork's own post-sync tree,
which is a stronger check than against upstream, because it is the tree
the work would be built on. Nothing moved: the beachhead is still empty
(session_crons, ScheduleWakeup, CronCreate all zero across server and
contracts; options.hooks unset; toolkits still only preview), the
mcpServers spread anchor is present, Sidebar.logic.ts is still zero-diff,
the overlay row is still +10/-6 as costed, pinnedAt is still in contracts,
and phase 0's debt is still two scope-auth mirrors. Recorded as
UPSTREAM-DELTA section 7 so a reviewer can see the check rather than
take the claim.

One number did move: the seam ledger re-baselined to 53 files,
+2590/-1042. Phase costs are re-quoted against it. The line counts fell
across a 116-commit range, which is upstream absorbing fork work.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XL 500-999 changed lines (additions + deletions). 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.

1 participant