Skip to content

Commit 111ec52

Browse files
Merge remote-tracking branch 'origin/main' into fix/issue-30273
# Conflicts: # apps/server/src/mcp/toolkits/device/handlers.ts
2 parents 044d489 + f5ae808 commit 111ec52

2,308 files changed

Lines changed: 192862 additions & 60193 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.agents/skills/contribution-triage/SKILL.md‎

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,12 @@ from evidence you could not access. Do not run untrusted PR code merely to decid
7171
Read the guide's linked sections before applying these checks. Inspect enough source to substantiate
7272
scope and behavioral claims; leave the full correctness, security, and performance audit to code review.
7373

74-
- Under [prior approval](../../../CONTRIBUTING.md#prior-approval), identify the actual failure and
75-
intended behavior. Inspect maintainer responses in the linked issue or discussion, including what
76-
direction and scope they approved. A link, label, or acknowledgment alone is not approval. Judge a
77-
claimed obvious-bug exception by purpose, impact, and necessary changes, without numeric cutoffs.
78-
Separately assess focused configuration of an established capability: identify what already exists,
79-
what the option controls, and its effects and necessary scope. This route does not require a proven
80-
obvious bug. Adding a setting alone establishes neither a new feature nor an approval exemption.
74+
- Under [fix a bug](../../../CONTRIBUTING.md#prior-approval), identify the actual failure and
75+
intended behavior. A feature, or anything on the guide's not-interested list, warrants closure
76+
unless a maintainer in the trusted exemption list asked for that PR. Inspect the request and the
77+
direction and scope it covers. A link, label, or acknowledgment alone is not a request. Judge a
78+
claimed bug fix by purpose, impact, and necessary changes, without numeric cutoffs. A setting that
79+
adds a workflow or changes a default is a feature.
8180
Check whether an alleged fix intentionally changes product behavior or overlooks an existing workflow.
8281
Preserve any useful documentation, onboarding, or discoverability problem when declining the solution.
8382
- Under [one problem](../../../CONTRIBUTING.md#one-problem), trace how each material change contributes
@@ -90,27 +89,18 @@ scope and behavioral claims; leave the full correctness, security, and performan
9089
as the guide requires them. Do not demand unrelated evidence or repo-wide tests. An unavailable local
9190
platform does not defeat adequate contributor evidence. Do not infer fabrication or AI authorship
9291
from writing style, suspicion, or a check you cannot reproduce.
92+
- Under [models](../../../CONTRIBUTING.md#models), use only the model and harness the PR names,
93+
usually in its closing attribution line.
9394

94-
### Configuration and workflow examples
95-
96-
- Hosting CLI-path configuration in [#11653](https://github.com/pingdotgg/t3code/pull/11653) is eligible
97-
for deeper review under the maintainer's ruling: it makes an existing capability configurable.
98-
It need not qualify as an obvious-bug repair or obtain prior feature approval on that basis.
99-
Still assess one underlying problem, necessary scope and credible verification. Deeper review can
100-
reject the configuration mechanism or its implementation.
101-
- Preserving Files as an independent tab in [#14436](https://github.com/pingdotgg/t3code/pull/14436)
102-
changes tab lifetime and navigation. The maintainer classified it as a broader workflow change
103-
requiring prior product-direction approval, which is absent. Propose closure for missing approval
104-
in a dry run, or carry out closure in authorized enforcement. Its good evidence does not make it
105-
eligible or justify keeping it pending after that ruling. The remedy is to obtain scope approval.
106-
107-
Use these examples to distinguish effects, not to exempt every configuration option. Apply current
108-
trusted policy and reassess changed submission evidence; neither example grants permanent eligibility.
95+
Bans in the guide are a maintainer decision. Report suspected spam to maintainers; do not ban or
96+
threaten a ban.
10997

11098
## Apply the outcome
11199

112100
Do not automatically close a PR if a maintainer in the trusted `TRIAGE_EXEMPTIONS.td` list has
113101
commented or submitted a review, including on earlier heads, or if `triage:keep-open` is present.
102+
Comments that triage itself posted, such as an earlier notice or question, are not maintainer
103+
involvement, even when they were posted from a maintainer's account on that maintainer's behalf.
114104
Leave protected PRs open for maintainer decision. This does not grant an author exemption,
115105
eligibility, or review approval.
116106

@@ -126,20 +116,30 @@ comment text but do not write to GitHub. Keep the eligibility finding separate f
126116
This is a routing exception, not a claim that the PR passed eligibility or correctness review.
127117
- **Closure warranted.** The assessment is complete and establishes a specific policy violation.
128118
Prepare a clear explanation under [closure and reconsideration](../../../CONTRIBUTING.md#closure-and-reconsideration),
129-
post it, and close the PR. Verify that the explanation is present and the PR is closed. The comment
119+
post it, then read the repository variable `PR_LIMITS_ENFORCE`
120+
(`gh variable get PR_LIMITS_ENFORCE -R pingdotgg/t3code`). When it prints `true`, apply
121+
`triage:closing` as the last thing you do to the PR, verify that the explanation and the label
122+
are present, and do not close the PR yourself:
123+
[pr-limits.yml](../../../.github/workflows/pr-limits.yml) closes it 72 hours after the label. Any
124+
activity on the PR after the label, including a further comment or label from you, removes the
125+
label; treat an author's reply or push as new evidence, reassess, and apply the label again only
126+
if the finding still holds. When the command prints any other value, or fails saying the variable
127+
was not found, the variable is off and nothing would close a labeled PR: close it yourself and
128+
verify that the explanation is present and the PR is closed. Only another failure, such as a
129+
permission error, means the variable cannot be read; then report the closure as incomplete. The comment
130130
must name the violated rule, cite supporting submission evidence, link the maintained guide section,
131131
and give a concrete remedy. Missing contributor evidence can warrant closure; explain what must be
132-
established. Missing product approval calls for maintainer discussion, not an agent's product decision.
132+
established. The remedy for a feature is an Ideas discussion, not an agent's product decision.
133133
Close for multiple problems only when the independence of those changes is supported. Closing a PR
134134
does not require a configured Macroscope label.
135135
- **Needs explanation or maintainer decision.** Name the unresolved question and who can resolve it.
136136
Post the specific question on the PR when commenting is within the authorized scope, and verify it
137137
was posted. If tracing the source leaves an extra diff's necessity unclear, request the causal
138138
explanation needed. If established facts leave a product-direction choice to maintainers, identify
139139
that choice. Leave the PR open and pending that answer; do not mark it eligible. Do not substitute
140-
"the agent was uncertain" for a violated rule. Once maintainers establish that a workflow change
141-
requires approval and that approval is absent, apply the closure outcome instead of retaining a
142-
pending classification. Good verification does not cure missing approval.
140+
"the agent was uncertain" for a violated rule. Once a change is established as a feature with no
141+
maintainer request, apply the closure outcome instead of retaining a pending classification. Good
142+
verification does not make a feature eligible.
143143
- **Incomplete; retry required.** State the failed retrieval, missing access, truncated diff, or unfinished
144144
assessment and what is needed to resume. Do not convert operational failures into policy violations
145145
or hand the PR off as having passed. An inaccessible artifact is different from an omitted artifact.
@@ -173,9 +173,10 @@ description, evidence, approvals, existing triage comments, PR open/closed state
173173
label when relevant. Reassess changes that could invalidate the finding. Reuse an existing explanation
174174
only if it still matches the current finding; avoid duplicate comments, closures, or label applications.
175175

176-
For closure, establish that the required explanation is posted before closing. If posting fails or its
177-
result is ambiguous, read back the comments before retrying or proceeding. If the comment succeeds but
178-
closure fails, preserve the comment and retry only the unfinished closure after checking current state.
176+
For closure, establish that the required explanation is posted before applying `triage:closing` or
177+
closing. If posting fails or its result is ambiguous, read back the comments before retrying or
178+
proceeding. If the comment succeeds but the label or the closure fails, preserve the comment and retry
179+
only that unfinished step after checking current state.
179180
Handle a failed or ambiguous label application the same way: inspect labels before any retry. If access
180181
or state still cannot be verified, report an incomplete action and the step needed to resume. Do not
181182
retry blindly or claim success for an unverified action.

‎.agents/skills/test-t3-mobile/SKILL.md‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,15 @@ prints one JSON line; on failure it names the next command. Mobile verification
4343
includes that step unless the user prohibits it.
4444

4545
For a device you opened in an agent-device session elsewhere (a device pool,
46-
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>`
47-
from the directory you opened the session in. It installs the cached build into
48-
that session (`--abi arm64-v8a` for an ARM Android device; `--metro <url>` also
49-
opens it against Metro) and never builds.
46+
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>
47+
--config <file>` from the directory you opened the session in, passing the
48+
`--config` file from `device_open`'s `targetArgs`. Without it, a device pool's
49+
gateway refuses the install, wrongly saying agent-device is too old. It installs
50+
the cached build into that session (`--abi arm64-v8a` for an ARM Android device;
51+
pool Android emulators are x86_64, the default; `--metro <url>` also opens it
52+
against Metro). Without a cached build for this checkout it builds first, which can
53+
outlast the lease, so run `vp run mobile:install <ios|android> --prepare` (with
54+
the same `--abi`) before you open the device.
5055

5156
Start `vp run dev:client` from `apps/mobile`, or reuse a healthy Metro belonging
5257
to this checkout. Open its printed development-client URL with AgentDevice

‎.github/VOUCHED.td‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ github:btsouth
2222
github:cestercian
2323
github:chrisdeeming
2424
github:chuks-qua
25+
-github:coygeek Filed over 270 automated issues, about 50 a day at peak, far past what maintainers can triage
2526
github:cursoragent
2627
github:D3OXY
2728
github:dbalders
@@ -83,6 +84,7 @@ github:tris203
8384
github:tsouth89
8485
github:UtkarshUsername
8586
github:vitalyiegorov
87+
-github:wSedlacek Opened over 130 unapproved PRs in 12 days, far past the open PR limit
8688
github:Yash-Singh1
8789
github:yashranaway
8890
github:Ymit24

‎.github/actions/setup-ci-deps/action.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ runs:
3535
- name: Cache Vite+
3636
id: vp_cache
3737
if: steps.vp.outputs.version != ''
38-
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
38+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
3939
with:
4040
path: ~/.vite-plus
4141
key: vite-plus-home-v2-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}-node${{ steps.vp.outputs.node }}-${{ steps.vp.outputs.pnpm }}
@@ -56,7 +56,7 @@ runs:
5656
# partial bytes, so a shorter limit costs a slow download only a retry.
5757
- name: Setup Vite+
5858
if: steps.vp_cache.outputs.cache-hit != 'true'
59-
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1
59+
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
6060
env:
6161
VP_DOWNLOAD_TIMEOUT: "120"
6262
with:
@@ -92,7 +92,7 @@ runs:
9292
- name: Restore pnpm store
9393
id: pnpm_cache
9494
if: inputs.install == 'true'
95-
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
95+
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
9696
with:
9797
path: ${{ steps.pnpm_store.outputs.path }}
9898
key: pnpm-${{ steps.pnpm_store.outputs.namespace }}-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
@@ -106,7 +106,7 @@ runs:
106106
- name: Restore lockfile verification
107107
id: pnpm_verified
108108
if: inputs.install == 'true'
109-
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
109+
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
110110
with:
111111
path: ${{ steps.pnpm_store.outputs.verified }}
112112
key: pnpm-verified-v1-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
@@ -121,7 +121,7 @@ runs:
121121

122122
- name: Save lockfile verification
123123
if: inputs.install == 'true' && steps.pnpm_verified.outputs.cache-hit != 'true'
124-
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
124+
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
125125
with:
126126
path: ${{ steps.pnpm_store.outputs.verified }}
127127
key: ${{ steps.pnpm_verified.outputs.cache-primary-key }}
@@ -138,7 +138,7 @@ runs:
138138
steps.pnpm_cache.outputs.cache-hit != 'true' &&
139139
(steps.pnpm_store.outputs.namespace == 'full' ||
140140
steps.pnpm_cache.outputs.cache-matched-key != format('pnpm-full-v1-{0}-{1}-{2}', runner.os, runner.arch, hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json')))
141-
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
141+
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
142142
with:
143143
path: ${{ steps.pnpm_store.outputs.path }}
144144
key: ${{ steps.pnpm_cache.outputs.cache-primary-key }}

‎.github/pull_request_template.md‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,11 @@ reproduction steps or environment where relevant. -->
1515
<!-- Explain how this fixes the problem. If it spans components or clients,
1616
explain why those changes are needed for the same fix. Split independent fixes. -->
1717

18-
## Scope and approval
19-
20-
<!-- Link the triaged bug issue or the discussion with explicit maintainer approval
21-
of direction and scope, including the approval comment. For a very small, focused
22-
fix of an obvious bug, explain why it qualifies without a prior issue or discussion.
23-
For focused configuration of an established capability, explain what already exists,
24-
what the option controls, and why its effects stay within that capability. Adding a
25-
setting alone is not a new feature or an approval exemption; broader workflow or
26-
behavior changes still need approval. Scope and verification requirements still apply.
27-
There is no line-count or file-count cutoff. -->
18+
## Scope
19+
20+
<!-- We accept bug fixes, not features. Link the issue that shows the bug. For a
21+
small fix of an obvious bug, say why it needs no issue. If a maintainer asked for
22+
this PR, link the request. -->
2823

2924
## Verification
3025

‎.github/readme/hero.webp‎

142 KB
Loading

‎.github/scripts/check-nightly-release.cjs‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,54 @@ async function resolveLatestNightlyCommit({ github, context, core }) {
121121
return { tag, sha: commit.sha, version };
122122
}
123123

124+
// The two places a nightly install looks for an update: the `update-feed` pointer, and
125+
// releases.atom, which holds the 10 newest git tags of any kind. Older installs take the first
126+
// nightly in the feed. Reports what each names beside the newest published nightly.
127+
async function readNightlyUpdateFeed({ github, context, fetch = globalThis.fetch }) {
128+
const latest = await findLatestNightly({ github, context });
129+
if (!latest) return {};
130+
131+
const base = `https://github.com/${context.repo.owner}/${context.repo.repo}`;
132+
// Only a missing or malformed pointer is stale. Rewriting deletes the old file first, so a
133+
// GitHub outage must not look like one.
134+
// Node waits five minutes for a stalled response, which is this job's whole time limit.
135+
const signal = () => AbortSignal.timeout(30_000);
136+
const pointer = await fetch(`${base}/releases/download/update-feed/nightly.json`, {
137+
signal: signal(),
138+
});
139+
if (!pointer.ok && pointer.status !== 404) {
140+
throw new Error(`The update-feed pointer answered HTTP ${pointer.status}.`);
141+
}
142+
let pointerTag;
143+
if (pointer.ok) {
144+
// A body that fails to arrive throws here; only one that is not JSON counts as malformed.
145+
const body = await pointer.text();
146+
try {
147+
pointerTag = JSON.parse(body)?.tag_name;
148+
} catch {}
149+
}
150+
151+
// An unreadable feed leaves `feedTags` unset, so the pointer is still repaired. An error page
152+
// can answer HTTP 200, so only an Atom document counts as read.
153+
let feedTags;
154+
try {
155+
const feed = await fetch(`${base}/releases.atom`, { signal: signal() });
156+
const body = feed.ok ? await feed.text() : "";
157+
if (/<feed[\s>]/.test(body)) {
158+
feedTags = Array.from(body.matchAll(/href="[^"]*\/releases\/tag\/([^"]+)"/g), (match) =>
159+
decodeURIComponent(match[1]),
160+
);
161+
}
162+
} catch {}
163+
const feedNightly = feedTags?.find((tag) => /^v?\d+\.\d+\.\d+-nightly\./.test(tag));
164+
165+
return { tag: latest.tagName, pointerTag, feedNightly, feedTags };
166+
}
167+
124168
module.exports = {
125169
assertCommitOnDefaultBranch,
126170
assertReleaseSource,
127171
shouldReleaseNightly,
128172
resolveLatestNightlyCommit,
173+
readNightlyUpdateFeed,
129174
};

0 commit comments

Comments
 (0)