CRUD 계약은 status와 header까지 포함한다

repository 동작만 맞아도 HTTP 계약이 틀릴 수 있으므로 경계 신호를 표로 고정한다.

요청 성공 대표 실패
POST /posts 201 + Location 400·409
GET /posts/{id} 200 + ETag 404
PUT /posts/{id} 200 + 새 ETag 404·412
DELETE /posts/{id} 204 404