POST /api/surfaces with an empty surfaceId now requires a conversationId that belongs to the caller: empty returns 400, missing or another owner's conversation returns 404. Revisions keep the previous behavior. Without this check a direct API caller could create a project-less surface and skip the project lifecycle gate on actions. Why: an empty conversationId produced surfaces with no project ownership. Evidence: agent-exec unit backend-surface-submit-conversation-required (pi, attempt 1 after authorized rerun, terminal=success); go test ./internal/server/... ./internal/surfacesvc/... . Impact: HTTP create-surface validation only. Refs: Dev task fix/svc-superadmin-envfile-surface-conv. Co-authored-by: Cursor <cursoragent@cursor.com>