feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid
, '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

feat(swift-ios): show how long completed threads have been done - #7399

Open
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration
Open

feat(swift-ios): show how long completed threads have been done#7399
saphid wants to merge 2 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue119-done-for-duration

Conversation

@saphid

@saphidsaphid commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Problem

Completed threads on SwiftUI Home used the thread's last-update time. A task updated after it finished could therefore look newer than its actual completion.

Implementation

Rich completed rows now use the existing latest-turn completion timestamp for their compact age and VoiceOver text. Invalid or missing completion timestamps keep the existing last-update fallback. Slim rows, non-completed states, the server, and other clients are unchanged.

Verification

  • Current-head GitHub checks passed, including the focused SwiftUI native tests.
  • Swift parsing passed for the five changed files.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD passed.
  • Diff remains limited to five SwiftUI files.

Evidence

Current-head proof is prepared but not attached yet. The exact-head native build was refused before Xcode started because another delivery lane holds the native-build lease. Older captures are intentionally omitted.

Implemented with GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 18, 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: 5509fbc0-8a7f-4c66-a205-0332acb8ac74

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-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 18, 2026
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8c177b5

Macroscope's review found this PR approvable — This is a focused iOS Home metadata adjustment that uses an existing completion timestamp, preserves slim-row and fallback behavior, and adds targeted formatting tests. Its runtime impact is limited to display and accessibility text, with no schema, workflow, infrastructure, or sensitive-data implications.

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

@t3dotgg
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 7b1393e to c618327CompareAugust 18, 2026 22:23

@cursorcursorBot 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 OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c618327. Configure here.

@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 19, 2026 05:05

Dismissing prior approval to re-evaluate 6d7966c

@saphid

Copy link
Copy Markdown
ContributorAuthor

Updated after on-device review: the wording is gone.

Completed rows now show the bare elapsed time since completion15m, 2h 43m, 1d 2h — in the same slot and style as every other row's age label, instead of the earlier Done for <duration> sentence. Verdict from testing on device was simply "I just want how long since it was there".

What did not change is the substance of the feature: the age is still measured from latestTurnCompletedAt (when the task finished), not from last activity. A thread touched a minute ago but finished hours ago reads as hours, not as a minute.

Also in this update:

  • Sub-minute completions read now, matching the existing age vocabulary rather than inventing a <1m form.
  • VoiceOver keeps a full sentence and now substitutes it for the bare status word: "Completed 2 hours, 43 minutes ago" / "Completed just now".
  • Threads with no completion timestamp still fall back to the last-activity age, unchanged.

Same four files, apps/swift-ios only. Focused suite T3CodeTests/HomeThreadMetadataTests: 13/13 passed, 0 failures on this head, and the tree was verified in the simulator — a fixture whose last activity was 9 minutes old but whose completion was 2h 44m old renders 2h 43m, confirming the label follows completion rather than activity.

Coordination trace: T3 thread 50F4FC2B-6485-41E5-80DA-BDCD2BE20428 · saphid/t3code-personal#119

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 19, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Exact-head visual proof refreshed

Captured from PR head 6d7966cd75219e37c1ed98b48fb4b6530e30989e on the canonical proof simulator after installing the Debug app produced by the focused exact-head test build.

The completed Publish the migration guide row shows a multi-hour completion age even though its last activity was only minutes earlier; Sketch the settings redesign is the non-completed control row.

LightDark
Light mode exact-head completion-age proofDark mode exact-head completion-age proof
  • Focused tests: 13/13 passed, exit 0, ** TEST SUCCEEDED **.
  • Light SHA-256: f2031e76b835c22b61ec0791de103824580bf2356c07b24a7ce3776c5fcd6ea2
  • Dark SHA-256: e3d5b5df753c65d4ca2626aec188668f48e093170bd04c8c33f0b141d64e18a5
  • Proof manifest

No video is needed because this change has no interaction or motion behavior.

@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from 6d7966c to b49d8b3CompareAugust 26, 2026 23:20
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 26, 2026 23:20

Dismissing prior approval to re-evaluate b49d8b3

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 26, 2026
@saphid
saphidforce-pushed the feat/issue119-done-for-duration branch from b49d8b3 to c61c020CompareAugust 27, 2026 05:17
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 27, 2026 05:17

Dismissing prior approval to re-evaluate c61c020

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 27, 2026
# Conflicts:
#	apps/swift-ios/App/NativeFeatureClient.swift
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 12:43

Dismissing prior approval to re-evaluate 8c177b5

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

Labels

size:L100-499 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

@saphid