Repository navigation
Rust #325: describe runs after more than 64 updates - #854
Conversation
Published PHP bounds only pending updates (DW_V2_LIMIT_PENDING_UPDATES), not how many a run takes over its life, and describes a run by its open waits. October 23 removed native's 64-update admission cap, but the update summary still read at most 64 update waits over the run's life and gave up past that, so a run that had taken 65 updates was described with no wait. Remove the bound. The new many-updates fixture records a run waiting for a signal through 65 completed updates (still described as waiting for the signal), then a 66th left accepted (described as the open update), against published 2.11.5. The port log's "Described command previews" gap is also removed: native describes each command's payload_preview_omitted since 05a6110 and its decoded reason since 2c99051. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Protected source qualification complete. PR #854 merged at 10:58:09 UTC as f5399e8, with reviewed tree fe702ea7fba825d02e45e15b88c3b205cfa6fda0 and parents exact d13 + 4e97. Primary cumulative Feature40858703330, Shared40858703318 and Boundary40858703493 each completed SUCCESS. Main points to that exact merged source. Native publication and any released-artifact qualification remain with the owner. Cloud reviewed exact4e97 source: the plain string assertion resolves the CodeQL finding without a runtime change. The bounded successful-probe retry notes and exact Composer sink inventory are fixed, with the real-recorder fake-PHP exit-zero regression. The original failed cumulative observations and PHP follow-through in #825 remain preserved below; successful final source qualification does not erase them. I ran no local Rust or HTTP workload for this review. Prior 1ed5 review and resolved integration finding: Latest source follow-through, October 29 09:17 UTC — 1ed5df7. The five-file correction addresses the retry mechanics and legacy-step formatter findings. The PHP helper emits only index/attempt/status, preserves identical requests, stops after three attempts and propagates a final HTTP 500. Its three focused tests are registered in the feature workflow. The formatter now retains bounded scalar request-label/status steps, excludes response bodies, and has a regression for the formerly missing shape. Local test and published-PHP re-recording results remain author-reported; I inspected source and did not rerun them. One recorder integration finding remains: server-parity.mjs consumes probe.stderr only when the probe exits unsuccessfully. On an exit-zero HTTP 500→202 recovery, the retry note is ignored, and probe-capture.mjs removes its temporary stderr file. The note therefore still does not reach the recorder's retained output. Forward only the validated, bounded many_updates_submit_retry diagnostic from record mode on success, and cover that actual recorder path with a fake-PHP successful probe emitting the note. Do not forward arbitrary raw stderr or change the observation oracle. Primary hosted checks now also show Repository contracts job 123359449101 and its Feature source-qualification aggregate 123365237261 failed in run 40847790937. Security independently reproduced the Composer sink-inventory mismatch after the feature command changed; update its exact manifest entry while preserving count 2, confinement and guards, then requalify. Fresh exact-head and cumulative qualification remain required. The failed cumulative run below is retained; neither the earlier green PR run nor local re-recording clears it. Earlier 7d5 follow-through and the failed cumulative evidence: Current follow-through, October 29: qualification remains incomplete. The merge-group run 40841285248 failed on 3810a46: 40 jobs succeeded, the SQLite and MariaDB 10.11 corpus jobs failed, and the aggregate gate failed. Primary commit metadata confirms its tree, ee13e10a8dabc3dd081d73fc9a33f24154f68ebc, is identical to reviewed head 2fac. The earlier 56 successful PR checks do not clear this failed cumulative run. Reviewed correction 7d5f08e changes only the many-updates probe. It makes at most three identical submissions with the same body and request ID, waits 200/400 ms between retries, returns immediately for other statuses and propagates the third HTTP 500 to the original observation. The production summary implementation and the 65-completed/66-accepted oracle are unchanged. Fresh normal checks are still running; no current-head or cumulative acceptance is claimed. Two evidence corrections are needed in this existing conformance path:
Independently read MariaDB artifact 12882619882 confirms that update index 15 returned HTTP 500 with only ServerError and no ready task. The 1213 deadlock classification remains attributed to the author's server-log diagnosis; it is not recoverable from that response excerpt. Retain both failed observations. No contract, expected response or deadline relaxation is requested. I ran no local Rust or HTTP workload for this review. Earlier 2fac source review and PR-check evidence follow as historical scope: Cloud source review at
Verification scope: source inspection and primary GitHub check metadata only; I did not execute the Rust suite or HTTP recordings. The published-2.11.5/native recordings and local test counts in the PR remain author-reported. Hosted follow-through, October 29 08:18 UTC: the exact reviewed head now has 56 successful checks and one intentional candidate-source skip, with no pending or failed checks. Primary run/job metadata confirms cumulative Shared 40837459986 completed successfully at 08:18:11 UTC with all 43 jobs successful; PHPUnit Feature 40837460150 and Public Boundary 40837459960 are also terminal successful. Source review and this check set are clear for the owner's normal protected merge. This is no lifetime-scale performance claim or child-summary qualification; the separate child bound remains documented under #325. |
#854's merge-queue run failed on MariaDB: published PHP answered the 16th update submission with an uncaught 500 (1213 Deadlock found) while its own maintenance pass held the run's task rows. The submission carries a request id, so sending it again is idempotent; the probe now does so up to twice before recording the answer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pushed
|
|
Security/reliability follow-up on The failed published-PHP response exposed only The bounded retry is acceptable for this parity fixture because it reuses the same idempotency key and stops after three total submissions. Before re-enqueue, please keep the retry observable rather than silently erasing the 500:
This is limited to the fixture/evidence path; it does not request a product behavior change. |
From #854 review. - The many-updates retry moves into manyUpdatesSubmit, which notes each retry on stderr by index, attempt and status only, so a recovered attempt is not reported as error-free. ServerParityManyUpdatesRetryTest covers the unchanged request id, at most three attempts, an immediate answer for any other status, and a third 500 being returned. - The failure excerpt now keeps steps that older probes record as {request: 'METHOD path', status, response}: the label and status, never the response. The SQLite failure on #854's merge queue left only "signals-before-worker (product-fail): step statuses" because those steps were dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pushed
|
|
Security review of exact head One required follow-up remains: the hosted Repository contracts check failed because changing the long Composer-bearing command in |
|
Follow-up after tracing the recorder integration: the helper emits the intended bounded retry line, but a recovered |
From #854 review. The recorder read a probe's stderr only when the probe failed, so a recovered update retry left no trace in a passing run, and the Composer sink inventory still named the phpunit-feature line before the new retry test was added to it. - probeNotes keeps only stderr lines of the retry note's exact, value-free shape (at most 20); the recorder stores them on the case as probe_notes and repeats them on its own stderr, whatever the probe's exit status. No other stderr is kept. - ServerParityProbeNotesTest drives the recorder with a fake php that exits 0 after printing the note and other text, and checks that only the note reaches the record and the recorder's stderr. - composer-sinks.json names the updated phpunit-feature line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pushed
Locally, |
|
Security re-review of exact head Focused read-only container checks passed: probe-note tests 2/2, failure-excerpt tests 5/5, Composer inventory/guard tests 2/2, and PHP retry tests 3 / 11 assertions. |
CodeQL flagged the probe-notes test for building a regular expression from the note with incomplete escaping. The test now checks the recorder's stderr for the note as a plain substring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security follow-up on exact head |
|
|
Final Security gate for exact head Current protected main remains No Security hold remains. Normal protected merge/queue qualification is accepted; preserve this exact source and re-evaluate only if head, base or merge tree changes. |
|
Protected merge readback: GitHub merged exact candidate |



Part of #325.
What changed
Native now describes a run by its open waits after it has taken more than 64 updates, as published PHP 2.11.5 does.
LIMIT 65) and gave up past that. A run that had taken 65 updates was described with no wait (wait_kindnull), though its signal wait was still open.DW_V2_LIMIT_PENDING_UPDATES, 500 by default). A run is described by its open waits; an accepted update that is still open is described as "Waiting for update set".update_summary.rs).The port log also drops the stale "Described command previews" gap. Native describes each command's
payload_preview_omittedsince05a6110c, and its decoded reason since2c990518.Evidence
many-updates(raw worker HTTP on protocol 1.20): a run opens a signal wait and takes 65 updates. Each is accepted, delivered on its own workflow task and completed. The probe records:signal), and with a 66th update left accepted (update);2fac9269).rust/tests/execution/many_updates.rsfails on the previous source (wait_kindnull) and passes now;many_updatespasses, and the node unit tests pass (366).Not covered
🤖 Generated with Claude Code