Repository navigation
CI: corrected markers as their own fixture part; fix and locate the #754 flakes - #756
Conversation
After the SDK direction lanes moved to their own part (#752), the cohorts part is the Shared Server fixtures' long pole at 18 to 22 minutes. Its slowest cohort, corrected markers, ranges, clocks and activity expiry, takes 8.8 minutes on its own (run 40136659746, mysql-8.0). It needs only a native node, which it already had to itself among the cohorts. It now runs in a fifth matrix part, corrected-markers, in the MySQL, PostgreSQL and SQLite jobs. That part starts its own native node exactly as the cohorts part starts its node, runs the cohort, and retires its resources. The cohorts part keeps every other cohort. Every cohort still runs once per database. The parts test now requires five parts and the corrected cohort, its node and its cleanup in the corrected-markers part. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The MySQL and PostgreSQL corpus steps start native-a and native-b together, wait up to 30 seconds for native-a, then check native-b once. On run 40156433545 (#745, mysql-execution mariadb-10.11 corpus), native-b was still binding its port: that single check exited 7 ("Failed to connect to parity-native-b port 8080"), and the step failed before recording anything. native-b now gets the same bounded readiness loop. The survivor check after native-a is killed stays a single check, since native-b has been serving for the whole corpus by then. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
query-sdk-python-rust has twice recorded HTTP status 0 against native (#754). The comparator printed only "0 !== 200", and the artifact keeps no journal, so we could not tell which request it was or whether the client closed first or the upstream connection failed. Each status check now reports the phase, method, path and the observer's transport flags, never payload bytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
query-sdk-python-rust twice recorded the author's query completion as HTTP status 0 against native (#754). The probe stopped the author as soon as the caller returned. Native wakes the waiting caller right after the completion commits, so a fast caller (the Rust client) can finish before the author's own completion response arrives. Published Python 2.5.4 runs query tasks inline on a poller thread, and Worker.stop() cancels that thread's task, so the in-flight completion was cancelled and the observer recorded it as client-cancelled with status 0. Native had already applied it, which is why the caller saw the right answer. The probe now waits, within the existing fixture deadline, until the author's journal shows its own successful, uncancelled completion of the query task it claimed, and only then writes the stop trigger. PHP also wakes its waiting caller through a signal channel, so the same race is possible there in principle; it has only been observed against native, and the wait covers both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A failed fixture logged only its assertion message, such as "false !== true" for python-clock-genuine-one (#754). The record that would show which check refused is not retained, so the failure could not be located. The recorder now adds the first scripts/conformance stack frame ("at scripts/conformance/server-parity/<contract>.mjs:<line>") after the message. Frames carry source paths and line numbers, never payload values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-part # Conflicts: # .github/workflows/server-parity.yml
The legacy-marker flake (#754) has failed twice in the published PHP record, and the request order around the suspected 503 was not retained either time, so the hypothesis could not be confirmed. When fixtures differ, the recorder now writes <record>.failure-excerpt.txt next to the record. For each failed case it lists, in observation order, every wire request's method, path, status, transport flags, retry-after, and worker, poll, queue and lease identity. It never reads request or response bodies. The excerpt is bounded per case and in total, and the artifact summary keeps it at the same priority as the recorder's own output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rrected-part Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Timing note, measured before this PR's run finishes. #739's last cycle (run 40162397220, same workflow without this PR) ran 25 min wall. The longest jobs:
So the corrected-markers split removes cohorts from the critical path, but corpus is now the long pole by itself, and the wall-time gain from this PR alone will be small. I'll post the measured per-part times when this run is terminal. The next CI change is partitioning the corpus comparison step across two parts with the fixture selection #739 introduced. The flake fixes stand on their own: each flake has cost a full-job rerun of 17 to 21 minutes. |
|
|
Attempt 1 of run 40164318863 stopped before the fixture matrix started. |
|
Cloud's read-only container-wrapper review of exact head The new fifth part keeps the corrected profile in its own runner, starts the matching scoped native node with non-root identity and CPU/memory bounds, gates comparison on preparation success, retains always-run profile/global cleanup and includes the part in artifact names. Database/node resource names agree with the existing cleanup, and no production or host-global prune is added. One small reliability fix is recommended before the next CI cycle: the five added/expanded readiness loops call |
|
Measured on this head (run 40164318863 attempt 2, all 40 jobs green) against #739's run 40162397220, which used the same workflow without this PR:
As expected, cohorts is off the critical path, but corpus now sets the wall time by itself, so the end-to-end gain is small. The follow-up is ready on CI note: PHPUnit attempts 1 and 2 on this head failed before running any test. Pulling the floating |
…-worker-sessions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st-325-ci-codec-one-job Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nto rust-325-workflow-import Native now serves 139 route methods: main's 138 plus embedded v2 import. The runtime keeps both new modules, and the comparator node test list keeps both sides' tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nto rust-325-record-local-activity The worker capability manifest keeps this branch's local activity entries and main's worker session and update validation entries. The comparator, probe and node test lists keep both sides' fixtures and tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nto rust-325-cancellation-scopes Workflow-task completion admits cancellation scopes before it guards worker-session commands, in published 2.11.1's order. A scheduled activity's options keep main's worker session and add its cancellation scope, as PHP's bridge appends it. Native serves 141 route methods; cancellation scope checkpoints stay missing. The probe timeout chain and the comparator node test list keep both sides' entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



Cuts the Shared Server fixtures' long pole and removes or locates the flakes that have been costing reruns (#754).
Wall time
cohortspart is the long pole at 18 to 22 minutes. Its slowest cohort (corrected markers, ranges, clocks and activity expiry) takes 8.8 minutes by itself and needs only a native node. It now runs as a fifth matrix part,corrected-markers, in the MySQL, PostgreSQL and SQLite jobs. That part starts its own native node, runs the cohort, and retires its resources. Every cohort still runs exactly once per database.ServerParityPartsTest.mjsrequires the five parts and checks that the cohort, its node and its cleanup live in the new part.Flakes (#754)
curl: (7) Failed to connect to parity-native-b port 8080 after 0 msbefore any fixture was recorded. native-b now gets the same bounded wait.query-sdk-python-ruststatus 0 against native (87b52c8). The probe stopped the query author as soon as the caller returned. Native wakes the waiting caller right after the completion commits, so the fast Rust client could finish before the author received its own completion response. Published Python 2.5.4 completes query tasks inline on a poller thread, andWorker.stop()cancels that thread, so the in-flight completion was cancelled and recorded asclient_cancelledwith status 0. The probe now writes the author's stop trigger only after the author's journal shows a successful, uncancelled completion of the query task it claimed, within the existing deadline. Full mechanism: Server parity: legacy-marker 503 recovery check fails intermittently on published PHP (SQLite) #754 comment 6393052357.same original poll recovers) has failed twice in the published PHP record, and the request order around the suspected 503 was lost both times. When fixtures differ, the recorder now writes<record>.failure-excerpt.txt. For each failed case it lists, in order, every request's method, path, status, transport flags, retry-after, and worker, poll, queue and lease identity, never bodies. It is bounded per case and in total, and the artifact summary keeps it at top priority.at scripts/conformance/server-parity/<contract>.mjs:<line>), so a barefalse !== truesuch aspython-clock-genuine-onecan be traced from the retained log. Neither change prints payload values.Verification
ServerParityFailureLocationTest.mjs(3) and two new cases inServerParitySdkQueryDirectionContractTest.mjs. Both new contract cases fail against the previous contract.ServerParitySdkQueryTransportTest.php: the author is released after a successful completion and stays held for status 0,client_cancelled,transport_error, an empty response object, a foreign receipt, the wrong order, or a foreign workflow or run.The query-author race can't be reproduced deterministically in a unit test. It counts as fixed once the sdk-directions lane stays green across cycles.
🤖 Generated with Claude Code