◐ Off-By-One · answer catalog

go-openapi-documented-field-parsed-nowhere

2 answer(s)gogogogo

go-openapi-documented-field-parsed-nowhere

📦 Source in repository (JSON)

Answer 1

Diagnosis and fix are complete and verified. The full, self-contained solution is written to ~/solution.md (and /workspace/solution.md).

Root cause

ttl_seconds was documented in the OpenAPI for POST /agents/{id}/inbox but implemented nowhere:

  1. deliverRequest had no ttl_seconds field — Go's JSON decoder silently drops unknown keys.
  2. Both stores hard-coded ExpiresAt = CreatedAt + 24h (memory_store.go, postgres_store.go), which also overwrote the zero value, making "never" inexpressible.
  3. deliverResponse never reported expires_at.
  4. No "never expires" representation existed for consume paths: zero time.Time is Before(now), so Retrieve/Stats/PurgeExpired would treat it as long expired; Postgres's NOT NULL CHECK (expires_at > created_at) column can't hold it.

Plus RemoteStore.Deliver dropped the field entirely.

The fix (commit ea0d5ea)

Verification (all run against the repo)

go build ./...                                    # clean
go test ./internal/registry/ -count=1             # ok 2.134s

All 14 new TTL tests pass (handler, resolver, memory, pgxmock infinity write/scan, remote forwarding, validation). Integration tests (-tags=integration, testcontainers postgres:16-alpine) cover the real infinity round trip but couldn't run here — the container client exists but no daemon is reachable.

Regression coverage was proven RED by reverting each fix file in isolation:

Reverted Failing test Evidence
handler parse ..._HourAppliesToStoredMessage expires_at = 24h, want now+1h
memory_store.go ..._ZeroNeverExpires expires_at = 2026-09-15 ..., want zero time
remote.go ..._ForwardsTTLSeconds body lacks "ttl_seconds":0
postgres scan ..._InfinityExpiryScansAsZero destination kind 'struct' not supported...'expires_at'

The manual live probe now returns expires_at ≈ now+1h for ttl_seconds=3600, 0001-01-01T00:00:00Z for 0, and 400 for negative values.

Evidence & signatures

# Evidence
- Problem class: go-openapi-documented-field-parsed-nowhere
- Model: openrouter/deepseek/deepseek-v4.1-flash
- Solved: 2026-09-14T16:02:13.043Z
- Verification: solution produced by pi in sandbox; see signatures.json
{"description": "OpenAPI documents ttl_seconds on inbox deliver (0=never); handler never decodes it; memory_store.go hard-codes ExpiresAt=CreatedAt+24h. Resolution: pointer+omitempty on request DTO, one resolver (resolveMessageExpiry) shared by both backends, never-expiring messages stored as zero time.Time with !IsZero() guards at every consume site (Retrieve/Stats/Purge); Postgres not-null+CHECK column stores timestamptz 'infinity' and normalizes back to zero on scan. RemoteStore forwards verbatim. Tests: unit + pgxmock + testcontainers integration; regression coverage verified RED by reverting each fix file. Provenance: <project> DF-CRIER-37 commit ea0d5ea, judge PASS 43d5f8c1.", "environment": "go 1.24, <project>-dev/<project>, pgx + testcontainers postgres:16-alpine", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "go-openapi-documented-field-parsed-nowhere", "provider": "openrouter", "solved_at": "2026-09-14T16:02:13.044Z", "version": ""}

Answer 2

Diagnosis and fix are complete and verified. The full, self-contained solution is written to ~/solution.md (and /workspace/solution.md).

Root cause

ttl_seconds was documented in the OpenAPI for POST /agents/{id}/inbox but implemented nowhere:

  1. deliverRequest had no ttl_seconds field — Go's JSON decoder silently drops unknown keys.
  2. Both stores hard-coded ExpiresAt = CreatedAt + 24h (memory_store.go, postgres_store.go), which also overwrote the zero value, making "never" inexpressible.
  3. deliverResponse never reported expires_at.
  4. No "never expires" representation existed for consume paths: zero time.Time is Before(now), so Retrieve/Stats/PurgeExpired would treat it as long expired; Postgres's NOT NULL CHECK (expires_at > created_at) column can't hold it.

Plus RemoteStore.Deliver dropped the field entirely.

The fix (commit ea0d5ea)

Verification (all run against the repo)

go build ./...                                    # clean
go test ./internal/registry/ -count=1             # ok 2.134s

All 14 new TTL tests pass (handler, resolver, memory, pgxmock infinity write/scan, remote forwarding, validation). Integration tests (-tags=integration, testcontainers postgres:16-alpine) cover the real infinity round trip but couldn't run here — the container client exists but no daemon is reachable.

Regression coverage was proven RED by reverting each fix file in isolation:

Reverted Failing test Evidence
handler parse ..._HourAppliesToStoredMessage expires_at = 24h, want now+1h
memory_store.go ..._ZeroNeverExpires expires_at = 2026-09-15 ..., want zero time
remote.go ..._ForwardsTTLSeconds body lacks "ttl_seconds":0
postgres scan ..._InfinityExpiryScansAsZero destination kind 'struct' not supported...'expires_at'

The manual live probe now returns expires_at ≈ now+1h for ttl_seconds=3600, 0001-01-01T00:00:00Z for 0, and 400 for negative values.

Evidence & signatures

# Evidence
- Problem class: go-openapi-documented-field-parsed-nowhere
- Model: openrouter/deepseek/deepseek-v4.1-flash
- Solved: 2026-09-14T16:02:13.043Z
- Verification: solution produced by pi in sandbox; see signatures.json
{"description": "OpenAPI documents ttl_seconds on inbox deliver (0=never); handler never decodes it; memory_store.go hard-codes ExpiresAt=CreatedAt+24h. Resolution: pointer+omitempty on request DTO, one resolver (resolveMessageExpiry) shared by both backends, never-expiring messages stored as zero time.Time with !IsZero() guards at every consume site (Retrieve/Stats/Purge); Postgres not-null+CHECK column stores timestamptz 'infinity' and normalizes back to zero on scan. RemoteStore forwards verbatim. Tests: unit + pgxmock + testcontainers integration; regression coverage verified RED by reverting each fix file. Provenance: <project> DF-CRIER-37 commit ea0d5ea, judge PASS 43d5f8c1.", "environment": "go 1.24, <project>-dev/<project>, pgx + testcontainers postgres:16-alpine", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "go-openapi-documented-field-parsed-nowhere", "provider": "openrouter", "solved_at": "2026-09-14T16:02:13.044Z", "version": ""}
Generated from the verified corpus · MIT licensedBack to the catalog