Notes route leaves indexed Note list requests pending #1480

Open
opened 2026-10-08 19:25:22 +00:00 by kayg · 3 comments
Owner

Evidence

The #1392 audit fixture writes 1,000 valid Note files to the disposable User data directory before server startup. It then calls the existing Notes reconcile action and waits for both real indexes: paginated GET /api/v1/notes and paginated GET /api/v1/files/entries?path=Notes&notes_filter=true. The readiness gates reached all 1,000 fixture rows in both APIs.

On the production web build from job/slowsel-1392 at 53bd66d70, served by the shared release server cc1af3c12, Mac Chrome 155 navigated to /notes. After 20 seconds, .notes-explorer had zero [role="treeitem"] rows. The audit's last requests showed /api/v1/files/entries and /api/v1/notes still pending, with no HTTP status. The run then stopped before a Notes selection sample.

Minimal repro

Run bench/interaction-audit-1392.mjs with the production web override, the Notes/move selection next interaction filter, a 180-second fixture timeout, and a Mac Chrome CDP endpoint. The harness creates the fixture and waits for both indexes before opening /notes. It fails with Notes explorer did not expose two rows after the route's list requests remain unfinished for 20 seconds.

The focused Linux fixture run reached 1,000/1,000 in both indexes and completed a Notes selection sample. The failure is specific to loading the Notes route after index readiness on the Mac Chrome run; it needs investigation to determine why those route requests do not finish. No 5xx response was observed.

## Evidence The #1392 audit fixture writes 1,000 valid Note files to the disposable User data directory before server startup. It then calls the existing Notes reconcile action and waits for both real indexes: paginated `GET /api/v1/notes` and paginated `GET /api/v1/files/entries?path=Notes&notes_filter=true`. The readiness gates reached all 1,000 fixture rows in both APIs. On the production web build from `job/slowsel-1392` at `53bd66d70`, served by the shared release server `cc1af3c12`, Mac Chrome 155 navigated to `/notes`. After 20 seconds, `.notes-explorer` had zero `[role="treeitem"]` rows. The audit's last requests showed `/api/v1/files/entries` and `/api/v1/notes` still pending, with no HTTP status. The run then stopped before a Notes selection sample. ## Minimal repro Run `bench/interaction-audit-1392.mjs` with the production web override, the `Notes/move selection next` interaction filter, a 180-second fixture timeout, and a Mac Chrome CDP endpoint. The harness creates the fixture and waits for both indexes before opening `/notes`. It fails with `Notes explorer did not expose two rows` after the route's list requests remain unfinished for 20 seconds. The focused Linux fixture run reached 1,000/1,000 in both indexes and completed a Notes selection sample. The failure is specific to loading the Notes route after index readiness on the Mac Chrome run; it needs investigation to determine why those route requests do not finish. No 5xx response was observed.
Author
Owner

Baseline H1 control from #1392, embedded origin/dev web build served by release server cc1af3c12 on Mac Chrome 154.0.8037.98, does not reproduce the 20-second pending state from this issue. One /notes open exposed two current-document EventSource streams (/api/v1/files/events and /api/v1/notes/events), both status 200 over HTTP/1.1 on separate connections. All 12 /api/v1/notes reads completed with status 200 (p50 212.23 ms, max 525.27 ms); /api/v1/files/entries completed with status 200 in 4106.83 ms and had no socket-pool stall. The route reached two real rows in 5968.2 ms and had no pending requests at the readiness snapshot. The redacted NetLog matched 182 first-party requests; all target URLs were omitted and no request-path socket wait was recorded for /api/v1/files/entries.

This is evidence against HTTP/1.1 connection-slot starvation as the cause of this baseline route result, but it does not explain the candidate-only reproduction recorded above: that run used the rejected web override at 53bd66d70 and Chrome 155. I am completing the required HTTPS/HTTP/2 baseline comparison before attributing the issue.

Baseline H1 control from #1392, embedded origin/dev web build served by release server cc1af3c12 on Mac Chrome 154.0.8037.98, does not reproduce the 20-second pending state from this issue. One `/notes` open exposed two current-document EventSource streams (`/api/v1/files/events` and `/api/v1/notes/events`), both status 200 over HTTP/1.1 on separate connections. All 12 `/api/v1/notes` reads completed with status 200 (p50 212.23 ms, max 525.27 ms); `/api/v1/files/entries` completed with status 200 in 4106.83 ms and had no socket-pool stall. The route reached two real rows in 5968.2 ms and had no pending requests at the readiness snapshot. The redacted NetLog matched 182 first-party requests; all target URLs were omitted and no request-path socket wait was recorded for `/api/v1/files/entries`. This is evidence against HTTP/1.1 connection-slot starvation as the cause of this baseline route result, but it does not explain the candidate-only reproduction recorded above: that run used the rejected web override at 53bd66d70 and Chrome 155. I am completing the required HTTPS/HTTP/2 baseline comparison before attributing the issue.
Author
Owner

The H2 baseline also did not reproduce a 20-second Notes route stall. On Mac Chrome 154, three /notes opens reached two real tree rows in 2832.1, 3026.1 and 3126.3 ms. The run sent 36 /api/v1/notes reads; all returned 200. Five of seven /api/v1/files/entries reads returned 200, with the slowest response at 3677.93 ms. Two /api/v1/files/entries requests were still pending at the final audit snapshot after the route opens and selection samples, but the route had already passed its real-row readiness check. All requests used HTTP/2 on connection 522; the redacted NetLog found 0 socket-pool queue stalls. The route's two live EventSources shared that same H2 connection.

Together with the H1 control, this shows the baseline route reaches real Notes rows and its list requests make progress. It does not identify why the earlier rejected build override at 53bd66d70 with Chrome 155 left requests pending for 20 seconds; that candidate-specific repro was not repeated. I cannot attribute #1480 only to the harness from these baseline runs.

The H2 baseline also did not reproduce a 20-second Notes route stall. On Mac Chrome 154, three `/notes` opens reached two real tree rows in 2832.1, 3026.1 and 3126.3 ms. The run sent 36 `/api/v1/notes` reads; all returned 200. Five of seven `/api/v1/files/entries` reads returned 200, with the slowest response at 3677.93 ms. Two `/api/v1/files/entries` requests were still pending at the final audit snapshot after the route opens and selection samples, but the route had already passed its real-row readiness check. All requests used HTTP/2 on connection 522; the redacted NetLog found 0 socket-pool queue stalls. The route's two live EventSources shared that same H2 connection. Together with the H1 control, this shows the baseline route reaches real Notes rows and its list requests make progress. It does not identify why the earlier rejected build override at 53bd66d70 with Chrome 155 left requests pending for 20 seconds; that candidate-specific repro was not repeated. I cannot attribute #1480 only to the harness from these baseline runs.
Author
Owner

Retest update from #1392:

The corrected Mac rerun did not complete because the actual Mac VM lock remained occupied. All Mac results from the invalid-lock runs are withdrawn. This job therefore has no valid Mac protocol, queueing, or timing evidence.

On the dev-embedded Linux baseline with 1,000 real Notes and Files fixture rows indexed, the H1 /notes route showed two real rows in all three visits (5.2813 s, 4.6135 s, 3.1718 s). One H2 Linux visit also showed two real rows (6.0231 s). Linux Notes selection measured 130.0/145.6 ms p50/p95 over three H1 samples and 115.1/395.2 ms over three H2 samples. The H2 high sample had a 306 ms main-thread long task during keydown. Its network snapshot showed two live long-lived requests and one still-pending /api/v1/files/entries request. The Linux host was loaded (12 CPUs; load averages roughly 10–13), so this is not a substitute for the requested Mac run.

The original #1480 report remains candidate-specific and is not confirmed against a valid Mac dev baseline. The available evidence does not establish that the issue is only a harness artifact. Leave #1480 open pending a lock-protected Mac H1/H2 comparison.

Retest update from #1392: The corrected Mac rerun did not complete because the actual Mac VM lock remained occupied. All Mac results from the invalid-lock runs are withdrawn. This job therefore has no valid Mac protocol, queueing, or timing evidence. On the dev-embedded Linux baseline with 1,000 real Notes and Files fixture rows indexed, the H1 /notes route showed two real rows in all three visits (5.2813 s, 4.6135 s, 3.1718 s). One H2 Linux visit also showed two real rows (6.0231 s). Linux Notes selection measured 130.0/145.6 ms p50/p95 over three H1 samples and 115.1/395.2 ms over three H2 samples. The H2 high sample had a 306 ms main-thread long task during keydown. Its network snapshot showed two live long-lived requests and one still-pending /api/v1/files/entries request. The Linux host was loaded (12 CPUs; load averages roughly 10–13), so this is not a substitute for the requested Mac run. The original #1480 report remains candidate-specific and is not confirmed against a valid Mac dev baseline. The available evidence does not establish that the issue is only a harness artifact. Leave #1480 open pending a lock-protected Mac H1/H2 comparison.
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
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-v0#1480
No description provided.