test(perf): qualify A3 Jobs integration and mobile split tradeoff

This commit is contained in:
cesnimda
2026-11-10 22:49:53 +01:00
parent b6ee418c7a
commit 70ddee8d3d
10 changed files with 1335 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
# A3 Jobs performance integration
Base `6bfdbd9db72e06f18f8aa9aaf57b025bff55ce5b` on `codex/a3-ui-10`. Commit `b8292f6f7299daa704bbe41efa8081660c2b6e27` integrates the relevant deltas from isolated `af33e455` and `97d06180`. The salary call and read configuration were reapplied at their current A3 locations because the older JobTable context had changed. The current selection, filters, board and Trash implementations stay in place.
The mobile salary display uses the selected EN/NB number format and established period labels. Original text and unknown imported periods remain displayable. Jobs and Trash update existing error copy with the language without fetching the same page again. Retry continues to fetch the current query.
The deferred JobTable trial passed 96 selected tests across nine suites, full lint and the static export build with TypeScript. The first run had one obsolete Landing test selector for “Norsk”. The existing accessible name is “Norsk bokmål”. Only the test selector was updated. The first failure and green receipts are retained.
The comparison uses Chromium 151, cold isolated contexts, local static exports, blocked external requests, and a synthetic 15-application response. The separate desktop and emulated mobile profiles use fixed network and CPU settings. Public routes must request zero private application rows. Each cold Jobs load must request exactly one page. Gzip sizes are estimates at level 6, and route marker timings include browser polling. These are not production timings or field Web Vitals.
## Deferred JobTable trial held from A3
The temporary candidate used `b8292f6f` and the isolated App import change from `85ebbd9f`, with trial App blob `f98ce042fd36e0b5880aa6108c6d601a3976820f`. The baseline export was built from `6bfdbd9d`. [Paired data](evidence/a3-jobs/PAIRED.json) has three cold repeats per route, build and profile. Order alternated. A local graph index refresh briefly overlapped the experiment. Desktop used 40 ms / 10 Mbps / CPU 1×. The 390 px phone profile used 150 ms / 1.6 Mbps / CPU 4×.
| Route | Raw JS before → trial | Desktop median marker | Phone median marker |
| --- | ---: | ---: | ---: |
| Landing | 2,024,172 → 1,782,542 B | 2,445 → 1,921 ms | 12,124 → 11,445 ms |
| Login | 2,024,172 → 1,782,542 B | 2,448 → 1,924 ms | 11,997 → 10,789 ms |
| Jobs | 2,052,915 → 2,082,356 B | 2,433 → 2,440 ms | 13,314 → 13,773 ms |
The trial saves 241,630 raw JS bytes and 71,651 estimated gzip bytes on each public route. Jobs adds 29,441 raw bytes. The slow phone profile showed a 459 ms median first-row delay with all three candidate samples later than the baseline samples. Retain the eager JobTable import in A3. The isolated experiment remains available for a revised loading strategy that protects the Jobs marker.
## Published source checks
The final eager source at `b6ee418c7a93f1fe3dcdb687b26fd4cf8a489587` also integrates the isolated `4c12f769` Admin System metric change. It uses the current locale for database size and CV benchmark percentages, preserving status freshness and existing controls. No benchmark or diagnostic action was invoked. The final 55 tests across Admin System, JobTable and Jobs integration, full lint and static export with TypeScript passed. These tests overlap the trial run and are reported separately.
A focused [browser check](evidence/a3-jobs/LOCALE.json) dispatched an English-to-Bokmål storage event after the Jobs row was visible. The extra paged GET count fell from one to zero on desktop and emulated phone, with one initial GET on each build. The row remained visible, the document language changed and no write was attempted. One fresh context per build and profile. This check qualifies the cross-tab language change without saving preferences to a live account.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,205 @@
{
"chromium": "151.0.7922.34",
"repetitions": 1,
"fixtureJobs": 15,
"profiles": [
{
"name": "desktop",
"viewport": {
"width": 1366,
"height": 900
},
"latencyMs": 40,
"downloadKbps": 10000,
"uploadKbps": 5000,
"cpu": 1
},
{
"name": "mobile",
"viewport": {
"width": 390,
"height": 844
},
"isMobile": true,
"hasTouch": true,
"deviceScaleFactor": 3,
"latencyMs": 150,
"downloadKbps": 1600,
"uploadKbps": 750,
"cpu": 4
}
],
"exports": {
"baseline": {
"root": "C:\\Users\\Connor\\AppData\\Local\\Temp\\a3-jobs-baseline-6bfdbd9d",
"indexSha256": "0c85270af2322b269312e76aa8ce14b5748d03ae4fd61ee3a611f2af617db68c"
},
"candidate": {
"root": "C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\out",
"indexSha256": "6c99c2c1b31cd567025e38add38c7c0300a04339c73f83b6068c5a326b995931"
}
},
"caveats": "Synthetic GET fixtures are immediately fulfilled, third-party calls are blocked, assets are uncompressed on loopback, sampled LCP/layout shifts are lab observations.",
"medians": [
{
"profile": "desktop",
"path": "/jobs",
"build": "baseline",
"contentMs": 2472,
"jsRawBytes": 2052915,
"jsGzip6Estimate": 606602
},
{
"profile": "desktop",
"path": "/jobs",
"build": "candidate",
"contentMs": 2445,
"jsRawBytes": 2052966,
"jsGzip6Estimate": 606643
},
{
"profile": "mobile",
"path": "/jobs",
"build": "baseline",
"contentMs": 13455,
"jsRawBytes": 2052915,
"jsGzip6Estimate": 606602
},
{
"profile": "mobile",
"path": "/jobs",
"build": "candidate",
"contentMs": 13233,
"jsRawBytes": 2052966,
"jsGzip6Estimate": 606643
}
],
"samples": [
{
"trial": 1,
"profile": "desktop",
"build": "baseline",
"path": "/jobs",
"localeReadDelta": 1,
"contentMs": 2472,
"sampledLcpMs": 2252,
"observedLayoutShiftSum": 0.23809328599150012,
"js": {
"files": 20,
"raw": 2052915,
"gzip6Estimate": 606602
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "desktop",
"build": "candidate",
"path": "/jobs",
"localeReadDelta": 0,
"contentMs": 2445,
"sampledLcpMs": 2208,
"observedLayoutShiftSum": 0.23809328599150012,
"js": {
"files": 20,
"raw": 2052966,
"gzip6Estimate": 606643
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "mobile",
"build": "baseline",
"path": "/jobs",
"localeReadDelta": 1,
"contentMs": 13455,
"sampledLcpMs": 12668,
"observedLayoutShiftSum": 0.03510786324402371,
"js": {
"files": 20,
"raw": 2052915,
"gzip6Estimate": 606602
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "mobile",
"build": "candidate",
"path": "/jobs",
"localeReadDelta": 0,
"contentMs": 13233,
"sampledLcpMs": 12492,
"observedLayoutShiftSum": 0.03510786324402371,
"js": {
"files": 20,
"raw": 2052966,
"gzip6Estimate": 606643
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
}
]
}
File diff suppressed because it is too large Load Diff
Binary file not shown.