A window lends an image
A swapchain is a collection of images managed with the presentation system. You do not own those images in the same way as an offscreen image you allocate. Query surface formats, present modes, image-count limits, supported usage, and extent. Select from what is advertised. The extent is measured in drawable pixels; it need not equal a window size expressed in logical UI units. Choose a clear color before adding geometry so that the first visible milestone has one obvious success condition.
Acquire returns an image index and arranges a synchronization signal. Recording commands does not wait for acquisition, and obtaining the index alone does not make every access safe. Submit work with the acquisition dependency at a stage that protects the first actual use, then signal a semaphore that presentation waits on. The image must be in the layout required by presentation before it is presented. Keep the acquire-submit-present story on paper beside the implementation.
A frame slot is your reusable CPU-side bookkeeping bundle: command buffer, completion fence, and temporary data. Create each initial frame fence with VK_FENCE_CREATE_SIGNALED_BIT so the first wait can finish; alternatively skip that first wait under an explicit never-submitted state. A swapchain image is chosen by acquisition. Two frame slots do not imply two swapchain images, and frame_number modulo image_count is not an acquired image index. Use different variable names and separate containers for these concepts.
