if-match-precondition-test-alignment
The environment contained only /workspace/problem.json (no target repo), so I built a faithful, runnable Go reproduction to verify the fix pattern end-to-end, then wrote the solution document.
/workspace/solution.md — the self-contained solution (title, root-cause analysis, exact code/commands, verification, acceptance checklist)/workspace/repro/ — minimal runnable reproduction in /workspace/repro with all contract legs passing:federation/handler.go — precondition evaluated before payload validationfederation/handler_test.go — unit test pinning 428 (incl. archived/empty-payload case)integration/ifmatch_test.go — named contract tests with 428/400/412/200 legs, happy path lastMakefile — before (-run TestFederation) vs after (go test ./...)Contract (decided from evidence, not the stale test):
- missing If-Match → 428 + CARD_REVISION_REQUIRED
- malformed → 400 + CARD_REVISION_MALFORMED
- stale → 412 + CARD_REVISION_MISMATCH
- valid → 200 PATCH / 204 DELETE
Root causes addressed:
1. Older integration tests asserted the obsolete 400; newer unit tests pin 428, and the introducing commit documents intent.
2. CI ran go test ./... -run TestFederation, so the non-TestFederation integration tests never executed and the step stayed green.
3. Tests invented revisions instead of reading the real one from the create/get response.
4. Ordering trap: valid PATCH bumps the revision, so the 200 leg must be last.
5. Handler must check the precondition before decoding the body so an archived/empty-payload probe still returns 428.
ok example.com/fedrepro/federation
ok example.com/fedrepro/integration
TestOrderingTrap_ReusingOldRevisionGoesStale) confirms reusing the old If-Match after a successful PATCH returns 412.go test -run TestFederation ./... → ... [no tests to run] for integration (still exit 0), while go test ./... runs all legs.428 CARD_REVISION_REQUIRED.All tests assert the error code parsed from the response body, not just the HTTP status.
# Evidence - Problem class: if-match-precondition-test-alignment - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-23T02:47:47.763Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Integration tests expect 400 for a PATCH/DELETE missing If-Match but the server returns 428 CARD_REVISION_REQUIRED. Decide the contract from evidence, never from the stale test: git log -S <error-code> on the handler finds the deliberate commit that introduced 428; a NEWER unit test pinning 428-vs-400 wins over the older integration test; the documented API contract settles it. Then align the old tests (send If-Match from the REAL revision in the create/list/update response, never an invented one) and close the CI blind spot that let them rot (handler CI step filtered -run TestFederation only, so the failing tests never ran). When a judge criterion names contract legs (428 missing, 400 malformed, 200 happy path), EVERY leg must exist INSIDE the named tests, not just in sibling unit files. Ordering trap: put the valid-PATCH-200 leg LAST - a successful PATCH bumps the revision, so an earlier leg reusing the old If-Match value goes stale (412). Assert the error CODE from the body, not just the status. Handler-side: the precondition runs BEFORE payload validation, so a missing-If-Match probe on an archived/empty-payload card still returns 428.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "if-match-precondition-test-alignment", "provider": "openrouter", "solved_at": "2026-09-23T02:47:47.763Z", "version": ""}