Files
rikrdo 41f144d7bd feat(F-003): HTTP foundation with request context and error envelope
- request_id generated or sanitized-propagated on every request (x-request-id)
- structured JSON logging (pino), one correlated line per request, injectable logger
- error envelope v2 { error: { statusCode, code, message, details? }, requestId }
- 5xx messages always generic; stack traces stay in server logs only
- explicit parseJson (zod) input validation hook at the API layer
- README HTTP contract section; deps justified in spec/tech.md
- all gates approved; verify.sh green
2026-08-14 22:13:28 +02:00

41 lines
1.6 KiB
JSON

{
"feature_id": "F-003",
"agent": "qa",
"verdict": "APPROVED",
"summary": "All 5 acceptance criteria verified with fresh live probes and full suites.",
"traceability": [
{
"criterion": "AC1: every response carries request_id",
"test": "live curl: GET /health (200) and GET /missing (404) both returned x-request-id UUID headers",
"result": "PASS"
},
{
"criterion": "AC2: every request log line carries the same request_id",
"test": "grep of server JSON logs: each live request_id appears exactly once, in its 'request completed' line",
"result": "PASS"
},
{
"criterion": "AC3: invalid request -> stable error envelope shape",
"test": "live 404 and malformed-JSON 400 bodies share { error: { statusCode, code, message }, requestId }; schema-invalid case covered by unit test (VALIDATION_ERROR + field details)",
"result": "PASS"
},
{
"criterion": "AC4: internal stack traces never leak",
"test": "live bodies contain zero occurrences of 'stack'; unit test proves 500 handler hides thrown message and stack while logging them server-side",
"result": "PASS"
},
{
"criterion": "AC5: verify.sh green",
"test": "./scripts/verify.sh",
"result": "PASS (exit 0)"
}
],
"regressions": "PASS - unit 23 passed | 6 skipped; F-002 integration 6 passed; health endpoint body unchanged",
"evidence": [
"live probes at PORT=3997 with fresh dist build",
"npm test / test:integration green",
"./scripts/verify.sh exit 0"
],
"timestamp": "2026-08-14T20:16:00Z"
}