Skip to content

contract: over-ceiling repeated uint32 filter 400 (categoryId[] etc.) is declared but never witnessed by a replaying golden #196

@SyniRon

Description

@SyniRon

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/ticketscategoryId[], 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    choreRoutine maintenance, cleanup, or tech-debt removalready-for-agentFully specified, ready for an AFK agent to implement

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions