Align test proto infrastructure so all 4 generators share the same canonical test proto files, and expand the exhaustive test proto to cover every annotation combination the generators support. Fix any generator bugs exposed by the expanded proto coverage.

Purpose: Cross-generator consistency cannot be verified if each generator tests against different proto definitions. The httpgen test protos are the canonical source; clientgen and tsclientgen already symlink to them. OpenAPI has independent protos that must be replaced with symlinks. The exhaustive test proto must also be expanded to include missing coverage (int64/uint64 query params, enums in messages, optional fields, all unwrap variants) so the audit in subsequent plans has a complete basis for comparison. Per user decision "Fix everything immediately", any generator bugs exposed by the expanded proto are fixed in this plan, not deferred.

Output: Shared test proto infrastructure with symlinks, expanded exhaustive proto, updated golden tests, and any generator bugfixes needed to make expanded coverage pass.

<execution_context> @/Users/sebastienmelki/.claude/get-shit-done/workflows/execute-plan.md @/Users/sebastienmelki/.claude/get-shit-done/templates/summary.md </execution_context>

@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/03-existing-client-review/03-CONTEXT.md @.planning/phases/03-existing-client-review/03-RESEARCH.md @internal/httpgen/testdata/proto/http_verbs_comprehensive.proto @internal/httpgen/testdata/proto/query_params.proto @internal/httpgen/testdata/proto/unwrap.proto @internal/httpgen/testdata/proto/backward_compat.proto @internal/tsclientgen/testdata/proto/complex_features.proto @internal/openapiv3/exhaustive_golden_test.go @internal/openapiv3/testdata/proto/ Task 1: Expand the canonical exhaustive test proto to cover all annotation combinations internal/httpgen/testdata/proto/http_verbs_comprehensive.proto Expand `http_verbs_comprehensive.proto` to be the single exhaustive test proto that covers every annotation combination the 4 generators support. Currently it has HTTP verbs, path params, query params (int32, string, bool), headers, and maps. It is MISSING coverage for:
  1. int64/uint64 query params -- Add fields with int64, uint64 types annotated with (sebuf.http.query) to test 64-bit query parameter handling. Add these to the ListResourcesRequest message (or create a new RPC with a request that has int64/uint64 query params).
  2. float/double query params -- Add float and double query param fields.
  3. Enum fields in messages -- Add an enum type (e.g., ResourceStatus) and use it as a field in request/response messages. The Resource message should have a status enum field.
  4. Optional fields -- Add optional string and optional int32 fields to at least one message (e.g., add optional string description to GetResourceRequest or an optional field on Resource).
  5. Nested messages -- The Resource message already has maps but add a nested message field (e.g., ResourceMetadata metadata_obj with sub-fields like created_by, version).
  6. Repeated message fields -- Already has repeated Resource in ListResourcesResponse. Verify that's sufficient. Add repeated enum if missing.

Keep all existing messages and RPCs unchanged to avoid breaking existing golden files unnecessarily. ADD new fields/messages/RPCs for the missing coverage. Specifically:

  • Add ResourceStatus enum with values: RESOURCE_STATUS_UNSPECIFIED, RESOURCE_STATUS_ACTIVE, RESOURCE_STATUS_INACTIVE, RESOURCE_STATUS_ARCHIVED
  • Add ResourceMetadata message with fields: string created_by, int64 created_at_unix, int32 version
  • Add status (ResourceStatus) and metadata_detail (ResourceMetadata) fields to the Resource message (use field numbers 7 and 8)
  • Add optional string tag field to Resource (field number 9)
  • Add int64/uint64/float/double query params to ListResourcesRequest (field numbers 5-8): int64 since_timestamp, uint64 max_id, float min_score, double max_score -- all with (sebuf.http.query) annotations
  • Add a new RPC SearchResources(SearchResourcesRequest) returns (ListResourcesResponse) with GET method and path /resources/search that uses a request with a ResourceStatus status_filter query param (field number 1, query name "status") plus string query (field number 2, query name "q")

Do NOT change existing field numbers, message names, or RPC signatures. Only ADD new items.

CRITICAL: Fix-immediately policy. After expanding the proto, run ALL 4 generators' tests (not just httpgen). If the expanded proto reveals generator bugs (e.g., a generator crashes on int64 query params, fails to handle enum fields, or produces incorrect code for optional fields), you MUST fix those generator bugs immediately in this plan. Do not leave broken tests for later plans. The user decision is "Fix everything immediately: Every inconsistency found gets fixed in this phase." If fixes touch generator source files (generator.go, types.go, etc.), that is expected and acceptable. Document what was found and fixed. Run go build ./... to verify proto imports are valid. Then run ALL 4 generators' tests:

  1. UPDATE_GOLDEN=1 go test ./internal/httpgen/ -run TestExhaustiveGoldenFiles -count=1 to update httpgen golden files.
  2. go test ./internal/httpgen/ -count=1 to confirm httpgen passes.
  3. UPDATE_GOLDEN=1 go test ./internal/clientgen/ -count=1 then go test ./internal/clientgen/ -count=1
  4. UPDATE_GOLDEN=1 go test ./internal/tsclientgen/ -count=1 then go test ./internal/tsclientgen/ -count=1
  5. UPDATE_GOLDEN=1 go test ./internal/openapiv3/ -count=1 then go test ./internal/openapiv3/ -count=1

If any test fails with a compilation error or generator crash (not just golden file mismatch), fix the underlying generator bug before proceeding. After fixing, re-run the full test suite. All 4 generators must produce valid output for the expanded proto. The canonical exhaustive test proto includes coverage for all scalar query param types (string, int32, int64, uint64, bool, float, double), enums in messages, optional fields, nested messages, and all existing features. All 4 generators handle the expanded proto without errors. Any generator bugs exposed by the expansion are fixed. Golden files are updated and all tests pass.

Task 2: Symlink shared test protos into OpenAPI test directory and update golden test infrastructure internal/openapiv3/testdata/proto/http_verbs_comprehensive.proto internal/openapiv3/testdata/proto/query_params.proto internal/openapiv3/testdata/proto/backward_compat.proto internal/openapiv3/testdata/proto/unwrap.proto internal/openapiv3/exhaustive_golden_test.go The OpenAPI generator has completely independent test protos that don't overlap with the other generators. This makes cross-generator consistency verification impossible. Fix this by:
  1. Create symlinks in internal/openapiv3/testdata/proto/ pointing to the canonical httpgen test protos. Create these symlinks (using the same relative path pattern as clientgen/tsclientgen):

    • http_verbs_comprehensive.proto -> ../../../httpgen/testdata/proto/http_verbs_comprehensive.proto
    • query_params.proto -> ../../../httpgen/testdata/proto/query_params.proto
    • backward_compat.proto -> ../../../httpgen/testdata/proto/backward_compat.proto
    • unwrap.proto -> ../../../httpgen/testdata/proto/unwrap.proto

    Note: The OpenAPI testdata already has its own unwrap.proto and other protos. Do NOT delete the existing OpenAPI-specific protos -- they test OpenAPI-specific features that the shared protos don't cover (like headers.proto, validation_constraints.proto). But DO replace unwrap.proto with a symlink since the httpgen version is more comprehensive (has root-level unwrap variants).

  2. Update the OpenAPI golden test (exhaustive_golden_test.go) to ALSO run against the newly symlinked shared protos. The test should generate OpenAPI specs for the shared protos' services and compare against new golden files. Read the existing test to understand the pattern, then add the shared protos to its test list.

  3. Generate initial golden files by running UPDATE_GOLDEN=1 go test ./internal/openapiv3/ -run TestExhaustiveGoldenFiles -count=1. This creates the baseline golden files for the shared protos' OpenAPI output.

  4. Verify all OpenAPI tests pass (both the existing tests with existing protos AND the new tests with shared protos).

IMPORTANT: The OpenAPI generator generates one file per service. The shared protos may contain multiple services (e.g., http_verbs_comprehensive.proto has both RESTfulAPIService and BackwardCompatService). The golden test must handle multiple services per proto file.

IMPORTANT: The existing OpenAPI-specific protos (headers.proto, validation_constraints.proto, simple_service.proto, etc.) and their golden files must continue to work. This task ADDS shared protos, it does not replace existing coverage. Run go test ./internal/openapiv3/ -count=1 -- all tests must pass including both existing and new golden file tests. Verify symlinks exist: ls -la internal/openapiv3/testdata/proto/http_verbs_comprehensive.proto should show symlink. Verify golden files exist for the shared protos' services. OpenAPI generator tests run against the same canonical test protos as httpgen, clientgen, and tsclientgen. All 4 generators now share test proto infrastructure via symlinks. All existing OpenAPI tests continue to pass.

1. `go test ./internal/httpgen/ -count=1` passes (expanded proto, updated golden files) 2. `go test ./internal/clientgen/ -count=1` passes (symlinked protos, golden files may need update) 3. `go test ./internal/tsclientgen/ -count=1` passes (symlinked protos, golden files may need update) 4. `go test ./internal/openapiv3/ -count=1` passes (new symlinks, new golden files) 5. `ls -la internal/openapiv3/testdata/proto/http_verbs_comprehensive.proto` shows symlink 6. `ls -la internal/openapiv3/testdata/proto/query_params.proto` shows symlink 7. No generator bugs remain from the expanded proto -- all revealed issues are fixed

<success_criteria>

  • All 4 generators share the same canonical test proto files (httpgen is the source, others symlink)
  • The exhaustive test proto covers: all HTTP verbs, all scalar query param types (including int64/uint64/float/double), enums, optional fields, nested messages, maps, repeated fields, headers, unwrap variants, backward compat
  • All golden file tests pass across all 4 generators
  • No existing test coverage is lost (OpenAPI-specific protos still tested)
  • Any generator bugs exposed by the expanded proto are fixed (not deferred) </success_criteria>
After completion, create `.planning/phases/03-existing-client-review/03-01-SUMMARY.md`