Train BM10 #880

Closed
kayg wants to merge 8 commits from train/2026-11-03-bm10 into dev
Owner

Replaces #869. Current-head assembly decisions and first-run gate evidence are recorded only in PR comments. Test train; never merge as part of this task.

Replaces #869. Current-head assembly decisions and first-run gate evidence are recorded only in PR comments. Test train; never merge as part of this task.
kayg added 11 commits 2026-11-02 18:53:46 +00:00
docs: link historical CI allocation observations
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
9c05d871a1
perf: gate named app chunks with explicit brotli budgets
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
da1071ed09
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Train BM10: merge #866
Some checks failed
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
e2390f9469
Author
Owner

Inherited #831 artifacts moved out of the train under ADR 0003. These are historical source-PR measurements, not BM10 gate results.

docs/perf/attachment-index-flush.md

# Attachment index flushes

## Plan and cost

Keep one SQLite connection per recent user in a bounded cache of 64 entries.
The duplicate lookup and optional row insert use that shared connection. Use
WAL with `synchronous=FULL`, so a changed row is durable in the WAL before the
action is acknowledged; SQLite can checkpoint it later instead of flushing the
database and directory on every upload. Leave the attachment file fsync and
its parent-directory fsync unchanged. A new file gets one index write and one
WAL sync; a duplicate or an action with no attachment change gets no index
write or sync.

The lookup remains O(log F) for F indexed files. Cache lookup is O(1), with an
O(64) least-recently-used update, and at most 64 cached connections are open.
If all entries are in use when the cache is full, the action uses a temporary
connection; SQLite still commits the row durably, with an extra close-time
checkpoint possible in that case. The stronger FULL setting preserves the
index row's durability while deferring database checkpoint work.

| Failure | Effect | Detection | Recovery | Test |
|---|---|---|---|---|
| Index open or duplicate lookup fails | The add action fails before placement | Returned action error | Retry with the same idempotency key | Existing attachment action tests |
| Index row insert fails after placement | The file remains durable; the index remains a hint | Existing warning | A later upload can retry the index write | Existing upload and retry tests |
| No attachment changed | No index row is written or flushed | `strace` count between save markers | No recovery needed | Linux flush-count regression test |
| One attachment changed | One row is committed with one WAL sync | `strace` count between save markers | SQLite's FULL-synced WAL is replayed after restart | Linux flush-count regression test |
| Cache is full and all entries are active | One action uses a temporary connection and may checkpoint at close | Cache-full debug event and sync trace | Reopen the per-user index on the next action | Bounded-cache test and Linux flush-count regression test |

Gate tests: `cargo test --locked -p calternal-attachments -j4`; the Linux
flush-count regression test; the unchanged `1k / SSD / 4 clients / 256 KiB`
matrix cell on dev-01 before and after; and one matched baseline/head pair on
perf-01 under `~/bin/perf-lock`. The perf budgets stay unchanged.

## Baseline on current dev

Commit: `55f35fcde3bc91ca3781055577b93e93819f6cd4`. The server was built on
dev-01 as `~/bin/calternal-dev-55f35fc` (SHA256
`9e3269898ce6bd45e3ef9326149f41995d176c26394841ef9eef376d2b1f5dc4`). The
matrix driver was `~/bin/calternal-perf-0f38de31` (SHA256
`e83e22618a1ce06bc4bc42ee16ed966eff0fe4ff922c42da1cc42ae4f8700a8b`, built
from the #788 matrix source). It used seed `75931004`, one 1k-note Home, four
upload clients, 256 KiB unique attachments, 60 seconds, and 60 overlapping
note saves.

The plain run used:

```sh
calternal-perf --bin ~/bin/calternal-dev-55f35fc --work <run>/work \
  --sizes 1k --runs 1 --cold-runs 0 --idle-secs 0 --soak-secs 0 \
  --seed 75931004 --upload-sizes 256k --upload-clients 4 \
  --upload-secs 60 --upload-only --json <run>/result.json --gate

The trace run used the same arguments under:

nix shell nixpkgs#strace -c strace -f -tt -T -yy \
  -e trace=fsync,fdatasync,openat,close,renameat2,rename,fcntl \
  -o <run>/trace <calternal-perf command above>

Untraced warm run: 696 uploads; 60 save acknowledgements; p50 17.88 ms and p95
56.26 ms. This is a single dev-01 diagnostic run, not perf-VM qualification.

The matching strace -f -tt -T -yy run completed 465 uploads. It found 932
attachment WAL syncs, 469 attachment database syncs, and 467 attachment
directory syncs: 1,868 total, or 4.017 attachment-index sync calls per upload.
Two WAL syncs, one database sync, and one directory sync occurred per new
attachment. The trace also showed a separate pending-marker sync per upload.
Traced latency is excluded from the before/after comparison.

This reproduces the inherited amplification reported in
#788 comment 73181
on current dev. The original profile at 133cf2c2 is not used as the current
baseline.

Fix and current-dev result

The implementation keeps up to 64 per-user index connections in an LRU cache.
The connection uses WAL with synchronous=FULL, so each changed row is durable
in the WAL before acknowledgement. SQLite can checkpoint after its normal
page threshold, cache eviction, or shutdown. Attachment bytes still use the
existing file and parent-directory durability barriers.

The Linux regression test measures sync syscalls between real upload action
markers under strace. It passed with 0 attachment-index sync calls for a
duplicate/no-change save and 1 WAL sync call for one new attachment. The
bounded-cache test also passed with 65 busy users: 64 cached connections and
one scoped connection.

On dev-01, the same untraced matrix cell after the change completed 1,520
uploads and 59 overlapping note saves. Save-ack p50 was 13.29 ms and p95 was
40.62 ms. Against the single baseline run, p50 improved 25.7% and p95 improved
27.8%. These shared-host samples are diagnostic only, not qualification.

The matching trace run completed 807 uploads and 60 save samples. It found
814 attachment WAL syncs, 5 database syncs, and 2 attachment-directory syncs:
821 total, or 1.017 attachment-index sync calls per upload. The seven calls
above one per upload came from SQLite checkpoints during the run. Traced
save-ack p95 was 58.37 ms and is excluded from the latency comparison.

Targeted gates on dev-01 passed:

cargo fmt --all --check
cargo test --locked -p calternal-attachments -j4 -- --nocapture
cargo clippy --locked -p calternal-attachments --all-targets -j4 -- -D warnings
cargo build --release --locked -p calternal -j4

The test result was 21 passed, 0 failed; targeted Clippy passed with warnings
denied. The current-dev binary was built from implementation commit
eef6473203e20df1be29346b8ef03ff47a269522 and has SHA256
196ff9b8ea473f0cf22ea0546c76056d6efb2d413317ec0a8c6063a759271bbd.

Perf-01 matched comparison

On perf-01, I ran five alternating matched pairs with the same 1k-note Home,
four upload clients, 256 KiB attachments, 60-second upload window, and seed
75931004. Homes and app state were on the VM's ext4 non-rotational SSD. The
baseline was current origin/dev at 55f35fcde3bc91ca3781055577b93e93819f6cd4;
the fixed binary was built from eef6473203e20df1be29346b8ef03ff47a269522.
Both were measured with the same matrix driver and unchanged budgets file
(SHA256 8feee55baeb3940c09015f37db8da85bd0cf2c5f33d5673568bd976fcf02ace3).
Each run exited 0 and collected 59 or 60 save acknowledgements.

Pair Order Base save p50 / p95 Fixed save p50 / p95 Save p95 ratio Response p95 ratio Throughput ratio
1 base / fixed 8.05 / 11.28 ms 9.95 / 16.15 ms 143.2% 98.3% 114.4%
2 fixed / base 11.69 / 20.98 ms 12.20 / 20.45 ms 97.5% 47.8% 159.9%
3 base / fixed 12.36 / 17.88 ms 12.03 / 17.67 ms 98.8% 70.4% 147.3%
4 fixed / base 11.90 / 18.94 ms 12.56 / 18.33 ms 96.8% 66.6% 148.9%
5 base / fixed 11.70 / 20.47 ms 13.23 / 22.93 ms 112.0% 68.0% 150.4%
Median 11.70 / 18.94 ms 12.20 / 18.33 ms 98.8% paired 68.0% paired 148.9% paired

The five-pair median meets the existing #788 small all-SSD cell limits: upload
throughput at least 95% of current dev, upload response p95 at most 105%, and
overlapping save-ack p95 at most 105%. Save-ack p50 was 4.2% higher by the
median of run p50s; median run p95 fell 3.2%, and the median paired p95 ratio
was 98.8%. The first and fifth save-ack pairs were noisy and slower on the
fixed run, which is why the full five-pair table is retained. The full 18-cell
matrix still needs requalification after rebasing #788.

The unchanged perf/budgets.json was passed to --gate; it has no entry for
uploads.256KiB.save_ack, so the upload comparison uses the existing relative
matrix limits from #788 comment 72886.
No budget was edited. Individual JSON and Markdown outputs are retained on
perf-01. The compact per-run data is in
attachment-index-flush-perf01.json.


### docs/perf/attachment-index-flush-perf01.json

{
"machine": "perf-01: Linux 6.12.113+deb13-amd64, 4 CPUs, 7.7 GiB RAM, ext4 non-rotational SSD for Homes and state",
"baseline": {
"origin_dev": "55f35fcde3",
"binary_sha256": "9e3269898ce6bd45e3ef9326149f41995d176c26394841ef9eef376d2b1f5dc4"
},
"fixed": {
"implementation_commit": "eef6473203",
"binary_sha256": "196ff9b8ea473f0cf22ea0546c76056d6efb2d413317ec0a8c6063a759271bbd"
},
"matrix_driver_sha256": "e83e22618a1ce06bc4bc42ee16ed966eff0fe4ff922c42da1cc42ae4f8700a8b",
"config": {
"notes": 1000,
"upload_bytes": 262144,
"upload_clients": 4,
"upload_seconds": 60,
"seed": 75931004,
"matched_pairs": 5,
"order": [
"base/fixed",
"fixed/base",
"base/fixed",
"fixed/base",
"base/fixed"
]
},
"command": "calternal-perf --bin --work /work --sizes 1k --runs 1 --cold-runs 0 --idle-secs 0 --soak-secs 0 --seed 75931004 --upload-sizes 256k --upload-clients 4 --upload-secs 60 --upload-only --json /result.json --md /result.md --budgets <unchanged perf/budgets.json> --gate",
"budget_file_sha256": "8feee55baeb3940c09015f37db8da85bd0cf2c5f33d5673568bd976fcf02ace3",
"matrix_thresholds": {
"throughput_ratio_pct_min": 95,
"upload_response_p95_ratio_pct_max": 105,
"save_ack_p95_ratio_pct_max": 105
},
"pairs": [
{
"pair": 1,
"order": "base/fixed",
"base": {
"save_ack_ms": {
"p50": 8.051699000000001,
"p95": 11.276453,
"samples": 60
},
"upload_response_ms": {
"p50": 122.414671,
"p95": 143.195845,
"samples": 1924
},
"throughput_mib_s": 7.8760662691913295,
"exit_code": 0
},
"fixed": {
"save_ack_ms": {
"p50": 9.95182,
"p95": 16.15159,
"samples": 59
},
"upload_response_ms": {
"p50": 116.10380400000001,
"p95": 140.805797,
"samples": 2201
},
"throughput_mib_s": 9.010913115334635,
"exit_code": 0
},
"paired_ratio_pct": {
"save_ack_p95": 143.23289424431601,
"upload_response_p95": 98.33092363818238,
"throughput": 114.40880266056756
}
},
{
"pair": 2,
"order": "fixed/base",
"base": {
"save_ack_ms": {
"p50": 11.694977,
"p95": 20.984858,
"samples": 60
},
"upload_response_ms": {
"p50": 181.23751900000002,
"p95": 305.759208,
"samples": 1220
},
"throughput_mib_s": 4.994277119581212,
"exit_code": 0
},
"fixed": {
"save_ack_ms": {
"p50": 12.195746,
"p95": 20.453059999999997,
"samples": 59
},
"upload_response_ms": {
"p50": 122.14196,
"p95": 146.29314,
"samples": 1951
},
"throughput_mib_s": 7.987411446142995,
"exit_code": 0
},
"paired_ratio_pct": {
"save_ack_p95": 97.46580129348503,
"upload_response_p95": 47.84586569180281,
"throughput": 159.93128244378977
}
},
{
"pair": 3,
"order": "base/fixed",
"base": {
"save_ack_ms": {
"p50": 12.356477,
"p95": 17.879756999999998,
"samples": 60
},
"upload_response_ms": {
"p50": 179.02521199999998,
"p95": 211.695008,
"samples": 1317
},
"throughput_mib_s": 5.391684547783172,
"exit_code": 0
},
"fixed": {
"save_ack_ms": {
"p50": 12.034103,
"p95": 17.673111,
"samples": 60
},
"upload_response_ms": {
"p50": 123.075991,
"p95": 149.01044299999998,
"samples": 1940
},
"throughput_mib_s": 7.942181138908136,
"exit_code": 0
},
"paired_ratio_pct": {
"save_ack_p95": 98.84424603757199,
"upload_response_p95": 70.38920965013969,
"throughput": 147.30426211922241
}
},
{
"pair": 4,
"order": "fixed/base",
"base": {
"save_ack_ms": {
"p50": 11.903978,
"p95": 18.941137,
"samples": 60
},
"upload_response_ms": {
"p50": 179.25838,
"p95": 220.128913,
"samples": 1307
},
"throughput_mib_s": 5.350753287242168,
"exit_code": 0
},
"fixed": {
"save_ack_ms": {
"p50": 12.555529,
"p95": 18.334640999999998,
"samples": 60
},
"upload_response_ms": {
"p50": 122.91566,
"p95": 146.669366,
"samples": 1946
},
"throughput_mib_s": 7.967140604998429,
"exit_code": 0
},
"paired_ratio_pct": {
"save_ack_p95": 96.79799581197263,
"upload_response_p95": 66.6288512495403,
"throughput": 148.8975510045385
}
},
{
"pair": 5,
"order": "base/fixed",
"base": {
"save_ack_ms": {
"p50": 11.702833,
"p95": 20.466426,
"samples": 60
},
"upload_response_ms": {
"p50": 179.29509800000002,
"p95": 215.944592,
"samples": 1311
},
"throughput_mib_s": 5.367088973256576,
"exit_code": 0
},
"fixed": {
"save_ack_ms": {
"p50": 13.234993000000001,
"p95": 22.926043,
"samples": 59
},
"upload_response_ms": {
"p50": 123.30149399999999,
"p95": 146.776267,
"samples": 1940
},
"throughput_mib_s": 8.074598087107052,
"exit_code": 0
},
"paired_ratio_pct": {
"save_ack_p95": 112.01781395540189,
"upload_response_p95": 67.96941087554534,
"throughput": 150.446510712634
}
}
],
"summary": {
"base": {
"save_ack_p50_ms": 11.702833,
"save_ack_p95_ms": 18.941137,
"upload_response_p95_ms": 215.944592,
"throughput_mib_s": 5.367088973256576
},
"fixed": {
"save_ack_p50_ms": 12.195746,
"save_ack_p95_ms": 18.334640999999998,
"upload_response_p95_ms": 146.669366,
"throughput_mib_s": 7.987411446142995
},
"median_paired_ratio_pct": {
"save_ack_p95": 98.84424603757199,
"upload_response_p95": 67.96941087554534,
"throughput": 148.8975510045385
}
}
}


Inherited #831 artifacts moved out of the train under ADR 0003. These are historical source-PR measurements, not BM10 gate results. ### docs/perf/attachment-index-flush.md ``` # Attachment index flushes ## Plan and cost Keep one SQLite connection per recent user in a bounded cache of 64 entries. The duplicate lookup and optional row insert use that shared connection. Use WAL with `synchronous=FULL`, so a changed row is durable in the WAL before the action is acknowledged; SQLite can checkpoint it later instead of flushing the database and directory on every upload. Leave the attachment file fsync and its parent-directory fsync unchanged. A new file gets one index write and one WAL sync; a duplicate or an action with no attachment change gets no index write or sync. The lookup remains O(log F) for F indexed files. Cache lookup is O(1), with an O(64) least-recently-used update, and at most 64 cached connections are open. If all entries are in use when the cache is full, the action uses a temporary connection; SQLite still commits the row durably, with an extra close-time checkpoint possible in that case. The stronger FULL setting preserves the index row's durability while deferring database checkpoint work. | Failure | Effect | Detection | Recovery | Test | |---|---|---|---|---| | Index open or duplicate lookup fails | The add action fails before placement | Returned action error | Retry with the same idempotency key | Existing attachment action tests | | Index row insert fails after placement | The file remains durable; the index remains a hint | Existing warning | A later upload can retry the index write | Existing upload and retry tests | | No attachment changed | No index row is written or flushed | `strace` count between save markers | No recovery needed | Linux flush-count regression test | | One attachment changed | One row is committed with one WAL sync | `strace` count between save markers | SQLite's FULL-synced WAL is replayed after restart | Linux flush-count regression test | | Cache is full and all entries are active | One action uses a temporary connection and may checkpoint at close | Cache-full debug event and sync trace | Reopen the per-user index on the next action | Bounded-cache test and Linux flush-count regression test | Gate tests: `cargo test --locked -p calternal-attachments -j4`; the Linux flush-count regression test; the unchanged `1k / SSD / 4 clients / 256 KiB` matrix cell on dev-01 before and after; and one matched baseline/head pair on perf-01 under `~/bin/perf-lock`. The perf budgets stay unchanged. ## Baseline on current dev Commit: `55f35fcde3bc91ca3781055577b93e93819f6cd4`. The server was built on dev-01 as `~/bin/calternal-dev-55f35fc` (SHA256 `9e3269898ce6bd45e3ef9326149f41995d176c26394841ef9eef376d2b1f5dc4`). The matrix driver was `~/bin/calternal-perf-0f38de31` (SHA256 `e83e22618a1ce06bc4bc42ee16ed966eff0fe4ff922c42da1cc42ae4f8700a8b`, built from the #788 matrix source). It used seed `75931004`, one 1k-note Home, four upload clients, 256 KiB unique attachments, 60 seconds, and 60 overlapping note saves. The plain run used: ```sh calternal-perf --bin ~/bin/calternal-dev-55f35fc --work <run>/work \ --sizes 1k --runs 1 --cold-runs 0 --idle-secs 0 --soak-secs 0 \ --seed 75931004 --upload-sizes 256k --upload-clients 4 \ --upload-secs 60 --upload-only --json <run>/result.json --gate ``` The trace run used the same arguments under: ```sh nix shell nixpkgs#strace -c strace -f -tt -T -yy \ -e trace=fsync,fdatasync,openat,close,renameat2,rename,fcntl \ -o <run>/trace <calternal-perf command above> ``` Untraced warm run: 696 uploads; 60 save acknowledgements; p50 17.88 ms and p95 56.26 ms. This is a single dev-01 diagnostic run, not perf-VM qualification. The matching `strace -f -tt -T -yy` run completed 465 uploads. It found 932 attachment WAL syncs, 469 attachment database syncs, and 467 attachment directory syncs: 1,868 total, or 4.017 attachment-index sync calls per upload. Two WAL syncs, one database sync, and one directory sync occurred per new attachment. The trace also showed a separate pending-marker sync per upload. Traced latency is excluded from the before/after comparison. This reproduces the inherited amplification reported in [#788 comment 73181](https://git.kayg.org/kayg/calternal/pulls/788#issuecomment-73181) on current dev. The original profile at `133cf2c2` is not used as the current baseline. ## Fix and current-dev result The implementation keeps up to 64 per-user index connections in an LRU cache. The connection uses WAL with `synchronous=FULL`, so each changed row is durable in the WAL before acknowledgement. SQLite can checkpoint after its normal page threshold, cache eviction, or shutdown. Attachment bytes still use the existing file and parent-directory durability barriers. The Linux regression test measures sync syscalls between real upload action markers under `strace`. It passed with **0 attachment-index sync calls** for a duplicate/no-change save and **1 WAL sync call** for one new attachment. The bounded-cache test also passed with 65 busy users: 64 cached connections and one scoped connection. On dev-01, the same untraced matrix cell after the change completed 1,520 uploads and 59 overlapping note saves. Save-ack p50 was 13.29 ms and p95 was 40.62 ms. Against the single baseline run, p50 improved 25.7% and p95 improved 27.8%. These shared-host samples are diagnostic only, not qualification. The matching trace run completed 807 uploads and 60 save samples. It found 814 attachment WAL syncs, 5 database syncs, and 2 attachment-directory syncs: 821 total, or 1.017 attachment-index sync calls per upload. The seven calls above one per upload came from SQLite checkpoints during the run. Traced save-ack p95 was 58.37 ms and is excluded from the latency comparison. Targeted gates on dev-01 passed: ```sh cargo fmt --all --check cargo test --locked -p calternal-attachments -j4 -- --nocapture cargo clippy --locked -p calternal-attachments --all-targets -j4 -- -D warnings cargo build --release --locked -p calternal -j4 ``` The test result was 21 passed, 0 failed; targeted Clippy passed with warnings denied. The current-dev binary was built from implementation commit `eef6473203e20df1be29346b8ef03ff47a269522` and has SHA256 `196ff9b8ea473f0cf22ea0546c76056d6efb2d413317ec0a8c6063a759271bbd`. ## Perf-01 matched comparison On perf-01, I ran five alternating matched pairs with the same 1k-note Home, four upload clients, 256 KiB attachments, 60-second upload window, and seed `75931004`. Homes and app state were on the VM's ext4 non-rotational SSD. The baseline was current `origin/dev` at `55f35fcde3bc91ca3781055577b93e93819f6cd4`; the fixed binary was built from `eef6473203e20df1be29346b8ef03ff47a269522`. Both were measured with the same matrix driver and unchanged budgets file (SHA256 `8feee55baeb3940c09015f37db8da85bd0cf2c5f33d5673568bd976fcf02ace3`). Each run exited 0 and collected 59 or 60 save acknowledgements. | Pair | Order | Base save p50 / p95 | Fixed save p50 / p95 | Save p95 ratio | Response p95 ratio | Throughput ratio | |---:|---|---:|---:|---:|---:|---:| | 1 | base / fixed | 8.05 / 11.28 ms | 9.95 / 16.15 ms | 143.2% | 98.3% | 114.4% | | 2 | fixed / base | 11.69 / 20.98 ms | 12.20 / 20.45 ms | 97.5% | 47.8% | 159.9% | | 3 | base / fixed | 12.36 / 17.88 ms | 12.03 / 17.67 ms | 98.8% | 70.4% | 147.3% | | 4 | fixed / base | 11.90 / 18.94 ms | 12.56 / 18.33 ms | 96.8% | 66.6% | 148.9% | | 5 | base / fixed | 11.70 / 20.47 ms | 13.23 / 22.93 ms | 112.0% | 68.0% | 150.4% | | Median | | 11.70 / 18.94 ms | 12.20 / 18.33 ms | 98.8% paired | 68.0% paired | 148.9% paired | The five-pair median meets the existing #788 small all-SSD cell limits: upload throughput at least 95% of current dev, upload response p95 at most 105%, and overlapping save-ack p95 at most 105%. Save-ack p50 was 4.2% higher by the median of run p50s; median run p95 fell 3.2%, and the median paired p95 ratio was 98.8%. The first and fifth save-ack pairs were noisy and slower on the fixed run, which is why the full five-pair table is retained. The full 18-cell matrix still needs requalification after rebasing #788. The unchanged `perf/budgets.json` was passed to `--gate`; it has no entry for `uploads.256KiB.save_ack`, so the upload comparison uses the existing relative matrix limits from [#788 comment 72886](https://git.kayg.org/kayg/calternal/pulls/788#issuecomment-72886). No budget was edited. Individual JSON and Markdown outputs are retained on perf-01. The compact per-run data is in [`attachment-index-flush-perf01.json`](attachment-index-flush-perf01.json). ``` ### docs/perf/attachment-index-flush-perf01.json ``` { "machine": "perf-01: Linux 6.12.113+deb13-amd64, 4 CPUs, 7.7 GiB RAM, ext4 non-rotational SSD for Homes and state", "baseline": { "origin_dev": "55f35fcde3bc91ca3781055577b93e93819f6cd4", "binary_sha256": "9e3269898ce6bd45e3ef9326149f41995d176c26394841ef9eef376d2b1f5dc4" }, "fixed": { "implementation_commit": "eef6473203e20df1be29346b8ef03ff47a269522", "binary_sha256": "196ff9b8ea473f0cf22ea0546c76056d6efb2d413317ec0a8c6063a759271bbd" }, "matrix_driver_sha256": "e83e22618a1ce06bc4bc42ee16ed966eff0fe4ff922c42da1cc42ae4f8700a8b", "config": { "notes": 1000, "upload_bytes": 262144, "upload_clients": 4, "upload_seconds": 60, "seed": 75931004, "matched_pairs": 5, "order": [ "base/fixed", "fixed/base", "base/fixed", "fixed/base", "base/fixed" ] }, "command": "calternal-perf --bin <base-or-fixed-server> --work <run>/work --sizes 1k --runs 1 --cold-runs 0 --idle-secs 0 --soak-secs 0 --seed 75931004 --upload-sizes 256k --upload-clients 4 --upload-secs 60 --upload-only --json <run>/result.json --md <run>/result.md --budgets <unchanged perf/budgets.json> --gate", "budget_file_sha256": "8feee55baeb3940c09015f37db8da85bd0cf2c5f33d5673568bd976fcf02ace3", "matrix_thresholds": { "throughput_ratio_pct_min": 95, "upload_response_p95_ratio_pct_max": 105, "save_ack_p95_ratio_pct_max": 105 }, "pairs": [ { "pair": 1, "order": "base/fixed", "base": { "save_ack_ms": { "p50": 8.051699000000001, "p95": 11.276453, "samples": 60 }, "upload_response_ms": { "p50": 122.414671, "p95": 143.195845, "samples": 1924 }, "throughput_mib_s": 7.8760662691913295, "exit_code": 0 }, "fixed": { "save_ack_ms": { "p50": 9.95182, "p95": 16.15159, "samples": 59 }, "upload_response_ms": { "p50": 116.10380400000001, "p95": 140.805797, "samples": 2201 }, "throughput_mib_s": 9.010913115334635, "exit_code": 0 }, "paired_ratio_pct": { "save_ack_p95": 143.23289424431601, "upload_response_p95": 98.33092363818238, "throughput": 114.40880266056756 } }, { "pair": 2, "order": "fixed/base", "base": { "save_ack_ms": { "p50": 11.694977, "p95": 20.984858, "samples": 60 }, "upload_response_ms": { "p50": 181.23751900000002, "p95": 305.759208, "samples": 1220 }, "throughput_mib_s": 4.994277119581212, "exit_code": 0 }, "fixed": { "save_ack_ms": { "p50": 12.195746, "p95": 20.453059999999997, "samples": 59 }, "upload_response_ms": { "p50": 122.14196, "p95": 146.29314, "samples": 1951 }, "throughput_mib_s": 7.987411446142995, "exit_code": 0 }, "paired_ratio_pct": { "save_ack_p95": 97.46580129348503, "upload_response_p95": 47.84586569180281, "throughput": 159.93128244378977 } }, { "pair": 3, "order": "base/fixed", "base": { "save_ack_ms": { "p50": 12.356477, "p95": 17.879756999999998, "samples": 60 }, "upload_response_ms": { "p50": 179.02521199999998, "p95": 211.695008, "samples": 1317 }, "throughput_mib_s": 5.391684547783172, "exit_code": 0 }, "fixed": { "save_ack_ms": { "p50": 12.034103, "p95": 17.673111, "samples": 60 }, "upload_response_ms": { "p50": 123.075991, "p95": 149.01044299999998, "samples": 1940 }, "throughput_mib_s": 7.942181138908136, "exit_code": 0 }, "paired_ratio_pct": { "save_ack_p95": 98.84424603757199, "upload_response_p95": 70.38920965013969, "throughput": 147.30426211922241 } }, { "pair": 4, "order": "fixed/base", "base": { "save_ack_ms": { "p50": 11.903978, "p95": 18.941137, "samples": 60 }, "upload_response_ms": { "p50": 179.25838, "p95": 220.128913, "samples": 1307 }, "throughput_mib_s": 5.350753287242168, "exit_code": 0 }, "fixed": { "save_ack_ms": { "p50": 12.555529, "p95": 18.334640999999998, "samples": 60 }, "upload_response_ms": { "p50": 122.91566, "p95": 146.669366, "samples": 1946 }, "throughput_mib_s": 7.967140604998429, "exit_code": 0 }, "paired_ratio_pct": { "save_ack_p95": 96.79799581197263, "upload_response_p95": 66.6288512495403, "throughput": 148.8975510045385 } }, { "pair": 5, "order": "base/fixed", "base": { "save_ack_ms": { "p50": 11.702833, "p95": 20.466426, "samples": 60 }, "upload_response_ms": { "p50": 179.29509800000002, "p95": 215.944592, "samples": 1311 }, "throughput_mib_s": 5.367088973256576, "exit_code": 0 }, "fixed": { "save_ack_ms": { "p50": 13.234993000000001, "p95": 22.926043, "samples": 59 }, "upload_response_ms": { "p50": 123.30149399999999, "p95": 146.776267, "samples": 1940 }, "throughput_mib_s": 8.074598087107052, "exit_code": 0 }, "paired_ratio_pct": { "save_ack_p95": 112.01781395540189, "upload_response_p95": 67.96941087554534, "throughput": 150.446510712634 } } ], "summary": { "base": { "save_ack_p50_ms": 11.702833, "save_ack_p95_ms": 18.941137, "upload_response_p95_ms": 215.944592, "throughput_mib_s": 5.367088973256576 }, "fixed": { "save_ack_p50_ms": 12.195746, "save_ack_p95_ms": 18.334640999999998, "upload_response_p95_ms": 146.669366, "throughput_mib_s": 7.987411446142995 }, "median_paired_ratio_pct": { "save_ack_p95": 98.84424603757199, "upload_response_p95": 67.96941087554534, "throughput": 148.8975510045385 } } } ```
Author
Owner

BM10 assembly complete. Head 31b867ac95b290c6d53ee042bc6343d04cee3d02, base 55f35fcde3bc91ca3781055577b93e93819f6cd4. Each source head was fetched from the PR API immediately before its merge.

PR Current source head Decision
#779 7b97e4d14231be07f6a80cb9ca172d02442c487e included, --no-ff
#858 626388da9052eaecb159d735f0cadc5e59e88312 included, --no-ff
#866 ba1f47dc94797d4a8a937298464b5e4828e301c2 included, --no-ff
#824 f1c1aa961e169ef99e132063a97ccbd9a89a5def included, --no-ff; mechanical lockfile union
#827 76f11dc4ba06468a2a0ed4d4592cea6038206696 included, --no-ff
#828 5d7b9b36cd008de78851809724c90a85d92b40a7 included, --no-ff; retain credential check then runtime timer
#833 ccaece3dfecbe2048634fc792d7d4a2c6e31f324 included, --no-ff
#836 5f7d1a59776411e7f3353d0023817b43affae51e included, --no-ff
#831 316b43e9578c3e4d2944df8df43caebc611356f7 included, --no-ff
#844 50cce9dcceb87f23a9f346300b3336e315ff6c0c included, --no-ff
#847 40448327a15730271d56226b898e48bcc87b2a4d included, --no-ff
#855 c38c3083d51f4adcf5cd76a70f1f6960b427413e included, --no-ff
#857 144e717145e35f70356f593b7c04a527e00f7b17 included, --no-ff
#856 b89e39bb313bb06b92da274124c6bbde30e2250a included, --no-ff
#840 9dd572249bd3edbcf8e1475a940070c4d03f1fc7 included, --no-ff; preserve newer #856 desktop corpus project guards
#850 136defb50ef7039bfb0be76a4d18d175f56a61d8 included, --no-ff; additive lazy imports 22 + search PullHint = 23
#851 bcca58e3d8af37b1246f81ff0a2f55faa4070426 included, --no-ff
#852 2f0b59f18406f03ca55b2fe745e3e11fedd9e84d included, --no-ff; additive cover imports 24 + search PullHint = 25
#863 f2c3a44cda090d763540366d03478ce7922a4cdf excluded: Palette animation target/origin differs from #840; Inspector deleted by Style; porting motion requires design choices

#829/#835 and other ports omitted as requested. #863 excluded under the conflict rule: #840 animates separate palette parts from the pill bottom while #863 animates the container from its top; Style removed Inspector, which #863 modifies. Porting those changes requires a design choice. No part of #863 is retained. #831 historical artifacts moved to comment 75592 and removed from the tree.

First-run gates only, CI=1, Nix with strace, heavy commands through ~/bin/slot, -j4, browser --workers=1 --retries=0. Native project matrix split by browser, admin-setup retained with dependents. All first errors and per-project tables will be comments. Never merge.

BM10 assembly complete. Head `31b867ac95b290c6d53ee042bc6343d04cee3d02`, base `55f35fcde3bc91ca3781055577b93e93819f6cd4`. Each source head was fetched from the PR API immediately before its merge. | PR | Current source head | Decision | |---|---|---| | #779 | `7b97e4d14231be07f6a80cb9ca172d02442c487e` | included, --no-ff | | #858 | `626388da9052eaecb159d735f0cadc5e59e88312` | included, --no-ff | | #866 | `ba1f47dc94797d4a8a937298464b5e4828e301c2` | included, --no-ff | | #824 | `f1c1aa961e169ef99e132063a97ccbd9a89a5def` | included, --no-ff; mechanical lockfile union | | #827 | `76f11dc4ba06468a2a0ed4d4592cea6038206696` | included, --no-ff | | #828 | `5d7b9b36cd008de78851809724c90a85d92b40a7` | included, --no-ff; retain credential check then runtime timer | | #833 | `ccaece3dfecbe2048634fc792d7d4a2c6e31f324` | included, --no-ff | | #836 | `5f7d1a59776411e7f3353d0023817b43affae51e` | included, --no-ff | | #831 | `316b43e9578c3e4d2944df8df43caebc611356f7` | included, --no-ff | | #844 | `50cce9dcceb87f23a9f346300b3336e315ff6c0c` | included, --no-ff | | #847 | `40448327a15730271d56226b898e48bcc87b2a4d` | included, --no-ff | | #855 | `c38c3083d51f4adcf5cd76a70f1f6960b427413e` | included, --no-ff | | #857 | `144e717145e35f70356f593b7c04a527e00f7b17` | included, --no-ff | | #856 | `b89e39bb313bb06b92da274124c6bbde30e2250a` | included, --no-ff | | #840 | `9dd572249bd3edbcf8e1475a940070c4d03f1fc7` | included, --no-ff; preserve newer #856 desktop corpus project guards | | #850 | `136defb50ef7039bfb0be76a4d18d175f56a61d8` | included, --no-ff; additive lazy imports 22 + search PullHint = 23 | | #851 | `bcca58e3d8af37b1246f81ff0a2f55faa4070426` | included, --no-ff | | #852 | `2f0b59f18406f03ca55b2fe745e3e11fedd9e84d` | included, --no-ff; additive cover imports 24 + search PullHint = 25 | | #863 | `f2c3a44cda090d763540366d03478ce7922a4cdf` | excluded: Palette animation target/origin differs from #840; Inspector deleted by Style; porting motion requires design choices | #829/#835 and other ports omitted as requested. #863 excluded under the conflict rule: #840 animates separate palette parts from the pill bottom while #863 animates the container from its top; Style removed Inspector, which #863 modifies. Porting those changes requires a design choice. No part of #863 is retained. #831 historical artifacts moved to [comment 75592](https://git.kayg.org/kayg/calternal/pulls/880#issuecomment-75592) and removed from the tree. First-run gates only, CI=1, Nix with strace, heavy commands through ~/bin/slot, -j4, browser --workers=1 --retries=0. Native project matrix split by browser, admin-setup retained with dependents. All first errors and per-project tables will be comments. Never merge.
Author
Owner

Gate execution started on fixed head 31b867ac9 (full SHA in assembly comment). Both VMs passed disk checks: dev-01 300 GiB and dev-02 331 GiB free. Nix resolves strace 7.2 on both machines. No tests/builds run on the control host.

Commands on dev-01, each run once with CI=1 and ~/bin/slot:

cargo fmt --all --check
cargo clippy --workspace --all-targets --locked -j4 -- -D warnings
cargo test --workspace -j4
cargo build -j4
bun install --frozen-lockfile
(cd apps/web && bun run build)
PERF_DIST="$PWD/apps/web/dist" PERF_OUT="$HOME/bm10-train/bundle" PERF_WORK="$HOME/bm10-train/bundle-work" bash perf/web.sh --bundle-only --gate
node ci/check-case-paths.mjs
node ci/check-no-evidence.mjs

Dev-02 builds the same head and web app for WebKit. Both use CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_INCREMENTAL=0. Full browser halves will launch together after preparation, with native projects and admin-setup retained; cross-half scheduling dependencies removed only. --workers=1 --retries=0. A failed scheduling dependency can block never-attempted cases; those cases will receive only their first attempts separately if needed.

Gate execution started on fixed head `31b867ac9` (full SHA in assembly comment). Both VMs passed disk checks: dev-01 300 GiB and dev-02 331 GiB free. Nix resolves strace 7.2 on both machines. No tests/builds run on the control host. Commands on dev-01, each run once with CI=1 and ~/bin/slot: ```sh cargo fmt --all --check cargo clippy --workspace --all-targets --locked -j4 -- -D warnings cargo test --workspace -j4 cargo build -j4 bun install --frozen-lockfile (cd apps/web && bun run build) PERF_DIST="$PWD/apps/web/dist" PERF_OUT="$HOME/bm10-train/bundle" PERF_WORK="$HOME/bm10-train/bundle-work" bash perf/web.sh --bundle-only --gate node ci/check-case-paths.mjs node ci/check-no-evidence.mjs ``` Dev-02 builds the same head and web app for WebKit. Both use CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_INCREMENTAL=0. Full browser halves will launch together after preparation, with native projects and admin-setup retained; cross-half scheduling dependencies removed only. --workers=1 --retries=0. A failed scheduling dependency can block never-attempted cases; those cases will receive only their first attempts separately if needed.
Author
Owner

First-run progress: cargo fmt --all --check PASS; cargo clippy --workspace --all-targets --locked -j4 -- -D warnings PASS. The prior #827 clippy error is absent. Dev-02 cargo build -j4, root bun install --frozen-lockfile, and apps/web bun run build PASS. Workspace tests are running on dev-01; no retried command or test.

First-run progress: `cargo fmt --all --check` PASS; `cargo clippy --workspace --all-targets --locked -j4 -- -D warnings` PASS. The prior #827 clippy error is absent. Dev-02 `cargo build -j4`, root `bun install --frozen-lockfile`, and apps/web `bun run build` PASS. Workspace tests are running on dev-01; no retried command or test.
Author
Owner

First-run workspace test FAIL (exit 101), no retry. Exact command: CI=1 cargo test --workspace -j4, Nix + strace available, ~/bin/slot. First failing case: calternal-auth --test quota_counter signin_finishes_before_a_large_recount.

thread 'signin_finishes_before_a_large_recount' panicked at crates/auth/tests/quota_counter.rs:62:14:
called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" }

test result: FAILED. 1 passed; 1 failed; 1 ignored
error: test failed, to rerun pass `-p calternal-auth --test quota_counter`

The test creates 50,000 empty files. Post-failure diagnostics show root has 297 GiB free, but /tmp is a separate tmpfs with only 42,165 free inodes (96% used), despite 16 GiB free. No unrelated temporary files will be removed. This is not yet declared pre-existing: the exact case is receiving one run on origin/dev at 55f35fcde3bc91ca3781055577b93e93819f6cd4 in the same environment. Cargo stopped the workspace invocation at this target; later targets were not run by that invocation.

Other first-run gates PASS: fmt, clippy, cargo build on both VMs, frozen Bun install and web build on both VMs, bundle-only per-app budgets, case-paths, no-evidence. Chromium and WebKit halves started together with --retries=0, no attempted case rerun. Their TMPDIR is the dedicated root-backed bm10-train/browser-tmp folder.

First-run workspace test FAIL (exit 101), no retry. Exact command: `CI=1 cargo test --workspace -j4`, Nix + strace available, ~/bin/slot. First failing case: `calternal-auth --test quota_counter signin_finishes_before_a_large_recount`. ```text thread 'signin_finishes_before_a_large_recount' panicked at crates/auth/tests/quota_counter.rs:62:14: called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" } test result: FAILED. 1 passed; 1 failed; 1 ignored error: test failed, to rerun pass `-p calternal-auth --test quota_counter` ``` The test creates 50,000 empty files. Post-failure diagnostics show root has 297 GiB free, but `/tmp` is a separate tmpfs with only 42,165 free inodes (96% used), despite 16 GiB free. No unrelated temporary files will be removed. This is not yet declared pre-existing: the exact case is receiving one run on origin/dev at `55f35fcde3bc91ca3781055577b93e93819f6cd4` in the same environment. Cargo stopped the workspace invocation at this target; later targets were not run by that invocation. Other first-run gates PASS: fmt, clippy, cargo build on both VMs, frozen Bun install and web build on both VMs, bundle-only per-app budgets, case-paths, no-evidence. Chromium and WebKit halves started together with --retries=0, no attempted case rerun. Their TMPDIR is the dedicated root-backed bm10-train/browser-tmp folder.
Author
Owner

Single origin/dev attribution for the Rust failure: reproduced, pre-existing environment failure. Base 55f35fcde3bc91ca3781055577b93e93819f6cd4, #779 Nix tooling overlay only. First and only baseline execution:

CI=1 cargo test -p calternal-auth --test quota_counter -j4 signin_finishes_before_a_large_recount -- --exact --nocapture
thread 'signin_finishes_before_a_large_recount' panicked at crates/auth/tests/quota_counter.rs:62:14:
called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" }
test result: FAILED. 0 passed; 1 failed; 0 ignored; 2 filtered out

Same file-creation failure at the same line. The test source is unchanged from dev. Root passed the required >50 GiB check; the separate /tmp tmpfs is short of inodes. No train gate retried.

Single origin/dev attribution for the Rust failure: **reproduced, pre-existing environment failure**. Base `55f35fcde3bc91ca3781055577b93e93819f6cd4`, #779 Nix tooling overlay only. First and only baseline execution: ```sh CI=1 cargo test -p calternal-auth --test quota_counter -j4 signin_finishes_before_a_large_recount -- --exact --nocapture ``` ```text thread 'signin_finishes_before_a_large_recount' panicked at crates/auth/tests/quota_counter.rs:62:14: called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" } test result: FAILED. 0 passed; 1 failed; 0 ignored; 2 filtered out ``` Same file-creation failure at the same line. The test source is unchanged from dev. Root passed the required >50 GiB check; the separate /tmp tmpfs is short of inodes. No train gate retried.
Author
Owner

Rust coverage completion decision: the first cargo test --workspace -j4 attempted 25 test executables before Cargo stopped on the confirmed baseline tmpfs-inode failure. The already-built workspace test artifacts contain 53 further executables. Each unattempted target is now selected once by package and target (cargo test -p <package> -j4 --lib, --bin <name>, or --test <name>); all 25 attempted executables, including the failed quota case, are excluded. Doc tests have not run and will receive their first invocation with cargo test --workspace --doc -j4. CI=1, same Nix shell, same head, one ~/bin/slot, no source fixes or retry. The original workspace gate remains FAIL; supplement outcomes will be reported separately.

Rust coverage completion decision: the first `cargo test --workspace -j4` attempted 25 test executables before Cargo stopped on the confirmed baseline tmpfs-inode failure. The already-built workspace test artifacts contain 53 further executables. Each unattempted target is now selected once by package and target (`cargo test -p <package> -j4 --lib`, `--bin <name>`, or `--test <name>`); all 25 attempted executables, including the failed quota case, are excluded. Doc tests have not run and will receive their first invocation with `cargo test --workspace --doc -j4`. CI=1, same Nix shell, same head, one ~/bin/slot, no source fixes or retry. The original workspace gate remains FAIL; supplement outcomes will be reported separately.
Author
Owner

Completed first-run non-browser gates on head 31b867ac95b290c6d53ee042bc6343d04cee3d02. CI=1, Nix, ~/bin/slot.

Command Result
cargo fmt --all --check PASS
cargo clippy --workspace --all-targets --locked -j4 -- -D warnings PASS
cargo test --workspace -j4 FAIL (101); pre-existing /tmp inode exhaustion reproduced once on dev
cargo build -j4 PASS
bun install --frozen-lockfile PASS
bash -c cd apps/web && bun run build PASS
bash perf/web.sh --bundle-only --gate PASS
node ci/check-case-paths.mjs PASS
node ci/check-no-evidence.mjs PASS

Dev-02 build/install/web also PASS. Original workspace test result is preserved; previously unattempted Rust targets and doc tests are being completed separately without retrying an attempted test.

#866 per-app bundle budget output:

metric Home unit n p50 p95 max budget
web.bundle.all_css_brotli - KB 1 36.919 36.919 36.919
web.bundle.all_css_gzip - KB 1 42.342 42.342 42.342
web.bundle.all_css_raw - KB 1 207.746 207.746 207.746
web.bundle.all_js_brotli - KB 1 325.822 325.822 325.822
web.bundle.all_js_gzip - KB 1 381.998 381.998 381.998
web.bundle.all_js_raw - KB 1 1123.588 1123.588 1123.588
web.bundle.chunk.idle-screens - KB 1 49.234 49.234 49.234 p95 ≤ 50.5 ok
web.bundle.chunk.index - KB 1 233.667 233.667 233.667 p95 ≤ 240 ok
web.bundle.chunk.InstallHint - KB 1 1.124 1.124 1.124 p95 ≤ 1.25 ok
web.bundle.chunk.ListSearch - KB 1 3.022 3.022 3.022 p95 ≤ 3.25 ok
web.bundle.chunk.notes-fill.worker - KB 1 0.902 0.902 0.902 p95 ≤ 1 ok
web.bundle.chunk.Palette - KB 1 20.769 20.769 20.769 p95 ≤ 22 ok
web.bundle.chunk.PullHint - KB 1 0.996 0.996 0.996 p95 ≤ 1.1 ok
web.bundle.chunk.replay - KB 1 5.956 5.956 5.956 p95 ≤ 6.25 ok
web.bundle.chunk.svelte - KB 1 9.324 9.324 9.324 p95 ≤ 9.75 ok
web.bundle.chunk.two-finger - KB 1 0.827 0.827 0.827 p95 ≤ 1 ok
web.bundle.chunk.vim - KB 1 37.926 37.926 37.926 p95 ≤ 39 ok
web.bundle.first_css_brotli - KB 1 19.590 19.590 19.590 p95 ≤ 22.1 ok
web.bundle.first_css_gzip - KB 1 22.453 22.453 22.453
web.bundle.first_css_raw - KB 1 112.340 112.340 112.340
web.bundle.first_js_brotli - KB 1 233.667 233.667 233.667 p95 ≤ 240 ok
web.bundle.first_js_gzip - KB 1 275.293 275.293 275.293
web.bundle.first_js_raw - KB 1 825.854 825.854 825.854
web.bundle.plugins_css_brotli - KB 1 0.000 0.000 0.000
web.bundle.plugins_css_gzip - KB 1 0.000 0.000 0.000
web.bundle.plugins_css_raw - KB 1 0.000 0.000 0.000
web.bundle.plugins_js_brotli - KB 1 37.926 37.926 37.926 p95 ≤ 45 ok
web.bundle.plugins_js_gzip - KB 1 42.934 42.934 42.934
web.bundle.plugins_js_raw - KB 1 135.041 135.041 135.041
web.bundle.total_js_brotli - KB 1 363.748 363.748 363.748 p95 ≤ 404.2 ok
Completed first-run non-browser gates on head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. CI=1, Nix, ~/bin/slot. | Command | Result | |---|---| | `cargo fmt --all --check` | PASS | | `cargo clippy --workspace --all-targets --locked -j4 -- -D warnings` | PASS | | `cargo test --workspace -j4` | FAIL (101); pre-existing /tmp inode exhaustion reproduced once on dev | | `cargo build -j4` | PASS | | `bun install --frozen-lockfile` | PASS | | `bash -c cd apps/web && bun run build` | PASS | | `bash perf/web.sh --bundle-only --gate` | PASS | | `node ci/check-case-paths.mjs` | PASS | | `node ci/check-no-evidence.mjs` | PASS | Dev-02 build/install/web also PASS. Original workspace test result is preserved; previously unattempted Rust targets and doc tests are being completed separately without retrying an attempted test. #866 per-app bundle budget output: | metric | Home | unit | n | p50 | p95 | max | budget | | |---|---:|---|---:|---:|---:|---:|---|---| | `web.bundle.all_css_brotli` | - | KB | 1 | 36.919 | 36.919 | 36.919 | | | | `web.bundle.all_css_gzip` | - | KB | 1 | 42.342 | 42.342 | 42.342 | | | | `web.bundle.all_css_raw` | - | KB | 1 | 207.746 | 207.746 | 207.746 | | | | `web.bundle.all_js_brotli` | - | KB | 1 | 325.822 | 325.822 | 325.822 | | | | `web.bundle.all_js_gzip` | - | KB | 1 | 381.998 | 381.998 | 381.998 | | | | `web.bundle.all_js_raw` | - | KB | 1 | 1123.588 | 1123.588 | 1123.588 | | | | `web.bundle.chunk.idle-screens` | - | KB | 1 | 49.234 | 49.234 | 49.234 | p95 ≤ 50.5 | ok | | `web.bundle.chunk.index` | - | KB | 1 | 233.667 | 233.667 | 233.667 | p95 ≤ 240 | ok | | `web.bundle.chunk.InstallHint` | - | KB | 1 | 1.124 | 1.124 | 1.124 | p95 ≤ 1.25 | ok | | `web.bundle.chunk.ListSearch` | - | KB | 1 | 3.022 | 3.022 | 3.022 | p95 ≤ 3.25 | ok | | `web.bundle.chunk.notes-fill.worker` | - | KB | 1 | 0.902 | 0.902 | 0.902 | p95 ≤ 1 | ok | | `web.bundle.chunk.Palette` | - | KB | 1 | 20.769 | 20.769 | 20.769 | p95 ≤ 22 | ok | | `web.bundle.chunk.PullHint` | - | KB | 1 | 0.996 | 0.996 | 0.996 | p95 ≤ 1.1 | ok | | `web.bundle.chunk.replay` | - | KB | 1 | 5.956 | 5.956 | 5.956 | p95 ≤ 6.25 | ok | | `web.bundle.chunk.svelte` | - | KB | 1 | 9.324 | 9.324 | 9.324 | p95 ≤ 9.75 | ok | | `web.bundle.chunk.two-finger` | - | KB | 1 | 0.827 | 0.827 | 0.827 | p95 ≤ 1 | ok | | `web.bundle.chunk.vim` | - | KB | 1 | 37.926 | 37.926 | 37.926 | p95 ≤ 39 | ok | | `web.bundle.first_css_brotli` | - | KB | 1 | 19.590 | 19.590 | 19.590 | p95 ≤ 22.1 | ok | | `web.bundle.first_css_gzip` | - | KB | 1 | 22.453 | 22.453 | 22.453 | | | | `web.bundle.first_css_raw` | - | KB | 1 | 112.340 | 112.340 | 112.340 | | | | `web.bundle.first_js_brotli` | - | KB | 1 | 233.667 | 233.667 | 233.667 | p95 ≤ 240 | ok | | `web.bundle.first_js_gzip` | - | KB | 1 | 275.293 | 275.293 | 275.293 | | | | `web.bundle.first_js_raw` | - | KB | 1 | 825.854 | 825.854 | 825.854 | | | | `web.bundle.plugins_css_brotli` | - | KB | 1 | 0.000 | 0.000 | 0.000 | | | | `web.bundle.plugins_css_gzip` | - | KB | 1 | 0.000 | 0.000 | 0.000 | | | | `web.bundle.plugins_css_raw` | - | KB | 1 | 0.000 | 0.000 | 0.000 | | | | `web.bundle.plugins_js_brotli` | - | KB | 1 | 37.926 | 37.926 | 37.926 | p95 ≤ 45 | ok | | `web.bundle.plugins_js_gzip` | - | KB | 1 | 42.934 | 42.934 | 42.934 | | | | `web.bundle.plugins_js_raw` | - | KB | 1 | 135.041 | 135.041 | 135.041 | | | | `web.bundle.total_js_brotli` | - | KB | 1 | 363.748 | 363.748 | 363.748 | p95 ≤ 404.2 | ok |
Author
Owner

First error from the first attempt at the previously unattempted calternal-auth integration target reliability_review:

CI=1 cargo test -p calternal-auth -j4 --test reliability_review
---- independent_login_completes_before_recount stdout ----
thread 'independent_login_completes_before_recount' panicked at crates/auth/tests/reliability_review.rs:319:58:
called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" }
test result: FAILED. 18 passed; 1 failed; 3 ignored

Single origin/dev attribution: same failure, exit 101, pre-existing environment failure. Command:

CI=1 cargo test -p calternal-auth -j4 --test reliability_review independent_login_completes_before_recount -- --exact --nocapture

No train test retry. Baseline is 55f35fcde3bc91ca3781055577b93e93819f6cd4, #779 tooling overlay only, same Nix/environment and /tmp filesystem.

First error from the first attempt at the previously unattempted `calternal-auth` integration target `reliability_review`: ```sh CI=1 cargo test -p calternal-auth -j4 --test reliability_review ``` ```text ---- independent_login_completes_before_recount stdout ---- thread 'independent_login_completes_before_recount' panicked at crates/auth/tests/reliability_review.rs:319:58: called `Result::unwrap()` on an `Err` value: Os { code: 28, kind: StorageFull, message: "No space left on device" } test result: FAILED. 18 passed; 1 failed; 3 ignored ``` Single origin/dev attribution: same failure, exit 101, **pre-existing environment failure**. Command: ```sh CI=1 cargo test -p calternal-auth -j4 --test reliability_review independent_login_completes_before_recount -- --exact --nocapture ``` No train test retry. Baseline is `55f35fcde3bc91ca3781055577b93e93819f6cd4`, #779 tooling overlay only, same Nix/environment and /tmp filesystem.
Author
Owner

First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Baseline attribution is running once against origin/dev artifacts using the same test case.

1) [chromium-1440] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update 

    Error: expect(locator).toBeVisible() failed

    Locator: locator('.inspector')
    Expected: visible
    Timeout: 5000ms
    Error: element(s) not found

    Call log:
      - Expect "toBeVisible" locator('.inspector') with timeout 5000ms
      - waiting for locator('.inspector')


      71 |     }, { selector, select: name === 'Link to a note' })
      72 |     await page.getByRole('button', { name, exact: true }).click()
    > 73 |     await expect(page.locator(selector)).toBeVisible()
         |                                          ^
      74 |     expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true)
      75 |     await page.keyboard.press('Escape')
      76 |     await expect(page.locator('.sheet-body')).toHaveCount(0)
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:73:42

    Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-chromium-1440/error-context.md
First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Baseline attribution is running once against origin/dev artifacts using the same test case. ```text 1) [chromium-1440] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update Error: expect(locator).toBeVisible() failed Locator: locator('.inspector') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" locator('.inspector') with timeout 5000ms - waiting for locator('.inspector') 71 | }, { selector, select: name === 'Link to a note' }) 72 | await page.getByRole('button', { name, exact: true }).click() > 73 | await expect(page.locator(selector)).toBeVisible() | ^ 74 | expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true) 75 | await page.keyboard.press('Escape') 76 | await expect(page.locator('.sheet-body')).toHaveCount(0) at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:73:42 Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-chromium-1440/error-context.md ```
Author
Owner

First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Baseline attribution is running once against origin/dev artifacts using the same test case.

2) [chromium-1440] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-chromium-1440/error-context.md
First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Baseline attribution is running once against origin/dev artifacts using the same test case. ```text 2) [chromium-1440] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-chromium-1440/error-context.md ```
Author
Owner

First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Baseline attribution is running once against origin/dev artifacts using the same test case.

3) [chromium-1440] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-chromium-1440/error-context.md
First Chromium error, first attempt only, CI=1 / --workers=1 / --retries=0. Head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Baseline attribution is running once against origin/dev artifacts using the same test case. ```text 3) [chromium-1440] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-chromium-1440/error-context.md ```
Author
Owner

Baseline runner correction, fully disclosed: the first selector parser retained trailing spaces from Playwright line output. The first 4 Chromium and 3 WebKit baseline invocations therefore reported Error: No tests found. and executed zero tests (verified each JSON reporter stats has expected=unexpected=skipped=0). These runner logs/JSON are retained. Both own baseline units were stopped with systemctl --user stop; title whitespace is now stripped, and a corrected runner is giving each failed case its first actual origin/dev attempt. No executed baseline test is repeated, and no train gate/test is retried.

The baseline comparisons use the same current test definitions/config harness as the train, with CALTERNAL_BIN and E2E_DIST pointing at the independent origin/dev build (55f35fcde3bc91ca3781055577b93e93819f6cd4, #779 tooling overlay only). This isolates the product change; test definitions introduced by the train are identified when attributing failures. CI=1, Nix + slot, --workers=1 --retries=0, fresh temporary servers per invocation.

Baseline runner correction, fully disclosed: the first selector parser retained trailing spaces from Playwright line output. The first 4 Chromium and 3 WebKit baseline invocations therefore reported `Error: No tests found.` and executed **zero tests** (verified each JSON reporter stats has expected=unexpected=skipped=0). These runner logs/JSON are retained. Both own baseline units were stopped with `systemctl --user stop`; title whitespace is now stripped, and a corrected runner is giving each failed case its first actual origin/dev attempt. No executed baseline test is repeated, and no train gate/test is retried. The baseline comparisons use the same current test definitions/config harness as the train, with `CALTERNAL_BIN` and `E2E_DIST` pointing at the independent origin/dev build (`55f35fcde3bc91ca3781055577b93e93819f6cd4`, #779 tooling overlay only). This isolates the product change; test definitions introduced by the train are identified when attributing failures. CI=1, Nix + slot, --workers=1 --retries=0, fresh temporary servers per invocation.
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

4) [chromium-1440] › e2e/sidebar-edge.spec.ts:8:1 › hovering the backdrop tiles never changes the sidebar edge 

    Error: expect(received).toEqual(expected) // deep equality

    - Expected  - 4
    + Received  + 0

    @@ -13,10 +13,6 @@
        true,
        true,
        true,
        true,
        true,
    -   true,
    -   true,
    -   true,
    -   true,
      ]

      19 |   // Each tile repaints on its own: what a hover draws is cut off at the tile (`contain: paint`),
      20 |   // so it cannot invalidate the sidebar's live blur beside the card.
    > 21 |   expect(await tiles.evaluateAll((els) => els.map((e) => getComputedStyle(e).contain.includes('paint')))).toEqual(Array(await tiles.count()).fill(true))
         |                                                                                                           ^
      22 |   await page.mouse.move(2, 2)
      23 |   await still(page)
      24 |   const nav = (await page.locator('nav.nav').boundingBox())!
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/sidebar-edge.spec.ts:21:107

    Error Context: ../../../../../bm10-train/test-results/sidebar-edge-hovering-the--73d4e-er-changes-the-sidebar-edge-chromium-1440/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 4) [chromium-1440] › e2e/sidebar-edge.spec.ts:8:1 › hovering the backdrop tiles never changes the sidebar edge Error: expect(received).toEqual(expected) // deep equality - Expected - 4 + Received + 0 @@ -13,10 +13,6 @@ true, true, true, true, true, - true, - true, - true, - true, ] 19 | // Each tile repaints on its own: what a hover draws is cut off at the tile (`contain: paint`), 20 | // so it cannot invalidate the sidebar's live blur beside the card. > 21 | expect(await tiles.evaluateAll((els) => els.map((e) => getComputedStyle(e).contain.includes('paint')))).toEqual(Array(await tiles.count()).fill(true)) | ^ 22 | await page.mouse.move(2, 2) 23 | await still(page) 24 | const nav = (await page.locator('nav.nav').boundingBox())! at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/sidebar-edge.spec.ts:21:107 Error Context: ../../../../../bm10-train/test-results/sidebar-edge-hovering-the--73d4e-er-changes-the-sidebar-edge-chromium-1440/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

1) [webkit-1440] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update 

    Error: expect(locator).toBeVisible() failed

    Locator: locator('.inspector')
    Expected: visible
    Timeout: 5000ms
    Error: element(s) not found

    Call log:
      - Expect "toBeVisible" locator('.inspector') with timeout 5000ms
      - waiting for locator('.inspector')


      71 |     }, { selector, select: name === 'Link to a note' })
      72 |     await page.getByRole('button', { name, exact: true }).click()
    > 73 |     await expect(page.locator(selector)).toBeVisible()
         |                                          ^
      74 |     expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true)
      75 |     await page.keyboard.press('Escape')
      76 |     await expect(page.locator('.sheet-body')).toHaveCount(0)
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:73:42

    Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-webkit-1440/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 1) [webkit-1440] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update Error: expect(locator).toBeVisible() failed Locator: locator('.inspector') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" locator('.inspector') with timeout 5000ms - waiting for locator('.inspector') 71 | }, { selector, select: name === 'Link to a note' }) 72 | await page.getByRole('button', { name, exact: true }).click() > 73 | await expect(page.locator(selector)).toBeVisible() | ^ 74 | expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true) 75 | await page.keyboard.press('Escape') 76 | await expect(page.locator('.sheet-body')).toHaveCount(0) at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:73:42 Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-webkit-1440/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

2) [webkit-1440] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-webkit-1440/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 2) [webkit-1440] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-webkit-1440/error-context.md ```
Author
Owner

All previously unattempted Rust test targets and doc tests are now complete on the fixed train head. No previously attempted target/case was repeated. First-run remainder totals: 1239 passed, 1 failed, 17 ignored. The one failure is the already posted/reproduced independent_login_completes_before_recount /tmp inode error.

Package Target First-attempt result
calternal-auth test reliability_review FAIL; reproduced on dev
calternal-auth test reliability_round3 PASS
calternal-auth test security_regressions PASS
calternal-auth test setup PASS
calternal-backdrops lib calternal_backdrops PASS
calternal-contacts lib calternal_contacts PASS
calternal-contacts test apple PASS
calternal-contacts test break_codec PASS
calternal-contacts test break_generated PASS
calternal-contacts test break_inventory PASS
calternal-contacts test break_labels PASS
calternal-contacts test break_layout PASS
calternal-contacts test break_links PASS
calternal-contacts test break_merge PASS
calternal-contacts test format3 PASS
calternal-contacts test hostile PASS
calternal-contacts test layout PASS
calternal-contacts test roundtrip PASS
calternal-contacts-actions lib calternal_contacts_actions PASS
calternal-core lib calternal_core PASS
calternal-daily lib calternal_daily PASS
calternal-engine lib calternal_engine PASS
calternal-fixtures bin calternal-fixtures PASS
calternal-fixtures lib calternal_fixtures PASS
calternal-fsio lib calternal_fsio PASS
calternal-imap-uid lib calternal_imap_uid PASS
calternal-markdown-view bin markdown-worker PASS
calternal-markdown-view lib calternal_markdown_view PASS
calternal-markdown-view test contract PASS
calternal-markdown-view test depth PASS
calternal-markdown-view test limits PASS
calternal-markdown-view test memory PASS
calternal-markdown-view test tags PASS
calternal-memory lib calternal_memory PASS
calternal-migrate-v0 lib calternal_migrate_v0 PASS
calternal-notes lib calternal_notes PASS
calternal-perf bin calternal-perf PASS
calternal-perf bin storage-bench PASS
calternal-perf bin tasks-bench PASS
calternal-perf bin tasks-create-bench PASS
calternal-plugin-hello lib calternal_plugin_hello PASS
calternal-prefs lib calternal_prefs PASS
calternal-search lib calternal_search PASS
calternal-search test note_generation PASS
calternal-search test search PASS
calternal-server lib calternal_server PASS
calternal-server test access PASS
calternal-server test live PASS
calternal-server test signout PASS
calternal-server test web PASS
calternal-store lib calternal_store PASS
calternal-tasks lib calternal_tasks PASS
calternal-testkit lib calternal_testkit PASS

Doc gate: CI=1 cargo test --workspace --doc -j4: PASS. The original workspace command remains FAIL and is not retried. Across original execution + first-attempt continuation, all 78 discovered unit/integration/bin test targets have now executed; 76 targets passed, 2 failed with the separately reproduced /tmp inode exhaustion. All doc tests completed.

Exact continuation command per table row: cargo test -p <package> -j4 --lib, cargo test -p <package> -j4 --bin <name>, or cargo test -p <package> -j4 --test <name>. CI=1, Nix with strace, one ~/bin/slot; same CARGO_PROFILE_DEV_DEBUG=0 / CARGO_PROFILE_TEST_DEBUG=0 / CARGO_INCREMENTAL=0 as original.

All previously unattempted Rust test targets and doc tests are now complete on the fixed train head. No previously attempted target/case was repeated. First-run remainder totals: 1239 passed, 1 failed, 17 ignored. The one failure is the already posted/reproduced `independent_login_completes_before_recount` /tmp inode error. | Package | Target | First-attempt result | |---|---|---| | calternal-auth | test reliability_review | FAIL; reproduced on dev | | calternal-auth | test reliability_round3 | PASS | | calternal-auth | test security_regressions | PASS | | calternal-auth | test setup | PASS | | calternal-backdrops | lib calternal_backdrops | PASS | | calternal-contacts | lib calternal_contacts | PASS | | calternal-contacts | test apple | PASS | | calternal-contacts | test break_codec | PASS | | calternal-contacts | test break_generated | PASS | | calternal-contacts | test break_inventory | PASS | | calternal-contacts | test break_labels | PASS | | calternal-contacts | test break_layout | PASS | | calternal-contacts | test break_links | PASS | | calternal-contacts | test break_merge | PASS | | calternal-contacts | test format3 | PASS | | calternal-contacts | test hostile | PASS | | calternal-contacts | test layout | PASS | | calternal-contacts | test roundtrip | PASS | | calternal-contacts-actions | lib calternal_contacts_actions | PASS | | calternal-core | lib calternal_core | PASS | | calternal-daily | lib calternal_daily | PASS | | calternal-engine | lib calternal_engine | PASS | | calternal-fixtures | bin calternal-fixtures | PASS | | calternal-fixtures | lib calternal_fixtures | PASS | | calternal-fsio | lib calternal_fsio | PASS | | calternal-imap-uid | lib calternal_imap_uid | PASS | | calternal-markdown-view | bin markdown-worker | PASS | | calternal-markdown-view | lib calternal_markdown_view | PASS | | calternal-markdown-view | test contract | PASS | | calternal-markdown-view | test depth | PASS | | calternal-markdown-view | test limits | PASS | | calternal-markdown-view | test memory | PASS | | calternal-markdown-view | test tags | PASS | | calternal-memory | lib calternal_memory | PASS | | calternal-migrate-v0 | lib calternal_migrate_v0 | PASS | | calternal-notes | lib calternal_notes | PASS | | calternal-perf | bin calternal-perf | PASS | | calternal-perf | bin storage-bench | PASS | | calternal-perf | bin tasks-bench | PASS | | calternal-perf | bin tasks-create-bench | PASS | | calternal-plugin-hello | lib calternal_plugin_hello | PASS | | calternal-prefs | lib calternal_prefs | PASS | | calternal-search | lib calternal_search | PASS | | calternal-search | test note_generation | PASS | | calternal-search | test search | PASS | | calternal-server | lib calternal_server | PASS | | calternal-server | test access | PASS | | calternal-server | test live | PASS | | calternal-server | test signout | PASS | | calternal-server | test web | PASS | | calternal-store | lib calternal_store | PASS | | calternal-tasks | lib calternal_tasks | PASS | | calternal-testkit | lib calternal_testkit | PASS | Doc gate: `CI=1 cargo test --workspace --doc -j4`: PASS. The original workspace command remains FAIL and is not retried. Across original execution + first-attempt continuation, all 78 discovered unit/integration/bin test targets have now executed; 76 targets passed, 2 failed with the separately reproduced /tmp inode exhaustion. All doc tests completed. Exact continuation command per table row: `cargo test -p <package> -j4 --lib`, `cargo test -p <package> -j4 --bin <name>`, or `cargo test -p <package> -j4 --test <name>`. CI=1, Nix with strace, one ~/bin/slot; same CARGO_PROFILE_DEV_DEBUG=0 / CARGO_PROFILE_TEST_DEBUG=0 / CARGO_INCREMENTAL=0 as original.
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

3) [webkit-1440] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-webkit-1440/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 3) [webkit-1440] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-webkit-1440/error-context.md ```
Author
Owner

Interim browser attribution, each actual case executed once on origin/dev product artifacts; all reporter stats verified exactly one test attempt and zero retries. Base 55f35fcde3bc91ca3781055577b93e93819f6cd4.

Project Case Baseline Attribution
chromium-1440 e2e/preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved train failure
chromium-1440 e2e/preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved train failure
chromium-1440 e2e/preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved train failure
chromium-1440 e2e/sidebar-edge.spec.ts:8 hovering the backdrop tiles never changes the sidebar edge FAIL baseline also fails; error comparison pending
webkit-1440 e2e/preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved train failure
webkit-1440 e2e/preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved train failure
webkit-1440 e2e/preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved train failure

BM10 is RED: the six desktop preload failures passed their exact baseline comparisons. Warmed Style still expects .inspector; palette intent now fetches additional search chunks while the existing tests assert exactly one script. No implementation/test changes are made on this test train. Full train matrix continues to completion; these results are not retried.

Interim browser attribution, each actual case executed once on origin/dev product artifacts; all reporter stats verified exactly one test attempt and zero retries. Base `55f35fcde3bc91ca3781055577b93e93819f6cd4`. | Project | Case | Baseline | Attribution | |---|---|---|---| | chromium-1440 | e2e/preload.spec.ts:48 warmed sheets contain their component in the first DOM update | PASS | new/unresolved train failure | | chromium-1440 | e2e/preload.spec.ts:111 palette Control intent prepares only its own screen before idle | PASS | new/unresolved train failure | | chromium-1440 | e2e/preload.spec.ts:111 palette Meta intent prepares only its own screen before idle | PASS | new/unresolved train failure | | chromium-1440 | e2e/sidebar-edge.spec.ts:8 hovering the backdrop tiles never changes the sidebar edge | FAIL | baseline also fails; error comparison pending | | webkit-1440 | e2e/preload.spec.ts:48 warmed sheets contain their component in the first DOM update | PASS | new/unresolved train failure | | webkit-1440 | e2e/preload.spec.ts:111 palette Control intent prepares only its own screen before idle | PASS | new/unresolved train failure | | webkit-1440 | e2e/preload.spec.ts:111 palette Meta intent prepares only its own screen before idle | PASS | new/unresolved train failure | **BM10 is RED**: the six desktop preload failures passed their exact baseline comparisons. Warmed Style still expects `.inspector`; palette intent now fetches additional search chunks while the existing tests assert exactly one script. No implementation/test changes are made on this test train. Full train matrix continues to completion; these results are not retried.
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

5) [chromium-1440] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true })


      381 |   const lookOf = () => page.locator('article.page').getAttribute('data-lines')
      382 |   expect(await lookOf()).toBe('dotted')
    > 383 |   await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click()
          |                                                                                         ^
      384 |   await expect.poll(lookOf).toBe('connected')
      385 |   await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected')
      386 |   await page.reload()
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89

    Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-chromium-1440/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 5) [chromium-1440] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }) 381 | const lookOf = () => page.locator('article.page').getAttribute('data-lines') 382 | expect(await lookOf()).toBe('dotted') > 383 | await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click() | ^ 384 | await expect.poll(lookOf).toBe('connected') 385 | await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected') 386 | await page.reload() at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89 Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-chromium-1440/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

6) [chromium-1440] › e2e/vim.spec.ts:380:3 › Vim mode › : commands in the bar: :n, :s, :%s, :w, :q 

    Error: expect(locator).toBeVisible() failed

    Locator: locator('.bar-wrap').getByText('Saved').first()
    Expected: visible
    Timeout: 5000ms
    Error: element(s) not found

    Call log:
      - Expect "toBeVisible" locator('.bar-wrap').getByText('Saved').first() with timeout 5000ms
      - waiting for locator('.bar-wrap').getByText('Saved').first()


      403 |     // :w says it's saved.
      404 |     await keys(page, ':', 'w', 'Enter')
    > 405 |     await expect(bar(page).getByText('Saved').first()).toBeVisible()
          |                                                        ^
      406 |     // An unknown command says so, and nothing changes.
      407 |     const text = await editorText(page)
      408 |     await keys(page, ':')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/vim.spec.ts:405:56

    Error Context: ../../../../../bm10-train/test-results/vim-Vim-mode-commands-in-the-bar-n-s-s-w-q-chromium-1440/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 6) [chromium-1440] › e2e/vim.spec.ts:380:3 › Vim mode › : commands in the bar: :n, :s, :%s, :w, :q Error: expect(locator).toBeVisible() failed Locator: locator('.bar-wrap').getByText('Saved').first() Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" locator('.bar-wrap').getByText('Saved').first() with timeout 5000ms - waiting for locator('.bar-wrap').getByText('Saved').first() 403 | // :w says it's saved. 404 | await keys(page, ':', 'w', 'Enter') > 405 | await expect(bar(page).getByText('Saved').first()).toBeVisible() | ^ 406 | // An unknown command says so, and nothing changes. 407 | const text = await editorText(page) 408 | await keys(page, ':') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/vim.spec.ts:405:56 Error Context: ../../../../../bm10-train/test-results/vim-Vim-mode-commands-in-the-bar-n-s-s-w-q-chromium-1440/error-context.md ```
Author
Owner

Additional first-run attribution: Chromium-1440 tree.spec.ts:377 (Style sheet tree-lines persistence) PASS on its single origin/dev comparison, so the train failure is new/unresolved. Chromium-1440 vim.spec.ts:380 also passed its single dev comparison; this is retained as the known pre-existing flake identified in the task brief, not claimed reproduced by this run. The exact first-error comments remain in this PR. No retry of either train case. Chromium sidebar-edge fails at the same contain: paint list/count assertion on dev, confirming that one as pre-existing.

Current minimum unresolved count is seven: the three preload cases on both desktop browsers, plus Chromium tree-lines Style. Full matrix continues; verdict remains RED.

Additional first-run attribution: Chromium-1440 `tree.spec.ts:377` (Style sheet tree-lines persistence) **PASS on its single origin/dev comparison**, so the train failure is new/unresolved. Chromium-1440 `vim.spec.ts:380` also passed its single dev comparison; this is retained as the **known pre-existing flake identified in the task brief**, not claimed reproduced by this run. The exact first-error comments remain in this PR. No retry of either train case. Chromium sidebar-edge fails at the same `contain: paint` list/count assertion on dev, confirming that one as pre-existing. Current minimum unresolved count is seven: the three preload cases on both desktop browsers, plus Chromium tree-lines Style. Full matrix continues; verdict remains RED.
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

4) [webkit-1440] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true })


      381 |   const lookOf = () => page.locator('article.page').getAttribute('data-lines')
      382 |   expect(await lookOf()).toBe('dotted')
    > 383 |   await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click()
          |                                                                                         ^
      384 |   await expect.poll(lookOf).toBe('connected')
      385 |   await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected')
      386 |   await page.reload()
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89

    Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-webkit-1440/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 4) [webkit-1440] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }) 381 | const lookOf = () => page.locator('article.page').getAttribute('data-lines') 382 | expect(await lookOf()).toBe('dotted') > 383 | await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click() | ^ 384 | await expect.poll(lookOf).toBe('connected') 385 | await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected') 386 | await page.reload() at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89 Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-webkit-1440/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

7) [chromium-390] › e2e/day.spec.ts:41:1 › opens on today and writes nothing until the first change 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Log the time' })


      71 |   await page.getByRole('textbox', { name: 'Note text' }).click()
      72 |   await keyboardDown(page)
    > 73 |   await page.getByRole('button', { name: 'Log the time' }).click()
         |                                                            ^
      74 |   await page.keyboard.type('Walk')
      75 |   await expect.poll(() => entries(iso)).toEqual([{ start: '09:12', end: null, text: 'Walk', line: expect.any(Number) }])
      76 |   await expect.poll(() => onDisk(`${iso}.md`)).toContain('- 09:12 Walk')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/day.spec.ts:73:60

    Error Context: ../../../../../bm10-train/test-results/day-opens-on-today-and-writes-nothing-until-the-first-change-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 7) [chromium-390] › e2e/day.spec.ts:41:1 › opens on today and writes nothing until the first change Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Log the time' }) 71 | await page.getByRole('textbox', { name: 'Note text' }).click() 72 | await keyboardDown(page) > 73 | await page.getByRole('button', { name: 'Log the time' }).click() | ^ 74 | await page.keyboard.type('Walk') 75 | await expect.poll(() => entries(iso)).toEqual([{ start: '09:12', end: null, text: 'Walk', line: expect.any(Number) }]) 76 | await expect.poll(() => onDisk(`${iso}.md`)).toContain('- 09:12 Walk') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/day.spec.ts:73:60 Error Context: ../../../../../bm10-train/test-results/day-opens-on-today-and-writes-nothing-until-the-first-change-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

8) [chromium-390] › e2e/glass.spec.ts:488:1 › the light Appearance preview keeps its page frost ──

    Error: expect(locator).toHaveCSS(expected) failed

    Locator:  locator('[data-preview] .page')
    Expected: "oklab(0.97947 0.00400285 0.00904181 / 0.8)"
    Received: "oklab(0.97947 0.00400285 0.00904181 / 0.2)"
    Timeout:  5000ms

    Call log:
      - Expect "toHaveCSS" locator('[data-preview] .page') with timeout 5000ms
      - waiting for locator('[data-preview] .page')
        14 × locator resolved to <div data-wide="false" class="page svelte-1l497k0 glass">…</div>
           - unexpected value "oklab(0.97947 0.00400285 0.00904181 / 0.2)"


      501 |     return colour
      502 |   })
    > 503 |   await expect(preview).toHaveCSS('background-color', tint)
          |                         ^
      504 | })
      505 |
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/glass.spec.ts:503:25

    Error Context: ../../../../../bm10-train/test-results/glass-the-light-Appearance-preview-keeps-its-page-frost-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 8) [chromium-390] › e2e/glass.spec.ts:488:1 › the light Appearance preview keeps its page frost ── Error: expect(locator).toHaveCSS(expected) failed Locator: locator('[data-preview] .page') Expected: "oklab(0.97947 0.00400285 0.00904181 / 0.8)" Received: "oklab(0.97947 0.00400285 0.00904181 / 0.2)" Timeout: 5000ms Call log: - Expect "toHaveCSS" locator('[data-preview] .page') with timeout 5000ms - waiting for locator('[data-preview] .page') 14 × locator resolved to <div data-wide="false" class="page svelte-1l497k0 glass">…</div> - unexpected value "oklab(0.97947 0.00400285 0.00904181 / 0.2)" 501 | return colour 502 | }) > 503 | await expect(preview).toHaveCSS('background-color', tint) | ^ 504 | }) 505 | at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/glass.spec.ts:503:25 Error Context: ../../../../../bm10-train/test-results/glass-the-light-Appearance-preview-keeps-its-page-frost-chromium-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

5) [webkit-390] › e2e/day.spec.ts:41:1 › opens on today and writes nothing until the first change 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Log the time' })


      71 |   await page.getByRole('textbox', { name: 'Note text' }).click()
      72 |   await keyboardDown(page)
    > 73 |   await page.getByRole('button', { name: 'Log the time' }).click()
         |                                                            ^
      74 |   await page.keyboard.type('Walk')
      75 |   await expect.poll(() => entries(iso)).toEqual([{ start: '09:12', end: null, text: 'Walk', line: expect.any(Number) }])
      76 |   await expect.poll(() => onDisk(`${iso}.md`)).toContain('- 09:12 Walk')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/day.spec.ts:73:60

    Error Context: ../../../../../bm10-train/test-results/day-opens-on-today-and-writes-nothing-until-the-first-change-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 5) [webkit-390] › e2e/day.spec.ts:41:1 › opens on today and writes nothing until the first change Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Log the time' }) 71 | await page.getByRole('textbox', { name: 'Note text' }).click() 72 | await keyboardDown(page) > 73 | await page.getByRole('button', { name: 'Log the time' }).click() | ^ 74 | await page.keyboard.type('Walk') 75 | await expect.poll(() => entries(iso)).toEqual([{ start: '09:12', end: null, text: 'Walk', line: expect.any(Number) }]) 76 | await expect.poll(() => onDisk(`${iso}.md`)).toContain('- 09:12 Walk') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/day.spec.ts:73:60 Error Context: ../../../../../bm10-train/test-results/day-opens-on-today-and-writes-nothing-until-the-first-change-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

6) [webkit-390] › e2e/glass.spec.ts:488:1 › the light Appearance preview keeps its page frost ────

    Error: expect(locator).toHaveCSS(expected) failed

    Locator:  locator('[data-preview] .page')
    Expected: "oklab(0.979475 0.003958 0.009022 / 0.8)"
    Received: "oklab(0.979475 0.003958 0.009022 / 0.2)"
    Timeout:  5000ms

    Call log:
      - Expect "toHaveCSS" locator('[data-preview] .page') with timeout 5000ms
      - waiting for locator('[data-preview] .page')
        13 × locator resolved to <div data-wide="false" class="page svelte-1l497k0 glass">…</div>
           - unexpected value "oklab(0.979475 0.003958 0.009022 / 0.2)"


      501 |     return colour
      502 |   })
    > 503 |   await expect(preview).toHaveCSS('background-color', tint)
          |                         ^
      504 | })
      505 |
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/glass.spec.ts:503:25

    Error Context: ../../../../../bm10-train/test-results/glass-the-light-Appearance-preview-keeps-its-page-frost-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 6) [webkit-390] › e2e/glass.spec.ts:488:1 › the light Appearance preview keeps its page frost ──── Error: expect(locator).toHaveCSS(expected) failed Locator: locator('[data-preview] .page') Expected: "oklab(0.979475 0.003958 0.009022 / 0.8)" Received: "oklab(0.979475 0.003958 0.009022 / 0.2)" Timeout: 5000ms Call log: - Expect "toHaveCSS" locator('[data-preview] .page') with timeout 5000ms - waiting for locator('[data-preview] .page') 13 × locator resolved to <div data-wide="false" class="page svelte-1l497k0 glass">…</div> - unexpected value "oklab(0.979475 0.003958 0.009022 / 0.2)" 501 | return colour 502 | }) > 503 | await expect(preview).toHaveCSS('background-color', tint) | ^ 504 | }) 505 | at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/glass.spec.ts:503:25 Error Context: ../../../../../bm10-train/test-results/glass-the-light-Appearance-preview-keeps-its-page-frost-webkit-390/error-context.md ```
Author
Owner

Phone-stage progress and attribution: day.spec.ts:41 fails on both chromium-390 and webkit-390, and each exact case PASSed its single origin/dev test attempt. These are new/unresolved. tree.spec.ts:377 also PASSed on dev for webkit-1440, adding the second desktop Style/tree regression.

Both phone browsers now also report glass.spec.ts:488 (Appearance-preview frost). Those baseline selections are not yet attributed: Playwright appended decorative line characters to their console titles, and the streaming selector matched zero tests. The first such launch is verified with expected=unexpected=skipped=0 and Error: No tests found.; the same format affects the other browser. These runner errors are retained, not treated as baseline case failures. After the native runs finish, remaining unattempted comparisons will be selected from the JSON reporter’s exact titles. Already attempted baseline cases will be reused, never rerun. The original 7 zero-test launches from trailing whitespace remain disclosed in comment 75661.

Verdict remains RED. No train source change or attempted-case retry.

Phone-stage progress and attribution: `day.spec.ts:41` fails on both chromium-390 and webkit-390, and each exact case PASSed its single origin/dev test attempt. These are new/unresolved. `tree.spec.ts:377` also PASSed on dev for webkit-1440, adding the second desktop Style/tree regression. Both phone browsers now also report `glass.spec.ts:488` (Appearance-preview frost). Those baseline selections are **not yet attributed**: Playwright appended decorative line characters to their console titles, and the streaming selector matched zero tests. The first such launch is verified with expected=unexpected=skipped=0 and `Error: No tests found.`; the same format affects the other browser. These runner errors are retained, not treated as baseline case failures. After the native runs finish, remaining unattempted comparisons will be selected from the JSON reporter’s exact titles. Already attempted baseline cases will be reused, never rerun. The original 7 zero-test launches from trailing whitespace remain disclosed in comment 75661. Verdict remains RED. No train source change or attempted-case retry.
Author
Owner

The repaired corpus-readiness gate completed its FIRST full-train attempts on both desktop browsers. No isolated retry is used.

Project Corpus queries Misses
chromium-1440 1492 10
webkit-1440 1492 9

Chromium reports 10/1492 misses (0.67%); WebKit reports 9/1492 misses (0.60%). Both are within the unchanged 2% assertion limit on head 31b867ac95b290c6d53ee042bc6343d04cee3d02, which includes #856 b89e39bb and #840 9dd57224. This records functional corpus coverage only; no dev-VM timing is presented as performance qualification. BM10 remains RED for the separately recorded UI failures.

The repaired corpus-readiness gate completed its FIRST full-train attempts on both desktop browsers. No isolated retry is used. | Project | Corpus queries | Misses | |---|---:|---:| | chromium-1440 | 1492 | 10 | | webkit-1440 | 1492 | 9 | Chromium reports 10/1492 misses (0.67%); WebKit reports 9/1492 misses (0.60%). Both are within the unchanged 2% assertion limit on head `31b867ac95b290c6d53ee042bc6343d04cee3d02`, which includes #856 `b89e39bb` and #840 `9dd57224`. This records functional corpus coverage only; no dev-VM timing is presented as performance qualification. BM10 remains RED for the separately recorded UI failures.
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

9) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on idle before opening ──

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      39 |       expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1)
      40 |     }
    > 41 |     await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                        ^
      42 |     await expect(page.locator('.info')).toBeVisible()
      43 |   })
      44 | }
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-idle-before-opening-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 9) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on idle before opening ── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 39 | expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1) 40 | } > 41 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 42 | await expect(page.locator('.info')).toBeVisible() 43 | }) 44 | } at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-idle-before-opening-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

10) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on timer before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      39 |       expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1)
      40 |     }
    > 41 |     await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                        ^
      42 |     await expect(page.locator('.info')).toBeVisible()
      43 |   })
      44 | }
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-timer-before-opening-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 10) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on timer before opening Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 39 | expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1) 40 | } > 41 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 42 | await expect(page.locator('.info')).toBeVisible() 43 | }) 44 | } at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-timer-before-opening-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

11) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerover before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-c3c5a--pointerover-before-opening-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 11) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerover before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-c3c5a--pointerover-before-opening-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

12) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerdown before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-41081--pointerdown-before-opening-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 12) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerdown before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-41081--pointerdown-before-opening-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

13) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on focusin before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-focusin-before-opening-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 13) [chromium-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on focusin before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-focusin-before-opening-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

14) [chromium-390] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Insert', exact: true })


      70 |       observer.observe(document.body, { childList: true, subtree: true })
      71 |     }, { selector, select: name === 'Link to a note' })
    > 72 |     await page.getByRole('button', { name, exact: true }).click()
         |                                                           ^
      73 |     await expect(page.locator(selector)).toBeVisible()
      74 |     expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true)
      75 |     await page.keyboard.press('Escape')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:72:59

    Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 14) [chromium-390] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Insert', exact: true }) 70 | observer.observe(document.body, { childList: true, subtree: true }) 71 | }, { selector, select: name === 'Link to a note' }) > 72 | await page.getByRole('button', { name, exact: true }).click() | ^ 73 | await expect(page.locator(selector)).toBeVisible() 74 | expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true) 75 | await page.keyboard.press('Escape') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:72:59 Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

15) [chromium-390] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 15) [chromium-390] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

16) [chromium-390] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 16) [chromium-390] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-chromium-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

7) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on idle before opening ────

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      39 |       expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1)
      40 |     }
    > 41 |     await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                        ^
      42 |     await expect(page.locator('.info')).toBeVisible()
      43 |   })
      44 | }
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-idle-before-opening-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 7) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on idle before opening ──── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 39 | expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1) 40 | } > 41 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 42 | await expect(page.locator('.info')).toBeVisible() 43 | }) 44 | } at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-idle-before-opening-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

8) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on timer before opening ───

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      39 |       expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1)
      40 |     }
    > 41 |     await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                        ^
      42 |     await expect(page.locator('.info')).toBeVisible()
      43 |   })
      44 | }
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-timer-before-opening-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 8) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on timer before opening ─── Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 39 | expect(await page.locator('.settings .bar-wrap').count(), 'Settings warms its bar before first activation').toBe(1) 40 | } > 41 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 42 | await expect(page.locator('.info')).toBeVisible() 43 | }) 44 | } at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:41:72 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-timer-before-opening-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

9) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerover before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-c3c5a--pointerover-before-opening-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 9) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerover before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-c3c5a--pointerover-before-opening-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

10) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerdown before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-41081--pointerdown-before-opening-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 10) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on pointerdown before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-41081--pointerdown-before-opening-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

11) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on focusin before opening 

    Test timeout of 30000ms exceeded.

    Error: locator.dispatchEvent: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      23 |     await keyboardDown(page)
      24 |     if (mode !== 'idle' && mode !== 'timer') {
    > 25 |       await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode)
         |                                                                          ^
      26 |     }
      27 |     // Idle warms every surface; intent prioritizes the target screen group. Both must
      28 |     // finish before opening. Checking CSS catches premature JS-only prefetching.
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74

    Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-focusin-before-opening-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 11) [webkit-390] › e2e/preload.spec.ts:8:3 › on-demand surfaces preload on focusin before opening Test timeout of 30000ms exceeded. Error: locator.dispatchEvent: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 23 | await keyboardDown(page) 24 | if (mode !== 'idle' && mode !== 'timer') { > 25 | await page.getByRole('button', { name: 'Note info', exact: true }).dispatchEvent(mode) | ^ 26 | } 27 | // Idle warms every surface; intent prioritizes the target screen group. Both must 28 | // finish before opening. Checking CSS catches premature JS-only prefetching. at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:25:74 Error Context: ../../../../../bm10-train/test-results/preload-on-demand-surfaces-preload-on-focusin-before-opening-webkit-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

17) [chromium-390] › e2e/trash-search.spec.ts:14:3 › row opens a Trash note read-only; only Restore brings it back 

    Test timeout of 90000ms exceeded.

    Error: locator.click: Test timeout of 90000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      27 |       await editor.getByText(body).click()
      28 |       await keyboardDown(page)
    > 29 |       await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                          ^
      30 |       await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click()
      31 |       await expect.poll(() => live(id)).toBe(false)
      32 |     } else await act('notes.delete', { id })
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:29:74

    Error Context: ../../../../../bm10-train/test-results/trash-search-row-opens-a-T-af493-only-Restore-brings-it-back-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 17) [chromium-390] › e2e/trash-search.spec.ts:14:3 › row opens a Trash note read-only; only Restore brings it back Test timeout of 90000ms exceeded. Error: locator.click: Test timeout of 90000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 27 | await editor.getByText(body).click() 28 | await keyboardDown(page) > 29 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 30 | await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click() 31 | await expect.poll(() => live(id)).toBe(false) 32 | } else await act('notes.delete', { id }) at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:29:74 Error Context: ../../../../../bm10-train/test-results/trash-search-row-opens-a-T-af493-only-Restore-brings-it-back-chromium-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

18) [chromium-390] › e2e/trash.spec.ts:17:1 › Delete in Info moves the note to the Trash, and Undo brings it back 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      21 |   await editor.getByText('keep these words').click()
      22 |   await keyboardDown(page)
    > 23 |   await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                      ^
      24 |   await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click()
      25 |
      26 |   await expect.poll(() => exists(id)).toBe(false)
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash.spec.ts:23:70

    Error Context: ../../../../../bm10-train/test-results/trash-Delete-in-Info-moves-8b7eb-ash-and-Undo-brings-it-back-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 18) [chromium-390] › e2e/trash.spec.ts:17:1 › Delete in Info moves the note to the Trash, and Undo brings it back Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 21 | await editor.getByText('keep these words').click() 22 | await keyboardDown(page) > 23 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 24 | await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click() 25 | 26 | await expect.poll(() => exists(id)).toBe(false) at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash.spec.ts:23:70 Error Context: ../../../../../bm10-train/test-results/trash-Delete-in-Info-moves-8b7eb-ash-and-Undo-brings-it-back-chromium-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

12) [webkit-390] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Insert', exact: true })


      70 |       observer.observe(document.body, { childList: true, subtree: true })
      71 |     }, { selector, select: name === 'Link to a note' })
    > 72 |     await page.getByRole('button', { name, exact: true }).click()
         |                                                           ^
      73 |     await expect(page.locator(selector)).toBeVisible()
      74 |     expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true)
      75 |     await page.keyboard.press('Escape')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:72:59

    Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 12) [webkit-390] › e2e/preload.spec.ts:48:1 › warmed sheets contain their component in the first DOM update Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Insert', exact: true }) 70 | observer.observe(document.body, { childList: true, subtree: true }) 71 | }, { selector, select: name === 'Link to a note' }) > 72 | await page.getByRole('button', { name, exact: true }).click() | ^ 73 | await expect(page.locator(selector)).toBeVisible() 74 | expect(await page.evaluate(() => (window as any).__firstSheet), name).toBe(true) 75 | await page.keyboard.press('Escape') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:72:59 Error Context: ../../../../../bm10-train/test-results/preload-warmed-sheets-cont-ca704-ent-in-the-first-DOM-update-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

13) [webkit-390] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 13) [webkit-390] › e2e/preload.spec.ts:111:3 › palette Control intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Control-in-4743f--its-own-screen-before-idle-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

14) [webkit-390] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle 

    Error: modifier intent fetches only Palette

    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 3
    Received array:  ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"]

      127 |     await page.keyboard.up(modifier)
      128 |     await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))))
    > 129 |     expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1)
          |                                                                           ^
      130 |     expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/)
      131 |     const ready = scripts.length
      132 |     await page.keyboard.press('Control+k')
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75

    Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 14) [webkit-390] › e2e/preload.spec.ts:111:3 › palette Meta intent prepares only its own screen before idle Error: modifier intent fetches only Palette expect(received).toHaveLength(expected) Expected length: 1 Received length: 3 Received array: ["/assets/Palette-Bdb3DvOq.js", "/assets/idle-screens-BEYCVG_c.js", "/assets/replay-D8gRoApP.js"] 127 | await page.keyboard.up(modifier) 128 | await page.evaluate(() => new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())))) > 129 | expect(scripts.slice(before), 'modifier intent fetches only Palette').toHaveLength(1) | ^ 130 | expect(scripts.at(-1)).toMatch(/\/Palette-[^/]+\.js$/) 131 | const ready = scripts.length 132 | await page.keyboard.press('Control+k') at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/preload.spec.ts:129:75 Error Context: ../../../../../bm10-train/test-results/preload-palette-Meta-inten-2519f--its-own-screen-before-idle-webkit-390/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

19) [chromium-390] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true })


      381 |   const lookOf = () => page.locator('article.page').getAttribute('data-lines')
      382 |   expect(await lookOf()).toBe('dotted')
    > 383 |   await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click()
          |                                                                                         ^
      384 |   await expect.poll(lookOf).toBe('connected')
      385 |   await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected')
      386 |   await page.reload()
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89

    Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-chromium-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 19) [chromium-390] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }) 381 | const lookOf = () => page.locator('article.page').getAttribute('data-lines') 382 | expect(await lookOf()).toBe('dotted') > 383 | await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click() | ^ 384 | await expect.poll(lookOf).toBe('connected') 385 | await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected') 386 | await page.reload() at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89 Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-chromium-390/error-context.md ```
Author
Owner

Attribution correction for chromium-390 trash-search.spec.ts:14: baseline FAIL does not reproduce the train failure. Keep this train case new/unresolved.

Build First error
BM10 Timeout clicking Note info, trash-search.spec.ts:29; cannot reach the delete step
origin/dev, single actual attempt Missing Restored “<title>” toast, trash-search.spec.ts:98; it reaches restore much later

The baseline establishes a separate toast failure, not that the earlier missing-control failure is pre-existing. Both actual attempts are retained, neither rerun. The phone trash.spec.ts:17 delete/Undo case and tree.spec.ts:377 Style/tree case PASSed their single dev comparisons, so their train failures are also new/unresolved. This distinction will remain in the final per-case table.

Attribution correction for chromium-390 `trash-search.spec.ts:14`: baseline FAIL **does not reproduce the train failure**. Keep this train case new/unresolved. | Build | First error | |---|---| | BM10 | Timeout clicking `Note info`, `trash-search.spec.ts:29`; cannot reach the delete step | | origin/dev, single actual attempt | Missing `Restored “<title>”` toast, `trash-search.spec.ts:98`; it reaches restore much later | The baseline establishes a separate toast failure, not that the earlier missing-control failure is pre-existing. Both actual attempts are retained, neither rerun. The phone `trash.spec.ts:17` delete/Undo case and `tree.spec.ts:377` Style/tree case PASSed their single dev comparisons, so their train failures are also new/unresolved. This distinction will remain in the final per-case table.
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

20) [prefs-chromium] › e2e/prefs-offline.spec.ts:107:3 › settings offline › a change made offline shows at once, survives a reload with no flash, and is sent when back 

    Error: expect(received).toBe(expected) // Object.is equality

    Expected: "[]"
    Received: "[\"float-glass morph-glass DIV{\\\"x\\\":941.5,\\\"y\\\":809,\\\"width\\\":114,\\\"height\\\":81,\\\"top\\\":809,\\\"right\\\":1055.5,\\\"bottom\\\":890,\\\"left\\\":941.5}{\\\"x\\\":836.5,\\\"y\\\":809,\\\"width\\\":325,\\\"height\\\":81,\\\"top\\\":809,\\\"right\\\":1161.5,\\\"bottom\\\":890,\\\"left\\\":836.5},layer svelte-qyxuv4 DIV{\\\"x\\\":977,\\\"y\\\":832,\\\"width\\\":149.5,\\\"height\\\":44,\\\"top\\\":832,\\\"right\\\":1126.5,\\\"bottom\\\":876,\\\"left\\\":977}{\\\"x\\\":871.5,\\\"y\\\":832,\\\"width\\\":255,\\\"height\\\":44,\\\"top\\\":832,\\\"right\\\":1126.5,\\\"bottom\\\":876,\\\"left\\\":871.5} @201\"]"

      127 |       // Anything that was going to move has moved once the screen is still.
      128 |       await still(page)
    > 129 |       expect(await page.evaluate(() => JSON.stringify((window as any).__shifts ?? []))).toBe('[]')
          |                                                                                         ^
      130 |       expect((await waiting(page)).length).toBe(1)
      131 |     }
      132 |
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/prefs-offline.spec.ts:129:89

    Error Context: ../../../../../bm10-train/test-results/prefs-offline-settings-off-1fdb6-flash-and-is-sent-when-back-prefs-chromium/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 20) [prefs-chromium] › e2e/prefs-offline.spec.ts:107:3 › settings offline › a change made offline shows at once, survives a reload with no flash, and is sent when back Error: expect(received).toBe(expected) // Object.is equality Expected: "[]" Received: "[\"float-glass morph-glass DIV{\\\"x\\\":941.5,\\\"y\\\":809,\\\"width\\\":114,\\\"height\\\":81,\\\"top\\\":809,\\\"right\\\":1055.5,\\\"bottom\\\":890,\\\"left\\\":941.5}{\\\"x\\\":836.5,\\\"y\\\":809,\\\"width\\\":325,\\\"height\\\":81,\\\"top\\\":809,\\\"right\\\":1161.5,\\\"bottom\\\":890,\\\"left\\\":836.5},layer svelte-qyxuv4 DIV{\\\"x\\\":977,\\\"y\\\":832,\\\"width\\\":149.5,\\\"height\\\":44,\\\"top\\\":832,\\\"right\\\":1126.5,\\\"bottom\\\":876,\\\"left\\\":977}{\\\"x\\\":871.5,\\\"y\\\":832,\\\"width\\\":255,\\\"height\\\":44,\\\"top\\\":832,\\\"right\\\":1126.5,\\\"bottom\\\":876,\\\"left\\\":871.5} @201\"]" 127 | // Anything that was going to move has moved once the screen is still. 128 | await still(page) > 129 | expect(await page.evaluate(() => JSON.stringify((window as any).__shifts ?? []))).toBe('[]') | ^ 130 | expect((await waiting(page)).length).toBe(1) 131 | } 132 | at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/prefs-offline.spec.ts:129:89 Error Context: ../../../../../bm10-train/test-results/prefs-offline-settings-off-1fdb6-flash-and-is-sent-when-back-prefs-chromium/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

21) [contrast] › e2e/contrast.spec.ts:230:3 › the bar's sheets keep their contrast over a photo and over a page of huge words, 1440 wide 

    Error: 1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box
    1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box

    expect(received).toEqual(expected) // deep equality

    - Expected  -  1
    + Received  + 14

    - Array []
    + Array [
    +   "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box",
    +   "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box",
    + ]

      53 | const finish = (report: string[], failures: string[], file?: string) => {
      54 |   if (file) writeFileSync(file, report.join('\n') + '\n')
    > 55 |   expect(failures, failures.join('\n')).toEqual([])
         |                                         ^
      56 | }
      57 |
      58 | test('text and icons on the glass keep their contrast at every sky hour', async ({ page }) => {
        at finish (/home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:55:41)
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:254:5

    Error Context: ../../../../../bm10-train/test-results/contrast-the-bar-s-sheets--ed6b7-age-of-huge-words-1440-wide-contrast/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 21) [contrast] › e2e/contrast.spec.ts:230:3 › the bar's sheets keep their contrast over a photo and over a page of huge words, 1440 wide Error: 1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box 1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 14 - Array [] + Array [ + "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box", + "1440/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box", + ] 53 | const finish = (report: string[], failures: string[], file?: string) => { 54 | if (file) writeFileSync(file, report.join('\n') + '\n') > 55 | expect(failures, failures.join('\n')).toEqual([]) | ^ 56 | } 57 | 58 | test('text and icons on the glass keep their contrast at every sky hour', async ({ page }) => { at finish (/home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:55:41) at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:254:5 Error Context: ../../../../../bm10-train/test-results/contrast-the-bar-s-sheets--ed6b7-age-of-huge-words-1440-wide-contrast/error-context.md ```
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

22) [contrast] › e2e/contrast.spec.ts:230:3 › the bar's sheets keep their contrast over a photo and over a page of huge words, 390 wide 

    Error: 390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box
    390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box

    expect(received).toEqual(expected) // deep equality

    - Expected  -  1
    + Received  + 10

    - Array []
    + Array [
    +   "390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box",
    +   "390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box",
    + ]

      53 | const finish = (report: string[], failures: string[], file?: string) => {
      54 |   if (file) writeFileSync(file, report.join('\n') + '\n')
    > 55 |   expect(failures, failures.join('\n')).toEqual([])
         |                                         ^
      56 | }
      57 |
      58 | test('text and icons on the glass keep their contrast at every sky hour', async ({ page }) => {
        at finish (/home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:55:41)
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:254:5

    Error Context: ../../../../../bm10-train/test-results/contrast-the-bar-s-sheets--55baa-page-of-huge-words-390-wide-contrast/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 22) [contrast] › e2e/contrast.spec.ts:230:3 › the bar's sheets keep their contrast over a photo and over a page of huge words, 390 wide Error: 390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box 390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box 390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box 390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box 390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box 390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box 390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box 390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 10 - Array [] + Array [ + "390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/backdrop=photo&page=glass/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/backdrop=photo&page=glass + huge words/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/sky=dawn/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box", + "390/dark/sky=night/Style: 2.22 (needs 3) icon in .sc-box", + ] 53 | const finish = (report: string[], failures: string[], file?: string) => { 54 | if (file) writeFileSync(file, report.join('\n') + '\n') > 55 | expect(failures, failures.join('\n')).toEqual([]) | ^ 56 | } 57 | 58 | test('text and icons on the glass keep their contrast at every sky hour', async ({ page }) => { at finish (/home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:55:41) at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/contrast.spec.ts:254:5 Error Context: ../../../../../bm10-train/test-results/contrast-the-bar-s-sheets--55baa-page-of-huge-words-390-wide-contrast/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

15) [webkit-390] › e2e/trash-search.spec.ts:14:3 › row opens a Trash note read-only; only Restore brings it back 

    Test timeout of 90000ms exceeded.

    Error: locator.click: Test timeout of 90000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      27 |       await editor.getByText(body).click()
      28 |       await keyboardDown(page)
    > 29 |       await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                          ^
      30 |       await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click()
      31 |       await expect.poll(() => live(id)).toBe(false)
      32 |     } else await act('notes.delete', { id })
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:29:74

    Error Context: ../../../../../bm10-train/test-results/trash-search-row-opens-a-T-af493-only-Restore-brings-it-back-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 15) [webkit-390] › e2e/trash-search.spec.ts:14:3 › row opens a Trash note read-only; only Restore brings it back Test timeout of 90000ms exceeded. Error: locator.click: Test timeout of 90000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 27 | await editor.getByText(body).click() 28 | await keyboardDown(page) > 29 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 30 | await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click() 31 | await expect.poll(() => live(id)).toBe(false) 32 | } else await act('notes.delete', { id }) at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:29:74 Error Context: ../../../../../bm10-train/test-results/trash-search-row-opens-a-T-af493-only-Restore-brings-it-back-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

16) [webkit-390] › e2e/trash.spec.ts:17:1 › Delete in Info moves the note to the Trash, and Undo brings it back 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for getByRole('button', { name: 'Note info', exact: true })


      21 |   await editor.getByText('keep these words').click()
      22 |   await keyboardDown(page)
    > 23 |   await page.getByRole('button', { name: 'Note info', exact: true }).click()
         |                                                                      ^
      24 |   await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click()
      25 |
      26 |   await expect.poll(() => exists(id)).toBe(false)
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash.spec.ts:23:70

    Error Context: ../../../../../bm10-train/test-results/trash-Delete-in-Info-moves-8b7eb-ash-and-Undo-brings-it-back-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 16) [webkit-390] › e2e/trash.spec.ts:17:1 › Delete in Info moves the note to the Trash, and Undo brings it back Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for getByRole('button', { name: 'Note info', exact: true }) 21 | await editor.getByText('keep these words').click() 22 | await keyboardDown(page) > 23 | await page.getByRole('button', { name: 'Note info', exact: true }).click() | ^ 24 | await page.getByRole('dialog', { name: 'Note info' }).getByRole('button', { name: 'Delete', exact: true }).click() 25 | 26 | await expect.poll(() => exists(id)).toBe(false) at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash.spec.ts:23:70 Error Context: ../../../../../bm10-train/test-results/trash-Delete-in-Info-moves-8b7eb-ash-and-Undo-brings-it-back-webkit-390/error-context.md ```
Author
Owner

First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

17) [webkit-390] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload 

    Test timeout of 30000ms exceeded.

    Error: locator.click: Test timeout of 30000ms exceeded.
    Call log:
      - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true })


      381 |   const lookOf = () => page.locator('article.page').getAttribute('data-lines')
      382 |   expect(await lookOf()).toBe('dotted')
    > 383 |   await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click()
          |                                                                                         ^
      384 |   await expect.poll(lookOf).toBe('connected')
      385 |   await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected')
      386 |   await page.reload()
        at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89

    Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-webkit-390/error-context.md
First browser error, dev02, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. ```text 17) [webkit-390] › e2e/tree.spec.ts:377:1 › Style sheet: a note chooses its own tree lines, saved with the note and kept on reload Test timeout of 30000ms exceeded. Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }) 381 | const lookOf = () => page.locator('article.page').getAttribute('data-lines') 382 | expect(await lookOf()).toBe('dotted') > 383 | await page.locator('.inspector').getByRole('tab', { name: 'Connected', exact: true }).click() | ^ 384 | await expect.poll(lookOf).toBe('connected') 385 | await expect.poll(() => readOutside(id)).toContain('calternal-lines: connected') 386 | await page.reload() at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/tree.spec.ts:383:89 Error Context: ../../../../../bm10-train/test-results/tree-Style-sheet-a-note-ch-7568b-the-note-and-kept-on-reload-webkit-390/error-context.md ```
Author
Owner

Native Chromium invocation finished: 1369 passed, 22 failed, 814 explicit skips, 11 unattempted. Its reporter stats count dependency-blocked records among skipped; this table separates them. First attempts only, CI=1, --workers=1 --retries=0.

VM Project Passed Failed Skipped Unattempted
dev01 admin-chromium-1440 12 0 9 0
dev01 admin-chromium-390 12 0 9 0
dev01 admin-setup 1 0 0 0
dev01 chromium-1440 436 6 625 0
dev01 chromium-390 885 13 169 0
dev01 contrast 7 2 0 0
dev01 flow 1 0 0 0
dev01 look-chromium-1440 5 0 0 0
dev01 look-chromium-390 5 0 0 0
dev01 passkeys 1 0 0 0
dev01 prefs-chromium 4 1 2 0
dev01 sidebar-band-chromium 0 0 0 3
dev01 throttled-1440 0 0 0 4
dev01 throttled-390 0 0 0 4

Totals: {"failed": 22, "passed": 1369, "skipped": 814, "unattempted": 11}

The three sidebar-band cases were blocked by failed contrast; the eight throttled cases were blocked by native scheduling dependencies. All 11 now receive their FIRST attempts in one separate invocation on the same head, native project definitions retained, scheduling dependencies removed. These selected projects have zero prior result records; the runner verifies that before launch. No attempted case is rerun.

Command from apps/web: CI=1 bunx playwright test --config=playwright.bm10-unrun.config.ts --workers=1 --retries=0 --reporter=line,json --output="$HOME/bm10-train/unrun/test-results". CALTERNAL_BIN/E2E_DIST point at the unchanged train build; JSON/TMPDIR outside repo, Nix + ~/bin/slot, df -h / >50 GiB before launch. Admin-setup and both admin projects already completed in their original invocation, with their native dependency intact.

Native Chromium invocation finished: **1369 passed, 22 failed, 814 explicit skips, 11 unattempted**. Its reporter stats count dependency-blocked records among skipped; this table separates them. First attempts only, CI=1, --workers=1 --retries=0. | VM | Project | Passed | Failed | Skipped | Unattempted | |---|---|---:|---:|---:|---:| | dev01 | admin-chromium-1440 | 12 | 0 | 9 | 0 | | dev01 | admin-chromium-390 | 12 | 0 | 9 | 0 | | dev01 | admin-setup | 1 | 0 | 0 | 0 | | dev01 | chromium-1440 | 436 | 6 | 625 | 0 | | dev01 | chromium-390 | 885 | 13 | 169 | 0 | | dev01 | contrast | 7 | 2 | 0 | 0 | | dev01 | flow | 1 | 0 | 0 | 0 | | dev01 | look-chromium-1440 | 5 | 0 | 0 | 0 | | dev01 | look-chromium-390 | 5 | 0 | 0 | 0 | | dev01 | passkeys | 1 | 0 | 0 | 0 | | dev01 | prefs-chromium | 4 | 1 | 2 | 0 | | dev01 | sidebar-band-chromium | 0 | 0 | 0 | 3 | | dev01 | throttled-1440 | 0 | 0 | 0 | 4 | | dev01 | throttled-390 | 0 | 0 | 0 | 4 | Totals: `{"failed": 22, "passed": 1369, "skipped": 814, "unattempted": 11}` The three sidebar-band cases were blocked by failed contrast; the eight throttled cases were blocked by native scheduling dependencies. All 11 now receive their FIRST attempts in one separate invocation on the same head, native project definitions retained, scheduling dependencies removed. These selected projects have zero prior result records; the runner verifies that before launch. No attempted case is rerun. Command from apps/web: `CI=1 bunx playwright test --config=playwright.bm10-unrun.config.ts --workers=1 --retries=0 --reporter=line,json --output="$HOME/bm10-train/unrun/test-results"`. CALTERNAL_BIN/E2E_DIST point at the unchanged train build; JSON/TMPDIR outside repo, Nix + ~/bin/slot, df -h / >50 GiB before launch. Admin-setup and both admin projects already completed in their original invocation, with their native dependency intact.
Author
Owner

First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head 31b867ac95b290c6d53ee042bc6343d04cee3d02. Each failed case receives one actual origin/dev attempt for attribution.

This is a Linux full-suite diagnostic. Its frame/timing values do not qualify GPU motion performance; that requires the Mac VM. The first test failure is retained without retry.

1) [throttled-390] › e2e/note-bars-motion.spec.ts:71:3 › @throttled rest to Style sheet, and back: layouts per frame, longest task and frame gaps at 6x 

    Error: longest main-thread task

    expect(received).toBeLessThan(expected)

    Expected: < 250
    Received:   267.755

      89 |     expect(backAgain.layouts / Math.max(1, backAgain.frames), 'layouts per frame coming back').toBeLessThanOrEqual(2)
      90 |     // No single task freezes the page: even at 6x, under a quarter of a second.
    > 91 |     expect(there.longestMs, 'longest main-thread task').toBeLessThan(250)
         |                                                         ^
      92 |   })
      93 |
        at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/note-bars-motion.spec.ts:91:57

    Error Context: ../../../../../bm10-train/unrun/test-results/note-bars-motion--throttle-ff0cd-t-task-and-frame-gaps-at-6x-throttled-390/error-context.md
First browser error, dev01, first attempt only. CI=1, --workers=1 --retries=0, head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. Each failed case receives one actual origin/dev attempt for attribution. This is a Linux full-suite diagnostic. Its frame/timing values do not qualify GPU motion performance; that requires the Mac VM. The first test failure is retained without retry. ```text 1) [throttled-390] › e2e/note-bars-motion.spec.ts:71:3 › @throttled rest to Style sheet, and back: layouts per frame, longest task and frame gaps at 6x Error: longest main-thread task expect(received).toBeLessThan(expected) Expected: < 250 Received: 267.755 89 | expect(backAgain.layouts / Math.max(1, backAgain.frames), 'layouts per frame coming back').toBeLessThanOrEqual(2) 90 | // No single task freezes the page: even at 6x, under a quarter of a second. > 91 | expect(there.longestMs, 'longest main-thread task').toBeLessThan(250) | ^ 92 | }) 93 | at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/note-bars-motion.spec.ts:91:57 Error Context: ../../../../../bm10-train/unrun/test-results/note-bars-motion--throttle-ff0cd-t-task-and-frame-gaps-at-6x-throttled-390/error-context.md ```
Author
Owner

Chromium half is now COMPLETE, all native cases either attempted once or explicitly skipped: 1377 passed, 23 failed, 816 skipped, 0 unattempted. No retries.

VM Project Passed Failed Skipped Unattempted
dev01 admin-chromium-1440 12 0 9 0
dev01 admin-chromium-390 12 0 9 0
dev01 admin-setup 1 0 0 0
dev01 chromium-1440 436 6 625 0
dev01 chromium-390 885 13 169 0
dev01 contrast 7 2 0 0
dev01 flow 1 0 0 0
dev01 look-chromium-1440 5 0 0 0
dev01 look-chromium-390 5 0 0 0
dev01 passkeys 1 0 0 0
dev01 prefs-chromium 4 1 2 0
dev01 sidebar-band-chromium 3 0 0 0
dev01 throttled-1440 2 0 2 0
dev01 throttled-390 3 1 0 0

Totals: {"failed": 23, "passed": 1377, "skipped": 816}

The 11 dependency-blocked cases received their first attempts: 8 passed, 1 failed, 2 explicit skips. The sidebar project passed all 3. The extra failure is throttled-390 note-bars-motion.spec.ts:71 (Style-sheet motion audit), with its first error in comment 75799. Because this runs on a Linux VM without a GPU, its frame figures are diagnostic only, not motion-performance qualification. The failed case receives one origin/dev attempt under the requested matrix; no train rerun or Mac performance claim.

Final JSON-based baseline selection is now executing only the 3 cases without any previous actual baseline result (Appearance preview, idle preload, and the newly attempted motion case). The other 20 completed baseline comparisons are reused. Zero-test runner launches remain separately disclosed and retained.

Chromium half is now COMPLETE, all native cases either attempted once or explicitly skipped: **1377 passed, 23 failed, 816 skipped, 0 unattempted**. No retries. | VM | Project | Passed | Failed | Skipped | Unattempted | |---|---|---:|---:|---:|---:| | dev01 | admin-chromium-1440 | 12 | 0 | 9 | 0 | | dev01 | admin-chromium-390 | 12 | 0 | 9 | 0 | | dev01 | admin-setup | 1 | 0 | 0 | 0 | | dev01 | chromium-1440 | 436 | 6 | 625 | 0 | | dev01 | chromium-390 | 885 | 13 | 169 | 0 | | dev01 | contrast | 7 | 2 | 0 | 0 | | dev01 | flow | 1 | 0 | 0 | 0 | | dev01 | look-chromium-1440 | 5 | 0 | 0 | 0 | | dev01 | look-chromium-390 | 5 | 0 | 0 | 0 | | dev01 | passkeys | 1 | 0 | 0 | 0 | | dev01 | prefs-chromium | 4 | 1 | 2 | 0 | | dev01 | sidebar-band-chromium | 3 | 0 | 0 | 0 | | dev01 | throttled-1440 | 2 | 0 | 2 | 0 | | dev01 | throttled-390 | 3 | 1 | 0 | 0 | Totals: `{"failed": 23, "passed": 1377, "skipped": 816}` The 11 dependency-blocked cases received their first attempts: 8 passed, 1 failed, 2 explicit skips. The sidebar project passed all 3. The extra failure is `throttled-390 note-bars-motion.spec.ts:71` (Style-sheet motion audit), with its first error in [comment 75799](https://git.kayg.org/kayg/calternal/pulls/880#issuecomment-75799). Because this runs on a Linux VM without a GPU, its frame figures are diagnostic only, not motion-performance qualification. The failed case receives one origin/dev attempt under the requested matrix; no train rerun or Mac performance claim. Final JSON-based baseline selection is now executing only the 3 cases without any previous actual baseline result (Appearance preview, idle preload, and the newly attempted motion case). The other 20 completed baseline comparisons are reused. Zero-test runner launches remain separately disclosed and retained.
Author
Owner

final dev01 browser matrix and baseline attribution. tested head 31b867ac95b290c6d53ee042bc6343d04cee3d02.

VM Project Passed Failed Skipped Unattempted
dev01 admin-chromium-1440 12 0 9 0
dev01 admin-chromium-390 12 0 9 0
dev01 admin-setup 1 0 0 0
dev01 chromium-1440 436 6 625 0
dev01 chromium-390 885 13 169 0
dev01 contrast 7 2 0 0
dev01 flow 1 0 0 0
dev01 look-chromium-1440 5 0 0 0
dev01 look-chromium-390 5 0 0 0
dev01 passkeys 1 0 0 0
dev01 prefs-chromium 4 1 2 0
dev01 sidebar-band-chromium 3 0 0 0
dev01 throttled-1440 2 0 2 0
dev01 throttled-390 3 1 0 0

Totals: {"failed": 23, "passed": 1377, "skipped": 816}

Each failed case below had exactly one actual origin/dev product comparison, with retry=0. Baseline product and dist: 55f35fcde3bc91ca3781055577b93e93819f6cd4; train test definitions retained, with only #779 Nix tooling overlaid on the baseline. A baseline PASS means new/unresolved, including possible stale test expectations after Style.

Project Case Origin/dev Attribution
chromium-390 day.spec.ts:41 opens on today and writes nothing until the first change PASS new/unresolved; baseline passes
chromium-390 glass.spec.ts:488 the light Appearance preview keeps its page frost PASS new/unresolved; baseline passes
chromium-1440 preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved; baseline passes
chromium-1440 preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved; baseline passes
chromium-1440 preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:8 on-demand surfaces preload on idle before opening PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:8 on-demand surfaces preload on timer before opening PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:8 on-demand surfaces preload on pointerover before opening PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:8 on-demand surfaces preload on pointerdown before opening PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:8 on-demand surfaces preload on focusin before opening PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved; baseline passes
chromium-390 preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved; baseline passes
chromium-1440 sidebar-edge.spec.ts:8 hovering the backdrop tiles never changes the sidebar edge FAIL pre-existing; same contain-paint array assertion at line 21
chromium-390 trash-search.spec.ts:14 row opens a Trash note read-only; only Restore brings it back FAIL new/unresolved; train Note info timeout line 29; baseline different Restored-toast timeout line 98
chromium-390 trash.spec.ts:17 Delete in Info moves the note to the Trash, and Undo brings it back PASS new/unresolved; baseline passes
chromium-1440 tree.spec.ts:377 Style sheet: a note chooses its own tree lines, saved with the note and kept on reload PASS new/unresolved; baseline passes
chromium-390 tree.spec.ts:377 Style sheet: a note chooses its own tree lines, saved with the note and kept on reload PASS new/unresolved; baseline passes
chromium-1440 vim.spec.ts:380 Vim mode › : commands in the bar: :n, :s, :%s, :w, :q PASS known historical pre-existing flake per brief; not reproduced in this baseline
prefs-chromium prefs-offline.spec.ts:107 settings offline › a change made offline shows at once, survives a reload with no flash, and is sent when back PASS new/unresolved; baseline passes
contrast contrast.spec.ts:230 the bar's sheets keep their contrast over a photo and over a page of huge words, 1440 wide PASS new/unresolved; baseline passes
contrast contrast.spec.ts:230 the bar's sheets keep their contrast over a photo and over a page of huge words, 390 wide PASS new/unresolved; baseline passes
throttled-390 note-bars-motion.spec.ts:71 @throttled rest to Style sheet, and back: layouts per frame, longest task and frame gaps at 6x FAIL unresolved; baseline lacks tools bar, fails line 75 before train assertion; Linux diagnostic only

Exact baseline commands, each under CI=1, Nix and ~/bin/slot, with CALTERNAL_BIN=~/Developer/Worktrees/bm10-base/target/debug/calternal, E2E_DIST=~/Developer/Worktrees/bm10-base/apps/web/dist, and BM10_BASELINE_PROJECT=<project>:

bunx playwright test e2e/day.spec.ts:41 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=opens\ on\ today\ and\ writes\ nothing\ until\ the\ first\ change$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/fe6eaaa9f346-results
bunx playwright test e2e/glass.spec.ts:488 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=the\ light\ Appearance\ preview\ keeps\ its\ page\ frost$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/f1aa108dd3dd-results
bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9931b84542cc-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/98656350816d-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/521f680e13c0-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ idle\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/8450f433e924-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ timer\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9681e6871912-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerover\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/fa612ad954a1-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerdown\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/0a96cd65835d-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ focusin\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/1efe047eb937-results
bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/65a11ccc580c-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/16b0a2719ee0-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/ef80813999dc-results
bunx playwright test e2e/sidebar-edge.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=hovering\ the\ backdrop\ tiles\ never\ changes\ the\ sidebar\ edge$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/1481a646eff3-results
bunx playwright test e2e/trash-search.spec.ts:14 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=row\ opens\ a\ Trash\ note\ read\-only;\ only\ Restore\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/b0899dd5b644-results
bunx playwright test e2e/trash.spec.ts:17 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=Delete\ in\ Info\ moves\ the\ note\ to\ the\ Trash,\ and\ Undo\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/4f7e39931de2-results
bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/c8c5b16b8ec8-results
bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/66c4525670cd-results
bunx playwright test e2e/vim.spec.ts:380 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=:\ commands\ in\ the\ bar:\ :n,\ :s,\ :%s,\ :w,\ :q$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/294dbdbc7d0c-results
bunx playwright test e2e/prefs-offline.spec.ts:107 --config=playwright.bm10-baseline.config.ts --project=prefs-chromium '--grep=a\ change\ made\ offline\ shows\ at\ once,\ survives\ a\ reload\ with\ no\ flash,\ and\ is\ sent\ when\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/2ac40a5ca7b8-results
bunx playwright test e2e/contrast.spec.ts:230 --config=playwright.bm10-baseline.config.ts --project=contrast '--grep=the\ bar'"'"'s\ sheets\ keep\ their\ contrast\ over\ a\ photo\ and\ over\ a\ page\ of\ huge\ words,\ 1440\ wide$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/d5a0e6cc3539-results
bunx playwright test e2e/contrast.spec.ts:230 --config=playwright.bm10-baseline.config.ts --project=contrast '--grep=the\ bar'"'"'s\ sheets\ keep\ their\ contrast\ over\ a\ photo\ and\ over\ a\ page\ of\ huge\ words,\ 390\ wide$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9ddb1b351ce5-results
bunx playwright test e2e/note-bars-motion.spec.ts:71 --config=playwright.bm10-baseline.config.ts --project=throttled-390 '--grep=@throttled\ rest\ to\ Style\ sheet,\ and\ back:\ layouts\ per\ frame,\ longest\ task\ and\ frame\ gaps\ at\ 6x$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/0646d6ba8ec3-results

Baseline first error: chromium-1440 e2e/sidebar-edge.spec.ts:8

Error: expect(received).toEqual(expected) // deep equality

- Expected  - 4
+ Received  + 0

@@ -12,10 +12,6 @@
    true,
    true,
    true,
    true,
    true,
-   true,
-   true,
-   true,
-   true,
  ]

  19 |   // Each tile repaints on its own: what a hover draws is cut off at the tile (`contain: paint`),
  20 |   // so it cannot invalidate the sidebar's live blur beside the card.
> 21 |   expect(await tiles.evaluateAll((els) => els.map((e) => getComputedStyle(e).contain.includes('paint')))).toEqual(Array(await tiles.count()).fill(true))
     |                                                                                                           ^
  22 |   await page.mouse.move(2, 2)
  23 |   await still(page)
  24 |   const nav = (await page.locator('nav.nav').boundingBox())!
    at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/sidebar-edge.spec.ts:21:107

Baseline first error: chromium-390 e2e/trash-search.spec.ts:14

Error: expect(locator).toBeVisible() failed

Locator: locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' })
Expected: visible
Timeout: 15000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' }) with timeout 15000ms
  - waiting for locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' })


   96 |     // The new toast takes the place of the earlier Moved one (in the bar and in the phone's stack).
   97 |     const restoredToast = page.locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: `Restored “${title}”` })
>  98 |     await expect(restoredToast).toBeVisible({ timeout: 15_000 })
      |                                 ^
   99 |     // One toast at a time: Restored takes the place of Moved (it is gone, not drawn under the new one).
  100 |     await expect(page.locator('[data-toast]').filter({ hasText: 'to the Trash' })).toHaveCount(0)
  101 |     await restoredToast.getByRole('button', { name: 'Undo', exact: true }).last().click()
    at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:98:33

Baseline first error: throttled-390 note-bars-motion.spec.ts:71

Error: expect(received).toBe(expected) // Object.is equality

Expected: "tools"
Received: null

Call Log:
- Timeout 5000ms exceeded while waiting on the predicate

  73 |     await seed(id, TEXT)
  74 |     await openNote(page, id)
> 75 |     await expect.poll(() => key(page)).toBe('tools')
     |                                        ^
  76 |     await still(page)
  77 |     const off = await throttle(page, 6)
  78 |     let gaps = { n: 0, max: 0, p95: 0, over50: 0 }
    at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/note-bars-motion.spec.ts:75:40

Motion comparison: train reached line 91, longest task 267.755 ms versus <250. Baseline failed line 75, expected bar key tools but received null. This does not reproduce the train failure and does not establish a GPU performance regression. No performance qualification is claimed.

final dev01 browser matrix and baseline attribution. tested head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. | VM | Project | Passed | Failed | Skipped | Unattempted | |---|---|---:|---:|---:|---:| | dev01 | admin-chromium-1440 | 12 | 0 | 9 | 0 | | dev01 | admin-chromium-390 | 12 | 0 | 9 | 0 | | dev01 | admin-setup | 1 | 0 | 0 | 0 | | dev01 | chromium-1440 | 436 | 6 | 625 | 0 | | dev01 | chromium-390 | 885 | 13 | 169 | 0 | | dev01 | contrast | 7 | 2 | 0 | 0 | | dev01 | flow | 1 | 0 | 0 | 0 | | dev01 | look-chromium-1440 | 5 | 0 | 0 | 0 | | dev01 | look-chromium-390 | 5 | 0 | 0 | 0 | | dev01 | passkeys | 1 | 0 | 0 | 0 | | dev01 | prefs-chromium | 4 | 1 | 2 | 0 | | dev01 | sidebar-band-chromium | 3 | 0 | 0 | 0 | | dev01 | throttled-1440 | 2 | 0 | 2 | 0 | | dev01 | throttled-390 | 3 | 1 | 0 | 0 | Totals: `{"failed": 23, "passed": 1377, "skipped": 816}` Each failed case below had exactly one actual origin/dev product comparison, with retry=0. Baseline product and dist: `55f35fcde3bc91ca3781055577b93e93819f6cd4`; train test definitions retained, with only #779 Nix tooling overlaid on the baseline. A baseline PASS means new/unresolved, including possible stale test expectations after Style. | Project | Case | Origin/dev | Attribution | |---|---|---|---| | chromium-390 | `day.spec.ts:41` opens on today and writes nothing until the first change | PASS | new/unresolved; baseline passes | | chromium-390 | `glass.spec.ts:488` the light Appearance preview keeps its page frost | PASS | new/unresolved; baseline passes | | chromium-1440 | `preload.spec.ts:48` warmed sheets contain their component in the first DOM update | PASS | new/unresolved; baseline passes | | chromium-1440 | `preload.spec.ts:111` palette Control intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | chromium-1440 | `preload.spec.ts:111` palette Meta intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:8` on-demand surfaces preload on idle before opening | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:8` on-demand surfaces preload on timer before opening | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:8` on-demand surfaces preload on pointerover before opening | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:8` on-demand surfaces preload on pointerdown before opening | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:8` on-demand surfaces preload on focusin before opening | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:48` warmed sheets contain their component in the first DOM update | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:111` palette Control intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | chromium-390 | `preload.spec.ts:111` palette Meta intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | chromium-1440 | `sidebar-edge.spec.ts:8` hovering the backdrop tiles never changes the sidebar edge | FAIL | pre-existing; same contain-paint array assertion at line 21 | | chromium-390 | `trash-search.spec.ts:14` row opens a Trash note read-only; only Restore brings it back | FAIL | new/unresolved; train Note info timeout line 29; baseline different Restored-toast timeout line 98 | | chromium-390 | `trash.spec.ts:17` Delete in Info moves the note to the Trash, and Undo brings it back | PASS | new/unresolved; baseline passes | | chromium-1440 | `tree.spec.ts:377` Style sheet: a note chooses its own tree lines, saved with the note and kept on reload | PASS | new/unresolved; baseline passes | | chromium-390 | `tree.spec.ts:377` Style sheet: a note chooses its own tree lines, saved with the note and kept on reload | PASS | new/unresolved; baseline passes | | chromium-1440 | `vim.spec.ts:380` Vim mode › : commands in the bar: :n, :s, :%s, :w, :q | PASS | known historical pre-existing flake per brief; not reproduced in this baseline | | prefs-chromium | `prefs-offline.spec.ts:107` settings offline › a change made offline shows at once, survives a reload with no flash, and is sent when back | PASS | new/unresolved; baseline passes | | contrast | `contrast.spec.ts:230` the bar's sheets keep their contrast over a photo and over a page of huge words, 1440 wide | PASS | new/unresolved; baseline passes | | contrast | `contrast.spec.ts:230` the bar's sheets keep their contrast over a photo and over a page of huge words, 390 wide | PASS | new/unresolved; baseline passes | | throttled-390 | `note-bars-motion.spec.ts:71` @throttled rest to Style sheet, and back: layouts per frame, longest task and frame gaps at 6x | FAIL | unresolved; baseline lacks tools bar, fails line 75 before train assertion; Linux diagnostic only | Exact baseline commands, each under `CI=1`, Nix and `~/bin/slot`, with `CALTERNAL_BIN=~/Developer/Worktrees/bm10-base/target/debug/calternal`, `E2E_DIST=~/Developer/Worktrees/bm10-base/apps/web/dist`, and `BM10_BASELINE_PROJECT=<project>`: ```sh bunx playwright test e2e/day.spec.ts:41 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=opens\ on\ today\ and\ writes\ nothing\ until\ the\ first\ change$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/fe6eaaa9f346-results bunx playwright test e2e/glass.spec.ts:488 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=the\ light\ Appearance\ preview\ keeps\ its\ page\ frost$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/f1aa108dd3dd-results bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9931b84542cc-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/98656350816d-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/521f680e13c0-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ idle\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/8450f433e924-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ timer\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9681e6871912-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerover\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/fa612ad954a1-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerdown\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/0a96cd65835d-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=on\-demand\ surfaces\ preload\ on\ focusin\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/1efe047eb937-results bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/65a11ccc580c-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/16b0a2719ee0-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/ef80813999dc-results bunx playwright test e2e/sidebar-edge.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=hovering\ the\ backdrop\ tiles\ never\ changes\ the\ sidebar\ edge$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/1481a646eff3-results bunx playwright test e2e/trash-search.spec.ts:14 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=row\ opens\ a\ Trash\ note\ read\-only;\ only\ Restore\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/b0899dd5b644-results bunx playwright test e2e/trash.spec.ts:17 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=Delete\ in\ Info\ moves\ the\ note\ to\ the\ Trash,\ and\ Undo\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/4f7e39931de2-results bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/c8c5b16b8ec8-results bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=chromium-390 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/66c4525670cd-results bunx playwright test e2e/vim.spec.ts:380 --config=playwright.bm10-baseline.config.ts --project=chromium-1440 '--grep=:\ commands\ in\ the\ bar:\ :n,\ :s,\ :%s,\ :w,\ :q$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/294dbdbc7d0c-results bunx playwright test e2e/prefs-offline.spec.ts:107 --config=playwright.bm10-baseline.config.ts --project=prefs-chromium '--grep=a\ change\ made\ offline\ shows\ at\ once,\ survives\ a\ reload\ with\ no\ flash,\ and\ is\ sent\ when\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/2ac40a5ca7b8-results bunx playwright test e2e/contrast.spec.ts:230 --config=playwright.bm10-baseline.config.ts --project=contrast '--grep=the\ bar'"'"'s\ sheets\ keep\ their\ contrast\ over\ a\ photo\ and\ over\ a\ page\ of\ huge\ words,\ 1440\ wide$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/d5a0e6cc3539-results bunx playwright test e2e/contrast.spec.ts:230 --config=playwright.bm10-baseline.config.ts --project=contrast '--grep=the\ bar'"'"'s\ sheets\ keep\ their\ contrast\ over\ a\ photo\ and\ over\ a\ page\ of\ huge\ words,\ 390\ wide$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-cases-v2/9ddb1b351ce5-results bunx playwright test e2e/note-bars-motion.spec.ts:71 --config=playwright.bm10-baseline.config.ts --project=throttled-390 '--grep=@throttled\ rest\ to\ Style\ sheet,\ and\ back:\ layouts\ per\ frame,\ longest\ task\ and\ frame\ gaps\ at\ 6x$' --workers=1 --retries=0 --reporter=line,json --output=/home/claude/bm10-baseline/browser-final/0646d6ba8ec3-results ``` Baseline first error: chromium-1440 e2e/sidebar-edge.spec.ts:8 ```text Error: expect(received).toEqual(expected) // deep equality - Expected - 4 + Received + 0 @@ -12,10 +12,6 @@ true, true, true, true, true, - true, - true, - true, - true, ] 19 | // Each tile repaints on its own: what a hover draws is cut off at the tile (`contain: paint`), 20 | // so it cannot invalidate the sidebar's live blur beside the card. > 21 | expect(await tiles.evaluateAll((els) => els.map((e) => getComputedStyle(e).contain.includes('paint')))).toEqual(Array(await tiles.count()).fill(true)) | ^ 22 | await page.mouse.move(2, 2) 23 | await still(page) 24 | const nav = (await page.locator('nav.nav').boundingBox())! at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/sidebar-edge.spec.ts:21:107 ``` Baseline first error: chromium-390 e2e/trash-search.spec.ts:14 ```text Error: expect(locator).toBeVisible() failed Locator: locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' }) Expected: visible Timeout: 15000ms Error: element(s) not found Call log: - Expect "toBeVisible" locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' }) with timeout 15000ms - waiting for locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-y9a3aj”' }) 96 | // The new toast takes the place of the earlier Moved one (in the bar and in the phone's stack). 97 | const restoredToast = page.locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: `Restored “${title}”` }) > 98 | await expect(restoredToast).toBeVisible({ timeout: 15_000 }) | ^ 99 | // One toast at a time: Restored takes the place of Moved (it is gone, not drawn under the new one). 100 | await expect(page.locator('[data-toast]').filter({ hasText: 'to the Trash' })).toHaveCount(0) 101 | await restoredToast.getByRole('button', { name: 'Undo', exact: true }).last().click() at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:98:33 ``` Baseline first error: throttled-390 note-bars-motion.spec.ts:71 ```text Error: expect(received).toBe(expected) // Object.is equality Expected: "tools" Received: null Call Log: - Timeout 5000ms exceeded while waiting on the predicate 73 | await seed(id, TEXT) 74 | await openNote(page, id) > 75 | await expect.poll(() => key(page)).toBe('tools') | ^ 76 | await still(page) 77 | const off = await throttle(page, 6) 78 | let gaps = { n: 0, max: 0, p95: 0, over50: 0 } at /home/claude/Developer/Worktrees/bm10/apps/web/e2e/note-bars-motion.spec.ts:75:40 ``` Motion comparison: train reached line 91, longest task 267.755 ms versus <250. Baseline failed line 75, expected bar key tools but received null. This does not reproduce the train failure and does not establish a GPU performance regression. No performance qualification is claimed.
Author
Owner

final dev02 browser matrix and baseline attribution. tested head 31b867ac95b290c6d53ee042bc6343d04cee3d02.

VM Project Passed Failed Skipped Unattempted
dev02 admin-setup 1 0 0 0
dev02 admin-webkit-1440 9 0 9 0
dev02 admin-webkit-390 9 0 9 0
dev02 look-webkit-1440 4 0 1 0
dev02 look-webkit-390 4 0 1 0
dev02 prefs-webkit 3 0 4 0
dev02 sidebar-band-webkit 3 0 0 0
dev02 webkit-1440 436 4 627 0
dev02 webkit-390 882 13 172 0

Totals: {"failed": 17, "passed": 1351, "skipped": 823}

Each failed case below had exactly one actual origin/dev product comparison, with retry=0. Baseline product and dist: 55f35fcde3bc91ca3781055577b93e93819f6cd4; train test definitions retained, with only #779 Nix tooling overlaid on the baseline. A baseline PASS means new/unresolved, including possible stale test expectations after Style.

Project Case Origin/dev Attribution
webkit-390 day.spec.ts:41 opens on today and writes nothing until the first change PASS new/unresolved; baseline passes
webkit-390 glass.spec.ts:488 the light Appearance preview keeps its page frost PASS new/unresolved; baseline passes
webkit-1440 preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved; baseline passes
webkit-1440 preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved; baseline passes
webkit-1440 preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:8 on-demand surfaces preload on idle before opening PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:8 on-demand surfaces preload on timer before opening PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:8 on-demand surfaces preload on pointerover before opening PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:8 on-demand surfaces preload on pointerdown before opening PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:8 on-demand surfaces preload on focusin before opening PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:48 warmed sheets contain their component in the first DOM update PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:111 palette Control intent prepares only its own screen before idle PASS new/unresolved; baseline passes
webkit-390 preload.spec.ts:111 palette Meta intent prepares only its own screen before idle PASS new/unresolved; baseline passes
webkit-390 trash-search.spec.ts:14 row opens a Trash note read-only; only Restore brings it back FAIL new/unresolved; train Note info timeout line 29; baseline different Restored-toast timeout line 98
webkit-390 trash.spec.ts:17 Delete in Info moves the note to the Trash, and Undo brings it back PASS new/unresolved; baseline passes
webkit-1440 tree.spec.ts:377 Style sheet: a note chooses its own tree lines, saved with the note and kept on reload PASS new/unresolved; baseline passes
webkit-390 tree.spec.ts:377 Style sheet: a note chooses its own tree lines, saved with the note and kept on reload PASS new/unresolved; baseline passes

Exact baseline commands, each under CI=1, Nix and ~/bin/slot, with CALTERNAL_BIN=~/Developer/Worktrees/bm10-base/target/debug/calternal, E2E_DIST=~/Developer/Worktrees/bm10-base/apps/web/dist, and BM10_BASELINE_PROJECT=<project>:

bunx playwright test e2e/day.spec.ts:41 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=opens\ on\ today\ and\ writes\ nothing\ until\ the\ first\ change$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/92074e33f48b-results
bunx playwright test e2e/glass.spec.ts:488 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=the\ light\ Appearance\ preview\ keeps\ its\ page\ frost$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/d659b4d9f89f-results
bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/ffc1bcd69cd7-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/fa0ccf6d118b-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/55055fef821b-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ idle\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/4b6f7db88f1e-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ timer\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/aa76face0138-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerover\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/17a5e44c4b0f-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerdown\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/c8fd948d1d8c-results
bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ focusin\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/2b9b77da80fe-results
bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/4030841c4606-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/f594dfa91fff-results
bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/60f88085ec52-results
bunx playwright test e2e/trash-search.spec.ts:14 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=row\ opens\ a\ Trash\ note\ read\-only;\ only\ Restore\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/7afaf6681744-results
bunx playwright test e2e/trash.spec.ts:17 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=Delete\ in\ Info\ moves\ the\ note\ to\ the\ Trash,\ and\ Undo\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/97502acf146c-results
bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/46289129710f-results
bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/930072d6673a-results

Baseline first error: webkit-390 e2e/trash-search.spec.ts:14

Error: expect(locator).toBeVisible() failed

Locator: locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' })
Expected: visible
Timeout: 15000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' }) with timeout 15000ms
  - waiting for locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' })


   96 |     // The new toast takes the place of the earlier Moved one (in the bar and in the phone's stack).
   97 |     const restoredToast = page.locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: `Restored “${title}”` })
>  98 |     await expect(restoredToast).toBeVisible({ timeout: 15_000 })
      |                                 ^
   99 |     // One toast at a time: Restored takes the place of Moved (it is gone, not drawn under the new one).
  100 |     await expect(page.locator('[data-toast]').filter({ hasText: 'to the Trash' })).toHaveCount(0)
  101 |     await restoredToast.getByRole('button', { name: 'Undo', exact: true }).last().click()
    at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:98:33
final dev02 browser matrix and baseline attribution. tested head `31b867ac95b290c6d53ee042bc6343d04cee3d02`. | VM | Project | Passed | Failed | Skipped | Unattempted | |---|---|---:|---:|---:|---:| | dev02 | admin-setup | 1 | 0 | 0 | 0 | | dev02 | admin-webkit-1440 | 9 | 0 | 9 | 0 | | dev02 | admin-webkit-390 | 9 | 0 | 9 | 0 | | dev02 | look-webkit-1440 | 4 | 0 | 1 | 0 | | dev02 | look-webkit-390 | 4 | 0 | 1 | 0 | | dev02 | prefs-webkit | 3 | 0 | 4 | 0 | | dev02 | sidebar-band-webkit | 3 | 0 | 0 | 0 | | dev02 | webkit-1440 | 436 | 4 | 627 | 0 | | dev02 | webkit-390 | 882 | 13 | 172 | 0 | Totals: `{"failed": 17, "passed": 1351, "skipped": 823}` Each failed case below had exactly one actual origin/dev product comparison, with retry=0. Baseline product and dist: `55f35fcde3bc91ca3781055577b93e93819f6cd4`; train test definitions retained, with only #779 Nix tooling overlaid on the baseline. A baseline PASS means new/unresolved, including possible stale test expectations after Style. | Project | Case | Origin/dev | Attribution | |---|---|---|---| | webkit-390 | `day.spec.ts:41` opens on today and writes nothing until the first change | PASS | new/unresolved; baseline passes | | webkit-390 | `glass.spec.ts:488` the light Appearance preview keeps its page frost | PASS | new/unresolved; baseline passes | | webkit-1440 | `preload.spec.ts:48` warmed sheets contain their component in the first DOM update | PASS | new/unresolved; baseline passes | | webkit-1440 | `preload.spec.ts:111` palette Control intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | webkit-1440 | `preload.spec.ts:111` palette Meta intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:8` on-demand surfaces preload on idle before opening | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:8` on-demand surfaces preload on timer before opening | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:8` on-demand surfaces preload on pointerover before opening | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:8` on-demand surfaces preload on pointerdown before opening | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:8` on-demand surfaces preload on focusin before opening | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:48` warmed sheets contain their component in the first DOM update | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:111` palette Control intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | webkit-390 | `preload.spec.ts:111` palette Meta intent prepares only its own screen before idle | PASS | new/unresolved; baseline passes | | webkit-390 | `trash-search.spec.ts:14` row opens a Trash note read-only; only Restore brings it back | FAIL | new/unresolved; train Note info timeout line 29; baseline different Restored-toast timeout line 98 | | webkit-390 | `trash.spec.ts:17` Delete in Info moves the note to the Trash, and Undo brings it back | PASS | new/unresolved; baseline passes | | webkit-1440 | `tree.spec.ts:377` Style sheet: a note chooses its own tree lines, saved with the note and kept on reload | PASS | new/unresolved; baseline passes | | webkit-390 | `tree.spec.ts:377` Style sheet: a note chooses its own tree lines, saved with the note and kept on reload | PASS | new/unresolved; baseline passes | Exact baseline commands, each under `CI=1`, Nix and `~/bin/slot`, with `CALTERNAL_BIN=~/Developer/Worktrees/bm10-base/target/debug/calternal`, `E2E_DIST=~/Developer/Worktrees/bm10-base/apps/web/dist`, and `BM10_BASELINE_PROJECT=<project>`: ```sh bunx playwright test e2e/day.spec.ts:41 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=opens\ on\ today\ and\ writes\ nothing\ until\ the\ first\ change$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/92074e33f48b-results bunx playwright test e2e/glass.spec.ts:488 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=the\ light\ Appearance\ preview\ keeps\ its\ page\ frost$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/d659b4d9f89f-results bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/ffc1bcd69cd7-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/fa0ccf6d118b-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/55055fef821b-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ idle\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/4b6f7db88f1e-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ timer\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-final/aa76face0138-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerover\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/17a5e44c4b0f-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ pointerdown\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/c8fd948d1d8c-results bunx playwright test e2e/preload.spec.ts:8 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=on\-demand\ surfaces\ preload\ on\ focusin\ before\ opening$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/2b9b77da80fe-results bunx playwright test e2e/preload.spec.ts:48 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=warmed\ sheets\ contain\ their\ component\ in\ the\ first\ DOM\ update$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/4030841c4606-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=palette\ Control\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/f594dfa91fff-results bunx playwright test e2e/preload.spec.ts:111 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=palette\ Meta\ intent\ prepares\ only\ its\ own\ screen\ before\ idle$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/60f88085ec52-results bunx playwright test e2e/trash-search.spec.ts:14 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=row\ opens\ a\ Trash\ note\ read\-only;\ only\ Restore\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/7afaf6681744-results bunx playwright test e2e/trash.spec.ts:17 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=Delete\ in\ Info\ moves\ the\ note\ to\ the\ Trash,\ and\ Undo\ brings\ it\ back$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/97502acf146c-results bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=webkit-1440 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/46289129710f-results bunx playwright test e2e/tree.spec.ts:377 --config=playwright.bm10-baseline.config.ts --project=webkit-390 '--grep=Style\ sheet:\ a\ note\ chooses\ its\ own\ tree\ lines,\ saved\ with\ the\ note\ and\ kept\ on\ reload$' --workers=1 --retries=0 --reporter=line,json --output=/home/cua/bm10-baseline/browser-cases-v2/930072d6673a-results ``` Baseline first error: webkit-390 e2e/trash-search.spec.ts:14 ```text Error: expect(locator).toBeVisible() failed Locator: locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' }) Expected: visible Timeout: 15000ms Error: element(s) not found Call log: - Expect "toBeVisible" locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' }) with timeout 15000ms - waiting for locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: 'Restored “StillInTrash-dhe360”' }) 96 | // The new toast takes the place of the earlier Moved one (in the bar and in the phone's stack). 97 | const restoredToast = page.locator('[data-toast], [role=status][aria-label=Notification]').filter({ hasText: `Restored “${title}”` }) > 98 | await expect(restoredToast).toBeVisible({ timeout: 15_000 }) | ^ 99 | // One toast at a time: Restored takes the place of Moved (it is gone, not drawn under the new one). 100 | await expect(page.locator('[data-toast]').filter({ hasText: 'to the Trash' })).toHaveCount(0) 101 | await restoredToast.getByRole('button', { name: 'Undo', exact: true }).last().click() at /home/cua/Developer/Worktrees/bm10/apps/web/e2e/trash-search.spec.ts:98:33 ```
Author
Owner

final BM10 test report: RED, do not merge.

PR #880, branch train/2026-11-03-bm10, tested and current head 31b867ac95b290c6d53ee042bc6343d04cee3d02, assembly base/origin-dev comparison product 55f35fcde3bc91ca3781055577b93e93819f6cd4. PR remains open and unmerged. BM9 #869 is closed with the replacement link.

Included source heads, captured from each current PR head at assembly time, merged in this order using --no-ff:

PR Recorded head Decision
#779 7b97e4d14231be07f6a80cb9ca172d02442c487e included, --no-ff
#858 626388da9052eaecb159d735f0cadc5e59e88312 included, --no-ff
#866 ba1f47dc94797d4a8a937298464b5e4828e301c2 included, --no-ff
#824 f1c1aa961e169ef99e132063a97ccbd9a89a5def included, --no-ff; mechanical lockfile union
#827 76f11dc4ba06468a2a0ed4d4592cea6038206696 included, --no-ff
#828 5d7b9b36cd008de78851809724c90a85d92b40a7 included, --no-ff; retain credential check then runtime timer
#833 ccaece3dfecbe2048634fc792d7d4a2c6e31f324 included, --no-ff
#836 5f7d1a59776411e7f3353d0023817b43affae51e included, --no-ff
#831 316b43e9578c3e4d2944df8df43caebc611356f7 included, --no-ff
#844 50cce9dcceb87f23a9f346300b3336e315ff6c0c included, --no-ff
#847 40448327a15730271d56226b898e48bcc87b2a4d included, --no-ff
#855 c38c3083d51f4adcf5cd76a70f1f6960b427413e included, --no-ff
#857 144e717145e35f70356f593b7c04a527e00f7b17 included, --no-ff
#856 b89e39bb313bb06b92da274124c6bbde30e2250a included, --no-ff
#840 9dd572249bd3edbcf8e1475a940070c4d03f1fc7 included, --no-ff; preserve newer #856 desktop corpus project guards
#850 136defb50ef7039bfb0be76a4d18d175f56a61d8 included, --no-ff; additive lazy imports 22 + search PullHint = 23
#851 bcca58e3d8af37b1246f81ff0a2f55faa4070426 included, --no-ff
#852 2f0b59f18406f03ca55b2fe745e3e11fedd9e84d included, --no-ff; additive cover imports 24 + search PullHint = 25
#863 f2c3a44cda090d763540366d03478ce7922a4cdf excluded: Palette animation target/origin differs from #840; Inspector deleted by Style; porting motion requires design choices
#829 d455842942731aabc05474c7929597d57090a7cc omitted as requested; sharing stack being rebased
#835 19071be8455d718822ba98f6b9a402c5fd345242 omitted as requested; sharing stack being rebased

Other ports omitted as requested. #863 merge was aborted because choosing palette animation origin/target and porting the deleted Inspector requires design choices. #831 inherited artifacts were removed from the repository and preserved in comment 75592. No source changes after the fixed test head.

First-run gate Result
cargo fmt --all --check PASS
cargo clippy --workspace --all-targets --locked -j4 -- -D warnings PASS
cargo test --workspace -j4 FAIL, preserved first run; ENOSPC
cargo build -j4 PASS on both VMs
bun install --frozen-lockfile PASS on both VMs
(cd apps/web && bun run build) PASS on both VMs
PERF_DIST="$PWD/apps/web/dist" PERF_OUT="$HOME/bm10-train/bundle" PERF_WORK="$HOME/bm10-train/bundle-work" bash perf/web.sh --bundle-only --gate PASS, #866 per-app budgets
node ci/check-case-paths.mjs PASS
node ci/check-no-evidence.mjs PASS
full native Playwright Chromium half, dev-01 1377 pass, 23 fail, 816 explicit skips, 0 unattempted
full native Playwright WebKit half, dev-02 1351 pass, 17 fail, 823 explicit skips, 0 unattempted

All commands CI=1, Nix with strace, heavy commands through ~/bin/slot. Cargo used -j4 and consistent CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0. Root disk checks exceeded 50 GiB before the train. Native browser halves started together; admin-setup ran with its dependents on each VM. Command from apps/web: bunx playwright test --config=playwright.bm10.config.ts --output="$HOME/bm10-train/test-results" --workers=1 --retries=0 --reporter=line,json, with train CALTERNAL_BIN and E2E_DIST. Native project definitions retained; cross-half scheduling dependencies removed.

First-run workspace tests stopped after 25 executables. The 53 previously unattempted targets then received their first attempts, followed by cargo test --workspace --doc -j4; no attempted target was rerun. All 78 discovered executable targets covered: 76 pass, 2 fail; docs pass. Both failing cases reproduced once on dev with the same ENOSPC: quota_counter::signin_finishes_before_a_large_recount line 62 and reliability_review::independent_login_completes_before_recount line 319. Root disk had space; the separate /tmp tmpfs lacked enough inodes for their 50,000-file fixtures. Rust target table, gate and per-app budget table.

Browser total: 2728 passed, 40 failed, 1639 explicitly skipped, 0 unattempted. Eleven Chromium cases blocked by a failed scheduling dependency received their first attempts separately: 8 pass, 1 fail, 2 skip. Original command failure remains unchanged. Every actual browser case had retry=0.

Attribution: all 40 browser failures received exactly one actual dev-product comparison. One same-error reproduction: chromium-1440 sidebar-edge.spec.ts:8, contain-paint array assertion line 21. One known historical pre-existing flake from the brief: chromium-1440 vim.spec.ts:380; its comparison passed, so not reproduced here. The other 38 are new/unresolved. This includes both trash-search.spec.ts:14 failures: train times out at missing Note info line 29, baseline instead fails at Restored-toast line 98. Motion remains unresolved: train reaches longest-task assertion line 91, baseline lacks the tools bar and fails line 75. Linux motion/frame data is diagnostic only, with no GPU performance qualification or performance-regression claim.

Per-project matrices, every failing-case attribution, exact baseline commands and baseline first errors: Chromium, WebKit. All 40 train first-error blocks are posted earlier in this PR. Common unresolved cases concern Style/old Info selectors, Log the time, palette loading expectations, offline preferences, contrast and Appearance preview alpha. This report does not assert whether each is a product defect or outdated expectation.

The corpus readiness gate passed its first desktop attempts at the unchanged 2% threshold: Chromium 10/1492 misses (0.67%), WebKit 9/1492 (0.60%). Corpus detail.

Runner audit: 12 baseline selection launches matched zero tests (7 whitespace, 5 decorative title suffixes). They were selection errors, not actual test attempts. Corrected exact selectors ran only missing cases; prior actual results were reused. No train or baseline case was retried.

Cleanup complete on both VMs: no active bm10 units; both owned bm10/bm10-base worktrees, build trees, seeded browser Homes, traces/test-results, bundle work and temporary browser directories removed. Only small logs/JSON remain outside the repository. The control review worktree is retained, tracked tree clean. No other jobs or worktrees touched.

SHA transcription correction: earlier comments 75636, 75652, 75653, 75655, 75663, 75664, 75665, 75667, 75674, 75690, 75704, 75707, 75709, 75719, 75721, 75739, 75746, 75750, 75751, 75752, 75753, 75754, 75755, 75756, 75760, 75761, 75762, 75763, 75764, 75765, 75766, 75767, 75768, 75769, 75771, 75777, 75784, 75788, 75789, 75790, 75791, 75799 had one extra trailing digit in the displayed full SHA; corrected to the verified 40-character head above. VM, local and Forgejo heads agree; tested code did not change.

final BM10 test report: **RED, do not merge**. PR https://git.kayg.org/kayg/calternal/pulls/880, branch `train/2026-11-03-bm10`, tested and current head `31b867ac95b290c6d53ee042bc6343d04cee3d02`, assembly base/origin-dev comparison product `55f35fcde3bc91ca3781055577b93e93819f6cd4`. PR remains open and unmerged. BM9 #869 is closed with the replacement link. Included source heads, captured from each current PR head at assembly time, merged in this order using --no-ff: | PR | Recorded head | Decision | |---|---|---| | #779 | `7b97e4d14231be07f6a80cb9ca172d02442c487e` | included, --no-ff | | #858 | `626388da9052eaecb159d735f0cadc5e59e88312` | included, --no-ff | | #866 | `ba1f47dc94797d4a8a937298464b5e4828e301c2` | included, --no-ff | | #824 | `f1c1aa961e169ef99e132063a97ccbd9a89a5def` | included, --no-ff; mechanical lockfile union | | #827 | `76f11dc4ba06468a2a0ed4d4592cea6038206696` | included, --no-ff | | #828 | `5d7b9b36cd008de78851809724c90a85d92b40a7` | included, --no-ff; retain credential check then runtime timer | | #833 | `ccaece3dfecbe2048634fc792d7d4a2c6e31f324` | included, --no-ff | | #836 | `5f7d1a59776411e7f3353d0023817b43affae51e` | included, --no-ff | | #831 | `316b43e9578c3e4d2944df8df43caebc611356f7` | included, --no-ff | | #844 | `50cce9dcceb87f23a9f346300b3336e315ff6c0c` | included, --no-ff | | #847 | `40448327a15730271d56226b898e48bcc87b2a4d` | included, --no-ff | | #855 | `c38c3083d51f4adcf5cd76a70f1f6960b427413e` | included, --no-ff | | #857 | `144e717145e35f70356f593b7c04a527e00f7b17` | included, --no-ff | | #856 | `b89e39bb313bb06b92da274124c6bbde30e2250a` | included, --no-ff | | #840 | `9dd572249bd3edbcf8e1475a940070c4d03f1fc7` | included, --no-ff; preserve newer #856 desktop corpus project guards | | #850 | `136defb50ef7039bfb0be76a4d18d175f56a61d8` | included, --no-ff; additive lazy imports 22 + search PullHint = 23 | | #851 | `bcca58e3d8af37b1246f81ff0a2f55faa4070426` | included, --no-ff | | #852 | `2f0b59f18406f03ca55b2fe745e3e11fedd9e84d` | included, --no-ff; additive cover imports 24 + search PullHint = 25 | | #863 | `f2c3a44cda090d763540366d03478ce7922a4cdf` | excluded: Palette animation target/origin differs from #840; Inspector deleted by Style; porting motion requires design choices | | #829 | `d455842942731aabc05474c7929597d57090a7cc` | omitted as requested; sharing stack being rebased | | #835 | `19071be8455d718822ba98f6b9a402c5fd345242` | omitted as requested; sharing stack being rebased | Other ports omitted as requested. #863 merge was aborted because choosing palette animation origin/target and porting the deleted Inspector requires design choices. #831 inherited artifacts were removed from the repository and preserved in [comment 75592](#issuecomment-75592). No source changes after the fixed test head. | First-run gate | Result | |---|---| | `cargo fmt --all --check` | PASS | | `cargo clippy --workspace --all-targets --locked -j4 -- -D warnings` | PASS | | `cargo test --workspace -j4` | FAIL, preserved first run; ENOSPC | | `cargo build -j4` | PASS on both VMs | | `bun install --frozen-lockfile` | PASS on both VMs | | `(cd apps/web && bun run build)` | PASS on both VMs | | `PERF_DIST="$PWD/apps/web/dist" PERF_OUT="$HOME/bm10-train/bundle" PERF_WORK="$HOME/bm10-train/bundle-work" bash perf/web.sh --bundle-only --gate` | PASS, #866 per-app budgets | | `node ci/check-case-paths.mjs` | PASS | | `node ci/check-no-evidence.mjs` | PASS | | full native Playwright Chromium half, dev-01 | 1377 pass, 23 fail, 816 explicit skips, 0 unattempted | | full native Playwright WebKit half, dev-02 | 1351 pass, 17 fail, 823 explicit skips, 0 unattempted | All commands CI=1, Nix with strace, heavy commands through ~/bin/slot. Cargo used -j4 and consistent `CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0`. Root disk checks exceeded 50 GiB before the train. Native browser halves started together; admin-setup ran with its dependents on each VM. Command from apps/web: `bunx playwright test --config=playwright.bm10.config.ts --output="$HOME/bm10-train/test-results" --workers=1 --retries=0 --reporter=line,json`, with train CALTERNAL_BIN and E2E_DIST. Native project definitions retained; cross-half scheduling dependencies removed. First-run workspace tests stopped after 25 executables. The 53 previously unattempted targets then received their first attempts, followed by `cargo test --workspace --doc -j4`; no attempted target was rerun. All 78 discovered executable targets covered: 76 pass, 2 fail; docs pass. Both failing cases reproduced once on dev with the same ENOSPC: `quota_counter::signin_finishes_before_a_large_recount` line 62 and `reliability_review::independent_login_completes_before_recount` line 319. Root disk had space; the separate /tmp tmpfs lacked enough inodes for their 50,000-file fixtures. [Rust target table](#issuecomment-75666), [gate and per-app budget table](#issuecomment-75636). Browser total: **2728 passed, 40 failed, 1639 explicitly skipped, 0 unattempted**. Eleven Chromium cases blocked by a failed scheduling dependency received their first attempts separately: 8 pass, 1 fail, 2 skip. Original command failure remains unchanged. Every actual browser case had retry=0. Attribution: all 40 browser failures received exactly one actual dev-product comparison. One same-error reproduction: chromium-1440 sidebar-edge.spec.ts:8, contain-paint array assertion line 21. One known historical pre-existing flake from the brief: chromium-1440 vim.spec.ts:380; its comparison passed, so not reproduced here. The other **38 are new/unresolved**. This includes both trash-search.spec.ts:14 failures: train times out at missing Note info line 29, baseline instead fails at Restored-toast line 98. Motion remains unresolved: train reaches longest-task assertion line 91, baseline lacks the tools bar and fails line 75. Linux motion/frame data is diagnostic only, with no GPU performance qualification or performance-regression claim. Per-project matrices, every failing-case attribution, exact baseline commands and baseline first errors: [Chromium](#issuecomment-75808), [WebKit](#issuecomment-75810). All 40 train first-error blocks are posted earlier in this PR. Common unresolved cases concern Style/old Info selectors, Log the time, palette loading expectations, offline preferences, contrast and Appearance preview alpha. This report does not assert whether each is a product defect or outdated expectation. The corpus readiness gate passed its first desktop attempts at the unchanged 2% threshold: Chromium 10/1492 misses (0.67%), WebKit 9/1492 (0.60%). [Corpus detail](#issuecomment-75739). Runner audit: 12 baseline selection launches matched zero tests (7 whitespace, 5 decorative title suffixes). They were selection errors, not actual test attempts. Corrected exact selectors ran only missing cases; prior actual results were reused. No train or baseline case was retried. Cleanup complete on both VMs: no active bm10 units; both owned bm10/bm10-base worktrees, build trees, seeded browser Homes, traces/test-results, bundle work and temporary browser directories removed. Only small logs/JSON remain outside the repository. The control review worktree is retained, tracked tree clean. No other jobs or worktrees touched. SHA transcription correction: earlier comments 75636, 75652, 75653, 75655, 75663, 75664, 75665, 75667, 75674, 75690, 75704, 75707, 75709, 75719, 75721, 75739, 75746, 75750, 75751, 75752, 75753, 75754, 75755, 75756, 75760, 75761, 75762, 75763, 75764, 75765, 75766, 75767, 75768, 75769, 75771, 75777, 75784, 75788, 75789, 75790, 75791, 75799 had one extra trailing digit in the displayed full SHA; corrected to the verified 40-character head above. VM, local and Forgejo heads agree; tested code did not change.
Author
Owner

Replaced by Train BM11 #883, same requested stack minus Style #850/#851/#852 and #863. BM10 was red mostly from the Style ports, which are being fixed separately. BM11 uses root-disk TMPDIR for Rust 50,000-file fixtures and Playwright temp Homes.

Replaced by [Train BM11 #883](https://git.kayg.org/kayg/calternal/pulls/883), same requested stack minus Style #850/#851/#852 and #863. BM10 was red mostly from the Style ports, which are being fixed separately. BM11 uses root-disk TMPDIR for Rust 50,000-file fixtures and Playwright temp Homes.
kayg closed this pull request 2026-11-02 20:40:45 +00:00
Some checks failed
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!880
No description provided.