Repository navigation
ci(mobile): fork PRs now get the Native Change label - #26755
Conversation
The fingerprint check runs PR code under pull_request, so fork PRs get a read-only token and the label step was skipped. The check now uploads the changed platforms as an artifact, and a workflow_run workflow on main reads it as data and syncs the label for every PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — Fork PRs gain the existing native-change label through a separate trusted workflow, while PR-executed code loses write permissions. Artifact validation and PR matching contain the change to advisory labeling without altering production release behavior. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Produce the fingerprint result .github/workflows/mobile-fingerprint-check.yml |
The check uploads the changed platform list as a one-day artifact. It no longer manages the label or requests label-write permissions. |
Validate the completed run and pull request .github/workflows/mobile-fingerprint-label.yml |
The workflow proceeds only for successful pull-request runs. It requires one unexpired result artifact and one open pull request matching the run’s head commit, branch, and repository. |
Validate result and update the label .github/workflows/mobile-fingerprint-label.yml |
The workflow accepts only supported platform values. It creates or updates label metadata, adds the label when a platform changed, and removes it when the result is empty. |
Priority:
Estimated code review effort: 3 (Moderate) | ~25 minutes
Suggested reviewers: macroscopeapp
Merge Risk: 
Minimal · up to 48d8e
-
No actionable issue is established. Fork labeling still needs an end-to-end check after the workflow is available on the default branch.
Pre-merge checks: 
3 · 
1
-
Failed checks: 1 warning Passed checks: 3 passed-
Full details: Title check
-
Explanation
The title names the change: fork PRs now receive the Native Change label. It follows the conventional commit format and is specific. The raw summary and objectives both describe splitting fingerprint checking from label updates so fork PRs can be labeled. The title does not name the split itself, but it states the primary user-facing result.
-
Full details: Description check
-
Explanation
The description covers the problem (fork PRs never get the Native Change label, and the label step was gated off for forks) and the change (the workflow split into an untrusted check and a trusted workflow_run labeler). It also covers verification (YAML parsing, vp fmt, value-check tests) and the post-merge end-to-end check. The template's Scope and approval section is missing. It does not link a triaged bug issue or maintainer approval, and it does not explain why the change qualifies without one. The description also omits the screenshot and UI guidance, which does not apply here.
Resolution
Add a '## Scope and approval' section. Link the triaged bug issue or the discussion that records maintainer approval of this direction, including the approval comment. If no prior issue exists, explain why this fix qualifies as a very small, focused fix of an obvious bug. Keep the existing Problem, Change, and Verification content. Rename the sections to match the template headings if they differ. Remove the Claude model line only if the repository does not require it; the template asks agent users to name the model and harness, and the current line already does so.
-
Finishing Touches
-
🧪 Generate unit tests (beta)
-
- Commit to this branch
- 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.
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
## What's Changed * docs(agents): agents verify in a browser or simulator without asking by @juliusmarminge in pingdotgg/t3code#26637 * feat(pull-requests): manage GitHub maintainer edits by @Bil0000 in pingdotgg/t3code#25588 * fix(web): image chips drop the pill and match other chips by @flamboh in pingdotgg/t3code#26379 * fix(mobile): align settled and active thread rows by @PixPMusic in pingdotgg/t3code#26622 * fix(server): publish local git status before remote lookup by @JustYannicc in pingdotgg/t3code#21046 * fix(server): outside MCP clients get thread links they can open by @t3dotgg in pingdotgg/t3code#26642 * fix(web): double-click selects the whole inline code span by @t3dotgg in pingdotgg/t3code#26639 * fix(acp): ID-only command approvals keep the tracked command and grant the terminal by @juliusmarminge in pingdotgg/t3code#26647 * fix(cursor): subagent ls, lint and MCP results no longer fail the parent run by @juliusmarminge in pingdotgg/t3code#26592 * perf(web): long-thread timeline rebuilds 45 → 9 ms, tool updates 12 → 0.3 ms by @juliusmarminge in pingdotgg/t3code#26727 * fix(mobile): a thread opened while reconnecting no longer turns into a new draft by @shivamhwp in pingdotgg/t3code#26565 * fix(web): keep settled drop hint inside the sidebar viewport by @Yash-Singh1 in pingdotgg/t3code#26736 * feat(devices): Simlock setup uses each machine's agent-device token, checks tokens, and lists the pool through worker reconnects by @juliusmarminge in pingdotgg/t3code#26706 * fix(web): pull request diff follows the file tree, with a hide-tests filter by @juliusmarminge in pingdotgg/t3code#26730 * fix(mobile): delivered messages no longer reappear at the bottom of long threads by @juliusmarminge in pingdotgg/t3code#26739 * ci(mobile): fork PRs now get the Native Change label by @juliusmarminge in pingdotgg/t3code#26755 * fix(claude): command approvals show the command, not Claude's description of it by @maria-rcks in pingdotgg/t3code#20145 * docs: add nixpkgs installation instructions by @0x4bs3nt in pingdotgg/t3code#26750 * feat(server,web,mobile): fall back when the default provider is out of usage by @maria-rcks in pingdotgg/t3code#26164 * fix(ci): fork PRs now resolve in workflow_run PR lookups by @juliusmarminge in pingdotgg/t3code#26779 **Full Changelog**: pingdotgg/t3code@v0.1.4-nightly.20261028.3841...v0.1.4-nightly.20261029.3853 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.4-nightly.20261029.3853
Fork PRs never get the
📱 Native Changelabel, e.g. https://git.cafe/pingdotgg/t3code/pulls/26452, which edits Swift in a local Expo module. The fingerprint check runs PR code underpull_request, so a fork run has a read-only token, and the label step was gated off for forks.The fix splits the workflow into two halves, the same way the desktop macOS preview does:
mobile-fingerprint-check.yml(untrusted, runs PR code) no longer touches labels. It uploads a one-linefingerprint-resultartifact with the changed platforms (empty when none changed). Its token drops tocontents: read.mobile-fingerprint-label.ymlruns onworkflow_runfrom main with a write token. It resolves the PR from the checked commit (workflow_run.pull_requestsis empty for forks), skips the run if the PR's head moved on, reads the artifact as bytes and validates it (onlyios,android, or both), then syncs the label with the existing script. It never checks out or runs PR code.Same-repo PRs go through the same path, so there is one labeling path for every PR. A fork that edits the check workflow can at most mislabel its own PR, because the PR number comes from the commit lookup, not from the artifact.
Verified: YAML parses,
vp fmtis clean, and the value check accepts and rejects the expected inputs.workflow_runonly runs from the default branch, so the end-to-end check happens after merge: any new event on https://git.cafe/pingdotgg/t3code/pulls/26452 (push or title edit) should label it.Model: Claude Opus 5.5 in Claude Code (T3 Code).
🤖 Generated with Claude Code