Skip to content

Commit a393ff0

Browse files
radroidclaude
andcommitted
ci(t3x): raise the test timeout for the fork's slower runners
The sync branch's CI failed on apps/web/src/lib/stashImageCompression.test.ts timing out at 15s. A control run proved this is upstream-inherited and not a rebase defect: branch t3x/ci-control-upstream — pristine upstream/main plus only this workflow file, zero fork patches — fails identically (run 30386125253). Cause is an environment mismatch, not a bug. apps/web/vite.config.ts pins testTimeout to 15s, tuned for upstream's blacksmith runners. This fork runs on 2-core ubuntu-latest. The test is the worst-case path in its file (every quality step fails, so it runs the full nested loop) at ~3s locally — 6x the next slowest test there — which leaves too little headroom on slower hardware. Fixed in the fork-owned workflow rather than by patching apps/web/vite.config.ts, which would add a 35th row to the seam ledger and permanent rebase cost for what is purely a CI-environment problem. 60s is what the root vite.config.ts already uses, so this only stops apps/web's tighter override from applying on hardware it wasn't tuned for; timeout-minutes remains the backstop for a hung test. Also documents the control experiment in the sync runbook, so the next red verify gets diagnosed instead of assumed. Review fixes (found by an independent review of this work): - SEAMS.md: the settings.ts risk was 70, but the row is +7/-2 = 9 lines against churn 14 = 126. Corrected and re-sorted. The other 33 rows and both totals were verified correct. - SEAMS.md: the header pinned merge-base 89c5a19, which this very sync makes stale. Updated to 887dd6e, with a note that churn/risk still reflect the old base until the absorbed commits age into the window. - SEAMS.md: the regeneration command used `--since="60 days ago"` (anchored to today) while the prose defines churn relative to the merge-base, so the ledger was only reproducible on the day it was written. - claude.md: attributed account identification to `claude auth status`; the app actually reads the SDK initialization result. Reworded so the command is presented as a way to observe the effect, not as the mechanism. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 9a1fb6a commit a393ff0

4 files changed

Lines changed: 56 additions & 11 deletions

File tree

.github/workflows/t3x-ci.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@ jobs:
4747
if: ${{ !cancelled() }}
4848
run: vp run lint
4949

50+
# `--testTimeout` is raised because `apps/web/vite.config.ts` pins testTimeout to 15s, which is
51+
# tuned for upstream's blacksmith runners. This fork runs on 2-core ubuntu-latest, where
52+
# upstream's `stashImageCompression` worst-case test (~3s on an M-series Mac; 6x the next
53+
# slowest in its file) reliably exceeds 15s and fails the whole gate.
54+
#
55+
# Proven upstream-inherited, not a fork regression: branch `t3x/ci-control-upstream` — pristine
56+
# upstream/main plus this workflow file and nothing else — fails identically (run 30386125253).
57+
#
58+
# 60s is not arbitrary: it is what the ROOT vite.config.ts already uses. This only stops
59+
# apps/web's tighter local override from being applied on slower hardware than it assumes.
60+
# The job's own `timeout-minutes` remains the backstop against a genuinely hung test.
5061
- name: Test
5162
if: ${{ !cancelled() }}
52-
run: vp run test
63+
run: vp run test --testTimeout=60000

docs/providers/claude.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ normal login.
3333

3434
> **Do not type `~/.claude` into that field.** Leaving it empty and pointing it at the default
3535
> directory are not the same thing. Setting `CLAUDE_CONFIG_DIR` explicitly changes how Claude Code
36-
> looks up its stored credentials, and the account stops being identified — `claude auth status`
37-
> still reports `"loggedIn": true` but returns `"email": null`, so T3 Code can no longer show you
38-
> which account the instance is using. Leave the field empty for your main account.
36+
> looks up its stored credentials, and the account stops being identified: you stay logged in, but
37+
> the account's email is no longer reported, so T3 Code cannot show you which account the instance is
38+
> using. You can see this for yourself — `claude auth status` returns your email with no prefix, but
39+
> `CLAUDE_CONFIG_DIR=~/.claude claude auth status` returns `"loggedIn": true` with `"email": null`.
40+
> Leave the field empty for your main account.
3941
4042
## I Want Work And Personal Claude Accounts
4143

docs/t3x/SEAMS.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
**The authoritative list of every upstream-owned file this fork edits.**
44

55
Measured, not asserted: **34 upstream-owned files, +1466 / -112 lines**, against merge-base
6-
`89c5a192f`. Everything else the fork adds lives in new files upstream has never seen and cannot
7-
conflict.
6+
`887dd6e45` (the 2026-07-28 upstream sync). Everything else the fork adds lives in new files upstream
7+
has never seen and cannot conflict.
8+
9+
The churn and risk columns are still measured against the _previous_ merge-base `89c5a192f`, because
10+
the 45 commits absorbed by that sync have not yet aged into a 60-day window. Recompute them at the
11+
next sync.
812

913
Regenerate this ledger before trusting it — see [Regenerating](#regenerating) at the bottom. An
1014
earlier version of this file claimed the surface was 2 files and "Contracts / persistence: _None._"
@@ -45,10 +49,10 @@ Sorted by risk, worst first.
4549
| `apps/desktop/src/backend/DesktopBackendConfiguration.ts` | +29 | 5 | **145** | Backend heap headroom (`NODE_OPTIONS`) |
4650
| `apps/web/src/components/chat/ComposerPrimaryActions.tsx` | +53/-13 | 2 | **132** | Queue button; extracts upstream's inline stop button |
4751
| `apps/desktop/src/backend/DesktopBackendConfiguration.test.ts` | +42 | 3 | **126** | Heap-headroom assertions |
52+
| `packages/contracts/src/settings.ts` | +7/-2 | 14 | **126** | `notifyOnNeedsInput` (**persisted schema**) + Claude `homePath` placeholder/description |
4853
| `packages/shared/src/composerTrigger.test.ts` | +31/-1 | 3 | **96** | `replaceTextRange` newline coverage |
4954
| `apps/server/src/sourceControl/SourceControlProviderDiscovery.ts` | +20/-8 | 3 | **84** | Issue #4: CLI probe timeout + spawn-error classification |
5055
| `apps/server/src/server.ts` | +3 | 25 | **75** | The intended mount point: one import, one `Layer.provideMerge`, one route entry |
51-
| `packages/contracts/src/settings.ts` | +7/-2 | 14 | **70** | `notifyOnNeedsInput` (**persisted schema**) + Claude `homePath` placeholder/description |
5256
| `apps/desktop/src/main.ts` | +4 | 17 | **68** | `ElectronNotification` layer |
5357
| `apps/web/src/connection/platform.ts` | +7/-1 | 7 | **56** | Lazy `import()` of outbox cleanup to dodge a module-init cycle |
5458
| `apps/web/src/routes/__root.tsx` | +6 | 9 | **54** | Mounts `<NotificationCoordinator>`, `<ThreadOutboxDrain>`, `<PushSubscriptionManager>` |
@@ -115,11 +119,17 @@ git diff --numstat "$MB"..HEAD | while read -r a d p; do
115119
done
116120
```
117121

118-
That prints exactly the upstream-owned files the fork edits. Churn for any one of them:
122+
That prints exactly the upstream-owned files the fork edits. Churn for any one of them — anchored to
123+
the merge-base date, **not** to today, so the number is reproducible after the fact:
119124

120125
```bash
121-
git log --oneline --since="60 days ago" "$MB" -- <path> | wc -l
126+
SINCE=$(git show -s --format=%cI "$MB")
127+
git log --oneline --since="$SINCE" --until="$SINCE" --before="$SINCE" "$MB" -- <path> | wc -l
128+
# simpler and equivalent: the 60 days of upstream history ending at the merge-base
129+
git log --oneline "$MB" --since="$(git show -s --format=%cI "$MB") -60 days" -- <path> | wc -l
122130
```
123131

124-
Re-run both after every upstream sync and update this file. If the ledger and this document
125-
disagree, the ledger is right.
132+
**Re-run both after every upstream sync and update this file — including the merge-base hash in the
133+
header.** Every churn and risk figure shifts once the newly absorbed commits fall inside the window,
134+
so a ledger quoting an old merge-base is stale even when its file list is still right. If the
135+
regenerated ledger and this document disagree, the ledger is right.

docs/t3x/sync-agent-runbook.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ created) shows up in the Actions tab as **skipped**, not as an error. Check ther
6868
a rebase that is not the problem. Read the `**Result:**` / `**kind:**` line first; a `weekly-build`
6969
failure means fix the build.
7070
71+
### When verify goes red on code the fork does not own
72+
73+
A sync can import an upstream test that fails **in this fork's CI but not upstream's**, because
74+
upstream runs on `blacksmith-*` runners and the fork runs on 2-core `ubuntu-latest`. Before treating
75+
a red verify as a bad rebase, run the control experiment — it takes two minutes and gives a
76+
definitive answer:
77+
78+
```
79+
git switch --detach upstream/main
80+
git checkout <sync-branch> -- .github/workflows/t3x-ci.yml
81+
git switch -c t3x/ci-control-upstream && git commit -am "ci: control run" && git push -u origin HEAD
82+
gh workflow run t3x-ci.yml -R radroid/t3code --ref t3x/ci-control-upstream
83+
```
84+
85+
That branch is pristine upstream plus one fork-owned file. If it fails the same way, the failure is
86+
upstream-inherited and no fork patch caused it. Delete the branch afterwards.
87+
88+
Fix such failures in `.github/workflows/t3x-ci.yml` (fork-owned) rather than by patching the upstream
89+
file — patching adds a row to `docs/t3x/SEAMS.md` and permanent rebase cost for a CI-environment
90+
problem. The `--testTimeout` override on the Test step exists for exactly this reason; its comment
91+
records the case.
92+
7193
## What the agent does (and what a human doing it locally should do)
7294
7395
This is the checklist the workflow prompt mirrors — follow it if you resolve locally instead.

0 commit comments

Comments
 (0)