Skip to content

fix(mobile): allow starting a task with only an image - #17409

Merged
Yash-Singh1 merged 2 commits into
pingdotgg:mainfrom
Claudesaul:fix/mobile-attachment-only-tasks
Oct 10, 2026
Merged

Yash-Singh1 merged 2 commits into
pingdotgg:mainfrom
Claudesaul:fix/mobile-attachment-only-tasks

Conversation

@Claudesaul

Copy link
Copy Markdown
Contributor

Problem

Sharing a photo to T3 Code on iOS opens the new-task composer with the image attached, but Start task stays disabled until you type something.

Change

New tasks required text in four places: canStart and handleStart in NewTaskDraftScreen, buildPendingTaskMessage, and isQueuedThreadCreationSendable. The last one meant that even with the button enabled, the task sat in the outbox and was never sent. All four now accept text or an attachment, the same as follow-up messages and web already do.

Scope and approval

Small fix for an obvious bug. Follow-ups already allow image-only messages, and the server accepts a turn with empty text.

Verification

  • Added a thread-outbox.test.ts case: image with no text is sendable, whitespace-only text isn't. It fails without the fix.
  • vp test run on the outbox and pending-task tests (77 passed); mobile typecheck clean.
  • iOS 27 simulator: Photos → Share → T3 Code. Before, Start task was disabled. After, the thread is created and the agent replies.
  • Android not checked; it uses the same code.
Before After Sent

Model: Claude Opus 5.5; harness: Claude Code.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Oct 9, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 234e740

Macroscope's review found this PR approvable — This is a narrowly scoped mobile bug fix that lets existing attachment payloads start a task without requiring text, while preserving all existing validation and upload safeguards. The accompanying test covers both attachment-only acceptance and whitespace-only rejection.

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

@coderabbitai

coderabbitai Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9aeb6048-30df-4ec9-9273-ce941236ae78
📥 Commits

Reviewing files that changed from the base of the PR and between 234e740 and 6af4488.

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 104f96a4-84ca-4500-b6cf-3ca428b2108d
📥 Commits

Reviewing files that changed from the base of the PR and between 3b6af0b and 234e740.

📒 Files selected for processing (4)
  • apps/mobile/src/features/threads/NewTaskDraftScreen.tsx
  • apps/mobile/src/features/threads/new-task-flow-provider.tsx
  • apps/mobile/src/state/thread-outbox-model.ts
  • apps/mobile/src/state/thread-outbox.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

Task drafts with attachments can now be submitted and queued without prompt text. Model selection and other existing submission requirements remain in place.

Changes

Attachment-only task creation

Layer / File(s) Summary
Allow attachments without prompt text
apps/mobile/src/features/threads/NewTaskDraftScreen.tsx, apps/mobile/src/features/threads/new-task-flow-provider.tsx, apps/mobile/src/state/thread-outbox-model.ts, apps/mobile/src/state/thread-outbox.test.ts
The task screen, pending-message builder, and queued-send check accept attachments when prompt text is empty. Tests cover whitespace-only text and an image attachment.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: juliusmarminge

Merge Risk

Merge Risk: ⚪ Minimal · up to 234e7

Attachment-only task creation carries its attachment through the queued and receiving paths; no actionable merge risk is established.

Security Architecture Review

Security architecture risk: ⚪ Minimal · up to 234e7

The change lets an attachment satisfy the task-content requirement without granting additional permissions or changing how attachments reach the agent. Existing authorization, upload, workspace, and delivery controls remain in place. No material security risk was found introduced or worsened by this change.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The newly reachable case is user-supplied attachment content without accompanying text, delivered to the selected environment and project using existing model, runtime, and workspace choices. The inspected delta does not grant additional agent authority or introduce a new service destination compared with text-plus-attachment creation.

Trust Boundaries and Controls

  • observed — The existing upload path rechecks operation access and verifies the environment before reusing uploaded references. Server launch intake validates attachment limits, requires a thread identity for pending uploads, and claims attachments against that thread before launch. Empty text does not skip these controls.

Resilience and Maintainability Implications

  • observed — The existing transition retains uploaded references through revision-checked persistence before launch, checks concurrent edits and editor ownership, and records delivery before removing the queued row and releasing resources. Server launch reads command receipts, uses a stable initial-message command identity, and reserves preparation to limit duplicate setup. Intake releases unused attachment claims after success and releases claims on errors established to precede acceptance rather than treating every error as rollback-safe.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description check Passed The description includes all required sections. It clearly states the problem, explains the changes across the affected components, gives an applicable scope rationale, and documents focused tests, ma…
Title check Passed The title is concise, uses the required conventional format, and accurately describes the main change: allowing mobile tasks to start with only an image.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@alhss

alhss commented Oct 9, 2026

Copy link
Copy Markdown

Would be helpful

@Yash-Singh1
Yash-Singh1 merged commit 02612c2 into pingdotgg:main Oct 10, 2026
27 checks passed
@Claudesaul
Claudesaul deleted the fix/mobile-attachment-only-tasks branch October 10, 2026 12:07
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 10, 2026
## What's Changed
* fix(web): align compact button touch targets by @Yash-Singh1 in pingdotgg/t3code#17748
* fix(server): t3_thread_launch refuses a new worktree whose base ref has no commit by @tris203 in pingdotgg/t3code#17791
* fix(web): omit underlines on markdown image links by @Saikrishna1876 in pingdotgg/t3code#17728
* fix(server): restore auto resume for wrapped Claude gateway rate limits by @tzachbon in pingdotgg/t3code#17778
* fix(opencode): name OpenCode 2 sessions after their thread by @nkoynov in pingdotgg/t3code#17414
* fix(web): find update settings from the command palette by @sergical in pingdotgg/t3code#17396
* fix(provider-opencode): tell OpenCode Zen and Go models apart by @mr-karan in pingdotgg/t3code#17424
* fix(server): a pull that fast-forwards no longer fails on large Git output by @ScottN-PV in pingdotgg/t3code#17376
* fix(web): cancel question auto-advance after navigation by @maxwellyoung in pingdotgg/t3code#17364
* fix(server): a bare repository name resolves to the signed-in account again by @ScottN-PV in pingdotgg/t3code#17379
* fix(web): a maximized right panel stays maximized when you return to its thread by @jamesvillarrubia in pingdotgg/t3code#17327
* fix(mobile): allow starting a task with only an image by @Claudesaul in pingdotgg/t3code#17409
* fix(server): PR watch no longer reports passed while a second run of a check is still going by @ScottN-PV in pingdotgg/t3code#17344
* fix(server): say why a thread can't be settled by @DylanTX in pingdotgg/t3code#17258
* fix(server): prevent busy terminals from starving history persistence by @StiensWout in pingdotgg/t3code#17181
* feat(server): use macOS .icns app icons as project icons by @psv2522 in pingdotgg/t3code#17149
* fix(mobile): usage reset icon lines up with its row by @Aforno in pingdotgg/t3code#17175
* fix(web): paths pasted after @ keep their underscores by @derektrimm in pingdotgg/t3code#16619
* fix(server): settle every OpenCode subagent call one report answers by @nkoynov in pingdotgg/t3code#17134
* perf(web): switching project keeps Diagnostics and Providers mounted by @flamboh in pingdotgg/t3code#17122
* perf(web): Open Source Licenses downloads its manifest once per session by @flamboh in pingdotgg/t3code#17119
* fix(server): restore OpenCode adapter test typecheck by @Yash-Singh1 in pingdotgg/t3code#17810
* fix(server): Claude subagents show the reasoning effort they run at by @RakshithBhat03 in pingdotgg/t3code#17496

## New Contributors
* @tzachbon made their first contribution in pingdotgg/t3code#17778
* @sergical made their first contribution in pingdotgg/t3code#17396
* @mr-karan made their first contribution in pingdotgg/t3code#17424
* @Claudesaul made their first contribution in pingdotgg/t3code#17409
* @DylanTX made their first contribution in pingdotgg/t3code#17258
* @psv2522 made their first contribution in pingdotgg/t3code#17149

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2922...v0.0.46-nightly.20261010.2935

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261010.2935
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 10, 2026
## What's Changed
* fix(web): align compact button touch targets by @Yash-Singh1 in pingdotgg/t3code#17748
* fix(server): t3_thread_launch refuses a new worktree whose base ref has no commit by @tris203 in pingdotgg/t3code#17791
* fix(web): omit underlines on markdown image links by @Saikrishna1876 in pingdotgg/t3code#17728
* fix(server): restore auto resume for wrapped Claude gateway rate limits by @tzachbon in pingdotgg/t3code#17778
* fix(opencode): name OpenCode 2 sessions after their thread by @nkoynov in pingdotgg/t3code#17414
* fix(web): find update settings from the command palette by @sergical in pingdotgg/t3code#17396
* fix(provider-opencode): tell OpenCode Zen and Go models apart by @mr-karan in pingdotgg/t3code#17424
* fix(server): a pull that fast-forwards no longer fails on large Git output by @ScottN-PV in pingdotgg/t3code#17376
* fix(web): cancel question auto-advance after navigation by @maxwellyoung in pingdotgg/t3code#17364
* fix(server): a bare repository name resolves to the signed-in account again by @ScottN-PV in pingdotgg/t3code#17379
* fix(web): a maximized right panel stays maximized when you return to its thread by @jamesvillarrubia in pingdotgg/t3code#17327
* fix(mobile): allow starting a task with only an image by @Claudesaul in pingdotgg/t3code#17409
* fix(server): PR watch no longer reports passed while a second run of a check is still going by @ScottN-PV in pingdotgg/t3code#17344
* fix(server): say why a thread can't be settled by @DylanTX in pingdotgg/t3code#17258
* fix(server): prevent busy terminals from starving history persistence by @StiensWout in pingdotgg/t3code#17181
* feat(server): use macOS .icns app icons as project icons by @psv2522 in pingdotgg/t3code#17149
* fix(mobile): usage reset icon lines up with its row by @Aforno in pingdotgg/t3code#17175
* fix(web): paths pasted after @ keep their underscores by @derektrimm in pingdotgg/t3code#16619
* fix(server): settle every OpenCode subagent call one report answers by @nkoynov in pingdotgg/t3code#17134
* perf(web): switching project keeps Diagnostics and Providers mounted by @flamboh in pingdotgg/t3code#17122
* perf(web): Open Source Licenses downloads its manifest once per session by @flamboh in pingdotgg/t3code#17119
* fix(server): restore OpenCode adapter test typecheck by @Yash-Singh1 in pingdotgg/t3code#17810
* fix(server): Claude subagents show the reasoning effort they run at by @RakshithBhat03 in pingdotgg/t3code#17496

## New Contributors
* @tzachbon made their first contribution in pingdotgg/t3code#17778
* @sergical made their first contribution in pingdotgg/t3code#17396
* @mr-karan made their first contribution in pingdotgg/t3code#17424
* @Claudesaul made their first contribution in pingdotgg/t3code#17409
* @DylanTX made their first contribution in pingdotgg/t3code#17258
* @psv2522 made their first contribution in pingdotgg/t3code#17149

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2922...v0.0.46-nightly.20261010.2935

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261010.2935
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S 10-29 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants