This was generated by AI — surfaced during the #194 swarm review (follow-up to #191).
Observation
The repeated uint32 filter parameters on GET /api/v1/tickets — categoryId[], statusId[], prefixId[], assignedUserId[], starterUserId[] — carry maximum: 4294967295 on their array items, and TestSpec_Uint32ParamsBounded structurally pins that the bound is declared. But:
pb33f/libopenapi-validator does not enforce a numeric maximum on array items at request-validation time, and
- no golden replays an over-ceiling repeated filter (e.g.
category_id=4294967296).
The request binder does produce a real 400 {"code":3,"message":"... value out of range"} for these inputs — it just isn't witnessed by a replaying golden the way the scalar case is (tickets/list_modified_since_over_uint32 witnesses the scalar binder behavior once).
Why it matters
Two-way contract coverage is the project's discipline: a declared error that no golden replays can drift silently. This is a completeness gap, not a correctness hole (the binder behavior is identical to the already-witnessed scalar path), but the array surface is currently un-pinned at the byte level.
Possible direction (for triage)
Add a golden, e.g. tickets/list_category_over_uint32 (?category_id=4294967296), witnessing the response-level 400, mirroring list_modified_since_over_uint32.
Surfaced by the test-coverage review on PR #194. needs-triage.
Observation
The repeated uint32 filter parameters on
GET /api/v1/tickets—categoryId[],statusId[],prefixId[],assignedUserId[],starterUserId[]— carrymaximum: 4294967295on their arrayitems, andTestSpec_Uint32ParamsBoundedstructurally pins that the bound is declared. But:pb33f/libopenapi-validatordoes not enforce a numericmaximumon arrayitemsat request-validation time, andcategory_id=4294967296).The request binder does produce a real
400 {"code":3,"message":"... value out of range"}for these inputs — it just isn't witnessed by a replaying golden the way the scalar case is (tickets/list_modified_since_over_uint32witnesses the scalar binder behavior once).Why it matters
Two-way contract coverage is the project's discipline: a declared error that no golden replays can drift silently. This is a completeness gap, not a correctness hole (the binder behavior is identical to the already-witnessed scalar path), but the array surface is currently un-pinned at the byte level.
Possible direction (for triage)
Add a golden, e.g.
tickets/list_category_over_uint32(?category_id=4294967296), witnessing the response-level 400, mirroringlist_modified_since_over_uint32.Surfaced by the test-coverage review on PR #194.
needs-triage.