fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(web): preserve composer draft during worktree setup - #9197

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup
Sep 2, 2026
Merged

fix(web): preserve composer draft during worktree setup#9197
maria-rcks merged 1 commit into
pingdotgg:mainfrom
maria-rcks:t3code/preserve-composer-during-setup

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Draft promotion deleted composer state when setup completed, so follow-up text typed while a remote worktree action was running disappeared. This moves the draft to the canonical scoped thread key when promotion finalizes and covers edits made during promotion in the existing store tests.

Verification: 101 focused store tests, web typecheck, targeted lint, and a real app flow with an eight-second worktree setup passed. Real T3 Code verification video.

Implemented with gpt-5.6-sol in the Codex harness.


Note

Medium Risk
Touches composer draft lifecycle during promotion finalization; wrong key handling could duplicate or leak drafts, but scope is limited to the promoting-draft cleanup path with added test coverage.

Overview
Fixes composer text disappearing when a draft thread finishes promoting (for example while a remote worktree setup is still running). Finalizing promotion used to drop the draft’s composer state when cleaning up draft-thread mappings; it now relocates that state onto the canonical scoped thread key from promotedTo instead of revoking attachments and deleting the draft entry.

removeDraftThreadReferences accepts an optional destination ref for that move. finalizePromotedDraftThread only runs when a promoting draft exists and passes promotedTo through. Store tests now assert prompts survive on the real thread after finalize, including text typed on the draft id after markPromotedDraftThread.

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

Note

Fix finalizePromotedDraftThread to preserve composer data on canonical thread

  • Composer text written while a draft is being promoted was lost when the draft thread was removed during finalization.
  • removeDraftThreadReferences now accepts an optional canonical destination; when supplied, it re-keys the draft's composer data to the canonical thread instead of revoking preview URLs.
  • finalizePromotedDraftThread passes the promoted destination to the helper so the composer data survives cleanup.
  • Risk: removals without a destination still revoke preview URLs, but any caller that previously relied on composer data being discarded during promotion will now see it retained under the canonical key.

Macroscope summarized b080411.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at b080411

Macroscope's review found this PR approvable — This is a narrowly scoped web bug fix that moves composer state from a promoted draft ID to the existing canonical scoped thread key, preserving text entered during worktree setup. The accompanying test covers the promotion-time edit scenario, with no schema, configuration, security, billing, or deployment impact.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks
maria-rcks merged commit f14f41b into pingdotgg:mainSep 2, 2026
23 checks passed
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* feat(updates): continue active threads across server restarts by @maria-rcks in pingdotgg/t3code#9167
* fix(mobile): prevent message and composer overlap by @juliusmarminge in pingdotgg/t3code#9195
* fix(web): preserve composer draft during worktree setup by @maria-rcks in pingdotgg/t3code#9197
* fix(web): prevent two-digit list markers from being clipped by @G-R3 in pingdotgg/t3code#9101
## New Contributors
* @G-R3 made their first contribution in pingdotgg/t3code#9101
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1256...v0.0.39-nightly.20260902.1257
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1257
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR 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

@maria-rcks