Repository navigation
feat(gqt): name the first differing field in a DST replay mismatch - #1182
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Recommendation: ready. A DST replay that disagrees with its first run used to print only The line now names the first field whose JSON text differs. The order is The match result is the same for the current report. A field differs when its serialized text differs. That is the same test as the old whole-report byte comparison. The comparison still skips The practical effect is a mismatch you can read without the artifact files. A matching replay still passes. The helper is about 90 lines in BlockingNone. Optional
Checked questionsThe per-field walk matches the whole-report bytes for the current report shape. I compared 17 report pairs at the merge base and at A mismatch line always names a field. The window indexes Unicode scalar values, not bytes. A difference on U+1F525 stays one character in the line. A JSON TradeoffThis removes the artifact diff for the first field. It adds a second copy of the report schema. Five more report fields would each need a line in the walk. A missed line turns a real mismatch into a pass. The serialized document is already the one comparison. Derive the line from that document. The current walk is correct for the fields that exist. The cost is the extra list, not the file it lives in. A shared JSON helper would have one caller and the same list problem unless the bytes stay the verdict. I did not measure speed. On a match, the walk serializes every evidence entry. The old code serialized each report once. Other open pull requestsNo other open pull request edits ValidationMerge base: At the first head, with a temporary matrix that was removed and not pushed:
Result: 6 passed, 0 failed. That run is the three new tests, the two concurrent replay tests, and the matrix. Same tree with At the merge base, same filter, temporary matrix removed and not pushed: 3 passed, 0 failed. The 17 byte rows match the head rows. CI on CI on The Codex comment on this pull request is a failed review with no findings. There were no other reviews and no inline comments. LimitsI did not run the full GQT corpus on this machine. GQT cannot express this diagnostic line. The Rust tests are the right owner. I did not build a report larger than 256 MiB. I did not time the match path. The temporary matrix is not in the branch. Inline comment on Inline comment on Inline comment on |
|
Recommendation: ready. The diagnostic change from the review of WhyA DST replay of one seed must report one That 392 is the endpoint key set for the 8
What the new commit does
This is production behavior. It is not a retry, a sleep, or a test-only change. A load that fits the pool still returns the same rows. The error name stays Cause
The new order closes that window in What this commit does not fix
Other open pull requestsPR 1174 edits this PR 1178 also edits No other open pull request edits Prior optional findingsThese three are not addressed.
Optional
TradeoffThe change removes a schedule-dependent ValidationMerge base Unit test
Result: 1 passed. The same assertion on the
On the On CI on LimitsI did not run the full GQT corpus. I did not run Inline comment on PR 1174 and PR 1178 both call |
A DST replay that disagrees with its first attempt fails as
replay_mismatch: <environment> seed=<n>; both reports retained, which only says that the two reports differ; finding the field means downloading the invocation artifact and diffing two JSON documents. #1178 went red once on exactly this line.The line now names the first field whose JSON text differs (
code,phase,input_digest,result, thenobservationsandevidenceentry by entry) and shows both values around their first differing character, or the two lengths when one list is a prefix of the other. The comparison is unchanged: a field differs exactly when its serialized text differs, the test the runner applied to the whole report before, so no replay changes verdict.Three unit tests pin the field order and line shapes, the agreement with the byte comparison over eight variants (negative zero and object key order among them), and the window at and past the bound.